From bb86e54902c2c8dcf00346aa5830393d71e92dee Mon Sep 17 00:00:00 2001 From: ColinT Date: Mon, 19 May 2025 09:20:03 -0400 Subject: [PATCH] decompile sub_31CF8 (#97) * decompile sub_31CF8 * cleanup --------- Co-authored-by: Marcus Huderle --- asm/rom_11B9C.s | 333 ------------------------------- expected_objs/sub_31CF8.o | Bin 2728 -> 0 bytes include/constants/pinball_game.h | 1 + include/functions.h | 2 +- include/global.h | 6 +- include/types.h | 2 +- ld_script.txt | 1 + src/rom_31CF8.c | 124 ++++++++++++ src/rom_31F6C.c | 2 +- 9 files changed, 133 insertions(+), 338 deletions(-) delete mode 100644 expected_objs/sub_31CF8.o create mode 100644 src/rom_31CF8.c diff --git a/asm/rom_11B9C.s b/asm/rom_11B9C.s index 6b674d41..2999121c 100644 --- a/asm/rom_11B9C.s +++ b/asm/rom_11B9C.s @@ -58232,336 +58232,3 @@ _08031CDE: .align 2, 0 _08031CF0: .4byte gUnknown_08137B5C _08031CF4: .4byte 0x05000360 - - thumb_func_start sub_31CF8 -sub_31CF8: @ 0x08031CF8 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - lsls r0, r0, #0x10 - cmp r0, #0 - bne _08031D90 - ldr r0, _08031D80 @ =gMain - ldrb r0, [r0, #2] - cmp r0, #3 - beq _08031D20 - ldr r0, _08031D84 @ =gCurrentPinballGame - ldr r0, [r0] - movs r1, #0xb3 - lsls r1, r1, #3 - adds r0, r0, r1 - movs r2, #0 - ldrsh r0, [r0, r2] - movs r1, #4 - bl SaveFile_SetPokedexFlags -_08031D20: - ldr r2, _08031D88 @ =gSpeciesInfo - ldr r1, _08031D84 @ =gCurrentPinballGame - ldr r4, [r1] - movs r3, #0xb3 - lsls r3, r3, #3 - adds r0, r4, r3 - ldrh r3, [r0] - lsls r0, r3, #1 - adds r0, r0, r3 - lsls r0, r0, #3 - adds r2, r0, r2 - movs r0, #0x14 - ldrsb r0, [r2, r0] - mov r8, r1 - cmp r0, #0 - bne _08031D42 - b _08031F5E -_08031D42: - ldrb r0, [r2, #0x15] - cmp r0, #0xcc - bls _08031D4A - b _08031F5E -_08031D4A: - ldr r0, _08031D8C @ =0x00000281 - adds r1, r4, r0 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0xf - bgt _08031D58 - b _08031F00 -_08031D58: - movs r2, #0 - mov r4, r8 - movs r3, #0x9c - lsls r3, r3, #2 -_08031D60: - ldr r1, [r4] - lsls r0, r2, #0x10 - asrs r0, r0, #0x10 - adds r1, r1, r3 - adds r2, r1, r0 - adds r0, #1 - adds r1, r1, r0 - ldrb r1, [r1] - strb r1, [r2] - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - asrs r0, r0, #0x10 - cmp r0, #0xf - ble _08031D60 - b _08031F4C - .align 2, 0 -_08031D80: .4byte gMain -_08031D84: .4byte gCurrentPinballGame -_08031D88: .4byte gSpeciesInfo -_08031D8C: .4byte 0x00000281 -_08031D90: - ldr r2, _08031E10 @ =gCurrentPinballGame - ldr r1, [r2] - ldr r6, _08031E14 @ =0x00000281 - adds r1, r1, r6 - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - ldr r0, [r2] - movs r3, #0xa0 - lsls r3, r3, #2 - adds r1, r0, r3 - ldrb r1, [r1] - lsls r1, r1, #0x18 - asrs r1, r1, #0x18 - adds r0, r0, r6 - lsls r3, r1, #0x10 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldr r4, _08031E18 @ =gMain - mov r8, r2 - cmp r1, r0 - bge _08031DE6 - mov r5, r8 - movs r7, #0x9c - lsls r7, r7, #2 -_08031DC4: - ldr r0, [r5] - asrs r1, r3, #0x10 - adds r0, r0, r7 - adds r2, r0, r1 - adds r1, #1 - adds r0, r0, r1 - ldrb r0, [r0] - strb r0, [r2] - ldr r0, [r5] - adds r0, r0, r6 - lsls r3, r1, #0x10 - asrs r1, r3, #0x10 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r1, r0 - blt _08031DC4 -_08031DE6: - mov r1, r8 - ldr r0, [r1] - movs r5, #0xb3 - lsls r5, r5, #3 - adds r3, r0, r5 - ldrh r0, [r3] - cmp r0, #0xd - bne _08031E32 - ldr r0, [r4, #0x4c] - movs r1, #1 - ands r0, r1 - cmp r0, #0 - bne _08031E20 - adds r0, r4, #0 - adds r0, #0x74 - ldrb r0, [r0, #0xe] - cmp r0, #3 - bhi _08031E1C - movs r0, #0xe - b _08031EB2 - .align 2, 0 -_08031E10: .4byte gCurrentPinballGame -_08031E14: .4byte 0x00000281 -_08031E18: .4byte gMain -_08031E1C: - movs r0, #0x10 - b _08031EB2 -_08031E20: - adds r0, r4, #0 - adds r0, #0x74 - ldrb r0, [r0, #0x10] - cmp r0, #3 - bhi _08031E2E - movs r0, #0x10 - b _08031EB2 -_08031E2E: - movs r0, #0xe - b _08031EB2 -_08031E32: - cmp r0, #0x58 - bne _08031E44 - ldrb r0, [r4, #4] - cmp r0, #0 - bne _08031E40 - movs r0, #0x59 - b _08031EB2 -_08031E40: - movs r0, #0x5a - b _08031EB2 -_08031E44: - cmp r0, #0xaf - bne _08031E7C - ldr r0, [r4, #0x4c] - movs r1, #1 - ands r0, r1 - cmp r0, #0 - bne _08031E66 - movs r2, #0x92 - lsls r2, r2, #1 - adds r0, r4, r2 - ldrb r0, [r0] - cmp r0, #3 - bhi _08031E62 - movs r0, #0xb0 - b _08031EB2 -_08031E62: - movs r0, #0xb1 - b _08031EB2 -_08031E66: - ldr r1, _08031E74 @ =0x00000125 - adds r0, r4, r1 - ldrb r0, [r0] - cmp r0, #3 - bhi _08031E78 - movs r0, #0xb1 - b _08031EB2 - .align 2, 0 -_08031E74: .4byte 0x00000125 -_08031E78: - movs r0, #0xb0 - b _08031EB2 -_08031E7C: - cmp r0, #0x29 - bne _08031EA4 - movs r0, #0x2b - strh r0, [r3] - ldr r4, _08031EA0 @ =gMain - ldrb r0, [r4, #2] - cmp r0, #3 - beq _08031E94 - movs r0, #0x2b - movs r1, #4 - bl SaveFile_SetPokedexFlags -_08031E94: - mov r2, r8 - ldr r0, [r2] - adds r0, r0, r5 - movs r1, #0x2a - strh r1, [r0] - b _08031EB4 - .align 2, 0 -_08031EA0: .4byte gMain -_08031EA4: - ldr r2, _08031F1C @ =gSpeciesInfo - ldrh r1, [r3] - lsls r0, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #3 - adds r0, r0, r2 - ldrb r0, [r0, #0x15] -_08031EB2: - strh r0, [r3] -_08031EB4: - ldrb r0, [r4, #2] - cmp r0, #3 - beq _08031ECE - ldr r0, _08031F20 @ =gCurrentPinballGame - ldr r0, [r0] - movs r3, #0xb3 - lsls r3, r3, #3 - adds r0, r0, r3 - movs r1, #0 - ldrsh r0, [r0, r1] - movs r1, #4 - bl SaveFile_SetPokedexFlags -_08031ECE: - ldr r2, _08031F1C @ =gSpeciesInfo - ldr r1, _08031F20 @ =gCurrentPinballGame - ldr r4, [r1] - movs r3, #0xb3 - lsls r3, r3, #3 - adds r0, r4, r3 - ldrh r3, [r0] - lsls r0, r3, #1 - adds r0, r0, r3 - lsls r0, r0, #3 - adds r2, r0, r2 - movs r0, #0x14 - ldrsb r0, [r2, r0] - mov r8, r1 - cmp r0, #0 - beq _08031F5E - ldrb r0, [r2, #0x15] - cmp r0, #0xcc - bhi _08031F5E - ldr r0, _08031F24 @ =0x00000281 - adds r1, r4, r0 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0xf - bgt _08031F28 -_08031F00: - adds r1, r0, #0 - movs r2, #0x9c - lsls r2, r2, #2 - adds r0, r4, r2 - adds r0, r0, r1 - strb r3, [r0] - mov r3, r8 - ldr r1, [r3] - ldr r0, _08031F24 @ =0x00000281 - adds r1, r1, r0 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - b _08031F5E - .align 2, 0 -_08031F1C: .4byte gSpeciesInfo -_08031F20: .4byte gCurrentPinballGame -_08031F24: .4byte 0x00000281 -_08031F28: - movs r2, #0 - mov r4, r8 - movs r3, #0x9c - lsls r3, r3, #2 -_08031F30: - ldr r1, [r4] - lsls r0, r2, #0x10 - asrs r0, r0, #0x10 - adds r1, r1, r3 - adds r2, r1, r0 - adds r0, #1 - adds r1, r1, r0 - ldrb r1, [r1] - strb r1, [r2] - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - asrs r0, r0, #0x10 - cmp r0, #0xf - ble _08031F30 -_08031F4C: - mov r1, r8 - ldr r0, [r1] - movs r2, #0xb3 - lsls r2, r2, #3 - adds r1, r0, r2 - ldrh r1, [r1] - ldr r3, _08031F68 @ =0x0000027F - adds r0, r0, r3 - strb r1, [r0] -_08031F5E: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08031F68: .4byte 0x0000027F diff --git a/expected_objs/sub_31CF8.o b/expected_objs/sub_31CF8.o deleted file mode 100644 index 7ab5c6cd8b7e7f91aff9dbb79ad3d017a1cfe9fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2728 zcma)8Z%kWN6hDs#*f+LOgppT;@!CQ5CJSkyE8TS3Qr@E=n2q6rnv9iDDGs55PD^B2 zQDa!5$udnO5fl6*i6)MqiBS?U(Zrc0(wP|MFnNoK-$wA$zB$indmjfr=uUfcf4}qp z-Fx4k%SN{;NfHQ=K!-JBebr%RzJy}XjqJf_CN1mAT5S{(%kCQx zQo)lsSL}Xp|DOl0F12%SV)@V=uvB@rA6C^>cvG#?oM&fEER)@L_td4EI^0(7I-_nC zG{@O;9X5Woz|(HdANmN~31=}>-B9r2`}s{uFXy7riLM6bv;YHFsmdjY-WwMH$!=53}k5pq4@mNJS(ebjcj zW}~<(tB_Gcm(&b-D{C&=E!>w?72Ki1ZdGN^$uF+ok*URjks@#xj<~`T2-;gRN zBc>}+992|Yd#@v@ovWmbN6Rh5#Cl{s^3MOuN5%ebcDI!qRe z#|B40I)Jbw+}qRI*WS|!r9}=&;YXIr?htv$i3X7I$3@1YyfcA>8h|<5NrL@|XBk%! z>x_F4zsvYh#8(*)Ansy3g!tvcSplq0wq9oML;L~b=MbM~Jb~E3;wO-kE-w;HBj{uH zcaYP_iv(8?sP;umx$EcG`##!hnEhkq8sncL-^7s@36>Dt6cn?4i}(cd{}H*)_%F!o z8NZGE8^)>EYQ_n2|38rjnEf8|ZpQB;k1|e=xVITELp;X#0mQE`UWa&^@gs;cj8lKy zP9|<|LB;3H|0Lo?#yb$tGkzNJ3geWY`@e*?dbXeB%Jauj@f(XDN31jdDda~Pe+#*n zajLgFKexY!{z2ydA@U^S6wf(QTVyDKPtYI#Ie8S(XM&){iQ|V|{O4VKV;6_|6byKS z-WFf`aj!r@8#UV~=(nvwf&9${WF9kYU09%CM4)3L!t~nt0s@)-2-FW1Tn(R48$MCc z@QLttBOp>nY-@{X!myh)e4@0`wrv$H8h$(0Z&z!zBLbp^5wK%h?TA*g)GYDs5uf@%g(fGibcqRD2Q>Je<($3tPYski5|MRLZ`8Aoso@%i}oclPiRS zWYGc8k2A$lJiV7t1q}r*-eij`7n*XuG&kZP|Nrx&HAbH#PC21`S^?8UwMl5^rG7%P ng@KQt{sa!{kM3u>22m3se2o{dDUu);uws`V1%^;3MELy+I+SxC diff --git a/include/constants/pinball_game.h b/include/constants/pinball_game.h index fa16b436..c6e36a76 100644 --- a/include/constants/pinball_game.h +++ b/include/constants/pinball_game.h @@ -2,5 +2,6 @@ #define GUARD_CONSTANTS_PINBALL_GAME_H #define WILD_MON_LOCATION_COUNT 8 +#define MAX_EVOLVABLE_PARTY_SIZE 16 #endif // GUARD_CONSTANTS_PINBALL_GAME_H diff --git a/include/functions.h b/include/functions.h index 099031ef..e7a9a926 100644 --- a/include/functions.h +++ b/include/functions.h @@ -707,7 +707,7 @@ extern void PlayCry_NormalNoDucking(u16, s8, s8, u8); extern void SaveFile_LoadGameData(void); //extern ? LoadSaveDataFromSram(); extern void SaveFile_WriteToSram(void); -//extern ? SaveFile_SetPokedexFlags(); +extern void SaveFile_SetPokedexFlags(s16, u8); extern void SaveFile_ReadSavedGamePresent(void); extern void sub_52C64(void); diff --git a/include/global.h b/include/global.h index 6c9feed1..170a47c2 100644 --- a/include/global.h +++ b/include/global.h @@ -234,8 +234,10 @@ struct PinballGame /*0x20A*/ u8 unk20A; /*0x20B*/ u8 filler20B[0x54]; /*0x25F*/ s8 unk25F; - /*0x260*/ u8 filler260[0x21]; - /*0x281*/ s8 unk281; + /*0x260*/ u8 filler260[0x10]; + /*0x270*/ s8 evolvablePartySpecies[MAX_EVOLVABLE_PARTY_SIZE]; + /*0x280*/ s8 evolvingPartyIndex; + /*0x281*/ s8 evolvablePartySize; /*0x282*/ s8 unk282; /*0x283*/ u8 bonusFieldsComplete; //how many bonus fields have been completed /*0x284*/ u8 filler284[0xC]; diff --git a/include/types.h b/include/types.h index 54ba3894..2eb10887 100644 --- a/include/types.h +++ b/include/types.h @@ -65,7 +65,7 @@ struct PokemonSpecies { u8 eggIndex; // Non-zero for all hatch pokemon other than Wurmple, zero for Wurmple and all non-hatch pokemon u8 unk13; // Something egg related; only hatch pokemon have this set to 1, but not all do, and there is no other pattern // unk13 list: Azurill, Skitty, Zubat, Plusle, Minun, Igglybuff, Shuppet, Chimecho, Pichu, Natu - u8 evolutionMethod; // Exp, Stone, etc. + s8 evolutionMethod; // Exp, Stone, etc. u8 evolutionTarget; // Uses the standard index numbers; e.g. Treecko is 0x00 (SPECIES_TREECKO) }; diff --git a/ld_script.txt b/ld_script.txt index 0209fa48..32176b76 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -55,6 +55,7 @@ SECTIONS asm/rom_11B9C.o(.text1AAA0); src/rom_27E08.o(.text); asm/rom_11B9C.o(.text27F94); + src/rom_31CF8.o(.text); src/rom_31F6C.o(.text); asm/rom_3219C.o(.text); src/pinball_game_main.o(.text); diff --git a/src/rom_31CF8.c b/src/rom_31CF8.c new file mode 100644 index 00000000..f9d118fa --- /dev/null +++ b/src/rom_31CF8.c @@ -0,0 +1,124 @@ +#include "global.h" +#include "main.h" +#include "constants/species.h" + +/** + * 0 if captured via ball + * 1 if evolved +*/ +void sub_31CF8(s16 evolved) +{ + s16 i; + + if (!evolved) + { + if (gMain.mainState != STATE_GAME_IDLE) + SaveFile_SetPokedexFlags(gCurrentPinballGame->currentSpecies, SPECIES_CAUGHT); + + if (gSpeciesInfo[gCurrentPinballGame->currentSpecies].evolutionMethod != 0) + { + if (gSpeciesInfo[gCurrentPinballGame->currentSpecies].evolutionTarget < SPECIES_NONE) + { + if (gCurrentPinballGame->evolvablePartySize < MAX_EVOLVABLE_PARTY_SIZE) + { + gCurrentPinballGame->evolvablePartySpecies[gCurrentPinballGame->evolvablePartySize] = + gCurrentPinballGame->currentSpecies; + + gCurrentPinballGame->evolvablePartySize++; + } + else + { + for (i = 0; i < MAX_EVOLVABLE_PARTY_SIZE; i++) + gCurrentPinballGame->evolvablePartySpecies[i] = gCurrentPinballGame->evolvablePartySpecies[i + 1]; + + gCurrentPinballGame->evolvablePartySpecies[MAX_EVOLVABLE_PARTY_SIZE - 1] = gCurrentPinballGame->currentSpecies; + } + } + } + } + else + { + gCurrentPinballGame->evolvablePartySize--; + + for (i = gCurrentPinballGame->evolvingPartyIndex; i < gCurrentPinballGame->evolvablePartySize; i++) + gCurrentPinballGame->evolvablePartySpecies[i] = gCurrentPinballGame->evolvablePartySpecies[i + 1]; + + if (gCurrentPinballGame->currentSpecies == SPECIES_WURMPLE) + { + if ((gMain.systemFrameCount & 1) == 0) + { + if (gMain_saveData.pokedexFlags[SPECIES_SILCOON] < SPECIES_CAUGHT) + gCurrentPinballGame->currentSpecies = SPECIES_SILCOON; + else + gCurrentPinballGame->currentSpecies = SPECIES_CASCOON; + } + else + { + if (gMain_saveData.pokedexFlags[SPECIES_CASCOON] < SPECIES_CAUGHT) + gCurrentPinballGame->currentSpecies = SPECIES_CASCOON; + else + gCurrentPinballGame->currentSpecies = SPECIES_SILCOON; + } + } + else if (gCurrentPinballGame->currentSpecies == SPECIES_GLOOM) + { + if (gMain.selectedField == FIELD_RUBY) + gCurrentPinballGame->currentSpecies = SPECIES_VILEPLUME; + else + gCurrentPinballGame->currentSpecies = SPECIES_BELLOSSOM; + } + else if (gCurrentPinballGame->currentSpecies == SPECIES_CLAMPERL) + { + if ((gMain.systemFrameCount & 1) == 0) + { + if (gMain_saveData.pokedexFlags[SPECIES_HUNTAIL] < SPECIES_CAUGHT) + gCurrentPinballGame->currentSpecies = SPECIES_HUNTAIL; + else + gCurrentPinballGame->currentSpecies = SPECIES_GOREBYSS; + } + else + { + if (gMain_saveData.pokedexFlags[SPECIES_GOREBYSS] < SPECIES_CAUGHT) + gCurrentPinballGame->currentSpecies = SPECIES_GOREBYSS; + else + gCurrentPinballGame->currentSpecies = SPECIES_HUNTAIL; + } + } + else if (gCurrentPinballGame->currentSpecies == SPECIES_NINCADA) + { + gCurrentPinballGame->currentSpecies = SPECIES_SHEDINJA; + if (gMain.mainState != STATE_GAME_IDLE) + SaveFile_SetPokedexFlags(SPECIES_SHEDINJA, SPECIES_CAUGHT); + + gCurrentPinballGame->currentSpecies = SPECIES_NINJASK; + } + else + { + gCurrentPinballGame->currentSpecies = + gSpeciesInfo[gCurrentPinballGame->currentSpecies].evolutionTarget; + } + + if (gMain.mainState != STATE_GAME_IDLE) + SaveFile_SetPokedexFlags(gCurrentPinballGame->currentSpecies, SPECIES_CAUGHT); + + if (gSpeciesInfo[gCurrentPinballGame->currentSpecies].evolutionMethod != 0) + { + if (gSpeciesInfo[gCurrentPinballGame->currentSpecies].evolutionTarget < SPECIES_NONE) + { + if (gCurrentPinballGame->evolvablePartySize < MAX_EVOLVABLE_PARTY_SIZE) + { + gCurrentPinballGame->evolvablePartySpecies[gCurrentPinballGame->evolvablePartySize] = + gCurrentPinballGame->currentSpecies; + gCurrentPinballGame->evolvablePartySize++; + } + else + { + for (i = 0; i < MAX_EVOLVABLE_PARTY_SIZE; i++) + gCurrentPinballGame->evolvablePartySpecies[i] = gCurrentPinballGame->evolvablePartySpecies[i + 1]; + + gCurrentPinballGame->evolvablePartySpecies[MAX_EVOLVABLE_PARTY_SIZE - 1] = gCurrentPinballGame->currentSpecies; + } + } + } + } +} diff --git a/src/rom_31F6C.c b/src/rom_31F6C.c index 1949141e..15e356bb 100644 --- a/src/rom_31F6C.c +++ b/src/rom_31F6C.c @@ -563,7 +563,7 @@ void sub_329F4(void) m4aSongNumStart(SE_UNKNOWN_0xC3); - if (gCurrentPinballGame->unk72E > 2 && gCurrentPinballGame->unk281 > 0) { + if (gCurrentPinballGame->unk72E > 2 && gCurrentPinballGame->evolvablePartySize > 0) { sub_19B64(6); } }