Daily Dev Update: Income Sync Fix, Pathing Cleanup, and SFX Pass — October 7, 2025
Period: October 7, 2025
Total Commits: 9
Hey—here’s what we’ve been working on. Today’s update focuses on fixing a gold income desync that was throwing off bot matches, tightening up minion pathing so routes are predictable, getting sound effects into a sane place, and making the bots pick better goals. A couple of balance dials moved too.
TL;DR
- Fixed a gold income desync that made bots fall behind when players picked income bonuses
- Minions now move strictly in cardinal directions with a vertical-first bias
- Sound effects added and centralized so you only hear what’s on the board you’re viewing
- Bot priorities are now dynamic and won’t consider actions they can’t take
- Balance: doubled minion-related gold income; level-up health scaling tuned to 2.2x per level
What’s New
-
Sound effects pass (placement, spawns, tower fire, VFX detonate): We added a lightweight SFX layer so actions feel immediate. Tower placements click, spawns thump, and shots have distinct cues. It’s not final mixing, just enough to ground the action and give feedback.
- Sounds are now driven by the renderer, so you only hear the side you’re viewing. No more mirrored stereo chaos across boards.
- We’ve added config types for SFX/Music and consolidated tower configs into a shared location to keep things consistent across client and bots.
- [screenshot: tower placement with new SFX cue at f04fa6f]
- [screenshot: VFX detonation timing aligned with audio at 90c3f78]
-
Clearer level-up income info: The level-up UI now shows the correct income bonus based on the previous level’s cost. For example, Level 2 income is +1 gold/sec, Level 3 is +2, Level 4 is +4. It’s math you can trust from the panel.
- [screenshot: Level Up modal showing accurate income bonus at f04fa6f]
What Got Fixed
-
Income desync in bot games (critical): There was a case where human players selecting an income bonus at level-up got the boost, but bots didn’t recognize it. Over a mid-length match that stacked up to a few hundred gold of difference (we saw ~269 by around tick 3500). Bots now process the same bonus choice, so gold rates align across clients again. Expect bot matches to feel fair and less “why is my eco off?” moving forward.
-
Minion pathing consistency: Minions now choose strictly cardinal movement, prioritizing vertical (north/south) before horizontal (east/west). This removes diagonal threading through tight tower gaps and makes chokepoints behave the way you planned them.
- [screenshot: minions funneling through a vertical choke at 80ef899]
-
Spawn ownership and placement validation: The server now prevents spawn positions from being overwritten. This stops clients from thinking they own a spawn they don’t, which led to weird upgrade expectations and mismatched health values.
-
Gold math clarity on level-ups: Income increases scale off the previous level cost as intended (e.g., Level 2: +1 gold/sec; Level 3: +2; Level 4: +4). The UI and the underlying calculation now agree.
Balance Notes
- Gold flow: We doubled minion-related gold income. Matches breathe a bit more now—more choices, faster pivots, and snappier counterplay. Keep an eye on early pressure; this speeds up the first few minutes.
- Survivability curve: Level-up health scaling is now 2.2x per level (down from 2.5x). The goal is to keep waves threatening without turning into brick walls that only high-penetration builds can answer.
What this means:
- Early gold economy comes online faster, but defenses don’t fall off a cliff.
- Mid-game transitions happen sooner, so you’ll feel timing windows tighten up.
Bot Improvements
- Dynamic priorities: Bots now compute priorities from the current board state—towers, spawns, enemy pressure, and their own “personality.” They also refuse to consider actions they can’t take (e.g., unit types not available right now), which cuts out a bunch of misleading logs and weird saves for units they won’t buy.
- Smarter early game: The system de-emphasizes late-game tower hoarding before you’ve placed a basic defense. Leveling is gated by early board presence, so bots stop rushing upgrades with no teeth on the field.
- Cleaner logs for ownership checks: When evaluating spawns to upgrade, bots log who actually owns the assignment. If it’s not theirs, they skip it and say why. Easier to audit, fewer mystery decisions.
Net result: practice matches feel more human—less random saving, more responsive counter-spawns, and better use of basic towers before scaling.
Under the Hood
-
Renderer-only audio: We pulled sound playback out of entities and into the renderer. That means:
- Sounds only trigger for what you’re looking at (no doubled playbacks)
- Bots don’t attempt to play audio at all
- We track tower firing timestamps and VFX state in one place, which reduced a bunch of edge cases
-
Desync diagnostics: Full-state dumps now include spawn assignments (owner, level, minionId, team). This makes it easier to track why different clients might see different spawn levels or health pools after a match.
-
Shared configs and safer imports: Tower configs live in a shared module now, which prevents drift between client and bots. We also added runtime checks so “browser-only” things don’t get called on the server.
That’s the slice for today. The build should feel cleaner: audio is less noisy, minions take the routes you expect, bots play more like sparring partners, and gold rates line up across the board. If you hit anything odd—especially around income or spawn ownership—send us a note with a timestamp or a replay if you’ve got one.