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 hasWideScreen is enabled
  • verify music fields if you changed scene music