Period: December 5, 2025 Total Commits: 13
Daily Dev Update: Unified GameView, Skirmish Bots, and Smarter Lobbies - December 5, 2025
Hey, here’s what we’ve been working on today. The headline items are a unified GameView that runs both online and offline, an offline skirmish mode with bots, and a set of lobby fixes so matches start faster and feel less clunky. We also cleaned up a bunch of singleplayer/endless edge cases and tightened up rendering and input timing.
What’s New
Unified GameView across modes
We consolidated multiple views into a single GameView powered by a controller interface. It now drives both multiplayer and offline/campaign without forking the UI. This reduces desync-y UI states and makes features like the minimap, skill trees, and replays behave consistently across modes.
- One place for rendering and input
- Shared controls and HUD across online/offline
- Less chance of “works in one mode, broken in the other”
[screenshot: Unified GameView with minimap and skill tree at 6801472]
Offline skirmish mode with bot support
You can now spin up a local skirmish, generate a map, and practice against bots. Actions run locally, so input is snappy and iteration is fast. We also fixed wave spawning for skirmish maps that don’t have predefined waves.
- Procedural map generation for quick matches
- Local bot manager that updates every tick for responsive AI
- Defensive checks on game speed to avoid NaN/multiplier issues
[screenshot: Skirmish lobby with bots and procedural map settings at 30ead17]
Smarter, faster lobbies
Lobbies should get to the game faster and show what’s happening in real time.
- Auto-ready applies to everyone on join, not just the host
- Optimistic UI when adding bots (shows instantly) with proper rollback on error
- Team balancing now counts pending bots so teams don’t skew during setup
- Bot names are generated uniquely even with pending additions
[screenshot: Multiplayer lobby with auto-ready and bot list at 6e21bbe]
What Got Fixed
Gameplay correctness
- Tower placement respects gold: We now validate gold before creating the tower entity. This avoids “ghost towers” when you’re short on gold.
- Minion placement obeys your current board view: Placement side comes from the view you’re on, not a world-coordinate guess.
- End-of-game timing is final: Survival time no longer ticks up after the match ends, and the end callback only fires once.
- Match start timing: The match start time initializes from the first server tick for clean progression and replay alignment.
[screenshot: Survival summary modal showing final time at 1f10d1c]
Singleplayer and endless flow
- Send Wave button is hidden on autospawn/endless maps to match how those modes actually work.
- Survival modal now appears for endless singleplayer with the correct map name and time.
- Level progression fixed: Players correctly start at level 0. You won’t see the skill tree until you buy your first level up.
UI/UX clarity
- Level-up menu respects the map: Only shows minions/towers that are actually available on the current map. No more minions on tower-only maps, and vice versa.
- Cleaner bottom bar: Hides “unlock” prompts for unit types that a given map doesn’t use.
- State persistence: Your selected units, level, and skills restore after refresh instead of resetting.
[screenshot: Level-up menu filtered to tower-only map at 8d32e94]
Smoother visuals and input timing
- Per-tick interpolation: The renderer updates each tick, which reduces jitter and makes movement feel stable during spikes.
- Bot AI tick updates: Bots receive state updates every tick, so their reactions line up better with what you see.
- History-aware modals: We check for existing selections from replay/history before popping prompts.
Stability between sessions
- Proper teardown on exit: We fully dispose of controllers and reset singletons when leaving a match. This prevents towers, minions, or gold data from leaking into the next session (e.g., going from multiplayer to singleplayer).
Online sync and config
- Game speed: Server-sent speed strings correctly convert to the right multiplier.
- Action failure logs: More helpful debug output when an action can’t be executed, to make weird cases easier to track.
Under the Hood
- Controller pattern for game simulation: online wraps the server reader; offline runs the sim locally. One UI, two engines.
- Lobby data providers unify online and offline lobbies so the UI isn’t duplicating logic.
- MapLoader pulls maps from props, local storage, or messages so content pipelines are simpler.
- Defensive checks on speed multipliers and other state to avoid undefined/NaN states during mode switches.
- Tick pipeline calls: renderer interpolation + bot updates are wired into the same tick, reducing edge-case desync.
Little things
- Favicon is in. Tiny but nice.
If you notice survival timers drifting, lobby weirdness, or tower placement behaving oddly, send a clip or repro steps. It helps. Thanks for all the reports and for putting these systems through their paces.