mirror of
https://github.com/pret/pmd-red.git
synced 2026-07-16 00:41:24 -05:00
279 lines
7.4 KiB
C
279 lines
7.4 KiB
C
#include "global.h"
|
|
#include "input.h"
|
|
#include "gba/io_reg.h"
|
|
#include "memory.h"
|
|
#include "text.h"
|
|
|
|
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 UnkTextStruct2 *unk38;
|
|
struct UnkTextStruct2 unk3C[3];
|
|
u8 fill84[0x9C - 0x84];
|
|
u8 unk9C;
|
|
/* 0x9D */ u8 currPage_u8;
|
|
u8 unk9E;
|
|
u8 unk9F;
|
|
};
|
|
|
|
extern struct AdventureLog *gAdventureLog;
|
|
|
|
const struct UnkTextStruct2 gUnknown_80E1FF0 = {
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x03, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00,
|
|
0x00, 0x00,
|
|
NULL
|
|
};
|
|
const struct UnkTextStruct2 gUnknown_80E2008 = {
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x06, 0x00, 0x00, 0x00,
|
|
0x02, 0x00, 0x02, 0x00,
|
|
0x1A, 0x04,
|
|
0x06, 0x00,
|
|
NULL
|
|
};
|
|
|
|
// 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";
|
|
|
|
void sub_8032084();
|
|
void DisplayAdventureLog();
|
|
extern void sub_8013818(void *, u32, u32, u32);
|
|
extern bool8 sub_8013938(void *);
|
|
extern void sub_8013660(void *);
|
|
extern void PlayMenuSoundEffect(u32);
|
|
extern u32 GetKeyPress(void *);
|
|
extern bool8 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, const u8 *, u32, u32);
|
|
extern void sub_8008C54(u32);
|
|
extern void sub_80073B8(u32);
|
|
extern void sub_80073E0(u32);
|
|
extern void sub_8012BC4(u32 x, u32 y, u32, u32, u32, u32);
|
|
extern void xxx_format_and_draw(u32, u32, const char *, u32, u32);
|
|
const u8 *GetAdventureLogLine(u8 index);
|
|
extern s32 sub_8013800(void *, s32);
|
|
extern u32 gUnknown_202DE30;
|
|
|
|
u32 CreateAdventureLogScreen(u32 param_1)
|
|
{
|
|
gAdventureLog = MemoryAlloc(sizeof(struct AdventureLog),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)) {
|
|
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].unkE = 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
|
|
|
|
void DisplayAdventureLog(void)
|
|
{
|
|
s32 counter;
|
|
s32 r4; // r4
|
|
s32 r6; // r6
|
|
u8 temp;
|
|
s32 v1, v2, v3, v4, v5, v6;
|
|
|
|
sub_8008C54(gAdventureLog->unk34);
|
|
sub_80073B8(gAdventureLog->unk34);
|
|
r4 = gAdventureLog->currPage * 8;
|
|
r6 = r4;
|
|
r6 += 10;
|
|
// Draw Header
|
|
xxx_call_draw_string(r6, 0, gAdventureLogHeaderText, gAdventureLog->unk34, 0);
|
|
r4 += 4;
|
|
r6 = r4 + gAdventureLog->unk9E * 8;
|
|
// Draw Page #
|
|
sub_8012BC4(r6, 0, gAdventureLog->currPage + 1, 1, 7, gAdventureLog->unk34);
|
|
|
|
for(counter = 0; counter < gAdventureLog->unk1A; counter++)
|
|
{
|
|
temp = gAdventureLog->currPage * gAdventureLog->unk1C + counter;
|
|
if(sub_8097710(temp)){
|
|
switch(temp) {
|
|
case 0xc:
|
|
v1 = sub_80978B8();
|
|
gUnknown_202DE30 = (s16)v1;
|
|
xxx_format_and_draw(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(temp), gAdventureLog->unk34, 0);
|
|
break;
|
|
case 7:
|
|
v2 = sub_8097880();
|
|
gUnknown_202DE30 = (s16)v2;
|
|
xxx_format_and_draw(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(temp), gAdventureLog->unk34, 0);
|
|
break;
|
|
case 0xb:
|
|
v3 = sub_8097838();
|
|
gUnknown_202DE30 = (s16)v3;
|
|
xxx_format_and_draw(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(temp), gAdventureLog->unk34, 0);
|
|
break;
|
|
case 8:
|
|
v4 = sub_80977B8();
|
|
gUnknown_202DE30 = v4;
|
|
xxx_format_and_draw(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(temp), gAdventureLog->unk34, 0);
|
|
break;
|
|
case 9:
|
|
v5 = sub_80977F8();
|
|
gUnknown_202DE30 = v5;
|
|
xxx_format_and_draw(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(temp), gAdventureLog->unk34, 0);
|
|
break;
|
|
case 10:
|
|
v6 = sub_8097870();
|
|
gUnknown_202DE30 = (s16)v6;
|
|
// fallthrough
|
|
default:
|
|
xxx_format_and_draw(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(temp), gAdventureLog->unk34, 0);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Draw the ?????????? across the row
|
|
xxx_call_draw_string(8, sub_8013800(gAdventureLog, counter), gUnknown_80E2030, gAdventureLog->unk34, 0);
|
|
}
|
|
}
|
|
sub_80073E0(gAdventureLog->unk34);
|
|
}
|