Cutscene Info - X-Hax/SA2BModdingGuide GitHub Wiki

Cutscenes

Depending on the version of SA2, the data for the event cutscenes can differ. EXXXX.PRS is the main file, while the _0 to _J files contain miscellaneous resources, such as audio timings and lighting/screen fade information. In the Dreamcast version, the models and animation data for a scene are all contained within the main file, while in SA2B, the animation data was split off into an uncompressed file labeled exxxxmotion.bin. With two exceptions in the DC version - those being E0203 and E0210 - the event files can only be interpreted by the game if the main file is compressed.

Files that are labeled as evmes??.prs contain the subtitle text and their assignments per cutscene. The first ? wildcard starts with either H, D, or L, denoting the text used for the Hero Story, Dark Story, and Last Episode respectively. The second ? wildcard contains a number from 0 to 5, which represents the language. As an example, evmesH1 contains all the English subtitle information for the Hero Story cutscenes. The contents of these files can be edited using SA2CutsceneTextEditor.

The main cutscenes can be previewed using SA2 Event Viewer and their contents can be extracted with the use of splitEvent. Editing the contents and rebuilding with buildEvent is mostly functional, but some changes can cause issues.

Main File Information

The base pointer for the DC version is 0xC600000
The base pointer for SA2B is 0x8125FE60

Offset Type Description
0 Pointer Cutscene entity arrays
4 Pointer Texture list
8 UINT32 Scene count
C Pointer Texture sizes
10 Pointer ARK character reflection control
14 Pointer Blur model array
18 Pointer Mech character parts (Usually contains pointers to their upgrades and weapons)
1C Pointer Tails' tails
20 Pointer Upgrade list
24 Pointer Texture animation information
28 UINT32 Drop shadow control. A value of 01 allows the character drop shadows to be rendered over updated geometry. (SA2B only)

Cutscene Entity Data

This section of the main file is the source for all things related to camera controls, models, animations, and Big the Cat cameos for the cutscene.

Offset Type Description Notes
0 Pointer Scene Entity Array
4 UINT32 Scene Entity Count
8 Pointer Scene Camera Array
C UINT32 Scene Camera Count
10 Pointer Particle Motion Array The animations in this array are used for positioning certain particle effects if the scene uses them
14 UINT32 Particle Motion Count
18 Pointer Big Cameo Array
1C UINT32 Scene Frame Count*

*"Scene 0" will contain the total number of frames for the entire cutscene, as its section stores the cutscene geometry and must remain visible at all times.

Scene Entity Arrays

This section of the cutscene entity data array controls which models and animations are to be loaded as a singular entity in a scene. The contents of this section are slightly different between game versions.

Dreamcast

Offset Type Description Notes
0 Pointer Model
4 Pointer Animation
8 Pointer Shape Motion
C UINT32 Unknown
10 Float(3) Position
1C UINT32 Flags

SA2B

Offset Type Description Notes
0 Pointer Model
4 Pointer Animation
8 Pointer Shape Motion
C Pointer GC Model This section is primarily used for "Scene 0" whenever the scene geometry was updated.
10 Pointer Shadow Model These models are usually texture-less versions of the character models and are used in cutscenes with GC models
14 UINT32 Unknown
18 Float(3) Position
24 UINT32 Flags
28 UINT32 Display Layer This is a value between 0 and 4, which is tied to the game's rendering system. The higher values are sometimes used with models that use transparency to improve visibility

Upgrade List

The upgrade list is constant throughout the game. To work around a technical limitation with the character models in SA2B, Mech Tails and Mech Eggman were given an upgrade slot each for their windshields, as they would have problems rendering otherwise.

Number Description
1 Sonic's Light Shoes
2 Sonic's Flame Ring
3 Sonic's Bounce Bracelet
4 Sonic's Magic Gloves
5 Shadow's Air Shoes
6 Shadow's Flame Ring
7 Knuckles' Shovel Claw (Left)
8 Knuckles' Shovel Claw (Right)
9 Knuckles' Hammer Glove (Left)
10 Knuckles' Hammer Glove (Right)
11 Knuckles' Sunglasses
12 Knuckles' Air Necklace
13 Rouge's Pick Nails
14 Rouge's Treasure Scope
15 Rouge's Iron Boots
16 Rouge's Heart Plates
17 Mech Tails' cockpit window (SA2B only)
18 Mech Eggman's cockpit window (SA2B only)

Mech Parts List

The list used to detect mech character parts is constant throughout the game. The way this list works is that each part of the mech is referenced via pointer to its OBJECT struct and pieces that are deemed redundant are given the "hide" object flag to render them invisible. For example, if the player has acquired Mech Tails' Bazooka upgrade, his Vulcan Cannon won't render on his model and vice versa.

The list is essentially split into three sections, with the first two including pointers to the upgrade models and the last section focusing on the regular models if they exist. The order of the upgrades in the list is identical to a set of flags that are found in the game's code, which is the basis for the descriptions found in the table. The Tornado object in E0004 references its Vulcan Cannon where the Bazooka upgrade would normally be referenced. The reasoning for this is unclear at the moment.

The original purpose of this section was to serve as the upgrade application list for cutscenes. As such, all visible upgrades are supported here, but due to the inclusion of a new upgrade list that more closely matches the in-game implementation, the mech characters are the only ones to utilize the feature at all.

ID Description ID Description ID Description
0 Sonic's Light Shoes 1* 31 Sonic's Light Shoes 2* 62 Null
1 Sonic's Ancient Light** 32 Null 63 Null
2 Sonic's Magic Gloves* 33 Null 64 Null
3 Sonic's Flame Ring* 34 Null 65 Null
4 Sonic's Bounce Bracelet* 35 Null 66 Null
5 Sonic's Mystic Melody** 36 Null 67 Null
6 Mech Tails' Booster (Left, Node 51) 37 Mech Tails' Booster (Right, Node 40) 68 Null
7 Mech Tails' Bazooka (Root, Node 11) 38 Null 69 Mech Tails' Vulcan Cannon (Root, Node 3)
8 Mech Tails' Laser Blaster (Root, Node 8) 39 Null 70 Mech Tails' Missile Blaster (Root, Node 5)
9 Mech Tails' Mystic Melody** 40 Null 71 Null
10 Knuckles' Shovel Claw 1* 41 Knuckles' Shovel Claw 2* 72 Null
11 Knuckles' Sunglasses* 42 Null 73 Null
12 Knuckles' Hammer Gloves 1* 43 Knuckles' Hammer Gloves 2* 74 Null
13 Knuckles' Air Necklace* 44 Null 75 Null
14 Knuckles' Mystic Melody** 45 Null 76 Null
15 Null 46 Null 77 Null
16 Shadow's Air Shoes 1* 47 Shadow's Air Shoes 2* 78 Null
17 Shadow's Ancient Light** 48 Null 79 Null
18 Shadow's Flame Ring* 49 Null 80 Null
19 Shadow's Mystic Melody** 50 Null 81 Null
20 Mech Eggman's Jet Engine (Right, Node 6) 51 Mech Eggman's Jet Engine (Left, Node 11) 82 Null
21 Mech Eggman's Large Cannon (Root, Node 22) 52 Null 83 Mech Eggman's Vulcan Cannon (Root, Node 17)
22 Mech Eggman's Laser Blaster (Root, Node 24) 53 Null 84 Mech Eggman's Missile Blaster (Root, Node 19)
23 Mech Eggman's Protection Armor (Node 16) 54 Null 85 Null
24 Mech Eggman's Mystic Melody** 55 Null 86 Null
25 Rouge's Pick Nails 1* 56 Rouge's Pick Nails 2* 87 Null
26 Rouge's Treasure Scope* 57 Null 88 Null
27 Rouge's Iron Boots 1* 58 Rouge's Iron Boots 2* 89 Null
28 Rouge's Mystic Melody** 59 Null 90 Null
29 Null 60 Null 91 Null
30 Null 61 Null 92 Null

*Assumed upgrade/normal model
**Upgrade doesn't normally have a visual component

EXXXX_0 Information

Originally, cutscene files that had a numbered suffix (e.g. E0000_1) would contain all the graphical features and subtitle/audio timings for each cutscene, all of which could change depending on the language. This was changed in the final release so that the languages would only alter audio/subtitle timings as necessary, as only that information would require tweaking.

The EXXXX_0 files were meant to store subtitle data and audio timings for the Japanese language setting, but in all retail versions of SA2, they were repurposed to store graphical effects and features for each specific cutscene. The following is a list of what can be found in each segment of the file.

Screen Effects

Information starting at 0x9800 denotes any screen effects that occur within the scene, such as fades or color changes. Each chunk of this information is 64 bytes long, with the last 32 bytes acting as a buffer.

The maximum number of screen effect entries per cutscene is 64.

Offset Type Description
0 UINT32 Frame in which the screen information takes effect
4 Byte Effect Type
5 Char Array [3] Null
8 Char Array [4] ASCII color (ARGB)
C Byte Fadeout check
D Byte Null
E UINT16 Screen texture ID*
10 UINT32 Visible time*
14 INT16 X Position*
16 INT16 Y Position*
18 Float Width*
1C Float Height*

*These values are used in combination with the texture screen effect IDs

Screen Effect Types

ID Description
1 Screen fade-in
2 Screen cut-in
3 Texture fade-in
4 Texture cut-in
5 Background fade-in
6 Background cut-in

Simple Particle Effects

Information starting at 0xA800 denotes any simple particle effects that are loaded in the scene, such as flashing lights or the sun. Each chunk of this information is 56 bytes long, with the last 32 bytes acting as a buffer.

The maximum number of simple particle effect entries per cutscene is 2048.

Offset Type Description Notes
0 UINT32 Frame in which the particle information takes effect
4 Byte Particle ID
5 Byte Particle Motion ID
8 Float Texture ID*
C Float Pulse Control* X displacement for normal particles
10 Float Unknown* This is a constant used for the "Pulsing texture cancel" ID, otherwise it's Y displacement for normal particles
14 Float Size*

*Custom particles treat these values as depicted in the list, while normal particles treat these as displacement values

Simple Particle IDs

ID Description
0 Null
1 Dust puff
2 Sparkle
3 Sparkle
4 Dirt patch
5 Fire blast
6 Steam
7 Snow blast
8 Sun
9 Sun cancel
A Water splash
B Smoke cloud
C Steam puff
D Rocket steam puff
E Flame puff
F Null
10 Invalid
11 Pulsing texture
12 Pulsing texture cancel

Object Lighting Information

Starting at 0x26800 are 68-byte chunks that dictate the object lighting information for the corresponding cutscene. The last 20 bytes can be considered a buffer for now.

Lighting information is split into four sections of 256 entries each and all four sets are combined at runtime, depending on certain settings and game versions. Dreamcast uses the first set of instructions and a combination of the other three via enabling specific entity flags, while SA2B will always use the first two sets of lighting information while ignoring the other two sets. "Scene 0" models are always given a default lighting value unrelated to these parameters, with the Dreamcast version allowing for the usage of entity flags to apply certain lighting combinations.

There are a maximum of 1024 possible lighting entries per cutscene.

Offset Type Description
0 UINT32 Frame in which the lighting information takes effect
4 UINT32 Fade control. 1 is a hard cut, while 2 is a fade-in from the previous set of instructions
8 Float Light Direction Vector (X-Component)
C Float Light Direction Vector (Y-Component)
10 Float Light Direction Vector (Z-Component)
14 Float Red
18 Float Green
1C Float Blue
20 Float Light intensity
24 Float Ambient R
28 Float Ambient G
2C Float Ambient B

Blur Effect Information

Information starting at 0x37800 denotes the controls for motion blur effects used by models in the blur array. Each chunk is 64 bytes in size.

There are 64 total blur effect entries per cutscene.

Offset Type Description
0 UINT32 Frame Start
4 UINT32 Effect Duration
8 Char Array [6] Blur Model ID
E UINT16 Null
10 UINT32 Blur Entity Count

Animated Particle Effect Information

Information starting at 0x38800 denotes any animated particle effects that are loaded in the scene, such as sparkles or smoke clouds. Each chunk of this information is 64 bytes long.

The maximum number of animated particle effect entries per cutscene is 64.

Offset Type Description
0 Float(3) Position
C Float(3) Rotation and Speed controls
18 UINT16 Unknown
1A UINT16 Unknown
1C UINT16 Unknown
1E UINT16 Unknown
20 UINT32 Frame in which the particle information takes effect
24 Float(3) Particle spread controls
30 UINT32 Number of particle instances
34 UINT32 Unknown
38 UINT32 Particle ID
3C UINT32 Unknown

Animated Particle IDs

ID Description
0 Invalid
1 Dust cloud
2 Sparkle
3 Sparkle
4 Dirt patches
5 Fire blast
6 Steam
7 Snow blast
8 Invalid
9 Invalid
A Water splash
B Smoke cloud
C Steam puff
D Rocket steam puff
E Flame puff
F Null
10 Invalid

Video Overlay Information

Information starting at 0x39800 determines whether or not an FMV overlay is meant to be loaded in a scene. Depending on the settings, the video can either be superimposed over the screen, or onto a mesh that's in the cutscene. The chunks are 48 bytes long, with the last 16 acting as a buffer.

The maximum number of video entries is 64.

In the Dreamcast and GameCube versions, .m1v files are loaded for these cases. The 2012 re-release checks for and loads the .sfd equivalents of the video overlays.

Offset Type Description
0 UINT32 Frame in which the video begins to play
4 INT16 X Position.
6 INT16 Y Position.
8 Float Depth value. A higher value means the video overlay will be pushed further away from the screen
C Byte Overlay type
D Byte Overlay texture ID*. Any meshes that use the texture ID denoted here will have the specified texture replaced with the video.
E INT16 Null
10 Text Name of the video file that's to be loaded

*This is used in combination with the "Mesh overlay" type.

Video Overlay IDs

ID Description
0 Null
1 Screen overlay
2 Mesh overlay
3 Screen overlay
4 Screen overlay
5 Pause video
6 Resume video

EXXXX_1-J Information

Suffix Language
1 English
2 French
3 Spanish
4 German
5 Italian (2012 port only)
J Japanese

The start of the file contains subtitle data. Each data set is 8 bytes long and is tied to the subtitle order found in the external evmes?? file.

There are a maximum of 256 possible entries for subtitle timings.

Offset Type Description
0 INT32 Frame in which the subtitle is set to appear. A value of -1 in this slot will set the mapped subtitle text as the opening text crawl for the cutscene.
4 UINT32 Number of frames in which the subtitle is to remain onscreen.

Information starting at 0x800 and continuing until the end of the file contains audio timings for voices and BGM for each language. Each chunk is 72 bytes in size. Voice clip playback is determined by using the cutscene ID, so a value used by E0000 will not be the same as a value used by E0102, for example.

The maximum number of audio entries is 512.

Offset Type Description
0 UINT32 Frame in which the audio clip begins to play
4 Byte SFX initializer. Setting this value to 0 will start sound effect playback at the frame specified
5 Byte Credits control. FF is a null entry and the effect seems to only work with E0210. Higher values reduce the scrolling speed of the credits
6 UINT16 Number of the voice clip that's to be loaded if applicable. This number is added to a default value set by each cutscene and the result is compared against a master array to load the desired voice clip. FF FF denotes a null entry
8 Text Name of audio track that's to be loaded, if applicable. Placing a hex value of 30 in this spot will stop the current audio track from playing
18 Text Name of the jingle that's to be loaded, if applicable. No cutscenes appear to use this feature.
⚠️ **GitHub.com Fallback** ⚠️