Skip to content
eclancyPublic

About

A platform fighter where every character is a kid's drawing, cut up and rigged as a paper puppet. Smash-style knockback. Godot 4.5 Mono / C#.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

DrawFight

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.

The DrawFight title screen: two stick figures fighting on ruled notebook paper


The trick

One drawing, sliced into body parts, animated as a paper puppet:

One stick figure shown in ten poses: idle, run, jump, fall, land, block, hurt, attack windup, attack strike, dash

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.


Status

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.


Playing it

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.

Running it from source

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 it

Handy 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

Controls

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.


Three ideas the whole codebase rests on

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.

The Open Plains stage: stick figures on green grass with crayon-drawn trees whose tops are the platforms, under a blue sky


Adding content

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.


Layout

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

Design docs

.ai/ is where decisions live, and why. Worth reading before changing anything design-shaped:


For the kids

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.


A note on the art

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.

About

A platform fighter where every character is a kid's drawing, cut up and rigged as a paper puppet. Smash-style knockback. Godot 4.5 Mono / C#.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages