summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2022-04-06 21:33:32 -0700
committerGitHub <noreply@github.com>2022-04-06 21:33:32 -0700
commitd71929c323af4457c657191e52f8a2abd2175d5d (patch)
treeac311861ed8868b3916e600fe988f6b7a0124f5e /src
parent55213bc9a4fd54716c67c40554b2f4a010c6cfdf (diff)
parent6b44daa6c084f20c637b3b667477e48cc05a6abb (diff)
Merge pull request #486 from hatal175/subtask3
Decompile some subtask2 functions
Diffstat (limited to 'src')
-rw-r--r--src/fileselect.c1
-rw-r--r--src/game.c3
-rw-r--r--src/interrupts.c1
-rw-r--r--src/menu/figurine_menu.c1
-rw-r--r--src/menu/kinstone_menu.c2
-rw-r--r--src/menu/pause_menu.c1
-rw-r--r--src/message.c3
-rw-r--r--src/script.c5
-rw-r--r--src/subtask2.c362
9 files changed, 356 insertions, 23 deletions
diff --git a/src/fileselect.c b/src/fileselect.c
index b0ce954b..2281d90f 100644
--- a/src/fileselect.c
+++ b/src/fileselect.c
@@ -16,6 +16,7 @@
#include "subtask.h"
#include "item.h"
#include "game.h"
+#include "ui.h"
// copy, erase, start
#define NUM_FILE_OPERATIONS 3
diff --git a/src/game.c b/src/game.c
index 781f1acf..d34760cb 100644
--- a/src/game.c
+++ b/src/game.c
@@ -32,6 +32,7 @@
#include "player.h"
#include "transitions.h"
#include "roomid.h"
+#include "ui.h"
// Game task
@@ -100,7 +101,6 @@ extern void sub_080185F8(void);
extern void UpdateDoorTransition(void);
extern bool32 CheckInitPortal(void);
extern void UpdateCarriedObject(void);
-extern void DrawUI(void);
extern void CollisionMain(void);
extern void sub_0805BB74(s32);
extern void CreateZeldaFollower(void);
@@ -112,7 +112,6 @@ extern void UpdateScroll(void);
extern void UpdateBgAnimations(void);
extern void CleanUpGFXSlots(void);
extern void sub_080ADE24(void);
-extern void InitUI(bool32);
extern void sub_0801AE44(u32);
extern void GenerateAreaHint(void);
extern void ForceSetPlayerState(u32);
diff --git a/src/interrupts.c b/src/interrupts.c
index 0477426a..e9d6e7e9 100644
--- a/src/interrupts.c
+++ b/src/interrupts.c
@@ -9,6 +9,7 @@
#include "screen.h"
#include "gba/m4a.h"
#include "object.h"
+#include "ui.h"
extern u8 gUnk_03003DE0;
extern u8 gUnk_03000C30;
diff --git a/src/menu/figurine_menu.c b/src/menu/figurine_menu.c
index 1c9f6557..cd155de2 100644
--- a/src/menu/figurine_menu.c
+++ b/src/menu/figurine_menu.c
@@ -11,6 +11,7 @@
#include "game.h"
#include "functions.h"
#include "message.h"
+#include "ui.h"
extern const struct {
u8 filler[7];
diff --git a/src/menu/kinstone_menu.c b/src/menu/kinstone_menu.c
index c0e9f7b6..67976f59 100644
--- a/src/menu/kinstone_menu.c
+++ b/src/menu/kinstone_menu.c
@@ -14,12 +14,12 @@
#include "npc.h"
#include "enemy.h"
#include "functions.h"
+#include "ui.h"
extern u32 sub_08000E44(u32);
extern void sub_080A3B74(void);
extern s32 sub_080A3B48(void);
extern void sub_0805ECEC(u32, u32, u32, u32);
-extern void sub_0801C2F0(u32, u32);
extern void sub_0801E6C8(u32);
extern void sub_0801E798(u32);
extern WStruct* sub_0805F2C8(void);
diff --git a/src/menu/pause_menu.c b/src/menu/pause_menu.c
index 4952837d..0eef154b 100644
--- a/src/menu/pause_menu.c
+++ b/src/menu/pause_menu.c
@@ -11,6 +11,7 @@
#include "itemMetaData.h"
#include "structures.h"
#include "functions.h"
+#include "ui.h"
extern void sub_080A4DB8(u32);
diff --git a/src/message.c b/src/message.c
index e4db0a1e..2b0e5bc0 100644
--- a/src/message.c
+++ b/src/message.c
@@ -6,6 +6,7 @@
#include "functions.h"
#include "message.h"
#include "save.h"
+#include "ui.h"
#define MESSAGE_ADVANCE_KEYS (A_BUTTON | B_BUTTON | DPAD_ANY | R_BUTTON)
#define MESSAGE_PRESS_ANY_ADVANCE_KEYS ((gInput.newKeys & MESSAGE_ADVANCE_KEYS) != 0)
@@ -32,8 +33,6 @@ enum {
extern void WriteBit(u32*, u32);
extern bool32 sub_0805EF40(Token* tok, const u8*);
-extern void RecoverUI(u32 bottomPt, u32 topPt);
-extern void RefreshUI(void);
extern void sub_0805F918(u32, u32, void*);
extern u32 DecToHex(u32, u8*, u32);
diff --git a/src/script.c b/src/script.c
index 92fad99a..f5bfe726 100644
--- a/src/script.c
+++ b/src/script.c
@@ -8,6 +8,7 @@
#include "kinstone.h"
#include "functions.h"
#include "item.h"
+#include "ui.h"
void InitScriptForEntity(Entity*, ScriptExecutionContext*, u16*);
void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script);
@@ -152,8 +153,6 @@ void ScriptCommand_CameraTargetPlayer(Entity* entity, ScriptExecutionContext* co
void ScriptCommand_0807F0B4(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context);
-extern void RecoverUI(u32);
-
typedef void (*ScriptCommand)(Entity*, ScriptExecutionContext*);
extern u16* gUnk_08001A7C[];
@@ -455,7 +454,7 @@ void sub_0807DF38(void) {
void sub_0807DF50(void) {
gPauseMenuOptions.disabled = 0;
gUnk_0200AF00.unk_1 = 0;
- RecoverUI(0);
+ RecoverUI(0, 0);
ResetPlayerAnimationAndAction();
PlayerDropHeldObject();
}
diff --git a/src/subtask2.c b/src/subtask2.c
index 27982f1d..5d5c407e 100644
--- a/src/subtask2.c
+++ b/src/subtask2.c
@@ -10,6 +10,7 @@
#include "functions.h"
#include "main.h"
#include "message.h"
+#include "ui.h"
extern u8 gUnk_08128D38[];
extern u8 gUnk_08128D43[];
@@ -26,6 +27,8 @@ u32 sub_080A6F40();
void sub_080A67C4(u32);
void sub_080A68D4();
u32 sub_080A69E0();
+void sub_080A6EE0(u32 param_1);
+struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2);
extern void DrawDungeonMap(u32 floor, struct_02019EE0* data, u32 size);
extern void LoadDungeonMap(void);
@@ -68,7 +71,6 @@ extern void (*const gUnk_0812901C[])(void);
void sub_080A74F4(void);
-extern void DrawUI(void);
extern void UpdateCarriedObject(void);
extern void (*const gSubtasks[])(void);
@@ -86,6 +88,30 @@ typedef struct {
extern const struct_gUnk_08128E94 gUnk_08128E94[];
+typedef struct {
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+ u8 unk7;
+} gUnk_08128DE8_struct;
+extern gUnk_08128DE8_struct gUnk_08128DE8[];
+
+typedef struct {
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ s8 unk5;
+ u16 unk6;
+} struct_gUnk_08128D70;
+
+extern const struct_gUnk_08128D70 gUnk_08128D70[];
+
ASM_FUNC("asm/non_matching/subtask2/sub_080A5594.inc", void sub_080A5594())
ASM_FUNC("asm/non_matching/subtask2/sub_080A56A0.inc", void sub_080A56A0())
@@ -103,7 +129,51 @@ void sub_080A59AC(void) {
SetMenuType(1);
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A59C8.inc", void sub_080A59C8())
+void sub_080A59C8(void) {
+ u32 uVar2;
+ u32 bVar3;
+
+ if (!sub_080A51F4()) {
+ return;
+ }
+ uVar2 = gMenu.field_0x3;
+ bVar3 = FALSE;
+
+ switch (gInput.newKeys) {
+ case DPAD_UP:
+ uVar2 = 0;
+ break;
+ case B_BUTTON:
+ if (gMenu.field_0x3 == 0) {
+ uVar2 = 1;
+ } else {
+ bVar3 = TRUE;
+ }
+ break;
+ case DPAD_DOWN:
+ uVar2 = 1;
+ break;
+ case A_BUTTON:
+ bVar3 = TRUE;
+ break;
+ }
+
+ if (bVar3) {
+ gMenu.transitionTimer = 0xff;
+ if (uVar2 == 0) {
+ CreateDialogBox(8, 0);
+ SetMenuType(2);
+ SoundReq(SFX_TEXTBOX_SELECT);
+ } else {
+ SetMenuType(3);
+ SoundReq(SFX_MENU_CANCEL);
+ }
+ } else if (gMenu.field_0x3 != uVar2) {
+ gMenu.field_0x3 = uVar2;
+ SetPopupState(0, uVar2);
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+}
void sub_080A5A54(void) {
switch (HandleSave(0)) {
@@ -160,7 +230,49 @@ void sub_080A5AF4(void) {
SetMenuType(1);
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A5B34.inc", void sub_080A5B34())
+void sub_080A5B34(void) {
+ bool32 bVar1;
+ u32 uVar3;
+
+ if (!sub_080A51F4()) {
+ return;
+ }
+ uVar3 = gMenu.field_0x3;
+ bVar1 = FALSE;
+ switch (gInput.newKeys) {
+ case DPAD_LEFT:
+ uVar3 = 0;
+ break;
+ case B_BUTTON:
+ if (gMenu.field_0x3 != 0) {
+ bVar1 = TRUE;
+ } else {
+ uVar3 = 1;
+ }
+ break;
+ case DPAD_RIGHT:
+ uVar3 = 1;
+ break;
+ case A_BUTTON:
+ bVar1 = TRUE;
+ break;
+ }
+ if (gMenu.field_0x3 != uVar3) {
+ gMenu.field_0x3 = uVar3;
+ SetPopupState(2, uVar3);
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ if (bVar1) {
+ if (uVar3 == 0) {
+ SetFade(7, 0x20);
+ gMenu.transitionTimer = 0x3c;
+ SetMenuType(2);
+ } else {
+ SoundReq(SFX_MENU_CANCEL);
+ sub_080A4E84(2);
+ }
+ }
+}
void sub_080A5BB8(void) {
Main* m;
@@ -344,7 +456,26 @@ void sub_080A6438(void) {
}
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A6498.inc", void sub_080A6498())
+void sub_080A6498(void) {
+ u32 i;
+
+ gOamCmd._4 = 0x800;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0;
+ for (i = 0; i <= 0x10; i++) {
+ if ((gSave.windcrests & (1 << i)) == 0) {
+ gUnk_08128DE8_struct* ptr = &gUnk_08128DE8[i];
+ gOamCmd.x = ptr->unk6;
+ gOamCmd.y = ptr->unk7;
+#ifdef EU
+ DrawDirect(0x1fa, 0x28 + 3 * i);
+#else
+ DrawDirect(0x1fb, 0x28 + 3 * i);
+#endif
+ }
+ }
+ gScreen.controls.windowOutsideControl = 0x3d3f;
+}
void Subtask_MapHint(void) {
extern void (*const gUnk_08128E70[])(void);
@@ -357,9 +488,46 @@ void Subtask_MapHint(void) {
CopyOAM();
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A6534.inc", void sub_080A6534())
+void sub_080A6534(void) {
+ extern const u16 gUnk_08128F4C[];
+ u32 val;
+ sub_080A4D34();
+ sub_080A4DB8(4);
+ sub_080A6290();
+ gScreen.lcd.displayControl = gScreen.lcd.displayControl & 0xf7ff;
+ SetColor(0, gPaletteBuffer[0x51]);
+ val = gUnk_08128F4C[gUI.field_0x3];
+ gSave.field_0x20 |= val;
+ gGenericMenu.unk10.h[1] = val & gGenericMenu.unk10.h[0];
+ gGenericMenu.unk10.h[0] = 0;
+ gMenu.transitionTimer = 0x3c;
+ SetMenuType(1);
+ SetFade(4, 8);
+}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A65AC.inc", void sub_080A65AC())
+void sub_080A65AC(void) {
+ if (!gFadeControl.active) {
+ gGenericMenu.unk2c++;
+ switch (gMenu.transitionTimer) {
+ case 0x1e:
+ gGenericMenu.unk10.h[0] = gGenericMenu.unk10.h[1];
+ gGenericMenu.unk2c = 0x20;
+ SoundReq(SFX_103);
+ default:
+ gMenu.transitionTimer--;
+ break;
+ case 0:
+ switch (gInput.newKeys) {
+ case A_BUTTON:
+ case B_BUTTON:
+ case START_BUTTON:
+ Subtask_Exit();
+ break;
+ }
+ break;
+ }
+ }
+}
void sub_080A6608(void) {
extern void (*const gUnk_08128E78[])(void);
@@ -439,7 +607,40 @@ void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
}
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A69E0.inc", u32 sub_080A69E0())
+u32 sub_080A69E0(u32 param_1, u32 param_2) {
+ const struct_08127F94* pbVar1;
+ int iVar3;
+
+ if ((param_1 | param_2) == 0)
+ return -1;
+
+ pbVar1 = sub_080A6A80(param_1, param_2);
+ if (pbVar1 == NULL)
+ return -1;
+
+ if (gMenu.field_0x3 != pbVar1->_4)
+ return -1;
+
+ switch (gMenu.field_0x3) {
+ case 4:
+ case 7:
+ if (gMenu.field_0x3 == 4) {
+ iVar3 = 9;
+ } else {
+ iVar3 = 7;
+ }
+ param_2 -= gAreaRoomHeaders[iVar3]->map_y;
+ break;
+ break;
+ case 15:
+ param_1 -= 0x108;
+ break;
+ }
+
+ param_1 = (s32)((param_1 - pbVar1->_0 * 0x10) * 100) / 0x23a;
+ param_2 = (s32)((param_2 - pbVar1->_1 * 0x10) * 100) / 0x23a;
+ return (param_2 << 0x10) | param_1;
+}
struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2) {
struct_08127F94* pbVar1;
@@ -507,7 +708,46 @@ void sub_080A6CA8(void) {
SetFade(4, 8);
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A6CD8.inc", void sub_080A6CD8())
+void sub_080A6CD8(void) {
+ u32 uVar1;
+ u32 uVar2;
+
+ if (gFadeControl.active) {
+ return;
+ }
+
+ gMenu.field_0x0 = 1;
+ uVar2 = 0;
+
+ switch (gInput.newKeys) {
+ case DPAD_LEFT:
+ case DPAD_UP:
+ uVar2 = -1;
+ break;
+ case DPAD_RIGHT:
+ case DPAD_DOWN:
+ uVar2 = 1;
+ break;
+ case A_BUTTON:
+ case START_BUTTON:
+ gMenu.field_0x0 = 2;
+ SetMenuType(2);
+ MessageFromTarget(0x704);
+ break;
+ case B_BUTTON:
+ gMenu.field_0x0 = 3;
+ SetMenuType(3);
+ break;
+ }
+
+ if (uVar2) {
+ uVar1 = sub_080A6D74(uVar2);
+ if (uVar1 != gMenu.field_0x3) {
+ gMenu.field_0x3 = uVar1;
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ }
+}
u32 sub_080A6D74(u32 param_1) {
u32 uVar1;
@@ -581,9 +821,39 @@ void sub_080A6E44(void) {
}
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A6E70.inc", void sub_080A6E70())
+void sub_080A6E70(void) {
+ u32 uVar1;
+ u32 i;
-ASM_FUNC("asm/non_matching/subtask2/sub_080A6EE0.inc", void sub_080A6EE0())
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0x400;
+ gGenericMenu.unk2c++;
+ sub_080A6EE0(gMenu.field_0x3);
+ if ((gGenericMenu.unk2c & 0x10) != 0) {
+ uVar1 = 0x5d;
+ } else {
+ uVar1 = 0x5e;
+ }
+
+#ifdef EU
+ DrawDirect(0x1fa, uVar1);
+#else
+ DrawDirect(0x1fb, uVar1);
+#endif
+ for (i = 0; i < 8; i++) {
+ if ((gSave.windcrests & (1 << (i + 0x18))) != 0) {
+ sub_080A6EE0(i);
+#ifdef EU
+ DrawDirect(0x1fa, 0x5c);
+#else
+ DrawDirect(0x1fb, 0x5c);
+#endif
+ }
+ }
+}
+
+ASM_FUNC("asm/non_matching/subtask2/sub_080A6EE0.inc", void sub_080A6EE0(u32 param_1))
u32 sub_080A6F40(void) {
extern u8 gUnk_08128F38[];
@@ -611,11 +881,73 @@ void sub_080A6F6C(u32 param_1) {
gScreen.bg0.yOffset = 2;
}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A6FB4.inc", void sub_080A6FB4(u32 a, u32 b))
+void sub_080A6FB4(u32 param_1, u32 param_2) {
+ extern u16 gUnk_08128FF0[];
+ extern Font gUnk_08128FD8;
+ extern Font gUnk_08128FC0;
+ u32 uVar1;
+ Font* font;
-ASM_FUNC("asm/non_matching/subtask2/sub_080A7040.inc", void sub_080A7040(u32 a))
+ uVar1 = 0;
+ switch (param_2) {
+ case 0:
+ if ((gSave.windcrests & (1 << param_1)) == 0)
+ break;
+ case 2:
+ uVar1 = gUnk_08127F94[param_1]._6;
+ font = &gUnk_08128FC0;
+ break;
+ case 1:
+ uVar1 = gUnk_08128FF0[param_1];
+ font = &gUnk_08128FD8;
+ break;
+ }
+
+ if (gGenericMenu.unk2e.HWORD != uVar1) {
+ gGenericMenu.unk2e.HWORD = uVar1;
+ MemClear(&gUnk_020350F0, 0x100);
+ if ((uVar1 & 0xff) != 0) {
+ sub_0805F46C(uVar1, font);
+ }
+ gScreen.bg0.updated = 1;
+ }
+ gScreen.bg0.yOffset = 2;
+}
-ASM_FUNC("asm/non_matching/subtask2/sub_080A70AC.inc", void sub_080A70AC(const KeyButtonLayout* layout))
+void sub_080A7040(u32 param_1) {
+ extern Font gUnk_08129004;
+ extern u8 gUnk_02022130[];
+ if (gGenericMenu.unk2e.HWORD != param_1) {
+ gGenericMenu.unk2e.HWORD = param_1;
+ MemClear(gUnk_02022130, 0x300);
+ MemCopy(gUnk_02022130 - 0x200, (void*)0x600e000, 0x800);
+ if (GetInventoryValue(gUnk_08128D70[param_1].unk0) != 0) {
+ sub_0805F46C(gUnk_08128D70[param_1].unk6, &gUnk_08129004);
+ }
+ gScreen.bg1.yOffset = 3;
+ gScreen.bg1.updated = 1;
+ }
+}
+
+void sub_080A70AC(const KeyButtonLayout* layout) {
+ MemClear(&gUnk_0200AF00.elements, 0x300);
+ gUnk_0200AF00.unk_13 = 0x7f;
+ gUnk_0200AF00.unk_14 = 0x7f;
+ gUnk_0200AF00.buttonX[0] = layout->aButtonX;
+ gUnk_0200AF00.buttonY[0] = (s8)layout->aButtonY;
+ gUnk_0200AF00.unk_30[0] = layout->aButtonText;
+ gUnk_0200AF00.buttonX[1] = layout->bButtonX;
+ gUnk_0200AF00.buttonY[1] = (s8)layout->bButtonY;
+ gUnk_0200AF00.unk_30[1] = layout->bButtonText;
+ gUnk_0200AF00.buttonX[2] = layout->rButtonX;
+ gUnk_0200AF00.buttonY[2] = (s8)layout->rButtonY;
+ gUnk_0200AF00.unk_32 = layout->rButtonText;
+ layout++;
+ do {
+ CreateUIElement(layout->aButtonX, layout->aButtonY);
+ layout = (KeyButtonLayout*)&layout->aButtonText;
+ } while ((s8)layout->aButtonX != -1);
+}
void SetMenuType(u32 menuType) {
gMenu.menuType = menuType;
@@ -624,12 +956,12 @@ void SetMenuType(u32 menuType) {
}
void ResetUI(void) {
- MemClear(&gUI, 0x3b4);
+ MemClear(&gUI, sizeof(gUI));
}
void MenuFadeIn(u32 param_1, u32 param_2) {
if (gUI.nextToLoad == 0) {
- MemClear(&gUI, 0x3b4);
+ MemClear(&gUI, sizeof(gUI));
gUI.lastState = param_1;
gUI.field_0x3 = param_2;
gUI.pauseFadeIn = gMain.substate;