magicciv/public/resources/start_scripts/default_dwarf_tribe.json
Natalie 269316722e feat(@projects/@magic-civilization): 🎬 declarative start-script system (p3-14)
Game opening becomes a moddable JSON script driven by mc_worldsim::StartScriptRunner
and exposed to Godot via GdStartScript. Start scripts + dwarf tribe/wanderer units
live in public/resources/start_scripts; START_SCRIPTS.md documents the contract.
Adds tools/validate-start-scripts.py + wires it into CI (stage 3b) and verify.sh
(step 0b). Marks p3-14 done and regenerates the objectives dashboard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 17:56:50 -05:00

68 lines
2.3 KiB
JSON

{
"id": "default_dwarf_tribe",
"schema_version": 1,
"label": "Freepeople Tribe-Founding",
"description": "The default Age of Dwarves opening: wandering free-dwarves cross paths, converge into a tribe, and found the first hold. Turns -1 / 0 / 1.",
"rng_domain": "start_script",
"actors": [
{ "tag": "wanderer", "unit_id": "dwarf_wanderer", "controlled": false },
{ "tag": "tribe", "unit_id": "dwarf_tribe", "controlled": true }
],
"params": {
"wanderer_count": { "from_setup": "spawn_box_wanderer_count" },
"spawn_box": { "from_setup": "spawn_box_size" },
"mode": { "from_setup": "start_mode" },
"convergence_radius": { "from_setup": "tribe_convergence_radius" },
"min_to_form": { "from_setup": "min_wanderers_to_form_tribe" },
"inward_bias": { "from_setup": "custom_inward_bias_prob" },
"max_bonus_pop": { "from_setup": "custom_max_bonus_pop" }
},
"phases": [
{
"id": "wanderers",
"display_turn": -1,
"kind": "prologue",
"banner_key": "prologue_banner_turn_minus_one",
"banner_persist": true,
"allowed_actions": ["end_turn"],
"on_enter": [
{ "op": "place_spawn_box", "actor": "wanderer", "count_ref": "wanderer_count", "mode_ref": "mode", "radius_ref": "spawn_box" },
{ "op": "lift_fog", "area": "spawn_box" }
],
"on_resolve": [
{ "op": "roll_actor_directions", "actor": "wanderer", "mode_ref": "mode", "bias_ref": "inward_bias" }
]
},
{
"id": "converge",
"display_turn": 0,
"kind": "prologue",
"banner_key": "prologue_banner_turn_zero",
"banner_persist": true,
"allowed_actions": ["end_turn"],
"on_resolve": [
{ "op": "step_actors", "actor": "wanderer" },
{
"op": "converge_actors",
"actor": "wanderer",
"radius_ref": "convergence_radius",
"min_count_ref": "min_to_form",
"produce": "tribe",
"mode_ref": "mode",
"cap_ref": "max_bonus_pop"
}
]
},
{
"id": "first_hold",
"display_turn": 1,
"kind": "normal",
"banner_key": "prologue_banner_turn_one",
"banner_persist": false,
"allowed_actions": ["found_capital", "move", "end_turn"],
"on_enter": [
{ "op": "set_unit_actions", "actor": "tribe", "actions": ["found_capital", "move"] }
]
}
]
}