diff options
-rw-r--r-- | arm9/asm/pokemon_s.s | 112 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 80 | ||||
-rw-r--r-- | include/global.h | 2 |
3 files changed, 75 insertions, 119 deletions
diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s index 546d113b..c34a280a 100644 --- a/arm9/asm/pokemon_s.s +++ b/arm9/asm/pokemon_s.s @@ -6,118 +6,6 @@ .text - thumb_func_start ResolveMonForme -ResolveMonForme: ; 0x0206A8FC - ldr r3, _0206A928 ; =SPECIES_DEOXYS - cmp r0, r3 - beq _0206A90C - add r2, r3, #0x0 - add r2, #SPECIES_WORMADAM-SPECIES_DEOXYS - cmp r0, r2 - beq _0206A91A - bx lr -_0206A90C: - cmp r1, #0x0 - beq _0206A926 - cmp r1, #0x3 - bgt _0206A926 - add r3, #SPECIES_DEOXYS_ATK-SPECIES_DEOXYS-1 - add r0, r1, r3 - bx lr -_0206A91A: - cmp r1, #0x0 - beq _0206A926 - cmp r1, #0x2 - bgt _0206A926 - add r3, #SPECIES_WORMADAM_SANDY-SPECIES_DEOXYS-1 - add r0, r1, r3 -_0206A926: - bx lr - .balign 4 -_0206A928: .word SPECIES_DEOXYS - - thumb_func_start MaskOfFlagNo -MaskOfFlagNo: ; 0x0206A92C - push {r3-r5, lr} - add r5, r0, #0x0 - mov r4, #0x1 - cmp r5, #0x20 - blt _0206A93A - bl ErrorHandling -_0206A93A: - mov r0, #0x0 - cmp r5, #0x0 - ble _0206A948 -_0206A940: - add r0, r0, #0x1 - lsl r4, r4, #0x1 - cmp r0, r5 - blt _0206A940 -_0206A948: - add r0, r4, #0x0 - pop {r3-r5, pc} - - thumb_func_start LowestFlagNo -LowestFlagNo: ; 0x0206A94C - mov r3, #0x1 - mov r2, #0x0 -_0206A950: - add r1, r0, #0x0 - tst r1, r3 - bne _0206A95E - add r2, r2, #0x1 - lsl r3, r3, #0x1 - cmp r2, #0x20 - blt _0206A950 -_0206A95E: - add r0, r2, #0x0 - bx lr - .balign 4 - - thumb_func_start IsPokemonLegendaryOrMythical -IsPokemonLegendaryOrMythical: ; 0x0206A964 - ldr r3, _0206A980 ; =sLegendaryMonsList - mov r2, #0x0 -_0206A968: - ldrh r1, [r3, #0x0] - cmp r0, r1 - bne _0206A972 - mov r0, #0x1 - bx lr -_0206A972: - add r2, r2, #0x1 - add r3, r3, #0x2 - cmp r2, #0x12 - blo _0206A968 - mov r0, #0x0 - bx lr - nop -_0206A980: .word sLegendaryMonsList - - thumb_func_start GetLegendaryMon -GetLegendaryMon: ; 0x0206A984 - cmp r0, #0x12 - blo _0206A98A - mov r0, #0x0 -_0206A98A: - lsl r1, r0, #0x1 - ldr r0, _0206A994 ; =sLegendaryMonsList - ldrh r0, [r0, r1] - bx lr - nop -_0206A994: .word sLegendaryMonsList - - thumb_func_start FUN_0206A998 -FUN_0206A998: ; 0x0206A998 - push {r3, lr} - mov r1, #0x5 - mov r2, #0x0 - bl GetMonData - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - bl IsPokemonLegendaryOrMythical - pop {r3, pc} - thumb_func_start FUN_0206A9AC FUN_0206A9AC: ; 0x0206A9AC push {r3-r7, lr} diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c index 4376285e..4fba962b 100644 --- a/arm9/src/pokemon.c +++ b/arm9/src/pokemon.c @@ -3523,25 +3523,27 @@ u16 CalcMonChecksum(u16 * data, u32 size) return ret; } -#define SUBSTRUCT_CASE(v1, v2, v3, v4)({ \ - PokemonDataBlock *substructs = boxMon->substructs; \ +#define SUBSTRUCT_CASE(v1, v2, v3, v4) \ +{ \ + PokemonDataBlock *substructs = boxMon->substructs; \ switch (substructType) \ { \ case 0: \ - result = &substructs[v1]; \ + result = &substructs[v1]; \ break; \ case 1: \ - result = &substructs[v2]; \ + result = &substructs[v2]; \ break; \ case 2: \ - result = &substructs[v3]; \ + result = &substructs[v3]; \ break; \ case 3: \ - result = &substructs[v4]; \ + result = &substructs[v4]; \ break; \ } \ -});\ + \ break; \ +} PokemonDataBlock *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) { @@ -3608,3 +3610,67 @@ PokemonDataBlock *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 su } return result; } + +int ResolveMonForme(int species, int forme) +{ + switch (species) + { + case SPECIES_DEOXYS: + if (forme != 0 && forme <= 3) + return SPECIES_DEOXYS_ATK + forme - 1; + break; + case SPECIES_WORMADAM: + if (forme != 0 && forme <= 2) + return SPECIES_WORMADAM_SANDY + forme - 1; + break; + } + return species; +} + +u32 MaskOfFlagNo(int flagno) +{ + // This is completely inane. + int i; + u32 ret = 1; + GF_ASSERT(flagno < 32); + for (i = 0; i < flagno; i++) + ret <<= 1; + return ret; +} + +int LowestFlagNo(u32 mask) +{ + int i; + u32 bit = 1; + for (i = 0; i < 32; i++) + { + if (mask & bit) + break; + bit <<= 1; + } + return i; +} + +BOOL IsPokemonLegendaryOrMythical(u16 species) +{ + int i; + for (i = 0; i < NELEMS(sLegendaryMonsList); i++) + { + if (species == sLegendaryMonsList[i]) + return TRUE; + } + return FALSE; +} + +u16 GetLegendaryMon(u32 idx) +{ + if (idx >= NELEMS(sLegendaryMonsList)) + idx = 0; + return sLegendaryMonsList[idx]; +} + +BOOL FUN_0206A998(struct Pokemon * pokemon) +{ + u16 species = GetMonData(pokemon, MON_DATA_SPECIES, NULL); + return IsPokemonLegendaryOrMythical(species); +} diff --git a/include/global.h b/include/global.h index 35d0c3aa..67744d42 100644 --- a/include/global.h +++ b/include/global.h @@ -5,6 +5,8 @@ #include "function_target.h" #include "nitro.h" +#define NELEMS(a) (sizeof(a) / sizeof(*(a))) + enum GameVersion { VERSION_SAPPHIRE = 1, VERSION_RUBY = 2, |