Skip to content

Original Behaviour and Toggles

mscrnt edited this page Oct 16, 2026 · 3 revisions

Original Behaviour and Toggles

The rule

When the native build and the cartridge disagree, the cartridge is right. Original behaviour — including Rare's bugs — is preserved by default. The decomp's bugs are Rare's bugs, faithfully reproduced; changing them alters game feel and breaks parity with how the game is remembered.

Only three kinds of defect are fixed outright: crashes, AI stalls and softlocks, and anything blocking a roadmap phase. Any other intentional change to behaviour goes behind a runtime toggle that defaults to the original behaviour, and is recorded in docs/divergences.md before the trace baseline is touched — with the tick, the affected fields, the toggle name and its default. That file is append-only, and it is the authority on what has been changed on purpose.

The rule itself is number 5 of the project's non-negotiables in docs/project-rules.md.

Documented toggles

These are the player-facing toggles docs/divergences.md documents as of v0.3.0 (entries D-001 to D-056 plus the mouse-look note). They come in two kinds: environment variables read by the native build, set in the shell before launching, and persisted settings in %LOCALAPPDATA%\sightline\config.ini, changed from the SETTINGS pages (Running the Game). Nothing in the game code reads config.ini; the store is inactive under trace replay and headless runs, which therefore always take the original path.

Environment variables

Toggle Default What it controls Entry
SL_PROP_FADE 0 Distance fade of props. With the default, props are fully visible until the near-fog visibility cull, and the translucent distance-fade band Rare's code applies is removed. =1 restores Rare's translucent fade exactly. The documented exception to the default-original rule, a presentation design decision. D-004
SL_VISRANGE_LEVELSCALE 0 (Rare's behaviour) On Dam, Surface and Surface 2 only. =1 divides the near-fog visibility triple by the level visibility scale, as its two sibling values already are. Off by default because the asymmetry is the cartridge's own. D-003
SL_MOUSE_LINEAR_LOOK 1 (on) Mouse look is derived linearly from mouse counts instead of through the stick's squared response curve. =0 restores the previous routing. A live, captured mouse only; the gamepad keeps Rare's stick model. The cartridge had no mouse, so no original mouse behaviour is overridden. mouse-look note
SL_DYNDOOR 1 (on, every presentation) A door the game reshapes as it moves (the Dam's yard gates, the roller door, the gas-plant doors) is drawn at the game's own live box; door state, timing and collision stay the game's. =0 draws every door as the cartridge draws it. Render only. D-027
SL_DESTROYED_KEEP 1 The native destroyed-object vertex store is eight times the cartridge's, so the game's low-memory free of an off-screen destroyed object is not reached in play. =0 restores the cartridge's store exactly. A documented exception to the default-original rule, as D-004 is; it moves no recorded trace. D-028

The XBLA-specific corrections among D-023 to D-055 (sky, fog ranges, lent and borrowed domes, decals and remastered assets) have developer switches named in their entries, including SL_XBLA_AUTHENTIC_FOG=1 at run time and SL_WA_AS_AUTHORED=D-0xx lists at preparation. These paths are inactive in ORIGINAL and COMMUNITY HD. D-027 and D-028 are presentation-independent exceptions, listed above.

Persisted settings (config.ini)

Setting Default What it controls Entry
sprint_enabled 0 (off: the cartridge's movement) Native SPRINT: with the setting on and the SPRINT control held, the movement vector is scaled to the magnitude the cartridge's own 45° diagonal already reaches, never more. GAMEPLAY → SPRINT. D-006
aspect_ratio 0 (4:3, the accepted presentation) 1 16:9, 2 32:9, 3 21:9. The 3D view widens; the 2D layer stays a centred 4:3 image; nothing in the game code reads it. DISPLAY → ASPECT RATIO. D-008
fov_vertical 6000 (60.00°, the cartridge's own) Vertical FOV in hundredths of a degree, 3598–7756, shown as the 16:9-equivalent horizontal FOV 60–110. World projection only. DISPLAY → FIELD OF VIEW. D-008
mouse_sensitivity 100 Gameplay mouse-look gain as a percent of the accepted feel, 10–300. CONTROL → MOUSE SENSITIVITY. D-009
scoped_mouse_sensitivity 100 A second percent, applied only while aiming with an adjustable scope (sniper rifle, camera). CONTROL → SCOPED SENSITIVITY. D-009
pad_stick_layout 0 (DEFAULT) 1 SOUTHPAW, 2 LEGACY, 3 LEGACY SOUTHPAW — which stick carries which pair of walk / strafe / turn / pitch. PAD → STICK LAYOUT. D-011
pad_button_layout 0 (DEFAULT) 1 SOUTHPAW, 3 GREEN THUMB, 4 CUSTOM (2 BUMPER is retired and never offered). The preset the controller's binding slots were last seeded from. PAD → BUTTON LAYOUT. The DEFAULT itself moved on 2026-09-21 (the bumpers mirror the triggers); a config that spells the old table keeps it, as CUSTOM. D-011, D-018
pad_look_sensitivity 100 The controller look pair's gain, 25–200 in steps of 5. PAD → LOOK SENSITIVITY. D-013
pad_look_deadzone, pad_move_deadzone 15 (the compiled deadzone exactly) Inner deadzone of each stick pair, 0–40 %. PAD → LOOK DEADZONE / MOVE DEADZONE. D-013
crouch_mode, sprint_mode 0 (HOLD) 1 TOGGLE: a fresh press flips a runtime latch instead of the level following the control. GAMEPLAY → CROUCH MODE / SPRINT MODE. D-014
window_mode 0 (WINDOWED) 1 BORDERLESS (fullscreen-desktop), 2 FULLSCREEN (an exclusive mode). DISPLAY → WINDOW MODE. D-015
window_width, window_height, fullscreen_width, fullscreen_height 0 / 0 (not chosen: the launcher's window, the desktop's mode) The windowed client size and the exclusive mode chosen on DISPLAY → RESOLUTION. D-015
vsync 0 (off: the pacer sets the cadence) The GL swap interval. DISPLAY → VSYNC. D-015
render_fps 0 (ORIGINAL: one present per game frame, the accepted pacing) 30, 60, 120, 144, 165, 240, -1 UNLIMITED. Extra frames re-draw a finished game frame with a blended camera; the game's tick and its per-tick traces are unchanged. SL_RENDER_FPS overrides it for a launch until the row is changed. DISPLAY → FRAME RATE. high-refresh decision record
show_fps 0 (off) 1 draws the presented-frames counter. SL_SHOW_FPS overrides it for a launch until the row is changed. DISPLAY → SHOW FPS. high-refresh decision record
world_detail 0 (ORIGINAL: the accepted rendering exactly) 1 ENHANCED: the near-fog visibility-range rejection of props and characters is not applied at the render seam. Render only; the simulation's own copy of the test is untouched. DISPLAY → WORLD DETAIL, watch GRAPHICS. D-019
presentation 0 (ORIGINAL: the accepted rendering exactly, no pack read and no world asset opened) 1 COMMUNITY HD, 2 XBLA. One value for every visual provider; F5 / View (Create), DISPLAY → PRESENTATION and watch GRAPHICS all step it. It replaced an earlier textures row; a config carrying that row is migrated once. D-020, D-021, D-022
bind.<action>.<device>.<slot> absent (the compiled default) The binding table: one line per slot that differs from the default. Edited through BINDINGS. D-005, D-012, D-018

Entries with no toggle

Several entries change the native build without a switch, because by the file's own rule 3 there is no original behaviour being overridden — the cartridge had no keyboard, mouse or PC window — or because the change is a native-only screen with no game state:

  • D-001, D-002 — how a live keyboard and mouse drive look-ahead auto-centring and aim mode. The changed code runs only when live keyboard / mouse (or, since D-011, the modern pad) is the input producer, so every headless run and every recorded replay takes the original path by construction.
  • D-005 — the native actions (interact, reload, crouch, weapon cycle, zoom) reach the game as semantics from a keyboard, wheel and controller beside the N64 button path.
  • D-011 — the modern dual-stick pad is the only pad on the native build and the game's control style is pinned to 1.1 Honey; a design decision, not a rule-5 toggle. The matching build keeps all eight styles.
  • D-012 — the pad's d-pad is four binding sources in play and the bumpers are contextual sources (rebind them to change it).
  • D-016 — the front end's fourth row, 4. QUIT GAME, native only.
  • D-017 — the widescreen cursor repair: the menu pointer is drawn across the whole content rectangle while the hit position stays Rare's.
  • D-007 — a MODERN texture-filtering presentation that was retired unshipped; it is recorded for the history and has no switch in the tree.
  • D-010 — the ORIGINAL / MODERN controller profile, superseded by D-011.
  • D-056 — on Egyptian's pre-mission briefing, the Q Branch page carries a line, "Attachment: Recovered floor plan", that opens an annotated sketch of the Golden Gun's chamber; closed by default and on every page change, and nothing else in the briefing or the mission changes. Native front end only.
$env:SL_PROP_FADE = "1"            # Rare's translucent distance fade
$env:SL_VISRANGE_LEVELSCALE = "1"  # scaled near-fog thresholds on Dam/Surface
$env:SL_MOUSE_LINEAR_LOOK = "0"    # the old squared mouse-look routing
.\tools\windows\play.ps1 -Level dam

What a divergence entry contains

Every entry in docs/divergences.md records the date and phase, the levels and the first tick affected, which hashed state fields differ, the toggle and its default, what changed in terms a reader can verify against the game, why it was worth breaking parity for, and why it is safe — which other levels were replayed and what did not move. Unintentional divergences are bugs and never go in the file; the code is fixed, not the baseline.

Related

Clone this wiki locally