Player 1: Player 2 move / crouch / jump: W A S D arrow keys high punch: F I low punch: G O block: H P high kick: V K low kick: B L training overlay: T back to menu: R Crouch + high punch is the UPPERCUT. It launches. Everything else in the game is arranged around that fact. back, forward + punch: SPIRIT BOLT — a projectile forward, down, down-forward + kick: RISING KNEE — invulnerable anti-air launcher back, forward + kick: SHADOW KICK — a long lunging low-profile kick down, back + punch: your character's signature HCF + high punch: NIGHT COLLAPSE — super, one full meter back, back + high punch after winning a round: the FINISHER
A 2D fighting game built on a block button instead of hold-back — one change that rewrites the whole neutral game — plus a launching uppercut, real air juggles, and a stylised cinematic finisher when you win a round. Two original fighters: VESPER (100 HP, quick, freezes you in place) and CAIRN (116 HP, heavy, drops rubble on your head as an overhead). Best of three, 60-second rounds, two players at one keyboard or versus the AI. WHY A BLOCK BUTTON CHANGES EVERYTHING With hold-back-to-block, defending and retreating are the same input. Every time you guard you also give up ground, so pressure works by walking someone into a corner until they have nothing left to give, and the corner is the whole strategic object of the game. With a block button you can stand your ground and be safe. Cornering is worth much less. The attacker cannot win by taking space — they have to open the guard up, which means the mixup between a low you must crouch-block and an overhead you must not, and it means frame advantage matters more than position. In the engine this is cfg_blockslot = 3 instead of 0. Literally one number: setguard reads a button when it is non-zero and reads the input direction when it is zero. Nothing else in 3,000 lines differs. That is the point of the exercise — the two games are the same code and they do not play alike. The rest of the table leans into it: - Floatier gravity. 0.5 against STREET's 0.62, with a four-hit juggle budget, so a launch buys a whole air combo. Follow-up timing is decided by the opponent's fall arc rather than by a combo table: hit them too late and they have dropped below your hitbox. Each juggle hit re-pops them slightly less than the last, so gravity ends the combo instead of a rule doing it. - The uppercut is 6/4/20. Twenty frames of recovery if it whiffs. It is the key to the door and it costs you the round if you throw it at nothing. - A slow jump squat (4 frames), because with a block button an unreactable jump-in would be too strong. FRAME DATA Full table in FRAMEDATA.md, generated from the file the game loads. Selected: | | startup | active | recovery | dmg | on block | |---|--:|--:|--:|--:|--:| | LOW PUNCH | 3 | 2 | 7 | 4 | −1 | | HIGH PUNCH | 5 | 3 | 10 | 8 | −3 | | HIGH KICK | 9 | 4 | 16 | 13 | −7 | | UPPERCUT | 6 | 4 | 20 | 14 | −12 | | SWEEP | 8 | 3 | 18 | 10 | −11 | | RISING KNEE | 4 | 8 | 22 | 13 | −18 | | FROST NAIL | 11 | 1 | 24 | 7 | −12 | | NIGHT COLLAPSE | 6 | 9 | 26 | 32 | −18 | 30 fps engine, so a frame is 1/30 s. HIGH KICK's hitbox starts 66 px off the floor and a crouching fighter's hurtbox tops out at 64 px, so it goes clean over a crouch. That is geometry, not a rule — hurtboxes are computed from the interpolated pose every frame, and the generator prints the consequence: standing hurtbox top 89px, crouching 64px (28% shorter) whiffs over a crouch: HIGH KICK (box starts 66px) THE FINISHER Win a round by knockout and the loser is stood back up, dazed, with FINISH IT on screen and 96 frames to input back, back + high punch. The motion goes through the same recogniser every other special uses. It is stylised, deliberately: a bright strike, the screen whites out for ten frames, and the opponent is launched across the arena and bounces off the wall. All original - code, art and sound. See Inside is open.