1
0
mirror of https://github.com/pumpitupdev/pumptools.git synced 2024-12-25 20:54:50 +01:00
pumptools/doc/development/notes/pad-command-codes-notes.md

448 lines
14 KiB
Markdown
Raw Normal View History

# Pad command codes notes
Raw data and notes about pad command codes which were extracted directly from the games because I could not find a
complete and 100% accurate list per game.
All codes extracted from the MK3 games are based on the Linux port executables.
How did I find these? I used the `ac_sound_play_effect` with the second parameter set to the value `3` as my entry
point. This plays the sound effect that you can hear when you entered the modifier code correctly. After I have found
the right call, it's next to some code like this (taken from 03_3rd):
```
...
if ( modFlags & 1 )
{
if ( modFlagsSpeed1P & 1 )
result = func_2a2dc(0, 1);
if ( modFlagsSpeed1P & 2 )
result = func_2a2dc(0, 2);
if ( modFlagsSpeed1P & 4 )
result = func_2a2dc(0, 4);
if ( modFlagsSpeed1P & 8 )
result = func_2a2dc(0, 8);
if ( modFlagsSpeed1P & 0x10 )
result = func_2a2dc(0, 16);
}
if ( modFlags & 2 )
{
if ( modFlagsSpeed2P & 1 )
result = func_2a2dc(1, 1);
if ( modFlagsSpeed2P & 2 )
result = func_2a2dc(1, 2);
if ( modFlagsSpeed2P & 4 )
result = func_2a2dc(1, 4);
if ( modFlagsSpeed2P & 8 )
result = func_2a2dc(1, 8);
if ( modFlagsSpeed2P & 0x10 )
result = func_2a2dc(1, 16);
}
if ( modFlagsSpeed1P & 0x1F )
{
checkIfModifierSet2();
result = ac_sound_play_effect(0, 3u, 2u);
}
if ( modFlagsSpeed2P & 0x1F )
{
checkIfModifierSet();
result = ac_sound_play_effect(0, 3u, 2u);
}
return result;
}
```
I already renamed the function that is called prior the `ac_sound_play_effect` to `checkIfModifierSet` here. That
function checks the last eight pad inputs from a list against a list of command codes. Once a code matches, flags are
set accordingly.
Excerpt, again from 03_3rd:
```
signed int checkIfModifierSet()
{
const char *v0; // edx@1
int v1; // ebp@1
signed int v2; // ebx@1
const char *v3; // edx@19
unsigned int v4; // ebx@19
signed int result; // eax@41
signed int v6; // [sp+0h] [bp-1Ch]@1
v0 = (const char *)&codeList; // THIS is the code list
v1 = *(_DWORD *)&modFlags;
v2 = 0;
v6 = *(_DWORD *)&data_3299a4;
while ( memcmp((const char *)&data_44e9e8, v0, 8) )// iterate command list and currently post 8 inputs
{
++v2;
v0 += 8; // each modifier code is 8 commands
if ( v2 >= 13 ) // beyond command list size
goto jump_2a17f;
}
switch ( v2 ) // found command id
{
case 0:
*(_DWORD *)&data_3299a4 = 0;
*(_DWORD *)&modFlags = *(_WORD *)&modFlags & 0xFFF;
break;
```
## 03_3rd
```
1 = DL
2 = DR
4 = C
8 = UL
16 = UR
-- cancel
.data:0810833A db 4
.data:0810833B db 4
.data:0810833C db 4
.data:0810833D db 4
.data:0810833E db 4
.data:0810833F db 4
.data:08108340 db 4
.data:08108341 db 4
--------------------------- vanish
.data:08108342 db 4 center
.data:08108343 db 4 center
.data:08108344 db 10h up right
.data:08108345 db 8 up left
.data:08108346 db 4 center
.data:08108347 db 2 down right
.data:08108348 db 1 down left
.data:08108349 db 4 center
----------------- mirror
.data:0810834A db 4
.data:0810834B db 4
.data:0810834C db 1
.data:0810834D db 4
.data:0810834E db 10h
.data:0810834F db 2
.data:08108350 db 4
.data:08108351 db 8
---- 8X
.data:08108352 db 4
.data:08108353 db 4
.data:08108354 db 1
.data:08108355 db 4
.data:08108356 db 2
.data:08108357 db 4
.data:08108358 db 4
.data:08108359 db 4
- 4 X
.data:0810835A db 4
.data:0810835B db 4
.data:0810835C db 2
.data:0810835D db 4
.data:0810835E db 4
.data:0810835F db 8
.data:08108360 db 4
.data:08108361 db 4
2X
.data:08108362 db 4
.data:08108363 db 4
.data:08108364 db 8
.data:08108365 db 4
.data:08108366 db 4
.data:08108367 db 4
.data:08108368 db 10h
.data:08108369 db 4
random step
.data:0810836A db 4
.data:0810836B db 1
.data:0810836C db 4
.data:0810836D db 2
.data:0810836E db 4
.data:0810836F db 10h
.data:08108370 db 4
.data:08108371 db 8
nonstep
.data:08108372 db 8
.data:08108373 db 10h
.data:08108374 db 4
.data:08108375 db 8
.data:08108376 db 10h
.data:08108377 db 4
.data:08108378 db 8
.data:08108379 db 10h
synchro
.data:0810837A db 4
.data:0810837B db 4
.data:0810837C db 8
.data:0810837D db 10h
.data:0810837E db 8
.data:0810837F db 10h
.data:08108380 db 4
.data:08108381 db 4
couple
.data:08108382 db 4
.data:08108383 db 4
.data:08108384 db 10h
.data:08108385 db 8
.data:08108386 db 10h
.data:08108387 db 8
.data:08108388 db 4
.data:08108389 db 4
union
.data:0810838A db 1
.data:0810838B db 2
.data:0810838C db 4
.data:0810838D db 8
.data:0810838E db 2
.data:0810838F db 1
.data:08108390 db 4
.data:08108391 db 10h
random vanish
.data:08108392 db 8
.data:08108393 db 10h
.data:08108394 db 4
.data:08108395 db 1
.data:08108396 db 2
.data:08108397 db 4
.data:08108398 db 8
.data:08108399 db 10h
random speed
.data:0810839A db 8
.data:0810839B db 10h
.data:0810839C db 2
.data:0810839D db 4
.data:0810839E db 1
.data:0810839F db 4
.data:081083A0 db 2
.data:081083A1 db 1
```
Looking further into the code, there seems to be another command list with three entries right after that and it's
checked in the same function. This time, the number of inputs are 10 instead of 8:
```
v3 = (const char *)&data_108d84; // THIS is the code list
v4 = 0;
while ( memcmp(data_44e9f8, v3, 10) )
{
++v4;
v3 += 10;
if ( (signed int)v4 >= 3 )
goto jump_2a289;
}
if ( v4 < 1 )
{
if ( !v4 && data_44ea30 == 2 )
data_108bad |= 0x80u;
}
else if ( v4 <= 1 )
{
if ( data_108bad & 4 )
{
*(_WORD *)&modFlags |= 0x820u;
qmemcpy(data_44e488, &data_388e00[20 * (4 * data_108ba8 + 52)], 0x50u);
}
}
else if ( v4 == 2
&& (data_108bad & 2 && data_108ba8 >= 2 || data_108bad & 4 && !(modFlags & 0x20) && data_108ba8 == 1) )
{
data_108bae |= 1u;
}
```
Code list:
```
1 = DL
2 = DR
4 = C
8 = UL
16 = UR
.data:081083A2 data_108d84 db 2 ; DATA XREF: func_29ce8:jump_29e70o
.data:081083A2 ; checkIfModifierSet:jump_2a17fo
.data:081083A3 db 1
.data:081083A4 db 8
.data:081083A5 db 10h
.data:081083A6 db 18h
.data:081083A7 db 20h
.data:081083A8 db 12h
.data:081083A9 db 11h
.data:081083AA db 10h
.data:081083AB db 18h
.data:081083AC db 12h
.data:081083AD db 18h
.data:081083AE db 10h
.data:081083AF db 1
.data:081083B0 db 8
.data:081083B1 db 2
.data:081083B2 db 11h
.data:081083B3 db 20h
.data:081083B4 db 11h
.data:081083B5 db 10h
.data:081083B6 db 8
.data:081083B7 db 2
.data:081083B8 db 18h
.data:081083B9 db 12h
.data:081083BA db 1
.data:081083BB db 10h
.data:081083BC db 11h
.data:081083BD db 20h
.data:081083BE db 2
.data:081083BF db 18h
```
However, the code list seems to have inputs with multiple bit fields set, e.g. 0x12, 0x11. Untested.
## 04_3se
List of previous version extended by 3 more codes (last ones in the list).
```
1 = DL
2 = DR
4 = C
8 = UL
16 = UR
data_12ae8c db 4 ; DATA XREF: func_2a8c0+23o
.data:08123643 ; func_2ab98+23o
.data:08123644 db 4
.data:08123645 db 4
.data:08123646 db 4
.data:08123647 db 4
.data:08123648 db 4
.data:08123649 db 4
.data:0812364A db 4
.data:0812364B db 4
.data:0812364C db 4
.data:0812364D db 10h
.data:0812364E db 8
.data:0812364F db 4
.data:08123650 db 2
.data:08123651 db 1
.data:08123652 db 4
.data:08123653 db 4
.data:08123654 db 4
.data:08123655 db 1
.data:08123656 db 4
.data:08123657 db 10h
.data:08123658 db 2
.data:08123659 db 4
.data:0812365A db 8
.data:0812365B db 4
.data:0812365C db 4
.data:0812365D db 1
.data:0812365E db 4
.data:0812365F db 2
.data:08123660 db 4
.data:08123661 db 4
.data:08123662 db 4
.data:08123663 db 4
.data:08123664 db 4
.data:08123665 db 2
.data:08123666 db 4
.data:08123667 db 4
.data:08123668 db 8
.data:08123669 db 4
.data:0812366A db 4
.data:0812366B db 4
.data:0812366C db 4
.data:0812366D db 8
.data:0812366E db 4
.data:0812366F db 4
.data:08123670 db 4
.data:08123671 db 10h
.data:08123672 db 4
.data:08123673 db 4
.data:08123674 db 1
.data:08123675 db 4
.data:08123676 db 2
.data:08123677 db 4
.data:08123678 db 10h
.data:08123679 db 4
.data:0812367A db 8
.data:0812367B db 8
.data:0812367C db 10h
.data:0812367D db 4
.data:0812367E db 8
.data:0812367F db 10h
.data:08123680 db 4
.data:08123681 db 8
.data:08123682 db 10h
.data:08123683 db 4
.data:08123684 db 4
.data:08123685 db 8
.data:08123686 db 10h
.data:08123687 db 8
.data:08123688 db 10h
.data:08123689 db 4
.data:0812368A db 4
.data:0812368B db 4
.data:0812368C db 4
.data:0812368D db 10h
.data:0812368E db 8
.data:0812368F db 10h
.data:08123690 db 8
.data:08123691 db 4
.data:08123692 db 4
.data:08123693 db 1
.data:08123694 db 2
.data:08123695 db 4
.data:08123696 db 8
.data:08123697 db 2
.data:08123698 db 1
.data:08123699 db 4
.data:0812369A db 10h
.data:0812369B db 8
.data:0812369C db 10h
.data:0812369D db 4
.data:0812369E db 1
.data:0812369F db 2
.data:081236A0 db 4
.data:081236A1 db 8
.data:081236A2 db 10h
.data:081236A3 db 8
.data:081236A4 db 10h
.data:081236A5 db 2
.data:081236A6 db 4
.data:081236A7 db 1
.data:081236A8 db 4
.data:081236A9 db 2
.data:081236AA db 1
--- remix double
.data:081236AB db 1
.data:081236AC db 8
.data:081236AD db 1
.data:081236AE db 4
.data:081236AF db 10h
.data:081236B0 db 2
.data:081236B1 db 10h
.data:081236B2 db 4
---- crazy mode
.data:081236B3 db 4
.data:081236B4 db 1
.data:081236B5 db 4
.data:081236B6 db 2
.data:081236B7 db 4
.data:081236B8 db 1
.data:081236B9 db 4
.data:081236BA db 2
--- all select code? doesn't make sense and doesn't seem to work, probably unused
.data:081236BB db 10h
.data:081236BC db 4
.data:081236BD db 1
.data:081236BE db 10h
.data:081236BF db 8
.data:081236C0 db 4
.data:081236C1 data_12af0a db 2 ; DATA XREF: func_2c380+139r
.data:081236C1 ; func_2c51c+559r
.data:081236C2 db 8
```