One More Night: 19-Issue Stability Patch
Today we tore through the backlog. 19 GitHub issues closed, touching balance, boss mechanics, UI, memory management, and quality of life. Here’s what shipped and the thinking behind each change.
Late-Game Speed Was Out of Control
Zombie speed scaled exponentially — 1.05^(wave-1) — with no ceiling. By wave 30 enemies were moving at 4x base speed, fast enough to phase through collision boxes on low-FPS machines. We added a two-tier cap: a soft cap at wave 16 that switches from exponential to logarithmic growth, plus a hard ceiling at 3x the cap value. Late-game difficulty now comes from enemy count and type variety, not undodgeable speed.
All Enemy Types by Night 5
Players weren’t seeing the full roster until night 7. We shifted the spawn schedule forward: Axe zombies at wave 2, Runners and Big zombies at wave 3, Spitters at wave 5. The first few nights now introduce new threats faster, which makes early runs more interesting and teaches players the enemy vocabulary before the first boss at night 5.
Spewer Puddles Actually Clean Up Now
The Spewer boss sprays toxic vomit blobs that land as lingering damage puddles. Problem: those puddles were fire-and-forget — no tracking, no cleanup on boss death. Kill the Spewer and you’d still be dodging invisible damage zones for another 18 seconds. We now track every puddle in the BossZombie instance and fade them all out in 500ms when the boss dies.
Shotgun Pellet Cap
The shotgun gained +1 pellet per upgrade with no maximum. At high upgrade levels, each shot spawned dozens of bullet sprites, tanking frame rates. Capped at 12 pellets — still devastating, but the GPU can breathe.
Boss Teleport Safety
Warden and Abomination bosses can teleport when stuck. The fallback position calculation used a fixed offset from the player without checking for walls, occasionally spawning the boss inside geometry. The fallback now always picks from the outdoor tile pool (guaranteed walkable), and the last-resort case stays in place rather than risking a wall embed.
Fullscreen Lighting Fix
The lighting system uses two render textures: a darkness overlay and an occlusion buffer for line-of-sight shadows. The darkness RT was resized on viewport change, but the occlusion RT wasn’t. Toggling fullscreen on desktop left undrawn regions in the shadow pass. Both RTs now resize together in the same event handler.
Memory Leaks Plugged
GameUIScene, GameOverScene, and MainMenuScene had no shutdown() handlers. Every time a player restarted or returned to the menu, event listeners, tweens, and timers accumulated. Over a long Steam session, this meant growing memory usage and eventual slowdown. All three scenes now clean up properly on shutdown.
Quality of Life
- About/Credits screen — Added to the Settings tab: game title, version, team credits, and art attribution (Ittai Manero’s Zombie Apocalypse Tileset).
- Boss HP abbreviation — HP numbers 10,000+ now display as “12.5k / 15.0k” to fit the bar.
- Save corruption logging — Corrupted localStorage data now logs a warning instead of silently returning null.
Issues Audited and Closed
Several filed bugs turned out to be already fixed or non-issues on inspection: Dragon’s Breath scaling (already uses super.upgrade()), AudioContext crash handling (already wrapped in try-catch), PreloadScene error handler (already present), LeaderboardScene error handling (already present), door crack accumulation (graphics properly cleared before redraw), and SteamService IPC logging (already implemented). We closed these with investigation notes rather than unnecessary code changes.
The game’s live now at night.echoforge.games. Let us know how the late-game feels.
— Bruno