# Legacy Recon 11 — "MESSAGE DATA" (inventory category 4)

**Source:** `extracted/client-5-8` (Client 5-8) + `extracted/server-5-4` (Master 5-4). Plain-text GML; all evidence below is `file:line`.

**TL;DR completeness:** **~25% implemented — a read-only stub.** What *exists*: a storage string format, a parser (`iv_mdatainfo`), an inventory icon (editable vs readable), an author-vs-stranger distinction, and generic server persistence (because the whole inventory blob is serialized uniformly). What *works at runtime*: **View only** (dumps the note to the chat log). What is **stubbed** (menu entry present, body is a placeholder/no-op): **Edit** and **Delete**. What is **entirely absent**: the **write/create UI**, the **world-drop object**, the **send-to-friend path**, and any **stranger-lock or lifetime/expiry** logic. The author's own comment block explicitly lists "Send, Drop … Edit" as *planned* options that were never built. ReBNO must build the entire authoring, drop, send, lock, and expiry feature from scratch; only the data format and the read/parse path are portable.

> This is category-4 inventory "Message Data", DISTINCT from the Message BOARD (`mbparent`/`*_mb`) system. No overlap was found in code.

---

## Storage

**Category index & registration**
- `objects/0393-iv_backdraw/events/Create.gml:30` and `objects/0034-title/events/Other-2.gml:207`: `global.iv_totalcats = 6` ("2 + No. Collective Categories"). Collective types are `coltype` 0–3 mapped to DB index `2+coltype` via `scripts/0304-iv_tabcol2db.gml:11`. Message Data is **coltype 2 → DB category index 4** (`global.iv_coltypes[3] = "Message Data"`, `Create.gml:150`).
- Storage is a generic 2-D string array `global.iv_itemdb[category, n]` where `[cat,0]` = count and `[cat,1..n]` = item strings (`iv_backdraw/Create.gml:19-30`). Nothing special-cases category 4.

**On-the-wire data string format** (seeded test data, `iv_backdraw/Create.gml:91-97`):
```
Title#1#Author#2#ModDate#3#ModTime#4#MessageBody
```
e.g. `"Test#1#Vance Serori#2#MM/DD/YY#3#HH:MM:SS _M#4#This is the test message data body text..."`
Note the date/time are **literal placeholder strings** `MM/DD/YY` / `HH:MM:SS _M` in the seed — no code ever writes a real timestamp.

**Parser** `scripts/0312-iv_mdatainfo.gml` — splits on the `#1#`/`#2#`/`#3#`/`#4#` delimiters. Documented field set (lines 2-7):
- `0` Title, `1` Author, `2` Mod Date, `3` Mod Time, `4` Message body.
- **Five fields only. There is NO recipient, NO lock flag, NO expiry/lifetime field.**

**Author vs stranger ("editable")** `scripts/0302-iv_datagather.gml:40-54`: for category 4, returns `1` if `Author == global.playername` else `0`. That boolean only chooses the icon and gates the (stubbed) Edit action — it does NOT restrict viewing. Icon drawn by `scripts/0305-iv_iconextras.gml:38-49`: `IC_MData_Editable` (you authored it) vs `IC_MData_Readable` (someone else's). Sprites exist: `sprites/0466-IC_MData_Editable`, `sprites/0467-IC_MData_Readable`.

**Persistence** — works generically, not message-specific:
- Client→server: `scripts/0324-iv_updateserver.gml` sends msgid 8 = entire inventory (per category: `writeint(count)` then `writestring` per item).
- Server store: `server-5-4/scripts/0359-server_receive.gml:253-267` (case 8) loops all categories and calls `uinv_set(uid,cat,n,...)` — no branch for category 4.
- Server load / file backup: `uinv_get` (0375), `uinv_backup` (0376), `uinv_restore` (0377) all iterate `iv_totalcats` generically.
- So **if** a message-data item were ever created client-side, it WOULD round-trip and persist for free. Nothing creates one.

## World-drop

- **Absent.** Droppable inventory world-objects exist for other categories: `objects/0418-d_spectrum`, `objects/0425-d_link`, `objects/0442-d_key`. There is **no `d_message` / `d_mdata` / note object** (verified: `ls objects | grep -iE "messag|note|d_|mail|letter"` returns only `d_spectrum`, `d_link`, `d_key`, plus unrelated `*_mb` board zones and `mplat*` platforms).
- The pickup pattern (e.g. `d_key/events/KeyPress-35.gml:10` → `iv_additem(1,datastring)`) shows how a drop would be reclaimed, but no equivalent exists for category 4.
- The author's action comment (`iv_backdraw/Create.gml:160-162`) explicitly names **"Drop (for Message Data)"** as a *planned* option — never implemented.

## Send-to-friend

- **Absent.** No msgid, request type, or keyboard command sends a message-data item to a player. Searched client + server for any send/recipient/inbox path — none.
- For comparison, Friend Data has a full action set (Whisper/Join/Summon/Delete via `iv_setactions.gml:35-85`) and a friend-request flow (`rq_*` scripts), but none of those carry a message-data payload.
- The author's comment (`iv_backdraw/Create.gml:160-162`) lists **"Send"** as a planned option — never implemented. (Owner's "in-game email via Friend Data" concept has zero code.)

## Lifetime + lock

- **Both entirely absent.** Grep of `extracted/client-5-8/scripts` for `lifetime|expir|stranger|lock|days|recipient|deliver|inbox` returns **no message-data hits** (only unrelated TCP "blocking" comments). No expiry timestamp, no return-to-author logic, no stranger-lock gate.
- The only thing resembling a "stranger" concept is the editable/readable author check above — but it does not lock *viewing*; any holder can View any note. There is no notion of "only friend-data holders can open it."

## Completeness verdict

| Capability | State | Evidence |
|---|---|---|
| Storage format & parse | **Built** | `iv_mdatainfo.gml`; format `Title#1#Author#2#Date#3#Time#4#Body` |
| Server persistence | **Built (generic)** | `iv_updateserver.gml`, `server_receive.gml:253` case 8 — no cat-4 special case |
| Icon / author-vs-stranger flag | **Built** | `iv_datagather.gml:40-54`, `iv_iconextras.gml:38-49`, sprites 0466/0467 |
| **View** action | **Works** | `iv_setactions.gml:211-225` — dumps note to chat (`c_whisper`) |
| **Edit** action | **Stub** | `iv_setactions.gml:226-240` — author check works, but body literally prints `'When this is in, you will now be editing the message.'` then no-ops |
| **Delete** action | **Stub** | `iv_setactions.gml:241-247` — menu entry exists, body only closes the menu; does NOT call `iv_collapse` (contrast Friend/Link/Key which do) |
| Create / write UI | **Absent** | no `iv_additem(4,...)` call anywhere; only hardcoded seed data |
| World-drop object | **Absent** | no `d_message` object |
| Send-to-friend | **Absent** | no msgid / command / recipient field |
| Stranger-lock | **Absent** | no lock field or view gate |
| Lifetime / expiry | **Absent** | no expiry field, no timestamps written (seed uses literal `MM/DD/YY`) |

**What ReBNO must BUILD (not port):** authoring/edit UI, world-drop entity + pickup, send-to-friend delivery, stranger-lock, lifetime/expiry. **What ReBNO can PORT:** the 5-field data string format and the read/parse path — though if redesigning, add real recipient/lock/expiry fields the legacy format never had.

**Confidence:** High. All claims are `file:line`-backed and absences confirmed by negative grep across both `client-5-8` and `server-5-4`. Lowest-confidence item is the Delete stub interpretation — its body genuinely lacks the `iv_collapse(...)` call that every other category's Delete uses, so it is a no-op as written; flagged as inference from comparison rather than an explicit "TODO" comment.
