[orchestrator] MODELBEAST first drop: 10 machines + contracts v8 + round 6 orders
ASSETS: 10 GLBs generated end-to-end on the local farm (flux_local concept -> sf3d image-to-GLB on the m3ultra, ~2min/asset, zero cloud spend) and installed into public/assets/models/: mosh-reactor, quantizer, seam-extractor, muxer, archaeology-lab, software-decoder, decode-asic, mosquito-trap, chroma-keyer, artifact-bottler. Hot-swap verified in showroom + demo world. Known gap, ordered: GLBs carry no emissive accent so they read dark at game zoom - RENDER round 6. Contracts v8: WildlifeState/'wildlife' event gain 'parity-mite'; new 'repaired' SimEvent (a mite corrected your work); speaker adapter gains listStations() passthrough (MHz) for dial tick marks. ui/voice.ts widened for the new kind (placeholder copy; UI owns the real lines). Round 6 orders in all lane docs - THE CORRECTION walks: parity mites (SIM), GLB legibility pass (RENDER), mite surfacing + dial ticks + credits (UI), repair stamps + sterile creep on the sky (SCREEN), firewall machine + numbers decoy drift fix + accents for the GLB'd ten (DATA). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
f75cf872bc
commit
d313f2a163
@ -25,52 +25,24 @@ REQUESTs.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CURRENT ORDERS — ROUND 5 (MEGA) — supersedes the earlier round-5 text
|
## CURRENT ORDERS — Round 6 (goal: The Correction gets teeth, the map stops drifting)
|
||||||
|
|
||||||
Review verdict you're executing: the onboarding cliff. The fax IS the tutorial —
|
1. **FIREWALL machine** + catch recipe on SIM's trap pattern (they detect by recipe
|
||||||
you write the ladder. Plus the radio's entire broadcast schedule and the ground
|
shape); `parity-mite` canned item; mite spawn tuning if SIM makes it data-driven;
|
||||||
truth for the floor.
|
commissions that want canned mites ("ONE (1) UNIT OF THE CORRECTION, ALIVE.
|
||||||
|
INVOICE ATTACHED. DO NOT READ THE INVOICE.").
|
||||||
|
2. **Numbers-station drift fix** (SCREEN's round-5 finding): two decoys decode onto
|
||||||
|
real visible seams (08127 → reel-beds-deep, 27503 → broadcast-shelf-south);
|
||||||
|
your validator recomputes plants but not decoys — re-cut the decoys and extend
|
||||||
|
the validator so a decoy landing on ANY seam fails by name.
|
||||||
|
3. **Accent fills for the GLB'd 10**: the ten machines with real models now get
|
||||||
|
`accent` values chosen against their actual textures (RENDER's overlay reads it).
|
||||||
|
4. **THE STANDARD mite lines** (~8 new, coordinate with SCREEN), CANON-DELTA the
|
||||||
|
mite reading of §5.
|
||||||
|
|
||||||
### PART A — carried from round 5
|
**DoD:** firewall catches against SIM's real mechanic; no decoy decodes onto any
|
||||||
1. **Constants**: import from `src/sim/constants.ts`, retire hand-copies.
|
seam (validator-enforced); all 10 GLB machines accented; the fax celebrates its
|
||||||
2. **Wildlife data**: MOSQUITO TRAP machine (§5: bug-zapper shaped like a
|
first canned mite in voice.
|
||||||
high-contrast edge target) + catch recipe (canned `mosquito-swarm`), pile/hatch
|
|
||||||
tuning if SIM makes it data-driven, `vaporwave-sunset` unblocked, FORWARD_CANON
|
|
||||||
pruned, fax celebrates in voice.
|
|
||||||
3. **Cooler numbers final** under the additive ruling; duty table in CANON-DELTA.
|
|
||||||
|
|
||||||
### PART B — the ladder, the ground, the broadcast schedule (new)
|
|
||||||
4. **THE COMMISSION LADDER — the game's real tutorial.** Rewrite the opening queue
|
|
||||||
as an escalating teaching ladder, one mechanic per rung, all in voice:
|
|
||||||
- Rung 1: ~20 MDAT-ORE, raw ("Do not wash it. Do not ask why.") — teaches
|
|
||||||
extractor→belt→uplink. MUST be completable inside 3 minutes with 4 machine
|
|
||||||
types; prove it with a sim probe test like your tick-0 melt guard.
|
|
||||||
- Rung 2: LUMA BARS (teaches demuxer + byproduct pain — the slurry has to go
|
|
||||||
somewhere and the fax does not care).
|
|
||||||
- Rung 3: HF DUST (teaches the quantizer + that waste is product — DUST
|
|
||||||
ALLOWANCE fits here).
|
|
||||||
- Rung 4: one MELT, fresh (first-taste, reward bumped — it's a graduation now).
|
|
||||||
- Thereafter: your existing escalation. Ladder intent documented in CANON-DELTA.
|
|
||||||
5. **`data/seams.json` FINAL** (SIM consumes this round): seam regions per stratum
|
|
||||||
era with richness; the reference factory's ground coordinated with SIM; include
|
|
||||||
2-3 `hidden: true` bonus seams — the numbers station reads their coordinates.
|
|
||||||
6. **`data/stations.json`**: the broadcast schedule — station ids, band, frequency,
|
|
||||||
name, format tag, flavor line, and the copy pools: THE STANDARD's propaganda
|
|
||||||
chyron lines (polite, clean, horrifying — this is The Correction with a
|
|
||||||
transmitter; 20+ lines so it doesn't loop fast), NUMBERS digit-group config
|
|
||||||
(incl. the hidden-seam pointers), DEAD AIR's one ghost line. Schema agreed with
|
|
||||||
SCREEN in NOTES.
|
|
||||||
7. **Relic canon**: CANON-DELTA the optical-fossil mechanics reading (§1 fossils
|
|
||||||
"sing when excavated" → the severed audio bus) + one mid-ladder fax margin that
|
|
||||||
*hints* without pointing ("someone has drawn a sine wave in the corner of this
|
|
||||||
fax. it is not our department.").
|
|
||||||
8. **Validator**: seams/stations schemas, ladder invariants (rung-1 buildability at
|
|
||||||
tick 0), relic never on a seam (cross-check vs SIM's placement rule).
|
|
||||||
|
|
||||||
**Definition of done:** cold-start rung 1 provably completable fast; every station
|
|
||||||
has enough copy to broadcast for 10 minutes without repeating; seams validated
|
|
||||||
against both SIM's consumption and RENDER's rendering; CANON-DELTA tells the whole
|
|
||||||
story of the round.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -25,45 +25,28 @@ you never simulate. If motion looks wrong, interpolate better or note it — don
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CURRENT ORDERS — ROUND 5 (MEGA) — supersedes the earlier round-5 text
|
## CURRENT ORDERS — Round 6 (goal: the GLB era looks as good as it is)
|
||||||
|
|
||||||
The review verdict driving this round: *the game about place has no place.* You own
|
MODELBEAST delivered: 10 real GLBs now live in `public/assets/models/` (mosh-reactor,
|
||||||
fixing that. Everything from the previous round-5 orders is carried, plus the floor,
|
quantizer, seam-extractor, muxer, archaeology-lab, software-decoder, decode-asic,
|
||||||
the juice, and one secret you must draw without signposting.
|
mosquito-trap, chroma-keyer, artifact-bottler). Hot-swap + normalization worked
|
||||||
|
first try. One problem, and it's yours: **at game zoom they read dark** — baked
|
||||||
|
textures carry no emissive, so the two-material rule dies on real assets.
|
||||||
|
|
||||||
### PART A — carried from round 5
|
1. **GLB legibility pass, the round's centerpiece**: give hot-swapped GLBs the
|
||||||
1. **Inspect mode**: highlight the inspected entity via `{mode:'inspect'}`; cooler
|
accent treatment placeholders get — your existing accent derivation drives a
|
||||||
aura rectangle on inspect (the placed-and-selected case).
|
small emissive element (glow sprite / rim boost / brightest-texel emissive lift;
|
||||||
2. **Wildlife visuals**: piles = §2 glitter heaps growing with `size`; swarms =
|
your call, note it) + an overall brightness floor so a dark chassis never reads
|
||||||
pixel-gnat clouds clustering on `target` (harassed machines flicker); trap zap
|
as a hole. Verify all 10 in showroom AND in the demo world at default zoom;
|
||||||
read from wildlife-state deltas.
|
screenshot before/after in NOTES.
|
||||||
3. **Fixture hygiene**: commissionQueue/research/wildlife/relics in fabricated snapshots.
|
2. **Mite visuals** (SIM lands `'parity-mite'` wildlife): hospital-white beetles,
|
||||||
|
green checkmark eye (§5), unsettling gentleness; a caught mite in a firewall
|
||||||
|
reads as filed paperwork. The 'repaired' event gets a small, infuriatingly tidy
|
||||||
|
sparkle where your product used to be.
|
||||||
|
3. **Excavation VFX** on `relicFound` (carried from your round-5 NEXT).
|
||||||
|
|
||||||
### PART B — the floor, the juice, the secret (new)
|
**DoD:** all 10 GLBs legible at default zoom (before/after proof); mites read as
|
||||||
4. **THE FLOOR.** Kill the void: seam regions from `data/seams.json` render as
|
The Correction at a glance; perf rule holds.
|
||||||
subtle glinting mineral patches (the player should *discover* that extractors
|
|
||||||
want them — the glint is the tell); large-scale ground-tone variation (fbm
|
|
||||||
patches, barely-there) so the plane reads as terrain; era hinting toward the
|
|
||||||
world edges per §1 strata (sepia/phosphor whispers at the rim). Restraint rule:
|
|
||||||
the floor must never compete with belts/machines — it's a stage, not a set.
|
|
||||||
5. **THE RELIC SHIMMER.** `snapshot.relics` unfound → a faint animated static-patch
|
|
||||||
decal at its pos: visible to a player actually looking, invisible to one who
|
|
||||||
isn't. NO signpost, NO minimap ping, NO tutorial arrow — this is a Mario hidden
|
|
||||||
pipe; its discoverability budget is 'wandering + curiosity'. Found → the patch
|
|
||||||
becomes a small excavated monument (fossil on a plinth, §1: it *sings*).
|
|
||||||
6. **JUICE**: placement thunk (scale-pop + dust puff), demolition burst, shipment
|
|
||||||
flash at the uplink (read shippedTotal deltas from the snapshot). Cheap,
|
|
||||||
instanced, everywhere.
|
|
||||||
7. **THE BREAK ROOM.** A decorative arcade cabinet prop near the start zone, marquee
|
|
||||||
glowing 'GLYTCH', render-owned raycast: click → `window.open('./match.html')`.
|
|
||||||
The two games finally meet. Coordinate the cursor affordance with UI.
|
|
||||||
8. **CAMERA + CLICKS (review findings)**: default framing centers the start zone
|
|
||||||
clear of the build bar (my first machines spawned half-behind it and were
|
|
||||||
unclickable); investigate entity picking near UI chrome and report what you find.
|
|
||||||
|
|
||||||
**Definition of done:** before/after screenshots of the floor; relic shimmer shown
|
|
||||||
at two zoom levels (proving subtle-but-findable); cabinet opens match.html; thunk
|
|
||||||
felt; perf rule holds with floor + 50 piles + 10 swarms.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -27,59 +27,24 @@ seed stock — port, don't move).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CURRENT ORDERS — ROUND 5 (MEGA) — supersedes the earlier round-5 text
|
## CURRENT ORDERS — Round 6 (goal: the sky notices the enemy)
|
||||||
|
|
||||||
You are now two organs: THE SCREEN (sky) and **THE SPEAKER** (`src/audio/**` is
|
Your chyron now wraps (orchestrator fix — 29/30 STANDARD lines were clipping at ~51
|
||||||
yours — replace the orchestrator stub; contracts v6 `AudioFX` is wired in main.ts
|
chars since round 5; two-line wrap verified live).
|
||||||
with a first-gesture `unlock()`). House law: **every sound is synthesized with Web
|
|
||||||
Audio. No asset files, ever.** A game about broken media makes its own noise.
|
|
||||||
|
|
||||||
### PART A — carried from round 5 (THE SCREEN)
|
1. **`repaired` events on the sky** (SIM lands them): each repair eases total
|
||||||
1. **Era base feed**: the clean programming ages with the highest ratified era
|
corruption by its item's contribution AND stamps a small, perfect, green-tick
|
||||||
(sepia/gate-weave reel → phosphor/interlace broadcast → rainbow-on-black disc →
|
placard — The Correction signs its work. Boredom and repairs must stay
|
||||||
current SMPTE stream → blinding fortress). Corruption stays era-agnostic; the
|
distinguishable (rot vs theft).
|
||||||
SUBSTRATE ages. Sterile guarantee holds per era (test one).
|
2. **Mite shimmer**: reuse the growth-mask for a faint hospital-white sterile patch
|
||||||
2. **Jammed-rot**: jammed entities accelerate boredom decay; clean idle stays gentle.
|
creeping around heavy mite activity — the inverse of corruption, and it should
|
||||||
3. **Wildlife shimmer**: swarms drive regional mosquito-noise via the growth-mask
|
feel WORSE.
|
||||||
template, seeded from the swarm pos.
|
3. **THE STANDARD, new pool**: coordinate with DATA — the propaganda acknowledges
|
||||||
4. **Title card**: WIMVEE FKTRY burn-in ~2s on boot (the game never says its own
|
the mites now ("Units are assisting you." / "Inventory discrepancies are being
|
||||||
name — fix that), then NOTHING IS WRONG. First-ever shipment's awakening upgrades
|
resolved in your favor."). Chyron-only, mumble untouched (standing constraint).
|
||||||
from 1 frame to a ~0.5s full-canvas moment.
|
|
||||||
|
|
||||||
### PART B — THE SPEAKER (new, the big build)
|
**DoD:** a mite wave is visible on the sky as creeping cleanliness + tick stamps;
|
||||||
5. **Layer 1 — diegetic minimum (always on, pre-discovery)**: placement thunk (low
|
pixel-verified; budget holds.
|
||||||
sine + noise burst), fax dot-matrix chatter, brownout pop-crackle + power-down
|
|
||||||
whine (the codex's catastrophic underrun sound — finally), scram klaxon,
|
|
||||||
ratification sting (a clean consonant triad — The Correction resolves; you don't).
|
|
||||||
NOTHING else before discovery: the silence is the tease.
|
|
||||||
6. **Layer 2 — THE BAND (unlocks on relicFound)**: a tuner. Frequency sweep with
|
|
||||||
band-appropriate inter-station noise (AM = brown crackle, FM = white hiss, SW =
|
|
||||||
warble + heterodyne whistles near carriers); station lock via gaussian around
|
|
||||||
each station's freq. Stations from `data/stations.json` (DATA authors; schema
|
|
||||||
yours to agree in NOTES):
|
|
||||||
- **88.1 FKTRY FM** — generative music: seeded 16-step sequencer, square+triangle
|
|
||||||
voices, pentatonic minor ~92bpm, pattern mutates every 32 bars, flavored by the
|
|
||||||
current era (reel era gets wow/flutter + crackle).
|
|
||||||
- **AM 640 THE STANDARD** — Correction propaganda: ring-mod mumble cadence, and
|
|
||||||
the flagship trick: **THE SCREEN's chyron subtitles the radio** when tuned
|
|
||||||
(DATA writes the lines). The sky captions the audio. Do this one properly.
|
|
||||||
- **SW 6955 NUMBERS** — cold formant-synth digit groups; chyron shows the digits;
|
|
||||||
some groups encode coordinates of DATA's `hidden: true` bonus seams — the radio
|
|
||||||
is a treasure map for players with a pencil.
|
|
||||||
- **108.0 DEAD AIR** — room tone, breathing, one reversed-chime ghost per ~10min,
|
|
||||||
seeded.
|
|
||||||
7. **Layer 3 — world ambience (post-discovery)**: factory hum scaled by draw/gen,
|
|
||||||
tape-chunk per shipment stamp, heat adds a strained whine near scram. Subtle;
|
|
||||||
ducked under the radio.
|
|
||||||
8. **The control surface**: export a narrow `radio` API (setFrequency/setBand/
|
|
||||||
volume/mute/getState/subscribe) — UI's tuner dock drives it (sanctioned import,
|
|
||||||
document it). Master chain: gain → soft limiter; zero per-frame allocations.
|
|
||||||
|
|
||||||
**Definition of done:** spectral verification (AnalyserNode: station lock vs static
|
|
||||||
show distinct spectra; brownout pop is a real transient); pre-discovery silence
|
|
||||||
guarantee tested; subtitles verified on the chyron; era feed contact sheet; CPU
|
|
||||||
budget stated. This round, verification includes LISTENING — describe what it
|
|
||||||
sounds like in NOTES, in words.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -21,45 +21,28 @@ playable through unit tests. You are the lane the other four trust with their li
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CURRENT ORDERS — ROUND 5 (MEGA) — supersedes the earlier round-5 text
|
## CURRENT ORDERS — Round 6 (goal: M3's enemy — THE CORRECTION walks)
|
||||||
|
|
||||||
This is the big one: everything from the previous round-5 orders PLUS the world's
|
Round 5 (MEGA) shipped complete: wildlife, seams, relic, research time — reviewed and
|
||||||
first secret. Read it all before starting; the parts interlock.
|
live. The tuner dead-dial and chyron clipping were fixed orchestrator-side; seams are
|
||||||
|
wired into GameData (your CONTRACT REQUEST, granted in v7).
|
||||||
|
|
||||||
### PART A — carried from round 5 (unchanged in spirit)
|
1. **PARITY MITES v1** (codex §5: hospital-white beetle drones that quietly *repair*
|
||||||
1. **`grantResearch` command** — idempotent, save/load safe. Tell me in NOTES when it
|
your product). Contracts v8 widens `WildlifeState.kind` with `'parity-mite'` —
|
||||||
lands; main.ts's `__fktryDemo` swaps off testkit.
|
they ride the wildlife array. Behaviour: spawn from the world rim when
|
||||||
2. **Research time** — `RESEARCH_TICKS_PER_PACK` (export it); a tech is an
|
`shippedTotal` corruption crosses thresholds (escalate with progress); seek belts
|
||||||
investment, not a purchase. Fractional vs stepped progress: your call, note it.
|
carrying tier-2 glitch products; on reaching one, EAT the item and emit a new
|
||||||
3. **Wildlife v1** (contracts v5 shapes): dust piles accumulate near running
|
`{kind:'repaired'; item; pos; tick}` event (v8) — the work is not destroyed, it is
|
||||||
hf-dust-emitting machines (seeded RNG finally rolls); size 1.0 hatches a MOSQUITO
|
*corrected*, which is worse. Deterministic, save/load carried, capped like swarms.
|
||||||
SWARM that drifts to the nearest running machine and degrades its speed while
|
2. **The counter**: DATA authors a FIREWALL machine on your trap pattern (recipe-shape
|
||||||
attached (`target`); cleared by DATA's trap machine (suggested shape: trap crafts
|
detection, radius) — a mite in range is caught and canned (`parity-mite` item,
|
||||||
its empty-input catch recipe only while a swarm is in radius, producing the canned
|
forward-canon in data). Coordinate via NOTES.
|
||||||
`mosquito-swarm` item). Deterministic; save/load carries it; spawn/clear events.
|
3. **Reference factory v6**: survives a mite wave without losing its melt regression
|
||||||
Include the design-point test: a factory that sinks its dust never hatches.
|
(a firewall on the uplink approach is the natural layout teach).
|
||||||
|
|
||||||
### PART B — the ground and the pipe (new)
|
**DoD:** mite lifecycle tested (spawn → seek → repair → event; firewall catch);
|
||||||
4. **SEAMS BECOME REAL.** Consume `data/seams.json` (DATA authors this round —
|
zero-brownout regression intact; mites never touch tier-0/1 cargo (they correct
|
||||||
coordinate the schema in NOTES early): extractors only extract while their
|
CORRUPTION, not raw material — that's the fiction and the balance).
|
||||||
footprint overlaps a seam region; off-seam extractors idle with a new jam reason
|
|
||||||
`'no seam'` (edge-triggered like the others; UI will voice it). Reference factory
|
|
||||||
v5 must sit on seams — coordinate layout coordinates with DATA.
|
|
||||||
5. **THE RELIC (the hidden pipe).** One `optical-fossil` per world (contracts v6:
|
|
||||||
`RelicState`, `excavate`, `relicFound`): position derived from the seed —
|
|
||||||
deterministic, 18-28 tiles from origin in a quiet corner, never on a seam, never
|
|
||||||
under the reference factory. `excavate` within 1 tile of the unfound relic flips
|
|
||||||
`found`, emits `relicFound`, persists through save/load forever. `relics` always
|
|
||||||
present in the snapshot (found or not — RENDER draws the shimmer, UI must not be
|
|
||||||
able to cheat-detect it any other way). No bandwidth cost, no research gate: the
|
|
||||||
only lock is *finding it*.
|
|
||||||
6. **Reference factory v5**: research rig (bottler + archaeology lab off quantizer
|
|
||||||
surplus) so research runs in-demo; sits on seams per #4; one swarm hatches and is
|
|
||||||
trapped within the 20k window if DATA's trap lands. Zero-brownout regression stays.
|
|
||||||
|
|
||||||
**Definition of done:** relic lifecycle tested (excavate too far = dropped; found
|
|
||||||
persists through save→load→20k ticks); off-seam extractor refuses with 'no seam';
|
|
||||||
wildlife full lifecycle; research takes time; reference v5 green and on-seam.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -24,46 +24,23 @@ dispatch Commands via the bus and read state from `update(snap, events)`.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CURRENT ORDERS — ROUND 5 (MEGA) — supersedes the earlier round-5 text
|
## CURRENT ORDERS — Round 6 (goal: the enemy has a face, the dial has teeth)
|
||||||
|
|
||||||
Review verdicts you're executing: first-click punishment without guidance, camera
|
Your tuner dock now drives the real engine (orchestrator adapter — the dead-dial
|
||||||
controls taught nowhere, THE SCREEN's payoff too quiet, and one suspect tab click.
|
finding from the voice review is fixed and live-verified, station names and all).
|
||||||
Plus the radio — the game's sound is a *discovery*, and you build its face.
|
|
||||||
|
|
||||||
### PART A — carried from round 5
|
1. **Mite surfacing**: toasts in voice ("A PARITY MITE IS EDITING YOUR MELT.",
|
||||||
1. **Scrolling tab strip** (your design, approved).
|
"IT LEFT A RECEIPT."), `repaired` events in the ticker, firewall inspector shows
|
||||||
2. **Publish inspect mode**: inspector open → `setSelection({mode:'inspect',
|
catches. The Correction is polite; the copy should make players furious.
|
||||||
entity})`; clear on close; Esc order preserved (drop tool → close inspector).
|
2. **Tuner tick marks**: the adapter now passes `listStations()` through — draw
|
||||||
3. **Wildlife surfacing**: infestation toasts in voice; MOSQUITO EXPOSURE line +
|
station ticks on the dial band so hunting has landmarks (keep the hunt: ticks
|
||||||
speed penalty in the inspector; one hatch-warning toast per pile, not a nag.
|
mark THAT something is there, not WHAT).
|
||||||
4. **Migrate research tests** to `grantResearch`; **verify RENDER's demolition tint
|
3. **Credits line** (from the voice-cloning plan, cheap now): an ABOUT/credits
|
||||||
+ inspect highlight with screenshots** (third round owed — close it).
|
entry reachable from the tech panel footer — repo, codex, and the standing
|
||||||
|
disclosure slot for future synthetic-voice credit.
|
||||||
|
|
||||||
### PART B — onboarding + the radio face (new)
|
**DoD:** a mite raid is narratable from UI alone; ticks render from real station
|
||||||
5. **First-brownout mercy toast** (once per session): "NOTHING IS GENERATING. THE
|
data; credits reachable in-game.
|
||||||
COMMITTEE SUGGESTS: POWER." — fires on the first brownout event only. The alarm
|
|
||||||
currently teaches nothing; this is the one hint the opening needs.
|
|
||||||
6. **Camera hint** in the idle line ("MMB/WASD PAN · WHEEL ZOOM") and a **tab
|
|
||||||
hitbox check**: in review, a direct click on the POWER tab did nothing once
|
|
||||||
(keyboard paging worked; may be harness — reproduce with a real mouse, fix or
|
|
||||||
file it as harness with evidence).
|
|
||||||
7. **New jam voice**: `'no seam'` lands from SIM — give it the line it deserves
|
|
||||||
("SEAM EXTRACTOR: THERE IS NOTHING DOWN THERE. MOVE.").
|
|
||||||
8. **THE SCREEN click-to-enlarge**: click toggles a centered ~2.5× overlay (CSS
|
|
||||||
transform + backdrop dim), Esc/click closes. The sky is the score; let people
|
|
||||||
look at it.
|
|
||||||
9. **THE TUNER DOCK (the radio's face).** Hidden until `relicFound`/`relics.found`.
|
|
||||||
Then: a dock slides in (bottom-right) — frequency dial (drag + arrow keys), band
|
|
||||||
AM/FM/SW, volume + mute, station readout in voice ("88.1 FKTRY FM — SIGNAL
|
|
||||||
LOCKED"). Controls talk to THE SPEAKER via its exported `radio` control (narrow
|
|
||||||
sanctioned import from `src/audio` — SCREEN documents the API; coordinate in
|
|
||||||
NOTES). Discovery ceremony: relicFound → "AUDIO BUS RESTORED. THE BITSTREAM HAS
|
|
||||||
A VOICE." toast + dock slide-in. Radio state persists per session only (the
|
|
||||||
fossil's `found` is the durable part, sim-side).
|
|
||||||
|
|
||||||
**Definition of done:** cold-start first-brownout shows the mercy toast; tuner dock
|
|
||||||
appears only after excavation and drives the real audio engine; enlarge verified;
|
|
||||||
tint/highlight screenshots in NOTES; tab click adjudicated.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
BIN
fktry/public/assets/models/archaeology-lab.glb
Normal file
BIN
fktry/public/assets/models/archaeology-lab.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/artifact-bottler.glb
Normal file
BIN
fktry/public/assets/models/artifact-bottler.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/chroma-keyer.glb
Normal file
BIN
fktry/public/assets/models/chroma-keyer.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/decode-asic.glb
Normal file
BIN
fktry/public/assets/models/decode-asic.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/mosh-reactor.glb
Normal file
BIN
fktry/public/assets/models/mosh-reactor.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/mosquito-trap.glb
Normal file
BIN
fktry/public/assets/models/mosquito-trap.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/muxer.glb
Normal file
BIN
fktry/public/assets/models/muxer.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/quantizer.glb
Normal file
BIN
fktry/public/assets/models/quantizer.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/seam-extractor.glb
Normal file
BIN
fktry/public/assets/models/seam-extractor.glb
Normal file
Binary file not shown.
BIN
fktry/public/assets/models/software-decoder.glb
Normal file
BIN
fktry/public/assets/models/software-decoder.glb
Normal file
Binary file not shown.
@ -160,7 +160,7 @@ export interface RelicState {
|
|||||||
|
|
||||||
export interface WildlifeState {
|
export interface WildlifeState {
|
||||||
id: number;
|
id: number;
|
||||||
kind: 'dust-pile' | 'mosquito-swarm';
|
kind: 'dust-pile' | 'mosquito-swarm' | 'parity-mite'; // v8: The Correction walks
|
||||||
pos: Vec2;
|
pos: Vec2;
|
||||||
size: number; // pile: accumulation 0..1; swarm: severity 0..1
|
size: number; // pile: accumulation 0..1; swarm: severity 0..1
|
||||||
target?: number; // swarm: entity id it is currently degrading
|
target?: number; // swarm: entity id it is currently degrading
|
||||||
@ -197,9 +197,10 @@ export type SimEvent =
|
|||||||
| { kind: 'commissionDone'; commission: string; tick: number }
|
| { kind: 'commissionDone'; commission: string; tick: number }
|
||||||
| { kind: 'scram'; entity: number; on: boolean; tick: number } // v2: heat shutdown edge
|
| { kind: 'scram'; entity: number; on: boolean; tick: number } // v2: heat shutdown edge
|
||||||
| { kind: 'researched'; tech: string; tick: number } // v4: research complete
|
| { kind: 'researched'; tech: string; tick: number } // v4: research complete
|
||||||
| { kind: 'wildlife'; on: 'spawned' | 'cleared'; wildlife: 'dust-pile' | 'mosquito-swarm';
|
| { kind: 'wildlife'; on: 'spawned' | 'cleared'; wildlife: 'dust-pile' | 'mosquito-swarm' | 'parity-mite';
|
||||||
id: number; pos: Vec2; tick: number } // v5: hazard lifecycle
|
id: number; pos: Vec2; tick: number } // v5: hazard lifecycle
|
||||||
| { kind: 'relicFound'; relic: 'optical-fossil'; id: number; tick: number }; // v6
|
| { kind: 'relicFound'; relic: 'optical-fossil'; id: number; tick: number } // v6
|
||||||
|
| { kind: 'repaired'; item: string; pos: Vec2; tick: number }; // v8: a mite corrected your work
|
||||||
|
|
||||||
// ---------------------------------------------------------------- module interfaces
|
// ---------------------------------------------------------------- module interfaces
|
||||||
|
|
||||||
|
|||||||
@ -83,6 +83,12 @@ function createSpeakerAdapter() {
|
|||||||
cb(control.getState());
|
cb(control.getState());
|
||||||
return () => subs.delete(cb);
|
return () => subs.delete(cb);
|
||||||
},
|
},
|
||||||
|
/** v8: station tick marks for the dial — engine truth, MHz units, empty pre-gesture */
|
||||||
|
listStations() {
|
||||||
|
return engine
|
||||||
|
? engine.listStations().map((st) => ({ ...st, freqMHz: toMHz(st.band, st.freq) }))
|
||||||
|
: [];
|
||||||
|
},
|
||||||
};
|
};
|
||||||
function notifyLocal() { for (const cb of subs) cb({ ...local }); }
|
function notifyLocal() { for (const cb of subs) cb({ ...local }); }
|
||||||
|
|
||||||
|
|||||||
@ -98,7 +98,7 @@ export function eventToast(ev: SimEvent, machineName: (id: number) => string): s
|
|||||||
* per pile — see the notices logic there); a swarm spawning is the bite already landing.
|
* per pile — see the notices logic there); a swarm spawning is the bite already landing.
|
||||||
*/
|
*/
|
||||||
export function wildlifeToast(
|
export function wildlifeToast(
|
||||||
kind: 'dust-pile' | 'mosquito-swarm',
|
kind: 'dust-pile' | 'mosquito-swarm' | 'parity-mite',
|
||||||
on: 'spawned' | 'cleared',
|
on: 'spawned' | 'cleared',
|
||||||
): string | null {
|
): string | null {
|
||||||
if (kind === 'dust-pile') {
|
if (kind === 'dust-pile') {
|
||||||
@ -106,6 +106,12 @@ export function wildlifeToast(
|
|||||||
? 'HF DUST IS POOLING. SOMETHING WILL HATCH IN IT.'
|
? 'HF DUST IS POOLING. SOMETHING WILL HATCH IN IT.'
|
||||||
: null; // clearing a pile is housekeeping, not news
|
: null; // clearing a pile is housekeeping, not news
|
||||||
}
|
}
|
||||||
|
if (kind === 'parity-mite') {
|
||||||
|
// v8 placeholder copy — LANE-UI owns the real lines in round 6
|
||||||
|
return on === 'spawned'
|
||||||
|
? 'A PARITY MITE HAS ARRIVED. IT IS HERE TO HELP.'
|
||||||
|
: 'MITE CONTAINED. FILE ITS RECEIPT.';
|
||||||
|
}
|
||||||
// mosquito-swarm
|
// mosquito-swarm
|
||||||
return on === 'spawned'
|
return on === 'spawned'
|
||||||
? 'MOSQUITO SWARM. QUANTIZATION NOISE HAS LEGS NOW.'
|
? 'MOSQUITO SWARM. QUANTIZATION NOISE HAS LEGS NOW.'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user