안녕하세요.
요즈음 여유시간에 예전에 찾다가 포기한 게임의 코드를 찾으려 하고 있는데 잘 안됩니다.
제가 찾으려고 하는 게임은 아래쪽에 질문올린 [030530][Complets] ママしぼり(마마시보리) 인데요.
아랄트랜스 디버깅을 하여 대사를 불러오면 아래같이 나옵니다.
옆에 보시면 40A6E0, 40A870 이 두개가 나옵니다.
40A6EO이 대사창에 대사가 나오는 코드 이고 40A870은 마우스 우클릭을 하여 대사창을 임시로 한번 보내고 다시 대사창을 불렀을때 대사 나오는 코드 입니다.
문제는 40A6E0이 게임화면에 대사가 뜨면 디버깅에서는 처음 전체문장이 나오고 그 문장직후에는 문장의 첫 글자부터 끝의 마침표까지 나옵니다.
가령 ありがとう 면 ありがとう 고맙습니다 라고 디버깅에 뜨고 그 다음에는 あ, り, が,と, う 라고 나옵니다. 그래서 한글자씩 나올때는 번역이 엉망이지요.
AT코드 찾아서 적용해보니 게임화면에는 궑, 나무, 궥 이런 식으로 해석이 나옵니다.
찾은 코드는 이러합니다. ENCODEKOR,HOOK(0x0040A6E0,RETNPOS(COPY),TRANS([ESP+0x10],TWOBYTE,REMOVESPACE,ONEBYTE,OVERWRITE(IGNORE)))
위 AT코드에서 40A870 을 뺀 이유는 굳이 없어도 되기 때문입니다.
위 코드를 적용하면 타이틀 메뉴 번역과 선택지 번역 및 대사창에서 마우스 우클릭을 하여 대사창을 한번 숨기고 다시 냈을때 나오는 대사 번역에 문제없습니다.
이렇게 나옵니다.
타이틀 화면만 스샷 올리는데, 선택지 번역도 번역 잘됩니다.
여기서 처음부터를 누르면 게임이 시작됩니다.
번역이 이상하게 나옵니다. 분명 맞게 찾았거늘!!
이 상태에서 마우스 우클릭을 하면 대사창이 한번 없어지고 게임화면만 나오는데, 다시 마우스 우클릭을 하면 대사창이 게임화면에 나옵니다.
그러면 이렇게 나옵니다,
어느아침일에대해 라고 번역이 잘되어 있습니다.
아무래도 아랄디버깅응 할때 대사코드 40A6E0 에서 처음 전체 문장이 나오고 다시 한 글자씩 다시 나오는데 이 한글자씩들이 게임화면에 적용되는 거 같네요.
아랄디버깅으로 보면 맨 처음에는 하나의 첫 문장이 나옵니다. 이 것만 적용시켜 게임화면에 나오게 할 수 없을까 싶어서
처음 전체 문장이 나왔을때 브레이크 먹여서 뜨는 수치가 ESP+0x10 인데 이건 나중에 한글자씩 일때와 같습니다.
아마도 이 문제는 엔진의 문제가 아닌가 합니다.
현재 제가 찾고있는 [030530][Complets] ママしぼり(마마시보리)는 실행파일 외 XEX.EXE 라는 파일이 있는데요.
제가 과거에 찾아 폴라리스가 연구소 역활을 하던 시기에 올린 게임 중 [080229][Complets] ママしぼり2 ~ママしぼりの事情~(마마시보리2 ~마마시보리의 사정~)
이라고 마마시보리 속편이 있는데 ママしぼり2에는 실행파일 외 C4.EXE 라는 파일이 있습니다.
참고로 Complets사에서 발매한 게임들 중 XEX.EXE가 있는 게임들은 모두 아랄디버깅 시 대사가 진행되면 전체 문장을 한번 내보이고 한글자 씩 나옵니다.
문장->한글자씩 그 문장이나 단락완성->다시 문장->한글자씩 문장 완성->반복
Complets사 게임 중 C4.EXE 파일이 있는 게임들은 아랄 디버깅을 했을때 문장 단위로 뜨고 한글자씩 따로 나오지 않기 때문에 쉽게 번역이 됩니다.
같은 회사에서 발매한 게임에서 XEX.EXE 파일이 탑재된 게임만 아랄 디버깅으로 번역을 했을시 대사를 진행하면 전체문장->한글자씩 뜨면서 문장완성->반복되는 반면
C4.EXE 파일이 탑재된 게임은 아랄 디버깅으로 번역을 했을시 대사를 진행하면 전체문장 단위로 뜨고, 한글자 단위로는 없는 것이 차이점 입니다.
즉, XEX.EXE가 게임의 엔진과 관련된 파일이라면 게임 엔진 문제라고 볼 수 밖에 없습니다.
제가 예전에 보기로 이런 문제가 생기는 게임의 경우 바이너래 코드(b코드)로 해결하는 경우를 보았는데, b코드를 생성할 능력이 없어서 난감하네요.
과연 b코드를 만들 수 있다면 이를 적용시켜 아랄 디버깅에서 전체문장 후 한글자씩 문장이 완성될때까지 뜨는 걸 전체 문장단위로 뜨게 바꿀 수 있는지 궁금합니다.
또한 위 게임처럼 대사창을 한번 숨기고 다시 내보냈을때 그 화면만 번역되는 코드의 경우 일반적으로 어떻게 대처하는게 좋은지 좀 조언을 해주시면 감사하겠습니다.
혹 제가 요청게시판에 코드 찾아달라고 올려놓기도 했는데, 고수 분께서 보시고 찾아 보시면서 XEX 엔진의 고질적 문제점에 대해 널리 토의해봤으면 합니다.,
암흑마제
- 2016.04.09
- 15:11:06
피시님 제가 실력이 부족해서요.
한글자씩 고정된 형태로 분리된 대사를
한번 고의적으로 모아놓고 다시 되돌려넣는 루틴을
외부로더나 dll인젝션 혹은 어셈(바이너리 패치) 등으로 수정하여 후킹하겠죠. 의 한자락도 못하거든요;;
저야 그저 아랄디버깅으로만 코드찾다가 올리디버거로 찾아보려고 기웃거리는 초급자라서요,
혹 시간되시면 바이너리 패치 만들어주시면 안될까요? 혹 실행파일이 필요하신거면 실행파일과 엔진파일 첨부할게요.
저라면 한글자씩 고정된 형태로 분리된 대사를
한번 고의적으로 모아놓고 다시 되돌려넣는 루틴을
외부로더나 dll인젝션 혹은 어셈(바이너리 패치) 등으로 수정하여 후킹하겠죠?
패턴이 어느정도 되어있으니까 모으기와 돌리기는 어렵지 않을거에요.
실 예로 유사한 출력방식을 수정하여 과거 성공한 사례도 많구요.
xex 엔진만 그런건 아니지만 이런형태로 대사뿌려서 사용하는게임은 꽤 많죠.