# Raidborne A 4-player online raiding game. FFXIV Savage-level challenge in a condensed, bite-sized package. Built with Godot 4.x for PC (gamepad + mouse/keyboard). See [GDD.md](GDD.md) for the full Game Design Document — it is the single source of truth for all design decisions. ## Architecture Rule (non-negotiable) - **`logic/`** — pure GDScript. `extends RefCounted` only, **no `extends Node`**. No scene tree, no rendering, no input polling. Fully testable headless. - **`game/`** — Node-based presentation layer: scenes, UI, camera, VFX/audio. Reads from and sends inputs to `logic/`. Never contains game rules. - **`data/`** — JSON / Resource files for balance tuning. No logic in here. - **`tests/`** — headless tests that instantiate `logic/` classes directly. This split exists so the entire combat/progression/network core can be developed and tested with `godot --headless` in a terminal-only environment (AI-driven dev). ## Project Layout ``` project.godot GDD.md # Full design document (source of truth) logic/ combat/ # gcd_timer, combo_state, damage_calculator, ability_resolver, gimmick_gauges progression/ # xp_system, artifact_mods, drop_table network/ # raid_state, input_validator ai/ # boss_director (timed + HP-threshold event timeline) game/ hub/ # Hub world scenes (character screen, shop, raid board) raid/ # Encounter arenas, player controller, boss entity ui/ # HUD, party frames, combo indicator, GCD bar data/ classes.json # Class definitions: combos, abilities, positionals role_skills.json # Core + Specialist role skills per role artifacts.json # Horizontal-progression artifact modifiers (trade-offs) consumables.json # Potions, tonics, revive potion bosses/t1e1.json # Per-encounter timeline data (one file per boss) tests/ run_all.gd # Test runner entry point combat/ progression/ network/ assets/ # models/, animations/, audio/, ui/ ``` ## Running Tests (Headless) Requires a Godot 4.x binary on your PATH. Then: ```sh godot --headless -s res://tests/run_all.gd ``` The runner instantiates each `test_*.gd` script, calls every `test_*()` method, and prints PASS lines. Assertion failures show up as `push_error` output (`ASSERT FAILED ...`) in the console — grep for `ASSERT FAILED` to find them. > Note: the current runner is a minimal dependency-free harness. When we adopt > GUT (or gdUnit4), test files should be migrated to that framework; the logic/ > classes themselves will not change, only the test boilerplate. ## Status - [x] GDD v0.6 — all design systems defined - [x] Project scaffold + core `logic/` implementations (combat, progression, network state, boss director) - [x] FightSim — RaidState + BossDirector wired into a tickable server-side encounter runner - [x] Networking core: SyncProtocol (JSON messages), RaidServer (authoritative instance with input validation + damage pipeline), ClientView (client-side mirror) - [x] Data files with real structure and placeholder balance values - [x] Headless test suite: combat, progression, fight sim, full fake-client fights through the message pipeline (63 tests) - [ ] Live transport (ENet/MultiplayerPeer wrapper around RaidServer/ClientView) - [ ] `game/` presentation layer (scenes, HUD, player controller) - [ ] Networking (authoritative server, sync protocol) - [ ] Encounter content beyond t1e1