1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-05 01:06:37 +00:00
oot/include/z64scene.h
mzxrules 2f54db142e
Rename RoomBehaviorType1 to RoomType (#2271)
* Rename RoomBehaviorType1 to RoomType

* suggestions

* Update include/z64scene.h

---------

Co-authored-by: fig02 <fig02srl@gmail.com>
2024-10-14 15:23:50 -04:00

671 lines
21 KiB
C

#ifndef Z64SCENE_H
#define Z64SCENE_H
#include "macros.h"
#include "ultra64.h"
#include "z64bgcheck.h"
#include "z64dma.h"
#include "z64environment.h"
#include "z64light.h"
#include "z64math.h"
#include "command_macros_base.h"
struct GameState;
struct PlayState;
typedef struct SceneTableEntry {
/* 0x00 */ RomFile sceneFile;
/* 0x08 */ RomFile titleFile;
/* 0x10 */ u8 unk_10;
/* 0x11 */ u8 drawConfig;
/* 0x12 */ u8 unk_12;
/* 0x13 */ u8 unk_13;
} SceneTableEntry; // size = 0x14
typedef struct ActorEntry {
/* 0x00 */ s16 id;
/* 0x02 */ Vec3s pos;
/* 0x08 */ Vec3s rot;
/* 0x0E */ s16 params;
} ActorEntry; // size = 0x10
typedef struct TransitionActorEntry {
struct {
s8 room; // Room to switch to
s8 bgCamIndex; // How the camera reacts during the transition. See `Camera_ChangeDoorCam`
} /* 0x00 */ sides[2]; // 0 = front, 1 = back
/* 0x04 */ s16 id;
/* 0x06 */ Vec3s pos;
/* 0x0C */ s16 rotY;
/* 0x0E */ s16 params;
} TransitionActorEntry; // size = 0x10
typedef struct TransitionActorList {
/* 0x00 */ u8 count;
/* 0x04 */ TransitionActorEntry* list;
} TransitionActorList; // size = 0x8
typedef struct Spawn {
/* 0x00 */ u8 playerEntryIndex;
/* 0x01 */ u8 room;
} Spawn;
typedef struct Path {
/* 0x00 */ u8 count; // number of points in the path
/* 0x04 */ Vec3s* points; // Segment Address to the array of points
} Path; // size = 0x8
// Room shapes
typedef enum RoomShapeType {
/* 0 */ ROOM_SHAPE_TYPE_NORMAL,
/* 1 */ ROOM_SHAPE_TYPE_IMAGE,
/* 2 */ ROOM_SHAPE_TYPE_CULLABLE,
/* 3 */ ROOM_SHAPE_TYPE_MAX
} RoomShapeType;
typedef struct RoomShapeBase {
/* 0x00 */ u8 type;
} RoomShapeBase; // size = 0x01
typedef struct RoomShapeDListsEntry {
/* 0x00 */ Gfx* opa;
/* 0x04 */ Gfx* xlu;
} RoomShapeDListsEntry; // size = 0x08
typedef struct RoomShapeNormal {
/* 0x00 */ RoomShapeBase base;
/* 0x01 */ u8 numEntries;
/* 0x04 */ RoomShapeDListsEntry* entries;
/* 0x08 */ RoomShapeDListsEntry* entriesEnd;
} RoomShapeNormal; // size = 0x0C
typedef enum RoomShapeImageAmountType {
/* 1 */ ROOM_SHAPE_IMAGE_AMOUNT_SINGLE = 1,
/* 2 */ ROOM_SHAPE_IMAGE_AMOUNT_MULTI
} RoomShapeImageAmountType;
typedef struct RoomShapeImageBase {
/* 0x00 */ RoomShapeBase base;
/* 0x01 */ u8 amountType; // RoomShapeImageAmountType
/* 0x04 */ RoomShapeDListsEntry* entry;
} RoomShapeImageBase; // size = 0x08
typedef struct RoomShapeImageSingle {
/* 0x00 */ RoomShapeImageBase base;
/* 0x08 */ void* source;
/* 0x0C */ u32 unk_0C;
/* 0x10 */ void* tlut;
/* 0x14 */ u16 width;
/* 0x16 */ u16 height;
/* 0x18 */ u8 fmt;
/* 0x19 */ u8 siz;
/* 0x1A */ u16 tlutMode;
/* 0x1C */ u16 tlutCount;
} RoomShapeImageSingle; // size = 0x20
typedef struct RoomShapeImageMultiBgEntry {
/* 0x00 */ u16 unk_00;
/* 0x02 */ u8 bgCamIndex; // for which bg cam index is this entry for
/* 0x04 */ void* source;
/* 0x08 */ u32 unk_0C;
/* 0x0C */ void* tlut;
/* 0x10 */ u16 width;
/* 0x12 */ u16 height;
/* 0x14 */ u8 fmt;
/* 0x15 */ u8 siz;
/* 0x16 */ u16 tlutMode;
/* 0x18 */ u16 tlutCount;
} RoomShapeImageMultiBgEntry; // size = 0x1C
typedef struct RoomShapeImageMulti {
/* 0x00 */ RoomShapeImageBase base;
/* 0x08 */ u8 numBackgrounds;
/* 0x0C */ RoomShapeImageMultiBgEntry* backgrounds;
} RoomShapeImageMulti; // size = 0x10
typedef struct RoomShapeCullableEntry {
/* 0x00 */ Vec3s boundsSphereCenter;
/* 0x06 */ s16 boundsSphereRadius;
/* 0x08 */ Gfx* opa;
/* 0x0C */ Gfx* xlu;
} RoomShapeCullableEntry; // size = 0x10
#define ROOM_SHAPE_CULLABLE_MAX_ENTRIES 64
typedef struct RoomShapeCullable {
/* 0x00 */ RoomShapeBase base;
/* 0x01 */ u8 numEntries;
/* 0x04 */ RoomShapeCullableEntry* entries;
/* 0x08 */ RoomShapeCullableEntry* entriesEnd;
} RoomShapeCullable; // size = 0x0C
typedef union RoomShape {
RoomShapeBase base;
RoomShapeNormal normal;
union {
RoomShapeImageBase base;
RoomShapeImageSingle single;
RoomShapeImageMulti multi;
} image;
RoomShapeCullable cullable;
} RoomShape; // "Ground Shape"
typedef enum RoomType {
/* 0 */ ROOM_TYPE_NORMAL,
/* 1 */ ROOM_TYPE_DUNGEON, // Blocks Sun's Song's time advance effect. Not exclusively used by typical dungeon rooms.
/* 2 */ ROOM_TYPE_INDOORS, // Reduces player run speed and blocks player from attacking or jumping.
/* 3 */ ROOM_TYPE_3, // Unused. Color dithering is turned off when drawing the room and other things.
/* 4 */ ROOM_TYPE_4, // Unused. Prevents switching to CAM_SET_HORSE when mounting a horse.
/* 5 */ ROOM_TYPE_BOSS // Disables Environment_AdjustLights
} RoomType;
typedef enum RoomEnvironmentType {
/* 0 */ ROOM_ENV_DEFAULT,
/* 1 */ ROOM_ENV_COLD,
/* 2 */ ROOM_ENV_WARM,
/* 3 */ ROOM_ENV_HOT, // Enables hot room timer for the current room
/* 4 */ ROOM_ENV_UNK_STRETCH_1,
/* 5 */ ROOM_ENV_UNK_STRETCH_2,
/* 6 */ ROOM_ENV_UNK_STRETCH_3
} RoomEnvironmentType;
typedef struct Room {
/* 0x00 */ s8 num; // -1 is invalid room
/* 0x01 */ u8 unk_01;
/* 0x02 */ u8 environmentType;
/* 0x03 */ u8 type;
/* 0x04 */ s8 echo;
/* 0x05 */ u8 lensMode;
/* 0x08 */ RoomShape* roomShape; // original name: "ground_shape"
/* 0x0C */ void* segment;
/* 0x10 */ char unk_10[0x4];
} Room; // size = 0x14
typedef struct RoomContext {
/* 0x00 */ Room curRoom;
/* 0x14 */ Room prevRoom;
/* 0x28 */ void* bufPtrs[2]; // Start and end pointers for the room buffer. Can be split into two pages, where page 0 is allocated from the start pointer and page 1 is allocated from the end pointer.
/* 0x30 */ u8 activeBufPage; // 0 - First page in memory, 1 - Last page in memory
/* 0x31 */ s8 status; // 0 - Free for new room request, 1 - DmaRequest for a new room is in progress
/* 0x34 */ void* roomRequestAddr; // Pointer to where the requested room segment will be stored
/* 0x38 */ DmaRequest dmaRequest;
/* 0x58 */ OSMesgQueue loadQueue;
/* 0x70 */ OSMesg loadMsg;
/* 0x74 */ s16 drawParams[2]; // context-specific data used by the current scene draw config
} RoomContext; // size = 0x78
typedef struct RoomList {
/* 0x00 */ u8 count;
/* 0x04 */ RomFile* romFiles; // Array of rom addresses for each room in a scene
} RoomList;
#define ROOM_DRAW_OPA (1 << 0)
#define ROOM_DRAW_XLU (1 << 1)
// Scene commands
typedef struct SCmdBase {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ u32 data2;
} SCmdBase;
typedef struct SCmdPlayerEntryList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ ActorEntry* data;
} SCmdPlayerEntryList;
typedef struct SCmdActorEntryList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ ActorEntry* data;
} SCmdActorEntryList;
typedef struct SCmdUnused02 {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ void* segment;
} SCmdUnused02;
typedef struct SCmdColHeader {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ CollisionHeader* data;
} SCmdColHeader;
typedef struct SCmdRoomList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ RomFile* data;
} SCmdRoomList;
typedef struct SCmdWindSettings {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x02 */ char pad[2];
/* 0x04 */ u8 x;
/* 0x05 */ u8 y;
/* 0x06 */ u8 z;
/* 0x07 */ u8 unk_07;
} SCmdWindSettings;
typedef struct SCmdSpawnList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ Spawn* data;
} SCmdSpawnList;
typedef struct SCmdSpecialFiles {
/* 0x00 */ u8 code;
/* 0x01 */ u8 naviQuestHintFileId;
/* 0x04 */ u32 keepObjectId;
} SCmdSpecialFiles;
typedef struct SCmdRoomBehavior {
/* 0x00 */ u8 code;
/* 0x01 */ u8 gpFlag1;
/* 0x04 */ u32 gpFlag2;
} SCmdRoomBehavior;
typedef struct SCmdMesh {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ RoomShapeBase* data;
} SCmdMesh;
typedef struct SCmdObjectList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ s16* data;
} SCmdObjectList;
typedef struct SCmdLightList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ LightInfo* data;
} SCmdLightList;
typedef struct SCmdPathList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ Path* data;
} SCmdPathList;
typedef struct SCmdTransiActorList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ TransitionActorEntry* data;
} SCmdTransiActorList;
typedef struct SCmdLightSettingList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ EnvLightSettings* data;
} SCmdLightSettingList;
typedef struct SCmdTimeSettings {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x02 */ char pad[2];
/* 0x04 */ u8 hour;
/* 0x05 */ u8 min;
/* 0x06 */ u8 timeSpeed;
} SCmdTimeSettings;
typedef struct SCmdSkyboxSettings {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x02 */ char pad[2];
/* 0x04 */ u8 skyboxId;
/* 0x05 */ u8 skyboxConfig;
/* 0x06 */ u8 envLightMode;
} SCmdSkyboxSettings;
typedef struct SCmdSkyboxDisables {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x02 */ char pad[2];
/* 0x04 */ u8 skyboxDisabled;
/* 0x05 */ u8 sunMoonDisabled;
} SCmdSkyboxDisables;
typedef struct SCmdEndMarker {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ u32 data2;
} SCmdEndMarker;
typedef struct SCmdExitList {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ s16* data;
} SCmdExitList;
typedef struct SCmdSoundSettings {
/* 0x00 */ u8 code;
/* 0x01 */ u8 specId;
/* 0x02 */ char pad[4];
/* 0x06 */ u8 natureAmbienceId;
/* 0x07 */ u8 seqId;
} SCmdSoundSettings;
typedef struct SCmdEchoSettings {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x02 */ char pad[5];
/* 0x07 */ u8 echo;
} SCmdEchoSettings;
typedef struct SCmdCutsceneData {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ void* data;
} SCmdCutsceneData;
typedef struct SCmdAltHeaders {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ void* data;
} SCmdAltHeaders;
typedef struct SCmdMiscSettings {
/* 0x00 */ u8 code;
/* 0x01 */ u8 sceneCamType;
/* 0x04 */ u32 area;
} SCmdMiscSettings;
typedef union SceneCmd {
SCmdBase base;
SCmdPlayerEntryList playerEntryList;
SCmdActorEntryList actorEntryList;
SCmdUnused02 unused02;
SCmdRoomList roomList;
SCmdSpawnList spawnList;
SCmdObjectList objectList;
SCmdLightList lightList;
SCmdPathList pathList;
SCmdTransiActorList transiActorList;
SCmdLightSettingList lightSettingList;
SCmdExitList exitList;
SCmdColHeader colHeader;
SCmdMesh mesh;
SCmdSpecialFiles specialFiles;
SCmdCutsceneData cutsceneData;
SCmdRoomBehavior roomBehavior;
SCmdWindSettings windSettings;
SCmdTimeSettings timeSettings;
SCmdSkyboxSettings skyboxSettings;
SCmdSkyboxDisables skyboxDisables;
SCmdEndMarker endMarker;
SCmdSoundSettings soundSettings;
SCmdEchoSettings echoSettings;
SCmdMiscSettings miscSettings;
SCmdAltHeaders altHeaders;
} SceneCmd; // size = 0x8
typedef BAD_RETURN(s32) (*SceneCmdHandlerFunc)(struct PlayState*, SceneCmd*);
#define DEFINE_SCENE(_0, _1, enum, _3, _4, _5) enum,
typedef enum SceneID {
#include "tables/scene_table.h"
/* 0x6E */ SCENE_ID_MAX
} SceneID;
#undef DEFINE_SCENE
// Fake enum values for scenes that are still referenced in the entrance table
#if !OOT_DEBUG
// Debug-only scenes
#define SCENE_TEST01 0x65
#define SCENE_BESITU 0x66
#define SCENE_DEPTH_TEST 0x67
#define SCENE_SYOTES 0x68
#define SCENE_SYOTES2 0x69
#define SCENE_SUTARU 0x6A
#define SCENE_HAIRAL_NIWA2 0x6B
#define SCENE_SASATEST 0x6C
#define SCENE_TESTROOM 0x6D
#endif
// Deleted scene
#define SCENE_UNUSED_6E 0x6E
// Macros for `EntranceInfo.field`
#define ENTRANCE_INFO_CONTINUE_BGM_FLAG (1 << 15)
#define ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG (1 << 14)
#define ENTRANCE_INFO_END_TRANS_TYPE_MASK 0x3F80
#define ENTRANCE_INFO_END_TRANS_TYPE_SHIFT 7
#define ENTRANCE_INFO_END_TRANS_TYPE(field) \
(((field) >> ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) \
& (ENTRANCE_INFO_END_TRANS_TYPE_MASK >> ENTRANCE_INFO_END_TRANS_TYPE_SHIFT))
#define ENTRANCE_INFO_START_TRANS_TYPE_MASK 0x7F
#define ENTRANCE_INFO_START_TRANS_TYPE_SHIFT 0
#define ENTRANCE_INFO_START_TRANS_TYPE(field) \
(((field) >> ENTRANCE_INFO_START_TRANS_TYPE_SHIFT) \
& (ENTRANCE_INFO_START_TRANS_TYPE_MASK >> ENTRANCE_INFO_START_TRANS_TYPE_SHIFT))
typedef struct EntranceInfo {
/* 0x00 */ s8 sceneId;
/* 0x01 */ s8 spawn;
/* 0x02 */ u16 field;
} EntranceInfo; // size = 0x4
// Entrance Index Enum
#define DEFINE_ENTRANCE(enum, _1, _2, _3, _4, _5, _6) enum,
typedef enum EntranceIndex {
#include "tables/entrance_table.h"
/* 0x614 */ ENTR_MAX
} EntranceIndex;
#undef DEFINE_ENTRANCE
#define ENTR_LOAD_OPENING -1
typedef enum ReturnEntranceIndex {
/* 0x7FF9 */ ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS = 0x7FF9,
/* 0x7FFA */ ENTR_RETURN_SHOOTING_GALLERY,
/* 0x7FFB */ ENTR_RETURN_2, // unused
/* 0x7FFC */ ENTR_RETURN_BAZAAR,
/* 0x7FFD */ ENTR_RETURN_4, // unused
/* 0x7FFE */ ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_MAGIC,
/* 0x7FFF */ ENTR_RETURN_GROTTO // Grottos and normal Fairy Fountain
} ReturnEntranceIndex;
typedef enum SceneDrawConfig {
/* 0 */ SDC_DEFAULT,
/* 1 */ SDC_HYRULE_FIELD,
/* 2 */ SDC_KAKARIKO_VILLAGE,
/* 3 */ SDC_ZORAS_RIVER,
/* 4 */ SDC_KOKIRI_FOREST,
/* 5 */ SDC_LAKE_HYLIA,
/* 6 */ SDC_ZORAS_DOMAIN,
/* 7 */ SDC_ZORAS_FOUNTAIN,
/* 8 */ SDC_GERUDO_VALLEY,
/* 9 */ SDC_LOST_WOODS,
/* 10 */ SDC_DESERT_COLOSSUS,
/* 11 */ SDC_GERUDOS_FORTRESS,
/* 12 */ SDC_HAUNTED_WASTELAND,
/* 13 */ SDC_HYRULE_CASTLE,
/* 14 */ SDC_DEATH_MOUNTAIN_TRAIL,
/* 15 */ SDC_DEATH_MOUNTAIN_CRATER,
/* 16 */ SDC_GORON_CITY,
/* 17 */ SDC_LON_LON_RANCH,
/* 18 */ SDC_FIRE_TEMPLE,
/* 19 */ SDC_DEKU_TREE,
/* 20 */ SDC_DODONGOS_CAVERN,
/* 21 */ SDC_JABU_JABU,
/* 22 */ SDC_FOREST_TEMPLE,
/* 23 */ SDC_WATER_TEMPLE,
/* 24 */ SDC_SHADOW_TEMPLE_AND_WELL,
/* 25 */ SDC_SPIRIT_TEMPLE,
/* 26 */ SDC_INSIDE_GANONS_CASTLE,
/* 27 */ SDC_GERUDO_TRAINING_GROUND,
/* 28 */ SDC_DEKU_TREE_BOSS,
/* 29 */ SDC_WATER_TEMPLE_BOSS,
/* 30 */ SDC_TEMPLE_OF_TIME,
/* 31 */ SDC_GROTTOS,
/* 32 */ SDC_CHAMBER_OF_THE_SAGES,
/* 33 */ SDC_GREAT_FAIRYS_FOUNTAIN,
/* 34 */ SDC_SHOOTING_GALLERY,
/* 35 */ SDC_CASTLE_COURTYARD_GUARDS,
/* 36 */ SDC_OUTSIDE_GANONS_CASTLE,
/* 37 */ SDC_ICE_CAVERN,
/* 38 */ SDC_GANONS_TOWER_COLLAPSE_EXTERIOR,
/* 39 */ SDC_FAIRYS_FOUNTAIN,
/* 40 */ SDC_THIEVES_HIDEOUT,
/* 41 */ SDC_BOMBCHU_BOWLING_ALLEY,
/* 42 */ SDC_ROYAL_FAMILYS_TOMB,
/* 43 */ SDC_LAKESIDE_LABORATORY,
/* 44 */ SDC_LON_LON_BUILDINGS,
/* 45 */ SDC_MARKET_GUARD_HOUSE,
/* 46 */ SDC_POTION_SHOP_GRANNY,
/* 47 */ SDC_CALM_WATER,
/* 48 */ SDC_GRAVE_EXIT_LIGHT_SHINING,
/* 49 */ SDC_BESITU,
/* 50 */ SDC_FISHING_POND,
/* 51 */ SDC_GANONS_TOWER_COLLAPSE_INTERIOR,
/* 52 */ SDC_INSIDE_GANONS_CASTLE_COLLAPSE,
/* 53 */ SDC_MAX
} SceneDrawConfig;
typedef void (*SceneDrawConfigFunc)(struct PlayState*);
// R_SCENE_CAM_TYPE values
#define SCENE_CAM_TYPE_DEFAULT 0
#define SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT 0x10 // Camera exhibits fixed behaviors and viewpoint changing is handled by shops
#define SCENE_CAM_TYPE_FIXED_TOGGLE_VIEWPOINT 0x20 // Camera exhibits fixed behaviors and viewpoint can be toggled with c-up
#define SCENE_CAM_TYPE_FIXED 0x30 // Camera exhibits fixed behaviors (see `Play_CamIsNotFixed` usages for examples)
#define SCENE_CAM_TYPE_FIXED_MARKET 0x40 // Camera exhibits fixed behaviors and delays textboxes by a small amount before they start to appear
#define SCENE_CAM_TYPE_SHOOTING_GALLERY 0x50 // Unreferenced in code, and used only by the main layer of the shooting gallery scene
// navi hints
typedef enum NaviQuestHintFileId {
NAVI_QUEST_HINTS_NONE,
NAVI_QUEST_HINTS_OVERWORLD,
NAVI_QUEST_HINTS_DUNGEON
} NaviQuestHintFileId;
// Scene commands
typedef enum SceneCommandTypeID {
/* 0x00 */ SCENE_CMD_ID_SPAWN_LIST,
/* 0x01 */ SCENE_CMD_ID_ACTOR_LIST,
/* 0x02 */ SCENE_CMD_ID_UNUSED_2,
/* 0x03 */ SCENE_CMD_ID_COLLISION_HEADER,
/* 0x04 */ SCENE_CMD_ID_ROOM_LIST,
/* 0x05 */ SCENE_CMD_ID_WIND_SETTINGS,
/* 0x06 */ SCENE_CMD_ID_ENTRANCE_LIST,
/* 0x07 */ SCENE_CMD_ID_SPECIAL_FILES,
/* 0x08 */ SCENE_CMD_ID_ROOM_BEHAVIOR,
/* 0x09 */ SCENE_CMD_ID_UNDEFINED_9,
/* 0x0A */ SCENE_CMD_ID_ROOM_SHAPE,
/* 0x0B */ SCENE_CMD_ID_OBJECT_LIST,
/* 0x0C */ SCENE_CMD_ID_LIGHT_LIST,
/* 0x0D */ SCENE_CMD_ID_PATH_LIST,
/* 0x0E */ SCENE_CMD_ID_TRANSITION_ACTOR_LIST,
/* 0x0F */ SCENE_CMD_ID_LIGHT_SETTINGS_LIST,
/* 0x10 */ SCENE_CMD_ID_TIME_SETTINGS,
/* 0x11 */ SCENE_CMD_ID_SKYBOX_SETTINGS,
/* 0x12 */ SCENE_CMD_ID_SKYBOX_DISABLES,
/* 0x13 */ SCENE_CMD_ID_EXIT_LIST,
/* 0x14 */ SCENE_CMD_ID_END,
/* 0x15 */ SCENE_CMD_ID_SOUND_SETTINGS,
/* 0x16 */ SCENE_CMD_ID_ECHO_SETTINGS,
/* 0x17 */ SCENE_CMD_ID_CUTSCENE_DATA,
/* 0x18 */ SCENE_CMD_ID_ALTERNATE_HEADER_LIST,
/* 0x19 */ SCENE_CMD_ID_MISC_SETTINGS,
/* 0x1A */ SCENE_CMD_ID_MAX
} SceneCommandTypeID;
#define SCENE_CMD_SPAWN_LIST(numSpawns, spawnList) \
{ SCENE_CMD_ID_SPAWN_LIST, numSpawns, CMD_PTR(spawnList) }
#define SCENE_CMD_ACTOR_LIST(numActors, actorList) \
{ SCENE_CMD_ID_ACTOR_LIST, numActors, CMD_PTR(actorList) }
#define SCENE_CMD_UNUSED_02(unk, data) \
{ SCENE_CMD_ID_UNUSED_2, unk, CMD_PTR(data) }
#define SCENE_CMD_COL_HEADER(colHeader) \
{ SCENE_CMD_ID_COLLISION_HEADER, 0, CMD_PTR(colHeader) }
#define SCENE_CMD_ROOM_LIST(numRooms, roomList) \
{ SCENE_CMD_ID_ROOM_LIST, numRooms, CMD_PTR(roomList) }
#define SCENE_CMD_WIND_SETTINGS(xDir, yDir, zDir, strength) \
{ SCENE_CMD_ID_WIND_SETTINGS, 0, CMD_BBBB(xDir, yDir, zDir, strength) }
#define SCENE_CMD_ENTRANCE_LIST(entranceList) \
{ SCENE_CMD_ID_ENTRANCE_LIST, 0, CMD_PTR(entranceList) }
#define SCENE_CMD_SPECIAL_FILES(naviQuestHintFileId, keepObjectId) \
{ SCENE_CMD_ID_SPECIAL_FILES, naviQuestHintFileId, CMD_W(keepObjectId) }
#define SCENE_CMD_ROOM_BEHAVIOR(type, environment, showInvisActors, disableWarpSongs) \
{ SCENE_CMD_ID_ROOM_BEHAVIOR, type, \
environment | _SHIFTL(showInvisActors, 8, 1) | _SHIFTL(disableWarpSongs, 10, 1) }
#define SCENE_CMD_UNK_09() \
{ SCENE_CMD_ID_UNDEFINED_9, 0, CMD_W(0) }
#define SCENE_CMD_ROOM_SHAPE(roomShape) \
{ SCENE_CMD_ID_ROOM_SHAPE, 0, CMD_PTR(roomShape) }
#define SCENE_CMD_OBJECT_LIST(numObjects, objectList) \
{ SCENE_CMD_ID_OBJECT_LIST, numObjects, CMD_PTR(objectList) }
#define SCENE_CMD_LIGHT_LIST(numLights, lightList) \
{ SCENE_CMD_ID_POS_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(numActors, list) \
{ SCENE_CMD_ID_TRANSITION_ACTOR_LIST, numActors, CMD_PTR(list) }
#define SCENE_CMD_ENV_LIGHT_SETTINGS(numLightSettings, lightSettingsList) \
{ SCENE_CMD_ID_LIGHT_SETTINGS_LIST, numLightSettings, CMD_PTR(lightSettingsList) }
#define SCENE_CMD_TIME_SETTINGS(hour, min, timeSpeed) \
{ SCENE_CMD_ID_TIME_SETTINGS, 0, CMD_BBBB(hour, min, timeSpeed, 0) }
#define SCENE_CMD_SKYBOX_SETTINGS(skyboxId, skyboxConfig, envLightMode) \
{ SCENE_CMD_ID_SKYBOX_SETTINGS, 0, CMD_BBBB(skyboxId, skyboxConfig, envLightMode, 0) }
#define SCENE_CMD_SKYBOX_DISABLES(disableSky, disableSunMoon) \
{ SCENE_CMD_ID_SKYBOX_DISABLES, 0, CMD_BBBB(disableSky, disableSunMoon, 0, 0) }
#define SCENE_CMD_EXIT_LIST(exitList) \
{ SCENE_CMD_ID_EXIT_LIST, 0, CMD_PTR(exitList) }
#define SCENE_CMD_END() \
{ SCENE_CMD_ID_END, 0, CMD_W(0) }
#define SCENE_CMD_SOUND_SETTINGS(specId, natureAmbienceId, seqId) \
{ SCENE_CMD_ID_SOUND_SETTINGS, specId, CMD_BBBB(0, 0, natureAmbienceId, seqId) }
#define SCENE_CMD_ECHO_SETTINGS(echo) \
{ SCENE_CMD_ID_ECHO_SETTINGS, 0, CMD_BBBB(0, 0, 0, echo) }
#define SCENE_CMD_CUTSCENE_DATA(cutsceneData) \
{ SCENE_CMD_ID_CUTSCENE_DATA, 0, CMD_PTR(cutsceneData) }
#define SCENE_CMD_ALTERNATE_HEADER_LIST(alternateHeaderList) \
{ SCENE_CMD_ID_ALTERNATE_HEADER_LIST, 0, CMD_PTR(alternateHeaderList) }
#define SCENE_CMD_MISC_SETTINGS(sceneCamType, worldMapLocation) \
{ SCENE_CMD_ID_MISC_SETTINGS, sceneCamType, CMD_W(worldMapLocation) }
s32 Scene_ExecuteCommands(struct PlayState* play, SceneCmd* sceneCmd);
void Scene_ResetTransitionActorList(struct GameState* state, TransitionActorList* transitionActors);
void Scene_SetTransitionForNextEntrance(struct PlayState* play);
void Scene_Draw(struct PlayState* play);
extern EntranceInfo gEntranceTable[ENTR_MAX];
extern SceneTableEntry gSceneTable[SCENE_ID_MAX];
#endif