Repository navigation
Original Behaviour and Toggles
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.
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.
| 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.
| 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 |
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 damEvery 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.
- Trace Harness — how divergences are detected
- Running the Game — the settings pages and the other environment tweaks
Written from the public Sightline source tree. Bug reports and questions go to GitHub Issues; pull requests are not accepted.