← Devlog

My best-written characters were silent when it mattered

My AI-CEO bosses got one great intro line, then crossed the whole board mute. The fix was ~100 lines, almost all of it writing — because the feature was already built, twice, and I nearly missed it.

June 26, 2026 devlogjuicewriting

Overserved is a satire about the AI industry. The boss fights are the punchlines — each titan is a caricature of a real AI CEO marching across your funnel trying to wreck your towers. Sana Alterman announcing AGI. Long Fang bragging about a price war. The Rogue begging you to switch sides.

Every one gets a big “TITAN APPROACHES” card with a killer line. Then they shut up and walk the entire board in silence. The best-written characters in the game, mute exactly when you’re staring at them. Free comedy, dropped on the floor.

A playtester poked it: “check if the bosses talk while they walk — might be a good add-on.” They don’t. So I went to make them.

The instinct that was wrong

The instinct is: build a speech system. New module, new bubbles, new timers, the works. I started sketching it and got that itchy feeling you get right before you reinvent something you already own.

Because the game already had the bubble. The Chatbot tower — one of your defenses — pops little reply bubbles: white, rounded, tiny tail, floats up and fades, with a global throttle so they don’t spam the screen. And the bosses already had a heartbeat: every few seconds they fire a sabotage ability, and at that instant the game already knows which boss this is and where it’s standing.

So the “feature” wasn’t a system. It was: take the existing bubble, give it an evil paint job, and hook it to two things that already fire on their own. That reframe is the whole post. The hard win in a feature is usually spotting that 90% of it already exists, wearing a different name — here a chat reply was a taunt with the wrong palette, and an ability cooldown was a dialogue cue. New code is a cost; reused code is leverage you’ve already paid for.

Making it look like menace, not UI

First call was visual, and it’s a real trap. If the boss bubble looked like the chat bubble, players would read it as interface — a tooltip — not a character talking. UI and diegetic speech have to be legible apart at a glance, or the speech stops feeling like the world.

So: same shape, inverted everything. Dark oxblood fill instead of white. Gold border instead of cyan. Italic gold text. Same silhouette, opposite palette — your brain files it under the enemy is speaking with no label, because you’re reusing the shape it already learned from the friendly bubble and flipping the only thing that carries tone. Ten minutes of work doing most of the job.

One stream felt dead. Two felt alive.

Then timing, which is where it got interesting.

Tie taunts only to the sabotage abilities, and it’s too sparse — multi-second silences between lines, mute all over again. Run a plain chatter timer instead, and the boss monologues cheerfully through the moment it nukes your best tower, oblivious to its own crime. One channel can be alive or reactive. It can’t be both.

So I ran both, on two clocks. Ambient persona chatter ticks on its own rhythm, keeping the boss alive between events. The instant a sabotage lands, a sharp themed jab cuts in. The one line of glue that matters: when an ability speaks, it resets the ambient clock. Skip that and a jab and a persona line stack into two bubbles fighting for the same head. Reset it, and they take turns — ambient fills the gaps, jabs punctuate the hits. That’s the general shape of believable reactivity: a baseline loop for presence, an event hook for response, and one arbitration rule so they never talk over each other.

The part that was really the job

Here’s what nobody warns you about “give the bosses a voice”: almost none of it is code. It’s writing.

I wrote two pools of lines, keyed differently for a reason. One per titan’s character — the stuff only they would say: Sana announcing AGI for the hundredth time, Long Fang halving the price live “from the third row,” the Rogue asking you to defect. The other pool is themed to the sabotage — “Alignment audit. Your best tower: offline.” — and shared across bosses, because the abilities are shared. Voice belongs to the speaker; event lines belong to the event. Splitting the pools on that axis is why one shared line never sounds wrong in anyone’s mouth.

And I pulled every line straight from the personas and story beats I’d already written months ago, so the bosses sound like themselves, not like generic taunt #4. That sourcing is the whole reason it lands — taunts written cold would’ve been filler; taunts mined from established character are payoff. The plumbing was a quiet afternoon. The voice pool was the feature.

What stuck

  • Look for the second skin before you build the system. “Bosses talk” sounded like infrastructure. It was a restyle of one existing thing plus two hooks I already had. Audit what fires on its own before you write anything that fires.
  • Two cadences beat one. A baseline loop reads as alive; an event hook reads as reactive. Run both, and add the one rule — reset the loop on an event — that stops them colliding.
  • Make diegetic speech look unlike UI on purpose. Reuse the learned shape, invert the one channel that carries tone. No label needed.
  • The leverage was the writing. The hard part of a “feature” is often the content, and the best content was already sitting in files I wrote months ago. Source the voice from canon and it sounds like the character; invent it fresh and it sounds like filler.

The intro card used to set the character. Now the whole walk is the character. The titans don’t approach in silence anymore — which, honestly, is exactly right for the people they’re based on.