Cutscenes
Contents
Finding Cutscenes
There are a few ways that you can locate a cutscene.
Cutscene Pointer
You can always find the start of a cutscene in memory by watching the cutscene pointer with a memory viewer. It's located at 8044A628 in the Debug Rom, 803E8C18 in NTSC-J 1.0, and 803E8A48 in NTSC-U. Be aware that the cutscene pointer does not null itself once the cutscene has finished playing, but as long as you don't leave the immediate area this won't be an issue.
Scenes
Many, but not all, cutscenes are stored within scene files. These are referenced directly from the scene header.
Header References
The main scene header can contain a command (the 0x18 command) that defines extra headers for the purpose of creating different variations of the same scene. Some of these extra headers exist with the purpose of playing a single cutscene. This is done by defining the 0x17 command, which in turn points to the start of the cutscene header by a bank offset.
See Scenes and Rooms for more information on the header commands.
Cutscene Commands
Cutscenes begin with a simple 8 byte header of the following form:
/*0x00*/ int Commands; // number of commands in the cutscene.
/*0x04*/ int EndFrame; // Last frame of the cutscene.
Notes:
- If the number of commands or end frame variables are negative, the cutscene will not be parsed, and normal play will resume.
- Other commands can (and typically will) terminate the cutscene before the end frame is reached.
Following that are the cutscene commands. Every command is at least 8 bytes long. Valid commands are 0x01-0x90, 0x3E8, and -1
Marker | Description | Variables | Usage | Notes |
---|---|---|---|---|
0000000A | Textbox | 0000xxxx | x = Entries | End Frame waits for text/action to finish before continuing cutscene. The frame counter will be stopped at one less than the End Frame value |
No Text | FFFFssss eeeeFFFF
FFFFFFFF |
s = start frame e = end frame |
||
Display Text | iiiissss eeeeoooo
yyyynnnn |
i = message id s = start frame e = end frame o = Type. Set 0 for standard dialog, 1 for yes/no branching dialog y = yes/no top option branch n = yes/no bottom option branch |
||
Learn Song |
iiiissss eeee0002
mmmmFFFF |
i = Play Song Action s = start frame e = end frame m = message id displayed when making a mistake. 088B is used here. |
||
0000005A | Camera Data | aaaaaaaa | a = size of block | See Camera Data |
00000096 | Performs Various Actions | 00000001 xxxxyyyy
zzzz[zzzz] |
00000001 = constant? x = Action y = start frame z = end frame (seems to be repeated) |
|
00000097 | Lighting? | 00000001 xxxxyyyy
zzzz[zzzz] |
00000001 = constant? x = y = start frame z = end frame (seems to be repeated) |
|
00000098 | Scene Transition Effects? | 00000001 xxxxyyyy
zzzz[zzzz] |
00000001 = constant? x = transition (probably the same as entrance/exit transitions) y = start frame z = end frame (seems to be repeated) |
|
00000099 | Motion Blur | aaaaaaaa
xxxxyyyy zzzz[zzzz] |
a = number of entries x = y = start frame z = end frame (seems to be repeated) |
0001 = on, 0002 = off? |
0000009A | Gives Link Tatl | 00000001 xxxxyyyy
zzzz[zzzz] |
00000001 = constant? x = 0001 only? y = start frame z = end frame (seems to be repeated) |
|
0000009B | Black Overlay? | 00000001 aaaabbbb
ccccdddd dd000000 |
00000001 = constant? a = Fade type? b = start frame c = end frame (seems to be repeated) d = RGB Value |
|
0000009C | Unknown | 00000001 xxxxyyyy
zzzz[zzzz] |
00000001 = constant? x = y = start frame z = end frame (seems to be repeated) |
|
0000015E | Cutscene Terminator | 00000001 xxxxyyyy
zzzz[zzzz] |
00000001 = constant? x = y = start frame z = end frame (seems to be repeated) |
|
FFFFFFFF | Cutscene Terminator | 00000000 | Commands beyond this one will not be parsed, even if the number of commands is higher | |
0000aaaa | Actor Command | 0000yyyy | a = Marker, where a relates to a specific actor. y = Number of entries. |
Marker values are NOT the same numbers used to load an actor in a room. |
Actor Path | aaaabbbb ccccdddd ???????? eeeeeeee ffffffff gggggggg hhhhhhhh iiiiiiii jjjjjjjj kkkkkkkk llllllll mmmmmmmm |
a = Actor Action/Animation b = Start frame for path. c = End frame for path. d = ? e f g = Path start vertex coordinate (x,y,z) h i j = Path end vertex coordinate (x,y,z) k l m = Vertex normal for the path, single precision floats. |
Play Song Action Ids
Value | Purpose |
---|---|
0001 | Free Play |
0002 | Monkey teaches Sonata of Awakening |
0003 | Goron Elder's son teaches Goron Lullaby |
0004 | Zora Tadpoles teach New Wave Bossa Nova |
0005 | King of Ikana teaches Elegy of Emptiness |
0006 | Giant teaches Oath to Order |
0007 | Giant (?) teaches Saria's Song |
0008 | Zelda teaches Song of Time |
0009 | Happy Mask Man teaches Song of Healing |
000A | Romani Teaches Epona's Song |
000B | Kaepora Gaebora teaches Song of Soaring |
000C | Stone teaches Song of Storms |
000D | Blank Text Box |
000E | Blank Text Box |
000F | Blank Text Box |
0010 | Goron Elder teaches part of Goron Lullaby |
0011 | Blank Text Box |
0012 | Play back Sonata of Awakening |
0013 | Play back Goron Lullaby |
0014 | Play back New Wave Bossa Nova |
0015 | Play back Elegy of Emptiness |
0016 | Play back Oath to Order |
0017 | Play back Saria's Song |
0018 | Play back Song of Time |
0019 | Play back Song of Healing |
001A | Play back Epona's Song |
001B | Play back Song of Soaring |
001C | Play back Song of Storms |
001D | Play back Sun's Song |
001E | Play back Inverted Song of Time |
001F | Play back Song of Double Time |
0020 | Play back part of Goron Lullaby |
0021 | Play back Ballad of the Wind Fish (Link) |
0022 | Play back Ballad of the Wind Fish (Goron) |
0023 | Play back Ballad of the Wind Fish (Zora) |
0024 | Play back Ballad of the Wind Fish (Deku) |
0025 | Play back Zora Jam Session I |
0026 | Play back Zora Jam Session II |
0027 | Play back Zelda's Lullaby |
0028 | Play back Scarecrow's Song? |
Camera Data
Camera Chunk Header
eeeessss llllllll
e = number of entries
s = size
l = length (frames)
Camera Entries
First half of data appears to be focus, second half position.
ccddeeee xxxxyyyy zzzzaaaa
c = Camera behaviour (use 05 if you don't know what to use)
d = Factor (?)
e = End frame
x = X-position
y = Y-position
z = Z-position
a = Actor
Entries can be broken down into sub-groups based on e. If e becomes less than the previous entry, then this entry starts a new group. The chunk will end at the header's defined length of frames even if the total length of frames for the entries exceed it.
If a is 0000 then the x, y, and z positions will be relative to the map. Otherwise they will be relative to an actor's position.
Not sure how values for a work. 0001 seems to mean Link, 0002 and 0003 are Great Fairy/Stray Fairies?, 0004 is Goron Elder.
Field of View
Values after the camera entries deal with the FOV for each entry.
llllrrrr ffffuuuu
l = Length (in frames)
r = Rotation
f = Field of View
u = Unknown
Not sure how the rotation works here. Is it a signed 16bit integer? Negative means rotate counterclockwise? Positive means rotate clockwise?
Clock Tower twisted tunnel entrance cutscene uses 0x0000 then 0x0078 (120°?) then 0xFF88 (-120°?) then back to 0x0000. This results in a full 360° counterclockwise rotation.
Actor Entities
Marker | Actor | Action Param (v) |
---|---|---|
0064 | En_Elfgrp (Broken Great Fairy) | |
0065 | En_Dnp (Deku Princess) | |
0066 | Dm_Zl (Zelda) | |
0067 | Bg_Dy_Yoseizo | |
0068 | Bg_Ctower_Gear | |
0069 | En_Dnq (Deku King) | |
006B | Dm_Stk (Skullkid) | |
006C | En_Ge3 | |
006D | Dm_Char05 | |
0070 | En_Horse (Epona) | |
0071 | Dm_Char00 (var 0000, Tatl) | |
0072 | Dm_Char00 (var 0001, Tael) | |
0073 | Dm_Opstage | |
0077 | En_Gg | |
0078 | En_Ma_Yts | |
En_Ma4 (Romani) | ||
0079 | En_Ge1 | |
007C | Bg_Open_Shutter | |
007D | Bg_Open_Spot | |
007E | En_Dnk | |
007F | En_Mk (Professor) | |
0082 | En_Osn (Happy Mask Man) | |
0083 | Dm_Char02 | |
0084 | Obj_Tokeidai | |
0085 | En_Fall | |
0086 | Obj_Tokei_Step | |
0087 | Dm_Char01 | |
0088 | Dm_Char03 (Happy Mask Man) | |
00C8 | Player (Link) | See Link Action Parameters below |
00C9 | En_Elf (Tatl) | 0003 Bounces up and down in a rhythmic pattern |
01C2 | En_Fall | |
01C5 | En_Giant | |
01C6 | En_Giant | |
01C7 | En_Giant | |
01C8 | En_Giant | |
01C9 | En_Zoraegg | |
01CF | Dm_Char06 | |
01D5 | Bg_Haka_Curtain | |
01D6 | En_Jg | |
01D7 | En_Zog | |
01D8 | En_Dai | |
01D9 | Dm_Char05 | |
01DA | Dm_Char08 | |
01DB | En_Dno | |
01DC | En_Ge2 | |
01DF | En_Gk | |
01E0 | Eff_Kamejima_Wave | |
01E2 | En_Po_Composer | |
01E3 | Obj_Hgdoor | |
01E4 | En_Hg | |
01E5 | En_Pamera | |
01E6 | En_Hgo | |
01F4 | En_Zob | |
01F5 | En_Zos | |
01F6 | Eff_Kamejima_Wave | |
01F7 | Dm_Char09 | |
01F8 | En_Zov | |
01F9 | En_Test6 | |
01FA | En_Test3 (Kafei) | |
01FF | Obj_Boat | |
0200 | Eff_Stk | |
0201 | Dm_Stk (Skullkid) | |
0202 | Dm_Tsg | |
0203 | En_Zod | |
0206 | Dm_Char05 | |
020D | En_Toto | |
020E | En_Gm | |
020F | Eff_Zoraband | |
0214 | En_Bsb | |
0226 | En_Rz | |
0227 | En_Rz | |
0228 | Obj_Usiyane | |
022C | En_Ma_Yto (Cremia) | |
022D | En_An | |
Dm_An | ||
Dm_Gm | ||
022F | Dm_Char05 (var 0003, Majora's Mask) | |
0232 | Dm_Al | |
Dm_Ah | ||
Dm_Nb | ||
0235 | En_And | |
0238 | Dm_Bal | |
0239 | Door_Warp1 | |
02C8 | En_Dns (Deku Palace Scrub) |
Link Action Parameters
0001 Walking
0002 Walking
0003 Surprised
0004 Standing then stop
0005 Sleeping
0006 Turn around shocked
0007 Standing?
0008 Standing?
0009 Walk into warp
000A Looking around
000B Running from giant deku scrub
000C Turns around and starts running
000D Getting up?
000E Looking down then forward?
000F Being blessed by a restored temple fairy, lifted up
0010 Being blessed by a restored temple fairy, set back down
0011 Looks behind himself, then shakes head
0012 Standing, waving
0013 Staring at tatl
0014 Looks at ocarina (OoT Leftover?)
0015 Looks worn out
0016 Recieve item
0017 Looks to the side, shaking head
0018 Standing, frozen?
0019 Raises hand and shakes head
001A Playing Ocarina
001B Standing, frozen?
001C Bows twice
001D Riding epona
001E Standing?
001F Invisible?
0020 Standing?
0021 Standing?
0022 Sitting down, shaking head, then looks up
0023 Gets up, groggy
0024 Trying to catch skullkid
0025 Looking around
0026 On epona, looking behind
0027 Catches onto skullkid riding epona
0028 Holding onto skullkid riding epona
0029 On walking epona
002A Falls off epona
002B Tips over and falls
002C Gets up and stares at ground
002D Holds hand up in front of face
002E Being transformed
002F Deku Link shocked at reflection in water
0030 Runs after skullkid but tatl blocks him
0031 Unknown deku link animation
0032 Mask salesman shaking Link?
0033 Laying face down
0034 Holds hands, then looks up with arms out to sides (unused?)
0035 Falling down on back
0036 Looking around
0037 Link dazed/confused?
0038 Shielding face with hands
0039 Invisible?
003A Sitting, looking around
003B Looks down scratching back of head
003C Charging spin attack
003D Slips then falls on butt?
003E Doing situps
003F Doing situps
0040 Hands behind back and jumping forward
0041 Doing pushups
0042 Leans forward
0043 Standing, frozen?
0044 No idea what he's doing
0045 Pretends to be a scary monster?
0046 Pulls item out for mailbox
0047 Being shaken by mask salesman
0048 Takes out item to show
0049 Creates elegy of emptiness statue
004A Posing in an odd stance
004B Gets on epona and looks to the right
004C On epona, nods and looks forward
004D On epona, stares up, moves backwards?
004E Posing in an odd stance
004F Posing in an odd stance
0050 Standing, holding shield up?
0051 Hugging cremia
0052 Grabbing something and pulling it towards himself
0053 Holding something
0054 Holding something
0055 Holding something back?
0056 Sitting down
0057 Sitting down, looking around
0058 Sitting down, waving
0059 Dance learned from kamaro
005A Salute
0x96 Actions
0005 End Cutscene, Return Control to Link
0007 Show Area Title Card
000A Turn Child Link
0014 Fade in title screen
0015 Fade out title screen
0016 Turn Deku Link
001E Disable Actor Path Data
0021 Set entered clocktown for the first time flag
0023 Pass In-game Time
0026 Set day to day 9
0027 Turn Zora Link