Period: October 28, 2025 Total Commits: 25
TowerStorm Daily Dev Update: Community Levels, Campaign QoL, and Smoother Paths
Hey — here’s what we’ve been working on today. The big themes: community levels are now a proper first-class flow in the Reddit app, campaign mode got a few quality-of-life upgrades, and we tightened up minion movement and a bunch of asset/data edge cases. Nothing flashy, just solid progress.
What’s New
-
Community levels on Reddit, end to end
- You can create a map in the editor, share it straight to Reddit, and browse/play community maps from the client.
- The level browser has a Type dropdown (Campaign/Community), a selection flow, and a detail panel with author, score, and upvote ratio.
- Titles are cleaned up for readability and we show descriptions/metadata when you select a level.
- Why: this makes sharing levels actually usable instead of a manual thread hunt.
[screenshot: community levels browser with detail panel at 3756693]
-
Level editor integration and safer UI in Reddit mode
- Added a Share to Reddit flow with a proper modal (no browser prompts).
- Replaced alert/prompt calls with in-app modals so feedback works inside Reddit’s sandbox.
- Success messages now include a clickable link to the post. Exit and test flows are tidy and stay in the same tab.
- Why: the sandbox blocks native dialogs; this keeps the UX consistent and unbreakable.
[screenshot: Share to Reddit modal and success confirmation at 3aab084]
-
Campaign placement rules: freer where it makes sense
- In campaign mode, you can place towers anywhere on valid tiles (still not on roads, spawn areas, or castles).
- The blue map border now resizes dynamically to the actual map size and consistently renders in campaign.
- Multiple spawn areas are supported across rendering, input, and validation.
- Why: campaign maps want puzzle-style freedom; adjacency rules stay in PvP where they create good friction.
[screenshot: campaign map with free tower placement and dynamic border at 5761f3c]
-
Deterministic road generation (for testing and future sync)
- The road generator is now fully seeded. Same seed + config = identical map.
- We also hardened constraints: no roads inside spawn, no 2x2 blobs, no dead-end roads, and guaranteed castle connectivity.
- Why: reproducibility is great for debugging and eventual multiplayer map sync without heavy payloads.
What Got Fixed
-
Minions move smarter and look cleaner
- Diagonal movement is enabled; the old step-by-step wiggle is gone.
- Paths only recalc when a tower actually blocks movement, and they resume forward instead of backtracking.
- Fixed a target switching bug that sometimes dropped paths at bad moments.
- Player impact: waves feel smoother and less jittery, especially on busy maps.
[screenshot: minions moving diagonally along roads at 732bf64]
-
Campaign castle initialization order
- Castles are set up before the initial wave applies, so minions path to the right places from the start.
- This removes early-wave weirdness where units thought they were in a multiplayer layout.
-
Community browser UI polish
- Proper author names, reliable upvote ratios (fallback to N/A when needed), and cleaner titles (no bracket noise).
- Level selection is now explicit: pick a level, then hit Start.
-
Asset paths and missing textures
- Patched Three.js texture loading to respect our asset path helper across environments.
- Fixed road textures and encyclopedic icons breaking in Reddit mode.
- Added a guard against double-prefixing asset paths so we don’t 404 ourselves.
-
Campaign map loading
- All campaign map files now route through the asset path helper, fixing 404s in web/Reddit/Electron setups.
-
Editor navigation cleanup
- Removed an unnecessary redirect screen and sped up navigation with simpler URL handling.
Under the Hood
-
Community level data storage: smaller and more reliable
- Levels are compressed (gzip+base64) for a 70–80% size reduction (e.g., ~3.8KB → ~1.0KB).
- Storage rules:
- Small levels (≤1.5KB compressed): stored in post data for instant reads.
- Larger levels (>1.5KB, ≤10KB compressed): stored in the first comment.
- We removed the legacy plain JSON format and unified on compression. This comfortably supports maps around ~7.5KB original JSON.
- Why: keeps Reddit API calls light and consistent while handling real-world map sizes.
-
Single source of truth for validation
- All campaign map types and validation utilities now live in a shared module used by client, editor, and the Reddit app.
- Less duplication, fewer “works here, fails there” bugs.
-
Logging and bot friendliness
- The game engine uses a pluggable logger instead of raw console calls.
- Console now shows warnings/errors by default while full logs still go to files.
- This keeps dev terminals readable and makes bot runs predictable.
-
Dev tooling
- A new “make dev” command runs auth, server, bots, and client together with prefixed logs and clean shutdown.
- Helpful when you want everything visible in one place without tmux gymnastics.
Notes
- Campaign placement changes apply to campaign only. Multiplayer keeps adjacency rules for balance and strategy.
- If you see a missing texture in the Reddit app, it’s probably a path edge case we didn’t catch. Send a screenshot and the map you were on.
That’s it for today. It’s getting tighter: smoother waves, cleaner UI, and community maps you can actually share and play without fighting the plumbing. Thanks for the reports and playtests — they directly guided a bunch of these fixes.