KOEI/대항해시대 시리즈

대항해시대3 워프 메뉴를 보고 말겠다.

K66Google 2021. 1. 28. 13:58

 


 


(출처 : 대항해시대 네이버 카페 #1 , #2 )


대항해시대3의 도시 메뉴 중 가장 보기 힘든 메뉴 '워프'...

워프 메뉴가 등장하는 확실한 조건은 지금까지 아무도 파악하지 못 한 것으로 보인다. 일본 웹사이트에서도 워프와 관련된 정보는 찾아볼 수 없었다. (일판에도 워프는 존재한다. 실행파일 내부에 'わ~ぷ' 라는 명칭이 들어가있다.)

확률적으로 나오는 조건인지, 아니면 오락실 게임기 버튼마냥 순서대로 특정 메뉴를 클릭해야 나오는 조건인지 추측하는 것 조차도 불가능하다.


그래서 실행파일을 뜯어서 워프 메뉴가 나오게 만들기로 했다.


첫번째 힌트는 도시 메뉴의 '게임 종료' 버튼을 눌렀을때 메시지 박스에 뜨는 'YES'와 'NO' 문구였다.

Search for - All referenced text strings로 모든 텍스트 목록을 열어서 YES와 NO를 찾았다. 보니까 0049DCAF에 있었다.

YES의 옆에는 00572300 이라는 주소가 나와있다. 그래서 왼쪽 하단 창에서 00572300으로 이동(Ctrl + G) 해보니까... 


정말로 YES가 들어가있었다. 설마 텍스트가 여기에 들어있는건가? 나는 왼쪽 아래창에서 Search for - binary string(Ctrl + B)로 '워프' 라고 검색해보았다.


그렇게 하니 '워프' 가 나타났다. 혹시 Find references 하면 뭔가 연결되는 함수가 나올지도 모른다 싶어서 해봤는데... 안타깝게도 결과값은 없었다. 하긴 이렇게 쉽게 보이면 누군가가 벌써 찾았겠지.

지푸라기 잡는 심정으로 아래쪽(0053BF38)에 있는 '어디로 들어 가시겠습니까?' 의 레퍼런스를 찾아보았다. 해당 문구는 '맵 포인트에 들어간다' 메뉴를 클릭했을때 나오는 텍스트다.


레퍼런스가 안내해준 곳은 004930DD였다. 그 밑으로 Case 1... Case 2... 이렇게 조건분기 같은 문구들이 보인다. 과연 무슨 뜻일까? 의문을 품고 위쪽으로 올라가보니까...


Switch (cases 0..B) 라는 문구가 보였다. 0부터 B까지 세어보면 총 12개다. 

12개라... 도시 메뉴 개수도 그정도 되지 않았나? 일단 도시 메뉴의 16진수 값을 가정해본다.


0 - 맵 포인트에 들어간다

1 - 인물 정보

2 - 함대 정보

3 - 소지품 정보

4 - 도시 정보

5 - 힌트 정보

6 - 계약 정보

7 - 후원자 정보

8 - 지도를 본다

9 - 게임 종료

10(A) - (워프)

11(B) - 취소


...도시 메뉴도 워프까지 다 나온다고 치면 12개다. 여기가 가장 수상하다.

한번 Switch (cases...) 위의 Arg1에 나온 0056A0E8라는 주소로 이동해보았다.

 

왼쪽 아래창에서 0056A0E8로 이동하니, 10 BE 53 00 이라는 바이트가 있었다.

이걸 바이트 플립하면... 00 53 BE 10이다. 0053BE10에는 뭐가 있을까?


0053BE10에는 '맵 포인트에 들어간다' 라는 텍스트가 있었다. 보아하니 메뉴명은 모두 여기에 모여있는 것 같다. 도시 메뉴와 관련이 있는 사항이 여기서 자꾸 나오는 걸 보니 이곳은 도시 메뉴가 확실하다.


그렇다면 '맵 포인트에 들어간다' 를 클릭했을때 '워프' 기능이 호출되게 할 수도 있지 않을까? ...라는 생각을 하면서 이번엔 Case 0 of switch 어쩌구저쩌구에다 Find references를 해보았더니 DD CDS95. 어쩌구저쩌구 라는 값이 있는 주소로 이동되었다.

DD의 개수는... 총 12개다. 마찬가지로 도시 메뉴와 관련이 있는 걸로 보인다.

이때 뒤에 있는 주소값을 서로 맞교환해보면 어떨까 하는 생각이 들었다.


Ollydbg에서는 수정이 안돼서 Crystaltile2를 열고 4E 30 49 00이라고 검색해보았다. (원래는 0049304E지만 바이트 플립때문에 거꾸로 입력해야 된다.)

그렇게 하니까 00092CFC로 이동되었다. 워프 메뉴가 11번째(A)에 있다고 가정했으니 11번째 값인 8A 33 49 00과 서로 값을 맞바꿔주었다.


그런데 텍스트가 그대로면 혼란스러우므로 텍스트도 함께 바꿔주기로 했다. 아까전에 Ollydbg상에서 메뉴 텍스트가 0053BE10에 있다고 들었다. 이걸 응용해보기로 한다.

다시 Crystaltile2 상에서 10 BE 53 00이라고 검색해본다. 그렇게 하니 001678E8로 이동되었는데, 워프 메뉴로 추정되는 11번째 값 B8 BE 53 00과 서로 값을 맞바꿔주었다.


지금까지의 작업 내역을 정리하면 이렇게 된다.



* 정리 - '맵 포인트에 들어간다' 메뉴를 '워프' 메뉴로 변경

(CDS95.exe 파일 버전 1.2.0.0 기준)


00092CFC - 4E 30 49 00 → 8A 33 49 00

00092D24 - 8A 33 49 00 → 4E 30 49 00


001678E8 - 10 BE 53 00 → B8 BE 53 00

00167960 - B8 BE 53 00 → 10 BE 53 00


이렇게 수정하고 저장하였다.

이제 게임을 실행해서 제대로 워프 메뉴가 뜨는지 확인해보는 일만 남았다.



(메뉴 가로폭이 좁아보이는데, 이건 테스트 도중에 찍어서 그런 것이다. 실제로는 아래 스크린샷 처럼 나온다.)


성공!!!

이제 워프 기능을 자유롭게 사용할 수 있게 되었다.


CDS95 워프 실행파일.zip


여기까지 글을 읽어준 기념으로 워프 패치를 해놓은 실행파일을 첨부한다.

(* 주의 : 해당 실행파일은 그밖에도 [소지금·저금 한도 1억까지 / 북위·남위 90도까지 이동 가능 / 아무데서나 세이브 가능] 패치가 이미 되어있는 상태입니다. 패치 기법 출처는 대항해시대 카페 #3, #4, #5 글을 참조하세요.)


* 기타

1. 워프 기능은 주인공만 워프되고 배는 워프되지 않는다.

2. 특정 항구에서 워프 기능을 썼다가 돌아온 뒤 출항하면 가끔 배가 육지에 끼이는 버그가 발생하는 모양이다. 그럴때는 함선을 입항하지 말고 상륙으로 도시에 들어가거나, 배가 육지에 끼었을때 게임을 중단하고 세이브 파일의 함대 좌표를 헥스 에딧 하는 방식(링크) 으로 해결해야 한다.


그럼 이만...