Period: October 5, 2025
Total Commits: 39
Hey, here’s what we worked on today. The big one is a critical fix to tower placement validation that was breaking games. We also shipped the new level bonus choice system, tightened up bot behavior, and did a pass on UI clarity and performance.
What’s New
Player level bonuses (live)
You now choose a bonus every time you level up (level 2+):
- Health: +25% minion health per level
- Damage: +25% tower damage per level
- Income: +(level-1) gold/sec per level
These bonuses are tracked per-player and applied directly to your towers/minions and team income. The Level Up modal gives clear feedback, and the Info Panel shows where the bonuses are coming from.
[screenshot: Level Up modal with three bonus choices at 48f76ad]
HUD and UI updates
- Bottom bar redesign with centered gold and a clearer Level Up button (pulses when available)
- Minions now appear before towers in player unit lists for faster reads
- “Return Home” button on the victory/defeat screen
- Castle health bars are always visible
- Wider Join Game list with better sizing and centering
[screenshot: redesigned bottom bar and HUD during a match at bed8c82]
[screenshot: victory screen with Return Home button at ed74d0e]
Clearer multiplayer state
- If a player disconnects, their panel shows a subtle overlay with a warning icon
- Overlay disappears automatically when they reconnect
[screenshot: disconnect overlay on player panel during a match at ae6b6b1]
Combat and economy tuning
- Base minion health increased by 50%
- Minion health scaling per player level increased to 1.5x
- Minion damage now scales with spawn level (level 0 = 1x, level 1 = 2x, etc.)
- Minion bounty scales 1.8x per spawn level
These changes make pushes feel meatier and make killing higher-level minions more rewarding.
What Got Fixed
Critical: tower placement validation
We fixed an inverted pathfinding validation check that was letting you (and bots) place towers that cut off paths to some castles. The server now correctly validates that all castles remain reachable before allowing a placement. This:
- Stops path-blocking placements
- Keeps client and server in sync on what’s valid
- Prevents minions from getting stuck and freezing the game
Pathfinding behavior
- Prioritize Y-direction a bit more to reduce “jagged” diagonal movement
- Properly handle towers that are allowed to be built on the path (wind, spikes)
- Minions can path “through” castles when appropriate to reach other targets
Ghost actions cleanup
If a placement is rejected by the server, the client now removes any temporary entities and refunds your gold automatically. No more leftover “ghost” towers or minions.
Bots: smarter and more consistent
- Bots now select level bonuses based on playstyle and current composition
- Priorities use smooth gradients instead of hard thresholds, so they keep placing minions over time instead of stalling at 5
- Fixed level tracking so bots use the correct leveling costs
- Corrected spawn ownership lookups so bots only upgrade spawns that actually exist on the right board
Visual clarity and correctness
- Stunned minions freeze their animations instead of continuing to wiggle
- Spawn tooltips and live minions now display the exact same health values
Under the Hood
Shared, authoritative validation
We moved tower placement/path checks into a shared utility used by both client and server. Both sides now run the same A* pathfinding and the same “all castles reachable” rule. This eliminated a bunch of edge-case desyncs.
Render and performance wins
- Spawn “star” indicators now use instanced meshes instead of spawning thousands of unique meshes every second. Same look, one draw call, no GPU leak.
- Increased max game history to cover longer matches
- Session handling simplified so you don’t get logged out mid-day
Build, size, and reliability
- Extracted shared tower configs and types so the server no longer pulls in rendering code; server bundle is much smaller
- WebSocket stability improved via better load balancer configuration
- Frontend is now served via a global CDN for faster asset delivery; backend stays put
Game flow resilience
- End-of-game handling waits for all connected players to report before shutting down, which helps avoid timing-related weirdness
That’s the snapshot for today. If you notice any odd placements getting through or bot behaviors that seem off, let us know—those reports help us zero in on the rough edges quickly.