Add Hanzhong settlement scenario

This commit is contained in:
2026-06-18 00:59:42 +09:00
parent 54c83d2c85
commit 8df0877f7b
5 changed files with 372 additions and 4 deletions

View File

@@ -4,7 +4,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr
## Current Slice
- Forty campaign scenarios.
- Forty-one campaign scenarios.
- Grid movement.
- Unit selection.
- Move, attack, wait, end turn.
@@ -61,6 +61,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr
- Ma Chao Retreat consumes the Guanzhong Foothold branch flags and drives the western campaign toward Guanzhong pacification or the Hanzhong front.
- Hanzhong Approach consumes the Ma Chao Retreat branch flags and opens Zhang Lu's mountain gate campaign.
- Hanzhong Gate consumes the Hanzhong Approach branch flags and opens Zhang Lu submission or Hanzhong pacification follow-up choices.
- Hanzhong Settlement consumes the Hanzhong Gate branch flags and turns the basin toward a Hanzhong garrison or Ruxu pivot.
- Post-battle choices can save campaign flags that branch later briefing text, shop stock, and scenario events.
- Scenario post-battle dialogue can play before the victory result panel.
- Basic battle EXP, level-ups, and core first-tier class promotion routes.

View File

@@ -203,6 +203,11 @@
"id": "040_hanzhong_gate",
"title": "Hanzhong Gate",
"path": "res://data/scenarios/040_hanzhong_gate.json"
},
{
"id": "041_hanzhong_settlement",
"title": "Hanzhong Settlement",
"path": "res://data/scenarios/041_hanzhong_settlement.json"
}
]
}

View File

@@ -0,0 +1,359 @@
{
"id": "041_hanzhong_settlement",
"name": "Hanzhong Settlement",
"objectives": {
"victory": "Reach the Hanzhong storehouse with Cao Cao, then defeat the settlement holdouts.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "hanzhong_storehouse_secured" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 18, "team": "player" }
]
},
"briefing": {
"title": "Hanzhong Settlement",
"location": "Hanzhong Basin, Qinling Passes, 215 CE",
"lines": [
"Zhang Lu's gate has fallen, but Hanzhong is not settled until its storehouses, passes, and local captains accept Cao Cao's order.",
"Cao Cao's army moves into the basin to decide whether the mountain province becomes a road east or a fortress held in the west."
],
"conditional_lines": [
{
"campaign_flags": { "accepted_zhang_lu_submission": true },
"lines": [
"Accepting Zhang Lu's submission gives Cao Cao clerks, registers, and surrendered grain stores before the settlement fight begins."
]
},
{
"campaign_flags": { "pacified_hanzhong": true },
"lines": [
"Pacifying Hanzhong by force breaks open the gates, but scattered mountain captains have sworn to make every storehouse expensive."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "accepted_zhang_lu_submission": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "pacified_hanzhong": true },
"items": ["war_drum"]
}
]
},
"roster": {
"max_units": 7,
"required_officers": ["cao_cao", "guo_jia"]
},
"formation": {
"cells": [[1, 3], [1, 4], [1, 5], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6]]
},
"map": {
"width": 18,
"height": 11,
"terrain": [
"GGGGHHGGGGGGHHGGGG",
"GGFFHHGGRRGGHHFFGG",
"GGRRRRRRRRRRRRFFGG",
"GGGFGHGGGGRRGGGGGG",
"RRRRRRRRRRRRRRRRRR",
"GGGGGHHGGGRRGFFGGG",
"GGHHGFFFGGFFFGGHHG",
"GGHHGFFFGGFFFGGHHG",
"GGGGGGFFGGHHHGGGGG",
"GGFFGGGGGGHHHFFGGG",
"GGGGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch41",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch41",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch41",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch41",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch41",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch41",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch41",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "ba_river_holdout_captain",
"name": "Ba River Holdout Captain",
"class_id": "commander",
"team": "enemy",
"level": 38,
"pos": [14, 4],
"base": { "hp": 132, "mp": 54, "atk": 39, "def": 31, "int": 31, "agi": 21 }
},
{
"unit_id": "hanzhong_storehouse_guard",
"name": "Hanzhong Storehouse Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 38,
"pos": [12, 4],
"base": { "hp": 108, "atk": 39, "def": 32 }
},
{
"unit_id": "five_peck_champion",
"name": "Five-Peck Champion",
"class_id": "champion",
"team": "enemy",
"level": 38,
"pos": [15, 3],
"base": { "hp": 136, "mp": 12, "atk": 41, "def": 29, "int": 12, "agi": 25 }
},
{
"unit_id": "settlement_ritual_advisor",
"name": "Settlement Ritual Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 38,
"pos": [13, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 96, "mp": 80, "atk": 8, "def": 20, "int": 41, "agi": 19 }
},
{
"unit_id": "ba_river_spear_north",
"name": "Ba River Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 38,
"pos": [12, 3],
"base": { "hp": 98, "atk": 39, "def": 29 }
},
{
"unit_id": "ba_river_spear_south",
"name": "Ba River Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 38,
"pos": [12, 5],
"base": { "hp": 98, "atk": 39, "def": 29 }
},
{
"unit_id": "hanzhong_basin_marksman",
"name": "Hanzhong Basin Marksman",
"class_id": "marksman",
"team": "enemy",
"level": 38,
"pos": [13, 2],
"base": { "hp": 90, "atk": 40, "def": 16, "agi": 28 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Cao Cao's army enters the Hanzhong basin to settle storehouses, captains, and pass roads after Zhang Lu's gate falls." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The gate is behind us, but every granary ahead has men deciding who they fear more." },
{ "speaker": "Guo Jia", "text": "Then let them choose order before hunger chooses for them." },
{ "speaker": "Cao Cao", "text": "Hanzhong is won when the road feeds us instead of fighting us." }
]
}
]
},
{
"id": "submission_opens_registers",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "accepted_zhang_lu_submission": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "Zhang Lu's clerks have brought the grain registers. The storehouse guards know which way the seal now points." },
{ "speaker": "Cao Cao", "text": "Good. A province that writes its own surrender is already half governed." }
]
}
]
},
{
"id": "pacification_stirs_holdouts",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "pacified_hanzhong": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Ba River Holdout Captain", "text": "Cao Cao pacified the gate by force. The basin will answer by force." },
{ "speaker": "Zhang He", "text": "They mistake stubbornness for terrain. We will flatten both." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "hanzhong_holdout_riders",
"name": "Hanzhong Holdout Riders",
"class_id": "cavalry",
"team": "enemy",
"level": 38,
"pos": [16, 3],
"base": { "hp": 90, "atk": 36, "def": 20, "agi": 26 }
}
}
]
},
{
"id": "turn_4_storehouse_unrest",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Settlement Ritual Advisor", "text": "If the grain stays shut, Cao Cao's road through Hanzhong stays hungry." },
{ "speaker": "Guo Jia", "text": "They understand supply. That makes this storehouse more important than the banners around it." }
]
}
]
},
{
"id": "hanzhong_storehouse_secured",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "set_objective",
"victory": "The Hanzhong storehouse is secured. Defeat the settlement holdout captain.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "This storehouse opens the basin. Hold it, and Hanzhong becomes a road." },
{ "speaker": "Ba River Holdout Captain", "text": "Then the road must be paid for in men." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "storehouse_halberd_guard",
"name": "Storehouse Halberd Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 38,
"pos": [16, 4],
"base": { "hp": 106, "atk": 39, "def": 32 }
},
{
"unit_id": "storehouse_arrow_screen",
"name": "Storehouse Arrow Screen",
"class_id": "archer",
"team": "enemy",
"level": 38,
"pos": [16, 5],
"base": { "hp": 84, "atk": 38, "def": 13, "agi": 27 }
}
]
}
]
},
{
"id": "turn_9_basin_settles",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 9 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The basin is quieting. Even the holdouts are watching the storehouse more than their captain." },
{ "speaker": "Cao Cao", "text": "Then make the storehouse the argument they cannot answer." }
]
}
]
}
],
"rewards": {
"gold": 8000,
"items": ["bean", "wine", "war_drum"]
},
"post_battle_dialogue": [
{ "speaker": "Guo Jia", "text": "Hanzhong's storehouses answer to Cao Cao now. The west can be held, or its roads can feed a turn back toward the east." },
{ "speaker": "Xiahou Yuan", "text": "Leave me a strong garrison and Hanzhong will watch the mountain roads. Pull the army east and Ruxu will hear us sooner." },
{ "speaker": "Cao Cao", "text": "A settled province is useful only if we decide what it is for." }
],
"post_battle_choices": [
{
"id": "garrison_hanzhong",
"label": "Garrison Hanzhong",
"description": "Cao Cao leaves a strong Hanzhong garrison to anchor the western mountain roads.",
"set_flags": { "garrisoned_hanzhong": true, "pivoted_to_ruxu": false },
"gold": 1300,
"items": ["imperial_seal"]
},
{
"id": "pivot_to_ruxu",
"label": "Pivot to Ruxu",
"description": "Cao Cao turns the settled Hanzhong roads into supply for an eastern campaign toward Ruxu.",
"set_flags": { "garrisoned_hanzhong": false, "pivoted_to_ruxu": true },
"gold": 1100,
"items": ["war_drum"]
}
]
}

View File

@@ -51,6 +51,7 @@ data/scenarios/037_guanzhong_foothold.json
data/scenarios/038_ma_chao_retreat.json
data/scenarios/039_hanzhong_approach.json
data/scenarios/040_hanzhong_gate.json
data/scenarios/041_hanzhong_settlement.json
```
## Campaign
@@ -103,7 +104,8 @@ The campaign file defines scenario order, resource paths, and officers who are a
{ "id": "037_guanzhong_foothold", "title": "Guanzhong Foothold", "path": "res://data/scenarios/037_guanzhong_foothold.json" },
{ "id": "038_ma_chao_retreat", "title": "Ma Chao Retreat", "path": "res://data/scenarios/038_ma_chao_retreat.json" },
{ "id": "039_hanzhong_approach", "title": "Hanzhong Approach", "path": "res://data/scenarios/039_hanzhong_approach.json" },
{ "id": "040_hanzhong_gate", "title": "Hanzhong Gate", "path": "res://data/scenarios/040_hanzhong_gate.json" }
{ "id": "040_hanzhong_gate", "title": "Hanzhong Gate", "path": "res://data/scenarios/040_hanzhong_gate.json" },
{ "id": "041_hanzhong_settlement", "title": "Hanzhong Settlement", "path": "res://data/scenarios/041_hanzhong_settlement.json" }
]
}
```

View File

@@ -21,7 +21,7 @@
- Destination victory conditions and objective map markers exist.
- Turn-limit conditions and HUD turn-limit display exist.
- Victory reward summary is visible.
- Next-battle flow exists across the current forty-scenario campaign.
- Next-battle flow exists across the current forty-one-scenario campaign.
- Campaign completion and new-campaign reset exist.
- Reward inventory can be brought into the next battle.
@@ -52,7 +52,7 @@
- Party roster persistence has a first save-file skeleton.
- Level, experience, and equipment persistence.
- Chapter selection and save/load.
- Linear forty-scenario campaign order exists.
- Linear forty-one-scenario campaign order exists.
- Save reset exists.
- Victory rewards, consumable counts, equipment stock, and equipped gear persist.
- A basic pre-battle shop with scenario-specific stock exists. Sell-back and richer item management are still planned.
@@ -100,6 +100,7 @@
- Thirty-eighth-scenario content exists with Ma Chao retreat pressure, Guanzhong commandery stakes, western road pursuit, and 037 branch reactions.
- Thirty-ninth-scenario content exists with Hanzhong approach pressure, Zhang Lu's border guard, mountain-gate stakes, and 038 branch reactions.
- Fortieth-scenario content exists with Hanzhong gate pressure, Zhang Lu's mountain guard, pass-road siege stakes, 039 branch reactions, and submission or pacification follow-up flags.
- Forty-first-scenario content exists with Hanzhong basin settlement, storehouse pressure, Zhang Lu submission or pacification branch reactions, and Hanzhong garrison or Ruxu pivot follow-up flags.
## Milestone 5: Presentation