diff options
Diffstat (limited to 'src/personality_test.c')
-rw-r--r-- | src/personality_test.c | 978 |
1 files changed, 947 insertions, 31 deletions
diff --git a/src/personality_test.c b/src/personality_test.c index 41fbfed..3f5bfa6 100644 --- a/src/personality_test.c +++ b/src/personality_test.c @@ -1,15 +1,151 @@ #include "global.h" +#include "personality_test.h" #include "constants/emotions.h" #include "constants/species.h" -#include "personality_test.h" +#include "random.h" +#include "file_system.h" #include "pokemon.h" +#include "input.h" +#include "save.h" + +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 sub_8094E4C(void); +extern void sub_8094D28(s32); +extern void sub_8001044(u32 *); + +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 char* GetMonSpecies(u32); +extern void CopyStringtoBuffer(char *r0, char *r1); +extern void sub_801602C(u32, char *r0); + +extern u32 sub_8016080(void); +extern void sub_80160D8(void); +extern void sub_8099690(u32); +extern void CopySpeciesNametoBuffer(char *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 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 PlayMenuSoundEffect(u32); + + +extern void sub_8013984(struct UnkInputStruct **r0); +u32 sub_8013800(struct UnkInputStruct **r0, u32); +extern void AddMenuCursorSprite(struct UnkInputStruct **r0); +extern void xxx_call_draw_string(u32 size, u32, const char *text, u32, u32); +extern u32 sub_80095E4(s16, u32); + + +struct PersonalityAnswer +{ + const char * text; + int effect; +}; + +struct PersonalityQuestion +{ + const char * question; + const struct PersonalityAnswer * answers; + const u8 (*effects[16]); +}; + +extern struct PersonalityQuestion *gPersonalityQuestionPointerTable[NUM_QUIZ_QUESTIONS]; + +struct UnkSaveStruct1 +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; + /* 0x8 */ u16 unk8; + /* 0xA */ u8 unkA; + /* 0xB */ u8 playerGender; +}; +extern struct UnkSaveStruct1 *gUnknown_203B46C; + +struct stack_PartnerSprite +{ + // size: 0x60 + u32 unk0; + u8 padding[0x18 - 4]; + struct unkData data; + u32 padding2[12]; +}; + +extern const char gStarterReveal[]; +extern const char gPartnerPrompt[]; +extern const char gPartnerNickPrompt[]; +extern const char gGenderText[]; +extern const char gEndIntroText[]; +extern u32 gGenderMenu; +extern const char gUnknown_80F42C0; + +extern u8 gNatureQuestionTable[NUM_QUIZ_QUESTIONS]; +extern char gAvailablePokemonNames[0x50]; + +extern const char gHardyDescription[]; +extern const char gDocileDescription[]; +extern const char gBraveDescription[]; +extern const char gJollyDescription[]; +extern const char gImpishDescription[]; +extern const char gNaiveDescription[]; +extern const char gTimidDescription[]; +extern const char gHastyDescription[]; +extern const char gSassyDescription[]; +extern const char gCalmDescription[]; +extern const char gRelaxedDescription[]; +extern const char gLonelyDescription[]; +extern const char gQuirkyDescription[]; + + +const char * const gEndIntroTextPtr = gEndIntroText; + +const char * const gPersonalityTypeDescriptionTable[NUM_PERSONALITIES] = +{ + gHardyDescription, + gDocileDescription, + gBraveDescription, + gJollyDescription, + gImpishDescription, + gNaiveDescription, + gTimidDescription, + gHastyDescription, + gSassyDescription, + gCalmDescription, + gRelaxedDescription, + gLonelyDescription, + gQuirkyDescription +}; + +#include "data/nature_description.h" + +struct unkData gUnknown_80F4244 = +{ + 0, 0, + 5, 0, + 0xC, 6, + 5, 5, + 5,0, + 0, 0 +}; + +const char filler[] = "pksdir0"; // CHUNSOFT inserted for aligning data const s16 gPartners[NUM_PARTNERS] = { @@ -25,16 +161,816 @@ const s16 gPartners[NUM_PARTNERS] = SPECIES_MUDKIP }; -extern u8 gUnknown_80F42D0[]; -extern u8 gUnknown_80F42F0[]; -extern u8 gUnknown_203B408; +const struct unkData gUnknown_80F4278 = +{ + 0x00, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00 +}; + +const struct unkData gUnknown_80F4290 = +{ + 0x00, 0x00, + 0x06, 0x00, + 0x02, 0x02, + 0x09, 0x0B, + 0x0D, 0x00, + 0x00, 0x00 +}; -// Definitely wrong but need to figure out better structure later -struct FaceData +const struct unkData gUnknown_80F42A8 = { - /* 0x0 */ u8 *unk0[5]; + 0x00, 0x00, + 0x05, 0x00, + 0x0E, 0x04, + 0x05, 0x05, + 0x05, 0x00, + 0x00, 0x00 }; + + +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->FrameCounter = 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->playerNature = 0; + gUnknown_203B400->playerGender = 0; +} + +u8 HandleTestTrackerState(void) +{ + s32 counter; + + s32 iVar1; + + gUnknown_203B400->FrameCounter++; + switch(gUnknown_203B400->TestState) + { + case 0: + GenerateNewQuestionOrGender(); + break; + case 1: + CallPromptNewQuestion(); + break; + case 2: + UpdateNatureTotals(); + break; + case 3: + SetPlayerGender(); + break; + case 4: + RevealPersonality(); + break; + case 5: + RevealStarter(); + break; + case 6: + sub_803CA8C(); + break; + case 7: + PromptPickPartner(); + break; + case 8: + sub_803CAD4(); + break; + case 9: + CallCreatePartnerSelectionMenu(); + break; + case 10: + PromptForPartnerNickname(); + break; + case 11: + sub_803CB5C(); + break; + case 12: + sub_803CB7C(); + break; + case 13: + PrintEndIntroText(); + break; + case 14: + sub_803CBE4(); + break; + case 15: + iVar1 = Random() * gUnknown_203B400->FrameCounter; + sub_8094D28(Random()); + + for(counter = 0; counter < NUM_PERSONALITIES; counter++){ + iVar1 *= (gUnknown_203B400->NatureTotals[counter] + counter + 3); + } + + iVar1 += sub_8094E4C(); + while (iVar1 == -1) { + iVar1 += sub_8094E4C(); + } + sub_8011C40(iVar1); + return 3; + default: + break; + } + return 0; +} + +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 +void UpdateNatureTotals(void) +{ + 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" +"_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" +"_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 sub_803CA8C(void) +{ + 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) +{ + + CopyStringtoBuffer(gUnknown_203B400->PartnerNick, GetMonSpecies(gUnknown_203B400->PartnerID)); + sub_801602C(3, gUnknown_203B400->PartnerNick); + 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; + } +} + +void PromptNewQuestion(void) +{ + sub_8014248(gPersonalityQuestionPointerTable[gUnknown_203B400->currQuestionIndex]->question, + 0, 0, + (void *)gPersonalityQuestionPointerTable[gUnknown_203B400->currQuestionIndex]->answers, + 0, 3, 0, 0, 0x101); +} + +void PrintPersonalityTypeDescription(void) +{ + CopySpeciesNametoBuffer(gAvailablePokemonNames, 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) { + PlayMenuSoundEffect(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 -2; + } + else { + return -1; + } + } +} + +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; + } +} + +#ifdef NONMATCHING +void RedrawPartnerSelectionMenu(void) +{ + s32 sVar1; + u32 uVar2; + const char *monName; + s32 monCounter; + + sVar1 = sub_80095E4(gUnknown_203B404->unk32, 0xc); + + // Have a feeling this is some graphical thing but + // still not sure structure so it's not matching yet bc of that + // and some casting stuff + sVar1 += 2; + sVar1 <<= 16; + gUnknown_203B404->unk54[gUnknown_203B404->unk4C].unk0[7] = sVar1; + gUnknown_203B404->unk54[gUnknown_203B404->unk4C].unk0[8] = sVar1 + 2; + + // Everything after this matches + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B404->unk54,1,1); + sub_8008C54(gUnknown_203B404->unk4C); + sub_80073B8(gUnknown_203B404->unk4C); + xxx_call_draw_string(0xc, 0, &gUnknown_80F42C0, gUnknown_203B404->unk4C, 0); + + monCounter = 0; + while (monCounter < gUnknown_203B404->unk32) { + uVar2 = sub_8013800(&gUnknown_203B404->unk18, monCounter); + monName = GetMonSpecies(gUnknown_203B404->PartnerArray[monCounter]); + xxx_call_draw_string(8, uVar2, monName, gUnknown_203B404->unk4C, 0); + monCounter++; + } + sub_80073E0(gUnknown_203B404->unk4C); + gUnknown_203B404->unk16 = 1; +} +#else +NAKED +void RedrawPartnerSelectionMenu(void) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tsub sp, 0x4\n" + "\tldr r6, _0803CF60\n" + "\tldr r0, [r6]\n" + "\tmovs r1, 0x32\n" + "\tldrsh r0, [r0, r1]\n" + "\tmovs r1, 0xC\n" + "\tbl sub_80095E4\n" + "\tadds r0, 0x2\n" + "\tlsls r0, 16\n" + "\tldr r2, [r6]\n" + "\tldr r3, [r2, 0x4C]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x62\n" + "\tmovs r4, 0\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x4C]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x64\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x54\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tldr r0, [r6]\n" + "\tldr r0, [r0, 0x4C]\n" + "\tbl sub_8008C54\n" + "\tldr r0, [r6]\n" + "\tldr r0, [r0, 0x4C]\n" + "\tbl sub_80073B8\n" + "\tldr r2, _0803CF64\n" + "\tldr r0, [r6]\n" + "\tldr r3, [r0, 0x4C]\n" + "\tstr r4, [sp]\n" + "\tmovs r0, 0xC\n" + "\tmovs r1, 0\n" + "\tbl xxx_call_draw_string\n" + "\tmovs r5, 0\n" + "\tb _0803CF98\n" + "\t.align 2, 0\n" +"_0803CF60: .4byte gUnknown_203B404\n" +"_0803CF64: .4byte gUnknown_80F42C0\n" +"_0803CF68:\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x18\n" + "\tadds r1, r5, 0\n" + "\tbl sub_8013800\n" + "\tadds r4, r0, 0\n" + "\tldr r0, [r6]\n" + "\tlsls r1, r5, 1\n" + "\tadds r0, 0x2\n" + "\tadds r0, r1\n" + "\tmovs r1, 0\n" + "\tldrsh r0, [r0, r1]\n" + "\tbl GetMonSpecies\n" + "\tadds r2, r0, 0\n" + "\tldr r0, [r6]\n" + "\tldr r3, [r0, 0x4C]\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp]\n" + "\tmovs r0, 0x8\n" + "\tadds r1, r4, 0\n" + "\tbl xxx_call_draw_string\n" + "\tadds r5, 0x1\n" +"_0803CF98:\n" + "\tldr r0, [r6]\n" + "\tmovs r1, 0x32\n" + "\tldrsh r0, [r0, r1]\n" + "\tcmp r5, r0\n" + "\tblt _0803CF68\n" + "\tldr r4, _0803CFBC\n" + "\tldr r0, [r4]\n" + "\tldr r0, [r0, 0x4C]\n" + "\tbl sub_80073E0\n" + "\tldr r1, [r4]\n" + "\tmovs r0, 0x1\n" + "\tstrb r0, [r1, 0x16]\n" + "\tadd sp, 0x4\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0803CFBC: .4byte gUnknown_203B404"); +} +#endif + void PersonalityTest_DisplayPartnerSprite(void) { s32 partnerID; @@ -67,12 +1003,12 @@ s32 GetValidPartners(void) s32 CurrentPartnerID; ValidPartnerCounter = 0; - PlayerType[0] = GetPokemonType(gUnknown_203B404->StarterID,0); - PlayerType[1] = GetPokemonType(gUnknown_203B404->StarterID,1); + PlayerType[0] = GetPokemonType(gUnknown_203B404->StarterID, 0); + PlayerType[1] = GetPokemonType(gUnknown_203B404->StarterID, 1); for(counter = 0; counter < NUM_PARTNERS; counter++){ CurrentPartnerID = gPartners[counter]; - currentPartnerTypes[0] = GetPokemonType(CurrentPartnerID,0); - currentPartnerTypes[1] = GetPokemonType(CurrentPartnerID,1); + currentPartnerTypes[0] = GetPokemonType(CurrentPartnerID, 0); + currentPartnerTypes[1] = GetPokemonType(CurrentPartnerID, 1); if (((currentPartnerTypes[0] == '\0') || ((currentPartnerTypes[0] != PlayerType[0] && (currentPartnerTypes[0] != PlayerType[1])))) && ((currentPartnerTypes[1] == '\0' || ((currentPartnerTypes[1] != PlayerType[0] && (currentPartnerTypes[1] != PlayerType[1]))) ))) { @@ -82,23 +1018,3 @@ s32 GetValidPartners(void) } return ValidPartnerCounter; } - -u8 sub_803D0D8() -{ - return gUnknown_203B408; -} - -void sub_803D0E4(u8 r0) -{ - gUnknown_203B408 = r0; -} - -u8 sub_803D0F0(u8 r0) -{ - return gUnknown_80F42F0[r0]; -} - -u8 sub_803D100(u8 r0) -{ - return gUnknown_80F42D0[r0]; -} |