Period: August 21, 2025 Total Commits: 22
Hey all — today was about getting the match flow to start cleanly, smoothing out the combat loop, and shipping a new tower. Nothing flashy, just making the core PvP loop more reliable.
What’s New
- Shadow Bolt tower
- New magical damage tower with its own projectile and visuals. Converted configs to TypeScript and registered in both tower and bullet systems (12cea06).
- Uses the new rotation/spawn fixes so it actually points the right way and fires from the right spot.
- Expect it to pair well with physical damage towers for mixed damage coverage. Balance is still loose; we’ll tune it with play.
- [screenshot: Shadow Bolt tower firing at 12cea06]
- Manual level purchase + per‑player unlocks
- Leveling is now a manual purchase: Level 2 costs 500g. You choose your own +1 tower and +1 minion per level (8a231ca).
- Initial selection flow: First time in, you pick 2 towers + 2 minions. The modal won’t let you skip (07338a6).
- The Level Up button lives under team gold, pulses green when you can afford it.
- [screenshot: starting unit selection modal at 07338a6]
- Wave start logic
- Waves now wait for both teams to lock in their 2+2. We fixed event routing so SimCore actually sees your selections and starts the countdown when both sides are ready (6386300).
- Sprite/animation improvements
- Dynamic sprite sheet layouts per unit. Blacksmith’s non‑standard sheet now renders correctly (5ff829a).
- [screenshot: blacksmith animation correct frames at 5ff829a]
- Proper tower presentation: scale restored to 4/3 and y‑offset raised 1/8 tile for cleaner placement (b572a54, 71368c6).
- [screenshot: tower scale/offset cleanup on the grid at b572a54]
What Got Fixed
- Combat feel and sync
- Moved to a 30fps continuous simulation with immediate projectile spawns. Towers acquire targets using Euclidean distance and fire without delay (1dfa149).
- Animation sync: attack animations line up with actual firing events; per‑tower animations no longer share state (ca07648, aa8c934).
- Projectile rotation and spawn offsets corrected (add π, convert angle systems, invert Y where needed). Bolts/arrows now fly in the right direction from the right place (4eabeeb, ed94581).
- Damage application lives on the projectile now for clearer ordering and fewer edge cases (24a766e).
- [screenshot: arrows and bolts tracking targets correctly at 4eabeeb]
- Match flow and UI
- Selections → SimCore: SelectLevelUnits events are queued and processed centrally, which fixes the wave countdown not starting (6386300).
- Level purchase display: shows the correct next level and selection counts (Level 1=2+2; Level 2+=1+1). We also re‑fetch level after purchase to keep UI honest (1281f1a, 4b267a0).
- Initial selection modal appears when needed and won’t close during confirmation to avoid double submits (07338a6).
- Rendering correctness
- Entities render on the correct board only — no duplicate minions or stray projectiles (0f70085).
- Deterministic deaths: delta‑time driven cleanup, no more long‑lived dying minions; projectiles bail if their target starts dying (76574d1).
- GameView init guard: stops accidental re‑inits and cleans up better (8610416).
- Economy checks
- Minion spawn assignments now check cost and deduct gold. No assigning units you can’t afford (46e75f1).
- Removed old on‑chain gold reads; gold handling moved client‑side in SimCore to keep the loop responsive (35a5a82, d6d35a6).
- Purchase events still come from the contract; the client updates state in response for consistency (4b267a0).
What’s Still Broken
- Shadow Bolt balance is placeholder. Numbers will likely change as we see how it fits into PvP comps.
- Client‑side gold is faster but we’re watching for edge cases around refreshes and mid‑transaction states. If you see oddities with gold totals after a purchase, ping us with steps.
- Wave start edge cases: late joiners right as teams lock selections could still hiccup. We added a periodic check to mitigate this but we’re keeping an eye on it (6386300).
- Bots and matchmaking didn’t get attention today. Practice is playable but still basic.
Under the Hood
- Tower owns its combat: projectile creation moved from SimCore into the Tower class. Cleaner separation; EntityRegistry is now a singleton for lifecycle management (57be3dd).
- Renderer shows, SimCore simulates: targeting and acquisition logic moved out of rendering so visuals follow truth, not the other way around (1dfa149).
- Sprite pipeline: dynamic layout detection based on actual texture dimensions; UVs computed per asset. This removes a bunch of hardcoded assumptions (5ff829a).
- Event routing: we now queue SelectLevelUnits, tag them with player team, and let SimCore decide when the match can advance (6386300).
What’s Next
- A balance pass on early unlocks and Shadow Bolt’s role so mixed‑damage comps feel meaningful without crowding out basics.
- Tighter validation around economy flow to avoid rare desyncs and clearer feedback when purchases are mid‑confirmation.
- More VFX polish for impacts and death states, now that timing is deterministic.
- Exploring another starter‑friendly tower to round out the Level 1 pool, plus some love for matchmaking flow.
Thanks for the bug reports and clips — they help us chase the weird edge cases faster. If you hit issues with wave starts or gold updates, send repro steps and we’ll dig in.