A Contra-style run-and-gun platformer. Run, jump, duck and shoot your way through three collapsing eras — five weapons, three bosses, chiptune audio, and not one line of third-party code. Pixel-pure, but drawn with curves.
Every stage is hand-laid — ground segments, one-way platforms, chasms, turrets and flying drones — and every stage ends the same way: the camera locks, the gate shuts behind you, and something very large wakes up.
The burning city at dusk. Long sightlines, chasms to clear, turrets dug into the rooftops.
The frozen vault. Narrow ledges, more air than ground, drones dropping through the snow.
The heart of time. Tighter platforms, denser fire, and the thing the other two were guarding.
ERA II
Ice shelves over open air. The moon does nothing to help you see the drone above your head.
ERA III
The last approach. Every enemy you met earlier comes back with better aim.
Every character is built from rounded caps, arcs, ellipses and bezier limbs instead of stacked rectangles — helmets, visors, shoulder pads, knees and boots all have real silhouettes. The same rig is reskinned per era, jittered in scale on every spawn, and roughly one enemy in eight arrives as a gold elite with nearly twice the health.
Readability got the same treatment: enemy bullets carry a dark rim, a glow and a motion trail; arrows at the screen edge point at enemies you cannot see; and the background dims while a boss is on screen.
PORTRAIT
The play area sits at the top, controls in the lower third, with a hint that the view gets bigger sideways.
LANDSCAPE
No page padding, no letterbox gaps — the canvas owns the whole viewport on a phone held sideways.
The logical viewport follows your window from 16:9 up to 21:9. Boss arenas keep a fixed 16:9 footprint and the camera centres them, so a wide screen sees the arena walls rather than empty void.
Press 2 on the title screen. Player one takes the arrows and Space/Z;
player two takes WASD and , . /. A second gamepad is
picked up automatically. The camera frames you both and follows your midpoint.
Go down and you have six seconds — a partner standing close for about a second brings you back at one heart, with a progress ring around your body. Nobody reaches you and you bleed out. A life is only lost when nobody is left standing.
Ten frames of invulnerable movement on a short cooldown. The answer to a wall of bullets.
A short arc in front of you. Finally solves the enemy that walked into your chest.
Three per life. Arced, bouncing, and five damage across a wide radius.
Nine enemy archetypes now: the sniper paints a laser on you before firing, the shielder carries a front plate that stops your bullets dead, the brute charges, the swarm flies straight at your face. Every shooter winds up before it fires, so a death is something you could have read.
Weapons drop from floating capsules and stay with you until you take a fatal hit — then it is back to the rifle. That single rule turns every pickup into a decision about how much further you are willing to push.
Half health flips a switch: the Warden fires wider spreads and stomps shockwaves, the Glacier Wraith calls in drones, and the Eon Heart starts spinning its volleys faster than you can walk.
ERA I BOSS
A walking bunker with shoulder cannons and a ground shockwave you have to jump.
ERA III BOSS
It does not move. It does not have to. The spiral closes in from every angle.
Between them sits the GLACIER WRAITH — airborne, wing-flapping, dropping ice shards in a fan and calling in reinforcements when it drops below half health.
| Action | Keyboard | On a phone |
|---|---|---|
| Move | ←→ or AD | Left D-pad |
| Aim up / down | ↑ / ↓ (down in mid-air) | D-pad up / down |
| Duck | ↓ while standing | D-pad down |
| Jump | Space X K | A |
| Fire | Z J Ctrl | B |
| Pause | P Esc | ❙❙ button |
| Mute | M | — |
Holding the jump key gives you the full arc; tapping it gives you a short hop. That difference is the whole game when the ground stops.
Everything you see is drawn from rectangles and paths at runtime: the commando, the enemies,
the bosses, the parallax skylines, the 5×7 pixel font on the HUD. Everything you hear is
synthesised from oscillators and noise buffers in the Web Audio API — there is no
.png, no .wav, no font file, no CDN.
A fixed timestep with an accumulator, so physics behaves the same on a 60 Hz laptop and a 144 Hz monitor.
Six frames of coyote time and seven frames of jump buffering, so a jump pressed a hair early still counts.
Two-pulse leads, a triangle bass and a noise kit, sequenced ahead of time against the audio clock.
git clone https://github.com/drsamonline/eon-commando cd eon-commando python3 build.py # src/ -> index.html (one file) open index.html # or just double-click it
The shipped game is one file. The source is split into readable parts under
src/ — core, audio, input, art, content, entities, game, render, main —
and build.py concatenates them in order. Edit a part, rebuild, reload.