diff --git a/CLAUDE.md b/CLAUDE.md index 6129d872..68be215b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,18 +6,18 @@ Fantasy 4X turn-based strategy game (Civ5 + Master of Magic + Magic: The Gatheri ## Scope -**Early access demo** ("Age of Four") — 4 races (High Elf, Human, Dwarf, Orc), all 5 magic schools, full 4X + magic loop. See `.project/ROADMAP.md` for scope and build sequence. +**Early access demo** ("Age of Dwarves") — 4 races (High Elf, Human, Dwarf, Orc), all 5 magic schools, full 4X + magic loop. See `.project/ROADMAP.md` for scope and build sequence. ## Tech Stack - **Engine:** Godot 4.x - **Language:** GDScript only (no C#, no GDExtension) -- **Data:** JSON game packs (`games/age-of-four/data/*.json`) +- **Data:** JSON game packs (`games/age-of-dwarves/data/*.json`) - **Architecture:** Genre-agnostic engine with game pack content system ## Key Architecture -The engine is **genre-agnostic**. All game content and display text comes from game packs. The fantasy game "Age of Four" is the default. See `docs/engine/ABSTRACTION.md` (to be written). +The engine is **genre-agnostic**. All game content and display text comes from game packs. The fantasy game "Age of Dwarves" is the default. See `docs/engine/ABSTRACTION.md` (to be written). - UI labels resolve through `ThemeVocabulary.lookup(engine_key)` — never hardcode theme strings - Sprites resolve through `ThemeAssets.resolve(path)` — never hardcode asset paths @@ -30,7 +30,7 @@ The engine is **genre-agnostic**. All game content and display text comes from g See `README.md` for the full doc index. Docs live in two places: - **`engine/docs/`** — genre-agnostic engine architecture (written as engine systems are built) -- **`games/age-of-four/docs/`** — fantasy game design (races, combat, spells, economy, etc.) +- **`games/age-of-dwarves/docs/`** — fantasy game design (races, combat, spells, economy, etc.) Build process docs (roadmap, feature gap, task lists) stay in `.project/`. @@ -43,7 +43,7 @@ The climate simulation runs in two runtimes: GDScript (Godot game engine) and Ty ### Architecture ``` -games/age-of-four/data/climate_spec.json ← Canonical thresholds, events, ley rules +games/age-of-dwarves/data/climate_spec.json ← Canonical thresholds, events, ley rules ↓ read at runtime by both engines engine/src/modules/climate/climate.gd ← SOURCE OF TRUTH (physics steps) engine/src/modules/climate/ecological_events.gd ← SOURCE OF TRUTH (stochastic events) @@ -52,7 +52,7 @@ engine/src/modules/climate/climate_spec_eval.gd ← SOURCE OF TRUTH (spec c ↓ transpiled by tools/transpile-engine/transpile.py packages/engine-ts/src/ClimatePhysics.generated.ts ← AUTO-GENERATED, never edit packages/engine-ts/src/index.ts ← Re-exports for @magic-civ/engine-ts -guide/age-of-four/ ← Consumes @magic-civ/engine-ts (workspace:*) +guide/age-of-dwarves/ ← Consumes @magic-civ/engine-ts (workspace:*) ``` ### Transpiler Package @@ -109,7 +109,7 @@ uv run tools/transpile-engine/transpile.py --check # CI: exit 1 if stale | `*.json` data files, `vocabulary.json`, `game.json` | `game-data` | | `*.tscn` UI scenes, HUD panels, overlays, menus | `godot-ui` | | TileMap, sprites, camera, fog, selection highlight, animation | `godot-renderer` | -| `guide/age-of-four/`, `guide/engine/`, React, Vite, climate sim | `guide-web` | +| `guide/age-of-dwarves/`, `guide/engine/`, React, Vite, climate sim | `guide-web` | ## Conventions @@ -207,14 +207,14 @@ engine/ integration/ — end-to-end integration tests games/ - age-of-four/ + age-of-dwarves/ data/ — all JSON content (units/, spells/, techs/, terrain/, ...) assets/ — sprites/, icons/ game.json — game manifest guide/ engine/ — @magic-civ/guide-engine (shared UI components, types, utils) - age-of-four/ — @magic-civilization/guide-age-of-four (all pages, app shell) + age-of-dwarves/ — @magic-civilization/guide-age-of-dwarves (all pages, app shell) ``` ## DX Tooling @@ -259,8 +259,8 @@ Self-capturing test scenes. Each phase should have a proof scene that sets up mi ### DataLoader — File vs Directory Pattern `DataLoader` supports two layouts per data category: -- **Single file:** `games/age-of-four/data/races.json` -- **Split directory:** `games/age-of-four/data/units/` — reads all `.json` files, merges by `id` +- **Single file:** `games/age-of-dwarves/data/races.json` +- **Split directory:** `games/age-of-dwarves/data/units/` — reads all `.json` files, merges by `id` **Never create a monolithic file that exceeds 500 lines.** @@ -303,5 +303,5 @@ This project is rebuilt milestone-by-milestone from a reference implementation. - `GameState` must support multiple map layers (future Ethereal Plane) - All system state changes emit signals via `EventBus` - Building/unit effects are data-driven from JSON — don't hardcode behavior -- Always call `DataLoader.load_game("age-of-four")` when running scenes directly +- Always call `DataLoader.load_game("age-of-dwarves")` when running scenes directly - **NEVER use anime models for game art** — use `juggernaut-xl-v9`, `epicrealism-xl`, `illustrious-xl-v2` diff --git a/README.md b/README.md index bdd7e21b..1699bcad 100644 --- a/README.md +++ b/README.md @@ -11,14 +11,14 @@ engine/ — genre-agnostic game engine (GDScript) docs/ — engine architecture docs games/ - age-of-four/ — fantasy game pack (the default theme) + age-of-dwarves/ — fantasy game pack (the default theme) data/ — all JSON game content assets/ — sprites, icons docs/ — game design docs (races, combat, spells, economy) guide/ — player guide web app (React/TypeScript) engine/ — @magic-civ/guide-engine (shared components) - age-of-four/ — guide pages for Age of Four + age-of-dwarves/ — guide pages for Age of Dwarves packages/ engine-ts/ — @magic-civ/engine-ts (auto-generated climate simulation) @@ -36,14 +36,14 @@ tools/ — sprite generation, transpiler, screenshot capture | ABSTRACTION.md | Genre-agnostic vocabulary, theme pack system | | DATA_FORMAT.md | JSON data schemas, DataLoader patterns | -### Game Design (`games/age-of-four/docs/`) +### Game Design (`games/age-of-dwarves/docs/`) | Doc | Covers | |-----|--------| -| [RACES.md](games/age-of-four/docs/RACES.md) | 4 demo races, gendering, fusions, release schedule | -| [ECONOMIC_SYSTEMS.md](games/age-of-four/docs/ECONOMIC_SYSTEMS.md) | Economy, civic axis, capitalism cascade | -| [GOVERNMENTS.md](games/age-of-four/docs/GOVERNMENTS.md) | Government types and mechanics | -| [GLOSSARY.md](games/age-of-four/docs/GLOSSARY.md) | Term definitions | +| [RACES.md](games/age-of-dwarves/docs/RACES.md) | 4 demo races, gendering, fusions, release schedule | +| [ECONOMIC_SYSTEMS.md](games/age-of-dwarves/docs/ECONOMIC_SYSTEMS.md) | Economy, civic axis, capitalism cascade | +| [GOVERNMENTS.md](games/age-of-dwarves/docs/GOVERNMENTS.md) | Government types and mechanics | +| [GLOSSARY.md](games/age-of-dwarves/docs/GLOSSARY.md) | Term definitions | | COMBAT_SYSTEM.md | Combat mechanics (written when M8 is built) | | SPELL_SYSTEM.md | Spell/mana system (written when M9 is built) | | ERA_SYSTEM.md | Era progression (written when needed) | diff --git a/export_presets.cfg b/export_presets.cfg index 655e3608..d0c88cc2 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -210,31 +210,31 @@ user_data/accessible_from_files_app=false privacy/camera=false privacy/microphone=false privacy/photolibrary=false -icons/iphone_120x120="res://games/age-of-four/icons/icon_120x120.png" -icons/iphone_180x180="res://games/age-of-four/icons/icon_180x180.png" -icons/ipad_76x76="res://games/age-of-four/icons/icon_76x76.png" -icons/ipad_152x152="res://games/age-of-four/icons/icon_152x152.png" -icons/ipad_167x167="res://games/age-of-four/icons/icon_167x167.png" -icons/app_store_1024x1024="res://games/age-of-four/icons/icon_1024x1024.png" -icons/spotlight_40x40="res://games/age-of-four/icons/icon_40x40.png" -icons/spotlight_80x80="res://games/age-of-four/icons/icon_80x80.png" -icons/spotlight_120x120="res://games/age-of-four/icons/icon_120x120.png" -icons/settings_29x29="res://games/age-of-four/icons/icon_29x29.png" -icons/settings_58x58="res://games/age-of-four/icons/icon_58x58.png" -icons/settings_87x87="res://games/age-of-four/icons/icon_87x87.png" -icons/notification_20x20="res://games/age-of-four/icons/icon_20x20.png" -icons/notification_40x40="res://games/age-of-four/icons/icon_40x40.png" -icons/notification_60x60="res://games/age-of-four/icons/icon_60x60.png" -icons/notification_76x76="res://games/age-of-four/icons/icon_76x76.png" -icons/notification_114x114="res://games/age-of-four/icons/icon_114x114.png" +icons/iphone_120x120="res://games/age-of-dwarves/icons/icon_120x120.png" +icons/iphone_180x180="res://games/age-of-dwarves/icons/icon_180x180.png" +icons/ipad_76x76="res://games/age-of-dwarves/icons/icon_76x76.png" +icons/ipad_152x152="res://games/age-of-dwarves/icons/icon_152x152.png" +icons/ipad_167x167="res://games/age-of-dwarves/icons/icon_167x167.png" +icons/app_store_1024x1024="res://games/age-of-dwarves/icons/icon_1024x1024.png" +icons/spotlight_40x40="res://games/age-of-dwarves/icons/icon_40x40.png" +icons/spotlight_80x80="res://games/age-of-dwarves/icons/icon_80x80.png" +icons/spotlight_120x120="res://games/age-of-dwarves/icons/icon_120x120.png" +icons/settings_29x29="res://games/age-of-dwarves/icons/icon_29x29.png" +icons/settings_58x58="res://games/age-of-dwarves/icons/icon_58x58.png" +icons/settings_87x87="res://games/age-of-dwarves/icons/icon_87x87.png" +icons/notification_20x20="res://games/age-of-dwarves/icons/icon_20x20.png" +icons/notification_40x40="res://games/age-of-dwarves/icons/icon_40x40.png" +icons/notification_60x60="res://games/age-of-dwarves/icons/icon_60x60.png" +icons/notification_76x76="res://games/age-of-dwarves/icons/icon_76x76.png" +icons/notification_114x114="res://games/age-of-dwarves/icons/icon_114x114.png" storyboard/use_custom_storyboard=false storyboard/custom_storyboard="" storyboard/image_scale_mode=0 storyboard/use_custom_bg_color=false storyboard/custom_bg_color=Color(0, 0, 0, 1) -icons/ios_128x128="res://games/age-of-four/icons/icon_128x128.png" -icons/ios_136x136="res://games/age-of-four/icons/icon_136x136.png" -icons/ios_192x192="res://games/age-of-four/icons/icon_192x192.png" +icons/ios_128x128="res://games/age-of-dwarves/icons/icon_128x128.png" +icons/ios_136x136="res://games/age-of-dwarves/icons/icon_136x136.png" +icons/ios_192x192="res://games/age-of-dwarves/icons/icon_192x192.png" texture_format/s3tc=false texture_format/etc=false texture_format/etc2=true diff --git a/life_mode_t200.png b/life_mode_t200.png new file mode 100644 index 00000000..d8e2c42d Binary files /dev/null and b/life_mode_t200.png differ diff --git a/life_mode_t500_fixed.png b/life_mode_t500_fixed.png new file mode 100644 index 00000000..8f8d1e17 Binary files /dev/null and b/life_mode_t500_fixed.png differ diff --git a/life_t500_spec_working.png b/life_t500_spec_working.png new file mode 100644 index 00000000..d99c5736 Binary files /dev/null and b/life_t500_spec_working.png differ diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 929bf081..fb9b597d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,4 @@ packages: - packages/* - guide/engine - - guide/age-of-four + - guide/age-of-dwarves diff --git a/run b/run index 600ec8a8..ac1d2d2d 100755 --- a/run +++ b/run @@ -93,7 +93,7 @@ cmd_verify() { echo "" echo -e "${BLUE}[2/4] Guide typecheck...${NC}" - pnpm --prefix guide/age-of-four typecheck || exit_code=$? + pnpm --prefix guide/age-of-dwarves typecheck || exit_code=$? echo "" echo -e "${BLUE}[3/4] Transpiler check (GDScript → TS sync)...${NC}" @@ -133,7 +133,7 @@ cmd_test() { echo "" echo -e "${BLUE}Running vitest (guide)...${NC}" - pnpm --prefix guide/age-of-four test || exit_code=$? + pnpm --prefix guide/age-of-dwarves test || exit_code=$? return $exit_code } diff --git a/t1806_life.png b/t1806_life.png new file mode 100644 index 00000000..f019d74e Binary files /dev/null and b/t1806_life.png differ