- 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>
56 lines
2.1 KiB
Markdown
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/`.
|