Period: September 10, 2025 Total Commits: 9
Daily Dev Update: Smoother Fights, Smarter Bots
Hey all — quick one today. We focused on three things: making matches look smooth at 60 FPS, stopping bots from placing invalid towers, and tightening up desync/replay handling.
What’s New
- Bold move for smoothness: entities now render with interpolation between server ticks. The sim still runs at 10Hz for determinism, but visuals update at 60 FPS by drawing slightly behind (up to 100ms) to avoid guessing positions. This removes the “teleporting” feel on minions and projectiles without touching gameplay logic.
- Easier to read fights and kite properly.
- Targeting looks more consistent because motion is continuous.
- No extrapolation, so no rubber-banding visuals.
[screenshot: smoother minion pathing and projectile trails at e823a47]
- Cleaner desync message. If your client goes out of sync, you’ll see a simple “Game Desynced, please refresh.” It’s blunt, but it’s clear, and it gets you back in fast.
[screenshot: desync refresh banner UI at 8e68833]
What Got Fixed
-
Replays and live ticks no longer fight each other.
- Live ticks are buffered during replay and applied after it completes.
- We added checks to ensure ticks are always processed sequentially.
- This removes negative deltaTime spikes that froze movement and caused divergence.
- Spectating and reconnect flows should feel steadier now.
-
Bots won’t try to block all paths with tower placements.
- Path checks now match server rules exactly: same spawn center, and at least one path to any alive castle must remain.
- We also added warnings when bots skip bad spots, which cuts down on those annoying “blocked all paths” rejections.
-
Bots stop processing immediately when a game ends.
- No more post-game tick spam or late actions.
-
Smoother rendering pipeline alignment.
- Renderer uses real time between ticks with a proper onTickProcessed() signal.
- Deprecated methods removed to avoid duplicate updates.
[screenshot: tower placement grid preview showing valid path preserved at 38fc04c]
What’s Still Broken
-
Rare server rejections can still happen if a placement validation happens right as the game state changes (e.g., a castle dies that tick). We’ve added tick stamps everywhere to trace these. If you see a legit spot get rejected, it’s probably that edge timing case. We’re on it.
-
Bot economy edge cases. We found a path where bots could “think” they had more gold than they do during level-ups. We fixed the math (pending spends now count, and the missing getAvailableGold() is in), and we’re tracking it with detailed logs. If you notice bots stalling on upgrades weirdly in practice matches, that’s us watching the data roll in.
Under the Hood
-
One source of truth for path validation.
- Extracted wouldBlockPaths to a shared utility used by both the renderer and bots.
- Removed duplicate/incorrect implementations so client and bot decisions match server rules.
- This consistency is key to preventing invalid placements before they’re even attempted.
-
Visibility into timing problems.
- Added tick numbers to validation logs, server errors, and bot placement attempts.
- Optional debug paths help compare “would block” vs “allowed” outcomes step-by-step.
-
Gold tracking during bot level-ups.
- Implemented getAvailableGold() and proper pendingSpends handling.
- Added before/during/after purchase logging, with tick and gold deltas.
- Goal: no negative gold, no phantom upgrades.
-
Rendering and tick flow cleanup.
- Interpolation factor is now based on actual deltaTime between ticks.
- Removed deprecated onBlockProcessed() to reduce double work.
- Replay buffering avoids timestamp conflicts with live play.
[screenshot: mid-fight skirmish with visibly smoother motion at e823a47]
What’s Next
- Keep tightening path validation edge cases so client and server never disagree.
- Watch the bot economy logs and lock down any remaining negative-gold scenarios.
- Small UI polish passes around placement feedback and network state notices.
As always, thanks for the reports and screenshots. They help us chase down timing bugs way faster. If you hit something odd, note the time and what you were doing — especially around placements and replays — and we’ll dig in.