summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2022-10-08 18:41:48 -0700
committerGitHub <noreply@github.com>2022-10-08 18:41:48 -0700
commitc851c7876c13facaaa4df0d01de3457cd0dc82bb (patch)
tree261864c07f334c35024033a908b4af8e808caebe /src
parent756a8a89da46dade06fad1723de88fa5a82cc2ec (diff)
parent67467fd831d2928715835f8a389b4f464a0f9a7a (diff)
Merge pull request #574 from octorock/data
Extract some data
Diffstat (limited to 'src')
-rw-r--r--src/beanstalkSubtask.c46
-rw-r--r--src/color.c144
-rw-r--r--src/common.c108
-rw-r--r--src/cutscene.c779
-rw-r--r--src/data/figurineMenuData.c56
-rw-r--r--src/data/hitbox.c138
-rw-r--r--src/data/objPalettes.c132
-rw-r--r--src/demo.c16
-rw-r--r--src/enemy.c32
-rw-r--r--src/enemy/chuchuBoss.c6
-rw-r--r--src/enemy/octorokBoss.c4
-rw-r--r--src/enemyUtils.c36
-rw-r--r--src/enterPortalSubtask.c138
-rw-r--r--src/entity.c16
-rw-r--r--src/fade.c7
-rw-r--r--src/fileselect.c295
-rw-r--r--src/game.c2496
-rw-r--r--src/gameData.c503
-rw-r--r--src/gameOverTask.c240
-rw-r--r--src/gameUtils.c945
-rw-r--r--src/itemMetaData.c142
-rw-r--r--src/itemUtils.c591
-rw-r--r--src/kinstone.c143
-rw-r--r--src/main.c2
-rw-r--r--src/manager/enterRoomTextboxManager.c33
-rw-r--r--src/manager/staticBackgroundManager.c4
-rw-r--r--src/manager/weatherChangeManager.c2
-rw-r--r--src/menu/figurineMenu.c (renamed from src/menu/figurine_menu.c)66
-rw-r--r--src/menu/kinstoneMenu.c (renamed from src/menu/kinstone_menu.c)32
-rw-r--r--src/menu/pauseMenu.c (renamed from src/subtask2.c)1550
-rw-r--r--src/menu/pauseMenuScreen6.c276
-rw-r--r--src/menu/pause_menu.c567
-rw-r--r--src/movement.c45
-rw-r--r--src/npc/beedle.c4
-rw-r--r--src/npc/bladeBrothers.c219
-rw-r--r--src/npc/carpenter.c2
-rw-r--r--src/npc/castleMaid.c2
-rw-r--r--src/npc/dog.c191
-rw-r--r--src/npc/farmers.c6
-rw-r--r--src/npc/forestMinish.c526
-rw-r--r--src/npc/gorman.c87
-rw-r--r--src/npc/goron.c6
-rw-r--r--src/npc/guard.c240
-rw-r--r--src/npc/hurdyGurdyMan.c7
-rw-r--r--src/npc/kid.c204
-rw-r--r--src/npc/mama.c2
-rw-r--r--src/npc/melari.c4
-rw-r--r--src/npc/minishEzlo.c2
-rw-r--r--src/npc/mountainMinish.c6
-rw-r--r--src/npc/mutoh.c2
-rw-r--r--src/npc/npc58.c2
-rw-r--r--src/npc/percy.c2
-rw-r--r--src/npc/phonograph.c4
-rw-r--r--src/npc/postman.c173
-rw-r--r--src/npc/sittingPerson.c116
-rw-r--r--src/npc/smith.c6
-rw-r--r--src/npc/sturgeon.c40
-rw-r--r--src/npc/syrup.c4
-rw-r--r--src/npc/talon.c6
-rw-r--r--src/npc/tingleSiblings.c24
-rw-r--r--src/npc/townMinish.c2
-rw-r--r--src/npc/townsperson.c14
-rw-r--r--src/npc/windTribespeople.c7
-rw-r--r--src/npc/zelda.c24
-rw-r--r--src/npc/zeldaFollower.c29
-rw-r--r--src/npcUtils.c13
-rw-r--r--src/object/angryStatue.c5
-rw-r--r--src/object/cameraTarget.c4
-rw-r--r--src/object/cutsceneMiscObject.c28
-rw-r--r--src/object/figurineDevice.c34
-rw-r--r--src/object/fileScreenObjects.c6
-rw-r--r--src/object/frozenOctorok.c2
-rw-r--r--src/object/gleerokParticle.c3
-rw-r--r--src/object/greatFairy.c4
-rw-r--r--src/object/kinstoneSpark.c2
-rw-r--r--src/object/lightRay.c20
-rw-r--r--src/object/linkHoldingItem.c8
-rw-r--r--src/object/lockedDoor.c2
-rw-r--r--src/object/minecart.c2
-rw-r--r--src/object/objectA.c2
-rw-r--r--src/object/pushableGrave.c4
-rw-r--r--src/object/warpPoint.c8
-rw-r--r--src/objectUtils.c16
-rw-r--r--src/physics.c26
-rw-r--r--src/playerItem/playerItemBow.c66
-rw-r--r--src/playerItem/playerItemCellOverwriteSet.c4
-rw-r--r--src/playerItem/playerItemGustJar.c6
-rw-r--r--src/playerItem/playerItemShield.c43
-rw-r--r--src/playerUtils.c266
-rw-r--r--src/projectile.c20
-rw-r--r--src/room.c3
-rw-r--r--src/roomInit.c20
-rw-r--r--src/save.c8
-rw-r--r--src/script.c22
-rw-r--r--src/scroll.c120
-rw-r--r--src/staffroll.c21
-rw-r--r--src/sub_08055E08.c36
-rw-r--r--src/subtask.c1036
-rw-r--r--src/subtask/subtaskAuxCutscene.c157
-rw-r--r--src/subtask/subtaskFastTravel.c191
-rw-r--r--src/subtask/subtaskLocalMapHint.c96
-rw-r--r--src/subtask/subtaskMapHint.c71
-rw-r--r--src/subtask/subtaskWorldEvent.c103
-rw-r--r--src/text.c64
-rw-r--r--src/title.c4
-rw-r--r--src/ui.c8
-rw-r--r--src/worldEvent/worldEvent0.c41
-rw-r--r--src/worldEvent/worldEvent1.c54
-rw-r--r--src/worldEvent/worldEvent10.c58
-rw-r--r--src/worldEvent/worldEvent11.c45
-rw-r--r--src/worldEvent/worldEvent12.c47
-rw-r--r--src/worldEvent/worldEvent13.c39
-rw-r--r--src/worldEvent/worldEvent14.c48
-rw-r--r--src/worldEvent/worldEvent15.c56
-rw-r--r--src/worldEvent/worldEvent16.c44
-rw-r--r--src/worldEvent/worldEvent17.c161
-rw-r--r--src/worldEvent/worldEvent19.c49
-rw-r--r--src/worldEvent/worldEvent2.c65
-rw-r--r--src/worldEvent/worldEvent20.c40
-rw-r--r--src/worldEvent/worldEvent21.c39
-rw-r--r--src/worldEvent/worldEvent22.c43
-rw-r--r--src/worldEvent/worldEvent23.c37
-rw-r--r--src/worldEvent/worldEvent24.c47
-rw-r--r--src/worldEvent/worldEvent25.c71
-rw-r--r--src/worldEvent/worldEvent3.c47
-rw-r--r--src/worldEvent/worldEvent4.c62
-rw-r--r--src/worldEvent/worldEvent5.c94
-rw-r--r--src/worldEvent/worldEvent6.c66
-rw-r--r--src/worldEvent/worldEvent7.c65
-rw-r--r--src/worldEvent/worldEvent8.c58
-rw-r--r--src/worldEvent/worldEvent9.c67
131 files changed, 9804 insertions, 5746 deletions
diff --git a/src/beanstalkSubtask.c b/src/beanstalkSubtask.c
index 19f530be..ceb5a7c3 100644
--- a/src/beanstalkSubtask.c
+++ b/src/beanstalkSubtask.c
@@ -26,18 +26,9 @@ extern void gMapData;
extern u8 gUpdateVisibleTiles;
extern u16 gMapDataTopSpecial[];
extern u16 gMapDataBottomSpecial[];
-
extern const u8 gGlobalGfxAndPalettes[];
extern const u8 gUnk_081091E4[];
-extern void (*const gUnk_080B4458[])(void);
-extern const u16 gUnk_080B44A0[];
-extern const u16 gUnk_080B4410[];
-extern const s16 gUnk_080B4488[];
-extern const s16 gUnk_080B44A8[];
-
-extern const struct_080B44D0 gUnk_080B44D0[];
-
typedef struct {
u16 tileType;
u16 kind;
@@ -47,6 +38,18 @@ typedef struct {
u16 unk_a;
} Data;
+extern const u16 gUnk_080B4410[]; // TODO figure out structure
+extern void (*const gUnk_080B4458[])(void);
+extern const s16 gUnk_080B4468[]; // TODO struct xy
+extern const s16 gUnk_080B4478[]; // TODO struct xy
+extern const s16 gUnk_080B4488[];
+extern const s16 gUnk_080B4490[]; // TODO struct xy
+extern const u16 gUnk_080B44A0[];
+extern const s16 gUnk_080B44A8[]; // TODO struct xy
+extern const u32 gUnk_080B44B8[]; // TODO actually function pointers?
+extern const Data gUnk_080B44C0[];
+extern const Data gUnk_080B44C2[];
+
void sub_0801AD6C(const Data*, u32);
bool32 sub_0801A4F8(void);
bool32 sub_0801AA58(Entity*, u32, u32);
@@ -110,31 +113,30 @@ void SetBGDefaults(void) {
gMapTop.bgSettings->control = gUnk_080B77C0[1];
}
-void sub_080197D4(u32* param_1) {
+void sub_080197D4(struct_08109194* param_1) {
u32 uVar1;
u8* src;
void* dest;
do {
- dest = (void*)param_1[1];
+ dest = param_1->dest;
if (dest != NULL) {
- src = &gMapData + (*param_1 & 0x7fffffff);
- if ((param_1[2] & 0x80000000) != 0) {
+ src = &gMapData + (param_1->src & 0x7fffffff);
+ if ((param_1->size & 0x80000000) != 0) {
if ((u32)dest >> 0x18 == 6) {
LZ77UnCompVram(src, dest);
} else {
LZ77UnCompWram(src, dest);
}
} else {
- MemCopy(src, dest, param_1[2]);
+ MemCopy(src, dest, param_1->size);
}
} else {
- LoadPaletteGroup((u32) * (u16*)param_1);
+ LoadPaletteGroup(*(u16*)param_1);
sub_080533CC();
}
- param_1 += 3;
- uVar1 = *(param_1 - 3);
- } while ((uVar1 & 0x80000000) != 0);
+ param_1++;
+ } while (((param_1 - 1)->src & 0x80000000) != 0);
}
// Has ifdefs for other variants
@@ -483,10 +485,6 @@ u32 sub_0801AC68(u32 position, u32 data) {
return data << 2;
}
-extern const Data gUnk_080B44C0[];
-extern const Data gUnk_080B44C2[];
-extern const u32 gUnk_080B44B8[];
-
void sub_0801AC98(void) {
u32 position;
u32 width;
@@ -571,11 +569,11 @@ u32 sub_0801AE34(void) {
return gRoomControls.scroll_flags >> 1 & 1;
}
-void sub_0801AE44(s32 param_1) {
+void sub_0801AE44(bool32 loadGfx) {
void (*func)(void);
gRoomControls.unk_34 = 0;
sub_0807BFD0();
- if (param_1 != 0) {
+ if (loadGfx != 0) {
LoadRoomGfx();
}
sub_080809D4();
diff --git a/src/color.c b/src/color.c
index 01e678e8..17de6630 100644
--- a/src/color.c
+++ b/src/color.c
@@ -35,7 +35,7 @@ void sub_0801CFD0(u32 index) {
p->_0_0 = 4;
p->_0_4 = 1;
p->_1 = 0x80;
- p->_2 = 0xFFFF;
+ p->objPaletteId = 0xffff;
}
void sub_0801D000(u32 a1) {
@@ -56,58 +56,58 @@ void sub_0801D000(u32 a1) {
gUnk_02001A3C._0_0 = 0;
gUnk_02001A3C._0_4 = 0;
gUnk_02001A3C._1 = 0;
- gUnk_02001A3C._2 = 0;
+ gUnk_02001A3C.objPaletteId = 0;
}
}
}
-u32 LoadObjPalette(Entity* entity, u32 a2) {
- Palette* puVar1;
- int iVar2;
+u32 LoadObjPalette(Entity* entity, u32 objPaletteId) {
+ Palette* palette;
+ s32 slot;
u32 uVar3;
u32 uVar4;
- iVar2 = FindPalette(a2);
- if (iVar2 < 0) {
- if (a2 < 0x16) {
+ slot = FindPalette(objPaletteId);
+ if (slot < 0) {
+ if (objPaletteId < 0x16) {
uVar3 = 1;
} else {
- uVar3 = gUnk_08133368[(a2 - 0x16)].BYTES.byte3;
+ uVar3 = gUnk_08133368[(objPaletteId - 0x16)].BYTES.byte3;
uVar3 &= 0xf;
}
- iVar2 = FindFreeObjPalette(uVar3);
- if (iVar2 < 0) {
+ slot = FindFreeObjPalette(uVar3);
+ if (slot < 0) {
CleanUpObjPalettes();
- iVar2 = FindFreeObjPalette(uVar3);
+ slot = FindFreeObjPalette(uVar3);
}
- if (iVar2 >= 0) {
- puVar1 = &gPaletteList[iVar2];
- puVar1->_2 = a2;
- puVar1->_1 = 0;
- puVar1->_0_4 = uVar3;
- puVar1->_0_0 = 3;
+ if (slot >= 0) {
+ palette = &gPaletteList[slot];
+ palette->objPaletteId = objPaletteId;
+ palette->_1 = 0;
+ palette->_0_4 = uVar3;
+ palette->_0_0 = 3;
for (uVar3 = uVar3 - 1; uVar3 != 0; uVar3--) {
- puVar1++;
- puVar1->_2 = 0;
- puVar1->_1 = 0;
- puVar1->_0_4 = uVar3;
- puVar1->_0_0 = 2;
+ palette++;
+ palette->objPaletteId = 0;
+ palette->_1 = 0;
+ palette->_0_4 = uVar3;
+ palette->_0_0 = 2;
}
- LoadObjPaletteAtIndex(a2, iVar2);
+ LoadObjPaletteAtIndex(objPaletteId, slot);
}
}
- SetEntityObjPalette(entity, iVar2);
- return iVar2;
+ SetEntityObjPalette(entity, slot);
+ return slot;
}
-s32 FindPalette(u32 a1) {
+s32 FindPalette(u32 objPaletteId) {
u32 index;
Palette* palette;
- if (a1 <= 5)
- return a1;
+ if (objPaletteId <= 5)
+ return objPaletteId;
for (index = 6, palette = gPaletteList; index < ARRAY_COUNT(gPaletteList); index++) {
- if (a1 == palette[index]._2) {
+ if (objPaletteId == palette[index].objPaletteId) {
return index;
}
}
@@ -115,37 +115,37 @@ s32 FindPalette(u32 a1) {
return -1;
}
-u32 FindFreeObjPalette(u32 a1) {
- u32 uVar1;
- u32 uVar2;
+u32 FindFreeObjPalette(u32 paletteCount) {
+ u32 count;
+ u32 index;
u32 tmp;
- for (uVar1 = 0, uVar2 = 6; uVar2 < ARRAY_COUNT(gPaletteList); uVar2++) {
- switch ((gPaletteList[uVar2]._0_0)) {
+ for (count = 0, index = 6; index < ARRAY_COUNT(gPaletteList); index++) {
+ switch ((gPaletteList[index]._0_0)) {
case 0:
- uVar1 = uVar1 + 1;
- if (a1 > uVar1)
+ count = count + 1;
+ if (paletteCount > count)
continue;
- tmp = uVar1 - 1;
- return uVar2 - tmp;
+ tmp = count - 1;
+ return index - tmp;
default:
- uVar1 = 0;
+ count = 0;
break;
}
}
- for (uVar1 = 0, uVar2 = 6; uVar2 < ARRAY_COUNT(gPaletteList); uVar2++) {
- switch (gPaletteList[uVar2]._0_0) {
+ for (count = 0, index = 6; index < ARRAY_COUNT(gPaletteList); index++) {
+ switch (gPaletteList[index]._0_0) {
case 0:
case 1:
- uVar1++;
- if (a1 <= uVar1) {
- tmp = uVar1 - 1;
- return uVar2 - tmp;
+ count++;
+ if (paletteCount <= count) {
+ tmp = count - 1;
+ return index - tmp;
}
break;
default:
- uVar1 = 0;
+ count = 0;
break;
}
}
@@ -154,7 +154,7 @@ u32 FindFreeObjPalette(u32 a1) {
NONMATCH("asm/non_matching/color/SetEntityObjPalette.inc", void SetEntityObjPalette(Entity* entity, u32 palette)) {
u32 uVar1;
- Palette* pPVar1;
+ Palette* pal;
if (palette < 0) {
palette = 0;
@@ -164,15 +164,15 @@ NONMATCH("asm/non_matching/color/SetEntityObjPalette.inc", void SetEntityObjPale
}
entity->palette.b.b0 = palette;
entity->palette.b.b4 = palette;
- pPVar1 = &gPaletteList[palette];
- if ((s8)pPVar1->_0_0 != 4) {
- pPVar1->_1++;
- uVar1 = pPVar1->_0_4;
- pPVar1->_0_0 = 3;
+ pal = &gPaletteList[palette];
+ if ((s8)pal->_0_0 != 4) {
+ pal->_1++;
+ uVar1 = pal->_0_4;
+ pal->_0_0 = 3;
while (uVar1 = uVar1 - 1, uVar1 != 0) {
- pPVar1 = pPVar1 + 1;
- pPVar1->_0_4 = uVar1;
- pPVar1->_0_0 = 2;
+ pal = pal + 1;
+ pal->_0_4 = uVar1;
+ pal->_0_0 = 2;
}
}
}
@@ -204,7 +204,7 @@ void sub_0801D244(u32 a1) {
}
}
-void sub_0801D28C(Entity* entity, u32 palette) {
+void sub_0801D28C(Entity* entity, u32 objPaletteId) {
u32 c = entity->spriteAnimation[1];
Palette* list = gPaletteList;
Palette* p = &list[c];
@@ -213,31 +213,31 @@ void sub_0801D28C(Entity* entity, u32 palette) {
u32 lo = ((u32)((*(u8*)p) << 0x1c)) >> 0x1c;
if (lo == 3) {
- p->_2 = palette;
- LoadObjPaletteAtIndex(palette, c);
+ p->objPaletteId = objPaletteId;
+ LoadObjPaletteAtIndex(objPaletteId, c);
}
}
-void ChangeObjPalette(Entity* entity, u32 a2) {
+void ChangeObjPalette(Entity* entity, u32 objPaletteId) {
UnloadOBJPalette(entity);
- LoadObjPalette(entity, a2);
+ LoadObjPalette(entity, objPaletteId);
}
-void LoadObjPaletteAtIndex(u32 a1, u32 a2) {
+void LoadObjPaletteAtIndex(u32 objPaletteId, u32 a2) {
u16* buffer;
gUsedPalettes |= 1 << (a2 + 0x10);
- if (5 < a1) {
- if (a1 == 0x15) {
+ if (objPaletteId > 5) {
+ if (objPaletteId == 0x15) {
buffer = gPaletteBuffer;
MemFill16(buffer[0x3C], buffer + (a2 + 0x10) * 0x10, 0x20);
- } else if (a1 < 0x15) {
- LoadPalettes((u8*)(gPaletteBuffer + (a1 - 6) * 0x10), a2 + 0x10, 1);
+ } else if (objPaletteId < 0x15) {
+ LoadPalettes((u8*)(gPaletteBuffer + (objPaletteId - 6) * 0x10), a2 + 0x10, 1);
} else {
- u32 tmp1 = gUnk_08133368[(a1 - 0x16)].WORD_U;
- u32 tmp2 = (tmp1 >> 0x18) & 0xf;
- tmp1 &= 0xffffff;
- LoadPalettes(gGlobalGfxAndPalettes + tmp1, a2 + 0x10, tmp2);
+ u32 offset = gUnk_08133368[(objPaletteId - 0x16)].WORD_U;
+ u32 numPalettes = (offset >> 0x18) & 0xf;
+ offset &= 0xffffff;
+ LoadPalettes(gGlobalGfxAndPalettes + offset, a2 + 0x10, numPalettes);
}
}
}
@@ -260,7 +260,7 @@ void CleanUpObjPalettes(void) {
gPaletteList[index1]._0_0 = 0;
gPaletteList[index1]._0_4 = 0;
gPaletteList[index1]._1 = 0;
- gPaletteList[index1]._2 = 0;
+ gPaletteList[index1].objPaletteId = 0;
break;
}
}
@@ -337,7 +337,7 @@ void sub_0801D48C(u32 a1, u32 a2) {
pPVar1->_0_0 = 0;
pPVar1->_0_4 = 0;
pPVar1->_1 = 0;
- pPVar1->_2 = 0;
+ pPVar1->objPaletteId = 0;
MemCopy(iVar3, iVar4, 0x20);
iVar3 += 0x10;
pPVar1++;
diff --git a/src/common.c b/src/common.c
index cffc3e61..cba8e53d 100644
--- a/src/common.c
+++ b/src/common.c
@@ -79,7 +79,7 @@ extern const DungeonLayout** const gUnk_080C9C50[];
extern u8 gMapDataBottomSpecial[];
u32 sub_0801DF10(const DungeonLayout* lyt);
-bool32 sub_0801DF90(TileEntity* tileEntity, u32 bank);
+bool32 IsRoomVisited(TileEntity* tileEntity, u32 bank);
u32 sub_0801DF60(u32 a1, u8* p);
u32 sub_0801DF78(u32 a1, u32 a2);
void sub_0801DF28(u32 x, u32 y, s32 color);
@@ -437,6 +437,7 @@ void DrawDungeonFeatures(u32 floor, void* data, u32 size) {
layout = gUnk_080C9C50[gArea.dungeon_idx][floor];
MemClear(gMapDataBottomSpecial, 0x8000);
while (layout->area != 0) {
+ // ROOM_VISIT_MARKER has to be first TileEntity in the room.
tileEntity = (TileEntity*)GetRoomProperty(layout->area, layout->room, 3);
bankOffset = sub_0801DF10(layout);
features = 0;
@@ -446,7 +447,7 @@ void DrawDungeonFeatures(u32 floor, void* data, u32 size) {
if (HasDungeonSmallKey()) {
features = 2;
}
- if (sub_0801DF90(tileEntity, bankOffset)) {
+ if (IsRoomVisited(tileEntity, bankOffset)) {
features = 3;
}
}
@@ -514,12 +515,12 @@ u32 sub_0801DF78(u32 a1, u32 a2) {
}
}
-bool32 sub_0801DF90(TileEntity* tileEntity, u32 bank) {
+bool32 IsRoomVisited(TileEntity* tileEntity, u32 bank) {
if (tileEntity == NULL)
return FALSE;
for (; tileEntity->type != 0; tileEntity++) {
- if (tileEntity->type == 1)
+ if (tileEntity->type == ROOM_VISIT_MARKER)
return CheckLocalFlagByBank(bank, tileEntity->localFlag);
}
return FALSE;
@@ -531,7 +532,7 @@ void sub_0801DFB4(Entity* entity, u32 textIndex, u32 a3, u32 a4) {
gFuseInfo._8 = a3;
gFuseInfo._a = a4;
gFuseInfo.ent = entity;
- gFuseInfo._3 = gUnk_03003DF0.unk_2;
+ gFuseInfo.kinstoneId = gUnk_03003DF0.unk_2;
if (entity != NULL) {
gFuseInfo.prevUpdatePriority = entity->updatePriority;
entity->updatePriority = 2;
@@ -738,12 +739,12 @@ void sub_0801E64C(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_
}
}
-void sub_0801E6C8(u32 param_1) {
+void sub_0801E6C8(u32 kinstoneId) {
u32 tmp;
u32 index;
- if (param_1 - 1 < 100) {
+ if (kinstoneId - 1 < 100) {
for (index = 0; index < 0x80; index++) {
- if (param_1 == gSave.unk1C1[index]) {
+ if (kinstoneId == gSave.unk1C1[index]) {
gSave.unk1C1[index] = 0xf1;
}
}
@@ -752,7 +753,7 @@ void sub_0801E6C8(u32 param_1) {
gSave.unk1C1[tmp] = 0xf2;
}
for (index = 0; index < 0x20; index++) {
- if (param_1 == gUnk_03003DF0.array[index].unk_3) {
+ if (kinstoneId == gUnk_03003DF0.array[index].unk_3) {
gUnk_03003DF0.array[index].unk_3 = 0xf1;
}
}
@@ -803,18 +804,18 @@ u32 sub_0801E7D0(u32 a1) {
return gSave.unk12B[tmp];
}
-u32 CheckKinstoneFused(u32 idx) {
- if (idx > 100 || idx < 1) {
+u32 CheckKinstoneFused(u32 kinstoneId) {
+ if (kinstoneId > 100 || kinstoneId < 1) {
return 0;
}
- return ReadBit(&gSave.unk241, idx);
+ return ReadBit(&gSave.fusedKinstones, kinstoneId);
}
-bool32 sub_0801E810(u32 idx) {
- if (idx > 100 || idx < 1) {
+bool32 sub_0801E810(u32 kinstoneId) {
+ if (kinstoneId > 100 || kinstoneId < 1) {
return FALSE;
}
- return ReadBit(&gSave.unk24E, idx);
+ return ReadBit(&gSave.unk24E, kinstoneId);
}
ASM_FUNC("asm/non_matching/common/sub_0801E82C.inc", void sub_0801E82C(void));
@@ -829,57 +830,59 @@ s32 sub_0801E8B0(u32 idx) {
return -1;
}
+// Check conditions, something with kinstones
void sub_0801E8D4(void) {
- u32 i;
- for (i = 10; i <= 100; ++i) {
- if (CheckKinstoneFused(i) && !sub_0801E810(i)) {
- u32 evt_type = gUnk_080C9CBC[i].evt_type;
- struct_080FE320* s = &gUnk_080FE320[evt_type];
+ u32 kinstoneId;
+ for (kinstoneId = 10; kinstoneId <= 100; ++kinstoneId) {
+ if (CheckKinstoneFused(kinstoneId) && !sub_0801E810(kinstoneId)) {
+ u32 worldEventId = gKinstoneWorldEvents[kinstoneId].worldEventId;
+ const WorldEvent* s = &gWorldEvents[worldEventId];
#if !defined EU && !defined JP
u32 flag = s->flag;
#endif
u32 tmp;
- switch (s->_10) {
- case 0:
+ switch (s->condition) {
+ case CND_0:
tmp = 0;
break;
- case 1:
- tmp = s->_11;
+ case CND_1:
+ tmp = s->bank;
break;
- case 2:
+ case CND_2:
tmp = 0xf;
break;
- case 3:
+ case CND_3:
tmp = 0x10;
break;
- case 4:
+ case CND_4:
tmp = 0x11;
break;
#if !defined EU && !defined JP
- case 5:
- tmp = 4;
- flag = 0x83;
+ // Special conditions for BEANDEMO_00 to BEANDEMO_04
+ case CND_5:
+ tmp = LOCAL_BANK_3;
+ flag = SORA_10_H00;
break;
- case 6:
- tmp = 4;
- flag = 0x84;
+ case CND_6:
+ tmp = LOCAL_BANK_3;
+ flag = SORA_11_H00;
break;
- case 7:
- tmp = 4;
- flag = 0x87;
+ case CND_7:
+ tmp = LOCAL_BANK_3;
+ flag = SORA_12_T00;
break;
- case 8:
- tmp = 4;
- flag = 0x88;
+ case CND_8:
+ tmp = LOCAL_BANK_3;
+ flag = SORA_13_H00;
break;
- case 9:
- tmp = 4;
- flag = 0x8b;
+ case CND_9:
+ tmp = LOCAL_BANK_3;
+ flag = SORA_14_T00;
break;
#ifndef DEMO_JP
- case 10:
- tmp = 5;
- flag = 0x88;
+ case CND_10:
+ tmp = LOCAL_BANK_4;
+ flag = KS_B15;
break;
#endif
#endif
@@ -889,7 +892,7 @@ void sub_0801E8D4(void) {
#else
if (sub_0807CB24(tmp, s->flag)) {
#endif
- WriteBit(&gSave.unk24E, i);
+ WriteBit(&gSave.unk24E, kinstoneId);
}
}
}
@@ -911,7 +914,7 @@ void (*const gUnk_080C9CAC[])(void) = {
// TODO merge
#ifdef JP
-const struct_080C9CBC gUnk_080C9CBC[] = {
+const KinstoneWorldEvent gKinstoneWorldEvents[] = {
{ 15, 44, 45, 8, 0, 0, 0, 0 }, { 4, 8, 1, 0, 0, 1, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 },
{ 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 },
{ 4, 13, 2, 0, 0, 6, 2, 0 }, { 4, 14, 2, 0, 0, 7, 2, 0 }, { 4, 15, 2, 0, 0, 8, 2, 0 },
@@ -956,7 +959,7 @@ const struct_080C9CBC gUnk_080C9CBC[] = {
#else
#ifdef EU
-const struct_080C9CBC gUnk_080C9CBC[] = {
+const KinstoneWorldEvent gKinstoneWorldEvents[] = {
{ 15, 44, 45, 8, 0, 0, 0, 0 }, { 4, 8, 1, 0, 0, 1, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 },
{ 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 },
{ 4, 13, 2, 0, 0, 6, 2, 0 }, { 4, 14, 2, 0, 0, 7, 2, 0 }, { 4, 15, 2, 0, 0, 8, 2, 0 },
@@ -999,7 +1002,7 @@ const struct_080C9CBC gUnk_080C9CBC[] = {
{ 2, 43, 7, 8, 0, 18, 0, 0 },
};
#else
-const struct_080C9CBC gUnk_080C9CBC[] = {
+const KinstoneWorldEvent gKinstoneWorldEvents[] = {
{ 15, 44, 45, 8, 0, 0, 0, 0 }, { 4, 8, 1, 0, 0, 1, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 },
{ 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 },
{ 4, 13, 2, 0, 0, 6, 2, 0 }, { 4, 14, 2, 0, 0, 7, 2, 0 }, { 4, 15, 2, 0, 0, 8, 2, 0 },
@@ -1063,13 +1066,14 @@ const u8 gUnk_080CA11C[] = {
24, 45, 53, 54, 55, 57, 60, 68, 70, 71, 78, 80, 83, 85, 86, 88, 95, 96, 0, 0,
};
+// Get a random kinstone
u32 sub_0801EA74(void) {
s32 r = (s32)Random() % 18;
u32 i;
for (i = 0; i < 18; ++i) {
- u32 n = gUnk_080CA11C[r];
- if (!CheckKinstoneFused(n))
- return n;
+ u32 kinstoneId = gUnk_080CA11C[r];
+ if (!CheckKinstoneFused(kinstoneId))
+ return kinstoneId;
r = (r + 1) % 18;
}
return 0xF2;
diff --git a/src/cutscene.c b/src/cutscene.c
new file mode 100644
index 00000000..93ea6eac
--- /dev/null
+++ b/src/cutscene.c
@@ -0,0 +1,779 @@
+/**
+ * @file cutscene.c
+ *
+ * @brief Cutscenes
+ */
+#include "cutscene.h"
+
+#include "enemy.h"
+#include "fade.h"
+#include "fileselect.h"
+#include "functions.h"
+#include "game.h"
+#include "main.h"
+#include "menu.h"
+#include "npc.h"
+#include "object.h"
+#include "screen.h"
+
+void sub_08051F78(void);
+void sub_08051FF0(void);
+void sub_08052004(void);
+
+const EntityData gUnk_080FCB94[] = {
+ { OBJECT, 15, CHUCHU_BOSS_CUTSCENE, 0, 0, 0x1c8, 0x288, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+void sub_080535AC(void);
+void sub_080535F4(void);
+void nullsub_481(void);
+void sub_08053618(void);
+void (*const gUnk_080FCBB4[])(void) = {
+ sub_080535AC,
+ sub_080535F4,
+ nullsub_481,
+ sub_08053618,
+};
+
+void CutsceneMain_Init(void) {
+ gUnk_080FCBB4[gMenu.overlayType]();
+}
+
+void sub_080535AC(void) {
+ gMenu.overlayType = 1;
+ gMenu.transitionTimer = 120;
+ gUI.field_0x6 = 1;
+ gUpdateVisibleTiles = 1;
+ gScreen.lcd.displayControl &= 0xfeff;
+ LoadRoomEntityList(gUnk_080FCB94);
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8);
+}
+
+void sub_080535F4(void) {
+ if (gFadeControl.active == 0) {
+ ResetSystemPriority();
+ gMenu.overlayType = 2;
+ }
+}
+
+void nullsub_481(void) {
+}
+
+void sub_08053618(void) {
+ gMenu.transitionTimer--;
+ if (gMenu.transitionTimer == 0) {
+ sub_08052004();
+ }
+}
+
+void sub_08053634(void) {
+ gUI.nextToLoad = 3; // Subtask_FadeOut
+ MessageInitialize();
+}
+
+void sub_08053648(void) {
+ Entity* obj = CreateObject(SMOKE, 0, 0);
+ if (obj != NULL) {
+ obj->x.HALF.HI = gRoomControls.origin_x + 0x2d0;
+ obj->y.HALF.HI = gRoomControls.origin_y + 0x148;
+ }
+}
+
+void sub_0805367C(void) {
+ gMenu.overlayType++;
+}
+
+void sub_0805368C(void) {
+ Entity* entity = FindEntityByID(OBJECT, HOUSE_DOOR_INT, 6);
+ if (entity != NULL) {
+ DeleteEntity(entity);
+ SoundReq(SFX_F0); // TODO Door sound during intro
+ }
+}
+
+void sub_080536A8(void) {
+ sub_080A71C4(5, 5, FADE_INSTANT, 0x10);
+}
+
+void sub_080536B8(void) {
+ sub_080A71C4(5, 3, FADE_INSTANT, 4);
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
+}
+
+extern Script script_IntroCameraTarget;
+extern Script script_ZeldaMoveToLinksHouse;
+extern Script script_HouseDoorIntro;
+extern Script script_CutsceneOrchestratorIntro2;
+
+const EntityData gUnk_080FCBC4[] = {
+ { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x230, 0x1a8, (u32)&script_IntroCameraTarget },
+ { NPC, 79, ZELDA, 0, 0, 0x230, 0x1a8, (u32)&script_ZeldaMoveToLinksHouse },
+ { OBJECT, 79, HOUSE_DOOR_EXT, 3, 3, 0x290, 0x193, (u32)&script_HouseDoorIntro },
+ { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x2d0, 0x1a8, (u32)&script_CutsceneOrchestratorIntro2 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+extern Script script_CutsceneOrchestratorIntro;
+extern Script script_SmithIntro;
+extern Script script_ZeldaIntro;
+const EntityData gUnk_080FCC14[] = {
+ { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x0, 0x0, (u32)&script_CutsceneOrchestratorIntro },
+ { NPC, 79, SMITH, 0, 0, 0xb8, 0x60, (u32)&script_SmithIntro },
+ { NPC, 79, ZELDA, 0, 0, 0x8, 0x5e, (u32)&script_ZeldaIntro },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+extern Script script_ZeldaLeaveLinksHouse;
+const EntityData gUnk_080FCC54[] = {
+ { NPC, 79, ZELDA, 0, 0, 0xa0, 0x5d, (u32)&script_ZeldaLeaveLinksHouse },
+ { OBJECT, 15, HOUSE_DOOR_INT, 4, 256, 0x78, 0x88, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+const Font gUnk_080FCC84 = {
+ &gBG1Buffer[0x1cf], BG_TILE_ADDR(0x188), gTextGfxBuffer, 0, 0xf020, 0xf0, 1, 0, 0, 0, 0, 5, 0, 0, 0
+};
+const Font gUnk_080FCC9C = {
+ &gBG1Buffer[0x96], BG_TILE_ADDR(0x188), gTextGfxBuffer, 0, 0xf020, 0x78, 1, 0, 0, 0, 0, 5, 0, 0, 0
+};
+
+const struct_080FCCB4 gUnk_080FCCB4[] = {
+ { &gUnk_080FCC84, 240, 96, 193, 1 }, { &gUnk_080FCC84, 240, 96, 453, 6 }, { &gUnk_080FCC9C, 120, 160, 363, 4 },
+ { &gUnk_080FCC9C, 120, 160, 498, 4 }, { &gUnk_080FCC84, 240, 96, 368, 4 }, { &gUnk_080FCC84, 240, 96, 358, 4 },
+};
+
+void sub_08053758(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053904(void);
+void sub_08053974(void);
+void nullsub_482(void);
+void sub_080539BC(void);
+void (*const gUnk_080FCCFC[])(void) = {
+ sub_08053758, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800,
+ sub_08053894, sub_08053800, sub_08053904, sub_08053974, nullsub_482, sub_080539BC, nullsub_482,
+};
+
+void sub_080536D4(void) {
+ gUnk_080FCCFC[gMenu.overlayType]();
+}
+
+void sub_0805370C(void);
+void (*const gUnk_080FCD38[])(void) = {
+ sub_0805370C,
+ nullsub_482,
+};
+
+void sub_080536F0(void) {
+ gUnk_080FCD38[gMenu.overlayType]();
+}
+
+void sub_0805370C(void) {
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ sub_08051FF0();
+ LoadRoomEntityList((EntityData*)gUnk_080FCC54);
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void sub_08053758(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_08053800(void);
+void sub_08053894(void);
+void sub_080539F4(void);
+void sub_08053A1C(void);
+void sub_08053A5C(void);
+void sub_08053A90(void);
+void (*const gUnk_080FCD40[])(void) = {
+ sub_08053758, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800,
+ sub_08053894, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800,
+ sub_08053894, sub_080539F4, sub_08053A1C, sub_08053A5C, sub_08053A90,
+};
+
+void sub_0805373C(void) {
+ gUnk_080FCD40[gMenu.overlayType]();
+}
+
+void sub_08053758(void) {
+ gMenu.overlayType = 1;
+ gMenu.transitionTimer = 120;
+ gMenu.field_0xa = 0x1e;
+ *((u8*)&gMenu + 0x10) = 0; // TODO
+ gUI.field_0x6 = 1;
+ gMapBottom.bgSettings = NULL;
+ gMapTop.bgSettings = NULL;
+ gRoomControls.camera_target = NULL;
+ gRoomControls.scroll_y = 0;
+ gRoomControls.scroll_x = 0;
+ ClearBgAnimations();
+ DispReset(0);
+ gScreen.lcd.displayControl = 0x2640;
+ gScreen.controls.layerFXControl = 0x2244;
+ gScreen.controls.alphaBlend = 0x1000;
+ gScreen.controls.windowInsideControl = 0x1f;
+ gScreen.controls.windowOutsideControl = 0x3f;
+ gScreen.controls.window0HorizontalDimensions = 0xf0;
+ gScreen.controls.window0VerticalDimensions = 0x60;
+ gScreen.bg1.control = 0x1c4e;
+ gScreen.bg2.control = 0x1dc1;
+ SoundReq(BGM_STORY);
+ ResetSystemPriority();
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
+}
+
+void sub_08053800(void) {
+ u32 index;
+ const struct_080FCCB4* ptr;
+ if (gFadeControl.active == 0) {
+ index = gGenericMenu.unk10.a[0];
+ ptr = &gUnk_080FCCB4[index];
+ gGenericMenu.base.transitionTimer = ptr->transitionTimer;
+ gGenericMenu.base.field_0xa = 0x1e;
+ gGenericMenu.unk10.a[0]++;
+ gGenericMenu.base.overlayType++;
+ gGenericMenu.base.storyPanelIndex = 0;
+ LoadPaletteGroup(index + 0x8a);
+ LoadGfxGroup(index + 0x3a);
+ MemClear(&gBG1Buffer, 0x800);
+ ShowTextBox(TEXT_INDEX(TEXT_PICORI, 1) + index, ptr->font);
+ gScreen.bg1.updated = 1;
+ gScreen.controls.alphaBlend = 0x10;
+ gScreen.controls.window0HorizontalDimensions = ptr->width;
+ gScreen.controls.window0VerticalDimensions = ptr->height;
+ SetFade(FADE_INSTANT, ptr->fadeSpeed);
+ }
+}
+
+void sub_08053894(void) {
+ u32 tmp;
+ if (gFadeControl.active == 0) {
+ gMenu.transitionTimer--;
+ if (gMenu.field_0xa != 0) {
+ gMenu.field_0xa--;
+ } else {
+ if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) {
+ tmp = ++gMenu.storyPanelIndex << 0x18;
+ gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - ((tmp) >> 0x19));
+ }
+ }
+ if (gMenu.transitionTimer == 0) {
+ gMenu.overlayType++;
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
+ }
+ }
+}
+
+void sub_08053904(void) {
+ u32 tmp;
+ if (gFadeControl.active == 0) {
+ gMenu.transitionTimer--;
+ if (gMenu.field_0xa != 0) {
+ gMenu.field_0xa--;
+ } else {
+ if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) {
+ tmp = ++gMenu.storyPanelIndex << 0x18;
+ gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - (tmp >> 0x19));
+ }
+ }
+ if (gMenu.transitionTimer == 0) {
+ gMenu.overlayType++;
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 1);
+ }
+ }
+}
+
+void sub_08053974(void) {
+ if (gFadeControl.active == 0) {
+ InitFade();
+ DispReset(1);
+ SetBGDefaults();
+ sub_08051F78();
+ LoadRoomEntityList(gUnk_080FCBC4);
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
+ gMenu.overlayType++;
+ }
+}
+
+void nullsub_482(void) {
+}
+
+void sub_080539BC(void) {
+ SetBGDefaults();
+ DeleteAllEntities();
+ sub_08051F9C(0x22, 0x11, 0, 0);
+ sub_0804B0B0(0x22, 0x11);
+ LoadRoomEntityList(gUnk_080FCC14);
+ gMenu.overlayType++;
+}
+
+void sub_080539F4(void) {
+ if (gFadeControl.active == 0) {
+ DispReset(1);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 60;
+ }
+}
+
+void sub_08053A1C(void) {
+ gMenu.transitionTimer--;
+ if (gMenu.transitionTimer == 0) {
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 8;
+ MessageFromTarget(TEXT_INDEX(TEXT_PICORI, 0x07));
+ gMessage.textWindowPosX = 1;
+ gMessage.textWindowPosY = 8;
+ SetFade(FADE_INSTANT, 8);
+ }
+}
+
+void sub_08053A5C(void) {
+ if (((gMessage.doTextBox & 0x7f) == 0) && --gMenu.transitionTimer == 0) {
+ gMenu.overlayType++;
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
+ }
+}
+
+void sub_08053A90(void) {
+ if (gFadeControl.active == 0) {
+ gUI.nextToLoad = 3; // Subtask_FadeOut
+ SetBGDefaults();
+ }
+}
+
+extern Script script_CutsceneOrchestratorMinishVaati;
+extern Script script_MinishEzlo;
+extern Script script_CutsceneMiscObjectMinishCap;
+extern Script script_Vaati;
+
+const EntityData gUnk_080FCD84[] = {
+ { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x0, 0x0, (u32)&script_CutsceneOrchestratorMinishVaati },
+ { NPC, 79, MINISH_EZLO, 0, 0, 0x78, 0xd8, (u32)&script_MinishEzlo },
+ { OBJECT, 79, CUTSCENE_MISC_OBJECT, 1, 0, 0x78, 0x58, (u32)&script_CutsceneMiscObjectMinishCap },
+ { NPC, 79, VAATI, 1, 0, 0x78, 0x68, (u32)&script_Vaati },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+void sub_08053ACC(void);
+void sub_08053B00(void);
+void sub_08053B10(void);
+void (*const gUnk_080FCDD4[])(void) = {
+ sub_08053ACC,
+ sub_08053B00,
+ sub_08053B10,
+};
+
+void sub_08053AB0(void) {
+ gUnk_080FCDD4[gMenu.overlayType]();
+}
+
+void sub_08053ACC(void) {
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ sub_08051FF0();
+ LoadRoomEntityList(gUnk_080FCD84);
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
+}
+
+void sub_08053B00(void) {
+ gMenu.overlayType++;
+}
+
+void sub_08053B10(void) {
+ if (CheckRoomFlag(1)) {
+ gMenu.menuType++;
+ DispReset(1);
+ SetFade(FADE_INSTANT, 0x100);
+ }
+}
+
+void sub_08053B3C(void) {
+ sub_080A71C4(5, 4, FADE_IN_OUT | FADE_INSTANT, 0x100);
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
+}
+
+extern Script script_CutsceneOrchestratorTakeoverCutscene;
+extern Script script_KingDaltusTakeover;
+extern Script script_VaatiTakeover;
+extern Script script_ZeldaStoneTakeover;
+const EntityData gUnk_080FCDE0[] = {
+ { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x0, 0x0, (u32)&script_CutsceneOrchestratorTakeoverCutscene },
+ { NPC, 79, KING_DALTUS, 0, 0, 0x88, 0x58, (u32)&script_KingDaltusTakeover },
+ { NPC, 79, VAATI, 1, 0, 0x88, 0xe0, (u32)&script_VaatiTakeover },
+ { NPC, 79, ZELDA, 0, 0, 0xb8, 0x58, (u32)&script_ZeldaStoneTakeover },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+extern Script script_MinisterPothoTakeover;
+extern Script script_GuardTakeover;
+extern Script script_GuardTakeover;
+const EntityData gUnk_080FCE30[] = {
+ { NPC, 79, MINISTER_POTHO, 0, 0, 0x68, 0x58, (u32)&script_MinisterPothoTakeover },
+ { NPC, 79, GUARD_1, 0, 0, 0x78, 0xe8, (u32)&script_GuardTakeover },
+ { NPC, 79, GUARD_1, 1, 0, 0x78, 0x108, (u32)&script_GuardTakeover },
+ { NPC, 79, GUARD_1, 2, 0, 0x78, 0x128, (u32)&script_GuardTakeover },
+ { NPC, 79, GUARD_1, 3, 0, 0x98, 0xe8, (u32)&script_GuardTakeover },
+ { NPC, 79, GUARD_1, 4, 0, 0x98, 0x108, (u32)&script_GuardTakeover },
+ { NPC, 79, GUARD_1, 5, 0, 0x98, 0x128, (u32)&script_GuardTakeover },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+void sub_08053B74(void);
+void sub_08053BAC(void);
+void sub_08053BBC(void);
+void (*const gUnk_080FCEB0[])(void) = {
+ sub_08053B74,
+ sub_08053BAC,
+ sub_08053BBC,
+};
+
+void sub_08053B58(void) {
+ gUnk_080FCEB0[gMenu.overlayType]();
+}
+
+void sub_08053B74(void) {
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ LoadRoomEntityList(gUnk_080FCDE0);
+ ResetSystemPriority();
+ ResetEntityPriority();
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
+}
+
+void sub_08053BAC(void) {
+ gMenu.overlayType++;
+}
+
+void sub_08053BBC(void) {
+ if (CheckRoomFlag(0)) {
+ gMenu.menuType++;
+ DispReset(1);
+ SetFade(FADE_INSTANT, 0x100);
+ }
+}
+
+void sub_08053BE8(void) {
+ sub_080A71C4(5, 2, FADE_IN_OUT | FADE_INSTANT, 0x100);
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
+}
+
+extern Script script_ZeldaStoneInDHC;
+extern Script script_ZeldaStoneDHC;
+const EntityData gUnk_080FCEBC[] = {
+ { NPC, 79, ZELDA, 0, 0, 0x78, 0x68, (u32)&script_ZeldaStoneInDHC },
+ { NPC, 79, VAATI, 1, 0, 0x78, 0x98, (u32)&script_ZeldaStoneDHC },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void sub_08053C20(void);
+void nullsub_483(void);
+void sub_08053C60(void);
+void (*const gUnk_080FCEEC[])(void) = {
+ sub_08053C20,
+ nullsub_483,
+ sub_08053C60,
+};
+
+void sub_08053C04(void) {
+ gUnk_080FCEEC[gMenu.overlayType]();
+}
+
+void sub_08053C20(void) {
+ gMenu.overlayType = 1;
+ gMenu.transitionTimer = 120; // Go to game over after 2 minutes.
+ gUpdateVisibleTiles = 1;
+ sub_08051FF0();
+ LoadStaticBackground(4);
+ LoadRoomEntityList(gUnk_080FCEBC);
+ SetFade(FADE_INSTANT, 0x10);
+ SoundReq(BGM_FIGHT_THEME2);
+}
+
+void nullsub_483(void) {
+}
+
+void sub_08053C60(void) {
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 2);
+ SoundReq(SFX_SUMMON);
+ SoundReq(SONG_STOP_BGM);
+ SetTask(TASK_GAMEOVER);
+}
+
+void sub_08053C84(void) {
+ gMenu.overlayType = 2;
+}
+void sub_08053CAC(void);
+void sub_08053CAC(void);
+void sub_08053E58(void);
+void (*const gUnk_080FCEF8[])(void) = {
+ sub_08053CAC,
+ sub_08053CAC,
+ sub_08053E58,
+};
+
+void CutsceneMain_Exit(void) {
+ gUnk_080FCEF8[gMenu.field_0x3]();
+}
+
+const EntityData gUnk_080FCF24[];
+const EntityData gUnk_080FCF44[];
+const EntityData gUnk_080FCF64[];
+const EntityData gUnk_080FCF84[];
+
+const struct_080FCF04 gUnk_080FCF04[] = {
+ { gUnk_080FCF24, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_2F, 0, 0 },
+ { gUnk_080FCF44, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_1F, 0, 0 },
+ { gUnk_080FCF64, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_2F, 0, 0 },
+ { gUnk_080FCF84, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_1F, 0, 0 },
+};
+
+const EntityData gUnk_080FCF24[] = {
+ { OBJECT, 15, GROUND_ITEM, 83, 512, 0x88, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+const EntityData gUnk_080FCF44[] = {
+ { OBJECT, 15, GROUND_ITEM, 83, 512, 0x68, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+const EntityData gUnk_080FCF64[] = {
+ { OBJECT, 15, GROUND_ITEM, 83, 512, 0x88, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+const EntityData gUnk_080FCF84[] = {
+ { OBJECT, 15, GROUND_ITEM, 83, 512, 0x68, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+void sub_08053CC8(void);
+void sub_08053D34(void);
+void sub_08053D90(void);
+void sub_08053DB4(void);
+void sub_08053E30(void);
+void (*const gUnk_080FCFA4[])(void) = {
+ sub_08053CC8, sub_08053D34, sub_08053D90, sub_08053DB4, sub_08053E30,
+};
+
+void sub_08053CAC(void) {
+ gUnk_080FCFA4[gMenu.overlayType]();
+}
+
+void sub_08053CC8(void) {
+ const struct_080FCF04* ptr;
+ ptr = gUnk_080FCF04 + gMenu.field_0x3 * 2;
+ gMenu.field_0xc = (void*)&ptr[1];
+ LoadRoomEntityList(ptr->entityData);
+ LoadRoomEntityList(GetRoomProperty(ptr->area, ptr->room, 1));
+ LoadRoomEntityList(GetRoomProperty(ptr->area, ptr->room, 2));
+ gMenu.overlayType = 1;
+ gScreen.lcd.displayControl &= 0xfeff;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+ if (ptr->room == 0x1d) { // TODO what room is this?
+ gMenu.field_0xa = 1;
+ }
+}
+
+void sub_08053D34(void) {
+ if (gMenu.field_0xa != 0) {
+ gMenu.field_0xa = 0;
+ if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3d)) {
+ SetTileType(0x74, 0xc4, 1);
+ }
+ if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3e)) {
+ SetTileType(0x74, 0xcc, 1);
+ }
+ }
+ if (gFadeControl.active == 0) {
+ gMenu.transitionTimer = 120;
+ gMenu.overlayType++;
+ }
+}
+
+void sub_08053D90(void) {
+ gMenu.transitionTimer--;
+ if (gMenu.transitionTimer == 0) {
+ gMenu.overlayType++;
+ SetFadeInverted(0x10);
+ }
+}
+
+void sub_08053DB4(void) {
+ if (gFadeControl.active == 0) {
+ struct_080FCF04* ptr = (struct_080FCF04*)gMenu.field_0xc;
+ sub_08052FF4(gMenu.field_0xc[4], gMenu.field_0xc[5]);
+ InitializeCamera();
+ gUpdateVisibleTiles = 1;
+ gRoomControls.scroll_x = (s8)ptr->scrollX + gRoomControls.scroll_x;
+ gRoomControls.scroll_y = (s8)ptr->scrollY + gRoomControls.scroll_y;
+ LoadRoomEntityList(ptr->entityData);
+ LoadRoomEntityList((EntityData*)GetRoomProperty(ptr->area, ptr->room, 1));
+ LoadRoomEntityList((EntityData*)GetRoomProperty(ptr->area, ptr->room, 2));
+ gMenu.transitionTimer = 120;
+ gMenu.overlayType++;
+ SetFadeInverted(0x10);
+ }
+}
+
+void sub_08053E30(void) {
+ if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
+
+const EntityData gUnk_080FCFE8[];
+const EntityData gUnk_080FD008[];
+const EntityData gUnk_080FD028[];
+const EntityData gUnk_080FD048[];
+const EntityData gUnk_080FD078[];
+const EntityData gUnk_080FD098[];
+const EntityData gUnk_080FD0C8[];
+const EntityData gUnk_080FD0E8[];
+const struct_080FCFB8 gUnk_080FCFB8[] = {
+ { gUnk_080FCFE8, gUnk_080FD008, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_DARKNUT, 16, 16 },
+ { gUnk_080FD028, gUnk_080FD048, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_DARKNUTS, 16, 16 },
+ { gUnk_080FD078, gUnk_080FD098, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_DARKNUTS, 16, 16 },
+ { gUnk_080FD0C8, gUnk_080FD0E8, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_DARKNUT, 16, 16 },
+};
+
+const EntityData gUnk_080FCFE8[] = {
+ { OBJECT, 15, BOSS_DOOR, 8, 0, 0x88, 0x28, 65535 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData gUnk_080FD008[] = {
+ { ENEMY, 47, DARK_NUT, 2, 0, 0x88, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData gUnk_080FD028[] = {
+ { OBJECT, 15, BOSS_DOOR, 8, 0, 0x88, 0x28, 65535 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData gUnk_080FD048[] = {
+ { ENEMY, 47, DARK_NUT, 1, 0, 0x70, 0x68, 0 },
+ { ENEMY, 47, DARK_NUT, 0, 0, 0xa0, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData gUnk_080FD078[] = {
+ { OBJECT, 15, BOSS_DOOR, 10, 0, 0x88, 0xa8, 65535 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData gUnk_080FD098[] = {
+ { ENEMY, 47, DARK_NUT, 0, 0, 0x70, 0x68, 0 },
+ { ENEMY, 47, DARK_NUT, 1, 0, 0xa0, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData gUnk_080FD0C8[] = {
+ { OBJECT, 15, BOSS_DOOR, 10, 0, 0x88, 0xa8, 65535 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData gUnk_080FD0E8[] = {
+ { ENEMY, 47, DARK_NUT, 2, 0, 0x88, 0x68, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+void sub_08053E74(void);
+void sub_08053EC4(void);
+void sub_08053EFC(void);
+void sub_08053F20(void);
+void sub_08053EC4(void);
+void sub_08053EFC(void);
+void sub_08053F20(void);
+void sub_08053EC4(void);
+void sub_08053EFC(void);
+void sub_08053F20(void);
+void sub_08053EC4(void);
+void sub_08053F88(void);
+void (*const gUnk_080FD108[])(void) = {
+ sub_08053E74, sub_08053EC4, sub_08053EFC, sub_08053F20, sub_08053EC4, sub_08053EFC,
+ sub_08053F20, sub_08053EC4, sub_08053EFC, sub_08053F20, sub_08053EC4, sub_08053F88,
+};
+
+void sub_08053E58(void) {
+ gUnk_080FD108[gMenu.overlayType]();
+}
+
+void sub_08053E74(void) {
+ const struct_080FCFB8* ptr = gUnk_080FCFB8;
+ gMenu.field_0xc = (u8*)ptr;
+ LoadRoomEntityList(ptr->entityData1);
+ gMenu.transitionTimer = 120;
+ gMenu.field_0xa = 0x3c;
+ gMenu.overlayType++;
+ gScreen.lcd.displayControl &= 0xfeff;
+ gUpdateVisibleTiles = 1;
+ SetMinPriority(1);
+ SetFade(FADE_INSTANT, 8);
+}
+
+void sub_08053EC4(void) {
+ EntityData** data;
+ if ((gFadeControl.active == 0) && (--gMenu.field_0xa == 0)) {
+ data = (EntityData**)(gMenu.field_0xc + 4); // TODO entityData2 of struct_080FCFB8
+ gMenu.field_0xc += 0xc;
+ LoadRoomEntityList(*data);
+ gMenu.overlayType++;
+ }
+}
+
+void sub_08053EFC(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.overlayType++;
+ SetFadeInverted(8);
+ }
+}
+
+void sub_08053F20(void) {
+ struct_080FCFB8* ptr;
+ if (gFadeControl.active == 0) {
+ DeleteAllEntities();
+ ptr = (struct_080FCFB8*)gMenu.field_0xc;
+ sub_08052FF4(ptr->area, ptr->room);
+ InitializeCamera();
+ gUpdateVisibleTiles = 1;
+ gRoomControls.scroll_x = (s8)ptr->scrollX + gRoomControls.scroll_x;
+ gRoomControls.scroll_y = (s8)ptr->scrollY + gRoomControls.scroll_y;
+ LoadRoomEntityList((ptr)->entityData1);
+ gMenu.transitionTimer = 120;
+ gMenu.field_0xa = 0x3c;
+ gMenu.overlayType++;
+ SetFadeInverted(8);
+ }
+}
+
+void sub_08053F88(void) {
+ if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ ResetEntityPriority();
+ }
+}
+
+void sub_080536D4(void);
+void sub_08053B58(void);
+void sub_0805373C(void);
+void sub_08053AB0(void);
+void sub_080536F0(void);
+void sub_08053C04(void);
+void (*const gUnk_080FD138[])(void) = {
+ sub_080536D4, sub_08053B58, sub_0805373C, sub_08053AB0, sub_080536F0, sub_08053C04,
+};
+
+void CutsceneMain_Update(void) {
+ gUnk_080FD138[gMenu.field_0x3]();
+}
diff --git a/src/data/figurineMenuData.c b/src/data/figurineMenuData.c
new file mode 100644
index 00000000..67b338b0
--- /dev/null
+++ b/src/data/figurineMenuData.c
@@ -0,0 +1,56 @@
+#include "figurineMenu.h"
+#include "pauseMenu.h"
+#include "subtask.h"
+#include "subtask2.h"
+
+// This data also belongs in figurine_menu.c, but the data/gfx/figurines.s are inbetween.
+// TODO convert them to c code as well.
+
+// clang-format off
+
+// Pause menu screens
+const struct_08128A38 gUnk_08128A38[] = {
+ [PauseMenuScreen_0] = { 0, 1, PauseMenu_Variant0 },
+ [PauseMenuScreen_1] = { 0, 1, PauseMenu_ItemMenu },
+ [PauseMenuScreen_2] = { 1, 2, PauseMenu2 },
+ [PauseMenuScreen_3] = { 8, 2, PauseMenu_Variant0 },
+ [PauseMenuScreen_4] = { 2, 15, PauseMenu_Screen_4 },
+ [PauseMenuScreen_5] = { 3, 15, PauseMenu_Screen_5 },
+ [PauseMenuScreen_6] = { 4, 15, PauseMenu_Screen_6 },
+ [PauseMenuScreen_7] = { 5, 2, PauseMenu_Screen_7 },
+ [PauseMenuScreen_8] = { 6, 2, PauseMenu_Screen_8 },
+ [PauseMenuScreen_9] = { 9, 2, PauseMenu_Screen_9 },
+ [PauseMenuScreen_10] = { 10, 2, PauseMenu_Screen_10 },
+ [PauseMenuScreen_11] = { 10, 1, PauseMenu_Screen_10 },
+ [PauseMenuScreen_12] = { 2, 15, PauseMenu_Variant0 },
+ [PauseMenuScreen_13] = { 7, 15, PauseMenu_Variant0 },
+ [PauseMenuScreen_14] = { 0, 1, PauseMenu_Variant0 },
+ [PauseMenuScreen_15] = { 0, 1, PauseMenu_Variant0 },
+ [PauseMenuScreen_16] = { 0, 1, PauseMenu_Variant0 },
+ [PauseMenuScreen_17] = { 0, 1, PauseMenu_Variant0 },
+ [PauseMenuScreen_18] = { 0, 1, PauseMenu_Variant0 },
+ [PauseMenuScreen_19] = { 0, 1, PauseMenu_Variant0 },
+};
+
+
+// TODO extract the bg controls
+const struct_08128AD8 gUnk_08128AD8[] = {
+ { 182, 90, 1024, 7173, 7427 },
+ { 183, 91, 1024, 7173, 7427 },
+ { 185, 94, 34304, 7171, 7435 },
+ { 184, 92, 1536, 7170, 7427 },
+ { 185, 129, 1536, 7178, 7427 },
+ { 204, 125, 1024, 7171, 7427 },
+ { 205, 126, 1536, 7170, 7427 },
+ { 185, 93, 34304, 7171, 7435 },
+ { 206, 89, 3840, 7170, 7427 },
+#ifdef EU
+ { 0, 128, 1536, 7170, 7431 },
+ { 0, 127, 1536, 7170, 7431 },
+#else
+ { 207, 128, 1536, 7170, 7431 },
+ { 207, 127, 1536, 7170, 7431 },
+#endif
+};
+
+// clang-format on
diff --git a/src/data/hitbox.c b/src/data/hitbox.c
new file mode 100644
index 00000000..297e17b4
--- /dev/null
+++ b/src/data/hitbox.c
@@ -0,0 +1,138 @@
+/**
+ * @file hitbox.c
+ *
+ * @brief Hitboxes
+ */
+#include "hitbox.h"
+
+const Hitbox gHitbox_0 = { 0, -3, { 5, 3, 3, 5 }, 6, 6 };
+const Hitbox gHitbox_30 = { 0, 6, { 5, 3, 3, 5 }, 10, 16 };
+const Hitbox gHitbox_31 = { 0, 6, { 5, 3, 3, 5 }, 10, 15 };
+const Hitbox gHitbox_1 = { 0, 0, { 5, 3, 3, 5 }, 6, 6 };
+const Hitbox gHitbox_2 = { 0, -3, { 5, 3, 3, 5 }, 8, 8 };
+const Hitbox gUnk_080FD178 = { 0, 0, { 5, 3, 3, 5 }, 8, 8 };
+const Hitbox gHitbox_3 = { 0, -3, { 5, 3, 3, 5 }, 12, 12 };
+const Hitbox gHitbox_4 = { 0, 0, { 9, 6, 6, 9 }, 10, 10 };
+const Hitbox gUnk_080FD190 = { 0, 0, { 12, 8, 8, 12 }, 14, 14 };
+const Hitbox gHitbox_5 = { 0, -1, { 6, 3, 3, 6 }, 6, 5 };
+const Hitbox gHitbox_6 = { 0, 0, { 4, 2, 2, 4 }, 2, 2 };
+const Hitbox3D gUnk_080FD1A8 = { 0, -3, { 6, 3, 3, 6 }, 2, 2, 64, { 0, 0, 0 } };
+const Hitbox gUnk_080FD1B4 = { 0, -4, { 8, 5, 6, 7 }, 8, 10 };
+const Hitbox unused1 = { 0, -3, { 0, 0, 0, 0 }, 0, 0 };
+const Hitbox gHitbox_7 = { 0, 0, { 2, 0, 0, 2 }, 2, 2 };
+const Hitbox gHitbox_8 = { 0, 1, { 5, 2, 3, 4 }, 4, 4 };
+const Hitbox gUnk_080FD1D4 = { 0, -3, { 0, 0, 0, 0 }, 10, 8 };
+const Hitbox gUnk_080FD1DC = { 0, 0, { 6, 4, 4, 6 }, 6, 6 };
+const Hitbox gUnk_080FD1E4 = { 0, 0, { 0, 0, 0, 0 }, 4, 4 };
+const Hitbox gUnk_080FD1EC = { 0, 0, { 0, 0, 0, 0 }, 2, 2 };
+const Hitbox gUnk_080FD1F4 = { 0, -1, { 6, 4, 4, 6 }, 4, 4 };
+const Hitbox gUnk_080FD1FC = { 0, 0, { 6, 4, 4, 6 }, 6, 6 };
+const Hitbox gUnk_080FD204 = { 0, 0, { 0, 0, 0, 0 }, 5, 5 };
+const Hitbox gUnk_080FD20C = { 0, 0, { 0, 0, 0, 0 }, 4, 4 };
+const Hitbox gUnk_080FD214 = { 0, 0, { 0, 0, 0, 0 }, 2, 2 };
+const Hitbox gUnk_080FD21C = { 0, 0, { 6, 4, 4, 6 }, 6, 6 };
+const Hitbox gUnk_080FD224 = { 0, -2, { 0, 0, 0, 0 }, 5, 3 };
+const Hitbox3D gUnk_080FD22C = { 0, 0, { 5, 3, 3, 5 }, 6, 6, 12, { 0, 0, 0 } };
+const Hitbox gUnk_080FD238 = { 0, 4, { 25, 8, 8, 12 }, 26, 8 };
+const Hitbox gUnk_080FD240 = { 0, 12, { 28, 14, 14, 16 }, 24, 24 };
+const Hitbox gUnk_080FD248 = { 0, 0, { 28, 14, 14, 16 }, 16, 16 };
+const Hitbox gHitbox_9 = { 0, -4, { 5, 3, 3, 5 }, 6, 6 };
+const Hitbox gUnk_080FD258 = { 0, -6, { 9, 6, 5, 10 }, 7, 8 };
+const Hitbox gUnk_080FD260 = { 0, -3, { 5, 3, 3, 4 }, 3, 3 };
+const Hitbox gHitbox_10 = { 0, -3, { 0, 0, 0, 0 }, 2, 3 };
+const Hitbox gUnk_080FD270 = { 0, 0, { 4, 4, 4, 4 }, 2, 6 };
+const Hitbox gUnk_080FD278 = { 0, 0, { 4, 4, 4, 4 }, 6, 2 };
+const Hitbox gUnk_080FD280 = { 0, -2, { 0, 0, 0, 0 }, 12, 14 };
+const Hitbox gUnk_080FD288 = { 0, -3, { 14, 12, 10, 12 }, 12, 10 };
+const Hitbox gUnk_080FD290 = { 0, 0, { 5, 3, 3, 5 }, 6, 6 };
+const Hitbox gUnk_080FD298 = { 0, 0, { 0, 0, 0, 0 }, 4, 4 };
+const Hitbox gUnk_080FD2A0 = { 0, 0, { 0, 0, 0, 0 }, 2, 2 };
+const Hitbox gUnk_080FD2A8 = { 0, -6, { 34, 24, 28, 32 }, 26, 21 };
+const Hitbox gHitbox_11 = { 0, -4, { 0, 0, 0, 0 }, 7, 4 };
+const Hitbox gHitbox_12 = { 0, -6, { 0, 0, 0, 0 }, 7, 4 };
+const Hitbox gHitbox_13 = { 0, 0, { 9, 4, 4, 9 }, 4, 4 };
+const Hitbox gHitbox_14 = { 0, -3, { 6, 4, 4, 6 }, 5, 5 };
+const Hitbox gUnk_080FD2D0 = { 0, -8, { 5, 3, 3, 5 }, 18, 16 };
+const Hitbox gUnk_080FD2D8 = { 0, -14, { 5, 3, 3, 5 }, 4, 4 };
+const Hitbox gUnk_080FD2E0 = { 0, 0, { 5, 3, 3, 5 }, 12, 12 };
+const Hitbox gUnk_080FD2E8 = { 0, 0, { 5, 3, 3, 5 }, 32, 32 };
+const Hitbox gUnk_080FD2F0 = { 0, 0, { 6, 4, 4, 6 }, 6, 6 };
+const Hitbox gHitbox_15 = { 0, 0, { 6, 4, 4, 6 }, 9, 9 };
+const Hitbox gHitbox_16 = { 0, -7, { 0, 0, 0, 0 }, 8, 7 };
+const Hitbox gUnk_080FD308 = { 0, -12, { 16, 8, 8, 16 }, 8, 8 };
+const Hitbox gUnk_080FD310 = { 0, -2, { 5, 3, 3, 5 }, 9, 9 };
+const Hitbox gHitbox_17 = { 0, 1, { 8, 6, 6, 8 }, 6, 6 };
+const Hitbox gUnk_080FD320 = { 0, 0, { 5, 3, 3, 5 }, 8, 12 };
+const Hitbox gUnk_080FD328 = { 0, 0, { 5, 3, 3, 5 }, 6, 12 };
+const Hitbox gUnk_080FD330 = { 0, -6, { 5, 3, 3, 5 }, 6, 6 };
+const Hitbox gHitbox_18 = { 0, -4, { 6, 3, 3, 6 }, 6, 6 };
+const Hitbox3D gUnk_080FD340 = { 0, 0, { 6, 3, 3, 6 }, 3, 3, 16, { 0, 0, 0 } };
+const Hitbox gUnk_080FD34C = { 0, 0, { 4, 2, 2, 4 }, 4, 4 };
+const Hitbox gUnk_080FD354 = { 0, -2, { 0, 0, 0, 0 }, 32, 10 };
+const Hitbox gUnk_080FD35C = { 11, 2, { 0, 0, 0, 0 }, 9, 8 };
+const Hitbox gUnk_080FD364 = { 12, 6, { 0, 0, 0, 0 }, 9, 8 };
+const Hitbox gUnk_080FD36C = { -11, 2, { 0, 0, 0, 0 }, 9, 8 };
+const Hitbox gUnk_080FD374 = { -12, 6, { 0, 0, 0, 0 }, 9, 8 };
+const Hitbox gUnk_080FD37C = { -2, -6, { 0, 0, 0, 0 }, 4, 5 };
+const Hitbox gUnk_080FD384 = { 2, -6, { 0, 0, 0, 0 }, 4, 5 };
+const Hitbox gUnk_080FD38C = { 0, 0, { 0, 0, 0, 0 }, 16, 12 };
+const Hitbox gUnk_080FD394 = { 31, 2, { 0, 0, 0, 0 }, 9, 8 };
+const Hitbox gUnk_080FD39C = { 8, 12, { 0, 0, 0, 0 }, 10, 10 };
+const Hitbox gUnk_080FD3A4 = { 0, 12, { 0, 0, 0, 0 }, 6, 18 };
+const Hitbox gUnk_080FD3AC = { -18, 10, { 0, 0, 0, 0 }, 12, 12 };
+const Hitbox gUnk_080FD3B4 = { -31, 2, { 0, 0, 0, 0 }, 9, 8 };
+const Hitbox gUnk_080FD3BC = { -8, 12, { 0, 0, 0, 0 }, 10, 10 };
+const Hitbox gUnk_080FD3C4 = { 18, 10, { 0, 0, 0, 0 }, 12, 12 };
+const Hitbox gUnk_080FD3CC = { 0, 0, { 72, 60, 60, 72 }, 40, 40 };
+const Hitbox unused2 = { 0, 0, { 52, 44, 44, 52 }, 40, 40 };
+const Hitbox gUnk_080FD3DC = { 0, 0, { 8, 8, 8, 8 }, 16, 16 };
+const Hitbox gUnk_080FD3E4 = { 0, 0, { 8, 8, 8, 8 }, 16, 16 };
+const Hitbox gUnk_080FD3EC = { 0, 0, { 8, 8, 8, 8 }, 16, 16 };
+const Hitbox gUnk_080FD3F4 = { 0, 0, { 8, 5, 5, 8 }, 16, 16 };
+const Hitbox3D gUnk_080FD3FC = { 0, -3, { 5, 3, 3, 5 }, 6, 6, 16, { 0, 0, 0 } };
+const Hitbox gUnk_080FD408 = { 0, 0, { 9, 4, 4, 9 }, 4, 4 };
+const Hitbox3D gHitbox_19 = { 0, -3, { 5, 3, 3, 5 }, 6, 6, 12, { 0, 0, 0 } };
+const Hitbox gUnk_080FD41C = { 0, 0, { 0, 0, 0, 0 }, 6, 6 };
+const Hitbox gUnk_080FD424 = { -3, 0, { 0, 0, 0, 0 }, 5, 6 };
+const Hitbox gUnk_080FD42C = { 0, -1, { 0, 0, 0, 0 }, 6, 6 };
+const Hitbox gUnk_080FD434 = { 3, 0, { 0, 0, 0, 0 }, 5, 6 };
+const Hitbox3D gUnk_080FD43C = { -16, 12, { 0, 0, 0, 0 }, 8, 4, 24, { 0, 0, 0 } };
+const Hitbox gHitbox_20 = { 0, 0, { 0, 0, 0, 0 }, 4, 4 };
+const Hitbox gUnk_080FD450 = { 0, -3, { 0, 0, 0, 0 }, 4, 4 };
+const Hitbox gHitbox_21 = { 0, 0, { 0, 0, 0, 0 }, 1, 1 };
+const Hitbox gHitbox_22 = { 0, 0, { 0, 0, 0, 0 }, 2, 2 };
+const Hitbox gHitbox_23 = { 0, -3, { 4, 3, 3, 4 }, 4, 4 };
+const Hitbox gHitbox_32 = { 0, -5, { 9, 6, 6, 9 }, 10, 10 };
+const Hitbox unused3 = { 0, -4, { 5, 3, 3, 5 }, 5, 5 };
+const Hitbox gHitbox_24 = { 0, -3, { 5, 3, 3, 5 }, 3, 3 };
+const Hitbox gUnk_080FD488 = { 0, -3, { 6, 3, 3, 4 }, 4, 3 };
+const Hitbox gUnk_080FD490 = { 0, -3, { 3, 2, 2, 3 }, 2, 2 };
+const Hitbox3D gHitbox_25 = { 0, -6, { 5, 3, 3, 5 }, 6, 6, 16, { 0, 0, 0 } };
+const Hitbox3D gHitbox_26 = { 0, -5, { 4, 2, 2, 4 }, 4, 4, 16, { 0, 0, 0 } };
+const Hitbox unused4 = { 0, -7, { 8, 6, 6, 8 }, 6, 6 };
+const Hitbox gUnk_080FD4B8 = { 0, 0, { 0, 0, 0, 0 }, 3, 8 };
+const Hitbox gUnk_080FD4C0 = { 0, 0, { 0, 0, 0, 0 }, 3, 16 };
+const Hitbox gUnk_080FD4C8 = { 0, 0, { 0, 0, 0, 0 }, 3, 24 };
+const Hitbox gUnk_080FD4D0 = { 0, 0, { 0, 0, 0, 0 }, 3, 32 };
+const Hitbox gUnk_080FD4D8 = { 0, 0, { 0, 0, 0, 0 }, 3, 40 };
+const Hitbox gUnk_080FD4E0 = { 0, 0, { 0, 0, 0, 0 }, 3, 48 };
+const Hitbox gUnk_080FD4E8 = { 0, 0, { 0, 0, 0, 0 }, 3, 56 };
+const Hitbox gUnk_080FD4F0 = { 0, 0, { 0, 0, 0, 0 }, 16, 3 };
+const Hitbox gUnk_080FD4F8 = { 0, 0, { 0, 0, 0, 0 }, 24, 3 };
+const Hitbox gUnk_080FD500 = { 0, 0, { 0, 0, 0, 0 }, 32, 3 };
+const Hitbox gUnk_080FD508 = { 0, 0, { 0, 0, 0, 0 }, 40, 3 };
+const Hitbox gUnk_080FD510 = { 0, 0, { 0, 0, 0, 0 }, 48, 3 };
+const Hitbox gUnk_080FD518 = { 0, 0, { 0, 0, 0, 0 }, 56, 3 };
+const Hitbox gUnk_080FD520 = { 0, 0, { 0, 0, 0, 0 }, 64, 3 };
+const Hitbox gHitbox_27 = { 0, 0, { 3, 2, 2, 3 }, 1, 1 };
+const Hitbox gUnk_080FD530 = { 0, 9, { 10, 8, 8, 10 }, 12, 12 };
+const Hitbox3D gUnk_080FD538 = { 0, -4, { 28, 23, 23, 28 }, 6, 6, 10, { 0, 0, 0 } };
+const Hitbox gUnk_080FD544 = { 0, -20, { 36, 24, 28, 32 }, 16, 16 };
+const Hitbox3D gHitbox_28 = { 0, 0, { 0, 0, 0, 0 }, 16, 16, 14, { 0, 0, 0 } };
+const Hitbox gUnk_080FD558 = { 0, 0, { 5, 3, 3, 5 }, 4, 4 };
+const Hitbox gUnk_080FD560 = { 0, 0, { 0, 0, 0, 0 }, 1, 1 };
+const Hitbox gHitbox_29 = { 0, -4, { 7, 5, 5, 7 }, 7, 7 };
+const Hitbox gUnk_080FD570 = { 0, -4, { 0, 0, 0, 0 }, 8, 6 };
+const Hitbox gUnk_080FD578 = { 0, -4, { 0, 0, 0, 0 }, 12, 6 };
+const Hitbox gUnk_080FD580 = { 0, -3, { 8, 5, 5, 8 }, 10, 10 };
+const Hitbox gUnk_080FD588 = { 0, -7, { 5, 3, 3, 5 }, 6, 6 };
diff --git a/src/data/objPalettes.c b/src/data/objPalettes.c
new file mode 100644
index 00000000..a39037ce
--- /dev/null
+++ b/src/data/objPalettes.c
@@ -0,0 +1,132 @@
+#include "global.h"
+#include "assets/gfx_offsets.h"
+
+const u32 gUnk_08133368[] = {
+ offset_gPalette_14 | 1 << 0x18, offset_gPalette_15 | 1 << 0x18, offset_gPalette_16 | 1 << 0x18,
+ offset_gPalette_17 | 1 << 0x18, offset_gPalette_22 | 1 << 0x18, offset_gPalette_23 | 1 << 0x18,
+ offset_gPalette_102 | 1 << 0x18, offset_gPalette_321 | 1 << 0x18, offset_gPalette_100 | 1 << 0x18,
+ offset_gPalette_101 | 1 << 0x18, offset_gPalette_103 | 1 << 0x18, offset_gPalette_118 | 1 << 0x18,
+ offset_gPalette_105 | 1 << 0x18, offset_gPalette_104 | 1 << 0x18, offset_gPalette_106 | 1 << 0x18,
+ offset_gPalette_89 | 1 << 0x18, offset_gPalette_90 | 1 << 0x18, offset_gPalette_91 | 1 << 0x18,
+ offset_gPalette_107 | 1 << 0x18, offset_gPalette_109 | 1 << 0x18, offset_gPalette_94 | 1 << 0x18,
+ offset_gPalette_47 | 1 << 0x18, offset_gPalette_79 | 1 << 0x18, offset_gPalette_80 | 1 << 0x18,
+ offset_gPalette_24 | 1 << 0x18, offset_gPalette_679 | 1 << 0x18, offset_gPalette_205 | 1 << 0x18,
+ offset_gPalette_206 | 1 << 0x18, offset_gPalette_207 | 1 << 0x18, offset_gPalette_239 | 1 << 0x18,
+ offset_gPalette_231 | 1 << 0x18, offset_gPalette_133 | 1 << 0x18, offset_gPalette_134 | 1 << 0x18,
+ offset_gPalette_129 | 1 << 0x18, offset_gPalette_135 | 1 << 0x18, offset_gPalette_136 | 1 << 0x18,
+ offset_gPalette_137 | 1 << 0x18, offset_gPalette_138 | 1 << 0x18, offset_gPalette_139 | 1 << 0x18,
+ offset_gPalette_140 | 1 << 0x18, offset_gPalette_130 | 1 << 0x18, offset_gPalette_131 | 1 << 0x18,
+ offset_gPalette_132 | 1 << 0x18, offset_gPalette_141 | 1 << 0x18, offset_gPalette_142 | 1 << 0x18,
+ offset_gPalette_144 | 1 << 0x18, offset_gPalette_145 | 1 << 0x18, offset_gPalette_146 | 1 << 0x18,
+ offset_gPalette_143 | 1 << 0x18, offset_gPalette_147 | 1 << 0x18, offset_gPalette_148 | 1 << 0x18,
+ offset_gPalette_149 | 1 << 0x18, offset_gPalette_150 | 1 << 0x18, offset_gPalette_151 | 1 << 0x18,
+ offset_gPalette_152 | 1 << 0x18, offset_gPalette_153 | 1 << 0x18, offset_gPalette_154 | 1 << 0x18,
+ offset_gPalette_155 | 1 << 0x18, offset_gPalette_128 | 1 << 0x18, offset_gPalette_156 | 1 << 0x18,
+ offset_gPalette_168 | 1 << 0x18, offset_gPalette_169 | 1 << 0x18, offset_gPalette_170 | 1 << 0x18,
+ offset_gPalette_248 | 1 << 0x18, offset_gPalette_249 | 1 << 0x18, offset_gPalette_250 | 1 << 0x18,
+ offset_gPalette_251 | 1 << 0x18, offset_gPalette_252 | 1 << 0x18, offset_gPalette_253 | 1 << 0x18,
+ offset_gPalette_254 | 1 << 0x18, offset_gPalette_255 | 1 << 0x18, offset_gPalette_256 | 1 << 0x18,
+ offset_gPalette_257 | 1 << 0x18, offset_gPalette_258 | 1 << 0x18, offset_gPalette_259 | 1 << 0x18,
+ offset_gPalette_260 | 1 << 0x18, offset_gPalette_261 | 1 << 0x18, offset_gPalette_262 | 1 << 0x18,
+ offset_gPalette_263 | 1 << 0x18, offset_gPalette_264 | 1 << 0x18, offset_gPalette_265 | 1 << 0x18,
+ offset_gPalette_266 | 1 << 0x18, offset_gPalette_267 | 1 << 0x18, offset_gPalette_268 | 1 << 0x18,
+ offset_gPalette_269 | 1 << 0x18, offset_gPalette_270 | 1 << 0x18, offset_gPalette_271 | 1 << 0x18,
+ offset_gPalette_3773 | 1 << 0x18, offset_gPalette_92 | 1 << 0x18, offset_gPalette_85 | 1 << 0x18,
+ offset_gPalette_86 | 1 << 0x18, offset_gPalette_87 | 1 << 0x18, offset_gPalette_3774 | 1 << 0x18,
+ offset_gPalette_123 | 1 << 0x18, offset_gPalette_2212 | 1 << 0x18, offset_gPalette_2213 | 1 << 0x18,
+ offset_gPalette_124 | 1 << 0x18, offset_gPalette_42 | 1 << 0x18, offset_gPalette_235 | 1 << 0x18,
+ offset_gPalette_236 | 1 << 0x18, offset_gPalette_237 | 1 << 0x18, offset_gPalette_238 | 1 << 0x18,
+ offset_gPalette_108 | 1 << 0x18, offset_gPalette_93 | 1 << 0x18, offset_gPalette_680 | 1 << 0x18,
+ offset_gPalette_43 | 1 << 0x18, offset_gPalette_44 | 1 << 0x18, offset_gPalette_45 | 1 << 0x18,
+ offset_gPalette_46 | 1 << 0x18, offset_gPalette_125 | 1 << 0x18, offset_gPalette_284 | 1 << 0x18,
+ offset_gPalette_283 | 1 << 0x18, offset_gPalette_285 | 1 << 0x18, offset_gPalette_286 | 1 << 0x18,
+ offset_gPalette_287 | 1 << 0x18, offset_gPalette_288 | 1 << 0x18, offset_gPalette_289 | 1 << 0x18,
+ offset_gPalette_290 | 1 << 0x18, offset_gPalette_291 | 1 << 0x18, offset_gPalette_292 | 1 << 0x18,
+ offset_gPalette_293 | 1 << 0x18, offset_gPalette_294 | 1 << 0x18, offset_gPalette_295 | 1 << 0x18,
+ offset_gPalette_296 | 1 << 0x18, offset_gPalette_297 | 1 << 0x18, offset_gPalette_2214 | 1 << 0x18,
+ offset_gPalette_224 | 1 << 0x18, offset_gPalette_225 | 1 << 0x18, offset_gPalette_226 | 1 << 0x18,
+ offset_gPalette_227 | 1 << 0x18, offset_gPalette_228 | 1 << 0x18, offset_gPalette_229 | 1 << 0x18,
+ offset_gPalette_1261 | 1 << 0x18, offset_gPalette_318 | 1 << 0x18, offset_gPalette_319 | 1 << 0x18,
+ offset_gPalette_320 | 1 << 0x18, offset_gPalette_2140 | 1 << 0x18, offset_gPalette_2141 | 1 << 0x18,
+ offset_gPalette_2142 | 1 << 0x18, offset_gPalette_2159 | 1 << 0x18, offset_gPalette_2160 | 1 << 0x18,
+ offset_gPalette_2161 | 1 << 0x18, offset_gPalette_2178 | 1 << 0x18, offset_gPalette_2179 | 1 << 0x18,
+ offset_gPalette_2180 | 1 << 0x18, offset_gPalette_2197 | 1 << 0x18, offset_gPalette_2198 | 1 << 0x18,
+ offset_gPalette_2199 | 1 << 0x18, offset_gPalette_95 | 1 << 0x18, offset_gPalette_18 | 1 << 0x18,
+ offset_gPalette_19 | 1 << 0x18, offset_gPalette_20 | 1 << 0x18, offset_gPalette_21 | 1 << 0x18,
+ offset_gPalette_96 | 1 << 0x18, offset_gPalette_97 | 1 << 0x18, offset_gPalette_98 | 1 << 0x18,
+ offset_gPalette_99 | 1 << 0x18, offset_gPalette_110 | 1 << 0x18, offset_gPalette_208 | 2 << 0x18,
+ offset_gPalette_210 | 2 << 0x18, offset_gPalette_233 | 1 << 0x18, offset_gPalette_157 | 1 << 0x18,
+ offset_gPalette_158 | 1 << 0x18, offset_gPalette_159 | 1 << 0x18, offset_gPalette_160 | 1 << 0x18,
+ offset_gPalette_161 | 1 << 0x18, offset_gPalette_162 | 1 << 0x18, offset_gPalette_163 | 1 << 0x18,
+ offset_gPalette_164 | 1 << 0x18, offset_gPalette_165 | 1 << 0x18, offset_gPalette_166 | 1 << 0x18,
+ offset_gPalette_167 | 1 << 0x18, offset_gPalette_171 | 1 << 0x18, offset_gPalette_172 | 1 << 0x18,
+ offset_gPalette_173 | 1 << 0x18, offset_gPalette_234 | 1 << 0x18, offset_gPalette_111 | 1 << 0x18,
+ offset_gPalette_113 | 1 << 0x18, offset_gPalette_114 | 1 << 0x18, offset_gPalette_48 | 1 << 0x18,
+ offset_gPalette_49 | 1 << 0x18, offset_gPalette_50 | 1 << 0x18, offset_gPalette_51 | 1 << 0x18,
+ offset_gPalette_52 | 1 << 0x18, offset_gPalette_53 | 1 << 0x18, offset_gPalette_54 | 1 << 0x18,
+ offset_gPalette_322 | 1 << 0x18, offset_gPalette_299 | 1 << 0x18, offset_gPalette_300 | 1 << 0x18,
+ offset_gPalette_298 | 1 << 0x18, offset_gPalette_301 | 1 << 0x18, offset_gPalette_303 | 1 << 0x18,
+ offset_gPalette_304 | 1 << 0x18, offset_gPalette_305 | 1 << 0x18, offset_gPalette_306 | 1 << 0x18,
+ offset_gPalette_307 | 1 << 0x18, offset_gPalette_55 | 1 << 0x18, offset_gPalette_57 | 1 << 0x18,
+ offset_gPalette_58 | 1 << 0x18, offset_gPalette_59 | 1 << 0x18, offset_gPalette_60 | 1 << 0x18,
+ offset_gPalette_61 | 1 << 0x18, offset_gPalette_62 | 1 << 0x18, offset_gPalette_63 | 1 << 0x18,
+ offset_gPalette_64 | 1 << 0x18, offset_gPalette_65 | 1 << 0x18, offset_gPalette_66 | 1 << 0x18,
+ offset_gPalette_67 | 1 << 0x18, offset_gPalette_68 | 1 << 0x18, offset_gPalette_69 | 1 << 0x18,
+ offset_gPalette_70 | 1 << 0x18, offset_gPalette_174 | 1 << 0x18, offset_gPalette_212 | 1 << 0x18,
+ offset_gPalette_213 | 1 << 0x18, offset_gPalette_214 | 1 << 0x18, offset_gPalette_215 | 1 << 0x18,
+ offset_gPalette_216 | 1 << 0x18, offset_gPalette_72 | 1 << 0x18, offset_gPalette_78 | 1 << 0x18,
+ offset_gPalette_73 | 1 << 0x18, offset_gPalette_74 | 1 << 0x18, offset_gPalette_75 | 1 << 0x18,
+ offset_gPalette_76 | 1 << 0x18, offset_gPalette_77 | 1 << 0x18, offset_gPalette_175 | 1 << 0x18,
+ offset_gPalette_176 | 1 << 0x18, offset_gPalette_177 | 1 << 0x18, offset_gPalette_178 | 1 << 0x18,
+ offset_gPalette_179 | 1 << 0x18, offset_gPalette_180 | 1 << 0x18, offset_gPalette_181 | 1 << 0x18,
+ offset_gPalette_182 | 1 << 0x18, offset_gPalette_183 | 1 << 0x18, offset_gPalette_184 | 1 << 0x18,
+ offset_gPalette_185 | 1 << 0x18, offset_gPalette_186 | 1 << 0x18, offset_gPalette_187 | 1 << 0x18,
+ offset_gPalette_188 | 1 << 0x18, offset_gPalette_189 | 1 << 0x18, offset_gPalette_190 | 1 << 0x18,
+ offset_gPalette_191 | 1 << 0x18, offset_gPalette_192 | 1 << 0x18, offset_gPalette_193 | 1 << 0x18,
+ offset_gPalette_194 | 1 << 0x18, offset_gPalette_195 | 1 << 0x18, offset_gPalette_196 | 1 << 0x18,
+ offset_gPalette_197 | 1 << 0x18, offset_gPalette_198 | 1 << 0x18, offset_gPalette_199 | 1 << 0x18,
+ offset_gPalette_200 | 1 << 0x18, offset_gPalette_201 | 1 << 0x18, offset_gPalette_202 | 1 << 0x18,
+ offset_gPalette_308 | 1 << 0x18, offset_gPalette_309 | 1 << 0x18, offset_gPalette_310 | 1 << 0x18,
+ offset_gPalette_311 | 1 << 0x18, offset_gPalette_312 | 1 << 0x18, offset_gPalette_313 | 1 << 0x18,
+ offset_gPalette_282 | 1 << 0x18, offset_gPalette_217 | 1 << 0x18, offset_gPalette_204 | 1 << 0x18,
+ offset_gPalette_218 | 2 << 0x18, offset_gPalette_220 | 1 << 0x18, offset_gPalette_221 | 1 << 0x18,
+ offset_gPalette_222 | 1 << 0x18, offset_gPalette_127 | 1 << 0x18, offset_gPalette_115 | 1 << 0x18,
+ offset_gPalette_302 | 1 << 0x18, offset_gPalette_274 | 1 << 0x18, offset_gPalette_275 | 1 << 0x18,
+ offset_gPalette_276 | 1 << 0x18, offset_gPalette_277 | 1 << 0x18, offset_gPalette_278 | 1 << 0x18,
+ offset_gPalette_279 | 1 << 0x18, offset_gPalette_329 | 1 << 0x18, offset_gPalette_331 | 1 << 0x18,
+ offset_gPalette_332 | 1 << 0x18, offset_gPalette_116 | 1 << 0x18, offset_gPalette_334 | 1 << 0x18,
+ offset_gPalette_344 | 1 << 0x18, offset_gPalette_345 | 1 << 0x18, offset_gPalette_346 | 1 << 0x18,
+ offset_gPalette_347 | 1 << 0x18, offset_gPalette_348 | 1 << 0x18, offset_gPalette_349 | 1 << 0x18,
+ offset_gPalette_350 | 1 << 0x18, offset_gPalette_71 | 1 << 0x18, offset_gPalette_56 | 1 << 0x18,
+ offset_gPalette_328 | 1 << 0x18, offset_gPalette_232 | 1 << 0x18, offset_gPalette_25 | 1 << 0x18,
+ offset_gPalette_26 | 1 << 0x18, offset_gPalette_117 | 1 << 0x18, offset_gPalette_27 | 1 << 0x18,
+ offset_gPalette_28 | 1 << 0x18, offset_gPalette_29 | 1 << 0x18, offset_gPalette_30 | 1 << 0x18,
+ offset_gPalette_31 | 1 << 0x18, offset_gPalette_32 | 1 << 0x18, offset_gPalette_280 | 1 << 0x18,
+ offset_gPalette_281 | 1 << 0x18, offset_gPalette_333 | 1 << 0x18, offset_gPalette_314 | 1 << 0x18,
+ offset_gPalette_315 | 1 << 0x18, offset_gPalette_316 | 1 << 0x18, offset_gPalette_317 | 1 << 0x18,
+ offset_gPalette_330 | 1 << 0x18, offset_gPalette_335 | 1 << 0x18, offset_gPalette_336 | 1 << 0x18,
+ offset_gPalette_337 | 1 << 0x18, offset_gPalette_338 | 1 << 0x18, offset_gPalette_339 | 1 << 0x18,
+ offset_gPalette_340 | 1 << 0x18, offset_gPalette_341 | 1 << 0x18, offset_gPalette_342 | 1 << 0x18,
+ offset_gPalette_343 | 1 << 0x18, offset_gPalette_82 | 1 << 0x18, offset_gPalette_223 | 1 << 0x18,
+ offset_gPalette_240 | 1 << 0x18, offset_gPalette_241 | 1 << 0x18, offset_gPalette_242 | 1 << 0x18,
+ offset_gPalette_243 | 1 << 0x18, offset_gPalette_244 | 1 << 0x18, offset_gPalette_245 | 1 << 0x18,
+ offset_gPalette_246 | 1 << 0x18, offset_gPalette_247 | 1 << 0x18, offset_gPalette_272 | 1 << 0x18,
+ offset_gPalette_273 | 1 << 0x18, offset_gPalette_352 | 1 << 0x18, offset_gPalette_353 | 1 << 0x18,
+ offset_gPalette_351 | 1 << 0x18, offset_gPalette_126 | 1 << 0x18, offset_gPalette_327 | 1 << 0x18,
+ offset_gPalette_203 | 1 << 0x18, offset_gPalette_3430 | 1 << 0x18, offset_gPalette_3431 | 1 << 0x18,
+ offset_gPalette_3432 | 2 << 0x18, offset_gPalette_3434 | 1 << 0x18, offset_gPalette_3435 | 1 << 0x18,
+ offset_gPalette_3436 | 1 << 0x18, offset_gPalette_9 | 1 << 0x18, offset_gPalette_33 | 1 << 0x18,
+ offset_gPalette_34 | 1 << 0x18, offset_gPalette_35 | 1 << 0x18, offset_gPalette_36 | 1 << 0x18,
+ offset_gPalette_37 | 1 << 0x18, offset_gPalette_38 | 1 << 0x18, offset_gPalette_39 | 1 << 0x18,
+ offset_gPalette_40 | 1 << 0x18, offset_gPalette_41 | 1 << 0x18, offset_gPalette_83 | 1 << 0x18,
+ offset_gPalette_119 | 1 << 0x18, offset_gPalette_120 | 1 << 0x18, offset_gPalette_121 | 1 << 0x18,
+ offset_gPalette_81 | 1 << 0x18, offset_gPalette_84 | 1 << 0x18, offset_gPalette_88 | 1 << 0x18,
+ offset_gPalette_230 | 1 << 0x18,
+#ifdef EU
+ offset_gPalette_2257 | 1 << 0x18, offset_gPalette_2258 | 1 << 0x18,
+#else
+ offset_gPalette_2259 | 1 << 0x18, offset_gPalette_2260 | 1 << 0x18,
+#endif
+ offset_gPalette_10 | 1 << 0x18, offset_gPalette_112 | 1 << 0x18, offset_gPalette_122 | 1 << 0x18,
+ offset_gPalette_13 | 1 << 0x18,
+};
diff --git a/src/demo.c b/src/demo.c
index 2c481990..36bde8b3 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -194,19 +194,19 @@ void sub_080A3198(u32 param_1, u32 param_2) {
{ gUnk_0203510E, BG_TILE_ADDR(0x1a0), gTextGfxBuffer, 0, 0x80, 0xd0, 1, 0, 0, 1, 9, 0, 0, 1, 1 },
};
static const u16 gUnk_08127CC8[4] = {
- 0x71c,
- 0x720,
- 0x721,
+ TEXT_INDEX(TEXT_WINDCRESTS, 0x1c),
+ TEXT_INDEX(TEXT_WINDCRESTS, 0x20),
+ TEXT_INDEX(TEXT_WINDCRESTS, 0x21),
0x0,
};
- u16 r4 = gUnk_08127CC8[param_1];
+ u16 textIndex = gUnk_08127CC8[param_1];
- if (gChooseFileState.unk_0x12 != r4) {
- gChooseFileState.unk_0x12 = r4;
+ if (gChooseFileState.unk_0x12 != textIndex) {
+ gChooseFileState.unk_0x12 = textIndex;
MemClear(gUnk_08127C98[0].dest - 0xf, 0x180);
- if (r4 != 0) {
- sub_0805F46C(r4, gUnk_08127C98);
+ if (textIndex != 0) {
+ ShowTextBox(textIndex, gUnk_08127C98);
}
gScreen.bg0.updated = 1;
diff --git a/src/enemy.c b/src/enemy.c
index 60a0653c..01120f92 100644
--- a/src/enemy.c
+++ b/src/enemy.c
@@ -114,7 +114,7 @@ const EnemyDefinition gEnemyDefinitions[] = {
{ 145, 2, { &gHitbox_13 }, 483, { 0, 1, 1, 1 }, 255, 256, 102, 139 }, // TODO sprite index too high
#endif
MULTI_FORM(gEnemyDefinition_30),
- { 236, 1, { &gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 2, 320, 41, 15 },
+ { 236, 1, { (Hitbox*)&gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 2, 320, 41, 15 },
MULTI_FORM(gEnemyDefinition_32),
{ 253, 112, { &gHitbox_0 }, SPRITE_BOMBAROSSA, { 1, 1, 1, 1 }, 255, 256, 1, 139 },
MULTI_FORM(gEnemyDefinition_34),
@@ -134,7 +134,7 @@ const EnemyDefinition gEnemyDefinitions[] = {
MULTI_FORM(gEnemyDefinition_42),
{ 366, 0, { &gHitbox_18 }, SPRITE_FLYINGSKULL, { 0, 1, 1, 0 }, 255, 640, 110, 132 },
MULTI_FORM(gEnemyDefinition_44),
- { 236, 0, { &gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 4, 320, 87, 15 },
+ { 236, 0, { (Hitbox*)&gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 4, 320, 87, 15 },
MULTI_FORM(gEnemyDefinition_46),
{ 16400, 299, { &gHitbox_0 }, SPRITE_LAKITU, { 0, 1, 0, 1 }, 6, 128, 67, 143 },
{ 16400, 0, { &gHitbox_0 }, SPRITE_LAKITUCLOUDPROJECTILE, { 1, 1, 1, 2 }, 255, 0, 166, 143 },
@@ -157,15 +157,15 @@ const EnemyDefinition gEnemyDefinitions[] = {
MULTI_FORM(gEnemyDefinition_0),
MULTI_FORM(gEnemyDefinition_56),
MULTI_FORM(gEnemyDefinition_57),
- { 444, 0, { &gHitbox_25 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 1 }, 4, 64, 25, 139 },
- { 444, 0, { &gHitbox_26 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 0 }, 1, 64, 25, 139 },
+ { 444, 0, { (Hitbox*)&gHitbox_25 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 1 }, 4, 64, 25, 139 },
+ { 444, 0, { (Hitbox*)&gHitbox_26 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 0 }, 1, 64, 25, 139 },
MULTI_FORM(gEnemyDefinition_5A),
{ 114, 110, { &gHitbox_0 }, SPRITE_BUSINESSSCRUB, { 0, 0, 1, 1 }, 255, 0, 1, 139 },
{ 0, 0, { &gHitbox_0 }, SPRITE_0, { 0, 0, 0, 1 }, 24, 256, 0, 139 },
- { 16448, 338, { &gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 12, 256, 27, 139 },
+ { 16448, 338, { (Hitbox*)&gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 12, 256, 27, 139 },
{ 485, 352, { &gHitbox_0 }, SPRITE_CURTAIN, { 0, 1, 1, 1 }, 255, 256, 154, 139 },
- { 418, 320, { &gHitbox_20 }, SPRITE_WRATHEYE, { 1, 0, 1, 0 }, 255, 256, 57, 139 },
- { 498, 0, { &gHitbox_20 }, SPRITE_GYORGCHILD, { 0, 0, 1, 1 }, 3, 256, 32, 15 },
+ { 418, 320, { (Hitbox*)&gHitbox_20 }, SPRITE_WRATHEYE, { 1, 0, 1, 0 }, 255, 256, 57, 139 },
+ { 498, 0, { (Hitbox*)&gHitbox_20 }, SPRITE_GYORGCHILD, { 0, 0, 1, 1 }, 3, 256, 32, 15 },
#ifdef EU
{ 499, 377, { &gHitbox_22 }, SPRITE_GYORGFEMALEEYE, { 0, 0, 1, 1 }, 255, 256, 30, 139 },
#else
@@ -173,7 +173,7 @@ const EnemyDefinition gEnemyDefinitions[] = {
#endif
{ 500, 376, { &gHitbox_0 }, SPRITE_ENEMY62, { 0, 0, 1, 1 }, 255, 256, 30, 139 },
{ 504, 372, { &gHitbox_0 }, SPRITE_GYORGFEMALEMOUTH, { 0, 0, 1, 1 }, 255, 256, 136, 139 },
- { 16448, 338, { &gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 36, 256, 0, 139 },
+ { 16448, 338, { (Hitbox*)&gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 36, 256, 0, 139 },
{ 0, 0, { &gHitbox_0 }, SPRITE_0, { 0, 0, 0, 1 }, 255, 256, 0, 139 },
};
@@ -228,9 +228,9 @@ const EnemyDefinition gEnemyDefinition_10[] = {
{ 32, 0, &gUnk_080FD21C, SPRITE_SLUGGULA_2, { 0, 0, 1, 0 }, 3, 0, 0, 139 },
};
const EnemyDefinition gEnemyDefinition_11[] = {
- { 34, 38, &gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 },
- { 34, 39, &gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 },
- { 34, 37, &gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 },
+ { 34, 38, (const Hitbox*)&gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 },
+ { 34, 39, (const Hitbox*)&gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 },
+ { 34, 37, (const Hitbox*)&gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 },
};
const EnemyDefinition gEnemyDefinition_12[] = {
{ 35, 40, &gHitbox_0, SPRITE_PUFFSTOOL, { 1, 1, 1, 0 }, 1, 64, 130, 15 },
@@ -370,11 +370,11 @@ const EnemyDefinition gEnemyDefinition_51[] = {
{ 417, 320, &gHitbox_0, SPRITE_VAATIWRATH_2, { 0, 0, 1, 1 }, 255, 256, 0, 139 },
};
const EnemyDefinition gEnemyDefinition_52[] = {
- { 16400, 320, &gUnk_080FD538, SPRITE_VAATIARM, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
- { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 0, 0, 1, 1 }, 255, 256, 57, 139 },
- { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
- { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
- { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
+ { 16400, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
+ { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 0, 0, 1, 1 }, 255, 256, 57, 139 },
+ { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
+ { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
+ { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 },
};
const EnemyDefinition gEnemyDefinition_56[] = {
{ 422, 113, &gUnk_080FD488, SPRITE_SLIME, { 3, 1, 1, 1 }, 2, 64, 25, 139 },
diff --git a/src/enemy/chuchuBoss.c b/src/enemy/chuchuBoss.c
index 2726a05c..af373d39 100644
--- a/src/enemy/chuchuBoss.c
+++ b/src/enemy/chuchuBoss.c
@@ -559,7 +559,7 @@ void sub_080262A8(ChuchuBossEntity* this) {
this->unk_84->unk_03 = 3;
gPlayerEntity.animationState = 0;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
SetTile(0x4022, 0x2c8, 1);
}
}
@@ -583,7 +583,7 @@ void sub_08026358(ChuchuBossEntity* this) {
this->unk_84->unk_03++;
gPlayerEntity.animationState = 0;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
} else if (bVar1 < 0x61) {
if (bVar1 < 0x5c) {
gPlayerEntity.animationState = 4;
@@ -661,7 +661,7 @@ void sub_0802650C(ChuchuBossEntity* this) {
void sub_0802653C(ChuchuBossEntity* this) {
if (gRoomControls.reload_flags == 0) {
- gRoomControls.unk5 = 4;
+ gRoomControls.scrollSpeed = 4;
sub_08027B98(this, 0x90, 0xb0, 4, 0xff);
sub_08027548(this, 0);
InitAnimationForceUpdate(super->child, 0);
diff --git a/src/enemy/octorokBoss.c b/src/enemy/octorokBoss.c
index 2e3283e0..8b248fa4 100644
--- a/src/enemy/octorokBoss.c
+++ b/src/enemy/octorokBoss.c
@@ -361,7 +361,7 @@ void OctorokBoss_Intro_SubAction2(OctorokBossEntity* this) {
this->timer = 60;
gPlayerEntity.spriteSettings.draw |= 1;
gRoomControls.camera_target = &gPlayerEntity;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
}
}
@@ -397,7 +397,7 @@ void OctorokBoss_Intro_SubAction5(OctorokBossEntity* this) {
// Play boss theme, enable control and switch to main action
super->action = ACTION1;
super->subAction = 0;
- gRoomControls.unk5 = gPlayerEntity.animationState;
+ gRoomControls.scrollSpeed = gPlayerEntity.animationState;
OctorokBoss_SetAttackTimer(this);
gPauseMenuOptions.disabled = 0;
SoundReq(BGM_BOSS_THEME);
diff --git a/src/enemyUtils.c b/src/enemyUtils.c
index 46b9c17c..d484865a 100644
--- a/src/enemyUtils.c
+++ b/src/enemyUtils.c
@@ -1,11 +1,13 @@
#define NENT_DEPRECATED
-#include "entity.h"
+#include "enemyUtils.h"
+
#include "definitions.h"
+#include "entity.h"
#include "functions.h"
#include "object.h"
-#include "save.h"
-#include "projectile.h"
#include "object/deathFx.h"
+#include "projectile.h"
+#include "save.h"
extern void sub_08049CF4(Entity*);
@@ -13,8 +15,24 @@ extern EnemyDefinition gEnemyDefinitions[];
const EnemyDefinition* GetEnemyDefinition(Entity* entity);
bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition);
-extern const u16 gUnk_080D3E74[];
-extern const u8 gUnk_080D3D94[];
+
+const struct_080D3D94 gUnk_080D3D94[] = {
+ { 8, 8 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 64, 64 }, { 64, 64 }, { 64, 64 }, { 4, 4 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 16, 16 },
+ { 64, 64 }, { 64, 64 }, { 12, 12 }, { 16, 16 }, { 8, 8 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 10, 10 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 15, 9 },
+ { 12, 12 }, { 16, 16 }, { 24, 24 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 60, 60 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 24, 24 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 8, 8 }, { 8, 8 }, { 8, 8 }, { 16, 16 }, { 16, 16 },
+ { 16, 16 }, { 8, 8 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+ { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 },
+};
+
+const u16 gUnk_080D3E74[] = { 2373, 1105, 2324, 21568, 4177, 16656, 1365, 21760, 8209, 0, 20480, 5, 0, 0 };
const EnemyDefinition* GetEnemyDefinition(Entity* entity) {
const EnemyDefinition* definition = &gEnemyDefinitions[entity->id];
@@ -96,23 +114,23 @@ bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition) {
void sub_0804A720(GenericEntity* this) {
int iVar2;
- const u8* pbVar3;
+ const struct_080D3D94* pbVar3;
GenericEntityData* ptr;
if ((this->field_0x6c.HALF.HI & 4) != 0) {
return;
}
- pbVar3 = &gUnk_080D3D94[super->id * 2];
+ pbVar3 = &gUnk_080D3D94[super->id];
ptr = (GenericEntityData*)&this->field_0x68;
if (ptr->field_0x7c.BYTES.byte2 == 0) {
- this->field_0x6e.HALF.LO = pbVar3[0];
+ this->field_0x6e.HALF.LO = pbVar3->unk_0;
} else {
this->field_0x6e.HALF.LO = ptr->field_0x7c.BYTES.byte2;
}
if (ptr->field_0x7c.BYTES.byte3 == 0) {
- this->field_0x6e.HALF.HI = pbVar3[1];
+ this->field_0x6e.HALF.HI = pbVar3->unk_1;
} else {
this->field_0x6e.HALF.HI = ptr->field_0x7c.BYTES.byte3;
}
diff --git a/src/enterPortalSubtask.c b/src/enterPortalSubtask.c
index 84091a0c..379ee2e7 100644
--- a/src/enterPortalSubtask.c
+++ b/src/enterPortalSubtask.c
@@ -1,31 +1,121 @@
-#include "global.h"
-#include "entity.h"
+/**
+ * @file enterPortalSubtask.c
+ * @ingroup Subtasks
+ *
+ * @brief Enter Portal Subtask
+ */
+#include "enterPortalSubtask.h"
+
#include "area.h"
-#include "main.h"
#include "common.h"
-#include "screen.h"
-#include "object.h"
+#include "entity.h"
+#include "fileselect.h"
#include "functions.h"
#include "game.h"
-#include "fileselect.h"
+#include "main.h"
+#include "object.h"
+#include "screen.h"
+#include "subtask.h"
extern void ClearArmosData(void);
extern void sub_080300C4(void);
-extern u16 gUnk_020178E0[];
extern u8 gUnk_02017700[];
-extern void (*const gUnk_080D4120[])(void);
-extern void (*const gUnk_080D412C[])(void);
-extern const u16 gUnk_080D4140[];
-extern const u8 gUnk_080D4138[];
-extern const EntityData* gUnk_080D4110[];
-
bool32 sub_0804AD18(void);
void sub_0804AD6C(RoomControls*);
-void sub_080A71F4(const ScreenTransitionData*);
bool32 sub_0804ACA8(void);
+// Entities spawned inside the portal transition cutscene.
+const EntityData gUnk_080D3E90[] = {
+ { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 0, 6, 120, 208, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 1, 1, 132, 160, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 2, 2, 96, 192, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 3, 3, 128, 208, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 5, 0, 120, 104, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 6, 1, 216, 200, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 7, 2, 120, 292, 0 },
+ { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 8, 3, 17, 200, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0 },
+};
+const EntityData gUnk_080D3F30[] = {
+ { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 }, //
+ { OBJECT, 15, MACRO_CRYSTAL, 0, 6, 120, 200, 0 },
+ { OBJECT, 15, MACRO_CRYSTAL, 1, 3, 132, 160, 0 },
+ { OBJECT, 15, MACRO_CRYSTAL, 2, 2, 96, 192, 0 },
+ { OBJECT, 15, MACRO_CRYSTAL, 3, 1, 128, 208, 0 },
+ { OBJECT, 15, MACRO_CRYSTAL, 5, 0, 120, 104, 0 },
+ { OBJECT, 15, MACRO_CRYSTAL, 6, 1, 216, 200, 0 },
+ { OBJECT, 15, MACRO_CRYSTAL, 7, 2, 120, 292, 0 },
+ { OBJECT, 15, MACRO_CRYSTAL, 8, 3, 17, 200, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0 },
+};
+const EntityData gUnk_080D3FD0[] = {
+ { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 },
+ { OBJECT, 15, MACRO_LEAF, 0, 6, 120, 208, 0 },
+ { OBJECT, 15, MACRO_LEAF, 1, 1, 132, 160, 0 },
+ { OBJECT, 15, MACRO_LEAF, 2, 2, 96, 192, 0 },
+ { OBJECT, 15, MACRO_LEAF, 3, 3, 128, 208, 0 },
+ { OBJECT, 15, MACRO_LEAF, 5, 0, 120, 104, 0 },
+ { OBJECT, 15, MACRO_LEAF, 6, 1, 216, 200, 0 },
+ { OBJECT, 15, MACRO_LEAF, 7, 2, 120, 300, 0 },
+ { OBJECT, 15, MACRO_LEAF, 8, 3, 17, 200, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0 },
+};
+const EntityData gUnk_080D4070[] = {
+ { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 },
+ { OBJECT, 15, MACRO_LEAF, 9, 6, 120, 208, 0 },
+ { OBJECT, 15, MACRO_LEAF, 10, 1, 132, 160, 0 },
+ { OBJECT, 15, MACRO_LEAF, 11, 2, 96, 192, 0 },
+ { OBJECT, 15, MACRO_LEAF, 12, 3, 128, 208, 0 },
+ { OBJECT, 15, MACRO_LEAF, 14, 0, 120, 104, 0 },
+ { OBJECT, 15, MACRO_LEAF, 15, 1, 216, 200, 0 },
+ { OBJECT, 15, MACRO_LEAF, 16, 2, 120, 300, 0 },
+ { OBJECT, 15, MACRO_LEAF, 17, 3, 17, 200, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0 },
+};
+
+const EntityData* const gUnk_080D4110[] = {
+ gUnk_080D3E90,
+ gUnk_080D3F30,
+ gUnk_080D3FD0,
+ gUnk_080D4070,
+};
+
+void sub_0804AAD4(void);
+void sub_0804AB04(void);
+void sub_0804AB24(void);
+void Subtask_PortalCutscene_0(void);
+void Subtask_PortalCutscene_1(void);
+void Subtask_PortalCutscene_2(void);
+
+void (*const gUnk_080D4120[])(void) = {
+ sub_0804AAD4,
+ sub_0804AB04,
+ sub_0804AB24,
+};
+void (*const Subtask_PortalCutscene_Functions[])(void) = {
+ Subtask_PortalCutscene_0,
+ Subtask_PortalCutscene_1,
+ Subtask_PortalCutscene_2,
+};
+
+const struct_080D4138 gUnk_080D4138[] = {
+ { 95, 39 },
+ { 96, 40 },
+ { 97, 41 },
+ { 98, 42 },
+};
+
+// x, y values. But they cannot be put in a struct matching?
+const s16 gUnk_080D4140[] = {
+ 0, -22, //
+ 22, 0, //
+ 0, 22, //
+ -22, 0,
+};
+
bool32 CheckInitPortal(void) {
if (gArea.portal_in_use) {
gMain.substate = GAMEMAIN_MINISHPORTAL;
@@ -73,10 +163,10 @@ void sub_0804AB24(void) {
}
void Subtask_PortalCutscene(void) {
- gUnk_080D412C[gArea.filler3[0]]();
+ Subtask_PortalCutscene_Functions[gArea.filler3[0]]();
}
-void sub_0804AB70(void) {
- const u8* ptr;
+void Subtask_PortalCutscene_0(void) {
+ const struct_080D4138* ptr;
RoomControls* controls;
u32 portalId;
@@ -92,19 +182,19 @@ void sub_0804AB70(void) {
if ((portalId == 2) && (gUI.roomControls.area != 2)) {
portalId = 3;
}
- ptr = &gUnk_080D4138[portalId * 2];
- LoadPaletteGroup(ptr[0]);
- LoadGfxGroup(ptr[1]);
+ ptr = &gUnk_080D4138[portalId];
+ LoadPaletteGroup(ptr->paletteGroup);
+ LoadGfxGroup(ptr->gfxGroup);
MemCopy(&gUnk_02017700, gUnk_02017700 + 0x240, 0x20);
gUsedPalettes |= 0x200000;
EraseAllEntities();
- LoadRoomEntityList((EntityData*)gUnk_080D4110[portalId]);
+ LoadRoomEntityList(gUnk_080D4110[portalId]);
ResetSystemPriority();
gArea.filler3[0]++;
SetFade(FADE_INSTANT, 8);
}
-void sub_0804AC1C(void) {
+void Subtask_PortalCutscene_1(void) {
s32 tmp;
UpdateEntities();
@@ -139,7 +229,7 @@ bool32 sub_0804ACA8(void) {
}
}
-void sub_0804ACC8(void) {
+void Subtask_PortalCutscene_2(void) {
if (gFadeControl.active == 0) {
SetGlobalFlag(gArea.portal_type + ENTRANCE_0);
sub_0804AD6C(&gUI.roomControls);
@@ -192,3 +282,5 @@ void sub_0804AD6C(RoomControls* controls) {
ClearArmosData();
sub_080300C4();
}
+
+// TODO end of portal cutscene subtask?
diff --git a/src/entity.c b/src/entity.c
index 5972636e..18f11f75 100644
--- a/src/entity.c
+++ b/src/entity.c
@@ -6,8 +6,6 @@
#include "npc.h"
#include "manager/diggingCaveEntranceManager.h"
-extern u8 gUnk_081091F8[];
-extern u8 gUnk_081091EE[];
extern u8 gUpdateVisibleTiles;
extern Manager gUnk_02033290;
void UpdatePlayerInput(void);
@@ -36,6 +34,11 @@ typedef struct {
} UpdateContext;
extern UpdateContext gUpdateContext;
+// List by entity kind.
+const u8 gUnk_081091E4[] = {
+ 8, 1, 8, 4, 5, 8, 6, 7, 2, 6,
+};
+
void sub_0805E248(void) {
s32 v0;
@@ -64,9 +67,16 @@ void sub_0805E248(void) {
gUpdateVisibleTiles = 0;
}
+const u8 gUnk_081091EE[] = {
+ 0, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+};
+const u8 gUnk_081091F8[] = {
+ 0, 3, 0, 3, 3, 0, 3, 3, 3, 3,
+};
+
void SetDefaultPriorityForKind(Entity* e) {
u8 r3 = gRoomTransition.entity_update_type;
- u8* array = gUnk_081091F8;
+ const u8* array = gUnk_081091F8;
if (r3 != 2) {
array = gUnk_081091EE;
diff --git a/src/fade.c b/src/fade.c
index 62bd7708..f5b0cfa7 100644
--- a/src/fade.c
+++ b/src/fade.c
@@ -172,12 +172,17 @@ static u32 sub_080501C0(FadeControl* ctl) {
return !!((s16)ctl->sustain ^ (s16)ctl->progress);
}
+const u16 gMosaicSizes[] = {
+ 0, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777,
+ 0x8888, 0x9999, 0xaaaa, 0xbbbb, 0xcccc, 0xdddd, 0xeeee, 0xffff,
+};
+
static u32 sub_08050230(FadeControl* ctl) {
u32 type = ctl->type;
u32 idx = ((s16)ctl->progress >> 4) & 0xF;
if (type & 1)
idx = 0xF - idx;
- gScreen.controls.mosaicSize = gUnk_080FC3C4[idx];
+ gScreen.controls.mosaicSize = gMosaicSizes[idx];
if (ctl->progress != 0)
return 1;
diff --git a/src/fileselect.c b/src/fileselect.c
index c3c1ba98..04bbfb89 100644
--- a/src/fileselect.c
+++ b/src/fileselect.c
@@ -4,12 +4,14 @@
*
* @brief File select task
*/
+#include "fileselect.h"
#include "common.h"
-#include "fileselect.h"
+#include "figurineMenu.h"
#include "functions.h"
#include "game.h"
#include "item.h"
+#include "kinstone.h"
#include "main.h"
#include "menu.h"
#include "message.h"
@@ -44,6 +46,190 @@ typedef enum {
RESULT_ASCII = 1,
} CharResult;
+const struct_080FC3E4 gUnk_080FC3E4[] = {
+ { 0, 0, 128, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+#ifdef EU
+ { 0, 0, 0, 1 },
+#else
+ { 0, 0, 2, 1 },
+#endif
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, KINSTONE_2C, UNK_6_10, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 4, 1 },
+ { 0, 0, 7, 1 },
+ { 0, 0, 3, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 4, 1 },
+#ifdef EU
+ { 0, 0, 2, 1 },
+#else
+ { 0, 0, 3, 1 },
+#endif
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+#if defined(EU) || defined(JP)
+ { 0, 0x12, UNK_6_40, 1 },
+#else
+ { 0, 5, UNK_6_20, 1 },
+#endif
+ { 0, 0, 0, 1 },
+ { FLAG_BANK_4, YAMADOUKUTU_0E_SENNIN, UNK_6_40, 1 },
+ { 0, 0, 3, 1 },
+ { 0, 0, 5, 1 },
+ { 0, 0, 5, 1 },
+ { 0, 0, 3, 1 },
+ { 0, 0, 1, 1 },
+ { 0, 0, 3, 1 },
+ { 0, 0, 5, 1 },
+ { 0, 0, 3, 1 },
+ { 0, 0, 2, 1 },
+ { 0, 0, 2, 1 },
+ { 0, 0, 2, 1 },
+ { 0, 0, UNK_6_20, 1 },
+ { 0, KINSTONE_30, UNK_6_10, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 0, 0, 4, 1 },
+ { 0, 0, 4, 1 },
+ { 0, 0, 3, 1 },
+ { 0, 0, 3, 1 },
+ { FLAG_BANK_4, GORON_DOUKUTU_APPEAR, UNK_6_40, 1 },
+ { 0, 0, 3, 1 },
+ { 0, 0, 3, 0 },
+ { 0, 0, 4, 0 },
+ { 0, 0, 7, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 2, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 4, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 4, 0 },
+ { 0, 0, 3, 0 },
+ { 0, 0, 3, 0 },
+ { 0, 0, 6, 0 },
+ { 0, 0, 0, 0 },
+ { 0, 0, 7, 0 },
+#ifdef EU
+ { 0, 0, 0, 0 },
+#else
+ { 0, 0, 2, 0 },
+#endif
+ { 0, KINSTONE_33, UNK_6_10, 1 },
+ { 0, 1, UNK_6_20, 0 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 4, 2 },
+ { 0, 0, 4, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 5, 2 },
+ { 0, 0, 7, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 3, 3 },
+ { 0, 0, 7, 3 },
+ { 0, 0, 0, 2 },
+#ifdef EU
+ { 0, 0, 3, 2 },
+ { 0, 0, 6, 2 },
+#else
+ { 0, 0, 6, 2 },
+ { 0, 0, 3, 2 },
+#endif
+ { 0, 0, 5, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 4, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 7, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 7, 3 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 2, 2 },
+ { 0, 0, 2, 2 },
+ { 0, 0, 6, 2 },
+ { 0, 0, 4, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 7, 2 },
+ { 0, 0, 7, 2 },
+ { 0, 0, 6, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 2, UNK_6_20, 3 },
+ { 0, 3, UNK_6_20, 3 },
+ { 0, 4, UNK_6_20, 3 },
+ { 0, 0, 2, 2 },
+ { 0, 0, 6, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 0, 2 },
+ { 0, 0, 3, 2 },
+ { 0, 0, 0, 3 },
+ { 0, 0, 1, 2 },
+ { 0, 0, 4, 3 },
+ { 0, 0, 7, 3 },
+ { 0, 0, 6, 1 },
+ { 0, 0, 0, 3 },
+ { 0, 0, 1, 3 },
+ { 0, 0, 3, 3 },
+ { FLAG_BANK_8, LV4_10_BOSSDIE, UNK_6_8, 3 },
+ { 0, 0, 9, 0 },
+ { 0, 0, 9, 1 },
+ { 0, 0, 9, 3 },
+ { 0, 0, 9, 3 },
+ { 0, 0, 9, 3 },
+ { 0, 0, 9, 3 },
+ { 0, 0xffff, 0, 1 },
+ { 0, 0xffff, 0, 1 },
+ { 0, 0xffff, 0, 1 },
+};
+
+extern u16 gUnk_02034E4E[];
+const Font gUnk_080FC844 = {
+ gUnk_02034E4E, BG_TILE_ADDR(0x198), gTextGfxBuffer, 0, 96, 224, 1, 1, 0, 1, 3, 0, 0, 1, 0
+};
+
+const u16 gUnk_080FC85C[][3] = {
+ { 0, 3, SFX_MENU_ERROR },
+ { 0, 4, SFX_MENU_ERROR },
+ { 1, 5, 0 },
+ { 0, 6, SFX_MENU_ERROR },
+ { 1, 7, 0 },
+ { 1, 8, 0 },
+ { 0, 9, SFX_MENU_ERROR },
+ { 1, 10, 0 },
+ { 1, 11, 0 },
+ { 0, 12, SFX_MENU_ERROR },
+ { 1, 13, 0 },
+ { 0, 14, 0 },
+};
+
static void HandleFileScreenEnter(void);
static void HandleFileScreenActive(void);
static void HandleFileScreenExit(void);
@@ -101,9 +287,9 @@ extern void (*const gUnk_080FC960[])(void);
extern void (*const gUnk_080FC9B0[])(void);
extern void (*const gUnk_080FC9BC[])(void);
extern void (*const gUnk_080FC9C8[])(void);
-extern u8 gUnk_080FC970[];
-extern u8 gUnk_080FC980[];
-extern u8 gUnk_080FC9A0[];
+extern const u8 gUnk_080FC970[];
+extern const u8 gUnk_080FC980[];
+extern const u8 gUnk_080FC9A0[];
static void ResetEmptyOrDeletedSaveFile(u32);
static void sub_0805066C(void);
@@ -111,6 +297,10 @@ static void HideButtonR(void);
static void ShowButtonR(void);
void sub_08051458(void);
+void sub_08050888(void);
+void sub_080508E4(void);
+void sub_08050910(void);
+
void CreateDialogBox(u32 arg0, u32 arg1) {
u32 sfx;
Font var0;
@@ -119,7 +309,7 @@ void CreateDialogBox(u32 arg0, u32 arg1) {
MemCopy(&gUnk_080FC844, &var0, sizeof(gUnk_080FC844));
sub_08056FEC(arg1, gUnk_020227E8);
var0.gfx_src |= gUnk_080FC85C[arg0][0] << 0xC;
- sub_0805F46C(gUnk_080FC85C[arg0][1], &var0);
+ ShowTextBox(gUnk_080FC85C[arg0][1], &var0);
sfx = gUnk_080FC85C[arg0][2];
if (sfx) {
SoundReq(sfx);
@@ -375,6 +565,12 @@ void sub_08050848(void) {
SetMenuType(1);
}
+void (*const gUnk_080FC908[])(void) = {
+ sub_08050888,
+ sub_080508E4,
+ sub_08050910,
+};
+
void sub_0805086C(void) {
gUnk_080FC908[gChooseFileState.subState]();
}
@@ -550,6 +746,9 @@ typedef struct {
extern const u16 gUnk_080FC914[];
+const u16 gUnk_080FC914[] = { 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251,
+ 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d };
+
// Handles drawing of hearts
NONMATCH("asm/non_matching/save/sub_08050B3C.inc", void sub_08050B3C(u16* arg0)) {
unk_08050B3C sp;
@@ -620,6 +819,14 @@ NONMATCH("asm/non_matching/save/sub_08050B3C.inc", void sub_08050B3C(u16* arg0))
}
END_NONMATCH
+void sub_08050C54(void);
+void sub_08050D68(void);
+
+void (*const gUnk_080FC93C[])() = {
+ sub_08050C54,
+ sub_08050D68,
+};
+
void HandleFileView(void) {
gUnk_080FC93C[gMenu.menuType]();
sub_08050A64(gMapDataBottomSpecial.unk6);
@@ -687,6 +894,15 @@ void sub_08050D68(void) {
}
}
+void sub_08050DB8(void);
+void sub_08050DE4(void);
+void sub_08050E88(void);
+void (*const gUnk_080FC944[])(void) = {
+ sub_08050DB8,
+ sub_08050DE4,
+ sub_08050E88,
+};
+
void HandleFileLanguageSelect(void) {
gUnk_080FC944[gMenu.menuType]();
}
@@ -748,6 +964,17 @@ void sub_08050E88(void) {
SetFileSelectState(0);
}
+void sub_08050EB8(void);
+void sub_08050EF4(void);
+void sub_08050FFC(void);
+void sub_0805103C(void);
+void (*const gUnk_080FC950[])(void) = {
+ sub_08050EB8,
+ sub_08050EF4,
+ sub_08050FFC,
+ sub_0805103C,
+};
+
void HandleFileOptions(void) {
gUnk_080FC950[gMenu.menuType]();
}
@@ -863,6 +1090,17 @@ void sub_0805103C(void) {
}
}
+void sub_08051090(void);
+void sub_080610B8(void);
+void sub_0805138C(void);
+void sub_0805144C(void);
+void (*const gUnk_080FC960[])(void) = {
+ sub_08051090,
+ sub_080610B8,
+ sub_0805138C,
+ sub_0805144C,
+};
+
void HandleFileNew(void) {
gUnk_080FC960[gMenu.menuType]();
}
@@ -877,13 +1115,23 @@ void sub_08051090(void) {
SetMenuType(1);
}
+const u8 gUnk_080FC970[] = {
+ 1, 2, 3, 5, 8, 0, 0, 0, 1, 2, 5, 8, 0, 0, 0, 0,
+};
+const u8 gUnk_080FC980[] = {
+ 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 0, 0, 0,
+};
+const u8 gUnk_080FC9A0[] = {
+ 1, 3, 6, 8, 11, 0, 0, 0, 1, 4, 7, 11, 11, 0, 0, 0,
+};
+
void sub_080610B8(void) {
u8 uVar7;
s32 uVar6;
s32 tmp4;
- u8* puVar3;
- u8* puVar4;
- u8* puVar5;
+ const u8* puVar3;
+ const u8* puVar4;
+ const u8* puVar5;
s32 iVar4;
u8 bVar2;
u32 tmp1;
@@ -1060,6 +1308,15 @@ void sub_08051358(void) {
}
}
+void sub_080513A8(void);
+void sub_080513C0(void);
+void sub_0805141C(void);
+void (*const gUnk_080FC9B0[])(void) = {
+ sub_080513A8,
+ sub_080513C0,
+ sub_0805141C,
+};
+
void sub_0805138C(void) {
gUnk_080FC9B0[gMenu.overlayType]();
}
@@ -1209,12 +1466,21 @@ void sub_08051574(u32 sfx) {
sub_0805070C();
}
+void sub_080515C8(void);
+void sub_080515D4(void);
+void sub_080516E0(void);
+void (*const gUnk_080FC9BC[])(void) = {
+ sub_080515C8,
+ sub_080515D4,
+ sub_080516E0,
+};
+
void HandleFileDelete(void) {
gUnk_080FC9BC[gMenu.menuType]();
sub_08050A64(gMapDataBottomSpecial.unk6);
}
-void sub_080515c8(void) {
+void sub_080515C8(void) {
SetMenuType(1);
}
@@ -1264,6 +1530,17 @@ void sub_080516E0(void) {
}
}
+void sub_08051738(void);
+void sub_080517EC(void);
+void sub_08051874(void);
+void sub_080518E4(void);
+void (*const gUnk_080FC9C8[])(void) = {
+ sub_08051738,
+ sub_080517EC,
+ sub_08051874,
+ sub_080518E4,
+};
+
void HandleFileCopy(void) {
gUnk_080FC9C8[gMenu.menuType]();
sub_08050A64(gMapDataBottomSpecial.unk6);
diff --git a/src/game.c b/src/game.c
index 91bbdb24..206b9ef2 100644
--- a/src/game.c
+++ b/src/game.c
@@ -18,23 +18,24 @@
#include "functions.h"
#include "item.h"
#include "itemMetaData.h"
+#include "itemMetaData.h"
+#include "kinstone.h"
#include "main.h"
+#include "manager/diggingCaveEntranceManager.h"
#include "menu.h"
#include "message.h"
+#include "npc.h"
#include "object.h"
#include "player.h"
+#include "player.h"
#include "room.h"
+#include "roomid.h"
#include "save.h"
#include "screen.h"
#include "sound.h"
#include "subtask.h"
-#include "itemMetaData.h"
-#include "player.h"
#include "transitions.h"
-#include "roomid.h"
#include "ui.h"
-#include "kinstone.h"
-#include "manager/diggingCaveEntranceManager.h"
// Game task
@@ -55,40 +56,8 @@ static GameMainState GameMain_BarrelUpdate;
/*static GameMainState 00000000;*/
GameMainState GameMain_Subtask;
-// Cutscene subtask
-
-typedef void(AuxCutsceneState)(void);
-typedef void(CutsceneMainState)(void);
-
-static AuxCutsceneState AuxCutscene_Init;
-static AuxCutsceneState AuxCutscene_Main;
-static AuxCutsceneState AuxCutscene_Exit;
-
-CutsceneMainState CutsceneMain_Init;
-CutsceneMainState CutsceneMain_Update;
-CutsceneMainState CutsceneMain_Exit;
-
-// Game Over task
-
-typedef void(GameOverState)(void);
-
-static GameOverState GameOver_Init;
-static GameOverState GameOver_FadeIn;
-static GameOverState GameOver_TextMove;
-static GameOverState GameOver_Update;
-static GameOverState GameOver_Exit;
-
extern u8 gUpdateVisibleTiles;
-extern u16 gUnk_020178E0[];
-extern u8 gUnk_02024090[];
-extern const u16 gUnk_080FD5A8[];
-
-extern void** gAreaTilesets[];
-extern void** gAreaRoomMaps[];
-extern void* gAreaMetatiles[];
-extern void** gAreaTable[];
-
extern void FinalizeSave(void);
extern void ClearArmosData(void);
extern void ClearRoomMemory(void);
@@ -110,150 +79,13 @@ extern void LoadRoomGfx(void);
extern void RecycleEntities(void);
extern void sub_0804AF90(void);
extern void CallRoomProp6(void);
-extern void UpdateScroll(void);
-extern void UpdateBgAnimations(void);
-extern void CleanUpGFXSlots(void);
-extern void sub_080ADE24(void);
-extern void sub_0801AE44(u32);
-extern void GenerateAreaHint(void);
-extern void ForceSetPlayerState(u32);
-extern void UpdateRoomTracker(void);
-extern void InitScriptData(void);
-extern void sub_08054524(void);
-extern void sub_080186D4(void);
-extern void sub_0806F364(void);
-extern void sub_08052FF4(u32 area, u32 room);
-extern void CloneMapData(void);
-extern void InitializeCamera(void);
-extern void SetBGDefaults(void);
-extern void LoadItemGfx(void);
-static void LoadRoomBgm(void);
-static void sub_08052010(void);
-static void ResetTmpFlags(void);
-static void InitializeEntities(void);
-static void CheckAreaDiscovery(void);
-static void CreateMiscManager(void);
static void UpdateWindcrests(void);
-static void UpdateFakeScroll(void);
-static void UpdatePlayerMapCoords(void);
-static void sub_08052C3C(void);
-static void UpdateTimerCallbacks(void);
+static void InitializeEntities(void);
static void sub_08051D98(void);
static void sub_08051DCC(void);
-static bool32 CheckGameOver(void);
-static bool32 CheckRoomExit(void);
-static void UpdatePlayerRoomStatus(void);
-static void sub_0805329C(void);
-static void InitializePlayer(void);
-/* static */ void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4);
-static void DrawGameOverText(void);
-static u32 StairsAreValid(void);
-static void ClearFlagArray(const u16*);
-static void DummyHandler(u32* a1);
-static void sub_08053434(u32* a1);
-static void sub_080534E4(u32* a1);
-static void InitAllRoomResInfo(void);
-static void InitRoomResInfo(RoomResInfo* info, RoomHeader* hdr, u32 area, u32 room);
-static void sub_080532E4(void);
-static void ResetTimerFlags(void);
-bool32 ItemIsBottle(u32);
-void ModArrows(s32);
-void ModShells(s32);
-
-typedef struct {
- u8 dest_off[8];
- u8 _8;
- u8 right_align;
- u16 _a;
-} PopupOption;
-
-typedef struct {
- u8 area;
- RoomID room : 8;
- u8 _2;
- u8 _3;
- u16 x;
- u16 y;
-} CutsceneData;
-static const CutsceneData sCutsceneData[];
-
-extern u8 gUnk_0200AF14;
-extern u8 gUnk_080FE1C6[];
-extern void (*const gUnk_080FE2AC[])(void);
-
-extern u8 gUnk_080FE1DD[];
-
-extern void (*const gUnk_080FE2A0[])(void);
-
-extern void (*const gUnk_080FCBB4[])(void);
-
-extern const EntityData gUnk_080FCB94[];
-
-void sub_08052004(void);
-
-extern void (*const gUnk_080FCCFC[])(void);
-
-extern void (*const gUnk_080FCD38[])(void);
-
-extern const EntityData gUnk_080FCC54[];
-
-void sub_08051FF0(void);
-
-extern void (*const gUnk_080FCD40[])(void);
-
-extern const EntityData gUnk_080FCBC4[];
-void sub_08051F78(void);
-
-extern const EntityData gUnk_080FCC14[];
-
-extern void DeleteAllEntities(void);
-
-extern void (*const gUnk_080FCDD4[])(void);
-
-extern const EntityData gUnk_080FCD84[];
-
-extern void (*const gUnk_080FCEB0[])(void);
-
-extern const EntityData gUnk_080FCDE0[];
-
-extern void (*const gUnk_080FCEEC[])(void);
-
-extern const EntityData gUnk_080FCEBC[];
-
-extern void (*const gUnk_080FCEF8[])(void);
-
-extern void (*const gUnk_080FCFA4[])(void);
-
-extern void* GetRoomProperty(u32, u32, u32);
-
-extern void (*const gUnk_080FD108[])(void);
-
-extern const EntityData* gUnk_080FCFB8[];
-extern void (*const gUnk_080FD138[])(void);
-
-extern const u16 gUnk_080FD964[];
-extern const u8 gUnk_080FCF04[];
-
-extern void ClearBgAnimations(void);
-
-void sub_08054974(s32, s32);
-void sub_080548E8(void);
-
-extern void sub_0806F38C(void);
-
-extern void sub_08018710(u32);
-
-typedef struct {
- Font* font;
- u16 width;
- u16 height;
- u16 transitionTimer;
- u16 fadeSpeed;
-} struct_080FCCB4;
-
-extern struct_080FCCB4 gUnk_080FCCB4[];
+void sub_08054974(u32 worldEventId, bool32 param_2);
void GameTask(void) {
static GameState* const sStates[] = {
@@ -430,7 +262,7 @@ static void GameMain_Update(void) {
UpdateScroll();
UpdateBgAnimations();
UpdateScrollVram();
- sub_08052C3C();
+ DecreasePortalTimer();
DrawUI();
UpdateManagers();
DrawUIElements();
@@ -500,6 +332,8 @@ static void GameTask_Exit(void) {
#endif
}
+// TODO End of GameTask?
+
static void InitializeEntities(void) {
sub_08052EA0();
sub_0804AF90();
@@ -572,2311 +406,3 @@ static void UpdateWindcrests(void) {
}
}
}
-
-void Subtask_AuxCutscene(void) {
- static AuxCutsceneState* const sStates[] = {
- AuxCutscene_Init,
- AuxCutscene_Main,
- AuxCutscene_Exit,
- };
-
- sStates[gMenu.menuType]();
-}
-
-static void AuxCutscene_Init(void) {
- const CutsceneData* p = &sCutsceneData[gUI.field_0x3];
- gRoomControls.area = p->area;
- gRoomControls.room = p->room;
- LoadGfxGroups();
- gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
- SetCurrentRoomPropertyList(p->area, p->room);
- LoadAuxiliaryRoom(p->area, p->room);
- gRoomControls.scroll_x = gRoomControls.origin_x + p->x;
- gRoomControls.scroll_y = gRoomControls.origin_y + p->y;
- gMenu.field_0x0 = p->_2;
- gMenu.field_0x3 = p->_3 & 0xf;
- gMenu.field_0xc = (void*)p;
- gMenu.menuType++;
- gMenu.overlayType = 0;
- gMenu.transitionTimer = 300;
- AuxCutscene_Main(); // init
-}
-
-static void AuxCutscene_Main(void) {
- static CutsceneMainState* const sStates[] = {
- CutsceneMain_Init,
- CutsceneMain_Update,
- CutsceneMain_Exit,
- };
-
- sStates[gMenu.field_0x0]();
- FlushSprites();
- UpdateEntities();
- DrawEntities();
- CopyOAM();
- UpdateScroll();
- UpdateBgAnimations();
- UpdateManagers();
- UpdateScrollVram();
-}
-
-static const CutsceneData sCutsceneData[] = {
- { AREA_MINISH_WOODS, 0, 0, 0, 336, 528 },
- { AREA_HYRULE_FIELD, 1, 1, 0, 472, 312 },
- { AREA_HYRULE_CASTLE, 2, 1, 1, 16, 16 },
- { AREA_SANCTUARY, 2, 1, 2, 0, 0 },
- { AREA_EZLO_CUTSCENE, 0, 1, 3, 0, 0 },
- { AREA_HOUSE_INTERIORS_2, 16, 1, 4, 0, 0 },
- { AREA_DARK_HYRULE_CASTLE_OUTSIDE, 0, 1, 5, 0, 40 },
- { AREA_FORTRESS_OF_WINDS, 28, 2, 0, 0, 0 },
- { AREA_FORTRESS_OF_WINDS, 29, 2, 1, 0, 0 },
- { AREA_DARK_HYRULE_CASTLE, 14, 2, 2, 16, 16 },
-};
-
-static void AuxCutscene_Exit(void) {
- u32 flag = sCutsceneData[gUI.field_0x3]._3;
- if (flag & 0xF0) {
- MenuFadeIn(2, flag >> 4);
- } else {
- gUI.nextToLoad = 3;
- SetFadeInverted(0x10);
- MessageInitialize();
- }
-}
-
-void sub_08051F78(void) {
- u32 idx = gUI.field_0x3;
- const CutsceneData* p = &sCutsceneData[idx];
- sub_08051F9C(p->area, p->room, p->x, p->y);
-}
-
-void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4) {
- u32 tmp = gScreen.lcd.displayControl & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
- sub_08052FF4(a1, a2);
- gRoomControls.scroll_x = gRoomControls.origin_x + a3;
- gRoomControls.scroll_y = gRoomControls.origin_y + a4;
- InitializeCamera();
- gUpdateVisibleTiles = 1;
- gUsedPalettes = 0;
- gScreen.lcd.displayControl |= tmp;
-}
-
-void sub_08051FF0(void) {
- sub_0804B0B0(gMenu.field_0xc[0], gMenu.field_0xc[1]);
-}
-
-void sub_08052004(void) {
- gMenu.menuType = 2;
-}
-
-static void sub_08052010(void) {
- InitSoundPlayingInfo();
- MessageInitialize();
- DispReset(1);
- MemClear(gBG1Buffer, sizeof(gBG1Buffer));
- MemClear(gBG2Buffer, sizeof(gBG2Buffer));
- sub_080A4D34();
- LoadPaletteGroup(0xA);
- SetColor(0, 0);
- LoadGfxGroup(4);
- MemClear((void*)0x06000000, 0x20);
- MemClear(&gGenericMenu, sizeof(gGenericMenu));
- gScreen.lcd.displayControl |= DISPCNT_OBJ_ON;
- gScreen.bg1.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_CHARBASE(0);
- gScreen.bg2.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(29) | BGCNT_CHARBASE(1);
- gScreen.bg1.updated = 1;
- gScreen.bg2.updated = 1;
-}
-
-void GameOverTask(void) {
- static GameOverState* const sStates[] = {
- GameOver_Init, GameOver_FadeIn, GameOver_TextMove, GameOver_Update, GameOver_Exit,
- };
-
- sStates[gMain.state]();
- if (gMain.state != GAMETASK_TRANSITION) {
- FlushSprites();
- DrawGameOverText();
- CopyOAM();
- }
-}
-
-static void switch_state(u32 idx) {
- gMain.state = idx;
- SetMenuType(0);
-}
-
-static void GameOver_Init(void) {
- if (gFadeControl.active)
- return;
- sub_08052010();
- gGenericMenu.unk10.a[0] = 80;
- gMenu.transitionTimer = 60;
- gSave.stats.health = 24;
- gMain.field_0x5 = 60;
- SoundReq(BGM_GAMEOVER);
- SetFadeInverted(4);
- gFadeControl.mask = 0xFFFF0001;
- switch_state(GAMETASK_INIT);
-}
-
-static void GameOver_FadeIn(void) {
- if (gFadeControl.active)
- return;
-
- if (gMain.field_0x5 == 0) {
- if (gGenericMenu.unk10.a[0] >= 38) {
- gGenericMenu.unk10.a[0]--;
- } else {
- gMenu.transitionTimer--;
- if (gMenu.transitionTimer == 0) {
- switch_state(GAMETASK_MAIN);
-#if defined(DEMO_USA) || defined(DEMO_JP)
- SoundReq(SONG_VOL_FADE_OUT);
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4);
-#else
- SetPopupState(0, 0);
- gScreen.lcd.displayControl |= DISPCNT_BG1_ON | DISPCNT_BG2_ON;
- gFadeControl.mask = 0x0000ffff;
- SetFade(FADE_INSTANT, 16);
-#endif
- }
- }
- } else {
- gMain.field_0x5--;
- }
-}
-
-static void GameOver_TextMove(void) {
-#if defined(DEMO_USA) || defined(DEMO_JP)
- if (gFadeControl.active == 0) {
- DoSoftReset();
- }
-}
-#else
- s32 temp3;
- u32 temp2;
-
- if (gFadeControl.active)
- return;
-
- switch (gMenu.menuType) {
- case 0:
- gMenu.transitionTimer = 30;
- gMenu.field_0x3 = 0;
- SetMenuType(1);
- SetPopupState(0, 0);
- gFadeControl.mask = 0xffffffff;
- return;
- case 1:
- if (gMenu.transitionTimer == 0) {
- u32 temp = gMenu.field_0x3;
- switch (gInput.newKeys) {
- case DPAD_UP:
- temp = 0;
- break;
- case DPAD_DOWN:
- temp = 1;
- break;
- case A_BUTTON:
- if (gMenu.field_0x3 != 0) {
- temp2 = 4;
- } else {
- CreateDialogBox(8, 0);
- temp2 = 2;
- }
- gMenu.transitionTimer = 60;
- SetMenuType(temp2);
- SoundReq(SFX_TEXTBOX_SELECT);
- break;
- }
- if (gMenu.field_0x3 != temp) {
- gMenu.field_0x3 = temp;
- SetPopupState(0, temp);
- SoundReq(SFX_TEXTBOX_CHOICE);
- }
- return;
- }
- gMenu.transitionTimer--;
- return;
- case 2:
- temp3 = HandleSave(0);
- gMenu.field_0x0 = temp3;
- switch (temp3) {
- case 1:
- SetMenuType(4);
- break;
- case -1:
- gMenu.transitionTimer = 60;
- CreateDialogBox(9, 0);
- SetMenuType(3);
- break;
- }
- return;
- case 3:
- if (gMenu.transitionTimer != 0) {
- gMenu.transitionTimer--;
- } else if (gInput.newKeys & (A_BUTTON | B_BUTTON | START_BUTTON)) {
- SetMenuType(0);
- }
- return;
- case 4:
- default:
- gScreen.lcd.displayControl &= ~DISPCNT_BG1_ON;
- sub_08050384();
- switch_state(GAMETASK_EXIT);
- return;
- }
-}
-#endif
-
-static void GameOver_Update(void) {
- switch (gMenu.menuType) {
- case 0x0:
- gMenu.transitionTimer = 30;
- gMenu.field_0x3 = 0;
- SetMenuType(1);
- SetPopupState(1, 0);
- return;
- case 0x1:
- gScreen.lcd.displayControl |= DISPCNT_BG1_ON;
- if (gMenu.transitionTimer != 0) {
- gMenu.transitionTimer--;
- return;
- } else {
- u32 temp = gMenu.field_0x3;
- switch (gInput.newKeys) {
- case DPAD_UP:
- temp = 0;
- break;
- case DPAD_DOWN:
- temp = 1;
- break;
- case A_BUTTON:
- SetMenuType(2);
- SoundReq(SFX_TEXTBOX_SELECT);
- if (temp == 0) {
- SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
- } else {
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 8);
- }
- break;
- }
- if (gMenu.field_0x3 != temp) {
- gMenu.field_0x3 = temp;
- SetPopupState(1, temp);
- SoundReq(SFX_TEXTBOX_CHOICE);
- }
- }
- return;
- case 0x2:
- default:
- if (gFadeControl.active == 0) {
- if (gMenu.field_0x3 == 0) {
- SetTask(TASK_GAME);
- } else {
- DoSoftReset();
- }
- }
- return;
- }
-}
-
-// Unused, since task is set above
-// if we got here, it would be a softlock
-static void GameOver_Exit(void) {
-}
-
-static void DrawGameOverText(void) {
- static const u8 sOffsets[] = {
- 48, 68, 88, 108, 137, 156, 174, 192,
- };
-
- u32 i;
-
- gOamCmd._4 = 0;
- gOamCmd._6 = 0;
- gOamCmd._8 = 0x8600;
- gOamCmd.y = gGenericMenu.unk10.a[0];
- for (i = 0; i < 8; ++i) {
- gOamCmd.x = sOffsets[i];
-#ifdef EU
- DrawDirect(0x1fc, i);
-#else
- DrawDirect(0x1fd, i);
-#endif
- }
-}
-
-void SetPopupState(u32 type, u32 choice_idx) {
- static const Font sDefaultFont = {
- .dest = gBG1Buffer,
- .gfx_dest = (u16*)0x06006000,
- .buffer_loc = gTextGfxBuffer,
- ._c = 0,
- .gfx_src = 0xD300,
- .width = 0xE0,
- .right_align = 0,
- .sm_border = 0,
- .unused = 0,
- .draw_border = 0,
- .border_type = 0,
- .fill_type = 6,
- .charColor = 4,
- ._16 = 1,
- .stylized = 0,
- };
- static const PopupOption sPopupOptions[] = {
- { { 11, 11, 11, 10, 11, 10, 10, 0 }, 8, 0, 16 },
- { { 10, 11, 11, 9, 11, 9, 9, 0 }, 8, 0, 17 },
- { { 15, 15, 15, 15, 15, 15, 15, 0 }, 5, 1, 13 },
- };
-
- Font font;
- const PopupOption* opt;
- u32 fakematch;
-
- MemClear(gBG1Buffer, sizeof gBG1Buffer);
- gUnk_020227E8[0]._0.WORD = 0xf;
- gUnk_020227E8[1]._0.WORD = 0xf;
- gUnk_020227E8[2]._0.WORD = 0xf;
- gUnk_020227E8[3]._0.WORD = 0xf;
- *(&gUnk_020227E8[choice_idx]._0.BYTES.byte0 + 1) = fakematch = 1;
-
- MemCopy(&sDefaultFont, &font, sizeof font);
- opt = &sPopupOptions[type];
- font.dest = sDefaultFont.dest + (opt->dest_off[gSaveHeader->language] + opt->_8 * 32);
- font.right_align = opt->right_align;
- sub_0805F46C(opt->_a, &font);
- gScreen.bg1.updated = fakematch;
-}
-
-static void InitializePlayer(void) {
- static const u8 sPlayerSpawnStates[] = {
- [PL_SPAWN_DEFAULT] = PLAYER_INIT,
- [PL_SPAWN_MINISH] = PLAYER_MINISH,
- [PL_SPAWN_DROP] = PLAYER_INIT,
- [PL_SPAWN_WALKING] = PLAYER_ROOMTRANSITION,
- [PL_SPAWN_STEP_IN] = PLAYER_ROOM_EXIT,
- [PL_SPAWN_SLEEPING] = PLAYER_SLEEP,
- [PL_SPAWN_DROP_MINISH] = PLAYER_MINISH,
- [PL_SPAWN_STAIRS_ASCEND] = PLAYER_USEENTRANCE,
- [PL_SPAWN_STAIRS_DESCEND] = PLAYER_USEENTRANCE,
- [PL_SPAWN_9] = PLAYER_MINISH,
- [PL_SPAWN_PARACHUTE_FORWARD] = PLAYER_WARP,
- [PL_SPAWN_PARACHUTE_UP] = PLAYER_WARP,
- [PL_SPAWN_FAST_TRAVEL] = PLAYER_WARP,
- };
-
- Entity* pl;
-
- sub_080784C8();
- MemClear(&gActiveItems, sizeof(gActiveItems));
- MemClear(&gPlayerState, sizeof(gPlayerState));
- MemFill32(0xffffffff, &gPlayerState.path_memory, sizeof(gPlayerState.path_memory));
- MemClear(&gPlayerEntity, sizeof(gPlayerEntity));
-
- pl = &gPlayerEntity;
-
- gRoomControls.camera_target = pl;
- gPlayerState.queued_action = sPlayerSpawnStates[gRoomTransition.player_status.spawn_type];
- if (!CheckGlobalFlag(EZERO_1ST)) {
- gPlayerState.flags |= PL_NO_CAP;
- }
- switch (gRoomTransition.player_status.spawn_type) {
- case PL_SPAWN_DROP:
- case PL_SPAWN_DROP_MINISH:
- pl->z.HALF.HI = -0xc0;
- break;
- case PL_SPAWN_STEP_IN:
- gPlayerState.field_0x38 = 16;
- pl->direction = Direction8FromAnimationState(gRoomTransition.player_status.start_anim);
- case PL_SPAWN_WALKING:
- pl->speed = 224;
- break;
- case PL_SPAWN_STAIRS_ASCEND:
- case PL_SPAWN_STAIRS_DESCEND:
- gPlayerState.field_0x38 = 1;
- gPlayerState.field_0x39 = gRoomTransition.player_status.spawn_type;
- break;
- case PL_SPAWN_PARACHUTE_FORWARD:
- gPlayerState.field_0x38 = 1;
- break;
- case PL_SPAWN_PARACHUTE_UP:
- gPlayerState.field_0x38 = 3;
- break;
- case PL_SPAWN_FAST_TRAVEL:
- gPlayerState.field_0x38 = 4;
- }
-
- pl->kind = PLAYER;
- pl->flags |= ENT_COLLIDE | ENT_PERSIST;
- pl->spritePriority.b0 = 4;
- pl->health = gSave.stats.health;
- pl->x.HALF.HI = gRoomTransition.player_status.start_pos_x;
- pl->y.HALF.HI = gRoomTransition.player_status.start_pos_y;
- pl->animationState = gRoomTransition.player_status.start_anim;
- pl->collisionLayer = gRoomTransition.player_status.layer;
- UpdateSpriteForCollisionLayer(pl);
- AppendEntityToList(pl, 1);
- RegisterPlayerHitbox();
-}
-
-bool32 AreaIsOverworld(void) {
-#ifdef EU
- return gArea.areaMetadata == 0x01;
-#else
- return gArea.areaMetadata == 0x81;
-#endif
-}
-
-bool32 CheckAreaOverworld(u32 area) {
-#if EU
- return gAreaMetadata[area].flags == 0x01;
-#else
- return gAreaMetadata[area].flags == 0x81;
-#endif
-}
-
-#ifndef EU
-bool32 AreaAllowsWarp(void) {
- return (gArea.areaMetadata >> 7) & 1;
-}
-#endif
-
-bool32 AreaIsDungeon(void) {
- return (gArea.areaMetadata >> 2) & 1;
-}
-
-bool32 AreaHasEnemies(void) {
- return (gArea.areaMetadata >> 4) & 1;
-}
-
-bool32 AreaHasNoEnemies(void) {
- return (gArea.areaMetadata >> 6) & 1;
-}
-
-bool32 AreaHasMap(void) {
- return (gArea.areaMetadata >> 3) & 1;
-}
-
-s32 ModHealth(s32 delta) {
- s32 newHealth;
- Stats* stats = &gSave.stats;
-
- newHealth = stats->health + delta;
- if (newHealth < 0) {
- newHealth = 0;
- }
- if (stats->maxHealth < newHealth) {
- newHealth = (u32)stats->maxHealth;
- }
- stats->health = newHealth;
- gPlayerEntity.health = newHealth;
- return newHealth;
-}
-
-void ModRupees(s32 delta) {
- s32 newRupeeCount;
- Stats* s = &gSave.stats;
-
- newRupeeCount = s->rupees + delta;
- if (newRupeeCount < 0) {
- newRupeeCount = 0;
- } else {
- if (newRupeeCount > gWalletSizes[s->walletType * 2]) {
- newRupeeCount = gWalletSizes[s->walletType * 2];
- }
- }
- s->rupees = newRupeeCount;
-}
-
-void sub_080526F8(s32 a1) {
- if (AreaHasKeys()) {
- u8* p = &gSave.unk45C[gArea.dungeon_idx];
- if (*p + a1 < 0)
- *p = 0;
- else
- *p += a1;
- }
-}
-
-bool32 AreaHasKeys(void) {
- return (gArea.areaMetadata >> 1) & 1;
-}
-
-bool32 HasDungeonMap(void) {
- u32 tmp;
-
- if (AreaHasKeys())
- tmp = gSave.unk45C[gArea.dungeon_idx];
- return tmp ? 1 : 0;
-}
-
-bool32 HasDungeonCompass(void) {
- u32 tmp;
-
- if (AreaHasKeys())
- tmp = gSave.unk46C[gArea.dungeon_idx] & 4;
- return tmp ? 1 : 0;
-}
-
-bool32 HasDungeonBigKey(void) {
- if (!AreaHasKeys())
- return 0;
- return (gSave.unk46C[gArea.dungeon_idx] >> 1) & 1;
-}
-
-bool32 HasDungeonSmallKey(void) {
- u32 tmp;
-
- if (!AreaHasKeys())
- return 0;
- return gSave.unk46C[gArea.dungeon_idx] & 1;
-}
-
-void RestoreGameTask(u32 a1) {
- LoadGfxGroups();
-#ifndef EU
- CleanUpGFXSlots();
-#endif
- sub_080ADE24();
- InitUI(TRUE);
- sub_0801AE44(a1);
- MemCopy(gUnk_02024090, gPaletteBuffer, 1024);
- gUsedPalettes = 0xffffffff;
-}
-
-static void LoadRoomBgm(void) {
- gArea.queued_bgm = gAreaMetadata[gRoomControls.area]._3;
- if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) {
- gArea.queued_bgm = BGM_FIGHT_THEME2;
- }
-}
-
-#ifndef EU
-void sub_08052878(void) {
- gArea.bgm = gArea.queued_bgm;
- SoundReq(SONG_STOP_ALL);
-}
-
-static void sub_0805289C(void) {
- gArea.queued_bgm = gArea.bgm;
-}
-#endif
-
-static bool32 CheckGameOver(void) {
- if (gRoomTransition.field_0x4[1]) {
- InitFade();
- gMain.state = GAMETASK_EXIT;
- gMain.substate = GAMEMAIN_INITROOM;
- SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
- SoundReq(SONG_STOP_BGM);
- return TRUE;
- }
- return FALSE;
-}
-
-void RoomExitCallback(void) {
- if (gArea.transitionManager != NULL && gArea.onExit != NULL)
- gArea.onExit(gArea.transitionManager);
-}
-
-static bool32 CheckRoomExit(void) {
- if (gRoomTransition.transitioningOut && gSave.stats.health != 0 && gPlayerState.framestate != PL_STATE_DIE) {
- if (StairsAreValid()) {
- gRoomTransition.transitioningOut = 0;
- return FALSE;
- }
-
- switch (gRoomTransition.type) {
- case TRANSITION_CUT:
- SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 8);
- break;
- case TRANSITION_CUT_FAST:
- SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 3);
- break;
- case TRANSITION_FADE_WHITE_SLOW:
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4);
- break;
- case TRANSITION_FADE_BLACK_SLOW:
- SetFade(FADE_IN_OUT | FADE_INSTANT, 4);
- break;
- case TRANSITION_FADE_BLACK:
- SetFade(FADE_IN_OUT | FADE_INSTANT, 16);
- break;
- case TRANSITION_FADE_BLACK_FAST:
- SetFade(FADE_IN_OUT | FADE_INSTANT, 256);
- break;
- case TRANSITION_7:
- case TRANSITION_FADE_WHITE_FAST:
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256);
- break;
- default:
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 16);
- break;
- }
- RoomExitCallback();
- gMain.substate = GAMEMAIN_CHANGEAREA;
- *(&gMain.pauseInterval + 1) = 1;
- return TRUE;
- }
- return FALSE;
-}
-
-static u32 StairsAreValid(void) {
- static const u16 sStairTypes[] = { 0x91, PL_SPAWN_STAIRS_ASCEND, 0x92, PL_SPAWN_STAIRS_DESCEND,
- 0x93, PL_SPAWN_STAIRS_ASCEND, 0x94, PL_SPAWN_STAIRS_DESCEND,
- 0x95, PL_SPAWN_STAIRS_ASCEND, 0x96, PL_SPAWN_STAIRS_DESCEND,
- 0x97, PL_SPAWN_STAIRS_ASCEND, 0x98, PL_SPAWN_STAIRS_DESCEND,
- 0 };
-
- const u16* i;
- u32 tgt = gRoomTransition.stairs_idx;
-
- for (i = sStairTypes; i[0] != 0; i += 2) {
- if (tgt == i[0]) {
- gPlayerState.queued_action = PLAYER_USEENTRANCE;
- gPlayerState.field_0x38 = 0;
- gPlayerState.field_0x39 = i[1];
- if (!gRoomTransition.player_status.spawn_type)
- gRoomTransition.player_status.spawn_type = i[1];
- return 1;
- }
- }
- return 0;
-}
-
-void InitParachuteRoom(void) {
- gRoomTransition.transitioningOut = 1;
- gRoomTransition.player_status.start_pos_x = (gPlayerEntity.x.HALF.HI - gRoomControls.origin_x) & 0x3F8;
- gRoomTransition.player_status.start_pos_y = (gPlayerEntity.y.HALF.HI - gRoomControls.origin_y) & 0x3F8;
- gRoomTransition.player_status.start_anim = 4;
- gRoomTransition.player_status.spawn_type = PL_SPAWN_PARACHUTE_FORWARD;
- gRoomTransition.player_status.area_next = gRoomControls.area;
- gRoomTransition.player_status.room_next = gRoomControls.room - 1;
-}
-
-static void InitRoomTransition(void) {
- switch (gRoomTransition.type) {
- case TRANSITION_CUT:
- SetFade(FADE_INSTANT | FADE_MOSAIC, 8);
- break;
- case TRANSITION_CUT_FAST:
- SetFade(FADE_INSTANT | FADE_MOSAIC, 3);
- break;
- case TRANSITION_FADE_WHITE_SLOW:
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 4);
- break;
- case TRANSITION_3:
- break;
- case TRANSITION_FADE_BLACK_FAST:
- SetFade(FADE_IN_OUT | FADE_INSTANT, 256);
- break;
- case TRANSITION_7:
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256);
- break;
- case TRANSITION_FADE_BLACK:
- SetFade(FADE_INSTANT, 16);
- break;
- case TRANSITION_FADE_WHITE_FAST:
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8);
- break;
- default:
- SetFadeInverted(16);
- break;
- }
-}
-
-bool32 CanDispEzloMessage(void) {
- s32 tmp = PL_STATE_WALK;
-
- if (!(gInput.heldKeys & SELECT_BUTTON) || gPlayerState.controlMode != CONTROL_ENABLED ||
- gPauseMenuOptions.disabled || gUnk_0200AF00.unk_1)
- return FALSE;
-
- if ((gPlayerState.flags & (PL_NO_CAP | PL_CAPTURED | PL_DISABLE_ITEMS)) || (gPlayerState.framestate_last > tmp) ||
- gPlayerState.item || gPlayerEntity.field_0x7a.HWORD)
- return FALSE;
-
- if ((gPlayerEntity.z.HALF.HI & 0x8000) && !gPlayerState.field_0xa)
- return FALSE;
-
- GenerateAreaHint();
- ForceSetPlayerState(PL_STATE_TALKEZLO);
- SetPlayerEventPriority();
- return TRUE;
-}
-
-void DisplayEzloMessage(void) {
- u32 height;
- u32 idx;
-#if defined(JP) || defined(EU)
- idx = 0x10;
-#else
- idx = 0x11;
-#endif
-
- if (gRoomTransition.player_status.field_0x24[idx] == 0) {
- height = gPlayerEntity.y.HALF.HI - gRoomControls.scroll_y > 96 ? 1 : 13;
- } else {
- height = gRoomTransition.player_status.field_0x24[idx];
- }
- MessageAtHeight(gRoomTransition.hint_idx, height);
-}
-
-#if defined(USA) || defined(DEMO_USA) || defined(DEMO_JP)
-static void CreateMiscManager(void) {
- Entity* e = NULL;
-
- if (gRoomTransition.player_status.field_0x24[13])
- return;
- gRoomTransition.player_status.field_0x24[13] = 1;
-#ifndef DEMO_JP
- gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex;
-#endif
- e = (Entity*)GetEmptyManager();
- if (e == NULL)
- return;
- e->kind = MANAGER;
- e->id = MISC_MANAGER;
- e->type = 15;
- AppendEntityToList(e, 0);
-}
-#endif
-
-static void sub_08052C3C(void) {
- if (gArea.portal_mode == 0)
- gArea.portal_timer = 0;
- if (gArea.portal_timer) {
- gArea.portal_timer--;
- gArea.portal_mode = 0;
- }
-}
-
-static void UpdatePlayerMapCoords(void) {
- if (!AreaHasNoEnemies()) {
- if (AreaIsOverworld()) {
- gRoomTransition.player_status.overworld_map_x = gPlayerEntity.x.HALF_U.HI;
- gRoomTransition.player_status.overworld_map_y = gPlayerEntity.y.HALF_U.HI;
- } else if (AreaIsDungeon()) {
- gRoomTransition.player_status.dungeon_map_x = gPlayerEntity.x.HALF.HI;
- gRoomTransition.player_status.dungeon_map_y = gPlayerEntity.y.HALF.HI;
- }
- }
-}
-
-void SetWorldMapPos(u32 area, u32 room, u32 x, u32 y) {
- RoomHeader* hdr = gAreaRoomHeaders[area] + room;
- gRoomTransition.player_status.overworld_map_x = hdr->map_x + x;
- gRoomTransition.player_status.overworld_map_y = hdr->map_y + y;
-}
-
-void SetDungeonMapPos(u32 area, u32 room, u32 x, u32 y) {
- RoomHeader* hdr = gAreaRoomHeaders[area] + room;
- gRoomTransition.player_status.dungeon_map_x = hdr->map_x + x;
- gRoomTransition.player_status.dungeon_map_y = hdr->map_y + y;
-}
-
-void InitRoom(void) {
- AreaHeader* a_hdr = NULL;
-
- MemClear(&gArea, sizeof gArea);
- a_hdr = &gAreaMetadata[gRoomControls.area];
- gArea.areaMetadata = a_hdr->flags;
- gArea.locationIndex = a_hdr->location;
- gArea.dungeon_idx = a_hdr->location - 23;
- gArea.localFlagOffset = gLocalFlagBanks[a_hdr->flag_bank];
- gArea.flag_bank = a_hdr->flag_bank;
- gArea.portal_timer = 180;
- gArea.lightLevel = 256;
- InitRoomTransition();
- InitAllRoomResInfo();
-}
-
-u32 GetFlagBankOffset(u32 idx) {
- AreaHeader* a_hdr = &gAreaMetadata[idx];
- return gLocalFlagBanks[a_hdr->flag_bank];
-}
-
-void RegisterTransitionManager(void* mgr, void (*onEnter)(), void (*onExit)()) {
- if (gMain.substate != GAMEMAIN_SUBTASK) {
- gArea.transitionManager = mgr;
- gArea.onEnter = onEnter;
- gArea.onExit = onExit;
- }
-}
-
-static void InitAllRoomResInfo(void) {
- RoomHeader* r_hdr = gAreaRoomHeaders[gRoomControls.area];
- RoomResInfo* info = gArea.roomResInfos;
- u32 i;
- for (i = 0; i < MAX_ROOMS && *(u16*)r_hdr != 0xFFFF; i++, r_hdr++) {
- if (r_hdr->tileset_id != 0xFFFF)
- InitRoomResInfo(info, r_hdr, gRoomControls.area, i);
- info++;
- }
- gArea.pCurrentRoomInfo = GetCurrentRoomInfo();
-}
-
-static void InitRoomResInfo(RoomResInfo* info, RoomHeader* r_hdr, u32 area, u32 room) {
- info->map_x = r_hdr->map_x;
- info->map_y = r_hdr->map_y;
- info->pixel_width = r_hdr->pixel_width;
- info->pixel_height = r_hdr->pixel_height;
- info->tileset = *(gAreaTilesets[area] + r_hdr->tileset_id);
- info->map = *(gAreaRoomMaps[area] + room);
- info->metatiles = gAreaMetatiles[area];
- info->bg_anim = (void*)gUnk_080B755C[area];
- info->exits = gExitLists[area][room];
- if (gAreaTable[area] != NULL) {
- info->properties = *(gAreaTable[area] + room);
- }
-}
-
-RoomResInfo* GetCurrentRoomInfo(void) {
- return &gArea.roomResInfos[gRoomControls.room];
-}
-
-void sub_08052EA0(void) {
- MemClear(&gRoomVars, sizeof gRoomVars);
- gRoomVars.unk_10[0] = -1;
- gRoomVars.unk_10[1] = gRoomVars.unk_10[0];
- gRoomVars.unk_10[2] = gRoomVars.unk_10[0];
- gRoomVars.unk_10[3] = gRoomVars.unk_10[0];
- gRoomVars.lightLevel = 256;
- gArea.locationIndex = gAreaMetadata[gRoomControls.area].location;
- UpdateRoomTracker();
- InitScriptData();
- sub_08054524();
- sub_080186D4();
- sub_0806F364();
- UpdateGlobalProgress();
-}
-
-static u32 sub_08052EF4(s32 idx) {
- AreaHeader* a_hdr = NULL;
- u32 i = idx < 0 ? gRoomControls.area : idx;
- a_hdr = &gAreaMetadata[i];
- return gLocalFlagBanks[a_hdr->flag_bank];
-}
-
-/**
- * @brief If enabled, this type of transition does not change the room
- * and keeps all entities.
- */
-static void UpdateFakeScroll(void) {
- u32 x, y;
- LinkedList* ll;
- Entity* e;
-
- if (gArea.unk_0c_0 == 0 || !gRoomVars.field_0x0)
- return;
-
- y = 0;
- x = 0;
-
- // WTF?
- switch (gRoomControls.scroll_direction) {
- case 0:
- y = gArea.pCurrentRoomInfo->pixel_height;
- case 1:
- y = gArea.pCurrentRoomInfo->pixel_height;
- case 2:
- y = gArea.pCurrentRoomInfo->pixel_height;
- case 3:
- x = gArea.pCurrentRoomInfo->pixel_width;
- }
-
- gArea.pCurrentRoomInfo->map_x += x;
- gArea.pCurrentRoomInfo->map_y += y;
- gRoomControls.origin_x += x;
- gRoomControls.origin_y += y;
- gRoomControls.scroll_x += x;
- gRoomControls.scroll_y += y;
-
- ll = gEntityLists;
- do {
- for (e = ll->first; e != (Entity*)ll; e = e->next) {
- if (e->kind != MANAGER) {
- e->x.HALF.HI += x;
- e->y.HALF.HI += y;
- }
- }
- } while (++ll < gEntityLists + 9);
-}
-
-void LoadAuxiliaryRoom(u32 area, u32 room) {
- sub_08052FF4(area, room);
- gRoomControls.camera_target = NULL;
- CloneMapData();
- InitializeCamera();
-}
-
-void sub_08052FF4(u32 area, u32 room) {
- RoomHeader* r_hdr = NULL;
-
- ClearTilemaps();
- SetBGDefaults();
- gRoomControls.area = area;
- gRoomControls.room = room;
- gScreen.lcd.displayControl = 0x1740;
- MemClear(&gArea.currentRoomInfo, sizeof gArea.currentRoomInfo);
- gArea.pCurrentRoomInfo = &gArea.currentRoomInfo;
- r_hdr = gAreaRoomHeaders[area] + room;
- gArea.currentRoomInfo.map_x = r_hdr->map_x;
- gArea.currentRoomInfo.map_y = r_hdr->map_y;
- gArea.currentRoomInfo.pixel_width = r_hdr->pixel_width;
- gArea.currentRoomInfo.pixel_height = r_hdr->pixel_height;
- gArea.currentRoomInfo.tileset = *(gAreaTilesets[area] + r_hdr->tileset_id);
- gArea.currentRoomInfo.map = *(gAreaRoomMaps[area] + room);
- gArea.currentRoomInfo.metatiles = gAreaMetatiles[area];
- gArea.currentRoomInfo.bg_anim = (void*)gUnk_080B755C[area];
-}
-
-void ChangeLightLevel(s32 lightLevel) {
- lightLevel += gRoomVars.lightLevel;
- if (lightLevel < 0)
- lightLevel = 0;
- if (lightLevel > 256)
- lightLevel = 256;
- gRoomVars.lightLevel = lightLevel;
-}
-
-static void sub_080530B0(void) {
- static const u16 sMinecartData[] = { 0x189, 0x0, 0x102, 0x4, 0x1af, 0x0, 0x204, 0x0,
- 0x1cf, 0x0, 0x10, 0x4, 0x0, 0x0, 0x0, 0x0 };
-
- MemCopy(sMinecartData, gRoomTransition.minecart_data, sizeof sMinecartData);
-}
-
-void UpdateGlobalProgress(void) {
- u8 pcnt = 1;
- if (CheckLocalFlagByBank(FLAG_BANK_3, SEIIKI_STAINED_GLASS)) {
- pcnt = 9;
- } else if (CheckGlobalFlag(LV5_CLEAR)) {
- pcnt = 8;
- } else if (CheckLocalFlagByBank(FLAG_BANK_3, OUBO_KAKERA)) {
- pcnt = 7;
- } else if (CheckGlobalFlag(LV4_CLEAR)) {
- pcnt = 6;
- } else if (CheckGlobalFlag(LV3_CLEAR)) {
- pcnt = 5;
- } else if (CheckLocalFlagByBank(FLAG_BANK_1, SOUGEN_08_TORITSUKI)) {
- pcnt = 4;
- } else if (CheckGlobalFlag(LV1_CLEAR)) {
- pcnt = 2;
- }
- gSave.global_progress = pcnt;
-}
-
-static u32 sub_08053144(void) {
- u32 ret;
-
- if (CheckGlobalFlag(ENDING))
- return 0;
- ret = 0;
- if (gArea.locationIndex != 0)
- ret = !!(gRoomTransition.player_status.field_0x24[10] ^ gArea.locationIndex);
- return ret;
-}
-
-static void CheckAreaDiscovery(void) {
- if (!sub_08053144())
- return;
-
- gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex;
-
- if (!CheckGlobalFlag(TABIDACHI))
- return;
-
- if (!CheckGlobalFlag(ENDING)) {
- Entity* e = (Entity*)GetEmptyManager();
- if (e != NULL) {
- e->kind = MANAGER;
- e->id = ENTER_ROOM_TEXTBOX_MANAGER;
- AppendEntityToList(e, 8);
- if (!gRoomVars.field_0x0 && !ReadBit(gSave.areaVisitFlags, gArea.locationIndex)) {
- e->type2 = 1;
- SetPlayerControl(3);
- SetInitializationPriority();
- }
- }
- }
- WriteBit(gSave.areaVisitFlags, gArea.locationIndex);
-}
-
-static void UpdatePlayerRoomStatus(void) {
- gPlayerState.startPosX = gPlayerEntity.x.HALF.HI;
- gPlayerState.startPosY = gPlayerEntity.y.HALF.HI;
- if (sub_08053144()) {
- MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status);
- if (AreaIsDungeon()) {
- gRoomTransition.player_status.dungeon_area = gRoomControls.area;
- gRoomTransition.player_status.dungeon_room = gRoomControls.room;
- gRoomTransition.player_status.dungeon_x = gPlayerEntity.x.HALF.HI;
- gRoomTransition.player_status.dungeon_y = gPlayerEntity.y.HALF.HI;
- }
- }
-}
-
-void sub_08053250(void) {
- gRoomTransition.player_status.spawn_type = PL_SPAWN_DEFAULT;
- gRoomTransition.player_status.start_pos_x = gPlayerEntity.x.HALF.HI - gRoomControls.origin_x;
- gRoomTransition.player_status.start_pos_y = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y;
- gRoomTransition.player_status.start_anim = gPlayerEntity.animationState;
- gRoomTransition.player_status.layer = gPlayerEntity.collisionLayer;
- gRoomTransition.player_status.area_next = gRoomControls.area;
- gRoomTransition.player_status.room_next = gRoomControls.room;
- MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status);
-}
-
-static void sub_0805329C(void) {
- if (sub_08053144()) {
- switch (gRoomControls.area) {
- case AREA_DEEPWOOD_SHRINE:
- gSave.unk7 = 0;
- break;
- case AREA_CAVE_OF_FLAMES:
- sub_080530B0();
- break;
- case AREA_OUTER_FORTRESS_OF_WINDS:
- sub_080532E4();
- break;
- default:
- ResetTimerFlags();
- break;
- }
- }
-}
-
-static void sub_080532E4(void) {
- s32 x, y;
-
- RoomHeader* r_hdr = gAreaRoomHeaders[AREA_FORTRESS_OF_WINDS] + 33;
-
- gRoomTransition.player_status.dungeon_area = AREA_FORTRESS_OF_WINDS;
- gRoomTransition.player_status.dungeon_room = 33;
-
- gRoomTransition.player_status.dungeon_x = r_hdr->map_x + r_hdr->pixel_width / 2;
- gRoomTransition.player_status.dungeon_map_x = gRoomTransition.player_status.dungeon_x;
- gRoomTransition.player_status.dungeon_y = r_hdr->map_y + r_hdr->pixel_height + 0xa0;
- gRoomTransition.player_status.dungeon_map_y = gRoomTransition.player_status.dungeon_y;
-}
-
-void LoadGfxGroups(void) {
- MemClear(&gBG0Buffer, sizeof gBG0Buffer);
- MemClear(&gBG1Buffer, sizeof gBG1Buffer);
- MemClear(&gBG2Buffer, sizeof gBG2Buffer);
- MemClear(&gBG3Buffer, sizeof gBG3Buffer);
- LoadGfxGroup(16);
- LoadGfxGroup(23);
- if (gRoomControls.area == AREA_CASTOR_WILDS)
- LoadGfxGroup(26);
- LoadItemGfx();
- LoadPaletteGroup(11);
- LoadPaletteGroup(12);
- SetColor(0, 0);
-}
-
-void LoadItemGfx(void) {
- LoadGfxGroup(GetInventoryValue(ITEM_REMOTE_BOMBS) ? 24 : 25);
- if (GetInventoryValue(ITEM_LIGHT_ARROW))
- LoadGfxGroup(29);
- LoadGfxGroup(GetInventoryValue(ITEM_MAGIC_BOOMERANG) ? 28 : 27);
-}
-
-void sub_080533CC(void) {
- u16* p1 = gUnk_020178E0;
- u16* p2 = gUnk_020178E0 - 0x100;
- *p2++ = *p1++;
- *p2++ = *p1++;
- *p2++ = *p1++;
- *p2++ = *p1++;
- *p2++ = *p1++;
- gUsedPalettes |= 8;
-}
-
-static void UpdateTimerCallbacks(void) {
- static void (*const sHandlers[])(u32*) = {
- sub_08053434, DummyHandler, sub_080534E4, DummyHandler, DummyHandler, DummyHandler, DummyHandler, DummyHandler,
- };
-
- u32* p;
- u32 i;
-
- p = gSave.timers;
- for (i = 0; i < 8; i++, p++) {
- (sHandlers[i])(p);
- }
-}
-
-static void DummyHandler(u32* a1) {
-}
-
-static void sub_08053434(u32* a1) {
- if (gArea.locationIndex == 29 && *a1) {
- if (!--*a1) {
- ResetTimerFlags();
- MenuFadeIn(5, 6);
- }
- }
-}
-
-static void ResetTimerFlags(void) {
- static const u16 sClearFlags[] = { FLAG_BANK_10, LV6_GUFUU1_GISHIKI, FLAG_BANK_10, LV6_GUFUU1_DEMO,
- FLAG_BANK_10, LV6_ZELDA_DISCURSE, FLAG_BANK_10, LV6_00_ESCAPE,
- FLAG_BANK_10, LV6_GUFUU2_DEAD, FLAG_BANK_G, ENDING,
- FLAG_BANK_10, LV6_KANE_START, FLAG_BANK_10, LV6_KANE_1ST,
- FLAG_BANK_10, LV6_KANE_2ND, FLAG_BANK_10, LV6_SOTO_ENDING,
- 0xFFFF };
-
- gSave.timers[0] = 0;
- if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_ZELDA_DISCURSE))
- ClearGlobalFlag(ZELDA_CHASE);
- ClearFlagArray(sClearFlags);
-}
-
-void StartDarkNutTimer(void) {
- gSave.timers[0] = 10800;
-}
-
-void sub_080534AC(void) {
- if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) {
- ClearLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START);
- gSave.timers[0] = 0;
- SoundReq(SONG_STOP_BGM);
- }
-}
-
-static void sub_080534E4(u32* a1) {
- if (gRoomControls.area != AREA_VEIL_FALLS_TOP) {
- if (*a1)
- --*a1;
- }
-}
-
-void InitBiggoronTimer(void) {
- gSave.timers[2] = 36000;
-}
-
-static void ResetTmpFlags(void) {
- static const u16 sClearFlags[] = { FLAG_BANK_2, BILL00_SHICHOU_00, FLAG_BANK_2, BILL0A_YADO_TAKARA_00,
- FLAG_BANK_2, BILL0C_SCHOOLR_00, FLAG_BANK_1, MACHI00_00,
- FLAG_BANK_1, MACHI00_02, FLAG_BANK_2, MHOUSE06_00,
- FLAG_BANK_2, MHOUSE14_00, FLAG_BANK_2, MHOUSE2_00_02,
- FLAG_BANK_2, MHOUSE2_01_T0, FLAG_BANK_2, MHOUSE2_02_KAME,
- FLAG_BANK_2, SHOP00_ITEM_01, FLAG_BANK_2, SHOP01_CAFE_01,
- 0xFFFF };
-
- ResetTimerFlags();
- ClearFlagArray(sClearFlags);
-
- if (!CheckGlobalFlag(WATERBEAN_PUT))
- ClearGlobalFlag(WATERBEAN_OUT);
- if (!GetInventoryValue(ITEM_EARTH_ELEMENT))
- ClearGlobalFlag(LV1_CLEAR);
- if (!GetInventoryValue(ITEM_FIRE_ELEMENT))
- ClearGlobalFlag(LV2_CLEAR);
- if (!GetInventoryValue(ITEM_WATER_ELEMENT))
- ClearGlobalFlag(LV4_CLEAR);
-}
-
-static void ClearFlagArray(const u16* p) {
- const u16* i;
-
- for (i = p; i[0] != 0xFFFF; i += 2)
- ClearLocalFlagByBank(i[0], i[1]);
-}
-
-void CutsceneMain_Init(void) {
- gUnk_080FCBB4[gMenu.overlayType]();
-}
-
-void sub_080535AC(void) {
- gMenu.overlayType = 1;
- gMenu.transitionTimer = 120;
- gUI.field_0x6 = 1;
- gUpdateVisibleTiles = 1;
- gScreen.lcd.displayControl &= 0xfeff;
- LoadRoomEntityList((EntityData*)gUnk_080FCB94);
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8);
-}
-
-void sub_080535F4(void) {
- if (gFadeControl.active == 0) {
- ResetSystemPriority();
- gMenu.overlayType = 2;
- }
-}
-
-void nullsub_481(void) {
-}
-
-void sub_08053618(void) {
- gMenu.transitionTimer--;
- if (gMenu.transitionTimer == 0) {
- sub_08052004();
- }
-}
-
-void sub_08053634(void) {
- gUI.nextToLoad = 3;
- MessageInitialize();
-}
-
-void sub_08053648(void) {
- Entity* obj = CreateObject(SMOKE, 0, 0);
- if (obj != NULL) {
- obj->x.HALF.HI = gRoomControls.origin_x + 0x2d0;
- obj->y.HALF.HI = gRoomControls.origin_y + 0x148;
- }
-}
-
-void sub_0805367C(void) {
- gMenu.overlayType++;
-}
-
-void sub_0805368C(void) {
- Entity* entity = FindEntityByID(OBJECT, HOUSE_DOOR_INT, 6);
- if (entity != NULL) {
- DeleteEntity(entity);
- SoundReq(SFX_F0);
- }
-}
-
-void sub_080536A8(void) {
- sub_080A71C4(5, 5, FADE_INSTANT, 0x10);
-}
-
-void sub_080536B8(void) {
- sub_080A71C4(5, 3, FADE_INSTANT, 4);
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
-}
-
-void sub_080536D4(void) {
- gUnk_080FCCFC[gMenu.overlayType]();
-}
-
-void sub_080536F0(void) {
- gUnk_080FCD38[gMenu.overlayType]();
-}
-
-void sub_0805370C(void) {
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- sub_08051FF0();
- LoadRoomEntityList((EntityData*)gUnk_080FCC54);
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_0805373C(void) {
- gUnk_080FCD40[gMenu.overlayType]();
-}
-
-void sub_08053758(void) {
- gMenu.overlayType = 1;
- gMenu.transitionTimer = 120;
- gMenu.field_0xa = 0x1e;
- *((u8*)&gMenu + 0x10) = 0; // TODO
- gUI.field_0x6 = 1;
- gMapBottom.bgSettings = NULL;
- gMapTop.bgSettings = NULL;
- gRoomControls.camera_target = NULL;
- gRoomControls.scroll_y = 0;
- gRoomControls.scroll_x = 0;
- ClearBgAnimations();
- DispReset(0);
- gScreen.lcd.displayControl = 0x2640;
- gScreen.controls.layerFXControl = 0x2244;
- gScreen.controls.alphaBlend = 0x1000;
- gScreen.controls.windowInsideControl = 0x1f;
- gScreen.controls.windowOutsideControl = 0x3f;
- gScreen.controls.window0HorizontalDimensions = 0xf0;
- gScreen.controls.window0VerticalDimensions = 0x60;
- gScreen.bg1.control = 0x1c4e;
- gScreen.bg2.control = 0x1dc1;
- SoundReq(BGM_STORY);
- ResetSystemPriority();
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
-}
-
-void sub_08053800(void) {
- u32 index;
- struct_080FCCB4* ptr;
- if (gFadeControl.active == 0) {
- index = gGenericMenu.unk10.a[0];
- ptr = &gUnk_080FCCB4[index];
- gGenericMenu.base.transitionTimer = ptr->transitionTimer;
- gGenericMenu.base.field_0xa = 0x1e;
- gGenericMenu.unk10.a[0]++;
- gGenericMenu.base.overlayType++;
- gGenericMenu.base.storyPanelIndex = 0;
- LoadPaletteGroup(index + 0x8a);
- LoadGfxGroup(index + 0x3a);
- MemClear(&gBG1Buffer, 0x800);
- sub_0805F46C(index + 0xf01, ptr->font);
- gScreen.bg1.updated = 1;
- gScreen.controls.alphaBlend = 0x10;
- gScreen.controls.window0HorizontalDimensions = ptr->width;
- gScreen.controls.window0VerticalDimensions = ptr->height;
- SetFade(FADE_INSTANT, ptr->fadeSpeed);
- }
-}
-
-void sub_08053894(void) {
- u32 tmp;
- if (gFadeControl.active == 0) {
- gMenu.transitionTimer--;
- if (gMenu.field_0xa != 0) {
- gMenu.field_0xa--;
- } else {
- if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) {
- tmp = ++gMenu.storyPanelIndex << 0x18;
- gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - ((tmp) >> 0x19));
- }
- }
- if (gMenu.transitionTimer == 0) {
- gMenu.overlayType++;
- SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
- }
- }
-}
-
-void sub_08053904(void) {
- u32 tmp;
- if (gFadeControl.active == 0) {
- gMenu.transitionTimer--;
- if (gMenu.field_0xa != 0) {
- gMenu.field_0xa--;
- } else {
- if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) {
- tmp = ++gMenu.storyPanelIndex << 0x18;
- gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - (tmp >> 0x19));
- }
- }
- if (gMenu.transitionTimer == 0) {
- gMenu.overlayType++;
- SetFade(FADE_IN_OUT | FADE_INSTANT, 1);
- }
- }
-}
-
-void sub_08053974(void) {
- if (gFadeControl.active == 0) {
- InitFade();
- DispReset(1);
- SetBGDefaults();
- sub_08051F78();
- LoadRoomEntityList((EntityData*)&gUnk_080FCBC4);
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
- gMenu.overlayType++;
- }
-}
-
-void nullsub_482(void) {
-}
-
-void sub_080539BC(void) {
- SetBGDefaults();
- DeleteAllEntities();
- sub_08051F9C(0x22, 0x11, 0, 0);
- sub_0804B0B0(0x22, 0x11);
- LoadRoomEntityList((EntityData*)&gUnk_080FCC14);
- gMenu.overlayType++;
-}
-
-void sub_080539F4(void) {
- if (gFadeControl.active == 0) {
- DispReset(1);
- gMenu.overlayType++;
- gMenu.transitionTimer = 60;
- }
-}
-
-void sub_08053A1C(void) {
- gMenu.transitionTimer--;
- if (gMenu.transitionTimer == 0) {
- gMenu.overlayType++;
- gMenu.transitionTimer = 8;
- MessageFromTarget(TEXT_INDEX(TEXT_PICORI, 0x07));
- gMessage.textWindowPosX = 1;
- gMessage.textWindowPosY = 8;
- SetFade(FADE_INSTANT, 8);
- }
-}
-
-void sub_08053A5C(void) {
- if (((gMessage.doTextBox & 0x7f) == 0) && --gMenu.transitionTimer == 0) {
- gMenu.overlayType++;
- SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
- }
-}
-
-void sub_08053A90(void) {
- if (gFadeControl.active == 0) {
- gUI.nextToLoad = 3;
- SetBGDefaults();
- }
-}
-
-void sub_08053AB0(void) {
- gUnk_080FCDD4[gMenu.overlayType]();
-}
-
-void sub_08053ACC(void) {
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- sub_08051FF0();
- LoadRoomEntityList((EntityData*)&gUnk_080FCD84);
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
-}
-
-void sub_08053B00(void) {
- gMenu.overlayType++;
-}
-
-void sub_08053B10(void) {
- if (CheckRoomFlag(1)) {
- gMenu.menuType++;
- DispReset(1);
- SetFade(FADE_INSTANT, 0x100);
- }
-}
-
-void sub_08053B3C(void) {
- sub_080A71C4(5, 4, FADE_IN_OUT | FADE_INSTANT, 0x100);
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
-}
-
-void sub_08053B58(void) {
- gUnk_080FCEB0[gMenu.overlayType]();
-}
-
-void sub_08053B74(void) {
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- LoadRoomEntityList((EntityData*)&gUnk_080FCDE0);
- ResetSystemPriority();
- ResetEntityPriority();
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
-}
-
-void sub_08053BAC(void) {
- gMenu.overlayType++;
-}
-
-void sub_08053BBC(void) {
- if (CheckRoomFlag(0)) {
- gMenu.menuType++;
- DispReset(1);
- SetFade(FADE_INSTANT, 0x100);
- }
-}
-
-void sub_08053BE8(void) {
- sub_080A71C4(5, 2, FADE_IN_OUT | FADE_INSTANT, 0x100);
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
-}
-
-void sub_08053C04(void) {
- gUnk_080FCEEC[gMenu.overlayType]();
-}
-
-void sub_08053C20(void) {
- gMenu.overlayType = 1;
- gMenu.transitionTimer = 120;
- gUpdateVisibleTiles = 1;
- sub_08051FF0();
- sub_0805B4D0(4);
- LoadRoomEntityList((EntityData*)&gUnk_080FCEBC);
- SetFade(FADE_INSTANT, 0x10);
- SoundReq(BGM_FIGHT_THEME2);
-}
-
-void nullsub_483(void) {
-}
-
-void sub_08053C60(void) {
- SetFade(FADE_IN_OUT | FADE_INSTANT, 2);
- SoundReq(SFX_SUMMON);
- SoundReq(SONG_STOP_BGM);
- SetTask(3);
-}
-
-void sub_08053C84(void) {
- gMenu.overlayType = 2;
-}
-
-void CutsceneMain_Exit(void) {
- gUnk_080FCEF8[gMenu.field_0x3]();
-}
-
-void sub_08053CAC(void) {
- gUnk_080FCFA4[gMenu.overlayType]();
-}
-
-void sub_08053CC8(void) {
- const u8* ptr;
- ptr = gUnk_080FCF04 + gMenu.field_0x3 * 0x10;
- gMenu.field_0xc = (void*)&ptr[8];
- LoadRoomEntityList(*(EntityData**)(&ptr[0]));
- LoadRoomEntityList(GetRoomProperty(ptr[4], ptr[5], 1));
- LoadRoomEntityList(GetRoomProperty(ptr[4], ptr[5], 2));
- gMenu.overlayType = 1;
- gScreen.lcd.displayControl &= 0xfeff;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
- if (ptr[5] == 0x1d) {
- gMenu.field_0xa = 1;
- }
-}
-
-void sub_08053D34(void) {
- if (gMenu.field_0xa != 0) {
- gMenu.field_0xa = 0;
- if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3d)) {
- SetTileType(0x74, 0xc4, 1);
- }
- if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3e)) {
- SetTileType(0x74, 0xcc, 1);
- }
- }
- if (gFadeControl.active == 0) {
- gMenu.transitionTimer = 120;
- gMenu.overlayType++;
- }
-}
-
-void sub_08053D90(void) {
- gMenu.transitionTimer--;
- if (gMenu.transitionTimer == 0) {
- gMenu.overlayType++;
- SetFadeInverted(0x10);
- }
-}
-
-void sub_08053DB4(void) {
- if (gFadeControl.active == 0) {
- u8* ptr = gMenu.field_0xc;
- sub_08052FF4(gMenu.field_0xc[4], gMenu.field_0xc[5]);
- InitializeCamera();
- gUpdateVisibleTiles = 1;
- gRoomControls.scroll_x = (s8)ptr[6] + gRoomControls.scroll_x;
- gRoomControls.scroll_y = (s8)ptr[7] + gRoomControls.scroll_y;
- LoadRoomEntityList(*(EntityData**)ptr);
- LoadRoomEntityList((EntityData*)GetRoomProperty(ptr[4], ptr[5], 1));
- LoadRoomEntityList((EntityData*)GetRoomProperty(ptr[4], ptr[5], 2));
- gMenu.transitionTimer = 120;
- gMenu.overlayType++;
- SetFadeInverted(0x10);
- }
-}
-
-void sub_08053E30(void) {
- if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_08053E58(void) {
- gUnk_080FD108[gMenu.overlayType]();
-}
-
-void sub_08053E74(void) {
- const EntityData** ptr = gUnk_080FCFB8;
- gMenu.field_0xc = (u8*)ptr;
- LoadRoomEntityList((EntityData*)ptr[0]);
- gMenu.transitionTimer = 120;
- gMenu.field_0xa = 0x3c;
- gMenu.overlayType++;
- gScreen.lcd.displayControl &= 0xfeff;
- gUpdateVisibleTiles = 1;
- SetMinPriority(1);
- SetFade(FADE_INSTANT, 8);
-}
-
-void sub_08053EC4(void) {
- EntityData** data;
- if ((gFadeControl.active == 0) && (--gMenu.field_0xa == 0)) {
- data = (EntityData**)(gMenu.field_0xc + 4);
- gMenu.field_0xc += 0xc;
- LoadRoomEntityList(*data);
- gMenu.overlayType++;
- }
-}
-
-void sub_08053EFC(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.overlayType++;
- SetFadeInverted(8);
- }
-}
-
-void sub_08053F20(void) {
- u8* ptr;
- if (gFadeControl.active == 0) {
- DeleteAllEntities();
- ptr = gMenu.field_0xc;
- sub_08052FF4(gMenu.field_0xc[8], gMenu.field_0xc[9]);
- InitializeCamera();
- gUpdateVisibleTiles = 1;
- gRoomControls.scroll_x = (s8)ptr[10] + gRoomControls.scroll_x;
- gRoomControls.scroll_y = (s8)ptr[0xb] + gRoomControls.scroll_y;
- LoadRoomEntityList(*(EntityData**)ptr);
- gMenu.transitionTimer = 120;
- gMenu.field_0xa = 0x3c;
- gMenu.overlayType++;
- SetFadeInverted(8);
- }
-}
-
-void sub_08053F88(void) {
- if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- ResetEntityPriority();
- }
-}
-
-void CutsceneMain_Update(void) {
- gUnk_080FD138[gMenu.field_0x3]();
-}
-
-u32 GetSaleItemConfirmMessageID(u32 item) {
- const u16* ptr = &gUnk_080FD964[item * 4];
- return ptr[2];
-}
-
-s32 GetItemPrice(u32 item) {
- const u16* ptr = &gUnk_080FD964[item * 4];
- return ptr[0];
-}
-
-u32 GiveItem(Item item, u32 param_2) {
- u32 uVar4;
- u32 result;
- u32 uVar9;
- const ItemMetaData* metaData;
-
- uVar4 = GetInventoryValue(item);
- metaData = &gItemMetaData[item];
-
- if (uVar4 == 0) {
- result = *(u16*)&metaData->textId;
- } else {
- result = *(u16*)&metaData->unk6;
- }
- if (!ItemIsBottle(item)) {
- PutItemOnSlot(item);
- if (uVar4 == 0) {
- SetInventoryValue(item, 1);
- }
- }
- switch (metaData->unk1) {
- case 0:
- default:
- break;
- case 1:
- ModHealth(metaData->unk2);
- SoundReq(SFX_HEART_GET);
- break;
- case 2:
- ModRupees((u32)gUnk_080FD5A8[metaData->unk2]);
- SoundReq(SFX_RUPEE_GET);
- break;
- case 3:
- uVar9 = 0;
- while (TRUE) {
- if (3 < uVar9) {
- return result;
- }
- if (GetInventoryValue(ITEM_BOTTLE1 + uVar9) == 0)
- break;
- uVar9++;
- }
- item = ITEM_BOTTLE1 + uVar9;
- if (gSave.stats.bottles[uVar9] == 0) {
- gSave.stats.bottles[uVar9] = 0x20;
- }
- SetInventoryValue(item, 1);
- PutItemOnSlot(item);
- break;
- case 4:
- uVar9 = 0;
- while (gSave.stats.bottles[uVar9] != 0x20) {
- uVar9++;
- if (3 < uVar9) {
- return result;
- }
- }
- if (3 < uVar9) {
- break;
- }
- gSave.stats.bottles[uVar9] = (u8)item;
- SetInventoryValue(item, 1);
- SoundReq(SFX_ITEM_GET);
- break;
- case 5:
- sub_080526F8(1);
- SoundReq(SFX_103);
- break;
- case 6:
- gSave.unk46C[gArea.dungeon_idx] |= metaData->unk2;
- break;
- case 0xd:
- sub_0801E738(0x72);
- break;
- case 0x12:
- if (item == ITEM_BOOMERANG) {
- SetInventoryValue(ITEM_MAGIC_BOOMERANG, 0);
- } else {
- SetInventoryValue(ITEM_BOOMERANG, 0);
- }
- case 0x11:
- LoadItemGfx();
- break;
- case 7:
- if (item == ITEM_BOMBS) {
- SetInventoryValue(ITEM_REMOTE_BOMBS, 0);
- } else {
- SetInventoryValue(ITEM_BOMBS, 0);
- }
- ModBombs(99);
- LoadItemGfx();
- break;
- case 8:
- if (uVar4 == 0) {
- SetInventoryValue(ITEM_BOMBS, 1);
- PutItemOnSlot(7);
- } else {
- gSave.stats.bombBagType++;
- if (3 < gSave.stats.bombBagType) {
- gSave.stats.bombBagType = 3;
- }
- }
- ModBombs(99);
- break;
- case 9:
- ModBombs(metaData->unk2);
- SoundReq(SFX_103);
- break;
- case 0xb:
- if (GetInventoryValue(ITEM_LARGE_QUIVER) == 0) {
- SetInventoryValue(ITEM_LARGE_QUIVER, 1);
- }
- ModArrows(99);
- LoadItemGfx();
- break;
- case 0xa:
- gSave.stats.quiverType++;
- if (3 < gSave.stats.quiverType) {
- gSave.stats.quiverType = 3;
- }
- ModArrows(99);
- break;
- case 0xc:
- ModArrows(metaData->unk2);
- SoundReq(SFX_103);
- break;
- case 0x0e:
- SetInventoryValue(ITEM_SHELLS, 1);
- ModShells(param_2);
- SoundReq(SFX_103);
- break;
- case 0x0f:
- sub_0801E738(param_2);
- break;
- case 0x10:
- gSave.stats.walletType++;
- if (gSave.stats.walletType < 4) {
- break;
- }
- gSave.stats.walletType = 3;
- break;
- }
- return result;
-}
-
-// TODO Adapt ItemMetaData struct
-void sub_08054288(s32 param_1) {
- const ItemMetaData* ptr1 = gItemMetaData;
- u16* ptr = (u16*)&((ptr1)[param_1]);
- MessageFromTarget(ptr[3]);
-}
-
-u32 getItemMetaDataGetTextIndex(s32 itemIndex) {
- const ItemMetaData* ptr1 = gItemMetaData;
- u16* ptr = (u16*)&((ptr1)[itemIndex]);
- return ptr[2];
-}
-
-u32 sub_080542AC(u32 param_1) {
- const ItemMetaData* ptr1 = gItemMetaData;
- u8* ptr = (u8*)&((ptr1)[param_1]);
- return ptr[3] & 1;
-}
-
-void ModShells(s32 shells) {
- if (shells == 0) {
- shells = 1;
- }
- shells += gSave.stats.shells;
- if (shells < 0) {
- shells = 0;
- } else if (999 < shells) {
- shells = 999;
- }
- gSave.stats.shells = shells;
-}
-
-void ModBombs(s32 bombs) {
- s32 bombCount = bombs;
- s32 bagSize;
- bombCount += gSave.stats.bombCount;
- bagSize = gBombBagSizes[gSave.stats.bombBagType];
- if (bombCount < 0) {
- bombCount = 0;
- } else if (bagSize < bombCount) {
- bombCount = bagSize;
- }
- gSave.stats.bombCount = bombCount;
-}
-
-void ModArrows(s32 arrows) {
- s32 quiverSize;
- s32 arrowCount = arrows;
- arrowCount += gSave.stats.arrowCount;
- quiverSize = gQuiverSizes[gSave.stats.quiverType];
- if (arrowCount < 0) {
- arrowCount = 0;
- } else if (quiverSize < arrowCount) {
- arrowCount = quiverSize;
- }
- gSave.stats.arrowCount = arrowCount;
-}
-
-/**
- * @brief Returns the slot the item is equipped in.
- *
- * 0: A
- * 1: B
- * 2: Not equipped
- */
-EquipSlot IsItemEquipped(u32 itemId) {
- EquipSlot equipSlot;
-
- if (itemId == gSave.stats.itemButtons[SLOT_A]) {
- equipSlot = EQUIP_SLOT_A;
- } else if (itemId == gSave.stats.itemButtons[SLOT_B]) {
- equipSlot = EQUIP_SLOT_B;
- } else {
- equipSlot = EQUIP_SLOT_NONE;
- }
- return equipSlot;
-}
-
-void PutItemOnSlot(u32 itemId) {
- EquipSlot equipSlot;
- u32 itemId2 = itemId;
- if (itemId2 < 0x47) {
- SetInventoryValue(0, 1);
- }
- if (itemId2 - 1 < 0x1f) {
- equipSlot = EQUIP_SLOT_NONE;
- if (gSave.stats.itemButtons[SLOT_A] == ITEM_NONE) {
- equipSlot = EQUIP_SLOT_A;
- } else if (gSave.stats.itemButtons[SLOT_B] == ITEM_NONE) {
- equipSlot = EQUIP_SLOT_B;
- }
- if (equipSlot == EQUIP_SLOT_NONE) {
- u32 temp = gItemMetaData[itemId2].menuSlot;
- if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_A]].menuSlot) {
- equipSlot = EQUIP_SLOT_A;
- } else {
- if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_B]].menuSlot) {
- equipSlot = EQUIP_SLOT_B;
- }
- }
- if (equipSlot == EQUIP_SLOT_NONE) {
- return;
- }
- }
- ForceEquipItem(itemId2, equipSlot);
- }
-}
-
-void ForceEquipItem(u32 itemId, u32 equipSlot) {
- u32 otherItem;
- u32 otherItemSlot;
- u32 replacedItem;
-
- if ((itemId - 1 < 0x1f) && (equipSlot < EQUIP_SLOT_NONE)) {
- otherItemSlot = equipSlot == EQUIP_SLOT_A;
- replacedItem = gSave.stats.itemButtons[equipSlot];
- otherItem = gSave.stats.itemButtons[otherItemSlot];
- if (gItemMetaData[otherItem].menuSlot == gItemMetaData[itemId].menuSlot) {
- otherItem = replacedItem;
- }
- gSave.stats.itemButtons[equipSlot] = itemId;
- gSave.stats.itemButtons[otherItemSlot] = otherItem;
- gUnk_0200AF00.unk_13 = 0x7f;
- gUnk_0200AF00.unk_14 = 0x7f;
- }
-}
-
-u32 SetBottleContents(u32 itemId, u32 bottleIndex) {
- if (bottleIndex > 3) {
- bottleIndex = 0;
- for (bottleIndex = 0; gSave.stats.bottles[bottleIndex] != ITEM_BOTTLE_EMPTY;) {
- if (++bottleIndex > 3) {
- return bottleIndex;
- }
- }
- if (bottleIndex > 3) {
- return bottleIndex;
- }
- }
- gSave.stats.bottles[bottleIndex] = itemId;
- return bottleIndex;
-}
-
-bool32 ItemIsSword(u32 item) {
- switch (item) {
- case ITEM_SMITH_SWORD:
- case ITEM_GREEN_SWORD:
- case ITEM_RED_SWORD:
- case ITEM_BLUE_SWORD:
- case ITEM_FOURSWORD:
- return TRUE;
- default:
- return FALSE;
- }
-}
-
-bool32 ItemIsShield(u32 id) {
- switch (id) {
- case ITEM_SHIELD:
- case ITEM_MIRROR_SHIELD:
- return TRUE;
- default:
- return FALSE;
- }
-}
-
-bool32 ItemIsBottle(u32 id) {
- switch (id) {
- case ITEM_BOTTLE1:
- case ITEM_BOTTLE2:
- case ITEM_BOTTLE3:
- case ITEM_BOTTLE4:
- return TRUE;
- default:
- return FALSE;
- }
-}
-
-u32 GetBottleContaining(u32 id) {
- if (id == gSave.stats.bottles[0]) {
- return 1;
- } else if (id == gSave.stats.bottles[1]) {
- return 2;
- } else if (id == gSave.stats.bottles[2]) {
- return 3;
- } else if (id == gSave.stats.bottles[3]) {
- return 4;
- } else {
- return 0;
- }
-}
-
-void sub_08054524(void) {
- u32 bVar1;
-
- bVar1 = gArea.locationIndex;
- if (gArea.locationIndex == 0) {
- bVar1 = gRoomTransition.player_status.field_0x24[0xa];
- }
- if (bVar1 > 0x16) {
- bVar1 = 0;
- }
-
- bVar1 = gUnk_080FE1C6[bVar1];
- MemCopy(&gAreaDroptables[bVar1], &gRoomVars.currentAreaDroptable, sizeof(Droptable));
-}
-
-void DisableRandomDrops(void) {
- gRoomVars.randomDropsDisabled = TRUE;
-}
-
-void EnableRandomDrops(void) {
- gRoomVars.randomDropsDisabled = FALSE;
-}
-
-extern void sub_08000F14(s16*, const s16*, const s16*, const s16*);
-extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*);
-u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter);
-u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) {
- extern const u8 gUnk_080FE1B4[] /* = {
- ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY,
- ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED,
- ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
- }*/;
-
- int r0, r1, rand, summOdds, item;
- u32 r3;
- const Droptable *ptr2, *ptr3, *ptr4;
- Droptable droptable;
- r3 = arg1;
- if (gRoomVars.randomDropsDisabled != TRUE) {
- ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
- ptr4 = NULL;
- switch (r3) {
- case 1 ... 12:
- ptr4 = &gEnemyDroptables[r3];
- break;
-#ifndef EU
- case 24:
- case 25:
- r0 = gRoomVars.unk2;
- ptr4 = &gUnk_0800191C[0];
- if (r0) {
- ptr4++;
- }
- break;
-#endif
- case 16 ... 23:
-#ifdef EU
- case 24:
-#endif
- ptr2 = &gObjectDroptables[r3 - 16];
- case 15:
- ptr4 = &gRoomVars.currentAreaDroptable;
- break;
- case 0:
- default:
- break;
- }
- if (ptr4 != 0) {
- if ((r1 = gSave.stats.picolyteType) == 0) {
- // nop
- ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
- } else {
-#ifdef EU
- ptr3 = &gEnemyDroptables[r1 + 9];
-#else
- ptr3 = &gEnemyDroptables[r1 + 6];
-#endif
- }
- // vector addition, s0 = ptr4 + ptr2 + ptr3
- sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a);
- if (gSave.stats.health <= 8) {
- droptable.s.hearts += 5;
- }
- if (gSave.stats.bombCount == 0) {
- droptable.s.bombs += 3;
- }
- if (gSave.stats.arrowCount == 0) {
- droptable.s.arrows += 3;
- }
- if (gSave.stats.rupees <= 10) {
- droptable.s.rupee5++;
- }
- ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
- r0 = gSave.stats.hasAllFigurines;
- ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
- // don't drop shells anymore
- if (r0 != 0) {
- ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS];
- }
- // don't drop kinstones anymore
- if (gSave.didAllFusions != 0) {
- ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES];
- }
- // vector addition, s0 = s0 + ptr2 + ptr3
- // resulting values are clamped to be >= 0
- // returns sum over s0
- summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a);
- rand = Random();
- item = (rand >> 0x18);
- item &= 0xF;
- rand = rand % summOdds;
- {
- u32 r3;
- for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) {
- if ((r1 += droptable.a[item]) > rand) {
- break;
- }
- }
- }
- r1 = gUnk_080FE1B4[item];
- if (r1 != ITEM_NONE) {
- return CreateItemDrop(arg0, r1, 0);
- }
- }
- }
- return ITEM_NONE;
-}
-
-u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter) {
- u32 adjustedParam = itemParameter;
- Entity* itemEntity;
-
- switch (itemId) {
- case ITEM_ENEMY_BEETLE:
- if (!GetInventoryValue(ITEM_SMITH_SWORD)) {
- return ITEM_NONE;
- }
- break;
- case ITEM_BOMBS5:
- if (!GetInventoryValue(ITEM_BOMBBAG)) {
- return ITEM_NONE;
- }
- break;
- case ITEM_ARROWS5:
- if (!GetInventoryValue(ITEM_BOW)) {
- return ITEM_NONE;
- }
- break;
- case ITEM_SHELLS: {
- if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) {
- return ITEM_NONE;
- }
- if (itemParameter == 0) {
- adjustedParam = 1;
- }
- break;
- }
- case ITEM_KINSTONE:
- case ITEM_KINSTONE_GREEN ... ITEM_KINSTONE_RED: {
- u32 rand;
-
- if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) {
- return ITEM_NONE;
- }
- if (3 < gRoomVars.filler1[0]) {
- return ITEM_NONE;
- }
-
- if (itemId != ITEM_KINSTONE) {
- adjustedParam = itemId - ITEM_KINSTONE_GREEN;
- rand = (Random() & 0x3f);
- adjustedParam = gUnk_080FE1DD[(rand + adjustedParam * 0x40)];
- if (adjustedParam == 0) {
- itemId = ITEM_NONE;
- } else {
- itemId = ITEM_KINSTONE;
- }
- }
- break;
- }
- }
- if (itemId != ITEM_NONE) {
- if (itemId != ITEM_ENEMY_BEETLE) {
- itemEntity = CreateObject(GROUND_ITEM, itemId, adjustedParam);
- if (itemEntity != NULL) {
- if (arg0 == &gPlayerEntity) {
- itemEntity->timer = 1;
- } else {
- itemEntity->timer = 0;
- }
- if (arg0->kind == OBJECT) {
- if (arg0->id == 99) {
- arg0->child = itemEntity;
- } else if (arg0->id == 0x1e) {
- itemEntity->direction = arg0->animationState << 3 | 0x80;
- itemEntity->speed = 0xc0;
- itemEntity->zVelocity = Q_16_16(1.5);
- }
- }
- CopyPosition(arg0, itemEntity);
- }
- } else {
- itemEntity = CreateEnemy(BEETLE, 0);
- if (itemEntity != NULL) {
- itemEntity->x.HALF.HI = arg0->x.HALF.HI;
- itemEntity->y.HALF.HI = arg0->y.HALF.HI;
- itemEntity->collisionLayer = arg0->collisionLayer;
- UpdateSpriteForCollisionLayer(itemEntity);
- }
- }
- }
- return itemId;
-}
-
-void Subtask_WorldEvent(void) {
-#if !(defined(DEMO_USA) || defined(DEMO_JP))
- gUnk_080FE2A0[gMenu.menuType]();
-#endif
-}
-
-void sub_0805488C(void) {
- const struct_080FE320* ptr = &gUnk_080FE320[gUI.field_0x3];
- gMenu.field_0x0 = ptr->evt_type;
- gMenu.field_0x3 = ptr->entity_idx;
- gMenu.field_0x4 = gUI.field_0x3;
- gMenu.field_0xc = (u8*)ptr;
- gMenu.menuType++;
- gMenu.overlayType = 0;
- gMenu.transitionTimer = 300;
- DispReset(0);
- sub_08054974(gUI.field_0x3, 1);
- sub_0806F364();
- ClearRoomFlag(0xff);
- sub_080548E8();
-}
-
-void sub_080548E8(void) {
- gUnk_080FE2AC[gMenu.field_0x0]();
- FlushSprites();
- UpdateEntities();
- DrawEntities();
- CopyOAM();
- UpdateScroll();
- UpdateBgAnimations();
- UpdateScrollVram();
-}
-
-void sub_08054920(void) {
- MessageInitialize();
- sub_0806F38C();
- if (gUnk_080C9CBC[gFuseInfo._3].unk7 != 0) {
- MenuFadeIn(10, gUI.field_0x3);
- } else {
- gUI.nextToLoad = 3;
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- }
-}
-
-void sub_08054968(void) {
- gMenu.menuType = 2;
-}
-
-void sub_08054974(s32 param_1, s32 param_2) {
- struct_080FE320* ptr = &gUnk_080FE320[param_1];
- SetCurrentRoomPropertyList(ptr->area, ptr->room);
- gRoomControls.area = ptr->area;
- gRoomControls.room = ptr->room;
- LoadGfxGroups();
- gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
- if (param_2 != 0) {
- LoadAuxiliaryRoom(ptr->area, ptr->room);
- } else {
- sub_08052FF4(ptr->area, ptr->room);
- InitializeCamera();
- gUpdateVisibleTiles = 1;
- }
- gScreen.lcd.displayControl &= 0x1fff;
- gRoomControls.scroll_x = gRoomControls.origin_x + ptr->_4;
- gRoomControls.scroll_y = gRoomControls.origin_y + ptr->_6;
- if (ptr->area == AREA_HYRULE_TOWN) {
- TryLoadPrologueHyruleTown();
- }
- sub_08018710(gUI.field_0x3);
-}
-
-void sub_08054A14(s32 param_1) {
- struct_080FE320* ptr = &gUnk_080FE320[param_1];
- if (ptr->_11 < 0xe) {
- SetLocalFlagByBank(gLocalFlagBanks[ptr->_11], ptr->flag);
- }
-}
diff --git a/src/gameData.c b/src/gameData.c
new file mode 100644
index 00000000..26462587
--- /dev/null
+++ b/src/gameData.c
@@ -0,0 +1,503 @@
+// TODO belongs to game.c, but spriteAnimations332.s is before.
+// maybe also signals code that no longer belongs to game.c?
+#include "common.h"
+#include "flags.h"
+#include "game.h"
+#include "item.h"
+#include "kinstone.h"
+#include "room.h"
+
+// extern const u8 gUnk_080FE1B4[];
+// const u8 gUnk_080FE1B4[] = {0, 84, 85, 86, 95, 96, 93, 94, 63, 252, 253, 254, 255, 0, 0, 0,0,};
+const u8 gUnk_080FE1B4[] = {
+ ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY,
+ ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED,
+ ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+};
+const u8 gUnk_080FE1C6[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 10, 10, 11, 12, 13, 14, 15, 8, 15, 1, 8,
+};
+const u8 gUnk_080FE1DD[] = {
+ 110, 111, 112, 112, 110, 111, 111, 112, 110, 110, 112, 111, 112, 111, 110, 110, 110, 111, 112, 112, 110, 111,
+ 111, 112, 110, 110, 112, 111, 112, 111, 110, 111, 110, 111, 112, 112, 110, 111, 111, 112, 110, 110, 112, 111,
+ 112, 111, 110, 112, 110, 111, 112, 112, 110, 111, 111, 112, 110, 110, 112, 111, 112, 111, 110, 0, 113, 114,
+ 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114,
+ 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114,
+ 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 115, 116, 117, 117,
+ 115, 116, 116, 117, 115, 115, 117, 116, 117, 116, 115, 115, 115, 116, 117, 117, 115, 116, 116, 117, 115, 115,
+ 117, 116, 117, 116, 115, 116, 115, 116, 117, 117, 115, 116, 116, 117, 115, 115, 117, 116, 117, 116, 115, 117,
+ 115, 116, 117, 117, 115, 116, 116, 117, 115, 115, 117, 116, 117, 116, 115, 0, 0, 0, 0,
+};
+
+void Subtask_WorldEvent_Init(void);
+void Subtask_WorldEvent_Update(void);
+void Subtask_WorldEvent_End(void);
+void (*const gUnk_080FE2A0[])(void) = {
+ Subtask_WorldEvent_Init,
+ Subtask_WorldEvent_Update,
+ Subtask_WorldEvent_End,
+};
+void WorldEvent_0(void);
+void WorldEvent_1(void);
+void WorldEvent_2(void);
+void WorldEvent_3(void);
+void WorldEvent_4(void);
+void WorldEvent_5(void);
+void WorldEvent_6(void);
+void WorldEvent_7(void);
+void WorldEvent_8(void);
+void WorldEvent_9(void);
+void WorldEvent_Beanstalk(void);
+void WorldEvent_11(void);
+void WorldEvent_12(void);
+void WorldEvent_13(void);
+void WorldEvent_14(void);
+void WorldEvent_15(void);
+void WorldEvent_16(void);
+void WorldEvent_17(void);
+void WorldEvent_17(void);
+void WorldEvent_19(void);
+void WorldEvent_20(void);
+void WorldEvent_21(void);
+void WorldEvent_22(void);
+void WorldEvent_23(void);
+void WorldEvent_24(void);
+void WorldEvent_25(void);
+
+void (*const gWorldEventFunctions[])(void) = {
+ WorldEvent_0, WorldEvent_1, WorldEvent_2, WorldEvent_3, WorldEvent_4, WorldEvent_5,
+ WorldEvent_6, WorldEvent_7, WorldEvent_8, WorldEvent_9, WorldEvent_Beanstalk, WorldEvent_11,
+ WorldEvent_12, WorldEvent_13, WorldEvent_14, WorldEvent_15, WorldEvent_16, WorldEvent_17,
+ WorldEvent_17, WorldEvent_19, WorldEvent_20, WorldEvent_21, WorldEvent_22, WorldEvent_23,
+ WorldEvent_24, WorldEvent_25, WorldEvent_0, WorldEvent_0, WorldEvent_0,
+};
+
+// Indexed by worldEventId of gKinstoneWorldEvents
+const WorldEvent gWorldEvents[] = {
+ { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_1, 0, AREA_RUINS, ROOM_RUINS_BELOW_FORTRESS_ENTRANCE, 128, 112, 248, 216, 728, 3112, CND_1,
+ LOCAL_BANK_0, OUGONTEKI_A },
+ { WORLD_EVENT_TYPE_1, 1, AREA_MT_CRENEL, ROOM_MT_CRENEL_CENTER, 384, 192, 504, 280, 488, 1112, CND_1, LOCAL_BANK_0,
+ OUGONTEKI_B },
+ { WORLD_EVENT_TYPE_1, 2, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 480, 80, 600, 168, 600, 1848, CND_1,
+ LOCAL_BANK_0, OUGONTEKI_C },
+ { WORLD_EVENT_TYPE_1, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH, 0, 352, 120, 440, 2616, 2600,
+ CND_1, LOCAL_BANK_0, OUGONTEKI_D },
+ { WORLD_EVENT_TYPE_1, 4, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 768, 160, 936, 248, 2424, 440, CND_1,
+ LOCAL_BANK_0, OUGONTEKI_E },
+ { WORLD_EVENT_TYPE_1, 5, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 224, 144, 344, 232, 2840, 472, CND_1, LOCAL_BANK_0,
+ OUGONTEKI_F },
+ { WORLD_EVENT_TYPE_1, 6, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, 96, 368, 216, 456, 600, 680,
+ CND_1, LOCAL_BANK_0, OUGONTEKI_G },
+ { WORLD_EVENT_TYPE_1, 7, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 192, 96, 328, 184, 3304, 2344, CND_1,
+ LOCAL_BANK_0, OUGONTEKI_H },
+ { WORLD_EVENT_TYPE_1, 8, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_CENTER, 176, 0, 312, 88, 1320, 2888,
+ CND_1, LOCAL_BANK_0, OUGONTEKI_I },
+ { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH, 80, 288, 200, 376, 2696, 2536,
+ CND_1, LOCAL_BANK_1, KAKERA_TAKARA_A },
+ { WORLD_EVENT_TYPE_2, 0, AREA_CRENEL_MINISH_PATHS, ROOM_CRENEL_MINISH_PATHS_RAIN, 272, 16, 392, 88, 744, 152, CND_1,
+ LOCAL_BANK_3, KAKERA_TAKARA_B },
+ { WORLD_EVENT_TYPE_2, 0, AREA_CRENEL_MINISH_PATHS, ROOM_CRENEL_MINISH_PATHS_SPRING_WATER, 0, 48, 168, 136, 872,
+ 1432, CND_1, LOCAL_BANK_3, KAKERA_TAKARA_C },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_SCHOOLYARD, 0, 240, 120, 328, 2408, 1608, CND_1,
+ LOCAL_BANK_3, KAKERA_TAKARA_D },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 0, 112, 104, 200, 3080, 2360, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_E },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_LON_LON_RANCH, 0, 288, 120, 376, 2968, 1544, CND_1,
+ LOCAL_BANK_3, KAKERA_TAKARA_F },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_MINISH_VILLAGE, 0, 416, 104, 504, 3448, 3064, CND_1,
+ LOCAL_BANK_3, KAKERA_TAKARA_G },
+ { WORLD_EVENT_TYPE_2, 0, AREA_CRENEL_MINISH_PATHS, ROOM_CRENEL_MINISH_PATHS_MELARI, 208, 16, 344, 104, 616, 504,
+ CND_1, LOCAL_BANK_3, KAKERA_TAKARA_H },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_LAKE_HYLIA, 0, 640, 104, 760, 3896, 2024, CND_1,
+ LOCAL_BANK_3, KAKERA_TAKARA_I },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 0, 576, 88, 664, 3064, 2824, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_J },
+ { WORLD_EVENT_TYPE_2, 0, AREA_RUINS, ROOM_RUINS_FORTRESS_ENTRANCE, 288, 80, 488, 168, 968, 2808, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_K },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 768, 496, 904, 584, 3880, 2744, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_L },
+ { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 240, 0, 392, 56, 1400, 1256, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_M },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 544, 640, 664, 728, 3640, 2888, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_N },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 48, 320, 200, 360, 3176, 2520, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_O },
+ { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 656, 272, 776, 360, 2264, 2840,
+ CND_1, LOCAL_BANK_1, KAKERA_TAKARA_P },
+ { WORLD_EVENT_TYPE_2, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 0, 0, 56, 88, 1064, 280, CND_1, LOCAL_BANK_1,
+ KAKERA_TAKARA_Q },
+ { WORLD_EVENT_TYPE_2, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 240, 0, 424, 88, 1432, 280, CND_1, LOCAL_BANK_1,
+ KAKERA_TAKARA_R },
+ { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 144, 352, 280, 440, 1288, 1640,
+ CND_1, LOCAL_BANK_1, KAKERA_TAKARA_S },
+ { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 0, 0, 104, 72, 1592, 792, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_T },
+ { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 48, 0, 168, 40, 2664, 1240, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_U },
+ { WORLD_EVENT_TYPE_2, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 240, 96, 360, 184, 2856, 376, CND_1, LOCAL_BANK_1,
+ KAKERA_TAKARA_V },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_WALL_CLIMB, 48, 288, 184, 376, 184, 600, CND_1,
+ LOCAL_BANK_1, KAKERA_TAKARA_W },
+ { WORLD_EVENT_TYPE_2, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 0, 0, 120, 88, 120, 1288, CND_1, LOCAL_BANK_1,
+ KAKERA_TAKARA_X },
+ { WORLD_EVENT_TYPE_2, 0, AREA_RUINS, ROOM_RUINS_LADDER_TO_TEKTITES, 0, 0, 136, 88, 376, 3096, CND_1, LOCAL_BANK_1,
+ KAKERA_TAKARA_Y },
+ { WORLD_EVENT_TYPE_0, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_3, 0, AREA_RUINS, ROOM_RUINS_ENTRANCE, 0, 48, 40, 136, 40, 2776, CND_2, 0,
+ ITEM_ARROW_BUTTERFLY },
+ { WORLD_EVENT_TYPE_3, 1, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 304, 448, 424, 520, 424, 2200, CND_2, 0,
+ ITEM_DIG_BUTTERFLY },
+ { WORLD_EVENT_TYPE_3, 2, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 0, 136, 56, 216, 1064, 408, CND_2, 0,
+ ITEM_SWIM_BUTTERFLY },
+#if defined(EU) || defined(JP) || defined(DEMO_JP)
+ { WORLD_EVENT_TYPE_4, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 112, 160, 264, 264, 1272, 1432,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_4, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 352, 400, 488, 520, 3704, 1688, CND_0, 0, 0 },
+#ifdef DEMO_JP
+ { WORLD_EVENT_TYPE_4, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 160, 576, 232, 664, 2728, 824, CND_1, LOCAL_BANK_3,
+ MOGURA_41_T3 }, // same as USA
+#else
+ { WORLD_EVENT_TYPE_4, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 160, 576, 232, 664, 2728, 824, CND_0, 0, 0 },
+#endif
+ { WORLD_EVENT_TYPE_5, 132, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 656, 0, 776, 72, 2264, 264, CND_0, 0, 0 },
+#ifdef DEMO_JP
+ { WORLD_EVENT_TYPE_5, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 384, 440, 504, 520, 3000, 1720, CND_1,
+ LOCAL_BANK_4, 0x4c }, // TODO differs from USA
+#else
+ { WORLD_EVENT_TYPE_5, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 384, 440, 504, 520, 3000, 1720, CND_0,
+ 0, 0 },
+#endif
+ { WORLD_EVENT_TYPE_5, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 0, 200, 88, 280, 1576, 2760,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_5, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 0, 600, 56, 680, 1064, 1880, CND_0,
+ 0, 0 },
+ { WORLD_EVENT_TYPE_5, 128, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 128, 0, 232, 72, 1720, 264, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 112, 224, 216, 296, 1240, 2488,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 56, 32, 168, 88, 1192, 2280,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 240, 448, 392, 552, 1416, 2744,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 0, 464, 24, 568, 1048, 2760,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 224, 576, 296, 2072, 1016,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 304, 304, 432, 392, 1928, 1112,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 328, 224, 432, 296, 1928, 1016,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 328, 576, 392, 2072, 1112,
+ CND_0, 0, 0 },
+#ifdef DEMO_JP
+ { WORLD_EVENT_TYPE_7, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 40, 408, 160, 488, 1160, 2648,
+ CND_1, LOCAL_BANK_2, URO_19_H0 }, // same as USA
+#else
+ { WORLD_EVENT_TYPE_7, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 40, 408, 160, 488, 1160, 2648,
+ CND_0, 0, 0 },
+#endif
+ { WORLD_EVENT_TYPE_7, 1, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 408, 376, 528, 456, 3496, 2600, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_7, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 632, 232, 752, 312, 2248, 1032,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_7, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 768, 472, 928, 552, 2424, 3032,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_RUINS, ROOM_RUINS_TEKTITES, 0, 0, 200, 88, 440, 2936, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 496, 848, 536, 968, 3512, 3128, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 16, 24, 88, 24, 1768, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 48, 424, 152, 520, 3368, 1720, CND_0, 0, 0 },
+
+#ifdef DEMO_JP
+ // mostly same as USA
+ { WORLD_EVENT_TYPE_9, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 0, 0, 56, 40, 2552, 232, CND_1, LOCAL_BANK_4,
+ SUIGEN_DOUKUTU_09_H00 },
+ { WORLD_EVENT_TYPE_9, 1, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 112, 304, 240, 392, 1736, 1912, CND_0, 0,
+ 0 }, // same as EU
+ { WORLD_EVENT_TYPE_25, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 768, 0, 920, 56, 920, 1752, CND_2, 0,
+ ITEM_SKILL_FAST_SPIN },
+ { WORLD_EVENT_TYPE_25, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 80, 400, 200, 488, 1688, 1208,
+ CND_2, 0, ITEM_SKILL_LONG_SPIN },
+ { WORLD_EVENT_TYPE_25, 2, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 128, 752, 248, 840, 2744, 1032, CND_2, 0,
+ ITEM_SKILL_FAST_SPLIT },
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 0, 0, 152, 40, 152, 40, CND_5, LOCAL_BANK_1,
+ BEANDEMO_00 }, // uses different flags due to CND_5
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 432, 0, 552, 88, 3528, 1096, CND_6,
+ LOCAL_BANK_1, BEANDEMO_01 }, // uses different flags due to CND_6
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_RUINS, ROOM_RUINS_BEANSTALK, 0, 0, 72, 72, 312, 2712, CND_7, LOCAL_BANK_1,
+ BEANDEMO_02 }, // uses different flags due to CND_7
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, 0, 0, 72, 56, 2568,
+ 2760, CND_8, LOCAL_BANK_1, BEANDEMO_03 }, // uses different flags due to CND_8
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, 0, 0, 56, 56, 1064, 3016,
+ CND_9, LOCAL_BANK_1, BEANDEMO_04 }, // uses different flags due to CND_9
+#else
+ { WORLD_EVENT_TYPE_9, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 0, 0, 56, 40, 2552, 232, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_9, 1, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 112, 304, 240, 392, 1736, 1912, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_25, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 768, 0, 920, 56, 920, 1752, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_25, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 80, 400, 200, 488, 1688, 1208,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_25, 2, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 128, 752, 248, 840, 2744, 1032, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 0, 0, 152, 40, 152, 40, CND_0, LOCAL_BANK_1,
+ BEANDEMO_00 }, // uses different flags due to CND_5
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 432, 0, 552, 88, 3528, 1096, CND_0,
+ LOCAL_BANK_1, BEANDEMO_01 }, // uses different flags due to CND_6
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_RUINS, ROOM_RUINS_BEANSTALK, 0, 0, 72, 72, 312, 2712, CND_0, LOCAL_BANK_1,
+ BEANDEMO_02 }, // uses different flags due to CND_7
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, 0, 0, 72, 56, 2568,
+ 2760, CND_0, LOCAL_BANK_1, BEANDEMO_03 }, // uses different flags due to CND_8
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, 0, 0, 56, 56, 1064, 3016,
+ CND_0, LOCAL_BANK_1, BEANDEMO_04 }, // uses different flags due to CND_9
+#endif
+ { WORLD_EVENT_TYPE_11, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 48, 88, 152, 88, 1832, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_11, 1, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 160, 40, 232, 40, 1912, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_11, 2, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 96, 664, 200, 776, 200, 2456, CND_0, 0, 0 },
+#ifdef DEMO_JP
+ // same as USA
+ { WORLD_EVENT_TYPE_12, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 624, 784, 760, 952, 2184, 2360, CND_1,
+ LOCAL_BANK_2, 208 }, // TODO
+ { WORLD_EVENT_TYPE_13, 0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, 0, 32, 120, 112, 1560, 1944,
+ CND_1, LOCAL_BANK_2, 207 }, // TODO
+#else
+ { WORLD_EVENT_TYPE_12, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 624, 784, 760, 952, 2184, 2360, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_13, 0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, 0, 32, 120, 112, 1560, 1944,
+ CND_0, 0, 0 },
+#endif
+ { WORLD_EVENT_TYPE_14, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 736, 904, 824, 2392, 2344, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_15, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 240, 96, 392, 136, 1400, 360, CND_0,
+ LOCAL_BANK_1, HAKA_BOSEKI_00 }, // uses different flags due to CND_10
+ { WORLD_EVENT_TYPE_16, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 160, 736, 232, 2040, 2040, CND_0, 0, 0 },
+
+ { WORLD_EVENT_TYPE_17, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 0, 800, 136, 856, 2624, 2056, CND_0,
+ 0, 0 },
+ { WORLD_EVENT_TYPE_18, 1, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 464, 120, 440, 2632, 2056, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_18, 2, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_18, 3, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_18, 4, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_18, 5, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_0, 0, 0 },
+#else
+ { WORLD_EVENT_TYPE_4, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 112, 160, 264, 264, 1272, 1432,
+ CND_1, LOCAL_BANK_4, KS_B01 },
+ { WORLD_EVENT_TYPE_4, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 352, 400, 488, 520, 3704, 1688, CND_1, LOCAL_BANK_3,
+ MOGURA_01_T0 },
+ { WORLD_EVENT_TYPE_4, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 160, 576, 232, 664, 2728, 824, CND_1, LOCAL_BANK_3,
+ MOGURA_41_T3 },
+ { WORLD_EVENT_TYPE_5, 132, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 656, 0, 776, 72, 2264, 264, CND_1,
+ LOCAL_BANK_3, IZUMIGARE_00_H00 },
+ { WORLD_EVENT_TYPE_5, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 384, 440, 504, 520, 3000, 1720, CND_1,
+ LOCAL_BANK_4, SOUGEN_DOUKUTU_0F_T00 },
+ { WORLD_EVENT_TYPE_5, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 0, 200, 88, 280, 1576, 2760,
+ CND_1, LOCAL_BANK_4, KS_C37 },
+ { WORLD_EVENT_TYPE_5, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 0, 600, 56, 680, 1064, 1880, CND_1,
+ LOCAL_BANK_4, KS_C12 },
+ { WORLD_EVENT_TYPE_5, 128, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 128, 0, 232, 72, 1720, 264, CND_1,
+ LOCAL_BANK_3, KS_C02 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 112, 224, 216, 296, 1240, 2488,
+ CND_1, LOCAL_BANK_1, SOUGEN_08_T00 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 56, 32, 168, 88, 1192, 2280,
+ CND_1, LOCAL_BANK_1, KS_C21 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 240, 448, 392, 552, 1416, 2744,
+ CND_1, LOCAL_BANK_1, KS_C25 },
+ { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 0, 464, 24, 568, 1048, 2760,
+ CND_1, LOCAL_BANK_2, MHOUSE08_00 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 224, 576, 296, 2072, 1016,
+ CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T1 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 304, 304, 432, 392, 1928, 1112,
+ CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T2 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 328, 224, 432, 296, 1928, 1016,
+ CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T0 },
+ { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 328, 576, 392, 2072, 1112,
+ CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T3 },
+ { WORLD_EVENT_TYPE_7, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 40, 408, 160, 488, 1160, 2648,
+ CND_1, LOCAL_BANK_2, URO_19_H0 },
+ { WORLD_EVENT_TYPE_7, 1, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 408, 376, 528, 456, 3496, 2600, CND_1,
+ LOCAL_BANK_4, KS_B06 },
+ { WORLD_EVENT_TYPE_7, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 632, 232, 752, 312, 2248, 1032,
+ CND_1, LOCAL_BANK_4, KS_B12 },
+ { WORLD_EVENT_TYPE_7, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 768, 472, 928, 552, 2424, 3032,
+ CND_1, LOCAL_BANK_2, URO_12_H0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_RUINS, ROOM_RUINS_TEKTITES, 0, 0, 200, 88, 440, 2936, CND_1, LOCAL_BANK_2,
+ KOBITOANA_0C_T0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 496, 848, 536, 968, 3512, 3128, CND_1,
+ LOCAL_BANK_2, KOBITOANA_08_T0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 16, 24, 88, 24, 1768, CND_1, LOCAL_BANK_2,
+ KOBITOANA_0D_T0 },
+ { WORLD_EVENT_TYPE_8, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 48, 424, 152, 520, 3368, 1720, CND_1, LOCAL_BANK_2,
+ KS_A09 },
+ { WORLD_EVENT_TYPE_9, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 0, 0, 56, 40, 2552, 232, CND_1, LOCAL_BANK_4,
+ SUIGEN_DOUKUTU_09_H00 },
+ { WORLD_EVENT_TYPE_9, 1, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 112, 304, 240, 392, 1736, 1912, CND_1,
+ LOCAL_BANK_4, SOUGEN_DOUKUTU_0B_T0 },
+ { WORLD_EVENT_TYPE_25, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 768, 0, 920, 56, 920, 1752, CND_2, 0,
+ ITEM_SKILL_FAST_SPIN },
+ { WORLD_EVENT_TYPE_25, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 80, 400, 200, 488, 1688, 1208,
+ CND_2, 0, ITEM_SKILL_LONG_SPIN },
+ { WORLD_EVENT_TYPE_25, 2, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 128, 752, 248, 840, 2744, 1032, CND_2, 0,
+ ITEM_SKILL_FAST_SPLIT },
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 0, 0, 152, 40, 152, 40, CND_5, LOCAL_BANK_1,
+ BEANDEMO_00 }, // uses different flags due to CND_5
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 432, 0, 552, 88, 3528, 1096, CND_6,
+ LOCAL_BANK_1, BEANDEMO_01 }, // uses different flags due to CND_6
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_RUINS, ROOM_RUINS_BEANSTALK, 0, 0, 72, 72, 312, 2712, CND_7, LOCAL_BANK_1,
+ BEANDEMO_02 }, // uses different flags due to CND_7
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, 0, 0, 72, 56, 2568,
+ 2760, CND_8, LOCAL_BANK_1, BEANDEMO_03 }, // uses different flags due to CND_8
+ { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, 0, 0, 56, 56, 1064, 3016,
+ CND_9, LOCAL_BANK_1, BEANDEMO_04 }, // uses different flags due to CND_9
+ { WORLD_EVENT_TYPE_11, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 48, 88, 152, 88, 1832, CND_1, LOCAL_BANK_2,
+ KOBITOANA_09_T0 },
+ { WORLD_EVENT_TYPE_11, 1, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 160, 40, 232, 40, 1912, CND_1, LOCAL_BANK_2,
+ KOBITOANA_0A_T0 },
+ { WORLD_EVENT_TYPE_11, 2, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 96, 664, 200, 776, 200, 2456, CND_1,
+ LOCAL_BANK_2, KOBITOANA_0B_T0 },
+ { WORLD_EVENT_TYPE_12, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 624, 784, 760, 952, 2184, 2360, CND_1,
+ LOCAL_BANK_2, KS_A18 },
+ { WORLD_EVENT_TYPE_13, 0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, 0, 32, 120, 112, 1560, 1944,
+ CND_1, LOCAL_BANK_2, KS_A02 },
+ { WORLD_EVENT_TYPE_14, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 736, 904, 824, 2392, 2344, CND_1,
+ LOCAL_BANK_2, KS_B07 },
+ { WORLD_EVENT_TYPE_15, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 240, 96, 392, 136, 1400, 360, CND_10,
+ LOCAL_BANK_1, HAKA_BOSEKI_00 }, // uses different flags due to CND_10
+ { WORLD_EVENT_TYPE_16, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 160, 736, 232, 2040, 2040, CND_1,
+ LOCAL_BANK_1, KS_B18 },
+ { WORLD_EVENT_TYPE_17, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 0, 800, 136, 856, 2624, 2056, CND_1,
+ LOCAL_BANK_4, GORON_DOUKUTU_01_T0 },
+ { WORLD_EVENT_TYPE_18, 1, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 464, 120, 440, 2632, 2056, CND_1, LOCAL_BANK_4,
+ GORON_DOUKUTU_01_T0 },
+ { WORLD_EVENT_TYPE_18, 2, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_1, LOCAL_BANK_4,
+ GORON_DOUKUTU_01_T0 },
+ { WORLD_EVENT_TYPE_18, 3, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_1, LOCAL_BANK_4,
+ GORON_DOUKUTU_01_T0 },
+ { WORLD_EVENT_TYPE_18, 4, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_1, LOCAL_BANK_4,
+ GORON_DOUKUTU_01_T0 },
+ { WORLD_EVENT_TYPE_18, 5, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_1, LOCAL_BANK_4,
+ GORON_DOUKUTU_01_T0 },
+#endif
+ { WORLD_EVENT_TYPE_19, 0, AREA_VEIL_FALLS_TOP, ROOM_VEIL_FALLS_TOP_0, 192, 0, 320, 104, 0, 0, CND_0, 0, 0 },
+#if defined(EU) || defined(JP) || defined(DEMO_JP)
+ { WORLD_EVENT_TYPE_20, 0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_WITCH_HUT, 0, 0, 120, 56, 3656, 2248, CND_0, 0,
+ 0 },
+ { WORLD_EVENT_TYPE_21, 0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BORLOV_ENTRANCE, 0, 0, 120, 72, 2152, 2152,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_22, 0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_POST_OFFICE, 0, 0, 72, 56, 1560, 1704,
+ CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_23, 0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_MINISH_WOODS_BOMB, 0, 0, 120, 88,
+ 3288, 2952, CND_0, 0, 0 },
+#ifdef DEMO_JP
+ { WORLD_EVENT_TYPE_24, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 464, 176, 584, 264, 2072, 2744,
+ CND_1, LOCAL_BANK_1, 252 }, // TODO
+#else
+ { WORLD_EVENT_TYPE_24, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 464, 176, 584, 264, 2072, 2744,
+ CND_0, 0, 0 },
+#endif
+#else
+ { WORLD_EVENT_TYPE_20, 0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_WITCH_HUT, 0, 0, 120, 56, 3656, 2248, CND_2, 0,
+ ITEM_BOTTLE_RED_POTION },
+ { WORLD_EVENT_TYPE_21, 0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BORLOV_ENTRANCE, 0, 0, 120, 72, 2152, 2152,
+ CND_1, LOCAL_BANK_2, KS_B16 },
+ { WORLD_EVENT_TYPE_22, 0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_POST_OFFICE, 0, 0, 72, 56, 1560, 1704,
+ CND_1, LOCAL_BANK_2, BILL01_TESSIN_8 },
+ { WORLD_EVENT_TYPE_23, 0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_MINISH_WOODS_BOMB, 0, 0, 120, 88,
+ 3288, 2952, CND_1, LOCAL_BANK_2, KHOUSE26_REMOCON },
+ { WORLD_EVENT_TYPE_24, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 464, 176, 584, 264, 2072, 2744,
+ CND_1, LOCAL_BANK_1, KS_A06 },
+#endif
+ { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 },
+ { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 },
+};
+
+// kinstone data
+
+// const TileEntity gUnk_080FEAC8[] = {
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 180, 30, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 166, 92, 113, 0x0, 0, 0 },
+// { SMALL_CHEST, 167, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 168, 92, 110, 0x0, 0, 0 },
+// { SMALL_CHEST, 181, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 169, 92, 112, 0x0, 0, 0 },
+// { SMALL_CHEST, 170, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 171, 63, 200, 0x0, 0, 0 },
+// { SMALL_CHEST, 172, 92, 113, 0x0, 0, 0 },
+// { SMALL_CHEST, 182, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 183, 101, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 184, 92, 110, 0x0, 0, 0 },
+// { SMALL_CHEST, 185, 92, 111, 0x0, 0, 0 },
+// { SMALL_CHEST, 186, 92, 112, 0x0, 0, 0 },
+// { SMALL_CHEST, 187, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 188, 63, 200, 0x0, 0, 0 },
+// { SMALL_CHEST, 189, 92, 112, 0x0, 0, 0 },
+// { SMALL_CHEST, 190, 92, 111, 0x0, 0, 0 },
+// { SMALL_CHEST, 191, 92, 110, 0x0, 0, 0 },
+// { SMALL_CHEST, 192, 63, 200, 0x0, 0, 0 },
+// { SMALL_CHEST, 193, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 194, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 195, 92, 113, 0x0, 0, 0 },
+// { SMALL_CHEST, 196, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 197, 63, 200, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// };
+
+// const TileEntity gUnk_080FEAC8[] = {
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 3,178, 30, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 166, 92, 113, 0x0, 0, 0 },
+// { SMALL_CHEST, 167, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 168, 92, 110, 0x0, 0, 0 },
+// { SMALL_CHEST, 179, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 169, 92, 112, 0x0, 0, 0 },
+// { SMALL_CHEST, 170, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 171, 63, 200, 0x0, 0, 0 },
+// { SMALL_CHEST, 172, 92, 113, 0x0, 0, 0 },
+// { SMALL_CHEST, 251, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 180, 101, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 181, 92, 110, 0x0, 0, 0 },
+// { SMALL_CHEST, 182, 92, 111, 0x0, 0, 0 },
+// { SMALL_CHEST, 183, 92, 112, 0x0, 0, 0 },
+// { SMALL_CHEST, 184, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 185, 63, 200, 0x0, 0, 0 },
+// { SMALL_CHEST, 186, 92, 112, 0x0, 0, 0 },
+// { SMALL_CHEST, 187, 92, 111, 0x0, 0, 0 },
+// { SMALL_CHEST, 188, 92, 110, 0x0, 0, 0 },
+// { SMALL_CHEST, 189, 63, 200, 0x0, 0, 0 },
+// { SMALL_CHEST, 190, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 191, 92, 114, 0x0, 0, 0 },
+// { SMALL_CHEST, 192, 92, 113, 0x0, 0, 0 },
+// { SMALL_CHEST, 193, 89, 0, 0x0, 0, 0 },
+// { SMALL_CHEST, 194, 63, 200, 0x0, 0, 0 },
+// { NONE, 0, 0, 0, 0x0, 0, 0 },
+// };
+extern TileEntity gUnk_080FEAC8[]; // TODO differs jp, demo_jp, eu
+extern EntityData gUnk_080FEBE8[];
+extern EntityData gUnk_080FEC28[];
+extern EntityData gUnk_080FECC8[];
+extern const EntityData gUnk_080FED18[];
+extern EntityData gUnk_080FED58[];
+// TODO need to find out what gRoomVars.field_0x8c[ptr->entity_idx] is.
+extern const void* gUnk_080FED98[];
+// gUnk_080FEDA4
+// gUnk_080FEDDA
+// gUnk_080FEDF8
+extern const EntityData gUnk_080FEE18[];
+extern const EntityData gUnk_080FEE38[];
+extern const EntityData gUnk_080FEE48[];
+extern const EntityData gUnk_080FEE58[]; // TODO differs jp, demo_jp, eu
+extern EntityData gUnk_080FEE78[];
diff --git a/src/gameOverTask.c b/src/gameOverTask.c
new file mode 100644
index 00000000..c56f86b3
--- /dev/null
+++ b/src/gameOverTask.c
@@ -0,0 +1,240 @@
+/**
+ * @file gameOverTask.c
+ * @ingroup Tasks
+ *
+ * @brief Game Over Task
+ */
+#include "common.h"
+#include "fade.h"
+#include "fileselect.h"
+#include "functions.h"
+#include "game.h"
+#include "main.h"
+#include "menu.h"
+#include "save.h"
+#include "sound.h"
+#include "subtask.h"
+
+typedef void(GameOverState)(void);
+
+static GameOverState GameOver_Init;
+static GameOverState GameOver_FadeIn;
+static GameOverState GameOver_TextMove;
+static GameOverState GameOver_Update;
+static GameOverState GameOver_Exit;
+
+void DrawGameOverText(void);
+
+void GameOverTask(void) {
+ static GameOverState* const sStates[] = {
+ GameOver_Init, GameOver_FadeIn, GameOver_TextMove, GameOver_Update, GameOver_Exit,
+ };
+
+ sStates[gMain.state]();
+ if (gMain.state != GAMETASK_TRANSITION) {
+ FlushSprites();
+ DrawGameOverText();
+ CopyOAM();
+ }
+}
+void switch_state(u32 idx) {
+ gMain.state = idx;
+ SetMenuType(0);
+}
+void GameOver_Init(void) {
+ if (gFadeControl.active)
+ return;
+ sub_08052010();
+ gGenericMenu.unk10.a[0] = 80;
+ gMenu.transitionTimer = 60;
+ gSave.stats.health = 24;
+ gMain.field_0x5 = 60;
+ SoundReq(BGM_GAMEOVER);
+ SetFadeInverted(4);
+ gFadeControl.mask = 0xFFFF0001;
+ switch_state(GAMETASK_INIT);
+}
+void GameOver_FadeIn(void) {
+ if (gFadeControl.active)
+ return;
+
+ if (gMain.field_0x5 == 0) {
+ if (gGenericMenu.unk10.a[0] >= 38) {
+ gGenericMenu.unk10.a[0]--;
+ } else {
+ gMenu.transitionTimer--;
+ if (gMenu.transitionTimer == 0) {
+ switch_state(GAMETASK_MAIN);
+#if defined(DEMO_USA) || defined(DEMO_JP)
+ SoundReq(SONG_VOL_FADE_OUT);
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4);
+#else
+ SetPopupState(0, 0);
+ gScreen.lcd.displayControl |= DISPCNT_BG1_ON | DISPCNT_BG2_ON;
+ gFadeControl.mask = 0x0000ffff;
+ SetFade(FADE_INSTANT, 16);
+#endif
+ }
+ }
+ } else {
+ gMain.field_0x5--;
+ }
+}
+void GameOver_TextMove(void) {
+#if defined(DEMO_USA) || defined(DEMO_JP)
+ if (gFadeControl.active == 0) {
+ DoSoftReset();
+ }
+#else
+ s32 temp3;
+ u32 temp2;
+
+ if (gFadeControl.active)
+ return;
+
+ switch (gMenu.menuType) {
+ case 0:
+ gMenu.transitionTimer = 30;
+ gMenu.field_0x3 = 0;
+ SetMenuType(1);
+ SetPopupState(0, 0);
+ gFadeControl.mask = 0xffffffff;
+ return;
+ case 1:
+ if (gMenu.transitionTimer == 0) {
+ u32 temp = gMenu.field_0x3;
+ switch (gInput.newKeys) {
+ case DPAD_UP:
+ temp = 0;
+ break;
+ case DPAD_DOWN:
+ temp = 1;
+ break;
+ case A_BUTTON:
+ if (gMenu.field_0x3 != 0) {
+ temp2 = 4;
+ } else {
+ CreateDialogBox(8, 0);
+ temp2 = 2;
+ }
+ gMenu.transitionTimer = 60;
+ SetMenuType(temp2);
+ SoundReq(SFX_TEXTBOX_SELECT);
+ break;
+ }
+ if (gMenu.field_0x3 != temp) {
+ gMenu.field_0x3 = temp;
+ SetPopupState(0, temp);
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ return;
+ }
+ gMenu.transitionTimer--;
+ return;
+ case 2:
+ temp3 = HandleSave(0);
+ gMenu.field_0x0 = temp3;
+ switch (temp3) {
+ case 1:
+ SetMenuType(4);
+ break;
+ case -1:
+ gMenu.transitionTimer = 60;
+ CreateDialogBox(9, 0);
+ SetMenuType(3);
+ break;
+ }
+ return;
+ case 3:
+ if (gMenu.transitionTimer != 0) {
+ gMenu.transitionTimer--;
+ } else if (gInput.newKeys & (A_BUTTON | B_BUTTON | START_BUTTON)) {
+ SetMenuType(0);
+ }
+ return;
+ case 4:
+ default:
+ gScreen.lcd.displayControl &= ~DISPCNT_BG1_ON;
+ sub_08050384();
+ switch_state(GAMETASK_EXIT);
+ return;
+ }
+#endif
+}
+void GameOver_Update(void) {
+ switch (gMenu.menuType) {
+ case 0:
+ gMenu.transitionTimer = 30;
+ gMenu.field_0x3 = 0;
+ SetMenuType(1);
+ SetPopupState(1, 0);
+ return;
+ case 1:
+ gScreen.lcd.displayControl |= DISPCNT_BG1_ON;
+ if (gMenu.transitionTimer != 0) {
+ gMenu.transitionTimer--;
+ return;
+ } else {
+ u32 temp = gMenu.field_0x3;
+ switch (gInput.newKeys) {
+ case DPAD_UP:
+ temp = 0;
+ break;
+ case DPAD_DOWN:
+ temp = 1;
+ break;
+ case A_BUTTON:
+ SetMenuType(2);
+ SoundReq(SFX_TEXTBOX_SELECT);
+ if (temp == 0) {
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
+ } else {
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 8);
+ }
+ break;
+ }
+ if (gMenu.field_0x3 != temp) {
+ gMenu.field_0x3 = temp;
+ SetPopupState(1, temp);
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ }
+ return;
+ case 2:
+ default:
+ if (gFadeControl.active == 0) {
+ if (gMenu.field_0x3 == 0) {
+ SetTask(TASK_GAME);
+ } else {
+ DoSoftReset();
+ }
+ }
+ return;
+ }
+}
+
+// Unused, since task is set above
+// if we got here, it would be a softlock
+void GameOver_Exit(void) {
+}
+
+void DrawGameOverText(void) {
+ static const u8 sOffsets[] = {
+ 48, 68, 88, 108, 137, 156, 174, 192,
+ };
+
+ u32 i;
+
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0x8600;
+ gOamCmd.y = gGenericMenu.unk10.a[0];
+ for (i = 0; i < 8; ++i) {
+ gOamCmd.x = sOffsets[i];
+#ifdef EU
+ DrawDirect(0x1fc, i);
+#else
+ DrawDirect(0x1fd, i);
+#endif
+ }
+}
diff --git a/src/gameUtils.c b/src/gameUtils.c
new file mode 100644
index 00000000..dbc22f8b
--- /dev/null
+++ b/src/gameUtils.c
@@ -0,0 +1,945 @@
+/**
+ * @file gameUtils.c
+ *
+ * @brief Game Utils
+ */
+#include "backgroundAnimations.h"
+#include "enemy.h"
+#include "entity.h"
+#include "fade.h"
+#include "fileselect.h"
+#include "functions.h"
+#include "game.h"
+#include "item.h"
+#include "itemMetaData.h"
+#include "main.h"
+#include "menu.h"
+#include "npc.h"
+#include "object.h"
+#include "save.h"
+#include "screen.h"
+#include "script.h"
+#include "sound.h"
+#include "ui.h"
+
+u32 StairsAreValid(void);
+void ClearFlagArray(const u16*);
+void DummyHandler(u32* a1);
+void sub_08053434(u32* a1);
+void sub_080534E4(u32* a1);
+void InitAllRoomResInfo(void);
+void InitRoomResInfo(RoomResInfo* info, RoomHeader* hdr, u32 area, u32 room);
+void sub_080532E4(void);
+void ResetTimerFlags(void);
+
+extern void** gAreaTilesets[];
+extern void** gAreaRoomMaps[];
+extern void* gAreaMetatiles[];
+extern void** gAreaTable[];
+
+typedef struct {
+ u8 dest_off[8];
+ u8 _8;
+ u8 right_align;
+ u16 _a;
+} PopupOption;
+
+extern u8 gUnk_0200AF14;
+
+void SetPopupState(u32 type, u32 choice_idx) {
+ static const Font sDefaultFont = {
+ .dest = gBG1Buffer,
+ .gfx_dest = (u16*)0x06006000,
+ .buffer_loc = gTextGfxBuffer,
+ ._c = 0,
+ .gfx_src = 0xD300,
+ .width = 0xE0,
+ .right_align = 0,
+ .sm_border = 0,
+ .unused = 0,
+ .draw_border = 0,
+ .border_type = 0,
+ .fill_type = 6,
+ .charColor = 4,
+ ._16 = 1,
+ .stylized = 0,
+ };
+ static const PopupOption sPopupOptions[] = {
+ { { 11, 11, 11, 10, 11, 10, 10, 0 }, 8, 0, 16 },
+ { { 10, 11, 11, 9, 11, 9, 9, 0 }, 8, 0, 17 },
+ { { 15, 15, 15, 15, 15, 15, 15, 0 }, 5, 1, 13 },
+ };
+
+ Font font;
+ const PopupOption* opt;
+ u32 fakematch;
+
+ MemClear(gBG1Buffer, sizeof gBG1Buffer);
+ gUnk_020227E8[0]._0.WORD = 0xf;
+ gUnk_020227E8[1]._0.WORD = 0xf;
+ gUnk_020227E8[2]._0.WORD = 0xf;
+ gUnk_020227E8[3]._0.WORD = 0xf;
+ *(&gUnk_020227E8[choice_idx]._0.BYTES.byte0 + 1) = fakematch = 1;
+
+ MemCopy(&sDefaultFont, &font, sizeof font);
+ opt = &sPopupOptions[type];
+ font.dest = sDefaultFont.dest + (opt->dest_off[gSaveHeader->language] + opt->_8 * 32);
+ font.right_align = opt->right_align;
+ ShowTextBox(opt->_a, &font);
+ gScreen.bg1.updated = fakematch;
+}
+
+void InitializePlayer(void) {
+ static const u8 sPlayerSpawnStates[] = {
+ [PL_SPAWN_DEFAULT] = PLAYER_INIT,
+ [PL_SPAWN_MINISH] = PLAYER_MINISH,
+ [PL_SPAWN_DROP] = PLAYER_INIT,
+ [PL_SPAWN_WALKING] = PLAYER_ROOMTRANSITION,
+ [PL_SPAWN_STEP_IN] = PLAYER_ROOM_EXIT,
+ [PL_SPAWN_SLEEPING] = PLAYER_SLEEP,
+ [PL_SPAWN_DROP_MINISH] = PLAYER_MINISH,
+ [PL_SPAWN_STAIRS_ASCEND] = PLAYER_USEENTRANCE,
+ [PL_SPAWN_STAIRS_DESCEND] = PLAYER_USEENTRANCE,
+ [PL_SPAWN_9] = PLAYER_MINISH,
+ [PL_SPAWN_PARACHUTE_FORWARD] = PLAYER_WARP,
+ [PL_SPAWN_PARACHUTE_UP] = PLAYER_WARP,
+ [PL_SPAWN_FAST_TRAVEL] = PLAYER_WARP,
+ };
+
+ Entity* pl;
+
+ sub_080784C8();
+ MemClear(&gActiveItems, sizeof(gActiveItems));
+ MemClear(&gPlayerState, sizeof(gPlayerState));
+ MemFill32(0xffffffff, &gPlayerState.path_memory, sizeof(gPlayerState.path_memory));
+ MemClear(&gPlayerEntity, sizeof(gPlayerEntity));
+
+ pl = &gPlayerEntity;
+
+ gRoomControls.camera_target = pl;
+ gPlayerState.queued_action = sPlayerSpawnStates[gRoomTransition.player_status.spawn_type];
+ if (!CheckGlobalFlag(EZERO_1ST)) {
+ gPlayerState.flags |= PL_NO_CAP;
+ }
+ switch (gRoomTransition.player_status.spawn_type) {
+ case PL_SPAWN_DROP:
+ case PL_SPAWN_DROP_MINISH:
+ pl->z.HALF.HI = -0xc0;
+ break;
+ case PL_SPAWN_STEP_IN:
+ gPlayerState.field_0x38 = 16;
+ pl->direction = Direction8FromAnimationState(gRoomTransition.player_status.start_anim);
+ case PL_SPAWN_WALKING:
+ pl->speed = 224;
+ break;
+ case PL_SPAWN_STAIRS_ASCEND:
+ case PL_SPAWN_STAIRS_DESCEND:
+ gPlayerState.field_0x38 = 1;
+ gPlayerState.field_0x39 = gRoomTransition.player_status.spawn_type;
+ break;
+ case PL_SPAWN_PARACHUTE_FORWARD:
+ gPlayerState.field_0x38 = 1;
+ break;
+ case PL_SPAWN_PARACHUTE_UP:
+ gPlayerState.field_0x38 = 3;
+ break;
+ case PL_SPAWN_FAST_TRAVEL:
+ gPlayerState.field_0x38 = 4;
+ }
+
+ pl->kind = PLAYER;
+ pl->flags |= ENT_COLLIDE | ENT_PERSIST;
+ pl->spritePriority.b0 = 4;
+ pl->health = gSave.stats.health;
+ pl->x.HALF.HI = gRoomTransition.player_status.start_pos_x;
+ pl->y.HALF.HI = gRoomTransition.player_status.start_pos_y;
+ pl->animationState = gRoomTransition.player_status.start_anim;
+ pl->collisionLayer = gRoomTransition.player_status.layer;
+ UpdateSpriteForCollisionLayer(pl);
+ AppendEntityToList(pl, 1);
+ RegisterPlayerHitbox();
+}
+
+bool32 AreaIsOverworld(void) {
+#ifdef EU
+ return gArea.areaMetadata == 0x01;
+#else
+ return gArea.areaMetadata == 0x81;
+#endif
+}
+
+bool32 CheckAreaOverworld(u32 area) {
+#if EU
+ return gAreaMetadata[area].flags == 0x01;
+#else
+ return gAreaMetadata[area].flags == 0x81;
+#endif
+}
+
+#ifndef EU
+bool32 AreaAllowsWarp(void) {
+ return (gArea.areaMetadata >> 7) & 1;
+}
+#endif
+
+bool32 AreaIsDungeon(void) {
+ return (gArea.areaMetadata >> 2) & 1;
+}
+
+bool32 AreaHasEnemies(void) {
+ return (gArea.areaMetadata >> 4) & 1;
+}
+
+bool32 AreaHasNoEnemies(void) {
+ return (gArea.areaMetadata >> 6) & 1;
+}
+
+bool32 AreaHasMap(void) {
+ return (gArea.areaMetadata >> 3) & 1;
+}
+
+s32 ModHealth(s32 delta) {
+ s32 newHealth;
+ Stats* stats = &gSave.stats;
+
+ newHealth = stats->health + delta;
+ if (newHealth < 0) {
+ newHealth = 0;
+ }
+ if (stats->maxHealth < newHealth) {
+ newHealth = (u32)stats->maxHealth;
+ }
+ stats->health = newHealth;
+ gPlayerEntity.health = newHealth;
+ return newHealth;
+}
+
+void ModRupees(s32 delta) {
+ s32 newRupeeCount;
+ Stats* s = &gSave.stats;
+
+ newRupeeCount = s->rupees + delta;
+ if (newRupeeCount < 0) {
+ newRupeeCount = 0;
+ } else {
+ if (newRupeeCount > (u16)gWalletSizes[s->walletType * 2]) {
+ newRupeeCount = (u16)gWalletSizes[s->walletType * 2];
+ }
+ }
+ s->rupees = newRupeeCount;
+}
+
+void ModDungeonKeys(s32 keys) {
+ if (AreaHasKeys()) {
+ u8* p = &gSave.dungeonKeys[gArea.dungeon_idx];
+ if (*p + keys < 0)
+ *p = 0;
+ else
+ *p += keys;
+ }
+}
+
+bool32 AreaHasKeys(void) {
+ return (gArea.areaMetadata >> 1) & 1;
+}
+
+bool32 HasDungeonMap(void) {
+ u32 tmp;
+
+ if (AreaHasKeys())
+ tmp = gSave.dungeonKeys[gArea.dungeon_idx];
+ return tmp ? 1 : 0;
+}
+
+bool32 HasDungeonCompass(void) {
+ u32 tmp;
+
+ if (AreaHasKeys())
+ tmp = gSave.dungeonItems[gArea.dungeon_idx] & 4;
+ return tmp ? 1 : 0;
+}
+
+bool32 HasDungeonBigKey(void) {
+ if (!AreaHasKeys())
+ return 0;
+ return (gSave.dungeonItems[gArea.dungeon_idx] >> 1) & 1;
+}
+
+bool32 HasDungeonSmallKey(void) {
+ u32 tmp;
+
+ if (!AreaHasKeys())
+ return 0;
+ return gSave.dungeonItems[gArea.dungeon_idx] & 1;
+}
+
+extern u8 gPaletteBufferBackup[];
+void RestoreGameTask(u32 a1) {
+ LoadGfxGroups();
+#ifndef EU
+ CleanUpGFXSlots();
+#endif
+ sub_080ADE24();
+ InitUI(TRUE);
+ sub_0801AE44(a1);
+ MemCopy(gPaletteBufferBackup, gPaletteBuffer, 1024);
+ gUsedPalettes = 0xffffffff;
+}
+
+void LoadRoomBgm(void) {
+ gArea.queued_bgm = gAreaMetadata[gRoomControls.area]._3;
+ if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) {
+ gArea.queued_bgm = BGM_FIGHT_THEME2;
+ }
+}
+
+#ifndef EU
+void sub_08052878(void) {
+ gArea.bgm = gArea.queued_bgm;
+ SoundReq(SONG_STOP_ALL);
+}
+
+void sub_0805289C(void) {
+ gArea.queued_bgm = gArea.bgm;
+}
+#endif
+
+bool32 CheckGameOver(void) {
+ if (gRoomTransition.field_0x4[1]) {
+ InitFade();
+ gMain.state = GAMETASK_EXIT;
+ gMain.substate = GAMEMAIN_INITROOM;
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
+ SoundReq(SONG_STOP_BGM);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void RoomExitCallback(void) {
+ if (gArea.transitionManager != NULL && gArea.onExit != NULL)
+ gArea.onExit(gArea.transitionManager);
+}
+
+bool32 CheckRoomExit(void) {
+ if (gRoomTransition.transitioningOut && gSave.stats.health != 0 && gPlayerState.framestate != PL_STATE_DIE) {
+ if (StairsAreValid()) {
+ gRoomTransition.transitioningOut = 0;
+ return FALSE;
+ }
+
+ switch (gRoomTransition.type) {
+ case TRANSITION_CUT:
+ SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 8);
+ break;
+ case TRANSITION_CUT_FAST:
+ SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 3);
+ break;
+ case TRANSITION_FADE_WHITE_SLOW:
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4);
+ break;
+ case TRANSITION_FADE_BLACK_SLOW:
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 4);
+ break;
+ case TRANSITION_FADE_BLACK:
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 16);
+ break;
+ case TRANSITION_FADE_BLACK_FAST:
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 256);
+ break;
+ case TRANSITION_7:
+ case TRANSITION_FADE_WHITE_FAST:
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256);
+ break;
+ default:
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 16);
+ break;
+ }
+ RoomExitCallback();
+ gMain.substate = GAMEMAIN_CHANGEAREA;
+ *(&gMain.pauseInterval + 1) = 1;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u32 StairsAreValid(void) {
+ static const u16 sStairTypes[] = { 0x91, PL_SPAWN_STAIRS_ASCEND, 0x92, PL_SPAWN_STAIRS_DESCEND,
+ 0x93, PL_SPAWN_STAIRS_ASCEND, 0x94, PL_SPAWN_STAIRS_DESCEND,
+ 0x95, PL_SPAWN_STAIRS_ASCEND, 0x96, PL_SPAWN_STAIRS_DESCEND,
+ 0x97, PL_SPAWN_STAIRS_ASCEND, 0x98, PL_SPAWN_STAIRS_DESCEND,
+ 0 };
+
+ const u16* i;
+ u32 tgt = gRoomTransition.stairs_idx;
+
+ for (i = sStairTypes; i[0] != 0; i += 2) {
+ if (tgt == i[0]) {
+ gPlayerState.queued_action = PLAYER_USEENTRANCE;
+ gPlayerState.field_0x38 = 0;
+ gPlayerState.field_0x39 = i[1];
+ if (!gRoomTransition.player_status.spawn_type)
+ gRoomTransition.player_status.spawn_type = i[1];
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void InitParachuteRoom(void) {
+ gRoomTransition.transitioningOut = 1;
+ gRoomTransition.player_status.start_pos_x = (gPlayerEntity.x.HALF.HI - gRoomControls.origin_x) & 0x3F8;
+ gRoomTransition.player_status.start_pos_y = (gPlayerEntity.y.HALF.HI - gRoomControls.origin_y) & 0x3F8;
+ gRoomTransition.player_status.start_anim = 4;
+ gRoomTransition.player_status.spawn_type = PL_SPAWN_PARACHUTE_FORWARD;
+ gRoomTransition.player_status.area_next = gRoomControls.area;
+ gRoomTransition.player_status.room_next = gRoomControls.room - 1;
+}
+
+void InitRoomTransition(void) {
+ switch (gRoomTransition.type) {
+ case TRANSITION_CUT:
+ SetFade(FADE_INSTANT | FADE_MOSAIC, 8);
+ break;
+ case TRANSITION_CUT_FAST:
+ SetFade(FADE_INSTANT | FADE_MOSAIC, 3);
+ break;
+ case TRANSITION_FADE_WHITE_SLOW:
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 4);
+ break;
+ case TRANSITION_3:
+ break;
+ case TRANSITION_FADE_BLACK_FAST:
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 256);
+ break;
+ case TRANSITION_7:
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256);
+ break;
+ case TRANSITION_FADE_BLACK:
+ SetFade(FADE_INSTANT, 16);
+ break;
+ case TRANSITION_FADE_WHITE_FAST:
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8);
+ break;
+ default:
+ SetFadeInverted(16);
+ break;
+ }
+}
+
+bool32 CanDispEzloMessage(void) {
+ s32 tmp = PL_STATE_WALK;
+
+ if (!(gInput.heldKeys & SELECT_BUTTON) || gPlayerState.controlMode != CONTROL_ENABLED ||
+ gPauseMenuOptions.disabled || gUnk_0200AF00.unk_1)
+ return FALSE;
+
+ if ((gPlayerState.flags & (PL_NO_CAP | PL_CAPTURED | PL_DISABLE_ITEMS)) || (gPlayerState.framestate_last > tmp) ||
+ gPlayerState.item || gPlayerEntity.field_0x7a.HWORD)
+ return FALSE;
+
+ if ((gPlayerEntity.z.HALF.HI & 0x8000) && !gPlayerState.field_0xa)
+ return FALSE;
+
+ GenerateAreaHint();
+ ForceSetPlayerState(PL_STATE_TALKEZLO);
+ SetPlayerEventPriority();
+ return TRUE;
+}
+
+void DisplayEzloMessage(void) {
+ u32 height;
+ u32 idx;
+#if defined(JP) || defined(EU)
+ idx = 0x10;
+#else
+ idx = 0x11;
+#endif
+
+ if (gRoomTransition.player_status.field_0x24[idx] == 0) {
+ height = gPlayerEntity.y.HALF.HI - gRoomControls.scroll_y > 96 ? 1 : 13;
+ } else {
+ height = gRoomTransition.player_status.field_0x24[idx];
+ }
+ MessageAtHeight(gRoomTransition.hint_idx, height);
+}
+
+#if defined(USA) || defined(DEMO_USA) || defined(DEMO_JP)
+void CreateMiscManager(void) {
+ Entity* e = NULL;
+
+ if (gRoomTransition.player_status.field_0x24[13])
+ return;
+ gRoomTransition.player_status.field_0x24[13] = 1;
+#ifndef DEMO_JP
+ gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex;
+#endif
+ e = (Entity*)GetEmptyManager();
+ if (e == NULL)
+ return;
+ e->kind = MANAGER;
+ e->id = MISC_MANAGER;
+ e->type = 15;
+ AppendEntityToList(e, 0);
+}
+#endif
+
+void DecreasePortalTimer(void) {
+ if (gArea.portal_mode == 0)
+ gArea.portal_timer = 0;
+ if (gArea.portal_timer) {
+ gArea.portal_timer--;
+ gArea.portal_mode = 0;
+ }
+}
+
+void UpdatePlayerMapCoords(void) {
+ if (!AreaHasNoEnemies()) {
+ if (AreaIsOverworld()) {
+ gRoomTransition.player_status.overworld_map_x = gPlayerEntity.x.HALF_U.HI;
+ gRoomTransition.player_status.overworld_map_y = gPlayerEntity.y.HALF_U.HI;
+ } else if (AreaIsDungeon()) {
+ gRoomTransition.player_status.dungeon_map_x = gPlayerEntity.x.HALF.HI;
+ gRoomTransition.player_status.dungeon_map_y = gPlayerEntity.y.HALF.HI;
+ }
+ }
+}
+
+void SetWorldMapPos(u32 area, u32 room, u32 x, u32 y) {
+ RoomHeader* hdr = gAreaRoomHeaders[area] + room;
+ gRoomTransition.player_status.overworld_map_x = hdr->map_x + x;
+ gRoomTransition.player_status.overworld_map_y = hdr->map_y + y;
+}
+
+void SetDungeonMapPos(u32 area, u32 room, u32 x, u32 y) {
+ RoomHeader* hdr = gAreaRoomHeaders[area] + room;
+ gRoomTransition.player_status.dungeon_map_x = hdr->map_x + x;
+ gRoomTransition.player_status.dungeon_map_y = hdr->map_y + y;
+}
+
+void InitRoom(void) {
+ AreaHeader* a_hdr = NULL;
+
+ MemClear(&gArea, sizeof gArea);
+ a_hdr = &gAreaMetadata[gRoomControls.area];
+ gArea.areaMetadata = a_hdr->flags;
+ gArea.locationIndex = a_hdr->location;
+ gArea.dungeon_idx = a_hdr->location - 23;
+ gArea.localFlagOffset = gLocalFlagBanks[a_hdr->flag_bank];
+ gArea.flag_bank = a_hdr->flag_bank;
+ gArea.portal_timer = 180;
+ gArea.lightLevel = 256;
+ InitRoomTransition();
+ InitAllRoomResInfo();
+}
+
+u32 GetFlagBankOffset(u32 idx) {
+ AreaHeader* a_hdr = &gAreaMetadata[idx];
+ return gLocalFlagBanks[a_hdr->flag_bank];
+}
+
+void RegisterTransitionManager(void* mgr, void (*onEnter)(), void (*onExit)()) {
+ if (gMain.substate != GAMEMAIN_SUBTASK) {
+ gArea.transitionManager = mgr;
+ gArea.onEnter = onEnter;
+ gArea.onExit = onExit;
+ }
+}
+
+void InitAllRoomResInfo(void) {
+ RoomHeader* r_hdr = gAreaRoomHeaders[gRoomControls.area];
+ RoomResInfo* info = gArea.roomResInfos;
+ u32 i;
+ for (i = 0; i < MAX_ROOMS && *(u16*)r_hdr != 0xFFFF; i++, r_hdr++) {
+ if (r_hdr->tileset_id != 0xFFFF)
+ InitRoomResInfo(info, r_hdr, gRoomControls.area, i);
+ info++;
+ }
+ gArea.pCurrentRoomInfo = GetCurrentRoomInfo();
+}
+
+void InitRoomResInfo(RoomResInfo* info, RoomHeader* r_hdr, u32 area, u32 room) {
+ info->map_x = r_hdr->map_x;
+ info->map_y = r_hdr->map_y;
+ info->pixel_width = r_hdr->pixel_width;
+ info->pixel_height = r_hdr->pixel_height;
+ info->tileset = *(gAreaTilesets[area] + r_hdr->tileset_id);
+ info->map = *(gAreaRoomMaps[area] + room);
+ info->metatiles = gAreaMetatiles[area];
+ info->bg_anim = (void*)gUnk_080B755C[area];
+ info->exits = gExitLists[area][room];
+ if (gAreaTable[area] != NULL) {
+ info->properties = *(gAreaTable[area] + room);
+ }
+}
+
+RoomResInfo* GetCurrentRoomInfo(void) {
+ return &gArea.roomResInfos[gRoomControls.room];
+}
+
+void sub_08052EA0(void) {
+ MemClear(&gRoomVars, sizeof gRoomVars);
+ gRoomVars.unk_10[0] = -1;
+ gRoomVars.unk_10[1] = gRoomVars.unk_10[0];
+ gRoomVars.unk_10[2] = gRoomVars.unk_10[0];
+ gRoomVars.unk_10[3] = gRoomVars.unk_10[0];
+ gRoomVars.lightLevel = 256;
+ gArea.locationIndex = gAreaMetadata[gRoomControls.area].location;
+ UpdateRoomTracker();
+ InitScriptData();
+ sub_08054524();
+ sub_080186D4();
+ sub_0806F364();
+ UpdateGlobalProgress();
+}
+
+u32 sub_08052EF4(s32 idx) {
+ AreaHeader* a_hdr = NULL;
+ u32 i = idx < 0 ? gRoomControls.area : idx;
+ a_hdr = &gAreaMetadata[i];
+ return gLocalFlagBanks[a_hdr->flag_bank];
+}
+
+/**
+ * @brief If enabled, this type of transition does not change the room
+ * and keeps all entities.
+ */
+void UpdateFakeScroll(void) {
+ u32 x, y;
+ LinkedList* ll;
+ Entity* e;
+
+ if (gArea.unk_0c_0 == 0 || !gRoomVars.field_0x0)
+ return;
+
+ y = 0;
+ x = 0;
+
+ // WTF?
+ switch (gRoomControls.scroll_direction) {
+ case 0:
+ y = gArea.pCurrentRoomInfo->pixel_height;
+ case 1:
+ y = gArea.pCurrentRoomInfo->pixel_height;
+ case 2:
+ y = gArea.pCurrentRoomInfo->pixel_height;
+ case 3:
+ x = gArea.pCurrentRoomInfo->pixel_width;
+ }
+
+ gArea.pCurrentRoomInfo->map_x += x;
+ gArea.pCurrentRoomInfo->map_y += y;
+ gRoomControls.origin_x += x;
+ gRoomControls.origin_y += y;
+ gRoomControls.scroll_x += x;
+ gRoomControls.scroll_y += y;
+
+ ll = gEntityLists;
+ do {
+ for (e = ll->first; e != (Entity*)ll; e = e->next) {
+ if (e->kind != MANAGER) {
+ e->x.HALF.HI += x;
+ e->y.HALF.HI += y;
+ }
+ }
+ } while (++ll < gEntityLists + 9);
+}
+
+void LoadAuxiliaryRoom(u32 area, u32 room) {
+ sub_08052FF4(area, room);
+ gRoomControls.camera_target = NULL;
+ CloneMapData();
+ InitializeCamera();
+}
+
+void sub_08052FF4(u32 area, u32 room) {
+ RoomHeader* r_hdr = NULL;
+
+ ClearTilemaps();
+ SetBGDefaults();
+ gRoomControls.area = area;
+ gRoomControls.room = room;
+ gScreen.lcd.displayControl = 0x1740;
+ MemClear(&gArea.currentRoomInfo, sizeof gArea.currentRoomInfo);
+ gArea.pCurrentRoomInfo = &gArea.currentRoomInfo;
+ r_hdr = gAreaRoomHeaders[area] + room;
+ gArea.currentRoomInfo.map_x = r_hdr->map_x;
+ gArea.currentRoomInfo.map_y = r_hdr->map_y;
+ gArea.currentRoomInfo.pixel_width = r_hdr->pixel_width;
+ gArea.currentRoomInfo.pixel_height = r_hdr->pixel_height;
+ gArea.currentRoomInfo.tileset = *(gAreaTilesets[area] + r_hdr->tileset_id);
+ gArea.currentRoomInfo.map = *(gAreaRoomMaps[area] + room);
+ gArea.currentRoomInfo.metatiles = gAreaMetatiles[area];
+ gArea.currentRoomInfo.bg_anim = (void*)gUnk_080B755C[area];
+}
+
+void ChangeLightLevel(s32 lightLevel) {
+ lightLevel += gRoomVars.lightLevel;
+ if (lightLevel < 0)
+ lightLevel = 0;
+ if (lightLevel > 256)
+ lightLevel = 256;
+ gRoomVars.lightLevel = lightLevel;
+}
+
+void sub_080530B0(void) {
+ static const u16 sMinecartData[] = { 0x189, 0x0, 0x102, 0x4, 0x1af, 0x0, 0x204, 0x0,
+ 0x1cf, 0x0, 0x10, 0x4, 0x0, 0x0, 0x0, 0x0 };
+
+ MemCopy(sMinecartData, gRoomTransition.minecart_data, sizeof sMinecartData);
+}
+
+void UpdateGlobalProgress(void) {
+ u8 pcnt = 1;
+ if (CheckLocalFlagByBank(FLAG_BANK_3, SEIIKI_STAINED_GLASS)) {
+ pcnt = 9;
+ } else if (CheckGlobalFlag(LV5_CLEAR)) {
+ pcnt = 8;
+ } else if (CheckLocalFlagByBank(FLAG_BANK_3, OUBO_KAKERA)) {
+ pcnt = 7;
+ } else if (CheckGlobalFlag(LV4_CLEAR)) {
+ pcnt = 6;
+ } else if (CheckGlobalFlag(LV3_CLEAR)) {
+ pcnt = 5;
+ } else if (CheckLocalFlagByBank(FLAG_BANK_1, SOUGEN_08_TORITSUKI)) {
+ pcnt = 4;
+ } else if (CheckGlobalFlag(LV1_CLEAR)) {
+ pcnt = 2;
+ }
+ gSave.global_progress = pcnt;
+}
+
+u32 sub_08053144(void) {
+ u32 ret;
+
+ if (CheckGlobalFlag(ENDING))
+ return 0;
+ ret = 0;
+ if (gArea.locationIndex != 0)
+ ret = !!(gRoomTransition.player_status.field_0x24[10] ^ gArea.locationIndex);
+ return ret;
+}
+
+void CheckAreaDiscovery(void) {
+ if (!sub_08053144())
+ return;
+
+ gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex;
+
+ if (!CheckGlobalFlag(TABIDACHI))
+ return;
+
+ if (!CheckGlobalFlag(ENDING)) {
+ Entity* e = (Entity*)GetEmptyManager();
+ if (e != NULL) {
+ e->kind = MANAGER;
+ e->id = ENTER_ROOM_TEXTBOX_MANAGER;
+ AppendEntityToList(e, 8);
+ if (!gRoomVars.field_0x0 && !ReadBit(gSave.areaVisitFlags, gArea.locationIndex)) {
+ e->type2 = 1;
+ SetPlayerControl(3);
+ SetInitializationPriority();
+ }
+ }
+ }
+ WriteBit(gSave.areaVisitFlags, gArea.locationIndex);
+}
+
+void UpdatePlayerRoomStatus(void) {
+ gPlayerState.startPosX = gPlayerEntity.x.HALF.HI;
+ gPlayerState.startPosY = gPlayerEntity.y.HALF.HI;
+ if (sub_08053144()) {
+ MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status);
+ if (AreaIsDungeon()) {
+ gRoomTransition.player_status.dungeon_area = gRoomControls.area;
+ gRoomTransition.player_status.dungeon_room = gRoomControls.room;
+ gRoomTransition.player_status.dungeon_x = gPlayerEntity.x.HALF.HI;
+ gRoomTransition.player_status.dungeon_y = gPlayerEntity.y.HALF.HI;
+ }
+ }
+}
+
+void sub_08053250(void) {
+ gRoomTransition.player_status.spawn_type = PL_SPAWN_DEFAULT;
+ gRoomTransition.player_status.start_pos_x = gPlayerEntity.x.HALF.HI - gRoomControls.origin_x;
+ gRoomTransition.player_status.start_pos_y = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y;
+ gRoomTransition.player_status.start_anim = gPlayerEntity.animationState;
+ gRoomTransition.player_status.layer = gPlayerEntity.collisionLayer;
+ gRoomTransition.player_status.area_next = gRoomControls.area;
+ gRoomTransition.player_status.room_next = gRoomControls.room;
+ MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status);
+}
+
+void sub_0805329C(void) {
+ if (sub_08053144()) {
+ switch (gRoomControls.area) {
+ case AREA_DEEPWOOD_SHRINE:
+ gSave.unk7 = 0;
+ break;
+ case AREA_CAVE_OF_FLAMES:
+ sub_080530B0();
+ break;
+ case AREA_OUTER_FORTRESS_OF_WINDS:
+ sub_080532E4();
+ break;
+ default:
+ ResetTimerFlags();
+ break;
+ }
+ }
+}
+
+void sub_080532E4(void) {
+ s32 x, y;
+
+ RoomHeader* r_hdr = gAreaRoomHeaders[AREA_FORTRESS_OF_WINDS] + 33;
+
+ gRoomTransition.player_status.dungeon_area = AREA_FORTRESS_OF_WINDS;
+ gRoomTransition.player_status.dungeon_room = 33;
+
+ gRoomTransition.player_status.dungeon_x = r_hdr->map_x + r_hdr->pixel_width / 2;
+ gRoomTransition.player_status.dungeon_map_x = gRoomTransition.player_status.dungeon_x;
+ gRoomTransition.player_status.dungeon_y = r_hdr->map_y + r_hdr->pixel_height + 0xa0;
+ gRoomTransition.player_status.dungeon_map_y = gRoomTransition.player_status.dungeon_y;
+}
+
+void LoadGfxGroups(void) {
+ MemClear(&gBG0Buffer, sizeof gBG0Buffer);
+ MemClear(&gBG1Buffer, sizeof gBG1Buffer);
+ MemClear(&gBG2Buffer, sizeof gBG2Buffer);
+ MemClear(&gBG3Buffer, sizeof gBG3Buffer);
+ LoadGfxGroup(16);
+ LoadGfxGroup(23);
+ if (gRoomControls.area == AREA_CASTOR_WILDS)
+ LoadGfxGroup(26);
+ LoadItemGfx();
+ LoadPaletteGroup(11);
+ LoadPaletteGroup(12);
+ SetColor(0, 0);
+}
+
+void LoadItemGfx(void) {
+ LoadGfxGroup(GetInventoryValue(ITEM_REMOTE_BOMBS) ? 24 : 25);
+ if (GetInventoryValue(ITEM_LIGHT_ARROW))
+ LoadGfxGroup(29);
+ LoadGfxGroup(GetInventoryValue(ITEM_MAGIC_BOOMERANG) ? 28 : 27);
+}
+
+extern u16 gUnk_020178E0[];
+void sub_080533CC(void) {
+ u16* p1 = gUnk_020178E0;
+ u16* p2 = gUnk_020178E0 - 0x100;
+ *p2++ = *p1++;
+ *p2++ = *p1++;
+ *p2++ = *p1++;
+ *p2++ = *p1++;
+ *p2++ = *p1++;
+ gUsedPalettes |= 8;
+}
+
+void UpdateTimerCallbacks(void) {
+ static void (*const sHandlers[])(u32*) = {
+ sub_08053434, DummyHandler, sub_080534E4, DummyHandler, DummyHandler, DummyHandler, DummyHandler, DummyHandler,
+ };
+
+ u32* p;
+ u32 i;
+
+ p = gSave.timers;
+ for (i = 0; i < 8; i++, p++) {
+ (sHandlers[i])(p);
+ }
+}
+
+void DummyHandler(u32* a1) {
+}
+
+void sub_08053434(u32* a1) {
+ if (gArea.locationIndex == 29 && *a1) {
+ if (!--*a1) {
+ ResetTimerFlags();
+ MenuFadeIn(5, 6);
+ }
+ }
+}
+
+void ResetTimerFlags(void) {
+ static const u16 sClearFlags[] = {
+ FLAG_BANK_10, LV6_GUFUU1_GISHIKI, //
+ FLAG_BANK_10, LV6_GUFUU1_DEMO, //
+ FLAG_BANK_10, LV6_ZELDA_DISCURSE, //
+ FLAG_BANK_10, LV6_00_ESCAPE, //
+ FLAG_BANK_10, LV6_GUFUU2_DEAD, //
+ FLAG_BANK_G, ENDING, //
+ FLAG_BANK_10, LV6_KANE_START, //
+ FLAG_BANK_10, LV6_KANE_1ST, //
+ FLAG_BANK_10, LV6_KANE_2ND, //
+ FLAG_BANK_10, LV6_SOTO_ENDING, //
+ 0xFFFF,
+ };
+
+ gSave.timers[0] = 0;
+ if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_ZELDA_DISCURSE))
+ ClearGlobalFlag(ZELDA_CHASE);
+ ClearFlagArray(sClearFlags);
+}
+
+void StartDarkNutTimer(void) {
+ gSave.timers[0] = 10800;
+}
+
+void sub_080534AC(void) {
+ if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) {
+ ClearLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START);
+ gSave.timers[0] = 0;
+ SoundReq(SONG_STOP_BGM);
+ }
+}
+
+void sub_080534E4(u32* a1) {
+ if (gRoomControls.area != AREA_VEIL_FALLS_TOP) {
+ if (*a1)
+ --*a1;
+ }
+}
+
+void InitBiggoronTimer(void) {
+ gSave.timers[2] = 36000;
+}
+
+void ResetTmpFlags(void) {
+ static const u16 sClearFlags[] = {
+ FLAG_BANK_2, BILL00_SHICHOU_00, //
+ FLAG_BANK_2, BILL0A_YADO_TAKARA_00, //
+ FLAG_BANK_2, BILL0C_SCHOOLR_00, //
+ FLAG_BANK_1, MACHI00_00, //
+ FLAG_BANK_1, MACHI00_02, //
+ FLAG_BANK_2, MHOUSE06_00, //
+ FLAG_BANK_2, MHOUSE14_00, //
+ FLAG_BANK_2, MHOUSE2_00_02, //
+ FLAG_BANK_2, MHOUSE2_01_T0, //
+ FLAG_BANK_2, MHOUSE2_02_KAME, //
+ FLAG_BANK_2, SHOP00_ITEM_01, //
+ FLAG_BANK_2, SHOP01_CAFE_01, //
+ 0xFFFF,
+ };
+
+ ResetTimerFlags();
+ ClearFlagArray(sClearFlags);
+
+ if (!CheckGlobalFlag(WATERBEAN_PUT))
+ ClearGlobalFlag(WATERBEAN_OUT);
+ if (!GetInventoryValue(ITEM_EARTH_ELEMENT))
+ ClearGlobalFlag(LV1_CLEAR);
+ if (!GetInventoryValue(ITEM_FIRE_ELEMENT))
+ ClearGlobalFlag(LV2_CLEAR);
+ if (!GetInventoryValue(ITEM_WATER_ELEMENT))
+ ClearGlobalFlag(LV4_CLEAR);
+}
+
+void ClearFlagArray(const u16* p) {
+ const u16* i;
+
+ for (i = p; i[0] != 0xFFFF; i += 2)
+ ClearLocalFlagByBank(i[0], i[1]);
+}
diff --git a/src/itemMetaData.c b/src/itemMetaData.c
index ec3e1fe8..0a0d7af7 100644
--- a/src/itemMetaData.c
+++ b/src/itemMetaData.c
@@ -1,4 +1,4 @@
-#include "global.h"
+#include "game.h"
#include "itemMetaData.h"
#include "item.h"
#include "message.h"
@@ -123,3 +123,143 @@ const ItemMetaData gItemMetaData[] = {
[ITEM_SKILL_FAST_SPLIT] = { 0x63u, 0u, 0u, 0x2u, 0x74u, TEXT_ITEM_GET, 0x74u, 0x5u },
[ITEM_SKILL_LONG_SPIN] = { 0x63u, 0u, 0u, 0x2u, 0x75u, TEXT_ITEM_GET, 0x75u, 0x5u },
};
+
+// TODO Shop price and item get message
+const struct_080FD964 gUnk_080FD964[] = {
+ [ITEM_NONE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x1) },
+ [ITEM_SMITH_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x1) },
+ [ITEM_GREEN_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x2) },
+ [ITEM_RED_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3) },
+ [ITEM_BLUE_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4) },
+ [ITEM_UNUSED_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5) },
+ [ITEM_FOURSWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x6) },
+ [ITEM_BOMBS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x1c) },
+ [ITEM_REMOTE_BOMBS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x8) },
+ [ITEM_BOW] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x9) },
+ [ITEM_LIGHT_ARROW] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xa) },
+ [ITEM_BOOMERANG] = { 300, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x24), TEXT_INDEX(TEXT_ITEM_GET, 0xb) },
+ [ITEM_MAGIC_BOOMERANG] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xc) },
+ [ITEM_SHIELD] = { 40, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x02), TEXT_INDEX(TEXT_ITEM_GET, 0x1d) },
+ [ITEM_MIRROR_SHIELD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xe) },
+ [ITEM_LANTERN_OFF] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xf) },
+ [ITEM_LANTERN_ON] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x10) },
+ [ITEM_GUST_JAR] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x11) },
+ [ITEM_PACCI_CANE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x12) },
+ [ITEM_MOLE_MITTS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x13) },
+ [ITEM_ROCS_CAPE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x14) },
+ [ITEM_PEGASUS_BOOTS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x15) },
+ [ITEM_FIRE_ROD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x16) },
+ [ITEM_OCARINA] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x17) },
+ [ITEM_ORB_GREEN] = { 0, 0, 0x0, 0x0 },
+ [ITEM_ORB_BLUE] = { 0, 0, 0x0, 0x0 },
+ [ITEM_ORB_RED] = { 0, 0, 0x0, 0x0 },
+ [ITEM_TRY_PICKUP_OBJECT] = { 0, 0, 0x0, 0x0 },
+ [ITEM_BOTTLE1] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) },
+ [ITEM_BOTTLE2] = { 100, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x06), TEXT_INDEX(TEXT_ITEM_GET, 0x20) },
+ [ITEM_BOTTLE3] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) },
+ [ITEM_BOTTLE4] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) },
+ [ITEM_BOTTLE_EMPTY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) },
+ [ITEM_BOTTLE_BUTTER] = { 120, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x21) },
+ [ITEM_BOTTLE_MILK] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x22) },
+ [ITEM_BOTTLE_HALF_MILK] = { 60, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x23) },
+ [ITEM_BOTTLE_RED_POTION] = { 150, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x24) },
+ [ITEM_BOTTLE_BLUE_POTION] = { 60, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x25) },
+ [ITEM_BOTTLE_WATER] = { 1, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x26) },
+ [ITEM_BOTTLE_MINERAL_WATER] = { 5, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x27) },
+ [ITEM_BOTTLE_FAIRY] = { 7, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x28) },
+#ifdef EU
+ [ITEM_BOTTLE_PICOLYTE_RED] = { 100, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x01), TEXT_INDEX(TEXT_ITEM_GET, 0x29) },
+ [ITEM_BOTTLE_PICOLYTE_ORANGE] = { 300, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x06), TEXT_INDEX(TEXT_ITEM_GET, 0x2a) },
+ [ITEM_BOTTLE_PICOLYTE_YELLOW] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x04), TEXT_INDEX(TEXT_ITEM_GET, 0x2b) },
+ [ITEM_BOTTLE_PICOLYTE_GREEN] = { 100, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x03), TEXT_INDEX(TEXT_ITEM_GET, 0x2c) },
+ [ITEM_BOTTLE_PICOLYTE_BLUE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x2d) },
+ [ITEM_BOTTLE_PICOLYTE_WHITE] = { 100, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x02), TEXT_INDEX(TEXT_ITEM_GET, 0x2e) },
+#else
+ [ITEM_BOTTLE_PICOLYTE_RED] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x01), TEXT_INDEX(TEXT_ITEM_GET, 0x29) },
+ [ITEM_BOTTLE_PICOLYTE_ORANGE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x06), TEXT_INDEX(TEXT_ITEM_GET, 0x2a) },
+ [ITEM_BOTTLE_PICOLYTE_YELLOW] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x04), TEXT_INDEX(TEXT_ITEM_GET, 0x2b) },
+ [ITEM_BOTTLE_PICOLYTE_GREEN] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x03), TEXT_INDEX(TEXT_ITEM_GET, 0x2c) },
+ [ITEM_BOTTLE_PICOLYTE_BLUE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x2d) },
+ [ITEM_BOTTLE_PICOLYTE_WHITE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x02), TEXT_INDEX(TEXT_ITEM_GET, 0x2e) },
+#endif
+ [BOTTLE_CHARM_NAYRU] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x2f) },
+ [BOTTLE_CHARM_FARORE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x30) },
+ [BOTTLE_CHARM_DIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x31) },
+ [ITEM_32] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x32) },
+ [ITEM_33] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x33) },
+ [ITEM_QST_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x34) },
+ [ITEM_QST_BROKEN_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x35) },
+ [ITEM_QST_DOGFOOD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x36) },
+ [ITEM_QST_LONLON_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x37) },
+ [ITEM_QST_MUSHROOM] = { 60, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x38) },
+ [ITEM_QST_BOOK1] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x39) },
+ [ITEM_QST_BOOK2] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3a) },
+ [ITEM_QST_BOOK3] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3b) },
+ [ITEM_QST_GRAVEYARD_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3d) },
+ [ITEM_QST_TINGLE_TROPHY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x95) },
+ [ITEM_QST_CARLOV_MEDAL] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x96) },
+ [ITEM_SHELLS] = { 15, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x77) },
+ [ITEM_EARTH_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x40) },
+ [ITEM_FIRE_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x41) },
+ [ITEM_WATER_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x42) },
+ [ITEM_WIND_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x43) },
+ [ITEM_GRIP_RING] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x44) },
+ [ITEM_POWER_BRACELETS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x45) },
+ [ITEM_FLIPPERS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x46) },
+ [ITEM_MAP] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x47) },
+ [ITEM_SKILL_SPIN_ATTACK] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x48) },
+ [ITEM_SKILL_ROLL_ATTACK] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x49) },
+ [ITEM_SKILL_DASH_ATTACK] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4a) },
+ [ITEM_SKILL_ROCK_BREAKER] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4b) },
+ [ITEM_SKILL_SWORD_BEAM] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4c) },
+ [ITEM_SKILL_GREAT_SPIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4d) },
+ [ITEM_SKILL_DOWN_THRUST] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4e) },
+ [ITEM_SKILL_PERIL_BEAM] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4f) },
+ [ITEM_DUNGEON_MAP] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x50) },
+ [ITEM_COMPASS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x51) },
+ [ITEM_BIG_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x52) },
+ [ITEM_SMALL_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x53) },
+ [ITEM_RUPEE1] = { 1, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x54) },
+ [ITEM_RUPEE5] = { 5, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x55) },
+ [ITEM_RUPEE20] = { 20, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x56) },
+ [ITEM_RUPEE50] = { 50, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x57) },
+ [ITEM_RUPEE100] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x58) },
+ [ITEM_RUPEE200] = { 200, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x59) },
+ [ITEM_5A] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5a) },
+ [ITEM_JABBERNUT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5b) },
+ [ITEM_KINSTONE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5c) },
+ [ITEM_BOMBS5] = { 15, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5d) },
+ [ITEM_ARROWS5] = { 15, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5e) },
+ [ITEM_HEART] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5f) },
+ [ITEM_FAIRY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x60) },
+#ifdef EU
+ [ITEM_SHELLS30] = { 300, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x76) },
+#else
+ [ITEM_SHELLS30] = { 200, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x76) },
+#endif
+ [ITEM_HEART_CONTAINER] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x62) },
+ [ITEM_HEART_PIECE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x18) },
+ [ITEM_WALLET] = { 80, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x04), TEXT_INDEX(TEXT_ITEM_GET, 0x64) },
+#ifdef EU
+ [ITEM_BOMBBAG] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x07) },
+#else
+ [ITEM_BOMBBAG] = { 600, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x25), TEXT_INDEX(TEXT_ITEM_GET, 0x63) },
+#endif
+ [ITEM_LARGE_QUIVER] = { 600, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x07), TEXT_INDEX(TEXT_ITEM_GET, 0x66) },
+ [ITEM_KINSTONE_BAG] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x67) },
+ [ITEM_BRIOCHE] = { 20, 0, TEXT_INDEX(TEXT_BAKERY, 0x01), TEXT_INDEX(TEXT_ITEM_GET, 0x68) },
+ [ITEM_CROISSANT] = { 30, 0, TEXT_INDEX(TEXT_BAKERY, 0x0a), TEXT_INDEX(TEXT_ITEM_GET, 0x69) },
+ [ITEM_PIE] = { 40, 0, TEXT_INDEX(TEXT_BAKERY, 0x0b), TEXT_INDEX(TEXT_ITEM_GET, 0x6a) },
+ [ITEM_CAKE] = { 60, 0, TEXT_INDEX(TEXT_BAKERY, 0x0c), TEXT_INDEX(TEXT_ITEM_GET, 0x6b) },
+ [ITEM_BOMBS10] = { 30, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x03), TEXT_INDEX(TEXT_ITEM_GET, 0x91) },
+ [ITEM_BOMBS30] = { 80, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x09), TEXT_INDEX(TEXT_ITEM_GET, 0x92) },
+ [ITEM_ARROWS10] = { 20, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x08), TEXT_INDEX(TEXT_ITEM_GET, 0x93) },
+ [ITEM_ARROWS30] = { 50, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x0a), TEXT_INDEX(TEXT_ITEM_GET, 0x94) },
+ [ITEM_ARROW_BUTTERFLY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x70) },
+ [ITEM_DIG_BUTTERFLY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x71) },
+ [ITEM_SWIM_BUTTERFLY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x72) },
+ [ITEM_SKILL_FAST_SPIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x73) },
+ [ITEM_SKILL_FAST_SPLIT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x74) },
+ [ITEM_SKILL_LONG_SPIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x75) },
+
+};
diff --git a/src/itemUtils.c b/src/itemUtils.c
new file mode 100644
index 00000000..36ed6bbf
--- /dev/null
+++ b/src/itemUtils.c
@@ -0,0 +1,591 @@
+/**
+ * @file itemUtils.c
+ *
+ * @brief Item Utils
+ */
+#include "item.h"
+#include "game.h"
+#include "itemMetaData.h"
+#include "sound.h"
+#include "save.h"
+#include "object.h"
+#include "enemy.h"
+#include "message.h"
+
+const s16 gWalletSizes[] = { 100, -4000, 300, -3996, 500, -3992, 999, -3988 };
+const u8 gBombBagSizes[] = {
+ 10,
+ 30,
+ 50,
+ 99,
+};
+const u8 gQuiverSizes[] = {
+ 30,
+ 50,
+ 70,
+ 99,
+};
+const u16 gUnk_080FD5A8[] = { 1, 5, 20, 50, 100, 200 };
+
+u32 GetSaleItemConfirmMessageID(u32 item) {
+ const struct_080FD964* ptr = &gUnk_080FD964[item];
+ return ptr->saleItemConfirmMessageId;
+}
+
+s32 GetItemPrice(u32 item) {
+ const struct_080FD964* ptr = &gUnk_080FD964[item];
+ return ptr->itemPrice;
+}
+
+u32 GiveItem(Item item, u32 param_2) {
+ u32 uVar4;
+ u32 result;
+ u32 uVar9;
+ const ItemMetaData* metaData;
+
+ uVar4 = GetInventoryValue(item);
+ metaData = &gItemMetaData[item];
+
+ if (uVar4 == 0) {
+ result = *(u16*)&metaData->textId;
+ } else {
+ result = *(u16*)&metaData->unk6;
+ }
+ if (!ItemIsBottle(item)) {
+ PutItemOnSlot(item);
+ if (uVar4 == 0) {
+ SetInventoryValue(item, 1);
+ }
+ }
+ switch (metaData->unk1) {
+ case 0:
+ default:
+ break;
+ case 1:
+ ModHealth(metaData->unk2);
+ SoundReq(SFX_HEART_GET);
+ break;
+ case 2:
+ ModRupees((u32)gUnk_080FD5A8[metaData->unk2]);
+ SoundReq(SFX_RUPEE_GET);
+ break;
+ case 3:
+ uVar9 = 0;
+ while (TRUE) {
+ if (3 < uVar9) {
+ return result;
+ }
+ if (GetInventoryValue(ITEM_BOTTLE1 + uVar9) == 0)
+ break;
+ uVar9++;
+ }
+ item = ITEM_BOTTLE1 + uVar9;
+ if (gSave.stats.bottles[uVar9] == 0) {
+ gSave.stats.bottles[uVar9] = 0x20;
+ }
+ SetInventoryValue(item, 1);
+ PutItemOnSlot(item);
+ break;
+ case 4:
+ uVar9 = 0;
+ while (gSave.stats.bottles[uVar9] != 0x20) {
+ uVar9++;
+ if (3 < uVar9) {
+ return result;
+ }
+ }
+ if (3 < uVar9) {
+ break;
+ }
+ gSave.stats.bottles[uVar9] = (u8)item;
+ SetInventoryValue(item, 1);
+ SoundReq(SFX_ITEM_GET);
+ break;
+ case 5:
+ ModDungeonKeys(1);
+ SoundReq(SFX_103);
+ break;
+ case 6: // TODO dungeon item?
+ gSave.dungeonItems[gArea.dungeon_idx] |= metaData->unk2;
+ break;
+ case 0xd:
+ sub_0801E738(0x72);
+ break;
+ case 0x12:
+ if (item == ITEM_BOOMERANG) {
+ SetInventoryValue(ITEM_MAGIC_BOOMERANG, 0);
+ } else {
+ SetInventoryValue(ITEM_BOOMERANG, 0);
+ }
+ case 0x11:
+ LoadItemGfx();
+ break;
+ case 7:
+ if (item == ITEM_BOMBS) {
+ SetInventoryValue(ITEM_REMOTE_BOMBS, 0);
+ } else {
+ SetInventoryValue(ITEM_BOMBS, 0);
+ }
+ ModBombs(99);
+ LoadItemGfx();
+ break;
+ case 8:
+ if (uVar4 == 0) {
+ SetInventoryValue(ITEM_BOMBS, 1);
+ PutItemOnSlot(7);
+ } else {
+ gSave.stats.bombBagType++;
+ if (3 < gSave.stats.bombBagType) {
+ gSave.stats.bombBagType = 3;
+ }
+ }
+ ModBombs(99);
+ break;
+ case 9:
+ ModBombs(metaData->unk2);
+ SoundReq(SFX_103);
+ break;
+ case 0xb:
+ if (GetInventoryValue(ITEM_LARGE_QUIVER) == 0) {
+ SetInventoryValue(ITEM_LARGE_QUIVER, 1);
+ }
+ ModArrows(99);
+ LoadItemGfx();
+ break;
+ case 0xa:
+ gSave.stats.quiverType++;
+ if (3 < gSave.stats.quiverType) {
+ gSave.stats.quiverType = 3;
+ }
+ ModArrows(99);
+ break;
+ case 0xc:
+ ModArrows(metaData->unk2);
+ SoundReq(SFX_103);
+ break;
+ case 0x0e:
+ SetInventoryValue(ITEM_SHELLS, 1);
+ ModShells(param_2);
+ SoundReq(SFX_103);
+ break;
+ case 0x0f:
+ sub_0801E738(param_2);
+ break;
+ case 0x10:
+ gSave.stats.walletType++;
+ if (gSave.stats.walletType < 4) {
+ break;
+ }
+ gSave.stats.walletType = 3;
+ break;
+ }
+ return result;
+}
+
+// TODO Adapt ItemMetaData struct
+void sub_08054288(s32 param_1) {
+ const ItemMetaData* ptr1 = gItemMetaData;
+ u16* ptr = (u16*)&((ptr1)[param_1]);
+ MessageFromTarget(ptr[3]);
+}
+
+u32 getItemMetaDataGetTextIndex(s32 itemIndex) {
+ const ItemMetaData* ptr1 = gItemMetaData;
+ u16* ptr = (u16*)&((ptr1)[itemIndex]);
+ return ptr[2];
+}
+
+u32 sub_080542AC(u32 param_1) {
+ const ItemMetaData* ptr1 = gItemMetaData;
+ u8* ptr = (u8*)&((ptr1)[param_1]);
+ return ptr[3] & 1;
+}
+
+void ModShells(s32 shells) {
+ if (shells == 0) {
+ shells = 1;
+ }
+ shells += gSave.stats.shells;
+ if (shells < 0) {
+ shells = 0;
+ } else if (999 < shells) {
+ shells = 999;
+ }
+ gSave.stats.shells = shells;
+}
+
+void ModBombs(s32 bombs) {
+ s32 bombCount = bombs;
+ s32 bagSize;
+ bombCount += gSave.stats.bombCount;
+ bagSize = gBombBagSizes[gSave.stats.bombBagType];
+ if (bombCount < 0) {
+ bombCount = 0;
+ } else if (bagSize < bombCount) {
+ bombCount = bagSize;
+ }
+ gSave.stats.bombCount = bombCount;
+}
+
+void ModArrows(s32 arrows) {
+ s32 quiverSize;
+ s32 arrowCount = arrows;
+ arrowCount += gSave.stats.arrowCount;
+ quiverSize = gQuiverSizes[gSave.stats.quiverType];
+ if (arrowCount < 0) {
+ arrowCount = 0;
+ } else if (quiverSize < arrowCount) {
+ arrowCount = quiverSize;
+ }
+ gSave.stats.arrowCount = arrowCount;
+}
+
+/**
+ * @brief Returns the slot the item is equipped in.
+ *
+ * 0: A
+ * 1: B
+ * 2: Not equipped
+ */
+EquipSlot IsItemEquipped(u32 itemId) {
+ EquipSlot equipSlot;
+
+ if (itemId == gSave.stats.itemButtons[SLOT_A]) {
+ equipSlot = EQUIP_SLOT_A;
+ } else if (itemId == gSave.stats.itemButtons[SLOT_B]) {
+ equipSlot = EQUIP_SLOT_B;
+ } else {
+ equipSlot = EQUIP_SLOT_NONE;
+ }
+ return equipSlot;
+}
+
+void PutItemOnSlot(u32 itemId) {
+ EquipSlot equipSlot;
+ u32 itemId2 = itemId;
+ if (itemId2 < 0x47) {
+ SetInventoryValue(0, 1);
+ }
+ if (itemId2 - 1 < 0x1f) {
+ equipSlot = EQUIP_SLOT_NONE;
+ if (gSave.stats.itemButtons[SLOT_A] == ITEM_NONE) {
+ equipSlot = EQUIP_SLOT_A;
+ } else if (gSave.stats.itemButtons[SLOT_B] == ITEM_NONE) {
+ equipSlot = EQUIP_SLOT_B;
+ }
+ if (equipSlot == EQUIP_SLOT_NONE) {
+ u32 temp = gItemMetaData[itemId2].menuSlot;
+ if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_A]].menuSlot) {
+ equipSlot = EQUIP_SLOT_A;
+ } else {
+ if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_B]].menuSlot) {
+ equipSlot = EQUIP_SLOT_B;
+ }
+ }
+ if (equipSlot == EQUIP_SLOT_NONE) {
+ return;
+ }
+ }
+ ForceEquipItem(itemId2, equipSlot);
+ }
+}
+
+void ForceEquipItem(u32 itemId, u32 equipSlot) {
+ u32 otherItem;
+ u32 otherItemSlot;
+ u32 replacedItem;
+
+ if ((itemId - 1 < 0x1f) && (equipSlot < EQUIP_SLOT_NONE)) {
+ otherItemSlot = equipSlot == EQUIP_SLOT_A;
+ replacedItem = gSave.stats.itemButtons[equipSlot];
+ otherItem = gSave.stats.itemButtons[otherItemSlot];
+ if (gItemMetaData[otherItem].menuSlot == gItemMetaData[itemId].menuSlot) {
+ otherItem = replacedItem;
+ }
+ gSave.stats.itemButtons[equipSlot] = itemId;
+ gSave.stats.itemButtons[otherItemSlot] = otherItem;
+ gUnk_0200AF00.unk_13 = 0x7f;
+ gUnk_0200AF00.unk_14 = 0x7f;
+ }
+}
+
+u32 SetBottleContents(u32 itemId, u32 bottleIndex) {
+ if (bottleIndex > 3) {
+ bottleIndex = 0;
+ for (bottleIndex = 0; gSave.stats.bottles[bottleIndex] != ITEM_BOTTLE_EMPTY;) {
+ if (++bottleIndex > 3) {
+ return bottleIndex;
+ }
+ }
+ if (bottleIndex > 3) {
+ return bottleIndex;
+ }
+ }
+ gSave.stats.bottles[bottleIndex] = itemId;
+ return bottleIndex;
+}
+
+bool32 ItemIsSword(u32 item) {
+ switch (item) {
+ case ITEM_SMITH_SWORD:
+ case ITEM_GREEN_SWORD:
+ case ITEM_RED_SWORD:
+ case ITEM_BLUE_SWORD:
+ case ITEM_FOURSWORD:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+bool32 ItemIsShield(u32 id) {
+ switch (id) {
+ case ITEM_SHIELD:
+ case ITEM_MIRROR_SHIELD:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+bool32 ItemIsBottle(u32 id) {
+ switch (id) {
+ case ITEM_BOTTLE1:
+ case ITEM_BOTTLE2:
+ case ITEM_BOTTLE3:
+ case ITEM_BOTTLE4:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+u32 GetBottleContaining(u32 id) {
+ if (id == gSave.stats.bottles[0]) {
+ return 1;
+ } else if (id == gSave.stats.bottles[1]) {
+ return 2;
+ } else if (id == gSave.stats.bottles[2]) {
+ return 3;
+ } else if (id == gSave.stats.bottles[3]) {
+ return 4;
+ } else {
+ return 0;
+ }
+}
+
+extern u8 gUnk_080FE1C6[];
+void sub_08054524(void) {
+ u32 bVar1;
+
+ bVar1 = gArea.locationIndex;
+ if (gArea.locationIndex == 0) {
+ bVar1 = gRoomTransition.player_status.field_0x24[0xa];
+ }
+ if (bVar1 > 0x16) {
+ bVar1 = 0;
+ }
+
+ bVar1 = gUnk_080FE1C6[bVar1];
+ MemCopy(&gAreaDroptables[bVar1], &gRoomVars.currentAreaDroptable, sizeof(Droptable));
+}
+
+void DisableRandomDrops(void) {
+ gRoomVars.randomDropsDisabled = TRUE;
+}
+
+void EnableRandomDrops(void) {
+ gRoomVars.randomDropsDisabled = FALSE;
+}
+
+extern void sub_08000F14(s16*, const s16*, const s16*, const s16*);
+extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*);
+u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter);
+u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) {
+ extern const u8 gUnk_080FE1B4[] /* = {
+ ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY,
+ ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED,
+ ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+ }*/;
+
+ int r0, r1, rand, summOdds, item;
+ u32 r3;
+ const Droptable *ptr2, *ptr3, *ptr4;
+ Droptable droptable;
+ r3 = arg1;
+ if (gRoomVars.randomDropsDisabled != TRUE) {
+ ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
+ ptr4 = NULL;
+ switch (r3) {
+ case 1 ... 12:
+ ptr4 = &gEnemyDroptables[r3];
+ break;
+#ifndef EU
+ case 24:
+ case 25:
+ r0 = gRoomVars.unk2;
+ ptr4 = &gUnk_0800191C[0];
+ if (r0) {
+ ptr4++;
+ }
+ break;
+#endif
+ case 16 ... 23:
+#ifdef EU
+ case 24:
+#endif
+ ptr2 = &gObjectDroptables[r3 - 16];
+ case 15:
+ ptr4 = &gRoomVars.currentAreaDroptable;
+ break;
+ case 0:
+ default:
+ break;
+ }
+ if (ptr4 != 0) {
+ if ((r1 = gSave.stats.picolyteType) == 0) {
+ // nop
+ ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
+ } else {
+#ifdef EU
+ ptr3 = &gEnemyDroptables[r1 + 9];
+#else
+ ptr3 = &gEnemyDroptables[r1 + 6];
+#endif
+ }
+ // vector addition, s0 = ptr4 + ptr2 + ptr3
+ sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a);
+ if (gSave.stats.health <= 8) {
+ droptable.s.hearts += 5;
+ }
+ if (gSave.stats.bombCount == 0) {
+ droptable.s.bombs += 3;
+ }
+ if (gSave.stats.arrowCount == 0) {
+ droptable.s.arrows += 3;
+ }
+ if (gSave.stats.rupees <= 10) {
+ droptable.s.rupee5++;
+ }
+ ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
+ r0 = gSave.stats.hasAllFigurines;
+ ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
+ // don't drop shells anymore
+ if (r0 != 0) {
+ ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS];
+ }
+ // don't drop kinstones anymore
+ if (gSave.didAllFusions != 0) {
+ ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES];
+ }
+ // vector addition, s0 = s0 + ptr2 + ptr3
+ // resulting values are clamped to be >= 0
+ // returns sum over s0
+ summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a);
+ rand = Random();
+ item = (rand >> 0x18);
+ item &= 0xF;
+ rand = rand % summOdds;
+ {
+ u32 r3;
+ for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) {
+ if ((r1 += droptable.a[item]) > rand) {
+ break;
+ }
+ }
+ }
+ r1 = gUnk_080FE1B4[item];
+ if (r1 != ITEM_NONE) {
+ return CreateItemDrop(arg0, r1, 0);
+ }
+ }
+ }
+ return ITEM_NONE;
+}
+
+extern u8 gUnk_080FE1DD[];
+u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter) {
+ u32 adjustedParam = itemParameter;
+ Entity* itemEntity;
+
+ switch (itemId) {
+ case ITEM_ENEMY_BEETLE:
+ if (!GetInventoryValue(ITEM_SMITH_SWORD)) {
+ return ITEM_NONE;
+ }
+ break;
+ case ITEM_BOMBS5:
+ if (!GetInventoryValue(ITEM_BOMBBAG)) {
+ return ITEM_NONE;
+ }
+ break;
+ case ITEM_ARROWS5:
+ if (!GetInventoryValue(ITEM_BOW)) {
+ return ITEM_NONE;
+ }
+ break;
+ case ITEM_SHELLS: {
+ if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) {
+ return ITEM_NONE;
+ }
+ if (itemParameter == 0) {
+ adjustedParam = 1;
+ }
+ break;
+ }
+ case ITEM_KINSTONE:
+ case ITEM_KINSTONE_GREEN ... ITEM_KINSTONE_RED: {
+ u32 rand;
+
+ if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) {
+ return ITEM_NONE;
+ }
+ if (3 < gRoomVars.filler1[0]) {
+ return ITEM_NONE;
+ }
+
+ if (itemId != ITEM_KINSTONE) {
+ adjustedParam = itemId - ITEM_KINSTONE_GREEN;
+ rand = (Random() & 0x3f);
+ adjustedParam = gUnk_080FE1DD[(rand + adjustedParam * 0x40)];
+ if (adjustedParam == 0) {
+ itemId = ITEM_NONE;
+ } else {
+ itemId = ITEM_KINSTONE;
+ }
+ }
+ break;
+ }
+ }
+ if (itemId != ITEM_NONE) {
+ if (itemId != ITEM_ENEMY_BEETLE) {
+ itemEntity = CreateObject(GROUND_ITEM, itemId, adjustedParam);
+ if (itemEntity != NULL) {
+ if (arg0 == &gPlayerEntity) {
+ itemEntity->timer = 1;
+ } else {
+ itemEntity->timer = 0;
+ }
+ if (arg0->kind == OBJECT) {
+ if (arg0->id == 99) {
+ arg0->child = itemEntity;
+ } else if (arg0->id == 0x1e) {
+ itemEntity->direction = arg0->animationState << 3 | 0x80;
+ itemEntity->speed = 0xc0;
+ itemEntity->zVelocity = Q_16_16(1.5);
+ }
+ }
+ CopyPosition(arg0, itemEntity);
+ }
+ } else {
+ itemEntity = CreateEnemy(BEETLE, 0);
+ if (itemEntity != NULL) {
+ itemEntity->x.HALF.HI = arg0->x.HALF.HI;
+ itemEntity->y.HALF.HI = arg0->y.HALF.HI;
+ itemEntity->collisionLayer = arg0->collisionLayer;
+ UpdateSpriteForCollisionLayer(itemEntity);
+ }
+ }
+ }
+ return itemId;
+}
diff --git a/src/kinstone.c b/src/kinstone.c
index 043f6623..1be80aa3 100644
--- a/src/kinstone.c
+++ b/src/kinstone.c
@@ -25,12 +25,12 @@ extern const EntityData gUnk_080FEE58[];
extern const void* gUnk_080FED98[];
void sub_08018AB4(int);
-void sub_08018BB4(int);
-void sub_08018A58(int);
-void sub_08018B50(int);
-void sub_080189EC(int);
-void sub_0801876C(int, int);
-void sub_08018738(u32, int);
+void sub_08018BB4(u32 worldEventId);
+void sub_08018A58(u32 worldEventId);
+void sub_08018B50(u32 worldEventId);
+void sub_080189EC(u32 worldEventId);
+void sub_0801876C(u32 worldEventId, bool32 isKinstoneFused);
+void sub_08018738(u32 kinstoneId, u32 worldEventId);
void ShuffleEzloHints(int count, u16* basePtr);
void sub_08018500();
bool32 sub_080185B4(const struct_gUnk_080B3D20* param_1);
@@ -239,60 +239,60 @@ void sub_080186D4(void) {
}
void sub_080186EC(u32 param_1) {
- const struct_080C9CBC* psVar1;
+ const KinstoneWorldEvent* psVar1;
u32 i;
- for (i = 0, psVar1 = gUnk_080C9CBC; i <= 100; psVar1++, i++) {
- if (psVar1->unk3 == 8) {
- sub_08018738(i, psVar1->evt_type);
+ for (i = 0, psVar1 = gKinstoneWorldEvents; i <= 100; psVar1++, i++) {
+ if (psVar1->subtask == SUBTASK_WORLDEVENT) {
+ sub_08018738(i, psVar1->worldEventId);
}
}
}
-void sub_08018710(u32 param_1) {
- const struct_080C9CBC* psVar1;
+void sub_08018710(u32 previousworldEventId) {
+ const KinstoneWorldEvent* psVar1;
u32 i;
- for (i = 0, psVar1 = gUnk_080C9CBC; i <= 100; psVar1++, i++) {
- if (psVar1->unk3 == 8 && param_1 != psVar1->evt_type) {
- sub_08018738(i, psVar1->evt_type);
+ for (i = 0, psVar1 = gKinstoneWorldEvents; i <= 100; psVar1++, i++) {
+ if (psVar1->subtask == SUBTASK_WORLDEVENT && previousworldEventId != psVar1->worldEventId) {
+ sub_08018738(i, psVar1->worldEventId);
}
}
}
-void sub_08018738(u32 param_1, int param_2) {
- struct_080FE320* ptr = &gUnk_080FE320[param_2];
+void sub_08018738(u32 kinstoneId, u32 worldEventId) {
+ const WorldEvent* ptr = &gWorldEvents[worldEventId];
if (ptr->area == gRoomControls.area && ptr->room == gRoomControls.room) {
- sub_0801876C(param_2, CheckKinstoneFused(param_1));
+ sub_0801876C(worldEventId, CheckKinstoneFused(kinstoneId));
}
}
-void sub_0801876C(int param_1, int param_2) {
+void sub_0801876C(u32 worldEventId, bool32 isKinstoneFused) {
Entity* roomEnt;
Entity* ent;
u32 uVar3;
u32 tmp;
u8* puVar4;
u32 uVar5;
- struct_080FE320* ptr;
+ const WorldEvent* ptr;
- ptr = &gUnk_080FE320[param_1];
- switch (ptr->evt_type) {
- case 6:
- if (param_2 == 0) {
+ ptr = &gWorldEvents[worldEventId];
+ switch (ptr->type) {
+ case WORLD_EVENT_TYPE_6:
+ if (isKinstoneFused == 0) {
sub_08018AB4((ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6);
}
break;
- case 0:
+ case WORLD_EVENT_TYPE_0:
break;
- case 2:
- if (param_2 != 0) {
- sub_08018BB4(param_1);
+ case WORLD_EVENT_TYPE_2:
+ if (isKinstoneFused != 0) {
+ sub_08018BB4(worldEventId);
}
break;
- case 1:
- if (param_2 == 0) {
+ case WORLD_EVENT_TYPE_1:
+ if (isKinstoneFused == 0) {
return;
}
if (CheckGlobalFlag(ptr->flag)) {
@@ -300,8 +300,8 @@ void sub_0801876C(int param_1, int param_2) {
}
LoadRoomEntity(gUnk_080FEC28 + ptr->entity_idx);
break;
- case 3:
- if (param_2 == 0) {
+ case WORLD_EVENT_TYPE_3:
+ if (isKinstoneFused == 0) {
return;
}
if (GetInventoryValue(ptr->flag)) {
@@ -309,47 +309,47 @@ void sub_0801876C(int param_1, int param_2) {
}
LoadRoomEntity(gUnk_080FEBE8 + ptr->entity_idx);
break;
- case 4:
- if (param_2 == 0) {
- sub_08018A58(param_1);
+ case WORLD_EVENT_TYPE_4:
+ if (isKinstoneFused == 0) {
+ sub_08018A58(worldEventId);
}
break;
- case 5:
- if (param_2 != 0) {
- sub_08018B50(param_1);
+ case WORLD_EVENT_TYPE_5:
+ if (isKinstoneFused != 0) {
+ sub_08018B50(worldEventId);
}
break;
- case 7:
- if (param_2 != 0) {
+ case WORLD_EVENT_TYPE_7:
+ if (isKinstoneFused != 0) {
return;
}
if (ptr->entity_idx != 0x80) {
LoadRoomEntity(gUnk_080FECC8 + ptr->entity_idx);
} else {
- sub_080189EC(param_1);
+ sub_080189EC(worldEventId);
}
break;
- case 0x19:
+ case WORLD_EVENT_TYPE_25:
roomEnt = LoadRoomEntity(&gUnk_080FED18[ptr->entity_idx]);
if (roomEnt != 0) {
- roomEnt->type = param_2 ? 2 : 0;
+ roomEnt->type = isKinstoneFused ? 2 : 0;
}
break;
- case 8:
- if (param_2 == 0) {
+ case WORLD_EVENT_TYPE_8:
+ if (isKinstoneFused == 0) {
return;
}
SetTileType(0x168, (ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6, 1);
break;
- case 0xb:
- if (param_2 != 0) {
+ case WORLD_EVENT_TYPE_11:
+ if (isKinstoneFused != 0) {
LoadRoomEntity(&gUnk_080FED58[ptr->entity_idx]);
gRoomVars.field_0x8c[ptr->entity_idx] = (void*)gUnk_080FED98[ptr->entity_idx];
}
break;
- case 9:
- if (param_2 == 0) {
+ case WORLD_EVENT_TYPE_9:
+ if (isKinstoneFused == 0) {
return;
}
ent = LoadRoomEntity(&gUnk_080FEE78[ptr->entity_idx]);
@@ -366,38 +366,38 @@ void sub_0801876C(int param_1, int param_2) {
SetTileType(uVar3, uVar5, 1);
}
break;
- case 0x18:
- if (param_2 != 0) {
+ case WORLD_EVENT_TYPE_24:
+ if (isKinstoneFused != 0) {
LoadRoomEntityList(gUnk_080FEE18);
}
break;
- case 0xf:
- if (param_2 != 0) {
+ case WORLD_EVENT_TYPE_15:
+ if (isKinstoneFused != 0) {
LoadRoomEntity(gUnk_080FEE58);
} else {
LoadRoomEntity(gUnk_080FEE48);
}
break;
- case 0x11:
- if (param_2 != 0) {
+ case WORLD_EVENT_TYPE_17:
+ if (isKinstoneFused != 0) {
SetLocalFlagByBank(FLAG_BANK_1, SOUGEN_05_BOMB_00);
LoadRoomEntityList(gUnk_080FEE38);
}
break;
- case 0x1a:
- case 0x1b:
- case 0x1c:
+ case WORLD_EVENT_TYPE_26:
+ case WORLD_EVENT_TYPE_27:
+ case WORLD_EVENT_TYPE_28:
break;
}
}
-void sub_080189EC(int param_1) {
+void sub_080189EC(u32 worldEventId) {
u32 i;
int iVar1;
int tilePosition;
- struct_080FE320* ptr;
+ const WorldEvent* ptr;
- ptr = &gUnk_080FE320[param_1];
+ ptr = &gWorldEvents[worldEventId];
tilePosition = (ptr->x >> 4) & 0x3f;
tilePosition |= ((ptr->y >> 4) & 0x3f) << 6;
@@ -414,14 +414,14 @@ void sub_080189EC(int param_1) {
}
}
-void sub_08018A58(int param_1) {
+void sub_08018A58(u32 worldEventId) {
u32 i;
int iVar2;
u32 j;
int tilePosition;
- struct_080FE320* ptr;
+ const WorldEvent* ptr;
- ptr = &gUnk_080FE320[param_1];
+ ptr = &gWorldEvents[worldEventId];
tilePosition = (ptr->x >> 4) & 0x3f;
tilePosition |= ((ptr->y >> 4) & 0x3f) << 6;
@@ -470,14 +470,14 @@ void sub_08018B10(int param_1) {
}
}
-void sub_08018B50(int param_1) {
+void sub_08018B50(u32 worldEventId) {
u32 i;
int iVar2;
u32 j;
int tilePosition;
- struct_080FE320* ptr;
+ const WorldEvent* ptr;
- ptr = &gUnk_080FE320[param_1];
+ ptr = &gWorldEvents[worldEventId];
if ((ptr->entity_idx & 0x80) == 0) {
iVar2 = 0x200;
} else {
@@ -495,14 +495,15 @@ void sub_08018B50(int param_1) {
}
}
-void sub_08018BB4(int param_1) {
+// TODO world event that loads tile entity
+void sub_08018BB4(u32 worldEventId) {
u32 layer;
TileEntity tile;
- struct_080FE320* ptr;
+ const WorldEvent* ptr;
u32 position;
- MemCopy(gUnk_080FEAC8 + param_1, &tile, sizeof(TileEntity));
- ptr = &gUnk_080FE320[param_1];
+ MemCopy(gUnk_080FEAC8 + worldEventId, &tile, sizeof(TileEntity));
+ ptr = &gWorldEvents[worldEventId];
tile.tilePos = (ptr->x >> 4 & 0x3f) | (((ptr->y) >> 4 & 0x3f) << 6);
sub_0804B3C4(&tile);
if (CheckLocalFlag(tile.localFlag) == 0) {
diff --git a/src/main.c b/src/main.c
index 2e4cda6a..87d04e87 100644
--- a/src/main.c
+++ b/src/main.c
@@ -169,7 +169,7 @@ const SaveHeader sDefaultSettings = {
};
// single misplaced ldr
-NONMATCH("asm/non_matching/InitSaveHeader.inc", /*static*/ void InitSaveHeader(void)) {
+/*static*/ NONMATCH("asm/non_matching/InitSaveHeader.inc", void InitSaveHeader(void)) {
u32 b;
if (!CheckHeaderValid()) {
diff --git a/src/manager/enterRoomTextboxManager.c b/src/manager/enterRoomTextboxManager.c
index 0dcf7c9b..59f31e2f 100644
--- a/src/manager/enterRoomTextboxManager.c
+++ b/src/manager/enterRoomTextboxManager.c
@@ -7,6 +7,7 @@
#include "manager/enterRoomTextboxManager.h"
#include "area.h"
#include "common.h"
+#include "fileselect.h"
#include "functions.h"
#include "game.h"
#include "message.h"
@@ -14,18 +15,24 @@
extern u8 gUnk_02034DF0[0x2F2];
-extern const u16 gUnk_08108DE8[];
-extern void (*const EnterRoomTextboxManager_Actions[])(EnterRoomTextboxManager*);
-extern const u8 gUnk_08108E30[0x18];
-extern const u8 gUnk_08108E48[0x18];
-extern const u8 gUnk_08108E60[];
+const u16 gUnk_08108DE8[] = { 0, 0x70b, 0x70c, 0x70d, 0x70e, 0x70f, 0x710, 0x711, 0x712, 0x713, 0x714,
+ 0x715, 0x716, 0x717, 0x718, 0x719, 0x71a, 0x71b, 0x71c, 0x71d, 0x71e, 0x71f,
+ 0x726, 0x720, 0x720, 0x721, 0x722, 0x723, 0x725, 0x727, 0x724, 0x728 };
+void sub_0805E140(EnterRoomTextboxManager*);
+void sub_0805E18C(EnterRoomTextboxManager*);
+void (*const EnterRoomTextboxManager_Actions[])(EnterRoomTextboxManager*) = {
+ sub_0805E140,
+ sub_0805E18C,
+};
-extern void sub_0805F46C(void*, const void*);
+extern const Font gUnk_08108E30;
+extern const Font gUnk_08108E48;
+extern const u8 gUnk_08108E60[];
void sub_0805E140(EnterRoomTextboxManager*);
void sub_0805E18C(EnterRoomTextboxManager*); // unused?
void sub_0805E1D8(EnterRoomTextboxManager*);
-void sub_0805E1F8(u32, u32);
+void sub_0805E1F8(u32, bool32);
void EnterRoomTextboxManager_Main(EnterRoomTextboxManager* this) {
EnterRoomTextboxManager_Actions[super->action](this);
@@ -65,21 +72,21 @@ void sub_0805E1D8(EnterRoomTextboxManager* this) {
DeleteThisEntity();
}
-void sub_0805E1F8(u32 unk0, u32 unk1) {
+void sub_0805E1F8(u32 unk0, bool32 isDungeon) {
struct {
u8 unk_00[4];
u8 unk_04;
u8 unk_05;
u8 unk_06[3];
} PACKED tmp;
- const u8* tmp2;
+ const Font* font;
MemClear(&gUnk_02034DF0, 0x80);
MemCopy(gUnk_08108E60, &tmp, sizeof(tmp));
tmp.unk_04 = unk0 >> 8;
tmp.unk_05 = unk0;
- tmp2 = gUnk_08108E48;
- if (!unk1)
- tmp2 = gUnk_08108E30;
- sub_0805F46C(&tmp, tmp2);
+ font = &gUnk_08108E48;
+ if (!isDungeon)
+ font = &gUnk_08108E30;
+ ShowTextBox((u32)&tmp, font);
gScreen.bg0.updated = 1;
}
diff --git a/src/manager/staticBackgroundManager.c b/src/manager/staticBackgroundManager.c
index f069196c..a8bd1810 100644
--- a/src/manager/staticBackgroundManager.c
+++ b/src/manager/staticBackgroundManager.c
@@ -63,14 +63,14 @@ void sub_0805B474(StaticBackgroundManager* this) {
}
void sub_0805B4B4(StaticBackgroundManager* this) {
- sub_0805B4D0(super->type);
+ LoadStaticBackground(super->type);
if (super->type == 2) {
sub_0806D0F8();
}
StaticBackgroundManager_Main(this);
}
-void sub_0805B4D0(u32 param_1) {
+void LoadStaticBackground(u32 param_1) {
static const u8 gUnk_08108C5C[] = { 0x14, 0x15, 0x14, 0x2f, 0x4b, 0x4e, 0x4d, 0 };
s32 iVar1;
u32 uVar2;
diff --git a/src/manager/weatherChangeManager.c b/src/manager/weatherChangeManager.c
index b74edcc2..f1988de4 100644
--- a/src/manager/weatherChangeManager.c
+++ b/src/manager/weatherChangeManager.c
@@ -58,7 +58,7 @@ void sub_080595E4(WeatherChangeManager* this) {
gRoomVars.unk_10[0] = 0xFF;
sub_08059690(this);
sub_080596E0(this);
- sub_0805B4D0(0);
+ LoadStaticBackground(0);
}
void sub_08059608(WeatherChangeManager* this) {
diff --git a/src/menu/figurine_menu.c b/src/menu/figurineMenu.c
index 4a558423..2a19f06d 100644
--- a/src/menu/figurine_menu.c
+++ b/src/menu/figurineMenu.c
@@ -1,23 +1,27 @@
-#include "global.h"
-#include "main.h"
-#include "menu.h"
-#include "sound.h"
+/**
+ * @file figurineMenu.c
+ * @ingroup Subtasks
+ *
+ * @brief Figurine Menu Subtask
+ */
+#include "figurineMenu.h"
+
#include "common.h"
-#include "screen.h"
-#include "save.h"
#include "flags.h"
-#include "subtask.h"
-#include "object.h"
-#include "game.h"
#include "functions.h"
+#include "game.h"
+#include "main.h"
+#include "menu.h"
#include "message.h"
+#include "object.h"
+#include "pauseMenu.h"
+#include "save.h"
+#include "screen.h"
+#include "sound.h"
+#include "subtask.h"
+#include "subtask2.h"
#include "ui.h"
-extern const struct {
- u8 filler[7];
- u8 unk7;
-} gUnk_080FC3E4[];
-
void sub_080A4DA8(u32);
void sub_080A4B44(void);
void FigurineMenu_080A4978(void);
@@ -47,13 +51,7 @@ const KeyButtonLayout gUnk_0812813C = {
};
extern u8 gUnk_020344A0[8];
-typedef struct {
- u8 unk0;
- u8 unk1;
- u16 unk2;
- u16 unk4;
- u16 unk6;
-} struct_08128AD8;
+
extern const struct_08128AD8 gUnk_08128AD8[];
Subtask FigurineMenu0_Type0;
@@ -64,6 +62,7 @@ Subtask FigurineMenu1_Type0;
Subtask FigurineMenu1_Type1;
Subtask FigurineMenu1_Type2;
Subtask FigurineMenu1_Type3;
+
void Subtask_FigurineMenu(void) {
static Subtask* const figurineMenu1_Types[] = {
FigurineMenu0_Type0,
@@ -135,7 +134,7 @@ void FigurineMenu0_Type0(void) {
void FigurineMenu0_Type1(void) {
if (gFadeControl.active == 0) {
- CreateObject(OBJECT_A2, gUnk_080FC3E4[gFigurineMenu.figure_idx].unk7, 0);
+ CreateObject(OBJECT_A2, gUnk_080FC3E4[gFigurineMenu.figure_idx].type, 0);
SetMenuType(2);
}
}
@@ -444,7 +443,7 @@ const struct_08128184 gUnk_08128184 = {
};
extern struct_020227E8 gUnk_020227E8[];
-extern void sub_0805F46C(u32, const struct_0812816C*);
+extern void ShowTextBox(u32, const struct_0812816C*);
void sub_080A4BA0(u32 arg1, u32 arg2) {
int r0, r5, r6;
@@ -497,9 +496,9 @@ void sub_080A4BA0(u32 arg1, u32 arg2) {
s2.unk9 = r5;
s0.unk0 += 0xb;
if (gSaveHeader->language == 0) {
- sub_0805F46C((u32)&s2, &s0);
+ ShowTextBox((u32)&s2, &s0);
} else {
- sub_0805F46C(r5, &s0);
+ ShowTextBox(r5, &s0);
}
}
gScreen.bg3.updated = 1;
@@ -538,7 +537,7 @@ u32 sub_080A4CBC(u32 param_1) {
MemCopy(&gBG1Buffer, (void*)0x600e000, sizeof(gBG1Buffer));
iVar1 = sub_080A4948(param_1);
if (iVar1 != 0) {
- sub_0805F46C(param_1 + 0x900, &gUnk_08128190);
+ ShowTextBox(param_1 + 0x900, &gUnk_08128190);
}
gScreen.bg1.updated = 1;
}
@@ -585,6 +584,7 @@ void sub_080A4DA8(u32 param_1) {
sub_080A4DB8(param_1);
}
+// Render screen?
void sub_080A4DB8(u32 param_1) {
const struct_08128AD8* ptr;
@@ -603,25 +603,25 @@ void sub_080A4DB8(u32 param_1) {
gScreen.bg0.updated = 1;
gScreen.bg1.xOffset = 0;
gScreen.bg1.yOffset = 0;
- gScreen.bg1.control = ptr->unk4;
+ gScreen.bg1.control = ptr->bg1Control;
gScreen.bg1.updated = 1;
gScreen.bg2.xOffset = 0;
gScreen.bg2.yOffset = 0;
- gScreen.bg2.control = ptr->unk6;
+ gScreen.bg2.control = ptr->bg2Control;
gScreen.bg2.updated = 1;
gScreen.bg3.xOffset = 0;
gScreen.bg3.yOffset = 0;
gScreen.bg3.control = 0x1e0b;
- if (ptr->unk0 != 0) {
- LoadPaletteGroup(ptr->unk0);
+ if (ptr->paletteGroup != 0) {
+ LoadPaletteGroup(ptr->paletteGroup);
}
- if (ptr->unk1 != 0) {
- LoadGfxGroup(ptr->unk1);
+ if (ptr->gfxGroup != 0) {
+ LoadGfxGroup(ptr->gfxGroup);
}
}
void sub_080A4E84(u8 param_1) {
- gPauseMenuOptions.unk14 = param_1;
+ gPauseMenuOptions.screen2 = param_1;
}
void sub_080A4E90(u8 param_1) {
diff --git a/src/menu/kinstone_menu.c b/src/menu/kinstoneMenu.c
index 247902e4..e9aaad8e 100644
--- a/src/menu/kinstone_menu.c
+++ b/src/menu/kinstoneMenu.c
@@ -1,3 +1,9 @@
+/**
+ * @file kinstoneMenu.c
+ * @ingroup Subtasks
+ *
+ * @brief Kinstone Menu Subtask
+ */
#include "area.h"
#include "common.h"
#include "enemy.h"
@@ -221,12 +227,12 @@ void KinstoneMenu_Type1(void) {
}
void KinstoneMenu_Type2(void) {
- const struct_080C9CBC* ptr;
+ const KinstoneWorldEvent* ptr;
if (gMenu.column_idx == 6) {
gFuseInfo._0 = 6;
- ptr = &gUnk_080C9CBC[gFuseInfo._3];
- if (ptr->unk3 != 0) {
- MenuFadeIn(ptr->unk3, ptr->evt_type);
+ ptr = &gKinstoneWorldEvents[gFuseInfo.kinstoneId];
+ if (ptr->subtask != 0) {
+ MenuFadeIn(ptr->subtask, ptr->worldEventId);
} else {
Subtask_Exit();
}
@@ -259,8 +265,8 @@ void KinstoneMenu_Type3_Overlay0(void) {
}
void KinstoneMenu_Type3_Overlay1(void) {
- u32 temp = gUnk_080C9CBC[gKinstoneMenu.unk2a].unk5;
- if (temp != gUnk_080C9CBC[gFuseInfo._3].unk5) {
+ u32 temp = gKinstoneWorldEvents[gKinstoneMenu.unk2a].unk5;
+ if (temp != gKinstoneWorldEvents[gFuseInfo.kinstoneId].unk5) {
SoundReq(SFX_ITEM_SHIELD_BOUNCE);
SetMenuType(4);
} else {
@@ -313,8 +319,8 @@ void KinstoneMenu_Type5(void) {
void KinstoneMenu_Type5_Overlay0(void) {
gMenu.column_idx = 5;
- WriteBit(gSave.unk241, gFuseInfo._3);
- if (++gSave.unk117 > 99) {
+ WriteBit(gSave.fusedKinstones, gFuseInfo.kinstoneId);
+ if (++gSave.fusedKinstoneCount > 99) {
gSave.didAllFusions = 1;
}
KinstoneMenu_080A4468();
@@ -499,16 +505,16 @@ void KinstoneMenu_080A422C(void) {
}
gOamCmd.x = t2;
- sub_080A42E0(gFuseInfo._3, 0);
+ sub_080A42E0(gFuseInfo.kinstoneId, 0);
}
-void sub_080A42E0(u32 param_1, u32 param_2) {
+void sub_080A42E0(u32 kinstoneId, u32 param_2) {
u8 uVar1;
s32 sVar2;
s32 sVar3;
s32 iVar4;
- const struct_080C9CBC* ptr = &gUnk_080C9CBC[param_1];
+ const KinstoneWorldEvent* ptr = &gKinstoneWorldEvents[kinstoneId];
if (param_2 == 0xff) {
uVar1 = ptr->unk2;
@@ -538,7 +544,7 @@ void sub_080A42E0(u32 param_1, u32 param_2) {
}
{
int t;
- t = ptr->unk0;
+ t = ptr->objPalette;
t <<= 0xc;
t |= 0x800;
t |= (iVar4 << 4) + 0x300;
@@ -602,7 +608,7 @@ u32 sub_080A4418(u32 param_1, u32 param_2) {
void KinstoneMenu_080A4468(void) {
gUnk_03003DF0.unk_2 = 0;
gUnk_03003DF0.unk_4[3] = 0;
- sub_0801E6C8(gFuseInfo._3);
+ sub_0801E6C8(gFuseInfo.kinstoneId);
sub_0801E798(gKinstoneMenu.unk2a);
}
diff --git a/src/subtask2.c b/src/menu/pauseMenu.c
index 4476477c..63f22f28 100644
--- a/src/subtask2.c
+++ b/src/menu/pauseMenu.c
@@ -1,131 +1,604 @@
+/**
+ * @file pauseMenu.c
+ * @ingroup Subtasks
+ *
+ * @brief Pause Menu Subtask
+ */
+#include "pauseMenu.h"
+
#include "common.h"
-#include "fileselect.h"
-#include "flags.h"
#include "functions.h"
#include "game.h"
#include "item.h"
#include "itemMetaData.h"
-#include "kinstone.h"
#include "main.h"
#include "menu.h"
#include "message.h"
#include "save.h"
#include "screen.h"
+#include "sound.h"
+#include "structures.h"
#include "subtask.h"
#include "ui.h"
-#ifdef EU
-#define DRAW_DIRECT_SPRITE_INDEX 0x1fa
-#else
-#define DRAW_DIRECT_SPRITE_INDEX 0x1fb
-#endif
-
-extern u8 gUnk_08128D38[];
-extern u8 gUnk_08128D43[];
-extern u16 gUnk_02017830[];
-extern u8 gUnk_020350F0[];
-extern u8 gUnk_08128C00[];
-extern Frame* gSpriteAnimations_322[];
-extern u32 gUnk_085C4620[];
-extern u16* gMoreSpritePtrs[];
-extern Screen gUnk_03001020;
-extern u8 gUnk_02024090[];
-extern u8 gUnk_03000420[];
-extern u16 gUnk_02017AA0[];
+extern void sub_080A4DB8(u32);
-void sub_080A5CFC(u32, void*, u32);
-void sub_080A6FB4(u32, u32);
-void sub_080A66D0();
-void sub_080A5D1C();
-void sub_080A70AC(const KeyButtonLayout* layout);
-u32 sub_080A6F40();
-void sub_080A67C4(u32);
-void sub_080A68D4();
-s32 sub_080A69E0();
-void sub_080A6EE0(u32 param_1);
-struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2);
-void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4);
-void sub_080A6438();
+void sub_080A5128(void);
+void sub_080A51D4(void);
+bool32 sub_080A51F4(void);
void sub_080A5F48(u32, u32);
-void sub_080A6F6C(u32);
-bool32 sub_080A5F24(void);
-extern void DrawDungeonMap(u32 floor, struct_02019EE0* data, u32 size);
-extern void LoadDungeonMap(void);
+void Subtask_PauseMenu(void) {
+ static Subtask* const pauseMenu_Variants[] = {
+ PauseMenu_Variant0, PauseMenu_Variant1, PauseMenu_Variant2,
+ PauseMenu_Variant3, PauseMenu_Variant4, PauseMenu_Variant5,
+ };
-void DrawDungeonFeatures(u32, void*, u32);
+ if (gPauseMenuOptions.unk11 == 6) {
+ SetBgmVolume(0x100);
+ Subtask_Exit();
+ } else {
+ FlushSprites();
+ pauseMenu_Variants[gPauseMenuOptions.unk11]();
+ sub_080A5128();
+ UpdateUIElements();
+ DrawUIElements();
+ if (gPauseMenuOptions.unk11 != 4) {
+ gUnk_08128A38[gPauseMenuOptions.screen].func();
+ }
+ CopyOAM();
+ {
+ u32 t = gPauseMenuOptions.unk16;
+ u32 t2 = (t != 0) ? 0xe46 : 0;
+ gScreen.controls.layerFXControl = t2;
+ gScreen.controls.alphaBlend = (t << 8) | (0x10 - t);
+ }
+ }
+}
-extern void (*const gUnk_08128D58[])(void);
+struct_08127F94* sub_080A6A80(u32, u32);
-extern KeyButtonLayout gUnk_08128D60;
+extern u8 gUnk_02034492[];
+void sub_0801E8D4(void);
+s32 sub_080A50A0(s32);
-extern void (*const gUnk_08128DB0[])(void);
-void sub_080A617C(void);
-void sub_080A7040(u32);
+void PauseMenu_Variant0(void) {
+ struct_08127F94* ptr;
+ int r0, r1;
-extern u8 gUnk_08128DB8[];
-extern u8 gUnk_08128E80[];
-extern KeyButtonLayout gUnk_08128DBC;
+ sub_0801E8D4();
+ sub_080A4D34();
+ r1 = 4;
+ do {
+ gUnk_02034492[r1] = 0;
+ r1++;
+ } while (r1 <= 0xd);
+ ptr = sub_080A6A80((u16)gRoomTransition.player_status.overworld_map_x,
+ (u16)gRoomTransition.player_status.overworld_map_y);
+ gPauseMenuOptions.unk2[4] = ptr->_4;
+ gPauseMenuOptions.unk2[5] = sub_0801DB94();
+ if (IsItemEquipped(ITEM_LANTERN_ON) != EQUIP_SLOT_NONE) {
+ r1 = 0x10;
+ } else {
+ r1 = 0xf;
+ }
+ gPauseMenuOptions.unk15 = r1;
+ r0 = gUnk_08128A38[gPauseMenuOptions.screen].unk1;
+ r0 = sub_080A50A0(r0);
+ gPauseMenuOptions.screen = r0;
+ gPauseMenuOptions.screen2 = r0;
+ sub_080A4DB8(r0);
+ SetFade(FADE_INSTANT, 0x20);
+ sub_080A4E90(1);
+}
-typedef struct {
- u8 frameIndex;
- u8 unk1;
- u8 unk2;
- u8 unk3;
- u16 unk4;
- u16 unk6;
-} sturct_gUnk_08128F58;
+void PauseMenu_Variant1(void) {
+ if (gFadeControl.active == 0) {
+ sub_080A4E90(2);
+ }
+}
-extern sturct_gUnk_08128F58 gUnk_08128F58[];
+void PauseMenu_Variant2(void) {
+ int iVar1;
+ u32 uVar2;
+ int iVar4;
+ s32 bVar5;
-typedef struct {
- u8 unk0;
- u8 unk1;
- u16 unk2;
- u16 unk4;
- u16 unk6;
-} struct_sub_080A698C;
+ if (sub_080A51F4() && (gMenu.field_0xc != NULL)) {
+ iVar1 = -1;
+ switch (gInput.newKeys) {
+ case START_BUTTON:
+ iVar1 = 0;
+ break;
+ case L_BUTTON:
+ iVar1 = 1;
+ break;
+ case R_BUTTON:
+ iVar1 = 2;
+ break;
+ case B_BUTTON:
+ iVar1 = 3;
+ break;
+ }
+ if (iVar1 >= 0) {
+ switch (bVar5 = gMenu.field_0xc[iVar1]) {
+ case 0:
+ break;
+ case 4 ... 6:
+ case 0xf:
+ uVar2 = GetInventoryValue(ITEM_MAP);
+ if (uVar2 == 0) {
+ iVar4 = 1;
+ if (iVar1 == 1) {
+ iVar4 = 2;
+ }
+ bVar5 = gMenu.field_0xc[iVar4];
+ }
+ default:
+ gPauseMenuOptions.screen2 = bVar5;
+ SoundReq(SFX_TEXTBOX_OPEN);
+ gMenu.field_0xc = NULL;
+ break;
+ }
+ }
+ }
+ bVar5 = sub_080A50A0(gPauseMenuOptions.screen2);
+ if (gPauseMenuOptions.screen != bVar5) {
+ gPauseMenuOptions.screen2 = bVar5;
+ sub_080A51D4();
+ if (bVar5 == 0xe) {
+ sub_080A4E90(6);
+ } else {
+ sub_080A4E90(3);
+ MemClear(&gBG0Buffer, sizeof(gBG0Buffer));
+ gScreen.bg0.updated = 1;
+ }
+ }
+}
-extern void (*const gUnk_08128DCC[])(void);
-void sub_080A6378(void);
+s32 sub_080A50A0(s32 param_1) {
+ s32 iVar1;
-extern void (*const gUnk_08128F24[])(void);
-void sub_080A6E70(void);
-void sub_080A6498(void);
+ if (param_1 == 0xf) {
+ iVar1 = AreaHasMap();
+ param_1 = 4;
+ if (iVar1 != 0) {
+ param_1 = 5;
+ }
+ }
+ return param_1;
+}
-void sub_080A4DB8(u32);
-void sub_080A6290(void);
-u32 sub_080A6D74(u32);
+void PauseMenu_Variant3(void) {
+ s32 iVar1;
-extern const ScreenTransitionData gUnk_08128024[];
-void sub_080A71F4(const ScreenTransitionData* exitTransition);
+ iVar1 = gPauseMenuOptions.unk16 + 2;
+ if (0x10 < iVar1) {
+ gScreen.lcd.displayControl &= 0xf8ff;
+ sub_080A4E90(4);
+ iVar1 = 0x10;
+ }
+ gPauseMenuOptions.unk16 = iVar1;
+}
-extern void DeleteAllEntities(void);
-extern void sub_0805E974(void);
-extern bool32 sub_080A51F4(void);
-extern u32 sub_0807CB24(u32, u32);
-extern void sub_080A42E0(u32, u32);
+void PauseMenu_Variant4(void) {
+ u32 t;
+ gPauseMenuOptions.unk16 = 0x10;
+ gPauseMenuOptions.screen = t = gPauseMenuOptions.screen2;
+ sub_080A4DB8(t);
+ sub_080A4E90(5);
+}
-extern void (*const gUnk_0812901C[])(void);
+void PauseMenu_Variant5(void) {
+ s32 iVar1;
-void sub_080A74F4(void);
+ iVar1 = gPauseMenuOptions.unk16 - 2;
+ if (iVar1 < 0) {
+ sub_080A4E90(2);
+ iVar1 = 0;
+ }
+ gPauseMenuOptions.unk16 = iVar1;
+}
+
+void sub_080A5128(void) {
+ int r5, t;
+ struct {
+ int x;
+ int y;
+ } p[3];
+
+ switch (gPauseMenuOptions.screen) {
+ case PauseMenuScreen_7:
+ case PauseMenuScreen_8:
+ p[0].x = 0x60;
+ p[0].y = 0x18;
+ p[1].x = -0x10;
+ p[1].y = 0x48;
+ p[2].x = 0x100;
+ p[2].y = 0x48;
+ break;
+ case PauseMenuScreen_9:
+ case PauseMenuScreen_10:
+ case PauseMenuScreen_11:
+ return;
+ default:
+ p[0].x = 0x40;
+ p[0].y = 0x10 - (gPauseMenuOptions.unk16 << 1);
+ t = (gPauseMenuOptions.unk16 / 3);
+ p[1].x = 0x10 - t;
+ p[1].y = 0x48;
+ p[2].x = 0xe0 + t;
+ p[2].y = 0x48;
+ break;
+ }
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0x400;
+ gOamCmd.x = p[0].x;
+ gOamCmd.y = p[0].y;
+#ifdef EU
+ r5 = 0x1fa;
+#else
+ r5 = 0x1fb;
+#endif
+ DrawDirect(r5, 0);
+ gOamCmd.x = p[1].x;
+ gOamCmd.y = p[1].y;
+ DrawDirect(r5, 1);
+ gOamCmd.x = p[2].x;
+ gOamCmd.y = p[2].y;
+ DrawDirect(r5, 2);
+}
-extern void UpdateCarriedObject(void);
+void sub_080A51D4(void) {
+ u32 i = gPauseMenuOptions.screen;
+ if (i < 0xe) {
+ gPauseMenuOptions.unk2[i] = gMenu.field_0x3; // TODO cursor?
+ }
+}
-extern void (*const gSubtasks[])(void);
+bool32 sub_080A51F4(void) {
+ bool32 retval = TRUE;
+ if (gFadeControl.active != 0)
+ retval = FALSE;
+ if (gPauseMenuOptions.unk11 != 2)
+ retval = FALSE;
+ return retval;
+}
typedef struct {
+ u8 up;
+ u8 down;
+ u8 left;
+ u8 right;
+ u8 type;
u8 unk0;
- u8 unk1;
- u8 unk2;
- u8 unk3;
- u8 unk4;
- s8 unk5;
- u8 unk6;
- u8 unk7;
-} struct_gUnk_08128E94;
+ u8 x;
+ u8 y;
+} ItemMenuTableEntry;
+
+void PauseMenu_ItemMenu(void) {
+ static Subtask* const pauseMenu_Types[] = { PauseMenu_ItemMenu_Init, PauseMenu_ItemMenu_Update };
+
+ pauseMenu_Types[gMenu.menuType]();
+ PauseMenu_ItemMenu_Draw();
+}
+
+void PauseMenu_ItemMenu_Init(void) {
+ static const KeyButtonLayout gUnk_08128B50 = {
+ 0xd0u,
+ 0x10u,
+ 0u,
+ 0xb8u,
+ 0x10u,
+ 0u,
+ 0xffu,
+ 0xd8u,
+ 0u,
+ {
+ 0x3u,
+ 0u,
+ 0x4u,
+ 0u,
+ 0u,
+ 0u,
+ 0x1u,
+ 0u,
+ 0xffu,
+ 0u,
+ 0u,
+ },
+ };
-extern const struct_gUnk_08128E94 gUnk_08128E94[];
+ u32 uVar1;
+ u32 i;
+ u32 item;
+
+ gMenu.field_0xc = NULL;
+ sub_080A70AC((KeyButtonLayout*)&gUnk_08128B50);
+ for (item = ITEM_SMITH_SWORD; item < ITEM_BOTTLE_EMPTY; item++) {
+ uVar1 = GetInventoryValue(item);
+ if ((uVar1 == 1) && (i = gItemMetaData[item].menuSlot, i <= MENU_SLOT_SAVE_BUTTON_JP)) {
+ switch (item) {
+ case ITEM_LANTERN_OFF:
+ case ITEM_LANTERN_ON:
+ item = gPauseMenuOptions.unk15;
+ break;
+ default:
+ break;
+ }
+ gPauseMenu.items[i] = item;
+ sub_080A5F48(item, i * 8 + 0x360);
+ }
+ }
+ SetMenuType(1);
+}
+
+const ItemMenuTableEntry gItemMenuTable[] = {
+ [MENU_SLOT_SWORD] = { MENU_SLOT_BOTTLE0, MENU_SLOT_SHIELD, MENU_SLOT_BOOMERANG, MENU_SLOT_GUST_JAR, 0x01, 0x0c,
+ 0x42, 0x33 },
+ [MENU_SLOT_GUST_JAR] = { MENU_SLOT_BOTTLE1, MENU_SLOT_MOLE_MITTS, MENU_SLOT_SWORD, MENU_SLOT_CANE, 0x01, 0x10, 0x66,
+ 0x33 },
+ [MENU_SLOT_CANE] = { MENU_SLOT_BOTTLE3, MENU_SLOT_LANTERN, MENU_SLOT_GUST_JAR, MENU_SLOT_BOOMERANG, 0x01, 0x14,
+ 0x8a, 0x33 },
+ [MENU_SLOT_BOOMERANG] = { MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOMBS, MENU_SLOT_CANE, MENU_SLOT_SWORD, 0x01, 0x15, 0xae,
+ 0x33 },
+ [MENU_SLOT_SHIELD] = { MENU_SLOT_SWORD, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_BOMBS, MENU_SLOT_MOLE_MITTS, 0x01, 0x16,
+ 0x42, 0x4b },
+ [MENU_SLOT_MOLE_MITTS] = { MENU_SLOT_GUST_JAR, MENU_SLOT_ROCS_CAPE, MENU_SLOT_SHIELD, MENU_SLOT_LANTERN, 0x01, 0x17,
+ 0x66, 0x4b },
+ [MENU_SLOT_LANTERN] = { MENU_SLOT_CANE, MENU_SLOT_OCARINA, MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOMBS, 0x01, 0x00, 0x8a,
+ 0x4b },
+ [MENU_SLOT_BOMBS] = { MENU_SLOT_BOOMERANG, MENU_SLOT_BOW, MENU_SLOT_LANTERN, MENU_SLOT_SHIELD, 0x01, 0x00, 0xae,
+ 0x4b },
+ [MENU_SLOT_PEGASUS_BOOTS] = { MENU_SLOT_SHIELD, MENU_SLOT_BOTTLE0, MENU_SLOT_BOW, MENU_SLOT_ROCS_CAPE, 0x01, 0x00,
+ 0x42, 0x63 },
+ [MENU_SLOT_ROCS_CAPE] = { MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOTTLE1, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_OCARINA, 0x01,
+ 0x00, 0x66, 0x63 },
+ [MENU_SLOT_OCARINA] = { MENU_SLOT_LANTERN, MENU_SLOT_BOTTLE3, MENU_SLOT_ROCS_CAPE, MENU_SLOT_BOW, 0x01, 0x00, 0x8a,
+ 0x63 },
+ [MENU_SLOT_BOW] = { MENU_SLOT_BOMBS, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_OCARINA, MENU_SLOT_PEGASUS_BOOTS, 0x01, 0x00,
+ 0xae, 0x63 },
+ [MENU_SLOT_BOTTLE0] = { MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_SWORD, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOTTLE1, 0x01,
+ 0x00, 0x42, 0x7b },
+ [MENU_SLOT_BOTTLE1] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE0, MENU_SLOT_BOTTLE2, 0x01, 0x00,
+ 0x5a, 0x7b },
+ [MENU_SLOT_BOTTLE2] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE1, MENU_SLOT_BOTTLE3, 0x01, 0x00,
+ 0x72, 0x7b },
+ [MENU_SLOT_BOTTLE3] = { MENU_SLOT_OCARINA, MENU_SLOT_CANE, MENU_SLOT_BOTTLE2, MENU_SLOT_SAVE_BUTTON, 0x01, 0x00,
+ 0x8a, 0x7b },
+ [MENU_SLOT_SAVE_BUTTON] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x03, 0x00,
+ 0xb5, 0x75 },
+ [MENU_SLOT_SAVE_BUTTON_JP] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x05, 0x00,
+ 0xb5, 0x75 },
+};
+
+void PauseMenu_ItemMenu_Update(void) {
+ static const u8 gUnk_08128BF4[] = { 14, 15, 2, 0 };
+ u32 item;
+ u32 menuSlot;
+ const ItemMenuTableEntry* entry;
+
+ if (sub_080A51F4()) {
+ gMenu.field_0xc = (u8*)gUnk_08128BF4;
+ menuSlot = gMenu.field_0x3;
+
+ entry = &gItemMenuTable[menuSlot];
+ switch (gInput.newKeys) {
+ case A_BUTTON:
+ if (menuSlot == MENU_SLOT_SAVE_BUTTON) {
+#if defined(DEMO_USA) || defined(DEMO_JP)
+ SoundReq(SFX_MENU_ERROR);
+#else
+ sub_080A4E84(0xb);
+ SoundReq(SFX_TEXTBOX_SELECT);
+#endif
+ break;
+ }
+ case B_BUTTON:
+ if (gPauseMenu.items[menuSlot] != 0) {
+ u32 slot = !!(gInput.newKeys ^ 1);
+ ForceEquipItem(gPauseMenu.items[menuSlot], slot);
+ SoundReq(SFX_TEXTBOX_SELECT);
+ }
+ break;
+ default:
+ switch (gInput.unk4) {
+ case DPAD_UP:
+ menuSlot = entry->up;
+ break;
+ case DPAD_DOWN:
+ menuSlot = entry->down;
+ break;
+ case DPAD_LEFT:
+ menuSlot = entry->left;
+ break;
+ case DPAD_RIGHT:
+ menuSlot = entry->right;
+ break;
+ }
+ break;
+ }
+ if (gMenu.field_0x3 != menuSlot) {
+ gMenu.field_0x3 = menuSlot;
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ item = gPauseMenu.items[menuSlot];
+ switch (menuSlot) {
+ case MENU_SLOT_BOTTLE0:
+ case MENU_SLOT_BOTTLE1:
+ case MENU_SLOT_BOTTLE2:
+ case MENU_SLOT_BOTTLE3:
+ if (item != 0) {
+ item = gSave.saved_status.field_0x24[item - 6];
+ }
+ break;
+ case MENU_SLOT_SAVE_BUTTON:
+ // ITEM_SKILL_FAST_SPIN, but that does not make any sense at all
+ // it is just a text index for the text in the message box for the save button
+ item = 0x73;
+ break;
+ default:
+ break;
+ }
+ sub_080A6F6C(TEXT_INDEX(TEXT_ITEMS, 0) + item);
+ }
+}
+
+u32 GetMenuSlotForItem(u32 item);
+
+extern Frame* gSpriteAnimations_322[];
+
+#ifdef EU
+#define sub_080A5384_draw_constant0 0x1fa
+#define sub_080A5384_draw_constant1 0x141
+#else
+#define sub_080A5384_draw_constant0 0x1fb
+#define sub_080A5384_draw_constant1 0x142
+#endif
+void PauseMenu_ItemMenu_Draw(void) {
+ u32 tmp;
+ u32 i;
+ s32 color;
+ const ItemMenuTableEntry* entry;
+
+ gOamCmd._4 = 0x400;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0;
+ for (i = 0; i < MENU_SLOT_COUNT; i++) {
+ u32 item;
+ if (gPauseMenu.items[i] != 0) {
+ entry = &gItemMenuTable[i];
+ gOamCmd.x = entry->x;
+ gOamCmd.y = entry->y;
+ item = gPauseMenu.items[i];
+ switch (item) {
+ case ITEM_BOTTLE1:
+ case ITEM_BOTTLE2:
+ case ITEM_BOTTLE3:
+ case ITEM_BOTTLE4:
+ item = gSave.stats.bottles[item - ITEM_BOTTLE1];
+ break;
+ default:
+ break;
+ }
+ color = 3;
+ switch (item) {
+ case ITEM_BOMBS:
+ case ITEM_REMOTE_BOMBS:
+ if (gBombBagSizes[gSave.stats.bombBagType] <= gSave.stats.bombCount) {
+ color = 4;
+ }
+ break;
+ case ITEM_BOW:
+ case ITEM_LIGHT_ARROW:
+ if (gQuiverSizes[gSave.stats.quiverType] <= gSave.stats.arrowCount) {
+ color = 4;
+ }
+ break;
+ default:
+ break;
+ }
+ gOamCmd._8 = 0x800 | color << 0xc | ((i * 8) + 0x360);
+ DrawDirect(sub_080A5384_draw_constant1, gSpriteAnimations_322[item]->index);
+ }
+ }
+ gOamCmd._8 = 0x800;
+ {
+ u32 slot = gMenu.field_0x3;
+ if ((slot == MENU_SLOT_SAVE_BUTTON) && (gSaveHeader->language != 0)) {
+ slot = MENU_SLOT_SAVE_BUTTON_JP;
+ }
+ entry = &gItemMenuTable[slot];
+ gOamCmd.x = entry->x;
+ gOamCmd.y = entry->y;
+ tmp = entry->type + ((gMain.ticks & 0x10) != 0 ? 3 : 4);
+ DrawDirect(sub_080A5384_draw_constant0, tmp);
+ }
+ {
+ u32 slot;
+ if (gSaveHeader->language != 0) {
+ slot = MENU_SLOT_SAVE_BUTTON;
+ } else {
+ slot = MENU_SLOT_SAVE_BUTTON_JP;
+ }
+ entry = &gItemMenuTable[slot];
+ gOamCmd.x = entry->x;
+ gOamCmd.y = entry->y;
+ gOamCmd._8 = 0x800;
+ DrawDirect(sub_080A5384_draw_constant0, 0x22);
+ }
+ i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_A]);
+ if (i < MENU_SLOT_COUNT) {
+ entry = &gItemMenuTable[i];
+ gOamCmd.x = entry->x;
+ gOamCmd.y = entry->y;
+ DrawDirect(sub_080A5384_draw_constant0, 3);
+ }
+ i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_B]);
+ if (i < MENU_SLOT_COUNT) {
+ entry = &gItemMenuTable[i];
+ gOamCmd.x = entry->x;
+ gOamCmd.y = entry->y;
+ DrawDirect(sub_080A5384_draw_constant0, 3);
+ }
+}
+
+u32 GetMenuSlotForItem(u32 item) {
+ u32 i;
+
+ if (item != 0) {
+ for (i = 0; i < MENU_SLOT_COUNT; i++) {
+ if (item == gPauseMenu.items[i])
+ return i;
+ }
+ }
+ return MENU_SLOT_SAVE_BUTTON_JP;
+}
+
+Subtask sub_080A5594;
+Subtask sub_080A56A0;
+void PauseMenu2(void) {
+ static Subtask* const pauseMenu2_Types[] = {
+ sub_080A5594,
+ sub_080A56A0,
+ };
+ pauseMenu2_Types[gMenu.menuType]();
+ sub_080A57F4();
+}
+
+//// TODO Moved here from subtask2.c
+// Probably could split the different screens of the pause menu.
+#include "fileselect.h"
+#include "flags.h"
+
+extern u8 gUnk_08128C00[];
+extern u16 gUnk_02017830[];
+extern u8 gUnk_08128D38[];
+extern u8 gUnk_08128D43[];
+extern u16* gMoreSpritePtrs[];
+extern u32 gUnk_085C4620[];
+extern void (*const gUnk_08128D58[])(void);
+extern KeyButtonLayout gUnk_08128D60;
+
+void sub_080A5D1C();
+void sub_080A5CFC(u32, void*, u32);
+void sub_080A6FB4(u32, u32);
+void DrawDungeonFeatures(u32, void*, u32);
+extern void DrawDungeonMap(u32 floor, struct_02019EE0* data, u32 size);
+extern void LoadDungeonMap(void);
+bool32 sub_080A5F24(void);
+extern void sub_080A42E0(u32, u32);
+extern void (*const gUnk_08128DB0[])(void);
+void sub_080A617C(void);
+void sub_080A7040(u32);
+
+extern u8 gUnk_08128DB8[];
+extern KeyButtonLayout gUnk_08128DBC;
+
+extern void (*const gUnk_08128DCC[])(void);
+void sub_080A6378(void);
+void sub_080A6438();
typedef struct {
u8 unk0;
@@ -156,18 +629,6 @@ typedef struct {
} gUnk_08128DE8_struct;
extern gUnk_08128DE8_struct gUnk_08128DE8[];
-typedef struct {
- u8 item;
- u8 unk1;
- u8 frameIndex;
- u8 unk3;
- u8 unk4;
- s8 unk5;
- u16 unk6;
-} struct_gUnk_08128D70;
-
-extern const struct_gUnk_08128D70 gUnk_08128D70[];
-
void sub_080A5594(void) {
extern KeyButtonLayout gUnk_08128C04;
int iVar1;
@@ -239,7 +700,7 @@ void sub_080A5594(void) {
void sub_080A56A0(void) {
int iVar1;
u32 uVar2;
- u32 uVar4;
+ u32 item;
struct_gUnk_08128C14* ptr;
if (!sub_080A51F4()) {
@@ -315,28 +776,28 @@ void sub_080A56A0(void) {
}
uVar2 = gMenu.field_0x3;
- uVar4 = gGenericMenu.unk10.a[uVar2];
- if (uVar4 != 0) {
+ item = gGenericMenu.unk10.a[uVar2];
+ if (item != 0) {
switch (uVar2) {
case 0:
- if (uVar4 != 0x3d) {
- uVar4 = 0x67;
+ if (item != 0x3d) {
+ item = 0x67;
}
break;
case 1:
- uVar4 = 99;
+ item = 99;
break;
case 2:
- uVar4 = 0x70;
+ item = 0x70;
break;
case 4:
- uVar4 = 0x74;
+ item = 0x74;
break;
case 5:
- uVar4 = 0x73;
+ item = 0x73;
}
}
- sub_080A6F6C(uVar4 + 0x400);
+ sub_080A6F6C(TEXT_INDEX(TEXT_ITEMS, 0) + item);
}
void sub_080A57F4(void) {
@@ -431,7 +892,7 @@ void sub_080A57F4(void) {
}
}
-void sub_080A5990(void) {
+void PauseMenu_Screen_10(void) {
extern void (*const gUnk_08128D14[])(void);
gUnk_08128D14[gMenu.menuType]();
}
@@ -512,7 +973,7 @@ void sub_080A5A90(void) {
}
break;
case 0xff:
- if (gPauseMenuOptions.unk1 == 10) {
+ if (gPauseMenuOptions.screen == 10) {
uVar1 = 2;
} else {
uVar1 = 1;
@@ -525,7 +986,7 @@ void sub_080A5A90(void) {
}
}
-void sub_080A5AD8() {
+void PauseMenu_Screen_9() {
extern void (*const gUnk_08128D24[])(void);
gUnk_08128D24[gMenu.menuType]();
}
@@ -600,7 +1061,7 @@ void sub_080A5BB8(void) {
}
}
-void sub_080A5BF0(void) {
+void PauseMenu_Screen_5(void) {
extern void (*const gUnk_08128D30[])(void);
u32 uVar1;
u32 temp;
@@ -667,10 +1128,11 @@ void sub_080A5CFC(u32 menuType, void* param_2, u32 param_3) {
#define SUB_080A5D1C_SPRITE_INDEX 0x144
#endif
+// Actually draw the sprites for the dungeon map.
void sub_080A5D1C(void) {
extern u8 gUnk_08128D3C[];
u32 bVar1;
- int iVar3;
+ int frameIndex;
u32 uVar4;
u32 uVar6;
u32 index;
@@ -693,19 +1155,19 @@ void sub_080A5D1C(void) {
gOamCmd._8 = 0x4380;
if (HasDungeonSmallKey()) {
gOamCmd.x = 0x18;
- iVar3 = gSpriteAnimations_322[0x50]->index;
- DrawDirect(SUB_080A5D1C_SPRITE_INDEX, iVar3);
+ frameIndex = gSpriteAnimations_322[0x50]->index;
+ DrawDirect(SUB_080A5D1C_SPRITE_INDEX, frameIndex);
}
if (HasDungeonCompass()) {
gOamCmd.x = 0x2e;
- iVar3 = gSpriteAnimations_322[0x52]->index;
- DrawDirect(SUB_080A5D1C_SPRITE_INDEX, iVar3);
+ frameIndex = gSpriteAnimations_322[0x52]->index;
+ DrawDirect(SUB_080A5D1C_SPRITE_INDEX, frameIndex);
}
if (HasDungeonBigKey()) {
gOamCmd.x = 0x45;
gOamCmd._8 = 0x380;
- iVar3 = gSpriteAnimations_322[0x51]->index;
- DrawDirect(SUB_080A5D1C_SPRITE_INDEX, iVar3);
+ frameIndex = gSpriteAnimations_322[0x51]->index;
+ DrawDirect(SUB_080A5D1C_SPRITE_INDEX, frameIndex);
if (sub_080A5F24()) {
gOamCmd._8 = 0;
gOamCmd.x = 0x46;
@@ -721,11 +1183,11 @@ void sub_080A5D1C(void) {
gOamCmd._8 = 0;
gOamCmd.x = 0x34;
gOamCmd.y = bVar1;
- iVar3 = pbVar9->unk_1 + 0x82;
+ frameIndex = pbVar9->unk_1 + 0x82;
for (index = 0; index < pbVar9->unk_0; index++) {
- DrawDirect(DRAW_DIRECT_SPRITE_INDEX, iVar3);
- iVar3--;
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex);
+ frameIndex--;
gOamCmd.y = gOamCmd.y + 0xc;
}
@@ -733,30 +1195,30 @@ void sub_080A5D1C(void) {
while (*puVar8 != 0) {
switch (*puVar8) {
case 1:
- iVar3 = 0x7d;
+ frameIndex = 0x7d;
if (uVar4 != gMenu.field_0x3) {
- iVar3 = 0x7e;
+ frameIndex = 0x7e;
}
break;
case 2:
- iVar3 = 0x80;
+ frameIndex = 0x80;
break;
case 3:
- iVar3 = 0x81;
+ frameIndex = 0x81;
break;
case 4:
if (sub_080A5F24()) {
- iVar3 = 0x7f;
+ frameIndex = 0x7f;
break;
}
default:
- iVar3 = 0xff;
+ frameIndex = 0xff;
break;
}
gOamCmd.x = puVar8[1] + 0x50 - gScreen.bg1.xOffset;
gOamCmd.y = puVar8[2] + 0x10 - gScreen.bg1.yOffset;
- DrawDirect(DRAW_DIRECT_SPRITE_INDEX, iVar3);
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex);
puVar8 += 3;
}
}
@@ -813,7 +1275,7 @@ void sub_080A5F48(u32 param_1, u32 param_2) {
}
}
-void sub_080A6008(void) {
+void PauseMenu_Screen_7(void) {
gUnk_08128D58[gMenu.menuType]();
}
@@ -857,7 +1319,7 @@ void sub_080A6044(void) {
}
}
-void sub_080A60E0(void) {
+void PauseMenu_Screen_8(void) {
gUnk_08128DB0[gMenu.menuType]();
sub_080A617C();
sub_080A7040(gMenu.field_0x3);
@@ -936,7 +1398,7 @@ void sub_080A617C(void) {
}
}
-void sub_080A6270(void) {
+void PauseMenu_Screen_4(void) {
gUnk_08128DCC[gMenu.menuType]();
sub_080A6378();
}
@@ -1026,7 +1488,7 @@ void sub_080A6378(void) {
void sub_080A6438(void) {
u32 uVar1;
- sturct_gUnk_08128F58* pcVar2;
+ struct_gUnk_08128F58* pcVar2;
u32 uVar3;
gOamCmd._4 = 0x400;
@@ -1058,815 +1520,3 @@ void sub_080A6498(void) {
}
gScreen.controls.windowOutsideControl = 0x3d3f;
}
-
-void Subtask_MapHint(void) {
- extern void (*const gUnk_08128E70[])(void);
- FlushSprites();
- gUnk_08128E70[gMenu.menuType]();
- if ((gGenericMenu.unk2c & 0x20) != 0) {
- sub_080A6438();
- }
- sub_080A6498();
- CopyOAM();
-}
-
-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 = 60;
- SetMenuType(1);
- SetFade(FADE_INSTANT, 8);
-}
-
-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);
- const struct_gUnk_08128E94* ptr;
- gUnk_08128E78[gMenu.menuType]();
- ptr = &gUnk_08128E94[gMenu.field_0x3];
- gScreen.bg1.yOffset = -ptr->unk5;
- gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6;
- sub_080A66D0();
-}
-
-void sub_080A6650(void) {
- extern u8 gUnk_08128E84[];
- u32 temp;
- sub_080A70AC((KeyButtonLayout*)gUnk_08128E84);
- temp = gPauseMenuOptions.unk2[4];
- gMenu.field_0x3 = temp;
- sub_080A67C4(temp);
- sub_080A68D4();
- SetMenuType(1);
-}
-
-void sub_080A667C(void) {
- u32 uVar1;
- u32 uVar2;
- const struct_gUnk_08128E94* ptr;
-
- gMenu.field_0xc = gUnk_08128E80;
- ptr = &gUnk_08128E94[gMenu.field_0x3];
- uVar2 = gMenu.field_0xa;
- switch (gInput.heldKeys) {
- case DPAD_UP:
- if (uVar2 != 0) {
- uVar2 -= 2;
- }
- break;
- case DPAD_DOWN:
- uVar1 = ptr->unk2;
- if (uVar1 > uVar2) {
- uVar2 += 2;
- }
- if (uVar1 < uVar2) {
- uVar2 = uVar1;
- }
- break;
- }
-
- gMenu.field_0xa = uVar2;
- sub_080A6FB4(gMenu.field_0x3, 0);
-}
-
-void sub_080A66D0(void) {
- u32 bVar2;
- u32 bVar3;
- u8 bVar4;
- u32 uVar5;
- u32 uVar8;
- struct_sub_080A698C* ptr;
- const struct_gUnk_08128E94* ptr2;
-
- gOamCmd._4 = 0;
- gOamCmd._6 = 0;
- gOamCmd.x = 0x78;
- ptr2 = &gUnk_08128E94[gMenu.field_0x3];
- gGenericMenu.unk2c++;
- if (gGenericMenu.unk2b != 1 && ((gGenericMenu.unk2c & 0x10) != 0)) {
- gOamCmd._8 = 0x800;
- if (gMenu.field_0xa != 0) {
- gOamCmd.y = 0xc;
- DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x71);
- }
- if (ptr2->unk2 > gMenu.field_0xa) {
- gOamCmd.y = 0x84;
- DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x72);
- }
- }
- bVar2 = ptr2->unk7;
- bVar3 = ptr2->unk3;
- uVar5 = gMenu.field_0xa;
- gOamCmd._4 = 0;
- gOamCmd._6 = 0;
- gOamCmd._8 = 0xc00;
- bVar4 = gGenericMenu.unk2c & 0x20;
-
- for (ptr = (struct_sub_080A698C*)&gMapDataBottomSpecial; ptr->unk2 != 0; ptr++) {
- uVar8 = 0;
- if (ptr->unk0 == 1) {
- if (bVar4 != 0) {
- uVar8 = 1;
- }
- } else if (bVar4 == 0) {
- uVar8 = 1;
- }
-
- if (uVar8 != 0) {
- gOamCmd.x = ptr->unk4 + bVar2;
- gOamCmd.y = ptr->unk6 + bVar3 - uVar5;
- DrawDirect(ptr->unk2, ptr->unk1);
- }
- }
-}
-
-void sub_080A67C4(u32 param_1) {
- u16* puVar2;
- int i;
- int iVar4;
- s32 room;
- const struct_gUnk_08128E94* ptr;
-
- LoadPaletteGroup(param_1 + 0xba);
- iVar4 = param_1 + 0x5f;
- switch (param_1) {
- case 0x9:
- if (CheckGlobalFlag(TATEKAKE_HOUSE)) {
- iVar4 = 0x70;
- }
- break;
- case 0xb:
- if (CheckKinstoneFused(KINSTONE_E)) {
- iVar4 = 0x71;
- }
- break;
- case 0xe:
- if (gUI.roomControls.area == 8) {
- room = gUI.roomControls.room;
- iVar4 = (u8)(room % 3) + 0x72;
- }
- break;
- }
-
- LoadGfxGroup(iVar4);
- ptr = &gUnk_08128E94[param_1];
- puVar2 = &gUnk_02017AA0[gUnk_03003DE4[0] * 0x500];
-
- for (i = 0; i <= 7; puVar2++, i++) {
- *puVar2 = 0x1e0a;
- }
-
- for (i = 8; i < (int)(ptr->unk5 + ptr->unk4); puVar2++, i++) {
- *puVar2 = 0x1e0b;
- }
-
- for (; i < 0xa0; puVar2++, i++) {
- *puVar2 = 0x1e0a;
- }
-
- SetVBlankDMA((u16*)&gUnk_02017AA0[gUnk_03003DE4[0] * 0x500], (u16*)REG_ADDR_BG3CNT,
- ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) +
- 0x1);
- gMenu.field_0xa = ptr->unk2 >> 1;
- MemClear(&gMapDataBottomSpecial, 0x400);
-}
-
-void sub_080A68D4(void) {
- u32 uVar1;
- int iVar6;
- sturct_gUnk_08128F58* pcVar4;
- u32 i;
- u32 uVar4;
- struct_080FE320* ptr;
-
- if ((gPlayerState.flags & PL_NO_CAP) != 0) {
- iVar6 = 101;
- } else {
- iVar6 = 100;
- }
- sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y,
- DRAW_DIRECT_SPRITE_INDEX, iVar6 + 0x100);
- uVar1 = sub_080A6F40();
- uVar1 &= gSave.field_0x20;
-
- for (pcVar4 = gUnk_08128F58, i = 0; pcVar4->frameIndex != 0; i++, pcVar4++) {
- if (((1 << i) & uVar1) != 0) {
- sub_080A698C(pcVar4->unk4, pcVar4->unk6, DRAW_DIRECT_SPRITE_INDEX, pcVar4->unk3);
- }
- }
-
- for (i = 10; i <= 100; i++) {
- if (CheckKinstoneFused(i) && !sub_0801E810(i)) {
- uVar4 = gUnk_080C9CBC[i].unk7;
- ptr = &gUnk_080FE320[gUnk_080C9CBC[i].evt_type];
- sub_080A698C(ptr->_c, ptr->_e, DRAW_DIRECT_SPRITE_INDEX, uVar4 + 100);
- }
- }
-}
-
-void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
- int iVar1;
-
- iVar1 = sub_080A69E0(param_1, param_2);
- if (0 < iVar1) {
- ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk0 = param_4 >> 8;
- ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk1 = param_4;
- ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk2 = param_3;
- ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk4 = iVar1;
- ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk6 = iVar1 >> 0x10;
- gGenericMenu.unk2d++;
- }
-}
-
-s32 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;
- param_1 >>= 4;
- param_2 >>= 4;
-
- for (pbVar1 = gUnk_08127F94; pbVar1->_0 != 0xff; pbVar1++) {
- if (pbVar1->_0 <= param_1 && pbVar1->_2 >= param_1 && pbVar1->_1 <= param_2 && pbVar1->_3 >= param_2) {
- return pbVar1;
- }
- }
- return NULL;
-}
-
-void Subtask_LocalMapHint() {
- extern void (*const gUnk_08128F1C[])(void);
- const struct_gUnk_08128E94* ptr;
- FlushSprites();
- gUnk_08128F1C[gMenu.menuType]();
- ptr = &gUnk_08128E94[gMenu.field_0x3];
- gScreen.bg1.yOffset = -ptr->unk5;
- gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6;
- CopyOAM();
-}
-
-void sub_080A6B04(void) {
- u32 bVar1;
- u32 uVar2;
- u32 uVar3;
- u32 uVar4;
- int uVar6;
- u32 uVar7;
- const struct_080C9CBC* ptr;
- struct_080FE320* ptr2;
- const struct_gUnk_08128E94* ptr3;
-
- sub_080A4D34();
- sub_080A4DB8(6);
- ptr = &gUnk_080C9CBC[gFuseInfo._3];
- ptr2 = &gUnk_080FE320[ptr->evt_type];
- bVar1 = ptr->unk7;
- uVar3 = ptr2->_c;
- uVar4 = ptr2->_e;
- uVar2 = sub_080A6A80(uVar3, uVar4)->_4;
- gMenu.field_0x3 = uVar2;
- gGenericMenu.unk2b = 1;
- sub_080A67C4(uVar2);
- sub_080A6FB4(uVar2, 2);
- SetColor(0, 0x475f);
- SetColor(0x5f, 0x475f);
- MemFill16(0x5001, &gBG3Buffer, sizeof(gBG3Buffer));
- if ((gPlayerState.flags & PL_NO_CAP) != 0) {
- uVar7 = 101;
- } else {
- uVar7 = 100;
- }
- sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y,
- DRAW_DIRECT_SPRITE_INDEX, uVar7 + 0x100);
- sub_080A698C(uVar3, uVar4, DRAW_DIRECT_SPRITE_INDEX, bVar1 + 100);
- uVar4 = sub_080A69E0(uVar3, uVar4) >> 0x10;
- ptr3 = &gUnk_08128E94[gMenu.field_0x3];
- gMenu.field_0xa = 0;
- if (ptr3->unk2 != 0) {
- uVar6 = uVar4 - 0x3c;
- if (uVar6 > 0) {
- if (ptr3->unk2 < uVar6) {
- uVar6 = ptr3->unk2;
- }
- gMenu.field_0xa = uVar6;
- }
- }
- gMenu.transitionTimer = 30;
- SetMenuType(1);
- SetFade(FADE_INSTANT, 8);
-}
-
-void sub_080A6C1C(void) {
- if (!gFadeControl.active) {
- switch (gMenu.transitionTimer) {
- case 0:
- sub_080A66D0();
- switch (gInput.newKeys) {
- case A_BUTTON:
- case B_BUTTON:
- case START_BUTTON:
- Subtask_Exit();
- break;
- }
- return;
- case 1:
- SoundReq(SFX_103);
- break;
- }
- gMenu.transitionTimer--;
- }
-}
-
-void Subtask_FastTravel(void) {
- FlushSprites();
- gUnk_08128F24[gMenu.menuType]();
- if (gMenu.field_0x0 != 0) {
- sub_080A6E70();
- }
- sub_080A6498();
- CopyOAM();
-}
-
-void sub_080A6CA8(void) {
- sub_080A4D34();
- sub_080A4DB8(0xd);
- sub_080A6290();
- gMenu.field_0x3 = sub_080A6D74(0);
- SetMenuType(1);
- SetFade(FADE_INSTANT, 8);
-}
-
-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(TEXT_INDEX(TEXT_WINDCRESTS, 0x04));
- 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;
- u32 uVar2;
- u32 uVar3;
-
- uVar3 = gSave.windcrests >> 0x18;
- uVar2 = gMenu.field_0x3;
- if (param_1 == 0) {
- uVar2 = 0;
- if ((uVar3 & 1) == 0) {
- while (++uVar2 < 8 && ((1 << uVar2) & uVar3) == 0) {}
- }
- } else if (uVar3 != 0) {
- do {
- uVar2 = (uVar2 + param_1 + 8) & 7;
- } while ((1 << uVar2 & uVar3) == 0);
- }
- return uVar2 & 7;
-}
-
-void sub_080A6DD0(void) {
- u32 tmp;
- switch (sub_08056338()) {
-#ifdef EU
- case 0:
- gMenu.field_0x0 = 2;
- break;
- case 1:
- gMenu.field_0x0 = 3;
- tmp = 1;
- break;
- default:
- return;
- }
-
- if (tmp) {
- SetMenuType(3);
- }
-#else
- case 0:
- gMenu.field_0x0 = 2;
- tmp = 3;
- break;
- case 1:
- tmp = 1;
- break;
- default:
- return;
- }
- SetMenuType(tmp);
-#endif
-}
-
-void sub_080A6DF8(void) {
- if (gMenu.field_0x0 == 2) {
- SetMenuType(4);
- SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
- } else {
- ResetPlayerAnimationAndAction();
- sub_080042D0(&gPlayerEntity, (u32)gPlayerEntity.animIndex, gPlayerEntity.spriteIndex);
- Subtask_Exit();
- gPauseMenuOptions.disabled = 0;
- SoundReq(SFX_MENU_CANCEL);
- }
-}
-
-void sub_080A6E44(void) {
- if (gFadeControl.active == 0) {
- sub_080A71F4(&gUnk_08128024[gMenu.field_0x3]);
- }
-}
-
-void sub_080A6E70(void) {
- u32 frameIndex;
- u32 i;
-
- gOamCmd._4 = 0;
- gOamCmd._6 = 0;
- gOamCmd._8 = 0x400;
- gGenericMenu.unk2c++;
- sub_080A6EE0(gMenu.field_0x3);
- if ((gGenericMenu.unk2c & 0x10) != 0) {
- frameIndex = 0x5d;
- } else {
- frameIndex = 0x5e;
- }
-
- DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex);
- for (i = 0; i < 8; i++) {
- if ((gSave.windcrests & (1 << (i + 0x18))) != 0) {
- sub_080A6EE0(i);
- DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x5c);
- }
- }
-}
-
-void sub_080A6EE0(u32 param_1) {
- u32 x;
- u32 y;
- RoomHeader* roomHeader;
- const ScreenTransitionData* ptr = &gUnk_08128024[param_1];
-
- x = (u16)ptr->playerXPos;
- y = (u16)ptr->playerYPos;
- roomHeader = &gAreaRoomHeaders[ptr->area][ptr->room];
- x += roomHeader->map_x;
- y += roomHeader->map_y;
- gOamCmd.x = (s32)(x * DISPLAY_HEIGHT) / 0xf90 + 0x28;
- gOamCmd.y = (s32)(y * DISPLAY_HEIGHT) / 0xf90 + 0xc;
-}
-
-u32 sub_080A6F40(void) {
- extern u8 gUnk_08128F38[];
- int iVar1;
- u8* pcVar2;
- u32 uVar3;
- u32 uVar4;
-
- for (uVar3 = 0, pcVar2 = gUnk_08128F38, uVar4 = 0; *pcVar2 != 0; uVar3++, pcVar2 += 2) {
- uVar4 |= sub_0807CB24(*pcVar2, pcVar2[1]) << uVar3;
- }
- return ~uVar4;
-}
-
-void sub_080A6F6C(u32 param_1) {
- extern Font gUnk_08128FA8;
- if (gGenericMenu.unk2e.HWORD != param_1) {
- gGenericMenu.unk2e.HWORD = param_1;
- MemClear(gUnk_020350F0, 0x100);
- if ((param_1 & 0xff) != 0) {
- sub_0805F46C(param_1, &gUnk_08128FA8);
- }
- gScreen.bg0.updated = 1;
- }
- gScreen.bg0.yOffset = 2;
-}
-
-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;
-
- 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;
-}
-
-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].item) != 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;
- gMenu.overlayType = 0;
- gMenu.storyPanelIndex = 0;
-}
-
-void ResetUI(void) {
- MemClear(&gUI, sizeof(gUI));
-}
-
-void MenuFadeIn(u32 param_1, u32 param_2) {
- if (gUI.nextToLoad == 0) {
- MemClear(&gUI, sizeof(gUI));
- gUI.lastState = param_1;
- gUI.field_0x3 = param_2;
- gUI.pauseFadeIn = gMain.substate;
- } else {
- gUI.state = param_1;
- gUI.field_0x5 = param_2;
- gUI.nextToLoad = 1;
- }
- gUI.field_0x6 = 0;
- gUI.fadeType = -1;
- gUI.fadeInTime = 0x20;
- gMain.substate = GAMEMAIN_SUBTASK;
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20);
- gUnk_02018EB0.unk_0 = 0;
- gUnk_02018EB0.unk_1 = 0;
-}
-
-void sub_080A71A4(u32 param_1, u32 param_2, u32 param_3) {
- if (gUI.nextToLoad == 0) {
- gUI.unk_e = param_3;
- } else {
- gUI.unk_f = param_3;
- }
- MenuFadeIn(param_1, param_2);
-}
-
-void sub_080A71C4(u32 param_1, u32 param_2, u32 fadeType, u32 param_4) {
- MenuFadeIn(param_1, param_2);
- gUI.fadeType = fadeType;
- gUI.fadeInTime = param_4;
-}
-
-void Subtask_Exit(void) {
- gUI.nextToLoad = 3;
- SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20);
-}
-
-void sub_080A71F4(const ScreenTransitionData* exitTransition) {
- if (exitTransition != NULL) {
- DoExitTransition(exitTransition);
- }
- DeleteAllEntities();
- sub_0805E974();
- DeleteAllEntities();
- gMain.state = GAMETASK_INIT;
- gMain.substate = GAMEMAIN_INITROOM;
-}
-
-void GameMain_Subtask(void) {
- if (gUI.nextToLoad < 3) {
- if (gUI.state != 0) {
- gUI.field_0x3 = gUI.field_0x5;
- gUI.lastState = gUI.state;
- gUI.state = 0;
- }
- }
- gUnk_0812901C[gUI.nextToLoad]();
-}
-
-void Subtask_FadeIn(void) {
- if (!gFadeControl.active) {
- MemCopy(&gScreen, &gUnk_03001020, sizeof(Screen));
- MemCopy(gPaletteBuffer, gUnk_02024090, 0x400);
- MemCopy(&gGFXSlots, &gUI.gfxSlotList, sizeof(GfxSlotList));
- MemCopy(gPaletteList, gUI.palettes, sizeof(gUI.palettes));
- MemCopy(&gRoomControls, &gUI.roomControls, sizeof(RoomControls));
- MemCopy(gUnk_03000420, gUI.unk_2a8, sizeof(gUI.unk_2a8));
- MemCopy(&gActiveScriptInfo, &gUI.activeScriptInfo, sizeof(ActiveScriptInfo));
- sub_0805E958();
- gUI.unk_d = gRoomTransition.field_0x2c[2];
- gUI.controlMode = gPlayerState.controlMode;
- gUI.currentRoomProperties = gCurrentRoomProperties;
- gUI.mapBottomBgSettings = gMapBottom.bgSettings;
- gUI.mapTopBgSettings = gMapTop.bgSettings;
- gUI.nextToLoad = 1;
- }
-}
-
-void Subtask_Init(void) {
- if (gFadeControl.active == 0) {
- DeleteAllEntities();
- MemClear(&gMenu, sizeof(FigurineMenu));
- MemClear(&gRoomControls, sizeof(gRoomControls));
- MemClear(gOAMControls.unk, 0x100);
- MemClear(&gActiveScriptInfo, sizeof(gActiveScriptInfo));
- gActiveScriptInfo.fadeSpeed = 8;
- DispReset(1);
- MessageInitialize();
- ResetPalettes();
- ResetPaletteTable(0);
- gGFXSlots.unk0 = 1;
- gUI.nextToLoad = 2;
- gRoomTransition.field_0x2c[3] = 1;
- }
-}
-
-void Subtask_FadeOut(void) {
- if (!gFadeControl.active) {
- DeleteAllEntities();
- sub_0805E974();
- gCurrentRoomProperties = gUI.currentRoomProperties;
- gPlayerState.controlMode = gUI.controlMode;
- gMapBottom.bgSettings = gUI.mapBottomBgSettings;
- gMapTop.bgSettings = gUI.mapTopBgSettings;
- MemCopy(&gUI.activeScriptInfo, &gActiveScriptInfo, sizeof(ActiveScriptInfo));
- MemCopy(gUI.unk_2a8, gUnk_03000420, sizeof(gUI.unk_2a8));
- MemCopy(gUI.palettes, gPaletteList, sizeof(gUI.palettes));
- MemCopy(&gUI.gfxSlotList, &gGFXSlots, sizeof(gGFXSlots));
- MemCopy(&gUI.roomControls, &gRoomControls, sizeof(RoomControls));
- MemCopy(&gUnk_03001020, &gScreen, sizeof(Screen));
- gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
- gArea.pCurrentRoomInfo = GetCurrentRoomInfo();
- RestoreGameTask(gUI.field_0x6);
- sub_0801D000(gUI.unk_d != 0);
- sub_080A74F4();
- if (gUI.fadeType != 0xffff) {
- SetFade(gUI.fadeType, gUI.fadeInTime);
- } else {
- SetFadeInverted(gUI.fadeInTime);
- }
- gUI.nextToLoad = 4;
- gRoomTransition.field_0x2c[3] = 0;
- }
-}
-
-void Subtask_Die(void) {
- sub_080A74F4();
- if (gFadeControl.active == 0) {
- gMain.substate = gUI.pauseFadeIn;
- gUI.nextToLoad = gFadeControl.active;
- gUI.lastState = gFadeControl.active;
- ResetSystemPriority();
- }
-}
-
-void sub_080A74F4(void) {
- SetInitializationPriority();
- gMain.pad = 0;
- FlushSprites();
- UpdateEntities();
- UpdateManagers();
- DrawUI();
- DrawUIElements();
- UpdateCarriedObject();
- DrawEntities();
- CopyOAM();
-}
-
-void Subtask_Update(void) {
- gSubtasks[gUI.lastState]();
-}
diff --git a/src/menu/pauseMenuScreen6.c b/src/menu/pauseMenuScreen6.c
new file mode 100644
index 00000000..4bfcd17a
--- /dev/null
+++ b/src/menu/pauseMenuScreen6.c
@@ -0,0 +1,276 @@
+/**
+ * @file pauseMenuScreen6.c
+ *
+ * @brief Pause Menu Screen 6
+ */
+#include "common.h"
+#include "fileselect.h"
+#include "flags.h"
+#include "functions.h"
+#include "kinstone.h"
+#include "main.h"
+#include "menu.h"
+#include "pauseMenu.h"
+#include "save.h"
+#include "screen.h"
+
+typedef struct {
+ u8 unk0;
+ u8 unk1;
+ u16 unk2;
+ u16 unk4;
+ u16 unk6;
+} struct_sub_080A698C;
+
+extern u8 gUnk_08128E80[];
+
+extern u16 gUnk_02017AA0[];
+
+void sub_080A68D4();
+
+void PauseMenu_Screen_6(void) {
+ extern void (*const gUnk_08128E78[])(void);
+ const struct_gUnk_08128E94* ptr;
+ gUnk_08128E78[gMenu.menuType]();
+ ptr = &gUnk_08128E94[gMenu.field_0x3];
+ gScreen.bg1.yOffset = -ptr->unk5;
+ gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6;
+ sub_080A66D0();
+}
+
+void sub_080A6650(void) {
+ extern u8 gUnk_08128E84[];
+ u32 temp;
+ sub_080A70AC((KeyButtonLayout*)gUnk_08128E84);
+ temp = gPauseMenuOptions.unk2[4];
+ gMenu.field_0x3 = temp;
+ sub_080A67C4(temp);
+ sub_080A68D4();
+ SetMenuType(1);
+}
+
+void sub_080A667C(void) {
+ u32 uVar1;
+ u32 uVar2;
+ const struct_gUnk_08128E94* ptr;
+
+ gMenu.field_0xc = gUnk_08128E80;
+ ptr = &gUnk_08128E94[gMenu.field_0x3];
+ uVar2 = gMenu.field_0xa;
+ switch (gInput.heldKeys) {
+ case DPAD_UP:
+ if (uVar2 != 0) {
+ uVar2 -= 2;
+ }
+ break;
+ case DPAD_DOWN:
+ uVar1 = ptr->unk2;
+ if (uVar1 > uVar2) {
+ uVar2 += 2;
+ }
+ if (uVar1 < uVar2) {
+ uVar2 = uVar1;
+ }
+ break;
+ }
+
+ gMenu.field_0xa = uVar2;
+ sub_080A6FB4(gMenu.field_0x3, 0);
+}
+
+void sub_080A66D0(void) {
+ u32 bVar2;
+ u32 bVar3;
+ u8 bVar4;
+ u32 uVar5;
+ u32 uVar8;
+ struct_sub_080A698C* ptr;
+ const struct_gUnk_08128E94* ptr2;
+
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd.x = 0x78;
+ ptr2 = &gUnk_08128E94[gMenu.field_0x3];
+ gGenericMenu.unk2c++;
+ if (gGenericMenu.unk2b != 1 && ((gGenericMenu.unk2c & 0x10) != 0)) {
+ gOamCmd._8 = 0x800;
+ if (gMenu.field_0xa != 0) {
+ gOamCmd.y = 0xc;
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x71);
+ }
+ if (ptr2->unk2 > gMenu.field_0xa) {
+ gOamCmd.y = 0x84;
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x72);
+ }
+ }
+ bVar2 = ptr2->unk7;
+ bVar3 = ptr2->unk3;
+ uVar5 = gMenu.field_0xa;
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0xc00;
+ bVar4 = gGenericMenu.unk2c & 0x20;
+
+ for (ptr = (struct_sub_080A698C*)&gMapDataBottomSpecial; ptr->unk2 != 0; ptr++) {
+ uVar8 = 0;
+ if (ptr->unk0 == 1) {
+ if (bVar4 != 0) {
+ uVar8 = 1;
+ }
+ } else if (bVar4 == 0) {
+ uVar8 = 1;
+ }
+
+ if (uVar8 != 0) {
+ gOamCmd.x = ptr->unk4 + bVar2;
+ gOamCmd.y = ptr->unk6 + bVar3 - uVar5;
+ DrawDirect(ptr->unk2, ptr->unk1);
+ }
+ }
+}
+
+void sub_080A67C4(u32 param_1) {
+ u16* puVar2;
+ int i;
+ int iVar4;
+ s32 room;
+ const struct_gUnk_08128E94* ptr;
+
+ LoadPaletteGroup(param_1 + 0xba);
+ iVar4 = param_1 + 0x5f;
+ switch (param_1) {
+ case 0x9:
+ if (CheckGlobalFlag(TATEKAKE_HOUSE)) {
+ iVar4 = 0x70;
+ }
+ break;
+ case 0xb:
+ if (CheckKinstoneFused(KINSTONE_E)) {
+ iVar4 = 0x71;
+ }
+ break;
+ case 0xe:
+ if (gUI.roomControls.area == 8) {
+ room = gUI.roomControls.room;
+ iVar4 = (u8)(room % 3) + 0x72;
+ }
+ break;
+ }
+
+ LoadGfxGroup(iVar4);
+ ptr = &gUnk_08128E94[param_1];
+ puVar2 = &gUnk_02017AA0[gUnk_03003DE4[0] * 0x500];
+
+ for (i = 0; i <= 7; puVar2++, i++) {
+ *puVar2 = 0x1e0a;
+ }
+
+ for (i = 8; i < (int)(ptr->unk5 + ptr->unk4); puVar2++, i++) {
+ *puVar2 = 0x1e0b;
+ }
+
+ for (; i < 0xa0; puVar2++, i++) {
+ *puVar2 = 0x1e0a;
+ }
+
+ SetVBlankDMA((u16*)&gUnk_02017AA0[gUnk_03003DE4[0] * 0x500], (u16*)REG_ADDR_BG3CNT,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) +
+ 0x1);
+ gMenu.field_0xa = ptr->unk2 >> 1;
+ MemClear(&gMapDataBottomSpecial, 0x400);
+}
+
+void sub_080A68D4(void) {
+ u32 uVar1;
+ int iVar6;
+ struct_gUnk_08128F58* pcVar4;
+ u32 i;
+ u32 uVar4;
+ const WorldEvent* ptr;
+
+ if ((gPlayerState.flags & PL_NO_CAP) != 0) {
+ iVar6 = 101;
+ } else {
+ iVar6 = 100;
+ }
+ sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y,
+ DRAW_DIRECT_SPRITE_INDEX, iVar6 + 0x100);
+ uVar1 = sub_080A6F40();
+ uVar1 &= gSave.field_0x20;
+
+ for (pcVar4 = gUnk_08128F58, i = 0; pcVar4->frameIndex != 0; i++, pcVar4++) {
+ if (((1 << i) & uVar1) != 0) {
+ sub_080A698C(pcVar4->unk4, pcVar4->unk6, DRAW_DIRECT_SPRITE_INDEX, pcVar4->unk3);
+ }
+ }
+
+ for (i = 10; i <= 100; i++) {
+ if (CheckKinstoneFused(i) && !sub_0801E810(i)) {
+ uVar4 = gKinstoneWorldEvents[i].unk7;
+ ptr = &gWorldEvents[gKinstoneWorldEvents[i].worldEventId];
+ sub_080A698C(ptr->_c, ptr->_e, DRAW_DIRECT_SPRITE_INDEX, uVar4 + 100);
+ }
+ }
+}
+
+void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
+ int iVar1;
+
+ iVar1 = sub_080A69E0(param_1, param_2);
+ if (0 < iVar1) {
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk0 = param_4 >> 8;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk1 = param_4;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk2 = param_3;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk4 = iVar1;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk6 = iVar1 >> 0x10;
+ gGenericMenu.unk2d++;
+ }
+}
+
+s32 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;
+ param_1 >>= 4;
+ param_2 >>= 4;
+
+ for (pbVar1 = gUnk_08127F94; pbVar1->_0 != 0xff; pbVar1++) {
+ if (pbVar1->_0 <= param_1 && pbVar1->_2 >= param_1 && pbVar1->_1 <= param_2 && pbVar1->_3 >= param_2) {
+ return pbVar1;
+ }
+ }
+ return NULL;
+}
diff --git a/src/menu/pause_menu.c b/src/menu/pause_menu.c
deleted file mode 100644
index 957dc751..00000000
--- a/src/menu/pause_menu.c
+++ /dev/null
@@ -1,567 +0,0 @@
-#include "global.h"
-#include "menu.h"
-#include "sound.h"
-#include "subtask.h"
-#include "screen.h"
-#include "item.h"
-#include "common.h"
-#include "game.h"
-#include "main.h"
-#include "save.h"
-#include "itemMetaData.h"
-#include "structures.h"
-#include "functions.h"
-#include "ui.h"
-
-extern void sub_080A4DB8(u32);
-
-void sub_080A5128(void);
-void sub_080A51D4(void);
-bool32 sub_080A51F4(void);
-void sub_080A5F48(u32, u32);
-
-Subtask PauseMenu_Variant0;
-Subtask PauseMenu_Variant1;
-Subtask PauseMenu_Variant2;
-Subtask PauseMenu_Variant3;
-Subtask PauseMenu_Variant4;
-Subtask PauseMenu_Variant5;
-void Subtask_PauseMenu(void) {
- static Subtask* const pauseMenu_Variants[] = {
- PauseMenu_Variant0, PauseMenu_Variant1, PauseMenu_Variant2,
- PauseMenu_Variant3, PauseMenu_Variant4, PauseMenu_Variant5,
- };
-
- if (gPauseMenuOptions.unk11 == 6) {
- SetBgmVolume(0x100);
- Subtask_Exit();
- } else {
- FlushSprites();
- pauseMenu_Variants[gPauseMenuOptions.unk11]();
- sub_080A5128();
- UpdateUIElements();
- DrawUIElements();
- if (gPauseMenuOptions.unk11 != 4) {
- gUnk_08128A38[gPauseMenuOptions.unk1].func();
- }
- CopyOAM();
- {
- u32 t = gPauseMenuOptions.unk16;
- u32 t2 = (t != 0) ? 0xe46 : 0;
- gScreen.controls.layerFXControl = t2;
- gScreen.controls.alphaBlend = (t << 8) | (0x10 - t);
- }
- }
-}
-
-struct_08127F94* sub_080A6A80(u32, u32);
-
-extern u8 gUnk_02034492[];
-void sub_0801E8D4(void);
-s32 sub_080A50A0(s32);
-
-void PauseMenu_Variant0(void) {
- struct_08127F94* ptr;
- int r0, r1;
-
- sub_0801E8D4();
- sub_080A4D34();
- r1 = 4;
- do {
- gUnk_02034492[r1] = 0;
- r1++;
- } while (r1 <= 0xd);
- ptr = sub_080A6A80((u16)gRoomTransition.player_status.overworld_map_x,
- (u16)gRoomTransition.player_status.overworld_map_y);
- gPauseMenuOptions.unk2[4] = ptr->_4;
- gPauseMenuOptions.unk2[5] = sub_0801DB94();
- if (IsItemEquipped(ITEM_LANTERN_ON) != EQUIP_SLOT_NONE) {
- r1 = 0x10;
- } else {
- r1 = 0xf;
- }
- gPauseMenuOptions.unk15 = r1;
- r0 = gUnk_08128A38[gPauseMenuOptions.unk1].unk1;
- r0 = sub_080A50A0(r0);
- gPauseMenuOptions.unk1 = r0;
- gPauseMenuOptions.unk14 = r0;
- sub_080A4DB8(r0);
- SetFade(FADE_INSTANT, 0x20);
- sub_080A4E90(1);
-}
-
-void PauseMenu_Variant1(void) {
- if (gFadeControl.active == 0) {
- sub_080A4E90(2);
- }
-}
-
-void PauseMenu_Variant2(void) {
- int iVar1;
- u32 uVar2;
- int iVar4;
- s32 bVar5;
-
- if (sub_080A51F4() && (gMenu.field_0xc != NULL)) {
- iVar1 = -1;
- switch (gInput.newKeys) {
- case START_BUTTON:
- iVar1 = 0;
- break;
- case L_BUTTON:
- iVar1 = 1;
- break;
- case R_BUTTON:
- iVar1 = 2;
- break;
- case B_BUTTON:
- iVar1 = 3;
- break;
- }
- if (iVar1 >= 0) {
- switch (bVar5 = gMenu.field_0xc[iVar1]) {
- case 0:
- break;
- case 4 ... 6:
- case 0xf:
- uVar2 = GetInventoryValue(ITEM_MAP);
- if (uVar2 == 0) {
- iVar4 = 1;
- if (iVar1 == 1) {
- iVar4 = 2;
- }
- bVar5 = gMenu.field_0xc[iVar4];
- }
- default:
- gPauseMenuOptions.unk14 = bVar5;
- SoundReq(SFX_TEXTBOX_OPEN);
- gMenu.field_0xc = NULL;
- break;
- }
- }
- }
- bVar5 = sub_080A50A0(gPauseMenuOptions.unk14);
- if (gPauseMenuOptions.unk1 != bVar5) {
- gPauseMenuOptions.unk14 = bVar5;
- sub_080A51D4();
- if (bVar5 == 0xe) {
- sub_080A4E90(6);
- } else {
- sub_080A4E90(3);
- MemClear(&gBG0Buffer, sizeof(gBG0Buffer));
- gScreen.bg0.updated = 1;
- }
- }
-}
-
-s32 sub_080A50A0(s32 param_1) {
- s32 iVar1;
-
- if (param_1 == 0xf) {
- iVar1 = AreaHasMap();
- param_1 = 4;
- if (iVar1 != 0) {
- param_1 = 5;
- }
- }
- return param_1;
-}
-
-void PauseMenu_Variant3(void) {
- s32 iVar1;
-
- iVar1 = gPauseMenuOptions.unk16 + 2;
- if (0x10 < iVar1) {
- gScreen.lcd.displayControl &= 0xf8ff;
- sub_080A4E90(4);
- iVar1 = 0x10;
- }
- gPauseMenuOptions.unk16 = iVar1;
-}
-
-void PauseMenu_Variant4(void) {
- u32 t;
- gPauseMenuOptions.unk16 = 0x10;
- gPauseMenuOptions.unk1 = t = gPauseMenuOptions.unk14;
- sub_080A4DB8(t);
- sub_080A4E90(5);
-}
-
-void PauseMenu_Variant5(void) {
- s32 iVar1;
-
- iVar1 = gPauseMenuOptions.unk16 - 2;
- if (iVar1 < 0) {
- sub_080A4E90(2);
- iVar1 = 0;
- }
- gPauseMenuOptions.unk16 = iVar1;
-}
-
-void sub_080A5128(void) {
- int r5, t;
- struct {
- int x;
- int y;
- } p[3];
-
- switch (gPauseMenuOptions.unk1) {
- case 7:
- case 8:
- p[0].x = 0x60;
- p[0].y = 0x18;
- p[1].x = -0x10;
- p[1].y = 0x48;
- p[2].x = 0x100;
- p[2].y = 0x48;
- break;
- case 9:
- case 10:
- case 11:
- return;
- default:
- p[0].x = 0x40;
- p[0].y = 0x10 - (gPauseMenuOptions.unk16 << 1);
- t = (gPauseMenuOptions.unk16 / 3);
- p[1].x = 0x10 - t;
- p[1].y = 0x48;
- p[2].x = 0xe0 + t;
- p[2].y = 0x48;
- break;
- }
- gOamCmd._4 = 0;
- gOamCmd._6 = 0;
- gOamCmd._8 = 0x400;
- gOamCmd.x = p[0].x;
- gOamCmd.y = p[0].y;
-#ifdef EU
- r5 = 0x1fa;
-#else
- r5 = 0x1fb;
-#endif
- DrawDirect(r5, 0);
- gOamCmd.x = p[1].x;
- gOamCmd.y = p[1].y;
- DrawDirect(r5, 1);
- gOamCmd.x = p[2].x;
- gOamCmd.y = p[2].y;
- DrawDirect(r5, 2);
-}
-
-void sub_080A51D4(void) {
- u32 i = gPauseMenuOptions.unk1;
- if (i < 0xe) {
- gPauseMenuOptions.unk2[i] = gMenu.field_0x3;
- }
-}
-
-bool32 sub_080A51F4(void) {
- bool32 retval = TRUE;
- if (gFadeControl.active != 0)
- retval = FALSE;
- if (gPauseMenuOptions.unk11 != 2)
- retval = FALSE;
- return retval;
-}
-
-typedef struct {
- u8 up;
- u8 down;
- u8 left;
- u8 right;
- u8 type;
- u8 unk0;
- u8 x;
- u8 y;
-} ItemMenuTableEntry;
-
-Subtask PauseMenu_ItemMenu_Draw;
-Subtask PauseMenu_ItemMenu_Init;
-Subtask PauseMenu_ItemMenu_Update;
-void PauseMenu_ItemMenu(void) {
- static Subtask* const pauseMenu_Types[] = { PauseMenu_ItemMenu_Init, PauseMenu_ItemMenu_Update };
-
- pauseMenu_Types[gMenu.menuType]();
- PauseMenu_ItemMenu_Draw();
-}
-
-void PauseMenu_ItemMenu_Init(void) {
- static const KeyButtonLayout gUnk_08128B50 = {
- 0xd0u,
- 0x10u,
- 0u,
- 0xb8u,
- 0x10u,
- 0u,
- 0xffu,
- 0xd8u,
- 0u,
- {
- 0x3u,
- 0u,
- 0x4u,
- 0u,
- 0u,
- 0u,
- 0x1u,
- 0u,
- 0xffu,
- 0u,
- 0u,
- },
- };
-
- u32 uVar1;
- u32 i;
- u32 item;
-
- gMenu.field_0xc = NULL;
- sub_080A70AC((KeyButtonLayout*)&gUnk_08128B50);
- for (item = ITEM_SMITH_SWORD; item < ITEM_BOTTLE_EMPTY; item++) {
- uVar1 = GetInventoryValue(item);
- if ((uVar1 == 1) && (i = gItemMetaData[item].menuSlot, i <= MENU_SLOT_SAVE_BUTTON_JP)) {
- switch (item) {
- case ITEM_LANTERN_OFF:
- case ITEM_LANTERN_ON:
- item = gPauseMenuOptions.unk15;
- break;
- default:
- break;
- }
- gPauseMenu.items[i] = item;
- sub_080A5F48(item, i * 8 + 0x360);
- }
- }
- SetMenuType(1);
-}
-
-const ItemMenuTableEntry gItemMenuTable[] = {
- [MENU_SLOT_SWORD] = { MENU_SLOT_BOTTLE0, MENU_SLOT_SHIELD, MENU_SLOT_BOOMERANG, MENU_SLOT_GUST_JAR, 0x01, 0x0c,
- 0x42, 0x33 },
- [MENU_SLOT_GUST_JAR] = { MENU_SLOT_BOTTLE1, MENU_SLOT_MOLE_MITTS, MENU_SLOT_SWORD, MENU_SLOT_CANE, 0x01, 0x10, 0x66,
- 0x33 },
- [MENU_SLOT_CANE] = { MENU_SLOT_BOTTLE3, MENU_SLOT_LANTERN, MENU_SLOT_GUST_JAR, MENU_SLOT_BOOMERANG, 0x01, 0x14,
- 0x8a, 0x33 },
- [MENU_SLOT_BOOMERANG] = { MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOMBS, MENU_SLOT_CANE, MENU_SLOT_SWORD, 0x01, 0x15, 0xae,
- 0x33 },
- [MENU_SLOT_SHIELD] = { MENU_SLOT_SWORD, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_BOMBS, MENU_SLOT_MOLE_MITTS, 0x01, 0x16,
- 0x42, 0x4b },
- [MENU_SLOT_MOLE_MITTS] = { MENU_SLOT_GUST_JAR, MENU_SLOT_ROCS_CAPE, MENU_SLOT_SHIELD, MENU_SLOT_LANTERN, 0x01, 0x17,
- 0x66, 0x4b },
- [MENU_SLOT_LANTERN] = { MENU_SLOT_CANE, MENU_SLOT_OCARINA, MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOMBS, 0x01, 0x00, 0x8a,
- 0x4b },
- [MENU_SLOT_BOMBS] = { MENU_SLOT_BOOMERANG, MENU_SLOT_BOW, MENU_SLOT_LANTERN, MENU_SLOT_SHIELD, 0x01, 0x00, 0xae,
- 0x4b },
- [MENU_SLOT_PEGASUS_BOOTS] = { MENU_SLOT_SHIELD, MENU_SLOT_BOTTLE0, MENU_SLOT_BOW, MENU_SLOT_ROCS_CAPE, 0x01, 0x00,
- 0x42, 0x63 },
- [MENU_SLOT_ROCS_CAPE] = { MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOTTLE1, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_OCARINA, 0x01,
- 0x00, 0x66, 0x63 },
- [MENU_SLOT_OCARINA] = { MENU_SLOT_LANTERN, MENU_SLOT_BOTTLE3, MENU_SLOT_ROCS_CAPE, MENU_SLOT_BOW, 0x01, 0x00, 0x8a,
- 0x63 },
- [MENU_SLOT_BOW] = { MENU_SLOT_BOMBS, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_OCARINA, MENU_SLOT_PEGASUS_BOOTS, 0x01, 0x00,
- 0xae, 0x63 },
- [MENU_SLOT_BOTTLE0] = { MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_SWORD, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOTTLE1, 0x01,
- 0x00, 0x42, 0x7b },
- [MENU_SLOT_BOTTLE1] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE0, MENU_SLOT_BOTTLE2, 0x01, 0x00,
- 0x5a, 0x7b },
- [MENU_SLOT_BOTTLE2] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE1, MENU_SLOT_BOTTLE3, 0x01, 0x00,
- 0x72, 0x7b },
- [MENU_SLOT_BOTTLE3] = { MENU_SLOT_OCARINA, MENU_SLOT_CANE, MENU_SLOT_BOTTLE2, MENU_SLOT_SAVE_BUTTON, 0x01, 0x00,
- 0x8a, 0x7b },
- [MENU_SLOT_SAVE_BUTTON] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x03, 0x00,
- 0xb5, 0x75 },
- [MENU_SLOT_SAVE_BUTTON_JP] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x05, 0x00,
- 0xb5, 0x75 },
-};
-
-void sub_080A6F6C(u32);
-void PauseMenu_ItemMenu_Update(void) {
- static const u8 gUnk_08128BF4[] = { 14, 15, 2, 0 };
- u32 item;
- u32 menuSlot;
- const ItemMenuTableEntry* entry;
-
- if (sub_080A51F4()) {
- gMenu.field_0xc = (u8*)gUnk_08128BF4;
- menuSlot = gMenu.field_0x3;
-
- entry = &gItemMenuTable[menuSlot];
- switch (gInput.newKeys) {
- case A_BUTTON:
- if (menuSlot == MENU_SLOT_SAVE_BUTTON) {
-#if defined(DEMO_USA) || defined(DEMO_JP)
- SoundReq(SFX_MENU_ERROR);
-#else
- sub_080A4E84(0xb);
- SoundReq(SFX_TEXTBOX_SELECT);
-#endif
- break;
- }
- case B_BUTTON:
- if (gPauseMenu.items[menuSlot] != 0) {
- u32 slot = !!(gInput.newKeys ^ 1);
- ForceEquipItem(gPauseMenu.items[menuSlot], slot);
- SoundReq(SFX_TEXTBOX_SELECT);
- }
- break;
- default:
- switch (gInput.unk4) {
- case DPAD_UP:
- menuSlot = entry->up;
- break;
- case DPAD_DOWN:
- menuSlot = entry->down;
- break;
- case DPAD_LEFT:
- menuSlot = entry->left;
- break;
- case DPAD_RIGHT:
- menuSlot = entry->right;
- break;
- }
- break;
- }
- if (gMenu.field_0x3 != menuSlot) {
- gMenu.field_0x3 = menuSlot;
- SoundReq(SFX_TEXTBOX_CHOICE);
- }
- item = gPauseMenu.items[menuSlot];
- switch (menuSlot) {
- case MENU_SLOT_BOTTLE0:
- case MENU_SLOT_BOTTLE1:
- case MENU_SLOT_BOTTLE2:
- case MENU_SLOT_BOTTLE3:
- if (item != 0) {
- item = gSave.saved_status.field_0x24[item - 6];
- }
- break;
- case MENU_SLOT_SAVE_BUTTON:
- // ITEM_SKILL_FAST_SPIN, but that does not make any sense at all
- item = 0x73;
- break;
- default:
- break;
- }
- sub_080A6F6C(item + 0x400);
- }
-}
-
-u32 GetMenuSlotForItem(u32 item);
-extern u8* gSpriteAnimations_322[];
-#ifdef EU
-#define sub_080A5384_draw_constant0 0x1fa
-#define sub_080A5384_draw_constant1 0x141
-#else
-#define sub_080A5384_draw_constant0 0x1fb
-#define sub_080A5384_draw_constant1 0x142
-#endif
-void PauseMenu_ItemMenu_Draw(void) {
- u32 tmp;
- u32 i;
- s32 color;
- const ItemMenuTableEntry* entry;
-
- gOamCmd._4 = 0x400;
- gOamCmd._6 = 0;
- gOamCmd._8 = 0;
- for (i = 0; i < MENU_SLOT_COUNT; i++) {
- u32 item;
- if (gPauseMenu.items[i] != 0) {
- entry = &gItemMenuTable[i];
- gOamCmd.x = entry->x;
- gOamCmd.y = entry->y;
- item = gPauseMenu.items[i];
- switch (item) {
- case ITEM_BOTTLE1:
- case ITEM_BOTTLE2:
- case ITEM_BOTTLE3:
- case ITEM_BOTTLE4:
- item = gSave.stats.bottles[item - ITEM_BOTTLE1];
- break;
- default:
- break;
- }
- color = 3;
- switch (item) {
- case ITEM_BOMBS:
- case ITEM_REMOTE_BOMBS:
- if (gBombBagSizes[gSave.stats.bombBagType] <= gSave.stats.bombCount) {
- color = 4;
- }
- break;
- case ITEM_BOW:
- case ITEM_LIGHT_ARROW:
- if (gQuiverSizes[gSave.stats.quiverType] <= gSave.stats.arrowCount) {
- color = 4;
- }
- break;
- default:
- break;
- }
- gOamCmd._8 = 0x800 | color << 0xc | ((i * 8) + 0x360);
- DrawDirect(sub_080A5384_draw_constant1, *gSpriteAnimations_322[item]);
- }
- }
- gOamCmd._8 = 0x800;
- {
- u32 slot = gMenu.field_0x3;
- if ((slot == MENU_SLOT_SAVE_BUTTON) && (gSaveHeader->language != 0)) {
- slot = MENU_SLOT_SAVE_BUTTON_JP;
- }
- entry = &gItemMenuTable[slot];
- gOamCmd.x = entry->x;
- gOamCmd.y = entry->y;
- tmp = entry->type + ((gMain.ticks & 0x10) != 0 ? 3 : 4);
- DrawDirect(sub_080A5384_draw_constant0, tmp);
- }
- {
- u32 slot;
- if (gSaveHeader->language != 0) {
- slot = MENU_SLOT_SAVE_BUTTON;
- } else {
- slot = MENU_SLOT_SAVE_BUTTON_JP;
- }
- entry = &gItemMenuTable[slot];
- gOamCmd.x = entry->x;
- gOamCmd.y = entry->y;
- gOamCmd._8 = 0x800;
- DrawDirect(sub_080A5384_draw_constant0, 0x22);
- }
- i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_A]);
- if (i < MENU_SLOT_COUNT) {
- entry = &gItemMenuTable[i];
- gOamCmd.x = entry->x;
- gOamCmd.y = entry->y;
- DrawDirect(sub_080A5384_draw_constant0, 3);
- }
- i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_B]);
- if (i < MENU_SLOT_COUNT) {
- entry = &gItemMenuTable[i];
- gOamCmd.x = entry->x;
- gOamCmd.y = entry->y;
- DrawDirect(sub_080A5384_draw_constant0, 3);
- }
-}
-
-u32 GetMenuSlotForItem(u32 item) {
- u32 i;
-
- if (item != 0) {
- for (i = 0; i < MENU_SLOT_COUNT; i++) {
- if (item == gPauseMenu.items[i])
- return i;
- }
- }
- return MENU_SLOT_SAVE_BUTTON_JP;
-}
-
-Subtask sub_080A5594;
-Subtask sub_080A56A0;
-void PauseMenu2(void) {
- static Subtask* const pauseMenu2_Types[] = {
- sub_080A5594,
- sub_080A56A0,
- };
- pauseMenu2_Types[gMenu.menuType]();
- sub_080A57F4();
-}
diff --git a/src/movement.c b/src/movement.c
index 62b76406..6e87133b 100644
--- a/src/movement.c
+++ b/src/movement.c
@@ -67,31 +67,30 @@ bool32 TileCollisionFunction0(s32 x, s32 y) {
bool32 TileCollisionFunction1(s32 x, s32 y) {
return TRUE;
}
-
+const u16 gUnk_08133918[] = {
+ /*
+ 0b1000000000000000,
+ 0b1100000000000000,
+ 0b1110000000000000,
+ 0b1111000000000000,
+ 0b1111100000000000,
+ 0b1111110000000000,
+ 0b1111111000000000,
+ 0b1111111100000000,
+ 0b1111111110000000,
+ 0b1111111111000000,
+ 0b1111111111100000,
+ 0b1111111111110000,
+ 0b1111111111111000,
+ 0b1111111111111100,
+ 0b1111111111111110,
+ 0b1111111111111111,
+ */
+ 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00,
+ 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF,
+};
/** Diagonal North West filled*/
bool32 TileCollisionFunction2(s32 x, s32 y) {
- static const u16 gUnk_08133918[] = {
- /*
- 0b1000000000000000,
- 0b1100000000000000,
- 0b1110000000000000,
- 0b1111000000000000,
- 0b1111100000000000,
- 0b1111110000000000,
- 0b1111111000000000,
- 0b1111111100000000,
- 0b1111111110000000,
- 0b1111111111000000,
- 0b1111111111100000,
- 0b1111111111110000,
- 0b1111111111111000,
- 0b1111111111111100,
- 0b1111111111111110,
- 0b1111111111111111,
- */
- 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00,
- 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF,
- };
return gUnk_08133918[y & 0xf] >> (x & 0xf) & 1;
}
diff --git a/src/npc/beedle.c b/src/npc/beedle.c
index b9c562ee..351a53fb 100644
--- a/src/npc/beedle.c
+++ b/src/npc/beedle.c
@@ -70,7 +70,7 @@ void sub_080632C8(Entity* this) {
}
void sub_080632E0(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_0810C8D4) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810C8D4)) {
InitializeAnimation(this, 0);
sub_08078778(this);
this->spriteSettings.draw = 1;
@@ -127,7 +127,7 @@ void Beedle_Head(Entity* this) {
void sub_08063410(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_0810C8D4) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_0810C8D4)) {
return;
}
this->action++;
diff --git a/src/npc/bladeBrothers.c b/src/npc/bladeBrothers.c
index 7e4f161a..fb31384a 100644
--- a/src/npc/bladeBrothers.c
+++ b/src/npc/bladeBrothers.c
@@ -11,25 +11,202 @@
#include "game.h"
#include "item.h"
-extern void (*gUnk_081115C0[])(Entity*);
-extern void (*gUnk_081115D0[])(Entity*);
-
-extern u16 gUnk_081115DC[];
-extern u8 BladeBrothers_EquippedItem[];
-extern PlayerMacroEntry* BladeBrothers_PlayerMacros[];
-extern u8 gUnk_08111623[];
-extern u8 gUnk_0811162B[];
-extern u16 gUnk_08111664[];
-extern u16 gUnk_0811167A[];
-extern u16 gUnk_08111690[];
-extern u16 gUnk_081116A6[];
-extern u16 gUnk_081116BC[];
-extern u16 gUnk_081116D2[];
-extern u16 gUnk_081116E8[];
-extern u16 gUnk_081116FE[];
-extern u16 gUnk_08111714[];
-extern u32 gUnk_08111740[];
-extern u16 gUnk_0811172A[];
+void sub_08068A1C(Entity*);
+void sub_08068A4C(Entity*);
+void sub_08068AA4(Entity*);
+void sub_08068ADC(Entity*);
+void (*const gUnk_081115C0[])(Entity*) = {
+ sub_08068A1C,
+ sub_08068A4C,
+ sub_08068AA4,
+ sub_08068ADC,
+};
+void sub_08068AFC(Entity*);
+void sub_08068b2c(Entity*);
+void sub_08068B70(Entity*);
+void (*const gUnk_081115D0[])(Entity*) = {
+ sub_08068AFC,
+ sub_08068b2c,
+ sub_08068B70,
+};
+
+const u16 gUnk_081115DC[] = { 183, 184, 185, 186, 187, 188, 189, 190 };
+
+// TODO extract macros
+extern const PlayerMacroEntry gUnk_08004A0C;
+extern const PlayerMacroEntry gUnk_08004A16;
+extern const PlayerMacroEntry gUnk_08004A24;
+extern const PlayerMacroEntry gUnk_08004A32;
+extern const PlayerMacroEntry gUnk_08004A48;
+extern const PlayerMacroEntry gUnk_08004A72;
+extern const PlayerMacroEntry gUnk_08004A8C;
+extern const PlayerMacroEntry gUnk_08004AA6;
+const PlayerMacroEntry* const BladeBrothers_PlayerMacros[] = {
+ &gUnk_08004A0C, &gUnk_08004A16, &gUnk_08004A24, &gUnk_08004A32, &gUnk_08004A48, &gUnk_08004A72,
+ &gUnk_08004A8C, &gUnk_08004AA6, NULL, NULL, NULL,
+};
+
+const u8 BladeBrothers_EquippedItem[] = {
+ 0, 0, ITEM_PEGASUS_BOOTS, ITEM_ROCS_CAPE, 0, 0, 0, 0, 0, 0, 0,
+};
+
+const u8 gUnk_08111623[] = {
+ 7, 0, 4, 6, 5, 8, 9, 10,
+};
+const u8 gUnk_0811162B[] = {
+ ITEM_SKILL_SPIN_ATTACK,
+ ITEM_SKILL_ROCK_BREAKER,
+ ITEM_SKILL_DASH_ATTACK,
+ ITEM_SKILL_DOWN_THRUST,
+ ITEM_SKILL_ROLL_ATTACK,
+ ITEM_SKILL_SWORD_BEAM,
+ ITEM_SKILL_PERIL_BEAM,
+ ITEM_SKILL_GREAT_SPIN,
+ 243,
+ 244,
+ 245,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+};
+
+const u16 gUnk_08111664[] = {
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x01), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x09), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x11),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x19), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x22), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2b),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x34), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3d), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x46),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x50), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5a),
+};
+
+const u16 gUnk_0811167A[] = {
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x02), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0a), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x12),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1a), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x23), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2c),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x35), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3e), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x47),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x51), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5b),
+};
+const u16 gUnk_08111690[] = {
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x03),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0b),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x13),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1b),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x24),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2d),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x36),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3f),
+ 0x0,
+ 0x0,
+ 0x0,
+};
+const u16 gUnk_081116A6[] = {
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x04), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0c), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x14),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1c), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x25), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2e),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x37), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x40), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x48),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x52), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5c),
+};
+const u16 gUnk_081116BC[] = {
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x05),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0d),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x15),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1d),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x26),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2f),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x38),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x41),
+ 0x0,
+ 0x0,
+ 0x0,
+};
+const u16 gUnk_081116D2[] = {
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x06), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0e), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x16),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1e), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x27), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x30),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x39), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x42), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x49),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x53), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5d),
+};
+const u16 gUnk_081116E8[] = {
+ 0x0,
+ 0x0,
+ 0x0,
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x28),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x31),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3a),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x43),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f),
+};
+const u16 gUnk_081116FE[] = {
+ 0x0,
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x07),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0f),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x17),
+ 0x0,
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x32),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3b),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x44),
+ 0x0,
+ 0x0,
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5e),
+};
+const u16 gUnk_08111714[] = {
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x60),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x61),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x62),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x63),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x64),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x65),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x66),
+ TEXT_INDEX(TEXT_BLADE_MASTERS, 0x67),
+ 0x0,
+ 0x0,
+ 0x0,
+};
+
+const u16 gUnk_0811172A[] = { 0, 0, 30, 0, 0, 0, 0, 30, 0, 0, 0 };
+const u32 gUnk_08111740[] = { 1, 4, 3, 7, 2, 5, 8, 6, 10, 11, 12 };
+
extern u32 gUnk_0300402B;
extern EntityData gUnk_080F3494;
@@ -146,7 +323,7 @@ void BladeBrothers_StartPlayerDemonstration(Entity* this, ScriptExecutionContext
if (p = this->timer, BladeBrothers_EquippedItem[p]) {
ForceEquipItem(BladeBrothers_EquippedItem[this->timer], EQUIP_SLOT_A);
}
- InitPlayerMacro(BladeBrothers_PlayerMacros[this->timer]);
+ InitPlayerMacro((PlayerMacroEntry*)BladeBrothers_PlayerMacros[this->timer]);
}
void sub_08068BB4(Entity* this) {
@@ -196,7 +373,7 @@ void BladeBrothers_GetScroll(Entity* this) {
}
void sub_08068C8C(Entity* this, ScriptExecutionContext* context) {
- u8* arr = gUnk_0811162B + 0xd;
+ const u8* arr = gUnk_0811162B + 0xd;
context->condition = *(u32*)(arr + this->timer * 4);
}
diff --git a/src/npc/carpenter.c b/src/npc/carpenter.c
index d8572d1d..a4da0fff 100644
--- a/src/npc/carpenter.c
+++ b/src/npc/carpenter.c
@@ -98,7 +98,7 @@ void sub_08067314(Entity* this) {
void Carpenter_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_08110CA8[this->type * 4]) != 0) {
+ if (LoadExtraSpriteData(this, &gUnk_08110CA8[this->type * 4])) {
this->action = this->action + 1;
this->spriteSettings.draw = 1;
SetDefaultPriority(this, PRIO_MESSAGE);
diff --git a/src/npc/castleMaid.c b/src/npc/castleMaid.c
index cb327cdc..c17db2f8 100644
--- a/src/npc/castleMaid.c
+++ b/src/npc/castleMaid.c
@@ -66,7 +66,7 @@ void sub_08064570(CastleMaidEntity* this) {
tmp3 = 0;
}
data = &gUnk_0810F874[tmp3 * 3];
- if (LoadExtraSpriteData(super, data) == 0) {
+ if (!LoadExtraSpriteData(super, data)) {
return;
}
super->action++;
diff --git a/src/npc/dog.c b/src/npc/dog.c
index cacabce8..fef5cd27 100644
--- a/src/npc/dog.c
+++ b/src/npc/dog.c
@@ -4,32 +4,177 @@
#include "npc.h"
#include "item.h"
-extern void (*gUnk_08111D88[])(Entity*);
void sub_08069FE8(Entity*);
-u32 sub_08069EF0(Entity*);
-
-extern u8 gUnk_08111DA8[];
+bool32 sub_08069EF0(Entity*);
bool32 sub_08069F90(Entity*);
void sub_08069F6C(Entity*);
void sub_08069D00(Entity*);
void sub_08069CB8(Entity*);
-
-extern u8 gUnk_08111DB0[];
void sub_0806A028(Entity*);
-
void sub_08069FBC(Entity*);
-
-extern SpriteLoadData gUnk_08111D58[];
-extern u8 gUnk_08111E30[];
-
void sub_0806A080(Entity*);
-extern Dialog gUnk_08111E34[][10];
-
-extern u16 gUnk_08111F74[][5];
-
-extern u16 gUnk_08111FD8[];
-
+const SpriteLoadData gUnk_08111D58[] = {
+#ifdef EU
+ { 82, 67, 4 }, { 7250, 67, 4 }, { 0, 0, 0 }, { 64, 69, 4 }, { 7232, 69, 4 }, { 0, 0, 0 },
+#else
+ { 82, 67, 4 }, { 7250, 67, 4 }, { 0, 0, 0 }, { 1, 69, 4 }, { 7169, 69, 4 }, { 0, 0, 0 },
+#endif
+ { 4, 68, 4 }, { 7172, 68, 4 }, { 0, 0, 0 }, { 83, 69, 4 }, { 7251, 69, 4 }, { 0, 0, 0 },
+};
+
+void sub_08069B44(Entity*);
+void sub_08069C40(Entity*);
+void sub_08069D54(Entity*);
+void sub_08069DF8(Entity*);
+void sub_08069E44(Entity*);
+void sub_08069E50(Entity*);
+void sub_08069ECC(Entity*);
+void sub_08069EE0(Entity*);
+void (*const gUnk_08111D88[])(Entity*) = {
+ sub_08069B44, sub_08069C40, sub_08069D54, sub_08069DF8, sub_08069E44, sub_08069E50, sub_08069ECC, sub_08069EE0,
+};
+
+const u8 gUnk_08111DA8[] = { 7, 23, 8, 24, 8, 24, 9, 25 };
+const u8 gUnk_08111DB0[] = {
+ 24, 24, 24, 24, 25, 25, 25, 25, 77, 77, 77, 77, 78, 78, 78, 146, 146, 214, 214, 214, 215, 215,
+ 215, 215, 27, 27, 27, 27, 24, 24, 24, 24, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77,
+ 78, 78, 78, 78, 146, 146, 146, 146, 147, 147, 147, 215, 215, 27, 27, 27, 24, 24, 24, 24, 24, 76,
+ 76, 76, 77, 77, 77, 77, 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147,
+ 215, 215, 215, 215, 212, 212, 212, 24, 24, 24, 24, 24, 25, 25, 25, 77, 77, 145, 145, 145, 146, 146,
+ 146, 146, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 212, 212, 212, 212,
+};
+const u8 gUnk_08111E30[] = { 19, 13, 13, 13 };
+
+void sub_0806A0A4(Entity*);
+void sub_0806A144(Entity*);
+
+const Dialog gUnk_08111E34[][10] = {
+ {
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } },
+ },
+ {
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN2, 0x14), TEXT_INDEX(TEXT_TOWN2, 0x15) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN3, 0x14), TEXT_INDEX(TEXT_TOWN3, 0x15) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN4, 0x14), TEXT_INDEX(TEXT_TOWN4, 0x15) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN5, 0x14), TEXT_INDEX(TEXT_TOWN5, 0x15) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN6, 0x13), TEXT_INDEX(TEXT_TOWN6, 0x14) } },
+ { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN6, 0x13), TEXT_INDEX(TEXT_TOWN6, 0x14) } },
+ },
+ {
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } },
+ },
+ {
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } },
+ }
+};
+const u16 gUnk_08111F74[][5] = {
+ {
+ TEXT_INDEX(TEXT_TOWN, 0x3b),
+ TEXT_INDEX(TEXT_TOWN, 0x3c),
+ TEXT_INDEX(TEXT_TOWN2, 0x32),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN2, 0x34),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN, 0x3b),
+ TEXT_INDEX(TEXT_TOWN, 0x3c),
+ TEXT_INDEX(TEXT_TOWN2, 0x32),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN2, 0x34),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN, 0x3b),
+ TEXT_INDEX(TEXT_TOWN, 0x3c),
+ TEXT_INDEX(TEXT_TOWN2, 0x32),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN2, 0x34),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN, 0x3b),
+ TEXT_INDEX(TEXT_TOWN, 0x3c),
+ TEXT_INDEX(TEXT_TOWN2, 0x32),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN2, 0x34),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN2, 0x30),
+ TEXT_INDEX(TEXT_TOWN2, 0x31),
+ TEXT_INDEX(TEXT_TOWN2, 0x32),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN2, 0x34),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN3, 0x2c),
+ TEXT_INDEX(TEXT_TOWN3, 0x2d),
+ TEXT_INDEX(TEXT_TOWN3, 0x2e),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN3, 0x2f),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN4, 0x28),
+ TEXT_INDEX(TEXT_TOWN4, 0x29),
+ TEXT_INDEX(TEXT_TOWN4, 0x2a),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN4, 0x2b),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN5, 0x28),
+ TEXT_INDEX(TEXT_TOWN5, 0x29),
+ TEXT_INDEX(TEXT_TOWN5, 0x2a),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN5, 0x2b),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN6, 0x21),
+ TEXT_INDEX(TEXT_TOWN6, 0x22),
+ TEXT_INDEX(TEXT_TOWN6, 0x23),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN6, 0x24),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN6, 0x21),
+ TEXT_INDEX(TEXT_TOWN6, 0x22),
+ TEXT_INDEX(TEXT_TOWN6, 0x23),
+ TEXT_INDEX(TEXT_TOWN2, 0x33),
+ TEXT_INDEX(TEXT_TOWN6, 0x24),
+ },
+};
+const u16 gUnk_08111FD8[] = {
+ TEXT_INDEX(TEXT_TOWN8, 0x7), TEXT_INDEX(TEXT_TOWN8, 0x8), TEXT_INDEX(TEXT_TOWN8, 0x9),
+ TEXT_INDEX(TEXT_TOWN8, 0x11), TEXT_INDEX(TEXT_TOWN8, 0x3),
+};
void Dog(Entity* this) {
gUnk_08111D88[this->action](this);
sub_0806ED78(this);
@@ -41,7 +186,7 @@ void sub_08069B44(Entity* this) {
u32 sVar3;
u32 uVar4;
u32 uVar5;
- if (sub_08069EF0(this) != 0) {
+ if (sub_08069EF0(this)) {
uVar5 = sub_0805ACC0(this);
if (uVar5 == 0) {
sVar3 = this->x.HALF.HI;
@@ -234,13 +379,13 @@ void sub_08069EE8(Entity* this) {
this->action = 5;
}
-u32 sub_08069EF0(Entity* this) {
- if (LoadExtraSpriteData(this, &gUnk_08111D58[this->type * 3]) == 0) {
- return 0;
+bool32 sub_08069EF0(Entity* this) {
+ if (!LoadExtraSpriteData(this, &gUnk_08111D58[this->type * 3])) {
+ return FALSE;
}
this->action = 1;
this->field_0x68.HWORD = gUnk_08111E30[this->type];
- return 1;
+ return TRUE;
}
void Dog_Head(Entity* this) {
@@ -358,7 +503,7 @@ void sub_0806A144(Entity* this) {
void Dog_Fusion(Entity* this) {
if (this->action == 0) {
- if (sub_08069EF0(this) != 0) {
+ if (sub_08069EF0(this)) {
this->action++;
this->spriteSettings.draw = 1;
SetDefaultPriority(this, PRIO_MESSAGE);
diff --git a/src/npc/farmers.c b/src/npc/farmers.c
index 86838460..59de6957 100644
--- a/src/npc/farmers.c
+++ b/src/npc/farmers.c
@@ -11,7 +11,7 @@ void sub_0806BC58(Entity* this);
void Farmers(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3]) == 0) {
+ if (!LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3])) {
return;
}
this->action++;
@@ -81,8 +81,8 @@ void sub_0806BCE8(Entity* this) {
void Farmers_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3]) != 0) {
- this->action = this->action + 1;
+ if (LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3])) {
+ this->action++;
this->spriteSettings.draw = 1;
this->spriteSettings.flipX = 0;
sub_0806BC58(this);
diff --git a/src/npc/forestMinish.c b/src/npc/forestMinish.c
index 1e833a02..7f3625f0 100644
--- a/src/npc/forestMinish.c
+++ b/src/npc/forestMinish.c
@@ -1,24 +1,510 @@
-#include "npc.h"
-#include "object.h"
#include "functions.h"
-#include "playeritem.h"
#include "item.h"
#include "kinstone.h"
-
-extern SpriteLoadData gUnk_0810A348;
-extern u8* gUnk_08109D18[];
-extern u8 gUnk_08109C98[];
-extern u16 gUnk_0810A354[];
-extern Dialog gUnk_08109DC8[];
-extern u16 gUnk_0810A35A[];
-extern u16 gUnk_0810A362[];
+#include "npc.h"
+#include "object.h"
+#include "playeritem.h"
+#include "structures.h"
+
+const FrameStruct gUnk_08109C98[] = {
+ { 36, 26 }, { 37, 26 }, { 38, 26 }, { 39, 155 }, { 40, 155 }, { 41, 155 }, { 42, 155 }, { 43, 152 },
+ { 28, 152 }, { 29, 152 }, { 30, 153 }, { 31, 153 }, { 32, 153 }, { 33, 153 }, { 34, 26 }, { 35, 26 },
+ { 36, 154 }, { 37, 154 }, { 38, 27 }, { 39, 27 }, { 40, 27 }, { 41, 27 }, { 42, 27 }, { 43, 152 },
+ { 28, 152 }, { 29, 152 }, { 30, 152 }, { 31, 153 }, { 32, 153 }, { 33, 153 }, { 34, 154 }, { 35, 154 },
+ { 36, 154 }, { 37, 154 }, { 38, 155 }, { 39, 155 }, { 40, 155 }, { 41, 155 }, { 42, 24 }, { 43, 24 },
+ { 28, 24 }, { 29, 24 }, { 30, 24 }, { 31, 153 }, { 32, 153 }, { 33, 153 }, { 34, 153 }, { 35, 154 },
+ { 36, 154 }, { 37, 154 }, { 38, 154 }, { 39, 155 }, { 40, 155 }, { 41, 155 }, { 42, 152 }, { 43, 152 },
+ { 28, 152 }, { 29, 152 }, { 30, 25 }, { 31, 25 }, { 32, 25 }, { 33, 25 }, { 34, 25 }, { 35, 154 },
+};
+extern Script script_BombMinish;
+extern Script script_BombMinishKinstone;
+extern Script script_ForestMinish1;
+extern Script script_ForestMinish2;
+extern Script script_ForestMinish3;
+extern Script script_ForestMinish4;
+extern Script script_ForestMinish5;
+extern Script script_ForestMinish6;
+extern Script script_ForestMinish7;
+extern Script script_ForestMinish8;
+extern Script script_ForestMinish9;
+extern Script script_ForestMinish10;
+extern Script script_ForestMinish11;
+extern Script script_ForestMinish12;
+extern Script script_ForestMinish13;
+extern Script script_ForestMinish14;
+extern Script script_ForestMinish15;
+extern Script script_ForestMinish16;
+extern Script script_ForestMinish17;
+extern Script script_ForestMinish18;
+extern Script script_ForestMinish19;
+extern Script script_ForestMinish20;
+extern Script script_ForestMinish21;
+Script* const gUnk_08109D18[] = {
+ &script_BombMinish, &script_BombMinishKinstone, &script_ForestMinish12, &script_ForestMinish13,
+ &script_ForestMinish14, &script_ForestMinish15, &script_ForestMinish16, &script_ForestMinish17,
+ &script_ForestMinish18, &script_ForestMinish19, &script_ForestMinish20, &script_ForestMinish21,
+ &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish2,
+ &script_ForestMinish3, &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish1,
+ &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish10, &script_ForestMinish4,
+ &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4,
+ &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4,
+ &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4,
+ &script_ForestMinish11, &script_ForestMinish11, &script_ForestMinish11, &script_ForestMinish5,
+ &script_ForestMinish6, &script_ForestMinish7, &script_ForestMinish8, &script_ForestMinish9,
+};
+
+void sub_080601D4(Entity*);
+const Dialog gUnk_08109DC8[][4] = {
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { KINSTONE_24,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } },
+ { KINSTONE_24,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } },
+ { KINSTONE_24,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } },
+ { KINSTONE_24,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } },
+ },
+ {
+ { KINSTONE_14,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } },
+ { KINSTONE_14,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } },
+ { KINSTONE_14,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } },
+ { KINSTONE_14,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } },
+ },
+ {
+#if defined(USA) || defined(DEMO_USA)
+ { KINSTONE_3F,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+ { KINSTONE_3F,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+ { KINSTONE_3F,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+ { KINSTONE_3F,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+#else
+ { KINSTONE_22,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+ { KINSTONE_22,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+ { KINSTONE_22,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+ { KINSTONE_22,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } },
+#endif
+ },
+ {
+ { KINSTONE_2E,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } },
+ { KINSTONE_2E,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } },
+ { KINSTONE_2E,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } },
+ { KINSTONE_2E,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } },
+ },
+ {
+ { KINSTONE_23,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } },
+ { KINSTONE_23,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } },
+ { KINSTONE_23,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } },
+ { KINSTONE_23,
+ DIALOG_KINSTONE,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } },
+ },
+ {
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x3) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x23) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x24) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x6) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0xe) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0xe) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0xe) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x15) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x15) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x15) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1a) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1a) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1a) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1f) } },
+ { ITEM_GREEN_SWORD,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_FOREST_MINISH, 0x21), TEXT_INDEX(TEXT_FOREST_MINISH, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x21) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x24) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x25) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x25) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x29) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2a) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2b) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2e) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2f) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2f) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x34) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x38) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x39) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x39) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } },
+ },
+ {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } },
+ },
+ {
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } },
+ },
+ {
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } },
+ },
+ {
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } },
+ { ITEM_FLIPPERS,
+ DIALOG_INVENTORY,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ },
+ {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ }
+};
+
+const SpriteLoadData gUnk_0810A348[] = {
+ { 48, 31, 4 },
+ { 8240, 31, 4 },
+ { 0, 0, 0 },
+};
+const u16 gUnk_0810A354[] = {
+ TEXT_INDEX(TEXT_MINISH, 0x14),
+ TEXT_INDEX(TEXT_MINISH, 0x18),
+ TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x26),
+};
+const u16 gUnk_0810A35A[] = {
+ TEXT_INDEX(TEXT_UNK_WISE, 0x1),
+ TEXT_INDEX(TEXT_UNK_WISE, 0x2),
+ TEXT_INDEX(TEXT_UNK_WISE, 0x3),
+ TEXT_INDEX(TEXT_UNK_WISE, 0x4),
+};
+const u16 gUnk_0810A362[] = {
+ TEXT_INDEX(TEXT_BELARI, 0x2),
+ TEXT_INDEX(TEXT_BELARI, 0x3),
+ TEXT_INDEX(TEXT_BELARI, 0x9),
+ TEXT_INDEX(TEXT_BELARI, 0x8),
+};
static void sub_080600F0(Entity* this);
void ForestMinish(Entity* this) {
switch (this->action) {
case 0:
- if (LoadExtraSpriteData(this, &gUnk_0810A348)) {
+ if (LoadExtraSpriteData(this, gUnk_0810A348)) {
this->action = 1;
this->spriteSettings.draw = TRUE;
this->field_0x68.HALF.HI = this->animationState = this->timer << 1;
@@ -100,7 +586,7 @@ void sub_0806014C(Entity* this) {
void sub_08060158(Entity* this) {
int index;
- u8* idx3;
+ const FrameStruct* idx3;
u8 tmp1, tmp2;
if (this->timer) {
@@ -114,9 +600,9 @@ void sub_08060158(Entity* this) {
index = state * 4;
}
- idx3 = gUnk_08109C98 + (this->animationState / 2) * 0x20 + (index >> 1) * 2;
- tmp1 = idx3[0];
- tmp2 = idx3[1];
+ idx3 = gUnk_08109C98 + (this->animationState / 2) * 0x10 + (index >> 1);
+ tmp1 = idx3->frame;
+ tmp2 = idx3->frameIndex;
if (tmp2 & 0x80) {
this->animationState = sub_0806F5B0(index);
@@ -144,7 +630,7 @@ void sub_080601D4(Entity* this) {
}
void sub_08060208(Entity* this) {
- ShowNPCDialogue(this, &gUnk_08109DC8[this->type2 * 0x4]);
+ ShowNPCDialogue(this, gUnk_08109DC8[this->type2]);
}
void sub_0806021C(Entity* this) {
@@ -161,11 +647,11 @@ void sub_0806021C(Entity* this) {
if (GetInventoryValue(ITEM_MOLE_MITTS)) {
uVar2 = 3;
}
- ShowNPCDialogue(this, gUnk_08109DC8 + this->type2 * 0x4 + uVar2);
+ ShowNPCDialogue(this, &gUnk_08109DC8[this->type2][uVar2]);
}
void sub_0806025C(Entity* this) {
- ShowNPCDialogue(this, &gUnk_08109DC8[this->type2 * 0x4]);
+ ShowNPCDialogue(this, gUnk_08109DC8[this->type2]);
}
void sub_08060270(Entity* this) {
@@ -249,7 +735,7 @@ u32 sub_08060354(void) {
void ForestMinish_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_0810A348)) {
+ if (LoadExtraSpriteData(this, gUnk_0810A348)) {
this->action++;
this->spriteSettings.draw = TRUE;
SetDefaultPriority(this, PRIO_MESSAGE);
diff --git a/src/npc/gorman.c b/src/npc/gorman.c
index bfb30084..bec184f5 100644
--- a/src/npc/gorman.c
+++ b/src/npc/gorman.c
@@ -1,30 +1,57 @@
#include "functions.h"
#include "npc.h"
-extern void (*const gUnk_08111C48[])(Entity*);
-
void sub_080697A4(Entity* this);
void sub_08069838(Entity* this);
-
-extern SpriteLoadData gUnk_08111C3C;
-
-extern u8 gUnk_08111C9C[];
-
-extern u8 gUnk_08111CA8[];
-
-extern u8 gUnk_08111CB4[];
-
-extern u8 gUnk_08111CB8[];
-
void sub_08069888(Entity* this);
-extern u16 gUnk_08111C50[];
-
-extern const s16 gUnk_08111C5C[];
-extern const u8 gUnk_08111C74[];
-
-extern const s16 gUnk_08111C84[];
-extern const u8 gUnk_08111C8C[];
+const SpriteLoadData gUnk_08111C3C[] = {
+ { 193, 64, 4 },
+ { 5313, 64, 4 },
+ { 0, 0, 0 },
+};
+void sub_080697C4(Entity*);
+void sub_080697EC(Entity*);
+void (*const gUnk_08111C48[])(Entity*) = {
+ sub_080697C4,
+ sub_080697EC,
+};
+const u16 gUnk_08111C50[] = {
+ TEXT_INDEX(TEXT_GORMAN_ORACLES, 0x1), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0x2), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0xc),
+ TEXT_INDEX(TEXT_GORMAN_ORACLES, 0xd), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0xe), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0x15),
+};
+const Coords gUnk_08111C5C[] = {
+ { .HALF = { 0x68, 0x1c8 } }, { .HALF = { 0x28, 0x1c8 } }, { .HALF = { 0x68, 0x188 } },
+ { .HALF = { 0x68, 0x1c8 } }, { .HALF = { 0x28, 0x188 } }, { .HALF = { 0x68, 0x188 } }
+};
+const u8 gUnk_08111C74[] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0,
+};
+const Coords gUnk_08111C84[] = {
+ { .HALF = { 0x178, 0x108 } },
+ { .HALF = { 0x138, 0x108 } },
+};
+const u8 gUnk_08111C8C[] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0,
+};
+const u8 gUnk_08111C9C[] = {
+ 0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5,
+};
+const u8 gUnk_08111CA8[] = {
+ 1, 2, 0, 0, 3, 4, 1, 2, 5, 5, 3, 4,
+};
+const u8 gUnk_08111CB4[] = {
+ 0,
+ 1,
+ 0,
+ 1,
+};
+const u8 gUnk_08111CB8[] = {
+ 1,
+ 1,
+ 0,
+ 0,
+};
void Gorman(Entity* this) {
if ((this->flags & ENT_SCRIPTED) != 0) {
@@ -40,7 +67,7 @@ void sub_080697A4(Entity* this) {
}
void sub_080697C4(Entity* this) {
- if (LoadExtraSpriteData(this, &gUnk_08111C3C) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08111C3C)) {
this->action = 1;
InitializeAnimation(this, 2);
sub_08078778(this);
@@ -69,7 +96,7 @@ void sub_080697EC(Entity* this) {
void sub_08069838(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_08111C3C) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_08111C3C)) {
return;
}
this->action++;
@@ -107,11 +134,11 @@ void sub_08069888(Entity* this) {
void sub_0806991C(Entity* this, ScriptExecutionContext* context) {
u32 tmp;
- const s16* ptr;
+ const Coords* ptr;
this->field_0x68.HALF.LO = (Random() & 0x1f) + 0x3c;
- ptr = &gUnk_08111C5C[*(s8*)&this->field_0x68.HALF.HI * 2];
- context->x.HALF.HI = gRoomControls.origin_x + ptr[0];
- context->y.HALF.HI = gRoomControls.origin_y + ptr[1];
+ ptr = &gUnk_08111C5C[*(s8*)&this->field_0x68.HALF.HI];
+ context->x.HALF.HI = gRoomControls.origin_x + ptr->HALF.x;
+ context->y.HALF.HI = gRoomControls.origin_y + ptr->HALF.y;
context->unk_19 = 8;
context->postScriptActions |= 2;
context->condition = 0;
@@ -123,11 +150,11 @@ void sub_0806991C(Entity* this, ScriptExecutionContext* context) {
void sub_080699AC(Entity* this, ScriptExecutionContext* context) {
u32 tmp;
- const s16* ptr;
+ const Coords* ptr;
this->field_0x68.HALF.LO = (Random() & 0x1f) + 0x3c;
- ptr = &gUnk_08111C84[*(s8*)&this->field_0x68.HALF.HI * 2];
- context->x.HALF.HI = gRoomControls.origin_x + ptr[0];
- context->y.HALF.HI = gRoomControls.origin_y + ptr[1];
+ ptr = &gUnk_08111C84[*(s8*)&this->field_0x68.HALF.HI];
+ context->x.HALF.HI = gRoomControls.origin_x + ptr->HALF.x;
+ context->y.HALF.HI = gRoomControls.origin_y + ptr->HALF.y;
context->unk_19 = 8;
context->postScriptActions |= 2;
context->condition = 0;
diff --git a/src/npc/goron.c b/src/npc/goron.c
index 497b8ab3..e046f7c9 100644
--- a/src/npc/goron.c
+++ b/src/npc/goron.c
@@ -1,8 +1,8 @@
-#include "global.h"
+#include "effects.h"
#include "entity.h"
#include "functions.h"
+#include "kinstone.h"
#include "message.h"
-#include "effects.h"
#include "npc.h"
void sub_08069310(Entity*);
@@ -158,7 +158,7 @@ void sub_080694EC(Entity* this) {
u32 anim;
this->animationState = 4;
anim = 2;
- if (!CheckKinstoneFused(47))
+ if (!CheckKinstoneFused(KINSTONE_2F))
anim = 8;
InitAnimationForceUpdate(this, anim);
this->field_0x80.HWORD = anim;
diff --git a/src/npc/guard.c b/src/npc/guard.c
index a3e9bf05..661739ee 100644
--- a/src/npc/guard.c
+++ b/src/npc/guard.c
@@ -24,12 +24,242 @@ extern void sub_08064428(Entity*);
void sub_08063DC8(Entity*);
void sub_08063F20(Entity*);
-extern void (*const gUnk_0810F544[])(Entity*);
-extern void (*const gUnk_0810F550[])(Entity*);
+// TODO guardWithSpear rodata before this
+const Dialog gUnk_0810CF4C[] = {
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FINDING_EZLO, 0x17) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FINDING_EZLO, 0x18) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CARPENTERS, 0x6) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CARPENTERS, 0x5) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x3e) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x40) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x3c) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x3b) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { TABIDACHI,
+ DIALOG_GLOBAL_FLAG,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } },
+ { TABIDACHI,
+ DIALOG_GLOBAL_FLAG,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } },
+ { TABIDACHI,
+ DIALOG_GLOBAL_FLAG,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } },
+ { TABIDACHI,
+ DIALOG_GLOBAL_FLAG,
+ DIALOG_CHECK_FLAG,
+ 1,
+ { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x22) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0x1d) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x63) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x64) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+};
-// entity count
-extern SpriteLoadData gUnk_0810F524[];
-extern void* gUnk_0810F6BC[];
+const Dialog gUnk_0810D0A4[] = {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN, 0x32) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN, 0x32) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x2d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x29) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x29) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x26) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x24) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x24) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x1d) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xb) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x26) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x23) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x1c) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x8) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x35) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xc) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x24) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x21) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x22) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x1b) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x38) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x32) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x2d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x2d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x26) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xd) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x16) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x16) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x4) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x15) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x6) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x5) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x1) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x9) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xa) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN, 0x33) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x30) } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+ { 0, 0, DIALOG_NONE, 0, { 0, 0 } },
+};
+// Seemingly wasted space. Is this ever indexed?
+const u32 emptyDialogs[2048] = {};
+
+const SpriteLoadData gUnk_0810F524[] = {
+ { 55, 43, 4 }, { 6199, 43, 4 }, { 22583, 43, 4 }, { 0, 0, 0 },
+ { 4, 43, 4 }, { 16388, 43, 4 }, { 8196, 43, 4 }, { 0, 0, 0 },
+};
+void sub_08063E90(Entity*);
+void sub_08063F20(Entity*);
+void sub_08063F78(Entity*);
+void (*const gUnk_0810F544[])(Entity*) = {
+ sub_08063E90,
+ sub_08063F20,
+ sub_08063F78,
+};
+void sub_08063D44(Entity*);
+void sub_08063DC8(Entity*);
+void sub_08063E54(Entity*);
+void sub_08063E6C(Entity*);
+void (*const gUnk_0810F550[])(Entity*) = {
+ sub_08063D44,
+ sub_08063DC8,
+ sub_08063E54,
+ sub_08063E6C,
+};
+
+extern void* gUnk_0810F6BC[]; // TODO find out type of second param for sub_0806EE04
void Guard(Entity* this) {
if ((this->flags & ENT_SCRIPTED) != 0) {
diff --git a/src/npc/hurdyGurdyMan.c b/src/npc/hurdyGurdyMan.c
index c56d745e..4decaced 100644
--- a/src/npc/hurdyGurdyMan.c
+++ b/src/npc/hurdyGurdyMan.c
@@ -13,7 +13,7 @@ void HurdyGurdyMan(Entity* this) {
switch (this->action) {
case 0:
- if (LoadExtraSpriteData(this, gUnk_081144F0) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_081144F0)) {
this->action = 1;
this->field_0x68.HALF.HI = 0;
SetDefaultPriority(this, PRIO_MESSAGE);
@@ -106,11 +106,8 @@ void sub_0806E440(Entity* this) {
}
void HurdyGurdyMan_Fusion(Entity* this) {
- u32 uVar1;
-
if (this->action == 0) {
- uVar1 = LoadExtraSpriteData(this, gUnk_081144F0);
- if (uVar1 != 0) {
+ if (LoadExtraSpriteData(this, gUnk_081144F0)) {
this->action++;
this->spriteSettings.draw = 1;
SetDefaultPriority(this, PRIO_MESSAGE);
diff --git a/src/npc/kid.c b/src/npc/kid.c
index 1371fb9d..59e1e87f 100644
--- a/src/npc/kid.c
+++ b/src/npc/kid.c
@@ -2,14 +2,184 @@
#include "message.h"
#include "npc.h"
-extern void (*const gUnk_0810BE0C[])(Entity*);
-void sub_080621AC(Entity*);
-
-extern SpriteLoadData* gUnk_0810BDC4[];
+const SpriteLoadData gUnk_0810BD7C[] = {
+ { 58, 59, 4 },
+ { 10298, 59, 4 },
+ { 12288, 59, 4 },
+ { 0, 0, 0 },
+};
+const SpriteLoadData gUnk_0810BD8C[] = {
+ { 58, 59, 4 },
+ { 8250, 59, 4 },
+ { 10241, 59, 4 },
+ { 0, 0, 0 },
+};
+const SpriteLoadData gUnk_0810BD9C[] = {
+ { 16385, 59, 4 },
+ { 58, 59, 4 },
+ { 8250, 59, 4 },
+ { 0, 0, 0 },
+};
+const SpriteLoadData gUnk_0810BDAC[] = {
+ { 58, 59, 4 },
+ { 6202, 59, 4 },
+ { 0, 0, 0 },
+};
+const SpriteLoadData gUnk_0810BDB8[] = {
+ { 58, 59, 4 },
+ { 6202, 59, 4 },
+ { 0, 0, 0 },
+};
+
+const SpriteLoadData* const gUnk_0810BDC4[] = {
+ gUnk_0810BD7C, gUnk_0810BD7C, gUnk_0810BD7C, gUnk_0810BD7C, gUnk_0810BD8C,
+ gUnk_0810BD8C, gUnk_0810BD9C, gUnk_0810BDAC, gUnk_0810BDB8,
+};
+
+const u16 gUnk_0810BDE8[][2] = { {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ },
+ {
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ TEXT_INDEX(TEXT_EMPTY, 0x1),
+ } };
+void sub_080620F4(Entity*);
+void sub_08062130(Entity*);
+void sub_08062194(Entity*);
+void (*const gUnk_0810BE0C[])(Entity*) = { sub_080620F4, sub_08062130, sub_08062194 };
+
+void sub_08062194(Entity*);
+const Dialog gUnk_0810BE10[] = {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0xf) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x7) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xb) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xb) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xc) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xc) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x8) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2e) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2e) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0xe) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x35) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2d) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x36) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SIMON, 0x13) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SIMON, 0x13) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0x14) } },
+ { 9, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x31), TEXT_INDEX(TEXT_TOWN, 0x30) } },
+ { 9, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x31), TEXT_INDEX(TEXT_TOWN, 0x30) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x10) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x35) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x16) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x16) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1e) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1e) } },
+ { 0, 0, DIALOG_CHECK_FLAG, 1, { TEXT_INDEX(TEXT_FESTIVAL, 0x20), TEXT_INDEX(TEXT_FESTIVAL, 0x13) } },
+#if defined(USA) || defined(DEMO_USA)
+ { 212, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } },
+ { 212, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } },
+#else
+ { 209, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } },
+ { 209, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } },
+#endif
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x11) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x33) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x17) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x17) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x20) } },
+ { 0, 0, DIALOG_CHECK_FLAG, 1, { TEXT_INDEX(TEXT_FESTIVAL, 0x21), TEXT_INDEX(TEXT_FESTIVAL, 0x1e) } },
+#if defined(USA) || defined(DEMO_USA)
+ { 213, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } },
+ { 213, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } },
+#else
+ { 210, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } },
+ { 210, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } },
+#endif
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x12) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x34) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x18) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x18) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x21) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x21) } },
+};
+const FrameStruct gUnk_0810C0A0[] = {
+ { 25, 0 }, { 128, 15 }, { 37, 0 }, { 128, 15 }, { 46, 0 }, { 128, 15 },
+ { 55, 0 }, { 128, 15 }, { 64, 15 }, { 128, 15 }, { 72, 15 }, { 128, 15 },
+ { 120, 83 }, { 128, 15 }, { 131, 102 }, { 128, 15 }, { 139, 111 }, { 128, 15 },
+};
+void sub_080621AC(Entity*);
void sub_080622F4(Entity*);
void sub_0806265C(Entity*, ScriptExecutionContext*);
-
void sub_0806252C(Entity*);
typedef struct {
@@ -23,12 +193,6 @@ typedef struct {
#define KID_HEAP_COUNT 0x14
typedef KidHeapItem KidHeap[KID_HEAP_COUNT];
-extern u16 gUnk_0810BDE8[][2];
-
-extern Dialog gUnk_0810BE10[];
-
-extern u8 gUnk_0810C0A0[];
-
void Kid(Entity* this) {
if ((this->flags & ENT_SCRIPTED) != 0) {
sub_080621AC(this);
@@ -38,7 +202,7 @@ void Kid(Entity* this) {
}
void sub_080620F4(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type])) {
this->animationState = 4;
this->field_0x68.HALF.LO = 0;
this->action = 1;
@@ -76,7 +240,7 @@ void sub_080621AC(Entity* this) {
switch (this->action) {
case 0:
- if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type])) {
this->action = 1;
this->animationState = this->timer;
this->timer = 0;
@@ -204,7 +368,7 @@ void sub_0806265C(Entity* this, ScriptExecutionContext* context) {
if (gSave.global_progress == 0) {
MessageNoOverlap(0, this);
} else {
- Dialog* pDialog = &gUnk_0810BE10[this->type * 9];
+ const Dialog* pDialog = &gUnk_0810BE10[this->type * 9 - 1];
pDialog += gSave.global_progress;
ShowNPCDialogue(this, pDialog);
}
@@ -273,17 +437,15 @@ void sub_080627E8(Entity* this, ScriptExecutionContext* context) {
}
void Kid_Head(Entity* this) {
- u32 uVar1;
u32 uVar2;
u32 uVar3;
u32 uVar4;
u32 uVar5;
- u8* ptr;
+ const FrameStruct* ptr;
- uVar1 = this->type * 4;
- ptr = &gUnk_0810C0A0[uVar1];
- uVar3 = ((u8)this->frame & 0x1f) + ptr[0];
- uVar4 = (this->frameIndex & 0x1f) + ptr[1];
+ ptr = &gUnk_0810C0A0[this->type * 2];
+ uVar3 = ((u8)this->frame & 0x1f) + ptr->frame;
+ uVar4 = (this->frameIndex & 0x1f) + ptr->frameIndex;
switch (this->type) {
case 0:
case 1:
@@ -400,7 +562,7 @@ void sub_08062A48(Entity* this, ScriptExecutionContext* context) {
void Kid_Fusion(Entity* this) {
u32 tmp;
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type])) {
this->action = this->action + 1;
this->spriteSettings.draw = 1;
this->y.HALF.HI = this->y.HALF.HI + -8;
diff --git a/src/npc/mama.c b/src/npc/mama.c
index ffe8abb6..0cbda85b 100644
--- a/src/npc/mama.c
+++ b/src/npc/mama.c
@@ -46,7 +46,7 @@ void Mama(Entity* this) {
}
bool32 sub_0806C454(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_08113754) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_08113754)) {
return FALSE;
} else {
SetDefaultPriority(this, PRIO_MESSAGE);
diff --git a/src/npc/melari.c b/src/npc/melari.c
index 73b86a1a..7e20dbed 100644
--- a/src/npc/melari.c
+++ b/src/npc/melari.c
@@ -26,7 +26,7 @@ void Melari(Entity* this) {
}
void sub_08068708(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_08111520) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08111520)) {
this->action = 1;
InitializeAnimation(this, 0);
sub_08078778(this);
@@ -60,7 +60,7 @@ void sub_08068780(Entity* this) {
switch (this->action) {
case 0:
- if (LoadExtraSpriteData(this, gUnk_08111520) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_08111520)) {
return;
}
this->action = 1;
diff --git a/src/npc/minishEzlo.c b/src/npc/minishEzlo.c
index 2296d384..921452de 100644
--- a/src/npc/minishEzlo.c
+++ b/src/npc/minishEzlo.c
@@ -22,7 +22,7 @@ void MinishEzlo(Entity* this) {
{ 0x0, 0x0, 0x0 },
};
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_0810C48C) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_0810C48C)) {
return;
}
this->action++;
diff --git a/src/npc/mountainMinish.c b/src/npc/mountainMinish.c
index 92156995..647b550a 100644
--- a/src/npc/mountainMinish.c
+++ b/src/npc/mountainMinish.c
@@ -55,7 +55,7 @@ void MountainMinish(Entity* this) {
}
void sub_08067E60(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_08111358) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08111358)) {
this->action = 1;
sub_08078778(this);
InitializeAnimation(this, 2);
@@ -106,7 +106,7 @@ void sub_08067EF0(Entity* this) {
switch (this->action) {
case 0:
- if (LoadExtraSpriteData(this, gUnk_08111358) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_08111358)) {
return;
}
this->action = 1;
@@ -265,7 +265,7 @@ void MountainMinish_Head(Entity* this) {
void MountainMinish_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_08111358) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08111358)) {
this->action++;
this->spriteSettings.draw = 1;
InitializeAnimation(this, 6);
diff --git a/src/npc/mutoh.c b/src/npc/mutoh.c
index 5eb9bdba..d1d5a00a 100644
--- a/src/npc/mutoh.c
+++ b/src/npc/mutoh.c
@@ -89,7 +89,7 @@ void sub_08067100(Entity* this) {
void Mutoh_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_08110C00) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08110C00)) {
this->action++;
this->spriteSettings.draw = TRUE;
InitializeAnimation(this, 2);
diff --git a/src/npc/npc58.c b/src/npc/npc58.c
index 5b916583..0409dc4f 100644
--- a/src/npc/npc58.c
+++ b/src/npc/npc58.c
@@ -14,7 +14,7 @@ void NPC58(Entity* this) {
Entity* entity;
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_081146D0) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_081146D0)) {
return;
}
this->action++;
diff --git a/src/npc/percy.c b/src/npc/percy.c
index bb318c3b..acb65a57 100644
--- a/src/npc/percy.c
+++ b/src/npc/percy.c
@@ -168,7 +168,7 @@ void sub_0806B60C(Entity* this) {
void Percy_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_08112E1C) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08112E1C)) {
this->action++;
this->spriteSettings.draw = 1;
InitializeAnimation(this, 2);
diff --git a/src/npc/phonograph.c b/src/npc/phonograph.c
index 26872a4c..071f5b6e 100644
--- a/src/npc/phonograph.c
+++ b/src/npc/phonograph.c
@@ -193,14 +193,14 @@ const static Font gUnk_081146B8 = {
void sub_0806EABC(Entity* this) {
sub_08050384();
sub_08057044((s16)this->field_0x68.HWORD, gUnk_020227E8, 0x202020);
- sub_0805F46C(0x3302, &gUnk_081146B8);
+ ShowTextBox(0x3302, &gUnk_081146B8);
gScreen.bg0.updated = 1;
}
#else
void sub_0806EABC(Entity* this, u32 param) {
sub_08050384();
sub_08057044(param, gUnk_020227E8, 0x202020);
- sub_0805F46C(0x3302, &gUnk_081146B8);
+ ShowTextBox(0x3302, &gUnk_081146B8);
gScreen.bg0.updated = 1;
}
#endif
diff --git a/src/npc/postman.c b/src/npc/postman.c
index dd1f2381..2bdeedd2 100644
--- a/src/npc/postman.c
+++ b/src/npc/postman.c
@@ -3,24 +3,151 @@
#include "entity.h"
#include "functions.h"
#include "npc.h"
+#include "structures.h"
extern void sub_08060528(Entity*);
extern void sub_080604DC(Entity*);
extern void sub_080606D8(Entity*);
extern void sub_080606C0(Entity*);
-extern const s8 gUnk_0810AA70[][4][4];
+const Coords gUnk_0810A66C[] = {
+ { .HALF = { 0x0, 0x0 } }, { .HALF = { 0x48, 0xa8 } }, { .HALF = { 0x0, 0xf0 } },
+ { .HALF = { 0x1f8, 0x0 } }, { .HALF = { 0x3f8, 0xf0 } }, { .HALF = { 0x1f8, 0x3c8 } },
+ { .HALF = { 0x48, 0xf0 } }, { .HALF = { 0x60, 0xf0 } }, { .HALF = { 0x60, 0x188 } },
+ { .HALF = { 0x78, 0x188 } }, { .HALF = { 0x78, 0x270 } }, { .HALF = { 0x38, 0x270 } },
+ { .HALF = { 0x38, 0x328 } }, { .HALF = { 0x98, 0x328 } }, { .HALF = { 0xd8, 0x328 } },
+ { .HALF = { 0x108, 0x328 } }, { .HALF = { 0x188, 0x328 } }, { .HALF = { 0x188, 0x368 } },
+ { .HALF = { 0x108, 0x278 } }, { .HALF = { 0x128, 0x278 } }, { .HALF = { 0x128, 0x1d0 } },
+ { .HALF = { 0x1a8, 0x1d0 } }, { .HALF = { 0x1f8, 0x1d0 } }, { .HALF = { 0x1a8, 0x288 } },
+ { .HALF = { 0x1f8, 0x288 } }, { .HALF = { 0x1f8, 0x328 } }, { .HALF = { 0x268, 0x328 } },
+ { .HALF = { 0x268, 0x368 } }, { .HALF = { 0x268, 0x390 } }, { .HALF = { 0x1f8, 0xf0 } },
+ { .HALF = { 0x248, 0x1d0 } }, { .HALF = { 0x248, 0x1c0 } }, { .HALF = { 0x248, 0x288 } },
+ { .HALF = { 0x298, 0x288 } }, { .HALF = { 0x298, 0x328 } }, { .HALF = { 0x328, 0x328 } },
+ { .HALF = { 0x328, 0x390 } }, { .HALF = { 0x368, 0x328 } }, { .HALF = { 0x368, 0x318 } },
+ { .HALF = { 0x3a0, 0x318 } }, { .HALF = { 0x3a0, 0x290 } }, { .HALF = { 0x370, 0x290 } },
+ { .HALF = { 0x370, 0x280 } }, { .HALF = { 0x360, 0x280 } }, { .HALF = { 0x360, 0x270 } },
+ { .HALF = { 0x340, 0x270 } }, { .HALF = { 0x340, 0x248 } }, { .HALF = { 0x320, 0x248 } },
+ { .HALF = { 0x2e0, 0x248 } }, { .HALF = { 0x2e0, 0x1d0 } }, { .HALF = { 0x2d0, 0x1d0 } },
+ { .HALF = { 0x2d0, 0x1c0 } }, { .HALF = { 0x320, 0x168 } }, { .HALF = { 0x378, 0x168 } },
+ { .HALF = { 0x378, 0xf0 } }, { .HALF = { 0x2b0, 0x288 } }, { .HALF = { 0x2b0, 0x280 } },
+ { .HALF = { 0x2c0, 0x280 } }, { .HALF = { 0x2c0, 0x270 } }, { .HALF = { 0x2d0, 0x270 } },
+ { .HALF = { 0x2d0, 0x248 } }, { .HALF = { 0x78, 0x1f0 } }, { .HALF = { 0x78, 0x230 } },
+};
-typedef struct {
- s16 x;
- s16 y;
-} Coords16;
+// Indices into the coords array above
+const s8 gUnk_0810A768[] = { 1, -4, 0, 1, 2 };
+const s8 gUnk_0810A76D[] = { 6, 0, 2, 4, 21 };
+const s8 gUnk_0810A772[] = { 6, 0, 2, 1, 21 };
+const s8 gUnk_0810A777[] = { 2, -5, 3, 5, 7, 9 };
+const s8 gUnk_0810A77D[] = { 29, 0, 3, 20, 17, 16 };
+const s8 gUnk_0810A783[] = { 3, -5, 3, 3, 7, 9 };
+const s8 gUnk_0810A789[] = { 54, 0, 2, 18, 62 };
+const s8 gUnk_0810A78E[] = { 4, -5, 3, 3, 5, 9 };
+const s8 gUnk_0810A794[] = { 25, 0, 3, 46, 30, 31 };
+const s8 gUnk_0810A79A[] = { 5, -5, 3, 3, 5, 7 };
+const s8 gUnk_0810A7A0[] = { 24, 0, 3, 45, 47, 14 };
+const s8 gUnk_0810A7A6[] = { 22, 0, 3, 15, 66, 63 };
+const s8 gUnk_0810A7AC[] = { 23, 24, 0, 3, 12, 47, 45 };
+const s8 gUnk_0810A7B3[] = { 23, 21, 0, 2, 65, 26 };
+const s8 gUnk_0810A7B9[] = { 29, 0, 3, 6, 20, 17 };
+const s8 gUnk_0810A7BF[] = { 22, 0, 3, 66, 11, 63 };
+const s8 gUnk_0810A7C5[] = { 54, 0, 2, 8, 62 };
+const s8 gUnk_0810A7CA[] = { 29, 0, 3, 6, 20, 16 };
+const s8 gUnk_0810A7D0[] = { 29, 0, 3, 6, 17, 16 };
+const s8 gUnk_0810A7D6[] = { 7, 0, 2, 22, 23 };
+const s8 gUnk_0810A7DB[] = { 7, 0, 2, 23, 19 };
+const s8 gUnk_0810A7E0[] = { 6, 0, 2, 1, 4 };
+const s8 gUnk_0810A7E5[] = { 8, 9, 61, -1, 62, 10, 11, 12, 13, -1, 14, 15, 0, 2, 27, 25 };
+const s8 gUnk_0810A7F5[] = { 14, -1, 13, 12, 11, 10, 62, -1, 61, 9, 8, 7, 0, 2, 22, 19 };
+const s8 gUnk_0810A805[] = { 18, 19, 20, 21, 0, 2, 65, 13 };
+const s8 gUnk_0810A80D[] = { 20, 19, 18, 15, 0, 2, 24, 27 };
+const s8 gUnk_0810A815[] = { 16, 0, 2, 29, 33 };
+const s8 gUnk_0810A81A[] = { 15, 0, 2, 24, 25 };
+const s8 gUnk_0810A81F[] = { 25, 0, 3, 46, 31, 10 };
+const s8 gUnk_0810A825[] = { 16, 0, 2, 28, 33 };
+const s8 gUnk_0810A82A[] = { 26, 0, 2, 41, 43 };
+const s8 gUnk_0810A82F[] = { 25, 0, 3, 10, 46, 30 };
+const s8 gUnk_0810A835[] = { 17, 27, 0, 2, 42, 35 };
+const s8 gUnk_0810A83B[] = { 17, 16, 0, 2, 28, 29 };
+const s8 gUnk_0810A841[] = { 28, 36, 35, 0, 2, 40, 37 };
+const s8 gUnk_0810A848[] = { 36, 28, 27, 0, 2, 34, 42 };
+const s8 gUnk_0810A84F[] = { 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 2, 57, 61 };
+const s8 gUnk_0810A85E[] = { 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 0, 2, 36, 40 };
+const s8 gUnk_0810A86D[] = { 35, 0, 2, 36, 37 };
+const s8 gUnk_0810A872[] = { 34, 0, 2, 44, 52 };
+const s8 gUnk_0810A877[] = { 27, 0, 2, 34, 35 };
+const s8 gUnk_0810A87C[] = { 26, 0, 2, 32, 43 };
+const s8 gUnk_0810A881[] = { 34, 0, 2, 52, 39 };
+const s8 gUnk_0810A886[] = { 26, 0, 2, 32, 41 };
+const s8 gUnk_0810A88B[] = { 25, 0, 3, 10, 30, 31 };
+const s8 gUnk_0810A891[] = { 24, 0, 3, 14, 12, 47 };
+const s8 gUnk_0810A897[] = { 32, 0, 2, 54, 49 };
+const s8 gUnk_0810A89C[] = { 24, 0, 3, 14, 12, 45 };
+const s8 gUnk_0810A8A2[] = { 33, 0, 2, 51, 55 };
+const s8 gUnk_0810A8A7[] = { 32, 0, 2, 48, 54 };
+const s8 gUnk_0810A8AC[] = { 34, 0, 2, 44, 39 };
+const s8 gUnk_0810A8B1[] = { 33, 0, 2, 50, 55 };
+const s8 gUnk_0810A8B6[] = { 32, 0, 2, 48, 49 };
+const s8 gUnk_0810A8BB[] = { 30, 0, 2, 64, 59 };
+const s8 gUnk_0810A8C0[] = { 55, 56, 57, 58, 59, 60, 48, 0, 2, 60, 58 };
+const s8 gUnk_0810A8CB[] = { 60, 59, 58, 57, 56, 55, 33, 0, 2, 50, 51 };
+const s8 gUnk_0810A8D6[] = { 48, 0, 2, 60, 56 };
+const s8 gUnk_0810A8DB[] = { 47, 0, 2, 38, 61 };
+const s8 gUnk_0810A8E0[] = { 31, 51, 50, 49, 48, 0, 2, 56, 58 };
+const s8 gUnk_0810A8E9[] = { 49, 50, 51, 31, 30, 0, 2, 64, 53 };
+const s8 gUnk_0810A8F2[] = { 52, 53, 54, 0, 2, 8, 18 };
+const s8 gUnk_0810A8F9[] = { 53, 52, 47, 0, 2, 38, 57 };
+const s8 gUnk_0810A900[] = { 30, 0, 2, 53, 59 };
+const s8 gUnk_0810A905[] = { 22, 0, 3, 66, 11, 15 };
+const s8 gUnk_0810A90B[] = { 22, 0, 3, 11, 15, 63 };
+const s8 gUnk_0810A911[] = { 21, 0, 2, 26, 13, 0, 0 };
-extern Coords16 gUnk_0810A66C[];
-extern s8* gUnk_0810A918[];
+const s8* const gUnk_0810A918[] = {
+ gUnk_0810A768, gUnk_0810A768, gUnk_0810A76D, gUnk_0810A772, gUnk_0810A777, gUnk_0810A77D, gUnk_0810A783,
+ gUnk_0810A789, gUnk_0810A78E, gUnk_0810A794, gUnk_0810A79A, gUnk_0810A7A0, gUnk_0810A7A6, gUnk_0810A7AC,
+ gUnk_0810A7B3, gUnk_0810A7B9, gUnk_0810A7BF, gUnk_0810A7C5, gUnk_0810A7CA, gUnk_0810A7D0, gUnk_0810A7D6,
+ gUnk_0810A7DB, gUnk_0810A7E0, gUnk_0810A7E5, gUnk_0810A7F5, gUnk_0810A805, gUnk_0810A80D, gUnk_0810A815,
+ gUnk_0810A81A, gUnk_0810A81F, gUnk_0810A825, gUnk_0810A82A, gUnk_0810A82F, gUnk_0810A835, gUnk_0810A83B,
+ gUnk_0810A841, gUnk_0810A848, gUnk_0810A84F, gUnk_0810A85E, gUnk_0810A86D, gUnk_0810A872, gUnk_0810A877,
+ gUnk_0810A87C, gUnk_0810A881, gUnk_0810A886, gUnk_0810A88B, gUnk_0810A891, gUnk_0810A897, gUnk_0810A89C,
+ gUnk_0810A8A2, gUnk_0810A8A7, gUnk_0810A8AC, gUnk_0810A8B1, gUnk_0810A8B6, gUnk_0810A8BB, gUnk_0810A8C0,
+ gUnk_0810A8CB, gUnk_0810A8D6, gUnk_0810A8DB, gUnk_0810A8E0, gUnk_0810A8E9, gUnk_0810A8F2, gUnk_0810A8F9,
+ gUnk_0810A900, gUnk_0810A905, gUnk_0810A90B, gUnk_0810A911,
+};
+void sub_08060428(Entity*);
+void sub_0806045C(Entity*);
+void sub_080604C8(Entity*);
+void (*const gUnk_0810AA24[])(Entity*) = {
+ sub_08060428,
+ sub_0806045C,
+ sub_080604C8,
+};
-extern void (*const gUnk_0810AA24[])(Entity*);
-extern Dialog gUnk_0810AA30[];
+const Dialog gUnk_0810AA30[] = {
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xc) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xc) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xd) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xe) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xf) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0x10) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0x11) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0x12) } },
+};
+
+const Rect gUnk_0810AA70[][4] = {
+ {
+ { 0, -16, 16, 16 },
+ { 16, 0, 16, 16 },
+ { 0, 16, 16, 16 },
+ { -16, 0, 16, 16 },
+ },
+ {
+ { 0, -16, 32, 32 },
+ { 16, 0, 32, 32 },
+ { 0, 16, 32, 32 },
+ { -16, 0, 32, 32 },
+ },
+};
void Postman(Entity* this) {
if ((this->flags & ENT_SCRIPTED) != 0) {
@@ -181,10 +308,10 @@ void sub_080606D8(Entity* this) {
}
void sub_08060700(Entity* entity, ScriptExecutionContext* context) {
- s8* var0 = gUnk_0810A918[(s8)entity->field_0x68.HALF.LO];
- Coords16* coords = &gUnk_0810A66C[var0[(s8)entity->field_0x68.HALF.HI]];
- u32 x = coords->x + gRoomControls.origin_x;
- u32 y = coords->y + gRoomControls.origin_y;
+ const s8* var0 = gUnk_0810A918[(s8)entity->field_0x68.HALF.LO];
+ const Coords* coords = &gUnk_0810A66C[var0[(s8)entity->field_0x68.HALF.HI]];
+ u32 x = coords->HALF.x + gRoomControls.origin_x;
+ u32 y = coords->HALF.y + gRoomControls.origin_y;
sub_0807DEDC(entity, context, x, y);
gActiveScriptInfo.flags |= 1;
}
@@ -200,8 +327,8 @@ void sub_0806076C(Entity* this, ScriptExecutionContext* context) {
u32 uVar6;
s32 uVar9;
int local_24;
- Coords16* ptr;
- s8* pbVar10;
+ const Coords* ptr;
+ const s8* pbVar10;
if (this->z.WORD < 0) {
gActiveScriptInfo.commandSize = 0;
@@ -244,8 +371,8 @@ void sub_0806076C(Entity* this, ScriptExecutionContext* context) {
this->field_0x68.HALF.LO = pbVar10[local_24];
cVar2 = gUnk_0810A918[(s8)this->field_0x68.HALF.LO][0];
ptr = &gUnk_0810A66C[cVar2];
- this->x.HALF_U.HI = gRoomControls.origin_x + ptr->x;
- this->y.HALF_U.HI = gRoomControls.origin_y + ptr->y;
+ this->x.HALF_U.HI = gRoomControls.origin_x + ptr->HALF.x;
+ this->y.HALF_U.HI = gRoomControls.origin_y + ptr->HALF.y;
if (CheckOnScreen(this) == 0)
break;
local_24 = (s32)(local_24 + 1) % uVar9;
@@ -265,14 +392,14 @@ void sub_080608E4(Entity* this, ScriptExecutionContext* context) {
if (this->z.WORD >= 0) {
if ((this->collisionLayer != 1 || gPlayerEntity.collisionLayer != 2) &&
(this->collisionLayer != 2 || gPlayerEntity.collisionLayer != 1)) {
- const s8* ptr = gUnk_0810AA70[context->intVariable][this->animationState >> 1];
- u32 x = this->x.HALF.HI + ptr[0];
- u32 y = this->y.HALF.HI + ptr[1];
+ const Rect* ptr = &gUnk_0810AA70[context->intVariable][this->animationState >> 1];
+ u32 x = this->x.HALF.HI + ptr->x;
+ u32 y = this->y.HALF.HI + ptr->y;
x = gPlayerEntity.x.HALF.HI - x;
y = gPlayerEntity.y.HALF.HI - y;
- x += ptr[2];
- y += ptr[3];
- if (ptr[2] * 2 > x && ptr[3] * 2 > y) {
+ x += ptr->width;
+ y += ptr->height;
+ if (ptr->width * 2 > x && ptr->height * 2 > y) {
context->condition = 1;
this->field_0x6a.HWORD += 2;
}
diff --git a/src/npc/sittingPerson.c b/src/npc/sittingPerson.c
index 6f60f47e..6fc0ec00 100644
--- a/src/npc/sittingPerson.c
+++ b/src/npc/sittingPerson.c
@@ -1,15 +1,109 @@
#include "npc.h"
#include "functions.h"
-extern void (*SittingPersion_Actions[])(Entity*);
+const SpriteLoadData gUnk_0810CB78[] = {
+ { 63, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 }, { 62, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 },
+ { 64, 61, 4 }, { 8254, 61, 4 }, { 0, 0, 0 }, { 64, 61, 4 }, { 8256, 61, 4 }, { 0, 0, 0 },
+ { 64, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 }, { 62, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 },
+};
+const FrameStruct gUnk_0810CBC0[] = {
+ { 4, 0 }, { 0, 0 }, { 12, 0 }, { 0, 0 }, { 20, 0 }, { 0, 0 },
+ { 28, 1 }, { 0, 0 }, { 36, 1 }, { 0, 0 }, { 44, 0 }, { 0, 0 },
+};
+void SittingPersion_Init(Entity*);
+void sub_080637B8(Entity*);
+void sub_08063830(Entity*);
+void (*const SittingPersion_Actions[])(Entity*) = {
+ SittingPersion_Init,
+ sub_080637B8,
+ sub_08063830,
+};
-extern Dialog gUnk_0810CC08[];
+const u16 gUnk_0810CBE4[][4] = { {
+ TEXT_INDEX(TEXT_TOWN4, 0x2f),
+ TEXT_INDEX(TEXT_TOWN4, 0x30),
+ TEXT_INDEX(TEXT_TOWN4, 0x31),
+ TEXT_INDEX(TEXT_TOWN4, 0x32),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN5, 0x2f),
+ TEXT_INDEX(TEXT_TOWN5, 0x30),
+ TEXT_INDEX(TEXT_TOWN5, 0x31),
+ TEXT_INDEX(TEXT_TOWN5, 0x32),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN6, 0x28),
+ TEXT_INDEX(TEXT_TOWN6, 0x29),
+ TEXT_INDEX(TEXT_TOWN6, 0x2a),
+ TEXT_INDEX(TEXT_TOWN6, 0x2b),
+ },
+ {
+ TEXT_INDEX(TEXT_TOWN7, 0xe),
+ TEXT_INDEX(TEXT_TOWN7, 0xf),
+ TEXT_INDEX(TEXT_TOWN7, 0x10),
+ TEXT_INDEX(TEXT_TOWN7, 0x11),
+ } };
-extern SpriteLoadData gUnk_0810CB78[];
-extern u16 gUnk_0810CC04[];
-extern u16 gUnk_0810CBE4[][4];
-extern u8 gUnk_0810CBC0[];
-extern u8 gUnk_0810CD88[][4];
+const u16 gUnk_0810CC04[] = {
+ TEXT_INDEX(TEXT_TOWN5, 0x37),
+ TEXT_INDEX(TEXT_TOWN5, 0x38),
+};
+
+void sub_0806387C(Entity*);
+void sub_0806390C(Entity*);
+const Dialog gUnk_0810CC08[] = {
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5), TEXT_INDEX(TEXT_CAFE, 0x4) } },
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5), TEXT_INDEX(TEXT_CAFE, 0x4) } },
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0xf), TEXT_INDEX(TEXT_CAFE, 0xe) } },
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x1d), TEXT_INDEX(TEXT_CAFE, 0x1c) } },
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x29), TEXT_INDEX(TEXT_CAFE, 0x28) } },
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x35), TEXT_INDEX(TEXT_CAFE, 0x34) } },
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x41), TEXT_INDEX(TEXT_CAFE, 0x40) } },
+ { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x4b), TEXT_INDEX(TEXT_CAFE, 0x4a) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x8) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x8) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x12) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x20) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x2c) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x38) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x44) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x4e) } },
+ { 0, 0, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xf), TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xe) } },
+ { 0, 0, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xf), TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xe) } },
+ { 0, 0, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xf), TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xe) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x16) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x17) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x19) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1b) } },
+ { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1b) } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x52), TEXT_INDEX(TEXT_CAFE, 0x51) } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x52), TEXT_INDEX(TEXT_CAFE, 0x51) } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x54), TEXT_INDEX(TEXT_CAFE, 0x53) } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x56), TEXT_INDEX(TEXT_CAFE, 0x55) } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x58), TEXT_INDEX(TEXT_CAFE, 0x57) } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5a), TEXT_INDEX(TEXT_CAFE, 0x59) } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5c), TEXT_INDEX(TEXT_CAFE, 0x5b) } },
+ { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5e), TEXT_INDEX(TEXT_CAFE, 0x5d) } },
+};
+const u8 gUnk_0810CD88[][4] = {
+ { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 1, 2, 0 }, { 0, 1, 2, 0 }, { 0, 0, 0, 0 },
+};
extern void sub_08096208(Entity*, u32);
void sub_080637B8(Entity* this);
@@ -134,9 +228,9 @@ void SittingPersion_ShowDialogue(Entity* this, ScriptExecutionContext* context)
}
void SittingPerson_Head(Entity* this) {
- u8* ptr = &gUnk_0810CBC0[this->type * 4];
- SetExtraSpriteFrame(this, 0, *ptr + (this->frame & 0xf));
- SetExtraSpriteFrame(this, 1, gUnk_0810CD88[this->type][this->frameIndex & 3] + *(ptr + 1));
+ const FrameStruct* ptr = &gUnk_0810CBC0[this->type * 2];
+ SetExtraSpriteFrame(this, 0, ptr->frame + (this->frame & 0xf));
+ SetExtraSpriteFrame(this, 1, gUnk_0810CD88[this->type][this->frameIndex & 3] + ptr->frameIndex);
SetSpriteSubEntryOffsetData1(this, 1, 0);
sub_0807000C(this);
}
@@ -148,7 +242,7 @@ void sub_080639D0(Entity* this) {
void SittingPerson_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_0810CB78[this->type * 3]) != 0) {
+ if (LoadExtraSpriteData(this, &gUnk_0810CB78[this->type * 3])) {
this->action++;
this->spriteSettings.draw = 1;
this->spriteSettings.flipX = 0;
diff --git a/src/npc/smith.c b/src/npc/smith.c
index 0ff8ef31..e6663737 100644
--- a/src/npc/smith.c
+++ b/src/npc/smith.c
@@ -71,7 +71,7 @@ void Smith_Head(Entity* this) {
}
void sub_080660EC(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_08110354) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08110354)) {
this->action = 1;
this->field_0x68.HALF.LO = sub_0801E99C(this);
InitAnimationForceUpdate(this, 2);
@@ -106,7 +106,7 @@ void sub_08066170(Entity* this) {
}
void sub_08066178(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_08110354) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08110354)) {
this->action = 1;
this->spriteSettings.draw = 1;
this->field_0x68.HALF.LO = sub_0801E99C(this);
@@ -221,7 +221,7 @@ void sub_08066288(Entity* this) {
void Smith_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_08110354) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08110354)) {
this->action++;
this->spriteSettings.draw = 1;
InitAnimationForceUpdate(this, 6);
diff --git a/src/npc/sturgeon.c b/src/npc/sturgeon.c
index 6d1c467d..7ee3e4bc 100644
--- a/src/npc/sturgeon.c
+++ b/src/npc/sturgeon.c
@@ -4,16 +4,32 @@
#include "object.h"
#include "item.h"
-extern u16 gUnk_0810FA54[];
+const SpriteLoadData gUnk_0810FA38[] = {
+ { 59, 140, 0 },
+ { 59, 140, 0 },
+ { 0, 0, 0 },
+};
+void sub_08064B44(Entity*);
+void sub_08064B88(Entity*);
+void sub_08064C2C(Entity*);
+void sub_08064C50(Entity*);
+void (*const gUnk_0810FA44[])(Entity*) = {
+ sub_08064B44,
+ sub_08064B88,
+ sub_08064C2C,
+ sub_08064C50,
+};
+
+extern const u16 gUnk_0810FA54[];
+// const u16 gUnk_0810FA54[] = {
+// TEXT_INDEX(TEXT_LIBRARY, 0xe),
+// TEXT_INDEX(TEXT_LIBRARY, 0x15),
+// TEXT_INDEX(TEXT_LIBRARY, 0x11),
+// };
+extern u32 gUnk_0810FA5A; // TODO second parameter of sub_0806EE04
-extern SpriteLoadData gUnk_0810FA38;
-
-extern u32 gUnk_0810FA5A;
void sub_08064CC0(Entity* this);
-
-extern void (*const gUnk_0810FA44[])(Entity*);
void sub_08064C9C(Entity* this);
-
void sub_08064CD8(Entity* this);
void Sturgeon(Entity* this) {
@@ -22,7 +38,7 @@ void Sturgeon(Entity* this) {
sub_0806ED78(this);
} else {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_0810FA38) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810FA38)) {
this->action = 1;
this->timer = 0;
sub_0807DD50(this);
@@ -30,13 +46,13 @@ void Sturgeon(Entity* this) {
} else {
u32 tmp = this->action & 0x80;
if (tmp) {
- if (UpdateFuseInteraction(this) != 0) {
+ if (UpdateFuseInteraction(this)) {
this->action = 1;
}
} else {
if (this->interactType == 2) {
this->action = this->action | 0xff;
- this->interactType = tmp;
+ this->interactType = 0;
InitAnimationForceUpdate(this, sub_0806F5A4(GetFacingDirection(this, &gPlayerEntity)));
sub_0806F118(this);
} else {
@@ -49,7 +65,7 @@ void Sturgeon(Entity* this) {
}
void sub_08064B44(Entity* this) {
- if (LoadExtraSpriteData(this, &gUnk_0810FA38) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810FA38)) {
InitializeAnimation(this, 2);
sub_0806EE04(this, &gUnk_0810FA5A, 0);
sub_08064CC0(this);
@@ -152,7 +168,7 @@ void sub_08064D10(Entity* this) {
void Sturgeon_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_0810FA38) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810FA38)) {
this->action++;
this->spriteSettings.draw = 1;
InitializeAnimation(this, 6);
diff --git a/src/npc/syrup.c b/src/npc/syrup.c
index 51c24059..05e90aee 100644
--- a/src/npc/syrup.c
+++ b/src/npc/syrup.c
@@ -29,13 +29,11 @@ void Syrup(Entity* this) {
}
void sub_0806A1F8(Entity* this) {
- u32 iVar1;
const SpriteLoadData* paVar2;
this->type == 0 ? (paVar2 = gUnk_081121B4) : (paVar2 = gUnk_081121C4);
- iVar1 = LoadExtraSpriteData(this, paVar2);
- if (iVar1) {
+ if (LoadExtraSpriteData(this, paVar2)) {
this->action = 1;
SetDefaultPriority(this, PRIO_MESSAGE);
sub_0807DD50(this);
diff --git a/src/npc/talon.c b/src/npc/talon.c
index 67845700..8de3c789 100644
--- a/src/npc/talon.c
+++ b/src/npc/talon.c
@@ -35,7 +35,7 @@ void Talon(Entity* this) {
}
void sub_08065570(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_0810FEB0) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810FEB0)) {
InitializeAnimation(this, 0);
sub_08078778(this);
this->action = 1;
@@ -75,7 +75,7 @@ void sub_0806559C(Entity* this) {
}
void sub_08065608(Entity* this) {
- if (LoadExtraSpriteData(this, gUnk_0810FEB0) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810FEB0)) {
this->action = 1;
this->spriteSettings.draw = 1;
this->field_0x68.HALF.LO = sub_0801E99C(this);
@@ -164,7 +164,7 @@ void Talon_Head(Entity* this) {
void Talon_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_0810FEB0) != 0) {
+ if (LoadExtraSpriteData(this, gUnk_0810FEB0)) {
this->action++;
this->spriteSettings.draw = 1;
InitializeAnimation(this, 6);
diff --git a/src/npc/tingleSiblings.c b/src/npc/tingleSiblings.c
index c3bb814b..7ca9c778 100644
--- a/src/npc/tingleSiblings.c
+++ b/src/npc/tingleSiblings.c
@@ -127,8 +127,8 @@ void sub_08064EE8(Entity* this) {
void sub_08064F28(Entity* this, ScriptExecutionContext* context) {
u32 roomFlag;
u32 bVar2;
- int iVar3;
- int iVar4;
+ s32 iVar3;
+ s32 remainingFusions;
u32 uVar5;
context->condition = 0;
@@ -148,35 +148,35 @@ void sub_08064F28(Entity* this, ScriptExecutionContext* context) {
}
}
}
- iVar4 = -1;
+ remainingFusions = -1;
} else {
if (CheckGlobalFlag(KAKERA_COMPLETE) == 0) {
- iVar4 = 100 - gSave.unk117;
- if (iVar4 < 1) {
+ remainingFusions = 100 - gSave.fusedKinstoneCount;
+ if (remainingFusions < 1) {
uVar5 = 8;
- iVar4 = 0;
+ remainingFusions = 0;
SetGlobalFlag(KAKERA_COMPLETE);
context->condition = 1;
} else {
uVar5 = 7;
- if (9 < iVar4) {
+ if (9 < remainingFusions) {
uVar5 = 6;
}
- if (0x27 < iVar4) {
+ if (0x27 < remainingFusions) {
uVar5 = 5;
}
- if (0x45 < iVar4) {
+ if (0x45 < remainingFusions) {
uVar5 = 4;
}
}
} else {
uVar5 = 8;
- iVar4 = 0;
+ remainingFusions = 0;
}
}
MessageNoOverlap(TingleSiblings_MessageIndices[this->type][uVar5], this);
- if (iVar4 > 0) {
- gMessage.rupees = (u16)iVar4;
+ if (remainingFusions > 0) {
+ gMessage.rupees = (u16)remainingFusions;
}
if (CheckRoomFlag(roomFlag) == 0) {
diff --git a/src/npc/townMinish.c b/src/npc/townMinish.c
index 10de6135..85630b7c 100644
--- a/src/npc/townMinish.c
+++ b/src/npc/townMinish.c
@@ -199,7 +199,7 @@ void sub_0806ACC4(Entity* this) {
u8 delay;
switch (this->action) {
case 0:
- if (LoadExtraSpriteData(this, gUnk_08112674[this->type]) == 0)
+ if (!LoadExtraSpriteData(this, gUnk_08112674[this->type]))
return;
this->action = 1;
diff --git a/src/npc/townsperson.c b/src/npc/townsperson.c
index 58299104..4def0fca 100644
--- a/src/npc/townsperson.c
+++ b/src/npc/townsperson.c
@@ -9,18 +9,18 @@ typedef struct {
u8 unk3;
} struct_0810B680;
-extern void (*const gUnk_0810B774[])(Entity*);
-extern void (*const gUnk_0810B77C[])(Entity*);
extern void sub_08061CB4(Entity*, u32);
extern void sub_08061D64(Entity*);
extern void sub_08062048(Entity*);
-extern SpriteLoadData* gUnk_0810B6EC[];
-extern u8 gUnk_0810B78C[];
extern struct_0810B680 gUnk_0810B680[];
+extern SpriteLoadData* gUnk_0810B6EC[];
+extern u32 gUnk_0810B740[]; // TODO fourth parameter of sub_08078850
+extern u8 gUnk_0810B748[]; // TODO third parameter of sub_08078850
extern u16 gUnk_0810B74A[];
-extern u8 gUnk_0810B748[];
-extern u32 gUnk_0810B740[];
+extern void (*const gUnk_0810B774[])(Entity*);
+extern void (*const gUnk_0810B77C[])(Entity*);
+extern u8 gUnk_0810B78C[];
extern u16 gUnk_0810B790[];
extern u16 gUnk_0810B7BA[];
extern Dialog gUnk_0810B7C0[];
@@ -283,7 +283,7 @@ void sub_08062048(Entity* this) {
void Townsperson_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, gUnk_0810B6EC[this->type]) == 0) {
+ if (!LoadExtraSpriteData(this, gUnk_0810B6EC[this->type])) {
return;
}
this->action++;
diff --git a/src/npc/windTribespeople.c b/src/npc/windTribespeople.c
index 7951715c..2018581f 100644
--- a/src/npc/windTribespeople.c
+++ b/src/npc/windTribespeople.c
@@ -39,10 +39,7 @@ void WindTribespeople(Entity* this) {
}
void sub_0806C798(Entity* this) {
- s32 iVar1;
-
- iVar1 = LoadExtraSpriteData(this, gUnk_08113A1C + (this->type * 4));
- if (iVar1 != 0) {
+ if (LoadExtraSpriteData(this, gUnk_08113A1C + (this->type * 4))) {
this->action = 1;
this->spriteSettings.draw = 1;
this->animationState = this->timer;
@@ -274,7 +271,7 @@ void sub_0806CA5C(Entity* this, ScriptExecutionContext* context) {
void WindTribespeople_Fusion(Entity* this) {
if (this->action == 0) {
- if (LoadExtraSpriteData(this, &gUnk_08113A1C[this->type * 4]) != 0) {
+ if (LoadExtraSpriteData(this, &gUnk_08113A1C[this->type * 4])) {
this->action++;
this->spriteSettings.draw = 1;
InitializeAnimation(this, 6);
diff --git a/src/npc/zelda.c b/src/npc/zelda.c
index df2ed8f3..64898ef7 100644
--- a/src/npc/zelda.c
+++ b/src/npc/zelda.c
@@ -5,8 +5,8 @@
#include "flags.h"
#include "npc.h"
-void sub_08068680(Entity*, Entity*);
-void sub_08068694(Entity*, Entity*);
+void ZeldaFollower_Hide(Entity*, Entity*);
+void ZeldaFollower_Show(Entity*, Entity*);
extern Entity* GetEntityByType(u32, u32);
extern void sub_080686C4(Entity*, Entity*);
void sub_08066CCC(Entity*);
@@ -44,7 +44,7 @@ void sub_08066D14(Entity* this, ScriptExecutionContext* context) {
this->animationState = parent->animationState;
this->spriteSettings.draw = 1;
CopyPosition(parent, this);
- sub_08068680(this, this->parent);
+ ZeldaFollower_Hide(this, this->parent);
context->condition = 1;
} else {
context->condition = 0;
@@ -52,16 +52,14 @@ void sub_08066D14(Entity* this, ScriptExecutionContext* context) {
}
void sub_08066D4C(Entity* this, ScriptExecutionContext* context) {
- Entity* parent;
-
- parent = this->parent;
+ Entity* parent = this->parent;
if (this->parent != NULL) {
CopyPosition(this, parent);
this->parent->spriteSettings.draw = 1;
this->parent->animationState = this->animationState;
this->spriteSettings.draw = 0;
this->followerFlag &= 0xFE;
- sub_08068694(this, this->parent);
+ ZeldaFollower_Show(this, this->parent);
context->condition = 1;
} else {
context->condition = 0;
@@ -85,13 +83,11 @@ void sub_08066D94(Entity* this) {
DeleteThisEntity();
}
-void SetZeldaFollowTarget(Entity* this) {
- Entity* pEVar1;
-
- pEVar1 = DeepFindEntityByID(NPC, ZELDA_FOLLOWER);
- if (pEVar1 != NULL) {
- CopyPosition(this, pEVar1);
- sub_080686C4(this, pEVar1);
+void SetZeldaFollowTarget(Entity* target) {
+ Entity* follower = DeepFindEntityByID(NPC, ZELDA_FOLLOWER);
+ if (follower != NULL) {
+ CopyPosition(target, follower);
+ sub_080686C4(target, follower);
}
}
diff --git a/src/npc/zeldaFollower.c b/src/npc/zeldaFollower.c
index 5cbaa03f..04153f4a 100644
--- a/src/npc/zeldaFollower.c
+++ b/src/npc/zeldaFollower.c
@@ -3,9 +3,8 @@
#include "functions.h"
#include "common.h"
-extern void sub_08068318(Entity*);
-extern void sub_0806854C(Entity*, u32*);
-
+void sub_08068318(Entity*);
+void sub_0806854C(Entity*, u32*);
void sub_08068578(Entity* this);
void ZeldaFollower(Entity* this) {
@@ -40,20 +39,20 @@ void sub_0806854C(Entity* this, u32* none) {
ASM_FUNC("asm/non_matching/zeldaFollower/sub_08068578.inc", void sub_08068578(Entity* this))
-void sub_08068680(Entity* this, Entity* entity) {
- entity->field_0x68.HALF.LO = 0;
- entity->spriteSettings.draw = 0;
+void ZeldaFollower_Hide(Entity* zelda, Entity* follower) {
+ follower->field_0x68.HALF.LO = 0;
+ follower->spriteSettings.draw = 0;
}
-void sub_08068694(Entity* this, Entity* entity) {
- entity->field_0x68.HALF.LO = 1;
- entity->spriteSettings.draw = 1;
- entity->animationState = this->animationState;
- sub_08068578(entity);
- InitAnimationForceUpdate(entity, entity->animationState / 2);
+void ZeldaFollower_Show(Entity* zelda, Entity* follower) {
+ follower->field_0x68.HALF.LO = 1;
+ follower->spriteSettings.draw = 1;
+ follower->animationState = zelda->animationState;
+ sub_08068578(follower);
+ InitAnimationForceUpdate(follower, follower->animationState / 2);
}
-void sub_080686C4(Entity* this, Entity* entity) {
- entity->y.HALF.HI -= 0x10;
- sub_08068578(entity);
+void sub_080686C4(Entity* zelda, Entity* follower) {
+ follower->y.HALF.HI -= 0x10;
+ sub_08068578(follower);
}
diff --git a/src/npcUtils.c b/src/npcUtils.c
index 698cfaa8..190c9338 100644
--- a/src/npcUtils.c
+++ b/src/npcUtils.c
@@ -495,3 +495,16 @@ void ShowNPCDialogue(Entity* ent, const Dialog* dia) {
MessageFromTarget(uVar2);
}
}
+
+const u8 gUnk_08114F30[] = {
+ 0,
+ 0,
+ 1,
+ 2,
+};
+const u8 gUnk_08114F34[] = {
+ 1,
+ 2,
+ 3,
+ 3,
+};
diff --git a/src/object/angryStatue.c b/src/object/angryStatue.c
index 107ba864..0204c90e 100644
--- a/src/object/angryStatue.c
+++ b/src/object/angryStatue.c
@@ -6,13 +6,12 @@
*/
#include "asm.h"
#include "entity.h"
+#include "hitbox.h"
#include "physics.h"
#include "projectile.h"
#include "room.h"
#include "sound.h"
-extern Hitbox gUnk_080FD178;
-
void AngryStatue_Init(Entity*);
void AngryStatue_Action1(Entity*);
void AngryStatue_Action2(Entity*);
@@ -29,7 +28,7 @@ void AngryStatue(Entity* this) {
void AngryStatue_Init(Entity* this) {
this->action = 1;
- this->hitbox = &gUnk_080FD178;
+ this->hitbox = (Hitbox*)&gUnk_080FD178;
SetTile(0x4022, COORD_TO_TILE(this), this->collisionLayer);
InitializeAnimation(this, this->type);
}
diff --git a/src/object/cameraTarget.c b/src/object/cameraTarget.c
index f08e9b43..79b56190 100644
--- a/src/object/cameraTarget.c
+++ b/src/object/cameraTarget.c
@@ -116,7 +116,7 @@ void CameraTarget_Action2(Entity* this) {
u32 bVar3;
u32 temp;
u32 temp2;
- const struct_080C9CBC* ptr;
+ const KinstoneWorldEvent* ptr;
if ((this->type != 1) &&
(((u8)(gUnk_03003DF0.unk_4[3] - 1) >= 100 || (this->child != *(Entity**)(gUnk_03003DF0.unk_4 + 8))))) {
@@ -132,7 +132,7 @@ void CameraTarget_Action2(Entity* this) {
} else {
bVar2 = this->type2;
}
- ptr = gUnk_080C9CBC + bVar2;
+ ptr = gKinstoneWorldEvents + bVar2;
bVar1 = ptr->unk6;
bVar3 = bVar1 & 1;
this->palette.b.b0 = bVar3;
diff --git a/src/object/cutsceneMiscObject.c b/src/object/cutsceneMiscObject.c
index 8d971ba2..75911fe8 100644
--- a/src/object/cutsceneMiscObject.c
+++ b/src/object/cutsceneMiscObject.c
@@ -13,16 +13,25 @@
#include "screen.h"
#include "script.h"
-extern u8 gUnk_08114F30[];
-extern u8 gUnk_08114F34[];
extern u8 gUnk_08122AE0[];
extern u16 gUnk_08122AE8[];
-extern s8 gUnk_08122AF8[];
+extern s8 gUnk_08122AF8[]; // TODO struct s8XY
extern u16 gUnk_08122B00[];
extern s16 gUnk_08122B0E[];
extern u16 gUnk_08122B1E[];
-extern s8 gUnk_08122B2E[];
+extern Coords8 gUnk_08122B2E[]; // TODO struct xy
+typedef struct {
+ Hitbox hit;
+ u8 _8[4]; // TODO fourth param of sub_08078850
+ u8 _c;
+} HitboxCfg;
+extern HitboxCfg gUnk_08122B3C[];
+
+// npcUtils.c
+extern u8 gUnk_08114F30[];
+extern u8 gUnk_08114F34[];
+// TODO use Script type
extern u16 script_CutsceneMiscObjectTheLittleHat;
extern u16 script_CutsceneMiscObjectSwordInChest;
extern u16 script_08015B14;
@@ -56,13 +65,6 @@ typedef struct {
u32 anim;
} Type1F;
-typedef struct {
- Hitbox hit;
- u8 _8[4];
- u8 _c;
-} HitboxCfg;
-extern HitboxCfg gUnk_08122B3C[];
-
typedef void(CutsceneMiscObjectTypeAction)(CutsceneMiscObjectEntity*);
CutsceneMiscObjectTypeAction sub_08094A5C;
@@ -1265,10 +1267,10 @@ void sub_080961F4(CutsceneMiscObjectEntity* this) {
}
void sub_08096208(CutsceneMiscObjectEntity* this, u32 x) {
- s8* p = &gUnk_08122B2E[x * 2];
+ Coords8* p = &gUnk_08122B2E[x];
Entity* e = CreateObject(CUTSCENE_MISC_OBJECT, 0x26, 0);
if (e != NULL) {
- PositionRelative(super, e, Q_16_16(p[0]), Q_16_16(p[1]));
+ PositionRelative(super, e, Q_16_16(p->x), Q_16_16(p->y));
}
}
diff --git a/src/object/figurineDevice.c b/src/object/figurineDevice.c
index 75d626f3..d52ac049 100644
--- a/src/object/figurineDevice.c
+++ b/src/object/figurineDevice.c
@@ -6,9 +6,10 @@
*/
#define NENT_DEPRECATED
+#include "figurineMenu.h"
#include "fileselect.h"
#include "functions.h"
-#include "global.h"
+#include "kinstone.h"
#include "item.h"
#include "message.h"
#include "object.h"
@@ -43,13 +44,6 @@ typedef struct {
extern void ModShells(s32);
extern u8 gUnk_020227F0;
-typedef struct {
- u32 unk_0;
- u16 unk_4;
- u8 unk_6;
- u8 unk_7;
-} struct_080FC3E4;
-extern const struct_080FC3E4 gUnk_080FC3E4[];
void sub_0808804C(FigurineDeviceEntity*);
void sub_08087F58(FigurineDeviceEntity*);
@@ -509,13 +503,13 @@ NONMATCH("asm/non_matching/figurineDevice/sub_08088160.inc",
switch (ptr->unk_6) {
case 0x8:
case 0x40:
- if (CheckLocalFlagByBank(ptr->unk_0, ptr->unk_4)) {
+ if (CheckLocalFlagByBank(ptr->bank, ptr->flag)) {
result = TRUE;
}
return result;
break;
case 0x10:
- if (CheckKinstoneFused(gUnk_080FC3E4[param_2].unk_4)) {
+ if (CheckKinstoneFused(gUnk_080FC3E4[param_2].flag)) {
result = TRUE;
}
return result;
@@ -523,30 +517,34 @@ NONMATCH("asm/non_matching/figurineDevice/sub_08088160.inc",
default:
return result;
case 0x20:
- switch (gUnk_080FC3E4[param_2].unk_4) {
+ switch (gUnk_080FC3E4[param_2].flag) {
case 0:
- if (CheckKinstoneFused(0x20) || CheckKinstoneFused(0x10) || CheckKinstoneFused(0x19)) {
+ if (CheckKinstoneFused(KINSTONE_20) || CheckKinstoneFused(KINSTONE_10) ||
+ CheckKinstoneFused(KINSTONE_19)) {
result = TRUE;
}
break;
case 1:
- if ((u8)this->unk_7c >= 5 && CheckKinstoneFused(0x28)) {
+ if ((u8)this->unk_7c >= 5 && CheckKinstoneFused(KINSTONE_28)) {
result = TRUE;
}
break;
case 2:
- if (CheckKinstoneFused(0x54) || CheckKinstoneFused(0x56) || CheckKinstoneFused(0x3d)) {
+ if (CheckKinstoneFused(KINSTONE_54) || CheckKinstoneFused(KINSTONE_56) ||
+ CheckKinstoneFused(KINSTONE_3D)) {
result = TRUE;
}
break;
case 3:
- if (CheckKinstoneFused(0x3b) || CheckKinstoneFused(0x4a) || CheckKinstoneFused(0xd)) {
+ if (CheckKinstoneFused(KINSTONE_3B) || CheckKinstoneFused(KINSTONE_4A) ||
+ CheckKinstoneFused(KINSTONE_D)) {
result = TRUE;
}
break;
case 4:
- if (CheckKinstoneFused(0x49) || CheckKinstoneFused(0x55) || CheckKinstoneFused(0x3c)) {
+ if (CheckKinstoneFused(KINSTONE_49) || CheckKinstoneFused(KINSTONE_55) ||
+ CheckKinstoneFused(KINSTONE_3C)) {
result = TRUE;
}
break;
@@ -598,9 +596,9 @@ void sub_080882A8(FigurineDeviceEntity* this) {
sub_08057044(this->unk_83, &gUnk_020227E8[1], 0x202020);
ptr = (u8*)0x02000000;
if (ptr[7] == 0) {
- sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120AB4); // TODO convert data
+ ShowTextBox(gUnk_08120AE4[super->type2], (Font*)&gUnk_08120AB4); // TODO convert data
} else {
- sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120ACC); // TODO convert data
+ ShowTextBox(gUnk_08120AE4[super->type2], (Font*)&gUnk_08120ACC); // TODO convert data
}
gScreen.bg0.updated = 1;
}
diff --git a/src/object/fileScreenObjects.c b/src/object/fileScreenObjects.c
index 43dde1a2..23233f96 100644
--- a/src/object/fileScreenObjects.c
+++ b/src/object/fileScreenObjects.c
@@ -88,7 +88,7 @@ void sub_0808E7F0(Entity* this) {
void sub_0808E818(Entity* this) {
u32 var0;
- u32 var1;
+ u32 offset;
if (!sub_0808E950()) {
int var2 = -1;
@@ -104,8 +104,8 @@ void sub_0808E818(Entity* this) {
this->field_0x68.HWORD = CheckGlobalFlag(EZERO_1ST) == 0 ? 0x400 : 0x100;
this->field_0x70.BYTES.byte0 = 4;
this->animationState = 2;
- var1 = gUnk_08133368[GetPlayerPalette(TRUE) - 22] & 0xFFFFFF;
- LoadPalettes(&gGlobalGfxAndPalettes[var1], 31, 1);
+ offset = gUnk_08133368[GetPlayerPalette(TRUE) - 22] & 0xFFFFFF;
+ LoadPalettes(&gGlobalGfxAndPalettes[offset], 31, 1);
}
if (gUI.lastState == 0) {
diff --git a/src/object/frozenOctorok.c b/src/object/frozenOctorok.c
index 85fbb2c0..fe537c4b 100644
--- a/src/object/frozenOctorok.c
+++ b/src/object/frozenOctorok.c
@@ -307,7 +307,7 @@ void FrozenOctorok_Action1SubAction5(FrozenOctorokEntity* this) {
void FrozenOctorok_Action1SubAction6(FrozenOctorokEntity* this) {
LinearMoveUpdate(super);
if ((gRoomControls.origin_y + 0x1c8) < super->y.HALF.HI) {
- gRoomControls.unk5 = 4;
+ gRoomControls.scrollSpeed = 4;
gRoomControls.camera_target = &gPlayerEntity;
SetLocalFlag(0x9b);
DeleteEntity(super->parent);
diff --git a/src/object/gleerokParticle.c b/src/object/gleerokParticle.c
index 0ab61153..5595ccda 100644
--- a/src/object/gleerokParticle.c
+++ b/src/object/gleerokParticle.c
@@ -9,6 +9,7 @@
#include "effects.h"
#include "entity.h"
#include "functions.h"
+#include "hitbox.h"
#include "object.h"
#include "player.h"
#include "room.h"
@@ -23,8 +24,6 @@ typedef struct {
union SplitWord unk84;
} GleerokParticleEntity;
-extern Hitbox gUnk_080FD2E8;
-
void GleerokParticle_Init(GleerokParticleEntity*);
void GleerokParticle_Action1(GleerokParticleEntity*);
void GleerokParticle_Action2(GleerokParticleEntity*);
diff --git a/src/object/greatFairy.c b/src/object/greatFairy.c
index eca04021..fa4266c5 100644
--- a/src/object/greatFairy.c
+++ b/src/object/greatFairy.c
@@ -60,10 +60,10 @@ void GreatFairy_CallBehavior(Entity* this) {
if ((gPlayerEntity.y.HALF.HI - gRoomControls.origin_y) < 168) {
gRoomControls.camera_target = this;
- gRoomControls.unk5 = 2;
+ gRoomControls.scrollSpeed = 2;
} else {
gRoomControls.camera_target = &gPlayerEntity;
- gRoomControls.unk5 = 2;
+ gRoomControls.scrollSpeed = 2;
}
}
diff --git a/src/object/kinstoneSpark.c b/src/object/kinstoneSpark.c
index 9feb4c66..89126c82 100644
--- a/src/object/kinstoneSpark.c
+++ b/src/object/kinstoneSpark.c
@@ -52,7 +52,7 @@ void KinstoneSpark(Entity* this) {
this->spriteRendering.b3 = 1;
this->spritePriority.b0 = 0;
this->spriteOrientation.flipY = 1;
- ChangeObjPalette(this, gUnk_080C9CBC[gFuseInfo._3].unk0);
+ ChangeObjPalette(this, gKinstoneWorldEvents[gFuseInfo.kinstoneId].objPalette);
}
GetNextFrame(this);
}
diff --git a/src/object/lightRay.c b/src/object/lightRay.c
index c353a862..c1e58d1a 100644
--- a/src/object/lightRay.c
+++ b/src/object/lightRay.c
@@ -42,7 +42,7 @@ void LightRay_Type0(LightRayEntity* this) {
super->timer = 60;
super->subtimer = 0;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
tmp = 2;
} else {
@@ -76,7 +76,7 @@ void LightRay_Type0(LightRayEntity* this) {
case 2:
if (--super->timer == 0) {
gScreen.lcd.displayControl |= 0x4800;
- gRoomControls.unk5 = 4;
+ gRoomControls.scrollSpeed = 4;
(super->parent)->subAction = 1;
DeleteThisEntity();
}
@@ -116,7 +116,7 @@ void LightRay_Type1(LightRayEntity* this) {
super->timer = 60;
super->subtimer = 32;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
tmp = 2;
} else {
@@ -148,7 +148,7 @@ void LightRay_Type1(LightRayEntity* this) {
break;
case 2:
if (--super->timer == 0) {
- gRoomControls.unk5 = 4;
+ gRoomControls.scrollSpeed = 4;
gScreen.lcd.displayControl &= 0xd7ff;
(super->parent)->subAction = 1;
DeleteThisEntity();
@@ -167,7 +167,7 @@ void LightRay_Type2(LightRayEntity* this) {
super->timer = 60;
super->subtimer = 0;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
tmp = 2;
} else {
@@ -214,12 +214,12 @@ void LightRay_Type2(LightRayEntity* this) {
if (--super->timer == 0) {
super->action = 4;
gRoomControls.camera_target = &gPlayerEntity;
- gRoomControls.unk5 = 2;
+ gRoomControls.scrollSpeed = 2;
}
break;
case 4:
if (sub_0809BE78(this)) {
- gRoomControls.unk5 = 4;
+ gRoomControls.scrollSpeed = 4;
(super->parent)->subAction = 1;
SetRoomFlag(100);
DeleteThisEntity();
@@ -237,7 +237,7 @@ void LightRay_Type3(LightRayEntity* this) {
super->timer = 60;
super->subtimer = 0;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
tmp = 2;
} else {
@@ -293,7 +293,7 @@ void LightRay_Type4(LightRayEntity* this) {
super->timer = 60;
super->subtimer = 128;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 1;
+ gRoomControls.scrollSpeed = 1;
if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
tmp = 2;
} else {
@@ -319,7 +319,7 @@ void LightRay_Type4(LightRayEntity* this) {
break;
case 2:
if (--super->timer == 0) {
- gRoomControls.unk5 = 4;
+ gRoomControls.scrollSpeed = 4;
(super->parent)->subAction = 1;
DeleteThisEntity();
}
diff --git a/src/object/linkHoldingItem.c b/src/object/linkHoldingItem.c
index d3a98df9..61982614 100644
--- a/src/object/linkHoldingItem.c
+++ b/src/object/linkHoldingItem.c
@@ -19,12 +19,6 @@ typedef struct {
/*0x68*/ u16 unk_68;
} LinkHoldingItemEntity;
-typedef struct {
- u8 unk_0[6];
- u16 unk_6;
-} struct_080FD964;
-extern const struct_080FD964 gUnk_080FD964[];
-
void LinkHoldingItem_Init(LinkHoldingItemEntity*);
void LinkHoldingItem_Action1(LinkHoldingItemEntity*);
void LinkHoldingItem_Action2(LinkHoldingItemEntity*);
@@ -74,7 +68,7 @@ void LinkHoldingItem_Action1(LinkHoldingItemEntity* this) {
break;
case 2:
GiveItem(super->type, super->type2);
- this->unk_68 = gUnk_080FD964[super->type].unk_6;
+ this->unk_68 = gUnk_080FD964[super->type].gotItemMessageId;
SoundReq(SFX_ITEM_GET);
break;
case 5:
diff --git a/src/object/lockedDoor.c b/src/object/lockedDoor.c
index eff9e1c2..1b704f50 100644
--- a/src/object/lockedDoor.c
+++ b/src/object/lockedDoor.c
@@ -223,7 +223,7 @@ void LockedDoor_Action8(Entity* this) {
this->timer = 20;
sub_08083658(this);
SetFlag(this->field_0x86.HWORD);
- sub_080526F8(-1);
+ ModDungeonKeys(-1);
}
void sub_08083638(Entity* this) {
diff --git a/src/object/minecart.c b/src/object/minecart.c
index eba55180..3a4c434e 100644
--- a/src/object/minecart.c
+++ b/src/object/minecart.c
@@ -134,7 +134,7 @@ void Minecart_Action3(MinecartEntity* this) {
u32 iVar2;
u32 uVar3;
- gRoomControls.unk5 = 7;
+ gRoomControls.scrollSpeed = 7;
if ((gPlayerState.flags & PL_IN_MINECART) == 0) {
super->action = 1;
return;
diff --git a/src/object/objectA.c b/src/object/objectA.c
index 9ecf5a80..f9db55e0 100644
--- a/src/object/objectA.c
+++ b/src/object/objectA.c
@@ -40,7 +40,7 @@ void ObjectA(Entity* this) {
SetTileType(*(u16*)&this->field_0x70.HALF.LO, COORD_TO_TILE(this), this->collisionLayer);
SetFlag(this->field_0x86.HWORD);
CreateDust(this);
- sub_080526F8(-1);
+ ModDungeonKeys(-1);
DeleteThisEntity();
}
}
diff --git a/src/object/pushableGrave.c b/src/object/pushableGrave.c
index da643ccb..1cb2ecdf 100644
--- a/src/object/pushableGrave.c
+++ b/src/object/pushableGrave.c
@@ -96,7 +96,7 @@ void PushableGrave_Action2(PushableGraveEntity* this) {
super->subAction = 1;
super->subtimer = 120;
gRoomControls.camera_target = super;
- gRoomControls.unk5 = 2;
+ gRoomControls.scrollSpeed = 2;
}
} else {
if (--super->subtimer == 0) {
@@ -122,7 +122,7 @@ void PushableGrave_Action3(PushableGraveEntity* this) {
sub_080977F4(this);
if (super->type == 0) {
gRoomControls.camera_target = &gPlayerEntity;
- gRoomControls.unk5 = 4;
+ gRoomControls.scrollSpeed = 4;
}
}
}
diff --git a/src/object/warpPoint.c b/src/object/warpPoint.c
index 905bf7b8..d89c91fd 100644
--- a/src/object/warpPoint.c
+++ b/src/object/warpPoint.c
@@ -10,8 +10,8 @@
#include "hitbox.h"
#include "object.h"
-extern void sub_0807CAC8(u32);
-extern u32 sub_0807CAEC(u32);
+extern void EnableDungeonWarp(u32);
+extern u32 IsDungeonWarpActive(u32);
void WarpPoint_Init(Entity*);
void WarpPoint_Action1(Entity*);
@@ -50,7 +50,7 @@ void WarpPoint_Init(Entity* this) {
if (CheckFlags(this->field_0x86.HWORD)) {
sub_0808B830(this);
} else {
- if (AreaIsDungeon() && sub_0807CAEC(this->type)) {
+ if (AreaIsDungeon() && IsDungeonWarpActive(this->type)) {
sub_0808B830(this);
}
}
@@ -69,7 +69,7 @@ void WarpPoint_Action1(Entity* this) {
if (CheckFlags(this->field_0x86.HWORD)) {
sub_0808B830(this);
if (AreaIsDungeon()) {
- sub_0807CAC8(this->type);
+ EnableDungeonWarp(this->type);
}
this->action = 2;
this->subtimer = 60;
diff --git a/src/objectUtils.c b/src/objectUtils.c
index dd78655a..1c78c451 100644
--- a/src/objectUtils.c
+++ b/src/objectUtils.c
@@ -13,6 +13,19 @@ extern const ObjectDefinition gObjectDefinitions[];
static Entity* CreateSpeechBubble(Entity*, u32, s32, s32);
+const s8 gUnk_08126EE4[] = {
+ 0, -32, //
+ 22, -6, //
+ 0, 12, //
+ -22, -6,
+};
+const s8 gUnk_08126EEC[] = {
+ 0, -13, //
+ 13, 0, //
+ 0, 16, //
+ -13, 0,
+};
+
Entity* CreateLinkAnimation(Entity* parent, u32 type, u32 type2) {
Entity* e = CreateItemGetEntity();
if (e != NULL) {
@@ -253,7 +266,8 @@ void CreateSparkle(Entity* entity) {
}
}
-NONMATCH("asm/non_matching/objectUtils/sub_080A2BE4.inc", void SyncPlayerToPlatform(Entity* this, bool32 param_2)) {
+NONMATCH("asm/non_matching/objectUtils/SyncPlayerToPlatform.inc",
+ void SyncPlayerToPlatform(Entity* this, bool32 param_2)) {
s16 oldValue;
s32 diff;
u16 newValue;
diff --git a/src/physics.c b/src/physics.c
index 9c740228..16763375 100644
--- a/src/physics.c
+++ b/src/physics.c
@@ -167,9 +167,9 @@ void LinearMoveUpdate(Entity* ent) {
}
}
-void sub_0806F704(Entity* ent, u32 a2) {
- ent->x.HALF.HI = (((16 * a2) & 0x3F0) | 8) + gRoomControls.origin_x;
- ent->y.HALF.HI = (((a2 >> 2) & 0x3F0) | 8) + gRoomControls.origin_y;
+void sub_0806F704(Entity* this, u32 tilePos) {
+ this->x.HALF.HI = (((16 * tilePos) & 0x3F0) | 8) + gRoomControls.origin_x;
+ this->y.HALF.HI = (((tilePos >> 2) & 0x3F0) | 8) + gRoomControls.origin_y;
}
/** Calculates the tile position of the player but modifies it by the hitbox depending on the animation state. */
@@ -509,30 +509,30 @@ bool32 sub_0806FDA0(Entity* this) {
return 0;
}
-u32 LoadExtraSpriteData(Entity* ent, const SpriteLoadData* data) {
+bool32 LoadExtraSpriteData(Entity* entity, const SpriteLoadData* spriteData) {
const SpriteLoadData* ptr;
u32 index;
struct_gUnk_020000C0_1* ptr2;
- if (sub_0806FDA0(ent) == 0)
- return 0;
+ if (sub_0806FDA0(entity) == 0)
+ return FALSE;
- UnloadOBJPalette(ent);
- ptr2 = gUnk_020000C0[ent->spriteAnimation[2]].unk_00;
- ptr = data;
+ UnloadOBJPalette(entity);
+ ptr2 = gUnk_020000C0[entity->spriteAnimation[2]].unk_00;
+ ptr = spriteData;
for (index = 0; index < 4 && (((u16*)ptr)[1] & 0x3ff); index++) {
- u32 pal = LoadObjPalette(ent, ((*(u32*)ptr) << 0x16) >> 0x16);
+ u32 pal = LoadObjPalette(entity, ((*(u32*)ptr) << 0x16) >> 0x16);
sub_0806FEE8(ptr2, (*(u32*)ptr << 6) >> 0x16, pal, (*(u32*)ptr << 0x10) >> 0x1a);
if (((u8*)ptr)[3] & 4) {
- sub_0806FEFC(ptr2, ent);
+ sub_0806FEFC(ptr2, entity);
}
ptr2++;
ptr++;
}
- ent->spriteAnimation[1] = 0;
- return 1;
+ entity->spriteAnimation[1] = 0;
+ return TRUE;
}
void UnloadOBJPalette2(Entity* ent) {
diff --git a/src/playerItem/playerItemBow.c b/src/playerItem/playerItemBow.c
index ee32b950..acde02b6 100644
--- a/src/playerItem/playerItemBow.c
+++ b/src/playerItem/playerItemBow.c
@@ -262,3 +262,69 @@ void sub_08019468(PlayerItemBowEntity* this) {
CreateFx(super, FX_REFLECT5, 0);
}
}
+
+// Probably belongs to collision.c, but needs to be placed at the end of playerItemBow.c or start of
+// playerItemSwordBeam.c
+const u8 gUnk_080B3E80[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255,
+ 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 255,
+ 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 48, 34, 34, 36, 0, 0, 29, 29, 29, 255, 255, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 255, 255, 255, 255, 255, 29, 29, 29, 255, 255, 29, 29,
+ 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 32, 32,
+ 15, 15, 15, 15, 0, 0, 0, 0, 21, 21, 20, 20, 95, 255, 255, 255, 255, 255, 255, 15, 41, 41, 41,
+ 41, 0, 36, 36, 36, 15, 15, 15, 15, 255, 255, 255, 255, 255, 255, 15, 15, 15, 15, 39, 39, 15, 15,
+ 15, 39, 15, 15, 35, 15, 15, 35, 15, 15, 15, 15, 15, 15, 15, 15, 15, 39, 15, 15, 39, 39, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 39, 15, 15, 255, 39, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 39, 39, 15, 15, 39, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 35, 15, 15, 35,
+ 35, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 35, 35, 15, 15, 35, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 15, 15, 15, 15, 15, 15, 95, 255, 255, 15, 15, 21, 15, 0, 0, 0, 255, 12, 0, 0, 12,
+ 12, 66, 96, 15, 29, 255, 15, 15, 15, 0, 15, 15, 15, 15, 10, 5, 10, 5, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 5, 15, 10, 0, 0, 5, 15, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
+ 10, 4, 12, 8, 0, 0, 0, 5, 0, 10, 4, 12, 8, 15, 15, 15, 15, 15, 16, 17, 17, 16, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 27, 25, 28, 26, 43, 43, 97, 23, 23, 84, 23, 23,
+ 23, 0, 0, 84, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 18, 15, 15, 19, 15, 15, 15, 15,
+ 15, 15, 15, 15, 5, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 1, 3, 2, 0, 0, 5, 15, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 71, 15, 15, 15, 1, 3, 2, 15, 15, 5, 15, 10, 15,
+ 15, 4, 0, 8, 15, 12, 12, 0, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 16, 15, 17, 15, 15, 15, 15, 15,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 15, 0, 0, 5, 15, 15, 15, 15, 15, 15, 15, 15,
+ 39, 15, 15, 39, 255, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 39, 15, 15, 39, 255, 15, 15,
+ 15, 15, 255, 255, 255, 255, 255, 255, 15, 39, 15, 15, 255, 39, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 5, 0, 10, 4, 12, 8, 70, 75, 74, 72, 71, 96, 98, 97, 99, 100, 102, 15, 80, 48,
+ 48, 255, 0, 255, 0, 0, 0, 0, 255, 0, 0, 37, 15, 255, 255, 255, 255, 255, 255, 0, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 255, 255, 255, 255, 255,
+ 40, 255, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 20, 20,
+ 15, 15, 15, 15, 15, 15, 15, 15, 255, 1, 1, 1, 255, 255, 255, 255, 24, 24, 24, 24, 38, 15, 0,
+ 28, 26, 27, 25, 255, 0, 15, 21, 15, 15, 15, 19, 18, 15, 15, 15, 18, 19, 35, 39, 0, 0, 2,
+ 14, 13, 12, 3, 9, 6, 4, 8, 11, 7, 10, 5, 3, 107, 103, 106, 15, 12, 20, 21, 15, 0, 15,
+ 40, 95, 15, 5, 10, 16, 17, 18, 19, 71, 12, 13, 14, 71, 20, 92, 13, 5, 4, 8, 1, 2, 10,
+ 5, 10, 15, 4, 8, 15, 3, 2, 5, 15, 10, 4, 12, 8, 3, 2, 5, 15, 10, 4, 12, 8, 92,
+ 84, 81, 83, 81, 82, 83, 90, 87, 91, 95, 84, 88, 92, 85, 93, 94, 39, 88, 85, 10, 83, 90, 81,
+ 15, 89, 0, 0, 69, 71, 67, 70, 0, 3, 15, 1, 2, 3, 10, 12, 5, 4, 8, 4, 1, 3, 15,
+ 95, 97, 0, 3, 28, 27, 21, 69, 3, 96, 12, 102, 100, 101, 26, 25, 18, 17, 19, 16, 2, 4, 8,
+ 14, 15, 11, 84, 69, 68, 4, 13, 0, 0, 12, 12, 15, 15, 10, 5, 10, 5, 12, 97, 10, 5, 11,
+ 7, 67, 69, 1, 2, 4, 8, 13, 3, 3, 7, 15, 3, 0, 2, 84, 92, 88, 12, 67, 0, 0, 8,
+ 1, 2, 87, 95, 91, 82, 14, 18, 19, 10, 5, 0, 10, 5, 3, 63, 19, 18, 47, 46, 17, 16, 11,
+ 7, 15, 0, 3, 15, 15, 1, 8, 12, 12, 15, 1, 3, 2, 5, 10, 4, 12, 8, 9, 39, 2, 14,
+ 13, 12, 3, 6, 9, 4, 8, 11, 7, 10, 5, 34, 35, 4, 12, 3, 3, 1, 5, 10, 4, 8, 0,
+ 107, 103, 106, 18, 45, 44, 0, 15, 41, 40, 0, 0, 0, 0, 0, 0, 0, 20, 33, 39, 67, 4, 8,
+ 12, 3, 3, 1, 2, 0, 12, 3, 2, 5, 10, 14, 13, 4, 8, 11, 7, 12, 0, 0, 39, 1, 2,
+ 1, 2, 4, 12, 7, 11, 4, 8, 16, 17, 43, 43, 18, 19, 10, 5, 2, 1, 35, 1, 3, 2, 5,
+ 10, 14, 13, 11, 7, 4, 8, 10, 5, 10, 5, 13, 14, 8, 4, 7, 11, 0, 9, 6, 0, 15, 7,
+ 11, 3, 33, 33, 33, 33, 33, 33, 33, 15, 5, 10, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 3, 48, 48, 0, 0, 0, 0, 0, 0, 48, 48,
+ 33, 33, 0, 15, 83, 92, 85, 90, 96, 97, 95, 18, 19, 16, 10, 10, 35, 10, 5, 14, 13, 11, 7,
+ 10, 5, 14, 13, 11, 7, 0, 0, 3, 0, 39, 12, 12, 33, 0, 0,
+};
diff --git a/src/playerItem/playerItemCellOverwriteSet.c b/src/playerItem/playerItemCellOverwriteSet.c
index fbd53489..3c9e766a 100644
--- a/src/playerItem/playerItemCellOverwriteSet.c
+++ b/src/playerItem/playerItemCellOverwriteSet.c
@@ -4,6 +4,10 @@
#include "common.h"
#include "asm.h"
+extern const u8 gUnk_080B7910[];
+extern const u8 gUnk_080B79A7[];
+extern const u8 gUnk_080B7A3E[]; // TODO figure out type from arm_sub_080B1B84 and arm_sub_080B1BA4
+
void PlayerItemCellOverwriteSet(Entity* this) {
static const s8 gUnk_080B7B6C[] = { 0x0, -0x10, 0x10, 0x0, 0x0, 0x10, -0x10, 0x0 };
u32 tmp;
diff --git a/src/playerItem/playerItemGustJar.c b/src/playerItem/playerItemGustJar.c
index 2f4e574a..a63fdf3f 100644
--- a/src/playerItem/playerItemGustJar.c
+++ b/src/playerItem/playerItemGustJar.c
@@ -3,7 +3,11 @@
#include "functions.h"
#include "sound.h"
+extern const u8* gUnk_08132714[]; // Anim index lists?
+// TODO spriteAnimations in here
+// TODO sprite frame in here
extern Hitbox gUnk_08132B28;
+
void sub_080ADC84(Entity*);
void PlayerItemGustJar_Init(Entity*);
void PlayerItemGustJar_Action1(Entity*);
@@ -143,8 +147,6 @@ void sub_080ADC84(Entity* this) {
this->spriteSettings.flipX = gPlayerEntity.spriteSettings.flipX;
}
-extern const u8* gUnk_08132714[];
-
void sub_080ADCA0(Entity* this, u32 param_2) {
const u8* pFVar1 = gUnk_08132714[(param_2 + (gPlayerEntity.animationState >> 1))];
const u8* pFVar2;
diff --git a/src/playerItem/playerItemShield.c b/src/playerItem/playerItemShield.c
index 74211ade..14f7a2aa 100644
--- a/src/playerItem/playerItemShield.c
+++ b/src/playerItem/playerItemShield.c
@@ -7,6 +7,8 @@
#include "collision.h"
#include "playeritem.h"
+const Hitbox gUnk_081271CC = { 0, 0, { 1, 0, 0, 1 }, 8, 8 };
+
typedef struct {
Entity base;
u8 unk_68;
@@ -17,9 +19,35 @@ typedef struct {
u32 unk_78;
u8* unk_7c;
} PlayerItemShieldEntity;
+void sub_080A2D98(PlayerItemShieldEntity*);
+void sub_080A2E00(PlayerItemShieldEntity*);
+void (*const gUnk_081271D4[])(PlayerItemShieldEntity*) = {
+ sub_080A2D98,
+ sub_080A2E00,
+};
+const u8 gUnk_081271DC[] = {
+ 7, 60, 0, 0, 0, 2, 0, 0, 1, 2, 0, 0, 2, 2, 0, 0, 3, 2, 0, 0, 4, 2, 0, 0, 5, 2, 0, 0, 6, 2, 0, 0, 7, 20,
+ 0, 0, 0, 2, 0, 0, 1, 2, 0, 0, 2, 2, 0, 0, 3, 2, 0, 0, 4, 2, 0, 0, 5, 2, 0, 0, 6, 2, 0, 0, 255, 0, 0, 0,
+};
+const u8 gUnk_08127220[] = {
+ 0, 1, 0, 0, 1, 2, 0, 0, 2, 4, 0, 0, 3, 2, 0, 0, 4, 3, 0, 0, 5, 2, 0, 0, 3, 2, 0, 0, 255, 0, 0, 0,
+};
+
+const Hitbox gUnk_08127250;
+const Hitbox gUnk_08127258;
+const Hitbox gUnk_08127260;
+const Hitbox gUnk_08127268;
+const Hitbox* const gUnk_08127240[] = {
+ &gUnk_08127250,
+ &gUnk_08127258,
+ &gUnk_08127260,
+ &gUnk_08127268,
+};
+const Hitbox gUnk_08127250 = { 0, -7, { 0, 0, 0, 0 }, 6, 7 };
+const Hitbox gUnk_08127258 = { 5, -4, { 0, 0, 0, 0 }, 5, 7 };
+const Hitbox gUnk_08127260 = { 0, 0, { 0, 0, 0, 0 }, 6, 7 };
+const Hitbox gUnk_08127268 = { -5, -4, { 0, 0, 0, 0 }, 5, 7 };
-extern void (*const gUnk_081271D4[])(PlayerItemShieldEntity*);
-extern u8 gUnk_081271DC[];
void sub_080A2E00(PlayerItemShieldEntity* this);
void PlayerItemShield(PlayerItemShieldEntity* this) {
@@ -38,7 +66,7 @@ void sub_080A2D98(PlayerItemShieldEntity* this) {
this->unk_70 = 0x27;
this->unk_78 = gUnk_081271DC[1];
this->unk_74 = 0;
- this->unk_7c = gUnk_081271DC;
+ this->unk_7c = (u8*)gUnk_081271DC;
} else {
this->unk_70 = 0;
}
@@ -48,9 +76,6 @@ void sub_080A2D98(PlayerItemShieldEntity* this) {
sub_080A2E00(this);
}
-extern Hitbox* gUnk_08127240[];
-extern u8 gUnk_08127220[];
-
void sub_080A2E00(PlayerItemShieldEntity* this) {
Entity* playerItem;
u8* pbVar3;
@@ -66,7 +91,7 @@ void sub_080A2E00(PlayerItemShieldEntity* this) {
if ((gPlayerState.shield_status != 0) && (super == gPlayerState.item)) {
if ((gPlayerState.shield_status & 0x80) != 0) {
- super->hitbox = gUnk_08127240[super->animationState >> 1];
+ super->hitbox = (Hitbox*)gUnk_08127240[super->animationState >> 1];
super->collisionFlags = (gPlayerEntity.collisionFlags + 1) | 0x20;
COLLISION_ON(super);
gPlayerState.shield_status &= ~0x80;
@@ -84,7 +109,7 @@ void sub_080A2E00(PlayerItemShieldEntity* this) {
}
this->unk_78 = gUnk_08127220[1];
this->unk_74 = 0;
- this->unk_7c = gUnk_08127220;
+ this->unk_7c = (u8*)gUnk_08127220;
gPlayerState.shield_status |= 0x40;
}
if (this->bounceTimer == 0) {
@@ -117,7 +142,7 @@ void sub_080A2E00(PlayerItemShieldEntity* this) {
pbVar3 = &this->unk_7c[tmp2];
if (pbVar3[0] == 0xff) {
if ((gPlayerState.shield_status & 0x40) != 0) {
- this->unk_7c = gUnk_081271DC;
+ this->unk_7c = (u8*)gUnk_081271DC;
gPlayerState.shield_status &= ~0x40;
}
this->unk_74 = 0;
diff --git a/src/playerUtils.c b/src/playerUtils.c
index 20dd5995..766da0ff 100644
--- a/src/playerUtils.c
+++ b/src/playerUtils.c
@@ -33,7 +33,6 @@ void sub_08079064(Entity*);
extern u8 gMapData;
extern const u8 gUnk_020176E0[];
-extern const s8* gUnk_0811C0E8[];
extern const u8 gUnk_0800851C[];
extern const u8 gUnk_080084BC[];
extern const u8 gUnk_0800845C[];
@@ -58,14 +57,7 @@ void sub_0807AAF8(Entity*, u32);
void sub_0807A750(u32, u32, const u8*, u32);
extern ItemDefinition gItemDefinitions[];
-extern void (*const gUnk_0811C27C[])(Entity*);
-extern void (*const gUnk_0811C284[])(PlayerEntity*);
-extern void (*const gUnk_0811C298[])(PlayerEntity*);
-extern bool32 (*const gPlayerChargeActions[])(ChargeState*);
-extern u8 gUnk_0811C000[];
-extern const u8 gUnk_0811C118[];
-extern void (*const gUnk_0811C120[])(Entity*);
-extern u16 gUnk_0811C268[];
+
extern ItemBehavior* (*const gCreateItemsFuncs[])(Item);
extern void DeleteLoadedTileEntity(u32, u32);
@@ -83,24 +75,15 @@ void sub_0807BFD0(void);
void ForceSetPlayerState(u32 framestate);
struct_03003DF8* sub_080784E4(void);
-extern const u16 gUnk_0811C0F8[];
-
u32 sub_08079778(void);
u32 GetPlayerTilePos(void);
-extern const u16 gUnk_0811C108[];
-
-extern const u16 gUnk_0811C110[];
-
extern const u16 gUnk_08007CAC[];
u32 sub_0807BEEC(u32 param_1, u32 param_2, u32 param_3);
-extern const u16 gUnk_0811C466[];
bool32 sub_0807B434(u32 position, u32 layer);
-extern const u16 gUnk_0811C2AC[];
-
void sub_0807B820(u32);
void sub_0807B8A8(u32);
void sub_0807B930(u32);
@@ -108,15 +91,10 @@ bool32 sub_0807B464(u32 param_1, u32 param_2);
void sub_0807B55C(u32, u32, u16*);
void sub_0807B480(u32, u32);
-extern const s16 gUnk_0811C456[];
-
bool32 sub_0807B600(u32);
bool32 sub_0807B464(u32 tilePos, u32 param_2);
-extern const u16 gUnk_0811C2CC[];
-extern const u16 gUnk_0811C2EC[];
-
bool32 sub_0807B464(u32 param_1, u32 param_2);
extern void CreateRandomWaterTrace(Entity* parent, int range);
@@ -167,9 +145,6 @@ void sub_0807C5B0(void);
extern u8 gUnk_080082DC[];
extern u32 sub_08004202(Entity*, u8*, u32);
-extern s8* gUnk_0811C0B0[];
-extern u8 gUnk_0811C01C[];
-
extern u32 gUnk_02022830[];
extern u16* gUnk_0800823C[];
@@ -294,6 +269,16 @@ bool32 IsTryingToPickupObject(void) {
}
}
+ItemBehavior* CreateItemNone(Item);
+ItemBehavior* CreateItem1(Item);
+ItemBehavior* CreateItem2(Item);
+ItemBehavior* CreateItem3(Item);
+ItemBehavior* CreateItem4(Item);
+ItemBehavior* CreateItem5(Item);
+ItemBehavior* (*const gCreateItemsFuncs[])(Item) = {
+ CreateItemNone, CreateItem1, CreateItem2, CreateItem3, CreateItem4, CreateItem5,
+};
+
ItemBehavior* CreateItem(Item itemId) {
if (((((gPlayerState.queued_action == PLAYER_ROLL) && (itemId != ITEM_TRY_PICKUP_OBJECT)) ||
(((gPlayerState.flags & (PL_ROLLING | PL_CLONING)) != 0 && (ITEM_FOURSWORD < itemId)))) ||
@@ -659,6 +644,215 @@ bool32 PlayerTryDropObject(ItemBehavior* this, u32 index) {
// TODO move above into a itemUtils.c ?
+const u8 gUnk_0811BFE0[] = {
+ 3, 10, 12, 3, 3, 14, 12, 3,
+};
+
+bool32 sub_08078008(ChargeState* state);
+bool32 sub_08078124(ChargeState* state);
+bool32 sub_08078140(ChargeState* state);
+bool32 sub_08078070(ChargeState* state);
+bool32 sub_080780E0(ChargeState* state);
+bool32 sub_08078108(ChargeState* state);
+bool32 (*const gPlayerChargeActions[])(ChargeState*) = {
+ sub_08078008, sub_08078124, sub_08078140, sub_08078070, sub_080780E0, sub_08078108,
+};
+
+const u8 gUnk_0811C000[] = {
+ 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+const u8 gUnk_0811C00C[] = {
+ 0, 238, 14, 255, 0, 10, 241, 255,
+};
+const u8 gUnk_0811C014[] = {
+ 0, 242, 10, 255, 0, 6, 245, 255,
+};
+const u8 gUnk_0811C01C[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 3, 3, 4, 3, 0, 1, 2, 0, 3, 3, 4, 3, 10, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 11, 12, 5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 8, 7, 9, 9, 7, 7, 8, 8, 8, 7, 9, 9, 7, 13, 14, 7, 0, 0,
+};
+
+const s8 gUnk_0811C070[] = { 0, 16, 0, 17, 0, 18, 0, 15, 0, 14, 25, -4, 25, -3, 0, -24,
+ 0, -23, 0, -25, 0, 10, 21, -4, 16, -4, 0, -18, 0, -14, 0, 6 };
+const s8 gUnk_0811C090[] = { 0, 18, 0, 19, 0, 20, 0, 17, 0, 16, 24, -2, 24, -1, 0, -22,
+ 0, -21, 0, -23, 0, 12, 20, -4, 15, -4, 0, -16, 0, -12, 0, 8 };
+const s8* const gUnk_0811C0B0[] = {
+ gUnk_0811C070,
+ gUnk_0811C090,
+};
+
+const s8 gUnk_0811C0B8[] = { 0, -9, 0, -15, 0, -16, 12, -3, 10, -9, 0, 7, 0, -17, 0, -18 };
+const s8 gUnk_0811C0C8[] = { 0, -5, 0, -11, 0, -15, 12, 1, 10, -5, 0, 11, 0, -17, 0, -18 };
+const s8 gUnk_0811C0D8[] = { 0, -19, 0, -19, 0, -24, 32, -7, 10, -13, 0, 26, 0, -25, 0, -26 };
+const s8* const gUnk_0811C0E8[] = {
+ gUnk_0811C0B8,
+ gUnk_0811C0D8,
+ gUnk_0811C0B8,
+ gUnk_0811C0C8,
+};
+
+const u16 gUnk_0811C0F8[] = { 1024, 256, 2048, 512 };
+const s8 gUnk_0811C100[] = { 0, -8, 8, 0, 0, 3, -8, 0 };
+const u16 gUnk_0811C108[] = { 6, 24576, 96, 1536 };
+const u16 gUnk_0811C110[] = { 6, 24576, 96, 1536 };
+const u8 gUnk_0811C118[] = {
+ 19, 18, 18, 16, 16, 17, 17, 19,
+};
+
+void SurfaceAction_DoNothing(Entity*);
+void SurfaceAction_Pit(Entity*);
+void SurfaceAction_SlopeGndGndVertical(Entity*);
+void SurfaceAction_SlopeGndGndHorizontal(Entity*);
+void SurfaceAction_6(Entity*);
+void SurfaceAction_7(Entity*);
+void SurfaceAction_MinishDoorFront(Entity*);
+void SurfaceAction_MinishDoorBack(Entity*);
+void SurfaceAction_A(Entity*);
+void SurfaceAction_B(Entity*);
+void SurfaceAction_SlopeGndWater(Entity*);
+void SurfaceAction_ConveyerNorth(Entity*);
+void SurfaceAction_ConveyerSouth(Entity*);
+void SurfaceAction_ConveyerWest(Entity*);
+void SurfaceAction_ConveyerEast(Entity*);
+void SurfaceAction_Swamp(Entity*);
+void SurfaceAction_14(Entity*);
+void SurfaceAction_CloneTile(Entity*);
+void SurfaceAction_16(Entity*);
+void SurfaceAction_Ice(Entity*);
+void SurfaceAction_ShallowWater(Entity*);
+void SurfaceAction_Water(Entity*);
+void SurfaceAction_Button(Entity*);
+void SurfaceAction_1B(Entity*);
+void SurfaceAction_1C(Entity*);
+void SurfaceAction_Ladder(Entity*);
+void SurfaceAction_20(Entity*);
+void SurfaceAction_22(Entity*);
+void SurfaceAction_Dust(Entity*);
+void SurfaceAction_26(Entity*);
+void SurfaceAction_Hole(Entity*);
+void SurfaceAction_AutoLadder(Entity*);
+void SurfaceAction_ClimbWall(Entity*);
+void SurfaceAction_2C(Entity*);
+
+void (*const gUnk_0811C120[])(Entity*) = {
+ SurfaceAction_DoNothing,
+ SurfaceAction_Pit,
+ NULL,
+ NULL,
+ SurfaceAction_SlopeGndGndVertical,
+ SurfaceAction_SlopeGndGndHorizontal,
+ SurfaceAction_6,
+ SurfaceAction_7,
+ SurfaceAction_MinishDoorFront,
+ SurfaceAction_MinishDoorBack,
+ SurfaceAction_A,
+ SurfaceAction_B,
+ SurfaceAction_SlopeGndWater,
+ SurfaceAction_ConveyerNorth,
+ SurfaceAction_ConveyerSouth,
+ SurfaceAction_ConveyerWest,
+ SurfaceAction_ConveyerEast,
+ SurfaceAction_Swamp,
+ SurfaceAction_DoNothing,
+ SurfaceAction_DoNothing,
+ SurfaceAction_14,
+ SurfaceAction_CloneTile,
+ SurfaceAction_16,
+ SurfaceAction_Ice,
+ SurfaceAction_ShallowWater,
+ SurfaceAction_Water,
+ SurfaceAction_Button,
+ SurfaceAction_1B,
+ SurfaceAction_1C,
+ NULL,
+ SurfaceAction_Ladder,
+ NULL,
+ SurfaceAction_20,
+ SurfaceAction_16,
+ SurfaceAction_22,
+ SurfaceAction_6,
+ SurfaceAction_6,
+ SurfaceAction_Dust,
+ SurfaceAction_26,
+ SurfaceAction_Hole,
+ SurfaceAction_SlopeGndGndVertical,
+ SurfaceAction_SlopeGndGndHorizontal,
+ SurfaceAction_AutoLadder,
+ SurfaceAction_ClimbWall,
+ SurfaceAction_2C,
+ SurfaceAction_Dust,
+};
+
+const u16 gUnk_0811C240[];
+const u16 gUnk_0811C24A[];
+const u16 gUnk_0811C254[];
+const u16 gUnk_0811C25E[];
+const u16 gUnk_0811C1F8[];
+const u16 gUnk_0811C20A[];
+const u16 gUnk_0811C21C[];
+const u16 gUnk_0811C22E[];
+
+const u16* const gUnk_0811C1D8[] = {
+ gUnk_0811C240,
+ gUnk_0811C24A,
+ gUnk_0811C254,
+ gUnk_0811C25E,
+};
+const u16* const gUnk_0811C1E8[] = {
+ gUnk_0811C1F8,
+ gUnk_0811C20A,
+ gUnk_0811C21C,
+ gUnk_0811C22E,
+};
+
+const u16 gUnk_0811C1F8[] = { 43, 1, 65, 1, 78, 8, 76, 2, 0 };
+const u16 gUnk_0811C20A[] = { 44, 3, 66, 3, 76, 2, 77, 4, 0 };
+const u16 gUnk_0811C21C[] = { 42, 5, 64, 5, 79, 6, 77, 4, 0 };
+const u16 gUnk_0811C22E[] = { 45, 7, 67, 7, 78, 8, 79, 6, 0 };
+const u16 gUnk_0811C240[] = { 42, 1, 38, 1, 0 };
+const u16 gUnk_0811C24A[] = { 45, 1, 39, 1, 0 };
+const u16 gUnk_0811C254[] = { 43, 1, 38, 1, 0 };
+const u16 gUnk_0811C25E[] = { 44, 1, 39, 1, 0 };
+const u16 gUnk_0811C268[] = { 16, 1, 90, 1, 17, 1, 19, 1, 0, 0 };
+void sub_0807B114(PlayerEntity*);
+void sub_0807B128(PlayerEntity*);
+void (*const gUnk_0811C27C[])(PlayerEntity*) = {
+ sub_0807B114,
+ sub_0807B128,
+};
+void sub_0807B1A8(PlayerEntity*);
+void sub_0807B144(PlayerEntity*);
+void nullsub_506(PlayerEntity*);
+void sub_0807B178(PlayerEntity*);
+void sub_0807B2F8(PlayerEntity*);
+
+void (*const gUnk_0811C284[])(PlayerEntity*) = {
+ sub_0807B1A8, sub_0807B144, nullsub_506, sub_0807B178, sub_0807B2F8,
+};
+void sub_0807B1DC(PlayerEntity*);
+void sub_0807B1EC(PlayerEntity*);
+void sub_0807B21C(PlayerEntity*);
+void sub_0807B264(PlayerEntity*);
+void sub_0807B2B8(PlayerEntity*);
+void (*const gUnk_0811C298[])(PlayerEntity*) = {
+ sub_0807B1DC, sub_0807B1EC, sub_0807B21C, sub_0807B264, sub_0807B2B8,
+};
+
+const u16 gUnk_0811C2AC[] = { 678, 693, 688, 685, 691, 692, 684, 682, 690, 687, 689, 681, 686, 683, 680, 679 };
+const u16 gUnk_0811C2CC[] = { 710, 747, 720, 717, 737, 744, 716, 714, 730, 719, 727, 713, 718, 715, 712, 711 };
+const u16 gUnk_0811C2EC[] = {
+ 694, 15, 0, 695, 0, 15, 696, 1, 14, 697, 4, 11, 698, 8, 7, 699, 2, 13, 700, 9, 6, 701, 12, 3, 702, 3, 12,
+ 703, 6, 9, 704, 13, 2, 705, 5, 10, 706, 7, 8, 707, 11, 4, 708, 10, 5, 709, 14, 1, 710, 0, 0, 711, 0, 15,
+ 712, 0, 14, 713, 0, 11, 714, 0, 7, 715, 0, 13, 716, 0, 6, 717, 0, 3, 718, 0, 12, 719, 0, 9, 720, 0, 2,
+ 721, 12, 2, 722, 5, 2, 723, 9, 2, 724, 4, 2, 725, 1, 2, 726, 8, 2, 727, 0, 10, 728, 4, 10, 729, 1, 10,
+ 730, 0, 8, 731, 6, 8, 732, 5, 8, 733, 3, 8, 734, 4, 8, 735, 1, 8, 736, 2, 8, 737, 0, 4, 738, 10, 4,
+ 739, 3, 4, 740, 9, 4, 741, 2, 4, 742, 8, 4, 743, 1, 4, 744, 0, 5, 745, 2, 5, 746, 8, 5, 747, 0, 1,
+ 748, 10, 1, 749, 6, 1, 750, 12, 1, 751, 2, 1, 752, 8, 1, 753, 4, 1, 0,
+};
+const s16 gUnk_0811C456[] = { 0, -13, 13, 0, 0, 16, -13, 0 };
+const u16 gUnk_0811C466[] = { 803, 819, 822, 825, 820, 828, 826, 829, 821, 823, 831, 830, 824, 827, 832, 53, 0 };
+
void sub_08077F84(void) {
Entity* obj;
@@ -1194,7 +1388,7 @@ void UpdateCarriedObject(void) {
void sub_08078CD0(PlayerEntity* this) {
Entity* entity;
u32 tmp;
- s8* ptr;
+ const s8* ptr;
entity = this->unk_70;
entity->z.HALF.HI = super->z.HALF.HI - 1;
@@ -2610,8 +2804,8 @@ void sub_0807B0C8(void) {
sub_0806FEBC(&gPlayerEntity, 3, 0);
}
-void PlayerWarp(Entity* player) {
- gUnk_0811C27C[player->subAction](player);
+void PlayerWarp(PlayerEntity* this) {
+ gUnk_0811C27C[super->subAction](this);
}
void sub_0807B114(PlayerEntity* this) {
@@ -2632,7 +2826,7 @@ void sub_0807B144(PlayerEntity* this) {
SetPlayerActionNormal();
}
-void nullsub_506(void) {
+void nullsub_506(PlayerEntity* this) {
}
void sub_0807B178(PlayerEntity* this) {
@@ -3100,8 +3294,8 @@ void sub_0807BC84(void) {
bool32 sub_0807BD14(Entity* this, u32 scrollDirection) {
u32 room = sub_0807BEEC(this->x.HALF.HI, this->y.HALF.HI, scrollDirection);
if (room != 0xff) {
- gRoomControls.unk3 = 2;
- gRoomControls.unk4 = 0;
+ gRoomControls.scrollAction = 2;
+ gRoomControls.scrollSubAction = 0;
gRoomControls.reload_flags = 1;
gRoomControls.room = room;
gRoomControls.scroll_direction = scrollDirection;
@@ -3696,12 +3890,12 @@ u32 SetInventoryValue(u32 item, u32 value) {
return masked_value >> offset;
}
-void sub_0807CAC8(u32 param_1) {
- gSave.unk47C[gArea.dungeon_idx] |= (1 << param_1);
+void EnableDungeonWarp(u32 warp) {
+ gSave.dungeonWarps[gArea.dungeon_idx] |= (1 << warp);
}
-u32 sub_0807CAEC(u32 param_1) {
- return gSave.unk47C[gArea.dungeon_idx] >> param_1 & 1;
+u32 IsDungeonWarpActive(u32 warp) {
+ return gSave.dungeonWarps[gArea.dungeon_idx] >> warp & 1;
}
u32 CheckLocalFlagByBank(u32 bank, u32 flag) {
diff --git a/src/projectile.c b/src/projectile.c
index aaddbb1b..3cfe2511 100644
--- a/src/projectile.c
+++ b/src/projectile.c
@@ -50,8 +50,8 @@ const ProjectileDefinition gProjectileDefinitions[] = {
{ 16400, 288, { &gHitbox_0 }, 107, 2, { 0, 1, 1, 1 }, 4, 384, 3, 11 }, // TODO sprite index too high
MULTI_FORM(gProjectileDefinition_14),
{ 16400, 1, { &gHitbox_0 }, SPRITE_SPIDERWEB, 0, { 0, 1, 1, 1 }, 65, 640, 159, 143 },
- { 0, 0, { &gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_0, 0, { 0, 1, 1, 1 }, 66, 640, 146, 11 },
- { 399, 0, { &gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_1, 0, { 0, 1, 1, 1 }, 65, 640, 10, 11 },
+ { 0, 0, { (Hitbox*)&gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_0, 0, { 0, 1, 1, 1 }, 66, 640, 146, 11 },
+ { 399, 0, { (Hitbox*)&gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_1, 0, { 0, 1, 1, 1 }, 65, 640, 10, 11 },
{ 405, 0, { &gHitbox_0 }, SPRITE_V1DARKMAGICPROJECTILE, 0, { 3, 1, 1, 1 }, 66, 256, 46, 15 },
#ifdef EU
{ 401, 112, { &gHitbox_1 }, 488, 0, { 1, 1, 1, 1 }, 65, 640, 162, 11 }, // TODO sprite index too high
@@ -64,8 +64,8 @@ const ProjectileDefinition gProjectileDefinitions[] = {
MULTI_FORM(gProjectileDefinition_1D),
MULTI_FORM(gProjectileDefinition_1E),
MULTI_FORM(gProjectileDefinition_1F),
- { 415, 4, { &gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 704, 60, 11 },
- { 415, 320, { &gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 512, 164, 11 },
+ { 415, 4, { (Hitbox*)&gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 704, 60, 11 },
+ { 415, 320, { (Hitbox*)&gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 512, 164, 11 },
MULTI_FORM(gProjectileDefinition_22),
{ 493, 0, { &gHitbox_22 }, SPRITE_GYORGMALEENERGYPROJECTILE, 0, { 0, 1, 1, 1 }, 66, 256, 31, 11 },
{ 418, 1, { &gHitbox_22 }, SPRITE_WRATHEYE, 0, { 1, 1, 1, 1 }, 66, 512, 55, 11 },
@@ -113,18 +113,18 @@ const ProjectileDefinition gProjectileDefinition_F[] = {
{ 32992, 1, { &gHitbox_0 }, SPRITE_POT, 0, { 3, 1, 1, 1 }, 66, 384, 157, 11 },
};
const ProjectileDefinition gProjectileDefinition_10[] = {
- { 33008, 1, { &gUnk_080FD3FC }, 167, 1, { 0, 0, 1, 0 }, 65, 640, 110, 4 },
- { 366, 0, { &gUnk_080FD3FC }, SPRITE_FLYINGSKULL, 0, { 0, 0, 1, 0 }, 65, 640, 110, 4 },
+ { 33008, 1, { (Hitbox*)&gUnk_080FD3FC }, 167, 1, { 0, 0, 1, 0 }, 65, 640, 110, 4 },
+ { 366, 0, { (Hitbox*)&gUnk_080FD3FC }, SPRITE_FLYINGSKULL, 0, { 0, 0, 1, 0 }, 65, 640, 110, 4 },
}; // TODO sprite index too high
#ifdef EU
const ProjectileDefinition gProjectileDefinition_14[] = {
{ 387, 20, { &gHitbox_2 }, 486, 0, { 0, 1, 1, 1 }, 65, 640, 110, 12 },
- { 387, 20, { &gUnk_080FD43C }, 486, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 },
+ { 387, 20, { (Hitbox*)&gUnk_080FD43C }, 486, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 },
}; // TODO sprite index too high
#else
const ProjectileDefinition gProjectileDefinition_14[] = {
{ 387, 20, { &gHitbox_2 }, 487, 0, { 0, 1, 1, 1 }, 65, 640, 110, 12 },
- { 387, 20, { &gUnk_080FD43C }, 487, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 },
+ { 387, 20, { (Hitbox*)&gUnk_080FD43C }, 487, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 },
}; // TODO sprite index too high
#endif
const ProjectileDefinition gProjectileDefinition_1B[] = {
@@ -164,12 +164,12 @@ const ProjectileDefinition gProjectileDefinition_1F[] = {
#ifdef EU
const ProjectileDefinition gProjectileDefinition_22[] = {
{ 492, 372, { &gHitbox_1 }, 497, 0, { 0, 0, 1, 1 }, 65, 640, 29, 11 },
- { 491, 338, { &gHitbox_20 }, 496, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 },
+ { 491, 338, { (Hitbox*)&gHitbox_20 }, 496, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 },
}; // TODO sprite index too high
#else
const ProjectileDefinition gProjectileDefinition_22[] = {
{ 492, 372, { &gHitbox_1 }, 498, 0, { 0, 0, 1, 1 }, 65, 640, 29, 11 },
- { 491, 338, { &gHitbox_20 }, 497, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 },
+ { 491, 338, { (Hitbox*)&gHitbox_20 }, 497, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 },
}; // TODO sprite index too high
#endif
diff --git a/src/room.c b/src/room.c
index 12abcc67..a8a877e8 100644
--- a/src/room.c
+++ b/src/room.c
@@ -11,7 +11,6 @@
static void sub_0804B058(EntityData* dat);
extern void sub_0801AC98(void);
extern u32 sub_08049D1C(u32);
-extern void* GetRoomProperty(u32, u32, u32);
extern void** gCurrentRoomProperties;
extern void*** gAreaTable[];
@@ -374,7 +373,7 @@ void sub_0804B388(u32 a1, u32 a2) {
e->collisionLayer = a2;
sub_0806F704(e, a1);
}
- sub_080526F8(-1);
+ ModDungeonKeys(-1);
}
void sub_0804B3C4(TileEntity* tile) {
diff --git a/src/roomInit.c b/src/roomInit.c
index fe7340a7..c77091db 100644
--- a/src/roomInit.c
+++ b/src/roomInit.c
@@ -2724,7 +2724,7 @@ extern EntityData gUnk_080E3850;
void sub_StateChange_FortressOfWindsTop_Main(void) {
SetGlobalFlag(LV3_CLEAR);
UpdateGlobalProgress();
- sub_0805B4D0(3);
+ LoadStaticBackground(3);
if (!GetInventoryValue(ITEM_OCARINA) && CheckLocalFlag(0x45)) {
LoadRoomEntityList(&gUnk_080E3850);
}
@@ -3609,7 +3609,7 @@ u32 sub_unk3_DarkHyruleCastleBridge_Main(void) {
}
void sub_StateChange_DarkHyruleCastleBridge_Main(void) {
- sub_0805B4D0(6);
+ LoadStaticBackground(6);
}
u32 sub_unk3_VaatisArms_First(void) {
@@ -3635,7 +3635,7 @@ extern EntityData gUnk_080EAD68;
extern EntityData gUnk_080EADB8;
void sub_StateChange_DarkHyruleCastleOutside_ZeldaStatuePlatform(void) {
- sub_0805B4D0(4);
+ LoadStaticBackground(4);
if (!CheckLocalFlag(0x77)) {
LoadRoomEntityList(&gUnk_080EAD68);
} else if (!CheckLocalFlag(0x79)) {
@@ -4405,7 +4405,7 @@ void sub_StateChange_HyruleTown_0(void) {
} else {
LoadRoomEntityList(&gUnk_080EE9DC);
}
- if ((gSave.global_progress > 4) && !CheckKinstoneFused(0xb) &&
+ if ((gSave.global_progress > 4) && !CheckKinstoneFused(KINSTONE_B) &&
(CheckGlobalFlag(RENTED_HOUSE_DIN) || CheckGlobalFlag(RENTED_HOUSE_NAYRU) ||
CheckGlobalFlag(RENTED_HOUSE_FARORE))) {
LoadRoomEntityList(&gUnk_080EEA5C);
@@ -5543,7 +5543,7 @@ u32 sub_unk3_WindTribeTowerRoof_Main(void) {
extern EntityData gUnk_080F66AC;
void sub_StateChange_WindTribeTowerRoof_Main(void) {
- sub_0805B4D0(5);
+ LoadStaticBackground(5);
if (CheckGlobalFlag(LV5_CLEAR) && !CheckLocalFlagByBank(FLAG_BANK_1, 5)) {
LoadRoomEntityList(&gUnk_080F66AC);
}
@@ -5972,7 +5972,7 @@ extern EntityData gUnk_080F8430;
void sub_StateChange_HyruleField_WesternWoodsCenter(void) {
CloudOverlayManager_Main(NULL);
- if (CheckKinstoneFused(KINSTONE_21) && !CheckLocalFlagByBank(FLAG_BANK_2, 0x42)) {
+ if (CheckKinstoneFused(KINSTONE_21) && !CheckLocalFlagByBank(FLAG_BANK_2, MHOUSE08_03)) {
LoadRoomEntityList(&gUnk_080F8430);
}
}
@@ -6261,7 +6261,7 @@ u32 sub_unk3_VeilFallsTop_Main(void) {
}
void sub_StateChange_VeilFallsTop_Main(void) {
- sub_0805B4D0(2);
+ LoadStaticBackground(2);
sub_0806D0B0(0);
}
@@ -6555,12 +6555,12 @@ void sub_StateChange_MtCrenel_MountainTop(void) {
} else {
LoadRoomEntityList(&gUnk_080FACB8);
}
- sub_0805B4D0(0);
+ LoadStaticBackground(0);
sub_08059994();
}
void sub_unk1_MtCrenel_MountainTop(void) {
- sub_0805B4D0(0);
+ LoadStaticBackground(0);
}
u32 sub_unk3_MtCrenel_WallClimb(void) {
@@ -6578,7 +6578,7 @@ extern EntityData gUnk_080FAFE4;
extern EntityData gUnk_080FB004;
void sub_StateChange_MtCrenel_CaveOfFlamesEntrance(void) {
- sub_0805B4D0(1);
+ LoadStaticBackground(1);
if (CheckGlobalFlag(LV2_CLEAR) && !CheckLocalFlag(LV1_CLEAR)) {
LoadRoomEntityList(&gUnk_080FAFE4);
}
diff --git a/src/save.c b/src/save.c
index 03d35709..46dcb0d3 100644
--- a/src/save.c
+++ b/src/save.c
@@ -46,7 +46,13 @@ const char gUnk_0811E470[4] = "LINK";
#if defined(DEMO_USA) || defined(DEMO_JP)
const u8 demoUnknown0 = 0x0;
#ifdef DEMO_USA
-const u8 demoUnknown1[] = { 0x0f, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f, 0x08, 0x05, 0x05, 0x00, 0x00 };
+const u8 demoUnknown1[] = {
+ // demo_timer for the three save files
+ 0x0f, 0x0a, 0x0a, // gUnk_02000010.field_0x7 == 0
+ 0x0f, 0x0f, 0x0f, // gUnk_02000010.field_0x7 == 1
+ 0x08, 0x05, 0x05, // gUnk_02000010.field_0x7 == 2
+ 0x00, 0x00
+};
#else
const u8 demoUnknown1[] = { 0 };
#endif
diff --git a/src/script.c b/src/script.c
index b59c8ef2..27bea866 100644
--- a/src/script.c
+++ b/src/script.c
@@ -10,7 +10,7 @@
#include "item.h"
#include "ui.h"
-void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script);
+void InitScriptExecutionContext(ScriptExecutionContext* context, Script* script);
void sub_0807DE80(Entity*);
void DisablePauseMenu(void);
void ScriptCommandNop(Entity* entity, ScriptExecutionContext* context);
@@ -149,7 +149,7 @@ void ScriptCommand_SetInventoryValue(Entity* entity, ScriptExecutionContext* con
void ScriptCommand_InitItemGetSequence(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_CameraTargetEntity(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_CameraTargetPlayer(Entity* entity, ScriptExecutionContext* context);
-void ScriptCommand_0807F0B4(Entity* entity, ScriptExecutionContext* context);
+void ScriptCommand_SetScrollSpeed(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context);
typedef void (*ScriptCommand)(Entity*, ScriptExecutionContext*);
@@ -185,7 +185,7 @@ void DestroyScriptExecutionContext(ScriptExecutionContext* context) {
MemClear(context, sizeof(ScriptExecutionContext));
}
-ScriptExecutionContext* StartCutscene(Entity* entity, u16* script) {
+ScriptExecutionContext* StartCutscene(Entity* entity, Script* script) {
ScriptExecutionContext* context;
context = CreateScriptExecutionContext();
@@ -195,7 +195,7 @@ ScriptExecutionContext* StartCutscene(Entity* entity, u16* script) {
return context;
}
-void InitScriptForEntity(Entity* entity, ScriptExecutionContext* context, u16* script) {
+void InitScriptForEntity(Entity* entity, ScriptExecutionContext* context, Script* script) {
entity->flags |= ENT_SCRIPTED;
*(ScriptExecutionContext**)&entity->cutsceneBeh = context;
InitScriptExecutionContext(context, script);
@@ -209,7 +209,7 @@ void UnloadCutsceneData(Entity* entity) {
}
}
-void StartPlayerScript(u16* script) {
+void StartPlayerScript(Script* script) {
Entity* player;
MemClear(&gPlayerScriptExecutionContext, sizeof(gPlayerScriptExecutionContext));
@@ -222,7 +222,7 @@ void StartPlayerScript(u16* script) {
gPlayerState.field_0x38 = 0;
}
-UNUSED ScriptExecutionContext* StartCutscene2(Entity* entity, u16* script) {
+UNUSED ScriptExecutionContext* StartCutscene2(Entity* entity, Script* script) {
ScriptExecutionContext* context;
context = CreateScriptExecutionContext();
@@ -234,7 +234,7 @@ UNUSED ScriptExecutionContext* StartCutscene2(Entity* entity, u16* script) {
return context;
}
-void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script) {
+void InitScriptExecutionContext(ScriptExecutionContext* context, Script* script) {
MemClear(context, sizeof(ScriptExecutionContext));
context->scriptInstructionPointer = script;
}
@@ -325,7 +325,7 @@ void sub_0807DD64(Entity* entity) {
entity->field_0x82.HWORD = 0;
}
-void sub_0807DD80(Entity* entity, u16* script) {
+void sub_0807DD80(Entity* entity, Script* script) {
InitScriptExecutionContext(*(ScriptExecutionContext**)&entity->cutsceneBeh, script);
sub_0807DD64(entity);
}
@@ -597,7 +597,7 @@ void ExecuteScript(Entity* entity, ScriptExecutionContext* context) {
ScriptCommand_InitItemGetSequence,
ScriptCommand_CameraTargetEntity,
ScriptCommand_CameraTargetPlayer,
- ScriptCommand_0807F0B4,
+ ScriptCommand_SetScrollSpeed,
ScriptCommand_0807F0C8,
};
@@ -1516,8 +1516,8 @@ void ScriptCommand_CameraTargetPlayer(Entity* entity, ScriptExecutionContext* co
gRoomControls.camera_target = &gPlayerEntity;
}
-void ScriptCommand_0807F0B4(Entity* entity, ScriptExecutionContext* context) {
- gRoomControls.unk5 = context->scriptInstructionPointer[1] & 7;
+void ScriptCommand_SetScrollSpeed(Entity* entity, ScriptExecutionContext* context) {
+ gRoomControls.scrollSpeed = context->scriptInstructionPointer[1] & 7;
}
void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context) {
diff --git a/src/scroll.c b/src/scroll.c
index 8e4d4018..c4c73049 100644
--- a/src/scroll.c
+++ b/src/scroll.c
@@ -72,13 +72,13 @@ void UpdateScroll(void) {
};
gRoomControls.scroll_flags &= 0xfb;
- gUnk_0811E768[gRoomControls.unk3](&gRoomControls);
+ gUnk_0811E768[gRoomControls.scrollAction](&gRoomControls);
}
void sub_0807FC64(RoomControls* controls) {
- controls->unk3 = 1;
+ controls->scrollAction = 1;
controls->reload_flags = 0;
- controls->unk5 = 4;
+ controls->scrollSpeed = 4;
sub_0807FC7C(controls);
UpdateIsDiggingCave();
}
@@ -98,8 +98,8 @@ void sub_0807FC7C(RoomControls* controls) {
uVar5 = controls->scroll_x & 7;
if (uVar3 >= 1) {
if (controls->origin_x < controls->scroll_x) {
- if (controls->unk5 <= uVar3) {
- uVar3 = controls->unk5;
+ if (controls->scrollSpeed <= uVar3) {
+ uVar3 = controls->scrollSpeed;
controls->scroll_flags |= 4;
}
controls->scroll_x = controls->scroll_x - uVar3;
@@ -113,8 +113,8 @@ void sub_0807FC7C(RoomControls* controls) {
} else {
uVar2 = controls->origin_x + controls->width - 0xf0;
if (controls->scroll_x < uVar2) {
- if (-controls->unk5 >= uVar3) {
- uVar3 = -controls->unk5;
+ if (-controls->scrollSpeed >= uVar3) {
+ uVar3 = -controls->scrollSpeed;
controls->scroll_flags |= 4;
}
controls->scroll_x -= uVar3;
@@ -135,8 +135,8 @@ void sub_0807FC7C(RoomControls* controls) {
uVar5 = controls->scroll_y & 7;
if (uVar3 >= 1) {
if (controls->origin_y < controls->scroll_y) {
- if (controls->unk5 <= uVar3) {
- uVar3 = controls->unk5;
+ if (controls->scrollSpeed <= uVar3) {
+ uVar3 = controls->scrollSpeed;
controls->scroll_flags |= 4;
}
controls->scroll_y = controls->scroll_y - uVar3;
@@ -150,8 +150,8 @@ void sub_0807FC7C(RoomControls* controls) {
} else {
uVar2 = controls->origin_y + controls->height - DISPLAY_HEIGHT;
if (controls->scroll_y < uVar2) {
- if (-controls->unk5 >= uVar3) {
- uVar3 = -controls->unk5;
+ if (-controls->scrollSpeed >= uVar3) {
+ uVar3 = -controls->scrollSpeed;
controls->scroll_flags |= 4;
}
controls->scroll_y -= uVar3;
@@ -174,19 +174,19 @@ void sub_0807FDB0(RoomControls* controls) {
sub_0807FDE4,
sub_0807FDF8,
};
- gUnk_0811E780[controls->unk4](controls);
+ gUnk_0811E780[controls->scrollSubAction](controls);
}
void sub_0807FDC8(RoomControls* controls) {
gUpdateVisibleTiles = 1;
UpdateScrollVram();
- controls->unk4 = 1;
+ controls->scrollSubAction = 1;
gUpdateVisibleTiles = 0;
}
void sub_0807FDE4(RoomControls* controls) {
- controls->unk4 = 2;
- controls->filler2[0] = 0;
+ controls->scrollSubAction = 2;
+ controls->unk_18 = 0;
gUpdateVisibleTiles = 2;
}
@@ -196,7 +196,7 @@ void sub_0807FDF8(RoomControls* controls) {
s32 iVar3;
gUpdateVisibleTiles = 2;
- controls->filler2[0]++;
+ controls->unk_18++;
switch (controls->scroll_direction) {
case 0:
controls->scroll_y -= 4;
@@ -204,7 +204,7 @@ void sub_0807FDF8(RoomControls* controls) {
if (pEVar2 == &gPlayerEntity) {
pEVar2->y.WORD = gPlayerEntity.y.WORD - Q_16_16(0.375);
}
- if (controls->filler2[0] == 0x28) {
+ if (controls->unk_18 == 0x28) {
sub_0807FEC8(controls);
}
break;
@@ -213,7 +213,7 @@ void sub_0807FDF8(RoomControls* controls) {
if (controls->camera_target == &gPlayerEntity) {
gPlayerEntity.x.WORD += Q_16_16(0.25);
}
- if (controls->filler2[0] == 0x3c) {
+ if (controls->unk_18 == 0x3c) {
sub_0807FEC8(controls);
}
break;
@@ -223,7 +223,7 @@ void sub_0807FDF8(RoomControls* controls) {
if (pEVar2 == &gPlayerEntity) {
pEVar2->y.WORD = gPlayerEntity.y.WORD + Q_16_16(0.375);
}
- if (controls->filler2[0] == 0x28) {
+ if (controls->unk_18 == 0x28) {
sub_0807FEC8(controls);
}
break;
@@ -232,7 +232,7 @@ void sub_0807FDF8(RoomControls* controls) {
if (controls->camera_target == &gPlayerEntity) {
gPlayerEntity.x.WORD -= Q_16_16(0.25);
}
- if (controls->filler2[0] == 0x3c) {
+ if (controls->unk_18 == 0x3c) {
sub_0807FEC8(controls);
}
break;
@@ -242,11 +242,11 @@ void sub_0807FDF8(RoomControls* controls) {
sub_08080BC4();
}
-void sub_0807FEC8(RoomControls* this) {
- this->unk3 = 0;
+void sub_0807FEC8(RoomControls* controls) {
+ controls->scrollAction = 0;
MemFill32(0xffffffff, gPlayerState.path_memory, sizeof(gPlayerState.path_memory));
- gPlayerState.startPosX = this->camera_target->x.HALF.HI;
- gPlayerState.startPosY = this->camera_target->y.HALF.HI;
+ gPlayerState.startPosX = controls->camera_target->x.HALF.HI;
+ gPlayerState.startPosY = controls->camera_target->y.HALF.HI;
}
void sub_0807FEF0(RoomControls* controls) {
@@ -254,20 +254,20 @@ void sub_0807FEF0(RoomControls* controls) {
sub_0807FF08,
sub_0807FF1C,
};
- gUnk_0811E78C[controls->unk4](controls);
+ gUnk_0811E78C[controls->scrollSubAction](controls);
}
void sub_0807FF08(RoomControls* controls) {
- controls->unk4 = 1;
- controls->filler2[0] = 0;
+ controls->scrollSubAction = 1;
+ controls->unk_18 = 0;
gUpdateVisibleTiles = 3;
}
void sub_0807FF1C(RoomControls* controls) {
if ((gRoomTransition.frameCount & 1U) == 0) {
gUpdateVisibleTiles = 3;
- if (++controls->filler2[0] > 0x13) {
- controls->unk3 = 0;
+ if (++controls->unk_18 > 0x13) {
+ controls->scrollAction = 0;
ResetSystemPriority();
}
}
@@ -277,11 +277,11 @@ void sub_0807FF54(RoomControls* controls) {
static void (*const gUnk_0811E794[])(RoomControls*) = {
sub_0807FF6C, sub_0807FFE4, sub_08080040, sub_08080108, sub_08080198, sub_080801BC,
};
- gUnk_0811E794[controls->unk4](controls);
+ gUnk_0811E794[controls->scrollSubAction](controls);
}
void sub_0807FF6C(RoomControls* controls) {
- controls->unk4 = 1;
+ controls->scrollSubAction = 1;
gScreen.lcd.displayControl |= DISPCNT_WIN1_ON;
gScreen.controls.windowInsideControl = (u8)gScreen.controls.windowInsideControl | 0x1700;
gScreen.controls.windowOutsideControl = (gScreen.controls.windowOutsideControl & 0xff00) | 7;
@@ -298,8 +298,8 @@ void sub_0807FF6C(RoomControls* controls) {
}
void sub_0807FFE4(RoomControls* controls) {
- controls->unk4 = 2;
- controls->filler2[0] = sub_080803D0() + 6;
+ controls->scrollSubAction = 2;
+ controls->unk_18 = sub_080803D0() + 6;
gUnk_0200B640 = sub_08080278();
sub_080197D4(*gUnk_08109194[gDiggingCaveEntranceTransition.entrance->type]);
sub_0807C8B0(gMapTop.mapData, controls->width >> 4, controls->height >> 4);
@@ -314,32 +314,32 @@ void sub_08080040(RoomControls* controls) {
s32 iVar7;
s32 temp;
- controls->filler2[0] -= 6;
- controls->filler2[1] = (controls->filler2[0] << 1) / 3;
- if (0x2a < controls->filler2[0]) {
+ controls->unk_18 -= 6;
+ controls->unk_1a = (controls->unk_18 << 1) / 3;
+ if (0x2a < controls->unk_18) {
iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x;
- uVar6 = (iVar2 - controls->filler2[0]) + 8;
+ uVar6 = (iVar2 - controls->unk_18) + 8;
if (uVar6 < 0) {
uVar6 = 0;
}
- iVar7 = iVar2 + controls->filler2[0] - 8;
+ iVar7 = iVar2 + controls->unk_18 - 8;
if (DISPLAY_WIDTH < iVar7) {
iVar7 = DISPLAY_WIDTH;
}
temp = controls->camera_target->y.HALF.HI - controls->scroll_y;
- uVar5 = (temp - controls->filler2[1]) + 8;
+ uVar5 = (temp - controls->unk_1a) + 8;
if (uVar5 < 0) {
uVar5 = 0;
}
- iVar3 = temp + controls->filler2[1] - 8;
+ iVar3 = temp + controls->unk_1a - 8;
if (DISPLAY_HEIGHT < iVar3) {
iVar3 = DISPLAY_HEIGHT;
}
gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff);
gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff);
}
- if (controls->filler2[0] == 0) {
- controls->unk4 = 3;
+ if (controls->unk_18 == 0) {
+ controls->scrollSubAction = 3;
DeleteSleepingEntities();
sub_0807C810();
sub_08080C80(*(gUnk_08109194[gDiggingCaveEntranceTransition.entrance->type] + 1));
@@ -349,7 +349,7 @@ void sub_08080040(RoomControls* controls) {
}
void sub_08080108(RoomControls* controls) {
- controls->unk4 = 4;
+ controls->scrollSubAction = 4;
MemCopy(gMapBottom.mapData, gMapBottom.mapDataClone, sizeof(gMapBottom.mapData));
MemCopy(gMapTop.mapData, gMapTop.mapDataClone, sizeof(gMapTop.mapData));
sub_08080368();
@@ -365,8 +365,8 @@ void sub_08080108(RoomControls* controls) {
}
void sub_08080198(RoomControls* controls) {
- controls->unk4 = 5;
- controls->filler2[2] = 0xff;
+ controls->scrollSubAction = 5;
+ controls->unk_1c = 0xff;
LoadRoom();
CallRoomProp5And7();
gUpdateVisibleTiles = 0;
@@ -381,32 +381,32 @@ void sub_080801BC(RoomControls* controls) {
s32 iVar7;
s32 temp;
- controls->filler2[0] += 6;
- controls->filler2[1] = (controls->filler2[0] << 1) / 3;
- if (0x1e < controls->filler2[0]) {
+ controls->unk_18 += 6;
+ controls->unk_1a = (controls->unk_18 << 1) / 3;
+ if (0x1e < controls->unk_18) {
iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x;
- uVar6 = (iVar2 - controls->filler2[0]);
+ uVar6 = (iVar2 - controls->unk_18);
if (uVar6 < 0) {
uVar6 = 0;
}
- iVar7 = iVar2 + controls->filler2[0];
+ iVar7 = iVar2 + controls->unk_18;
if (DISPLAY_WIDTH < iVar7) {
iVar7 = DISPLAY_WIDTH;
}
temp = controls->camera_target->y.HALF.HI - controls->scroll_y;
- uVar5 = (temp - controls->filler2[1]);
+ uVar5 = (temp - controls->unk_1a);
if (uVar5 < 0) {
uVar5 = 0;
}
- iVar3 = temp + controls->filler2[1];
+ iVar3 = temp + controls->unk_1a;
if (DISPLAY_HEIGHT < iVar3) {
iVar3 = DISPLAY_HEIGHT;
}
gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff);
gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff);
}
- if (controls->filler2[2] == 0) {
- controls->unk3 = 0;
+ if (controls->unk_1c == 0) {
+ controls->scrollAction = 0;
controls->reload_flags = 0;
ResetSystemPriority();
gScreen.lcd.displayControl &= ~DISPCNT_WIN1_ON;
@@ -414,7 +414,7 @@ void sub_080801BC(RoomControls* controls) {
gScreen.controls.windowOutsideControl &= 0xff00;
} else {
gUpdateVisibleTiles = 4;
- controls->filler2[2] = 0;
+ controls->unk_1c = 0;
}
}
@@ -461,7 +461,7 @@ void UpdateIsDiggingCave(void) {
void ClearTilemaps(void) {
MemClear(&gRoomControls, sizeof(gRoomControls));
MemClear(&gDiggingCaveEntranceTransition, sizeof(gDiggingCaveEntranceTransition));
- gRoomControls.filler3 = 0xffff;
+ gRoomControls.unk_22 = 0xffff;
gDiggingCaveEntranceTransition.previousArea = 0xff;
gUnk_02034480.unk_00 = 0;
MemClear(&gMapDataBottomSpecial, 0x8000);
@@ -630,8 +630,8 @@ void sub_0808091C(const ScreenTransitionData* screenTransition, u32 transitionTy
}
void sub_08080930(u32 unused) {
- gRoomControls.unk3 = 5;
- gRoomControls.unk4 = 0;
+ gRoomControls.scrollAction = 5;
+ gRoomControls.scrollSubAction = 0;
gRoomControls.reload_flags = 2;
gRoomControls.scroll_direction = 0;
SetInitializationPriority();
@@ -821,8 +821,8 @@ NONMATCH("asm/non_matching/scroll/sub_08080CB4.inc", void sub_08080CB4(Entity* t
if (this->type != this->animIndex) {
InitAnimationForceUpdate(this, this->type);
if (this->type == 0x5c) {
- const struct_080C9CBC* ptr = &gUnk_080C9CBC[this->type2];
- this->palette.raw = ((ptr->unk0 & 0xf) << 4) | ptr->unk0;
+ const KinstoneWorldEvent* ptr = &gKinstoneWorldEvents[this->type2];
+ this->palette.raw = ((ptr->objPalette & 0xf) << 4) | ptr->objPalette;
}
} else {
diff --git a/src/staffroll.c b/src/staffroll.c
index 0d64b765..65d2ad5a 100644
--- a/src/staffroll.c
+++ b/src/staffroll.c
@@ -1,13 +1,18 @@
-#include "global.h"
-#include "room.h"
+/**
+ * @file staffroll.c
+ * @ingroup Tasks
+ *
+ * @brief Staffroll task
+ */
+#include "common.h"
+#include "fileselect.h"
+#include "flags.h"
+#include "game.h"
#include "main.h"
+#include "menu.h"
+#include "room.h"
#include "save.h"
-#include "flags.h"
-#include "fileselect.h"
#include "screen.h"
-#include "common.h"
-#include "menu.h"
-#include "game.h"
#include "subtask.h"
typedef struct {
@@ -125,7 +130,7 @@ void StaffrollTask_State1MenuType2(void) {
switch (gStaffrollMenu.base.overlayType) {
case 0:
MemClear(&gBG1Buffer, sizeof(gBG1Buffer));
- sub_0805F46C(gStaffrollMenu.unk_10, (Font*)gUnk_081272E0[gStaffrollMenu.unk_19]);
+ ShowTextBox(gStaffrollMenu.unk_10, gUnk_081272E0[gStaffrollMenu.unk_19]);
gScreen.bg1.updated = 1;
gStaffrollMenu.base.overlayType++;
gStaffrollMenu.unk_18 = 0;
diff --git a/src/sub_08055E08.c b/src/sub_08055E08.c
deleted file mode 100644
index 7f9b9438..00000000
--- a/src/sub_08055E08.c
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "global.h"
-#include "menu.h"
-#include "room.h"
-#include "functions.h"
-#include "screen.h"
-
-extern void (*const gUnk_080FF420[])(void);
-extern void sub_0804B0B0(u32, u32);
-extern void sub_08055B70(u32, u32, u32, u32);
-
-struct {
- /*0x00*/ u8 unk0;
- /*0x10*/ u8 filler1[0x1B];
- /*0x1c*/ u8 unk1C;
- /*0x1d*/ u8 unk1D;
- /*0x1e*/ u8 unk1E;
- /*0x1f*/ u8 unk1F;
-} gUpdateVisibleTiles;
-
-extern EntityData gUnk_080FF400;
-
-void sub_08055E08(void) {
- gUnk_080FF420[gMenu.overlayType]();
-}
-
-void sub_08055E24(void) {
- gMenu.overlayType++;
- gUpdateVisibleTiles.unk0 = 1;
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- LoadRoomEntityList(&gUnk_080FF400);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_493(void) {
-}
diff --git a/src/subtask.c b/src/subtask.c
index 950e7f3f..054d0c05 100644
--- a/src/subtask.c
+++ b/src/subtask.c
@@ -1,857 +1,297 @@
-#include "asm.h"
#include "common.h"
-#include "effects.h"
-#include "fade.h"
+#include "fileselect.h"
#include "flags.h"
#include "functions.h"
-#include "global.h"
+#include "game.h"
+#include "item.h"
+#include "itemMetaData.h"
#include "kinstone.h"
-#include "manager/bombableWallManager.h"
+#include "main.h"
#include "menu.h"
#include "message.h"
-#include "object.h"
-#include "room.h"
#include "save.h"
#include "screen.h"
-#include "sound.h"
+#include "subtask.h"
+#include "ui.h"
-extern void (*const gUnk_080FEEB8[])(void);
+extern u8 gUnk_020350F0[];
+extern Screen gUnk_03001020;
+extern u8 gPaletteBufferBackup[];
+extern u8 gUnk_03000420[];
-extern void sub_0801876C(u32, u32);
+void sub_080A70AC(const KeyButtonLayout* layout);
+void sub_080A5F48(u32, u32);
-extern u8 gUpdateVisibleTiles;
-void sub_08055B70(u32, u32, u32, u32);
+extern void sub_0805E974(void);
+extern bool32 sub_080A51F4(void);
+extern u32 sub_0807CB24(u32, u32);
-extern void sub_08054974(u32, u32);
+extern void (*const gUnk_0812901C[])(void);
-extern void (*const gUnk_080FEEC8[])(void);
+void sub_080A74F4(void);
-void sub_080553E0(u32);
+extern void UpdateCarriedObject(void);
-extern void (*const gUnk_080FEF34[])(void);
+extern void (*const gSubtasks[])(void);
-extern EntityData gUnk_080FEED4[];
+// subtaskUtils? menuUtils?
-extern void (*const gUnk_080FEF3C[])(void);
+u32 sub_080A6F40(void) {
+ extern u8 gUnk_08128F38[];
+ int iVar1;
+ u8* pcVar2;
+ u32 uVar3;
+ u32 uVar4;
-extern void sub_0804B0E8(u32, u32);
-
-extern void (*const gUnk_080FF120[])(void);
-
-extern EntityData* gUnk_080FF108[];
-
-extern void (*const gUnk_080FF148[])(void);
-
-extern EntityData gUnk_080FF128[];
-
-extern void (*const gUnk_080FF174[])(void);
-
-extern EntityData gUnk_080FF154[];
-
-extern void (*const gUnk_080FF1CC[])(void);
-
-extern EntityData gUnk_080FF17C[];
-
-extern void (*const gUnk_080FF1F4[])(void);
-
-extern const s16 gUnk_080FF1D4[];
-
-extern const u16 gUnk_080FF204[];
-
-extern void (*const gUnk_080FF228[])(void);
-
-extern void (*const gUnk_080FF238[])(void);
-
-extern void (*const gUnk_080FF254[])(void);
-
-extern void (*const gUnk_080FF284[])(void);
-
-extern const EntityData gUnk_080FF264[];
-
-extern void (*const gUnk_080FF28C[])(void);
-
-extern void sub_08054A14(u32);
-
-extern const EntityData gUnk_080FEE48[];
-
-extern void (*const gUnk_080FF2B8[])(void);
-
-extern const EntityData gUnk_080FF298[];
-
-extern void (*const gUnk_080FF300[])(void);
-
-extern const EntityData gUnk_080FF2C0[];
-
-extern void (*const gUnk_080FF328[])(void);
-
-extern const EntityData gUnk_080FF308[];
-
-extern void (*const gUnk_080FF330[])(void);
-
-void sub_08055994(void);
-
-extern void (*const gUnk_080FF35C[])(void);
-
-extern const EntityData gUnk_080FF33C[];
-
-extern void (*const gUnk_080FF36C[])(void);
-
-extern const EntityData gUnk_080FED18[];
-
-extern const EntityData gUnk_080FF378[];
-
-extern void (*const gUnk_080FF3F4[])(void);
-
-void sub_08054C04(void) {
- gUnk_080FEEB8[gMenu.overlayType]();
-}
-
-void sub_08054C20(void) {
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- sub_0801876C(gMenu.field_0x4, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08054C58(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- gMenu.overlayType++;
- }
-}
-
-void sub_08054C88(void) {
- if (gFadeControl.active == 0) {
- sub_08054974(gMenu.field_0x4, 0);
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- SoundReq(SFX_SECRET_BIG);
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
-}
-
-void sub_08054CC0(void) {
- if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) {
- gMenu.menuType++;
- }
-}
-
-void sub_08054CE8(void) {
- gUnk_080FEEC8[gMenu.overlayType]();
-}
-
-void sub_08054D04(void) {
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08054D3C(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- sub_0801876C(gMenu.field_0x4, 1);
- sub_080553E0(gMenu.field_0x4);
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
-}
-
-void sub_08054D74(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_08054D90(void) {
- gUnk_080FEF34[gMenu.overlayType]();
-}
-
-void sub_08054DAC(void) {
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- LoadRoomEntityList(gUnk_080FEED4);
- sub_0805B4D0(2);
- sub_0806D0B0(NULL);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_484(void) {
-}
-
-void sub_08054E00(void) {
- gUnk_080FEF3C[gMenu.overlayType]();
-}
-
-void sub_08054E1C(void) {
- u8* ptr = gMenu.field_0xc;
- sub_0804B0B0(ptr[2], ptr[3]);
- sub_0804B0E8(ptr[2], ptr[3]);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08054E5C(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- gMenu.overlayType++;
- gMenu.transitionTimer = 180;
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- sub_080553E0(gMenu.field_0x4);
- sub_0801876C(gMenu.field_0x4, 1);
- }
-}
-
-void sub_08054E9C(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_08054EB8(Entity* this, ScriptExecutionContext* context) {
- BombableWallManager* manager = (BombableWallManager*)GetEmptyManager();
- if (manager != NULL) {
- manager->base.kind = MANAGER;
- manager->base.id = BOMBABLE_WALL_MANAGER;
- manager->x = this->x.HALF.HI - gRoomControls.origin_x;
- manager->y = (this->y.HALF.HI - gRoomControls.origin_y) - 0x10;
- manager->field_0x35 = 1;
-#if defined(EU) || defined(JP) || defined(DEMO_JP)
- manager->field_0x3e = 0x77;
-#else
- manager->field_0x3e = 0x79;
-#endif
- AppendEntityToList((Entity*)manager, 6);
- }
-}
-
-void sub_08054EFC(Entity* this) {
- Entity* effect;
- u32 tmp = COORD_TO_TILE(this) - 0x40;
- SetTile(0x4074, tmp, 1);
- this->collisionLayer = 2;
- UpdateSpriteForCollisionLayer(this);
- effect = CreateFx(this, FX_BIG_EXPLOSION, 0);
- if (effect != NULL) {
- effect->y.HALF.HI -= 0x10;
- SortEntityBelow(this, effect);
- }
- SoundReq(SFX_ITEM_BOMB_EXPLODE);
-}
-
-void sub_08054F64(Entity* this, ScriptExecutionContext* context) {
- u32 tmp = this->type2;
- if ((gActiveScriptInfo.syncFlags & tmp) != tmp) {
- gActiveScriptInfo.commandSize = 0;
- } else {
- gActiveScriptInfo.syncFlags &= ~tmp;
- gActiveScriptInfo.flags |= 1;
- }
-}
-
-void sub_08054F90(void) {
- gUnk_080FF120[gMenu.overlayType]();
-}
-
-void sub_08054FAC(void) {
- u8* ptr;
- u32 tmp;
-
- ptr = gMenu.field_0xc;
- LoadRoomEntityList(gUnk_080FF108[ptr[1]]);
- if (ptr[1] != 0) {
- tmp = 3;
- } else {
- tmp = 0;
- }
- sub_08055B70(gMenu.field_0x4, tmp, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
- gMenu.field_0xa = 0;
- if (CheckLocalFlagByBank(FLAG_BANK_4, 0x77) && (ptr[2] == 0x2f)) {
- gMenu.field_0xa = 1;
+ for (uVar3 = 0, pcVar2 = gUnk_08128F38, uVar4 = 0; *pcVar2 != 0; uVar3++, pcVar2 += 2) {
+ uVar4 |= sub_0807CB24(*pcVar2, pcVar2[1]) << uVar3;
}
+ return ~uVar4;
}
-void sub_08055014(void) {
- if (gMenu.field_0xa != 0) {
- gMenu.field_0xa = 0;
- SetTileType(0x74, 0x407, 1);
- }
-}
-
-void sub_08055038(void) {
- gUnk_080FF148[gMenu.overlayType]();
-}
-
-void sub_08055054(void) {
- LoadRoomEntityList(gUnk_080FF128);
- sub_08055B70(gMenu.field_0x4, 2, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_0805508C(void) {
-}
-
-void sub_08055090(void) {
-}
-
-void sub_08055094(void) {
- gUnk_080FF174[gMenu.overlayType]();
-}
-
-void sub_080550B0(void) {
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- LoadRoomEntityList(gUnk_080FF154);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_487(void) {
-}
-
-void sub_080550F8(void) {
- gUnk_080FF1CC[gMenu.overlayType]();
-}
-
-void sub_08055114(void) {
- LoadRoomEntityList(gUnk_080FF17C);
- if (gSave.global_progress != 9) {
- sub_08018C58(0xdb4);
- }
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_488(void) {
-}
-
-void sub_08055168(void) {
- gUnk_080FF1F4[gMenu.overlayType]();
-}
-
-void sub_08055184(void) {
- const s16* ptr = &gUnk_080FF1D4[(gMenu.field_0xc[1] & 0xf) * 3];
- LoadGfxGroup(ptr[0]);
- gScreen.bg3.xOffset = ptr[1];
- gScreen.bg3.yOffset = ptr[2];
- gScreen.bg3.control = 0x1e05;
- gScreen.controls.layerFXControl = 0x3648;
- gScreen.controls.alphaBlend = 0x10;
- gScreen.lcd.displayControl |= 0x800;
- sub_0801876C(gMenu.field_0x4, 1);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gMenu.storyPanelIndex = 0;
- gMenu.transitionTimer = 60;
- gMenu.field_0xa = 0;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055224(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- gMenu.overlayType++;
- }
-}
-
-void sub_0805524C(void) {
- if (gMenu.storyPanelIndex == 0) {
- gMenu.transitionTimer--;
- if (gMenu.transitionTimer == 0) {
- u32 tmp = gMenu.storyPanelIndex;
- gMenu.storyPanelIndex = tmp + 1;
- SoundReq(SFX_EVAPORATE);
+void sub_080A6F6C(u32 textIndexOrPtr) {
+ extern Font gUnk_08128FA8;
+ if (gGenericMenu.unk2e.HWORD != textIndexOrPtr) {
+ gGenericMenu.unk2e.HWORD = textIndexOrPtr;
+ MemClear(gUnk_020350F0, 0x100);
+ if ((textIndexOrPtr & 0xff) != 0) {
+ ShowTextBox(textIndexOrPtr, &gUnk_08128FA8);
}
- } else if ((gRoomTransition.frameCount & 7U) == 0) {
- if (gUnk_080FF204[gMenu.field_0xa] != 0xffff) {
- gScreen.controls.alphaBlend = gUnk_080FF204[gMenu.field_0xa++];
- } else {
- gScreen.lcd.displayControl &= 0xf7ff;
- gScreen.controls.alphaBlend = 0x1000;
- gMenu.transitionTimer = 120;
- gMenu.overlayType++;
-#ifndef EU
- SoundReq(SFX_SECRET_BIG);
-#endif
+ gScreen.bg0.updated = 1;
+ }
+ gScreen.bg0.yOffset = 2;
+}
+
+void sub_080A6FB4(u32 param_1, u32 param_2) {
+ extern u16 gUnk_08128FF0[];
+ extern Font gUnk_08128FD8;
+ extern Font gUnk_08128FC0;
+ u32 textIndexOrPtr;
+ Font* font;
+
+ textIndexOrPtr = 0;
+ switch (param_2) {
+ case 0:
+ if ((gSave.windcrests & (1 << param_1)) == 0)
+ break;
+ case 2:
+ textIndexOrPtr = gUnk_08127F94[param_1]._6;
+ font = &gUnk_08128FC0;
+ break;
+ case 1:
+ textIndexOrPtr = gUnk_08128FF0[param_1];
+ font = &gUnk_08128FD8;
+ break;
+ }
+
+ if (gGenericMenu.unk2e.HWORD != textIndexOrPtr) {
+ gGenericMenu.unk2e.HWORD = textIndexOrPtr;
+ MemClear(&gUnk_020350F0, 0x100);
+ if ((textIndexOrPtr & 0xff) != 0) {
+ ShowTextBox(textIndexOrPtr, font);
}
+ gScreen.bg0.updated = 1;
}
+ gScreen.bg0.yOffset = 2;
}
-void sub_080552E0(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_080552FC(void) {
- gUnk_080FF228[gMenu.overlayType]();
-}
-
-void sub_08055318(void) {
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- sub_0801876C(gMenu.field_0x4, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055350(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- gMenu.overlayType++;
- }
-}
-
-void sub_08055380(void) {
- if (gFadeControl.active == 0) {
- sub_08054974(gMenu.field_0x4, 0);
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- SoundReq(SFX_SECRET_BIG);
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
-}
-
-void sub_080553B8(void) {
- if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) {
- gMenu.menuType++;
- }
-}
-
-void sub_080553E0(u32 param_1) {
- u8* ptr = gMenu.field_0xc;
- Entity* effect = CreateObject(SPECIAL_FX, FX_BIG_EXPLOSION2, 0);
- if (effect != NULL) {
- effect->x.HALF.HI = *(s16*)(ptr + 8) + gRoomControls.origin_x;
- effect->y.HALF.HI = *(s16*)(ptr + 10) + gRoomControls.origin_y;
- }
-}
-
-void sub_08055414(void) {
- gUnk_080FF238[gMenu.overlayType]();
-}
-
-void sub_08055430(void) {
- sub_0804B0E8(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055468(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- gMenu.overlayType++;
- }
-}
-
-void sub_08055498(void) {
- if (gFadeControl.active == 0) {
- sub_0801876C(gMenu.field_0x4, 1);
- sub_080553E0(gMenu.field_0x4);
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- SoundReq(SFX_SECRET_BIG);
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
-}
-
-void sub_080554D4(void) {
- if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_080554FC(void) {
- extern void (*const gUnk_080FF248[])(void);
- gUnk_080FF248[gMenu.overlayType]();
-}
-
-void sub_08055518(void) {
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055548(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- sub_0801876C(gMenu.field_0x4, 1);
- sub_080553E0(gMenu.field_0x4);
- gMenu.overlayType++;
- gMenu.transitionTimer = 180;
- }
-}
-
-void sub_08055580(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_0805559C(void) {
- gUnk_080FF254[gMenu.overlayType]();
-}
-
-void sub_080555B8(void) {
- u8* ptr = gMenu.field_0xc;
- SetLocalFlagByBank(gLocalFlagBanks[gMenu.field_0xc[0x11]], (u32) * (u16*)(gMenu.field_0xc + 0x12));
- sub_0804B0E8(ptr[2], ptr[3]);
- LoadGfxGroup(0x11);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_0805560C(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- gMenu.overlayType++;
- }
-}
-
-void sub_08055634(void) {
- u8* ptr = gMenu.field_0xc;
- Entity* obj = CreateObject(BEANSTALK, 0, 0);
- if (obj != NULL) {
- obj->x.HALF.HI = gRoomControls.origin_x + *(s16*)(ptr + 8);
- obj->y.HALF.HI = gRoomControls.origin_y + *(s16*)(ptr + 10);
- }
- gMenu.overlayType++;
- gMenu.transitionTimer = 390;
-}
-
-void sub_08055674(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_08055690(void) {
- gUnk_080FF284[gMenu.overlayType]();
-}
-
-void sub_080556AC(void) {
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- LoadRoomEntityList((EntityData*)gUnk_080FF264);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_489(void) {
-}
-
-void sub_080556F4(void) {
- gUnk_080FF28C[gMenu.overlayType]();
-}
-
-void sub_08055710(void) {
- Entity* entity;
-
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- entity = LoadRoomEntity((EntityData*)gUnk_080FEE48);
- if (entity != NULL) {
- entity->type2 = 2;
- entity->field_0x86.HWORD = 0x80ff;
- }
- sub_08054A14(gMenu.field_0x4);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_0805576C(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
-}
-
-void sub_08055798(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_080557B4(void) {
- gUnk_080FF2B8[gMenu.overlayType]();
-}
-
-void sub_080557D0(void) {
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- sub_0804B0B0((u32)gMenu.field_0xc[2], gMenu.field_0xc[3]);
- LoadRoomEntityList((EntityData*)gUnk_080FF298);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_490(void) {
-}
-
-void sub_08055818(void) {
- gUnk_080FF300[gMenu.overlayType]();
-}
-
-void sub_08055834(void) {
- LoadRoomEntityList((EntityData*)gUnk_080FF2C0);
- if (gSave.global_progress != 9) {
- sub_08018C58(0xdb4);
- }
- sub_08055B70(gMenu.field_0x4, 1, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_491(void) {
-}
-
-void sub_08055888(void) {
- gUnk_080FF328[gMenu.overlayType]();
-}
-
-void sub_080558A4(void) {
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- LoadRoomEntityList((EntityData*)gUnk_080FF308);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void nullsub_492(void) {
-}
-
-void sub_080558EC(void) {
- gUnk_080FF330[gMenu.overlayType]();
-}
-
-void sub_08055908(void) {
- u8* ptr = gMenu.field_0xc;
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- sub_0804B0E8(ptr[2], ptr[3]);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
+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].item) != 0) {
+ ShowTextBox(gUnk_08128D70[param_1].textIndex, &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;
+ gMenu.overlayType = 0;
+ gMenu.storyPanelIndex = 0;
}
-void sub_08055948(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- sub_08055994();
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
+void ResetUI(void) {
+ MemClear(&gUI, sizeof(gUI));
}
-void sub_08055978(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_08055994(void) {
- u32 layer;
- TileEntity* ptr = &gUnk_080FEAC8[gMenu.field_0x4];
- if ((ptr->_6 & 1) != 0) {
- layer = 2;
+void MenuFadeIn(u32 param_1, u32 param_2) {
+ if (gUI.nextToLoad == 0) {
+ MemClear(&gUI, sizeof(gUI));
+ gUI.lastState = param_1;
+ gUI.field_0x3 = param_2;
+ gUI.pauseFadeIn = gMain.substate;
} else {
- layer = 1;
- }
- SetTileType(0x73, (*(u16*)(gMenu.field_0xc + 8) >> 4 & 0x3f) | (*(u16*)(gMenu.field_0xc + 10) >> 4 & 0x3f) << 6,
- layer);
- sub_080553E0((u32)gMenu.field_0x4);
- SoundReq(SFX_SECRET_BIG);
-}
-
-void sub_080559E0(void) {
- gUnk_080FF35C[gMenu.overlayType]();
-}
-
-void sub_080559FC(void) {
- if (gMenu.field_0xc[1] != 0) {
- LoadRoomEntityList((EntityData*)gUnk_080FF33C);
- }
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055A3C(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- gMenu.overlayType++;
- }
-}
-
-void sub_08055A6C(void) {
- if (gFadeControl.active == 0) {
- sub_0801876C(gMenu.field_0x4, 1);
- sub_080553E0(gMenu.field_0x4);
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- SoundReq(SFX_SECRET_BIG);
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
+ gUI.state = param_1;
+ gUI.field_0x5 = param_2;
+ gUI.nextToLoad = 1; // Subtask_Init
+ }
+ gUI.field_0x6 = 0;
+ gUI.fadeType = -1;
+ gUI.fadeInTime = 0x20;
+ gMain.substate = GAMEMAIN_SUBTASK;
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20);
+ gUnk_02018EB0.unk_0 = 0;
+ gUnk_02018EB0.unk_1 = 0;
+}
+
+void sub_080A71A4(u32 param_1, u32 param_2, u32 param_3) {
+ if (gUI.nextToLoad == 0) {
+ gUI.unk_e = param_3;
+ } else {
+ gUI.unk_f = param_3;
}
+ MenuFadeIn(param_1, param_2);
}
-void sub_08055AA8(void) {
- if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
+void sub_080A71C4(u32 param_1, u32 param_2, u32 fadeType, u32 param_4) {
+ MenuFadeIn(param_1, param_2);
+ gUI.fadeType = fadeType;
+ gUI.fadeInTime = param_4;
}
-void sub_08055AD0(void) {
- gUnk_080FF36C[gMenu.overlayType]();
+void Subtask_Exit(void) {
+ gUI.nextToLoad = 3; // Subtask_FadeOut
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20);
}
-void sub_08055AEC(void) {
- Entity* entity;
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- entity = LoadRoomEntity((EntityData*)&gUnk_080FED18[gMenu.field_0xc[1]]);
- if (entity != NULL) {
- entity->type2 = 1;
+// Used by Subtask_FastTravel and EnterPortalSubtask?
+void sub_080A71F4(const ScreenTransitionData* exitTransition) {
+ if (exitTransition != NULL) {
+ DoExitTransition(exitTransition);
}
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
+ DeleteAllEntities();
+ sub_0805E974();
+ DeleteAllEntities();
+ gMain.state = GAMETASK_INIT;
+ gMain.substate = GAMEMAIN_INITROOM;
}
-void sub_08055B38(void) {
- if (gFadeControl.active == 0) {
- gMenu.transitionTimer = 120;
- }
-}
-
-void sub_08055B54(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_08055B70(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
- u8* ptr = gMenu.field_0xc;
- Entity* entity = LoadRoomEntity((EntityData*)&gUnk_080FF378[param_2]);
- if (entity != NULL) {
- entity->x.HALF.HI = *(s16*)(ptr + 8) + param_3 + gRoomControls.origin_x;
- entity->y.HALF.HI = *(s16*)(ptr + 10) + param_4 + gRoomControls.origin_y;
+void GameMain_Subtask(void) {
+ if (gUI.nextToLoad < 3) {
+ if (gUI.state != 0) {
+ gUI.field_0x3 = gUI.field_0x5;
+ gUI.lastState = gUI.state;
+ gUI.state = 0;
+ }
}
+ gUnk_0812901C[gUI.nextToLoad]();
}
-void sub_08055BB0(void) {
- extern void (*const gUnk_080FF3C8[])(void);
- gUnk_080FF3C8[gMenu.overlayType]();
-}
-
-void sub_08055BCC(void) {
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- sub_0801876C(gMenu.field_0x4, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055C04(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- gMenu.overlayType++;
+void Subtask_FadeIn(void) {
+ if (!gFadeControl.active) {
+ MemCopy(&gScreen, &gUnk_03001020, sizeof(Screen));
+ MemCopy(gPaletteBuffer, gPaletteBufferBackup, 0x400);
+ MemCopy(&gGFXSlots, &gUI.gfxSlotList, sizeof(GfxSlotList));
+ MemCopy(gPaletteList, gUI.palettes, sizeof(gUI.palettes));
+ MemCopy(&gRoomControls, &gUI.roomControls, sizeof(RoomControls));
+ MemCopy(gUnk_03000420, gUI.unk_2a8, sizeof(gUI.unk_2a8));
+ MemCopy(&gActiveScriptInfo, &gUI.activeScriptInfo, sizeof(ActiveScriptInfo));
+ sub_0805E958();
+ gUI.unk_d = gRoomTransition.field_0x2c[2];
+ gUI.controlMode = gPlayerState.controlMode;
+ gUI.currentRoomProperties = gCurrentRoomProperties;
+ gUI.mapBottomBgSettings = gMapBottom.bgSettings;
+ gUI.mapTopBgSettings = gMapTop.bgSettings;
+ gUI.nextToLoad = 1; // Subtask_Init
}
}
-void sub_08055C34(void) {
- u8* ptr;
- Entity* entity;
+void Subtask_Init(void) {
if (gFadeControl.active == 0) {
- ptr = gMenu.field_0xc;
- sub_080553E0((u32)gMenu.field_0x4);
- if ((ptr[1] & 0x80) != 0) {
- sub_08054974(gMenu.field_0x4, 0);
+ DeleteAllEntities();
+ MemClear(&gMenu, sizeof(FigurineMenu));
+ MemClear(&gRoomControls, sizeof(gRoomControls));
+ MemClear(gOAMControls.unk, 0x100);
+ MemClear(&gActiveScriptInfo, sizeof(gActiveScriptInfo));
+ gActiveScriptInfo.fadeSpeed = 8;
+ DispReset(1);
+ MessageInitialize();
+ ResetPalettes();
+ ResetPaletteTable(0);
+ gGFXSlots.unk0 = 1;
+ gUI.nextToLoad = 2; // Subtask_Update
+ gRoomTransition.field_0x2c[3] = 1;
+ }
+}
+
+void Subtask_FadeOut(void) {
+ if (!gFadeControl.active) {
+ DeleteAllEntities();
+ sub_0805E974();
+ gCurrentRoomProperties = gUI.currentRoomProperties;
+ gPlayerState.controlMode = gUI.controlMode;
+ gMapBottom.bgSettings = gUI.mapBottomBgSettings;
+ gMapTop.bgSettings = gUI.mapTopBgSettings;
+ MemCopy(&gUI.activeScriptInfo, &gActiveScriptInfo, sizeof(ActiveScriptInfo));
+ MemCopy(gUI.unk_2a8, gUnk_03000420, sizeof(gUI.unk_2a8));
+ MemCopy(gUI.palettes, gPaletteList, sizeof(gUI.palettes));
+ MemCopy(&gUI.gfxSlotList, &gGFXSlots, sizeof(gGFXSlots));
+ MemCopy(&gUI.roomControls, &gRoomControls, sizeof(RoomControls));
+ MemCopy(&gUnk_03001020, &gScreen, sizeof(Screen));
+ gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
+ gArea.pCurrentRoomInfo = GetCurrentRoomInfo();
+ RestoreGameTask(gUI.field_0x6);
+ sub_0801D000(gUI.unk_d != 0);
+ sub_080A74F4();
+ if (gUI.fadeType != 0xffff) {
+ SetFade(gUI.fadeType, gUI.fadeInTime);
} else {
- entity = FindEntity(OBJECT, TREE_THORNS, 6, 0, ptr[1] & 0x80);
- if (entity != NULL) {
- DeleteEntity(entity->child);
- DeleteEntity(entity);
- }
+ SetFadeInverted(gUI.fadeInTime);
}
- SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
- SoundReq(SFX_SECRET_BIG);
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
+ gUI.nextToLoad = 4; // Subtask_Die
+ gRoomTransition.field_0x2c[3] = 0;
}
}
-void sub_08055CB0(void) {
- if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
-}
-
-void sub_08055CD8(void) {
- extern void (*const gUnk_080FF3E8[])(void);
- gUnk_080FF3E8[gMenu.overlayType]();
-}
-
-void sub_08055CF4(void) {
- sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
- sub_08055B70(gMenu.field_0x4, 0, 0, 0);
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055D2C(void) {
- if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
- sub_0801876C(gMenu.field_0x4, 1);
- sub_080553E0(gMenu.field_0x4);
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
-}
-
-void sub_08055D64(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
+void Subtask_Die(void) {
+ sub_080A74F4();
+ if (gFadeControl.active == 0) {
+ gMain.substate = gUI.pauseFadeIn;
+ gUI.nextToLoad = gFadeControl.active;
+ gUI.lastState = gFadeControl.active;
+ ResetSystemPriority();
}
}
-void sub_08055D80(void) {
- gUnk_080FF3F4[gMenu.overlayType]();
-}
-
-void sub_08055D9C(void) {
- gMenu.overlayType++;
- gUpdateVisibleTiles = 1;
- SetFade(FADE_INSTANT, 0x10);
-}
-
-void sub_08055DC0(void) {
- if (gFadeControl.active == 0) {
- MessageFromTarget(TEXT_INDEX(TEXT_EMPTY, 0x01));
- gMenu.overlayType++;
- gMenu.transitionTimer = 120;
- }
+void sub_080A74F4(void) {
+ SetInitializationPriority();
+ gMain.pad = 0;
+ FlushSprites();
+ UpdateEntities();
+ UpdateManagers();
+ DrawUI();
+ DrawUIElements();
+ UpdateCarriedObject();
+ DrawEntities();
+ CopyOAM();
}
-void sub_08055DEC(void) {
- if (--gMenu.transitionTimer == 0) {
- gMenu.menuType++;
- }
+void Subtask_Update(void) {
+ gSubtasks[gUI.lastState]();
}
diff --git a/src/subtask/subtaskAuxCutscene.c b/src/subtask/subtaskAuxCutscene.c
new file mode 100644
index 00000000..f916ae62
--- /dev/null
+++ b/src/subtask/subtaskAuxCutscene.c
@@ -0,0 +1,157 @@
+/**
+ * @file subtaskAuxCutscene.c
+ *
+ * @brief Aux Cutscene Subtask
+ */
+#include "area.h"
+#include "asm.h"
+#include "common.h"
+#include "fileselect.h"
+#include "flags.h"
+#include "functions.h"
+#include "game.h"
+#include "main.h"
+#include "menu.h"
+#include "message.h"
+#include "room.h"
+#include "screen.h"
+#include "sound.h"
+#include "subtask.h"
+
+typedef void(AuxCutsceneState)(void);
+typedef void(CutsceneMainState)(void);
+
+static AuxCutsceneState AuxCutscene_Init;
+static AuxCutsceneState AuxCutscene_Main;
+static AuxCutsceneState AuxCutscene_Exit;
+
+CutsceneMainState CutsceneMain_Init;
+CutsceneMainState CutsceneMain_Update;
+CutsceneMainState CutsceneMain_Exit;
+
+typedef struct {
+ u8 area;
+ RoomID room : 8;
+ u8 _2;
+ u8 _3;
+ u16 x;
+ u16 y;
+} CutsceneData;
+static const CutsceneData sCutsceneData[];
+
+void Subtask_AuxCutscene(void) {
+ static AuxCutsceneState* const sStates[] = {
+ AuxCutscene_Init,
+ AuxCutscene_Main,
+ AuxCutscene_Exit,
+ };
+
+ sStates[gMenu.menuType]();
+}
+
+static void AuxCutscene_Init(void) {
+ const CutsceneData* p = &sCutsceneData[gUI.field_0x3];
+ gRoomControls.area = p->area;
+ gRoomControls.room = p->room;
+ LoadGfxGroups();
+ gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
+ SetCurrentRoomPropertyList(p->area, p->room);
+ LoadAuxiliaryRoom(p->area, p->room);
+ gRoomControls.scroll_x = gRoomControls.origin_x + p->x;
+ gRoomControls.scroll_y = gRoomControls.origin_y + p->y;
+ gMenu.field_0x0 = p->_2;
+ gMenu.field_0x3 = p->_3 & 0xf;
+ gMenu.field_0xc = (void*)p;
+ gMenu.menuType++;
+ gMenu.overlayType = 0;
+ gMenu.transitionTimer = 300;
+ AuxCutscene_Main(); // init
+}
+
+static void AuxCutscene_Main(void) {
+ static CutsceneMainState* const sStates[] = {
+ CutsceneMain_Init,
+ CutsceneMain_Update,
+ CutsceneMain_Exit,
+ };
+
+ sStates[gMenu.field_0x0]();
+ FlushSprites();
+ UpdateEntities();
+ DrawEntities();
+ CopyOAM();
+ UpdateScroll();
+ UpdateBgAnimations();
+ UpdateManagers();
+ UpdateScrollVram();
+}
+
+static const CutsceneData sCutsceneData[] = {
+ { AREA_MINISH_WOODS, 0, 0, 0, 336, 528 },
+ { AREA_HYRULE_FIELD, 1, 1, 0, 472, 312 },
+ { AREA_HYRULE_CASTLE, 2, 1, 1, 16, 16 },
+ { AREA_SANCTUARY, 2, 1, 2, 0, 0 },
+ { AREA_EZLO_CUTSCENE, 0, 1, 3, 0, 0 },
+ { AREA_HOUSE_INTERIORS_2, 16, 1, 4, 0, 0 },
+ { AREA_DARK_HYRULE_CASTLE_OUTSIDE, 0, 1, 5, 0, 40 },
+ { AREA_FORTRESS_OF_WINDS, 28, 2, 0, 0, 0 },
+ { AREA_FORTRESS_OF_WINDS, 29, 2, 1, 0, 0 },
+ { AREA_DARK_HYRULE_CASTLE, 14, 2, 2, 16, 16 },
+};
+
+static void AuxCutscene_Exit(void) {
+ u32 flag = sCutsceneData[gUI.field_0x3]._3;
+ if (flag & 0xF0) {
+ MenuFadeIn(2, flag >> 4);
+ } else {
+ gUI.nextToLoad = 3; // Subtask_FadeOut
+ SetFadeInverted(0x10);
+ MessageInitialize();
+ }
+}
+
+// end of auxCutscene?
+
+void sub_08051F78(void) {
+ u32 idx = gUI.field_0x3;
+ const CutsceneData* p = &sCutsceneData[idx];
+ sub_08051F9C(p->area, p->room, p->x, p->y);
+}
+
+void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4) {
+ u32 tmp = gScreen.lcd.displayControl & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
+ sub_08052FF4(a1, a2);
+ gRoomControls.scroll_x = gRoomControls.origin_x + a3;
+ gRoomControls.scroll_y = gRoomControls.origin_y + a4;
+ InitializeCamera();
+ gUpdateVisibleTiles = 1;
+ gUsedPalettes = 0;
+ gScreen.lcd.displayControl |= tmp;
+}
+
+void sub_08051FF0(void) {
+ sub_0804B0B0(gMenu.field_0xc[0], gMenu.field_0xc[1]);
+}
+
+void sub_08052004(void) {
+ gMenu.menuType = 2;
+}
+
+void sub_08052010(void) {
+ InitSoundPlayingInfo();
+ MessageInitialize();
+ DispReset(1);
+ MemClear(gBG1Buffer, sizeof(gBG1Buffer));
+ MemClear(gBG2Buffer, sizeof(gBG2Buffer));
+ sub_080A4D34();
+ LoadPaletteGroup(0xA);
+ SetColor(0, 0);
+ LoadGfxGroup(4);
+ MemClear((void*)0x06000000, 0x20);
+ MemClear(&gGenericMenu, sizeof(gGenericMenu));
+ gScreen.lcd.displayControl |= DISPCNT_OBJ_ON;
+ gScreen.bg1.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_CHARBASE(0);
+ gScreen.bg2.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(29) | BGCNT_CHARBASE(1);
+ gScreen.bg1.updated = 1;
+ gScreen.bg2.updated = 1;
+}
diff --git a/src/subtask/subtaskFastTravel.c b/src/subtask/subtaskFastTravel.c
new file mode 100644
index 00000000..0f657cb7
--- /dev/null
+++ b/src/subtask/subtaskFastTravel.c
@@ -0,0 +1,191 @@
+/**
+ * @file subtaskFastTravel.c
+ * @ingroup Subtasks
+ *
+ * @brief Fast Travel Subtask
+ */
+#include "subtask.h"
+#include "common.h"
+#include "menu.h"
+#include "functions.h"
+#include "message.h"
+#include "sound.h"
+#include "save.h"
+
+extern void (*const Subtask_FastTravel_Functions[])(void);
+void sub_080A6E70(void);
+u32 sub_080A6D74(u32);
+void sub_080A6EE0(u32 param_1);
+
+extern const ScreenTransitionData gUnk_08128024[];
+
+void Subtask_FastTravel(void) {
+ FlushSprites();
+ Subtask_FastTravel_Functions[gMenu.menuType]();
+ if (gMenu.field_0x0 != 0) {
+ sub_080A6E70();
+ }
+ sub_080A6498();
+ CopyOAM();
+}
+
+void Subtask_FastTravel_0(void) {
+ sub_080A4D34();
+ sub_080A4DB8(0xd);
+ sub_080A6290();
+ gMenu.field_0x3 = sub_080A6D74(0);
+ SetMenuType(1);
+ SetFade(FADE_INSTANT, 8);
+}
+
+void Subtask_FastTravel_1(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(TEXT_INDEX(TEXT_WINDCRESTS, 0x04));
+ 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;
+ u32 uVar2;
+ u32 uVar3;
+
+ uVar3 = gSave.windcrests >> 0x18;
+ uVar2 = gMenu.field_0x3;
+ if (param_1 == 0) {
+ uVar2 = 0;
+ if ((uVar3 & 1) == 0) {
+ while (++uVar2 < 8 && ((1 << uVar2) & uVar3) == 0) {}
+ }
+ } else if (uVar3 != 0) {
+ do {
+ uVar2 = (uVar2 + param_1 + 8) & 7;
+ } while ((1 << uVar2 & uVar3) == 0);
+ }
+ return uVar2 & 7;
+}
+
+void Subtask_FastTravel_2(void) {
+ u32 tmp;
+ switch (sub_08056338()) {
+#ifdef EU
+ case 0:
+ gMenu.field_0x0 = 2;
+ break;
+ case 1:
+ gMenu.field_0x0 = 3;
+ tmp = 1;
+ break;
+ default:
+ return;
+ }
+
+ if (tmp) {
+ SetMenuType(3);
+ }
+#else
+ case 0:
+ gMenu.field_0x0 = 2;
+ tmp = 3;
+ break;
+ case 1:
+ tmp = 1;
+ break;
+ default:
+ return;
+ }
+ SetMenuType(tmp);
+#endif
+}
+
+void Subtask_FastTravel_3(void) {
+ if (gMenu.field_0x0 == 2) {
+ SetMenuType(4);
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
+ } else {
+ ResetPlayerAnimationAndAction();
+ sub_080042D0(&gPlayerEntity, (u32)gPlayerEntity.animIndex, gPlayerEntity.spriteIndex);
+ Subtask_Exit();
+ gPauseMenuOptions.disabled = 0;
+ SoundReq(SFX_MENU_CANCEL);
+ }
+}
+
+void Subtask_FastTravel_4(void) {
+ if (gFadeControl.active == 0) {
+ sub_080A71F4(&gUnk_08128024[gMenu.field_0x3]);
+ }
+}
+
+void sub_080A6E70(void) {
+ u32 frameIndex;
+ u32 i;
+
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0x400;
+ gGenericMenu.unk2c++;
+ sub_080A6EE0(gMenu.field_0x3);
+ if ((gGenericMenu.unk2c & 0x10) != 0) {
+ frameIndex = 0x5d;
+ } else {
+ frameIndex = 0x5e;
+ }
+
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex);
+ for (i = 0; i < 8; i++) {
+ if ((gSave.windcrests & (1 << (i + 0x18))) != 0) {
+ sub_080A6EE0(i);
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x5c);
+ }
+ }
+}
+
+void sub_080A6EE0(u32 param_1) {
+ u32 x;
+ u32 y;
+ RoomHeader* roomHeader;
+ const ScreenTransitionData* ptr = &gUnk_08128024[param_1];
+
+ x = (u16)ptr->playerXPos;
+ y = (u16)ptr->playerYPos;
+ roomHeader = &gAreaRoomHeaders[ptr->area][ptr->room];
+ x += roomHeader->map_x;
+ y += roomHeader->map_y;
+ gOamCmd.x = (s32)(x * DISPLAY_HEIGHT) / 0xf90 + 0x28;
+ gOamCmd.y = (s32)(y * DISPLAY_HEIGHT) / 0xf90 + 0xc;
+}
diff --git a/src/subtask/subtaskLocalMapHint.c b/src/subtask/subtaskLocalMapHint.c
new file mode 100644
index 00000000..8f9bb133
--- /dev/null
+++ b/src/subtask/subtaskLocalMapHint.c
@@ -0,0 +1,96 @@
+/**
+ * @file subtaskLocalMapHint.c
+ * @ingroup Subtasks
+ *
+ * @brief Local Map Hint Subtask
+ */
+#include "menu.h"
+#include "subtask.h"
+#include "kinstone.h"
+#include "functions.h"
+#include "screen.h"
+#include "sound.h"
+#include "common.h"
+
+void Subtask_LocalMapHint() {
+ extern void (*const gUnk_08128F1C[])(void);
+ const struct_gUnk_08128E94* ptr;
+ FlushSprites();
+ gUnk_08128F1C[gMenu.menuType]();
+ ptr = &gUnk_08128E94[gMenu.field_0x3];
+ gScreen.bg1.yOffset = -ptr->unk5;
+ gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6;
+ CopyOAM();
+}
+
+void sub_080A6B04(void) {
+ u32 bVar1;
+ u32 uVar2;
+ u32 uVar3;
+ u32 uVar4;
+ int uVar6;
+ u32 uVar7;
+ const KinstoneWorldEvent* ptr;
+ const WorldEvent* ptr2;
+ const struct_gUnk_08128E94* ptr3;
+
+ sub_080A4D34();
+ sub_080A4DB8(6);
+ ptr = &gKinstoneWorldEvents[gFuseInfo.kinstoneId];
+ ptr2 = &gWorldEvents[ptr->worldEventId];
+ bVar1 = ptr->unk7;
+ uVar3 = ptr2->_c;
+ uVar4 = ptr2->_e;
+ uVar2 = sub_080A6A80(uVar3, uVar4)->_4;
+ gMenu.field_0x3 = uVar2;
+ gGenericMenu.unk2b = 1;
+ sub_080A67C4(uVar2);
+ sub_080A6FB4(uVar2, 2);
+ SetColor(0, 0x475f);
+ SetColor(0x5f, 0x475f);
+ MemFill16(0x5001, &gBG3Buffer, sizeof(gBG3Buffer));
+ if ((gPlayerState.flags & PL_NO_CAP) != 0) {
+ uVar7 = 101;
+ } else {
+ uVar7 = 100;
+ }
+ sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y,
+ DRAW_DIRECT_SPRITE_INDEX, uVar7 + 0x100);
+ sub_080A698C(uVar3, uVar4, DRAW_DIRECT_SPRITE_INDEX, bVar1 + 100);
+ uVar4 = sub_080A69E0(uVar3, uVar4) >> 0x10;
+ ptr3 = &gUnk_08128E94[gMenu.field_0x3];
+ gMenu.field_0xa = 0;
+ if (ptr3->unk2 != 0) {
+ uVar6 = uVar4 - 0x3c;
+ if (uVar6 > 0) {
+ if (ptr3->unk2 < uVar6) {
+ uVar6 = ptr3->unk2;
+ }
+ gMenu.field_0xa = uVar6;
+ }
+ }
+ gMenu.transitionTimer = 30;
+ SetMenuType(1);
+ SetFade(FADE_INSTANT, 8);
+}
+
+void sub_080A6C1C(void) {
+ if (!gFadeControl.active) {
+ switch (gMenu.transitionTimer) {
+ case 0:
+ sub_080A66D0();
+ switch (gInput.newKeys) {
+ case A_BUTTON:
+ case B_BUTTON:
+ case START_BUTTON:
+ Subtask_Exit();
+ break;
+ }
+ return;
+ case 1:
+ SoundReq(SFX_103);
+ break;
+ }
+ gMenu.transitionTimer--;
+ }
+}
diff --git a/src/subtask/subtaskMapHint.c b/src/subtask/subtaskMapHint.c
new file mode 100644
index 00000000..2a802f2b
--- /dev/null
+++ b/src/subtask/subtaskMapHint.c
@@ -0,0 +1,71 @@
+/**
+ * @file subtask.c
+ * @ingroup Subtasks
+ *
+ * @brief Map Hint Subtask
+ */
+#include "menu.h"
+#include "functions.h"
+#include "subtask.h"
+#include "common.h"
+#include "main.h"
+#include "sound.h"
+#include "save.h"
+#include "flags.h"
+#include "fileselect.h"
+#include "kinstone.h"
+#include "game.h"
+
+void sub_080A6438();
+
+void Subtask_MapHint(void) {
+ extern void (*const Subtask_MapHint_Functions[])(void);
+ FlushSprites();
+ Subtask_MapHint_Functions[gMenu.menuType]();
+ if ((gGenericMenu.unk2c & 0x20) != 0) {
+ sub_080A6438();
+ }
+ sub_080A6498();
+ CopyOAM();
+}
+
+void Subtask_MapHint_0(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 = 60;
+ SetMenuType(1);
+ SetFade(FADE_INSTANT, 8);
+}
+
+void Subtask_MapHint_1(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;
+ }
+ }
+}
diff --git a/src/subtask/subtaskWorldEvent.c b/src/subtask/subtaskWorldEvent.c
new file mode 100644
index 00000000..bae3e921
--- /dev/null
+++ b/src/subtask/subtaskWorldEvent.c
@@ -0,0 +1,103 @@
+/**
+ * @file subtaskWorldEvent.c
+ *
+ * @brief World Event Subtask
+ */
+#include "area.h"
+#include "asm.h"
+#include "common.h"
+#include "flags.h"
+#include "functions.h"
+#include "game.h"
+#include "kinstone.h"
+#include "main.h"
+#include "menu.h"
+#include "message.h"
+#include "room.h"
+#include "screen.h"
+#include "subtask.h"
+
+void Subtask_WorldEvent_Update(void);
+
+extern void (*const gUnk_080FE2A0[])(void);
+void Subtask_WorldEvent(void) {
+#if !(defined(DEMO_USA) || defined(DEMO_JP))
+ gUnk_080FE2A0[gMenu.menuType]();
+#endif
+}
+
+void Subtask_WorldEvent_Init(void) {
+ const WorldEvent* ptr = &gWorldEvents[gUI.field_0x3];
+ gMenu.field_0x0 = ptr->type;
+ gMenu.field_0x3 = ptr->entity_idx;
+ gMenu.field_0x4 = gUI.field_0x3;
+ gMenu.field_0xc = (u8*)ptr;
+ gMenu.menuType++;
+ gMenu.overlayType = 0;
+ gMenu.transitionTimer = 300;
+ DispReset(0);
+ sub_08054974(gUI.field_0x3, 1);
+ sub_0806F364();
+ ClearRoomFlag(0xff);
+ Subtask_WorldEvent_Update();
+}
+
+extern void (*const gWorldEventFunctions[])(void);
+
+void Subtask_WorldEvent_Update(void) {
+ gWorldEventFunctions[gMenu.field_0x0]();
+ FlushSprites();
+ UpdateEntities();
+ DrawEntities();
+ CopyOAM();
+ UpdateScroll();
+ UpdateBgAnimations();
+ UpdateScrollVram();
+}
+
+void Subtask_WorldEvent_End(void) {
+ MessageInitialize();
+ sub_0806F38C();
+ if (gKinstoneWorldEvents[gFuseInfo.kinstoneId].unk7 != 0) {
+ // Show the map hint.
+ MenuFadeIn(SUBTASK_LOCALMAPHINT, gUI.field_0x3);
+ } else {
+ gUI.nextToLoad = 3; // Subtask_FadeOut
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ }
+}
+
+void sub_08054968(void) {
+ gMenu.menuType = 2;
+}
+
+// Controls showing the world event cutscene?
+void sub_08054974(u32 worldEventId, bool32 param_2) {
+ const WorldEvent* ptr = &gWorldEvents[worldEventId];
+ SetCurrentRoomPropertyList(ptr->area, ptr->room);
+ gRoomControls.area = ptr->area;
+ gRoomControls.room = ptr->room;
+ LoadGfxGroups();
+ gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
+ if (param_2) {
+ LoadAuxiliaryRoom(ptr->area, ptr->room);
+ } else {
+ sub_08052FF4(ptr->area, ptr->room);
+ InitializeCamera();
+ gUpdateVisibleTiles = 1;
+ }
+ gScreen.lcd.displayControl &= 0x1fff;
+ gRoomControls.scroll_x = gRoomControls.origin_x + ptr->offsetX;
+ gRoomControls.scroll_y = gRoomControls.origin_y + ptr->offsetY;
+ if (ptr->area == AREA_HYRULE_TOWN) {
+ TryLoadPrologueHyruleTown();
+ }
+ sub_08018710(gUI.field_0x3);
+}
+
+void sub_08054A14(s32 worldEventId) {
+ const WorldEvent* ptr = &gWorldEvents[worldEventId];
+ if (ptr->bank < 0xe) {
+ SetLocalFlagByBank(gLocalFlagBanks[ptr->bank], ptr->flag);
+ }
+}
diff --git a/src/text.c b/src/text.c
index 50d98a01..6cadf99c 100644
--- a/src/text.c
+++ b/src/text.c
@@ -7,21 +7,10 @@
#include "message.h"
#include "fileselect.h"
-extern u16 gUnk_081092D4;
-extern u8 gUnk_081094CE;
extern u8 gUnk_02036AD8;
extern u8 gUnk_02036A58;
-extern void* gUnk_081092AC[];
-typedef struct {
- u8 filler0[12][16];
-} VStruct;
-
-extern VStruct gUnk_0810942E[];
-extern u32 gUnk_0810926C[];
extern u32* Translations[];
-extern u32 gUnk_08109244;
-
typedef struct {
u8 unk0;
u8 unk1;
@@ -29,7 +18,7 @@ typedef struct {
void sub_0805F820(WStruct* r0, u32* r1);
bool32 sub_0805EF40(Token* tok, const u8*);
-void sub_0805F440(Token*, u8*);
+void InitToken(Token* token, u32 textIndexOrPtr);
u32 sub_0805F6A4(Token*, WStruct*);
u32 GetCharacter(Token* tok);
u32 GetFontStrWith(Token*, u32);
@@ -55,10 +44,19 @@ typedef struct {
extern struct_gUnk_02034330 gUnk_02034330;
extern WStruct gUnk_02036540[4];
-extern u32* gUnk_08109248[];
-extern u8* gUnk_08109230[];
+
extern u32* gTranslations[];
-extern u32 gUnk_08109244;
+extern u8* gUnk_08109230[]; // TODO needs to be u8, but then is not passed correctly?
+extern u32 gUnk_08109244; // TODO structure?
+extern u32* gUnk_08109248[];
+extern u32 gUnk_0810926C[];
+extern void* gUnk_081092AC[]; // TODO structure?
+extern u16 gUnk_081092D4; // TODO array?
+typedef struct {
+ u8 filler0[12][16];
+} VStruct;
+extern VStruct gUnk_0810942E[]; // TODO structure?
+extern u8 gUnk_081094CE; // TODO structure? array?
void sub_0805EEB4(Token* token, u32 textIndex) {
u32 langIndex;
@@ -424,16 +422,16 @@ u32 GetFontStrWith(Token* param_1, u32 param_2) {
return rv;
}
-void sub_0805F440(Token* param_1, u8* param_2) {
- MemClear(param_1, sizeof(Token));
- if ((u32)param_2 >= 0x10000) {
- sub_0805EF40(param_1, param_2);
+void InitToken(Token* token, u32 textIndexOrPtr) {
+ MemClear(token, sizeof(Token));
+ if (textIndexOrPtr >= 0x10000) {
+ sub_0805EF40(token, (u8*)textIndexOrPtr);
} else {
- sub_0805EEB4(param_1, (u32)param_2);
+ sub_0805EEB4(token, textIndexOrPtr);
}
}
-u32 sub_0805F46C(u32 param_1, const Font* param_2) {
+u32 ShowTextBox(u32 textIndexOrPtr, const Font* paramFont) {
u32 uVar1;
WStruct* pWVar4;
u32 uVar5;
@@ -450,8 +448,8 @@ u32 sub_0805F46C(u32 param_1, const Font* param_2) {
pWVar4 = sub_0805F2C8();
if (pWVar4 != NULL) {
- MemCopy(param_2, &font, sizeof(Font));
- sub_0805F440(&token, (u8*)param_1);
+ MemCopy(paramFont, &font, sizeof(Font));
+ InitToken(&token, textIndexOrPtr);
token.unk05 = font.stylized & 3;
pWVar4->unk04 = font.stylized;
pWVar4->unk4 = font.width;
@@ -482,16 +480,16 @@ u32 sub_0805F46C(u32 param_1, const Font* param_2) {
font.dest++;
}
uVar8 = uVar8 >> 3;
- param_1 = font.gfx_src;
- DispMessageFrame(puVar9, uVar8, iVar10, param_1);
+ textIndexOrPtr = font.gfx_src;
+ DispMessageFrame(puVar9, uVar8, iVar10, textIndexOrPtr);
puVar9 = puVar9 + 1;
font.gfx_src = font.gfx_src + 7;
- param_1 = font.gfx_src - 1;
+ textIndexOrPtr = font.gfx_src - 1;
while (iVar10-- > 0) {
puVar9 += 0x20;
puVar6 = puVar9;
for (uVar5 = uVar8; (s32)uVar5-- > 0;) {
- *puVar6++ = param_1;
+ *puVar6++ = textIndexOrPtr;
}
}
}
@@ -602,14 +600,12 @@ u32 sub_0805F6A4(Token* param_1, WStruct* param_2) {
return iVar4;
}
-u32 sub_0805F76C(u8* param_1, WStruct* param_2) {
- u32 uVar1;
- Token local_38;
+u32 sub_0805F76C(u32 textIdOrPtr, WStruct* param_2) {
+ Token stackToken;
- sub_0805F440(&local_38, param_1);
- local_38.unk05 = param_2->unk04 & 3;
- uVar1 = sub_0805F6A4(&local_38, param_2);
- return uVar1;
+ InitToken(&stackToken, textIdOrPtr);
+ stackToken.unk05 = param_2->unk04 & 3;
+ return sub_0805F6A4(&stackToken, param_2);
}
static u32 sub_0805F7A0(u32 param_1) {
diff --git a/src/title.c b/src/title.c
index 28aae607..4473b24b 100644
--- a/src/title.c
+++ b/src/title.c
@@ -175,11 +175,11 @@ static void HandleNintendoCapcomLogos(void) {
advance = ADVANCE_NONE;
#if defined(DEMO_USA)
if (gUnk_02000010.listenForKeyPresses == 0) {
- if ((gInput.heldKeys & 0x204) == 0x204) { // TODO
+ if ((gInput.heldKeys & (L_BUTTON | SELECT_BUTTON)) == (L_BUTTON | SELECT_BUTTON)) {
gUnk_02000010.field_0x7 = 1;
SoundReq(SFX_SECRET_BIG);
} else {
- if ((gInput.heldKeys & 0x104) == 0x104) { // TODO
+ if ((gInput.heldKeys & (R_BUTTON | SELECT_BUTTON)) == (R_BUTTON | SELECT_BUTTON)) {
gUnk_02000010.field_0x7 = 2;
SoundReq(SFX_TASK_COMPLETE);
} else {
diff --git a/src/ui.c b/src/ui.c
index cf68578d..6388e564 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -312,7 +312,7 @@ void DrawRupees(void) {
}
case 1:
DrawDigits(0x70, gUnk_0200AF00.rupees,
- gWalletSizes[(u32)gSave.stats.walletType * 2] <= gUnk_0200AF00.rupees, 3);
+ (u16)gWalletSizes[(u32)gSave.stats.walletType * 2] <= gUnk_0200AF00.rupees, 3);
cVar1 = gUnk_0200AF00.unk_c + 1;
default:
gUnk_0200AF00.unk_c = cVar1;
@@ -584,10 +584,10 @@ void DrawKeys(void) {
ptr2->unk_6 = temp + 3;
gScreen.bg0.updated = 1;
}
- if ((gUnk_0200AF00.unk_12 != gSave.unk45C[gArea.dungeon_idx]) || (gUnk_0200AF00.unk_10 == 0)) {
+ if ((gUnk_0200AF00.dungeonKeys != gSave.dungeonKeys[gArea.dungeon_idx]) || (gUnk_0200AF00.unk_10 == 0)) {
gUnk_0200AF00.unk_10 = 2;
- gUnk_0200AF00.unk_12 = gSave.unk45C[gArea.dungeon_idx];
- DrawDigits(0x76, gUnk_0200AF00.unk_12, 0, 2);
+ gUnk_0200AF00.dungeonKeys = gSave.dungeonKeys[gArea.dungeon_idx];
+ DrawDigits(0x76, gUnk_0200AF00.dungeonKeys, 0, 2);
}
}
}
diff --git a/src/worldEvent/worldEvent0.c b/src/worldEvent/worldEvent0.c
new file mode 100644
index 00000000..ac6d3bef
--- /dev/null
+++ b/src/worldEvent/worldEvent0.c
@@ -0,0 +1,41 @@
+/**
+ * @file worldEvent0.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 0
+ */
+#include "fade.h"
+#include "menu.h"
+#include "message.h"
+
+void WorldEvent_0_0(void);
+void WorldEvent_0_1(void);
+void WorldEvent_0_2(void);
+void (*const WorldEvent_0_Functions[])(void) = {
+ WorldEvent_0_0,
+ WorldEvent_0_1,
+ WorldEvent_0_2,
+};
+void WorldEvent_0(void) {
+ WorldEvent_0_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_0_0(void) {
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_0_1(void) {
+ if (gFadeControl.active == 0) {
+ MessageFromTarget(TEXT_INDEX(TEXT_EMPTY, 0x01));
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_0_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent1.c b/src/worldEvent/worldEvent1.c
new file mode 100644
index 00000000..92a17ddd
--- /dev/null
+++ b/src/worldEvent/worldEvent1.c
@@ -0,0 +1,54 @@
+/**
+ * @file worldEvent1.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 1
+ */
+#include "asm.h"
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "physics.h"
+#include "room.h"
+#include "script.h"
+#include "sound.h"
+#include "subtask.h"
+
+void WorldEvent_1_0(void);
+void WorldEvent_1_1(void);
+void WorldEvent_1_2(void);
+void (*const WorldEvent_1_Functions[])(void) = {
+ WorldEvent_1_0,
+ WorldEvent_1_1,
+ WorldEvent_1_2,
+};
+
+void WorldEvent_1(void) {
+ WorldEvent_1_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_1_0(void) {
+ u8* ptr = gMenu.field_0xc;
+ sub_0804B0B0(ptr[2], ptr[3]);
+ sub_0804B0E8(ptr[2], ptr[3]);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_1_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 180;
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ sub_080553E0(gMenu.field_0x4);
+ sub_0801876C(gMenu.field_0x4, 1);
+ }
+}
+
+void WorldEvent_1_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent10.c b/src/worldEvent/worldEvent10.c
new file mode 100644
index 00000000..69d7691e
--- /dev/null
+++ b/src/worldEvent/worldEvent10.c
@@ -0,0 +1,58 @@
+/**
+ * @file worldEvent10.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 10
+ */
+#include "fade.h"
+#include "menu.h"
+#include "object.h"
+#include "subtask.h"
+
+void WorldEvent_Beanstalk_0(void);
+void WorldEvent_Beanstalk_1(void);
+void WorldEvent_Beanstalk_2(void);
+void WorldEvent_Beanstalk_3(void);
+void (*const WorldEvent_Beanstalk_Functions[])(void) = {
+ WorldEvent_Beanstalk_0,
+ WorldEvent_Beanstalk_1,
+ WorldEvent_Beanstalk_2,
+ WorldEvent_Beanstalk_3,
+};
+void WorldEvent_Beanstalk(void) {
+ WorldEvent_Beanstalk_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_Beanstalk_0(void) {
+ u8* ptr = gMenu.field_0xc;
+ SetLocalFlagByBank(gLocalFlagBanks[gMenu.field_0xc[0x11]], (u32) * (u16*)(gMenu.field_0xc + 0x12));
+ sub_0804B0E8(ptr[2], ptr[3]);
+ LoadGfxGroup(0x11);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_Beanstalk_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ gMenu.overlayType++;
+ }
+}
+
+void WorldEvent_Beanstalk_2(void) {
+ u8* ptr = gMenu.field_0xc;
+ Entity* obj = CreateObject(BEANSTALK, 0, 0);
+ if (obj != NULL) {
+ obj->x.HALF.HI = gRoomControls.origin_x + *(s16*)(ptr + 8);
+ obj->y.HALF.HI = gRoomControls.origin_y + *(s16*)(ptr + 10);
+ }
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 390;
+}
+
+void WorldEvent_Beanstalk_3(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent11.c b/src/worldEvent/worldEvent11.c
new file mode 100644
index 00000000..06771f10
--- /dev/null
+++ b/src/worldEvent/worldEvent11.c
@@ -0,0 +1,45 @@
+/**
+ * @file worldEvent11.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 11
+ */
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "subtask.h"
+
+void WorldEvent_11_0(void);
+void WorldEvent_11_1(void);
+void WorldEvent_11_2(void);
+void (*const WorldEvent_11_Functions[])(void) = {
+ WorldEvent_11_0,
+ WorldEvent_11_1,
+ WorldEvent_11_2,
+};
+
+void WorldEvent_11(void) {
+ WorldEvent_11_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_11_0(void) {
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_11_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ sub_0801876C(gMenu.field_0x4, 1);
+ sub_080553E0(gMenu.field_0x4);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 180;
+ }
+}
+
+void WorldEvent_11_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent12.c b/src/worldEvent/worldEvent12.c
new file mode 100644
index 00000000..3fa18c50
--- /dev/null
+++ b/src/worldEvent/worldEvent12.c
@@ -0,0 +1,47 @@
+/**
+ * @file worldEvent12.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 12
+ */
+#include "fade.h"
+#include "kinstone.h"
+#include "menu.h"
+#include "npc.h"
+#include "object.h"
+#include "room.h"
+#include "script.h"
+#include "subtask.h"
+
+extern Script script_GormanFirstAppearance;
+const EntityData gUnk_080FF2C0[] = {
+ // TODO what are these kinds?
+ { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x2b8, 0x36b, 0 },
+ { NPC, 79, GORMAN, 0, 0, 0x2f8, 0x308, (u32)&script_GormanFirstAppearance },
+ { 0x10 + NPC, 15, NPC_UNK_4F, 0, 0, 0x2f8, 0x360, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_12_0(void);
+void WorldEvent_12_1(void);
+void (*const WorldEvent_12_Functions[])(void) = {
+ WorldEvent_12_0,
+ WorldEvent_12_1,
+};
+
+void WorldEvent_12(void) {
+ WorldEvent_12_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_12_0(void) {
+ LoadRoomEntityList((EntityData*)gUnk_080FF2C0);
+ if (gSave.global_progress != 9) {
+ sub_08018C58(0xdb4);
+ }
+ sub_08055B70(gMenu.field_0x4, 1, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_12_1(void) {
+}
diff --git a/src/worldEvent/worldEvent13.c b/src/worldEvent/worldEvent13.c
new file mode 100644
index 00000000..d531e718
--- /dev/null
+++ b/src/worldEvent/worldEvent13.c
@@ -0,0 +1,39 @@
+/**
+ * @file worldEvent13.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 13
+ */
+#include "fade.h"
+#include "menu.h"
+#include "npc.h"
+#include "room.h"
+#include "script.h"
+#include "subtask.h"
+
+extern Script script_MutohKinstone;
+const EntityData gUnk_080FF154[] = {
+ { NPC, 79, MUTOH, 0, 0, 0x78, 0x70, (u32)&script_MutohKinstone },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_13_0(void);
+void WorldEvent_13_1(void);
+void (*const WorldEvent_13_Functions[])(void) = {
+ WorldEvent_13_0,
+ WorldEvent_13_1,
+};
+void WorldEvent_13(void) {
+ WorldEvent_13_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_13_0(void) {
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ LoadRoomEntityList(gUnk_080FF154);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_13_1(void) {
+}
diff --git a/src/worldEvent/worldEvent14.c b/src/worldEvent/worldEvent14.c
new file mode 100644
index 00000000..249a7774
--- /dev/null
+++ b/src/worldEvent/worldEvent14.c
@@ -0,0 +1,48 @@
+/**
+ * @file worldEvent14.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 14
+ */
+#include "fade.h"
+#include "kinstone.h"
+#include "menu.h"
+#include "npc.h"
+#include "object.h"
+#include "room.h"
+#include "script.h"
+#include "subtask.h"
+
+extern Script script_GhostBrotherKinstone;
+const EntityData gUnk_080FF17C[] = {
+ { NPC, 79, GHOST_BROTHERS, 1, 0, 0x388, 0x338, (u32)&script_GhostBrotherKinstone },
+ // TODO what are these kinds?
+ { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x348, 0x303, 0 },
+ { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x3b8, 0x363, 0 },
+ { 0x10 + NPC, 15, NPC_UNK_4F, 0, 0, 0x2f8, 0x360, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_14_0(void);
+void WorldEvent_14_1(void);
+void (*const WorldEvent_14_Functions[])(void) = {
+ WorldEvent_14_0,
+ WorldEvent_14_1,
+};
+
+void WorldEvent_14(void) {
+ WorldEvent_14_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_14_0(void) {
+ LoadRoomEntityList(gUnk_080FF17C);
+ if (gSave.global_progress != 9) {
+ sub_08018C58(0xdb4);
+ }
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_14_1(void) {
+}
diff --git a/src/worldEvent/worldEvent15.c b/src/worldEvent/worldEvent15.c
new file mode 100644
index 00000000..f79420b9
--- /dev/null
+++ b/src/worldEvent/worldEvent15.c
@@ -0,0 +1,56 @@
+/**
+ * @file worldEvent15.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 15
+ */
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "room.h"
+#include "subtask.h"
+
+extern void sub_08054A14(u32);
+extern const EntityData gUnk_080FEE48[];
+
+void WorldEvent_15_0(void);
+void WorldEvent_15_1(void);
+void WorldEvent_15_2(void);
+void (*const WorldEvent_15_Functions[])(void) = {
+ WorldEvent_15_0,
+ WorldEvent_15_1,
+ WorldEvent_15_2,
+};
+
+void WorldEvent_15(void) {
+ WorldEvent_15_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_15_0(void) {
+ Entity* entity;
+
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ entity = LoadRoomEntity((EntityData*)gUnk_080FEE48);
+ if (entity != NULL) {
+ entity->type2 = 2;
+ entity->field_0x86.HWORD = 0x80ff;
+ }
+ sub_08054A14(gMenu.field_0x4);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_15_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_15_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent16.c b/src/worldEvent/worldEvent16.c
new file mode 100644
index 00000000..4cdae208
--- /dev/null
+++ b/src/worldEvent/worldEvent16.c
@@ -0,0 +1,44 @@
+/**
+ * @file worldEvent16.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 16
+ */
+#include "fade.h"
+#include "menu.h"
+#include "npc.h"
+#include "room.h"
+#include "script.h"
+#include "subtask.h"
+
+extern Script script_GoronMerchantArriving;
+const EntityData gUnk_080FF128[] = {
+ { NPC, 79, GORON_MERCHANT, 0, 0, 0x410, 0xf8, (u32)&script_GoronMerchantArriving },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_16_0(void);
+void WorldEvent_16_1(void);
+void WorldEvent_16_2(void);
+void (*const WorldEvent_16_Functions[])(void) = {
+ WorldEvent_16_0,
+ WorldEvent_16_1,
+ WorldEvent_16_2,
+};
+
+void WorldEvent_16(void) {
+ WorldEvent_16_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_16_0(void) {
+ LoadRoomEntityList(gUnk_080FF128);
+ sub_08055B70(gMenu.field_0x4, 2, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_16_1(void) {
+}
+
+void WorldEvent_16_2(void) {
+}
diff --git a/src/worldEvent/worldEvent17.c b/src/worldEvent/worldEvent17.c
new file mode 100644
index 00000000..9b96ecb4
--- /dev/null
+++ b/src/worldEvent/worldEvent17.c
@@ -0,0 +1,161 @@
+/**
+ * @file worldEvent17.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 17
+ */
+#include "fade.h"
+#include "manager.h"
+#include "menu.h"
+#include "npc.h"
+#include "room.h"
+#include "script.h"
+#include "subtask.h"
+#include "manager/bombableWallManager.h"
+
+// Called Goron Kinstone Fusion Script
+void sub_08054EB8(Entity* this, ScriptExecutionContext* context) {
+ BombableWallManager* manager = (BombableWallManager*)GetEmptyManager();
+ if (manager != NULL) {
+ manager->base.kind = MANAGER;
+ manager->base.id = BOMBABLE_WALL_MANAGER;
+ manager->x = this->x.HALF.HI - gRoomControls.origin_x;
+ manager->y = (this->y.HALF.HI - gRoomControls.origin_y) - 0x10;
+ manager->field_0x35 = 1;
+#if defined(EU) || defined(JP) || defined(DEMO_JP)
+ manager->field_0x3e = 0x77;
+#else
+ manager->field_0x3e = 0x79;
+#endif
+ AppendEntityToList((Entity*)manager, 6);
+ }
+}
+
+void sub_08054EFC(Entity* this, ScriptExecutionContext* context) {
+ Entity* effect;
+ u32 tmp = COORD_TO_TILE(this) - 0x40;
+ SetTile(0x4074, tmp, 1);
+ this->collisionLayer = 2;
+ UpdateSpriteForCollisionLayer(this);
+ effect = CreateFx(this, FX_BIG_EXPLOSION, 0);
+ if (effect != NULL) {
+ effect->y.HALF.HI -= 0x10;
+ SortEntityBelow(this, effect);
+ }
+ SoundReq(SFX_ITEM_BOMB_EXPLODE);
+}
+
+void sub_08054F64(Entity* this, ScriptExecutionContext* context) {
+ u32 tmp = this->type2;
+ if ((gActiveScriptInfo.syncFlags & tmp) != tmp) {
+ gActiveScriptInfo.commandSize = 0;
+ } else {
+ gActiveScriptInfo.syncFlags &= ~tmp;
+ gActiveScriptInfo.flags |= 1;
+ }
+}
+
+extern Script script_GoronKinstone;
+const EntityData gUnk_080FEF48[] = {
+ { NPC, 79, GORON, 0, 0, 0x88, 0x368, (u32)&script_GoronKinstone },
+#if defined(USA) || defined(DEMO_USA)
+ // TODO 0x7c is a flag?
+ { MANAGER, 15, MOVEABLE_OBJECT_MANAGER, 0, 0x10e82e00, 0xd8, 0x388, 0x7c1388 },
+#else
+ { MANAGER, 15, MOVEABLE_OBJECT_MANAGER, 0, 0x10e82e00, 0xd8, 0x388, 0x7a1388 },
+#endif
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+extern Script script_Goron1Kinstone2;
+extern Script script_Goron2Kinstone2;
+const EntityData gUnk_080FEF78[] = {
+ { NPC, 79, GORON, 0, 0, 0x68, 0x228, (u32)&script_Goron1Kinstone2 },
+ { NPC, 79, GORON, 0, 0, 0x88, 0x288, (u32)&script_Goron2Kinstone2 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+extern Script script_Goron1Kinstone3;
+extern Script script_Goron2Kinstone3;
+extern Script script_Goron3Kinstone3;
+const EntityData gUnk_080FEFA8[] = {
+ { NPC, 79, GORON, 0, 4, 0x48, 0x178, (u32)&script_Goron1Kinstone3 },
+ { NPC, 79, GORON, 0, 8, 0x68, 0x178, (u32)&script_Goron2Kinstone3 },
+ { NPC, 79, GORON, 0, 2, 0x88, 0x1e8, (u32)&script_Goron3Kinstone3 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+extern Script script_Goron1Kinstone4;
+extern Script script_Goron2Kinstone4;
+extern Script script_Goron4Kinstone4;
+const EntityData gUnk_080FEFE8[] = {
+ { NPC, 79, GORON, 0, 4, 0x48, 0x178, (u32)&script_Goron1Kinstone4 },
+ { NPC, 79, GORON, 0, 8, 0x68, 0x178, (u32)&script_Goron2Kinstone4 },
+ { NPC, 79, GORON, 0, 16, 0x88, 0x178, (u32)&script_Goron2Kinstone4 },
+ { NPC, 79, GORON, 0, 2, 0x88, 0x1e8, (u32)&script_Goron4Kinstone4 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+extern Script script_Goron1Kinstone5;
+extern Script script_Goron2Kinstone5;
+extern Script script_Goron5Kinstone5;
+const EntityData gUnk_080FF038[] = {
+ { NPC, 79, GORON, 0, 4, 0x28, 0xd8, (u32)&script_Goron1Kinstone5 },
+ { NPC, 79, GORON, 0, 8, 0x48, 0xd8, (u32)&script_Goron2Kinstone5 },
+ { NPC, 79, GORON, 0, 16, 0x68, 0xd8, (u32)&script_Goron2Kinstone5 },
+ { NPC, 79, GORON, 0, 32, 0x88, 0xd8, (u32)&script_Goron2Kinstone5 },
+ { NPC, 79, GORON, 0, 2, 0x98, 0x178, (u32)&script_Goron5Kinstone5 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+extern Script script_Goron1Kinstone6;
+extern Script script_Goron2Kinstone6;
+extern Script script_Goron6Kindstone6;
+const EntityData gUnk_080FF098[] = {
+ { NPC, 79, GORON, 0, 4, 0x28, 0xd8, (u32)&script_Goron1Kinstone6 },
+ { NPC, 79, GORON, 0, 8, 0x48, 0xd8, (u32)&script_Goron2Kinstone6 },
+ { NPC, 79, GORON, 0, 16, 0x68, 0xd8, (u32)&script_Goron2Kinstone6 },
+ { NPC, 79, GORON, 0, 32, 0x88, 0xd8, (u32)&script_Goron2Kinstone6 },
+ { NPC, 79, GORON, 0, 64, 0xa8, 0xd8, (u32)&script_Goron2Kinstone6 },
+ { NPC, 79, GORON, 0, 2, 0x98, 0x178, (u32)&script_Goron6Kindstone6 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+const EntityData* const gUnk_080FF108[] = {
+ gUnk_080FEF48, gUnk_080FEF78, gUnk_080FEFA8, gUnk_080FEFE8, gUnk_080FF038, gUnk_080FF098,
+};
+
+void WorldEvent_17_0(void);
+void WorldEvent_17_1(void);
+void (*const WorldEvent_17_Functions[])(void) = {
+ WorldEvent_17_0,
+ WorldEvent_17_1,
+};
+
+void WorldEvent_17(void) {
+ WorldEvent_17_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_17_0(void) {
+ u8* ptr;
+ u32 tmp;
+
+ ptr = gMenu.field_0xc;
+ LoadRoomEntityList(gUnk_080FF108[ptr[1]]);
+ if (ptr[1] != 0) {
+ tmp = 3;
+ } else {
+ tmp = 0;
+ }
+ sub_08055B70(gMenu.field_0x4, tmp, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+ gMenu.field_0xa = 0;
+ if (CheckLocalFlagByBank(FLAG_BANK_4, GORON_DOUKUTU_01_T1) && (ptr[2] == 0x2f)) {
+ gMenu.field_0xa = 1;
+ }
+}
+
+void WorldEvent_17_1(void) {
+ if (gMenu.field_0xa != 0) {
+ gMenu.field_0xa = 0;
+ SetTileType(0x74, 0x407, 1);
+ }
+}
diff --git a/src/worldEvent/worldEvent19.c b/src/worldEvent/worldEvent19.c
new file mode 100644
index 00000000..12437991
--- /dev/null
+++ b/src/worldEvent/worldEvent19.c
@@ -0,0 +1,49 @@
+/**
+ * @file worldEvent19.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 19
+ */
+#include "fade.h"
+#include "functions.h"
+#include "menu.h"
+#include "npc.h"
+#include "room.h"
+#include "script.h"
+#include "subtask.h"
+
+extern Script script_BigGoronKinstone1;
+extern Script script_BigGoronKinstone2;
+extern Script script_BigGoronKinstone3;
+const EntityData gUnk_080FEED4[] = {
+ { NPC, 79, BIG_GORON, 0, 0, 0x140, 0xf8, (u32)&script_BigGoronKinstone1 },
+ { NPC, 79, BIG_GORON, 5, 0, 0xd0, 0xc8, (u32)&script_BigGoronKinstone2 },
+ { NPC, 79, BIG_GORON, 10, 0, 0x1b0, 0x108, (u32)&script_BigGoronKinstone3 },
+ { NPC, 15, BIG_GORON, 1, 0, 0x108, 0x88, 0 },
+ { NPC, 15, BIG_GORON, 2, 0, 0x108, 0x88, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_19_0(void);
+void WorldEvent_19_1(void);
+void (*const WorldEvent_19_Functions[])(void) = {
+ WorldEvent_19_0,
+ WorldEvent_19_1,
+};
+
+void WorldEvent_19(void) {
+ WorldEvent_19_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_19_0(void) {
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ LoadRoomEntityList(gUnk_080FEED4);
+ LoadStaticBackground(2);
+ sub_0806D0B0(NULL);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_19_1(void) {
+}
diff --git a/src/worldEvent/worldEvent2.c b/src/worldEvent/worldEvent2.c
new file mode 100644
index 00000000..aa347001
--- /dev/null
+++ b/src/worldEvent/worldEvent2.c
@@ -0,0 +1,65 @@
+/**
+ * @file worldEvent2.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 2
+ */
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "room.h"
+#include "sound.h"
+#include "subtask.h"
+
+void sub_08055994(void);
+
+void WorldEvent_2_0(void);
+void WorldEvent_2_1(void);
+void WorldEvent_2_2(void);
+void (*const WorldEvent_2_Functions[])(void) = {
+ WorldEvent_2_0,
+ WorldEvent_2_1,
+ WorldEvent_2_2,
+};
+
+void WorldEvent_2(void) {
+ WorldEvent_2_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_2_0(void) {
+ u8* ptr = gMenu.field_0xc;
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ sub_0804B0E8(ptr[2], ptr[3]);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_2_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ sub_08055994();
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_2_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
+
+void sub_08055994(void) {
+ u32 layer;
+ TileEntity* ptr = &gUnk_080FEAC8[gMenu.field_0x4];
+ if ((ptr->_6 & 1) != 0) {
+ layer = 2;
+ } else {
+ layer = 1;
+ }
+ SetTileType(0x73, (*(u16*)(gMenu.field_0xc + 8) >> 4 & 0x3f) | (*(u16*)(gMenu.field_0xc + 10) >> 4 & 0x3f) << 6,
+ layer);
+ sub_080553E0((u32)gMenu.field_0x4);
+ SoundReq(SFX_SECRET_BIG);
+}
diff --git a/src/worldEvent/worldEvent20.c b/src/worldEvent/worldEvent20.c
new file mode 100644
index 00000000..b81833d1
--- /dev/null
+++ b/src/worldEvent/worldEvent20.c
@@ -0,0 +1,40 @@
+/**
+ * @file worldEvent20.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 20
+ */
+#include "fade.h"
+#include "menu.h"
+#include "npc.h"
+#include "room.h"
+#include "script.h"
+#include "subtask.h"
+
+extern Script script_SyrupKinstone;
+const EntityData gUnk_080FF308[] = {
+ { NPC, 79, SYRUP, 0, 0, 0x78, 0x38, (u32)&script_SyrupKinstone },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_20_0(void);
+void WorldEvent_20_1(void);
+void (*const WorldEvent_20_Functions[])(void) = {
+ WorldEvent_20_0,
+ WorldEvent_20_1,
+};
+
+void WorldEvent_20(void) {
+ WorldEvent_20_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_20_0(void) {
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ LoadRoomEntityList((EntityData*)gUnk_080FF308);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_20_1(void) {
+}
diff --git a/src/worldEvent/worldEvent21.c b/src/worldEvent/worldEvent21.c
new file mode 100644
index 00000000..e5540fa9
--- /dev/null
+++ b/src/worldEvent/worldEvent21.c
@@ -0,0 +1,39 @@
+/**
+ * @file worldEvent21.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 21
+ */
+#include "fade.h"
+#include "menu.h"
+#include "npc.h"
+#include "room.h"
+#include "subtask.h"
+
+extern Script script_CarlovKinstone;
+const EntityData gUnk_080FF264[] = {
+ { NPC, 79, CARLOV, 1, 0, 0x78, 0x48, (u32)&script_CarlovKinstone },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_21_0(void);
+void WorldEvent_21_1(void);
+void (*const WorldEvent_21_Functions[])(void) = {
+ WorldEvent_21_0,
+ WorldEvent_21_1,
+};
+
+void WorldEvent_21(void) {
+ WorldEvent_21_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_21_0(void) {
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ LoadRoomEntityList((EntityData*)gUnk_080FF264);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_21_1(void) {
+}
diff --git a/src/worldEvent/worldEvent22.c b/src/worldEvent/worldEvent22.c
new file mode 100644
index 00000000..367c47da
--- /dev/null
+++ b/src/worldEvent/worldEvent22.c
@@ -0,0 +1,43 @@
+/**
+ * @file worldEvent.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 22
+ */
+#include "functions.h"
+#include "menu.h"
+#include "npc.h"
+#include "room.h"
+#include "screen.h"
+
+extern void sub_0804B0B0(u32, u32);
+extern void sub_08055B70(u32, u32, u32, u32);
+
+extern u8 gUpdateVisibleTiles;
+extern Script script_StampKinstone;
+const EntityData gUnk_080FF400[] = {
+ { NPC, 79, STAMP, 0, 0, 0x48, 0x38, (u32)&script_StampKinstone },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_22_0(void);
+void WorldEvent_22_1(void);
+void (*const WorldEvent_22_Functions[])(void) = {
+ WorldEvent_22_0,
+ WorldEvent_22_1,
+};
+
+void WorldEvent_22(void) {
+ WorldEvent_22_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_22_0(void) {
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ LoadRoomEntityList(gUnk_080FF400);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_22_1(void) {
+}
diff --git a/src/worldEvent/worldEvent23.c b/src/worldEvent/worldEvent23.c
new file mode 100644
index 00000000..90f7dbcc
--- /dev/null
+++ b/src/worldEvent/worldEvent23.c
@@ -0,0 +1,37 @@
+/**
+ * @file worldEvent23.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 23
+ */
+#include "fade.h"
+#include "menu.h"
+#include "npc.h"
+#include "subtask.h"
+
+const EntityData gUnk_080FF298[] = {
+ { NPC, 15, FOREST_MINISH, 0, 513, 0x78, 0x58, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+void WorldEvent_23_0(void);
+void WorldEvent_23_1(void);
+void (*const WorldEvent_23_Functions[])(void) = {
+ WorldEvent_23_0,
+ WorldEvent_23_1,
+};
+
+void WorldEvent_23(void) {
+ WorldEvent_23_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_23_0(void) {
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ sub_0804B0B0((u32)gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ LoadRoomEntityList((EntityData*)gUnk_080FF298);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_23_1(void) {
+}
diff --git a/src/worldEvent/worldEvent24.c b/src/worldEvent/worldEvent24.c
new file mode 100644
index 00000000..7f065152
--- /dev/null
+++ b/src/worldEvent/worldEvent24.c
@@ -0,0 +1,47 @@
+/**
+ * @file worldEvent24.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 24
+ */
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "room.h"
+#include "subtask.h"
+
+void WorldEvent_24_0(void);
+void WorldEvent_24_1(void);
+void WorldEvent_24_2(void);
+void (*const WorldEvent_24_Functions[])(void) = {
+ WorldEvent_24_0,
+ WorldEvent_24_1,
+ WorldEvent_24_2,
+};
+
+void WorldEvent_24(void) {
+ WorldEvent_24_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_24_0(void) {
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_24_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ sub_0801876C(gMenu.field_0x4, 1);
+ sub_080553E0(gMenu.field_0x4);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_24_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent25.c b/src/worldEvent/worldEvent25.c
new file mode 100644
index 00000000..b50b5ce8
--- /dev/null
+++ b/src/worldEvent/worldEvent25.c
@@ -0,0 +1,71 @@
+/**
+ * @file worldEvent25.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 25
+ */
+#include "fade.h"
+#include "menu.h"
+#include "object.h"
+#include "script.h"
+#include "subtask.h"
+
+void WorldEvent_25_0(void);
+void WorldEvent_25_1(void);
+void WorldEvent_25_2(void);
+void (*const WorldEvent_25_Functions[])(void) = {
+ WorldEvent_25_0,
+ WorldEvent_25_1,
+ WorldEvent_25_2,
+};
+
+extern Script script_KinstoneSparkKinstoneSpark;
+extern Script script_KinstoneSparkKinstoneSparkFromBottom;
+extern Script script_KinstoneSparkKinstoneSparkGoronMerchang;
+extern Script script_KinstoneSparkKinstoneSparkGoron;
+const EntityData gUnk_080FF378[] = {
+ { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSpark },
+ { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSparkFromBottom },
+ { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSparkGoronMerchang },
+ { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSparkGoron },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+extern const EntityData gUnk_080FED18[];
+
+void WorldEvent_25(void) {
+ WorldEvent_25_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_25_0(void) {
+ Entity* entity;
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ entity = LoadRoomEntity((EntityData*)&gUnk_080FED18[gMenu.field_0xc[1]]);
+ if (entity != NULL) {
+ entity->type2 = 1;
+ }
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_25_1(void) {
+ if (gFadeControl.active == 0) {
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_25_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
+
+void sub_08055B70(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
+ u8* ptr = gMenu.field_0xc;
+ Entity* entity = LoadRoomEntity((EntityData*)&gUnk_080FF378[param_2]);
+ if (entity != NULL) {
+ entity->x.HALF.HI = *(s16*)(ptr + 8) + param_3 + gRoomControls.origin_x;
+ entity->y.HALF.HI = *(s16*)(ptr + 10) + param_4 + gRoomControls.origin_y;
+ }
+}
diff --git a/src/worldEvent/worldEvent3.c b/src/worldEvent/worldEvent3.c
new file mode 100644
index 00000000..adb20f68
--- /dev/null
+++ b/src/worldEvent/worldEvent3.c
@@ -0,0 +1,47 @@
+/**
+ * @file worldEvent3.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 3
+ */
+#include "fade.h"
+#include "flags.h"
+#include "functions.h"
+#include "menu.h"
+#include "subtask.h"
+
+void WorldEvent_3_0(void);
+void WorldEvent_3_1(void);
+void WorldEvent_3_2(void);
+void (*const WorldEvent_3_Functions[])(void) = {
+ WorldEvent_3_0,
+ WorldEvent_3_1,
+ WorldEvent_3_2,
+};
+
+void WorldEvent_3(void) {
+ WorldEvent_3_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_3_0(void) {
+ sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_3_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ sub_0801876C(gMenu.field_0x4, 1);
+ sub_080553E0(gMenu.field_0x4);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_3_2(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent4.c b/src/worldEvent/worldEvent4.c
new file mode 100644
index 00000000..114cec1c
--- /dev/null
+++ b/src/worldEvent/worldEvent4.c
@@ -0,0 +1,62 @@
+/**
+ * @file worldEvent4.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 4
+ */
+#include "fade.h"
+#include "flags.h"
+#include "functions.h"
+#include "kinstone.h"
+#include "menu.h"
+#include "screen.h"
+#include "sound.h"
+#include "subtask.h"
+
+void sub_08055B70(u32, u32, u32, u32);
+
+void WorldEvent_4_0(void);
+void WorldEvent_4_1(void);
+void WorldEvent_4_2(void);
+void WorldEvent_4_3(void);
+void (*const WorldEvent_4_Functions[])(void) = {
+ WorldEvent_4_0,
+ WorldEvent_4_1,
+ WorldEvent_4_2,
+ WorldEvent_4_3,
+};
+
+void WorldEvent_4(void) {
+ WorldEvent_4_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_4_0(void) {
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ sub_0801876C(gMenu.field_0x4, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_4_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ gMenu.overlayType++;
+ }
+}
+
+void WorldEvent_4_2(void) {
+ if (gFadeControl.active == 0) {
+ sub_08054974(gMenu.field_0x4, 0);
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ SoundReq(SFX_SECRET_BIG);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_4_3(void) {
+ if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent5.c b/src/worldEvent/worldEvent5.c
new file mode 100644
index 00000000..1032b3bc
--- /dev/null
+++ b/src/worldEvent/worldEvent5.c
@@ -0,0 +1,94 @@
+/**
+ * @file worldEvent5.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 5
+ */
+#include "common.h"
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "room.h"
+#include "screen.h"
+#include "sound.h"
+#include "subtask.h"
+
+const s16 gUnk_080FF1D4[] = { 19, 192, 224, //
+ 18, 176, 216, //
+ 18, 208, 216, //
+ 18, 240, 216, //
+ 19, 176, 224, //
+ 0 };
+
+void WorldEvent_5_0(void);
+void WorldEvent_5_1(void);
+void WorldEvent_5_2(void);
+void WorldEvent_5_3(void);
+void (*const WorldEvent_5_Functions[])(void) = {
+ WorldEvent_5_0,
+ WorldEvent_5_1,
+ WorldEvent_5_2,
+ WorldEvent_5_3,
+};
+
+const u16 gUnk_080FF204[] = { 0x10, 0x10f, 0x20e, 0x30d, 0x40c, 0x50b, 0x60a, 0x709, 0x808,
+ 0x907, 0xa06, 0xb05, 0xc04, 0xd03, 0xe02, 0xf01, 0x1000, 0xffff };
+
+void WorldEvent_5(void) {
+ WorldEvent_5_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_5_0(void) {
+ // Doesn't work when put into a packed struct?
+ const s16* ptr = &gUnk_080FF1D4[(gMenu.field_0xc[1] & 0xf) * 3];
+ LoadGfxGroup(ptr[0]);
+ gScreen.bg3.xOffset = ptr[1];
+ gScreen.bg3.yOffset = ptr[2];
+ gScreen.bg3.control = 0x1e05;
+ gScreen.controls.layerFXControl = 0x3648;
+ gScreen.controls.alphaBlend = 0x10;
+ gScreen.lcd.displayControl |= 0x800;
+ sub_0801876C(gMenu.field_0x4, 1);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gMenu.storyPanelIndex = 0;
+ gMenu.transitionTimer = 60;
+ gMenu.field_0xa = 0;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_5_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ gMenu.overlayType++;
+ }
+}
+
+void WorldEvent_5_2(void) {
+ if (gMenu.storyPanelIndex == 0) {
+ gMenu.transitionTimer--;
+ if (gMenu.transitionTimer == 0) {
+ u32 tmp = gMenu.storyPanelIndex;
+ gMenu.storyPanelIndex = tmp + 1;
+ SoundReq(SFX_EVAPORATE);
+ }
+ } else if ((gRoomTransition.frameCount & 7U) == 0) {
+ if (gUnk_080FF204[gMenu.field_0xa] != 0xffff) {
+ gScreen.controls.alphaBlend = gUnk_080FF204[gMenu.field_0xa++];
+ } else {
+ gScreen.lcd.displayControl &= 0xf7ff;
+ gScreen.controls.alphaBlend = 0x1000;
+ gMenu.transitionTimer = 120;
+ gMenu.overlayType++;
+#ifndef EU
+ SoundReq(SFX_SECRET_BIG);
+#endif
+ }
+ }
+}
+
+void WorldEvent_5_3(void) {
+ if (--gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent6.c b/src/worldEvent/worldEvent6.c
new file mode 100644
index 00000000..bfc96630
--- /dev/null
+++ b/src/worldEvent/worldEvent6.c
@@ -0,0 +1,66 @@
+/**
+ * @file worldEvent6.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 6
+ */
+#include "fade.h"
+#include "menu.h"
+#include "object.h"
+#include "sound.h"
+#include "subtask.h"
+
+void WorldEvent_6_0(void);
+void WorldEvent_6_1(void);
+void WorldEvent_6_2(void);
+void WorldEvent_6_3(void);
+void (*const WorldEvent_6_Functions[])(void) = {
+ WorldEvent_6_0,
+ WorldEvent_6_1,
+ WorldEvent_6_2,
+ WorldEvent_6_3,
+};
+
+void WorldEvent_6(void) {
+ WorldEvent_6_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_6_0(void) {
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ sub_0801876C(gMenu.field_0x4, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_6_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ gMenu.overlayType++;
+ }
+}
+
+void WorldEvent_6_2(void) {
+ if (gFadeControl.active == 0) {
+ sub_08054974(gMenu.field_0x4, 0);
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ SoundReq(SFX_SECRET_BIG);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_6_3(void) {
+ if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) {
+ gMenu.menuType++;
+ }
+}
+
+void sub_080553E0(u32 param_1) {
+ u8* ptr = gMenu.field_0xc;
+ Entity* effect = CreateObject(SPECIAL_FX, FX_BIG_EXPLOSION2, 0);
+ if (effect != NULL) {
+ effect->x.HALF.HI = *(s16*)(ptr + 8) + gRoomControls.origin_x;
+ effect->y.HALF.HI = *(s16*)(ptr + 10) + gRoomControls.origin_y;
+ }
+}
diff --git a/src/worldEvent/worldEvent7.c b/src/worldEvent/worldEvent7.c
new file mode 100644
index 00000000..601990ad
--- /dev/null
+++ b/src/worldEvent/worldEvent7.c
@@ -0,0 +1,65 @@
+/**
+ * @file worldEvent7.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 7
+ */
+#include "fade.h"
+#include "menu.h"
+#include "object.h"
+#include "sound.h"
+#include "subtask.h"
+
+void WorldEvent_7_0(void);
+void WorldEvent_7_1(void);
+void WorldEvent_7_2(void);
+void WorldEvent_7_3(void);
+void (*const WorldEvent_7_Functions[])(void) = { WorldEvent_7_0, WorldEvent_7_1, WorldEvent_7_2, WorldEvent_7_3 };
+const u32 unused[] = { 0xff, 0, 0, 0 };
+
+void WorldEvent_7(void) {
+ WorldEvent_7_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_7_0(void) {
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ sub_0801876C(gMenu.field_0x4, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_7_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ gMenu.overlayType++;
+ }
+}
+
+void WorldEvent_7_2(void) {
+ u8* ptr;
+ Entity* entity;
+ if (gFadeControl.active == 0) {
+ ptr = gMenu.field_0xc;
+ sub_080553E0((u32)gMenu.field_0x4);
+ if ((ptr[1] & 0x80) != 0) {
+ sub_08054974(gMenu.field_0x4, 0);
+ } else {
+ entity = FindEntity(OBJECT, TREE_THORNS, 6, 0, ptr[1] & 0x80);
+ if (entity != NULL) {
+ DeleteEntity(entity->child);
+ DeleteEntity(entity);
+ }
+ }
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ SoundReq(SFX_SECRET_BIG);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_7_3(void) {
+ if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent8.c b/src/worldEvent/worldEvent8.c
new file mode 100644
index 00000000..53193bd7
--- /dev/null
+++ b/src/worldEvent/worldEvent8.c
@@ -0,0 +1,58 @@
+/**
+ * @file worldEvent8.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 8
+ */
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "sound.h"
+#include "subtask.h"
+
+void WorldEvent_8_0(void);
+void WorldEvent_8_1(void);
+void WorldEvent_8_2(void);
+void WorldEvent_8_3(void);
+void (*const WorldEvent_8_Functions[])(void) = {
+ WorldEvent_8_0,
+ WorldEvent_8_1,
+ WorldEvent_8_2,
+ WorldEvent_8_3,
+};
+
+void WorldEvent_8(void) {
+ WorldEvent_8_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_8_0(void) {
+ sub_0804B0E8(gMenu.field_0xc[2], gMenu.field_0xc[3]);
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_8_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ gMenu.overlayType++;
+ }
+}
+
+void WorldEvent_8_2(void) {
+ if (gFadeControl.active == 0) {
+ sub_0801876C(gMenu.field_0x4, 1);
+ sub_080553E0(gMenu.field_0x4);
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ SoundReq(SFX_SECRET_BIG);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_8_3(void) {
+ if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}
diff --git a/src/worldEvent/worldEvent9.c b/src/worldEvent/worldEvent9.c
new file mode 100644
index 00000000..24a29dff
--- /dev/null
+++ b/src/worldEvent/worldEvent9.c
@@ -0,0 +1,67 @@
+/**
+ * @file worldEvent9.c
+ * @ingroup WorldEvents
+ *
+ * @brief World Event 9
+ */
+#include "fade.h"
+#include "flags.h"
+#include "menu.h"
+#include "object.h"
+#include "room.h"
+#include "sound.h"
+#include "subtask.h"
+
+const EntityData gUnk_080FF33C[] = {
+ { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x98, 0x173, 0 },
+ { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 },
+};
+
+void WorldEvent_9_0(void);
+void WorldEvent_9_1(void);
+void WorldEvent_9_2(void);
+void WorldEvent_9_3(void);
+void (*const WorldEvent_9_Functions[])(void) = {
+ WorldEvent_9_0,
+ WorldEvent_9_1,
+ WorldEvent_9_2,
+ WorldEvent_9_3,
+};
+
+void WorldEvent_9(void) {
+ WorldEvent_9_Functions[gMenu.overlayType]();
+}
+
+void WorldEvent_9_0(void) {
+ if (gMenu.field_0xc[1] != 0) {
+ LoadRoomEntityList((EntityData*)gUnk_080FF33C);
+ }
+ sub_08055B70(gMenu.field_0x4, 0, 0, 0);
+ gMenu.overlayType++;
+ gUpdateVisibleTiles = 1;
+ SetFade(FADE_INSTANT, 0x10);
+}
+
+void WorldEvent_9_1(void) {
+ if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) {
+ SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ gMenu.overlayType++;
+ }
+}
+
+void WorldEvent_9_2(void) {
+ if (gFadeControl.active == 0) {
+ sub_0801876C(gMenu.field_0x4, 1);
+ sub_080553E0(gMenu.field_0x4);
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
+ SoundReq(SFX_SECRET_BIG);
+ gMenu.overlayType++;
+ gMenu.transitionTimer = 120;
+ }
+}
+
+void WorldEvent_9_3(void) {
+ if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
+ gMenu.menuType++;
+ }
+}