# 12 — Feature Reference Reconciliation (LEGACY_FEATURE_REFERENCE.md vs 5-8 client code)

Reconciles `docs/LEGACY_FEATURE_REFERENCE.md` against the actual `extracted/client-5-8`
GML. The reference doc is **dual-purpose**: part faithful legacy log, part intended
ReBNO behavior. Every mismatch is classified **[LIKELY-DOC-DRIFT]** (memory error,
should match legacy) or **[LIKELY-REBNO-INTENT]** (deliberate desired behavior, preserve).

All ticks are 30 steps/sec (room speed = 30). All `extracted/...` paths are relative to repo root.

## Engine architecture context (how to read the evidence)

- **`0000-server`** = the *local* player's physics/input controller (NOT a network object). Its `Step.gml` is the movement core.
- **`0042-player`** = the *remote* player renderer (driven by `global.p_x[pid]`/`p_y[pid]`). Has no physics.
- Floor tiles are thin objects whose `Create` calls `tileborder()`; the *behavior* (movers, ice, borders, fall-off) lives in `0000-server/events/Step.gml` and helper scripts (`abscheck*`, `tbottomcheck`, `corner*`, `cornercheck[g|i]`).
- `tile1` (obj 0573) is the abstract "is-walkable-floor" parent used by all collision/abscheck queries. `mplatparent`/`mplatparentbordered` (0054/0574) are the platform parents.
- **No tile object runs its own movement physics for the player.** Platforms (`mplat*`) are the sole self-moving floor objects and they step in pure local GM time.

---

## A. Non-interactive floor tile *modifiers*

| Tile/mechanic | Doc claim | 5-8 code reality + numbers | Match? | Classification | Evidence |
|---|---|---|---|---|---|
| **BORDERED** | Player stops at edges, cannot walk off | `Collision-20`/`Collision-574` set `tbordered=1; tcollide=1`. Step.gml movement loop (l.224-243) only advances 1px when `tbordered && !abscheckheight2/abschecklength2(tile1,mplatparent,...)` — i.e. blocks the step if the destination edge isn't backed by floor. Checks an 8px-wide / 17px-tall sample band at the navi's leading edge. | **MATCH** | — | `objects/0000-server/events/Step.gml:224-243`, `Collision-20.gml:2-3`, `scripts/0364-abschecklength2.gml`, `scripts/0365-abscheckheight2.gml` |
| **BORDERLESS** | Player can walk off and fall into the void | Same loop: when `!tbordered`, the `x±=1`/`y±=1` steps run unconditionally (no edge check). Falling off then handled by the fall-off block. | **MATCH** | — | `objects/0000-server/events/Step.gml:228-243` |
| **(fall into void)** | implied for borderless | `Step.gml:166` — when `tcollide==0` (no floor under feet this step) and not in a transition sprite, sets `sprite_index=JoinOut`; `dafalls` counter + `random(99)`: if `ceil(rand)>9 || dafalls<=5` you rejoin same room, else fatal fall → teleport to "Abyssal Ruin"/Digital_Abyss (or Duo-Net save if in a duo). | MATCH (legacy mechanic) | — | `objects/0000-server/events/Step.gml:165-205` |
| **HIDDEN** | Invisible by default; reveals on player collision, times out and re-hides after collision ends | `hiddentile`: Create `visible` follows default(=invisible per meta? — actually visible flag toggled). Collision-0/42 with player: `visible=1; tside.visible=1; alarm[0]=30`. Alarm[0] re-hides (`visible=0`). 30 steps = **1.0 s** linger after last contact. Skips reveal if `server.sprite_index == Hexport`. | **MATCH** | — | `objects/0121-hiddentile/events/Collision-0.gml`, `Alarm.gml`, `Create.gml` |
| **GLOW** | Same collision behavior as hidden, but always visible + transitions to/from glowing | `btiletouch` (Bahoo tile): always drawn (`image_speed=0.5`). Collision-0/42: `sprite_index=BahooTileContactGlow; alarm[0]=30`. Alarm[0] reverts to `BahooTile`. Same 30-step (1.0 s) linger as HIDDEN. There is **no smooth tween** — it's a hard sprite swap to an animated glow sprite. "Transition" = the BahooTileContactGlow animation frames, not an opacity ramp. | **MATCH** (mechanism) / minor | — | `objects/0506-btiletouch/events/Collision-0.gml`, `Alarm.gml`, `Create.gml` |
| **GLOW (always-visible pulse variant)** | "special variant with pulsing glow animation, hints at hidden tiles/platforms, effectively just Borderless" | `btile`/`btilealert`/`btilemini` exist as always-animated glow tiles (`image_speed=0.5`/`1`, sprite `BahooTileGlowA/B`). No collision behavior — pure cosmetic animated floor. Confirms the "effectively just Borderless" reading. | **MATCH** | — | `objects/0504-btile`, `0505-btilealert`, `sprites/0979-BahooTileGlowA`, `0980-BahooTileGlowB` |
| **MOVER — accel** | "applies acceleration up to a peak velocity; consult code" | Player on `mtile1[lrud]`/`mtile3[lrud]`: each step adds **+2** to the matching directional accumulator (`srspeed/slspeed/suspeed/sdspeed`), then **−1** to all four every step. Net accel while on tile = **+1/step**, decel off tile = **−1/step**. | **MATCH** (numbers now pinned) | — | `objects/0000-server/events/Step.gml:54-81` |
| **MOVER — peak velocity** | "up to a peak velocity" | Accumulators clamped to **max 6, min 0**. Applied as `x+=srspeed; x-=slspeed; y-=suspeed; y+=sdspeed` (l.97-100). So peak push = **6 px/step (180 px/s)**. | **MATCH** | — | `objects/0000-server/events/Step.gml:74-100` |
| **MOVER — variants UP/LEFT/RIGHT/DOWN** | 4 cardinal variants | Confirmed: `mtile1l/r/u/d`, `mtile3l/r/u/d` checked; also `mtile2/4/5/6/7` families + `_m`, grass `mtileg5`, ice `mtilei5` reskins (parents 30/360). Only L/R/U/D. | **MATCH** | — | `objects/0030-mtile1l`,`0048-mtile1r`,`0032-mtile1u`,`0033-mtile1d`; Step.gml:54-69 |
| **MOVER — "push off into void"** | All forms can push player off the exiting end into the void | The mover push (`x+=srspeed` etc, l.97-100) is applied **before** and **independent of** the bordered edge check; it has no `tbordered`/`abscheck` guard. So a mover will shove you past an edge regardless of BORDERED, and the next-step fall-off check catches you. | **MATCH** | — | `objects/0000-server/events/Step.gml:97-100` vs border loop 224-243 |
| **MOVER (NPC/MrProg variant)** | (doc: applies to "NPCs, data item drops" too) | `pcode_mover` script gives MrProgs the same logic but DIFFERENT constants: accel **+1.5/step**, decel **−0.5/step**, max **5**. `d_spectrum` data-drop `mover` block also uses +1.5/−0.5/cap-5. | **PARTIAL MISMATCH** (player vs NPC constants differ) | **[LIKELY-DOC-DRIFT]** — doc says "consult legacy code for exact acceleration." Player=+2/−1/cap6, NPC/drop=+1.5/−0.5/cap5. Doc must specify which actor; if ReBNO wants uniform feel, that's a design call, but legacy is genuinely non-uniform. | `scripts/0355-pcode_mover.gml`, `objects/0418-d_spectrum/events/Step.gml` (mover block) |
| **PLATFORM — carries entities** | Moving platform carries entities with it | `mplat1_ud_u` Collision-0 with `server`: if player's feet-point inside platform rect, `server.y += vspeed/2` (or `server.x += hspeed/2` for LR). Carries player at **half the platform's own speed** because the player is also being re-collided each step (`stouch`/`alarm[1]=2` bookkeeping reconciles the double-count). | **MATCH** (carry confirmed) | — | `objects/0053-mplat1_ud_u/events/Collision-0.gml`, `0056-mplat1_lr_r/events/Collision-0.gml` |
| **PLATFORM — speed** | (not specified) | Default `vspeed=-3` (UD) / `hspeed=3` (LR) set in Create. So platforms travel **3 px/step = 90 px/s**. | n/a (doc silent) | — | `objects/0053-mplat1_ud_u/events/Create.gml`, `0056-mplat1_lr_r/events/Create.gml` |
| **PLATFORM — pause at ends** | "stops for some number of seconds at each end" | On hitting `mplatstop`/`tile1`/another `mplatparent` at the travel end, `vspeed/hspeed=0` and `alarm[0]` is set: **`90+random(60)`** steps if instance flag `rand` is set, else **`150`** steps. = **3.0 s fixed**, or **3.0–5.0 s randomized**, before Alarm[0] reverses (`vspeed = lspeed*-1`). | **MATCH** (pause exists) | — | `objects/0053-mplat1_ud_u/events/Collision-518.gml` / `-57` / `-573`, `Alarm.gml` |
| **PLATFORM — deterministic sync** | "movement client-driven but synced deterministically to server time so all players see platforms in same place" | **Legacy is NOT synced.** Platforms move in pure local GameMaker step time (`vspeed`/`hspeed` per-step), and the end-pause uses **`random(60)`** — a per-client RNG. Two clients drift immediately. There is no server timestamp anywhere in `mplat*`. | **MISMATCH** | **[LIKELY-REBNO-INTENT]** — The doc explicitly says movement "needs to be" synced "so all players see all platforms in the same locations." That's prescriptive future-tense ReBNO intent, not a legacy log. Legacy was unsynced local sim; ReBNO must add server-time determinism (and replace `random(60)` with a seeded/derived value). **Preserve the doc's intent; do not "correct" it to match legacy.** | `objects/0053-mplat1_ud_u/events/Collision-518.gml:24` (`random(60)`), `Step.gml` (local depth only) |
| **DYNAMIC — neighbor-sensitive sprites + TSide** | LONE / T-L-R-B neighbored / T-L-R-B endpiece / TL-TR-BR-BL corner / L+R & U+D bridge / SURROUNDED | `cornercheckg` (grass) & `cornerchecki` (ice/snow/sand) compute `cl/cr/cu/cd` (cardinal neighbors via `cornerl/r/u/d` probes at ±22/±20px) then pick `image_single` 0-15 by `cardinal` count + which sides present. 0=surrounded, 15=alone, plus all single/dual/triple-edge permutations. TSide/bottom sprite chosen via `topid`/`bottomid`. | **MATCH** | — | `scripts/0345-cornercheckg.gml`, `0353-cornerchecki.gml`, `0337-0344-corner*.gml`, `objects/0430-grasstile`, `0491-snowtile` |
| **DYNAMIC — SPECIAL corner rule** | "if surrounded on two sides but missing the diagonal between them, draw corner art where diagonals missing" | Exactly implemented as the **bend** logic: when `cardinal>1`, if `cu&&cl&&!cul → bendul`; `cu&&cr&&!cur → bendur`; `cd&&cl&&!cdl → benddl`; `cd&&cr&&!cdr → benddr`. Draw step overlays sprite frames 16/17/18/19 for each set bend. | **MATCH** (this IS the SPECIAL rule) | — | `scripts/0345-cornercheckg.gml` (Bends block), `0346-grassbends.gml`, `objects/0430-grasstile/events/Draw.gml:5-8` |
| **DYNAMIC — neighbor species rule** | "most patterned tiles treat other non-hidden, non-transparent tiles as same-species neighbors" | Partially true but more explicit: `cornercheck*` takes an explicit allow-list of comparable objects (e.g. snow compares to `snowtile,icetile,sandtile,mtilei5*` — 7 types). It is a curated species list, not a generic "any opaque tile." | **PARTIAL MISMATCH** | **[LIKELY-DOC-DRIFT]** — doc generalizes ("most…treat other non-hidden tiles"); code uses per-tile explicit neighbor allow-lists. Functionally similar but the rule is enumerated, not inferred from transparency. Worth pinning the exact lists per tile in the port. | `objects/0491-snowtile/events/Create.gml:6`, `0430-grasstile/events/Create.gml:5` |
| **SLIPPERY / ICE — momentum** | "player travels one cardinal direction until obstacle or non-slippery tile" | `icetile` + Step.gml ice block: when on ice and moving, captures `idir` = player's travel direction **snapped to nearest 90°** (`round(idir/90)*90`), and `ispeed` = px moved that step. Then while on ice, normal `fspeed`/mover speeds are zeroed and the navi slides `ispeed` px/step along `idir`, pixel-stepping with `door1vertical`/`icepillar` collision breaks. | **MATCH** | — | `objects/0000-server/events/Step.gml:107-153`, `0471-icetile` |
| **SLIPPERY — uncontrollable when only on slippery** | "uncontrollable velocity starts when only touching slippery tiles" | The slide branch runs while `position_meeting(feet, icetile)` is true and zeroes player input speeds; control returns only at the tile1 boundary. | **MATCH** | — | `Step.gml:119-140` |
| **SLIPPERY — direction from velocity at departure** | "direction determined by player's velocity at the moment they stop touching non-slippery tiles" | `idir = point_direction(lastx,lasty, x+lengthdir_x(fspeed,direction), …)` captured on the step the player first stands on ice while still having speed — i.e. entry velocity, snapped to 90°. | **MATCH** | — | `Step.gml:143-152` |
| **SLIPPERY — decel on non-slippery contact** | "player decelerates when they contact non-slippery tiles" | On reaching tile1-but-not-ice, `ispeed` is **converted back** into a directional `s*speed` accumulator (`srspeed=ispeed` etc) then `ispeed=0`; that accumulator decays −1/step via the mover decel. So decel = the standard −1/step ramp-down, not an instant stop. | **MATCH** | — | `Step.gml:111-118` |
| **FLICKER** | "tile disappears/reappears, flickers before disappearing; present-time & gone-time randomize; consult code" | **No FLICKER tile object exists.** Re-verified: the only `flicker` token in the entire client is `0000-server`'s joker-shell render blink (`Step.gml:218-219` toggles `flicker` 0/1 each step; `Draw.gml:5` uses it to blink the jokershell sprite). No floor tile reads it. The "BORDERLESS FLICKER white tile in Emptiness' Hull" has no implementing object. | **MISMATCH (absent)** | **[LIKELY-REBNO-INTENT]** — doc lists it as a desired tile type with timing TBD ("consult legacy code"); legacy simply never built it. Treat as a ReBNO-only concept to design from scratch (suggest: randomized present/gone timers à la the hidden-tile alarm pattern, deterministically seeded). | grep `flicker` → only `objects/0000-server/events/Step.gml:218`, `Draw.gml:5` |
| **QUARTERED** | "tiles 0.5h and 0.5w of normal tiles" | The Bahoo **mini** tiles are the real quartered tiles: `btilemini` sprite `BahooTileMini` = **22×20 px** with `MiniTileMask` 22×20 — exactly half-width AND half-height of the 44×40 floor tile (¼ area). NOTE: object `qtile` (0460) is **44×41** (essentially full-size, animated, parent=borderedtile) — its name suggests "quarter" but its geometry is a normal tile. | **MATCH** (maps to btilemini, NOT qtile) | — | `sprites/0982-BahooTileMini/meta.json` (22×20), `0986-MiniTileMask` (22×20); contrast `sprites/0483-QTile` (44×41), `objects/0460-qtile` |

---

## B. Floor tile *examples / composites* (doc §"Examples")

| Example | Doc claim | 5-8 reality | Match? | Classification | Evidence |
|---|---|---|---|---|---|
| BORDERED = BNCentral base | base walkable tile | `borderedtile` (0020) `tileborder(tside1)`, parent of many | MATCH | — | `objects/0020-borderedtile` |
| HIDDEN BORDERED glass; "glass shine flickered every other frame → change to ~50% opacity, no flicker" | legacy blinks, ReBNO wants steady 50% | `hiddentile` Draw: `if(global.alphaon) draw_sprite_ext(HiddenTileTop,0,…,0.5)` **else** `draw_sprite(HiddenTileTop,-1,…)` (animated/blinking). So legacy already has BOTH a 50%-opacity static path (when `global.alphaon`) and a blinking path. | MATCH (intent already partly in legacy) | **[LIKELY-REBNO-INTENT]** for the "always 50%, never flicker" decision — doc is prescribing the `alphaon` path as the only path. | `objects/0121-hiddentile/events/Draw.gml:4-5` |
| BORDERLESS GLOW = Bahoo floor; pulsing variant hints at hidden tiles | cosmetic | `btile`/`btilealert` animated glow, borderless | MATCH | — | `objects/0504-btile`, `0505-btilealert` |
| BORDERED/BORDERLESS MOVER, QUARTERED BORDERLESS MOVER (Bahoo) | composites | mover families reskinned per zone; mini movers plausible via btilemini geometry | MATCH (composable) | — | mtile families |
| DYNAMIC BORDERED MOVER (Ghennam icy water), DYNAMIC SLIPPERY BORDERED (ice), DYNAMIC BORDERED (snow) | Ghennam composites | `snowtile`(cornerchecki+border), `icetile`(cornerchecki+slippery), water via `mtilei5*` movers w/ corner art | MATCH | — | `objects/0491-snowtile`, `0471-icetile`, `0482-mtilei5l` |
| BORDERLESS FLICKER (Emptiness' Hull, white) | flicker tile | no flicker object (see FLICKER row) | MISMATCH (absent) | **[LIKELY-REBNO-INTENT]** | — |

---

## C. Interactive floor tiles

| Tile | Doc claim | 5-8 code reality + numbers | Match? | Classification | Evidence |
|---|---|---|---|---|---|
| **HEXPORTER — directional departure** | up/down/left/right enabled per-instance; player picks by facing before interacting; requires picking | `hexporter_any` (0414): `up/down/left/right` instance flags. On Enter (KeyRelease-35) within `point_distance(...) <= 14` and `iv_itemsearch(1,"1")>0` (= `HxpPlugn`): if `totdir>1` it picks the enabled dir matching `server.direction`; if `totdir==1` auto-picks that dir; sets `server.hxpdir`, `sprite_index=HexportIn`, snaps player to tile. Per-direction objects (`hexporter_d/u/l/r`) hardcode one `hxpdir`. | **MATCH** | — | `objects/0414-hexporter_any/events/KeyRelease-35.gml`, `0347-hexporter_d/events/KeyRelease-35.gml` |
| **HEXPORTER — station (receive)** | can be a station for incoming players | `hxtsideb` Collision-0: if an incoming `server` sprite is `Hexport` and `!hxdeny` and `fspeed!=0`, it **stops** the traveler (`fspeed=0`, snap to tile, `alarm[2]=5`). The 5-step alarm then either re-launches (if a dir is queued) or plays `HexportOut`. | **MATCH** | — | `objects/0350-hxtsideb/events/Collision-0.gml`, `0000-server/events/Alarm-2.gml` |
| **HEXPORTER — station-only (no departures)** | can have no dirs → station only | `if(!up&&!down&&!left&&!right) image_single=0`; KeyRelease guarded by `totdir>0`. With 0 dirs you can't launch, only receive. | **MATCH** | — | `objects/0414-hexporter_any/events/Create.gml`, `KeyRelease-35.gml` |
| **HEXPORT — travel speed** | (doc silent on numbers) | While `sprite_index==Hexport`: `fspeed += 0.2`/step, capped at **8** (Step.gml:28-35). Launch starts at `fspeed=0.2`. So hexport accelerates 0.2→8 px/step. | n/a | — | `objects/0000-server/events/Step.gml:28-35`, `Alarm-2.gml` |
| **HEXSLING — forwards in new direction; never station/conduit** | redirects only | `hexsling_any` via `hxstsideb` Collision-0: only acts on an in-transit `Hexport` traveler; cannot be entered as a launch point (no KeyRelease launch). | **MATCH** | — | `objects/0417-hxstsideb/events/Collision-0.gml` |
| **HEXSLING — 1-2 dirs: immediately send, prefer dir player wasn't traveling** | auto-redirect, prefers non-incoming dir | Code: if `up+down+left+right <= 1`, immediately picks the single enabled dir (priority `up>down>left>right`) and relaunches (`alarm[2]=10`). It does **NOT** compute "prefer the direction not traveling" — with exactly 1 dir there's only one choice; with 2 dirs the `<=1` branch isn't taken (falls to keywait pause). | **PARTIAL MISMATCH** | **[LIKELY-DOC-DRIFT]** — legacy's auto-send branch only fires for `totdir==1`. The "1 OR 2 dirs immediately send, preferring the non-traveling direction" claim isn't in code; 2-dir slings drop into the manual `keywait` pause (same as 3-4 dir). Either doc misremembers the threshold, or it's intended ReBNO smoothing. Flag for arbitration. | `objects/0417-hxstsideb/events/Collision-0.gml:6-15` |
| **HEXSLING — 3-4 dirs: pause, player chooses via input** | manual choice | If `>1` enabled dir, sets `keywait=1` (Draw blinks arrows `image_index mod 2`). Player's arrow KeyPress (37/38/39/40) on `hxstsideb` clears `keywait`, sets `hxpdir`, `alarm[2]=5`. | **MATCH** | — | `objects/0417-hxstsideb/events/Collision-0.gml:16`, `KeyPress-38.gml`, `Draw.gml` |
| **HEXBRIDGE — air by default, not walkable** | cannot be walked on initially | `hexbridge` Create: default `sprite_index=Hexbridge` (mask not Tile1) → not solid floor. Drawn as floating cylinder. | **MATCH** | — | `objects/0444-hexbridge/events/Create.gml` |
| **HEXBRIDGE — activates on hexport arrival, spawns walkable energy tile** | once hexported-to, becomes walkable | `hxbtsideb` Collision-0 (Hexport traveler arrives): sets `got=1`, pushes `bridgeid` into `global.hxbridge[]`, sends packet byte **21** to server. Collision-444 with the bridge then swaps `sprite_index → HexbridgePlatA/HexbridgePlat` and `mask_index=Tile1` (now walkable). Create rechecks `hxb_search(bridgeid)` so it stays activated on revisit. | **MATCH** | — | `objects/0445-hxbtsideb/events/Collision-0.gml`, `Collision-444.gml`, `0444-hexbridge/events/Create.gml` |
| **HEXBRIDGE — as hexport target, sends player back the way they came** | reverse incoming dir | `hxbtsideb` Collision-0: if no dir flags set, **inverts** incoming `hxpdir` (1↔0, 3↔2). If dir flags set, uses them instead. | **MATCH** | — | `objects/0445-hxbtsideb/events/Collision-0.gml:8-18` |
| **HEXBRIDGE — activation is per-player; others can't see/walk your bridges** | per-player state | Activation stored in **client-local** `global.hxbridge[]` array; `hxb_search` is local; bridge sprite/mask set from local `got`. The byte-21 packet syncs the list to the server (for persistence/own-session), but rendering keys off local `got` only. | **MATCH** (per-player confirmed) | — | `scripts/0348-hxb_search.gml`, `objects/0445-hxbtsideb/events/Collision-0.gml:22-29` |
| **WARP — intra-zone teleport; needs WrpPlugn** | does nothing without expansion | `loctele` (0516) Collision-0 gated on `iv_itemsearch(1,"6") > 0`. Without it, KeyRelease-35 prints "A navi expansion is necessary to interface with this portal." (`"6"` = WrpPlugn). | **MATCH** | — | `objects/0516-loctele/events/Collision-0.gml`, `KeyRelease-35.gml` |
| **WARP — step on the *glowing area*, not anywhere on tile** | sub-region activation | Activation requires `collision_rectangle(x+10,y+10,x+33,y+29, server,...)` — a **23×19px inner sub-rect** centered on the tile, not the full 44×40. | **MATCH** | — | `objects/0516-loctele/events/Collision-0.gml:2` |
| **WARP — destination warp won't activate until you step off first** | re-trigger lockout | `teledin` flag set when arriving (`TeleIn`/`JoinIn` while overlapping), cleared in Step-2 only once player no longer overlaps. While `teledin`, the activation branch is skipped. | **MATCH** | — | `objects/0516-loctele/events/Collision-0.gml`, `Step-2.gml`, `Collision-42.gml` |
| **WARP — connections one-directional possible; "dead" 1-way destination** | asymmetric links, dead-end version | Destinations are `global.lt_<ltid>[telenum,xy]` pairs; a warp jumps to `telenum-1`'s stored pos. A `disabled` instance flag yields a destination-only "dead" warp (Draw shows frame 0, no activation). Pairing is data-driven per `ltid`, so A→B need not imply B→A. | **MATCH** | — | `objects/0516-loctele/events/Create.gml`, `Alarm.gml`, `Collision-0.gml` (`!disabled`) |
| **SPECTRAL GATE — equip Spectrum Data; needs MskPlugn; opens spectrum menu** | customize player sprite | This is **`swaptile`** (0407), not a "gate"-named object. KeyRelease-35 within `point_distance<=14`, gated on `iv_itemsearch(1,"3") > 0` (`"3"` = MskPlugn). On success spawns `swappanel_draw` (the spectrum customization panel) and freezes the player. Without expansion: "A navi expansion is necessary to interface with this protocol." | **MATCH** (object is `swaptile`) | — | `objects/0407-swaptile/events/KeyRelease-35.gml`, `Step.gml` |
| **(Spectrum Data pickups)** | doc treats spectrum as menu only | Separately, `d_spectrum` (0418) is the collectible Spectrum Data *item* on the floor (`iv_additem(5,...)`), distinct from the gate. Not a gate; included to avoid confusion. | n/a (clarification) | — | `objects/0418-d_spectrum/events/KeyPress-35.gml` |

---

## Determinism map (synced-to-server-time vs per-player local)

| Behavior | Legacy reality | Notes for ReBNO |
|---|---|---|
| Mover-tile animation (`image_speed`) | Per-client local animation, unsynced | Cosmetic; deterministic if frame from server tick |
| Mover **push physics** | Computed locally on the *local* player only; result is the player's own position (then broadcast as movement state) | Movement is client-authoritative (Phase 06.7); push is naturally "synced" via position broadcast |
| Platform position | **Local GM sim, per-client, NOT synced**; end-pause uses `random(60)` per client | **Doc demands deterministic server-time sync — this is net-new ReBNO work.** Replace local stepping + `random()` with server-tick-derived position. |
| Platform end-pause duration | `90+random(60)` or fixed `150` steps, per-client RNG | Must be seeded/derived for determinism |
| HIDDEN reveal / GLOW activation | Local collision + local `alarm[0]=30`; reveal is **per-player** (your collision reveals it on your client) | If shared reveal desired, needs server event; legacy is per-player |
| Hexbridge activation | Per-player (`global.hxbridge[]` local), byte-21 packet persists own list | Confirmed per-player by design |
| Ice/slippery slide | Local physics on local player | Client-authoritative position; fine |
| FLICKER present/gone cycle | **Does not exist** | If built, MUST be server-time-seeded to be shared/deterministic |
| Player joker-shell blink (`flicker`) | Per-client cosmetic, toggles each step | Cosmetic only |

---

## Mismatches needing human arbitration

1. **PLATFORM deterministic sync** — Legacy platforms are pure local sim with `random(60)` end-pauses; the doc demands server-time deterministic sync. **Classified [LIKELY-REBNO-INTENT]** (doc uses prescriptive "needs to be"). Preserve the intent; this is real new work, not a doc error.
2. **PLATFORM end-pause `random(60)`** — needs a deterministic/seeded replacement to satisfy #1. (sub-item of 1)
3. **HEXSLING 1-2 dir auto-send + "prefer non-traveling direction"** — Legacy only auto-sends for exactly 1 enabled dir (fixed up>down>left>right priority); 2-dir slings actually fall into the manual keywait pause, and there is no "prefer the direction you weren't traveling" logic. **Classified [LIKELY-DOC-DRIFT]**, but could be intended ReBNO smoothing — **needs arbitration**.
4. **MOVER accel constants differ by actor** — Player = +2/−1/cap 6; NPC (`pcode_mover`) & data drops = +1.5/−0.5/cap 5. Doc says "consult legacy code" without distinguishing. **[LIKELY-DOC-DRIFT]** (under-specification). Decide whether ReBNO unifies them.
5. **FLICKER tile** — No legacy implementation exists anywhere. **[LIKELY-REBNO-INTENT]**: a desired tile type to design from scratch; timing ("present/gone randomize") is a ReBNO design decision (recommend deterministic seeded timers).
6. **QUARTERED maps to `btilemini` (22×20), not `qtile`** — Doc's "0.5h 0.5w" is satisfied by the Bahoo mini tiles (½×½ = ¼ area). The object literally named `qtile` is full-size (44×41) and animated. **[LIKELY-DOC-DRIFT]** in nomenclature only; the doc's geometric claim is correct — just point it at the right object.
7. **DYNAMIC neighbor "same-species" rule** — Doc says tiles treat "other non-hidden, non-transparent tiles" as neighbors; code uses explicit per-tile allow-lists passed to `cornercheck[g|i]`. **[LIKELY-DOC-DRIFT]** (generalization vs enumeration). Pin the exact lists per tile when porting.
8. **HIDDEN-glass "no flicker, ~50% opacity"** — Legacy already contains both a 50%-opacity static path (`global.alphaon`) and a blinking path. Doc prescribes always-50%. **[LIKELY-REBNO-INTENT]** — a deliberate visual decision; preserve.
