A Super Smash Bros.-style platform fighter where every character is a drawing made by a kid.
You draw a character on paper or on a tablet. It gets cut into pieces, hung on a skeleton, and put in a fighting game. Then it runs, jumps, and knocks other people's drawings off the screen.
One drawing, sliced into body parts, animated as a paper puppet:
That drawing was never redrawn, traced or cleaned up. Those are the same pixels, rotated about their joints — which is the entire point of the project. If a limb is lumpy, the limb is lumpy in the game.
Every fighter rigs to the same skeleton, so the animation library is authored once and inherited by all of them. Adding a character is an afternoon of cutting up a photo, not a week of animating. That single decision is what makes the project survivable: if a new drawing took a weekend to get in the game, a kid would draw three characters and stop.
Playable, and nowhere near finished. Nothing in it has been balanced by anyone who has actually played it.
| Fighting | percent + knockback + stocks, hitlag, screen shake, DI, ledge grabs, dodges |
| Moves | 17 per fighter — a jab combo (length set by weight), 3 tilts, 3 chargeable smashes, dash attack, 5 aerials, 4 specials, each with its own animation |
| Fighters | 6 — Circy, the first fighter designed by a kid (Elim), and Triguy, his second, sent in through the submission form; EdgeLord, a sword fighter drawn by Eric and coloured by us; DoomBot, a rogue factory robot drawn and designed by Eric, with a furnace that heats up as he fights; and two stand-ins we drew in code: Flambé, a punk rocker, and Lugnut, a muscle-bound construction worker |
| Stages | 4 — Fridge Door, Open Plains, City Rooftops, and Big Show: a concert stage with a girder across the top |
| Items | 30, all art supplies — a giant pencil to swing, a paint bucket to throw, glitter bombs, a magic marker that draws a platform, White-Out that rubs off damage. Off, low, medium or high, and each one on or off, from the stage select screen |
| Drawing | draw a fighter in the game itself, on lined paper: marker, coloured pencil, paint bucket, eraser, layers (one per body part) and pages for the things a fighter uses. Saved as you go, and sent straight to ecec.dev - the same place as the website's form |
| Story | six stories, one per fighter, each an opening, five fights (one of them two-on-one), the DoomBot finale and an ending - and DoomBot's own, against DoomBot Mk. II. Speech bubbles, a narrator, reaction poses, a directed camera, all played by the real fighters on the real stage. The fights get harder as a story goes on; progress is saved, with a gold star for every story finished |
| Screens | title, main menu, character select, stage select, item settings, match; your drawings, the drawing screen, sending it in |
| Input | Xbox pads (hot-pluggable) and keyboard |
| CPU | a computer opponent, for playing alone - and in story mode, teams of them, getting tougher fight by fight |
| Sound | a sound for every attack and hit, the countdown, KOs and menus; menu, battle, story and DoomBot music and a victory sting — all generated by code |
| Not yet | 3–4 players in versus, the art import tool, results screen, volume settings |
Flambé (Swift) and Lugnut are scaffolding, not content — see fighters/README.md.
They exist so the engine could be built and played before any real drawing existed, and they get
deleted when real ones land. Circy and Triguy are the real thing: designed and drawn by Elim,
and cut straight from Elim's drawings without a line redrawn. EdgeLord and DoomBot are drawn by Eric;
EdgeLord is Eric's drawing, coloured in by us, swords and all.
Download it from https://ecec.dev/drawfight/download (Windows). It keeps itself up to date: every time it starts, it checks for a new version and installs it.
Needs Godot 4.5.1 Mono (the C#/.NET build) and .NET 9.
dotnet build DrawFight.sln # ~2s, catches essentially all C# errors
"$GODOT_BIN" --path . # run itHandy flags — each boots straight to one screen and can screenshot itself:
"$GODOT_BIN" --path . -- --match --stage=1 # skip the menus
"$GODOT_BIN" --path . -- --draw --windowed # straight to the drawing screen
"$GODOT_BIN" --path . -- --parade --shot=70 # every fighter in every animation
"$GODOT_BIN" --path . -- --parade --attacks --shot=70 # every fighter's attacks at the moment they hit
"$GODOT_BIN" --path . -- --shot=120 # screenshot after 120 frames, then quit| Xbox pad | |
|---|---|
| left stick | move — the harder you push, the faster you run |
| A or Y | jump, double jump - the double jump is also the only way to turn round in the air |
| X | attack — tap repeatedly for a jab combo; hold a direction for tilts and aerials; flick the stick with it for a smash (hold X to charge); while running, a dash attack |
| d-pad + X | a smash attack in that direction, every time — hold X to charge it |
| right stick | a smash attack that way (hold it out to charge); an aerial that way in the air |
| B | special (+ a direction for all four). After an up special you can only drift until you land |
| LT or RT | block, behind a shield — reduces damage and knockback, never negates it |
| RB, or LT/RT + X | grab — catches someone even while they block; then the stick picks a throw |
| LT/RT + stick | roll, spot dodge, air dodge |
| LB | taunt — a pose and a line; does nothing but show off, and leaves you open |
| X beside an item | pick it up. With one in hand, X uses it — swings it, throws it, sprays it, drinks it in |
| RB holding an item | throw it, the way the stick points (down on the ground sets it down) |
| hold ↓ | crouch (ducks high attacks); attack from it for a low sweep |
| hold ↓ + A | drop through a soft platform |
| hold ↓ in the air | fall faster |
| F11 | the game starts fullscreen; F11 switches to a window and back |
Keyboard: P1 arrow keys to move, A jump, Q attack, W special, S block, D grab, E taunt.
With no second pad, P2 is the number pad: 8/4/5/6 move, 1 jump, 2 attack, 3 special,
0 block, 9 grab, 7 taunt.
After Start, the main menu: Versus, Story or Draw a fighter. The mouse works in the menus too. In menus, each player presses A to join, then drags a cursor with the left stick and presses A to pick; B takes a pick back. QUIT is on the main menu and the fighter select screen. In a story scene, A hurries the line on and holding B skips the scene.
The drawing screen is for a mouse, a pen or a touch screen; a pad's stick moves a cursor and holding A draws, B undoes.
| Drawing | |
|---|---|
| draw / right-click | use the tool / pick up the colour under the pointer |
| wheel / middle-drag or Space-drag | zoom / move the page about |
M P G E I V |
marker, pencil, bucket, eraser, pick, move |
[ ] |
smaller, bigger |
| Ctrl+Z, Ctrl+Y, Ctrl+S | undo, redo, save (it saves by itself too) |
| a pen turned round | its eraser rubs out |
Playing alone: press CPU in the other player's panel. CHANGE cycles the computer's fighter and REMOVE takes it out; a second player pressing A on their own controller takes the seat back.
In a match, Start pauses, with a choice to resume or go back and pick fighters.
Keyboard extras: F1 hitboxes, F2 slow motion, F3 swap pad layout, F4 cycle stage, R restart.
One skeleton, shared by everyone. RigBone is the skeleton. Every fighter has exactly
those bones, so one animation library drives all of them. A drawing's parts are stored in a
canonical orientation — limbs pointing straight down — so a bone rotation of zero means the same
thing for every fighter regardless of the pose it was drawn in.
Everything is an integer frame count. The game logic runs at a fixed 60 Hz and no duration is ever a float in seconds. Startup, active frames, endlag, hitstun, buffers — all frames. That is what makes moves feel consistent and balance arguments concrete, and retrofitting it would mean rewriting every move.
A stage is data, not a renderer. There is one stage renderer for the whole game. A stage is
a palette, a list of rectangles and a list of props in StageCatalog.cs. If adding one seems to
need new drawing code, the data model is wrong.
A fighter — put its parts and a rig.json under fighters/<name>/, then add an entry to
FighterCatalog. Pick a weight class (Light / Medium / Heavy) and it inherits ten retuned
normal attacks automatically; only the four specials are authored per character, because
those come from the kid's own description of what their fighter does.
A stage — one entry in StageCatalog: a palette, some rectangles, some props. No drawing
code.
Checking your numbers — RegressionChecks runs on every boot and prints the percent at
which each move starts KOing, by simulating the launch. Read it before and after touching any
knockback number. It has already caught a swing that killed at 50% and a jab that caused 38
frames of hitstun.
scripts/ all the code, flat — engine, rig, stages, screens, tools
scenes/ one 2-line .tscn that attaches GameRoot; everything else is built in code
fighters/ one folder per fighter: source art, sliced parts, rig.json
tools/art/ the cut scripts for every drawn fighter, and the generators for the two stand-ins (Python 2.7 + PIL)
tools/audio/ the generators for every sound effect and both music loops (Python 2.7)
assets/ generated sound (assets/sfx/) and music (assets/music/) - never hand-edited
.ai/ design docs — the source of truth for anything design-shaped
for-nephew/ written for a 10-12 year old, not for developers
.ai/ is where decisions live, and why. Worth reading before changing anything design-shaped:
project-overview.md— the pitch and the five pillarsfighting-design.md— the combat contract, the knockback formulaart-pipeline.md— how a photo becomes a rigged fighterart-direction.md— crayon and marker, and why night is lavenderaudio-direction.md— how every sound is made, and how loudcharacter-design.md— a kid's description → a balanced movesetreleasing.md— the download, and how it updates itselfroadmap.md— what is built and what is deliberately deferred
for-nephew/ is written for a 10–12 year old: how to draw a fighter so it can
actually be rigged, and a character sheet to fill in. There is a nicer illustrated version of
the guide here.
The most important question on the character sheet is "what is your fighter TERRIBLE at?" — asked before anything is built. A kid designing a fighter will make it fast and strong and tough; a kid asked what it is bad at will cheerfully invent a weakness, because weaknesses are characterful and they know that already. That question does the balance work and is disguised as the fun one.
This repository is public, but the drawings in it are not up for grabs.
Any real child's artwork in fighters/ belongs to the child who drew it. Circy and Triguy are
Elim's — the characters, the names, the moves, and every drawing under fighters/circy/ and
fighters/triguy/ — and are shared here so people can see the game, not for reuse. Please don't copy the drawings into anything
else.
The same goes for EdgeLord and DoomBot, which are Eric's - the drawings under
fighters/edgelord/ and fighters/doombot/. Flambé (Swift) and Lugnut are
script-generated and carry no such claim. No licence has been chosen for the
code yet; until one is, the default applies and it is all rights reserved.


