One HTML file · Zero dependencies · Works offline

EONCOMMANDO

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.

1 file 109 KB 0 dependencies 0 network calls 3 eras 5 weapons 9 enemy types 16:9–21:9 widescreen
eon-commando — era I: ashen dawn
Eon Commando gameplay: the commando firing at enemy soldiers under a setting sun

The campaign

Three eras, each with its own sky, its own hazards, its own boss.

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.

ERA I

ASHEN DAWN

The burning city at dusk. Long sightlines, chasms to clear, turrets dug into the rooftops.

ERA II

GLACIER EON

The frozen vault. Narrow ledges, more air than ground, drones dropping through the snow.

ERA III

EON CORE

The heart of time. Tighter platforms, denser fire, and the thing the other two were guarding.

Era II, Glacier Eon: icy ledges, a pale moon and enemy drones ERA II

GLACIER EON

Ice shelves over open air. The moon does nothing to help you see the drone above your head.

Era III, Eon Core: magenta sky, spiked ground and enemy turrets ERA III

EON CORE

The last approach. Every enemy you met earlier comes back with better aim.

Look and feel

Pixel-pure, but nothing is a box any more.

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.

21:9 — the view widens instead of letterboxing
Ultrawide 21:9 view of Era II showing more of the level either side
Portrait phone layout with thumb controls below the play area PORTRAIT

Thumbs below

The play area sits at the top, controls in the lower third, with a hint that the view gets bigger sideways.

Landscape phone: the game fills the screen edge to edge LANDSCAPE

Edge to edge

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.

Two players

Local co-op. One keyboard, two pads, no network.

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.

co-op — two commandos, shared camera, cyan hearts for player two
Two commandos fighting side by side in Era I, player two's hearts in cyan

Verbs

Dash, melee, grenade. The gun is no longer your only answer.

SHIFT

DASH

Ten frames of invulnerable movement on a short cooldown. The answer to a wall of bullets.

V

MELEE

A short arc in front of you. Finally solves the enemy that walked into your chest.

G

GRENADE

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.

settings — difficulty, colour scheme, reduce motion, flash, HUD size
Settings screen: difficulty, colour scheme, reduce motion, flash intensity, HUD size, music, sound effects, auto fire

Arsenal

Five weapons. You lose the good one when you die.

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.

RIFLEDefault. Even cadence, clean damage, always with you.
SPREADThree pellets in a fan. Best at bad-breath range.
MACHINEFast, jittery, forgiving. Melts anything that stands still.
LASERSlow to fire, punches through three targets at once.
FLAMEShort reach, wide cloud, burns through a crowd.

Bosses

Three of them. Each one has a second phase.

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.

The Warden boss: a heavy mech with a glowing core, firing spread shots ERA I BOSS

THE WARDEN

A walking bunker with shoulder cannons and a ground shockwave you have to jump.

The Eon Heart boss: a pulsing core throwing a spiral of bullets ERA III BOSS

THE EON HEART

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.

Controls

Keyboard, touch pads, or a gamepad.

ActionKeyboardOn a phone
Move←→ or ADLeft D-pad
Aim up / down↑ / ↓ (down in mid-air)D-pad up / down
Duck↓ while standingD-pad down
JumpSpace X KA
FireZ J CtrlB
PauseP Esc❙❙ button
MuteM—

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.

How it's built

No engine, no assets, no network.

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.

SIMULATION

Fixed 60 Hz step

A fixed timestep with an accumulator, so physics behaves the same on a 60 Hz laptop and a 144 Hz monitor.

MOVEMENT

Coyote time & buffering

Six frames of coyote time and seven frames of jump buffering, so a jump pressed a hair early still counts.

AUDIO

Chiptune at runtime

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.