A one-on-one 3D fighting game inspired by Street Fighter and Tekken, built in Godot 4. Its signature is a dynamic action camera that orbits and dollies in on every big hit.
- 8 fighters, each with normals, motion-input specials, a super and a distinct CPU personality (design notes in docs/characters):
- Kenji: zoner;
- Rhea: rushdown;
- Brutus: punisher;
- Valka: grappler with an unblockable command grab;
- Jin: Tae Kwon Do kicker who controls kick range;
- Mira: street brawler who powers up with Lakas Stance (Focus) until her rushes hit like a typhoon;
- Lian: Wing Chun counter fighter who catches strikes with a reversal stance and throws the attacker;
- Aelia: armoured knight whose heaviest moves shrug off a hit (super armour).
- Outfits that fit each style: a karate gi with headband, a Tae Kwon Do dobok, kickboxing gear, a wrestling singlet with knee pads and boots, a brawler's tank top and work pants, a street fighter's zip-up, track pants and sneakers, a kung fu jacket, and a knight's plate armour. Loose clothes hang and fold like cloth (wide gi sleeves, bloused jackets, baggy pants). Woven fabric textures, stitched hems and skin detail hold up in close-ups. Mirror matches get alternate colours.
- 8 stages: Boxing Ring, Dojo, Rooftop, Temple, Beach, Night Market, the Express (a fight on the roof of a speeding train) and the Kowloon Courtyard, where the sun rises round by round, the neighbours come out to watch and jets roar in low overhead. Each has its own music and ambient life (crowds, flames, smoke, rain, neon, passing trains, pigeons).
- Modes: Vs CPU, Arcade (ladder, scoring, shadow boss), local 2-player Versus, Online (rollback netcode, LAN discovery, join by IP, or an internet lobby server with rooms and spectating), Training (frame data, input display, record/playback, and combo trials with a "show me" demo) and a Demo of two CPU fighters on a random stage. Finished matches are saved as replays (pause, frame step, slow motion, seeking).
- Fighting-game systems: super meter with cinematic super freezes, counter hits, combos, juggles, wall splats and rope bounces at the stage edge, throws and throw breaks, high/mid/low blocking, and Tekken-style sidesteps.
- Engine: a deterministic 60 Hz simulation (verified identical on Windows and Linux) with a headless regression test suite.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| Keyboard (P1) | Gamepad | |
|---|---|---|
| Move / jump / crouch | W A S D | Left stick / D-pad |
| Light / Heavy Punch | U / I | X / Y |
| Light / Heavy Kick | J / K | A / B |
| Sidestep | L | RB |
| Pause & move list | Esc | Start |
- Specials use motion inputs (for example ↓↘→ + P), and a full super meter enables ↓↘→↓↘→ + P/K. Each fighter's moves are listed in the pause menu.
- Player 2 uses the arrow keys with numpad 4/5 (punches), 1/2 (kicks) and 6 (sidestep), or a second gamepad.
- Online: one player hosts; on the same network the other picks the game from the list, or joins by address (UDP port 7777; forward it on the host's router to play over the internet). Both players need the same build. Connections are encrypted, and both screens show a 6-digit security code to compare.
- Internet lobby (Online → Internet Lobby): connect to a 3D Fighter lobby server, open a room or join one from the list or by its 6-letter code, no port forwarding needed (the server punches through NATs, or relays the encrypted traffic). Rooms can allow spectators, who watch live with a short delay and can send reactions.
- Remapping: every key and gamepad button can be changed per player in Options → Controls, which shows a controller diagram. The triggers can be bound too.
Requires Godot 4.7 with a Vulkan-capable GPU.
godot -e --path . # open in the editor
godot --path . # run the gamegodot_console --headless --path . -s res://tests/sim_test.gd # exit code 1 on failureThis needs the Godot 4.7.2 export templates for Windows, macOS and Linux, plus Python 3.
python tools/build_release.py all # Windows + macOS + Linux -> dist/
python tools/build_release.py windows linux # any subset
python tools/build_release.py all --test # run the tests first, stop on failure
python tools/build_release.py all --version 0.3.0 --test --notarize # full releaseThe script produces three archives:
| Output | Contents |
|---|---|
dist/3DFighter-v<ver>-windows.zip |
Single exe plus README; smoke-tested |
dist/3DFighter-v<ver>-macos.zip |
Universal .app, signed with Developer ID; --notarize notarizes and staples it |
dist/3DFighter-v<ver>-linux.tar.gz |
x86_64 binary plus README; smoke-tested in WSL when available |
Mac signing reads its credentials from %USERPROFILE%\AppleDeveloper, which stays outside the repo. Use --no-sign for a local unsigned build.
scripts/ gameplay (fighter, AI, camera, FX, UI, arcade, training)
scenes/ menus, fight scene, generated stages
data/ characters and moves (generated; edit tools/build_movesets.gd)
tools/ generators (stages, animations, movesets, key art) and build_release.py
tests/ headless simulation tests
Third-party assets in the game are CC0 except Aelia's model (CC BY), all credited in assets/CREDITS.md (the logo is lettered with the Permanent Marker font, Apache 2.0, kept in tools/fonts/):
- Characters and animations: Quaternius.
- Aelia's model: "Aelia Character Preview" by Abinady10 (Blend Swap 30219), CC BY; rigged, posed and recoloured for the game.
- Skies and textures: Poly Haven.
- Sounds and announcer: Kenney.
- Music and voices: OpenGameArt artists.
Made with Godot Engine.
© 2026 Clint Christopher Canada.
- Code: MIT License.
- Original assets (stages, generated animations, portraits, key art and logo, synthesized sounds): CC BY 4.0.
- Third-party assets: keep their own licenses (CC0, Aelia's model CC BY; the logo tool's font is Apache 2.0); see assets/CREDITS.md.








