바야흐로 2021년에 또 30여 년 전의 고전 게임인 페르시아의 왕자를 소재로 글을 써 올리게 되다니.. 감격스럽기 그지없다.
이번에는 이 게임에서 주인공의 적으로 등장하는 검객, 경비병들에 대해 외국 사이트에서 분석한 데이터를 본인의 경험과 곁들여서 소개하고자 한다. 갑자기 이 주제로 글을 쓰고 싶어졌다.
페르시아의 왕자 게임에는 가시, 칼날, 절벽처럼 주인공의 체력을 깎아먹거나 주인공을 즉사시키는 트랩들이 여럿 존재한다. 검객은 그런 트랩들과 달리 유일하게 생명체이다.
조던 메크너가 열심히 코딩을 하다가.. 게임이 더 다이나믹하고 재미있기 위해서는 '전투'라는 요소가 필요하다는 걸 뒤늦게 깨닫고 검객을 구현했다고 한다. 이건 유명한 일화이다.
본인은 어린 시절에 이들을 knight를 연상시키는 기사라고 부르곤 했다. 하지만 얘들에 대한 공식 명칭은 guard(s), 즉 경비병에 가깝다. 검객이라고 하니까 무슨 일본 시노비나 암살 자객 같은 느낌이 들고.. 앞으로는 그냥 간단하게 적병이라고 부르도록 하겠다.
페르시아의 왕자 게임은 칼싸움 동작을 "휘둘러 찌르는 공격 아니면 막기"라는 두 종류로 극도로 단순화시켰다. 남의 공격을 평범하게 막으면 대미지를 입지 않는 대신, 찌르는 사정거리 밖으로 살짝 후퇴도 하게 된다. 물론 칼빵을 맞아도 후퇴..
막으면서 잽싸게 공격을 시도하면 뒤로 밀려나지 않으면서 적에게 반격을 할 수도 있다. 그런데 적도 그걸 막으면서 반격하고 나도 또 막고 반격하면.. 뭔가 그럴싸한 칼싸움이 연출된다. 자신과 상대방이 거리가 어느 정도 되는지도 이 싸움의 진행에 영향을 끼친다.
그렇게 공격과 방어를 반복하다 보면 언젠가 컴퓨터 적병이 반드시 맞고 뒤로 밀려나는 것으로 순환이 끝난다. 재미를 위해 알고리즘이 주인공의 필승으로 귀결되게 구현돼 있는 것 같다.
이 게임이 무슨 대전 액션 시뮬레이션은 아니니, 현실의 칼싸움처럼 이동과 공격을 동시에 한다거나, 상하 좌우 다양한 방향으로 칼을 휘두르고 기상천외한 부위를 찌르고 서로 칼날을 부딪친 채로 힘싸움을 하는 건 존재하지 않는다.
하지만 그 시절에 칼싸움이라는 걸 이렇게 단순화된 형태로 구현한 것만으로도 굉장히 참신한 시도가 아닐 수 없다. 플랫폼 아케이드 장르의 게임에 공격뿐만 아니라 '방어'라는 기동이 존재하는 물건 자체가 매우 드무니까 말이다.
게다가 이 게임은 적병들의 AI를 나름 다양한 난이도로 구현하는 섬세함까지 보였다.
1편에서 레벨 1에 나오는 적병, 그리고 2편에서도 레벨 1, 궁전 옥상에서 마주치는 적병은 난이도가 최하이다. 칼을 휘둘러 찌르는 것만 반복하고 있으면 알아서 다가와서 칼 맞고 꽥~ 죽어 준다. 그러나 이렇게 너무 쉬운 적병은 그 다음 레벨부터는 결코 다시 등장하지 않는다.
그 다음 레벨부터 나오는 적병들은 내가 칼을 쉬지 않고 휘두르는 동안에는 나에게 다가오지 않는다. 조금 뜸을 들여야만 접근하며, 그렇게 다가올 때 공격을 몇 번 성공시키면 적병이 죽는다. 페르시아의 왕자 1편은 대부분의 적들을 이 테크닉만으로 해치울 수 있다.
그런데 레벨 4쯤 되면 적이 약간은 더 똑똑해진 것 같다. 내 공격을 호락호락 맞아 주지 않고 막는 빈도가 유의미하게 높아져 있다. 그리고 아주 가끔은 막고 나서 내게 반격도 한다.
게다가 레벨 6에 나오는 그 '뚱보', 그리고 최종 보스인 Jafar는 공격 키만 사용해서는 해치우기가 거의 불가능하다. 내 공격을 90% 이상의 확률로 막고는 반격을 하기 때문이다. 나도 '막기'와 '공격'을 뒤섞으면서 난전을 벌여야만 놈을 때릴 수 있다.
이런 것들이 내부적으로는 어떻게 구현돼 있을까?
페르시아의 왕자 게임은 소스가 공개되어 있다지만 너무 옛날 애플 II 어셈블리어여서 분석이 상당히 난감하다.
하지만 제작자가 이것 말고도, 타 플랫폼 포팅 작업 때 참고하라고 내부 알고리즘 기술 문서를 만들었던 것도 공개한 게 있어서 큰 도움이 된다. 얘는 2000년대 이후부터는 이미 레벨 에디터까지 다 만들어져 있다.
이것들을 분석한 자료에 따르면 적병들의 AI는 다음과 같은 형태라고 한다. (☞ 문서)
- 레벨 1에만 나오는 제일 쉬운 적병의 skill은 0
- 나머지 레벨 2에서 11 사이에 나오는 일반적인 적병들의 skill은 1부터 4까지 4등급으로 나뉜다. 참고로 레벨 3에서 등장하는 해골의 skill은 2로, 그냥 평범한 편이다.
- 레벨 6에 나오는 뚱보의 skill은 5이다.
- 레벨 8의 첫 부분에만 나오는.. 스스로 공격을 절대로 하지 않는 특이한 적병의 skill은 7이다.
- 레벨 12에서 등장하는 그림자 인간/도플갱어의 skill은 3이다.
- 그리고 최종 보스인 쟈파의 skill은 9이다.
- 0부터 11 사이의 skill 코드 12개 중, 나머지 값들은 쓰이지 않았다. (6, 8, 10, 11)
저 문서에서는 게임의 인트로 화면을 가만히 지켜보고 있을 때 잠깐 등장하는 데모 플레이의 칼싸움도 5, 즉 레벨 6 뚱보의 skill이라고 말한다. (무슨 근거로?)
하지만 내 생각은 다르다. 데모에서 왕자(주인공)와 적병의 스킬이 각각 10과 11, 또는 11과 10이 아닐까 생각한다.
왜냐하면 일단 페르시아의 왕자 원판 소스에서 "10: kid (demo) / 11: enemy (demo)"라는 문자열을 볼 수 있기 때문이다. 저 10과 11이 AI 인덱스를 가리키는 게 아닐까..?
또한, 데모를 오랫동안 지켜보고 있으면 주인공과 적병의 칼싸움 결과는 그때 그때 다르다(난수를 잘 사용하는군!!). 하지만 주인공은 이길 때보다는 질 때가 훨씬 더 많다. 주인공은 적병보다 반격을 당해 칼빵을 맞는 경우가 더 잦으며, 심지어 계속 뒤로 밀려나다가 절벽에서 떨어져 처참하게 죽기도 한다. 최소한 이 두 사람의 skill이 동일해 보이지는 않는다.
이런 이유로 인해 본인은 skill 테이블에서 정말로 미사용인 것은 6과 8 둘뿐이라고 생각한다만.. 이 역시 추측일 뿐이다.
적병의 AI를 결정하는 변수들은 다음과 같다. 어떤 건 직관적으로 이해가 되지만 어떤 건 제대로 문서화돼 있지 않아서 알기가 어렵다. 제일 이해하기 쉬운 방어 관련 변수부터 소개하면 다음과 같다.
- 방어 확률(blockprob): 주인공의 공격에 얻어맞기만 하는 게 아니라 막을 확률. 레벨 1의 적병은 그런 게 전혀 없어서 우리의 공격에 반드시 당한다. skill 1,2에서는 150/255(대략 60%), 3,4는 200/255(78%)이라고 한다.
뚱보와 쟈파는 100%로 무조건 막는다. 그래도 가끔은 쟤들에게 막기 없이 공격을 성공시키는 경우도 있는데, 그건 살짝 멀리 떨어진 상태에서 쟤들이 이동이 덜 끝나고 미처 방어 기동을 하기 전에 찌르기가 먹혔기 때문에 그렇다.
- 방어 후의 재반격(restrikeprob) 확률: 우리 역시 막기 기동을 쓰지 않을 수 없게 하고 칼싸움의 체감 난이도를 크게 끌어올리는 변수이다. skill 0~2의 적병은 재반격을 전혀 하지 않으며, 3,4는 극히 드문 빈도로 재반격을 한다. 그 반면, 뚱보와 쟈파는 매우 높은 확률로 재반격을 하며, 쟈파는 100% 반드시 반격한다.
다음으로 공격 관련 변수이다.
- 공격 영역에 들어올 확률(advprob): 주인공을 향해 사정거리 안으로 진격해 올 확률..이라기보다는 속도이다. 이건 적병들의 난이도별로 딱히 유의미한 차이가 없는데, 딱 하나 튀는 놈은 바로 레벨 8에 유일하게 등장하는 그놈이다. 얘는 확률이 0이기 때문에 절대로 먼저 들어오지를 않는다. 주인공이 칼을 완전히 집어넣어야만 들어오기 때문에 이때 다시 칼을 꺼내서 공격하거나, 아니면 우리가 치고 들어가서 공격을 막고 반격해야 한다.
- 공격 확률(strikeprob): 주인공이 사정거리 안으로 가까이 들어왔을 때 공격을 할 확률 내지 속도이다. 이것도 딴 적병들은 비슷한 반면, 레벨 8의 그 특이한 적병만이 이번엔 반대로 유난히 높은 값을 갖고 있다. 이 값이 높은 적병하고는 앞으로 돌진해서 좌우 자리를 교체하거나 가까이에서 2연타 콤보 공격을 하기 몹시 어려울 것이다.
그 외에도 이런 게 있다.
- 칼 맞은 뒤의 refractory 시간(refract timer): 공격을 당하고 나서 움찔 하는 시간으로, 얘 역시 그렇게 유의미한 동작 차이를 만들지는 않는다. 얘가 10으로 설정된 적병은 20으로 설정된 적병보다 칼에 맞은 뒤에도 좀 더 빨리 앞으로(하지만 주인공의 칼에 맞지는 않는 거리로) 다가온다.
- 방어가 impair되는 확률(impblockprob ??): 제일 미스터리한 놈이다. 심지어 기술 문서나 소스 코드에 설명도 전혀 되어 있지 않고 대놓고 존재감이 없다. 상급 몬스터로 갈수록 값이 커지는 걸 보니 뭔가 좋은 속성 같은데, impaired block이라는 말은 핸디캡을 나타내는 부정적인 의미인 것도 이해되지 않는다.
아까도 얘기했다시피 제일 쉬운 skill 0짜리 적병은 주인공이 제자리에서 방어 없이 칼을 휘두르고만 있어도 알아서 달려와서 칼 맞고 죽어 주는 유일한 놈이다. 언뜻 보기에 여기에 해당하는 듯한 특성은 advprob이 최대치인 255인 것이다. 그런데 얘는 뚱보, 쟈파 등 다른 악당들의 AI도 최대치 255이기 때문에 유일한 변별 요소가 되지 못한다. 쟤만 blockprob이 완전히 0인데 여기에 그 동작 특성도 포함돼 있는 건가 궁금해진다.
아 그리고 impblockprob 말이다. 문득 드는 생각은.. 주인공과 적병이 계속 막고 치고 난전을 반복하고 있다가 결국 적병이 힘이 밀려서 맞고 나가떨어질 확률과 관계가 있어 보인다. 값이 클수록 오래 버티는 걸까..?? 즉, 쟈파나 뚱보 정도는 돼야 의미를 지니는 변수라 하겠다. 이건 외국의 페르시아의 왕자 해킹 커뮤니티에도 나와 있지 않는 내 추측이다.
게임에 칼싸움도 모자라서 이 정도로 다양한 적병 skill을 대여섯 개 남짓한 변수값의 조절만으로 구현한 거라면 정말 대단하지 않을 수 없다.
(페르시아의 왕자 1의 데모 진행 장면. 이 데모 레벨은 실제 게임에서는 존재하지 않는다.
한편, 2편도 게임 실행 후 키를 누르지 않고 스토리를 끝까지 지켜보고 있으면 플레이 데모가 나오기는 한다. 얘는 실제 게임의 레벨 1에서 시작하는데, 왕자는 얼마 가지도 못하고 그 쉬운 적에게도 거의 자살 급으로 칼에 맞아 허무하게 죽어 버린다. 2편이 데모의 퀄리티가 1편의 것보다 더 부실하다.)
페르시아의 왕자 1편은 보스급 몬스터인 뚱보와 쟈파만이 막고 치는 고급(?) 스킬이 필요한 반면, 2편은 빨간 궁전에 나오는 새대가리 적병들이 모두 그 정도 스킬을 보유하고 있다.
2편은 한 화면에 적병이 여러 명 한꺼번에 등장할 수도 있고, 싸우다가 자리를 바꿔서 회피하는 게 거의 불가능해졌고, 막고 치면서 싸우다 보면 서로 가까워지다가 좌우 자리를 바꾸기도 하는 등.. 전투 요소가 1편보다 훨씬 더 강화되었다. 그리고 최종 보스는 칼싸움이 아니라 장풍을 맞혀서 죽이는 것으로 게임 진행 방식이 달라졌다.
끝으로, 저 문서에서 special color와 one extra health는 칼싸움 skill과 무관한 boolean 값이며 큰 의미는 없다.
페르시아의 왕자 1편의 경우, 각 레벨별로 모든 적병들의 기본 HP가 정해져 있어서 동일한데, one extra health가 true인 skill이 지정된 적병은 HP가 그 기본값보다 1 더 많게 된다.
이 비트가 true인 skill은 4가 유일하다. 즉, 보스가 아닌 졸개 중에서 칼싸움을 약간 잘하는 놈이 HP도 1 더 많은 것이다.
그래서 레벨 4에서는 후반부에 HP가 4인 적병이 처음으로 등장하며(기본값 3), 레벨 5에서는 HP가 4부터 시작했다가 나중에 5로 늘어난다.
skill 4인 적병은 던전 레벨에서는 전혀 존재하지 않고 궁궐 레벨에만 존재한다는 것이 흥미로운 점이다. 레벨 4~5, 10~11 말이다.
Posted by 사무엘