summaryrefslogtreecommitdiff
path: root/src/personality_test.c
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-03-23 12:11:10 -0500
committerGitHub <noreply@github.com>2021-03-23 12:11:10 -0500
commit2fd4f339b42c010191c199772b09ac34c580de94 (patch)
treee562899f35861ece70c292602fe6aac2f50906bf /src/personality_test.c
parent7b142311a7294c4c7a943870fa5f24f0fbea604a (diff)
Miscellaneous Work (Again) (#31)
* move some personality data from asm to C * combine personality_test files and add my close attempt at RedrawPartnerSelectionMenu * decomp some more wonder mail funcs and label some more data * lots of data splitting and move some to src * split out more dungeon data * continue splitting out more dungeon data * doc rescue team rank/pts funcs/data and exclusive pokemon ewram * doc more sound things and decomp a func * decomp LoadTeamRankBadge and label some data members * split out rescue team and text util stuff * forgot a constant * match a few funcs and clean up a few * cleaned up sub_80A28B4
Diffstat (limited to 'src/personality_test.c')
-rw-r--r--src/personality_test.c978
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];
-}