summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-12 14:21:06 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-12 14:21:06 -0400
commit2d8d454dfe8691f4cd1077c50ab6f3c286c28ce1 (patch)
treed886f170831f01d8b163134f757293b467e84efe
parente15304cdb698c9350e4d4e80ca2a4076b9b44d6c (diff)
through GetBoxMonData
-rw-r--r--arm9/asm/pokemon_s.s190
-rw-r--r--arm9/src/pokemon.c81
-rw-r--r--include/pokemon.h11
-rw-r--r--include/seals.h3
4 files changed, 86 insertions, 199 deletions
diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s
index a7b3107c..ab47775b 100644
--- a/arm9/asm/pokemon_s.s
+++ b/arm9/asm/pokemon_s.s
@@ -116,196 +116,6 @@ UNK_021C5AC0: ; 0x021C5AC0
.text
- thumb_func_start GetMonData
-GetMonData: ; 0x020671BC
- push {r4-r6, lr}
- add r5, r0, #0x0
- ldrh r0, [r5, #0x4]
- add r4, r1, #0x0
- add r6, r2, #0x0
- lsl r0, r0, #0x1f
- lsr r0, r0, #0x1f
- bne _02067204
- add r0, r5, #0x0
- ldr r2, [r5, #0x0]
- add r0, #0x88
- mov r1, #0x64
- bl MonDecryptSegment
- add r0, r5, #0x0
- ldrh r2, [r5, #0x6]
- add r0, #0x8
- mov r1, #0x80
- bl MonDecryptSegment
- add r0, r5, #0x0
- add r0, #0x8
- mov r1, #0x80
- bl CalcMonChecksum
- ldrh r1, [r5, #0x6]
- cmp r0, r1
- beq _02067204
- cmp r0, r1
- beq _020671FC
- bl ErrorHandling
-_020671FC:
- ldrh r1, [r5, #0x4]
- mov r0, #0x4
- orr r0, r1
- strh r0, [r5, #0x4]
-_02067204:
- add r0, r5, #0x0
- add r1, r4, #0x0
- add r2, r6, #0x0
- bl GetMonDataInternal
- add r4, r0, #0x0
- ldrh r0, [r5, #0x4]
- lsl r0, r0, #0x1f
- lsr r0, r0, #0x1f
- bne _02067230
- add r0, r5, #0x0
- ldr r2, [r5, #0x0]
- add r0, #0x88
- mov r1, #0x64
- bl MonEncryptSegment
- add r0, r5, #0x0
- ldrh r2, [r5, #0x6]
- add r0, #0x8
- mov r1, #0x80
- bl MonEncryptSegment
-_02067230:
- add r0, r4, #0x0
- pop {r4-r6, pc}
-
- thumb_func_start GetMonDataInternal
-GetMonDataInternal: ; 0x02067234
- push {r3, lr}
- add r3, r1, #0x0
- sub r3, #0x9f
- cmp r3, #0xb
- bhi _020672B6
- add r3, r3, r3
- add r3, pc
- ldrh r3, [r3, #0x6]
- lsl r3, r3, #0x10
- asr r3, r3, #0x10
- add pc, r3
-_0206724A: ; jump table (using 16-bit offset)
- .short _02067262 - _0206724A - 2; case 0
- .short _02067268 - _0206724A - 2; case 1
- .short _0206726E - _0206724A - 2; case 2
- .short _02067274 - _0206724A - 2; case 3
- .short _0206727A - _0206724A - 2; case 4
- .short _02067280 - _0206724A - 2; case 5
- .short _02067286 - _0206724A - 2; case 6
- .short _0206728C - _0206724A - 2; case 7
- .short _02067292 - _0206724A - 2; case 8
- .short _02067298 - _0206724A - 2; case 9
- .short _0206729E - _0206724A - 2; case 10
- .short _020672AA - _0206724A - 2; case 11
-_02067262:
- add r0, #0x88
- ldr r0, [r0, #0x0]
- pop {r3, pc}
-_02067268:
- add r0, #0x8c
- ldrb r0, [r0, #0x0]
- pop {r3, pc}
-_0206726E:
- add r0, #0x8d
- ldrb r0, [r0, #0x0]
- pop {r3, pc}
-_02067274:
- add r0, #0x8e
- ldrh r0, [r0, #0x0]
- pop {r3, pc}
-_0206727A:
- add r0, #0x90
- ldrh r0, [r0, #0x0]
- pop {r3, pc}
-_02067280:
- add r0, #0x92
- ldrh r0, [r0, #0x0]
- pop {r3, pc}
-_02067286:
- add r0, #0x94
- ldrh r0, [r0, #0x0]
- pop {r3, pc}
-_0206728C:
- add r0, #0x96
- ldrh r0, [r0, #0x0]
- pop {r3, pc}
-_02067292:
- add r0, #0x98
- ldrh r0, [r0, #0x0]
- pop {r3, pc}
-_02067298:
- add r0, #0x9a
- ldrh r0, [r0, #0x0]
- pop {r3, pc}
-_0206729E:
- add r0, #0x9c
- add r1, r2, #0x0
- bl CopySealsObject
- mov r0, #0x1
- pop {r3, pc}
-_020672AA:
- add r0, #0xd4
- add r1, r2, #0x0
- bl FUN_02029C74
- mov r0, #0x1
- pop {r3, pc}
-_020672B6:
- bl GetBoxMonDataInternal
- pop {r3, pc}
-
- thumb_func_start GetBoxMonData
-GetBoxMonData: ; 0x020672BC
- push {r4-r6, lr}
- add r5, r0, #0x0
- ldrh r0, [r5, #0x4]
- add r4, r1, #0x0
- add r6, r2, #0x0
- lsl r0, r0, #0x1e
- lsr r0, r0, #0x1f
- bne _020672F8
- ldrh r2, [r5, #0x6]
- add r0, r5, #0x0
- add r0, #0x8
- mov r1, #0x80
- bl MonDecryptSegment
- add r0, r5, #0x0
- add r0, #0x8
- mov r1, #0x80
- bl CalcMonChecksum
- ldrh r1, [r5, #0x6]
- cmp r0, r1
- beq _020672F8
- cmp r0, r1
- beq _020672F0
- bl ErrorHandling
-_020672F0:
- ldrh r1, [r5, #0x4]
- mov r0, #0x4
- orr r0, r1
- strh r0, [r5, #0x4]
-_020672F8:
- add r0, r5, #0x0
- add r1, r4, #0x0
- add r2, r6, #0x0
- bl GetBoxMonDataInternal
- add r4, r0, #0x0
- ldrh r0, [r5, #0x4]
- lsl r0, r0, #0x1e
- lsr r0, r0, #0x1f
- bne _02067318
- ldrh r2, [r5, #0x6]
- add r0, r5, #0x0
- add r0, #0x8
- mov r1, #0x80
- bl MonEncryptSegment
-_02067318:
- add r0, r4, #0x0
- pop {r4-r6, pc}
-
thumb_func_start GetBoxMonDataInternal
GetBoxMonDataInternal: ; 0x0206731C
push {r4-r7, lr}
diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c
index 9fd9de3b..7905046d 100644
--- a/arm9/src/pokemon.c
+++ b/arm9/src/pokemon.c
@@ -369,3 +369,84 @@ void CalcMonStats(struct Pokemon * pokemon)
SetMonData(pokemon, MON_DATA_HP, &hp);
TryEncryptMon(pokemon, decry);
}
+
+u32 GetMonData(struct Pokemon * pokemon, u32 attr, void * dest)
+{
+ u32 ret;
+ u32 checksum;
+ if (!pokemon->box.party_lock)
+ {
+ DECRYPT_PTY(pokemon);
+ DECRYPT_BOX(&pokemon->box);
+ checksum = CalcMonChecksum(&pokemon->box.substructs, sizeof(pokemon->box.substructs));
+ if (checksum != pokemon->box.checksum)
+ {
+ GF_ASSERT(checksum == pokemon->box.checksum);
+ pokemon->box.checksum_fail = TRUE;
+ }
+ }
+ ret = GetMonDataInternal(pokemon, attr, dest);
+ if (!pokemon->box.party_lock)
+ {
+ ENCRYPT_PTY(pokemon);
+ ENCRYPT_BOX(&pokemon->box);
+ }
+ return ret;
+}
+
+u32 GetMonDataInternal(struct Pokemon * pokemon, u32 attr, void * dest)
+{
+ switch (attr)
+ {
+ case MON_DATA_STATUS:
+ return pokemon->party.status;
+ case MON_DATA_LEVEL:
+ return pokemon->party.level;
+ case MON_DATA_CAPSULE:
+ return pokemon->party.capsule;
+ case MON_DATA_HP:
+ return pokemon->party.hp;
+ case MON_DATA_MAXHP:
+ return pokemon->party.maxHp;
+ case MON_DATA_ATK:
+ return pokemon->party.atk;
+ case MON_DATA_DEF:
+ return pokemon->party.def;
+ case MON_DATA_SPEED:
+ return pokemon->party.speed;
+ case MON_DATA_SPATK:
+ return pokemon->party.spatk;
+ case MON_DATA_SPDEF:
+ return pokemon->party.spdef;
+ case MON_DATA_SEAL_STRUCT:
+ CopySealsObject(&pokemon->party.seal_something, dest);
+ return 1;
+ case MON_DATA_SEAL_COORDS:
+ FUN_02029C74(pokemon->party.sealCoords, dest);
+ return 1;
+ default:
+ return GetBoxMonDataInternal(&pokemon->box, attr, dest);
+ }
+}
+
+u32 GetBoxMonData(struct BoxPokemon * boxmon, u32 attr, void * dest)
+{
+ u32 ret;
+ u32 checksum;
+ if (!boxmon->box_lock)
+ {
+ DECRYPT_BOX(boxmon);
+ checksum = CalcMonChecksum(&boxmon->substructs, sizeof(boxmon->substructs));
+ if (checksum != boxmon->checksum)
+ {
+ GF_ASSERT(checksum == boxmon->checksum);
+ boxmon->checksum_fail = TRUE;
+ }
+ }
+ ret = GetBoxMonDataInternal(boxmon, attr, dest);
+ if (!boxmon->box_lock)
+ {
+ ENCRYPT_BOX(boxmon);
+ }
+ return ret;
+}
diff --git a/include/pokemon.h b/include/pokemon.h
index 3f5660e9..e2a32e83 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -356,7 +356,7 @@ struct BoxPokemon {
/* 0x000 */ u32 pid;
/* 0x004 */ u16 party_lock:1;
u16 box_lock:1;
- u16 control_4_2:1;
+ u16 checksum_fail:1;
u16 Unused:13; // Might be used for validity checks
/* 0x006 */ u16 checksum; // Stored checksum of pokemon
/* 0x008 */ PokemonDataBlock substructs[4];
@@ -364,14 +364,7 @@ struct BoxPokemon {
struct PartyPokemon
{
- /* 0x088 */ u8 slp:3;
- u8 psn:1;
- u8 brn:1;
- u8 frz:1;
- u8 prz:1;
- u8 tox:1;
- /* 0x089 */ u8 unk89;
- /* 0x08A */ u8 filler8A[2];
+ /* 0x088 */ u32 status; // slp:3, psn:1, brn:1, frz:1, prz:1, tox:1, ...
/* 0x08C */ u8 level;
/* 0x08D */ u8 capsule;
/* 0x08E */ u16 hp;
diff --git a/include/seals.h b/include/seals.h
index 89808176..fc0fc449 100644
--- a/include/seals.h
+++ b/include/seals.h
@@ -9,4 +9,7 @@ struct SealStruct
struct SealStruct * CreateNewSealsObject(u32 heap_id);
+void CopySealsObject(struct SealStruct *, struct SealStruct *);
+void FUN_02029C74(u8 *, u8 *);
+
#endif //POKEDIAMOND_SEALS_H