From d2ebec0eba174fdc84e223490c187075f811ac0b Mon Sep 17 00:00:00 2001 From: autocommit Date: Thu, 4 Jun 2026 21:17:53 -0700 Subject: [PATCH] feat(units): author 3 missing specialist units referenced by building produces[] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit p2-57b gap analysis flagged dangling produces[] refs: adamantine_press / gravity_press → dwarf_master_engineer, royal_infirmary / field_hospital_corps → master_surgeon, grand_chronicle → saga_writer named units that had no JSON. Authored all three in public/resources/units/ matching the unit schema and the shape of their nearest siblings (dwarf_grand_engineer, field_surgeon, loremaster): Great-Person-tier support specialists with logistics blocks, real tech gates (deep_engineering / surgical_practice / rune_archives), upgrade chains, and GP actions consistent with their class. validate-game-data.py PASSes all three (the 90 unrelated failures pre-exist on main). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../units/dwarf_master_engineer.json | 129 ++++++++++++++++++ public/resources/units/master_surgeon.json | 107 +++++++++++++++ public/resources/units/saga_writer.json | 115 ++++++++++++++++ 3 files changed, 351 insertions(+) create mode 100644 public/resources/units/dwarf_master_engineer.json create mode 100644 public/resources/units/master_surgeon.json create mode 100644 public/resources/units/saga_writer.json diff --git a/public/resources/units/dwarf_master_engineer.json b/public/resources/units/dwarf_master_engineer.json new file mode 100644 index 00000000..e29e3f73 --- /dev/null +++ b/public/resources/units/dwarf_master_engineer.json @@ -0,0 +1,129 @@ +{ + "id": "dwarf_master_engineer", + "name": "Master Engineer", + "description": "The pinnacle of dwarven civil engineering — a master who reads load and stress the way others read runes. Where a grand engineer raises fortifications, a master engineer raises whole works: pressure-forges, gravity presses, and the deep machinery that turns raw adamantine into an empire's edge.", + "unit_type": "support", + "school": null, + "domain": "land", + "attributes": [ + "medium", + "biological" + ], + "attack_type": "none", + "hp": 75, + "attack": 0, + "defense": 3, + "ranged_attack": 0, + "range": 0, + "movement": 2, + "vision": 2, + "cost": 300, + "tech_required": "deep_engineering", + "upgradeable_from": "dwarf_grand_engineer", + "race_required": "dwarf", + "faction": "dwarf", + "can_found_city": false, + "can_build_improvements": true, + "flags": [ + "fast_build", + "instant_fortify", + "can_build_fortifications", + "can_build_railroads" + ], + "mana_cost": null, + "sprite": "sprites/units/dwarf_master_engineer.png", + "gender": { + "male": { + "name": "Master Engineer", + "sprite": "sprites/units/dwarf_master_engineer_dwarves_m.png" + }, + "female": { + "name": "Master Engineer", + "sprite": "sprites/units/dwarf_master_engineer_dwarves_f.png" + } + }, + "maintenance": 14, + "encyclopedia": { + "category": "combat", + "entry_type": "unit", + "detail_route": "/military/units", + "tags": [ + "land", + "support", + "none" + ] + }, + "tier": 6, + "action_point_capacity": 16, + "capturable": true, + "ransom_multiplier": 4.0, + "great_person_class": "great_engineer", + "great_person_gpp_type": "engineering", + "great_person_produces": "wonder_hurry", + "great_person_action": { + "action_type": "wonder_hurry", + "rationale": "Decisive production contribution toward late-era industrial projects and wonders.", + "max_target_tier": 9, + "production_value": 1200 + }, + "logistics": { + "composition": { + "leader": 1, + "member": 14 + }, + "inventory": { + "rations": 150, + "water": 120, + "tool_durability": 28, + "build_kits": 6 + }, + "stats": { + "str": 30, + "con": 110, + "end": 70 + }, + "terrain_movement": { + "road": 0.5, + "dirt_road": 0.65, + "wagon_track": 0.85, + "trail": 0.8, + "grass": 1.0, + "hills": 1.5, + "forest_open": 1.5, + "forest_dense": 2.5, + "mountain": 3.0, + "snow": 2.0, + "tundra": 1.5, + "desert": 2.5, + "marsh": 3.0, + "river_ford": 2.0, + "river_unfordable": "blocked", + "deep_water": "blocked" + }, + "carriers": { + "foot_runners": 2 + }, + "supply": { + "range_turns": 6, + "decline_rate": 0.8 + }, + "slots": { + "ox_wagon": { + "enabling_tech": "animal_husbandry", + "enabling_resources": [ + "cattle" + ], + "provides": "+2 carry-capacity, fodder consumption", + "count": 1 + }, + "officer_bird": { + "enabling_tech": "falconry_command", + "enabling_resources": [ + "crag_aerie" + ], + "provides": "crag-raven one-way carrier", + "count": 2 + } + } + } +} diff --git a/public/resources/units/master_surgeon.json b/public/resources/units/master_surgeon.json new file mode 100644 index 00000000..69434523 --- /dev/null +++ b/public/resources/units/master_surgeon.json @@ -0,0 +1,107 @@ +{ + "id": "master_surgeon", + "name": "Master Surgeon", + "description": "A surgeon whose name is spoken in every hold's infirmary. Backed by a full operating retinue and a wagon of sterilised instruments, a master surgeon brings soldiers back from wounds that field surgeons can only ease — and trains the next generation while doing it.", + "unit_type": "support", + "school": null, + "domain": "land", + "keywords": [ + "healer" + ], + "attributes": [ + "light", + "biological" + ], + "attack_type": "none", + "hp": 80, + "attack": 0, + "defense": 8, + "ranged_attack": 0, + "range": 0, + "movement": 3, + "vision": 1, + "cost": 300, + "tier": 5, + "tech_required": "surgical_practice", + "upgradeable_from": "field_surgeon", + "race_required": null, + "faction": "dwarf", + "mana_cost": null, + "sprite": "sprites/units/master_surgeon.png", + "gender": null, + "maintenance": 8, + "auto_join": false, + "encyclopedia": { + "category": "civilization", + "entry_type": "unit", + "detail_route": "/military/units", + "tags": [ + "land", + "support", + "medical" + ] + }, + "flavor": "First, do no harm. Then, do the impossible.", + "archetype": "civilian", + "promotion_tree": null, + "clan_affinity": [], + "logistics": { + "composition": { + "leader": 1, + "member": 15 + }, + "inventory": { + "rations": 150, + "water": 120, + "tool_durability": 4 + }, + "stats": { + "str": 30, + "con": 110, + "end": 95 + }, + "terrain_movement": { + "road": 0.5, + "dirt_road": 0.65, + "wagon_track": 0.85, + "trail": 0.8, + "grass": 1.0, + "hills": 1.5, + "forest_open": 1.5, + "forest_dense": 2.5, + "mountain": 3.0, + "snow": 2.0, + "tundra": 1.5, + "desert": 2.5, + "marsh": 3.0, + "river_ford": 2.0, + "river_unfordable": "blocked", + "deep_water": "blocked" + }, + "carriers": { + "foot_runners": 2 + }, + "supply": { + "range_turns": 6, + "decline_rate": 0.8 + }, + "slots": { + "ox_wagon": { + "enabling_tech": "animal_husbandry", + "enabling_resources": [ + "cattle" + ], + "provides": "+2 carry-capacity, fodder consumption", + "count": 1 + }, + "officer_bird": { + "enabling_tech": "falconry_command", + "enabling_resources": [ + "crag_aerie" + ], + "provides": "crag-raven one-way carrier", + "count": 2 + } + } + } +} diff --git a/public/resources/units/saga_writer.json b/public/resources/units/saga_writer.json new file mode 100644 index 00000000..01beca43 --- /dev/null +++ b/public/resources/units/saga_writer.json @@ -0,0 +1,115 @@ +{ + "id": "saga_writer", + "name": "Saga Writer", + "description": "Where a loremaster remembers, a saga writer composes — binding a clan's deeds into written cycles that outlast the dwarves who lived them. Their chronicles seed Golden Ages and turn a hold's history into a weapon of legitimacy.", + "unit_type": "support", + "school": null, + "domain": "land", + "keywords": [ + "culture_bearer" + ], + "attributes": [ + "light", + "biological" + ], + "attack_type": "none", + "hp": 55, + "attack": 0, + "defense": 5, + "ranged_attack": 0, + "range": 0, + "movement": 3, + "vision": 1, + "cost": 220, + "tier": 4, + "tech_required": "rune_archives", + "upgradeable_from": "loremaster", + "race_required": null, + "faction": "dwarf", + "mana_cost": null, + "sprite": "sprites/units/saga_writer.png", + "gender": null, + "maintenance": 5, + "auto_join": false, + "encyclopedia": { + "category": "civilization", + "entry_type": "unit", + "detail_route": "/military/units", + "tags": [ + "land", + "support", + "culture" + ] + }, + "flavor": "Stone forgets. Ink does not.", + "archetype": "civilian", + "promotion_tree": null, + "clan_affinity": [], + "great_person_class": "great_writer", + "great_person_gpp_type": "scholarship", + "great_person_produces": "culture_bomb", + "great_person_action": { + "action_type": "culture_bomb", + "rationale": "Commits a saga-cycle that floods a city's culture and can trigger a Golden Age.", + "max_target_tier": 5 + }, + "logistics": { + "composition": { + "leader": 1, + "member": 10 + }, + "inventory": { + "rations": 110, + "water": 88, + "tool_durability": 2 + }, + "stats": { + "str": 30, + "con": 88, + "end": 90 + }, + "terrain_movement": { + "road": 0.5, + "dirt_road": 0.65, + "wagon_track": 0.85, + "trail": 0.8, + "grass": 1.0, + "hills": 1.5, + "forest_open": 1.5, + "forest_dense": 2.5, + "mountain": 3.0, + "snow": 2.0, + "tundra": 1.5, + "desert": 2.5, + "marsh": 3.0, + "river_ford": 2.0, + "river_unfordable": "blocked", + "deep_water": "blocked" + }, + "carriers": { + "foot_runners": 2 + }, + "supply": { + "range_turns": 6, + "decline_rate": 0.8 + }, + "slots": { + "ox_wagon": { + "enabling_tech": "animal_husbandry", + "enabling_resources": [ + "cattle" + ], + "provides": "+2 carry-capacity, fodder consumption", + "count": 1 + }, + "officer_bird": { + "enabling_tech": "falconry_command", + "enabling_resources": [ + "crag_aerie" + ], + "provides": "crag-raven one-way carrier", + "count": 2 + } + } + } +}