summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-09-05 22:50:19 +0200
committeranonymous <>2022-10-08 22:32:54 +0200
commit67467fd831d2928715835f8a389b4f464a0f9a7a (patch)
tree261864c07f334c35024033a908b4af8e808caebe /include
parent756a8a89da46dade06fad1723de88fa5a82cc2ec (diff)
Extract some data
And split up subtasks and world events.
Diffstat (limited to 'include')
-rw-r--r--include/beanstalkSubtask.h6
-rw-r--r--include/color.h2
-rw-r--r--include/common.h19
-rw-r--r--include/cutscene.h23
-rw-r--r--include/enemyUtils.h11
-rw-r--r--include/enterPortalSubtask.h11
-rw-r--r--include/entity.h6
-rw-r--r--include/figurineMenu.h32
-rw-r--r--include/fileselect.h3
-rw-r--r--include/functions.h8
-rw-r--r--include/game.h62
-rw-r--r--include/global.h10
-rw-r--r--include/hitbox.h32
-rw-r--r--include/itemMetaData.h2
-rw-r--r--include/kinstone.h92
-rw-r--r--include/menu.h2
-rw-r--r--include/pauseMenu.h43
-rw-r--r--include/player.h8
-rw-r--r--include/room.h22
-rw-r--r--include/save.h26
-rw-r--r--include/script.h13
-rw-r--r--include/structures.h31
-rw-r--r--include/subtask.h70
-rw-r--r--include/subtask2.h12
24 files changed, 449 insertions, 97 deletions
diff --git a/include/beanstalkSubtask.h b/include/beanstalkSubtask.h
index 15348f87..3f7d452c 100644
--- a/include/beanstalkSubtask.h
+++ b/include/beanstalkSubtask.h
@@ -18,4 +18,10 @@ typedef struct {
u16 tileIndex;
} struct_080B44D0;
+typedef struct {
+ u32 src;
+ void* dest;
+ u32 size;
+} struct_08109194;
+
#endif // BEANSTALKSUBTASK_H
diff --git a/include/color.h b/include/color.h
index fc99cdf8..eaebb6a6 100644
--- a/include/color.h
+++ b/include/color.h
@@ -7,7 +7,7 @@ typedef struct {
u8 _0_0 : 4;
u8 _0_4 : 4;
u8 _1;
- u16 _2;
+ u16 objPaletteId;
} Palette;
extern Palette gPaletteList[0x10];
diff --git a/include/common.h b/include/common.h
index ce4a0968..5d68679b 100644
--- a/include/common.h
+++ b/include/common.h
@@ -17,24 +17,7 @@ typedef struct {
} Input;
extern Input gInput; /**< Input instance. */
-typedef struct {
- u8 evt_type;
- u8 entity_idx;
- u8 area;
- u8 room;
- u16 _4;
- u16 _6;
- u16 x;
- u16 y;
- u16 _c;
- u16 _e;
- u8 _10;
- u8 _11;
- u16 flag;
-} struct_080FE320;
-extern struct_080FE320 gUnk_080FE320[];
-
-void LoadPalettes(const u8*, s32, s32);
+void LoadPalettes(const u8* src, s32 destPaletteNum, s32 numPalettes);
/**
* Loads a packed group of palettes.
diff --git a/include/cutscene.h b/include/cutscene.h
new file mode 100644
index 00000000..4b6b6cfc
--- /dev/null
+++ b/include/cutscene.h
@@ -0,0 +1,23 @@
+#ifndef CUTSCENE_H
+#define CUTSCENE_H
+
+#include "room.h"
+
+typedef struct {
+ const EntityData* entityData;
+ u8 area;
+ u8 room;
+ s8 scrollX;
+ s8 scrollY;
+} struct_080FCF04;
+
+typedef struct {
+ const EntityData* entityData1;
+ const EntityData* entityData2;
+ u8 area;
+ u8 room;
+ s8 scrollX;
+ s8 scrollY;
+} struct_080FCFB8;
+
+#endif // CUTSCENE_H
diff --git a/include/enemyUtils.h b/include/enemyUtils.h
new file mode 100644
index 00000000..869e58a1
--- /dev/null
+++ b/include/enemyUtils.h
@@ -0,0 +1,11 @@
+#ifndef ENEMYUTILS_H
+#define ENEMYUTILS_H
+
+#include "global.h"
+
+typedef struct {
+ u8 unk_0;
+ u8 unk_1;
+} PACKED struct_080D3D94;
+
+#endif // ENEMYUTILS_H
diff --git a/include/enterPortalSubtask.h b/include/enterPortalSubtask.h
new file mode 100644
index 00000000..ead7a1e0
--- /dev/null
+++ b/include/enterPortalSubtask.h
@@ -0,0 +1,11 @@
+#ifndef ENTERPORTALSUBTASK_H
+#define ENTERPORTALSUBTASK_H
+
+#include "global.h"
+
+typedef struct {
+ u8 paletteGroup;
+ u8 gfxGroup;
+} PACKED struct_080D4138;
+
+#endif // ENTERPORTALSUBTASK_H
diff --git a/include/entity.h b/include/entity.h
index 9c06ff5d..78dcde47 100644
--- a/include/entity.h
+++ b/include/entity.h
@@ -254,7 +254,7 @@ void InitAnimationForceUpdate(Entity* entity, u32 animIndex);
void UpdateAnimationSingleFrame(Entity* entity);
void UpdateSpriteForCollisionLayer(Entity* entity);
void GetNextFrame(Entity* entity);
-u32 LoadExtraSpriteData(Entity* entity, const SpriteLoadData* spriteData);
+bool32 LoadExtraSpriteData(Entity* entity, const SpriteLoadData* spriteData);
void SetExtraSpriteFrame(Entity*, u32, u32);
void SetSpriteSubEntryOffsetData1(Entity*, u32, u32);
void SetSpriteSubEntryOffsetData2(Entity*, u32, u32);
@@ -549,5 +549,9 @@ extern u8 gManagerCount;
#define Direction8FromAnimationState(expr) ((expr) << 2)
///@}
+
+
+extern void DeleteAllEntities(void);
+
#endif // ENTITY_H
// clang-format on
diff --git a/include/figurineMenu.h b/include/figurineMenu.h
new file mode 100644
index 00000000..3f2fd835
--- /dev/null
+++ b/include/figurineMenu.h
@@ -0,0 +1,32 @@
+#ifndef FIGURINEMENU_H
+#define FIGURINEMENU_H
+
+#include "global.h"
+
+typedef struct {
+ u8 paletteGroup;
+ u8 gfxGroup;
+ u16 unk2;
+ u16 bg1Control;
+ u16 bg2Control;
+} struct_08128AD8;
+
+enum enum_080FC3E4 {
+ // CheckLocalFlagByBank
+ UNK_6_8 = 8,
+ UNK_6_40 = 0x40, // 64
+ // CheckKinstoneFused
+ UNK_6_10 = 0x10, // 16
+ // CheckKinstoneFused multiple with unk_4 as index
+ UNK_6_20 = 0x20, // 32
+};
+
+typedef struct {
+ u32 bank;
+ u16 flag;
+ u8 unk_6; /**< @see enum_080FC3E4 */
+ u8 type; /**< Type of the OBJECT_A2 that is spawned. */
+} struct_080FC3E4;
+extern const struct_080FC3E4 gUnk_080FC3E4[];
+
+#endif // FIGURINEMENU_H
diff --git a/include/fileselect.h b/include/fileselect.h
index 8e75cbc0..29923481 100644
--- a/include/fileselect.h
+++ b/include/fileselect.h
@@ -52,7 +52,7 @@ extern struct_02019EE0 gMapDataBottomSpecial;
// TODO size: 0x8000 from ClearTilemaps?
extern void sub_08056FEC(u32, struct_020227E8*);
-extern u32 sub_0805F46C(u32, const Font*);
+extern u32 ShowTextBox(u32 textIndexOrPtr, const Font* font);
extern void ClearTilemaps(void);
extern void ResetSaveFile(u32);
extern WStruct* sub_0805F2C8(void);
@@ -67,7 +67,6 @@ extern const Font gUnk_080FC844;
extern const u16 gUnk_080FC85C[][3];
extern void (*const gUnk_080FC908[])(void);
extern const u8 gGlobalGfxAndPalettes[];
-extern void (*const gUnk_080FC93C[])();
extern u32 gUsedPalettes;
extern u8 gTextGfxBuffer[];
extern u8 gUnk_02022030;
diff --git a/include/functions.h b/include/functions.h
index b526cb06..0e7b79f8 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -21,12 +21,12 @@ extern void CreateItemOnGround(Entity*);
extern void CreateMagicSparkles(u32, u32, u32);
extern void CreateMinishEntrance(u32 tile);
extern u32 CreateRandomItemDrop(Entity*, u32);
-extern void DrawDirect(u32, u32);
+extern void DrawDirect(u32 spriteIndex, u32 frameIndex);
extern void DrawEntities(void);
extern bool32 EntityWithinDistance(Entity*, s32, s32, s32);
extern void FlushSprites(void);
extern LayerStruct* GetLayerByIndex(u32);
-extern u32 GetTileIndex(u32, u32);
+extern u32 GetTileIndex(u32 tilePos, u32 layer);
extern u32 GiveItem(u32, u32);
extern bool32 LoadFixedGFX(Entity*, u32);
extern void LoadResources(void);
@@ -45,6 +45,8 @@ extern void TryLoadPrologueHyruleTown(void);
extern void UnloadGFXSlots(Entity*);
extern void UnloadOBJPalette(Entity*);
extern void UpdateDisplayControls(void);
+extern void ClearBgAnimations(void);
+extern void SetBGDefaults(void);
// Unidentified
extern void sub_08000148(u32, u32, u32);
@@ -90,7 +92,7 @@ extern void sub_08057688(void);
extern void sub_080580B0(u32);
extern void sub_08058324(u32);
extern void sub_08059278(void);
-extern void sub_0805B4D0(u32);
+extern void LoadStaticBackground(u32);
extern void sub_0805BC4C(void);
extern void sub_0805EC60(Entity*);
extern void InitPlayerMacro(PlayerMacroEntry*);
diff --git a/include/game.h b/include/game.h
index e3d9922e..0bdc45e2 100644
--- a/include/game.h
+++ b/include/game.h
@@ -3,6 +3,7 @@
#include "global.h"
#include "area.h"
+#include "structures.h"
/**
* Change the light level of the room.
@@ -83,7 +84,10 @@ u32 AreaAllowsWarp(void);
void sub_08052878(void);
#endif
-void sub_080526F8(s32 a1);
+/**
+ * Modify the number of keys the player has for the current dungeon.
+ */
+void ModDungeonKeys(s32 keys);
/**
* Check if the current dungeon has a map item.
@@ -295,4 +299,60 @@ typedef struct {
} struct_08127F94;
extern struct_08127F94 gUnk_08127F94[];
+typedef struct {
+ const Font* font;
+ u16 width;
+ u16 height;
+ u16 transitionTimer;
+ u16 fadeSpeed;
+} struct_080FCCB4;
+
+typedef struct {
+ u16 itemPrice;
+ u16 unused;
+ u16 saleItemConfirmMessageId;
+ u16 gotItemMessageId;
+} struct_080FD964;
+extern const struct_080FD964 gUnk_080FD964[];
+
+// Defined in gameUtils.c
+extern void ResetTmpFlags(void);
+extern void UpdateFakeScroll(void);
+extern void UpdatePlayerMapCoords(void);
+extern void CreateMiscManager(void);
+extern void CheckAreaDiscovery(void);
+extern void UpdateTimerCallbacks(void);
+extern void DecreasePortalTimer(void);
+extern bool32 CheckRoomExit(void);
+extern bool32 CheckGameOver(void);
+extern void InitializePlayer(void);
+extern void LoadRoomBgm(void);
+extern void sub_0805329C(void);
+extern void UpdatePlayerRoomStatus(void);
+extern void sub_08054524(void);
+extern void sub_08052FF4(u32 area, u32 room);
+extern void InitScriptData(void);
+extern void LoadItemGfx(void);
+
+// Defined in playerUtils.c
+extern void CloneMapData(void);
+extern void InitializeCamera(void);
+extern void ForceSetPlayerState(u32);
+
+extern void sub_080186D4(void);
+extern void sub_0806F364(void);
+extern void UpdateRoomTracker(void);
+extern void GenerateAreaHint(void);
+extern void sub_0801AE44(bool32 loadGfx);
+extern void sub_080ADE24(void);
+extern void CleanUpGFXSlots(void);
+void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4);
+extern void UpdateBgAnimations(void);
+extern void UpdateScroll(void);
+extern void sub_08018710(u32);
+extern void sub_0806F38C(void);
+extern void sub_08052010(void);
+void ModArrows(s32);
+bool32 ItemIsBottle(u32);
+void ModShells(s32);
#endif // GAME_H
diff --git a/include/global.h b/include/global.h
index 08ef97f4..6126b24a 100644
--- a/include/global.h
+++ b/include/global.h
@@ -4,6 +4,9 @@
/**
* @defgroup Tasks Tasks
* @defgroup Subtasks Subtasks
+ * @brief Subtasks override the game task for short periods.
+ * @defgroup WorldEvents World Events
+ * @brief Cutscenes that happen after a kinstone fusion.
*/
/**
@@ -18,7 +21,7 @@
* @defgroup NPCs NPCs
* @defgroup Items Items
* @defgroup Managers Managers
- * @brief Entities with a smaller footprint of 0x40 bytes
+ * @brief Entities with a smaller footprint of 0x40 bytes.
*/
///@}
@@ -99,6 +102,11 @@ typedef union {
} HALF;
} Coords;
+typedef struct {
+ s8 x;
+ s8 y;
+} PACKED Coords8;
+
union SplitWord {
s32 WORD;
u32 WORD_U;
diff --git a/include/hitbox.h b/include/hitbox.h
index bf0916f0..b9cb5ec8 100644
--- a/include/hitbox.h
+++ b/include/hitbox.h
@@ -22,40 +22,36 @@ extern const Hitbox gHitbox_15;
extern const Hitbox gHitbox_16;
extern const Hitbox gHitbox_17;
extern const Hitbox gHitbox_18;
-extern const Hitbox gHitbox_19;
+extern const Hitbox3D gHitbox_19;
extern const Hitbox gHitbox_20;
extern const Hitbox gHitbox_21;
extern const Hitbox gHitbox_22;
extern const Hitbox gHitbox_23;
extern const Hitbox gHitbox_24;
-extern const Hitbox gHitbox_25;
-extern const Hitbox gHitbox_26;
+extern const Hitbox3D gHitbox_25;
+extern const Hitbox3D gHitbox_26;
extern const Hitbox gHitbox_27;
-extern const Hitbox gHitbox_28;
+extern const Hitbox3D gHitbox_28;
extern const Hitbox gHitbox_29;
extern const Hitbox gHitbox_30;
extern const Hitbox gHitbox_31;
extern const Hitbox gHitbox_32;
+extern const Hitbox gUnk_080FD178;
extern const Hitbox gUnk_080FD190;
-extern const Hitbox gUnk_080FD1A8;
-extern const Hitbox gUnk_080FD1A8;
-extern const Hitbox gUnk_080FD1A8;
-extern const Hitbox gUnk_080FD1A8;
+extern const Hitbox3D gUnk_080FD1A8;
extern const Hitbox gUnk_080FD1B4;
extern const Hitbox gUnk_080FD1D4;
extern const Hitbox gUnk_080FD1DC;
extern const Hitbox gUnk_080FD1E4;
-extern const Hitbox gUnk_080FD1E4;
extern const Hitbox gUnk_080FD1EC;
extern const Hitbox gUnk_080FD1F4;
-extern const Hitbox gUnk_080FD1F4;
extern const Hitbox gUnk_080FD1FC;
extern const Hitbox gUnk_080FD204;
extern const Hitbox gUnk_080FD20C;
extern const Hitbox gUnk_080FD214;
extern const Hitbox gUnk_080FD21C;
extern const Hitbox gUnk_080FD224;
-extern const Hitbox gUnk_080FD22C;
+extern const Hitbox3D gUnk_080FD22C;
extern const Hitbox gUnk_080FD238;
extern const Hitbox gUnk_080FD240;
extern const Hitbox gUnk_080FD248;
@@ -64,6 +60,7 @@ extern const Hitbox gUnk_080FD260;
extern const Hitbox gUnk_080FD270;
extern const Hitbox gUnk_080FD278;
extern const Hitbox gUnk_080FD280;
+extern const Hitbox gUnk_080FD288;
extern const Hitbox gUnk_080FD290;
extern const Hitbox gUnk_080FD298;
extern const Hitbox gUnk_080FD2A0;
@@ -71,21 +68,19 @@ extern const Hitbox gUnk_080FD2A8;
extern const Hitbox gUnk_080FD2D0;
extern const Hitbox gUnk_080FD2D8;
extern const Hitbox gUnk_080FD2E0;
+extern const Hitbox gUnk_080FD2E8;
extern const Hitbox gUnk_080FD2F0;
extern const Hitbox gUnk_080FD308;
extern const Hitbox gUnk_080FD310;
extern const Hitbox gUnk_080FD320;
extern const Hitbox gUnk_080FD328;
extern const Hitbox gUnk_080FD330;
-extern const Hitbox gUnk_080FD340;
-extern const Hitbox gUnk_080FD340;
+extern const Hitbox3D gUnk_080FD340;
extern const Hitbox gUnk_080FD34C;
extern const Hitbox gUnk_080FD354;
extern const Hitbox gUnk_080FD35C;
-extern const Hitbox gUnk_080FD35C;
extern const Hitbox gUnk_080FD364;
extern const Hitbox gUnk_080FD36C;
-extern const Hitbox gUnk_080FD36C;
extern const Hitbox gUnk_080FD374;
extern const Hitbox gUnk_080FD37C;
extern const Hitbox gUnk_080FD384;
@@ -102,13 +97,13 @@ extern const Hitbox gUnk_080FD3DC;
extern const Hitbox gUnk_080FD3E4;
extern const Hitbox gUnk_080FD3EC;
extern const Hitbox gUnk_080FD3F4;
-extern const Hitbox gUnk_080FD3FC;
+extern const Hitbox3D gUnk_080FD3FC;
extern const Hitbox gUnk_080FD408;
extern const Hitbox gUnk_080FD41C;
extern const Hitbox gUnk_080FD424;
extern const Hitbox gUnk_080FD42C;
extern const Hitbox gUnk_080FD434;
-extern const Hitbox gUnk_080FD43C;
+extern const Hitbox3D gUnk_080FD43C;
extern const Hitbox gUnk_080FD450;
extern const Hitbox gUnk_080FD488;
extern const Hitbox gUnk_080FD490;
@@ -127,8 +122,7 @@ extern const Hitbox gUnk_080FD510;
extern const Hitbox gUnk_080FD518;
extern const Hitbox gUnk_080FD520;
extern const Hitbox gUnk_080FD530;
-extern const Hitbox gUnk_080FD538;
-extern const Hitbox gUnk_080FD538;
+extern const Hitbox3D gUnk_080FD538;
extern const Hitbox gUnk_080FD544;
extern const Hitbox gUnk_080FD558;
extern const Hitbox gUnk_080FD560;
diff --git a/include/itemMetaData.h b/include/itemMetaData.h
index fca0ef69..761d5d22 100644
--- a/include/itemMetaData.h
+++ b/include/itemMetaData.h
@@ -28,7 +28,7 @@ typedef enum {
typedef struct ItemMetaData {
u8 menuSlot;
u8 unk1;
- u8 unk2;
+ u8 unk2; // parameter? number of bombs, type of dungeon item
u8 unk3; // flags? bit 0x2 makes pickup cutscene appear every time
u8 textId;
u8 textCategory;
diff --git a/include/kinstone.h b/include/kinstone.h
index 663b5347..f8073cf4 100644
--- a/include/kinstone.h
+++ b/include/kinstone.h
@@ -10,7 +10,7 @@ typedef struct {
u8 _0;
u8 action;
u8 _2;
- u8 _3;
+ u8 kinstoneId;
u8 prevUpdatePriority;
u8 _5;
u16 textIndex;
@@ -22,16 +22,17 @@ static_assert(sizeof(FuseInfo) == 0x10);
extern FuseInfo gFuseInfo;
typedef struct {
- u8 unk0;
+ u8 objPalette;
u8 unk1;
u8 unk2;
- u8 unk3;
- u8 evt_type;
+ u8 subtask; // SUBTASK_WORLDEVENT or 0
+ u8 worldEventId;
u8 unk5;
u8 unk6;
- u8 unk7;
-} struct_080C9CBC;
-extern const struct_080C9CBC gUnk_080C9CBC[];
+ u8 unk7; // TODO flag if it shows a map hint?
+} KinstoneWorldEvent;
+// Indexed by kinstoneId
+extern const KinstoneWorldEvent gKinstoneWorldEvents[];
typedef enum {
KINSTONE_0,
@@ -130,7 +131,7 @@ typedef enum {
KINSTONE_5D,
KINSTONE_5E,
KINSTONE_5F,
-} KinstoneFlag;
+} KinstoneId;
typedef struct {
u8 unk0; /**< Bank or 0xfd or 0xfe or 0xff */
@@ -139,4 +140,79 @@ typedef struct {
u8 unk3; /**< Offset on the gfx id? */
} struct_gUnk_080B3D20;
+enum {
+ WORLD_EVENT_0,
+ WORLD_EVENT_1,
+ WORLD_EVENT_2,
+ WORLD_EVENT_3,
+ WORLD_EVENT_4,
+ WORLD_EVENT_5,
+ // TODO add all and use them in gKinstoneWorldEvents
+} worldEventId;
+
+enum {
+ CND_0,
+ /**< Always false. */ // CND_FALSE
+ CND_1, // local flag // CND_FLAG
+ CND_2, // f CND_INVENTORY != 0
+ CND_3, // 0x10 CND_INVENTORY == 1
+ CND_4, // 0x11 CND_INVENTORY == 2
+ CND_5, // SORA_10_H00
+ CND_6, // SORA_11_H00
+ CND_7, // SORA_12_T00
+ CND_8, // SORA_13_H00
+ CND_9, // SORA_14_T00
+ CND_10, // KS_B15
+} WorldEvent_Condition;
+
+enum {
+ WORLD_EVENT_TYPE_0, // Does nothing
+ WORLD_EVENT_TYPE_1, // LoadRoomEntity after checking GlobalFlag
+ WORLD_EVENT_TYPE_2, // sub_08018BB4
+ WORLD_EVENT_TYPE_3, // LoadRoomEntity after checking InventoryValue
+ WORLD_EVENT_TYPE_4, // sub_08018A58
+ WORLD_EVENT_TYPE_5, // sub_08018B50
+ WORLD_EVENT_TYPE_6, // sub_08018AB4
+ WORLD_EVENT_TYPE_7, // LoadRoomEntity or sub_080189EC
+ WORLD_EVENT_TYPE_8, // set a tile type
+ WORLD_EVENT_TYPE_9, // LoadRoomEntity and set some tile type
+ WORLD_EVENT_TYPE_BEANSTALK,
+ WORLD_EVENT_TYPE_11, // LoadRoomEntity and set gRoomVars.field_0x8c
+ WORLD_EVENT_TYPE_12,
+ WORLD_EVENT_TYPE_13,
+ WORLD_EVENT_TYPE_14,
+ WORLD_EVENT_TYPE_15, // Load different room entity depending on if fused
+ WORLD_EVENT_TYPE_16,
+ WORLD_EVENT_TYPE_17, // Set local flag, LoadroomEntityList
+ WORLD_EVENT_TYPE_18,
+ WORLD_EVENT_TYPE_19,
+ WORLD_EVENT_TYPE_20,
+ WORLD_EVENT_TYPE_21,
+ WORLD_EVENT_TYPE_22,
+ WORLD_EVENT_TYPE_23,
+ WORLD_EVENT_TYPE_24, // LoadRoomEntityList
+ WORLD_EVENT_TYPE_25, // LoadRoomEntity, set type depending of if kinstone is fused
+ // The following do nothing.
+ WORLD_EVENT_TYPE_26,
+ WORLD_EVENT_TYPE_27,
+ WORLD_EVENT_TYPE_28
+} WorldEventType;
+
+typedef struct {
+ u8 type;
+ u8 entity_idx;
+ u8 area;
+ u8 room;
+ u16 offsetX; /**< Scroll offset X from the room origin. */
+ u16 offsetY; /**< Scroll offset Y from the room origin. */
+ u16 x; /**< X position of the actual event. */
+ u16 y; /**< Y position of the actual event. */
+ u16 _c; // see sub_080A6A80, related to _0 and _2 of gUnk_08127F94
+ u16 _e; // see sub_080A6A80, related to _1 and _3 of gUnk_08127F94
+ u8 condition; // TODO some sort of flag determining what type the bank&flag are? see sub_0801E8D4
+ u8 bank; /**< @see LocalBanks */
+ u16 flag;
+} WorldEvent;
+extern const WorldEvent gWorldEvents[];
+
#endif // KINSTONE_H
diff --git a/include/menu.h b/include/menu.h
index 04501df6..0aab144a 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -126,4 +126,6 @@ extern Menu gMenu;
#define gFigurineMenu (*(FigurineMenu*)&gMenu)
#define gPauseMenu (*(PauseMenu*)&gMenu)
+extern u8 gUpdateVisibleTiles;
+
#endif // MENU_H
diff --git a/include/pauseMenu.h b/include/pauseMenu.h
new file mode 100644
index 00000000..1197b2f3
--- /dev/null
+++ b/include/pauseMenu.h
@@ -0,0 +1,43 @@
+#ifndef PAUSEMENU_H
+#define PAUSEMENU_H
+
+#include "subtask.h"
+
+Subtask PauseMenu_Variant0;
+Subtask PauseMenu_Variant1;
+Subtask PauseMenu_Variant2;
+Subtask PauseMenu_Variant3;
+Subtask PauseMenu_Variant4;
+Subtask PauseMenu_Variant5;
+
+Subtask PauseMenu_ItemMenu;
+Subtask PauseMenu_ItemMenu_Draw;
+Subtask PauseMenu_ItemMenu_Init;
+Subtask PauseMenu_ItemMenu_Update;
+
+Subtask PauseMenu2;
+
+typedef enum {
+ PauseMenuScreen_0,
+ PauseMenuScreen_1, // Items
+ PauseMenuScreen_2, // Quest Status
+ PauseMenuScreen_3,
+ PauseMenuScreen_4, // Map
+ PauseMenuScreen_5,
+ PauseMenuScreen_6, // Map Detail
+ PauseMenuScreen_7, // Kinstone Pieces
+ PauseMenuScreen_8, // Sword Techniques
+ PauseMenuScreen_9,
+ PauseMenuScreen_10,
+ PauseMenuScreen_11,
+ PauseMenuScreen_12,
+ PauseMenuScreen_13,
+ PauseMenuScreen_14,
+ PauseMenuScreen_15,
+ PauseMenuScreen_16,
+ PauseMenuScreen_17,
+ PauseMenuScreen_18,
+ PauseMenuScreen_19,
+} PauseMenuScreen;
+
+#endif // PAUSEMENU_H
diff --git a/include/player.h b/include/player.h
index 59054cd1..e0cbdcfc 100644
--- a/include/player.h
+++ b/include/player.h
@@ -398,9 +398,9 @@ typedef struct {
extern void (*const gPlayerItemFunctions[])(Entity*);
-extern u8 gBombBagSizes[];
-extern u8 gQuiverSizes[];
-extern u16 gWalletSizes[];
+extern const s16 gWalletSizes[];
+extern const u8 gBombBagSizes[];
+extern const u8 gQuiverSizes[];
extern Entity* gPlayerClones[];
extern PlayerState gPlayerState;
@@ -541,7 +541,7 @@ extern void sub_08008AC6(Entity*);
extern void sub_08008AA0(Entity*);
// zelda.c
-void SetZeldaFollowTarget(Entity*);
+void SetZeldaFollowTarget(Entity* target);
#define COPY_FLAG_FROM_TO(base, src, dest) (base) = ((base) & ~(dest)) | (((dest) * ((base) & (src))) / src)
diff --git a/include/room.h b/include/room.h
index d5cc5c81..0da81c3e 100644
--- a/include/room.h
+++ b/include/room.h
@@ -25,30 +25,33 @@ enum RoomReloadType {
typedef struct {
/*0x00*/ u16 reload_flags;
- /*0x02*/ u8 unk3;
- /*0x03*/ u8 unk4;
+ /*0x02*/ u8 scrollAction;
+ /*0x03*/ u8 scrollSubAction;
/*0x04*/ u8 area;
/*0x05*/ u8 room;
/*0x06*/ u16 origin_x;
/*0x08*/ u16 origin_y;
/*0x0A*/ s16 scroll_x;
/*0x0C*/ s16 scroll_y;
- /*0x0E*/ u8 unk5;
+ /*0x0E*/ u8 scrollSpeed; /**< Pixels per frame that the camera can scroll. */
/*0x0F*/ u8 scroll_flags; // 0x2 = ??, 0x4 = camera scrolling
/*0x10*/ u8 scroll_direction;
/*0x11*/ s8 oam_offset_x;
/*0x12*/ s8 oam_offset_y;
- /*0x13*/ u8 unk13;
+ /*0x13*/ u8 unk_13;
/*0x14*/ u8 shake_magnitude;
- /*0x15*/ u8 unk7;
+ /*0x15*/ u8 unk_15;
/*0x16*/ u16 shake_duration;
- /*0x18*/ u16 filler2[3];
+ /*0x18*/ u16 unk_18; // progress during transition in same area?
+ /*0x1A*/ u16 unk_1a; // calculated from unk_18
+ /*0x1C*/ u16 unk_1c; // 0, 0xff
/*0x1E*/ u16 width;
/*0x20*/ u16 height;
- /*0x22*/ u16 filler3;
+ /*0x22*/ u16 unk_22; // so far always 0xffff
/*0x24*/ s8 aff_x;
/*0x25*/ s8 aff_y;
- /*0x26*/ u8 filler26[2];
+ /*0x26*/ u8 unk_26;
+ /*0x27*/ u8 unk_27;
/*0x28*/ union SplitWord bg3OffsetX;
/*0x2C*/ union SplitWord bg3OffsetY;
/*0x30*/ Entity* camera_target;
@@ -220,7 +223,7 @@ typedef enum {
extern void** gCurrentRoomProperties;
-void SetTileType(u32, u32, u32);
+void SetTileType(u32 tileType, u32 position, u32 layer);
void InitScreenShake(u32 time, u32 magnitude);
void CallRoomProp5And7(void);
@@ -230,6 +233,7 @@ void* GetCurrentRoomProperty(u32);
void LoadRoomTileEntities();
Entity* LoadRoomEntity(const EntityData*);
void LoadRoomEntityList(const EntityData* listPtr);
+void* GetRoomProperty(u32 area, u32 room, u32 property);
bool32 LoadFixedGFX(Entity*, u32);
void UnloadGFXSlots(Entity*);
diff --git a/include/save.h b/include/save.h
index 2a188366..5fe9c04b 100644
--- a/include/save.h
+++ b/include/save.h
@@ -39,7 +39,7 @@ typedef struct {
/*0x003*/ u8 brightness; /**< Brightness. */
/*0x004*/ u8 filler4[0x2];
/*0x006*/ u8 saw_staffroll;
- /*0x007*/ u8 unk7;
+ /*0x007*/ u8 unk7; // TODO rolling barrel state?
/*0x008*/ u8 global_progress; /**< @see UpdateGlobalProgress */
/*0x009*/ u8 field_0x9[0x17];
/*0x020*/ u16 field_0x20;
@@ -55,19 +55,19 @@ typedef struct {
/*0x088*/ PlayerRoomStatus saved_status; /**< Player room status. */
/*0x0A8*/ Stats stats; /**< Player stats. */
/*0x0D0*/ u8 fillerD0[34];
- u8 inventory[36];
+ /*0x0F2*/ u8 inventory[36];
/*0x116*/ u8 didAllFusions;
- /*0x117*/ u8 unk117;
- /*0x118*/ u8 unk118[0x13];
- /*0x12B*/ u8 unk12B[0x16];
- /*0x141*/ u8 unk141[128];
- /*0x1C1*/ u8 unk1C1[128];
- /*0x241*/ u8 unk241[13];
- /*0x24E*/ u8 unk24E[14];
- /*0x25C*/ u8 flags[0x200]; /**< Flags. */
- /*0x45C*/ u8 unk45C[0x10];
- /*0x46C*/ u8 unk46C[0x10];
- /*0x46C*/ u8 unk47C[0x10];
+ /*0x117*/ u8 fusedKinstoneCount;
+ /*0x118*/ u8 unk118[0x13]; // TODO also related to kinstones
+ /*0x12B*/ u8 unk12B[0x16]; // TODO also related to kinstones
+ /*0x141*/ u8 unk141[128]; // TODO sub_08064F28 and also the goddesses, indexed by sub_08002632
+ /*0x1C1*/ u8 unk1C1[128]; // TODO also related to kinstones, see sub_0801E6C8 0x80 available kinstone fusions?
+ /*0x241*/ u8 fusedKinstones[13]; /**< Bitfield for fused kinstones. @see CheckKinstoneFused */
+ /*0x24E*/ u8 unk24E[14]; // TODO something else with kinstones @see sub_0801E810
+ /*0x25C*/ u8 flags[0x200]; /**< Flags. */
+ /*0x45C*/ u8 dungeonKeys[0x10]; // TODO Indexed by dungeon id, keys per dungeon
+ /*0x46C*/ u8 dungeonItems[0x10]; // TODO items in the dungeon. 4: compass, 2: big key, 1: small key
+ /*0x46C*/ u8 dungeonWarps[0x10]; // TODO indexed by dungeon id, EnableDungeonWarp, IsDungeonWarpActive
/*0x48C*/ u32 timers[7];
/*0x4A8*/ u32 demo_timer; /**< Demo timer. */
/*0x4AC*/ u8 filler4ac[0x8];
diff --git a/include/script.h b/include/script.h
index a040b755..c6e41f17 100644
--- a/include/script.h
+++ b/include/script.h
@@ -11,8 +11,10 @@ enum SetMessageValueIndex {
SMV_FIELD_0X1C,
};
+typedef u16 Script;
+
typedef struct ScriptExecutionContext {
- /*0x00*/ u16* scriptInstructionPointer;
+ /*0x00*/ Script* scriptInstructionPointer;
/*0x04*/ u32 intVariable;
/*0x08*/ u32 postScriptActions;
/*0x0C*/ u8 unk_0C[0x4]; // unused
@@ -47,18 +49,19 @@ extern u32 GetNextScriptCommandWordAfterCommandMetadata(u16*);
extern u32 GetNextScriptCommandHalfwordAfterCommandMetadata(u16*);
void UnloadCutsceneData(Entity* entity);
-void StartPlayerScript(u16*);
+void StartPlayerScript(Script* script);
void sub_0807DD50(Entity* entity);
void sub_0807DD64(Entity* entity);
-void sub_0807DD80(Entity* entity, u16* script);
+void sub_0807DD80(Entity* entity, Script* script);
void sub_0807DEDC(Entity*, ScriptExecutionContext*, u32, u32);
-ScriptExecutionContext* StartCutscene(Entity* entity, u16* script);
+ScriptExecutionContext* StartCutscene(Entity* entity, Script* script);
void ExecuteScriptForEntity(Entity* entity, void (*postScriptCallback)(Entity*, ScriptExecutionContext*));
void HandlePostScriptActions(Entity* entity, ScriptExecutionContext* context);
void HandleEntity0x82Actions(Entity* entity);
void sub_0807DD94(Entity*, void (*function)(Entity*, ScriptExecutionContext*));
ScriptExecutionContext* CreateScriptExecutionContext(void);
-void InitScriptForEntity(Entity* entity, ScriptExecutionContext* context, u16* script);
+void InitScriptForEntity(Entity* entity, ScriptExecutionContext* context, Script* script);
+
#endif // SCRIPT_H
diff --git a/include/structures.h b/include/structures.h
index d9339a7f..8de98b91 100644
--- a/include/structures.h
+++ b/include/structures.h
@@ -106,9 +106,9 @@ typedef struct {
u8 unk_c;
u8 unk_d;
u16 rupees;
- u8 unk_10;
+ u8 unk_10; // TODO drawing keys dirty flag or something?
u8 unk_11;
- u8 unk_12;
+ u8 dungeonKeys;
s8 unk_13;
s8 unk_14;
u8 unk_15;
@@ -200,19 +200,21 @@ typedef struct {
} PriorityHandler;
extern PriorityHandler gPriorityHandler;
-extern struct {
+typedef struct {
u8 disabled;
- u8 unk1;
- u8 unk2[0xf];
+ u8 screen;
+ u8 unk2[0xf]; // cursor positions on the different screens
u8 unk11;
u8 unk12;
u8 unk13;
- s8 unk14;
+ s8 screen2;
u8 unk15;
s8 unk16;
u8 unk17;
-} gPauseMenuOptions;
-static_assert(sizeof(gPauseMenuOptions) == 0x18);
+} PauseMenuOptions;
+
+extern PauseMenuOptions gPauseMenuOptions;
+static_assert(sizeof(PauseMenuOptions) == 0x18);
typedef struct {
u8 unk00 : 1;
@@ -268,7 +270,7 @@ typedef struct {
typedef struct {
/*0x00*/ u8 unk_0;
/*0x01*/ u8 unk_1;
- /*0x02*/ u8 unk_2;
+ /*0x02*/ u8 unk_2; // TODO kinstoneId, sub_0801DFB4
/*0x03*/ u8 unk_3;
/*0x04*/ u8* unk_4;
/*0x08*/ struct_03003DF8 array[0x20];
@@ -345,4 +347,15 @@ typedef struct {
static_assert(sizeof(ItemDefinition) == 0xc);
+typedef struct {
+ u8 frame;
+ u8 frameIndex;
+} PACKED FrameStruct;
+
+typedef struct {
+ s8 x;
+ s8 y;
+ s8 width;
+ s8 height;
+} Rect;
#endif // STRUCTURES_H
diff --git a/include/subtask.h b/include/subtask.h
index 3a2fc5b8..73bf9bb9 100644
--- a/include/subtask.h
+++ b/include/subtask.h
@@ -2,6 +2,8 @@
#define SUBTASK_H
#include "global.h"
+#include "game.h"
+#include "room.h"
/** Subtasks override the game task for short periods */
typedef enum {
@@ -44,11 +46,75 @@ extern void sub_080A4D34(void);
extern void sub_080A4E90(u8);
extern void sub_080A4E84(u8);
-extern const struct {
+typedef struct {
u8 unk0;
u8 unk1;
// u8 pad[2];
void (*func)(void);
-} gUnk_08128A38[];
+} struct_08128A38;
+extern const struct_08128A38 gUnk_08128A38[];
+
+typedef struct {
+ u8 item;
+ u8 unk1;
+ u8 frameIndex;
+ u8 unk3;
+ u8 unk4;
+ s8 unk5;
+ u16 textIndex;
+} struct_gUnk_08128D70;
+
+extern const struct_gUnk_08128D70 gUnk_08128D70[];
+
+typedef struct {
+ u8 frameIndex;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u16 unk4;
+ u16 unk6;
+} struct_gUnk_08128F58;
+
+extern struct_gUnk_08128F58 gUnk_08128F58[];
+
+// Functions used in world events.
+extern void sub_08055B70(u32 param_1, u32 param_2, u32 param_3, u32 param_4);
+extern void sub_0801876C(u32, u32);
+extern void sub_080553E0(u32);
+extern void sub_08054974(u32, u32);
+extern void sub_0804B0E8(u32, u32);
+
+// Functions used in subtasks.
+void sub_080A4DB8(u32);
+void sub_080A6290(void);
+void sub_080A66D0();
+void sub_080A67C4(u32);
+void sub_080A6FB4(u32, u32);
+void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4);
+u32 sub_080A6F40();
+s32 sub_080A69E0();
+struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2);
+void sub_080A6498(void);
+void sub_080A71F4(const ScreenTransitionData* exitTransition);
+void sub_080A6F6C(u32 textIndexOrPtr);
+
+typedef struct {
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ s8 unk5;
+ u8 unk6;
+ u8 unk7;
+} struct_gUnk_08128E94;
+
+extern const struct_gUnk_08128E94 gUnk_08128E94[];
+
+#ifdef EU
+#define DRAW_DIRECT_SPRITE_INDEX 0x1fa
+#else
+#define DRAW_DIRECT_SPRITE_INDEX 0x1fb
+#endif
#endif // SUBTASK_H
diff --git a/include/subtask2.h b/include/subtask2.h
new file mode 100644
index 00000000..46ba1e2c
--- /dev/null
+++ b/include/subtask2.h
@@ -0,0 +1,12 @@
+#ifndef SUBTASK2_H
+#define SUBTASK2_H
+
+void PauseMenu_Screen_4(void);
+void PauseMenu_Screen_5(void);
+void PauseMenu_Screen_6(void);
+void PauseMenu_Screen_7(void);
+void PauseMenu_Screen_8(void);
+void PauseMenu_Screen_9(void);
+void PauseMenu_Screen_10(void);
+
+#endif // SUBTASK2_H