Add last captains scenario

This commit is contained in:
2026-06-18 02:48:23 +09:00
parent bb84c76076
commit d53fbfd6dd
5 changed files with 376 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
- Sixty-four campaign scenarios.
- Sixty-five campaign scenarios.
- Grid movement.
- Unit selection.
- Move, attack, wait, end turn.
@@ -85,6 +85,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr
- Southern Fleet consumes the Nanhai Route branch flags and breaks the coastal anchorage toward a secured fleet or pressed Hainan coast.
- Hainan Coast consumes the Southern Fleet branch flags and breaks the shore road toward a secured coast or pressed final harbor.
- Final Harbor consumes the Hainan Coast branch flags and ends the southern harbor line toward secured order or pursued last captains.
- Last Captains consumes the Final Harbor branch flags and settles the remaining captain ledgers toward registered order or pursued sea exiles.
- 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

@@ -323,6 +323,11 @@
"id": "064_final_harbor",
"title": "Final Harbor",
"path": "res://data/scenarios/064_final_harbor.json"
},
{
"id": "065_last_captains",
"title": "Last Captains",
"path": "res://data/scenarios/065_last_captains.json"
}
]
}

View File

@@ -0,0 +1,363 @@
{
"id": "065_last_captains",
"name": "Last Captains",
"objectives": {
"victory": "Reach the last captains' line with Cao Cao, then defeat the captain leader.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "last_captains_line_reached" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 18, "team": "player" }
]
},
"briefing": {
"title": "Last Captains",
"location": "Last Captains' Road, Southern Sea, Eastern Front, 220 CE",
"lines": [
"The final harbor has fallen, but the last Wu captains gather with their ship ledgers and loyal guards on the road beyond the docks.",
"Cao Cao advances to decide whether those captains are settled under Wei order or driven out as sea exiles."
],
"conditional_lines": [
{
"campaign_flags": { "secured_final_harbor": true },
"lines": [
"Securing the final harbor gives Wei its ledgers, dock seals, and surrendered pilots, leaving the last captains few names to hide behind."
]
},
{
"campaign_flags": { "pursued_last_captains": true },
"lines": [
"Pursuing the last captains keeps them from scattering, but the men who remain now fight because every other harbor has closed."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "secured_final_harbor": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "pursued_last_captains": 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": [
"WWWWWWWWWWWWWWWWWW",
"WGGGFFWWRRWWFFGGGW",
"GGGGWWGGGGRRGGGGGG",
"GGFFWWGGRRRRGFFGGG",
"RRRRRRRRRRRRRRRRRR",
"GGFFWWGGRRRRGFFGGG",
"GGGGWWGGGGRRGGGGGG",
"GHHHWWGFFFGGFFFGGG",
"GHHHWWGGGGHHHGGGGG",
"GGGGWWGGGGHHHFFGGG",
"WWWWWWWWWWWWWWWWWW"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch65",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch65",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch65",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch65",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch65",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch65",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch65",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "last_captain_leader",
"name": "Last Captain Leader",
"class_id": "commander",
"team": "enemy",
"level": 62,
"pos": [14, 4],
"base": { "hp": 214, "mp": 104, "atk": 65, "def": 56, "int": 54, "agi": 41 }
},
{
"unit_id": "captain_ledger_guard",
"name": "Captain Ledger Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 62,
"pos": [12, 4],
"base": { "hp": 158, "atk": 64, "def": 57 }
},
{
"unit_id": "last_captain_boat",
"name": "Last Captain Boat",
"class_id": "champion",
"team": "enemy",
"move_type": "water",
"level": 62,
"pos": [4, 3],
"base": { "hp": 186, "mp": 12, "atk": 66, "def": 52, "int": 16, "agi": 48 }
},
{
"unit_id": "last_captain_advisor",
"name": "Last Captain Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 62,
"pos": [13, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 144, "mp": 128, "atk": 8, "def": 43, "int": 65, "agi": 38 }
},
{
"unit_id": "last_captain_spear_north",
"name": "Last Captain Spear",
"class_id": "infantry",
"team": "enemy",
"level": 62,
"pos": [12, 3],
"base": { "hp": 146, "atk": 63, "def": 53 }
},
{
"unit_id": "last_captain_spear_south",
"name": "Last Captain Spear",
"class_id": "infantry",
"team": "enemy",
"level": 62,
"pos": [12, 5],
"base": { "hp": 146, "atk": 63, "def": 53 }
},
{
"unit_id": "last_captain_arrow_boat",
"name": "Last Captain Arrow Boat",
"class_id": "marksman",
"team": "enemy",
"move_type": "water",
"level": 62,
"pos": [5, 5],
"base": { "hp": 138, "atk": 64, "def": 39, "agi": 51 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Wei advances beyond the final harbor to bring the last Wu captains to terms." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The last captains are ahead. They still guard the ledgers as if paper can float them away." },
{ "speaker": "Guo Jia", "text": "Names matter at the end. A captain without a ledger becomes a bandit with a boat." },
{ "speaker": "Cao Cao", "text": "Then take the names and leave no boat outside Wei's count." }
]
}
]
},
{
"id": "secured_harbor_lists_captains",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "secured_final_harbor": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "The final harbor ledgers list their captains and stores. Their hiding places are already ink." },
{ "speaker": "Cao Cao", "text": "Ink can bind a campaign as surely as iron. Advance." }
]
}
]
},
{
"id": "pursued_captains_commit_escape_boat",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "pursued_last_captains": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Last Captain Leader", "text": "Wei gives chase even past the harbor. Send the escape boat and keep our names from their ledgers." },
{ "speaker": "Cao Ren", "text": "They fear being counted more than being struck. That fear has weight." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "last_captain_escape_boat",
"name": "Last Captain Escape Boat",
"class_id": "champion",
"team": "enemy",
"move_type": "water",
"level": 62,
"pos": [5, 3],
"base": { "hp": 136, "atk": 59, "def": 43, "agi": 49 }
}
}
]
},
{
"id": "turn_4_captains_burn_ledgers",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Last Captain Advisor", "text": "Burn the spare ledgers. If Wei wins, let them count ashes." },
{ "speaker": "Guo Jia", "text": "They still mistake records for loyalty. Take the men before the ash cools." }
]
}
]
},
{
"id": "last_captains_line_reached",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "set_objective",
"victory": "The last captains' line is reached. Defeat the captain leader.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "This line ends the captains' names as Wu's servants. Submit them to Wei, or lose them here." },
{ "speaker": "Last Captain Leader", "text": "A name can still outlive a banner if men carry it to sea." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "last_captain_final_guard",
"name": "Last Captain Final Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 62,
"pos": [16, 4],
"base": { "hp": 154, "atk": 63, "def": 56 }
},
{
"unit_id": "last_captain_crossbow_boat",
"name": "Last Captain Crossbow Boat",
"class_id": "marksman",
"team": "enemy",
"move_type": "water",
"level": 62,
"pos": [10, 1],
"base": { "hp": 130, "atk": 62, "def": 36, "agi": 50 }
}
]
}
]
},
{
"id": "turn_9_captain_line_breaks",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 9 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Dian Wei", "text": "The last captains are losing their line. They still clutch the ledgers, but their guards keep looking back." },
{ "speaker": "Cao Cao", "text": "Then take both the line and the ledgers." }
]
}
]
}
],
"rewards": {
"gold": 12800,
"items": ["bean", "wine", "war_axe"]
},
"post_battle_dialogue": [
{ "speaker": "Guo Jia", "text": "The last captains are broken. Wei can settle their names into the coastal register, or pursue the sea exiles before any claim survives beyond the shore." },
{ "speaker": "Cao Ren", "text": "Settlement ends the ledgers. Pursuit ends the whispers that a fleet still waits." },
{ "speaker": "Cao Cao", "text": "A name kept in order is harmless. A name carried by fugitives becomes tomorrow's spark." }
],
"post_battle_choices": [
{
"id": "settle_last_captains",
"label": "Settle Captains",
"description": "Cao Cao settles the last captains into Wei's coastal register.",
"set_flags": { "settled_last_captains": true, "pursued_sea_exiles": false },
"gold": 2500,
"items": ["imperial_seal"]
},
{
"id": "pursue_sea_exiles",
"label": "Pursue Exiles",
"description": "Cao Cao pursues the remaining sea exiles before their names become a new banner.",
"set_flags": { "settled_last_captains": false, "pursued_sea_exiles": true },
"gold": 2300,
"items": ["war_drum"]
}
]
}

View File

@@ -75,6 +75,7 @@ data/scenarios/061_nanhai_route.json
data/scenarios/062_southern_fleet.json
data/scenarios/063_hainan_coast.json
data/scenarios/064_final_harbor.json
data/scenarios/065_last_captains.json
```
## Campaign
@@ -151,7 +152,8 @@ The campaign file defines scenario order, resource paths, and officers who are a
{ "id": "061_nanhai_route", "title": "Nanhai Route", "path": "res://data/scenarios/061_nanhai_route.json" },
{ "id": "062_southern_fleet", "title": "Southern Fleet", "path": "res://data/scenarios/062_southern_fleet.json" },
{ "id": "063_hainan_coast", "title": "Hainan Coast", "path": "res://data/scenarios/063_hainan_coast.json" },
{ "id": "064_final_harbor", "title": "Final Harbor", "path": "res://data/scenarios/064_final_harbor.json" }
{ "id": "064_final_harbor", "title": "Final Harbor", "path": "res://data/scenarios/064_final_harbor.json" },
{ "id": "065_last_captains", "title": "Last Captains", "path": "res://data/scenarios/065_last_captains.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 sixty-four-scenario campaign.
- Next-battle flow exists across the current sixty-five-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 sixty-four-scenario campaign order exists.
- Linear sixty-five-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.
@@ -124,6 +124,7 @@
- Sixty-second-scenario content exists with southern fleet pressure, water-move screen boats, secured Nanhai route or pressed-fleet branch reactions, and secured fleet or Hainan coast follow-up flags.
- Sixty-third-scenario content exists with Hainan coast pressure, water-move cove boats, secured southern fleet or pressed-Hainan branch reactions, and secured coast or final harbor follow-up flags.
- Sixty-fourth-scenario content exists with final harbor pressure, water-move last boats, secured Hainan coast or pressed-harbor branch reactions, and secured harbor or pursued-captain follow-up flags.
- Sixty-fifth-scenario content exists with last-captain pressure, water-move escape boats, secured final harbor or captain-pursuit branch reactions, and settled captains or sea exile follow-up flags.
## Milestone 5: Presentation