AD NAUSEAM
A retro pixel-art arena shooter where every kill is sponsored: each enemy you slay triggers an
obnoxious pop-up ad that pauses the game until you get rid of it.
Built with TypeScript + Vite, rendered on a 320×180 canvas scaled up with crisp pixels. All sprites
are hand-defined pixel grids and all sound is synthesised with WebAudio — no asset files.
Run
npm install
npm run dev # http://localhost:5173
npm run build # typecheck + production build in dist/
Deploy
The game is live at https://ad-nauseam.euans.space. Every push to main builds and deploys
dist/ to GitHub Pages (.github/workflows/deploy.yml).
One-off setup:
- In the repo's Settings → Pages, set Source to GitHub Actions and Custom domain to
ad-nauseam.euans.space, then tick Enforce HTTPS once the certificate is issued.
- In the
euans.space DNS, add a CNAME record for ad-nauseam pointing at
<github-username>.github.io.
The site URL used for the canonical and social-preview tags is set in .env.production; change it
there if the domain changes.
Controls
| Key | Action |
|---|
| WASD | Move |
| Mouse / arrow keys | Aim and attack with the current weapon |
| 1 / 2 / 3 | Select wand / sword / nova |
| 4 / 5 | Select scatter wand / bombs (once bought in the shop) |
| 6 | Select your hero's own weapon |
| Q | Swap between wand and sword |
| Mouse wheel | Cycle weapons (skips the nova while it's recharging) |
| E / right-click | Unleash the nova |
| Space / Shift | Dash (brief invulnerability) |
| P / Esc | Pause |
| M | Mute |
| F | Toggle fullscreen |
Attacks
- Wand: rapid long-range magic bolts. Safe, but weak.
- Sword: a short-range arc that hits everything in front of you for 3× a bolt's damage, knocks
enemies back, and swats fireballs out of the air.
- Nova (special): a huge shockwave that blasts every enemy in range and wipes out fireballs,
with a moment of invulnerability. 30 second cooldown. Select it with 3 / the wheel and attack,
or fire it straight away with E / right-click. Yes, killing a whole room at once queues a whole
room's worth of ads.
- Hero weapons (6): every hero has one of their own.
- Adventurer: boomerang. Hits everything on the way out and again on the way back. One at a time.
- Mage: skeletons. Each cast raises a skeleton where you aim that marches off and fights for you
(up to 4; they crumble after 14 seconds, and the oldest goes if you raise a fifth).
- Knight: warhammer. Slams the ground just in front of you, hitting everything in a ring.
- Achilles: spear. A thrown spear that goes through everything, armour included.
Enemies
- Skeleton: fragile (1 HP), quick, lunges with a rusty sword for heavy damage.
- Zombie: tanky (6 HP) and slow, its claw swipes do less damage than a skeleton's sword.
- Sorcerer: keeps its distance and lobs fireballs (3-way from wave 4), and summons skeletons
and zombies through portals. Summoned minions also earn you ads.
- Goblin (wave 2+): the fastest thing in the dungeon. Crouches, hops in with a quick dagger
stab, then runs off and comes back for another go. If the stab lands it steals some of your
coins and sprints away with a sack: kill it within 3 seconds to get them back, or they're gone.
- Troll (wave 3+): huge, slow and barely flinches. Raises its club overhead while a red ring
marks where it'll land, then slams the ground for massive damage. Get out of the circle.
- Baby dragon (wave 4+): flutters around at mid range. Its mouth glows as it breathes in, then
it breathes a stream of fire that slowly turns to follow you. Run around it; the sword swats flames.
- Reaper (wave 5+): fades out (untouchable while it does), reappears right behind you, raises its
scythe and sweeps a wide arc.
- The Glitch (wave 2+, rare): still the rarest enemy. There's a growing chance of one each wave
(35% at wave 2, up to 75%), and from wave 7 sometimes a second. A blue-screen figure with a missing-texture head that keeps warping around the room
(can't be hit while it flickers). It slashes if it warps in next to you, fires bursts of pixel shards
from range, and lobs a slow chequered packet: get hit and you're glitched, unable to move or dash
for 3 seconds (you can still aim and attack).
- Thunder rat (wave 3+): small and quick, scurries about in bursts. It crackles with static,
then a flashing dotted line shows where the bolt will go: get off the line before it fires.
- Imp (wave 4+): comes in swarms of three. Tiny flying devils that flit about erratically and
throw small fireballs. One hit kills them; hitting them is the hard part.
- Wolf (wave 5+): hunts in packs. Wolves circle you, crouch, then pounce. Watch for the crouch.
- Giant spider (wave 3+): skitters around spitting webs. A web slows you right down, and while
you're stuck it crouches and rushes in to bite. It'll also bite if you get too close.
- Living armour (wave 4+): an empty suit of armour with a big sword. Bolts and fireballs glance
off it for half damage, so use the sword, hammer, bombs, nova or a spear. Knock its helmet off
(half HP) and it gets faster.
- Mimic (wave 7+): a treasure chest sitting quietly on the floor. Walk up to it (or shoot it)
and it wakes up, all teeth, and hops after you to chomp. Pays out a lot of coins, though.
Later waves don't keep growing forever: a wave tops out at 22 enemies (they're tougher by then),
and no more than 12 are on screen at once. The rest wait their turn.
This is the beginning of the README. Read the rest at the original. Read the full README ↗