A stickman brawler where the hit is the whole game.
A tiny move set — move, jump, punch, kick, dash — and an obsessive hit system. Every connection is staged like a manga panel: anticipation, hit-stop, a printed shockwave, a bass-heavy layered sound. How loudly a hit is told depends on what it does to the body. Everything below is a running prototype — play it, break it, toggle the juice off.
Every hit computes one number: the speed it launches the body. That speed — not the button — decides how loudly the hit is told. A jab on a battered grunt can BOOM. A full-charge heavy on a fresh one only KRAKs. Damage adds stagger %, and stagger makes you fly further.
speed = kb × (1 + 1.2% × stagger) × weight
One charged heavy into a wall, frame by frame. Every lane below is logged by the same director that drives the game, so this sheet can't drift from the code. Drag across the sheet to scrub.
A hold-to-charge coil with contracting rings and a rising whine. The longer the wind-up, the bigger the payoff the player expects — so the payoff must arrive.
Twenty ticks of frozen world (167 ms). The world stops; the shockwave, the words and the camera keep moving, so the freeze reads as force, not lag.
For seven ticks the page prints in negative. It's reserved for lethal hits and K.O.s, so it never becomes wallpaper.
Punch is a star, kick is a ring, slam is a crack. Read a single frozen frame and you know what just happened, even with five bodies on screen.
Bodies are eleven-point ragdolls: the hit zone sets the spin and the arc, and stagger makes every launch longer. Health is three pips over each enemy's head, shown only while it is taking damage. The lethal launch is saved for the hit that empties the last pip.
Thick black lines on paper, one spot colour. The rule of the art: solid ink can hurt you, screentone is scenery. The hero is the only figure with a hollow head and a red scarf, so you can find yourself in a pile-up. Each enemy reads from its outline alone: size, a weapon, a headband, a cap.
Hollow head, red verlet scarf that trails every motion. Fastest thing in the arena.
Solid head. Attacks one at a time and shows a ! 420 ms before every punch, so a crowd stays fair.
Square head, 1.3× scale, heavy: it launches about half as far. Light hits don't make it flinch, and its 720 ms overhead slam also shrugs off solid ones.
| Enemy | Reads as | Attack | Tell | Run | Weight | Pips | How it plays | From |
|---|---|---|---|---|---|---|---|---|
| Grunt | solid head | Punch | 420 ms | 290 | 1.00 | 3 × 10 | The baseline. Waits its turn in the ring around you. | W1 |
| Dasher | small, headband | Lunge, 980 px/s | 300 ms | 430 | 1.12 | 3 × 8 | Hit and run: dashes in from range, lunges, backs off. Fragile and flies far. | W2 |
| Stick | long staff | Poke, 150 px reach | 420 ms | 250 | 0.95 | 3 × 11 | Outranges your jab. Get inside the staff. | W3 |
| Brute | square head, 1.3× | Slam, 170 px quake | 720 ms | 165 | 0.55 | 3 × 26 | Light hits don't make it flinch; armoured while slamming. Bait the slam, punish the recovery. | W3 |
| Thrower | flat cap | Stone, arcing | 500 ms | 270 | 1.05 | 3 × 8 | Keeps 400 px back, has its own turn. Bat the stone back with any strike. | W4 |
| Machete | solid blade | Slash, 13 dmg | 360 ms | 310 | 1.00 | 3 × 9 | The hardest hitter its size. Never trade with it. | W5 |
Tells shown at wave 1. From wave 3, each wave makes enemies up to 40% faster, cuts their cooldowns and tells (to 78%), lets more of them attack at once (1 → 2 → 3), and from wave 4 sends some round your far side. They also learn: a two-move string that lands twice gets read the third time (see the hit log).
The interface is printed on the same paper as the fight. No glossy panels: labels are stamped, numbers are monospaced, and the only colour is the spot red.
Impact is the product, so every intense effect gets its own dial instead of one global kill switch. Reduce flashes is on by default when the system asks for reduced motion.
Hits are assembled from seven layers on a shared timeline where contact is 0 ms: the whoosh starts before it, the crack and the sub land on it, debris and tail ring after. Tiers add layers rather than volume. Everything here is synthesised live — there are no audio files.
The game never draws colours. It draws ink plates into the channels of one buffer — black ink, screentone, spot red — and a single shader prints them like a two-colour risograph: halftone dots, multiply overprint, and plates that slip out of register when something hits hard.
Heavy, wide, slightly cartoonish. Only for words that make noise — never for UI.
A grotesque with a width axis: condensed for labels in tight HUD corners, normal width for reading.
Every number the player compares — score, stagger, timers — is monospaced so it doesn't jitter.
The feel lives in timing, so the simulation is ours: a fixed 120 Hz deterministic loop where hit-stop is counted in ticks. Rendering is commodity, so it's rented: PixiJS v8 for batched 2D and filters. That split is what makes replays, the FINISH cam and, later, rollback netcode cheap.
The last six seconds of sim state. Powers the FINISH replay, a kill-cam and a shareable clip (MediaRecorder on the canvas stream) — and is the backbone of rollback later.
Phaser's scene and physics model fights a custom fixed-step loop; Three.js is 3D weight for a 2D game; Godot's web export is a multi-megabyte download before the first kick.
| Layer | Pick | Why | Passed on |
|---|---|---|---|
| Language | TypeScript + Vite | Typed event payloads; instant reload while tuning feel. | — |
| Rendering | PixiJS v8 | Batched sprites and graphics, WebGL2 with a WebGPU path, filters for the print pass. | Phaser 4, Three.js, Godot (web) |
| Simulation | Custom, fixed 120 Hz | Determinism gives replays, tests and rollback; hit-stop needs to own the clock. | Engine game loops |
| Physics | AABB + verlet ragdoll | The ragdoll is the damage model: 11 points, 11 links, cheap and fully controllable. | Matter.js, Box2D/Rapier |
| Audio | Web Audio, layered | Recipes of synthesised + recorded layers; ducking and slow-mo filtering on one graph. | Howler (playback only) |
| Online | Rollback, later | The deterministic sim is the prerequisite; it's free to keep from day one. | Lockstep, server-authoritative |
| Hosting | Static files | No server until online play. | — |
This page. One rooftop, six enemy types that learn your habits, eleven moves with two charged finishers, four impact tiers, procedural audio, endless waves and a style rank.
If everything booms, nothing does. Tiers come from outcomes, so T4 stays rare — track lethal hits per minute in playtests and tune knockback, not the effects.
Inverted frames and flashes are the signature. Keep them under three per second (WCAG 2.3.1), and ship Reduce flashes on by default under reduced-motion.
Ragdolls plus particles can hide the player. Hollow head, red scarf and drawing particles behind fighters keep the hero findable.
“Stick Fight: The Game” (Landfall, 2017) owns the obvious title. IMPACT FRAME is a working title — clear trademarks before a store page.