← All work
Game design · single fileLive

Nothing You Shoot Is a Person

Save the World is a browser game I built for a seven-year-old in the family. Ten waves, four arenas, and a shop between every single one. It is one HTML file with no build step and no dependencies.

It was the first of the two games, and it set the rule the 3D one inherited.

1 file
the entire game. No build step, no dependencies, no requests out
10
waves across four arenas, with a shop between every one
0
people you are allowed to shoot without losing coins

Play it

Mouse and WASD on a laptop, or two thumbs on a tablet. Clear a wave, spend your coins, go again. Wave 10 is a very large gator.

The design rule in code: one list holds the things you shoot, all invented creatures like sock monsters and homework bots, and a second list holds the friends you rescue by running into them. Shooting a friend costs coins and pops an apology.
Two lists, and the game treats them completely differently. One is the wave. The other is the reason the wave exists.
Open the game → No login. Progress saves on the device.

The rule, and where it actually lives

Every enemy in the game is invented: sock monsters, homework bots, squirrels, zoomie dogs, laser cats, baby gators, and a boss gator at the end. Not one of them is a person.

The people and pets are on a separate list, and you rescue them by running into them. That pays the biggest coins in the game, and the wave counts how many you saved.

OOPS!

is what you get for blasting a friend. The game takes coins back and says so. The rule is not a note in a readme. It is a penalty in the scoring.

I did not want to hand a kid a game where the fun thing to do is shoot at people. Deciding that once, early, was easier than relitigating it every time I added an enemy.

What actually hooks a seven-year-old

It is not the shooting. It is the unlock loop. So the whole game is built around short waves with a shop after every one, and something new to want on the other side of it.

Coins buy a faster blaster, extra hearts, fast boots, a coin magnet, a bubble shield, and outfits. There are also secret codes you type in, which I printed on a card and gave with the game.

The difficulty tiers, and why the hardest one pays double

Three tiers. CADET gives five hearts, weaker and slower enemies, and strong aim assist. TROOPER is the intended game. LEGEND cuts you to three hearts, makes enemies 1.75 times tougher and faster, and turns aim assist nearly off.

LEGEND pays double coins, so the hard tier is worth attempting rather than just punishing. Best wave and best score are tracked separately per tier.

One file, on purpose

The whole game is a single HTML file of about 1,800 lines. No bundler, no framework, no package install, and it makes no network requests at all once it is open.

That was not minimalism for its own sake. It means the game can be emailed, dropped on a USB stick, or opened from a folder, and it will still work in ten years.

How it re-themes for a different kid

Everything player-specific sits in one config block near the top: the hero name, the list of friends to rescue, and the secret codes.

Swap those six lines and the game belongs to somebody else. The waves, the shop and the scoring do not change.

Progress saves to local storage on the device, so each player keeps their own coins, unlocks and best runs.

What came next

This one worked well enough that the follow-up was a 3D version, built the same way and carrying the same rule about targets.

If you want the more technically interesting build, that is the one to look at.