diff options
author | Seth Barberee <seth.barberee@gmail.com> | 2021-02-19 16:01:53 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-19 18:01:53 -0600 |
commit | c754c2a0466d8394c7ffcb3a515199d5703e47be (patch) | |
tree | 42463d69e3642a4ada17614cac4653a02dac9338 /src | |
parent | 8dfd044ef3a6ea8da204265b4560716aa67391d1 (diff) |
Decomp more of personality_test (#27)
* decomp most of personality_test
* just gonna move the funcs to src in assembly for now so I can combine stuff
* label another func and some cleanup
* one func of personality test left in asm
* small cleanups and labeling of funcs
Diffstat (limited to 'src')
-rw-r--r-- | src/code_8041AD0.c | 17 | ||||
-rw-r--r-- | src/code_8048480.c | 6 | ||||
-rw-r--r-- | src/event_flag.c | 6 | ||||
-rw-r--r-- | src/main_menu.c | 8 | ||||
-rw-r--r-- | src/personality_test.c | 52 | ||||
-rw-r--r-- | src/personality_test_pre.c | 866 | ||||
-rw-r--r-- | src/pokemon.c | 5 |
7 files changed, 722 insertions, 238 deletions
diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 29b1710..9358ddb 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -31,7 +31,7 @@ extern u8 sub_8071858(struct unkDungeon_8041D5C *r0, u8); extern u32 sub_806F62C(u32); extern void sub_8083E38(u32); extern u8 sub_803F428(struct unkDungeon_8041D5C *r0); -extern void sub_8041550(struct unkDungeon_8041D5C *r0, u32, u32, u32); +extern void sub_8041550(struct unkDungeon_8041D5C *r0, u32, u32, u32, u32, u32); void sub_80421C0(struct unkDungeon_8041D5C *r0, u16 r1); @@ -439,10 +439,7 @@ void sub_8041EF8(struct unkDungeon_8041D5C *r0) void sub_8041F08(struct unkDungeon_8041D5C *r0) { - volatile struct unk_struct_8041F08 temp; - temp.unk0 = 2; - temp.unk4 = 0; - sub_8041550(r0, 0x15, 1, 3); + sub_8041550(r0, 0x15, 1, 3, 2, 0); } void nullsub_90(void) @@ -597,10 +594,7 @@ void sub_80420B8(struct unkDungeon_8041D5C *r0, u32 r1) void sub_80420C8(struct unkDungeon_8041D5C *r0) { - volatile struct unk_struct_8041F08 temp; - temp.unk0 = 2; - temp.unk4 = 0; - sub_8041550(r0, 0x15, 1, 3); + sub_8041550(r0, 0x15, 1, 3, 2, 0); } void nullsub_92(void) @@ -611,7 +605,6 @@ void sub_80420E8(struct unkDungeon_8041D5C *r0, struct unkStruct_80420E8 *r1) { u32 temp; u32 arg; - volatile struct unk_struct_8041F08 temp_1; temp = r1->unk8; if(gUnknown_203B418[0x16d] != 0) temp = sub_806F62C(r1->unk8); @@ -631,9 +624,7 @@ void sub_80420E8(struct unkDungeon_8041D5C *r0, struct unkStruct_80420E8 *r1) arg = 11; break; } - temp_1.unk0 = 0; - temp_1.unk4 = 1; - sub_8041550(r0, arg, 1, 3); + sub_8041550(r0, arg, 1, 3, 0, 1); } void sub_8042148(struct unkDungeon_8041D5C *r0) diff --git a/src/code_8048480.c b/src/code_8048480.c index 4d403e1..7860fa8 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -18,7 +18,7 @@ extern s16 gUnknown_80F4FBE; extern void sub_807D148(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2, u32 r3); extern void sub_8075FCC(u32 r0, struct unkDungeon_8041D5C *r1); extern void sub_8077AE4(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2); -extern void sub_8072008(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2, u8 r3); +extern void sub_8072008(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2, u8 r3, u32); extern void sub_8076D10(u32 r0, struct unkDungeon_8041D5C *r1); extern void sub_807232C(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2); @@ -135,9 +135,7 @@ void sub_804849C(u32 r0, struct unkDungeon_8041D5C *r1) void sub_80484A8(u32 r0, struct unkDungeon_8041D5C *r1) { - volatile u32 temp; - temp = 1; - sub_8072008(r0, r1, 1, 1); + sub_8072008(r0, r1, 1, 1, 1); } void sub_80484BC(u32 r0, struct unkDungeon_8041D5C *r1) diff --git a/src/event_flag.c b/src/event_flag.c index a19d3db..10f6b8f 100644 --- a/src/event_flag.c +++ b/src/event_flag.c @@ -7,7 +7,7 @@ extern void sub_800226C(u8 r0, u8 r1, u32* r2, u8 u3); extern void sub_800160C(struct UnkEventStruct *r0, u32 r1, u32 r2); extern u8 sub_8002658(s32); -extern u8 gUnknown_2000A88; +extern u8 gUnknown_2000A88[0x400]; bool8 sub_80026CC(s16 r0) { @@ -21,7 +21,7 @@ void sub_80026E8(s16 r0) bool8 sub_8002700(void *r0) { - MemoryCopy8(r0, &gUnknown_2000A88, 0x80 << 3); + MemoryCopy8(r0, gUnknown_2000A88, 0x400); return 1; } @@ -29,7 +29,7 @@ bool8 sub_8002718(u8 *r0) { struct UnkEventStruct temp; sub_800160C(&temp, 0, 0); - MemoryCopy8(&gUnknown_2000A88, r0, 0x80 << 3); + MemoryCopy8(gUnknown_2000A88, r0, 0x400); if (temp.unk0[5] != temp.unk4[0]) return 0; return 1; diff --git a/src/main_menu.c b/src/main_menu.c index 765039f..0302550 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -30,7 +30,7 @@ extern void MemoryFree(void *); extern void sub_8094C14(void); extern void sub_8099690(u32); -extern void sub_8035E10(void); +extern void DrawMainMenu(void); extern void CreateDebugMenu(void); extern void sub_8036400(void); extern void sub_8036FDC(void); @@ -56,7 +56,7 @@ extern s32 sub_80383D4(void); extern s32 sub_8038630(void); extern s32 sub_803A2A4(void); -extern void sub_8035EC0(void); +extern void CleanMainMenu(void); extern void sub_80393F0(void); extern void sub_8036B04(void); extern void sub_80370D4(void); @@ -103,7 +103,7 @@ void SetUpMenu(void) case 1: sub_8094C14(); sub_8099690(0); - sub_8035E10(); + DrawMainMenu(); break; case 6: case 7: @@ -242,7 +242,7 @@ void CleanUpMenu(void) if (gUnknown_203B348->unk8 != gUnknown_203B348->unk4) { switch(gUnknown_203B348->unk8) { case 1: - sub_8035EC0(); + CleanMainMenu(); break; case 6: case 7: diff --git a/src/personality_test.c b/src/personality_test.c index 9aef10a..41fbfed 100644 --- a/src/personality_test.c +++ b/src/personality_test.c @@ -1,21 +1,15 @@ #include "global.h" +#include "constants/emotions.h" #include "constants/species.h" +#include "personality_test.h" #include "pokemon.h" -#define NUM_PARTNERS 10 +extern void sub_80073E0(u32); +extern void sub_80073B8(u32); +extern void sub_8008C54(u32); +extern void sub_800836C(u32, u8 *r0, u32); +extern void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray); -// TODO convert this... maybe a script? -const u8 gUnknown_80F4244[32] = -{ - 0, 0, 0, 0, - 5, 0, 0, 0, - 0xC, 0, 6, 0, - 5, 0, 5, 0, - 5, 0, 0, 0, - 0, 0, 0, 0, - - 'p', 'k', 's', 'd', 'i', 'r', '0', 0 -}; const s16 gPartners[NUM_PARTNERS] = { @@ -35,14 +29,34 @@ extern u8 gUnknown_80F42D0[]; extern u8 gUnknown_80F42F0[]; extern u8 gUnknown_203B408; -struct unkStruct_203B404 +// Definitely wrong but need to figure out better structure later +struct FaceData { - // Size: 0xB8 - /* 0x0 */ s16 StarterID; - /* 0x2 */ s16 PartnerArray[NUM_PARTNERS]; + /* 0x0 */ u8 *unk0[5]; }; -extern struct unkStruct_203B404 *gUnknown_203B404; +void PersonalityTest_DisplayPartnerSprite(void) +{ + s32 partnerID; + struct OpenedFile *faceFile; + int palleteIndex; + u8 *r6; + u32 faceIndex; + + partnerID = gUnknown_203B404->PartnerArray[gUnknown_203B404->currPartnerSelection]; + sub_8008C54(1); + sub_80073B8(1); + faceFile = GetDialogueSpriteDataPtr(partnerID); + r6 = ((struct FaceData *)(faceFile->data))->unk0[1 + EMOTION_NORMAL]; + faceIndex = EMOTION_NORMAL; + for(palleteIndex = 0; palleteIndex < 16; palleteIndex++){ + SetBGPaletteBufferColorArray(palleteIndex + 224,&((struct FaceData *)(faceFile->data))->unk0[faceIndex][palleteIndex << 2]); + } + sub_800836C(1,r6,0xe); + CloseFile(faceFile); + sub_80073E0(1); + gUnknown_203B404->unk16 = 1; +} s32 GetValidPartners(void) { @@ -88,5 +102,3 @@ u8 sub_803D100(u8 r0) { return gUnknown_80F42D0[r0]; } - - diff --git a/src/personality_test_pre.c b/src/personality_test_pre.c index 9603b0e..27a55a8 100644 --- a/src/personality_test_pre.c +++ b/src/personality_test_pre.c @@ -1,54 +1,114 @@ #include "global.h" +#include "personality_test.h" +#include "constants/emotions.h" +#include "random.h" +#include "file_system.h" +#include "pokemon.h" +#include "input.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); + + +struct UnkSaveStruct1 +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; + /* 0x8 */ u16 unk8; + /* 0xA */ u8 unkA; + /* 0xB */ u8 playerGender; +}; +extern struct UnkSaveStruct1 *gUnknown_203B46C; + +// The frick... This is definitely wrong in terms of members +// There's 5 pointers in the data +struct FaceData +{ + /* 0x0 */ u8 *unk0[5]; +}; + +struct stack_PartnerSprite +{ + // size: 0x60 + u32 unk0; + u8 padding[0x18 - 4]; + struct unkData data; + u32 padding2[12]; +}; + +extern void sub_80141B4(const char *text, u32 r1, u32 r2, u16 r3); +extern void sub_8014248(const char *text, u32, u32, u32 *r0, u32, u32, u32, u32, u32); + +extern u32 sub_80144A4(s32 *); + +extern void sub_803CE6C(void); +extern u32 sub_808D994(u32); +extern void sub_80922F4(s32 *r0, u32); +extern void sub_801602C(u32, s32 *r0); + +extern u32 sub_8016080(void); +extern void sub_80160D8(void); +extern void sub_8099690(u32); +extern void sub_808D8BC(u32 *r0, u32); + +extern void sub_8006518(void *); +extern void sub_800641C(void *, u32, u32); +extern void sub_80073E0(u32); +extern void sub_80073B8(u32); +extern void sub_8008C54(u32); +extern void sub_800836C(u32, u8 *r0, u32); +extern void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray); + +extern void sub_803CEAC(void); +extern void RedrawPartnerSelectionMenu(void); +extern void sub_8013818(u32 *r0, s32, u32, u32); + +extern u32 GetKeyPress(struct UnkInputStruct **r0); +extern u8 sub_80138B8(struct UnkInputStruct **r0, u32); +extern void sub_80119D4(u32); + + +extern void sub_8013984(struct UnkInputStruct **r0); +extern void AddMenuCursorSprite(struct UnkInputStruct **r0); + +extern const char gStarterReveal; +extern const char gPartnerPrompt; +extern const char gPartnerNickPrompt; +extern const char gEndIntroText; +extern const char gGenderText; +extern u32 gGenderMenu; + +extern u8 gNatureQuestionTable[NUM_QUIZ_QUESTIONS]; +extern const char *gPersonalityTypeDescriptionTable[]; + +extern u32 gUnknown_202DF98; + + +struct unkData gUnknown_80F4244 = +{ + 0, 0, 0, 0, + 5, 0, 0, 0, + 0xC, 0, 6, 0, + 5, 0, 5, 0, + 5, 0, 0, 0, + 0, 0, 0, 0, +}; + +const u8 filler[8] = +{ + 'p', 'k', 's', 'd', 'i', 'r', '0', 0 +}; + +extern struct unkData gUnknown_80F4278; + u8 CreateTestTracker(void) { @@ -64,7 +124,7 @@ void InitializeTestStats(void) s32 counter; sub_8001024(&gUnknown_203B400->unk4); - gUnknown_203B400->unk0 = 0; + gUnknown_203B400->FrameCounter = 0; gUnknown_203B400->TestState = 0; gUnknown_203B400->QuestionCounter = 0; for(counter = 0; counter < NUM_PERSONALITIES; counter++){ @@ -74,52 +134,51 @@ void InitializeTestStats(void) for(counter = 0; counter < NUM_QUIZ_QUESTIONS; counter++){ gUnknown_203B400->QuestionTracker[counter] = 0; } - gUnknown_203B400->unk40 = 0; - gUnknown_203B400->unkb0 = 0; + gUnknown_203B400->playerNature = 0; + gUnknown_203B400->playerGender = 0; } -#ifdef NONMATCHING u8 HandleTestTrackerState(void) { s32 counter; s32 iVar1; - gUnknown_203B400->unk0++; + gUnknown_203B400->FrameCounter++; switch(gUnknown_203B400->TestState) { case 0: - sub_803C870(); + GenerateNewQuestionOrGender(); break; case 1: - sub_803C908(); + CallPromptNewQuestion(); break; case 2: - sub_803C920(); + UpdateNatureTotals(); break; case 3: - sub_803C98C(); + SetPlayerGender(); break; case 4: - sub_803C9D8(); + RevealPersonality(); break; case 5: - sub_803CA54(); + RevealStarter(); break; case 6: sub_803CA8C(); break; case 7: - sub_803CAAC(); + PromptPickPartner(); break; case 8: sub_803CAD4(); break; case 9: - sub_803CAF4(); + CallCreatePartnerSelectionMenu(); break; case 10: - sub_803CB14(); + PromptForPartnerNickname(); break; case 11: sub_803CB5C(); @@ -128,18 +187,17 @@ u8 HandleTestTrackerState(void) sub_803CB7C(); break; case 13: - sub_803CBB0(); + PrintEndIntroText(); break; case 14: sub_803CBE4(); break; case 15: - iVar1 = Random() * gUnknown_203B400->unk0; + iVar1 = Random() * gUnknown_203B400->FrameCounter; sub_8094D28(Random()); - // TODO fix this math.. - for(counter = 0; counter < 13; counter++){ - iVar1 *= (gUnknown_203B400->NatureTotals[counter] + 3); + for(counter = 0; counter < NUM_PERSONALITIES; counter++){ + iVar1 *= (gUnknown_203B400->NatureTotals[counter] + counter + 3); } iVar1 += sub_8094E4C(); @@ -154,146 +212,572 @@ u8 HandleTestTrackerState(void) return 0; } -#else +void DeleteTestTracker(void) +{ + sub_8001044(&gUnknown_203B400->unk4); + MemoryFree(gUnknown_203B400); + gUnknown_203B400 = NULL; +} + +void GenerateNewQuestionOrGender(void) +{ + u8 category; + int counter; + int newQuestion; + + gUnknown_203B400->QuestionCounter++; + if (gUnknown_203B400->QuestionCounter > MAX_ASKED_QUESTIONS) { + // We've asked enough questions + sub_8014248(&gGenderText, 0, 0, &gGenderMenu, 0, 3, 0, 0, 257); + gUnknown_203B400->TestState = 3; + } + else + { + do { + // Generate new question number and make sure we haven't done it + newQuestion = RandomCapped(NUM_QUIZ_QUESTIONS); + gUnknown_203B400->currQuestionIndex = newQuestion; + } while (gUnknown_203B400->QuestionTracker[newQuestion] == 1); + + // Found one so let's get the category + category = gNatureQuestionTable[gUnknown_203B400->currQuestionIndex]; + + // Mark all of the questions in the category as used + for(counter = 0; counter < NUM_QUIZ_QUESTIONS; counter++){ + if (gNatureQuestionTable[counter] == category) + gUnknown_203B400->QuestionTracker[counter] = 1; + } + gUnknown_203B400->TestState = 1; + } +} + +void CallPromptNewQuestion(void) +{ + PromptNewQuestion(); + gUnknown_203B400->TestState = 2; +} + NAKED -u8 HandleTestTrackerState(void) +void UpdateNatureTotals(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" + asm_unified( + "\tpush {r4-r6,lr}\n" + "\tsub sp, 0x4\n" + "\tmov r0, sp\n" + "\tbl sub_80144A4\n" + "\tcmp r0, 0\n" + "\tbne _0803C97C\n" + "\tldr r3, [sp]\n" + "\tcmp r3, 0x63\n" + "\tbne _0803C944\n" + "\tldr r0, _0803C940\n" + "\tldr r1, [r0]\n" + "\tmovs r0, 0x37\n" + "\tstr r0, [r1, 0x3C]\n" + "\tmovs r0, 0x1\n" + "\tb _0803C97A\n" "\t.align 2, 0\n" -"_0803C844: .4byte gUnknown_203B400\n" -"_0803C848:\n" +"_0803C940: .4byte gUnknown_203B400\n" +"_0803C944:\n" + "\tldr r1, _0803C984\n" + "\tldr r2, _0803C988\n" + "\tldr r0, [r2]\n" + "\tldr r0, [r0, 0x3C]\n" + "\tlsls r0, 2\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tldr r4, [r0, 0x8]\n" + "\tlsls r0, r3, 4\n" + "\tadds r4, r0\n" + "\tmovs r3, 0\n" + "\tadds r6, r2, 0\n" + "\tadds r5, r6, 0\n" +"_0803C95E:\n" + "\tldr r1, [r5]\n" + "\tlsls r0, r3, 2\n" + "\tadds r1, 0x44\n" + "\tadds r1, r0\n" + "\tadds r0, r4, r3\n" + "\tldrb r2, [r0]\n" + "\tldr r0, [r1]\n" + "\tadds r0, r2\n" + "\tstr r0, [r1]\n" + "\tadds r3, 0x1\n" + "\tcmp r3, 0xC\n" + "\tble _0803C95E\n" + "\tldr r1, [r6]\n" "\tmovs r0, 0\n" -"_0803C84A:\n" - "\tpop {r4,r5}\n" - "\tpop {r1}\n" - "\tbx r1"); +"_0803C97A:\n" + "\tstr r0, [r1, 0x34]\n" +"_0803C97C:\n" + "\tadd sp, 0x4\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0803C984: .4byte gPersonalityQuestionPointerTable\n" +"_0803C988: .4byte gUnknown_203B400" + ); +} + +void SetPlayerGender(void) +{ + + int gender; + + if (sub_80144A4(&gender) == 0) { + if (gender == MALE) { + gUnknown_203B400->playerGender = MALE; + gUnknown_203B46C->playerGender = MALE; + } + else + { + gUnknown_203B400->playerGender = FEMALE; + gUnknown_203B46C->playerGender = FEMALE; + } + sub_8099690(0); + gUnknown_203B400->TestState = 4; + } +} + +#ifdef NONMATCHING +void RevealPersonality(void) +{ + s32 currentNature; + s32 counter; + + gUnknown_203B400->playerNature = RandomCapped(NUM_PERSONALITIES); + currentNature = gUnknown_203B400->playerNature; + + // 2 Statements flip-flop but is functionaly equivalent + // Struct saving into register and intialize of the counter + for(counter = NUM_PERSONALITIES - 2; counter >= 0; counter--){ + currentNature = currentNature++; + + // Wraparound check + if (currentNature > NUM_PERSONALITIES - 1) { + currentNature = 0; + } + + if (gUnknown_203B400->NatureTotals[currentNature] > gUnknown_203B400->NatureTotals[gUnknown_203B400->playerNature]) { + gUnknown_203B400->playerNature = currentNature; + } + } + gUnknown_203B400->StarterID = gStarters[gUnknown_203B400->playerNature][gUnknown_203B400->playerGender]; + PrintPersonalityTypeDescription(); + gUnknown_203B400->TestState = 5; +} +#else +NAKED +void RevealPersonality(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmovs r0, 0xD\n" + "\tbl RandomCapped\n" + "\tldr r2, _0803CA4C\n" + "\tldr r1, [r2]\n" + "\tadds r1, 0x40\n" + "\tstrb r0, [r1]\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x40\n" + "\tldrb r3, [r0]\n" + "\tadds r7, r2, 0\n" + "\tmovs r5, 0xB\n" +"_0803C9F2:\n" + "\tadds r3, 0x1\n" + "\tcmp r3, 0xC\n" + "\tble _0803C9FA\n" + "\tmovs r3, 0\n" +"_0803C9FA:\n" + "\tldr r0, [r7]\n" + "\tlsls r2, r3, 2\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0x44\n" + "\tadds r2, r1, r2\n" + "\tadds r4, r0, 0\n" + "\tadds r4, 0x40\n" + "\tldrb r0, [r4]\n" + "\tlsls r0, 2\n" + "\tadds r1, r0\n" + "\tldr r2, [r2]\n" + "\tldr r0, [r1]\n" + "\tldr r6, _0803CA4C\n" + "\tcmp r2, r0\n" + "\tble _0803CA1A\n" + "\tstrb r3, [r4]\n" +"_0803CA1A:\n" + "\tsubs r5, 0x1\n" + "\tcmp r5, 0\n" + "\tbge _0803C9F2\n" + "\tldr r3, [r6]\n" + "\tldr r2, _0803CA50\n" + "\tadds r0, r3, 0\n" + "\tadds r0, 0xB0\n" + "\tldr r1, [r0]\n" + "\tlsls r1, 1\n" + "\tsubs r0, 0x70\n" + "\tldrb r0, [r0]\n" + "\tlsls r0, 2\n" + "\tadds r1, r0\n" + "\tadds r1, r2\n" + "\tldrh r0, [r1]\n" + "\tstrh r0, [r3, 0x8]\n" + "\tbl PrintPersonalityTypeDescription\n" + "\tldr r1, [r6]\n" + "\tmovs r0, 0x5\n" + "\tstr r0, [r1, 0x34]\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0803CA4C: .4byte gUnknown_203B400\n" +"_0803CA50: .4byte gStarters"); +} #endif +void RevealStarter(void) +{ + s32 temp; + + if (sub_80144A4(&temp) == 0) { + sub_80141B4(&gStarterReveal,0,0,0x101); + PersonalityTest_DisplayStarterSprite(); + gUnknown_203B400->TestState = 6; + } } -void DeleteTestTracker(void) +void sub_803CA8C(void) { - sub_8001044(&gUnknown_203B400->unk4); - MemoryFree(gUnknown_203B400); - gUnknown_203B400 = NULL; + s32 temp; + + if (sub_80144A4(&temp) == 0) { + gUnknown_203B400->TestState = 7; + } +} + +void PromptPickPartner(void) +{ + sub_80141B4(&gPartnerPrompt, 0, 0, 0x301); + gUnknown_203B400->TestState = 8; +} + +void sub_803CAD4(void) +{ + s32 temp; + + if (sub_80144A4(&temp) == 0) { + gUnknown_203B400->TestState = 9; + } +} + +void CallCreatePartnerSelectionMenu(void) +{ + CreatePartnerSelectionMenu(gUnknown_203B400->StarterID); + gUnknown_203B400->TestState = 10; +} + +void PromptForPartnerNickname(void) +{ + u16 selectedPartner; + + selectedPartner = HandlePartnerSelectionInput(); + if (selectedPartner != 0xffff) + { + if(selectedPartner != 0xfffe) { + sub_803CE6C(); + gUnknown_203B400->PartnerID = selectedPartner; + sub_80141B4(&gPartnerNickPrompt, 0, 0, 0x301); + gUnknown_203B400->TestState = 11; + } + } +} + +void sub_803CB5C(void) +{ + s32 temp; + + if (sub_80144A4(&temp) == 0) { + gUnknown_203B400->TestState = 12; + } +} + +void sub_803CB7C(void) +{ + u32 uVar1; + s32 *iVar2; + + iVar2 = &gUnknown_203B400->unk20; + uVar1 = sub_808D994(gUnknown_203B400->PartnerID); + sub_80922F4(iVar2,uVar1); + sub_801602C(3, &gUnknown_203B400->unk20); + gUnknown_203B400->TestState = 13; +} + +void PrintEndIntroText(void) +{ + if (sub_8016080() != 0) { + sub_80160D8(); + sub_80141B4(&gEndIntroText, 0, 0, 0x301); + gUnknown_203B400->TestState = 14; + } +} + +void sub_803CBE4(void) +{ + s32 temp; + + if (sub_80144A4(&temp) == 0) { + gUnknown_203B400->TestState = 15; + } +} + +NAKED +void PromptNewQuestion(void) +{ + asm_unified( + "\tpush {lr}\n" + "\tsub sp, 0x14\n" + "\tldr r1, _0803CC38\n" + "\tldr r0, _0803CC3C\n" + "\tldr r0, [r0]\n" + "\tldr r0, [r0, 0x3C]\n" + "\tlsls r0, 2\n" + "\tadds r0, r1\n" + "\tldr r1, [r0]\n" + "\tldr r0, [r1]\n" + "\tldr r3, [r1, 0x4]\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp]\n" + "\tmovs r1, 0x3\n" + "\tstr r1, [sp, 0x4]\n" + "\tstr r2, [sp, 0x8]\n" + "\tstr r2, [sp, 0xC]\n" + "\tadds r1, 0xFE\n" + "\tstr r1, [sp, 0x10]\n" + "\tmovs r1, 0\n" + "\tbl sub_8014248\n" + "\tadd sp, 0x14\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0803CC38: .4byte gPersonalityQuestionPointerTable\n" +"_0803CC3C: .4byte gUnknown_203B400" + ); +} + +void PrintPersonalityTypeDescription(void) +{ + sub_808D8BC(&gUnknown_202DF98,gUnknown_203B400->StarterID); + sub_80141B4(gPersonalityTypeDescriptionTable[gUnknown_203B400->playerNature],0, + 0,0x101); +} + +void PersonalityTest_DisplayStarterSprite(void) +{ + s32 starterID; + struct OpenedFile *faceFile; + int palleteIndex; + u8 *r6; + u32 faceIndex; + struct stack_PartnerSprite stackArray; + + starterID = gUnknown_203B400->StarterID; + sub_8006518(&stackArray); + stackArray.data = gUnknown_80F4244; + ResetUnusedInputStruct(); + sub_800641C(&stackArray, 1, 0); + sub_8008C54(1); + sub_80073B8(1); + faceFile = GetDialogueSpriteDataPtr(starterID); + r6 = ((struct FaceData *)(faceFile->data))->unk0[1 + EMOTION_HAPPY]; + faceIndex = EMOTION_HAPPY; + for(palleteIndex = 0; palleteIndex < 16; palleteIndex++){ + SetBGPaletteBufferColorArray(palleteIndex + 224, &((struct FaceData *)(faceFile->data))->unk0[faceIndex][palleteIndex << 2]); + } + sub_800836C(1, r6, 0xe); + CloseFile(faceFile); + sub_80073E0(1); +} + +#ifdef NONMATCHING +void CreatePartnerSelectionMenu(s16 starterID) +{ + s32 starterID_s32; + starterID_s32 = starterID; // force an asr shift.. does lsr without it + + sub_803CEAC(); // creates 203B404 + gUnknown_203B404->StarterID = starterID_s32; + gUnknown_203B404->unk4C = 0; + gUnknown_203B404->unk50 = &gUnknown_203B404->unk54; + + gUnknown_203B404->unk54[0] = gUnknown_80F4290; + gUnknown_203B404->unk54[1] = gUnknown_80F42A8; + gUnknown_203B404->unk54[2] = gUnknown_80F4278; + gUnknown_203B404->unk54[3] = gUnknown_80F4278; + + // TODO this is the problem area + //gUnknown_203B404->unk50[5] = (u32 *) &gUnknown_203B404->sub; // so weird but think they store the substruct + + gUnknown_203B404->sub.unkb4 = 1; + gUnknown_203B404->sub.unkb5 = 0; + gUnknown_203B404->sub.unkb6 = 6; + gUnknown_203B404->sub.unkb7 = 0; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B404->unk54, 1, 1); + sub_8013818(&gUnknown_203B404->unk18, GetValidPartners(), 0xA, gUnknown_203B404->unk4C); + RedrawPartnerSelectionMenu(); + PersonalityTest_DisplayPartnerSprite(); +} +#else +NAKED +void CreatePartnerSelectionMenu(s16 starterID) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r4, r0, 0\n" + "\tlsls r4, 16\n" + "\tasrs r4, 16\n" + "\tbl sub_803CEAC\n" + "\tldr r5, _0803CDB0\n" + "\tldr r0, [r5]\n" + "\tmovs r3, 0\n" + "\tmovs r1, 0\n" + "\tstrh r4, [r0]\n" + "\tstr r1, [r0, 0x4C]\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0x54\n" + "\tstr r1, [r0, 0x50]\n" + "\tldr r0, _0803CDB4\n" + "\tldm r0!, {r2,r4,r6}\n" + "\tstm r1!, {r2,r4,r6}\n" + "\tldm r0!, {r2,r4,r7}\n" + "\tstm r1!, {r2,r4,r7}\n" + "\tldr r1, [r5]\n" + "\tadds r1, 0x6C\n" + "\tldr r0, _0803CDB8\n" + "\tldm r0!, {r2,r6,r7}\n" + "\tstm r1!, {r2,r6,r7}\n" + "\tldm r0!, {r4,r6,r7}\n" + "\tstm r1!, {r4,r6,r7}\n" + "\tldr r1, [r5]\n" + "\tldr r2, _0803CDBC\n" + "\tadds r1, 0x84\n" + "\tadds r0, r2, 0\n" + "\tldm r0!, {r4,r6,r7}\n" + "\tstm r1!, {r4,r6,r7}\n" + "\tldm r0!, {r4,r6,r7}\n" + "\tstm r1!, {r4,r6,r7}\n" + "\tldr r0, [r5]\n" + "\tadds r0, 0x9C\n" + "\tldm r2!, {r1,r4,r6}\n" + "\tstm r0!, {r1,r4,r6}\n" + "\tldm r2!, {r1,r4,r7}\n" + "\tstm r0!, {r1,r4,r7}\n" + "\tldr r0, [r5]\n" + "\tldr r1, [r0, 0x50]\n" + "\tadds r0, 0xB4\n" + "\tstr r0, [r1, 0x14]\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r5]\n" + "\tadds r0, 0xB5\n" + "\tstrb r3, [r0]\n" + "\tldr r0, [r5]\n" + "\tadds r0, 0xB6\n" + "\tmovs r1, 0x6\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r5]\n" + "\tadds r0, 0xB7\n" + "\tstrb r3, [r0]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r5]\n" + "\tadds r0, 0x54\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tldr r4, [r5]\n" + "\tadds r4, 0x18\n" + "\tbl GetValidPartners\n" + "\tadds r1, r0, 0\n" + "\tldr r0, [r5]\n" + "\tldr r3, [r0, 0x4C]\n" + "\tadds r0, r4, 0\n" + "\tmovs r2, 0xA\n" + "\tbl sub_8013818\n" + "\tbl RedrawPartnerSelectionMenu\n" + "\tbl PersonalityTest_DisplayPartnerSprite\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0803CDB0: .4byte gUnknown_203B404\n" +"_0803CDB4: .4byte gUnknown_80F4290\n" +"_0803CDB8: .4byte gUnknown_80F42A8\n" +"_0803CDBC: .4byte gUnknown_80F4278"); +} + +#endif + +u16 HandlePartnerSelectionInput(void) +{ + s32 sVar1; + + sVar1 = gUnknown_203B404->currPartnerSelection; + gUnknown_203B404->unk16 = 0; + if (GetKeyPress(&gUnknown_203B404->unk18) == A_BUTTON) { + sub_80119D4(0); + return gUnknown_203B404->PartnerArray[gUnknown_203B404->currPartnerSelection]; + } + else { + if (sub_80138B8(&gUnknown_203B404->unk18, 1) != '\0') { + RedrawPartnerSelectionMenu(); + } + if (sVar1 != gUnknown_203B404->currPartnerSelection) { + PersonalityTest_DisplayPartnerSprite(); + } + if (gUnknown_203B404->unk16 != '\0') { + return 0xfffe; + } + else { + return 0xffff; + } + } +} + +void sub_803CE34(u8 param_1) +{ + gUnknown_203B404->numPartners = GetValidPartners(); + sub_8013984(&gUnknown_203B404->unk18); + RedrawPartnerSelectionMenu(); + PersonalityTest_DisplayPartnerSprite(); + if (param_1 != 0) { + AddMenuCursorSprite(&gUnknown_203B404->unk18); + } +} + +void sub_803CE6C() +{ + gUnknown_203B404->unk54[gUnknown_203B404->unk4C] = gUnknown_80F4278; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B404->unk54, 1, 1); + sub_803CECC(); // Free 203B404 +} + +void sub_803CEAC(void) +{ + gUnknown_203B404 = MemoryAlloc(sizeof(struct PersonalityStruct_203B404), 8); + nullsub_135(); +} + +void nullsub_135(void) +{ +} + + +void sub_803CECC(void) +{ + if(gUnknown_203B404 != NULL){ + nullsub_135(); + MemoryFree(gUnknown_203B404); + gUnknown_203B404 = NULL; + } } diff --git a/src/pokemon.c b/src/pokemon.c index 1df0542..05a0dff 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8,7 +8,7 @@ extern struct FileArchive gSystemFileArchive; extern const char gUnknown_81075F4; extern struct OpenedFile *gMonsterParametersFile; extern u16 gLevelCurrentPokeId; -extern struct gPokemon gMonsterParameters; +extern struct gPokemon *gMonsterParameters; extern u64 gUnknown_8107544[]; extern u32 gUnknown_810697C; @@ -30,8 +30,7 @@ void LoadMonsterParameters(void) { gUnknown_203B45C = &gUnknown_202F400; gMonsterParametersFile = OpenFileAndGetFileDataPtr(&gUnknown_81075F4, &gSystemFileArchive); - // TODO verify this... other parts imply this is an array - gMonsterParameters.species = gMonsterParametersFile->data; + gMonsterParameters = (struct gPokemon *)gMonsterParametersFile->data; gLevelCurrentPokeId = 0; } |