summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-12 09:00:45 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-12 09:00:45 -0400
commit1dd706599353a285534398ccdc34a9ef8bc6e549 (patch)
tree59fe6b627e49677f55343fe2de86e3147e953296
parente052aae076e955cd58592b8c1c57e3f008c73040 (diff)
pokemon.c through TryDecryptMon
-rw-r--r--arm9/arm9.lcf4
-rw-r--r--arm9/asm/pokemon_s.s (renamed from arm9/asm/pokemon.s)93
-rw-r--r--arm9/asm/unk_02023C40.s6
-rw-r--r--arm9/asm/unk_0206B16C.s4
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/lib/include/MI_memory.h2
-rw-r--r--arm9/modules/05/asm/module_05.s2
-rw-r--r--arm9/modules/14/asm/module_14.s2
-rw-r--r--arm9/modules/83/asm/module_83.s2
-rw-r--r--arm9/src/pokemon.c59
-rw-r--r--include/global.h2
-rw-r--r--include/pokemon.h128
12 files changed, 145 insertions, 161 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index 9fb4de49..d4544ed6 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -362,6 +362,7 @@ SECTIONS {
unk_020653EC.o (.text)
unk_02066840.o (.text)
pokemon.o (.text)
+ pokemon_s.o (.text)
unk_0206AB04.o (.text)
unk_0206ABC4.o (.text)
unk_0206B16C.o (.text)
@@ -690,6 +691,7 @@ SECTIONS {
unk_02064CA8.o (.rodata)
unk_020653EC.o (.rodata)
pokemon.o (.rodata)
+ pokemon_s.o (.rodata)
unk_0206ABC4.o (.rodata)
unk_0206B688.o (.rodata)
unk_0206BF90.o (.rodata)
@@ -796,6 +798,7 @@ SECTIONS {
unk_0205F7A0.o (.data)
unk_02060CCC.o (.data)
pokemon.o (.data)
+ pokemon_s.o (.data)
unk_02073710.o (.data)
unk_020772F0.o (.data)
unk_0207C328.o (.data)
@@ -888,6 +891,7 @@ SECTIONS {
unk_020520AC.o (.bss)
unk_02052EE8.o (.bss)
pokemon.o (.bss)
+ pokemon_s.o (.bss)
unk_020772F0.o (.bss)
unk_020893E0.o (.bss)
unk_0208A998.o (.bss)
diff --git a/arm9/asm/pokemon.s b/arm9/asm/pokemon_s.s
index ec6ac699..2395e7f1 100644
--- a/arm9/asm/pokemon.s
+++ b/arm9/asm/pokemon_s.s
@@ -116,97 +116,6 @@ UNK_021C5AC0: ; 0x021C5AC0
.text
- thumb_func_start ZeroMonData
-ZeroMonData: ; 0x02066978
- push {r4, lr}
- add r4, r0, #0x0
- mov r0, #0x0
- add r1, r4, #0x0
- mov r2, #0xec
- bl MIi_CpuClearFast
- add r0, r4, #0x0
- ldrh r2, [r4, #0x6]
- add r0, #0x8
- mov r1, #0x80
- bl MonEncryptSegment
- add r0, r4, #0x0
- ldr r2, [r4, #0x0]
- add r0, #0x88
- mov r1, #0x64
- bl MonEncryptSegment
- pop {r4, pc}
-
- thumb_func_start WipeBoxMonDataAndEncrypt
-WipeBoxMonDataAndEncrypt: ; 0x020669A0
- push {r4, lr}
- add r4, r0, #0x0
- mov r0, #0x0
- add r1, r4, #0x0
- mov r2, #0x88
- bl MIi_CpuClearFast
- add r0, r4, #0x0
- ldrh r2, [r4, #0x6]
- add r0, #0x8
- mov r1, #0x80
- bl MonEncryptSegment
- pop {r4, pc}
-
- thumb_func_start SizeOfStructPokemon
-SizeOfStructPokemon: ; 0x020669BC
- mov r0, #0xec
- bx lr
-
- thumb_func_start AllocMonZeroed
-AllocMonZeroed: ; 0x020669C0
- push {r4, lr}
- mov r1, #0xec
- bl AllocFromHeap
- add r4, r0, #0x0
- bl ZeroMonData
- add r0, r4, #0x0
- pop {r4, pc}
- .balign 4
-
- thumb_func_start TryDecryptMon
-TryDecryptMon: ; 0x020669D4
- push {r3-r5, lr}
- add r5, r0, #0x0
- ldrh r0, [r5, #0x4]
- mov r4, #0x0
- lsl r1, r0, #0x1f
- lsr r1, r1, #0x1f
- bne _02066A1A
- lsl r0, r0, #0x1e
- mov r4, #0x1
- lsr r0, r0, #0x1f
- beq _020669EE
- bl ErrorHandling
-_020669EE:
- ldrh r1, [r5, #0x4]
- mov r0, #0x1
- bic r1, r0
- mov r0, #0x1
- orr r0, r1
- strh r0, [r5, #0x4]
- ldrh r1, [r5, #0x4]
- mov r0, #0x2
- orr r0, r1
- strh r0, [r5, #0x4]
- 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
-_02066A1A:
- add r0, r4, #0x0
- pop {r3-r5, pc}
- .balign 4
-
thumb_func_start TryEncryptMon
TryEncryptMon: ; 0x02066A20
push {r3-r5, lr}
@@ -372,7 +281,7 @@ CreateBoxMon: ; 0x02066B64
push {r4-r7, lr}
sub sp, #0xc
add r5, r0, #0x0
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
add r0, r5, #0x0
bl TryDecryptBoxMon
str r0, [sp, #0x0]
diff --git a/arm9/asm/unk_02023C40.s b/arm9/asm/unk_02023C40.s
index 30aa59a0..9b5622d0 100644
--- a/arm9/asm/unk_02023C40.s
+++ b/arm9/asm/unk_02023C40.s
@@ -26,10 +26,10 @@ FUN_02023C48: ; 0x02023C48
lsl r2, r2, #0x4
bl memset
add r0, r4, #0x0
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
add r0, r4, #0x0
add r0, #0xec
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
mov r0, #0x76
mov r1, #0x0
lsl r0, r0, #0x2
@@ -187,7 +187,7 @@ _02023D38: .word 0x0000FFFF
FUN_02023D3C: ; 0x02023D3C
push {r4, lr}
add r4, r0, #0x0
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
add r0, r4, #0x0
mov r1, #0x0
add r0, #0xe8
diff --git a/arm9/asm/unk_0206B16C.s b/arm9/asm/unk_0206B16C.s
index b6ec1416..465dbabb 100644
--- a/arm9/asm/unk_0206B16C.s
+++ b/arm9/asm/unk_0206B16C.s
@@ -28,7 +28,7 @@ _0206B188:
add r5, r6, #0x0
_0206B18C:
add r0, r5, #0x0
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
add r4, r4, #0x1
add r5, #0x88
cmp r4, #0x1e
@@ -241,7 +241,7 @@ _0206B308:
mov r0, #0x88
mul r0, r2
add r0, r1, r0
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
bl FUN_02022830
pop {r3, pc}
_0206B32A:
diff --git a/arm9/global.inc b/arm9/global.inc
index ce1debbd..28f325a6 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -4705,7 +4705,7 @@
.extern FUN_02066818
.extern FUN_02066840
.extern ZeroMonData
-.extern WipeBoxMonDataAndEncrypt
+.extern ZeroBoxMonData
.extern SizeOfStructPokemon
.extern AllocMonZeroed
.extern TryDecryptMon
diff --git a/arm9/lib/include/MI_memory.h b/arm9/lib/include/MI_memory.h
index bf6c0ca5..e1e5fe11 100644
--- a/arm9/lib/include/MI_memory.h
+++ b/arm9/lib/include/MI_memory.h
@@ -22,4 +22,6 @@ static inline void MI_CpuClear32(void *dest, u32 size)
MI_CpuFill32(dest, 0, size);
}
+void MIi_CpuClearFast(u32 data, void *destp, u32 size);
+
#endif //NITRO_MI_MEMORY_H_
diff --git a/arm9/modules/05/asm/module_05.s b/arm9/modules/05/asm/module_05.s
index f351ccb6..0dba71bb 100644
--- a/arm9/modules/05/asm/module_05.s
+++ b/arm9/modules/05/asm/module_05.s
@@ -43348,7 +43348,7 @@ _021EC6FA:
add r1, r4, #0
bl FUN_0206B900
add r0, r5, #0
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
add r0, r6, #0
mov r1, #0
bl FUN_02023CA0
diff --git a/arm9/modules/14/asm/module_14.s b/arm9/modules/14/asm/module_14.s
index 00b933b8..8fe02035 100644
--- a/arm9/modules/14/asm/module_14.s
+++ b/arm9/modules/14/asm/module_14.s
@@ -9122,7 +9122,7 @@ MOD14_021DBE34: ; 0x021DBE34
push {r4, lr}
add r4, r0, #0
ldr r0, [r4, #0x14]
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
mov r0, #1
strb r0, [r4, #0x13]
add r0, r4, #0
diff --git a/arm9/modules/83/asm/module_83.s b/arm9/modules/83/asm/module_83.s
index e1d37212..922e6bb5 100644
--- a/arm9/modules/83/asm/module_83.s
+++ b/arm9/modules/83/asm/module_83.s
@@ -21864,7 +21864,7 @@ MOD83_02237F6C: ; 0x02237F6C
add r4, r1, #0
add r6, r0, #0
add r0, r4, #0
- bl WipeBoxMonDataAndEncrypt
+ bl ZeroBoxMonData
add r0, r4, #0
bl TryDecryptBoxMon
mov r1, #0
diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c
new file mode 100644
index 00000000..60381e75
--- /dev/null
+++ b/arm9/src/pokemon.c
@@ -0,0 +1,59 @@
+#include "global.h"
+#define IN_POKEMON_C
+#include "pokemon.h"
+#include "heap.h"
+#include "MI_memory.h"
+
+#pragma thumb on
+
+void MonEncryptSegment(void * datap, u32 size, u32 key, ...);
+void MonDecryptSegment(void * datap, u32 size, u32 key, ...);
+u16 MonEncryptionLCRNG(u32 * seed);
+
+#define ENCRY_ARGS_PTY(mon) &(mon)->party, sizeof((mon)->party), (mon)->box.pid
+#define ENCRY_ARGS_BOX(boxmon) &(boxmon)->substructs, sizeof((boxmon)->substructs), (boxmon)->checksum
+#define ENCRYPT_PTY(mon) MonEncryptSegment(ENCRY_ARGS_PTY(mon))
+#define ENCRYPT_BOX(boxmon) MonEncryptSegment(ENCRY_ARGS_BOX(boxmon))
+#define DECRYPT_PTY(mon) MonDecryptSegment(ENCRY_ARGS_PTY(mon))
+#define DECRYPT_BOX(boxmon) MonDecryptSegment(ENCRY_ARGS_BOX(boxmon))
+
+void ZeroMonData(struct Pokemon * pokemon)
+{
+ MIi_CpuClearFast(0, pokemon, sizeof(struct Pokemon));
+ ENCRYPT_BOX(&pokemon->box);
+ ENCRYPT_PTY(pokemon);
+}
+
+void ZeroBoxMonData(struct BoxPokemon * boxmon)
+{
+ MIi_CpuClearFast(0, boxmon, sizeof(struct BoxPokemon));
+ ENCRYPT_BOX(boxmon);
+}
+
+u32 SizeOfStructPokemon(void)
+{
+ return sizeof(struct Pokemon);
+}
+
+struct Pokemon * AllocMonZeroed(u32 heap_id)
+{
+ struct Pokemon * pokemon = (struct Pokemon *)AllocFromHeap(heap_id, sizeof(struct Pokemon));
+ ZeroMonData(pokemon);
+ return pokemon;
+}
+
+BOOL TryDecryptMon(struct Pokemon * mon)
+{
+ BOOL ret = FALSE;
+
+ if (!mon->box.no_encrypt)
+ {
+ ret = TRUE;
+ GF_ASSERT(!mon->box.control_4_1);
+ mon->box.no_encrypt = TRUE;
+ mon->box.control_4_1 = TRUE;
+ DECRYPT_PTY(mon);
+ DECRYPT_BOX(&mon->box);
+ }
+ return ret;
+}
diff --git a/include/global.h b/include/global.h
index 2f31fa3d..bffce9f0 100644
--- a/include/global.h
+++ b/include/global.h
@@ -27,4 +27,6 @@ enum GameLanguage {
extern void ErrorHandling(void);
+#define GF_ASSERT(expr) do {if (!(expr)) ErrorHandling();} while (0)
+
#endif //GUARD_GLOBAL_H
diff --git a/include/pokemon.h b/include/pokemon.h
index 71c1fb67..410e4bc5 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -103,13 +103,17 @@
#define MON_DATA_SEAL_COORDS 170
#define MON_DATA_SPECIES_EXISTS 171
#define MON_DATA_SANITY_CHECK_172 172
-#define MON_DATA_SANITY_CHECK_173 173
+#define MON_DATA_SPECIES2 173
#define MON_DATA_IVS_WORD 174
#define MON_DATA_IS_FEMALE 175
#define MON_DATA_TYPE_1 176
#define MON_DATA_TYPE_2 177
#define MON_DATA_SPECIES_NAME 178
+#define MON_MALE 0
+#define MON_FEMALE 254
+#define MON_GENDER_UNKNOWN 255
+
// TODO: Identify the rest of these
enum BaseStat {
BASE_HP = 0,
@@ -202,69 +206,69 @@ typedef enum GameLanguage OriginLanguage;
typedef enum {
ARCEUS_NORMAL = 0,
- ARCEUS_FIST = 8,
- ARCEUS_SKY = 16,
- ARCEUS_TOXIC = 24,
- ARCEUS_EARTH = 32,
- ARCEUS_STONE = 40,
- ARCEUS_INSECT = 48,
- ARCEUS_SPOOKY = 56,
- ARCEUS_IRON = 64,
- ARCEUS_FLAME = 72,
- ARCEUS_SPLASH = 80,
- ARCEUS_MEADOW = 88,
- ARCEUS_ZAP = 96,
- ARCEUS_MIND = 104,
- ARCEUS_ICICLE = 112,
- ARCEUS_DRACO = 120,
- ARCEUS_DREAD = 128,
+ ARCEUS_FIST = 1,
+ ARCEUS_SKY = 2,
+ ARCEUS_TOXIC = 3,
+ ARCEUS_EARTH = 4,
+ ARCEUS_STONE = 5,
+ ARCEUS_INSECT = 6,
+ ARCEUS_SPOOKY = 7,
+ ARCEUS_IRON = 8,
+ ARCEUS_FLAME = 9,
+ ARCEUS_SPLASH = 10,
+ ARCEUS_MEADOW = 11,
+ ARCEUS_ZAP = 12,
+ ARCEUS_MIND = 13,
+ ARCEUS_ICICLE = 14,
+ ARCEUS_DRACO = 15,
+ ARCEUS_DREAD = 16,
BURMY_PLANT = 0,
- BURMY_SANDY = 8,
- BURMY_TRASH = 16,
+ BURMY_SANDY = 1,
+ BURMY_TRASH = 2,
DEOXYS_NORMAL = 0,
- DEOXYS_ATTACK = 8,
- DEOXYS_DEFENSE = 16,
- DEOXYS_SPEED = 24,
+ DEOXYS_ATTACK = 1,
+ DEOXYS_DEFENSE = 2,
+ DEOXYS_SPEED = 3,
GIRATINA_ALTERED = 0,
- GIRATINA_ORIGIN = 8,
+ GIRATINA_ORIGIN = 1,
ROTOM_NORMAL = 0,
- ROTOM_HEAT = 8,
- ROTOM_WASH = 16,
- ROTOM_FROST = 24,
- ROTOM_FAN = 32,
- ROTOM_MOW = 40,
+ ROTOM_HEAT = 1,
+ ROTOM_WASH = 2,
+ ROTOM_FROST = 3,
+ ROTOM_FAN = 4,
+ ROTOM_MOW = 5,
SHAYMIN_LAND = 0,
- SHAYMIN_SKY = 8,
+ SHAYMIN_SKY = 1,
SHELLOS_WEST = 0,
- SHELLOS_EAST = 8,
+ SHELLOS_EAST = 1,
UNOWN_A = 0,
- UNOWN_B = 8,
- UNOWN_C = 16,
- UNOWN_D = 24,
- UNOWN_E = 32,
- UNOWN_F = 40,
- UNOWN_G = 48,
- UNOWN_H = 56,
- UNOWN_I = 64,
- UNOWN_J = 72,
- UNOWN_K = 80,
- UNOWN_L = 88,
- UNOWN_M = 96,
- UNOWN_N = 104,
- UNOWN_O = 112,
- UNOWN_P = 120,
- UNOWN_Q = 128,
- UNOWN_R = 136,
- UNOWN_S = 144,
- UNOWN_T = 152,
- UNOWN_U = 160,
- UNOWN_V = 168,
- UNOWN_W = 176,
- UNOWN_X = 184,
- UNOWN_Y = 192,
- UNOWN_Z = 200,
- UNOWN_EXCLAMATION_MARK = 208,
- UNOWN_QUESTION_MARK = 216
+ UNOWN_B = 1,
+ UNOWN_C = 2,
+ UNOWN_D = 3,
+ UNOWN_E = 4,
+ UNOWN_F = 5,
+ UNOWN_G = 6,
+ UNOWN_H = 7,
+ UNOWN_I = 8,
+ UNOWN_J = 9,
+ UNOWN_K = 10,
+ UNOWN_L = 11,
+ UNOWN_M = 12,
+ UNOWN_N = 13,
+ UNOWN_O = 14,
+ UNOWN_P = 15,
+ UNOWN_Q = 16,
+ UNOWN_R = 17,
+ UNOWN_S = 18,
+ UNOWN_T = 19,
+ UNOWN_U = 20,
+ UNOWN_V = 21,
+ UNOWN_W = 22,
+ UNOWN_X = 23,
+ UNOWN_Y = 24,
+ UNOWN_Z = 25,
+ UNOWN_EXCLAMATION_MARK = 26,
+ UNOWN_QUESTION_MARK = 27
} AlternateForms;
// Structs
@@ -341,18 +345,17 @@ typedef union {
} PokemonDataBlock;
struct BoxPokemon {
- /* 0x000 */ u32 personalityValue;
+ /* 0x000 */ u32 pid;
/* 0x004 */ u16 no_encrypt:1;
u16 control_4_1:1;
u16 control_4_2:1;
u16 Unused:13; // Might be used for validity checks
/* 0x006 */ u16 checksum; // Stored checksum of pokemon
- /* 0x008 */ PokemonDataBlock box[4];
+ /* 0x008 */ PokemonDataBlock substructs[4];
};
struct PartyPokemon
{
- /* 0x000 */ struct BoxPokemon box;
/* 0x088 */ u8 slp:3;
u8 psn:1;
u8 brn:1;
@@ -379,6 +382,11 @@ struct Pokemon {
/* 0x088 */ struct PartyPokemon party;
}; // size: 0xEC
+void ZeroMonData(struct Pokemon * pokemon);
+void ZeroBoxMonData(struct BoxPokemon * boxmon);
+u32 SizeOfStructPokemon(void);
+struct Pokemon * AllocMonZeroed(u32 heap_id);
+BOOL TryDecryptMon(struct Pokemon * mon);
int GetMonBaseStat_HandleFormeConversion(int species, int form, int stat_id);
int GetMonBaseStat(int species, int stat_id);
int GetMonExpBySpeciesAndLevel(int species, int level);