Go to file
m3ultra 347804135d Gear wardrobe state (Phase B): vesper geared with MODELBEAST boxing gloves + headgear
- gear GLBs generated on MODELBEAST (flux product shot -> bg_remove ->
  trellis_mac), staged in foitin_assets/gear/
- pipeline: --attach bone-parents rigid gear (armature-scale compensated,
  '|'-separated spec); render_geared.sh holds calibrated transforms
- vesper: 3-state degradation geared -> base -> torn; specials knock gear
  off first, then shred clothes; kachujin stays 2-state (per-character data)
- spec doc: wardrobe section in CHARACTER_SPEC.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 22:23:05 +10:00
characters Gear wardrobe state (Phase B): vesper geared with MODELBEAST boxing gloves + headgear 2026-07-28 22:23:05 +10:00
engine Gear wardrobe state (Phase B): vesper geared with MODELBEAST boxing gloves + headgear 2026-07-28 22:23:05 +10:00
pipeline Gear wardrobe state (Phase B): vesper geared with MODELBEAST boxing gloves + headgear 2026-07-28 22:23:05 +10:00
tools Gear wardrobe state (Phase B): vesper geared with MODELBEAST boxing gloves + headgear 2026-07-28 22:23:05 +10:00
.gitignore Scaffold: deterministic 60Hz combat core, drop-in character format, MODELBEAST pipeline 2026-07-28 18:45:44 +10:00
Digitized Fighting Game Tech Report.pdf Scaffold: deterministic 60Hz combat core, drop-in character format, MODELBEAST pipeline 2026-07-28 18:45:44 +10:00
project.godot Scaffold: deterministic 60Hz combat core, drop-in character format, MODELBEAST pipeline 2026-07-28 18:45:44 +10:00
README.md Scaffold: deterministic 60Hz combat core, drop-in character format, MODELBEAST pipeline 2026-07-28 18:45:44 +10:00
STUDY.md Scaffold: deterministic 60Hz combat core, drop-in character format, MODELBEAST pipeline 2026-07-28 18:45:44 +10:00

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.

Run

Godot 4.7+. Open the project, hit play — or:

/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

# 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/.