Every Tower Grew a Face and the Worm Got a Name
Since the enemy that blinks and the road that forks the game stopped looking like a spritesheet held together with tape. Towers got real art, enemies got real art, the Tesla got a whole new way to hurt things, one boss got a name and a body made of segments, and the enemies learned to introduce themselves when you poke them. Five days, cool stuff first.
The Tesla became a star
The Tesla used to fire chain lightning: one bolt that hopped enemy to enemy, losing power at each jump. It was fine, but it was just a worse version of everything else. Now it is a star zapper. Each shot strikes several enemies in range at once, one straight bolt from the tower to each, and the number of targets climbs with level (3 at level 1, up to 10 at level 100).
The interesting part is how the damage splits. A naive "divide by targets" makes a leveled Tesla feel worse the more it hits, which is backwards. So the split gets more generous with level. At low level the damage is shared evenly across the struck enemies; as the tower levels up a splitEfficiency value slides from 0 to 1, and at the top end every target takes the full base damage with no penalty at all. A single target always eats the full hit. It never exceeds base. The result is a tower that starts as a crowd-tickler and grows into a room-clearer.
On top of that, every enemy the star hits gets stunned in place, briefly at level 1 and for almost two full seconds at level 100. Stun is its own proper effect now, with a twist: each enemy can only be re-stunned after a two-second cooldown, so you cannot perma-freeze a target by spamming zaps. Within that window the bolts still deal damage, they just do not re-freeze. Bosses ignore stun entirely. That per-enemy "you already resisted this recently" model is the seed for how poison, burn and frost will eventually work too.
And it looks like a jolt now. The Tesla has dedicated art with a firing frame, and the bolt is a 16-frame animated sprite that stretches from the tower to each struck enemy, aspect ratio preserved, cycling over a few hundred milliseconds. A killed enemy still anchors its bolt at the spot it died, so a lethal shot flashes properly instead of the bolt vanishing with the corpse. That last one was a subtle fix: the effect is re-derived from the frame before the shot resolved, so dead targets still get their lightning.
Every tower grew a face
Up to now most towers shared one placeholder tilesheet: a base and a little turret. Now there is a data-driven per-tower sprite system, and the Cannon, Gun, Sniper, Frost, Ricochet and Tesla all have their own dedicated art. Each is a 128x64 sheet with an idle frame and a firing frame (the firing frame shows for 250ms after each shot) plus its own projectile sprite. The whole tower rotates to aim at its target, except the ones marked fixed (Frost and Tesla) which sit still and never spin, because a rotating frost cannon looked ridiculous.
Getting the art to aim correctly meant an angleOffset per sprite: the art is drawn facing right, and a -PI/2 offset lines "right" up with wherever the tower is actually pointing. Towers without dedicated art still fall back to the old placeholder, so nothing broke while the set filled in.
The enemies got the same treatment. The hopper has a directional sheet (a frame per facing) and the renderer already picked the row from movement direction, so wiring it up needed zero draw changes, just the sheet and a manifest entry. The berserker got two sheets, calm and enraged, and swaps to the angry one the instant it drops below its rage threshold, reusing the existing isBerserk check. There was the usual comedy of getting frame order right (the sheets are down/right/left/up, not the down/left/right/up I assumed, so the hopper briefly moon-walked).
M. Nhoca, a worm with a name
The Wyrm boss got reworked into a segmented worm with head and body art, and a name: M. Nhoca. The front segment renders with the head sheet, every other segment with the body sheet, and the old white outline that used to mark the damageable segment is gone, the art carries that read now. Only the head takes damage, but the body segments stay targetable so your towers still aim and fire at the whole worm instead of ignoring most of it.
M. Nhoca is also immune to every effect: frost, poison, confusion, fire, stun, all of it slides off. That is a new effectImmune flag on the enemy definition, and it exists specifically so a boss can be a pure damage-race instead of something you cheese with a slow field. Bosses now carry an optional display name too, so the HUD health bar and the bestiary can call it M. Nhoca instead of "wyrm".
The Aegis, a boss that punishes spam
The other new boss is the Golden Shield, the Aegis, and it is the most interesting enemy in the game to build against because it inverts the whole logic of DPS. Most of the time in a tower defense, more hits per second is strictly better. The Aegis makes that a trap. Every time it takes a hit, it raises a shield for one full second and blocks all incoming damage during that window, damage-over-time included. Only the single hardest hit each second actually lands. A wall of fast, weak towers pours fire into it and does almost nothing, because the first pellet raises the shield and every pellet after it that second bounces off.
So the Aegis is the exact mirror of the Juggernaut. The Juggernaut caps each hit at a tiny fraction of its huge HP pool, so it wants to be tickled to death by fast weak towers and shrugs off big single shots. The Aegis wants the opposite: it eats one hit per second no matter what, so the answer is to make that one hit enormous. Stack Snipers, Mortars and Cannons, the biggest single-shot sources you have, and every second that connects removes a huge chunk. Bring a machine gun and you are just feeding its shield.
There is a lovely tell built into its movement. The Aegis rushes forward while exposed and crawls while shielded (a quarter speed the instant its shield is up), so the boss visibly lurches: a burst of speed, a hit, then it hunkers down and slows to a crawl for a second before sprinting again. You can read its shield state from across the map just by watching how fast it is moving. It has a deep 10,000 HP pool and, like the other bosses, pops a fountain of twenty XP orbs when it finally goes down. A pulsing golden bubble shows the shield window while it is active. Between the Juggernaut and the Aegis the game now has two bosses that punish opposite mistakes, which is exactly the kind of "there is no single best tower" pressure I want.
The ricochet stopped being polite
The ricochet went through two reworks in a day. The first version bounced backward along the path with a 1/n damage falloff. Playtesting said backward-only was not fun, so now bounces pick a random enemy in any direction within range, never hitting the same enemy twice, and the damage ramps up instead of down: each bounce hits harder than the last (1x, 1.5x, 2x, and so on). The tower is deliberately weak on its first hit; chaining bounces is the whole payoff. The number of bounces scales with level, and its fractional part is the probability of one extra bounce, resolved with a single seeded dice roll per shot.
You pick your opener now
Runs no longer hand you a free gun. At the start of a run you get an opening tower pick: the same three-option screen as the in-game tower queue, so you choose your first tower and can build toward different opening combos instead of always starting gun-first. The toolbar sits empty until you pick. Co-op grants every player the same opening pick, including anyone who joins mid-run.
And placing is snappier. Clicking a tower card you own now arms placement immediately, no PLACE button, no menu sliding over the map. Clicking a card you have zero of opens the info and aim menu instead, so the button does the obvious thing in both cases.
Enemies that talk back
This one is pure joy-of-clicking. Click any enemy and it pops a white speech bubble that follows it around and introduces itself: its type, the wave it spawned on, its max and current HP, the towers that have hit it, and how far it still has to go. Click anywhere else to close it. The "who hit me" part is tracked as a bitmask on the enemy, set in the shared damage pipeline and replicated over co-op, so it is honest even online.
Luck, reworked into two halves
Luck stopped being a mystery stat and became two upgrades that feed one effect: raising your level-up card rarity. There is a permanent one (Fortune's Blessing) and an in-run one (Lucky Star), and the combined luck is the average of the two, so you only reach guaranteed-legendary when both are maxed. As luck climbs, the rarity odds drain upward through the tiers in three clean phases: common empties out first, then rare, then epic, until every card offered is legendary. The whole curve is continuous and always sums to a valid set of odds.
The quality-of-life pile
The rest, briefly:
- Two AUTO checkboxes. One tucked into the next-wave button auto-queues the following wave the instant its cooldown elapses. One on the tower-queue button auto-opens the pick screen the moment a tower is available (on by default). Both sync over co-op and run headless on the server, and both can be toggled any time, even with an empty queue.
- The inspect panel became a real table. It used to grow upward with a bottom block pinned by magic offsets, so a tower with several powers produced text-over-text. It is now a proper two-column table (labels left, values right) with a height that derives from how many stats it actually has, shared between the clicked-tower menu and the toolbar type menu.
- Special stats are visible everywhere. Each tower's powers (slow, burn, poison, stun, execute threshold, ricochet bounces, aura buffs) now appear on both the upgrade card and the inspect panel, level-scaled, so you can see exactly what a pick changes.
- The UI stopped being blurry on high-resolution and Windows-scaled displays: the canvas is now sized to the window's real physical pixel span instead of a fixed 1080p the browser upscaled. The film grain and chromatic aberration post-effects got dialed to zero in the same pass.
- The audio went procedural. All the gameplay sounds (per-tower shots, impacts, enemy death, XP pickup, life lost) moved off bundled wav files onto procedural ZzFX arrays, and soft hover and click feedback got added to the UI.
Five days, and the game finally looks like itself: towers with faces, a Tesla that clears rooms, a worm with a name, and enemies that say hello when you click them. Back to the board.