diff --git a/modules/rust/PLAN_REDESIGNS.md b/modules/rust/PLAN_REDESIGNS.md index 9a5cb08..6655945 100644 --- a/modules/rust/PLAN_REDESIGNS.md +++ b/modules/rust/PLAN_REDESIGNS.md @@ -5,7 +5,8 @@ On 2026-09-28 the org lead added the first-class optional plugins (§11, D199– It is step 3 of [`PLAN_FIXES.md`](PLAN_FIXES.md) §6: the six changes the org lead decided during the first player walk, each "planned in detail before code". The org lead asked for all six in one plan (2026-09-27), so they can be read together. **Built so far:** §1, walked 2026-09-28 (§1.9); §5, built 2026-09-28 with its -rig walk still to come (§5.8, D209). +rig walk still to come (§5.8, D209); §3, built and walked on the rigs and the site 2026-09-29, its in-game +rows still to come (§3.4); §4, built 2026-09-29 (§4.1). This is a companion to [`PLAN_FIXES.md`](PLAN_FIXES.md) and [`PLAN.md`](PLAN.md). Where they disagree, this document is later and wins. Its decisions continue PLAN_FIXES' numbering at **D188**. @@ -558,6 +559,39 @@ so the site refuses it until protocol 13 ships: - **Not chosen:** the game's own `MonumentType` (§0.7), sent by the plugin. It is authoritative, but it is a wire change, and nothing yet shows that substations are a type of their own. +### 4.1 As built (2026-09-29; Module-Rust only, no wire change) + +- **Storage.** One row per label, `on` or `off`: the fleet's in `rust_settings` as `map.marker.`, a + server's in `rust_map_overrides` under the same setting name. No schema change. The key is the label + trimmed, single-spaced and lower case, because the game is not consistent: the rig's map says + `jungle swamp` for `ue_jungle_swamp_a`. Both columns are `VARCHAR(64)`, so a label longer than 53 + characters cannot carry a switch and the write says so. A stored word that is neither `on` nor `off` + follows the default above it. Unlike a layer audience, this does not narrow, because a label switch is + clutter control and not a security boundary. The world layer's audience still decides whether a viewer + gets monuments at all. +- **Precedence.** A server's switch wins over the fleet's, and the fleet's over the built-in list, label by + label. Setting the fleet back to what the built-in list says deletes the row instead of storing a copy, + so a later change to the list reaches that label. +- **The built-in list** (`MINOR_LABELS`, off by default): Substation, Underground Cave, Train Tunnel, Water + Well, Wild Swamp, Jungle Swamp, Ice Lake, Jungle Ruin, Fishing Village, Large Barn, Abandoned + Supermarket, **Oxum's Gas Station, Mining Outpost, Ranch**. The first eleven are spelled as the rigs' + map (world 3000, seed 1234) labels them. The last three are not on that map, and their spellings are + Rust's display names, **not read from a rig**. If one is wrong, that monument is drawn. That is the side + the rule fails on, and the admin can still hide it by hand. *Large* Fishing Village is a separate label + and stays on. +- **Where it is applied.** `GET /public/rust/servers/:id/map` leaves out every monument whose label is + hidden on that server. The website and the Android app read the same answer, so both lose the markers + with no client change. `map.access()` carries the merged switches. Event steps that name a monument + (`world.monuments`) are untouched: an event can still be placed at a substation that the map hides. +- **Admin → Rust visibility, the live map card.** Under the fleet layer switches, **Monuments on the map** + is a collapsed list with a checkbox for each label found on any server's current map plus the built-in + list (a minor label no map has yet is still listed, so it can be decided before a wipe brings it). Each + server row has its own collapsed **Monuments** list of the labels on its current map, each set to + *Default (drawn/hidden)*, *Drawn* or *Hidden*. The page's one `PUT` carries `map.fleet.markers` and + `map.servers..markers`, each `{ key: true | false | null }`. `null` clears the switch. +- **Tests:** 6 server (`map.test.js`) and 7 client (`mapMarkers.test.js`, the page's pure half) — 461 and + 65 in all. + --- ## 5. Chat titles: twenty-three conditions (§4.6; D172–D175)