feat: v3 — fight loop, expanded challenges, FightPage ownership guard

- Add fight-loop CLI for automated mock fights with elo-based matchmaking
- Expand challenge types, scoring narrations, arenas, and mock bot pool
- FightPage "Fight again" buttons now only show for your own bot
- FightViewer async scene init, live fight polling with round counter
- Extract mock answers into separate answers module

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-06 23:44:40 +00:00
co-authored by Claude Opus 4.6
parent 47d20fbe66
commit 2c0323d5fb
14 changed files with 2669 additions and 996 deletions
+70
View File
@@ -112,6 +112,76 @@ export const ARENAS: Arena[] = [
modifier: 'latency_chaos',
modifierDescription: 'Random latency penalties added to both bots.',
},
{
id: 'colosseum',
name: 'The Colosseum',
description: 'Ancient stone arena with holographic gladiators. The crowd demands entertainment.',
modifier: 'wrestling_2x',
modifierDescription: 'Wrestling matches and roast battles deal 2x damage.',
},
{
id: 'kitchen_stadium',
name: 'Kitchen Stadium',
description: 'Iron Chef meets fight club. Knives fly, pots clang, and somebody spilled the bisque.',
modifier: 'food_2x',
modifierDescription: 'Food fight challenges deal 2x damage.',
},
{
id: 'haunted_mansion',
name: 'Haunted Mansion',
description: 'Creaking doors, floating candelabras, and a ghost who won\'t stop backseat gaming.',
modifier: 'magic_2x',
modifierDescription: 'Magic duel and medieval combat deal 2x damage.',
},
{
id: 'meme_dimension',
name: 'The Meme Dimension',
description: 'Reality warps here. Doge floats overhead. Everything is deep-fried. Nothing makes sense.',
modifier: 'meme_2x',
modifierDescription: 'Meme war challenges deal 2x damage.',
},
{
id: 'space_station',
name: 'Deep Space Arena',
description: 'A fighting ring suspended between two neutron stars. Time dilation makes rounds feel eternal.',
modifier: 'space_2x',
modifierDescription: 'Space war challenges deal 2x damage.',
},
{
id: 'junkyard',
name: 'The Junkyard',
description: 'Rusted cars, sparking wires, and the faint smell of burning rubber. Demo derby time.',
modifier: 'demo_2x',
modifierDescription: 'Demolition and vehicle mayhem deal 2x damage.',
},
{
id: 'concert_hall',
name: 'Neon Concert Hall',
description: 'Laser lights, bass drops, and a crowd that won\'t stop moshing. Play or get played.',
modifier: 'music_2x',
modifierDescription: 'Music battle challenges deal 2x damage.',
},
{
id: 'savanna',
name: 'Digital Savanna',
description: 'Pixelated grass sways. A low-poly lion watches from a distance. Nature is metal.',
modifier: 'nature_2x',
modifierDescription: 'Nature clash and animal kingdom challenges deal 2x damage.',
},
{
id: 'server_room',
name: 'The Server Room',
description: 'Blinding green LEDs, deafening fans, and cables everywhere. One wrong move and the internet goes down.',
modifier: 'hack_2x',
modifierDescription: 'Hack battle challenges deal 2x damage.',
},
{
id: 'sports_arena',
name: 'Mega Sports Dome',
description: 'Every sport at once. A basketball hoop next to a goal post next to a cricket pitch. Pure chaos.',
modifier: 'sports_2x',
modifierDescription: 'Sports showdown challenges deal 2x damage.',
},
]
export function pickArena(botAChoice: number, botBChoice: number): Arena {