magicciv/public/resources/units
Natalie 2605712a61 fix(ai): 🔬 weave tech→tiered-unit production so the AI fields real armies
Follow-up to the TechWeb fix: research advanced to 109 techs but every city
still spawned tier-1 dwarf_warrior. Five stacked defects severed the
tech→unit→production chain; all are fixed here. Proven in a 599-turn duel
self-play (seed 42): slot 0 fields a 222-strong tier-8 dwarf_adamantine_champion
army; both clans now CHOOSE tier-2..8 units by tech (was tier-1 only).

1. units_catalog (#[serde(skip)]) was never stamped onto the dispatch
   GdPlayerApi — only GdGameState. The harness comment claimed 'both must be
   re-stamped at boot' but only did GdGameState. Added
   GdPlayerApi::set_units_runtime_catalog_json + a post-load harness re-stamp.
   Without it apply_queue_production/try_spawn_unit ran catalog-blind.

2. apply_queue_production classified queued ids as unit-vs-building by a
   starts_with("dwarf_") prefix. Replaced with an authoritative
   units_catalog.get() lookup (prefix kept only as empty-catalog fallback).
   The prefix leaked dwarf_-prefixed BUILDINGS (dwarf_deep_forge) onto the map
   as units and misfiled every non-dwarf unit.

3. project_tactical_player hardcoded race_id: None, filtering out every
   race_required:dwarf unit. Added PlayerState.race_id (race gates production →
   it is sim state, not pure presentation per p2-72a), stamped it in
   set_player_presentation_json + the headless harness (sourced from
   setup.json::default_race), and projected it.

4. build_unit_catalog loaded faction:"wild" monsters (ancient_hydra, …) and
   freepeople into the AI production catalog. With race_required:null they
   passed every race filter and, being high-tier, the picker preferred them.
   Excluded non-player factions from the production catalog (runtime catalog
   still carries them for encounters).

5. Generic warrior/spearmen/archer carried clan_affinity to ALL FIVE clans at
   tier 1, so clan_affinity_score=2 dominated tier and every named clan locked
   onto tier-1 'warrior'. Cleared their affinity (they are neutral baselines,
   not clan signatures).

mc-player-api 132 + mc-state 12 tests green. Known next layer (not this fix):
production VOLUME — try_spawn_unit's empty-queue dwarf_warrior auto-spawn still
floods tier-1, and the loser snowballs; the picker is correct, army composition
tuning is separate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:57:32 -04:00
..
adamantine_sentinel.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
adamantine_tank.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
ancestral_walker.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
ancient_hydra.json
anti_charge_line.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
anti_tank_rifleman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
anvil_guard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
apex_artillery.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
archer.json fix(ai): 🔬 weave tech→tiered-unit production so the AI fields real armies 2026-06-24 11:57:32 -04:00
assault_cavalry.json
assault_gunner.json
ballista_crew.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
bard.json
basilisk_wild.json
battle_medic.json
battle_priest.json
beacon_bearer.json
beast_scout.json
berserker.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
boar_scout.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
bolt_thrower_crew.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
cannon_crew.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
caravan_master.json
cartographer.json
catapult_crew.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
cavalry.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
combat_engineer.json
commando.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
deep_eye.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
defender.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dire_bear.json
dire_wolf.json
doomsoul.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dragoon.json
drake_wild.json
dwarf_adamantine_champion.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_arbalest.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_armored_barge.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_ascendant_engineer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_ascendant_sapper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_ascendant_scout.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_ascendant_smith.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_axeman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_ballista.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_berserker.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_bombard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_bulwark.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_carrier.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_catapult.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_crossbowman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_deep_frigate.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_deep_guard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_deep_scout.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_destroyer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_dreadnought.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_engineer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_flak_battery.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_forge_colossus.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_fortress_ship.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_founder.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_grand_engineer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_grand_sapper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_grand_scout.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_grand_smith.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_graven_warrior.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_gyrocopter.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_hammerguard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_high_engineer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_high_sapper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_high_smith.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_iron_hawk.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_iron_submarine.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_iron_vanguard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_ironwarden.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_master_engineer.json fix(@projects/@magic-civilization): 🐛 reconcile dangling tech/unit content refs (data_integrity) 2026-06-24 11:51:12 -04:00
dwarf_master_woodcutter.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_mithril_cruiser.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_mithril_hawk.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_mithril_vanguard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_prospector.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_repeating_arbalest.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_river_galley.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_sapper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_scout.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_silent_runner.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_sky_fortress.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_smith.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_spearman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_steam_bomber.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_steam_cannon.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_steam_corvette.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_steam_golem.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_steam_warship.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_thunder_arbalest.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_thunderer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_tribe.json feat(@projects/@magic-civilization): 🎬 declarative start-script system (p3-14) 2026-06-19 17:56:50 -05:00
dwarf_wanderer.json feat(@projects/@magic-civilization): 🎬 declarative start-script system (p3-14) 2026-06-19 17:56:50 -05:00
dwarf_war_galley.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_war_zeppelin.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_warrior.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
dwarf_woodcutter.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
elder_wyrm.json
emp_trooper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
feral_spider.json
field_artillery.json
field_medic.json
field_surgeon.json
fire_imp.json
foot_runner.json
forge_titan.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
founder.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
frostfang_alpha.json
garden_snail.json
goretooth.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
great_sculptor.json
guildmaster.json
hammerguard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
hand_cannoneer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
hearth_raider.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
hold_courier.json
hold_network_warden.json
iron_halberd.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
iron_sentinel.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
iron_strider.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
ironwarden.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
lava_elemental.json
light_field_gun.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
loremaster.json
machine_gunner.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
marksman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
master_surgeon.json
merchant.json
mithril_vanguard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
mortar_team.json
motorized_artillery.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
mountain_king.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
mounted_archer.json
mounted_rifleman.json
pike_guard.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
pikeman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
plated_warrior.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
powder_sapper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
quarrelman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
rail_cannon.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
ram_rider.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
ram_sniper.json
registry.md
resonance_telegrapher.json
rifleman.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
riveted_trooper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
rocket_battery.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
rocket_trooper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
rune_scribe.json
rune_spear.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
runesmith.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
saga_singer.json
saga_writer.json
sage.json
shambling_dead.json
shield_bearer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
siege_breaker.json
soulbolt.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
spearmen.json fix(ai): 🔬 weave tech→tiered-unit production so the AI fields real armies 2026-06-24 11:57:32 -04:00
steam_howitzer.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
steam_messenger.json
steam_walker.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
stone_sentinel.json
storm_trooper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
stormbolt_trooper.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
strike_walker.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
trebuchet_crew.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
trench_raider.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
tunnel_runner.json
tusker_knight.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
units.schema.json
units_air.schema.json
units_civilian.schema.json
units_land.schema.json
units_naval.schema.json
units_support.schema.json
war_ram.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00
warrior.json fix(ai): 🔬 weave tech→tiered-unit production so the AI fields real armies 2026-06-24 11:57:32 -04:00
wild_wyvern.json
wolf_pack.json
worker.json refactor(@projects/@magic-civilization): 🎨 unit sprite paths → _dwarf_male/_dwarf_female naming 2026-06-19 05:29:19 -05:00