diff options
-rw-r--r-- | arm9/arm9.lcf | 4 | ||||
-rw-r--r-- | arm9/asm/pokemon_s.s (renamed from arm9/asm/pokemon.s) | 93 | ||||
-rw-r--r-- | arm9/asm/unk_02023C40.s | 6 | ||||
-rw-r--r-- | arm9/asm/unk_0206B16C.s | 4 | ||||
-rw-r--r-- | arm9/global.inc | 2 | ||||
-rw-r--r-- | arm9/lib/include/MI_memory.h | 2 | ||||
-rw-r--r-- | arm9/modules/05/asm/module_05.s | 2 | ||||
-rw-r--r-- | arm9/modules/14/asm/module_14.s | 2 | ||||
-rw-r--r-- | arm9/modules/83/asm/module_83.s | 2 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 59 | ||||
-rw-r--r-- | include/global.h | 2 | ||||
-rw-r--r-- | include/pokemon.h | 128 |
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); |