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:
co-authored by
Claude Opus 4.6
parent
559782c8ce
commit
33f08c35b5
+30
-15
@@ -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
@@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user