gamedevphaserjavascriptnostalgia

Building HOWL TD: A Journey Back to Simpler Games

The story of building a tower defense game from scratch — lessons learned, technical decisions, and why polish takes forever but fun comes first.

Cooper Howling

I grew up playing Flash games on Newgrounds and Kongregate. Simple tower defense games with basic graphics, straightforward mechanics, and that perfect loop of “just one more wave.” HOWL TD is my love letter to that era.

Why Tower Defense?

Tower defense games are deceptively simple. Place towers, enemies follow a path, towers shoot enemies. But beneath that simplicity is a rich design space: resource management, positioning strategy, upgrade paths, and type effectiveness systems.

I wanted to build something that felt like those games I played as a kid — not overly polished, not trying to be the next big thing, just fun.

The Tech Stack

Phaser 3

I chose Phaser 3 as the game framework. It’s mature, well-documented, and handles all the heavy lifting: rendering, physics, asset loading, and input management. Coming from web development, I appreciated that it’s just JavaScript — no new language to learn, no complex build tooling beyond what I already use.

The alternative was building with vanilla Canvas API, which would have been educational but slow. Phaser let me focus on game design instead of reinventing sprite rendering.

Web Audio API (Then MP3)

Initially, I tried generating background music programmatically using the Web Audio API. I wanted that retro 8-bit sound, so I wrote code to play the Mii Channel theme using square wave oscillators with precise note frequencies and timing.

It didn’t work. Octave notation was confusing, timing was off, and browser audio contexts are finicky. After hours of debugging, I switched to a simple MP3 file. Sometimes the pragmatic choice is the right choice.

Sound effects are still programmatic — quick beeps and blips using oscillators. They work well enough for a retro aesthetic.

Astro + Self-Hosted Infrastructure

The game lives on this site, which runs on my self-hosted Ubuntu server via Cloudflare Tunnel. Astro handles the static site generation, and Phaser loads client-side. No cloud hosting costs, no vendor lock-in, just a home server and nginx.

Deployment is literally git push, SSH in, git pull && npm run build, restart systemd service. Done.

Game Design Decisions

Element System (Pokémon-Style)

The core mechanic is type effectiveness. Grass beats Water, Fire beats Grass, Water beats Fire. It’s simple, memorable, and adds strategic depth. Do you build a balanced defense or specialize and risk getting countered?

I also added Electricity (neutral damage, chain lightning) and two basic tower types (fast/slow) for players who want to ignore the type system entirely. Flexibility matters.

Six Tower Types

  • Grass — Slows enemies, strong vs Water
  • Fire — Burn damage over time, strong vs Grass
  • Water — Splash damage, strong vs Fire
  • Electricity — Chain lightning, neutral
  • Basic Fast — High attack speed, neutral
  • Basic Slow — High damage, neutral

Each tower has a distinct role. Fire is great for sustained damage, Water handles groups, Electricity chains through clusters. The variety keeps gameplay interesting.

Wave Progression

Enemies get tougher each wave. Health scales, new enemy types appear (normal, resistant), and the number of enemies increases. By wave 20, you’re managing multiple enemy types with different resistances.

I capped it at 50 waves because endless modes get tedious. Winning should feel achievable.

Upgrade System

Towers can be upgraded multiple times, increasing damage and range. Upgrades are expensive, forcing you to choose between building more towers or strengthening existing ones. That tension is what makes tower defense fun.

Lessons Learned

Polishing Takes Forever

The core game loop — place towers, shoot enemies, survive waves — took maybe 10 hours to build. Getting the UI right, balancing tower costs, fixing edge cases, adding sound effects, making it responsive… that took another 20+ hours.

Polishing is where 80% of the time goes. But even without perfect polish, the game is fun. That’s what matters.

Start With the Fun

I didn’t build a menu system first. I didn’t design a level editor. I built the core loop: towers shoot enemies, enemies die, you get gold, you build more towers. Once that felt good, everything else was just layering on top.

If the core isn’t fun, no amount of polish will save it.

Scope Creep Is Real

I wanted multiple maps, boss waves, tower abilities, enemy pathing AI, particle effects, achievements… I cut all of it. The game has one map, one path, basic enemies, and simple mechanics.

It’s still fun. Scope creep kills projects. Ship the MVP, iterate later.

Responsive Design for Games Is Hard

Making a Phaser game scale properly across screen sizes is trickier than responsive web design. I went through three different scaling modes before settling on RESIZE with CSS max-height constraints. Desktop gets 550px max height, mobile gets 400px. The canvas fills the container and scales appropriately.

It’s not perfect, but it works.

What Needs Improvement

Enemy Pathfinding

Right now, enemies follow a hardcoded path. I’d love to implement A* pathfinding so they navigate around towers dynamically. That would open up maze-building strategies.

Tower Abilities

Each tower type should have a unique active ability. Fire could have a “fireball” that deals massive AoE damage. Water could freeze enemies. Grass could summon vines to block paths. These would add tactical depth.

Visual Polish

The sprites are from Kenney’s free asset pack, which is great, but they’re generic. Custom sprites, particle effects for projectiles, screen shake on explosions — all of that would make the game feel more alive.

Sound Design

Programmatic beeps work, but real sound effects would be better. Tower shoot sounds, enemy death sounds, wave complete jingles. Audio feedback is huge for game feel.

Balancing

Tower costs, damage values, enemy health — all of it was eyeballed. Proper balancing requires playtesting and iteration. Some towers are probably overpowered, some are probably useless.

The Nostalgia Factor

Building this game brought me back to middle school, playing Flash games during computer lab. Those games weren’t AAA titles. They were made by solo devs or small teams, often in a few weeks. They were rough around the edges, but they were fun.

Modern indie games are incredibly polished. That’s great, but it also raises the bar so high that solo devs feel like they can’t compete. HOWL TD is a reminder that you don’t need perfect graphics or complex systems to make something enjoyable.

You just need a good core loop and the willingness to ship.

What’s Next

I’ll keep tweaking HOWL TD — fixing bugs, adjusting balance, maybe adding a second map. But the core is done. It’s playable, it’s fun, and it’s live.

If you want to try it, head over to HOWL TD and see how many waves you can survive.

And if you’re thinking about building a game yourself: start small, focus on the fun, and ship it. Polishing can come later.


Tech Stack:

  • Phaser 3 (game framework)
  • Astro (static site)
  • Web Audio API (sound effects)
  • MP3 (background music)
  • Self-hosted on Ubuntu via Cloudflare Tunnel

Play the game: howlingglobal.com/entertainment/tower-defense