summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-03-05 19:24:39 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-03-17 00:58:47 +0100
commit41ea9ab943d8be91d9e296d23cd1f2dd48d37d9d (patch)
tree4c17c549e48b887a18e74f8ec73d26a66892fbe1 /src
parent9749170b751c35c65d9fb05b9ce0426770d1bbb9 (diff)
Decompile some UI
Diffstat (limited to 'src')
-rw-r--r--src/affine.c17
-rw-r--r--src/fileselect.c12
-rw-r--r--src/game.c20
-rw-r--r--src/interrupts.c12
-rw-r--r--src/menu/figurine_menu.c6
-rw-r--r--src/menu/kinstone_menu.c4
-rw-r--r--src/menu/pause_menu.c4
-rw-r--r--src/object/crenelBeanSprout.c6
-rw-r--r--src/object/itemForSale.c12
-rw-r--r--src/player.c4
-rw-r--r--src/playerUtils.c2
-rw-r--r--src/script.c4
-rw-r--r--src/subtask2.c2
-rw-r--r--src/ui.c496
14 files changed, 500 insertions, 101 deletions
diff --git a/src/affine.c b/src/affine.c
index 723c5e90..f0e2549b 100644
--- a/src/affine.c
+++ b/src/affine.c
@@ -6,9 +6,9 @@
extern u32 gFrameObjLists[];
-extern void ram_sub_080B23F0(void);
-extern void ram_sub_080B2828(OAMCommand*, void*);
-extern void ram_sub_080B280C(OAMCommand*, u32, u32);
+extern void ram_DrawEntities(void);
+extern void ram_sub_080ADA04(OAMCommand*, void*);
+extern void ram_DrawDirect(OAMCommand*, u32, u32);
// regalloc
NONMATCH("asm/non_matching/vram/sub_080AD8F0.inc", void* sub_080AD8F0(u32 sprite, u32 frame)) {
@@ -59,16 +59,17 @@ void DrawEntities(void) {
gOAMControls._4 = gRoomControls.aff_x + gRoomControls.scroll_x;
gOAMControls._6 = gRoomControls.aff_y + gRoomControls.scroll_y;
gOAMControls.field_0x1++;
- fn = &ram_sub_080B23F0;
+ fn = &ram_DrawEntities;
fn();
}
+// TODO second parameter is a frame obj entry from gFrameObjLists
void sub_080ADA04(OAMCommand* cmd, void* dst) {
- void (*fn)(OAMCommand*, void*) = ram_sub_080B2828;
+ void (*fn)(OAMCommand*, void*) = ram_sub_080ADA04;
fn(cmd, dst);
}
-void DrawDirect(u32 a1, u32 a2) {
- void (*fn)(OAMCommand*, u32, u32) = ram_sub_080B280C;
- fn(&gOamCmd, a1, a2);
+void DrawDirect(u32 spriteIndex, u32 frameIndex) {
+ void (*fn)(OAMCommand*, u32, u32) = ram_DrawDirect;
+ fn(&gOamCmd, spriteIndex, frameIndex);
}
diff --git a/src/fileselect.c b/src/fileselect.c
index 5545e3f7..93355380 100644
--- a/src/fileselect.c
+++ b/src/fileselect.c
@@ -185,8 +185,8 @@ void FileSelectTask(void) {
gMapDataBottomSpecial.isTransitioning = FALSE;
UpdateEntities();
sub_0805066C();
- sub_0801C1D4();
- DrawOAMCmd();
+ UpdateUIElements();
+ DrawUIElements();
DrawEntities();
CopyOAM();
if (gMapDataBottomSpecial.unk3 != gSaveHeader->language) {
@@ -346,13 +346,13 @@ void sub_08050790(void) {
}
static void HideButtonR(void) {
- gUnk_0200AF00.rButtonX = 0x140;
- gUnk_0200AF00.rButtonY = 0x24;
+ gUnk_0200AF00.buttonX[2] = 0x140;
+ gUnk_0200AF00.buttonY[2] = 0x24;
}
static void ShowButtonR(void) {
- gUnk_0200AF00.rButtonX = 0xD0;
- gUnk_0200AF00.rButtonY = 0x24;
+ gUnk_0200AF00.buttonX[2] = 0xD0;
+ gUnk_0200AF00.buttonY[2] = 0x24;
}
static void HandleFileSelect(void) {
diff --git a/src/game.c b/src/game.c
index c4ff4253..be7e224b 100644
--- a/src/game.c
+++ b/src/game.c
@@ -113,7 +113,7 @@ extern void UpdateScroll(void);
extern void UpdateBgAnim(void);
extern void CleanUpGFXSlots(void);
extern void sub_080ADE24(void);
-extern void InitUI(u32);
+extern void InitUI(bool32);
extern void sub_0801AE44(u32);
extern void GenerateAreaHint(void);
extern void ForceSetPlayerState(u32);
@@ -350,7 +350,7 @@ static void GameMain_InitRoom(void) {
gRoomTransition.field_0x4[1] = 0;
MessageInitialize();
InitRoom();
- InitUI(0);
+ InitUI(FALSE);
InitializeEntities();
#ifndef EU
sub_0801855C();
@@ -366,7 +366,7 @@ static void GameMain_ChangeRoom(void) {
DrawUI();
UpdateManagers();
FlushSprites();
- DrawOAMCmd();
+ DrawUIElements();
UpdateCarriedObject();
DrawEntities();
CopyOAM();
@@ -443,7 +443,7 @@ static void GameMain_Update(void) {
sub_08052C3C();
DrawUI();
UpdateManagers();
- DrawOAMCmd();
+ DrawUIElements();
UpdateCarriedObject();
DrawEntities();
CheckRoomExit();
@@ -476,7 +476,7 @@ static void GameMain_BarrelUpdate(void) {
DrawUI();
UpdateManagers();
FlushSprites();
- DrawOAMCmd();
+ DrawUIElements();
UpdateCarriedObject();
DrawEntities();
CheckRoomExit();
@@ -488,7 +488,7 @@ static void GameMain_BarrelUpdate(void) {
static void GameMain_ChangeArea(void) {
FlushSprites();
- DrawOAMCmd();
+ DrawUIElements();
DrawEntities();
gMain.pad = 1;
CopyOAM();
@@ -1151,7 +1151,7 @@ void RestoreGameTask(u32 a1) {
CleanUpGFXSlots();
#endif
sub_080ADE24();
- InitUI(1);
+ InitUI(TRUE);
sub_0801AE44(a1);
MemCopy(gUnk_02024090, gPaletteBuffer, 1024);
gUsedPalettes = 0xffffffff;
@@ -1302,7 +1302,7 @@ bool32 CanDispEzloMessage(void) {
s32 tmp = PL_STATE_WALK;
if (!(gInput.heldKeys & SELECT_BUTTON) || gPlayerState.controlMode != CONTROL_ENABLED || gUnk_02034490.unk0 ||
- gUnk_0200AF00.filler0[1])
+ gUnk_0200AF00.unk_1)
return 0;
if ((gPlayerState.flags & (PL_NO_CAP | 0x110)) || (gPlayerState.framestate_last > tmp) || gPlayerState.item ||
@@ -2291,8 +2291,8 @@ void ForceEquipItem(u32 itemID, u32 itemSlot) {
}
gSave.stats.itemButtons[itemSlot] = itemID;
gSave.stats.itemButtons[otherItemIndex] = otherItem;
- gUnk_0200AF00.filler0[0x13] = 0x7f;
- gUnk_0200AF00.filler0[0x14] = 0x7f;
+ gUnk_0200AF00.unk_13 = 0x7f;
+ gUnk_0200AF00.unk_14 = 0x7f;
}
}
diff --git a/src/interrupts.c b/src/interrupts.c
index e92e1ac6..5115c45a 100644
--- a/src/interrupts.c
+++ b/src/interrupts.c
@@ -227,9 +227,9 @@ void PlayerUpdate(Entity* this) {
void HandlePlayerLife(Entity* this) {
u32 temp;
- gUnk_0200AF00.filler25[10] = 0;
- gUnk_0200AF00.filler25[8] = 0;
- gUnk_0200AF00.filler25[9] = 0;
+ gUnk_0200AF00.unk_2f = 0;
+ gUnk_0200AF00.unk_2d = 0;
+ gUnk_0200AF00.unk_2e = 0;
if ((gPlayerEntity.bitfield & 0x80) && (gPlayerEntity.iframes > 0))
SoundReq(SFX_86);
@@ -257,7 +257,7 @@ void HandlePlayerLife(Entity* this) {
return;
#ifdef EU
- if ((gUnk_0200AF00.filler0[1] == 0) && gRoomTransition.frameCount % 90 == 0) {
+ if ((gUnk_0200AF00.unk_1 == 0) && gRoomTransition.frameCount % 90 == 0) {
temp = gSave.stats.maxHealth / 4;
if (temp > 24)
temp = 24;
@@ -278,7 +278,7 @@ void HandlePlayerLife(Entity* this) {
if (gSave.stats.health <= temp) {
gRoomVars.unk2 = 1;
- if ((gUnk_0200AF00.filler0[1] == 0) && gRoomTransition.frameCount % 90 == 0) {
+ if ((gUnk_0200AF00.unk_1 == 0) && gRoomTransition.frameCount % 90 == 0) {
EnqueueSFX(SFX_LOW_HEALTH);
}
}
@@ -325,7 +325,7 @@ void sub_080171F0(void) {
sub_080028E0(&gPlayerEntity);
if (gPlayerState.flags & PL_CLONING)
- gUnk_0200AF00.filler25[10] = 1;
+ gUnk_0200AF00.unk_2f = 1;
sub_08078180();
gPlayerState.field_0x7 &= ~0x80;
diff --git a/src/menu/figurine_menu.c b/src/menu/figurine_menu.c
index c545c316..9ac5b27f 100644
--- a/src/menu/figurine_menu.c
+++ b/src/menu/figurine_menu.c
@@ -84,8 +84,8 @@ void Subtask_FigurineMenu(void) {
figurineMenu1_Types[gMenu.menuType]();
}
UpdateEntities();
- sub_0801C1D4();
- DrawOAMCmd();
+ UpdateUIElements();
+ DrawUIElements();
DrawEntities();
FigurineMenu_080A4978();
CopyOAM();
@@ -598,7 +598,7 @@ void sub_080A4DB8(u32 param_1) {
MemClear(&gBG0Buffer, 0x800);
MemClear(&gBG1Buffer, 0x800);
MemClear(&gBG2Buffer, 0x800);
- MemClear(gUnk_0200AF00.filler25 + 0xf, 0x300);
+ MemClear(gUnk_0200AF00.elements, sizeof(gUnk_0200AF00.elements));
MemClear(&gFigurineMenu, sizeof(gFigurineMenu));
gFigurineMenu.unk2e = 0xffff;
gMenu.field_0x3 = gUnk_02034490.unk2[param_1];
diff --git a/src/menu/kinstone_menu.c b/src/menu/kinstone_menu.c
index 9870e9fe..45850f4d 100644
--- a/src/menu/kinstone_menu.c
+++ b/src/menu/kinstone_menu.c
@@ -85,8 +85,8 @@ void Subtask_KinstoneMenu(void) {
kinstoneMenuTypes[gMenu.menuType]();
sub_080A3B74();
KinstoneMenu_080A4054();
- sub_0801C1D4();
- DrawOAMCmd();
+ UpdateUIElements();
+ DrawUIElements();
UpdateEntities();
DrawEntities();
CopyOAM();
diff --git a/src/menu/pause_menu.c b/src/menu/pause_menu.c
index 88e573b2..4bd0a4fc 100644
--- a/src/menu/pause_menu.c
+++ b/src/menu/pause_menu.c
@@ -38,8 +38,8 @@ void Subtask_PauseMenu(void) {
FlushSprites();
pauseMenu_Variants[gUnk_02034490.unk11]();
sub_080A5128();
- sub_0801C1D4();
- DrawOAMCmd();
+ UpdateUIElements();
+ DrawUIElements();
if (gUnk_02034490.unk11 != 4) {
gUnk_08128A38[gUnk_02034490.unk1].func();
}
diff --git a/src/object/crenelBeanSprout.c b/src/object/crenelBeanSprout.c
index 39af67c9..13652224 100644
--- a/src/object/crenelBeanSprout.c
+++ b/src/object/crenelBeanSprout.c
@@ -172,9 +172,9 @@ void CrenelBeanSprout_Action1(CrenelBeanSproutEntity* this) {
this->unk_70 = ((super->x.HALF.HI + (s8)gUnk_08123184[tmp]) & -0x10) | 8;
this->unk_72 = ((super->y.HALF.HI + (s8)gUnk_08123184[(tmp) + 1]) & -0x10) | 8;
if (sub_080B1AB4(this->unk_70, this->unk_72, super->collisionLayer) == 0x19) {
- gUnk_0200AF00.filler25[10] = 3;
+ gUnk_0200AF00.unk_2f = 3;
} else {
- gUnk_0200AF00.filler25[10] = 0;
+ gUnk_0200AF00.unk_2f = 0;
}
PositionRelative(&gPlayerEntity, super, 0, 0x10000);
if (sub_080B1AA8(super) == 0x19) {
@@ -184,7 +184,7 @@ void CrenelBeanSprout_Action1(CrenelBeanSproutEntity* this) {
if ((gPlayerState.field_0x92 & 0xc0) == 0) {
return;
}
- if (gUnk_0200AF00.filler25[10] != 3) {
+ if (gUnk_0200AF00.unk_2f != 3) {
return;
}
gPlayerState.heldObject = 0;
diff --git a/src/object/itemForSale.c b/src/object/itemForSale.c
index a89ec4d4..85f6326d 100644
--- a/src/object/itemForSale.c
+++ b/src/object/itemForSale.c
@@ -85,7 +85,7 @@ void ItemForSale_Init(ItemForSaleEntity* this) {
void ItemForSale_Action1(ItemForSaleEntity* this) {
if (super->subAction != 0) {
super->action = 2;
- gUnk_0200AF00.filler25[10] = 2;
+ gUnk_0200AF00.unk_2f = 2;
} else {
if (super->type == 0x36) {
if (super->interactType != 0) {
@@ -102,7 +102,7 @@ void ItemForSale_Action1(ItemForSaleEntity* this) {
ResetPlayer();
gPlayerState.heldObject = 4;
gNewPlayerEntity.unk_74 = super;
- gUnk_0200AF00.filler25[10] = 2;
+ gUnk_0200AF00.unk_2f = 2;
MessageClose();
}
}
@@ -112,14 +112,14 @@ void ItemForSale_Action1(ItemForSaleEntity* this) {
void ItemForSale_Action2(ItemForSaleEntity* this) {
void* ptr;
- gUnk_0200AF00.filler25[10] = 2;
+ gUnk_0200AF00.unk_2f = 2;
super->spriteSettings.draw = gPlayerEntity.spriteSettings.draw;
if ((gPlayerState.heldObject == 0) || (super != gNewPlayerEntity.unk_74)) {
sub_080819B4(this);
} else {
ptr = sub_080784E4();
if (((*(int*)(ptr + 8) == 0) ||
- ((*(u8*)(ptr + 1) != 1 || (gUnk_0200AF00.filler25[10] = 7, (gPlayerState.field_0x92 & 0x88) == 0)))) &&
+ ((*(u8*)(ptr + 1) != 1 || (gUnk_0200AF00.unk_2f = 7, (gPlayerState.field_0x92 & 0x88) == 0)))) &&
((gPlayerState.field_0x92 & 0x98) != 0)) {
sub_080819B4(this);
}
@@ -141,8 +141,8 @@ void sub_080819B4(ItemForSaleEntity* this) {
gNewPlayerEntity.unk_74 = 0;
ptr = &gUnk_0200AF00;
gRoomVars.shopItemType = 0;
- ptr->filler25[7] = 0;
- ptr->filler25[10] = 0;
+ ptr->unk_2c = 0;
+ ptr->unk_2f = 0;
gRoomVars.shopItemType2 = 0;
super->x.HALF.HI = this->unk_80 + gRoomControls.origin_x;
super->y.HALF.HI = this->unk_82 + gRoomControls.origin_y;
diff --git a/src/player.c b/src/player.c
index 252c178c..f209e891 100644
--- a/src/player.c
+++ b/src/player.c
@@ -1862,7 +1862,7 @@ static void PlayerPull(Entity* this) {
gPlayerState.framestate = PL_STATE_PULL;
sPlayerPullStates[this->subAction](this);
- gUnk_0200AF00.filler25[9] = 8;
+ gUnk_0200AF00.unk_2e = 8;
}
static void sub_08072214(Entity* this) {
@@ -2802,7 +2802,7 @@ void sub_08073584(Entity* this) {
return;
}
- gUnk_0200AF00.filler25[10] = 1;
+ gUnk_0200AF00.unk_2f = 1;
if (sub_0807A2F8(0)) {
this->subAction++;
this->direction = 4 * (this->animationState & 6);
diff --git a/src/playerUtils.c b/src/playerUtils.c
index 9ba882cb..b68fef08 100644
--- a/src/playerUtils.c
+++ b/src/playerUtils.c
@@ -143,7 +143,7 @@ NONMATCH("asm/non_matching/playerUtils/sub_080777A0.inc", bool32 sub_080777A0(vo
RequestPriorityDuration(&gPlayerEntity, 0xb4);
return TRUE;
}
- } else if ((((gUnk_0200AF00.filler25[7] == 0xc) && (gPlayerState.field_0x1c == 0)) &&
+ } else if ((((gUnk_0200AF00.unk_2c == 0xc) && (gPlayerState.field_0x1c == 0)) &&
(gPlayerState.floor_type != 0x11)) &&
((((gPlayerState.field_0x90 & 0xf00) != 0 &&
((gPlayerState.flags & (PL_BURNING | PL_ROLLING)) == 0)) &&
diff --git a/src/script.c b/src/script.c
index 03701249..f08b600e 100644
--- a/src/script.c
+++ b/src/script.c
@@ -448,13 +448,13 @@ void sub_0807DF28(void) {
}
void sub_0807DF38(void) {
- gUnk_0200AF00.filler0[1] = 0xff;
+ gUnk_0200AF00.unk_1 = 0xff;
gUnk_02034490.unk0 = 0xff;
}
void sub_0807DF50(void) {
gUnk_02034490.unk0 = 0;
- gUnk_0200AF00.filler0[1] = 0;
+ gUnk_0200AF00.unk_1 = 0;
RecoverUI(0);
ResetPlayerAnimationAndAction();
sub_08079184();
diff --git a/src/subtask2.c b/src/subtask2.c
index 39b710bb..2ac69033 100644
--- a/src/subtask2.c
+++ b/src/subtask2.c
@@ -401,7 +401,7 @@ void sub_080A74F4(void) {
UpdateEntities();
UpdateManagers();
DrawUI();
- DrawOAMCmd();
+ DrawUIElements();
UpdateCarriedObject();
DrawEntities();
CopyOAM();
diff --git a/src/ui.c b/src/ui.c
index addcacd2..8927154d 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1,77 +1,475 @@
#include "global.h"
#include "sound.h"
#include "message.h"
+#include "functions.h"
+#include "screen.h"
+#include "common.h"
+#include "save.h"
+#include "player.h"
+#include "area.h"
+#include "game.h"
+
+extern void sub_0805ECEC(u32, u32, u32, u32);
+extern bool32 ItemIsBottle(u32);
typedef struct {
- s8 unk0;
- u8 unk1;
- u8 unk2;
- u8 unk3;
- u8 unk4;
- u8 unk5;
- u8 unk6;
- u8 unk7;
- u8 unk8;
- u8 unk9;
- u8 unkA;
- u8 unkB;
- u16 unkC;
- u16 unkE;
- u16 unk10;
- u8 unk12;
- u8 unk13;
-} Element;
+ u16 unk_0;
+ u16 unk_2;
+ u16 unk_4;
+ u16 unk_6;
+ u16 unk_8;
+} substruct_160;
-extern void sub_0805ECEC(u32, u32, u32, u32);
-extern void sub_0801CAD0(Element*);
+typedef struct {
+ substruct_160 unk_0;
+ u8 unk_9[54];
+ substruct_160 unk_40;
+} struct_02035160;
+extern struct_02035160 gUnk_02035160;
+
+typedef struct {
+ u32 unk_0;
+ u32 unk_4;
+ u32 unk_8;
+ u32 unk_c;
+ u32 unk_10;
+ u32 unk_14;
+ u8 unk_18[40];
+} struct_02034CF0;
-extern void (*const gUnk_080C904C[])(Element*);
+extern struct_02034CF0 gUnk_02034CF0[];
+typedef struct {
+ struct_02034CF0 unk_0;
+ struct_02034CF0 unk_40;
+} struct_02034D30;
+
+extern struct_02034D30 gUnk_02034D30;
+
+typedef struct {
+ u16 unk_0;
+ u16 unk_2;
+ u16 unk_4;
+ u16 unk_6;
+ u8 pad[56];
+} substruct_0E2;
+
+typedef struct {
+ substruct_0E2 unk_0[2];
+} struct_020350E2;
+
+extern struct_020350E2 gUnk_020350E2;
+
+typedef struct {
+ u16 unk_0; // -> gOamCmd._4
+ u16 unk_2; // -> gOamCmd._6
+ u16 unk_4; // -> element->unk_1a
+ u16 spriteIndex;
+ void (*updateFunction)(UIElement*);
+ u8 buttonElementId;
+ u8 unk_d;
+ u8 unk_e;
+ u8 unk_f;
+} UIElementDefinition;
+
+extern UIElementDefinition gUIElementDefinitions[];
+extern void (*const ButtonUIElement_Actions[])(UIElement*);
+extern const u8 gUnk_080C9044[];
+extern void (*const EzloNagUIElement_Actions[])(UIElement*);
extern u16 gUnk_080C9058[];
+extern Frame gUnk_080C9094[];
+
+void sub_0801C2F0(u32, u32);
+void DrawHearts(void);
+void DrawChargeBar(void);
+void DrawRupees(void);
+void DrawKeys(void);
+void CreateUIElement(u32, u32);
+void sub_0801C5E0(u32, u32, u32, u32);
+void sub_0801CAFC(UIElement*, u32);
+void sub_0801CB20(UIElement*, UIElementDefinition*);
+UIElement* FindUIElement(u32);
+void sub_0801CAD0(UIElement*);
+void sub_0801CAB8(UIElement*, Frame*);
-void EzloNag(Element* arg0) {
- gUnk_080C904C[arg0->unk4](arg0);
+void UpdateUIElements(void) {
+ u32 index;
+ UIElement* element;
+ const UIElementDefinition* definition;
+ for (index = 0; index < MAX_UI_ELEMENTS; index++) {
+ element = &gUnk_0200AF00.elements[index];
+ if (element->used != 0) {
+ definition = &gUIElementDefinitions[element->type];
+ definition->updateFunction(element);
+ }
+ }
}
-extern u32 gUnk_080C9094;
-extern void sub_0801CAB8(Element*, u32*);
+void DrawUIElements(void) {
+ u32 index;
+ UIElement* element;
+ UIElementDefinition* definition;
+ index = 0;
+ for (index = 0; index < MAX_UI_ELEMENTS; index++) {
+ element = &gUnk_0200AF00.elements[index];
+ if (element->used == 1 && element->unk_0_1 == 1) {
+ gOamCmd.x = element->x;
+ gOamCmd.y = element->y;
+ definition = &gUIElementDefinitions[element->type];
+ gOamCmd._4 = definition->unk_0;
+ gOamCmd._6 = definition->unk_2;
+ gOamCmd._8 = element->unk_18 << 0xc | element->unk_1a;
+ DrawDirect(definition->spriteIndex, element->frameIndex);
+ }
+ }
+}
-NONMATCH("asm/non_matching/sub_0801CED8.inc", void sub_0801CED8(Element* arg0)) {
- if (gUnk_0200AF00.ezloNagFuncIndex == 1) {
- gUnk_0200AF00.ezloNagFuncIndex = 2;
- arg0->unkC = 0x10;
- arg0->unkE = 0x90;
- arg0->unk6 = 0;
- arg0->unk1 = 7;
- arg0->unk4 = 1;
- arg0->unk0 |= 2;
- sub_0801CAB8(arg0, &gUnk_080C9094);
+NONMATCH("asm/non_matching/ui/sub_0801C25C.inc", void sub_0801C25C(void)) {
+ u32 uVar1;
+ s32 index;
+ u8 tmp;
+ UIElement* element;
+
+ for (index = 0; index < MAX_UI_ELEMENTS; index++) {
+ element = &gUnk_0200AF00.elements[index];
+ if (((element->used) == 1) && ((element->unk_0_1) == 1)) {
+ // TODO wrong bitfield access here
+ if (element->unk_0_2 == 1) {
+ element->unk_0_2 = 2;
+ DmaSet(3, element->firstTile, element->unk_1a * 0x20 + 0x6010000, element->numTiles << 3 | 0x84000000);
+ }
+ }
+ }
+ if (gUnk_0200AF00.unk_13 < 0) {
+ tmp = gUnk_0200AF00.unk_13 & 0x7f;
+ gUnk_0200AF00.unk_13 = tmp;
+ sub_0801C2F0(0x11a, tmp);
+ }
+ if (gUnk_0200AF00.unk_14 < 0) {
+ tmp = gUnk_0200AF00.unk_14 & 0x7f;
+ gUnk_0200AF00.unk_14 = tmp;
+ sub_0801C2F0(0x126, tmp);
}
}
END_NONMATCH
-void sub_0801CF18(Element* arg0) {
- u32 temp;
+ASM_FUNC("asm/non_matching/ui/sub_0801C2F0.inc", void sub_0801C2F0(u32 a, u32 b))
+
+void DrawUI(void) {
+ gUnk_0200AF00.unk_0 &= ~gUnk_0200AF00.unk_1;
+ DrawHearts();
+ DrawChargeBar();
+ DrawRupees();
+ DrawKeys();
+ gUnk_0200AF00.unk_0 = 0;
+ UpdateUIElements();
+}
+
+void InitUI(bool32 keepHealthAndRupees) {
+ u32 health;
+ u32 rupees;
+
+ if (!keepHealthAndRupees) {
+ health = gSave.stats.health >> 1;
+ rupees = gSave.stats.rupees;
+ } else {
+ health = gUnk_0200AF00.health;
+ rupees = gUnk_0200AF00.rupees;
+ }
+ MemClear(&gUnk_0200AF00, sizeof(struct_0200AF00));
+ gUnk_0200AF00.health = health;
+ gUnk_0200AF00.rupees = rupees;
+ gUnk_0200AF00.maxHealth = gSave.stats.maxHealth >> 1;
+ LoadPaletteGroup(0xc);
+ LoadGfxGroup(0x10);
+ MemClear(&gBG0Buffer, 0x800);
+ gScreen.bg0.tilemap = &gBG0Buffer;
+ gScreen.bg0.control = 0x1f0c;
+ gScreen.lcd.displayControl |= 0x100;
+ gOAMControls.unk[0].unk7 = 1;
+ gOAMControls.unk[0].unk6 = 1;
+ gOAMControls.unk[1].unk6 = 1;
+ gUnk_0200AF00.unk_13 = 0x7f;
+ gUnk_0200AF00.unk_14 = 0x7f;
+ gUnk_0200AF00.unk_8 = 0x7f;
+ DrawHearts();
+ DrawRupees();
+ DrawChargeBar();
+ DrawKeys();
+ gUnk_0200AF00.buttonX[0] = 0xd0;
+ gUnk_0200AF00.buttonX[1] = 0xb8;
+ gUnk_0200AF00.buttonX[2] = 0xd8;
+ gUnk_0200AF00.buttonY[0] = 0x1c;
+ gUnk_0200AF00.buttonY[1] = 0x1c;
+ gUnk_0200AF00.buttonY[2] = 0xe;
+ // TODO why is this array cleared again? Is it filled by the function calls in the mean time?
+ MemClear(gUnk_0200AF00.elements, sizeof(gUnk_0200AF00.elements));
+ CreateUIElement(UI_ELEMENT_TEXT_R, 9);
+ CreateUIElement(UI_ELEMENT_ITEM_A, 0);
+ CreateUIElement(UI_ELEMENT_ITEM_B, 0);
+ CreateUIElement(UI_ELEMENT_BUTTON_R, 0);
+ CreateUIElement(UI_ELEMENT_BUTTON_B, 0);
+ CreateUIElement(UI_ELEMENT_BUTTON_A, 0);
+ CreateUIElement(UI_ELEMENT_EZLONAGSTART, 0);
+ CreateUIElement(UI_ELEMENT_HEART, 0);
+}
+
+void RefreshUI(void) {
+ gScreen.bg0.updated = 1;
+}
+
+void RecoverUI(u32 bottomPt, u32 topPt) {
+ gUnk_0200AF00.unk_2 = 0;
+ gUnk_0200AF00.unk_10 = 0;
+ gUnk_0200AF00.unk_a = 0;
+}
+
+ASM_FUNC("asm/non_matching/ui/DrawRupees.inc", void DrawRupees(void))
+
+// Draw icon with text for rupees or keys
+ASM_FUNC("asm/non_matching/ui/sub_0801C5E0.inc",
+ void sub_0801C5E0(u32 iconVramIndex, u32 count, bool32 isTextYellow, u32 d))
- temp = gUnk_080C9058[arg0->unk6++];
- sub_0805ECEC(0, temp, temp, 0);
- if (temp == 0) {
- arg0->unk4 = 2;
- arg0->unk1 = 8;
+void sub_0801C66C(void) {
+ struct_02034CF0* ptr;
+ s32 index;
+
+ if (gUnk_0200AF00.unk_2 != 0) {
+ gUnk_0200AF00.unk_2 = 0;
+ if (gUnk_0200AF00.maxHealth > 0x28) {
+ index = 2;
+ } else {
+ index = 1;
+ }
+ ptr = gUnk_02034CF0;
+ do {
+ ptr->unk_0 = 0;
+ ptr->unk_4 = 0;
+ ptr->unk_8 = 0;
+ ptr->unk_c = 0;
+ ptr->unk_10 = 0;
+ ptr->unk_14 = 0;
+ ptr++;
+ index--;
+ } while (index > 0);
+ gScreen.bg0.updated = 1;
+ }
+}
+
+ASM_FUNC("asm/non_matching/ui/DrawHearts.inc", void DrawHearts())
+
+void sub_0801C824(void) {
+ struct_02034CF0* ptr;
+
+ if (gUnk_0200AF00.unk_6 != 0) {
+ gUnk_0200AF00.unk_6 = 0;
+ if (gUnk_0200AF00.maxHealth > 4 * 10) {
+ ptr = &gUnk_02034D30.unk_40; // Show second row of hearts
+ } else {
+ ptr = &gUnk_02034D30.unk_0;
+ }
+ ptr->unk_0 = 0;
+ ptr->unk_4 = 0;
+ ptr->unk_8 = 0;
+ ptr->unk_c = 0;
+ ptr->unk_10 = 0;
+ ptr->unk_14 = 0;
+ gScreen.bg0.updated = 1;
+ }
+}
+
+ASM_FUNC("asm/non_matching/ui/DrawChargeBar.inc", void DrawChargeBar())
+
+ASM_FUNC("asm/non_matching/ui/DrawKeys.inc", void DrawKeys(void))
+
+ASM_FUNC("asm/non_matching/ui/CreateUIElement.inc", void CreateUIElement(u32 type, u32 type2))
+
+void sub_0801CAB8(UIElement* element, Frame* frame) {
+ element->framePtr = frame;
+ element->duration = frame->duration;
+ element->spriteSettings = frame->spriteSettings.raw;
+ element->frameSettings = frame->frameSettings.raw;
+ sub_0801CAFC(element, frame->index);
+}
+
+void sub_0801CAD0(UIElement* element) {
+ if (--element->duration == 0) {
+ Frame* frame = element->framePtr;
+ if ((s8)frame->frameSettings.raw < 0) {
+ frame -= frame[1].index;
+ }
+ sub_0801CAB8(element, frame + 1);
+ }
+}
+
+void sub_0801CAFC(UIElement* element, u32 frameIndex) {
+ UIElementDefinition* definition = &gUIElementDefinitions[element->type];
+ if (frameIndex != element->frameIndex) {
+ element->frameIndex = frameIndex;
+ sub_0801CB20(element, definition);
+ }
+}
+
+void sub_0801CB20(UIElement* element, UIElementDefinition* definition) {
+ if (definition->unk_e == 0) {
+ SpritePtr* ptr = &gSpritePtrs[definition->spriteIndex];
+ SpriteFrame* frame = &ptr->frames[element->frameIndex];
+ u32* firstTile = (u32*)(ptr->ptr + frame->firstTileIndex * 0x20);
+ u8 numTiles = frame->numTiles;
+ if (numTiles == 0) {
+ element->unk_0_2 = 0;
+ } else {
+ if ((element->numTiles != numTiles) || (element->firstTile != firstTile)) {
+ element->firstTile = firstTile;
+ element->unk_0_2 = 1;
+ }
+ }
+ element->numTiles = numTiles;
+ }
+}
+
+void ButtonUIElement(UIElement* element) {
+ ButtonUIElement_Actions[element->action](element);
+}
+
+void ButtonUIElement_Action0(UIElement* element) {
+ element->x = gUnk_0200AF00.buttonX[element->type];
+ element->y = gUnk_0200AF00.buttonY[element->type] - 0x20;
+ element->action = 1;
+ element->unk_0_1 = 1;
+ sub_0801CAFC(element, element->type);
+}
+
+ASM_FUNC("asm/non_matching/ui/ButtonUIElement_Action1.inc", void ButtonUIElement_Action1())
+
+u32 sub_0801CC80(UIElement* element) {
+ u8 type = element->type;
+ u32 buttonId = (type ^ 3) != 0;
+ u32 itemId = gSave.stats.itemButtons[buttonId];
+ if (ItemIsBottle(itemId)) {
+ itemId = gSave.saved_status.field_0x24[itemId - 6];
+ }
+ return itemId;
+}
+
+ASM_FUNC("asm/non_matching/ui/ItemUIElement.inc", void ItemUIElement())
+
+NONMATCH("asm/non_matching/ui/TextUIElement.inc", void TextUIElement(UIElement* element)) {
+ UIElement* buttonUIElement;
+ u32 tmp;
+ extern struct_0200AF00* ptr;
+ u32 tmp1;
+ UIElement* ptr2;
+
+ if (element->type2 == 9) {
+ if (gUnk_0200AF00.unk_2f == 0) {
+ switch (gArea.field_0x18) {
+ case 2:
+ tmp1 = 0xb;
+ break;
+ case 3:
+ tmp1 = 0xa;
+ break;
+ default:
+ tmp1 = gUnk_0200AF00.unk_2c;
+ break;
+ }
+ gUnk_0200AF00.unk_32 = tmp1;
+ }
+ }
+ tmp = gUnk_0200AF00.unk_30[element->buttonElementId];
+ element->unk_0_1 = 0;
+ if (tmp != 0) {
+ sub_0801CAFC(element, tmp + gUnk_080C9044[((SaveHeader*)0x2000000)->language]);
+ buttonUIElement = FindUIElement(element->buttonElementId);
+ if (buttonUIElement != NULL) {
+ element->x = buttonUIElement->x;
+ element->y = buttonUIElement->y;
+ element->unk_0_1 = 1;
+ }
+ }
+}
+END_NONMATCH
+
+UIElement* FindUIElement(u32 type) {
+ UIElement* element;
+ u32 index;
+ for (index = 0; index < MAX_UI_ELEMENTS; index++) {
+ element = &gUnk_0200AF00.elements[index];
+ if (element->used != 0 && type == element->type) {
+ return element;
+ }
+ }
+ return NULL;
+}
+
+void HeartUIElement(UIElement* element) {
+ s32 tmp;
+ u32 x;
+ u16 y;
+ u32 health;
+ u32 frameIndex;
+ element->unk_0_1 = 0;
+ if (((gUnk_0200AF00.unk_1 & 0x10) == 0) && ((gMessage.doTextBox & 0x7f) == 0)) {
+ health = gUnk_0200AF00.health;
+ if (health != 0) {
+ element->unk_0_1 = 1;
+ // Calculate the position for this heart.
+ tmp = ((health + 3) >> 2) * 8;
+ x = tmp + 3;
+ y = 0xc;
+ if (health > 0x28) {
+ y = 0x14;
+ x = tmp - 0x4d;
+ }
+ element->x = x;
+ element->y = y;
+ if ((health & 3) == 0) {
+ frameIndex = 4; // Full heart
+ } else {
+ frameIndex = health & 3; // Quarters
+ }
+ sub_0801CAFC(element, frameIndex + 0x71);
+ }
+ }
+}
+
+void EzloNagUIElement(UIElement* element) {
+ EzloNagUIElement_Actions[element->action](element);
+}
+
+void EzloNagUIElement_Action0(UIElement* element) {
+ if (gUnk_0200AF00.ezloNagFuncIndex == 1) {
+ gUnk_0200AF00.ezloNagFuncIndex = 2;
+ element->x = 0x10;
+ element->y = 0x90;
+ element->unk_6 = 0;
+ element->type = UI_ELEMENT_EZLONAGSTART;
+ element->action = 1;
+ element->unk_0_1 = 1;
+ sub_0801CAB8(element, gUnk_080C9094);
+ }
+}
+
+void EzloNagUIElement_Action1(UIElement* element) {
+ u32 tmp = gUnk_080C9058[element->unk_6++];
+ sub_0805ECEC(0, tmp, tmp, 0);
+ if (tmp == 0) {
+ element->action = 2;
+ element->type = UI_ELEMENT_EZLONAGACTIVE;
gUnk_0200AF00.ezloNagFuncIndex = 3;
SoundReq(SFX_EZLO_UI);
}
}
-void sub_0801CF60(Element* arg0) {
-
- if ((gUnk_0200AF00.ezloNagFuncIndex >= 5) || (gMessage.doTextBox & 0x7f)) {
- arg0->unk4 = 0;
- arg0->unk0 &= -3;
+void EzloNagUIElement_Action2(UIElement* element) {
+ if (gUnk_0200AF00.ezloNagFuncIndex >= 5 || (gMessage.doTextBox & 0x7f)) {
+ element->action = 0;
+ element->unk_0_1 = 0;
return;
}
- sub_0801CAD0(arg0);
- if (arg0->unk13 == 1) {
+ sub_0801CAD0(element);
+ if (element->frameSettings == 1) {
gUnk_0200AF00.ezloNagFuncIndex = 4;
}
}