diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2022-09-05 22:50:19 +0200 |
|---|---|---|
| committer | anonymous <> | 2022-10-08 22:32:54 +0200 |
| commit | 67467fd831d2928715835f8a389b4f464a0f9a7a (patch) | |
| tree | 261864c07f334c35024033a908b4af8e808caebe /include | |
| parent | 756a8a89da46dade06fad1723de88fa5a82cc2ec (diff) | |
Extract some data
And split up subtasks and world events.
Diffstat (limited to 'include')
| -rw-r--r-- | include/beanstalkSubtask.h | 6 | ||||
| -rw-r--r-- | include/color.h | 2 | ||||
| -rw-r--r-- | include/common.h | 19 | ||||
| -rw-r--r-- | include/cutscene.h | 23 | ||||
| -rw-r--r-- | include/enemyUtils.h | 11 | ||||
| -rw-r--r-- | include/enterPortalSubtask.h | 11 | ||||
| -rw-r--r-- | include/entity.h | 6 | ||||
| -rw-r--r-- | include/figurineMenu.h | 32 | ||||
| -rw-r--r-- | include/fileselect.h | 3 | ||||
| -rw-r--r-- | include/functions.h | 8 | ||||
| -rw-r--r-- | include/game.h | 62 | ||||
| -rw-r--r-- | include/global.h | 10 | ||||
| -rw-r--r-- | include/hitbox.h | 32 | ||||
| -rw-r--r-- | include/itemMetaData.h | 2 | ||||
| -rw-r--r-- | include/kinstone.h | 92 | ||||
| -rw-r--r-- | include/menu.h | 2 | ||||
| -rw-r--r-- | include/pauseMenu.h | 43 | ||||
| -rw-r--r-- | include/player.h | 8 | ||||
| -rw-r--r-- | include/room.h | 22 | ||||
| -rw-r--r-- | include/save.h | 26 | ||||
| -rw-r--r-- | include/script.h | 13 | ||||
| -rw-r--r-- | include/structures.h | 31 | ||||
| -rw-r--r-- | include/subtask.h | 70 | ||||
| -rw-r--r-- | include/subtask2.h | 12 |
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 |
