Technical architecture
Working design. New events, appearances, mechanics, and political details remain proposals. See canon ledger.
Keep game rules independent from scene nodes. A tactical command requests an action; the rule system validates and resolves it. The rendered sword swing consumes the emitted result and does not calculate damage. This lets the same battle logic drive prediction, AI, replays, and automated checks.
| Module | Owns | Does not own |
|---|---|---|
| BattleState | Units, surfaces, readiness, statuses, objectives, RNG state | Camera or animations |
| RuleResolver | Legal actions, forecast, effects, outcome events | Input device logic |
| BattleView | Terrain, sprites, overlays, effects | Authoritative HP or turn order |
| CampaignState | Days, provinces, roads, resources, armies, event queue | Dialogue prose |
| CampaignResolver | Travel, economy, orders, remote conflicts | Interface rendering |
| NarrativeState | Flags, promises, relationship events, story gates | Duplicate economy calculations |
| Content | Jobs, abilities, items, encounters, dialogue definitions | Mutable save state |
Use authored Godot Resources for definitions, with stable string IDs and validation. Use explicit versioned save data for mutable state; save IDs instead of duplicating every content definition. A save includes the campaign date, queued orders/events, unit status, relationship promises, active mission, and random-generator state. Use atomic save replacement and a recoverable previous save.
For maps, build a graph of walkable surfaces and legal edges; a single (x,y) tile address cannot represent a bridge over another route. AStar3D can assist with graph search, but movement costs, clearance, jumps, occupied cells, and unit permissions remain custom game rules. Godot AStar3D.
For AI, start with explainable utility scoring over legal actions: objective progress, expected damage, danger, rescue, and formation. Cache reachability per relevant state. Do not begin with machine learning or an LLM controlling shipped combat. Author major enemy behavior as readable tactical priorities.
Narrative uses a small node format with explicit requirements, effects, choices, and fallback routes. Keep localization keys separate from code. A mature external dialogue tool may replace the format after an integration spike, but the concept does not depend on an unverified plugin.
Suggested future repository structure:
game/
project.godot
src/{battle,campaign,narrative,ui}/
scenes/{battle,world,camp}/
content/{jobs,units,abilities,provinces,dialogue}/
art/{characters,terrain,portraits,ui}/
audio/
tests/
tools/{asset_import,content_validation}/
docs/concept/
Use Git for code and text content; use Git LFS for large binary art sources once asset production starts. Keep source art, exported runtime assets, and generated candidates distinguishable. The browser prototype is versioned with this bible; it needs no package install to run or execute its rule tests.
Source document: 03-production-plan.md