diff options
Diffstat (limited to 'src/personality_test_pre.c')
-rw-r--r-- | src/personality_test_pre.c | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/src/personality_test_pre.c b/src/personality_test_pre.c new file mode 100644 index 0000000..9603b0e --- /dev/null +++ b/src/personality_test_pre.c @@ -0,0 +1,299 @@ +#include "global.h" + +#define NUM_PERSONALITIES 13 +#define NUM_QUIZ_QUESTIONS 55 + +struct PersonalityStruct_203B400 +{ + u32 unk0; + u32 unk4; + u8 padding[0x34 - 8]; + /* 0x34 */ u32 TestState; + /* 0x38 */ u32 QuestionCounter; + /* 0x3C */ u32 currQuestionIndex; + u8 unk40; + u8 padding2[3]; + /* 0x44 */ u32 NatureTotals[13]; + /* 0x78 */ u8 QuestionTracker[NUM_QUIZ_QUESTIONS]; + u32 unkb0; + u32 unkb4; + u32 unkb8; + u32 unkbc; +}; + +extern struct PersonalityStruct_203B400 *gUnknown_203B400; +extern void* MemoryAlloc(u32, u32); +extern void MemoryFree(void *); +extern void sub_801317C(u32 *); +extern void sub_8099690(u32); +extern void sub_8001024(u32 *); +extern s32 Random(void); +extern s32 sub_8094E4C(void); +extern void sub_8011C40(s32); +extern void sub_8094D28(s32); +extern void sub_8001044(u32 *); + +extern void sub_803C870(void); +extern void sub_803C908(void); +extern void sub_803C920(void); +extern void sub_803C98C(void); +extern void sub_803C9D8(void); +extern void sub_803CA54(void); +extern void sub_803CA8C(void); +extern void sub_803CAAC(void); +extern void sub_803CAD4(void); +extern void sub_803CAF4(void); +extern void sub_803CB14(void); +extern void sub_803CB5C(void); +extern void sub_803CB7C(void); +extern void sub_803CBB0(void); +extern void sub_803CBE4(void); +void InitializeTestStats(void); + +u8 CreateTestTracker(void) +{ + gUnknown_203B400 = MemoryAlloc(sizeof(struct PersonalityStruct_203B400),8); + sub_801317C(&gUnknown_203B400->unkb4); + InitializeTestStats(); + sub_8099690(1); + return 1; +} + +void InitializeTestStats(void) +{ + s32 counter; + + sub_8001024(&gUnknown_203B400->unk4); + gUnknown_203B400->unk0 = 0; + gUnknown_203B400->TestState = 0; + gUnknown_203B400->QuestionCounter = 0; + for(counter = 0; counter < NUM_PERSONALITIES; counter++){ + gUnknown_203B400->NatureTotals[counter] = 0; + } + gUnknown_203B400->currQuestionIndex = 0; + for(counter = 0; counter < NUM_QUIZ_QUESTIONS; counter++){ + gUnknown_203B400->QuestionTracker[counter] = 0; + } + gUnknown_203B400->unk40 = 0; + gUnknown_203B400->unkb0 = 0; +} + +#ifdef NONMATCHING +u8 HandleTestTrackerState(void) +{ + s32 counter; + + s32 iVar1; + + gUnknown_203B400->unk0++; + switch(gUnknown_203B400->TestState) + { + case 0: + sub_803C870(); + break; + case 1: + sub_803C908(); + break; + case 2: + sub_803C920(); + break; + case 3: + sub_803C98C(); + break; + case 4: + sub_803C9D8(); + break; + case 5: + sub_803CA54(); + break; + case 6: + sub_803CA8C(); + break; + case 7: + sub_803CAAC(); + break; + case 8: + sub_803CAD4(); + break; + case 9: + sub_803CAF4(); + break; + case 10: + sub_803CB14(); + break; + case 11: + sub_803CB5C(); + break; + case 12: + sub_803CB7C(); + break; + case 13: + sub_803CBB0(); + break; + case 14: + sub_803CBE4(); + break; + case 15: + iVar1 = Random() * gUnknown_203B400->unk0; + sub_8094D28(Random()); + + // TODO fix this math.. + for(counter = 0; counter < 13; counter++){ + iVar1 *= (gUnknown_203B400->NatureTotals[counter] + 3); + } + + iVar1 += sub_8094E4C(); + while (iVar1 == -1) { + iVar1 += sub_8094E4C(); + } + sub_8011C40(iVar1); + return 3; + default: + break; + } + return 0; +} + +#else +NAKED +u8 HandleTestTrackerState(void) +{ + asm_unified( + "\tpush {r4,r5,lr}\n" + "\tldr r0, _0803C750\n" + "\tldr r1, [r0]\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstr r0, [r1]\n" + "\tldr r0, [r1, 0x34]\n" + "\tcmp r0, 0xF\n" + "\tbls _0803C744\n" + "\tb _0803C848\n" + "_0803C744:\n" + "\tlsls r0, 2\n" + "\tldr r1, _0803C754\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0803C750: .4byte gUnknown_203B400\n" + "_0803C754: .4byte _0803C758\n" + "\t.align 2, 0\n" + "_0803C758:\n" + "\t.4byte _0803C798\n" + "\t.4byte _0803C79E\n" + "\t.4byte _0803C7A4\n" + "\t.4byte _0803C7AA\n" + "\t.4byte _0803C7B0\n" + "\t.4byte _0803C7B6\n" + "\t.4byte _0803C7BC\n" + "\t.4byte _0803C7C2\n" + "\t.4byte _0803C7C8\n" + "\t.4byte _0803C7CE\n" + "\t.4byte _0803C7D4\n" + "\t.4byte _0803C7DA\n" + "\t.4byte _0803C7E0\n" + "\t.4byte _0803C7E6\n" + "\t.4byte _0803C7EC\n" + "\t.4byte _0803C7F2\n" + "_0803C798:\n" + "\tbl sub_803C870\n" + "\tb _0803C848\n" + "_0803C79E:\n" + "\tbl sub_803C908\n" + "\tb _0803C848\n" + "_0803C7A4:\n" + "\tbl sub_803C920\n" + "\tb _0803C848\n" + "_0803C7AA:\n" + "\tbl sub_803C98C\n" + "\tb _0803C848\n" + "_0803C7B0:\n" + "\tbl sub_803C9D8\n" + "\tb _0803C848\n" + "_0803C7B6:\n" + "\tbl sub_803CA54\n" + "\tb _0803C848\n" + "_0803C7BC:\n" + "\tbl sub_803CA8C\n" + "\tb _0803C848\n" + "_0803C7C2:\n" + "\tbl sub_803CAAC\n" + "\tb _0803C848\n" + "_0803C7C8:\n" + "\tbl sub_803CAD4\n" + "\tb _0803C848\n" + "_0803C7CE:\n" + "\tbl sub_803CAF4\n" + "\tb _0803C848\n" + "_0803C7D4:\n" + "\tbl sub_803CB14\n" + "\tb _0803C848\n" + "_0803C7DA:\n" + "\tbl sub_803CB5C\n" + "\tb _0803C848\n" + "_0803C7E0:\n" + "\tbl sub_803CB7C\n" + "\tb _0803C848\n" + "_0803C7E6:\n" + "\tbl sub_803CBB0\n" + "\tb _0803C848\n" + "_0803C7EC:\n" + "\tbl sub_803CBE4\n" + "\tb _0803C848\n" + "_0803C7F2:\n" + "\tbl Random\n" + "\tldr r4, _0803C844\n" + "\tldr r1, [r4]\n" + "\tldr r1, [r1]\n" + "\tadds r5, r0, 0\n" + "\tmuls r5, r1\n" + "\tbl Random\n" + "\tbl sub_8094D28\n" + "\tmovs r1, 0\n" + "\tldr r0, [r4]\n" + "\tadds r2, r0, 0\n" + "\tadds r2, 0x44\n" + "_0803C810:\n" + "\tldm r2!, {r0}\n" + "\tadds r0, r1\n" + "\tadds r0, 0x3\n" + "\tmuls r5, r0\n" + "\tadds r1, 0x1\n" + "\tcmp r1, 0xC\n" + "\tble _0803C810\n" + "\tbl sub_8094E4C\n" + "\tadds r5, r0\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tcmp r5, r0\n" + "\tbne _0803C838\n" + "\tadds r4, r5, 0\n" + "_0803C82E:\n" + "\tbl sub_8094E4C\n" + "\tadds r5, r0\n" + "\tcmp r5, r4\n" + "\tbeq _0803C82E\n" + "_0803C838:\n" + "\tadds r0, r5, 0\n" + "\tbl sub_8011C40\n" + "\tmovs r0, 0x3\n" + "\tb _0803C84A\n" + "\t.align 2, 0\n" +"_0803C844: .4byte gUnknown_203B400\n" +"_0803C848:\n" + "\tmovs r0, 0\n" +"_0803C84A:\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +#endif + +} + +void DeleteTestTracker(void) +{ + sub_8001044(&gUnknown_203B400->unk4); + MemoryFree(gUnknown_203B400); + gUnknown_203B400 = NULL; +} |