# FOITIN Original digitized-style fighting game — the *Bikini Karate Babes* / *Mortal Kombat* formula (frame-captured fighters, data-driven everything) rebuilt with a modern engine and a generative 3D asset pipeline. All assets are our own. - **[STUDY.md](STUDY.md)** — reverse-engineering study of the BKB games + the assessment this project is built on. Start here. - **[characters/_spec/CHARACTER_SPEC.md](characters/_spec/CHARACTER_SPEC.md)** — the drop-in character folder format. - **[pipeline/README.md](pipeline/README.md)** — MODELBEAST character pipeline. ## Run Godot 4.7+. Open the project, hit play — or: ```bash /Applications/Godot.app/Contents/MacOS/Godot --path . ``` P1: **WASD** + **J**/**K** (punch/kick, `→+J` straight, QCF+**J** special) P2: **arrows** + **O**/**P** · **F1** hitbox viewer · **R** reset after KO ## Layout ``` engine/core/ fixed-tick combat core (FSM, input buffer, boxes, hit resolution) engine/debug/ training-mode hitbox overlay characters/ one folder per fighter — the engine scans this at boot tools/ gen_placeholder_char.py (stick-figure stand-in fighters) pipeline/ render→hitbox→pack scripts for MODELBEAST-made characters ``` ## Design rules 1. **60Hz deterministic tick.** All gameplay advances in `tick(input_mask)` from input only — keeps rollback netcode on the table. Rendering just reads state. 2. **Characters are data.** No fighter-specific code, ever. If a character needs a new mechanic, the mechanic becomes a generic engine feature driven by JSON. 3. **Art frame-rate ≠ game timing.** Moves are timed in ticks; sprite sequences stretch over them (BKB's `.bik`+`.zon`+`.geo` split, modernized). ## Adding a character ```bash # placeholder (instant): python3 tools/gen_placeholder_char.py gamma '#8855ee' # production (MODELBEAST): render moves to renders///*.png, then python3 pipeline/pack_character.py renders/ --name NAME --color '#hex' python3 pipeline/autohitbox.py characters/ # tune timings/damage in each move's data.json, bind moves in manifest.json ``` Restart the game — the roster is whatever's in `characters/`.