# 02 — Feature-Identifier Catalog (BNO legacy GML)

Maps every game-mechanic identifier in the extracted GameMaker 5.3a source to the behavior
it represents. Evidence is `path:line` relative to `extracted/`. Trees: `client-5-8` (C) and
`server-5-4` (S). All evidence drawn from plain-text `.gml` / `.json` — no binary inspection.

Cross-references `docs/LEGACY_FEATURE_REFERENCE.md` (the design vocabulary). This doc binds
that vocabulary to real code identifiers.

Legend: **(C)** = client tree, **(S)** = server tree. "key data" = inventory database
format index 1 (Navi expansions + mod data live in the same "key item" table).

---

## 1. Navi Expansions (`*Plugn` key items)

Canonical registry: `global.keydata[id, ...]` initialized in
`client-5-8/objects/0034-title/events/Other-2.gml:99-127`.
Schema (per comment lines 94-96): `[id,0]`=Data Name, `[id,1]`=icon/code name, `[id,2]`=description.
Expansions are checked at runtime via `iv_itemsearch(1,"<id>")` (search key-data db for that id).

| keyid | Code name (`[id,1]`) | Display name | Gates / enables | Evidence |
|---|---|---|---|---|
| 1 | `HxpPlugn` | Hexport Plugin | Hexporting + use of hexporters. Hexporter notif/activation guarded by `iv_itemsearch(1,"1")` | keydata: title/Other-2.gml:100-102; gate: objects/0348-hexporterparent/events/Step.gml:7 |
| 2 | `RmtPlugn` | Remote Plugin | "remote teleportation via link data" (remote travel / summon-join over link data) | title/Other-2.gml:105-107; iv_keyactions.gml:21 |
| 3 | `MskPlugn` | Mask Plugin | "compatibility with spectrum data" — opens Spectral Gate / spectrum swap panel. Gate: `iv_itemsearch(1,"3")` | title/Other-2.gml:110-112; gate: objects/0407-swaptile/events/KeyRelease-35.gml:6 |
| 4 | `TakABrak` | Take-A-Break.exe | Easter-egg; exports + runs `take-a-break.exe`. **NOT a Plugn** but occupies keyid 4 | title/Other-2.gml:115-117; action: iv_keyactions.gml:52-66 |
| 5 | `DuoPlugn` | Duo Plugin | Two-navi duo system (spotter/digger). Required to even appear duoable to others | title/Other-2.gml:120-122; usage text: iv_keyactions.gml:68-104 |
| 6 | `WrpPlugn` | Warp Plugin | "in-zone warping via local teleports". Gate for `loctele` warp object: `iv_itemsearch(1,"6")` | title/Other-2.gml:125-127; gate: objects/0516-loctele/events/Collision-0.gml:2, KeyRelease-35.gml:2 |

**Finding:** Only **6** Plugn-class expansions exist; the known set (Hxp/Wrp/Msk/Duo/Rmt) was
missing nothing — but `RmtPlugn` is keyid **2** (not a high id) and **TakABrak (keyid 4)** sits
between Msk(3) and Duo(5). There is no "DuoPlugn = keyid 5 vs 4" ambiguity: room creationCode in
`Emptiness_Hull/instances.json:6968` confirms `DuoPlugn → keyid=5`, `MskPlugn → keyid=3`,
`HxpPlugn → keyid=1`, `RmtPlugn → keyid=2`, and `WrpPlugn → keyid=6` (Floes instances.json:21115).

### Moderator "key data" items (NOT expansions, same db, ids 900-909)
Registered alongside expansions; behaviors in `iv_keyactions.gml:124-338`. These are the legacy
RCE-admin model the rebuild explicitly drops (CLAUDE.md Hard Rule 3).

| id | Code | Name | Behavior | Evidence |
|---|---|---|---|---|
| 900 | `<M:Exc>` | Executor | `execute_string(clipboard_get_text())` — local RCE | iv_keyactions.gml:132-137 |
| 901 | `<M:Qury>` | Query | `execute_string('meh='+keyboard_string)` local var query | iv_keyactions.gml:148-155 |
| 902 | `<M:NetExc>` | Net Executor | sends msgid 20 sub 0 (server execute_string of clipboard) | iv_keyactions.gml:166-175; server case 20 sub0: server_receive.gml:426-430 |
| 903 | `<M:NetQury>` | Net Query | msgid 20 sub 1 (server var query) | iv_keyactions.gml:186-196; server:431-440 |
| 904 | `<M:NetTarg>` | Net Target | msgid 20 sub 2 (set `global.mod_uid` target) | iv_keyactions.gml:207-217; server:441-445 |
| 905 | `<M:NetCon>` | Net Controller | msgid 20 sub 3 (send code to targeted uid) | iv_keyactions.gml:228-237; server:446-453 |
| 906 | `<M:Loc>` | Location | builds a link-data item (db 3) from current area/zone/pos | iv_keyactions.gml:248-255 |
| 907 | `<M:MasMod>` | Mass Moderation | always-on flag | iv_keyactions.gml:262-270 |
| 908 | `<M:NetPop>` | Net Populate | msgid 20 sub 4 (online-player query) | iv_keyactions.gml:281-289; server:454-468 |
| 909 | `<M:JkrShl>` | Joker Shell | spawns `jokershell` object, spectator/possession shell | iv_keyactions.gml:300-336; object 0481-jokershell |

---

## 2. Collectable / Data Types

Master switch: `iv_datagather(formatIndex, dataString)` —
`client-5-8/scripts/0302-iv_datagather.gml`. **Five** inventory database categories. Each has a
distinct icon sprite. `global.iv_itemdb[cat, ...]` holds items; `iv_itemsearch(cat,str)` looks up;
`iv_additem(cat,str)` adds.

| Format index | Category | Icon sprite | String schema | Evidence |
|---|---|---|---|---|
| 1 | **Key data** (expansions + mod items) | `DataIconR` | `<keyid>` (real) | iv_datagather.gml:6-12 |
| 2 | **Friend data** | `DataIconB` (`DataIconBAdd` for the "request" slot) | `<uid>|<username>` | iv_datagather.gml:15-30; add flow: rq_add.gml:14-18 |
| 3 | **Link data** | `DataIconY` | `<main>|1]<name>|2]<destName>|3]<zone>|4]<x>|5]<y>` | iv_datagather.gml:32-39; parser: iv_ldatainfo.gml |
| 4 | **Message data** | `DataIconW` | author/body packed (mb format) | iv_datagather.gml:41-54; iv_mdatainfo |
| 5 | **Spectrum data** | `DataIconColor` | `<set>|<colorIndex>` | iv_datagather.gml:56-83 |

### Link data sub-distinction (the "Zone Link" vs "Area Link" split)
`iv_ldatainfo(dataStr, field)` — `client-5-8/scripts/0327-iv_ldatainfo.gml`. Field 0 = "main?"
flag. **`main`/field-0 truthy ⇒ ZONE link data; falsy ⇒ AREA link data.**
- Zone link: `"Zone link data for " + destName` (iv_datagather.gml:36)
- Area link: `"Area link data for " + destName + " of " + zone_name(zone)` (iv_datagather.gml:37)
- Zone-link possession is the gate for summon/join into a zone:
  `iv_zonesearch(zone)` returns first ZONE-flagged link for that zone (scripts/0330-iv_zonesearch.gml:6).

Link-data collectable **objects** in the world:
- `d_link` (0425) — generic link-data pickup. `datastring` built in Create.gml:13; awarded on Insert
  (KeyPress-35.gml). Supports `passkey` lock, `main`(zone vs area), `pushnavi` (it can be a solid
  that shoves the navi). objects/0425-d_link/events/Create.gml, KeyPress-35.gml.
- `linkpoint` (0427) — a "link point" obelisk granting **area** link data; sprite swaps to
  `LinkPointInDead` if you lack that zone's zone-link (`iv_zonesearch(zone) <= 0`).
  objects/0427-linkpoint/events/Alarm-1.gml, KeyPress-35.gml:9.
- `d_spectrum` (0418) — spectrum-data pickup (db 5). objects/0418-d_spectrum/events/KeyPress-35.gml.
- `d_key` (0442) — key-data (expansion) pickup. objects/0442-d_key.

### Spectrum data internals
Five color "sets" (customizable Navi sprite layers); options table
`global.ncol_options[set,color]` (title/Other-2.gml:49-89):
1 = Helmet+body, 2 = Gloves+boots, 3 = Trim, 4 = Stripes, 5 = Core circles
(iv_datagather.gml:65-82; d_spectrum KeyPress-35.gml:15-19).

---

## 3. Travel Objects / Tiles

### Hexport family (requires HxpPlugn)
| Object (id) | Role | Evidence |
|---|---|---|
| `hexporterparent` (0348) | base hexporter; notif + activation gate `iv_itemsearch(1,"1")` | objects/0348/events/Step.gml |
| `hexporter_u/d/l/r` (0351/0347/0356/0355) | directional hexport conduits/stations | object names |
| `hexporter_any` (0414) | hexporter with all directions | object name |
| `hexsling_any` (0415) | **HEXSLING** — re-vectors a hexporting player; never a station | objects/0415-hexsling_any/events/Collision-417.gml |
| `hexport_rc` (0354) | hexport "receive"/redirect component | object name |
| `hexbridge` (0444) | **HEXBRIDGE** — floating cylinder; sprite `HexbridgePlatA`→`HexbridgePlat` once activated, then walkable (mask=Tile1). Per-player activation. | objects/0444-hexbridge/events/Other-7.gml; restore: server uhxb_backup/restore |
| `hxtsidet/b` (0349/0350), `hxstsideb` (0417), `hxbtsideb` (0445) | TSide border sprites for hexporter/hexsling/hexbridge | object names |
| (sprites) `Hexport`, `HexportIn`, `HexportOut` | player sprite-index states during hexport motion | referenced hexporterparent/Step.gml:13, d_link/Collision-0.gml:1 |

Server persists activated hexbridges per uid: `global.hxbridge[uid,...]`, msgid 21
(server_receive.gml:471-474); restore scripts `uhxb_restore`/`uhxb_backup`/`all_uhxb_rb`.

### Warp (requires WrpPlugn)
- **`loctele` (0516) IS the WARP object** ("local teleport"). Gate `iv_itemsearch(1,"6")`; without
  it: "A navi expansion is necessary to interface with this portal." Reads destination from
  `global.lt_<ltid>[telenum,0/1]` arrays — i.e. paired warp endpoints keyed by `ltid` (link/tele id).
  objects/0516-loctele/events/Collision-0.gml:2-17, KeyRelease-35.gml.
  Create defaults `contactcover = BahooTileContactGlow` (the "step on the glow" activation region).
  - `locteletsides` (0559) — its TSide border.
  - The "dead"/one-way warp destination from the doc = a `loctele` instance with `disabled`/no return mapping.

### Inter-zone teleporters (the `to<Zone>` objects)
Base: `teleparent` (0353). On Insert keypress sets `server.sprite_index = TeleOut`, "Transferring
to <areaname>..." (objects/0353-teleparent/events/KeyPress-35.gml). Each child sets `areaname` +
`area` (the target room) and is `event_inherited`.

| Object | Target |
|---|---|
| `tomainmenu`(0041), `toocs`(0532, → Online Command Screen), `tobncentral`(0531), `tobahoo`(0523), `tonoiya`(0452), `toschweisstar`(0456), `tofloesofghennam`(0494), `toprairieflats`(0318), `todesertedlobby`(0319), `todatabase`(0340), `toemptinesshull`(0366), `totraversecore`(0395), `todigitalabyss`(0387) | the named zone room |

### Home / location teleporters
- `hometele` (0058, C) / `teleporter1` (0058, S) — home/lobby teleporter; uses `OTeleB` sprite.
  objects/0058-hometele/events/Create.gml.
- `loctele` (above) doubles as the in-zone warp.

### Spectral Gate / spectrum swap (requires MskPlugn)
- `swaptile` (0407) — **the interactive SPECTRAL GATE tile.** On Insert: if `iv_itemsearch(1,"3")>0`
  spawns `swappanel_draw` (spectrum customization panel); else "A navi expansion is necessary to
  interface with this protocol." objects/0407-swaptile/events/KeyRelease-35.gml:6-22.
- `swappanel_draw` (0419) — the spectrum-customization UI panel.
- `ac_spectralgate` (0545) — the **area-name marker** that names this region "Spectral Gate"
  (change_area). objects/0545-ac_spectralgate/events/Collision-0.gml:2.
- `d_spectrum` (0418) — spectrum-data drop (see §2).
- Color application scripts: `set_navi_colors` (0313), `spr2ncol` (0314), `get_navi_front` (0315),
  `set_user_colors` (0322), `get_ncol_cnumber` (0325). Live recolor objects: `ncolchange` (0424),
  `pcolchange` (0426), `navicolordisplay` (0406).

---

## 4. Floor-Tile Mechanic Identifiers

Tile bordering is the discriminator: `tileborder(tsideObj)` (scripts/0085-tileborder.gml) attaches
a TSide sprite at the bottom edge. **A tile that calls `tileborder(...)` is BORDERED; a tile that
omits it is BORDERLESS.** (e.g. `borderedtile` Create.gml:3 calls it; `btile`/Bahoo Create.gml does NOT.)

| Doc vocabulary | Code identifier(s) | Evidence |
|---|---|---|
| BORDERED | `borderedtile` (0020) + `tside1` (0021). Generic bordered base; also `mtile1l`(0030) etc. call `tileborder(tside1)` | objects/0020-borderedtile/events/Create.gml:3 |
| BORDERLESS | `whitetile` (0119)+`wtside`(0120); `btile`(0504, Bahoo glow) omits border | objects/0119-whitetile/Create.gml:5; objects/0504-btile/Create.gml |
| HIDDEN | `hiddentile` (0121)+`htside`(0122). Invisible until `Collision-42` sets `visible=1`, `alarm[0]=30` re-hides | objects/0121-hiddentile/events/Collision-42.gml; Alarm.gml |
| GLOW | `btile`(0504) sprite `BahooTileGlowB`; `btilealert`(0505), `btiletouch`(0506), `btilemini`(0507); contact glow `BahooTileContactGlow` | objects/0505-btilealert/Create.gml:5; loctele Create.gml:8 |
| MOVER | `mtile<N><dir>` family: `mtile1l/r/u/d`(0030/0048/0032/0033), `mtile2..mtile7` sets incl. `_m`, grass/water/db/ice variants (`mtileg5*`,`mtilei5*`). Accel logic: `pcode_mover` | objects/0030-mtile1l; scripts/0355-pcode_mover.gml:13-37 (accel 1.5, decel 0.5, max 5) |
| PLATFORM | `mplatparent`(0054) / `mplatparentbordered`(0574); instances `mplat1_ud_u`(0053), `mplat1_lr_r`(0056), `mplat2/3`, grass/w/d/db/h variants; stops: `mplatstop`(0057), `mplatstoph`(0517), `mplatstopv`(0518). Collision carry: scripts `mplatbcheck`/`l`/`r`/`t` (0286-0289) | object names; scripts 0286-0289 |
| DYNAMIC (neighbor-sensitive) | corner-check scripts `cornerul/l/r/u/d/dl/dr/ur`(0337-0344), `cornercheckg`(0345, grass), `cornerchecki`(0353, ice), `grassbends`(0346); applied by snow/ice/grass tiles | scripts 0337-0346; icetile Create.gml:4 `cornerchecki(1,icetile)` |
| SLIPPERY | `icetile`(0471)+`itside`(0473); ice pillars `icepillar`+`cl/cr/cu/cd`(0486-0490). Slip handled in player movement (see pcode/player_update) | objects/0471-icetile/events/Create.gml |
| FLICKER | (no dedicated "flicker" object found; behavior is sprite/alarm driven on borderless white tiles — see Open Questions) | — |
| QUARTERED | `qtile`(0460) — uses `tctside` border but hides it (`visible=0`); half-size tile | objects/0460-qtile/events/Create.gml:4 |

Other named floor tiles (zone-flavored): `dirttile`(0025), `redtile`(0310), `greentile`(0465),
`bluetile`(0432)+`glassbtile`(0433), `sandtile`(0478)+`sandmetaltile`(0466), `snowtile`(0491),
`grasstile`(0430)+`flowergtile`(0431), `magictile`(0467), `futtile`(0457), `towertile`(0502),
`dbtile`(0336), `brtile`(0385), `tctile`(0399), `tile1ur`(0389)/`urhborder`/`ulhborder` (corner
ramps). Each pairs with a `*tside`/`*TSide` border object.

---

## 5. Duo System / Summon-Join / Requests

Unified **request** subsystem. Client request table: `global.rq_pid/rq_type/rq_timer/rq_total`.
`rq_new(pid, requestType)` — scripts/0272-rq_new.gml — is the dispatcher; its header (lines 1-13)
is the authoritative request-type enum:

| rq type | Meaning | Initiating script |
|---|---|---|
| 0 | Join (from other) | — (received) |
| 1 | Summon (from other) | — |
| 2 | Join (by self) | `rq_join` (0279) → msgid 15 sub 1 |
| 3 | Summon (by self) | `rq_summon` (0280) → msgid 15 sub 0 |
| 5 | Friend-Add (from other) | — |
| 6 | Friend-Add (by self) | `rq_add` (0331) → msgid 15 sub 5; trades Friend data (db 2) |
| 7 | Spot (from other) | — |
| 8 | Spot (by self) | `rq_spot` (0359) → msgid 15 sub 7 |
| 9 | Dig (from other) | — |
| 10 | Dig (by self) | `rq_dig`...→ `rq_duodig` (0360) → msgid 15 sub 9 |

Helper scripts: `rq_find`(0275, by type), `rq_dig`(0274, by type-set), `rq_collapse`(0271),
`rq_timercount`(0270), `rq_cancel`(0281), `rq_decline`(0282), `rq_ignore`(0283),
`rq_areasend`(0278, sends your area to a confirmed summon/join partner via msgid 16), `rq_spot`(0359).

**Summon vs Join gate:** both require zone-link data OR `global.zone==3` (Emptiness' Hull is open)
OR partner is your duo (`argument0==global.duopid`):
- Summon: `iv_zonesearch(global.zone)>0` (rq_summon.gml:1)
- Join: `iv_zonesearch(room_zone(p_room[target]))>0` (rq_join.gml:1)

**Duo system:** requires DuoPlugn on BOTH navis. Roles: spotter / digger.
- Form duo as digger: `rq_duodig` (0360) — on success sets `global.duopid`, `global.duorole=0`,
  sends msgid 22 sub 1 (induo flag). Form as spotter: `rq_spot` (0359).
- `end_duo` (0361). Globals: `global.duopid`, `global.duorole`, `global.potenpid` (nearby
  duo-able candidate). Duo perks (auto-accept summon/join, cross-distance chat, watch, fall→join)
  enumerated in iv_keyactions.gml:88-102.
- Server duo/watch state via msgid **22** (server_receive.gml:476-490):
  sub0 `p_canduo[pid]`, sub1 `p_induo[pid]`, sub2 `p_watchable[pid]` (+ optional watched-pid byte).

**Watch system (spotter watches digger):**
- `watcher` (0567) object sets `view_object[0]=self` (camera follows it).
  objects/0567-watcher/events/Create.gml:2.
- Globals `global.watchpid`, `global.watching` (title/Other-2.gml:33-34). `watside`(0401) is a
  related TSide. `\`watch` command toggles (iv_keyactions.gml:96).

---

## 6. Message Board (no literal `MB_News`/`MB_Log` — here's the real structure)

Boards are objects parented to `mbparent` (0352). Each instance carries `mbid`; `newspr` swaps in
when `global.mb_newmsg[mbid]` is set (objects/0352-mbparent/events/Step.gml:2). Globals:
`global.mb_board[i]` (board titles), `global.mb_total[0]` (#boards), `global.mb_newmsg[i]`,
`global.mb_level/cboard/ctopic/creply` (navigation state) — title/Other-2.gml:188-203.

Per-zone board objects (each a distinct `mbid`):
`bncentral_mb`(0305), `scrollwood_mb`(0306), `divine_mb`(0307), `galewind_mb`(0308),
`crushed_mb`(0320), `spikepit_mb`(0324), `xuizzle_mb`(0339), `frequency_mb`(0342), `bug_mb`(0345),
`zigznewz_mb`(0373), `elementquilt_mb`(0449), `divinemist_mb`(0450), `dlookglass_mb`(0451),
`rumdischarge_mb`(0530), `bncore_mb`(0533), `zonewardeye_mb`(0534), `divinechorale_mb`(0535),
`tropicalsuit_mb`(0536), `ascending_mb`(0537), `glacialtome_mb`(0558), `divinetribune_mb`(0560),
`gearbox_mb`(0561), `writevenom_mb`(0581), `lostletters_mb`(0582).

MB scripts (client): `mb_getname`(0252), `mb_getwriter`(0253), `mb_getbody`(0254),
`mb_repwrite`(0262), `mb_topdraw/repdraw/newdraw`, `mb_up/down`, `mb_tcollapse/rcollapse/trise`,
`mb_bgset`(0350), `mb_colset`(0351). Draw objects: `mb_bodydraw`(0170), `mb_titledraw`(0175),
`mb_optiondraw`(0302).

Server persistence (this is the closest thing to "MB_Log"): boards backed up/restored via
`mb_backup`(0365)/`mb_restore`(0366); **per-user unread-news** state via `unews_backup`(0371)/
`unews_restore`(0372)/`all_unews_rb`(0373). "News Center" area marker = `ac_news`(0409)
(change_area "News Center", objects/0409-ac_news). Wire: msgids 6,7,11,12,13,14,18,19
(server_receive.gml cases) handle board read/post/sync.

---

## 7. Zone / Area Identifiers

`zone_name(area)` (scripts/0328-zone_name.gml) and `zone_room(area)` (0326) and `room_zone(room)`
(0336) are mutually inverse maps. **In this codebase "area" == "zone number"** (the variable is
`global.area`/`global.zone`; `zone_name` keys on the area number).

| area/zone # | Name (`zone_name`) | Room (`zone_room`) | Transition object |
|---|---|---|---|
| -1 | Online Command Screen | `Online_Command_Screen` (0007) | `toocs`(0532) |
| 0 | Deserted Lobby | `Online_Lobby` (0004) | `todesertedlobby`(0319) |
| 1 | Prairie Flats | `Prairie_Flats` (0046) | `toprairieflats`(0318) |
| 2 | Database | `Database` (0047) | `todatabase`(0340) |
| 3 | Emptiness' Hull | `Emptiness_Hull` (0048) | `toemptinesshull`(0366) |
| 4 | Digital Abyss | `Digital_Abyss` (0049) | `todigitalabyss`(0387) |
| 5 | Traverse Core | `Traverse_Core` (0052) | `totraversecore`(0395) |
| 6 | Bahoo | `Bahoo` (0053) | `tobahoo`(0523) |
| 7 | Noiya | `Noiya` (0054) | `tonoiya`(0452) |
| 8 | Schweisstar | `Schweisstar` (0055) | `toschweisstar`(0456) |
| 9 | Floes of Ghennam | `Floes_of_Ghennam` (0056) | `tofloesofghennam`(0494) |
| 10 | BNCentral | `BNCentral` (0058) | `tobncentral`(0531) |

Evidence: scripts/0328-zone_name.gml:4-15, 0326-zone_room.gml:4-15, 0336-room_zone.gml:4-15.
(`Digital_Abyss` is the fall/death destination; `Emptiness' Hull` is the only zone open without
zone-link data — see §5.)

### Area-connector markers (`ac_*` objects)
~120 `ac_*` objects (0109-0581). Each is an **invisible** marker (`visible:false`,
meta.json) whose Collision-0 calls `change_area("<sub-area name>")` to update the on-screen area
label (e.g. `ac_centralsquare`→"Central Square"-style, `ac_news`→"News Center",
`ac_spectralgate`→"Spectral Gate"). They name sub-regions within a zone; they are NOT teleporters.
Evidence: objects/0545-ac_spectralgate/events/Collision-0.gml:2; 0409-ac_news; meta.json:10-11.

---

## Newly Discovered Identifiers (not in current docs)

1. **`TakABrak` (keyid 4)** — a 6th "key item" between the expansions; runs `take-a-break.exe`.
   Not a Plugn; easter-egg. (iv_keyactions.gml:52-66) — drop/replace in rebuild.
2. **Mod "key data" items 900-909** (`<M:Exc>`…`<M:JkrShl>`) — full legacy RCE-admin item set,
   each mapped to a wire op (msgid 20 sub-commands). Confirms CLAUDE.md Hard Rule 3 scope.
3. **`loctele` = WARP** — the doc's "WARP" tile is the `loctele` object ("local teleport"),
   gated by WrpPlugn, destinations in `global.lt_<ltid>[]` arrays.
4. **`swaptile` = the interactive Spectral Gate**, distinct from `ac_spectralgate` (the area-name
   marker). MskPlugn-gated; spawns `swappanel_draw`.
5. **`linkpoint` vs `d_link`** — two different link-data sources; `linkpoint` grants AREA link data
   and visibly "dies" (`LinkPointInDead`) when you lack the zone link.
6. **Five inventory data categories** (Key/Friend/Link/Message/Spectrum) unified under
   `iv_datagather`; "Zone Link" vs "Area Link" is the `main`/field-0 flag of db-3 link data, not a
   separate db.
7. **Request taxonomy is 11 types** (0-10) covering Summon/Join/Friend-Add/Spot/Dig under one
   `rq_*` system (rq_new.gml header) — Duo spot/dig are requests 7-10, not a separate channel.
8. **Watch system** objects/globals (`watcher`, `global.watchpid/watching`, `p_watchable`, msgid 22
   sub2) — spotter-cam-follows-digger; not previously named.
9. **Hexbridge persistence** is server-side per-uid (`global.hxbridge[uid]`, msgid 21,
   `uhxb_*` scripts) — activation state survives sessions.
10. **`hexsling_any`/`hexport_rc`** are the concrete HEXSLING / hex-redirect objects.
11. **Tile-border convention**: BORDERED ⇔ object calls `tileborder()`; BORDERLESS ⇔ it does not.
    This is the single mechanical discriminator behind the doc's Bordered/Borderless axis.
12. **Wire-protocol message-ID table** fully enumerated in server `server_receive.gml:44-52` +
    cases 0-23 (relevant for Phase 3 39dll reversing): 0 name,1 room,2 sprite,3 pos,4 chat,
    5 logon, 6/7 mb edit, 8 totalcats, 11/12 mb post, 13/14 mb read, 15 requests, 16 area-send,
    18 mb list, 19 mb collapse, 20 mod ops, 21 hexbridge sync, 22 duo/watch flags, 23 (ack/poke).

## Open Questions

1. **FLICKER tile** — doc lists "BORDERLESS FLICKER (Emptiness' Hull)" but no `flickertile`
   object exists. Likely an alarm-driven visible-toggle on a white/borderless tile or a sprite
   with built-in flicker. Need to inspect Emptiness_Hull instances + any per-tile alarm code.
2. **SLIPPERY exact mechanic** — `icetile` exists but the slip-velocity logic lives in player
   movement (`player_update`/`pcode_*`); not yet traced. `pcode_slookat`,`pcode_facedir` seen but
   not the slip integrator.
3. **DYNAMIC "SPECIAL" diagonal-corner rule** — corner-check scripts exist (`cornercheck*`,
   `grassbends`) but the exact diagonal-missing → corner-art rule (doc line 24) not yet read.
4. **`loctele` "dead"/one-way warp** — confirmed `disabled` flag exists; the one-way-destination
   data shape (`global.lt_*` pairing) needs a worked example from a room's creationCode.
5. **`alphaq` (0118) / `bkmbq` / `tcprecq` / `tcpsendq` / `notifq`** — "queue"-suffixed objects;
   purpose (alpha overlay? debug queues?) not yet examined.
6. **`jokershell` full behavior** — moderator spectator/possession shell; Step/Collision logic and
   `JoinIn/JoinOut/TeleIn/TeleOut` sprite-state machine not fully traced.
7. **`global.zone==3` summon/join carve-out** — Emptiness' Hull is summon/join-open without zone
   link; confirm whether other zones share this and why (rq_summon.gml:1).
8. Server `case 24/26` are commented-out/partial — reserved wire ops worth noting for Phase 3.
