Skip to content

Comic-tabloid re-theme (all 7 screens) + Burn'em leader swap#13

Merged
emp3thy merged 43 commits into
mainfrom
feat/portrait-system
Jul 19, 2026
Merged

Comic-tabloid re-theme (all 7 screens) + Burn'em leader swap#13
emp3thy merged 43 commits into
mainfrom
feat/portrait-system

Conversation

@emp3thy

@emp3thy emp3thy commented Jul 19, 2026

Copy link
Copy Markdown
Owner

What

Two major pieces on one branch (43 commits):

1. Comic-tabloid visual re-theme — all seven screens

Recreates the design_handoff_nuke_game/ hi-fi prototype in the production stack (Vite + React 18 + TS + CSS modules), driven entirely by live engine state:

  • Global design tokens (src/ui/tokens.css) + 7 self-hosted @fontsource families
  • Geometric SVG portrait system (src/ui/portraits/, Portrait.tsx) with Groucho-disguise human variant and per-slot accents
  • 15 shared comic primitives (src/ui/components/comic/)
  • Setup, Planning, HotseatHandoff, AiConferring, Action (world-map playback), RoundSummary (tabloid front page), Winners — all re-themed
  • Specs: docs/superpowers/specs/2026-07-19-comic-retheme-slice{1..4}-design.md; multi-agent implementation with per-phase spec/code review and an overall sign-off vs the handoff

2. Starmless → Burn'em leader swap

UK slot replaced with an Andy Burnham parody (research-backed: docs/superpowers/research/2026-07-19-burnham-research.md):

  • Full id rename, zero starmless references remain in src/tests
  • New "handbrake turn" AI personality: placid until a landed hit, then permanent full aggression; patience fallback (round 3 / 2-survivor) prevents 1v1 stalls; duel-balanced to 22.5% win share across 80 seeds (was 57.5% untuned)
  • All-new flavour bank (tag-question tic, blokey-to-apocalyptic pivots, bus obsession); hard exclusions honoured (no Hillsborough, no religious markers)
  • New campaign-placard portrait SVG
  • Spec: docs/superpowers/specs/2026-07-19-burnem-leader-swap-design.md; SDD execution with per-task reviews + final whole-range review (verdict: ready to merge)

Verification

  • 420/420 tests across 57 files, tsc --noEmit clean, vite build clean
  • 80-seed AI-duel: all games terminate; win spread carnage 27.5% / chump 23.75% / burnem 22.5% / mileigh-hem 18.75% / netanyahoo 6.25% / khameneverhere 1.25%
  • Full-round browser walkthrough (Setup → Planning → Action → newspaper) against the design prototype

🤖 Generated with Claude Code

emp3thy and others added 30 commits May 20, 2026 19:45
Captures the three top-level look-and-feel decisions from the 2026-05-19
brainstorm (polish = elevate past mockups; framing = responsive desktop;
identity = custom portrait art) plus the full portrait system: master
800x1000 head-and-shoulders assets, a five-step size scale, always-on
flag-badge overlay, AI-generated pipeline locked to the Chump reference,
and the flag-fill variant for player-slot occupants.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The first draft read as if animation was cancelled. It isn't: Framer Motion
plus the Action/Reactions pacing were already settled in the 2026-05-08
design and the mockups. This commit clarifies that this spec adds no NEW
animation work but the <Portrait> component must be animation-friendly
(motion-wrappable, addressable inner layers) so the existing Phase-5 plan
can attach without refactor. Adds a §6 "Animation context (already
decided)" reference section.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Design handoff at design_handoff_nuke_game/ becomes the visual source of
truth. Slice 1 covers tokens, fonts, SVG portrait system, shared comic
primitives, and the Setup screen re-theme.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Prior commit 2a133ca carried the same message but swept in the
parallel slice-4 spec during an index.lock race; this commit adds
the actual slice-2 spec.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Port design_handoff_nuke_game/tokens.css to src/ui/tokens.css (devnav
block dropped per spec) and wire @fontsource imports in main.tsx.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Eight face SVGs ported from the design handoff; Portrait component
dispatches AI signature colors vs per-slot human accents, with flag
badge and extractFlag/stripFlag helpers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
14 typed components (Panel, Halftone, Tag, Stamp, Bubble, Burst, Btn,
Stat, ApMeter, PhaseTrack, DamageBadge, RelBadge, HoldButton, Ribbon)
with a barrel export. HoldButton adds rAF cleanup on unmount.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Handoff layout: NUKE! masthead, rotated cast tiles with SVG portraits
and PICKED stamps, gag difficulty labels, live opponent count, Begin
the End button. Keeps multi-human roster, seed input, and START_GAME
wiring; adopts handoff oldest-pick-drop at 4 opponents.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Port of handoff ui.jsx RoundBadge — ink plaque with label + round
number, exported from the comic barrel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ink full-viewport curtain with dot-grid overlay, yellow HOTSEAT
HANDOFF tag, giant country flag, PASS TO kicker, yellow display-font
leader name, and a primary xl BEGIN MY TURN button. Wiring unchanged:
reads state.activeHumanTurn and dispatches BEGIN_PLANNING. The
separate country-name text line is dropped per the slice-2 spec (the
flag carries it).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per-AI-leader panels with portraits, live names, verbatim handoff
flavour lines, pulsing dots that flip to a green FILED tag on a
2400ms stagger (row i files at (i+1)*2400/n), headline dots cycling
every 320ms, and AI_RESOLVE dispatched once at 2900ms. All timers
cleared on unmount. Roster comes from game.cast filtered to living
AI leaders, same as Planning.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Previously orphaned; now wraps the slice-1 ApMeter and renders the
banking note (Banked AP carries over, cap 4, plus the banked amount
when > 0). Props change from {ap, apBanked} to {used, max, banked}.
Mounted in Planning in the slice-2 rewrite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SoftWarnPanel becomes the handoff SOFT WARNINGS panel: always
rendered, hand-font magenta warnings with leading warning sign, and
the Nothing obviously stupid. Yet. empty state (adopted behavior).
describe() messages unchanged.

BuildGrid/DefenceGrid cells become Build Yard tiles (2.5px ink
border, paper-bright, hard ink shadow, magenta hover offset, emoji +
display label + mono magenta AP cost) with the existing +/- steppers
kept; stepper buttons gain add/remove aria-labels. LaunchCell becomes
a mini comic tile (yellow-soft when queued, 40% opacity when no
warheads). All order/AP gating logic untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Header: RoundBadge + full player name / country / flag over a 4px
ink rule. Left column: Your Country panel (portrait with chosen-
country flag badge, 2x2 live Stat grid, ApBudget wrapping ApMeter)
plus the always-on SoftWarnPanel. Centre: The Table opponent cards
(TargetRow as alternating-tilt Panels with portraits, mono stat line,
segmented people/infra toggle, WOO/PROP mini-buttons, launch tile
grids), Build Yard and Civil Defence panels. Right: Your Orders queue
(adopted handoff behavior) as a pure view over the orders array with
per-row x removal, dashed subtotal with over-budget line, HoldButton
seal (SEAL ORDERS, hold 0.6s, disabled while over budget - existing
validation preserved), and the ink masthead teaser via pickMasthead.

All order/AP/validation behavior, projections, retarget-on-toggle and
store dispatches unchanged; every displayed number comes from the
engine. Tests: queries moved to role/label/text; new orders-queue and
seal-hold suites.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CSS modules localize animation names in the shorthand, so referencing
the global @Keyframes pulsedot from tokens.css never resolved and the
conferring dots did not animate. Defining the keyframes inside the
module makes the localized names match (verified in emitted build CSS).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pure event->display-text formatter for the slice-3 Action re-theme:
formatEventCard's switch moved verbatim minus the className field.
EventCard still carries its own copy until the Action rewrite deletes it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Stylised political-cartoon map (slice-3 spec section 5): continent paths
verbatim from the handoff on an extended 0 0 100 85 viewBox, cast-only
country ellipses (actor green / receiver magenta / AI signature color /
human slot accent), launch arcs with impact rings and firing pulse,
intercept shield, propaganda and woo trails, build icons, final-retal
multi-arc. PORTRAIT_META colors become concrete hexes (mirroring
tokens.css --c-*) so SVG fill attributes never interpolate undefined
var(--c-<leaderId>) custom properties.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paper card with 3px ink border and magenta offset shadow: 56px Disparage
portrait, yellow beer-tag, hand-font engine quote (slice-3 spec section 6).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Slice-3 re-theme: the static phase-sectioned event list becomes the
handoff's one-step-at-a-time resolution playback driven by real
ResolutionEvents. buildPlaybackSteps (exported, pure) keeps the existing
phase-cursor + groupPhaseEvents bucketing and attaches engine-emitted
DisparageCameo events to the impact step matching their afterImpact pair
(cameos never become steps; unmatched cameos drop).

Screen: ink background, RoundBadge + ACTION header with pause / fast 3x /
skip ctrl-buttons, six-segment PhaseTrack, magenta NOW-phase banner,
WorldMap with actor/receiver portrait pins + name pills, speech bubble,
burst + damage badge (zero-damage impacts suppress both), ELIMINATED
stamp, cameo overlay card, and the detail strip (progress dots, hand-font
quote, prev/next, event counter). Auto-advance 2700ms / 1100ms fast;
last-step next label is TO THE NEWS -> / TO THE VERDICT -> and dispatches
ACTION_DONE. Empty rounds show the quiet-round banner and continue only.

EventCard and PhaseTracker are deleted: the formatter lives on as
util/eventText, the tracker is replaced by the comic PhaseTrack primitive.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pure section models (forecast tiers, market ticker, box score, news
stories with lead selection + DOM ordering, photo caption, corrections/
classifieds pools) computed from live GameState + ResolutionEvents.
Copy lifted from the handoff data.jsx as content; nothing imported.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Stylised mushroom-cloud photo lifted from the handoff screens-3.jsx,
with per-instance gradient/pattern ids (useId), optional magenta stamp
and caption bar. Replaces the P4a placeholder in the next commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Masthead + rule line, giant headline with casualty stamp, mushroom-cloud
photo with derived caption, 4-across casualty strip, FROM AROUND THE
RUBBLE story flow (lead first), data-driven sidebar (forecast, market,
box score, obituaries, classifieds, ad), rotating corrections box and
ink continue bar. DisparageColumn restyled as a .side-sec with the
disparage portrait; pickHeadline/pickSubhead and all dispatch wiring
preserved. Render tests cover masthead, strip values, corrections
rotation, Disparage conditional and the NEXT_ROUND button.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Yellow FINAL SCORE tag, ink-soft hero with 200px winner portrait and
SURVIVOR/PYRRHIC stamp (apocalypse: radiation panel + NO SURVIVORS),
Death Toll panel with portraits, integer % LOST (adopted from handoff)
and SURVIVED/ELIMINATED badges, closing 1989-box tagline. pickHeadline,
pickSubLine, tollRows sort and newGame/sameCast handlers preserved.
Render tests cover sorting, badges, stamps and both button dispatches.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
emp3thy and others added 13 commits July 19, 2026 16:36
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces the Cautious+Scapegoat personality with a placid-by-default
planner that flips permanently to full aggression on the first landed
hit (persistent grudge), redirecting to the strongest survivor if the
provoker dies. A round-6/2-survivor patience fallback prevents the
never-attack-first 1v1 stall. Drops the now-unused scapegoat weight.
Burn'em was dominating the 80-seed AI-duel sweep (46/80 wins) by sitting
out early fights, compounding AP via a growing factory count while
placid, and pouncing on already-weakened survivors once provoked or
patience-triggered. BURNEM_PATIENCE_ROUND 6->3 was the dominant lever
(attack sooner, before rivals wear each other down); BURNEM_MAX_LAUNCHES
4->2 and the placid factory target 8->6 (flat at his starting count) trim
the follow-through. Final breakdown: burnem 18/80 (22.5%), in line with
the rest of the cast.

Also split the build-plan comment that conflated the missile-before-
warheads rationale with the producers-before-consumers batch-ordering
rule; the latter now sits next to the orders.push call it documents.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Claude BugBot Analysis

Reviewed the full diff (Starmless→Burn'em leader rework/rename across engine AI, flavor, and types, plus a large comic-style UI retheme across components and screens). Manually verified the new src/engine/ai/burnem.ts logic against aggression.ts's buildToward/launchSalvo signatures and grudge-field usage in resolution.ts/scoring.ts, and dispatched five parallel reviews of the UI component and screen changes (cross-checking prop signatures, event-type unions, useEffect cleanup/lifecycles, and round-number arithmetic against the current repo). No genuine logic errors, null dereferences, off-by-ones, resource leaks, or security issues were found in the added/modified lines.

No bugs were detected in this PR.

@emp3thy
emp3thy merged commit 89b1b04 into main Jul 19, 2026
1 check passed
@emp3thy
emp3thy deleted the feat/portrait-system branch July 19, 2026 17:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant