summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-13 12:53:41 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-13 12:53:41 -0400
commitf93a6043eb52c63d1a64a3e9f10c113d4e5acc02 (patch)
tree1e92c774d79da35ba90a7c8a409a15d9a93a5e04 /arm9
parent3646495249e8e553fb0335ffd287f979499204ce (diff)
Through GetMonBaseStat
Diffstat (limited to 'arm9')
-rw-r--r--arm9/asm/pokemon_s.s230
-rw-r--r--arm9/src/pokemon.c151
2 files changed, 149 insertions, 232 deletions
diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s
index d88114bc..987aaf06 100644
--- a/arm9/asm/pokemon_s.s
+++ b/arm9/asm/pokemon_s.s
@@ -24,236 +24,6 @@ UNK_021C5AC0: ; 0x021C5AC0
.text
- thumb_func_start AllocAndLoadMonPersonal
-AllocAndLoadMonPersonal: ; 0x0206851C
- push {r3-r5, lr}
- add r5, r0, #0x0
- add r0, r1, #0x0
- mov r1, #0x2c
- bl AllocFromHeap
- add r4, r0, #0x0
- add r0, r5, #0x0
- add r1, r4, #0x0
- bl LoadMonPersonal
- add r0, r4, #0x0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start GetPersonalAttr
-GetPersonalAttr: ; 0x02068538
- push {r4-r6, lr}
- add r4, r0, #0x0
- add r6, r1, #0x0
- cmp r4, #0x0
- bne _02068546
- bl ErrorHandling
-_02068546:
- cmp r6, #0x20
- bhi _0206863A
- add r0, r6, r6
- add r0, pc
- ldrh r0, [r0, #0x6]
- lsl r0, r0, #0x10
- asr r0, r0, #0x10
- add pc, r0
-_02068556: ; jump table (using 16-bit offset)
- .short _02068598 - _02068556 - 2; case 0
- .short _0206859C - _02068556 - 2; case 1
- .short _020685A0 - _02068556 - 2; case 2
- .short _020685A4 - _02068556 - 2; case 3
- .short _020685A8 - _02068556 - 2; case 4
- .short _020685AC - _02068556 - 2; case 5
- .short _020685B0 - _02068556 - 2; case 6
- .short _020685B4 - _02068556 - 2; case 7
- .short _020685B8 - _02068556 - 2; case 8
- .short _020685BC - _02068556 - 2; case 9
- .short _020685C0 - _02068556 - 2; case 10
- .short _020685C8 - _02068556 - 2; case 11
- .short _020685D0 - _02068556 - 2; case 12
- .short _020685D8 - _02068556 - 2; case 13
- .short _020685E0 - _02068556 - 2; case 14
- .short _020685E8 - _02068556 - 2; case 15
- .short _020685F0 - _02068556 - 2; case 16
- .short _020685F4 - _02068556 - 2; case 17
- .short _020685F8 - _02068556 - 2; case 18
- .short _020685FC - _02068556 - 2; case 19
- .short _02068600 - _02068556 - 2; case 20
- .short _02068604 - _02068556 - 2; case 21
- .short _02068608 - _02068556 - 2; case 22
- .short _0206860C - _02068556 - 2; case 23
- .short _02068610 - _02068556 - 2; case 24
- .short _02068614 - _02068556 - 2; case 25
- .short _02068618 - _02068556 - 2; case 26
- .short _0206861C - _02068556 - 2; case 27
- .short _02068624 - _02068556 - 2; case 28
- .short _0206862C - _02068556 - 2; case 29
- .short _02068630 - _02068556 - 2; case 30
- .short _02068634 - _02068556 - 2; case 31
- .short _02068638 - _02068556 - 2; case 32
-_02068598:
- ldrb r5, [r4, #0x0]
- b _0206863A
-_0206859C:
- ldrb r5, [r4, #0x1]
- b _0206863A
-_020685A0:
- ldrb r5, [r4, #0x2]
- b _0206863A
-_020685A4:
- ldrb r5, [r4, #0x3]
- b _0206863A
-_020685A8:
- ldrb r5, [r4, #0x4]
- b _0206863A
-_020685AC:
- ldrb r5, [r4, #0x5]
- b _0206863A
-_020685B0:
- ldrb r5, [r4, #0x6]
- b _0206863A
-_020685B4:
- ldrb r5, [r4, #0x7]
- b _0206863A
-_020685B8:
- ldrb r5, [r4, #0x8]
- b _0206863A
-_020685BC:
- ldrb r5, [r4, #0x9]
- b _0206863A
-_020685C0:
- ldrh r0, [r4, #0xa]
- lsl r0, r0, #0x1e
- lsr r5, r0, #0x1e
- b _0206863A
-_020685C8:
- ldrh r0, [r4, #0xa]
- lsl r0, r0, #0x1c
- lsr r5, r0, #0x1e
- b _0206863A
-_020685D0:
- ldrh r0, [r4, #0xa]
- lsl r0, r0, #0x1a
- lsr r5, r0, #0x1e
- b _0206863A
-_020685D8:
- ldrh r0, [r4, #0xa]
- lsl r0, r0, #0x18
- lsr r5, r0, #0x1e
- b _0206863A
-_020685E0:
- ldrh r0, [r4, #0xa]
- lsl r0, r0, #0x16
- lsr r5, r0, #0x1e
- b _0206863A
-_020685E8:
- ldrh r0, [r4, #0xa]
- lsl r0, r0, #0x14
- lsr r5, r0, #0x1e
- b _0206863A
-_020685F0:
- ldrh r5, [r4, #0xc]
- b _0206863A
-_020685F4:
- ldrh r5, [r4, #0xe]
- b _0206863A
-_020685F8:
- ldrb r5, [r4, #0x10]
- b _0206863A
-_020685FC:
- ldrb r5, [r4, #0x11]
- b _0206863A
-_02068600:
- ldrb r5, [r4, #0x12]
- b _0206863A
-_02068604:
- ldrb r5, [r4, #0x13]
- b _0206863A
-_02068608:
- ldrb r5, [r4, #0x14]
- b _0206863A
-_0206860C:
- ldrb r5, [r4, #0x15]
- b _0206863A
-_02068610:
- ldrb r5, [r4, #0x16]
- b _0206863A
-_02068614:
- ldrb r5, [r4, #0x17]
- b _0206863A
-_02068618:
- ldrb r5, [r4, #0x18]
- b _0206863A
-_0206861C:
- ldrb r0, [r4, #0x19]
- lsl r0, r0, #0x19
- lsr r5, r0, #0x19
- b _0206863A
-_02068624:
- ldrb r0, [r4, #0x19]
- lsl r0, r0, #0x18
- lsr r5, r0, #0x1f
- b _0206863A
-_0206862C:
- ldr r5, [r4, #0x1c]
- b _0206863A
-_02068630:
- ldr r5, [r4, #0x20]
- b _0206863A
-_02068634:
- ldr r5, [r4, #0x24]
- b _0206863A
-_02068638:
- ldr r5, [r4, #0x28]
-_0206863A:
- add r0, r5, #0x0
- pop {r4-r6, pc}
- .balign 4
-
- thumb_func_start FreeMonPersonal
-FreeMonPersonal: ; 0x02068640
- push {r4, lr}
- add r4, r0, #0x0
- bne _0206864A
- bl ErrorHandling
-_0206864A:
- add r0, r4, #0x0
- bl FreeToHeap
- pop {r4, pc}
- .balign 4
-
- thumb_func_start GetMonBaseStat_HandleFormeConversion
-GetMonBaseStat_HandleFormeConversion: ; 0x02068654
- push {r3-r5, lr}
- add r4, r2, #0x0
- bl ResolveMonForme
- mov r1, #0x0
- bl AllocAndLoadMonPersonal
- add r5, r0, #0x0
- add r1, r4, #0x0
- bl GetPersonalAttr
- add r4, r0, #0x0
- add r0, r5, #0x0
- bl FreeMonPersonal
- add r0, r4, #0x0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start GetMonBaseStat
-GetMonBaseStat: ; 0x02068678
- push {r3-r5, lr}
- add r4, r1, #0x0
- mov r1, #0x0
- bl AllocAndLoadMonPersonal
- add r5, r0, #0x0
- add r1, r4, #0x0
- bl GetPersonalAttr
- add r4, r0, #0x0
- add r0, r5, #0x0
- bl FreeMonPersonal
- add r0, r4, #0x0
- pop {r3-r5, pc}
- .balign 4
-
thumb_func_start GetPercentProgressTowardsNextLevel
GetPercentProgressTowardsNextLevel: ; 0x02068698
push {r3-r7, lr}
diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c
index 4e673496..02428ff6 100644
--- a/arm9/src/pokemon.c
+++ b/arm9/src/pokemon.c
@@ -12,14 +12,21 @@
#pragma thumb on
+u32 GetMonDataInternal(struct Pokemon * pokemon, int attr, void * ptr);
+u32 GetBoxMonDataInternal(struct BoxPokemon * pokemon, int attr, void * ptr);
+void SetMonDataInternal(struct Pokemon * pokemon, int attr, void * ptr);
+void SetBoxMonDataInternal(struct BoxPokemon * pokemon, int attr, void * ptr);
+void AddMonDataInternal(struct Pokemon * pokemon, int attr, int amount);
+void AddBoxMonData(struct BoxPokemon * pokemon, int attr, int amount);
+void LoadMonPersonal(int species, struct BaseStats * personal);
+int ResolveMonForme(int species, int forme);
+
void MonEncryptSegment(void * datap, u32 size, u32 key);
void MonDecryptSegment(void * datap, u32 size, u32 key);
u16 MonEncryptionLCRNG(u32 * seed);
u16 CalcMonChecksum(void * datap, u32 size);
void InitBoxMonMoveset(struct BoxPokemon * boxmon);
-u32 GetMonDataInternal(struct Pokemon * pokemon, int attr, void * ptr);
PokemonDataBlock * GetSubstruct(struct BoxPokemon * boxmon, u32 personality, u32 which_struct);
-u32 GetBoxMonDataInternal(struct BoxPokemon * pokemon, int attr, void * ptr);
void LoadMonBaseStats_HandleAlternateForme(u32 species, u32 forme, struct BaseStats * baseStats);
int ApplyNatureModToStat(u8 nature, u16 statval, u32 statno);
@@ -1734,3 +1741,143 @@ void AddBoxMonData(struct BoxPokemon * boxmon, int attr, int value)
GF_ASSERT(0);
}
}
+
+struct BaseStats * AllocAndLoadMonPersonal(int species, u32 heap_id)
+{
+ struct BaseStats * baseStats = (struct BaseStats *)AllocFromHeap(heap_id, sizeof(struct BaseStats));
+ LoadMonPersonal(species, baseStats);
+ return baseStats;
+}
+
+int GetPersonalAttr(struct BaseStats * baseStats, enum BaseStat attr)
+{
+ int ret;
+ GF_ASSERT(baseStats != NULL);
+ switch (attr)
+ {
+ case BASE_HP:
+ ret = baseStats->hp;
+ break;
+ case BASE_ATK:
+ ret = baseStats->atk;
+ break;
+ case BASE_DEF:
+ ret = baseStats->def;
+ break;
+ case BASE_SPEED:
+ ret = baseStats->speed;
+ break;
+ case BASE_SPATK:
+ ret = baseStats->spatk;
+ break;
+ case BASE_SPDEF:
+ ret = baseStats->spdef;
+ break;
+ case BASE_TYPE1:
+ ret = baseStats->types[0];
+ break;
+ case BASE_TYPE2:
+ ret = baseStats->types[1];
+ break;
+ case BASE_CATCH_RATE:
+ ret = baseStats->catchRate;
+ break;
+ case BASE_EXP_YIELD:
+ ret = baseStats->expYield;
+ break;
+ case BASE_HP_YIELD:
+ ret = baseStats->hp_yield;
+ break;
+ case BASE_ATK_YIELD:
+ ret = baseStats->atk_yield;
+ break;
+ case BASE_DEF_YIELD:
+ ret = baseStats->def_yield;
+ break;
+ case BASE_SPEED_YIELD:
+ ret = baseStats->speed_yield;
+ break;
+ case BASE_SPATK_YIELD:
+ ret = baseStats->spatk_yield;
+ break;
+ case BASE_SPDEF_YIELD:
+ ret = baseStats->spdef_yield;
+ break;
+ case BASE_ITEM_1:
+ ret = baseStats->item1;
+ break;
+ case BASE_ITEM_2:
+ ret = baseStats->item2;
+ break;
+ case BASE_GENDER_RATIO:
+ ret = baseStats->genderRatio;
+ break;
+ case BASE_EGG_CYCLES:
+ ret = baseStats->eggCycles;
+ break;
+ case BASE_FRIENDSHIP:
+ ret = baseStats->friendship;
+ break;
+ case BASE_GROWTH_RATE:
+ ret = baseStats->growthRate;
+ break;
+ case BASE_EGG_GROUP_1:
+ ret = baseStats->eggGroups[0];
+ break;
+ case GASE_EGG_GROUP_2:
+ ret = baseStats->eggGroups[1];
+ break;
+ case BASE_ABILITY_1:
+ ret = baseStats->abilities[0];
+ break;
+ case BASE_ABILITY_2:
+ ret = baseStats->abilities[1];
+ break;
+ case BASE_GREAT_MARSH_RATE:
+ ret = baseStats->greatMarshRate;
+ break;
+ case BASE_COLOR:
+ ret = baseStats->color;
+ break;
+ case BASE_FLIP:
+ ret = baseStats->flip;
+ break;
+ case BASE_UNKNOWN_29:
+ ret = baseStats->unk1C;
+ break;
+ case BASE_UNKNOWN_30:
+ ret = baseStats->unk20;
+ break;
+ case BASE_UNKNOWN_31:
+ ret = baseStats->unk24;
+ break;
+ case BASE_UNKNOWN_32:
+ ret = baseStats->unk28;
+ break;
+ }
+ return ret;
+}
+
+void FreeMonPersonal(struct BaseStats * personal)
+{
+ GF_ASSERT(personal != NULL);
+ FreeToHeap(personal);
+}
+
+int GetMonBaseStat_HandleFormeConversion(int species, int forme, enum BaseStat attr)
+{
+ int ret;
+ struct BaseStats * personal = AllocAndLoadMonPersonal(ResolveMonForme(species, forme), 0);
+ ret = GetPersonalAttr(personal, attr);
+ FreeMonPersonal(personal);
+ return ret;
+}
+
+int GetMonBaseStat(int species, enum BaseStat attr)
+{
+ int ret;
+ struct BaseStats * personal = AllocAndLoadMonPersonal(species, 0);
+ ret = GetPersonalAttr(personal, attr);
+ FreeMonPersonal(personal);
+ return ret;
+}