KOEI/태합입지전 시리즈

태합입지전5 DX 신무장 얼굴 넣기 / 이벤트 파일에 숨겨진 조건분기 코드에 관하여.

K66Google 2023. 1. 25. 14:17

설 특집으로 태합입지전5 DX를 스트리밍하게 되어서, 거기에 버츄얼 개망초를 넣어야 할 필요가 있었다.

블로그에 적을 만한 소재이기도 하므로, 여기에 서술하기로 한다.

 

 

* 신무장 얼굴 넣기

태합5 DX는 몸통과 얼굴이 서로 분리되어 있는 형태다.

다만 우리는 신무장에 쓸 얼굴을 넣는 것이므로, 굳이 몸통과 얼굴을 분리할 필요가 없다. 그냥 몸통 파츠에 다 집어넣도록 한다.

중국산 툴인 tk5dx_g1t로 data\TDATA 폴더에 있는 M_FC01 파일을 전개한다. M_FC01_S 파일도 마찬가지로 전개해놓는다. (두 파일은 미리 어딘가에 백업해 놓고, 전개·압축 방법은 https://k66google.tistory.com/785 의 그래픽 단락을 참조하면 된다.)

그런 다음 657번 폴더로 간다. 여기에는 메이드복 몸통이 있는데, 이 파일을 포토샵으로 열어서 거기에 신무장 얼굴을 넣는다. (미리 포토샵 dds 플러그인은 깔아놓아야 한다.)

넣은 뒤 알파 채널까지 지정해주고 저장은 DXT5로 한다.

(저장하고 난 뒤에 포토샵은 끄지 말고 그대로 둔다.)

 

그리고 난 뒤 다시 tk5dx_g1t로 압축해서 게임 폴더에 덮어씌운다.

 

위에서 DXT5로 저장하라는 이유가 바로 이것때문이다. DXT3으로 저장하면 테두리가 자글자글하게 나오니까...

 

 

아무튼, 들어간게 확인되었으면 377번 폴더로 간다. 여기에는 얼굴 파츠의 고양이가 있는데, 이것도 포토샵에 추가로 열어서 전부 흰색으로 칠해서 없애버린다. 알파 채널도 모두 검은 칠을 해버린다. 그 후 DXT5로 저장하고 tk5dx_g1t로 압축한 뒤 게임 폴더에 덮어씌운다.

 

 

이렇게 한 뒤 여무장 파츠의 머리 59, 복장 52로 지정하면 신무장의 얼굴이 뜬다.

그러나 그... '대가리 부분' 이 남아있기 때문에 더 수정해야 한다. 이걸 지우게 되면 대부분의 일반무장들에게 영향을 주므로 고양이 얼굴처럼 지울 수 없다. 따라서 신무장의 얼굴을 늘리는 등으로 가려버려야 한다.

아까 포토샵 닫지 말고 열어두라고 한 이유가 바로 이것 때문에 그런거다. 미세하게 얼굴을 움직이면서 가려지는지 아닌지 확인해야 하기 때문이다.

 

 

어떻게든 잘 가려지게 했다.

 

 

M_FC01_S도 같은 식으로 657, 377 폴더에 가서 똑같이 해준다. 이 파일은 게임화면 좌측 상단에 나오는 얼굴 사진을 담당하고 있다.

아무튼 이렇게 하면 신무장 얼굴 넣기는 끝.

 

 

 

* 이벤트 파일에 숨겨진 조건분기 코드에 관하여

신무장으로 시작할때 나오는 2개의 문장을 한글화해보기로 하였다. 그래도 설특집으로 플레이하는 거니까 뭔가 보여줄게 있어야 할 것 아닌가?

해당 문장은 ECF00000.TS5 파일에 들어가 있었다. 이 문장이 어느 이벤트 파일에 있는지 찾느라 참 고생했다.

 

 

그러나 번역된 문장을 입력하는 중 난관에 부딪혔다. 에디터에 문제가 있는지, 자꾸만 길이 계산을 잘못하고 있는 것이다.

에디터가 바이트를 불러오는 과정에 반각 가타카나를 전각 히라가나로 변환하는 등 나름대로 인코딩 과정을 거치는데, 이 처리를 거치고 난 문장을 아무 글자도 바꾸지 않은 상태로 그대로 메모리에 반영해도 length 값이 잘못 계산되고 있었다.

결국 이벤트 바이트를 불러올때는 인코딩 과정 없이 모두 헥스 코드로 가져오게 하고, 드래그한 부분의 문장만 따로 인코딩을 하도록 조치하였다.

 

 

에디터를 업데이트 한 후에 다시 번역 문장을 입력했다.

과거에 이벤트 문장은 뒤에 00 바이트까지 맞춰야 된다는 점을 파악했으니, 여기까지는 수월했다.

그런데...

 

 

여자 신무장으로 시작할때는 인트로 대사가 뜨지 않고, 이상한 문장이 문장 끝에 더 출력되고 있었다.

산 너머 산이다... 대체 왜 이러는 거지?

 

 

처음에는 00 바이트 문제인 줄로만 알았다. 그래서 뒤에 00 바이트를 안 두거나, 하나만 두거나.. 이렇게 계속 수정해가면서 확인해봤다. 그러나 변화는 '이상한 문장이 뒤에 더 출력되거나, 아니거나' 이런 식밖에 없었다.

그럼 00 바이트 맞추기 쪽의 문제는 아닌 건데... TS5 파일을 헥스 에디터로 열고 의심가는 점을 찾아볼 수 밖에 없나.

 

 

의심가는 곳들을 보던 중 희한한 바이트 나열을 목격했다. 바로 04 xx yy zz 였다.

뭔가 대사 바이트 길이하고 yy zz 부분의 바이트가 비슷해보인다...

하지만 이것만 보고는 도저히 갈피를 잡을 수가 없었다.

 

 

그래서, 직접 태합입지전5의 이벤트를 작성해보기로 하였다. 작성 참고 출처는 #1, #2 이다.

Shift_JIS 인코딩을 지원하는 텍스트 에디터 (사쿠라 에디터) 를 열고, 다음과 같이 2개의 내용을 작성했다.

 

taikou5-abc.txt
0.00MB
taikou5-abcd.txt
0.00MB

선택지 구문으로, 하나는 abc로 응답하고, 다른 하나는 abcd로 응답한다.

이러면 텍스트 길이가 변하므로 일부 코드도 변경이 있을 것이다. 그 점을 포착해보는 것이다.

 

 

다 작성했으면 태합5 DX의 Evcon\SCRIPT_JP 폴더에 텍스트 파일을 넣고, EvCon.exe 파일을 실행한다.

실행하면 왼쪽 목록을 전체선택(全て 옆의 체크박스 체크) 해주고 ID검색추가(ID検索追加) 버튼 누른다.

그러면 메모장 하나 뜨고 전체선택이 꺼지는데, 다시 전체선택 해주고 컨버트(コンバート) 버튼 누른다. 성공했으면 OUT_JP 폴더에 ECF00001.TE5 파일과 ECF00001.TS5 파일이 출력될 것이다.

두 파일을 문서\KoeiTecmo\Taiko5DX\EVENT 폴더에 넣어주면 된다.

 

Taiko5DX event test2(선택문).zip
0.00MB

이런 식으로 작업한 이벤트 파일 2개를 첨부한다.

 

 

적용이 잘 됐으면, 신무장으로 게임을 시작할때 test? 라고 물어보게 된다.

 

'예' 를 누르면 abc 또는 abcd가 출력되고...

 

'아니오' 를 누르면 '가나다라마바사아자차카타파하' 가 출력된다.

게임에서 잘 출력되는 걸 확인했으니... 이제 만든 이벤트 파일 2개를 분석해본다.

 

 

TE5 파일은 모두 바이트가 일치했다. 그렇다면 문제는 역시 TS5 파일에 있는 것으로 보인다.

이 중에서 바이트가 일치하지 않는 부분을 찾아내보도록 한다.

 

 

가장 의심스러운 부분은... 역시 04 xx yy zz다. abc 출력 이벤트에서는 04 01 28 00이고, abcd 출력 이벤트에서는 04 01 30 00이었다.

바이트의 차이는 8... 이 차이가 무엇때문에 만들어졌는지 살피다가... 마침내 답을 얻어냈다. 이 구문은 조건분기 구문이었던 것이다.

조건이 거짓이라면 zz 뒤에서 yy zz를 바이트 플립한 것을 ÷2 한 만큼 바이트를 이동하는 걸로 추정된다.

왼쪽 파일을 예를 들자면...

 

28 00 → 00 28 → 0x28 (10진수 40) ÷ 2 = 0x14 (10진수 20) → 0x24 오프셋에서 0x14 바이트 만큼 이동하면 0x38

 

...이런 과정으로 작동하는 것 같다. 바이트를 이동한 자리에는 11, 12, 13 같은 대사 바이트가 나와야 한다.

 

한글화를 하면서 기존 일본어 대사보다 바이트가 늘어나는 등 변화가 있었기 때문에, 이상한 문장이 출력되거나 다른 조건의 무장일때 대사가 출력되지 않은 것이었다.

그럼 이 방식을 가지고 ECF00000.TS5 파일을 수정해보자.

 

04 01 F8 00 → 04 01 48 01

04 00 18 02 → 04 00 68 02

 

여긴 조건분기가 이중으로 있어서 둘 다 바꿔줘야 한다.

과연 어떻게 될까...?

 

 

만세!!!!!

이제 여자 신무장의 대사도 정상적으로 출력되고, 이상한 문장이 뒤에 붙는 일도 없어졌다.

이렇게 나흘 동안 고민하던 문제가 해결되었고, 방송에서도 정상적으로 출력되는 모습을 보여줄 수 있었다.

다만 조건분기 코드를 어떻게 해야 MSG 에디터 상에서 쉽게 바꿀 수 있게 해줄지 모르겠다.

어차피 한글화할 사람도 없으니, 그냥 참고하라고 글만 올려놓아도 상관없겠지..

 

 

* 부록 : 왜 00 바이트를 맞춰야 하는가

이벤트 파일의 문장에서 왜 00 바이트를 맞춰야 하는지 의문이 들 수 있을 것이다.

삽질 기록은 다 제외하고 핵심만 말하자면, 뒤에 오는 대사 시작 바이트 (11, 12, 13) 의 주소값이 0x00, 0x04, 0x08, 0x0C로 끝나야만 대사가 정상적으로 출력되기 때문이다.

이 때문에 MSG 에디터에서는 검사할 문장의 length를 4로 나눠서 나머지 값을 보고, 그에 맞게 00 바이트를 줄이거나 채우는 기능을 탑재하고 있다.

 

그럼 이만...