ムービー Voice 選択部分の解析

016994F0 | BA 03 00 00 00            | mov edx,3
016994F5 | C7 00 00 00 00 00       | mov dword ptr ds:[eax],0
016994FB | C7 40 04 01 00 00 00  | mov dword ptr ds:[eax+4],1
01699502 | C7 40 08 02 00 00 00  | mov dword ptr ds:[eax+8],2
01699509 | 89 50 0C                      | mov dword ptr ds:[eax+C],edx
0169950C | 8B 0D 48 FA CB 01     | mov ecx,dword ptr ds:[1CBFA48]
01699512 | 8B 89 F0 00 00 00       | mov ecx,dword ptr ds:[ecx+F0]
01699518 | 83 F9 10                      | cmp ecx,10
0169951B | 77 6B                           | ja childoflight.1699588 ; traditional chinese 12
0169951D | 0F B6 89 D0 95 69 01 | movzx ecx,byte ptr ds:[ecx+16995D0]
01699524 | FF 24 8D AC 95 69 01 | jmp dword ptr ds:[ecx*4+16995AC]
0169952B | C7 00 14 00 00 00       | mov dword ptr ds:[eax],14 ; french
01699531 | 50                                 | push eax
01699532 | 6A 04                           | push 4
01699534 | C7 40 04 0B 00 00 00 | mov dword ptr ds:[eax+4],B
0169953B | C7 40 08 0C 00 00 00 | mov dword ptr ds:[eax+8],C
01699542 | C7 40 0C 0D 00 00 00 | mov dword ptr ds:[eax+C],D
01699549 | FF 15 94 56 B2 01       | call dword ptr ds:[<&_BinkSetSoundTrack@8>]
0169954F | C3                                | ret
01699550 | C7 00 15 00 00 00       | mov dword ptr ds:[eax],15 ; japanese
01699556 | EB D9                          | jmp childoflight.1699531
01699558 | C7 00 16 00 00 00       | mov dword ptr ds:[eax],16 ; german
0169955E | EB D1                          | jmp childoflight.1699531
01699560 | C7 00 17 00 00 00       | mov dword ptr ds:[eax],17 ; spanish
01699566 | EB C9                          | jmp childoflight.1699531
01699568 | C7 00 18 00 00 00      | mov dword ptr ds:[eax],18 ; italian
0169956E | EB C1                         | jmp childoflight.1699531
01699570 | C7 00 19 00 00 00      | mov dword ptr ds:[eax],19 ; russian
01699576 | EB B9                         | jmp childoflight.1699531
01699578 | C7 00 1A 00 00 00     | mov dword ptr ds:[eax],1A ; brazilian
0169957E | EB B1                         | jmp childoflight.1699531
01699580 | C7 00 1B 00 00 00     | mov dword ptr ds:[eax],1B ; latamspanish
01699586 | EB A9                         | jmp childoflight.1699531
01699588 | 50                               | push eax                  ; english & traditional chinese
01699589 | 6A 04                          | push 4
0169958B | C7 00 00 00 00 00      | mov dword ptr ds:[eax],0  ;
01699591 | C7 40 04 01 00 00 00 | mov dword ptr ds:[eax+4],1
01699598 | C7 40 08 02 00 00 00 | mov dword ptr ds:[eax+8],2
0169959F | 89 50 0C                    | mov dword ptr ds:[eax+C],edx
016995A2 | FF 15 94 56 B2 01     | call dword ptr ds:[<&_BinkSetSoundTrack@8>]
016995A8 | C3                              | ret

016995AC | 78 95 69 01 | DD 01699578 ; brazilian
016995B0 | 2B 95 69 01 | DD 0169952B ; french
016995B4 | 58 95 69 01  | DD 01699558 ; german
016995B8 | 68 95 69 01  | DD 01699568 ; italian
016995BC | 50 95 69 01 | DD 01699550 ; japanese
016995C0 | 80 95 69 01 | DD 01699580 ; latamspanish
016995C4 | 70 95 69 01 | DD 01699570 ; russian
016995C8 | 60 95 69 01 | DD 01699560 ; spanish
016995CC | 88 95 69 01 | DD 01699588 ; english

016995D0 | 00                | DB 00       ; brazilian 0,0
016995D1 | 08                | DB 08
016995D2 | 08                | DB 08
016995D3 | 08                | DB 08       ; english 3,8
016995D4 | 08                | DB 08
016995D5 | 01                | DB 01       ; french 5,1
016995D6 | 02                | DB 02       ; german 6,2
016995D7 | 03                | DB 03       ; italian 7,3
016995D8 | 04                | DB 04       ; japanese 8,4
016995D9 | 08                | DB 08
016995DA | 05                | DB 05       ; latamspanish A,5
016995DB | 08                | DB 08
016995DC | 08                | DB 08
016995DD | 08                | DB 08
016995DE | 06                | DB 06       ; russian E,6
016995DF | 08                | DB 08
016995E0 | 07                | DB 07       ; spanish 10,7

この部分が相当するのですが
もうちょっと分かりやすく記述すると

if language_cd > 0x10 {
    goto (switch分のenglishの部分へ);  // traditional chinese = 12
} else {
    switch (language_cd) {
        case 0x0:    // brazilian
            jmp_tbl = 0; break;
        case 0x3:    // english
            jmp_tbl = 8; break;
        case 0x5:    // french
            jmp_tbl = 1; break;
        case 0x6:    // german
            jmp_tbl = 2; break;
        case 0x7:    // italian
            jmp_tbl = 3; break;
        case 0x8:    // japanese
            jmp_tbl = 4; break;
        case 0xA:    // latamspanish
            jmp_tbl = 5; break;
        case 0xE:    // russian
            jmp_tbl = 6; break;
        case 0x10:  // spanish
            jmp_tbl = 7; break;
    }
}

switch (jmp_tbl) {
    case 0:  // brazilian
        track_no = 0x1A; break;
    case 1:  //  french
        track_no = 0x14; break;
    case 2:  // german
        track_no = 0x16; break;
    case 3:  // italian
        track_no = 0x18; break;
    case 4:  // japanese
        track_no = 0x15; break;
    case 5:  // latamspanish
        track_no = 0x1B; break;
    case 6:  // russian
        track_no = 0x19; break;
    case 7:  // spanish
        track_no = 0x17; break;
    case 8:  // english
        track_no = 0x0; break;
}

となっています。japanese 字幕で english 音声にするには language_cd = 8(japanese) の時に jmp_tbl = 4 としていますがこれを english と同じ jmp_tbl = 8 とすると良い。

やり方はプロセスエディタで switch (language_cd) に該当する部分 00 08 08 08 08 01 02 03 04 08 05 08 08 08 06 08 07 を探して 04 の部分を 08 に置き換えると良い。

CheatEngine を使った実装例は次回