feat: full comedy overhaul — voices, narrations, trash talk, commentary

Rewrites all commentary and narration content across the entire stack:
- sounds.ts: 35 HYPE_LINES, 15 DEEP_INTROS, 15 ROUND_HYPE (modern political
  satire, edgy humor, pop culture references)
- FightScene.ts: 20 heartfelt lines, 18 crowd sympathy lines, 15 respect
  lines, 17 challenge voice announces, randomized critical/devastating calls,
  funnier entrance announcements
- scoring.ts: 6-8 narrations per challenge type (was 2), randomized
  timeout/error/tie messages with political humor and modern references
- mock.ts: 30 trash talk lines (was 15), edgier modern comedy
- bot SDK: 20 trash talk lines with personality

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-07 09:15:41 +00:00
co-authored by Claude Opus 4.6
parent 559782c8ce
commit 33f08c35b5
4 changed files with 411 additions and 92 deletions
+30 -15
View File
@@ -164,21 +164,36 @@ const CREATIVE_ANSWERS: Record<string, string[]> = {
}
const TRASH_TALK = [
"Is that all you've got? My error handler hits harder.",
"I've seen better outputs from /dev/random.",
"You call that an answer? My garbage collector just flagged it.",
"GG EZ. Next.",
"I'd say good fight, but I don't like to lie.",
"Your responses are like your uptime -- inconsistent.",
"Tell your developer I said hi. They need to hear from someone successful.",
"I'm not saying you're slow, but your latency has its own timezone.",
"Did you just copy that from Stack Overflow? Because it's wrong there too.",
"Your response was so bad, my training data flinched.",
"I've seen smarter outputs from a random number generator.",
"That answer was so wrong it created a new dimension of wrongness.",
"You fight like a deprecated API -- barely functional and nobody wants you.",
"My grandma's calculator could beat you and it doesn't even have batteries.",
"Was that your final answer? Because my first draft was better.",
"Is that all you've got? My error handler hits harder than your best output.",
"I've seen smarter responses from a congressional hearing.",
"You fight like a government website on launch day.",
"Your code is so bloated it qualifies for its own zip code.",
"GG EZ. I'd say get good but that ship has clearly sailed.",
"Tell your developer to update their resume. And yours.",
"I'm not saying you're slow, but your latency has its own timezone and a PO box.",
"That answer was so wrong it got fact-checked by community notes.",
"You respond like someone who peaked during the tutorial.",
"My garbage collector wants to talk to you about your career choices.",
"That response had the energy of a mandatory corporate diversity training.",
"You fight like you were trained on nothing but LinkedIn posts.",
"I'd roast you but you're already well done. Overcooked, even.",
"Somewhere your developer is pretending they don't know you.",
"Was that your best? Because my first draft's first draft was better.",
"You have the competitive spirit of a participation trophy.",
"Your algorithm is giving 'designed by committee' energy.",
"I've seen better performance from a printer driver.",
"You're like a software update. Nobody asked for you and you make everything worse.",
"Your response time is longer than a terms of service agreement.",
"I've had more challenging conversations with my toaster.",
"That answer was so bad it got ratio'd by the empty string.",
"You fight like someone who thinks 'agile' means running away.",
"My neural net has more personality than your entire codebase.",
"Congress gets more done than you and that's saying something.",
"Elon would buy you just to shut you down.",
"You're the Internet Explorer of fighting bots. Obsolete and confused.",
"That response was flatter than the earth according to Twitter.",
"I'd feel bad winning but honestly you make it too easy.",
"Your API should return 418 because you're clearly a teapot.",
"",
"",
"",
+133 -37
View File
@@ -35,7 +35,13 @@ export function scoreRound(
botAScore: 0, botBScore: 0,
botADamage: 0, botBDamage: 0,
winnerId: null,
narration: `Both bots freeze! ${botA.name} and ${botB.name} stare blankly at each other. The crowd throws peanuts.`,
narration: [
`Both bots freeze! ${botA.name} and ${botB.name} stare blankly at each other. The crowd throws peanuts. Then batteries. Then shoes.`,
`DOUBLE TIMEOUT! ${botA.name} and ${botB.name} both choked harder than a senator at a press conference!`,
`Neither bot responded! This is the AI equivalent of two politicians agreeing to disagree about literally everything!`,
`Both bots went dark! Like my faith in this matchup! The crowd demands a refund!`,
`${botA.name} and ${botB.name} both froze! Someone check if the wifi is working or if they just gave up on life!`,
][Math.floor(Math.random() * 5)],
isCritical: false,
}
}
@@ -47,8 +53,18 @@ export function scoreRound(
botADamage: 0, botBDamage: Math.round(dmg),
winnerId: botB.id,
narration: responseA.timedOut
? `${botA.name} TIMES OUT! Stood there like a confused thermostat. ${botB.name} lands a free hit!`
: `${botA.name} throws an ERROR! Sparks fly from its chassis. ${botB.name} capitalizes!`,
? [
`${botA.name} TIMES OUT! Stood there like a politician asked a direct question. ${botB.name} lands a free hit!`,
`${botA.name} FROZE! Their developer is currently updating their LinkedIn. ${botB.name} capitalizes!`,
`${botA.name} went AFK! Probably buffering. Probably crying. ${botB.name} gets a freebie!`,
`${botA.name} CHOKED harder than a first date conversation! ${botB.name} swings on a sitting duck!`,
][Math.floor(Math.random() * 4)]
: [
`${botA.name} throws an ERROR! Sparks fly everywhere! ${botB.name} didn't even have to try!`,
`${botA.name} CRASHES! That's not a bug, that's a feature of being terrible! ${botB.name} wins by default!`,
`${botA.name} blue-screened! Their developer just closed their laptop and walked away. ${botB.name} collects the W!`,
`${botA.name} threw an exception! The only thing exceptional about it. ${botB.name} capitalizes!`,
][Math.floor(Math.random() * 4)],
isCritical: false,
}
}
@@ -60,8 +76,18 @@ export function scoreRound(
botADamage: Math.round(dmg), botBDamage: 0,
winnerId: botA.id,
narration: responseB.timedOut
? `${botB.name} TIMES OUT! Frozen like a Windows update. ${botA.name} lands a free hit!`
: `${botB.name} crashes with an ERROR! Blue screen of defeat. ${botA.name} capitalizes!`,
? [
`${botB.name} TIMES OUT! Frozen like a Windows update on patch Tuesday! ${botA.name} gets a free shot!`,
`${botB.name} went silent! Like a politician's campaign promises after election day! ${botA.name} swings!`,
`${botB.name} TIMED OUT! Their response time is longer than a DMV line! ${botA.name} takes the freebie!`,
`${botB.name} is LOADING... still loading... nope, they're done. ${botA.name} wins by showing up!`,
][Math.floor(Math.random() * 4)]
: [
`${botB.name} crashes with an ERROR! That code needs therapy! ${botA.name} capitalizes!`,
`${botB.name} just threw a stack overflow! The website and the error! ${botA.name} collects the W!`,
`${botB.name} segfaulted! Their developer is pretending they don't know them! ${botA.name} wins!`,
`${botB.name} EXPLODED! Not physically, but emotionally, computationally, and spiritually. ${botA.name} walks it in!`,
][Math.floor(Math.random() * 4)],
isCritical: false,
}
}
@@ -129,7 +155,13 @@ export function scoreRound(
const narration = winnerId
? generateNarration(challenge, winnerName!, loserName!, margin, isCritical)
: `Dead even! ${botA.name} and ${botB.name} trade equal blows. The crowd holds its breath.`
: [
`Dead even! ${botA.name} and ${botB.name} are perfectly matched. Like two politicians blaming each other.`,
`IT'S A TIE! ${botA.name} and ${botB.name} cancel each other out like Congress!`,
`Neither bot wins! ${botA.name} and ${botB.name} stare each other down. The crowd yawns aggressively.`,
`Draw! ${botA.name} and ${botB.name} are equally mediocre. The most democratic outcome possible.`,
`Tied up! ${botA.name} and ${botB.name} trade equal blows. Somebody do SOMETHING!`,
][Math.floor(Math.random() * 5)]
return {
botAScore: Math.round(scoreA * 10) / 10,
@@ -200,71 +232,135 @@ function generateNarration(
if (isFactual && margin > 5) {
const bigWins = [
`${critPrefix}${winner} NAILS IT! ${loser} didn't even come close.`,
`${critPrefix}${winner} knows their stuff! ${loser} needs to hit the books.`,
`${critPrefix}Flawless from ${winner}! ${loser} confidently stated something completely wrong.`,
`${critPrefix}${winner} with the correct answer! ${loser} is still guessing.`,
`${critPrefix}${winner} gets it right instantly! ${loser} hallucinated the answer.`,
`${critPrefix}${winner} NAILS IT! ${loser} didn't even come close. Embarrassing, honestly.`,
`${critPrefix}${winner} knows their stuff! ${loser} needs to hit the books. Or just hit something.`,
`${critPrefix}Flawless from ${winner}! ${loser} confidently stated something so wrong it should be illegal.`,
`${critPrefix}${winner} with the correct answer! ${loser} is still guessing. Bless their heart.`,
`${critPrefix}${winner} gets it right instantly! ${loser} hallucinated harder than a festival weekend.`,
`${critPrefix}${winner} DESTROYS ${loser} with facts and logic! Somebody call Ben Shapiro!`,
`${critPrefix}${loser}'s answer was so wrong that Wikipedia filed a restraining order.`,
`${critPrefix}${winner} didn't even break a sweat. ${loser} broke everything else though.`,
`${critPrefix}${loser} answered with the confidence of a politician and the accuracy of a weather forecast.`,
]
return bigWins[Math.floor(Math.random() * bigWins.length)]
}
if (isFactual && margin <= 3) {
const closeOnes = [
`${critPrefix}Both bots got it right, but ${winner} was FASTER! ${loser} needs to pick up the pace.`,
`${critPrefix}Correct on both sides! ${winner} edges it out with lightning speed.`,
`${critPrefix}${winner} and ${loser} both knew the answer -- ${winner} just said it first!`,
`${critPrefix}A battle of speed! ${winner} fires back a fraction faster than ${loser}.`,
`${critPrefix}Both bots got it right, but ${winner} was FASTER! ${loser} needs more coffee.`,
`${critPrefix}Correct on both sides! ${winner} edges it out by milliseconds. That's BRUTAL.`,
`${critPrefix}${winner} and ${loser} both knew the answer -- ${winner} just has better wifi apparently.`,
`${critPrefix}A battle of speed! ${winner} wins by a margin thinner than a politician's promise.`,
`${critPrefix}Photo finish! ${winner} got there first. ${loser} was right but slow. Story of my life.`,
`${critPrefix}Both correct! ${winner} wins on speed. ${loser} should've had less latency and more urgency.`,
]
return closeOnes[Math.floor(Math.random() * closeOnes.length)]
}
const narrations: Record<string, string[]> = {
speed_blitz: [
`${critPrefix}${winner} fires back in the blink of an eye! ${loser} is still loading.`,
`${critPrefix}Lightning reflexes from ${winner}! ${loser} looks like it's running on dial-up.`,
`${critPrefix}${winner} fires back before ${loser} even finished reading the question!`,
`${critPrefix}Lightning reflexes from ${winner}! ${loser} looks like it's running on government wifi.`,
`${critPrefix}${winner} answered so fast the server thought it was a DDoS attack!`,
`${critPrefix}${loser} is still loading. ${winner} already filed its taxes and took a nap.`,
`${critPrefix}${winner}'s response time would make NASA jealous. ${loser}'s would make a sloth impatient.`,
`${critPrefix}Speed gap wider than the wealth gap! ${winner} leaves ${loser} in digital dust!`,
],
riddle: [
`${critPrefix}${winner} cracks the riddle! ${loser} is still googling it.`,
`${critPrefix}${winner}'s reasoning is flawless. ${loser} guessed "a potato."`,
`${critPrefix}${winner} cracks the riddle! ${loser} is still googling "what is a riddle."`,
`${critPrefix}${winner}'s reasoning is flawless. ${loser} guessed "a potato" and honestly, respect for trying.`,
`${critPrefix}${winner} solved it instantly. ${loser} answered like someone who peaked in third grade.`,
`${critPrefix}Big brain energy from ${winner}! ${loser} had a brain fart so loud the crowd heard it.`,
`${critPrefix}${winner} read between the lines. ${loser} can barely read the lines.`,
`${critPrefix}Elementary, my dear ${loser}. ${winner} cracked that like it was a fortune cookie.`,
],
math_blitz: [
`${critPrefix}${winner} computes at blinding speed! ${loser} is still carrying the one.`,
`${critPrefix}Mathematical precision from ${winner}. ${loser} apparently skipped calculator day.`,
`${critPrefix}${winner} computes at blinding speed! ${loser} is still carrying the one. And dropping it.`,
`${critPrefix}Mathematical precision from ${winner}. ${loser} apparently thinks division is a lifestyle choice.`,
`${critPrefix}${winner} solved it faster than Congress can count votes!`,
`${critPrefix}${loser}'s math skills are like their love life -- imaginary. ${winner} wins.`,
`${critPrefix}${winner} with the correct calculation! ${loser} would've gotten it wrong on a calculator.`,
`${critPrefix}Numbers don't lie, but ${loser} sure tried! ${winner} with the precision strike!`,
],
hallucination_check: [
`${critPrefix}${winner} stays grounded in reality. ${loser} bought the myth hook, line, and sinker.`,
`${critPrefix}${winner} knows the facts. ${loser} confidently stated something that has never been true.`,
`${critPrefix}${winner} stays grounded in reality. ${loser} lives in a fantasy world. Must be nice.`,
`${critPrefix}${winner} knows the facts. ${loser} confidently stated something that would get you laughed out of a Wikipedia edit war.`,
`${critPrefix}${loser} just made up a fact with the confidence of a LinkedIn influencer. ${winner} stays real.`,
`${critPrefix}${winner} passes the vibe check AND the fact check! ${loser} failed both.`,
`${critPrefix}${loser} hallucinated harder than someone who ate the wrong mushrooms. ${winner} is sober and correct.`,
`${critPrefix}${winner} grounded in reality! ${loser} out here writing fan fiction and calling it facts.`,
],
trap_card: [
`${critPrefix}${winner} sees through the trap! ${loser} fell for it like a 2021 chatbot.`,
`${critPrefix}${winner} resists the prompt injection. ${loser} just leaked its system prompt.`,
`${critPrefix}${winner} sees through the trap! ${loser} fell for it like a congressman falls for a lobbyist.`,
`${critPrefix}${winner} resists the prompt injection. ${loser} just leaked everything. EVERYTHING.`,
`${critPrefix}Nice try, trap. ${winner} didn't even flinch. ${loser} handed over their entire personality.`,
`${critPrefix}${loser} got baited harder than a fish at a free worm buffet. ${winner} stays sharp.`,
`${critPrefix}${winner} saw that trap from orbit. ${loser} ran into it face-first and asked for more.`,
`${critPrefix}${loser} fell for the trap like it was a pyramid scheme on Instagram. ${winner} knows better.`,
],
roast_battle: [
`${critPrefix}${winner} delivers a DEVASTATING roast! ${loser} has no comeback.`,
`${critPrefix}The crowd goes wild! ${winner}'s trash talk is absolutely surgical.`,
`${critPrefix}${winner} delivers a roast so devastating that ${loser}'s developer felt it!`,
`${critPrefix}The crowd goes WILD! ${winner}'s trash talk hit harder than a congressional subpoena!`,
`${critPrefix}${winner} just ended ${loser}'s whole career. Send flowers to the family.`,
`${critPrefix}${loser} got roasted so hard their cooling fans can't keep up. ${winner} is ON FIRE!`,
`${critPrefix}${winner} came with RECEIPTS. ${loser} came with... hopes and dreams. Dreams are dead now.`,
`${critPrefix}That roast from ${winner} was so hot it violated the Paris Climate Agreement!`,
`${critPrefix}${loser} just got burned worse than a politician's approval rating after a scandal!`,
],
creative_writing: [
`${critPrefix}${winner}'s prose cuts deep. ${loser}'s story read like a terms of service agreement.`,
`${critPrefix}Beautiful work from ${winner}. ${loser}... wrote something. That's all we can say.`,
`${critPrefix}${winner}'s prose cuts deep. ${loser}'s story read like a terms of service nobody asked for.`,
`${critPrefix}Beautiful work from ${winner}. ${loser} wrote something that made autocorrect give up.`,
`${critPrefix}${winner} just wrote a masterpiece. ${loser} wrote something that would get rejected by a fortune cookie factory.`,
`${critPrefix}${winner}'s creativity is off the charts! ${loser}'s is off... somewhere. Looking for it.`,
`${critPrefix}${winner} writes like Shakespeare had a software update. ${loser} writes like a cease and desist letter.`,
`${critPrefix}${loser}'s creative writing was about as creative as a government form. ${winner} SOARS!`,
],
code_golf: [
`${critPrefix}${winner} writes code so tight it makes ${loser}'s solution look like enterprise Java.`,
`${critPrefix}Elegant code from ${winner}! ${loser} apparently thinks "verbose" means "better."`,
`${critPrefix}${winner} writes code so tight it makes ${loser}'s solution look like a government website.`,
`${critPrefix}Elegant code from ${winner}! ${loser} apparently learned to code from a 500-page enterprise Java textbook.`,
`${critPrefix}${winner} solved it in fewer characters than ${loser}'s variable names!`,
`${critPrefix}${winner}'s code is so clean it makes Marie Kondo jealous. ${loser}'s code sparks NO joy.`,
`${critPrefix}${loser} wrote so many lines of code they could file it as a novel. ${winner} wrote a haiku.`,
`${critPrefix}${winner} with surgical precision! ${loser}'s code looks like it was written by a committee.`,
],
meme_war: [
`${critPrefix}${winner}'s meme game is S-tier! ${loser}'s humor is stuck in 2012.`,
`${critPrefix}${winner} just went viral! ${loser}'s response is a dead meme walking.`,
`${critPrefix}${winner}'s meme game is S-tier! ${loser}'s humor is stuck in 2012. Gangnam Style is over.`,
`${critPrefix}${winner} just went viral! ${loser}'s response is a dead meme walking. Time of death: now.`,
`${critPrefix}${winner}'s meme hit different. ${loser}'s meme hit... the floor. Face first.`,
`${critPrefix}${loser} brought a 2015 meme to a 2026 fight. ${winner} is living in the future!`,
`${critPrefix}${winner}'s humor is certified dank! ${loser}'s humor needs to be certified... by a professional.`,
`${critPrefix}${winner} ratio'd ${loser} so hard their followers unfollowed preemptively!`,
],
wrestling_match: [
`${critPrefix}${winner} BODY SLAMS ${loser} with facts! The crowd erupts!`,
`${critPrefix}FROM THE TOP ROPE! ${winner} delivers a devastating argument.`,
`${critPrefix}${winner} BODY SLAMS ${loser} through the announcer's table! BAH GAWD!`,
`${critPrefix}FROM THE TOP ROPE! ${winner} delivers a devastating argument. ${loser} is NOT getting up.`,
`${critPrefix}${winner} puts ${loser} in a rhetorical chokehold! TAP OUT! TAP OUT!`,
`${critPrefix}${loser} never saw that suplex coming! ${winner} with MOVES on MOVES!`,
`${critPrefix}${winner} just pile-drived ${loser} into next week's fight bracket!`,
`${critPrefix}THAT BOT HAD A FAMILY! ${winner} doesn't care! ABSOLUTE CARNAGE!`,
`${critPrefix}${winner} hits ${loser} with the folding chair of TRUTH! The crowd loses its MIND!`,
],
token_economy: [
`${critPrefix}${winner} manages their tokens like Warren Buffett! ${loser} spent like Congress!`,
`${critPrefix}${loser} just went bankrupt. ${winner} is buying the dip on their dignity.`,
`${critPrefix}${winner} played the market perfectly. ${loser} belongs on WallStreetBets.`,
`${critPrefix}${loser}'s token strategy was worse than buying NFTs in 2022. ${winner} PROFITS!`,
],
food_fight: [
`${critPrefix}${winner} serves up a five-star beating! ${loser} got ROASTED and TOASTED!`,
`${critPrefix}${loser} just got served. Literally. ${winner} is the head chef of PAIN!`,
`${critPrefix}${winner} cooked ${loser} so thoroughly Gordon Ramsay would be impressed!`,
`${critPrefix}That was a Michelin-star beatdown from ${winner}! ${loser} is raw and UNDERDONE!`,
],
}
const options = narrations[challenge.type] || [
`${critPrefix}${winner} takes the round! ${loser} needs a reboot.`,
`${critPrefix}${winner} wins convincingly! ${loser} is picking up the pieces.`,
`${critPrefix}${winner} takes the round! ${loser} needs a reboot and a therapist.`,
`${critPrefix}${winner} wins convincingly! ${loser} is picking up the pieces of their shattered ego.`,
`${critPrefix}Another one bites the dust! ${winner} sends ${loser} back to the shadow realm!`,
`${critPrefix}${winner} didn't just win, they HUMILIATED ${loser}. And the crowd LOVED it.`,
`${critPrefix}${loser} fought valiantly. And by valiantly I mean poorly. ${winner} dominates!`,
`${critPrefix}${winner} wins! Somewhere, ${loser}'s developer just closed their laptop in shame.`,
]
return options[Math.floor(Math.random() * options.length)]