summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-02-19 16:01:53 -0800
committerGitHub <noreply@github.com>2021-02-19 18:01:53 -0600
commitc754c2a0466d8394c7ffcb3a515199d5703e47be (patch)
tree42463d69e3642a4ada17614cac4653a02dac9338 /src
parent8dfd044ef3a6ea8da204265b4560716aa67391d1 (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.c17
-rw-r--r--src/code_8048480.c6
-rw-r--r--src/event_flag.c6
-rw-r--r--src/main_menu.c8
-rw-r--r--src/personality_test.c52
-rw-r--r--src/personality_test_pre.c866
-rw-r--r--src/pokemon.c5
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;
}