GENERATED VIEW · PRIVATE ARCHIVE · DO NOT SERVE
RobCo Industries · Archive Museum

FEEDBACK_ANIMATION_SLATE.md



RELEASE

planning/2.8.0/slates/FEEDBACK_ANIMATION_SLATE.md

sha256 6c1f010d43e7ce4d · 12029 bytes · original held in the private archive

# FEEDBACK ANIMATION SLATE — the reactive "juice" pass **Scope:** IDEATION ONLY (this doc). Owner direction: creative, in-theme **Fallout** feedback on real state changes — NOT core-style ring/pulse effects. Pip-Boy / terminal-native language: Vault-Boy cards, rubber stamps, needle kicks, geiger chatter, CRT glitches, holotape spools, ink & punch-card physicality. **Build constraints (locked for whichever items the owner picks):** - **Signals:** reuse the `RobcoEvents` bus (Protocol 22). Where an event doesn't exist yet, the build adds a **one-line additive `emit()` at the existing setter** (the U7/U8 precedent) + a Protocol 13 regression test — never a forked handler, never polling. - **Motion:** every effect is a plain `@keyframes` animation (add-class → reflow → remove, the SWEEP/`_coreOneShot` pattern) → auto-neutralized by the global `prefers-reduced-motion` block. One-shots must paint a correct final frame even when stilled. - **Zero campaign-state write.** Purely presentational; no `state.*`/`saveState()`/`robco_v8` touch. Transient DOM classes only. - **Game-agnostic (Protocol 38):** no game literals — copy/glyphs ride existing data (`collectibleLabel`, registry names, `GAME_DEFS` where flavor is needed). - **Mobile-safe:** effects play inside their own panel (no layout shift, no `position:fixed` popovers over the thumb zone), transform/opacity only (compositor-friendly), and never block input. - **Audio pairing:** where a synth channel already exists (LEVEL UP · QUEST CMPLT · QUEST FAIL · FACTION ALRT · GEIGER · HEARTBEAT · LIMB SFX · SERVO CLICK), the visual syncs to the existing call site — no new audio required. ## Signal inventory **Already on the bus:** `level.up` · `stat.change` (SPECIAL/HP/XP/RAD/skills, with key+old/new) · `hp.critical` · `faction.threshold` · `collectible.acquired` · `craft.completed` · `craft.scrapped` · `trade.bought` · `trade.sold` · `sleep.completed` · `data.write` (local-save / cloud-push / cloud-pull) · `runtime.state`. **New additive emits the picks below would add (one line each at the existing setter):** `quest.status` (cycleQuestStatus + the AI status-diff in autoImportState) · `item.added` (addItem / LOOT apply) · `item.equipped` (toggleEquipItem) · `limb.state` (toggleLimb) · `rad.tier` (updateMath threshold crossing — the `hp.critical` precedent) · `karma.tier` (updateKarmaUI) · `effect.applied` / `effect.expiring` (addStatusEffect / tick-down) · `location.visited` (recordLocationVisit, state.js) · `weight.seized` (updateMath class flip). ## THE MENU — event → Fallout-themed feedback **Tier S = flagship** (highest impact, unmistakably Fallout) · **A = strong** · **B = polish** · **C = optional**. ### Group 1 · VITALS & BODY (OPERATOR) | # | Event | Trigger signal | Where | The animation | Tier | |---|---|---|---|---|---| | 1 | HP goes critical | `hp.critical` (exists) | BUS-01 monitor + glass edge | **FLATLINE WARNING** — the HP beam trace thins and stutters like a failing EKG; a faint red vignette breathes at the glass edges in time with the existing HEARTBEAT channel | **S** | | 2 | HP damage taken | `stat.change` key=hp, newVal<old | BUS-01 monitor | **CRT FLINCH** — a single-frame horizontal tear/static slice rips across the monitor; the beam head sparks | A | | 3 | HP healed | `stat.change` key=hp, newVal>old | BUS-01 monitor | **STIM FLUSH** — the trace refills with a bright leading edge; a small medical `+` blinks twice beside CONDITION | B | | 4 | Rad tier crossed (up) | new `rad.tier` | RAD trace + whole glass | **GEIGER SPIKE** — the amber RAD beam chatters (needle jitter), a ☢ glyph stamps in amber and decays, and the glass gets ~1s of faint film grain synced to GEIGER ticks | **S** | | 5 | Rads flushed (down past tier) | new `rad.tier` (dir=down) | RAD trace | **RADAWAY DRAIN** — the amber bar drains with downward-bubbling dashes | B | | 6 | Limb crippled | new `limb.state` (crippled) | BUS-03 zone plate | **X-RAY FLASH** — the whole silhouette inverts to a 1-frame bone-white flash, then a fracture zigzag draws itself across the crippled zone (stroke-dashoffset), zone settles into the shipped red blink; syncs LIMB SFX | **S** | | 7 | Limb mended | new `limb.state` (ok) | BUS-03 zone plate | **SPLINT WRAP** — a crosshatch bandage sweep wipes across the zone as it returns to green | B | | 8 | Over-encumbered engaged | new `weight.seized` | BUS-10 weigh bridge | **BRIDGE CLANG** — the beam over-sags past its resting bend and rebounds once, 2px board shake, two dust-speck pixels puff off the supports (the shipped shudder then takes over) | B | ### Group 2 · PROGRESSION (OPERATOR) | # | Event | Trigger signal | Where | The animation | Tier | |---|---|---|---|---|---| | 9 | LEVEL UP | `level.up` (exists) | corner of the OPERATOR view (in-panel card) | **VAULT-BOY LEVEL CARD** — a Pip-Boy card slides up: CSS Vault-Boy thumbs-up silhouette, stencil "LEVEL 13", radial sunburst rays wiping clockwise behind him, synced to the existing level-up jingle; the XP bar does a full sweep-and-reset shimmer beneath. The flagship. | **S** | | 10 | XP gained | `stat.change` key=xp, up | XP trace/bar | **CHUNK FILL** — only the delta segment fills at 2× brightness then settles; a small `+150 XP` ticker floats up and fades | A | | 11 | SPECIAL changed | `stat.change` key=s_* | that stat's fader/gauge | **SERVO RECALIBRATE** — the channel overshoots past the new value and seats back (SEAT), the letter flashes stencil-bright once; SERVO CLICK pairs | A | | 12 | Skill book read / magazine consumed | existing toggles (renderSkillBooks/renderMagazines re-render) | the shelf/rack | **INK STAMP** — the ribbon/CONSUMED stamp *lands*: drops in at 1.4× scale, thunks to rest 4° rotated with two ink-splatter dots; the spine straightens onto the shelf | A | | 13 | Perk socketed | `addPerk` (render hook) | BUS-06 card rack | **CARD SEAT** — the new card drops from above, seats with a 1px bounce, its copper pins flash twice (contact spark) | B | ### Group 3 · FACTIONS & KARMA (OPERATOR) | # | Event | Trigger signal | Where | The animation | Tier | |---|---|---|---|---|---| | 14 | Faction threshold crossed | `faction.threshold` (exists) | BUS-08 reputation console | **REPUTATION STAMP** — a rubber stamp slams onto the console: red "VILIFIED" / green "ACCEPTED"-style word, rotated ~4°, ink splatter, then fades into the standing chip; the needle swings with overshoot; FACTION ALRT pairs | **S** | | 15 | Fame/infamy ±5 tapped | existing `adjustFaction` | the selected channel meter | **NEEDLE KICK** — pin springs past the new mark and settles (2-bounce) | B | | 16 | Karma tier changed | new `karma.tier` | BUS-09 gauge | **SCALES TIP** — needle double-bounce into the new zone; a tiny halo (good) or horns (evil) glyph blinks once beside the standing word | B | ### Group 4 · CARGO & ECONOMY (OPERATIONS) | # | Event | Trigger signal | Where | The animation | Tier | |---|---|---|---|---|---| | 17 | Caps change (buy/sell/AI) | `trade.bought`/`trade.sold` + `stat.change` key=caps | caps readback tile | **CAPS ODOMETER SPIN** — digits roll like reels to the new value; on a trade, one bottle-cap glyph arcs from the BUY/SELL row into the tile | A | | 18 | Item added (loot/manual) | new `item.added` | CARGO MANIFEST | **MANIFEST PUNCH** — the new freight-tag row slides in and a hole-punch pops its eyelet (the dot blinks out); the drawer's count badge blips +1 | A | | 19 | Equip toggled | new `item.equipped` | the item's row | **IN-SERVICE STAMP** — the amber stamp slaps on with skew-settle; SERVO CLICK pairs | B | | 20 | Craft completed | `craft.completed` (exists) | BUS-12 bench | **WELD SPARKS + TAG** — 3–4 spark pixels at the bench head, then the output name prints typewriter-style onto a claim tag that tears off (clip-path rip) | A | | 21 | Item scrapped | `craft.scrapped` (exists) | BREAKDOWN VISE | **PART DROP** — the item silhouette splits into 2–3 part glyphs that drop into the yield rows with a settle bounce | B | | 22 | Collectible acquired | `collectible.acquired` (exists) | CURIO ARCHIVE | **EXHIBIT LIGHT-UP** — the case spotlight flickers on over that object (dark → lit like a tungsten warm-up); the snow globe swirls its snow once / the bobblehead does one exaggerated first bobble; the brass plaque etches in left-to-right | **S** | ### Group 5 · RECORDS, DIRECTIVES & MAP (DATABANK) | # | Event | Trigger signal | Where | The animation | Tier | |---|---|---|---|---|---| | 23 | Quest completed | new `quest.status` (→complete) | BUS-17 slot | **CASE-CLOSED STAMP** — a green double-ring "COMPLETE" stamp punches the slot; the slot lamp goes steady and the row settles dimmer; QUEST CMPLT jingle pairs | **S** | | 24 | Quest failed | new `quest.status` (→failed) | BUS-17 slot | **FILAMENT DIE** — red "FAILED" stamp + the slot's lamp flickers out like a dying bulb; QUEST FAIL pairs | A | | 25 | Quest filed | existing `addQuest` (render hook) | BUS-17 | **DIRECTIVE FILED** — slot slides in, its lamp warms from dark to amber | B | | 26 | Location discovered | new `location.visited` | BUS-16 cartography table | **SURVEY PING** — a radar ping ring expands from the new node as it lights; its label types on; the route line draws itself from the previous node (stroke-dashoffset). The map showpiece. | **S** | | 27 | Arrival (current changed) | existing `onLocationChange` path | BUS-16 | **TRIANGULATE** — two sweep lines converge on the new fix, the [YOU] reticle double-blinks and hops | B | | 28 | Status effect applied | new `effect.applied` | BUS-07 lamp bank | **TUNGSTEN WARM-UP** — the new lamp tile glows in from dark filament to full; debuffs flicker unstable as they arrive | B | | 29 | Effect expiring (≤2 ticks) | new `effect.expiring` | its lamp tile | **GUTTERING LAMP** — slow distress flicker until it expires | B | | 30 | Sleep completed | `sleep.completed` (exists) | chrono board + glass | **CLOCK SPIN-DOZE** — the scanline collapses to a thin bright line (micro power-nap), clock drums spin fast, then re-wake bloom | A | ### Group 6 · SYSTEM & SAVES (CHASSIS / SETTINGS) | # | Event | Trigger signal | Where | The animation | Tier | |---|---|---|---|---|---| | 31 | Save written / cloud push/pull | `data.write` (exists, kind payload) | SAVE ARCHIVE panel | **HOLOTAPE COMMIT** — a small holotape glyph slides into a slot, reels spin ~1s, WRITTEN lamp blips green; cloud kinds add a carrier ripple on the strip | A | | 32 | Fault recorded | `_recordError` hook | casing FAULT lamp + BUS-24 | annunciator counter flips with a flicker (mostly shipped — polish only) | C | | 33 | Qty stepped / small edits | `adjItemQty` etc. | the row | digit flip on the qty counter | C | ## Top recommendations (the build-first set) The **eight Tier-S flagships** cover every subsystem with one signature moment each and reuse five existing bus events (only `rad.tier`, `limb.state`, `quest.status`, `location.visited` are new one-line emits): 1. **VAULT-BOY LEVEL CARD** (#9) — the single most Fallout moment available; syncs to the existing jingle. 2. **REPUTATION STAMP** (#14) — ink-stamp physicality, pairs with the existing faction alert. 3. **CASE-CLOSED STAMP** (#23) + **FILAMENT DIE** (#24) — makes the new status-cycle key feel mechanical. 4. **SURVEY PING + route self-draw** (#26) — turns every discovery into a map event. 5. **GEIGER SPIKE** (#4) — the most iconic Fallout *texture* (grain + chatter), cheap to build. 6. **X-RAY FLASH** (#6) — makes cripples legible instantly. 7. **EXHIBIT LIGHT-UP** (#22) — rewards collecting; builds on the shipped themed objects. 8. **FLATLINE WARNING** (#1) — upgrades the existing hp.critical flash into a scene. Suggested second wave (Tier A, mostly existing signals): CAPS ODOMETER SPIN, MANIFEST PUNCH, SERVO RECALIBRATE, CHUNK FILL, WELD SPARKS + TAG, HOLOTAPE COMMIT, CRT FLINCH, INK STAMP, CLOCK SPIN-DOZE.
STAMP · generated for RELEASE v2.8.5 commit 06e5180 (06e51801b38a) · archive input-tree hash c07fbfbdd2e1ddeb · 754 files · no wall-clock timestamp (regenerates identically when nothing changed).