Add Hanzhong approach scenario

This commit is contained in:
2026-06-18 00:50:09 +09:00
parent 471123378b
commit 41399da17e
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 ## Current Slice
- Thirty-eight campaign scenarios. - Thirty-nine campaign scenarios.
- Grid movement. - Grid movement.
- Unit selection. - Unit selection.
- Move, attack, wait, end turn. - Move, attack, wait, end turn.
@@ -59,6 +59,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr
- Weishui Crossing consumes the Weishui Camps branch flags and turns the western campaign from river defense into a Guanzhong foothold. - Weishui Crossing consumes the Weishui Camps branch flags and turns the western campaign from river defense into a Guanzhong foothold.
- Guanzhong Foothold consumes the Weishui Crossing branch flags and turns the seized riverbank into a western base against Ma Chao's rearguard. - Guanzhong Foothold consumes the Weishui Crossing branch flags and turns the seized riverbank into a western base against Ma Chao's rearguard.
- Ma Chao Retreat consumes the Guanzhong Foothold branch flags and drives the western campaign toward Guanzhong pacification or the Hanzhong front. - 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.
- Post-battle choices can save campaign flags that branch later briefing text, shop stock, and scenario events. - 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. - Scenario post-battle dialogue can play before the victory result panel.
- Basic battle EXP, level-ups, and core first-tier class promotion routes. - Basic battle EXP, level-ups, and core first-tier class promotion routes.

View File

@@ -193,6 +193,11 @@
"id": "038_ma_chao_retreat", "id": "038_ma_chao_retreat",
"title": "Ma Chao Retreat", "title": "Ma Chao Retreat",
"path": "res://data/scenarios/038_ma_chao_retreat.json" "path": "res://data/scenarios/038_ma_chao_retreat.json"
},
{
"id": "039_hanzhong_approach",
"title": "Hanzhong Approach",
"path": "res://data/scenarios/039_hanzhong_approach.json"
} }
] ]
} }

View File

@@ -0,0 +1,359 @@
{
"id": "039_hanzhong_approach",
"name": "Hanzhong Approach",
"objectives": {
"victory": "Reach the Hanzhong approach with Cao Cao, then defeat Zhang Lu's border guard.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "hanzhong_approach_reached" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 18, "team": "player" }
]
},
"briefing": {
"title": "Hanzhong Approach",
"location": "Hanzhong Approach, Qinling Passes, 215 CE",
"lines": [
"With Ma Chao's retreat broken, Cao Cao turns from Guanzhong's roads toward Hanzhong's mountain gates.",
"Zhang Lu's border guard watches the passes, where supply, faith, and narrow stone roads can slow even a victorious army."
],
"conditional_lines": [
{
"campaign_flags": { "pacified_guanzhong": true },
"lines": [
"Pacified Guanzhong gives Cao Cao a quiet rear and fuller supply trains before the mountain approach."
]
},
{
"campaign_flags": { "prepared_hanzhong_front": true },
"lines": [
"Preparations for Hanzhong put Cao Cao's vanguard in motion early, but Zhang Lu's border scouts have already lit the pass beacons."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "pacified_guanzhong": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "prepared_hanzhong_front": 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_ch39",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch39",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch39",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch39",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch39",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch39",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch39",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "zhang_lu_border_guard",
"name": "Zhang Lu Border Guard",
"class_id": "commander",
"team": "enemy",
"level": 36,
"pos": [14, 4],
"base": { "hp": 126, "mp": 50, "atk": 37, "def": 29, "int": 30, "agi": 20 }
},
{
"unit_id": "hanzhong_pass_champion",
"name": "Hanzhong Pass Champion",
"class_id": "champion",
"team": "enemy",
"level": 36,
"pos": [15, 3],
"base": { "hp": 130, "mp": 12, "atk": 39, "def": 27, "int": 12, "agi": 24 }
},
{
"unit_id": "mountain_gate_captain",
"name": "Mountain Gate Captain",
"class_id": "guard_captain",
"team": "enemy",
"level": 36,
"pos": [12, 4],
"base": { "hp": 104, "atk": 37, "def": 30 }
},
{
"unit_id": "hanzhong_ritual_advisor",
"name": "Hanzhong Ritual Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 36,
"pos": [13, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 92, "mp": 76, "atk": 8, "def": 18, "int": 39, "agi": 18 }
},
{
"unit_id": "hanzhong_spear_north",
"name": "Hanzhong Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 36,
"pos": [12, 3],
"base": { "hp": 94, "atk": 37, "def": 27 }
},
{
"unit_id": "hanzhong_spear_south",
"name": "Hanzhong Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 36,
"pos": [12, 5],
"base": { "hp": 94, "atk": 37, "def": 27 }
},
{
"unit_id": "hanzhong_pass_marksman",
"name": "Hanzhong Pass Marksman",
"class_id": "marksman",
"team": "enemy",
"level": 36,
"pos": [13, 2],
"base": { "hp": 86, "atk": 38, "def": 14, "agi": 27 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Cao Cao's army approaches Hanzhong's mountain gates as Zhang Lu's border guard blocks the pass road." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The road climbs quickly. Hanzhong will not fight like Guanzhong." },
{ "speaker": "Guo Jia", "text": "Mountains make small armies feel large and large armies feel slow." },
{ "speaker": "Cao Cao", "text": "Then we move before the mountain teaches them confidence." }
]
}
]
},
{
"id": "pacified_guanzhong_feeds_pass_column",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "pacified_guanzhong": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "Guanzhong is quiet enough to keep the pass column supplied." },
{ "speaker": "Cao Cao", "text": "A quiet rear lets a narrow road feel wider." }
]
}
]
},
{
"id": "prepared_hanzhong_front_lights_beacons",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "prepared_hanzhong_front": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang Lu Border Guard", "text": "Cao Cao prepared for Hanzhong early. Light every pass beacon and make speed cost him." },
{ "speaker": "Zhang He", "text": "The pass is awake. We will have to cut through before it gathers." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "hanzhong_beacon_riders",
"name": "Hanzhong Beacon Riders",
"class_id": "cavalry",
"team": "enemy",
"level": 36,
"pos": [16, 3],
"base": { "hp": 86, "atk": 34, "def": 18, "agi": 24 }
}
}
]
},
{
"id": "turn_4_pass_rituals",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Hanzhong Ritual Advisor", "text": "Hold the gates. Let the invaders learn how slowly a mountain opens." },
{ "speaker": "Guo Jia", "text": "They want delay to become belief. We cannot give them time." }
]
}
]
},
{
"id": "hanzhong_approach_reached",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "set_objective",
"victory": "The Hanzhong approach is reached. Defeat Zhang Lu's border guard.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "This is the approach. Break the border guard before Hanzhong closes its gates." },
{ "speaker": "Zhang Lu Border Guard", "text": "The gate is not yours because you can see it." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "hanzhong_gate_halberd",
"name": "Hanzhong Gate Halberd",
"class_id": "guard_captain",
"team": "enemy",
"level": 36,
"pos": [16, 4],
"base": { "hp": 102, "atk": 37, "def": 30 }
},
{
"unit_id": "hanzhong_gate_archer",
"name": "Hanzhong Gate Archer",
"class_id": "archer",
"team": "enemy",
"level": 36,
"pos": [16, 5],
"base": { "hp": 80, "atk": 36, "def": 12, "agi": 25 }
}
]
}
]
},
{
"id": "turn_9_gate_in_sight",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 9 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The gate road is in sight. Their border guard is running out of pass to hide behind." },
{ "speaker": "Cao Cao", "text": "Then make Hanzhong hear us before we knock." }
]
}
]
}
],
"rewards": {
"gold": 7600,
"items": ["bean", "wine", "war_drum"]
},
"post_battle_dialogue": [
{ "speaker": "Guo Jia", "text": "The Hanzhong approach is open. Zhang Lu must now decide whether his gates are walls or bargaining tables." },
{ "speaker": "Xiahou Yuan", "text": "We can secure the approach and bring up supplies, or press the gate before Zhang Lu's priests steady the defenders." },
{ "speaker": "Cao Cao", "text": "Hanzhong can be opened by patience or shock. Choose the first argument." }
],
"post_battle_choices": [
{
"id": "secure_hanzhong_approach",
"label": "Secure Approach",
"description": "Cao Cao secures the Hanzhong approach so the mountain column can advance safely.",
"set_flags": { "secured_hanzhong_approach": true, "pressed_zhang_lu_gate": false },
"gold": 1200,
"items": ["imperial_seal"]
},
{
"id": "press_zhang_lu_gate",
"label": "Press Gate",
"description": "Cao Cao presses Zhang Lu's gate before the Hanzhong defense can settle.",
"set_flags": { "secured_hanzhong_approach": false, "pressed_zhang_lu_gate": true },
"gold": 1000,
"items": ["war_drum"]
}
]
}

View File

@@ -49,6 +49,7 @@ data/scenarios/035_weishui_camps.json
data/scenarios/036_weishui_crossing.json data/scenarios/036_weishui_crossing.json
data/scenarios/037_guanzhong_foothold.json data/scenarios/037_guanzhong_foothold.json
data/scenarios/038_ma_chao_retreat.json data/scenarios/038_ma_chao_retreat.json
data/scenarios/039_hanzhong_approach.json
``` ```
## Campaign ## Campaign
@@ -99,7 +100,8 @@ The campaign file defines scenario order, resource paths, and officers who are a
{ "id": "035_weishui_camps", "title": "Weishui Camps", "path": "res://data/scenarios/035_weishui_camps.json" }, { "id": "035_weishui_camps", "title": "Weishui Camps", "path": "res://data/scenarios/035_weishui_camps.json" },
{ "id": "036_weishui_crossing", "title": "Weishui Crossing", "path": "res://data/scenarios/036_weishui_crossing.json" }, { "id": "036_weishui_crossing", "title": "Weishui Crossing", "path": "res://data/scenarios/036_weishui_crossing.json" },
{ "id": "037_guanzhong_foothold", "title": "Guanzhong Foothold", "path": "res://data/scenarios/037_guanzhong_foothold.json" }, { "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": "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" }
] ]
} }
``` ```

View File

@@ -21,7 +21,7 @@
- Destination victory conditions and objective map markers exist. - Destination victory conditions and objective map markers exist.
- Turn-limit conditions and HUD turn-limit display exist. - Turn-limit conditions and HUD turn-limit display exist.
- Victory reward summary is visible. - Victory reward summary is visible.
- Next-battle flow exists across the current thirty-eight-scenario campaign. - Next-battle flow exists across the current thirty-nine-scenario campaign.
- Campaign completion and new-campaign reset exist. - Campaign completion and new-campaign reset exist.
- Reward inventory can be brought into the next battle. - Reward inventory can be brought into the next battle.
@@ -52,7 +52,7 @@
- Party roster persistence has a first save-file skeleton. - Party roster persistence has a first save-file skeleton.
- Level, experience, and equipment persistence. - Level, experience, and equipment persistence.
- Chapter selection and save/load. - Chapter selection and save/load.
- Linear thirty-eight-scenario campaign order exists. - Linear thirty-nine-scenario campaign order exists.
- Save reset exists. - Save reset exists.
- Victory rewards, consumable counts, equipment stock, and equipped gear persist. - 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. - A basic pre-battle shop with scenario-specific stock exists. Sell-back and richer item management are still planned.
@@ -98,6 +98,7 @@
- Thirty-sixth-scenario content exists with Wei River crossing pressure, Guanzhong foothold stakes, western alliance strain, and 035 branch reactions. - Thirty-sixth-scenario content exists with Wei River crossing pressure, Guanzhong foothold stakes, western alliance strain, and 035 branch reactions.
- Thirty-seventh-scenario content exists with Guanzhong foothold pressure, Ma Chao's rearguard, split-alliance tension, and 036 branch reactions. - Thirty-seventh-scenario content exists with Guanzhong foothold pressure, Ma Chao's rearguard, split-alliance tension, and 036 branch reactions.
- Thirty-eighth-scenario content exists with Ma Chao retreat pressure, Guanzhong commandery stakes, western road pursuit, and 037 branch reactions. - 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.
## Milestone 5: Presentation ## Milestone 5: Presentation