# Legacy Recon 13 — The FLICKER Floor Tile (correction pass)

**STATUS: FOUND.** Two prior passes missed it because the object is **not** named
`*flick*` / `*blink*` / `*fade*`. Its real name is **`magictile`** (object id 467).
It is a white, borderless floor tile that periodically vanishes and reappears with a
pre-disappear flicker, and it is used **prominently in Emptiness' Hull** — exactly as
`docs/LEGACY_FEATURE_REFERENCE.md` describes for "BORDERLESS FLICKER: White."

---

## 1. Object identity

| Field | Value |
|---|---|
| **Real object name** | **`magictile`** |
| Object id | 467 (`extracted/client-5-8/objects/0467-magictile/`) |
| Parent object | 573 `tile1` (generic floor-tile base; `tile1/Create.gml` just calls `tileborder(tside1)` + `depth_set(2,0)`) |
| Sprite | 928 `MagicTile`, **44×40 px** (canonical floor tile pitch), `transparent: true` |
| Side-border companion | 468 `mtside` (sprite 930 `MTSide`), the y+40 vertical-face piece, toggled in lockstep with the tile |
| Default `visible` | `true` (present at room start) |
| `solid` | false (collision is via mask_index, see below) |

### BORDERLESS / WHITE — confirmed from pixels
`sprites/0928-MagicTile/frames/img_000.bmp` decoded: only two colors —
pure white `(255,255,255)` and GameMaker transparency-key magenta `(237,0,140)`.
**Every opaque pixel is white; zero non-white opaque pixels = no border ring.**
So the tile renders as a flat **borderless white** square.
(Contrast: `whitetile` id 119, sprite 136, is grey-shaded `(180/192/224,...)` —
that's the static bordered white floor, 510 instances, NOT the flicker tile. The two
were almost certainly conflated in the prior misses.)

## 2. Flicker / present / gone logic (file:line evidence)

`magictile` has events: `Create`, `Alarm` (alarm[0]), `Alarm-1` (alarm[1]).
Canonical truth verified against `Alarm.dnd.json` (transcompile is faithful).

**Create** — `objects/0467-magictile/events/Create.gml`
```
depth_set(2,0);
tside = instance_create(x, y+40, mtside);   // spawn the side-face piece
alarm[0] = ceil(random(30)) + 45;           // PRESENT duration: 45..75 steps
```
`bcount` is never declared in Create or in parent `tile1` — in GM 5.3a an
unread var reads as 0, so the first alarm[0] enters the flicker branch with bcount=0.

**Alarm event 0 (alarm[0]) — the flicker + disappear** — `events/Alarm.gml`
```
if (bcount < 30) {                 // FLICKER PHASE: 30 rapid toggles
    if (visible) { visible = 0; tside.visible = 0; }   // blink off
    else        { visible = 1; tside.visible = 1; }    // blink on
    bcount += 1;
    alarm[0] = 1;                  // re-fire every 1 step => ~15Hz strobe
} else {                           // flicker done -> GO AWAY
    bcount = 0;
    visible = 0; tside.visible = 0;
    mask_index = sprite44;         // swap collision mask while gone
    alarm[1] = ceil(random(30)) + 30;  // GONE duration: 30..60 steps
}
```

**Alarm event 1 (alarm[1]) — reappear** — `events/Alarm-1.gml`
```
if (!visible) {
    visible = 1; tside.visible = 1;
    mask_index = Tile1;            // restore solid floor mask
    alarm[0] = ceil(random(30)) + 45;  // back to PRESENT: 45..75 steps -> loop
} else {
    alarm[1] = ceil(random(30)) + 30;  // (guard / re-arm)
}
```

### Numbers (room speed = 30 steps/sec)
| Phase | Logic | Duration |
|---|---|---|
| **Present (solid)** | `ceil(random(30)) + 45` | **45–75 steps ≈ 1.5–2.5 s**, randomized |
| **Flicker tell** | 30 toggles, `alarm[0]=1` each step | **30 steps = 1.0 s**, fixed strobe at ~15 Hz |
| **Gone (passable/hole)** | `ceil(random(30)) + 30` | **30–60 steps ≈ 1.0–2.0 s**, randomized |

The pre-disappear "flicker tell" = the 30-step on/off strobe before it fully hides.
Collision mask flips between `Tile1` (present/solid floor) and `sprite44` (gone) so
that a Navi can fall/pass through while the tile is absent.

## 3. Synchronization — LOCAL / UNSYNCED (needs ReBNO server-sync)

- All timing is driven by client-side `alarm[]` seeded with **client-local `random()`**.
- No seed, no server tick, no packet read/write anywhere near it.
- Grep for `magictile` across `scripts/` + `objects/` returns only its own object and
  the `tileborder` helper script (`scripts/0085-tileborder.gml`) — **no networking code**.
- Therefore each client sees an **independently-phased** flicker. In the original this
  was cosmetic-ish; for ReBNO it MUST be server-synced (server owns present/gone state
  + transition timing and broadcasts) or two players will see the tile solid/gone at
  different moments — a correctness/fall-trigger hazard.

## 4. Emptiness' Hull placement

Room = **`rooms/0048-Emptiness_Hull`** (zone 3, confirmed). 997 instances.
Object-id histogram (id -> name -> count) for the floor-relevant objects:

- 119 `whitetile` ×510  (static bordered white floor — the bulk of the level)
- 361 `mtile3r` ×108, 362 `mtile3u` ×95, 363 `mtile3d` ×84, 360 `mtile3l` ×41, 364 `doorwvertical` ×39, 365 `doorwhorizontal` ×35 (metal-tile edges / door frames)
- **467 `magictile` ×35**  ← the FLICKER tiles, "prominently in Emptiness' Hull"
- 121 `hiddentile` ×10 (a *different* mechanism — invisible-until-collision tile, alarm-driven reveal; NOT the strobe-flicker)
- 444 `hexbridge` ×8, 57 `mplatstop` ×5, plus moving-platform / hexport / teleporter / sign one-offs.

`magictile` appears **35 times** — a prominent, deliberately-placed hazard set, matching
the owner's recollection. (`hiddentile` id 121 is the most likely source of the prior
false "no flicker" conclusion if someone glanced at it — but it reveals on collision via
its own Alarm/Draw/Collision events and does not strobe; it is a separate feature.)

## 5. Verdict

`magictile` (obj 467, sprite 928 MagicTile, 44×40, borderless white) is the
**BORDERLESS FLICKER** tile. Present 45–75 steps (randomized) → 1.0 s / 30-toggle
strobe tell → gone 30–60 steps (randomized) → repeat. Mask swaps Tile1↔sprite44 so
the floor is genuinely passable while gone. Timing is **100% client-local/unsynced**
and will require server-authoritative state in ReBNO.

[doc->REQ-CDOC-01]
