Period: December 8, 2025 Total Commits: 13
Hey — here’s what we worked on today. The headline is visual variety with a proper custom tileset pipeline, plus a new doodad system that respects both sides of the board and stays out of your way during placements. We also cleaned up a few UI issues and a campaign edge case.
What’s New
Per-board doodads that don’t get in your way
We added decorative doodads to grass tiles and made them board-aware. Each board side seeds its doodads independently, so both players get their own natural scatter without mirroring or weird sync issues. When you place a tower or assign a spawn, any doodads on that tile are cleared immediately. Keeps the board readable.
- Unique seeds per board side for consistent variety without visual advantage
- Event-based cleanup so doodads disappear the moment a tile becomes occupied
- Deterministic placement so what you see stays stable across frames
Custom tilesets across grass, roads, and water
We unified rendering so the game and the editor share the same tileset-driven system. This means the visuals you build in the editor are the visuals you see in-game, one source of truth.
- Weighted grass variants: set percentages per variant to tune the look of fields
- Road variants by connection: multiple looks for the same N/S/E/W patterns, picked deterministically by tile position
- Water with connection logic: edges and corners render correctly based on neighbors
- Texture polish: fixed sprite orientation, added UV insets to prevent seams/bleed
Gameplay impact: more readable edges, less flicker, and variety without losing clarity.
Editor conveniences that carry into play
Map changes feel more immediate now. Base tileset switching updates the canvas in real time, and grass/water/road systems all respond via the same renderer configuration. Doodad configs (variants + spawn chance) live alongside the tileset, so creators control both base tiles and environmental dressing from one place.
What Got Fixed
- Campaign win trigger before first wave: Fixed a case where a single-wave map could declare victory before you pressed “Send Wave.” This now waits until the first wave actually starts.
- Skill tree modal UX:
- Removed a rogue horizontal scrollbar
- Added responsive scaling for different screens/heights
- Tooltip now sticks to your last hovered skill
- Fixed the reopening behavior after buying the first level
[screenshot: cleaned-up skill tree modal UI at c8097b5]
- Road rendering and tileset alignment:
- Roads now reliably use custom tilesets
- Water north/south orientation corrected
- Fallbacks prevent “full sheet” artifacts if a connection is missing
- UV tweaks reduce seams and texture bleeding on all base tiles
Under the Hood
One tileset pipeline for game and editor
We removed duplicate renderers and made tileset config a requirement before any tiles draw. That ensures textures are loaded, materials point to the right sprites, and both tools behave the same.
- Shared Grass/Water/Road renderers
- Required tileset configuration before render
- Safety checks to avoid creating meshes before textures are ready
- Batch water updates and field-based grass creation to cut overhead
Determinism and cleanup
We leaned into deterministic selection (position-based) for road variants and seeded doodads per-board to keep visuals consistent and fair. Event hooks now power doodad removal and board-specific updates, and we’re cleaning up renderer groups on dispose to prevent lingering data.
Notes and Thanks
- If you see doodads sticking around under a newly placed tower, let us know which tile/board side it happened on.
- Thanks to everyone who reported the early campaign victory trigger and the skill tree modal quirks. Those reports helped us track them down quicker.
That’s it for today. More visual consistency, less clutter, and tighter UI. Try it and tell us where it still feels rough.