foitin/README.md
m3ultra b067bf7f0b Scaffold: deterministic 60Hz combat core, drop-in character format, MODELBEAST pipeline
- Godot 4.7 project; fixed-tick FSM fighter, facing-relative input buffer
  with numpad motion parsing, box collision, training-mode hitbox overlay
- characters/ = self-describing drop-in folders (spec in _spec/); two
  generated placeholder fighters (alpha, beta)
- pipeline/: pack_character.py + autohitbox.py (pose/silhouette hurtboxes)
- STUDY.md: reverse-engineering study of the BKB reference games

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 18:45:44 +10:00

56 lines
2.1 KiB
Markdown

# 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/<id>/<move>/*.png, then
python3 pipeline/pack_character.py renders/<id> --name NAME --color '#hex'
python3 pipeline/autohitbox.py characters/<id>
# tune timings/damage in each move's data.json, bind moves in manifest.json
```
Restart the game — the roster is whatever's in `characters/`.