Impact Frame
Design mockups · v0.1 · Oct 2026 Working title
Live code · no video · no libraries

IMPACT FRAME

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.

Play the prototype

Juice

Controls Keyboard · pad

Move
AD or ←→
Jump
W or Space — again in the air
Punch
J · tap up to four times for the full string · hold for a haymaker · ↑+J uppercut · ↓+J body blow
Kick
K · hold to charge · ↓+K sweep, or slam in the air
Charge
Time slows to ×0.5 while you hold · 1.8 s cooldown after
Dash
L or Shift · then J for a dash punch
Combos
Named strings pay a bonus: JJJ three piece · JJJJ full course · ↓J J liver shot · dash J ↑J drive-by · and four secrets
Drop
↓+Space through a platform
Pause
P or Esc
Pad
Ⓐ jump · Ⓧ punch · Ⓨ kick · Ⓑ or bumpers dash

Every hit, explained Live log

  1. Waiting for the first hit…

Try this

  1. Break a pip, then hit again while it blinks: that's the critical window.
  2. Hold K for a second next to a grunt near the right wall.
  3. Launch and juggle: ↑J, jump, then J J K in the air.
  4. Spam one string, like dash → kick. The third time, they read it.
  5. Find the four secrets. Old fighting-game motions work here, and so does mashing.
  6. Switch to Raw. Same fight, same rules, no juice. That gap is the pitch.
PLATE 02 — COMBAT RULEStagger sets the launch

The outcome picks the tier

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.

LAB · STUDIO WALL
Move
100%
40%
Launch speed
—
Tier
—
Hit-stop
—
Says
—

speed = kb × (1 + 1.2% × stagger) × weight

PLATE 03 — DOPE SHEETFrames @ 60 fps

Anatomy of a lethal hit

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.

REPLAY · DETERMINISTICF 000
Frame000Time0.000 s
Anticipation sells it

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.

Hit-stop sells the weight

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.

The impact frame sells the kill

For seven ticks the page prints in negative. It's reserved for lethal hits and K.O.s, so it never becomes wallpaper.

PLATE 04 — FX LIBRARYOne glyph per verb

Every verb owns a shape

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.

PLATE 05 — DAMAGE MODELPhysics, then pips

Where you hit decides how they fly

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.

PLATE 06 — MODEL SHEETReadable at 40 px tall

Seven silhouettes

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.

MODEL SHEET · LINE BOIL 12 FPS
Player

The Ink

Hollow head, red verlet scarf that trails every motion. Fastest thing in the arena.

Run
560 px/s
Jumps
2 + 1 air dash
Weight
1.00
Stocks
3
Fodder

Grunt

Solid head. Attacks one at a time and shows a ! 420 ms before every punch, so a crowd stays fair.

Run
290 px/s
Tell
420 ms
Weight
1.00
Pips
3 × 10
Heavy

Brute

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.

Run
165 px/s
Tell
720 ms + armour
Weight
0.55
Pips
3 × 26
ROSTER · EVERY ENEMY IN ITS TELL
Enemy roster
EnemyReads asAttackTellRunWeightPipsHow it playsFrom
Gruntsolid headPunch420 ms2901.003 × 10The baseline. Waits its turn in the ring around you.W1
Dashersmall, headbandLunge, 980 px/s300 ms4301.123 × 8Hit and run: dashes in from range, lunges, backs off. Fragile and flies far.W2
Sticklong staffPoke, 150 px reach420 ms2500.953 × 11Outranges your jab. Get inside the staff.W3
Brutesquare head, 1.3×Slam, 170 px quake720 ms1650.553 × 26Light hits don't make it flinch; armoured while slamming. Bait the slam, punish the recovery.W3
Throwerflat capStone, arcing500 ms2701.053 × 8Keeps 400 px back, has its own turn. Bat the stone back with any strike.W4
Machetesolid bladeSlash, 13 dmg360 ms3101.003 × 9The 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).

PLATE 07 — SCREENSTitle · HUD · Finish · Results

Screens

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.

  1. Score, banked when a combo ends — so a dropped combo hurts.
  2. Combo counter with the live value of the combo you're holding.
  3. Style rank D → SSS. Decays after 1.4 s idle; getting hit costs 35%.
  4. Enemy health: three pips over the head, shown only when hit. Each red ring drains from one side; an empty pip blinks through a short critical window, then it's gone.
  5. Your stocks, your own stagger (waves heal half of it), and the charge meter, which refills over 1.8 s after each charged hit.
  6. Telegraph: every enemy attack is announced before it lands.
Settings · accessibility

Turn the juice down, not off

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.

  • Reduce flashesNo inverted frames or white flashes; misregistration, shake and the red tint toned down.OFF
  • Screen shakeTrauma scale for the camera, 0–100%.100%
  • Hit-stopNever below 50% — the freeze is how weight is read.100%
  • Spot colourRed, or a cyan plate for red-weak vision.RED
  • Charge inputHold, or tap once to start and once to release.HOLD
  • Sound wordsThe printed onomatopoeia double as captions.ON
PLATE 08 — SOUND7 layers · one clock

Every hit is a chord

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.

KRAAK
Output · click a recipe to play
PLATE 09 — ART DIRECTIONTwo-colour riso

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.

Paper#F1F0EB · buffer 0,0,0Everything not inked.
Ink · K plate#141417 · red channelBodies, floors, walls — anything solid.
Tone · halftoneK at 45° · green channelScenery, shadows, dust. Never collides.
Spot · red plate#E8283C · blue channelDanger, you, and lethal hits. Used sparingly.
K plate. Line art and solids.
Tone plate. Density, printed as dots.
Spot plate. The red pass.
Print. Overprinted, grained, misregistered.
Sound words · Dela Gothic One
KRAK! BOOM

Heavy, wide, slightly cartoonish. Only for words that make noise — never for UI.

Interface · Archivo condensed
Wave 3 clear

A grotesque with a width axis: condensed for labels in tight HUD corners, normal width for reading.

Data · Martian Mono
1,204 px/s · 117 ms

Every number the player compares — score, stagger, timers — is monospaced so it doesn't jitter.

DamageΣ dmg × 10Every stagger point dealt.
×
Combo1 + 0.1 / hitWindow 1.15 s, held open while they fly.
×
Air time1 + 0.5 / sSeconds your victims spend airborne.
×
Style×1 → ×4Variety, walls, collateral, finishes.
PLATE 10 — TECH STACKRecommendation

Own the clock, rent the renderer

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.

01 · InputIntent, buffered
  • Keyboard, Gamepad API, touch
  • 120 ms input buffer, 90 ms coyote
  • Same path for the demo bot
02 · SimulationFixed 120 Hz
  • Seeded, deterministic
  • AABB bodies + verlet ragdolls
  • Hit-stop and slow-mo in ticks
03 · EventsWhat happened
  • hit {move, zone, stagger, speed}
  • wall · bounce · collateral · K.O.
  • Logged per tick — that's plate 03
04 · FX directorTier → treatment
  • One table maps tier to every channel
  • Separate RNG: effects can't change outcomes
  • Raw mode skips it entirely
05 · OutputsPixels, sound, rumble
  • PixiJS v8 + a custom print filter
  • Web Audio graph: layers, ducking, low-pass
  • Gamepad dual-rumble
Snapshot ring buffer

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.

Why not an engine

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.

LayerPickWhyPassed on
LanguageTypeScript + ViteTyped event payloads; instant reload while tuning feel.—
RenderingPixiJS v8Batched sprites and graphics, WebGL2 with a WebGPU path, filters for the print pass.Phaser 4, Three.js, Godot (web)
SimulationCustom, fixed 120 HzDeterminism gives replays, tests and rollback; hit-stop needs to own the clock.Engine game loops
PhysicsAABB + verlet ragdollThe ragdoll is the damage model: 11 points, 11 links, cheap and fully controllable.Matter.js, Box2D/Rapier
AudioWeb Audio, layeredRecipes of synthesised + recorded layers; ducking and slow-mo filtering on one graph.Howler (playback only)
OnlineRollback, laterThe deterministic sim is the prerequisite; it's free to keep from day one.Lockstep, server-authoritative
HostingStatic filesNo server until online play.—
< 2 sFrom link to first kick, mid phone on 4G.
< 400 KBGzipped JS for the whole game, audio streamed later.
60 fpsOn a mid-range phone with five fighters and a wall break.
≤ 2 framesInput to screen. Feel dies above that.
PLATE 11 — ROADMAPScope, then risks

From feel to fight club

M0 · Done

Feel prototype

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.

M1

Vertical slice

  • Port to PixiJS + TypeScript
  • Recorded layers under the synth
  • FINISH replay from snapshots
  • Three arenas, one hazard each
  • Playtest metrics: time to first SSS, quit points
M2

Content

  • Eight arenas: glass, fans, neon, subway doors
  • Six enemy types, two bosses
  • One special per verb
  • Daily seeded arena + leaderboard
M3

Online

  • 1v1 rollback over WebRTC
  • Spectate and share replays
  • Clip export from the ring buffer
01Effect fatigue

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.

02Photosensitivity

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.

03Readability in a pile-up

Ragdolls plus particles can hide the player. Hollow head, red scarf and drawing particles behind fighters keep the hero findable.

04The name

“Stick Fight: The Game” (Landfall, 2017) owns the obvious title. IMPACT FRAME is a working title — clear trademarks before a store page.