diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/functions.h | 108 | ||||
| -rw-r--r-- | include/regs.h | 2 | ||||
| -rw-r--r-- | include/z64.h | 2 | ||||
| -rw-r--r-- | include/z64interface.h | 2 | ||||
| -rw-r--r-- | include/z64map.h | 137 | ||||
| -rw-r--r-- | include/z64pause_menu.h | 2 | ||||
| -rw-r--r-- | include/z64save.h | 152 | ||||
| -rw-r--r-- | include/z64scene.h | 144 |
8 files changed, 305 insertions, 244 deletions
diff --git a/include/functions.h b/include/functions.h index b9e5b8e51..eb6aadf29 100644 --- a/include/functions.h +++ b/include/functions.h @@ -226,114 +226,6 @@ void GetItem_Draw(PlayState* play, s16 drawId); u16 QuestHint_GetTatlTextId(PlayState* play); -// void func_80102E40(void); -// void func_80102E90(void); -// void func_80102EA4(void); -void func_80102EB4(u32 param_1); -void func_80102ED0(u32 param_1); -s32 func_80102EF0(PlayState* play); -// void func_80102F9C(void); -// void func_80103090(void); -// void func_801030B4(void); -// void func_801030F4(void); -// void func_801031D0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -// void func_801039EC(void); -// void func_80103A10(void); -// void func_80103A58(void); -// void func_8010439C(void); -// void func_801045AC(void); -// void func_80104AE8(void); -// void func_80104C80(void); -void func_80104CF4(PlayState* play); -// void func_80104F34(void); -s32 func_80105294(void); -s16 func_80105318(void); -// void func_80105328(void); -// void func_8010534C(void); -void func_8010549C(PlayState* play, void* segmentAddress); -void func_8010565C(PlayState* play, u8 num, void* segmentAddress); -void func_80105818(PlayState* play, u32 uParm2, TransitionActorEntry* puParm3); -void func_80105A40(PlayState* play); -void func_80105B34(PlayState* play); -void func_80105C40(s16 arg0); -// void func_80105FE0(void); -// void func_80106408(void); -// void func_80106450(void); -// void func_801064CC(void); -s32 func_80106530(PlayState* play); -// void func_8010657C(void); -void func_80106644(PlayState* play, s16 arg1, s16 arg2, s16 arg3); -// void func_8010683C(void); -// void func_801068B4(void); -// void func_801068D8(void); -void* func_801068FC(PlayState* play, void* arg1, size_t size); -// void func_80106BEC(void); -// void func_80106D08(void); -// void func_80106D5C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -// void func_80107B78(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -// void func_80108124(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -// void func_80108558(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -// void func_80108A10(void); -// void func_80108A64(void); -void func_80108AF8(PlayState* play); -s32 func_801090B0(s32 arg0); -s32 func_80109124(s16 arg0); -void func_801091F0(PlayState* play); -void func_80109428(PlayState* play); -// void func_801094A0(void); -// void func_801094C8(void); -// void func_801094F8(void); -// void func_80109528(void); -// void func_8010954C(void); -// void func_8010956C(void); -// void func_8010958C(void); -// void func_801095AC(void); -// void func_801095DC(void); -// void func_8010960C(void); -// void func_80109630(void); -// void func_80109650(void); -// void func_80109670(void); -// void func_801096D4(void); -// void func_80109714(void); -// void func_80109754(void); -// void func_801097C8(void); -// void func_8010983C(void); -// void func_801098A0(void); -// void func_80109908(void); -// UNK_TYPE4 func_80109964(s32 param_1); -// void func_8010997C(void); -// void func_801099AC(void); -// void func_801099DC(void); -// void func_80109A00(void); -// void func_80109A20(void); -// void func_80109A40(void); -// void func_80109A98(void); -// void func_80109AD8(void); -// void func_80109B38(void); -// void func_80109BA0(void); -// void func_80109BF4(void); -// void func_80109C38(void); -// void func_80109CBC(void); -// void func_80109D40(void); -// void func_80109DD8(void); -// void func_80109E70(void); -// void func_80109EF8(void); -// void func_80109F78(void); -s32 Map_GetDungeonOrBossAreaIndex(PlayState* play); -s32 Map_IsInDungeonOrBossArea(PlayState* play); -s32 func_8010A0A4(PlayState* play); -// void Map_GetDungeonAreaIndex(PlayState* play); -// void Map_IsInDungeonArea(PlayState* play); -// void Map_GetBossAreaIndex(PlayState* play); -// void Map_IsInBossArea(PlayState* play); -// void func_8010A238(PlayState* play); -// void func_8010A2AC(PlayState* play); -void Minimap_SavePlayerRoomInitInfo(PlayState* play); -void Map_InitRoomData(PlayState* play, s16 room); -void Map_Destroy(PlayState* play); -void Map_Init(PlayState* play); -void Minimap_Draw(PlayState* play); -void Map_Update(PlayState* play); f32 OLib_Vec3fDist(Vec3f* a, Vec3f* b); f32 OLib_Vec3fDistOutDiff(Vec3f* a, Vec3f* b, Vec3f* dest); f32 OLib_Vec3fDistXZ(Vec3f* a, Vec3f* b); diff --git a/include/regs.h b/include/regs.h index ea0a85387..a8a584fcc 100644 --- a/include/regs.h +++ b/include/regs.h @@ -146,7 +146,7 @@ extern RegEditor* gRegEditor; #define R_MOON_CRASH_TIMER_X XREG(81) #define R_PAUSE_OWL_WARP_ALPHA XREG(87) #define R_STORY_FILL_SCREEN_ALPHA XREG(91) -#define R_REVERSE_FLOOR_INDEX XREG(94) +#define R_PLAYER_FLOOR_REVERSE_INDEX XREG(94) // stores what floor the player is on #define R_MINIMAP_DISABLED XREG(95) #define R_ENV_LIGHT1_DIR(i) cREG(3 + (i)) diff --git a/include/z64.h b/include/z64.h index 0123ae2f9..b0884e794 100644 --- a/include/z64.h +++ b/include/z64.h @@ -110,7 +110,7 @@ typedef struct PlayState { /* 0x17104 */ AnimationContext animationCtx; /* 0x17D88 */ ObjectContext objectCtx; /* 0x186E0 */ RoomContext roomCtx; - /* 0x18760 */ DoorContext doorCtx; + /* 0x18760 */ TransitionActorList transitionActors; /* 0x18768 */ void (*playerInit)(Player* player, struct PlayState* play, FlexSkeletonHeader* skelHeader); /* 0x1876C */ void (*playerUpdate)(Player* player, struct PlayState* play, Input* input); /* 0x18770 */ void (*unk_18770)(struct PlayState* play, Player* player); diff --git a/include/z64interface.h b/include/z64interface.h index c83630cbf..518927dd2 100644 --- a/include/z64interface.h +++ b/include/z64interface.h @@ -178,7 +178,7 @@ typedef struct { /* 0x274 */ s16 minimapAlpha; /* 0x276 */ s16 startAlpha; /* 0x278 */ s16 unk_278; - /* 0x27A */ s16 dungeonOrBossAreaMapIndex; + /* 0x27A */ s16 dungeonSceneIndex; /* 0x27C */ s16 mapRoomNum; /* 0x27E */ u8 unk_27E; /* 0x27F */ u8 unk_27F; diff --git a/include/z64map.h b/include/z64map.h index 195344114..d4936ffb4 100644 --- a/include/z64map.h +++ b/include/z64map.h @@ -1,6 +1,143 @@ #ifndef Z64MAP_H #define Z64MAP_H +#include "ultra64.h" +#include "z64scene.h" + +struct PlayState; + +/* +Handles the minimap and pause screen dungeon map system. + +z_map_data.c stores MapSpriteInfo and helper functions to "simplify" accessing this data + +Two separate Id systems are used to access data + +mapId +0x000-0x004 fetches minimap sprite data from gameplay_dangeon_keep +0x005-0x039 fetches dungeon map sprite data from map_i_static +0x100-0x161 fetches minimap sprite data from map_grand_static + +mapCompactId +0x000-0x039 fetches dungeon map sprite data from map_i_static +0x03A-0x09B fetches minimap sprite data from map_grand_static +*/ #define FLOOR_INDEX_MAX 4 +#define FLOOR_MIN_Y -32767 + +/* z_map_data */ +#define MAPDATA_GAMEPLAY_DANGEON_KEEP_MAX 5 +#define MAPDATA_MAP_I_MAX 0x3A +#define MAPDATA_MAP_GRAND 0x100 +#define MAPDATA_MAP_GRAND_MAX 0x162 +#define MAPDATA_GET_MAP_GRAND_ID_FROM_COMPACT_ID(id) ((id) + (MAPDATA_MAP_GRAND - MAPDATA_MAP_I_MAX)) +#define MAPDATA_GET_MAP_GRAND_ID_FROM_MAP_ID(mapId) ((mapId) - MAPDATA_MAP_GRAND) + +#define MAPDATA_MID_GAMEPLAY_DANGEON_KEEP 0 +#define MAPDATA_MID_MAP_GRAND_STATIC 1 +#define MAPDATA_MID_MAP_I_STATIC 2 + +#define MAPDATA_CPID_MAP_GRAND_STATIC 0 +#define MAPDATA_CPID_MAP_I_STATIC 1 +#define MAPDATA_CPID_2 2 + +#define MAPDATA_DRAW_0 0 +#define MAPDATA_DRAW_1 1 +#define MAPDATA_DRAW_2 2 +#define MAPDATA_DRAW_3 3 + +/* z_map_disp */ +typedef struct { + /* 0x00 */ MapDataScene* mapDataScene; + /* 0x04 */ s32 curRoom; + /* 0x08 */ s16 minimapBaseX; + /* 0x0A */ s16 minimapBaseY; + /* 0x0C */ s16 minimapCurX; + /* 0x0E */ s16 minimapCurY; + /* 0x10 */ TexturePtr minimapCurTex; // gameplay cur minimap room + /* 0x14 */ s32 prevRoom; + /* 0x18 */ TexturePtr minimapPrevTex; + /* 0x1C */ s16 minimapPrevX; // for room swap animation + /* 0x1E */ s16 minimapPrevY; // for room swap animation + /* 0x20 */ s32 unk20; + /* 0x24 */ s32 swapAnimTimer; + /* 0x28 */ void* texBuff0; + /* 0x2C */ void* texBuff1; + /* 0x30 */ s16 sceneMinX; //scene minBounds.x + /* 0x32 */ s16 sceneMinZ; //scene minBounds.z + /* 0x34 */ s16 sceneWidth; //scene boundsWidth.x + /* 0x36 */ s16 sceneHeight; //scene boundsWidth.z + /* 0x38 */ s16 sceneMidX; //scene boundsMidpoint.x + /* 0x3A */ s16 sceneMidZ; //scene boundsMidpoint.z + /* 0x3C */ s16* roomStoreyList; // list of lowest storey each room crosses + /* 0x40 */ s16 numStoreys; // number of distinct storeys + /* 0x42 */ s16 pauseMapCurStorey; + /* 0x44 */ s16 bottomStorey; // configures what storey 0 is displayed as + /* 0x48 */ s16* storeyYList; // list of min Ys for each storey + /* 0x4C */ s16 timer; + /* 0x50 */ s32 numChests; + /* 0x54 */ MapDataChest* mapDataChests; + /* 0x58 */ s16 bossRoomStorey; + /* 0x5A */ s16 unk5A; +} MapDisp; // size = 0x5C + +typedef struct { + /* 0x000 */ s32 textureCount; + /* 0x004 */ s32 mapI_mapCompactId[ROOM_MAX]; + /* 0x084 */ void* mapI_roomTextures[ROOM_MAX]; + /* 0x104 */ void* roomSprite[ROOM_MAX]; + /* 0x184 */ s32 animTimer; +} PauseDungeonMap; // size = 0x188 + +/* z_map_disp */ +void func_80102EB4(u32 flag); +void func_80102ED0(u32 flag); +s32 MapDisp_CurRoomHasMapI(struct PlayState* play); +void MapDisp_Init(struct PlayState* play); +s32 MapDisp_GetBossIconY(void); +s16 MapDisp_GetBossRoomStorey(void); +void MapDisp_InitMapData(struct PlayState* play, void* segmentAddress); +void MapDisp_InitChestData(struct PlayState* play, s32 num, void* segmentAddress); +void MapDisp_InitTransitionActorData(struct PlayState* play, s32 num, TransitionActorEntry* transitionActorList); +void MapDisp_Destroy(struct PlayState* play); +void MapDisp_Update(struct PlayState* play); +void MapDisp_SwapRooms(s16 nextRoom); +s32 MapDisp_IsMinimapToggleBlocked(struct PlayState* play); +void MapDisp_DrawMinimap(struct PlayState* play, s32 playerInitX, s32 playerInitZ, s32 playerInitDir); +void* MapDisp_AllocDungeonMap(struct PlayState* play, void* heap); +void MapDisp_DrawDungeonFloorSelect(struct PlayState* play); +s32 MapDisp_IsValidStorey(s32 storey); +s32 MapDisp_GetPlayerStorey(s16 checkY); +void MapDisp_DrawDungeonMap(struct PlayState* play); +void MapDisp_UpdateDungeonMap(struct PlayState* play); + +/* z_map_data */ +void MapData_GetMapColor(s32 colorIndex, Color_RGBA8* color); +TexturePtr MapData_GetMapTexGameplayDangeonKeep(s32); +s32 MapData_GetMapCompactId(s32); +s32 MapData_MID_GetType(s32); +s32 MapData_CPID_GetSizeOfMapTex(s32); +void MapData_GetDrawType(s32, s32*); +s32 MapData_GetMapColorIndex(s32); +s32 MapDisp_GetSizeOfMapITex(s32 mapCompactId); +s32 MapData_GetMapIId(s32); +s32 MapData_GetSizeOfMapGrandTex(s32 mapId); +void MapData_GetMapTexDim(s32 mapId, s32* width, s32* height); +void MapData_GetMapTexOffset(s32 mapId, s32* offsetX, s32* offsetY); +void MapData_GetMapScale(s32 mapId, s32 *scale); +void MapData_CPID_GetTexDim(s32 mapCompactId, s32* width, s32* height); +void MapData_CPID_GetTexOffset(s32 mapCompactId, s32* offsetX, s32* offsetY); +s16 MapData_CPID_GetMapScale(s32 mapCompactId); + +/* z_map_exp */ +s32 Map_IsInDungeonOrBossScene(struct PlayState* play); +s32 Map_CurRoomHasMapI(struct PlayState* play); +s32 Map_IsInBossScene(struct PlayState* play); +void Map_SetAreaEntrypoint(struct PlayState* play); +void Map_InitRoomData(struct PlayState* play, s16 room); +void Map_Destroy(struct PlayState* play); +void Map_Init(struct PlayState* play); +void Map_DrawMinimap(struct PlayState* play); +void Map_Update(struct PlayState* play); #endif diff --git a/include/z64pause_menu.h b/include/z64pause_menu.h index fdb63ea10..5fa09399f 100644 --- a/include/z64pause_menu.h +++ b/include/z64pause_menu.h @@ -139,7 +139,7 @@ typedef struct PauseContext { /* 0x238 */ s16 cursorPoint[PAUSE_PAGE_MAX]; // indexed by PauseMenuPage enum /* 0x242 */ s16 cursorXIndex[PAUSE_PAGE_MAX]; // indexed by PauseMenuPage enum /* 0x24C */ s16 cursorYIndex[PAUSE_PAGE_MAX]; // indexed by PauseMenuPage enum - /* 0x256 */ s16 unk_256; // Uses DungeonItem enum + /* 0x256 */ s16 cursorMapDungeonItem; // Uses DungeonItem enum /* 0x258 */ s16 cursorSpecialPos; /* 0x25A */ s16 pageSwitchInputTimer; // Used to introduce a delay before switching page when arriving on the "scroll left/right" positions while holding stick left/right. /* 0x25C */ u16 namedItem; diff --git a/include/z64save.h b/include/z64save.h index f7d28708b..45bc64fd9 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -317,36 +317,36 @@ typedef struct SaveInfo { } SaveInfo; // size = 0xFE8 typedef struct Save { - /* 0x00 */ s32 entrance; // "scene_no" - /* 0x04 */ u8 equippedMask; // "player_mask" - /* 0x05 */ u8 isFirstCycle; // "opening_flag" + /* 0x00 */ s32 entrance; // "scene_no" + /* 0x04 */ u8 equippedMask; // "player_mask" + /* 0x05 */ u8 isFirstCycle; // "opening_flag" /* 0x06 */ u8 unk_06; - /* 0x07 */ u8 linkAge; // "link_age" - /* 0x08 */ s32 cutsceneIndex; // "day_time" - /* 0x0C */ u16 time; // "zelda_time" - /* 0x0E */ u16 owlWarpId; // See `OwlWarpId` enum - /* 0x10 */ s32 isNight; // "asahiru_fg" - /* 0x14 */ s32 timeSpeedOffset; // "change_zelda_time" - /* 0x18 */ s32 day; // "totalday" - /* 0x1C */ s32 eventDayCount; // "eventday" - /* 0x20 */ u8 playerForm; // "player_character" - /* 0x21 */ u8 snowheadCleared; // "spring_flag" - /* 0x22 */ u8 hasTatl; // "bell_flag" + /* 0x07 */ u8 linkAge; // "link_age" + /* 0x08 */ s32 cutsceneIndex; // "day_time" + /* 0x0C */ u16 time; // "zelda_time" + /* 0x0E */ u16 owlWarpId; // See `OwlWarpId` enum + /* 0x10 */ s32 isNight; // "asahiru_fg" + /* 0x14 */ s32 timeSpeedOffset; // "change_zelda_time" + /* 0x18 */ s32 day; // "totalday" + /* 0x1C */ s32 eventDayCount; // "eventday" + /* 0x20 */ u8 playerForm; // "player_character" + /* 0x21 */ u8 snowheadCleared; // "spring_flag" + /* 0x22 */ u8 hasTatl; // "bell_flag" /* 0x23 */ u8 isOwlSave; /* 0x24 */ SaveInfo saveInfo; } Save; // size = 0x100C typedef struct SaveContext { /* 0x0000 */ Save save; - /* 0x100C */ u8 eventInf[8]; // "event_inf" - /* 0x1014 */ u8 unk_1014; // "stone_set_flag" + /* 0x100C */ u8 eventInf[8]; // "event_inf" + /* 0x1014 */ u8 unk_1014; // "stone_set_flag" /* 0x1015 */ u8 bButtonStatus; /* 0x1016 */ u16 jinxTimer; - /* 0x1018 */ s16 rupeeAccumulator; // "lupy_udct" - /* 0x101A */ u8 bottleTimerStates[BOTTLE_MAX]; // See the `BottleTimerState` enum. "bottle_status" + /* 0x1018 */ s16 rupeeAccumulator; // "lupy_udct" + /* 0x101A */ u8 bottleTimerStates[BOTTLE_MAX]; // See the `BottleTimerState` enum. "bottle_status" /* 0x1020 */ OSTime bottleTimerStartOsTimes[BOTTLE_MAX]; // The osTime when the timer starts. "bottle_ostime" /* 0x1050 */ u64 bottleTimerTimeLimits[BOTTLE_MAX]; // The original total time given before the timer expires, in centiseconds (1/100th sec). "bottle_sub" - /* 0x1080 */ u64 bottleTimerCurTimes[BOTTLE_MAX]; // The remaining time left before the timer expires, in centiseconds (1/100th sec). "bottle_time" + /* 0x1080 */ u64 bottleTimerCurTimes[BOTTLE_MAX]; // The remaining time left before the timer expires, in centiseconds (1/100th sec). "bottle_time" /* 0x10B0 */ OSTime bottleTimerPausedOsTimes[BOTTLE_MAX]; // The cumulative osTime spent with the timer paused. "bottle_stop_time" /* 0x10E0 */ u8 pictoPhotoI5[PICTO_PHOTO_COMPRESSED_SIZE]; // buffer containing the pictograph photo, compressed to I5 from I8 /* 0x3CA0 */ s32 fileNum; // "file_no" @@ -367,58 +367,58 @@ typedef struct SaveContext { /* 0x3DC0 */ s16 nayrusLoveTimer; // remnant of OoT, "shield_magic_timer" /* 0x3DC2 */ u8 unk_3DC2; // "pad1" /* 0x3DC8 */ OSTime postmanTimerStopOsTime; // The osTime when the timer stops for the postman minigame. "get_time" - /* 0x3DD0 */ u8 timerStates[TIMER_ID_MAX]; // See the `TimerState` enum. "event_fg" + /* 0x3DD0 */ u8 timerStates[TIMER_ID_MAX]; // See the `TimerState` enum. "event_fg" /* 0x3DD7 */ u8 timerDirections[TIMER_ID_MAX]; // See the `TimerDirection` enum. "calc_flag" /* 0x3DE0 */ u64 timerCurTimes[TIMER_ID_MAX]; // For countdown, the remaining time left. For countup, the time since the start. In centiseconds (1/100th sec). "event_ostime" /* 0x3E18 */ u64 timerTimeLimits[TIMER_ID_MAX]; // The original total time given for the timer to count from, in centiseconds (1/100th sec). "event_sub" /* 0x3E50 */ OSTime timerStartOsTimes[TIMER_ID_MAX]; // The osTime when the timer starts. "func_time" /* 0x3E88 */ u64 timerStopTimes[TIMER_ID_MAX]; // The total amount of time taken between the start and end of the timer, in centiseconds (1/100th sec). "func_end_time" /* 0x3EC0 */ OSTime timerPausedOsTimes[TIMER_ID_MAX]; // The cumulative osTime spent with the timer paused. "func_stop_time" - /* 0x3EF8 */ s16 timerX[TIMER_ID_MAX]; // "event_xp" - /* 0x3F06 */ s16 timerY[TIMER_ID_MAX]; // "event_yp" - /* 0x3F14 */ s16 unk_3F14; // "character_change" - /* 0x3F16 */ u8 seqId; // "old_bgm" - /* 0x3F17 */ u8 ambienceId; // "old_env" - /* 0x3F18 */ u8 buttonStatus[6]; // "button_item" + /* 0x3EF8 */ s16 timerX[TIMER_ID_MAX]; // "event_xp" + /* 0x3F06 */ s16 timerY[TIMER_ID_MAX]; // "event_yp" + /* 0x3F14 */ s16 unk_3F14; // "character_change" + /* 0x3F16 */ u8 seqId; // "old_bgm" + /* 0x3F17 */ u8 ambienceId; // "old_env" + /* 0x3F18 */ u8 buttonStatus[6]; // "button_item" /* 0x3F1E */ u8 hudVisibilityForceButtonAlphasByStatus; // if btn alphas are updated through Interface_UpdateButtonAlphas, instead update them through Interface_UpdateButtonAlphasByStatus "ck_fg" - /* 0x3F20 */ u16 nextHudVisibility; // triggers the hud to change visibility to the requested value. Reset to HUD_VISIBILITY_IDLE when target is reached "alpha_type" - /* 0x3F22 */ u16 hudVisibility; // current hud visibility "prev_alpha_type" + /* 0x3F20 */ u16 nextHudVisibility; // triggers the hud to change visibility to the requested value. Reset to HUD_VISIBILITY_IDLE when target is reached "alpha_type" + /* 0x3F22 */ u16 hudVisibility; // current hud visibility "prev_alpha_type" /* 0x3F24 */ u16 hudVisibilityTimer; // number of frames in the transition to a new hud visibility. Used to step alpha "alpha_count" /* 0x3F26 */ u16 prevHudVisibility; // used to store and recover hud visibility for pause menu and text boxes "last_time_type" - /* 0x3F28 */ s16 magicState; // determines magic meter behavior on each frame "magic_flag" - /* 0x3F2A */ s16 isMagicRequested; // a request to add magic has been given "recovery_magic_flag" - /* 0x3F2C */ s16 magicFlag; // Set to 0 in func_80812D94(), otherwise unused "keep_magic_flag" - /* 0x3F2E */ s16 magicCapacity; // maximum magic available "magic_now_max" - /* 0x3F30 */ s16 magicFillTarget; // target used to fill magic "magic_now_now" - /* 0x3F32 */ s16 magicToConsume; // accumulated magic that is requested to be consumed "magic_used" - /* 0x3F34 */ s16 magicToAdd; // accumulated magic that is requested to be added "magic_recovery" - /* 0x3F36 */ u16 mapIndex; // "scene_ID" - /* 0x3F38 */ u16 minigameStatus; // "yabusame_mode" - /* 0x3F3A */ u16 minigameScore; // "yabusame_total" - /* 0x3F3C */ u16 minigameHiddenScore; // "yabusame_out_ct" - /* 0x3F3E */ u8 unk_3F3E; // "no_save" - /* 0x3F3F */ u8 flashSaveAvailable; // "flash_flag" + /* 0x3F28 */ s16 magicState; // determines magic meter behavior on each frame "magic_flag" + /* 0x3F2A */ s16 isMagicRequested; // a request to add magic has been given "recovery_magic_flag" + /* 0x3F2C */ s16 magicFlag; // Set to 0 in func_80812D94(), otherwise unused "keep_magic_flag" + /* 0x3F2E */ s16 magicCapacity; // maximum magic available "magic_now_max" + /* 0x3F30 */ s16 magicFillTarget; // target used to fill magic "magic_now_now" + /* 0x3F32 */ s16 magicToConsume; // accumulated magic that is requested to be consumed "magic_used" + /* 0x3F34 */ s16 magicToAdd; // accumulated magic that is requested to be added "magic_recovery" + /* 0x3F36 */ u16 mapIndex; // set to enum DungeonSceneIndex when entering a dungeon related scene, or Map_GetMapIndexForOverworld on certain overworld scenes "scene_ID" + /* 0x3F38 */ u16 minigameStatus; // "yabusame_mode" + /* 0x3F3A */ u16 minigameScore; // "yabusame_total" + /* 0x3F3C */ u16 minigameHiddenScore; // "yabusame_out_ct" + /* 0x3F3E */ u8 unk_3F3E; // "no_save" + /* 0x3F3F */ u8 flashSaveAvailable; // "flash_flag" /* 0x3F40 */ SaveOptions options; - /* 0x3F46 */ u16 forcedSeqId; // "NottoriBgm" - /* 0x3F48 */ u8 cutsceneTransitionControl; // "fade_go" - /* 0x3F4A */ u16 nextCutsceneIndex; // "next_daytime" - /* 0x3F4C */ u8 cutsceneTrigger; // "doukidemo" - /* 0x3F4D */ u8 chamberCutsceneNum; // remnant of OoT "Kenjya_no" - /* 0x3F4E */ u16 nextDayTime; // "next_zelda_time" - /* 0x3F50 */ u8 transFadeDuration; // "fade_speed" - /* 0x3F51 */ u8 transWipeSpeed; // "wipe_speed" transition related - /* 0x3F52 */ u16 skyboxTime; // "kankyo_time" - /* 0x3F54 */ u8 dogIsLost; // "dog_event_flag" - /* 0x3F55 */ u8 nextTransitionType; // "next_wipe" - /* 0x3F56 */ s16 worldMapArea; // "area_type" - /* 0x3F58 */ s16 sunsSongState; // "sunmoon_flag" - /* 0x3F5A */ s16 healthAccumulator; // "life_mode" - /* 0x3F5C */ s32 unk_3F5C; // "bet_rupees" - /* 0x3F60 */ u8 screenScaleFlag; // "framescale_flag" - /* 0x3F64 */ f32 screenScale; // "framescale_scale" - /* 0x3F68 */ CycleSceneFlags cycleSceneFlags[120]; // Scene flags that are temporarily stored over the duration of a single 3-day cycle - /* 0x48C8 */ u16 dungeonIndex; // "scene_id_mix" - /* 0x48CA */ u8 masksGivenOnMoon[27]; // bit-packed, masks given away on the Moon. "mask_mask_bit" + /* 0x3F46 */ u16 forcedSeqId; // "NottoriBgm" + /* 0x3F48 */ u8 cutsceneTransitionControl; // "fade_go" + /* 0x3F4A */ u16 nextCutsceneIndex; // "next_daytime" + /* 0x3F4C */ u8 cutsceneTrigger; // "doukidemo" + /* 0x3F4D */ u8 chamberCutsceneNum; // remnant of OoT "Kenjya_no" + /* 0x3F4E */ u16 nextDayTime; // "next_zelda_time" + /* 0x3F50 */ u8 transFadeDuration; // "fade_speed" + /* 0x3F51 */ u8 transWipeSpeed; // "wipe_speed" transition related + /* 0x3F52 */ u16 skyboxTime; // "kankyo_time" + /* 0x3F54 */ u8 dogIsLost; // "dog_event_flag" + /* 0x3F55 */ u8 nextTransitionType; // "next_wipe" + /* 0x3F56 */ s16 worldMapArea; // "area_type" + /* 0x3F58 */ s16 sunsSongState; // "sunmoon_flag" + /* 0x3F5A */ s16 healthAccumulator; // "life_mode" + /* 0x3F5C */ s32 unk_3F5C; // "bet_rupees" + /* 0x3F60 */ u8 screenScaleFlag; // "framescale_flag" + /* 0x3F64 */ f32 screenScale; // "framescale_scale" + /* 0x3F68 */ CycleSceneFlags cycleSceneFlags[120]; // Scene flags that are temporarily stored over the duration of a single 3-day cycle + /* 0x48C8 */ u16 dungeonSceneSharedIndex; // similar to mapIndex, except values correspond to one of the four dungeons "scene_id_mix" + /* 0x48CA */ u8 masksGivenOnMoon[27]; // bit-packed, masks given away on the Moon. "mask_mask_bit" } SaveContext; // size = 0x48C8 typedef enum ButtonStatus { @@ -497,9 +497,16 @@ typedef enum { #define DECREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems -= (1 << QUEST_HEART_PIECE_COUNT)) #define RESET_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems ^= (4 << QUEST_HEART_PIECE_COUNT)) -#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonIndex] & gBitFlags[item]) -#define SET_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonIndex] |= (u8)gBitFlags[item]) -#define DUNGEON_KEY_COUNT(dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonKeys[(void)0, dungeonIndex]) +#define CHECK_DUNGEON_ITEM(item, dungeonSceneIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonSceneIndex] & gBitFlags[item]) +#define CHECK_DUNGEON_ITEM_ALT(item, dungeonSceneIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[dungeonSceneIndex] & gBitFlags[item]) +#define SET_DUNGEON_ITEM(item, dungeonSceneIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonSceneIndex] |= (u8)gBitFlags[item]) +#define DUNGEON_KEY_COUNT(dungeonSceneIndex) (gSaveContext.save.saveInfo.inventory.dungeonKeys[(void)0, dungeonSceneIndex]) +#define GET_DUNGEON_FLOOR_VISITED(sceneId, floor) (gSaveContext.save.saveInfo.permanentSceneFlags[(sceneId)].unk_14 & gBitFlags[floor]) +#define SET_DUNGEON_FLOOR_VISITED(sceneId, floor) (gSaveContext.save.saveInfo.permanentSceneFlags[(sceneId)].unk_14 |= gBitFlags[floor]) +#define GET_ROOM_VISITED(sceneId, room) (((void)0, gSaveContext.save.saveInfo.permanentSceneFlags[(sceneId)].rooms) & (1 << (room))) +#define SET_ROOM_VISITED(sceneId, room) (gSaveContext.save.saveInfo.permanentSceneFlags[(sceneId)].rooms |= gBitFlags[room]) +#define GET_CYCLE_CHEST_OPENED(sceneId, chestFlagId) ((void)0, gSaveContext.cycleSceneFlags[(sceneId)].chest) & (1 << (chestFlagId)); + #define GET_CUR_FORM_BTN_ITEM(btn) ((u8)((btn) == EQUIP_SLOT_B ? BUTTON_ITEM_EQUIP(CUR_FORM, btn) : BUTTON_ITEM_EQUIP(0, btn))) #define GET_CUR_FORM_BTN_SLOT(btn) ((u8)((btn) == EQUIP_SLOT_B ? C_SLOT_EQUIP(CUR_FORM, btn) : C_SLOT_EQUIP(0, btn))) @@ -1673,11 +1680,18 @@ typedef enum { gSaveContext.eventInf[7] = (temp) typedef enum { - /* 0 */ DUNGEON_INDEX_WOODFALL_TEMPLE, - /* 1 */ DUNGEON_INDEX_SNOWHEAD_TEMPLE, - /* 2 */ DUNGEON_INDEX_GREAT_BAY_TEMPLE, - /* 3 */ DUNGEON_INDEX_STONE_TOWER_TEMPLE // Also applies to Inverted Stone Tower Temple -} DungeonIndex; + // These first 4 values are also used represent the index of the temple the player is currently in + /* 0 */ DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE, + /* 1 */ DUNGEON_SCENE_INDEX_SNOWHEAD_TEMPLE, + /* 2 */ DUNGEON_SCENE_INDEX_GREAT_BAY_TEMPLE, + /* 3 */ DUNGEON_SCENE_INDEX_STONE_TOWER_TEMPLE, + + /* 4 */ DUNGEON_SCENE_INDEX_STONE_TOWER_TEMPLE_INVERTED, + /* 5 */ DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE_BOSS, + /* 6 */ DUNGEON_SCENE_INDEX_SNOWHEAD_TEMPLE_BOSS, + /* 7 */ DUNGEON_SCENE_INDEX_GREAT_BAY_TEMPLE_BOSS, + /* 8 */ DUNGEON_SCENE_INDEX_STONE_TOWER_TEMPLE_BOSS +} DungeonSceneIndex; #define STRAY_FAIRY_TOTAL 25 // total number of stray fairies, including those already in the Great Fairy Fountain #define STRAY_FAIRY_SCATTERED_TOTAL 15 // original number of stray fairies in one dungeon area diff --git a/include/z64scene.h b/include/z64scene.h index 8dd462814..d2bfc787e 100644 --- a/include/z64scene.h +++ b/include/z64scene.h @@ -10,6 +10,9 @@ struct GameState; struct PlayState; +#define ROOM_MAX 32 // maximum number of rooms in a scene +#define ROOM_TRANSITION_MAX 48 // maximum number of transition actors in a scene + #define SPAWN_ROT_FLAGS(rotation, flags) (((rotation) << 7) | (flags)) #define ROOM_DRAW_OPA (1 << 0) @@ -107,7 +110,7 @@ typedef struct { /* 0x0 */ u8 code; /* 0x1 */ u8 num; /* 0x4 */ void* segment; -} SCmdTransiActorList; // size = 0x8 +} SCmdTransitionActorList; // size = 0x8 typedef struct { /* 0x0 */ u8 code; @@ -207,13 +210,13 @@ typedef struct { /* 0x0 */ u8 code; /* 0x1 */ u8 data1; /* 0x4 */ void* segment; -} SCmdMinimapSettings; // size = 0x8 +} SCmdMapData; // size = 0x8 typedef struct { /* 0x0 */ u8 code; /* 0x1 */ u8 num; /* 0x4 */ void* segment; -} SCmdMinimapChests; // size = 0x8 +} SCmdMapDataChests; // size = 0x8 typedef enum { /* 0 */ ROOM_SHAPE_TYPE_NORMAL, @@ -373,9 +376,9 @@ typedef struct TransitionActorEntry { } TransitionActorEntry; // size = 0x10 typedef struct { - /* 0x0 */ u8 numTransitionActors; - /* 0x4 */ TransitionActorEntry* transitionActorList; -} DoorContext; // size = 0x8 + /* 0x0 */ u8 count; + /* 0x4 */ TransitionActorEntry* list; +} TransitionActorList; // size = 0x8 typedef struct { /* 0x0 */ s16 id; @@ -474,25 +477,38 @@ typedef struct { } ObjectContext; // size = 0x958 typedef struct { - /* 0x0 */ UNK_TYPE2 unk0; - /* 0x2 */ UNK_TYPE2 unk2; - /* 0x4 */ UNK_TYPE2 unk4; - /* 0x6 */ UNK_TYPE2 unk6; - /* 0x8 */ UNK_TYPE2 unk8; -} MinimapEntry; // size = 0xA + /* 0x0 */ u16 mapId; + /* 0x2 */ s16 centerX; + /* 0x4 */ s16 floorY; + /* 0x6 */ s16 centerZ; + /* 0x8 */ u16 flags; +} MapDataRoom; // size = 0xA + +#define MAP_DATA_NO_MAP 0xFFFF +#define MAP_DATA_ROOM_FLIP_X 1 +#define MAP_DATA_ROOM_FLIP_Y 2 +#define MAP_DATA_ROOM_GET_EXTRA_STOREYS(mapDataRoom) ((((mapDataRoom)->flags) >> 2) & 7) typedef struct { - /* 0x0 */ MinimapEntry* entry; - /* 0x4 */ s16 unk4; -} MinimapList; // size = 0x8 + /* 0x0 */ MapDataRoom* rooms; + /* 0x4 */ s16 scale; +} MapDataScene; // size = 0x8 typedef struct { - /* 0x0 */ UNK_TYPE2 unk0; - /* 0x2 */ UNK_TYPE2 unk2; - /* 0x4 */ UNK_TYPE2 unk4; - /* 0x6 */ UNK_TYPE2 unk6; - /* 0x8 */ UNK_TYPE2 unk8; -} MinimapChest; // size = 0xA + /* 0x0 */ s16 room; + /* 0x2 */ s16 chestFlagId; + /* 0x4 */ s16 x; + /* 0x6 */ s16 y; + /* 0x8 */ s16 z; +} MapDataChest; // size = 0xA + +// TODO: ZAPD updates +typedef SCmdMapData SCmdMinimapSettings; +typedef SCmdMapDataChests SCmdMinimapChests; +typedef MapDataRoom MinimapEntry; +typedef MapDataScene MinimapList; +typedef MapDataChest MinimapChest; +typedef SCmdTransitionActorList SCmdTransiActorList; // TODO: consider merging with bgCamInfo? typedef struct { @@ -502,38 +518,38 @@ typedef struct { } ActorCsCamInfo; // size = 0x8 typedef union { - /* Command: N/A */ SCmdBase base; - /* Command: 0x00 */ SCmdSpawnList spawnList; - /* Command: 0x01 */ SCmdActorList actorList; - /* Command: 0x02 */ SCmdCsCameraList actorCsCamList; - /* Command: 0x03 */ SCmdColHeader colHeader; - /* Command: 0x04 */ SCmdRoomList roomList; - /* Command: 0x05 */ SCmdWindSettings windSettings; - /* Command: 0x06 */ SCmdEntranceList entranceList; - /* Command: 0x07 */ SCmdSpecialFiles specialFiles; - /* Command: 0x08 */ SCmdRoomBehavior roomBehavior; + /* Command: N/A */ SCmdBase base; + /* Command: 0x00 */ SCmdSpawnList spawnList; + /* Command: 0x01 */ SCmdActorList actorList; + /* Command: 0x02 */ SCmdCsCameraList actorCsCamList; + /* Command: 0x03 */ SCmdColHeader colHeader; + /* Command: 0x04 */ SCmdRoomList roomList; + /* Command: 0x05 */ SCmdWindSettings windSettings; + /* Command: 0x06 */ SCmdEntranceList entranceList; + /* Command: 0x07 */ SCmdSpecialFiles specialFiles; + /* Command: 0x08 */ SCmdRoomBehavior roomBehavior; /* Command: 0x09 */ // Unused - /* Command: 0x0A */ SCmdMesh mesh; - /* Command: 0x0B */ SCmdObjectList objectList; - /* Command: 0x0C */ SCmdLightList lightList; - /* Command: 0x0D */ SCmdPathList pathList; - /* Command: 0x0E */ SCmdTransiActorList transiActorList; - /* Command: 0x0F */ SCmdLightSettingList lightSettingList; - /* Command: 0x10 */ SCmdTimeSettings timeSettings; - /* Command: 0x11 */ SCmdSkyboxSettings skyboxSettings; - /* Command: 0x12 */ SCmdSkyboxDisables skyboxDisables; - /* Command: 0x13 */ SCmdExitList exitList; - /* Command: 0x14 */ SCmdEndMarker endMarker; - /* Command: 0x15 */ SCmdSoundSettings soundSettings; - /* Command: 0x16 */ SCmdEchoSettings echoSettings; - /* Command: 0x17 */ SCmdCsScriptList scriptList; - /* Command: 0x18 */ SCmdAltHeaders altHeaders; - /* Command: 0x19 */ SCmdRegionVisited regionVisited; - /* Command: 0x1A */ SCmdTextureAnimations textureAnimations; - /* Command: 0x1B */ SCmdCutsceneList cutsceneList; - /* Command: 0x1C */ SCmdMinimapSettings minimapSettings; + /* Command: 0x0A */ SCmdMesh mesh; + /* Command: 0x0B */ SCmdObjectList objectList; + /* Command: 0x0C */ SCmdLightList lightList; + /* Command: 0x0D */ SCmdPathList pathList; + /* Command: 0x0E */ SCmdTransitionActorList transitionActorList; + /* Command: 0x0F */ SCmdLightSettingList lightSettingList; + /* Command: 0x10 */ SCmdTimeSettings timeSettings; + /* Command: 0x11 */ SCmdSkyboxSettings skyboxSettings; + /* Command: 0x12 */ SCmdSkyboxDisables skyboxDisables; + /* Command: 0x13 */ SCmdExitList exitList; + /* Command: 0x14 */ SCmdEndMarker endMarker; + /* Command: 0x15 */ SCmdSoundSettings soundSettings; + /* Command: 0x16 */ SCmdEchoSettings echoSettings; + /* Command: 0x17 */ SCmdCsScriptList scriptList; + /* Command: 0x18 */ SCmdAltHeaders altHeaders; + /* Command: 0x19 */ SCmdRegionVisited regionVisited; + /* Command: 0x1A */ SCmdTextureAnimations textureAnimations; + /* Command: 0x1B */ SCmdCutsceneList cutsceneList; + /* Command: 0x1C */ SCmdMapData mapData; /* Command: 0x1D */ // Unused - /* Command: 0x1E */ SCmdMinimapChests minimapChests; + /* Command: 0x1E */ SCmdMapDataChests mapDataChests; } SceneCmd; // size = 0x8 // Sets cursor point options on the world map @@ -774,9 +790,9 @@ typedef enum { /* 0x19 */ SCENE_CMD_ID_SET_REGION_VISITED, /* 0x1A */ SCENE_CMD_ID_ANIMATED_MATERIAL_LIST, /* 0x1B */ SCENE_CMD_ID_ACTOR_CUTSCENE_LIST, - /* 0x1C */ SCENE_CMD_ID_MINIMAP_INFO, + /* 0x1C */ SCENE_CMD_ID_MAP_DATA, /* 0x1D */ SCENE_CMD_ID_UNUSED_1D, - /* 0x1E */ SCENE_CMD_ID_MINIMAP_COMPASS_ICON_INFO, + /* 0x1E */ SCENE_CMD_ID_MAP_DATA_CHESTS, /* 0x1F */ SCENE_CMD_MAX } SceneCommandTypeId; @@ -822,13 +838,13 @@ typedef enum { { SCENE_CMD_ID_OBJECT_LIST, numObjects, CMD_PTR(objectList) } #define SCENE_CMD_LIGHT_LIST(numLights, lightList) \ - { SCENE_CMD_ID_LIGHT_LIST, numLights, CMD_PTR(lightList) } + { SCENE_CMD_ID_LIGHT_LIST, numLights, CMD_PTR(lightList) } #define SCENE_CMD_PATH_LIST(pathList) \ { SCENE_CMD_ID_PATH_LIST, 0, CMD_PTR(pathList) } #define SCENE_CMD_TRANSITION_ACTOR_LIST(numTransitionActors, actorList) \ - { SCENE_CMD_ID_TRANSI_ACTOR_LIST, numTransitionActors, CMD_PTR(actorList) } + { SCENE_CMD_ID_TRANSI_ACTOR_LIST, numTransitionActors, CMD_PTR(actorList) } #define SCENE_CMD_ENV_LIGHT_SETTINGS(numLightSettings, lightSettingsList) \ { SCENE_CMD_ID_ENV_LIGHT_SETTINGS, numLightSettings, CMD_PTR(lightSettingsList) } @@ -869,12 +885,14 @@ typedef enum { #define SCENE_CMD_ACTOR_CUTSCENE_LIST(numEntries, actorCutsceneList) \ { SCENE_CMD_ID_ACTOR_CUTSCENE_LIST, numEntries, CMD_PTR(actorCutsceneList) } -#define SCENE_CMD_MINIMAP_INFO(minimapInfo) \ - { SCENE_CMD_ID_MINIMAP_INFO, 0, CMD_PTR(minimapInfo) } +#define SCENE_CMD_MAP_DATA(mapData) \ + { SCENE_CMD_ID_MAP_DATA, 0, CMD_PTR(mapData) } -#define SCENE_CMD_MINIMAP_COMPASS_ICON_INFO(compassIconCount, compassIconInfo) \ - { SCENE_CMD_ID_MINIMAP_COMPASS_ICON_INFO, compassIconCount, CMD_PTR(compassIconInfo) } +#define SCENE_CMD_MAP_DATA_CHESTS(chestCount, chestInfo) \ + { SCENE_CMD_ID_MAP_DATA_CHESTS, chestCount, CMD_PTR(chestInfo) } +#define SCENE_CMD_MINIMAP_INFO SCENE_CMD_MAP_DATA +#define SCENE_CMD_MINIMAP_COMPASS_ICON_INFO SCENE_CMD_MAP_DATA_CHESTS s32 Object_SpawnPersistent(ObjectContext* objectCtx, s16 id); void Object_InitContext(struct GameState* gameState, ObjectContext* objectCtx); @@ -895,8 +913,8 @@ void Scene_CommandMesh(struct PlayState* play, SceneCmd* cmd); void Scene_CommandObjectList(struct PlayState* play, SceneCmd* cmd); void Scene_CommandLightList(struct PlayState* play, SceneCmd* cmd); void Scene_CommandPathList(struct PlayState* play, SceneCmd* cmd); -void Scene_CommandTransiActorList(struct PlayState* play, SceneCmd* cmd); -void Door_InitContext(struct GameState* gameState, DoorContext* doorCtx); +void Scene_CommandTransitionActorList(struct PlayState* play, SceneCmd* cmd); +void Scene_ResetTransitionActorList(GameState* gameState, TransitionActorList* transitionActors); void Scene_CommandEnvLightSettings(struct PlayState* play, SceneCmd* cmd); void Scene_LoadAreaTextures(struct PlayState* play, s32 fileIndex); void Scene_CommandSkyboxSettings(struct PlayState* play, SceneCmd* cmd); @@ -910,9 +928,9 @@ void Scene_CommandEchoSetting(struct PlayState* play, SceneCmd* cmd); void Scene_CommandAltHeaderList(struct PlayState* play, SceneCmd* cmd); void Scene_CommandCutsceneScriptList(struct PlayState* play, SceneCmd* cmd); void Scene_CommandCutsceneList(struct PlayState* play, SceneCmd* cmd); -void Scene_CommandMiniMap(struct PlayState* play, SceneCmd* cmd); +void Scene_CommandMapData(struct PlayState* play, SceneCmd* cmd); void Scene_Command1D(struct PlayState* play, SceneCmd* cmd); -void Scene_CommandMiniMapCompassInfo(struct PlayState* play, SceneCmd* cmd); +void Scene_CommandMapDataChests(struct PlayState* play, SceneCmd* cmd); void Scene_CommandSetRegionVisitedFlag(struct PlayState* play, SceneCmd* cmd); void Scene_CommandAnimatedMaterials(struct PlayState* play, SceneCmd* cmd); void Scene_SetExitFade(struct PlayState* play); |
