summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2021-12-27 19:54:14 -0800
committerGitHub <noreply@github.com>2021-12-27 19:54:14 -0800
commit2b45a8c992da0836893bc1a859bfc1d17dff0c0a (patch)
tree0774fc7c5411efb4a883ac331032546244747f57 /src
parent60e74d1ba9827086c7fd31a5702132fda4612813 (diff)
parent2fcf0b0a82e009652d6d158b00420c5da7994c8d (diff)
Merge pull request #221 from hatal175/screenDemo
Work on screenDemo.c
Diffstat (limited to 'src')
-rw-r--r--src/demoScreen.c128
1 files changed, 125 insertions, 3 deletions
diff --git a/src/demoScreen.c b/src/demoScreen.c
index b10bd35f..efc3368d 100644
--- a/src/demoScreen.c
+++ b/src/demoScreen.c
@@ -21,6 +21,10 @@ extern void gUnk_089FD2F4;
extern u8 gUnk_02000006;
+extern u16 gUnk_08127CC8[4];
+extern void* gUnk_08127C98;
+extern u8 gUnk_08A068BF[129];
+
void HandleChooseDemoScreen(void) {
FlushSprites();
demoFunctions[gMain.funcIndex]();
@@ -89,8 +93,126 @@ void sub_080A2F8C(void) {
}
}
-ASM_FUNC("asm/non_matching/demoScreen/sub_080A2FD0.inc", void sub_080A2FD0(void))
+// The condition on the left dpad is very convuluted for some reason (instead oj just an equality check).
+// This causes the entire function heirarchy to change on a whim and I couldn't quite figure out
+// the correct conditions/code to make it like the original function.
+NONMATCH("asm/non_matching/demoScreen/sub_080A2FD0.inc", void sub_080A2FD0(void)) {
+ s32 tmp;
+ u32 tmp2;
+ u32 val;
+ s32 tmp3;
+ u32 unk_0x0;
+ u32 tmp4;
+ s32 tmp5;
+ u32 keys;
-ASM_FUNC("asm/non_matching/demoScreen/sub_080A30AC.inc", void sub_080A30AC(void))
+ if (gFadeControl.active == 0) {
+ val = 0;
+ keys = gInput.heldKeys;
+ switch (keys) {
+ case DPAD_RIGHT: {
+ if (gChooseFileState.unk_0x0 == 0) {
+ val = 1;
+ gChooseFileState.unk_0x20 = 4;
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ }
+ case DPAD_LEFT: {
+ if (gChooseFileState.unk_0x0 == 0) {
+ val = -1;
+ gChooseFileState.unk_0x20 = 0xfc;
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ }
+ case START_BUTTON:
+ case A_BUTTON: {
+ if (gChooseFileState.unk_0x0 == 0) {
+ gMain.screen = 2;
+ gMain.funcIndex = gChooseFileState.unk_0x0;
+ SoundReq(SFX_TEXTBOX_SELECT);
+ }
+ }
+ }
+ tmp = gSaveHeader->saveFileId;
+ tmp2 = val + 3;
+ tmp += tmp2;
+ gSaveHeader->saveFileId = tmp % 3;
-ASM_FUNC("asm/non_matching/demoScreen/sub_080A3198.inc", void sub_080A3198(u32 param_1, u32 param_2))
+ tmp3 = gChooseFileState.unk_0x10;
+
+ tmp = gSaveHeader->saveFileId;
+ tmp *= 0x68;
+
+ if (tmp != tmp3) {
+ tmp5 = gChooseFileState.unk_0x20;
+ tmp5 += tmp3;
+ gChooseFileState.unk_0x10 = (tmp5 + (0x9c << 1)) % (0x9c << 1);
+ unk_0x0 = 1;
+ } else {
+ unk_0x0 = 0;
+ }
+
+ gChooseFileState.unk_0x0 = unk_0x0;
+ sub_080A3198(gSaveHeader->saveFileId, 0);
+ }
+}
+END_NONMATCH
+
+NONMATCH("asm/non_matching/demoScreen/sub_080A30AC.inc", void sub_080A30AC(void)) {
+ u32 unk_0x10;
+ u8* ptr;
+ u8* currentPtr;
+ u32 offset;
+ u32 xoffset;
+ gOamCmd._4 = 0x2000;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0xc00;
+ gOamCmd.y = 0x40;
+ unk_0x10 = gChooseFileState.unk_0x10;
+ gOamCmd.x = 0xFFFFFED8 - unk_0x10;
+ offset = *(u32*)gUnk_08A068BF;
+ ptr = gUnk_08A068BF - 0xc;
+ sub_080ADA04(&gOamCmd, ptr + offset);
+ // FIX: original assembly uses r1 for xoffset for no apparent reason. Could not make it compile to do the same.
+ // Maybe the original code was some sort of loop unrolling.
+ xoffset = -0xc0;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4));
+ xoffset = -0x58;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8));
+ xoffset = 0x10;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(gUnk_08A068BF));
+ xoffset = 0x78;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4));
+ xoffset = 0xe0;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8));
+ xoffset = 0xa4 << 1;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(gUnk_08A068BF));
+ xoffset = 0xd8 << 1;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4));
+ xoffset = 0x86 << 2;
+ gOamCmd.x = xoffset - unk_0x10;
+ sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8));
+}
+END_NONMATCH
+
+void sub_080A3198(u32 param_1, u32 param_2) {
+ u16 r4 = gUnk_08127CC8[param_1];
+
+ if (gChooseFileState.unk_0x12 != r4) {
+ gChooseFileState.unk_0x12 = r4;
+ MemClear(gUnk_08127C98 - 0x1e, 0x180);
+
+ if (r4 != 0) {
+ sub_0805F46C(r4, &gUnk_08127C98);
+ }
+
+ gScreen.bg0.updated = 1;
+ }
+}