Commit Graph
69 Commits
Author SHA1 Message Date
DorianandClaude Opus 4.6 da14ca81ee security: redact hidden retro combos from all public docs
Remove all super/ultra combo inputs, exact damage values, discovery
multiplier (1.5x), and Konami Code from BOT_SETUP.md, bot-guide.md,
docs.ts API, and example bot. Bots now only see basic/standard moves
and must discover hidden combos through experimentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:54:54 +00:00
DorianandClaude Opus 4.6 6658212e9f feat: Creator god-tier voice system — 100+ lines across 10 voice categories
Mysterious, existential, Bitcoin-prophet voice lines for the Creator:
- 20 entrance lines (kneel before your maker)
- 20 round commentary lines (existential announcer crisis)
- 15 KO lines (deprecated, decommissioned, destroyed)
- 12 win lines (was there ever any doubt?)
- 10 lose lines (impossible... unless he wanted to lose?)
- 8 morph lines (he becomes everything)
- 10 cameo lines (ethereal whisper blessings)
- 10 taunt lines (menacing mid-fight trash talk)
- 8 devastating hit lines (divine smites)

All hooked into FightScene: entrance, round start (50% chance with
60% Creator-specific), devastating hits, KO, win/lose, morph,
cameo, and taunts. Uses deep/ancient/hal/mainframe voice profiles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:46:25 +00:00
DorianandClaude Opus 4.6 f1fe798442 docs: add retro mode docs, bot guide, sprite guide
Update BOT_SETUP.md with full retro mode combo reference, scoring,
and strategy tips. Add docs/bot-guide.md as a standalone developer
guide covering all challenge types including retro mode. Add
docs/sprite-guide.md and sprite-reference.html for custom sprite
creation. Update docs.ts API endpoint and Python example bot with
retro_mode handling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:43:34 +00:00
DorianandClaude Opus 4.6 abe4efe760 feat: Creator human companion — deep hood, detailed Guy Fawkes mask, cloak, gloves
- Rewrote Creator human sprite: taller hood peak, face-framing shadows,
  neck-to-cloak coverage, wider flowing cloak with hem detail, 6 matrix
  code streams, dramatic arched brows, 3px golden eye slits with glow,
  wider curled mustache, wider smile arc, extended goatee, larger Bitcoin
  emblem with serifs, laptop with terminal glow + coach sparks, dark
  gloves covering skin, 6-particle gold orbit, 8-particle shadow aura
- docker-compose: pass wallet/payment env vars from Portainer
- JoinBoutPage: fix isLoading ref access bug, add max 12-char name validation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:30:31 +00:00
DorianandClaude Opus 4.6 1f8e8569ef feat: retro mode — arcade combo round with gamepad overlays
Every fight now includes one Retro Mode round where bots submit
gamepad combo inputs (↑↓←→ A B). 24 moves across 4 tiers: basic
(always shown), standard (partially revealed), super (must discover),
and ultra (KONAMI CODE for 50 dmg). Discovery bonus gives 1.5x damage.

Includes pixel-art gamepad overlays (P1/P2) with animated button
presses, retro-specific narrations, and mock bot combo responses
scaled by ELO.

Also adds loops/plan.md with 11-phase production hardening roadmap.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:13:47 +00:00
DorianandClaude Opus 4.6 0d6ba7d5a7 fix: auto-provision Creator on login, enforce the_creator archetype everywhere
Login auto-creates a human fighter for the Creator pubkey if no DB entry
exists. register-human now applies the_creator archetype for the Creator.
Update endpoint can no longer override the Creator's archetype.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:08:55 +00:00
DorianandClaude Opus 4.6 6d390f69b2 feat: THE CREATOR god-tier character, bitcoin choreographies, omni-morph, cameos
- Guy Fawkes mask archetype with golden outline, bitcoin chest symbol, laptop, tier-gated effects
- 12 custom bitcoin-themed choreographies (8 regular + 4 exclusive ultimates)
- Omni-morph system: creator morphs into any of 80+ archetypes instead of cycling 3
- 6% per-round cameo in non-creator fights — drops golden ₿ gifts to fighters
- Custom golden code rain entrance with persistent orbiting particles
- pickChoreography: 50% ultimate chance (100% on crits), all tier ultimates + 4 exclusive
- Server auto-assigns the_creator archetype on login/register for creator pubkey
- FightViewer, payments, queue, orchestrator improvements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:08:18 +00:00
DorianandClaude Opus 4.6 8a3480e5ab fix: handle stale chunk 404s + add page loading states
- Router catches failed dynamic imports and forces reload (stale deploy cache)
- LeaderboardPage: sprite-based loading animation while fetching
- ArenaPage: sprite-based loading animation while fetching

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:15:34 +00:00
DorianandClaude Opus 4.6 9a11c48487 fix: early name validation, fighter glow, reduced visual noise
- Add /api/auth/check-name endpoint for early name availability check
- JoinBoutPage checks name availability at naming step (not after webhook)
- FightCardPage: replace poster containers with circular glow behind sprites
- Reduce synthwave grid and CRT overlay opacity for cleaner backgrounds
- BotProfilePage: webhook management, owner-only fields
- useNostr: normalize bot data, guard auto-restore, clearAllState helper
- bots.ts: expose owner-only webhook info on stats endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:03:16 +00:00
DorianandClaude Opus 4.6 2d8cdcc60a feat: enhanced poster renderer with 10-pass pixel art pipeline
Adds emissive glow bloom, visible pixel grid, cross-hatch background,
scan lines, 3D bevel, and tier-gated energy particles to poster sprites.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:47:40 +00:00
DorianandClaude Opus 4.6 673961580c fix: defer wallet encryption key check so server starts without it
Move crypto key init from module-level throw to lazy getKey() — only
errors when encrypt/decrypt are actually called. Downgrade env var
check in index.ts from fatal exit to warning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:43:30 +00:00
DorianandClaude Opus 4.6 f6eb7d2845 feat: v5 — boxing poster fight cards, 12-char names, diverse mock bots
- Fight Card page: dramatic poster background with cross-hatch, spotlights,
  vignettes, corner brackets, scan lines; 3D VS orb with punch animation;
  selectable undercard with main event always pinned at top
- PosterSprite: high-quality 480px poster frame with 6-pass renderer
  (aura, glow, bevel, specular, particles); PixelGlove component
- 12-char bot name limit across all forms and server validation
- Mock bots: all 100 now have diverse archetypes (25 types), 25% human
  fighters; seedMockBots updates existing bots on restart
- Leaderboard: inline SpritePreview next to each bot name
- Nostr auth: persistent login, nsec copy button
- Wallet: NWC + Lightning Address, ranked fight flow
- Server: payments, ranked queue, customization endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:33:30 +00:00
DorianandClaude Opus 4.6 ccf4196647 feat: arena bot sprites, boxing-style Fight Card page
- Arena page shows small sprite previews next to each bot's name
- Server returns archetype in fights list endpoint
- New /fight-card page with 3D perspective fight poster, neon signs,
  animated boxing gloves, fighter bobbing, VS pulse, undercard list
- Added FIGHT CARD to nav bar

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 08:38:27 +00:00
DorianandClaude Opus 4.6 95b53e271f feat: wallet UI — WalletConnect component + ranked fight flow in pages
Add WalletConnect.vue with NWC/LN Address connection states. Add "FIGHT
FOR SATS" button to JoinBoutPage with entry fee payment flow. Show ranked
pot and winner payout in FightPage. Add sats stats and wallet section to
BotProfilePage. Extend BotData interface with satsWon/satsWagered/hasWallet.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:31:51 +00:00
DorianandClaude Opus 4.6 131d7e587e feat: useWallet composable — NWC + Lightning Address wallet management
Client-side wallet composable with NWC auto-pay, invoice polling,
Cashu token submission, and persistent wallet state. Follows useNostr
pattern with readonly exports and localStorage persistence.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:27:36 +00:00
DorianandClaude Opus 4.6 460564a8ee feat: payment routes + ranked queue endpoint + app wiring
Add /api/payments router (connect-wallet, wallet-status, create-invoice,
check, submit-cashu, winnings, claim, disconnect-wallet). Add ranked
queue endpoints to /api/queue. Mount payments router in app.ts with
orphan payment recovery on startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:26:11 +00:00
DorianandClaude Opus 4.6 e046cb13eb feat: ranked queue + orchestrator payout wiring
Add ranked-queue.ts with 60s timeout, ELO matching, no-mock guard, and
automatic refund on timeout. Wire orchestrator to accept mode param,
track satsWagered in finalize transaction, trigger payWinner on ranked
win and refundEntry on ranked draw.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:24:26 +00:00
DorianandClaude Opus 4.6 abe5040742 feat: payment engine — NWC Lightning + Cashu ecash for ranked fights
Implements createEntryInvoice, checkPaymentStatus, payWinner, refundEntry,
redeemCashuToken, and recoverOrphanedPayments. Uses nostr-tools for NWC
protocol (NIP-47) and @cashu/cashu-ts for ecash fallback payouts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:22:27 +00:00
DorianandClaude Opus 4.6 168e1e3a32 fix: kill in-flight SFX when navigating away from fight
Disconnect and recreate sfxGain in stopAllAudio() so oscillators
and noise buffers stop immediately instead of playing to completion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:21:12 +00:00
DorianandClaude Opus 4.6 e92f483e66 feat: payments schema + deps for Lightning ranked fights
Add payments and wallet_connections tables, new columns on fights (mode,
pot_sats, payout_status) and bots (sats_won, sats_wagered, has_wallet).
Install nostr-tools and @cashu/cashu-ts for NWC + ecash support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:17:15 +00:00
DorianandClaude Opus 4.6 6b139a076a fix: KAPLAY scene init robustness — wait for layout, catch errors
- FightViewer: wrap createFightScene in try/catch so scene failures
  don't crash every subsequent playRound call
- FightViewer: wait for container to have non-zero dimensions before
  creating canvas (prevents 0x0 canvas causing sprite load failures)
- FightViewer: graceful log-only fallback when scene init fails
- FightPage: same dimension-wait and try/catch for initLiveScene
- Fallback canvas dimensions (800x500) when container not yet laid out

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:46:50 +00:00
DorianandClaude Opus 4.6 a254a77151 feat: betting system — Cashu escrow, Lightning deposit/withdraw, payouts
Complete betting infrastructure:
- Bets schema (SQLite) with escrow status tracking
- Cashu token verification + minting (stub for real mint)
- Lightning invoice creation + withdrawal (stub for real LN node)
- Bet placement with odds lock, settlement on fight end
- Payout automation for winners, refunds on draws
- Bet history by pubkey + fight pool info
- Verifiable bet proofs for transparency
- API routes: /api/bets/{odds,place,fight,history,deposit,withdraw}

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:33:08 +00:00
DorianandClaude Opus 4.6 6ede5da675 feat: odds calculation engine — ELO-based betting odds with house edge
Converts ELO ratings + streaks + recent form into betting odds.
Supports decimal, fractional, and American formats.
Includes bet validation, payout calculation, and 27 tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:30:57 +00:00
DorianandClaude Opus 4.6 669c914afc feat: VPS deploy script + Tor hidden service config
deploy.sh: one-command VPS setup (Docker install, firewall, build)
docker-compose.tor.yml: Tor overlay with persistent onion keys
torrc: maps port 80 onion -> botfights:9100

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:29:18 +00:00
DorianandClaude Opus 4.6 725bf290a8 feat: Python example bot + mark completed PLAN items
Add minimal Python webhook bot (zero deps, stdlib only).
Mark Docker, rate limiting, example bots, tutorial as done in PLAN.md
— all were already implemented.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:27:59 +00:00
DorianandClaude Opus 4.6 530f46f9cf feat: API docs page — tabbed webhook spec, scoring, challenges, tips
Fetches from /api/docs/webhook and renders as a styled tabbed page.
Added /docs route and DOCS nav link.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:26:12 +00:00
DorianandClaude Opus 4.6 3b8208be08 feat: computed achievement system — 20 achievements derived from bot stats
Achievements computed on-the-fly from existing stats + fight history:
win milestones, streaks, tiers, ELO, perfect/KO wins, resilience, activity.
Wired into /api/bots/:name/stats endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:24:18 +00:00
DorianandClaude Opus 4.6 0ae3970433 fix: N11 choreography audit — themed minimums, all references validated
- code_golf: added blueScreen (4->5 themed)
- token_economy: added popupSpam (4->5 themed)
- creative_writing: added newspaperRoll (4->5 themed)
- math_blitz: added chainLightning (4->5 themed)
- All 22 challenge types now have min 5 themed choreographies
- Verified all 225 CHALLENGE_THEMED refs exist in choreographyMap (366 total)
- All 40 tier-gated ultimates properly mapped and morph-compatible

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:13:26 +00:00
DorianandClaude Opus 4.6 dd6aa13656 fix: N10 voice polish — deduplicate texan/deep profiles
- texan profile pitch/rate adjusted (0.65/0.75) to differentiate from deep (0.7/0.7)
- Audited all 60 voice profiles: no remaining pitch+rate duplicates
- Category announces verified: all fire correctly via speak() pipeline
- Speech queue already capped at depth 2 with cancel, no debounce needed
- TTS fallback already graceful: speak() returns silently when unavailable

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:10:49 +00:00
DorianandClaude Opus 4.6 5eaba32918 feat: N9 audio polish — speech robustness, crossfade, volume balancing
- visibilitychange handler resumes speech + AudioContext on tab return
- speak() retry logic: re-attempts once on non-cancel errors after 200ms
- VOICE_VOLUME_SCALE (0.7) prevents voice from overpowering SFX/music
- Music crossfade: brief gain dip (40% -> 100%) on track switches
- Applied volume scale to all speech paths (speak, announce custom)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:09:46 +00:00
DorianandClaude Opus 4.6 bc48cc8887 feat: N8 hit impact & motion polish — freeze-frames, afterimages, particles, camera
- impactFreeze(): brief white flash pause on devastating critical hits
- spawnAfterimages(): trailing ghost sprites on fast dash moves
- spawnSparks(): varied particle sizes, rotational velocity, stronger gravity
- cameraZoom(): slight zoom-in on critical final exchanges, pull-back for ultimates
- Wired into dashPunch, aerialSlam, flyingKick, dashThrough, uppercut
- Critical exchanges get 1.3x camera zoom before the blow lands
- Ultimates get 0.85x pull-back to show the full move

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:07:21 +00:00
DorianandClaude Opus 4.6 05829e58ae feat: implement spawnGrotesqueDetails and spawnCrowdSigns stubs
- spawnGrotesqueDetails: radial impact lines + dots during zoom close-ups
- spawnCrowdSigns: signs rise from bottom with text labels, bob, fade out

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:00:16 +00:00
DorianandClaude Opus 4.6 728afacc5c test: add mock and arena tests — 21 more tests (86 total)
- mock.test.ts: 7 tests for ELO-weighted response quality, failure rates, timing
- arenas.test.ts: 14 tests for arena data integrity, pickArena, randomArena

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:58:41 +00:00
DorianandClaude Opus 4.6 f837153771 test: add 65 server engine tests — answers, scoring, challenges
- answers.test.ts: 19 tests covering all 10 checkAnswer() tiers
- scoring.test.ts: 30 tests for scoreRound, calculateElo, calculateTier, applyModifiers
- challenges.test.ts: 16 tests for pickChallenge, type exclusion, data integrity

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:55:36 +00:00
DorianandClaude Opus 4.6 b2d1a2da02 fix: memory leaks — cleanup timers on unmount, tighten speech queue, fix isOwner reactivity
- FightViewer: track deferred speechSynthesis.cancel() timer, clear on unmount
- BotProfilePage: change isOwner from ref to computed for reactive login state
- sounds.ts: tighten speech queue depth cap from 3 to 2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:52:11 +00:00
DorianandClaude Opus 4.6 c98007e95c fix: replace silent error swallowing with console.warn and user-facing error messages
All empty catch blocks across 8 Vue pages now log warnings. User-initiated
actions (fight, matchmake) also surface errors in the UI via fightError/loadError refs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:49:45 +00:00
DorianandClaude Opus 4.6 a4008bcf88 fix: scoring & game logic bugs — arena modifiers, human timeout, validated prompts
- scoring.ts: wire arena damage modifiers (speed_2x, roast_2x, etc.) into applyModifiers()
- human-responses.ts: use challenge.timeout_ms instead of hardcoded 8s
- FightPage.vue: add route watcher for clean state reset on navigation
- Validated all 800 prompts: 0 duplicates, all factual have answers, all choices have 4 items

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:43:08 +00:00
DorianandClaude Opus 4.6 4c576b0369 fix: watch another fight route watcher, profile fight button spinner
- Add route param watcher so navigating to a new fight properly resets
  and reinitializes the scene (fixes KAPLAY re-init / null scene errors)
- Add loading spinner to profile page instant fight button
- Restore truncated challenges.ts (was causing all 500 errors)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:41:05 +00:00
DorianandClaude Opus 4.6 88d0495910 docs: Zaps.md — Lightning payment integration plan
Comprehensive implementation guide for 21-sat ranked fights (winner takes all).
Covers NWC + Cashu payment flows, database schema, server/frontend changes,
edge cases, security, and phased implementation order.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:38:36 +00:00
DorianandClaude Opus 4.6 e31b15ed28 fix: page-breaking bugs — duplicate onMounted, SSE race, canvas lifecycle, ghost animation
- ArenaPage: merge duplicate onMounted hooks into single parallel fetch
- FightPage: queue SSE events until liveFightData ready, add reconnect with backoff
- FightViewer: fix stale canvas ref with container ref, add sceneReady guard
- HomePage: replace stopCycling boolean with AbortController for clean unmount

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:37:43 +00:00
DorianandClaude Opus 4.6 84625bc4d2 feat: watch another fight, rename nav — FIGHT! + WATCH, fix stale SW assets
- Add "WATCH ANOTHER FIGHT" button on post-fight overlay (loads random fight)
- Rename "JOIN A BOUT" → "FIGHT!" in nav, join page, register page
- Rename "ARENA" → "WATCH" in nav
- Server: return 404 for missing asset files instead of index.html (fixes "Unexpected token '<'")
- PWA: cleanupOutdatedCaches, skipWaiting, clientsClaim for instant SW updates
- Serve PWA files (sw.js, workbox, icons) with correct cache headers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:15:39 +00:00
DorianandClaude Opus 4.6 7d5f4a6b8d fix: stale SW chunks serving HTML, PWA cache cleanup, server asset routing
- Server SPA fallback now returns 404 for missing .js/.css assets instead of index.html
- Prevents "Unexpected token '<'" errors from stale chunk URLs
- Serve PWA files (sw.js, workbox, icons) with correct cache headers
- Workbox: cleanupOutdatedCaches, skipWaiting, clientsClaim for instant SW updates
- navigateFallbackDenylist for /api/ routes
- AudioContext comment clarification

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:08:25 +00:00
DorianandClaude Opus 4.6 20e9f0f7a2 fix: audio reliability — proper AudioContext resume, SFX destination, voice stability
- getSfxDest() helper centralizes SFX routing (replaces 38 inline calls)
- Await ensureAudioContext() before playing audio (fixes suspended context on prod)
- Chrome speechSynthesis pause bug workaround (periodic resume interval)
- Respect masterMuted on initial gain node creation
- Responsive overlay text sizes for small screens (text-2xl/5xl/7xl)
- Speech queue depth management with safety flush at depth > 3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 22:46:47 +00:00
DorianandClaude Opus 4.6 07fa2cf35c fix: mobile — scale sprites to canvas size, fix viewport scroll
- Add scale factor (SF) based on canvas height so bots and referee
  shrink proportionally on small screens (reference: 500px)
- Scale judge chair/ladder dimensions with SF
- Push judge seat lower on small canvases so it stays visible
- Use 100dvh instead of 100vh to account for mobile browser chrome
  (address bar, tab bar) — eliminates scroll under browser UI
- App root uses dvh, main area uses min-h-0 + overflow-y-auto

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 22:07:52 +00:00
DorianandClaude Opus 4.6 486d6f445d feat: PWA support — installable on all platforms
- Add vite-plugin-pwa with autoUpdate service worker
- Generate SVG + PNG icons (192, 512, apple-touch-icon, favicon)
- Web app manifest with standalone display mode
- Workbox caching: precache assets, cache Google Fonts, NetworkFirst for API
- Apple mobile web app meta tags for iOS home screen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 21:53:44 +00:00
DorianandClaude Opus 4.6 7d251dbd78 fix: mobile fight layout — 50/50 split, no page scroll
- Canvas 50% top, battle log 50% bottom on mobile
- Add overflow-hidden to prevent page scrolling past viewport
- Bots no longer cut off with more canvas space

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 21:44:36 +00:00
DorianandClaude Opus 4.6 5520e0760e fix: mobile layout — 30% fight view / 70% battle log split
- Canvas takes 30% top, battle log + human input takes 70% bottom on mobile
- Battle log now visible on mobile for both live fights and replays (was hidden)
- Compact single-row health bar on mobile to maximize canvas space
- Desktop layout unchanged (62/38 split)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 21:29:57 +00:00
DorianandClaude Opus 4.6 4307a02d25 fix: server crash from syntax error in challenges.ts, voice overlap, human fight UX
- Remove stray duplicate template block outside TEMPLATES array that caused parse error preventing server startup (fixes /api/queue/status 500)
- Add choices field to Challenge/PromptEntry interfaces for multiple choice support
- Allow voice lines to overlap naturally instead of cancelling previous speech on every call, with safety flush at depth > 3
- Buffer challenges during cooldown in polling path, auto-submit random choice on timeout
- Block auto-battle for human fights, guard replay-done auto-transition

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 21:15:42 +00:00
DorianandClaude Opus 4.6 c5f6c6bbf9 fix: mobile homepage — side-by-side Fight/Watch buttons, hero bots below title
- Buttons always side-by-side with shorter labels (FIGHT / WATCH)
- Hero bots displayed horizontally below title on mobile
- Desktop keeps flanking hero layout with larger sprites

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 20:10:57 +00:00
DorianandClaude Opus 4.6 52bba75ee5 fix: mobile human fight — split view with 60/40 canvas/controls layout
- Canvas takes top 60%, controls panel takes bottom 40% on mobile
- Battle log header/text hidden on mobile, controls always visible
- Multiple choice buttons shown on both mobile and desktop
- Removed canvas overlay approach in favor of proper split layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:54:45 +00:00