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>
68 lines
2.3 KiB
JSON
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"] }
|
|
]
|
|
}
|
|
]
|
|
}
|