2ship2harkinian/include/z64cutscene.h
engineer124 4d74fed7f0
Cutscene Camera OK (Some Docs) (#1411)
* import WIP

* Match func_80161E4C

* Match func_801620CC

* Match func_80162FF8

* Match func_801631DC

* Match func_80162FF8

* Import bss

* fix bss

* type docs

* more docs?

* waypoint?

* names

* cleanup

* PR Review

* comments

* PR Review

* waypoints as 1 word

* adjust names

* Path order

* remove pathing

* fix bss

---------

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
2023-10-31 12:44:36 +11:00

868 lines
30 KiB
C

#ifndef Z64CUTSCENE_H
#define Z64CUTSCENE_H
#include "ultra64.h"
#include "unk.h"
typedef union {
struct {
/* 0x00 */ u16 id; // "dousa"
/* 0x02 */ u16 startFrame;
/* 0x04 */ u16 endFrame;
/* 0x06 */ Vec3us rot;
/* 0x0C */ Vec3i startPos;
/* 0x18 */ Vec3i endPos;
/* 0x24 */ Vec3f normal;
};
s32 _words[12];
} CsCmdActorCue; // size = 0x30
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
};
s32 _words[2];
} CsCmdMisc; // size = 0x30
typedef union {
struct {
/* 0x0 */ u16 unused0;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
/* 0x6 */ u8 hour;
/* 0x7 */ u8 minute;
};
s32 _words[3];
} CsCmdTime; // size = 0xC
typedef union {
struct {
/* 0x0 */ u16 settingPlusOne;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdLightSetting; // size = 0x8
typedef union {
struct {
/* 0x0 */ u16 seqIdPlusOne;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
};
s32 _words[2];
} CsCmdStartSeq; // size = 0x8
typedef union {
struct {
/* 0x0 */ u16 seqIdPlusOne;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
};
s32 _words[2];
} CsCmdStopSeq; // size = 0x8
typedef union {
struct {
/* 0x0 */ u16 seqPlayer;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
};
s32 _words[3];
} CsCmdFadeOutSeq; // size = 0xC
typedef enum {
/* 1 */ CS_FADE_OUT_BGM_MAIN = 1,
/* 2 */ CS_FADE_OUT_FANFARE
} CutsceneFadeOutSeqPlayer;
typedef union {
struct {
/* 0x0 */ u16 unused0;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdStartAmbience; // size = 0x8
typedef union {
struct {
/* 0x0 */ u16 unused0;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
};
s32 _words[2];
} CsCmdFadeOutAmbience; // size = 0x8
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdModifySeq; // size = 0x8
typedef enum {
/* 1 */ CS_MOD_SEQ_0 = 1,
/* 2 */ CS_MOD_SEQ_1,
/* 3 */ CS_MOD_SEQ_2,
/* 4 */ CS_MOD_AMBIENCE_0,
/* 5 */ CS_MOD_AMBIENCE_1,
/* 6 */ CS_MOD_AMBIENCE_2,
/* 7 */ CS_MOD_SEQ_STORE,
/* 8 */ CS_MOD_SEQ_RESTORE
} CsModifySeqType;
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdDestination; // size = 0x8
typedef enum {
/* 1 */ CS_DESTINATION_DEFAULT = 1,
/* 2 */ CS_DESTINATION_BOSS_WARP
} CsDestinationType;
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdChooseCreditsScene; // size = 0x8
typedef enum {
/* 1 */ CS_CREDITS_DESTINATION = CS_DESTINATION_DEFAULT,
/* 2 */ CS_CREDITS_MASK_KAMARO,
/* 3 */ CS_CREDITS_MASK_GREAT_FAIRY,
/* 4 */ CS_CREDITS_MASK_ROMANI,
/* 5 */ CS_CREDITS_MASK_BLAST,
/* 6 */ CS_CREDITS_MASK_CIRCUS_LEADER,
/* 7 */ CS_CREDITS_MASK_BREMEN,
/* 8 */ CS_CREDITS_IKANA,
/* 9 */ CS_CREDITS_MASK_COUPLE,
/* 10 */ CS_CREDITS_MASK_BUNNY,
/* 11 */ CS_CREDITS_MASK_POSTMAN
} CsChooseCreditsSceneType;
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
};
s32 _words[2];
} CsCmdMotionBlur; // size = 0x8
typedef enum {
/* 1 */ CS_MOTION_BLUR_ENABLE = 1, // enable instantly
/* 2 */ CS_MOTION_BLUR_DISABLE // disable gradually
} CsMotionBlurType;
typedef union {
struct {
/* 0x0 */ u16 unused0;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdSfxReverbIndexTo2; // size = 0x8
typedef union {
struct {
/* 0x0 */ u16 unused0;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdSfxReverbIndexTo1; // size = 0x8
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
};
s32 _words[2];
} CsCmdTransition; // size = 0x8
typedef enum {
/* 1 */ CS_TRANS_GRAY_FILL_IN = 1, // has hardcoded sounds for some scenes
/* 2 */ CS_TRANS_BLUE_FILL_IN,
/* 3 */ CS_TRANS_RED_FILL_OUT,
/* 4 */ CS_TRANS_GREEN_FILL_OUT,
/* 5 */ CS_TRANS_GRAY_FILL_OUT,
/* 6 */ CS_TRANS_BLUE_FILL_OUT,
/* 7 */ CS_TRANS_RED_FILL_IN,
/* 8 */ CS_TRANS_GREEN_FILL_IN,
/* 9 */ CS_TRANS_TRIGGER_INSTANCE, // used with `TRANS_MODE_INSTANCE_WAIT`
/* 10 */ CS_TRANS_BLACK_FILL_OUT,
/* 11 */ CS_TRANS_BLACK_FILL_IN,
/* 12 */ CS_TRANS_GRAY_TO_BLACK,
/* 13 */ CS_TRANS_BLACK_TO_GRAY
} CutsceneTransitionType;
typedef union {
struct {
/* 0x0 */ u16 textId; // can also be an ocarina action for `CS_TEXT_OCARINA_ACTION`
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
/* 0x6 */ u16 type;
/* 0x8 */ u16 altTextId1;
/* 0xA */ u16 altTextId2;
};
s32 _words[3];
} CsCmdText; // size = 0xC
typedef enum {
/* -1 */ CS_TEXT_TYPE_NONE = -1,
/* 0 */ CS_TEXT_TYPE_DEFAULT,
/* 1 */ CS_TEXT_TYPE_1,
/* 2 */ CS_TEXT_OCARINA_ACTION,
/* 3 */ CS_TEXT_TYPE_3,
/* 4 */ CS_TEXT_TYPE_BOSSES_REMAINS, // use `altText1` in the Giant Cutscene if all remains are already obtained
/* 5 */ CS_TEXT_TYPE_ALL_NORMAL_MASKS
} CutsceneTextType;
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
/* 0x6 */ u8 intensity;
/* 0x7 */ u8 decayTimer;
/* 0x8 */ u8 decayStep;
};
s32 _words[3];
} CsCmdRumble; // size = 0xC
typedef enum {
/* 1 */ CS_RUMBLE_ONCE = 1, // rumble once when startFrame is reached
/* 2 */ CS_RUMBLE_PULSE // rumble every 64 frames between startFrame and endFrame
} CutsceneRumbleType;
typedef union {
struct {
/* 0x0 */ u16 type;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame;
/* 0x6 */ Color_RGB8 color;
};
s32 _words[3];
} CsCmdTransitionGeneral; // size = 0xC
typedef enum {
/* 1 */ CS_TRANS_GENERAL_FILL_IN = 1,
/* 2 */ CS_TRANS_GENERAL_FILL_OUT
} CsTransitionGeneralType;
typedef union {
struct {
/* 0x0 */ u16 giveTatl;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdGiveTatl; // size = 0x8
typedef enum {
/* 0 */ CS_STATE_IDLE,
/* 1 */ CS_STATE_START,
/* 2 */ CS_STATE_RUN,
/* 3 */ CS_STATE_STOP,
/* 4 */ CS_STATE_RUN_UNSTOPPABLE
} CutsceneState;
typedef union {
struct {
/* 0x0 */ u16 unused0;
/* 0x2 */ u16 startFrame;
/* 0x4 */ u16 endFrame; // unused
};
s32 _words[2];
} CsCmdUnimplemented; // size = 0x8
typedef enum {
/* 0x00A */ CS_CMD_TEXT = 10,
/* 0x05A */ CS_CMD_CAMERA_SPLINE = 90,
/* 0x064 */ CS_CMD_ACTOR_CUE_100 = 100,
/* 0x065 */ CS_CMD_ACTOR_CUE_101,
/* 0x066 */ CS_CMD_ACTOR_CUE_102,
/* 0x067 */ CS_CMD_ACTOR_CUE_103,
/* 0x068 */ CS_CMD_ACTOR_CUE_104,
/* 0x069 */ CS_CMD_ACTOR_CUE_105,
/* 0x06A */ CS_CMD_ACTOR_CUE_106,
/* 0x06B */ CS_CMD_ACTOR_CUE_107,
/* 0x06C */ CS_CMD_ACTOR_CUE_108,
/* 0x06D */ CS_CMD_ACTOR_CUE_109,
/* 0x06E */ CS_CMD_ACTOR_CUE_110,
/* 0x06F */ CS_CMD_ACTOR_CUE_111,
/* 0x070 */ CS_CMD_ACTOR_CUE_112,
/* 0x071 */ CS_CMD_ACTOR_CUE_113,
/* 0x072 */ CS_CMD_ACTOR_CUE_114,
/* 0x073 */ CS_CMD_ACTOR_CUE_115,
/* 0x074 */ CS_CMD_ACTOR_CUE_116,
/* 0x075 */ CS_CMD_ACTOR_CUE_117,
/* 0x076 */ CS_CMD_ACTOR_CUE_118,
/* 0x077 */ CS_CMD_ACTOR_CUE_119,
/* 0x078 */ CS_CMD_ACTOR_CUE_120,
/* 0x079 */ CS_CMD_ACTOR_CUE_121,
/* 0x07A */ CS_CMD_ACTOR_CUE_122,
/* 0x07B */ CS_CMD_ACTOR_CUE_123,
/* 0x07C */ CS_CMD_ACTOR_CUE_124,
/* 0x07D */ CS_CMD_ACTOR_CUE_125,
/* 0x07E */ CS_CMD_ACTOR_CUE_126,
/* 0x07F */ CS_CMD_ACTOR_CUE_127,
/* 0x080 */ CS_CMD_ACTOR_CUE_128,
/* 0x081 */ CS_CMD_ACTOR_CUE_129,
/* 0x082 */ CS_CMD_ACTOR_CUE_130,
/* 0x083 */ CS_CMD_ACTOR_CUE_131,
/* 0x084 */ CS_CMD_ACTOR_CUE_132,
/* 0x085 */ CS_CMD_ACTOR_CUE_133,
/* 0x086 */ CS_CMD_ACTOR_CUE_134,
/* 0x087 */ CS_CMD_ACTOR_CUE_135,
/* 0x088 */ CS_CMD_ACTOR_CUE_136,
/* 0x089 */ CS_CMD_ACTOR_CUE_137,
/* 0x08A */ CS_CMD_ACTOR_CUE_138,
/* 0x08B */ CS_CMD_ACTOR_CUE_139,
/* 0x08C */ CS_CMD_ACTOR_CUE_140,
/* 0x08D */ CS_CMD_ACTOR_CUE_141,
/* 0x08E */ CS_CMD_ACTOR_CUE_142,
/* 0x08F */ CS_CMD_ACTOR_CUE_143,
/* 0x090 */ CS_CMD_ACTOR_CUE_144,
/* 0x091 */ CS_CMD_ACTOR_CUE_145,
/* 0x092 */ CS_CMD_ACTOR_CUE_146,
/* 0x093 */ CS_CMD_ACTOR_CUE_147,
/* 0x094 */ CS_CMD_ACTOR_CUE_148,
/* 0x095 */ CS_CMD_ACTOR_CUE_149,
/* 0x096 */ CS_CMD_MISC,
/* 0x097 */ CS_CMD_LIGHT_SETTING,
/* 0x098 */ CS_CMD_TRANSITION,
/* 0x099 */ CS_CMD_MOTION_BLUR,
/* 0x09A */ CS_CMD_GIVE_TATL,
/* 0x09B */ CS_CMD_TRANSITION_GENERAL,
/* 0x09C */ CS_CMD_FADE_OUT_SEQ,
/* 0x09D */ CS_CMD_TIME,
/* 0x0C8 */ CS_CMD_PLAYER_CUE = 200,
/* 0x0C9 */ CS_CMD_ACTOR_CUE_201,
/* 0x0FA */ CS_CMD_UNK_DATA_FA = 0xFA,
/* 0x0FE */ CS_CMD_UNK_DATA_FE = 0xFE,
/* 0x0FF */ CS_CMD_UNK_DATA_FF,
/* 0x100 */ CS_CMD_UNK_DATA_100,
/* 0x101 */ CS_CMD_UNK_DATA_101,
/* 0x102 */ CS_CMD_UNK_DATA_102,
/* 0x103 */ CS_CMD_UNK_DATA_103,
/* 0x104 */ CS_CMD_UNK_DATA_104,
/* 0x105 */ CS_CMD_UNK_DATA_105,
/* 0x108 */ CS_CMD_UNK_DATA_108 = 0x108,
/* 0x109 */ CS_CMD_UNK_DATA_109,
/* 0x12C */ CS_CMD_START_SEQ = 300,
/* 0x12D */ CS_CMD_STOP_SEQ,
/* 0x12E */ CS_CMD_START_AMBIENCE,
/* 0x12F */ CS_CMD_FADE_OUT_AMBIENCE,
/* 0x130 */ CS_CMD_SFX_REVERB_INDEX_2,
/* 0x131 */ CS_CMD_SFX_REVERB_INDEX_1,
/* 0x132 */ CS_CMD_MODIFY_SEQ,
/* 0x15E */ CS_CMD_DESTINATION = 350,
/* 0x15F */ CS_CMD_CHOOSE_CREDITS_SCENES,
/* 0x190 */ CS_CMD_RUMBLE = 400,
/* 0x1C2 */ CS_CMD_ACTOR_CUE_450 = 450,
/* 0x1C3 */ CS_CMD_ACTOR_CUE_451,
/* 0x1C4 */ CS_CMD_ACTOR_CUE_452,
/* 0x1C5 */ CS_CMD_ACTOR_CUE_453,
/* 0x1C6 */ CS_CMD_ACTOR_CUE_454,
/* 0x1C7 */ CS_CMD_ACTOR_CUE_455,
/* 0x1C8 */ CS_CMD_ACTOR_CUE_456,
/* 0x1C9 */ CS_CMD_ACTOR_CUE_457,
/* 0x1CA */ CS_CMD_ACTOR_CUE_458,
/* 0x1CB */ CS_CMD_ACTOR_CUE_459,
/* 0x1CC */ CS_CMD_ACTOR_CUE_460,
/* 0x1CD */ CS_CMD_ACTOR_CUE_461,
/* 0x1CE */ CS_CMD_ACTOR_CUE_462,
/* 0x1CF */ CS_CMD_ACTOR_CUE_463,
/* 0x1D0 */ CS_CMD_ACTOR_CUE_464,
/* 0x1D1 */ CS_CMD_ACTOR_CUE_465,
/* 0x1D2 */ CS_CMD_ACTOR_CUE_466,
/* 0x1D3 */ CS_CMD_ACTOR_CUE_467,
/* 0x1D4 */ CS_CMD_ACTOR_CUE_468,
/* 0x1D5 */ CS_CMD_ACTOR_CUE_469,
/* 0x1D6 */ CS_CMD_ACTOR_CUE_470,
/* 0x1D7 */ CS_CMD_ACTOR_CUE_471,
/* 0x1D8 */ CS_CMD_ACTOR_CUE_472,
/* 0x1D9 */ CS_CMD_ACTOR_CUE_473,
/* 0x1DA */ CS_CMD_ACTOR_CUE_474,
/* 0x1DB */ CS_CMD_ACTOR_CUE_475,
/* 0x1DC */ CS_CMD_ACTOR_CUE_476,
/* 0x1DD */ CS_CMD_ACTOR_CUE_477,
/* 0x1DE */ CS_CMD_ACTOR_CUE_478,
/* 0x1DF */ CS_CMD_ACTOR_CUE_479,
/* 0x1E0 */ CS_CMD_ACTOR_CUE_480,
/* 0x1E1 */ CS_CMD_ACTOR_CUE_481,
/* 0x1E2 */ CS_CMD_ACTOR_CUE_482,
/* 0x1E3 */ CS_CMD_ACTOR_CUE_483,
/* 0x1E4 */ CS_CMD_ACTOR_CUE_484,
/* 0x1E5 */ CS_CMD_ACTOR_CUE_485,
/* 0x1E6 */ CS_CMD_ACTOR_CUE_486,
/* 0x1E7 */ CS_CMD_ACTOR_CUE_487,
/* 0x1E8 */ CS_CMD_ACTOR_CUE_488,
/* 0x1E9 */ CS_CMD_ACTOR_CUE_489,
/* 0x1EA */ CS_CMD_ACTOR_CUE_490,
/* 0x1EB */ CS_CMD_ACTOR_CUE_491,
/* 0x1EC */ CS_CMD_ACTOR_CUE_492,
/* 0x1ED */ CS_CMD_ACTOR_CUE_493,
/* 0x1EE */ CS_CMD_ACTOR_CUE_494,
/* 0x1EF */ CS_CMD_ACTOR_CUE_495,
/* 0x1F0 */ CS_CMD_ACTOR_CUE_496,
/* 0x1F1 */ CS_CMD_ACTOR_CUE_497,
/* 0x1F2 */ CS_CMD_ACTOR_CUE_498,
/* 0x1F3 */ CS_CMD_ACTOR_CUE_499,
/* 0x1F4 */ CS_CMD_ACTOR_CUE_500,
/* 0x1F5 */ CS_CMD_ACTOR_CUE_501,
/* 0x1F6 */ CS_CMD_ACTOR_CUE_502,
/* 0x1F7 */ CS_CMD_ACTOR_CUE_503,
/* 0x1F8 */ CS_CMD_ACTOR_CUE_504,
/* 0x1F9 */ CS_CMD_ACTOR_CUE_SOTCS, // Song of Time Cutscenes (Double SoT, Three-Day Reset SoT)
/* 0x1FA */ CS_CMD_ACTOR_CUE_506,
/* 0x1FB */ CS_CMD_ACTOR_CUE_507,
/* 0x1FC */ CS_CMD_ACTOR_CUE_508,
/* 0x1FD */ CS_CMD_ACTOR_CUE_509,
/* 0x1FE */ CS_CMD_ACTOR_CUE_510,
/* 0x1FF */ CS_CMD_ACTOR_CUE_511,
/* 0x200 */ CS_CMD_ACTOR_CUE_512,
/* 0x201 */ CS_CMD_ACTOR_CUE_513,
/* 0x202 */ CS_CMD_ACTOR_CUE_514,
/* 0x203 */ CS_CMD_ACTOR_CUE_515,
/* 0x204 */ CS_CMD_ACTOR_CUE_516,
/* 0x205 */ CS_CMD_ACTOR_CUE_517,
/* 0x206 */ CS_CMD_ACTOR_CUE_518,
/* 0x207 */ CS_CMD_ACTOR_CUE_519,
/* 0x208 */ CS_CMD_ACTOR_CUE_520,
/* 0x209 */ CS_CMD_ACTOR_CUE_521,
/* 0x20A */ CS_CMD_ACTOR_CUE_522,
/* 0x20B */ CS_CMD_ACTOR_CUE_523,
/* 0x20C */ CS_CMD_ACTOR_CUE_524,
/* 0x20D */ CS_CMD_ACTOR_CUE_525,
/* 0x20E */ CS_CMD_ACTOR_CUE_526,
/* 0x20F */ CS_CMD_ACTOR_CUE_527,
/* 0x210 */ CS_CMD_ACTOR_CUE_528,
/* 0x211 */ CS_CMD_ACTOR_CUE_529,
/* 0x212 */ CS_CMD_ACTOR_CUE_530,
/* 0x213 */ CS_CMD_ACTOR_CUE_531,
/* 0x214 */ CS_CMD_ACTOR_CUE_532,
/* 0x215 */ CS_CMD_ACTOR_CUE_533,
/* 0x216 */ CS_CMD_ACTOR_CUE_534,
/* 0x217 */ CS_CMD_ACTOR_CUE_535,
/* 0x218 */ CS_CMD_ACTOR_CUE_536,
/* 0x219 */ CS_CMD_ACTOR_CUE_537,
/* 0x21A */ CS_CMD_ACTOR_CUE_538,
/* 0x21B */ CS_CMD_ACTOR_CUE_539,
/* 0x21C */ CS_CMD_ACTOR_CUE_540,
/* 0x21D */ CS_CMD_ACTOR_CUE_541,
/* 0x21E */ CS_CMD_ACTOR_CUE_542,
/* 0x21F */ CS_CMD_ACTOR_CUE_543,
/* 0x220 */ CS_CMD_ACTOR_CUE_544,
/* 0x221 */ CS_CMD_ACTOR_CUE_545,
/* 0x222 */ CS_CMD_ACTOR_CUE_546,
/* 0x223 */ CS_CMD_ACTOR_CUE_547,
/* 0x224 */ CS_CMD_ACTOR_CUE_548,
/* 0x225 */ CS_CMD_ACTOR_CUE_549,
/* 0x226 */ CS_CMD_ACTOR_CUE_550,
/* 0x227 */ CS_CMD_ACTOR_CUE_551,
/* 0x228 */ CS_CMD_ACTOR_CUE_552,
/* 0x229 */ CS_CMD_ACTOR_CUE_553,
/* 0x22A */ CS_CMD_ACTOR_CUE_554,
/* 0x22B */ CS_CMD_ACTOR_CUE_555,
/* 0x22C */ CS_CMD_ACTOR_CUE_556,
/* 0x22D */ CS_CMD_ACTOR_CUE_557, // Couple's Mask cs, Anju cues
/* 0x22E */ CS_CMD_ACTOR_CUE_558,
/* 0x22F */ CS_CMD_ACTOR_CUE_559,
/* 0x230 */ CS_CMD_ACTOR_CUE_560,
/* 0x231 */ CS_CMD_ACTOR_CUE_561,
/* 0x232 */ CS_CMD_ACTOR_CUE_562,
/* 0x233 */ CS_CMD_ACTOR_CUE_563,
/* 0x234 */ CS_CMD_ACTOR_CUE_564,
/* 0x235 */ CS_CMD_ACTOR_CUE_565,
/* 0x236 */ CS_CMD_ACTOR_CUE_566,
/* 0x237 */ CS_CMD_ACTOR_CUE_567,
/* 0x238 */ CS_CMD_ACTOR_CUE_568,
/* 0x239 */ CS_CMD_ACTOR_CUE_569,
/* 0x23A */ CS_CMD_ACTOR_CUE_570,
/* 0x23B */ CS_CMD_ACTOR_CUE_571,
/* 0x23C */ CS_CMD_ACTOR_CUE_572,
/* 0x23D */ CS_CMD_ACTOR_CUE_573,
/* 0x23E */ CS_CMD_ACTOR_CUE_574,
/* 0x23F */ CS_CMD_ACTOR_CUE_575,
/* 0x240 */ CS_CMD_ACTOR_CUE_576,
/* 0x241 */ CS_CMD_ACTOR_CUE_577,
/* 0x242 */ CS_CMD_ACTOR_CUE_578,
/* 0x243 */ CS_CMD_ACTOR_CUE_579,
/* 0x244 */ CS_CMD_ACTOR_CUE_580,
/* 0x245 */ CS_CMD_ACTOR_CUE_581,
/* 0x246 */ CS_CMD_ACTOR_CUE_582,
/* 0x247 */ CS_CMD_ACTOR_CUE_583,
/* 0x248 */ CS_CMD_ACTOR_CUE_584,
/* 0x249 */ CS_CMD_ACTOR_CUE_585,
/* 0x24A */ CS_CMD_ACTOR_CUE_586,
/* 0x24B */ CS_CMD_ACTOR_CUE_587,
/* 0x24C */ CS_CMD_ACTOR_CUE_588,
/* 0x24D */ CS_CMD_ACTOR_CUE_589,
/* 0x24E */ CS_CMD_ACTOR_CUE_590,
/* 0x24F */ CS_CMD_ACTOR_CUE_591,
/* 0x250 */ CS_CMD_ACTOR_CUE_592,
/* 0x251 */ CS_CMD_ACTOR_CUE_593,
/* 0x252 */ CS_CMD_ACTOR_CUE_594,
/* 0x253 */ CS_CMD_ACTOR_CUE_595,
/* 0x254 */ CS_CMD_ACTOR_CUE_596,
/* 0x255 */ CS_CMD_ACTOR_CUE_597,
/* 0x256 */ CS_CMD_ACTOR_CUE_598,
/* 0x257 */ CS_CMD_ACTOR_CUE_599,
/* -2 */ CS_CMD_ACTOR_CUE_POST_PROCESS = 0xFFFFFFFE,
/* -1 */ CS_CAM_STOP // OoT Remnant
} CutsceneCmd;
typedef enum {
/* 0x00 */ CS_MISC_UNIMPLEMENTED_0,
/* 0x01 */ CS_MISC_RAIN,
/* 0x02 */ CS_MISC_LIGHTNING,
/* 0x03 */ CS_MISC_LIFT_FOG,
/* 0x04 */ CS_MISC_CLOUDY_SKY,
/* 0x05 */ CS_MISC_STOP_CUTSCENE,
/* 0x06 */ CS_MISC_UNIMPLEMENTED_6,
/* 0x07 */ CS_MISC_SHOW_TITLE_CARD,
/* 0x08 */ CS_MISC_EARTHQUAKE_MEDIUM,
/* 0x09 */ CS_MISC_EARTHQUAKE_STOP,
/* 0x0A */ CS_MISC_VISMONO_BLACK_AND_WHITE,
/* 0x0B */ CS_MISC_VISMONO_SEPIA,
/* 0x0C */ CS_MISC_HIDE_ROOM,
/* 0x0D */ CS_MISC_RED_PULSATING_LIGHTS,
/* 0x0E */ CS_MISC_HALT_ALL_ACTORS,
/* 0x0F */ CS_MISC_RESUME_ALL_ACTORS,
/* 0x10 */ CS_MISC_SANDSTORM_FILL,
/* 0x11 */ CS_MISC_SUNSSONG_START,
/* 0x12 */ CS_MISC_FREEZE_TIME,
/* 0x13 */ CS_MISC_LONG_SCARECROW_SONG,
/* 0x14 */ CS_MISC_SET_CSFLAG_3,
/* 0x15 */ CS_MISC_SET_CSFLAG_4,
/* 0x16 */ CS_MISC_PLAYER_FORM_DEKU,
/* 0x17 */ CS_MISC_ENABLE_PLAYER_REFLECTION,
/* 0x18 */ CS_MISC_DISABLE_PLAYER_REFLECTION,
/* 0x19 */ CS_MISC_PLAYER_FORM_HUMAN,
/* 0x1A */ CS_MISC_EARTHQUAKE_STRONG,
/* 0x1B */ CS_MISC_DEST_MOON_CRASH_FIRE_WALL,
/* 0x1C */ CS_MISC_MOON_CRASH_SKYBOX,
/* 0x1D */ CS_MISC_PLAYER_FORM_RESTORED,
/* 0x1E */ CS_MISC_DISABLE_PLAYER_CSACTION_START_POS,
/* 0x1F */ CS_MISC_ENABLE_PLAYER_CSACTION_START_POS,
/* 0x20 */ CS_MISC_UNIMPLEMENTED_20,
/* 0x21 */ CS_MISC_SAVE_ENTER_CLOCK_TOWN,
/* 0x22 */ CS_MISC_RESET_SAVE_FROM_MOON_CRASH,
/* 0x23 */ CS_MISC_TIME_ADVANCE,
/* 0x24 */ CS_MISC_EARTHQUAKE_WEAK,
/* 0x25 */ CS_MISC_UNIMPLEMENTED_25,
/* 0x26 */ CS_MISC_DAWN_OF_A_NEW_DAY,
/* 0x27 */ CS_MISC_PLAYER_FORM_ZORA,
/* 0x28 */ CS_MISC_FINALE
} CutsceneMiscType;
typedef union CutsceneData {
s32 i;
f32 f;
s16 s[2];
s8 b[4];
} CutsceneData;
// Do not trigger the scripted cutscene upon any spawn
#define CS_SPAWN_FLAG_NONE 0xFF
// Always trigger the scripted cutscene upon the specified spawn
#define CS_SPAWN_FLAG_ALWAYS 0xFE
// Trigger the scripted cutscene once upon the specified spawn if `weekEventFlags` is not set. Set `weekEventFlags` after the cutscene.
//! @note Despite there being more than `0x1F` indices for weekEventFlags, this u8 flag entry can only check weekEventFlags with indices [0 - 0x1F]
#define CS_SPAWN_FLAG_ONCE(weekEventFlag) ((((weekEventFlag) & 0x1F00) >> 5) | BIT_FLAG_TO_SHIFT((weekEventFlag) & 0xFF))
#define CHECK_CS_SPAWN_FLAG_WEEKEVENTREG(spawnFlags) (GET_WEEKEVENTREG((spawnFlags) / 8) & (1 << ((spawnFlags) % 8)))
#define SET_CS_SPAWN_FLAG_WEEKEVENTREG(spawnFlags) (WEEKEVENTREG((spawnFlags) / 8) = GET_WEEKEVENTREG((spawnFlags) / 8) | (1 << ((spawnFlags) % 8)))
typedef struct {
/* 0x0 */ CutsceneData* script;
/* 0x4 */ s16 nextEntrance;
/* 0x6 */ u8 spawn;
/* 0x7 */ u8 spawnFlags; // See `CS_SPAWN_FLAG_`
} CutsceneScriptEntry; // size = 0x8
// ZAPD compatibility typedefs
// TODO: Remove when ZAPD adds support for them
typedef CutsceneScriptEntry CutsceneEntry;
typedef struct {
/* 0x00 */ u8 scriptListCount;
/* 0x04 */ CutsceneData* script;
/* 0x08 */ u8 state;
/* 0x0C */ f32 timer;
/* 0x10 */ u16 curFrame;
/* 0x12 */ u16 scriptIndex;
/* 0x14 */ s32 subCamId;
/* 0x18 */ u16 camEyeSplinePointsAppliedFrame; // Remnant of OoT. Set but never used.
/* 0x1C */ UNK_TYPE1 unk_1C[0xA]; // Remnant of cam data from OoT
/* 0x24 */ CsCmdActorCue* playerCue;
/* 0x28 */ CsCmdActorCue* actorCues[10]; // "npcdemopnt"
/* 0x50 */ CutsceneScriptEntry* scriptList;
} CutsceneContext; // size = 0x54
/* Actor Cutscenes, which encompasses all cutscenes */
typedef struct {
/* 0x00 */ s16 priority; // Lower means higher priority. -1 means it ignores priority
/* 0x02 */ s16 length;
/* 0x04 */ s16 csCamId; // Index of CsCameraEntry to use. Negative indices use sGlobalCamDataSettings. Indices 0 and above use CsCameraEntry from a sceneLayer
/* 0x06 */ s16 scriptIndex;
/* 0x08 */ s16 additionalCsId;
/* 0x0A */ u8 endSfx;
/* 0x0B */ u8 customValue; // 0 - 99: actor-specific custom value. 100+: spawn. 255: none
/* 0x0C */ s16 hudVisibility;
/* 0x0E */ u8 endCam;
/* 0x0F */ u8 letterboxSize;
} ActorCutscene; // size = 0x10
// TODO: rename `ActorCutscene` to `CutsceneEntry` once ZAPD uses `CutsceneScriptEntry`
// typedef CutsceneEntry ActorCutscene;
typedef enum {
/* -1 */ CS_ID_NONE = -1,
// CsId's 0 - 119 are sceneLayer-specific and index `ActorCutscene`
/* 0x78 */ CS_ID_GLOBAL_78 = 120,
/* 0x79 */ CS_ID_GLOBAL_79,
/* 0x7A */ CS_ID_GLOBAL_7A,
/* 0x7B */ CS_ID_GLOBAL_ELEGY,
/* 0x7C */ CS_ID_GLOBAL_TALK,
/* 0x7D */ CS_ID_GLOBAL_DOOR,
/* 0x7E */ CS_ID_GLOBAL_RETURN_TO_CAM, // smoothly return to the previous camera
/* 0x7F */ CS_ID_GLOBAL_END
} CutsceneId;
typedef enum {
/* 0 */ PLAYER_CS_ID_ITEM_OCARINA,
/* 1 */ PLAYER_CS_ID_ITEM_GET,
/* 2 */ PLAYER_CS_ID_ITEM_BOTTLE,
/* 3 */ PLAYER_CS_ID_ITEM_SHOW,
/* 4 */ PLAYER_CS_ID_WARP_PAD_MOON,
/* 5 */ PLAYER_CS_ID_MASK_TRANSFORMATION,
/* 6 */ PLAYER_CS_ID_DEATH,
/* 7 */ PLAYER_CS_ID_REVIVE,
/* 8 */ PLAYER_CS_ID_SONG_WARP, // Song of Time and Song of Soaring
/* 9 */ PLAYER_CS_ID_WARP_PAD_ENTRANCE,
/* 10 */ PLAYER_CS_ID_MAX
} PlayerCsId;
#define CS_SCRIPT_ID_NONE -1
typedef enum {
// global (see sGlobalCamDataSettings)
/* -25 */ CS_CAM_ID_GLOBAL_ELEGY = -25, // CAM_SET_ELEGY_SHELL
/* -24 */ CS_CAM_ID_GLOBAL_SIDED, // CAM_SET_SIDED
/* -23 */ CS_CAM_ID_GLOBAL_BOAT_CRUISE, // CAM_SET_BOAT_CRUISE
/* -22 */ CS_CAM_ID_GLOBAL_N16, // CAM_SET_NONE
/* -21 */ CS_CAM_ID_GLOBAL_SUBJECTD, // CAM_SET_SUBJECTD
/* -20 */ CS_CAM_ID_GLOBAL_NORMALD, // CAM_SET_NORMALD
/* -19 */ CS_CAM_ID_GLOBAL_N13, // CAM_SET_NONE
/* -18 */ CS_CAM_ID_GLOBAL_N12, // CAM_SET_NONE
/* -17 */ CS_CAM_ID_GLOBAL_N11, // CAM_SET_NONE
/* -16 */ CS_CAM_ID_GLOBAL_WARP_PAD_ENTRANCE, // CAM_SET_WARP_PAD_ENTRANCE
/* -15 */ CS_CAM_ID_GLOBAL_ATTENTION, // CAM_SET_ATTENTION
/* -14 */ CS_CAM_ID_GLOBAL_CONNECT, // CAM_SET_CONNECT0
/* -13 */ CS_CAM_ID_GLOBAL_REMOTE_BOMB, // CAM_SET_REMOTEBOMB
/* -12 */ CS_CAM_ID_GLOBAL_N0C, // CAM_SET_NONE
/* -11 */ CS_CAM_ID_GLOBAL_MASK_TRANSFORMATION, // CAM_SET_MASK_TRANSFORMATION
/* -10 */ CS_CAM_ID_GLOBAL_LONG_CHEST_OPENING, // CAM_SET_LONG_CHEST_OPENING
/* -9 */ CS_CAM_ID_GLOBAL_REVIVE, // CAM_SET_REBIRTH
/* -8 */ CS_CAM_ID_GLOBAL_DEATH, // CAM_SET_DEATH
/* -7 */ CS_CAM_ID_GLOBAL_WARP_PAD_MOON, // CAM_SET_WARP_PAD_MOON
/* -6 */ CS_CAM_ID_GLOBAL_SONG_WARP, // CAM_SET_NAVI
/* -5 */ CS_CAM_ID_GLOBAL_ITEM_SHOW, // CAM_SET_ITEM3
/* -4 */ CS_CAM_ID_GLOBAL_ITEM_BOTTLE, // CAM_SET_ITEM2
/* -3 */ CS_CAM_ID_GLOBAL_ITEM_OCARINA, // CAM_SET_ITEM1
/* -2 */ CS_CAM_ID_GLOBAL_ITEM_GET, // CAM_SET_ITEM0
/* -1 */ CS_CAM_ID_NONE
// CamCsId's 0+ are sceneLayer-specific and index `ActorCsCamInfo`
} CutsceneCamId;
typedef enum {
/* -1 */ CS_HUD_VISIBILITY_ALL_ALT = -1,
/* 0 */ CS_HUD_VISIBILITY_NONE,
/* 1 */ CS_HUD_VISIBILITY_ALL,
/* 2 */ CS_HUD_VISIBILITY_A_HEARTS_MAGIC,
/* 3 */ CS_HUD_VISIBILITY_C_HEARTS_MAGIC,
/* 4 */ CS_HUD_VISIBILITY_ALL_NO_MINIMAP,
/* 5 */ CS_HUD_VISIBILITY_A_B_C,
/* 6 */ CS_HUD_VISIBILITY_B_MINIMAP,
/* 7 */ CS_HUD_VISIBILITY_A
} CutsceneHudVisibility;
typedef enum {
/* 0 */ CS_END_SFX_NONE,
/* 1 */ CS_END_SFX_TRE_BOX_APPEAR,
/* 2 */ CS_END_SFX_CORRECT_CHIME,
/* 255 */ CS_END_SFX_NONE_ALT = 0xFF
} CutsceneEndSfx;
typedef enum {
/* 0 */ CS_END_CAM_0,
/* 1 */ CS_END_CAM_1,
/* 2 */ CS_END_CAM_SMOOTH
} CutsceneEndCam;
/* Cutscene Camera Spline Scripts */
typedef struct {
/* 0x0 */ s16 numEntries;
/* 0x2 */ s16 unk_02; // unused
/* 0x4 */ s16 unk_04; // unused
/* 0x6 */ s16 duration; // total duration
} CsCmdCamSpline; // size = 0x8
// Both camAt and camEye
typedef struct {
/* 0x0 */ u8 interpType; // see `CutsceneCamInterpType`
/* 0x1 */ u8 weight; // for certain types of interpTypes, shifts the weight to certain points. Default is 100.
/* 0x2 */ s16 duration; // duration of current point
/* 0x4 */ Vec3s pos;
/* 0xA */ s16 relativeTo; // see `CutsceneCamRelativeTo`
} CsCmdCamPoint; // size = 0xC
typedef enum CutsceneCamInterpType {
/* 0 */ CS_CAM_INTERP_NONE, // values do not change.
// values 1-3 only uses a single point from the cmd
/* 1 */ CS_CAM_INTERP_SET, // values immediately set to cmd values.
/* 2 */ CS_CAM_INTERP_LINEAR, // Lerp to the target position
/* 3 */ CS_CAM_INTERP_SCALE, // Step to the target position in increments scaled by the remaining distance
// values 4-5 uses multiple points from the cmd
/* 4 */ CS_CAM_INTERP_MP_CUBIC, // cubic multi-point (identical to SM64/OoT)
/* 5 */ CS_CAM_INTERP_MP_QUAD, // quadratic multi-point
// value 6 only uses a single point from the cmd
/* 6 */ CS_CAM_INTERP_GEO, // does VecGeo calculations using fov
/* 7 */ CS_CAM_INTERP_OFF // interpolation is not processed.
} CutsceneCamInterpType;
typedef enum CutsceneCamRelativeTo {
/* 0 */ CS_CAM_REL_0,
/* 1 */ CS_CAM_REL_1,
/* 2 */ CS_CAM_REL_2,
/* 3 */ CS_CAM_REL_3,
/* 4 */ CS_CAM_REL_4,
/* 5 */ CS_CAM_REL_5
} CutsceneCamRelativeTo;
// Roll and Fov Data
typedef struct CsCmdCamMisc {
/* 0x0 */ s16 unused0; // used only in the unused interp function
/* 0x2 */ s16 roll;
/* 0x4 */ s16 fov;
/* 0x6 */ s16 unused1; // unused
} CsCmdCamMisc; // size = 0x8
typedef struct CutsceneCameraInterp {
/* 0x00 */ Vec3f curPos;
/* 0x0C */ Vec3f initPos;
/* 0x18 */ f32 initFov;
/* 0x1C */ f32 initRoll;
/* 0x2A */ f32 unk_20; // position adjustment based on fov?
/* 0x24 */ s16 curFrame;
/* 0x26 */ s16 waypoint;
/* 0x28 */ s16 duration;
/* 0x2A */ s16 numEntries;
/* 0x1E */ u8 curPoint;
/* 0x2D */ u8 type; // See `CutsceneCamInterpType`
} CutsceneCameraInterp; // size = 0x30
typedef struct CutsceneCamera {
/* 0x00 */ s16 splineIndex;
/* 0x02 */ s16 cmdIndex;
/* 0x04 */ s16 splineNeedsInit;
/* 0x06 */ s16 state;
/* 0x08 */ s16 nextSplineTimer;
/* 0x0A */ s16 updateSplineTimer;
/* 0x0C */ s16 duration; // Duration of the current spline
/* 0x10 */ CutsceneCameraInterp eyeInterp;
/* 0x40 */ CutsceneCameraInterp atInterp;
/* 0x70 */ CsCmdCamPoint* atCmd;
/* 0x74 */ CsCmdCamPoint* eyeCmd;
/* 0x78 */ CsCmdCamMisc* miscCmd;
/* 0x7C */ Camera* camera;
} CutsceneCamera; // size = 0x80
typedef enum {
/* 0 */ CS_CAM_STATE_UPDATE_ALL, // Update spline and next spline timer
/* 1 */ CS_CAM_STATE_UPDATE_SPLINE, // Update spline, do not advance next spline timer
/* 2 */ CS_CAM_STATE_PAUSE, // No updates
/* 3 */ CS_CAM_STATE_DONE_SPLINE, // Finished the current spline, ready for the next one
/* 999 */ CS_CAM_STATE_DONE = 999 // Finished all the splines.
} CutsceneCameraState;
// OoT Remnant
#define CS_CAM_DATA_NOT_APPLIED 0xFFFF
void Cutscene_InitContext(struct PlayState* play, CutsceneContext* csCtx);
void Cutscene_StartManual(struct PlayState* play, CutsceneContext* csCtx);
void Cutscene_StopManual(struct PlayState* play, CutsceneContext* csCtx);
void Cutscene_UpdateManual(struct PlayState* play, CutsceneContext* csCtx);
void Cutscene_UpdateScripted(struct PlayState* play, CutsceneContext* csCtx);
void Cutscene_HandleEntranceTriggers(struct PlayState* play);
void func_800EDDB0(struct PlayState* play);
void Cutscene_StartScripted(struct PlayState* play, u8 scriptIndex);
void Cutscene_ActorTranslate(Actor* actor, struct PlayState* play, s32 cueChannel);
void Cutscene_ActorTranslateAndYaw(Actor* actor, struct PlayState* play, s32 cueChannel);
void Cutscene_ActorTranslateAndYawSmooth(Actor* actor, struct PlayState* play, s32 cueChannel);
void Cutscene_ActorTranslateXZAndYawSmooth(Actor* actor, struct PlayState* play, s32 cueChannel);
s32 Cutscene_GetSceneLayer(struct PlayState* play);
s32 Cutscene_GetCueChannel(struct PlayState* play, u16 cueType);
s32 Cutscene_IsCueInChannel(struct PlayState* play, u16 cueType);
u8 Cutscene_IsPlaying(struct PlayState* play);
void CutsceneManager_Init(struct PlayState* play, ActorCutscene* cutsceneList, s16 numEntries);
void CutsceneManager_StoreCamera(Camera* camera);
void CutsceneManager_ClearWaiting(void);
s16 CutsceneManager_Update(void);
void CutsceneManager_Queue(s16 csId);
s16 CutsceneManager_IsNext(s16 csId);
s16 CutsceneManager_StartWithPlayerCs(s16 csId, Actor* actor);
s16 CutsceneManager_StartWithPlayerCsAndSetFlag(s16 csId, Actor* actor);
s16 CutsceneManager_Start(s16 csId, Actor* actor);
s16 CutsceneManager_Stop(s16 csId);
s16 CutsceneManager_GetCurrentCsId(void);
ActorCutscene* CutsceneManager_GetCutsceneEntry(s16 csId);
s16 CutsceneManager_GetAdditionalCsId(s16 csId);
s16 CutsceneManager_GetLength(s16 csId);
s16 CutsceneManager_GetCutsceneScriptIndex(s16 csId);
s16 CutsceneManager_GetCutsceneCustomValue(s16 csId);
s16 CutsceneManager_GetCurrentSubCamId(s16 csId);
s16 CutsceneManager_FindEntranceCsId(void);
s32 func_800F22C4(s16 csId, Actor* actor);
void CutsceneManager_SetReturnCamera(s16 camId);
s32 CutsceneCamera_Init(Camera* camera, CutsceneCamera* csCamera);
s32 CutsceneCamera_UpdateSplines(u8* script, CutsceneCamera* csCamera);
void CutsceneCamera_SetState(s16 state);
void CutsceneCamera_Reset(void);
void CutsceneFlags_UnsetAll(struct PlayState* play);
void CutsceneFlags_Set(struct PlayState* play, s16 flag);
void CutsceneFlags_Unset(struct PlayState* play, s16 flag);
s32 CutsceneFlags_Get(struct PlayState* play, s16 flag);
extern u8 gOpeningEntranceIndex;
extern u8 D_801F4DDC;
extern u8 gDisablePlayerCsActionStartPos;
extern s16 gDungeonBossWarpSceneId;
#endif