Classic Levels¶
Classic level reskinning replaces the visual art of the original SOR2 levels while keeping their original stage flow, walls, load cues, and gameplay structure.
File Locations¶
Classic reskin level art is saved under:
Editor/<Pack Name>/Level Replacements/Classic/
The main files are:
| File | Purpose |
|---|---|
level <n> - art.json |
Replacement background art for Classic level <n>. |
level <n> - cutscenes.json |
Optional cutscene data for Classic level <n>. |
presentation.json |
Optional opening or presentation sequence. |
title.json |
Optional title screen replacement. |
ending.json |
Optional ending replacement. |
Image files are placed in:
Editor/<Pack Name>/Levels/Art/
What Stays From Classic¶
In Classic Reskin mode, the original level reference data remains the source for:
- scene order
- scroll limits
- wall boundaries
- enemy and item spawn data
- exits and transitions
- original gameplay timing
Your level <n> - art.json replaces the visual background data for matching scenes. If a replacement scene has no replacement art, the runtime can keep using the last valid background or the original reference, depending on context.
Scenes And Layers¶
Each level art file contains a scenes array. Scene indexes correspond to the original Classic reference scenes. Each scene can contain multiple layers.
Use layers to separate:
- far background
- midground architecture
- floor or interactable-looking foreground
- overlays and foreground elements
- animated effects
Common layer fields:
| Field | Use |
|---|---|
layerName |
Human-readable label in the editor. |
parallax |
How quickly the layer moves relative to the camera. |
autoScroll |
Continuous movement for the layer. |
scrollLoopLimits |
Looping limits for repeating layers. |
positionOffset |
Offset applied to the layer. |
reactToQuakeEffect |
Whether the layer reacts to screen shake. |
zOrder |
Render ordering. |
useClassicLayerMotion |
Opt into Classic motion for the layer's updateType, including original elevator movement. Requires the updated engine. |
The updated runtime also applies the Classic water shader to updateType: 9
(WaveEffect) and 10 (SmallWaveEffect) in local backgrounds. It keeps the native
wave tables and camera ordering, affects static and animated children on each
matching layer, and restores normal rendering when entering a dry scene.
Images¶
Each image entry uses:
| Field | Use |
|---|---|
imageName |
Filename in Levels/Art. |
position.x / position.y |
Placement in scene space. |
scale |
Scale multiplier. Negative scale can be used by editor tooling for flips in some contexts. |
Use pixel-art scales like 1, 2, or 0.5 when you want crisp nearest-neighbor rendering. Non-integer scaling can be smoothed by the runtime's art filtering resolver.
Animations¶
Layer animations are stored in animationsDefinition and placed with animations references on layers.
Use animations for water, lights, smoke, signs, or other repeated effects. Keep large full-screen videos out of animation frames unless you have tested memory and load times.
Palette cycles and Classic motion¶
Indexed tilemap layers support paletteCycles. In the Level Editor, select the
layer to edit the base palette, cycle start slot, colour count, ticks per frame,
and each frame's colours. The preview runs the cycles at 60 ticks per second and
pauses them with layer animation preview. Colours snap to Genesis channel levels.
Enable Classic Motion to reuse the original movement controller selected by Update Type, including the original vertical art offset. Existing custom layers default to their previous movement when this flag is absent. Elevator decorations should be additional images on the elevator layer; duplicating a moving layer can advance the Classic elevator's shared motion state twice.
Visual scripts still require an in-game test to preview their game state.
Music across scenes¶
Scenes that resolve to the same music player keep the current playback position when their background art changes. This also applies when different scene music references resolve to one replacement track. Background cleanup preserves the music controller's current player, including paused or pending playback, and keeps a shared preload needed by the next local background. Changing tracks still lets the music controller stop and release the previous player.
Testing Levels¶
For each replaced level:
- walk from the start to the end
- verify parallax does not drift away from the playable area
- check every screen transition
- check boss arenas and elevator-like scenes
- test widescreen if
hasWideScreenis enabled - verify music fields if you changed scene music