decompile sub_31CF8 (#97)

* decompile sub_31CF8

* cleanup

---------

Co-authored-by: Marcus Huderle <huderlem@gmail.com>
This commit is contained in:
ColinT
2025-05-19 09:20:03 -04:00
committed by GitHub
parent 09403d1e89
commit bb86e54902
9 changed files with 133 additions and 338 deletions
-333
View File
@@ -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
Binary file not shown.
+1
View File
@@ -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
+1 -1
View File
@@ -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);
+4 -2
View File
@@ -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];
+1 -1
View File
@@ -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)
};
+1
View File
@@ -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);
+124
View File
@@ -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;
}
}
}
}
}
+1 -1
View File
@@ -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);
}
}