summaryrefslogtreecommitdiff
path: root/arm9/src
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 /arm9/src
parente052aae076e955cd58592b8c1c57e3f008c73040 (diff)
pokemon.c through TryDecryptMon
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/pokemon.c59
1 files changed, 59 insertions, 0 deletions
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;
+}