Daily Dev Update: Matchmaking, Smarter Bots, and Faster Projectiles — September 5, 2025
Period: September 5, 2025
Total Commits: 7
Quick Summary of Commits:
- 23:28: Create client file and add matchmaking to server docs
- 23:21: Fix projectile speed calculations and add monitoring integration
Hey, here’s what we’ve been working on today. The big pieces are real-time matchmaking, smarter bot behavior, and a fix to projectile timing that was making mortars/boulders feel sluggish. Also added event monitoring to help us spot issues faster and made the server shutdown path more reliable.
What’s New
- Matchmaking queues for multiple modes
- 1v1, 2v2, 3v3, and 4v4 queues are live.
- Ready check added with a 30-second window to accept.
- Automatic team assignment and game creation when everyone accepts.
- Re-queue for players who accepted if someone else drops, so you’re not punished for doing the right thing.
- Real-time lobby updates via WebSockets with a simple queue visualization and player slots.
- This is the first pass; it works end-to-end but we’ll keep tightening edge cases and UI polish.
[screenshot: matchmaking lobby with queue visualization at 9aa2cb6]
[screenshot: ready check prompt and player slots at 9aa2cb6]
-
Bot personalities and smarter choices
- 120 unique bot personalities with preferences across minions, towers, leveling, and aggression.
- Unit selection now uses biases by game time and level, so early-game builds look different from late-game pivots.
- Bots can unlock any tower/minion at any level (still controlled by scoring/biases for sanity).
- Personality signals flow into the StrategyManager so decisions line up with a bot’s “style.”
-
Cleaner game flow for bots
- Switched to event-driven game end detection using SimCore’s MatchEnded event. No more polling.
- This helps avoid stale state and gets bots out of matches promptly when things wrap.
What Got Fixed
- Projectile timing and speed
- Fixed deltaTime conversion for mortar and direct projectiles (ms to fixed seconds).
- Removed a double conversion that made boulders move too slowly.
- Added proper fixed-point time conversion in projectile updates so arcs and impacts line up with expectations.
- Impact: mortars feel snappier, and boulder shots reach targets on time without weird slow rolls.
[screenshot: mortar boulder arc and impact timing at 3c0b75c]
-
Boulder configuration
- Added faceTarget and targetsLocation to boulder bullets to match intended mortar-style behavior.
- Helps with visual clarity and hit reliability when targets move.
-
Bot tower placement conflicts
- Fixed a mismatch where the team was passed as a string instead of an enum to SimCore.
- That bug stopped grids from marking tiles as occupied, so bots sometimes tried to build on the same spots.
- PlacementManager now checks only the own team’s grid, which is what we wanted from the start.
[screenshot: updated tower placement grid showing occupied tiles at 1e5ffc3]
What’s Still Broken
-
Matchmaking edge cases
- If multiple players disconnect right as ready checks trigger, the re-queue timing can feel a bit abrupt. We’re smoothing that out.
- We’re also watching party-to-queue flows for future team queuing support, not in yet.
-
Projectile corner cases
- After the timing fix, we’re tracking rare overshoot/undershoot reports on very short-range targets. Might be tied to target swapping mid-flight.
-
Bot personality extremes
- Some personalities lean hard into niche builds. Fun, but occasionally gold-inefficient. We’ll tune scoring to prevent self-sabotage.
Under the Hood
-
Monitoring and event ingestion
- Bot gold events tracked (income, spending, bounties) with timestamps.
- Player action monitoring wired into game workers.
- A new monitoring service and REST endpoints for event ingestion.
- This gives us better visibility into economy spikes, bot stalls, and odd match pacing.
-
Server stability and shutdown sequence
- Redis connection checks before cleanup to avoid “Connection is closed” errors.
- Reordered shutdown to stop lobby service before closing Redis.
- Cleanup intervals are now tracked and cleared reliably.
- Redis data cleanup is disabled for now so we can preserve match data for replays later.
-
Dev workflow
- Default server script no longer auto-restarts on file changes.
- Added a separate dev:watch script that does auto-restart for local development. Less surprise behavior in production scripts.
Why these changes matter
- PvP reliability: Ready checks + re-queue makes failed accepts less punishing while keeping queues moving.
- Strategy depth: Bot biases and personalities create more varied scrims. Good for practicing against different “styles.”
- Performance feel: Fixing fixed-point deltaTime stops slow-motion boulder shots and restores mortar rhythm, which matters for timing-based defenses.
- Operability: With monitoring, we can catch bad loops and economy bugs faster, which shortens the time from “weird match” to “fixed.”
What’s Next
- Party queue support and clearer state transitions in the lobby (invite → party → queue).
- More UI clarity in matchmaking: countdowns, clearer failure reasons, and better slot status.
- Bot scoring tweaks to prevent over-commitment to low-synergy picks in mid-game.
- First pass at replay viewers once we’re comfortable with the Redis data pipeline.
Thanks for the reports on projectile weirdness and the notes on lobby flow. Keep them coming—screens or short clips help a lot.
[screenshot: multiplayer lobby with real-time updates during queue at ee0b3c6]