summaryrefslogtreecommitdiff
path: root/src/adventure_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/adventure_log.c')
-rw-r--r--src/adventure_log.c425
1 files changed, 425 insertions, 0 deletions
diff --git a/src/adventure_log.c b/src/adventure_log.c
new file mode 100644
index 0000000..2a02840
--- /dev/null
+++ b/src/adventure_log.c
@@ -0,0 +1,425 @@
+#include "global.h"
+#include "input.h"
+#include "gba/io_reg.h"
+
+struct unkData
+{
+ u8 unk0[14];
+ u16 unkD;
+ u16 unk10;
+ u16 unk12;
+ u8 *unk14;
+};
+
+struct AdventureLog
+{
+ // size: 0xA0
+ u8 fill0[0x1A];
+ /* 0x1A */ s16 unk1A;
+ /* 0x1C */ s16 unk1C;
+ /* 0x1E */ s16 currPage;
+ u16 unk20;
+ u8 fill22[0x34 - 0x22];
+ u32 unk34;
+ struct unkData *unk38;
+ struct unkData unk3C[3];
+ u8 fill84[0x9C - 0x84];
+ u8 unk9C;
+ /* 0x9D */ u8 currPage_u8;
+ u8 unk9E;
+ u8 unk9F;
+};
+
+extern struct AdventureLog *gAdventureLog;
+extern struct unkData gUnknown_80E2008;
+extern struct unkData gUnknown_80E1FF0;
+
+// Adventure Log Text
+const u8 gAdventureLogHeaderText[] = "Adventure Log";
+const u8 gUnknown_80E2030[] = "~95~95~95~95~95~95~95~95~95~95~95~95~95~95~95 "; // string of ???????
+const u8 fill_adven[] = "pksdir0";
+
+extern void *MemoryAlloc(u32, u32);
+extern void MemoryFree(void *);
+extern void sub_8006518(struct unkData *);
+extern void sub_800641C(void *, u32, u32);
+extern void sub_8032084();
+extern void DisplayAdventureLog();
+extern void sub_8013818(void *, u32, u32, u32);
+extern u8 sub_8013938(void *);
+extern void sub_8013660(void *);
+extern void PlayMenuSoundEffect(u32);
+extern u32 GetKeyPress(void *);
+extern u8 sub_8097710(u8);
+
+extern s16 sub_80978B8();
+extern s16 sub_8097880();
+extern s16 sub_8097838();
+extern s16 sub_8097870();
+extern s32 sub_80977B8();
+extern s32 sub_80977F8();
+extern void xxx_call_draw_string(s32, u32, u32 *, u32, u32);
+extern u32 gUnknown_202DE30;
+
+u32 CreateAdventureLogScreen(u32 param_1)
+{
+ gAdventureLog = MemoryAlloc(0xa0,8);
+ gAdventureLog->unk34 = param_1;
+ gAdventureLog->unk38 = &gAdventureLog->unk3C[param_1];
+ sub_8006518(gAdventureLog->unk3C);
+ gAdventureLog->unk3C[gAdventureLog->unk34] = gUnknown_80E2008;
+ gAdventureLog->unk38->unk14 = &gAdventureLog->unk9C;
+
+ ResetUnusedInputStruct();
+ sub_800641C(gAdventureLog->unk3C,1,1);
+ sub_8013818(gAdventureLog,0x20,8,param_1);
+ sub_8032084();
+ DisplayAdventureLog();
+ return 1;
+}
+
+u32 HandleAdventureLogInput(u8 param_1)
+{
+ if (param_1 == 0) {
+ sub_8013660(gAdventureLog);
+ return 0;
+ }
+ else {
+ switch(GetKeyPress(gAdventureLog))
+ {
+ case B_BUTTON:
+ PlayMenuSoundEffect(1);
+ return 2;
+ case A_BUTTON:
+ PlayMenuSoundEffect(0);
+ return 3;
+ default:
+ if (sub_8013938(gAdventureLog) != '\0') {
+ sub_8032084();
+ DisplayAdventureLog();
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+ }
+}
+
+void CleanAdventureLogScreen(void)
+{
+ if (gAdventureLog != NULL) {
+ gAdventureLog->unk3C[gAdventureLog->unk34] = gUnknown_80E1FF0;
+ ResetUnusedInputStruct();
+ sub_800641C(gAdventureLog->unk3C,1,1);
+ MemoryFree(gAdventureLog);
+ gAdventureLog = 0;
+ }
+}
+
+
+#ifdef NONMATCHING
+void sub_8032084(void)
+{
+ u32 sVar2;
+
+ gAdventureLog->unk9C = gAdventureLog->unk20;
+ gAdventureLog->currPage_u8 = gAdventureLog->currPage;
+ gAdventureLog->unk9E = 0xb;
+ gAdventureLog->unk9F = 0;
+ // So a sign extend..
+ sVar2 = sub_80095E4(gAdventureLog->unk1A,0xc) + 2 << 0x10;
+ // TODO needs asr r3, r0, r16
+ // and lsr r0, r0, r16
+ gAdventureLog->unk3C[gAdventureLog->unk34].unkD = sVar2;
+ // Good past here except regs for this store
+ gAdventureLog->unk3C[gAdventureLog->unk34].unk10 = sVar2 + 2;
+ ResetUnusedInputStruct();
+ sub_800641C(gAdventureLog->unk3C,1,1);
+}
+#else
+NAKED
+void sub_8032084(void)
+{
+ asm_unified("\tpush {r4,lr}\n"
+ "\tldr r4, _080320F4\n"
+ "\tldr r0, [r4]\n"
+ "\tldrh r1, [r0, 0x20]\n"
+ "\tadds r0, 0x9C\n"
+ "\tmovs r2, 0\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tldrh r1, [r0, 0x1E]\n"
+ "\tadds r0, 0x9D\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x9E\n"
+ "\tmovs r1, 0xB\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x9F\n"
+ "\tstrb r2, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tmovs r1, 0x1A\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tmovs r1, 0xC\n"
+ "\tbl sub_80095E4\n"
+ "\tadds r0, 0x2\n"
+ "\tlsls r0, 16\n"
+ "\tldr r2, [r4]\n"
+ "\tldr r3, [r2, 0x34]\n"
+ "\tlsls r1, r3, 1\n"
+ "\tadds r1, r3\n"
+ "\tlsls r1, 3\n"
+ "\tadds r1, r2, r1\n"
+ "\tadds r1, 0x4A\n"
+ "\tasrs r3, r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r1, [r2, 0x34]\n"
+ "\tlsls r0, r1, 1\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 3\n"
+ "\tadds r2, r0\n"
+ "\tadds r3, 0x2\n"
+ "\tadds r2, 0x4C\n"
+ "\tstrh r3, [r2]\n"
+ "\tbl ResetUnusedInputStruct\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x3C\n"
+ "\tmovs r1, 0x1\n"
+ "\tmovs r2, 0x1\n"
+ "\tbl sub_800641C\n"
+ "\tpop {r4}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_080320F4: .4byte gAdventureLog");
+}
+#endif
+
+// Uses 1 too many regs
+#ifdef NONMATCHING
+void DisplayAdventureLog(void)
+{
+ s32 counter;
+ s32 iVar5;
+ u32 uVar6;
+ u8 temp;
+
+ sub_8008C54(gAdventureLog->unk34);
+ sub_80073B8(gAdventureLog->unk34);
+ iVar5 = gAdventureLog->currPage * 8;
+ iVar5 += 10;
+ // Draw Header
+ xxx_call_draw_string(iVar5, 0, &gAdventureLogHeaderText, gAdventureLog->unk34, 0);
+ iVar5 += 4;
+ iVar5 += gAdventureLog->unk9E * 8;
+ // Draw Page #
+ sub_8012BC4(iVar5, 0, gAdventureLog->currPage + 1, 1, 7, gAdventureLog->unk34);
+ counter = 0;
+ do {
+ uVar6 = gAdventureLog->currPage * gAdventureLog->unk1C + counter;
+ temp = uVar6; // Having another var in middle gets close (does a u8 cast)
+ if(sub_8097710(temp) != 0){
+ switch(temp) {
+ case 0xc:
+ gUnknown_202DE30 = sub_80978B8();
+ break;
+ case 7:
+ gUnknown_202DE30 = sub_8097880();
+ break;
+ case 0xb:
+ gUnknown_202DE30 = sub_8097838();
+ break;
+ case 8:
+ gUnknown_202DE30 = sub_80977B8();
+ break;
+ case 9:
+ gUnknown_202DE30 = sub_80977F8();
+ break;
+ case 10:
+ gUnknown_202DE30 = sub_8097870();
+ break;
+ default:
+ break;
+ }
+ sub_8014FF0(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(uVar6), gAdventureLog->unk34, 0);
+ }
+ else
+ {
+ // Draw the ?????????? across the row
+ xxx_call_draw_string(8, sub_8013800(gAdventureLog, counter), &gUnknown_80E2030, gAdventureLog->unk34, 0);
+ }
+ counter++;
+ } while(counter < gAdventureLog->unk1A);
+ sub_80073E0(gAdventureLog->unk34);
+}
+#else
+NAKED
+void DisplayAdventureLog(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tsub sp, 0x8\n"
+ "\tldr r5, _08032158\n"
+ "\tldr r0, [r5]\n"
+ "\tldr r0, [r0, 0x34]\n"
+ "\tbl sub_8008C54\n"
+ "\tldr r0, [r5]\n"
+ "\tldr r0, [r0, 0x34]\n"
+ "\tbl sub_80073B8\n"
+ "\tldr r0, [r5]\n"
+ "\tmovs r1, 0x1E\n"
+ "\tldrsh r4, [r0, r1]\n"
+ "\tlsls r4, 3\n"
+ "\tadds r6, r4, 0\n"
+ "\tadds r6, 0xA\n"
+ "\tldr r2, _0803215C\n"
+ "\tldr r3, [r0, 0x34]\n"
+ "\tmovs r0, 0\n"
+ "\tstr r0, [sp]\n"
+ "\tadds r0, r6, 0\n"
+ "\tmovs r1, 0\n"
+ "\tbl xxx_call_draw_string\n"
+ "\tadds r4, 0x4\n"
+ "\tldr r1, [r5]\n"
+ "\tadds r0, r1, 0\n"
+ "\tadds r0, 0x9E\n"
+ "\tldrb r0, [r0]\n"
+ "\tlsls r0, 3\n"
+ "\tadds r6, r4, r0\n"
+ "\tmovs r0, 0x1E\n"
+ "\tldrsh r2, [r1, r0]\n"
+ "\tadds r2, 0x1\n"
+ "\tmovs r0, 0x7\n"
+ "\tstr r0, [sp]\n"
+ "\tldr r0, [r1, 0x34]\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tadds r0, r6, 0\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r3, 0x1\n"
+ "\tbl sub_8012BC4\n"
+ "\tmovs r7, 0\n"
+ "\tldr r0, [r5]\n"
+ "\tb _0803223A\n"
+ "\t.align 2, 0\n"
+"_08032158: .4byte gAdventureLog\n"
+"_0803215C: .4byte gAdventureLogHeaderText\n"
+"_08032160:\n"
+ "\tldr r5, _08032194\n"
+ "\tldr r0, [r5]\n"
+ "\tmovs r2, 0x1E\n"
+ "\tldrsh r1, [r0, r2]\n"
+ "\tmovs r2, 0x1C\n"
+ "\tldrsh r0, [r0, r2]\n"
+ "\tmuls r0, r1\n"
+ "\tadds r0, r7\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r6, r0, 24\n"
+ "\tadds r0, r6, 0\n"
+ "\tbl sub_8097710\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tcmp r4, 0\n"
+ "\tbeq _0803221C\n"
+ "\tsubs r0, r6, 0x7\n"
+ "\tcmp r0, 0x5\n"
+ "\tbhi _080321EC\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, _08032198\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.align 2, 0\n"
+"_08032194: .4byte gAdventureLog\n"
+"_08032198: .4byte _0803219C\n"
+ "\t.align 2, 0\n"
+"_0803219C:\n"
+ "\t.4byte _080321BA\n"
+ "\t.4byte _080321C6\n"
+ "\t.4byte _080321D4\n"
+ "\t.4byte _080321E0\n"
+ "\t.4byte _080321C0\n"
+ "\t.4byte _080321B4\n"
+"_080321B4:\n"
+ "\tbl sub_80978B8\n"
+ "\tb _080321E4\n"
+"_080321BA:\n"
+ "\tbl sub_8097880\n"
+ "\tb _080321E4\n"
+"_080321C0:\n"
+ "\tbl sub_8097838\n"
+ "\tb _080321E4\n"
+"_080321C6:\n"
+ "\tbl sub_80977B8\n"
+ "\tldr r1, _080321D0\n"
+ "\tb _080321EA\n"
+ "\t.align 2, 0\n"
+"_080321D0: .4byte gUnknown_202DE30\n"
+"_080321D4:\n"
+ "\tbl sub_80977F8\n"
+ "\tldr r1, _080321DC\n"
+ "\tb _080321EA\n"
+ "\t.align 2, 0\n"
+"_080321DC: .4byte gUnknown_202DE30\n"
+"_080321E0:\n"
+ "\tbl sub_8097870\n"
+"_080321E4:\n"
+ "\tldr r1, _08032214\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r0, 16\n"
+"_080321EA:\n"
+ "\tstr r0, [r1]\n"
+"_080321EC:\n"
+ "\tldr r4, _08032218\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r1, r7, 0\n"
+ "\tbl sub_8013800\n"
+ "\tadds r5, r0, 0\n"
+ "\tadds r0, r6, 0\n"
+ "\tbl GetAdventureLogLine\n"
+ "\tadds r2, r0, 0\n"
+ "\tldr r0, [r4]\n"
+ "\tldr r3, [r0, 0x34]\n"
+ "\tmovs r0, 0\n"
+ "\tstr r0, [sp]\n"
+ "\tmovs r0, 0x8\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_8014FF0\n"
+ "\tb _08032234\n"
+ "\t.align 2, 0\n"
+"_08032214: .4byte gUnknown_202DE30\n"
+"_08032218: .4byte gAdventureLog\n"
+"_0803221C:\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r1, r7, 0\n"
+ "\tbl sub_8013800\n"
+ "\tadds r1, r0, 0\n"
+ "\tldr r2, _08032254\n"
+ "\tldr r0, [r5]\n"
+ "\tldr r3, [r0, 0x34]\n"
+ "\tstr r4, [sp]\n"
+ "\tmovs r0, 0x8\n"
+ "\tbl xxx_call_draw_string\n"
+"_08032234:\n"
+ "\tadds r7, 0x1\n"
+ "\tldr r0, _08032258\n"
+ "\tldr r0, [r0]\n"
+"_0803223A:\n"
+ "\tmovs r1, 0x1A\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tcmp r7, r0\n"
+ "\tblt _08032160\n"
+ "\tldr r0, _08032258\n"
+ "\tldr r0, [r0]\n"
+ "\tldr r0, [r0, 0x34]\n"
+ "\tbl sub_80073E0\n"
+ "\tadd sp, 0x8\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_08032254: .4byte gUnknown_80E2030\n"
+"_08032258: .4byte gAdventureLog");
+}
+#endif