summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-14 21:18:07 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-14 21:18:07 -0400
commit62e926d5217f1f4cd8efd610e7d38374535836e1 (patch)
tree4c75cbe68c95e1973c6dfa47c417165097479a92
parent670efff0ec376f9445d9cf552f6b51465b56ac06 (diff)
through FUN_0206A998
-rw-r--r--arm9/asm/pokemon_s.s112
-rw-r--r--arm9/src/pokemon.c80
-rw-r--r--include/global.h2
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,