Hey — here’s what we worked on today. The focus was getting procedural road maps to play cleanly in PvP, making bots actually use the real map, and killing a few nasty desyncs and worker leaks along the way.
Period: November 2, 2025
Total Commits: 22
What’s New
Road-generated maps play better
We tightened up castle connectivity on procedural road maps while keeping generation reliable.
- Main castles are guaranteed at least one solid road connection (we still aim for two+).
- Non-main castles now reliably get at least one connected side.
- Late-stage connectors use a relaxed pathfinding mode to make the last links in tight spaces without wrecking overall quality.
- Roads now render underneath every castle for a cleaner look.
Gameplay impact:
- On maps with roads, you can now place towers anywhere (except spawn areas, castles, and road tiles unless the tower builds on path). This keeps the strategic options open without creating hard blocks.
- Pathfinding caches now refresh when roads are set, so minions stay on the network instead of wandering off-road.
[screenshot: castle hub integrated into road network at 22162c4]
[screenshot: tower placement grid with adjacency hidden on road map at cafe5cd]
Bots now understand the map
Bots were still living in the “29x15 left-side spawn” era. They’re not anymore.
- Bots use real map dimensions from the server (no more out-of-bounds placements).
- Spawn areas can sit on any side (or multiple); bots detect and use all of them.
- Castle positions come from map data, not hardcoded coordinates.
- On road maps, bots consider the full board for placements instead of clustering near castles.
- Builds-on-path towers can be placed on actual road tiles on road maps.
Gameplay impact:
- Practice matches feel more competitive because bots respect the same constraints players do and cover the map more intelligently.
[screenshot: bot spread controlling lanes across a variable-sized map at 52a56c4]
Reliable map generation
We added a safety net for procedural generation.
- If the generator can’t find a valid layout after a bunch of tries, it falls back to pre-verified seeds that meet connectivity rules.
- This removes most of the “map failed to generate” moments at match start.
What Got Fixed
Client and match stability
- Fixed a client refresh issue where opponent spawn markers didn’t appear. Map data is now applied before replaying history, so spawns initialize correctly.
- Prevented duplicate history processing during reconnects. This stops state corruption like double-adding castles.
[screenshot: resynced match showing correct spawn markers after refresh at a54505f]
Road map correctness
- Minions were sometimes “walking off” roads due to stale path caches. Caches are invalidated when roads are applied.
- Tower placement logic on road maps now:
- Allows placements anywhere off-road (no adjacency rule).
- Blocks placements on roads unless the tower explicitly builds on path.
- Skips unnecessary “would this block paths?” checks when roads are active, since routes are pre-defined.
Bot reliability
- Fixed a crash from using SimCore before it existed by deferring setup until the map data arrives, then initializing in the right order.
- Refreshed placement manager after map init so bots actually recognize road maps (they were missing the “hasRoads” flag before).
- Cleaned up castle duplication caused by multiple history deliveries by clearing and re-initializing cleanly.
Dev ergonomics
- Shutting down the dev server now properly terminates worker processes and bots, avoiding orphaned CPU-eaters.
Under the Hood
Validator and pathfinding rules
- Connectivity rules are now realistic: they still require full reachability, but accept minimum-viable connections when the layout is tight.
- Late connections use a “no cluster penalty” mode to make necessary links in cramped spaces while earlier phases keep the map neat.
- We keep attempting castle-side connections a bit longer to increase the odds of hitting desired coverage without stalling the generator.
Performance-minded checks
- When roads are active, we short-circuit path-blocking checks during placement. This avoids expensive validations that can’t change the outcome on a roads-only route anyway.
Testing parity for roads
- We built a side-by-side harness to compare the original local road generator with the shared in-game implementation. It helps us confirm what you play is what we test.
TL;DR
- Better road connectivity and visuals.
- Bots use real map data and place smarter.
- Fewer desyncs and out-of-bounds errors.
- Map generation falls back to known-good seeds when RNG fights us.
- Cleaner shutdowns and faster, saner validations.
If you notice oddities with spawn areas or towers on road maps, send a note with the map size and what you tried. It helps a lot.
[screenshot: late-game lane pressure on a road-heavy layout at 20230a6]