Add sea exiles scenario

This commit is contained in:
2026-06-18 02:52:38 +09:00
parent d53fbfd6dd
commit c4c2f8be05
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 ## Current Slice
- Sixty-five campaign scenarios. - Sixty-six campaign scenarios.
- Grid movement. - Grid movement.
- Unit selection. - Unit selection.
- Move, attack, wait, end turn. - Move, attack, wait, end turn.
@@ -86,6 +86,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr
- Hainan Coast consumes the Southern Fleet branch flags and breaks the shore road toward a secured coast or pressed final harbor. - 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. - 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. - Last Captains consumes the Final Harbor branch flags and settles the remaining captain ledgers toward registered order or pursued sea exiles.
- Sea Exiles consumes the Last Captains branch flags and breaks the outer coast toward settled exiles or pressed outer islands.
- 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

@@ -328,6 +328,11 @@
"id": "065_last_captains", "id": "065_last_captains",
"title": "Last Captains", "title": "Last Captains",
"path": "res://data/scenarios/065_last_captains.json" "path": "res://data/scenarios/065_last_captains.json"
},
{
"id": "066_sea_exiles",
"title": "Sea Exiles",
"path": "res://data/scenarios/066_sea_exiles.json"
} }
] ]
} }

View File

@@ -0,0 +1,363 @@
{
"id": "066_sea_exiles",
"name": "Sea Exiles",
"objectives": {
"victory": "Reach the sea exile line with Cao Cao, then defeat the exile captain.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "sea_exile_line_reached" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 18, "team": "player" }
]
},
"briefing": {
"title": "Sea Exiles",
"location": "Sea Exile Road, Outer Southern Coast, Eastern Front, 220 CE",
"lines": [
"The last captains have been broken, but their scattered followers gather as sea exiles along the outer coast.",
"Cao Cao advances to decide whether the exiles are settled into Wei's coastal order or driven toward the outer islands."
],
"conditional_lines": [
{
"campaign_flags": { "settled_last_captains": true },
"lines": [
"Settling the last captains gives Wei names, crew rolls, and pilot testimony that narrow the exiles' hiding places."
]
},
{
"campaign_flags": { "pursued_sea_exiles": true },
"lines": [
"Pursuing the sea exiles keeps them from forming a new banner, but every remaining boat now runs with desperate speed."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "settled_last_captains": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "pursued_sea_exiles": 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_ch66",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch66",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch66",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch66",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch66",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch66",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch66",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "sea_exile_captain",
"name": "Sea Exile Captain",
"class_id": "commander",
"team": "enemy",
"level": 63,
"pos": [14, 4],
"base": { "hp": 218, "mp": 106, "atk": 66, "def": 57, "int": 55, "agi": 42 }
},
{
"unit_id": "sea_exile_guard",
"name": "Sea Exile Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 63,
"pos": [12, 4],
"base": { "hp": 160, "atk": 65, "def": 58 }
},
{
"unit_id": "sea_exile_boat",
"name": "Sea Exile Boat",
"class_id": "champion",
"team": "enemy",
"move_type": "water",
"level": 63,
"pos": [4, 3],
"base": { "hp": 188, "mp": 12, "atk": 67, "def": 53, "int": 16, "agi": 49 }
},
{
"unit_id": "sea_exile_advisor",
"name": "Sea Exile Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 63,
"pos": [13, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 146, "mp": 130, "atk": 8, "def": 44, "int": 66, "agi": 39 }
},
{
"unit_id": "sea_exile_spear_north",
"name": "Sea Exile Spear",
"class_id": "infantry",
"team": "enemy",
"level": 63,
"pos": [12, 3],
"base": { "hp": 148, "atk": 64, "def": 54 }
},
{
"unit_id": "sea_exile_spear_south",
"name": "Sea Exile Spear",
"class_id": "infantry",
"team": "enemy",
"level": 63,
"pos": [12, 5],
"base": { "hp": 148, "atk": 64, "def": 54 }
},
{
"unit_id": "sea_exile_arrow_boat",
"name": "Sea Exile Arrow Boat",
"class_id": "marksman",
"team": "enemy",
"move_type": "water",
"level": 63,
"pos": [5, 5],
"base": { "hp": 140, "atk": 65, "def": 40, "agi": 52 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Wei advances along the outer coast to settle or scatter the sea exiles." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "The sea exiles have gathered ahead. They have fewer banners, but more boats." },
{ "speaker": "Guo Jia", "text": "Exiles become dangerous when they believe distance is the same as safety." },
{ "speaker": "Cao Cao", "text": "Then teach them that Wei counts distance as another road." }
]
}
]
},
{
"id": "settled_captains_name_exile_coves",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "settled_last_captains": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "The settled captains have named the exile coves. Their flight is mapped before it begins." },
{ "speaker": "Cao Cao", "text": "Good. A named cove is already half a prison." }
]
}
]
},
{
"id": "pursued_exiles_launch_outer_boat",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "pursued_sea_exiles": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Sea Exile Captain", "text": "Wei pursues even the exiles. Launch the outer boat and open a path to the islands." },
{ "speaker": "Xiahou Yuan", "text": "They still think islands are distance enough. We will prove otherwise." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "sea_exile_outer_boat",
"name": "Sea Exile Outer Boat",
"class_id": "champion",
"team": "enemy",
"move_type": "water",
"level": 63,
"pos": [5, 3],
"base": { "hp": 138, "atk": 60, "def": 44, "agi": 50 }
}
}
]
},
{
"id": "turn_4_exiles_cut_anchor_lines",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Sea Exile Advisor", "text": "Cut the anchor lines. If the road falls, the boats must already be moving." },
{ "speaker": "Zhang He", "text": "They prepare flight before the fight is decided. Press them." }
]
}
]
},
{
"id": "sea_exile_line_reached",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "set_objective",
"victory": "The sea exile line is reached. Defeat the exile captain.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "This line ends the exiles' distance. Submit, or carry nothing but defeat to the islands." },
{ "speaker": "Sea Exile Captain", "text": "The sea still has room for men who refuse your count." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "sea_exile_last_guard",
"name": "Sea Exile Last Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 63,
"pos": [16, 4],
"base": { "hp": 156, "atk": 64, "def": 57 }
},
{
"unit_id": "sea_exile_crossbow_boat",
"name": "Sea Exile Crossbow Boat",
"class_id": "marksman",
"team": "enemy",
"move_type": "water",
"level": 63,
"pos": [10, 1],
"base": { "hp": 132, "atk": 63, "def": 37, "agi": 51 }
}
]
}
]
},
{
"id": "turn_9_exile_line_frays",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 9 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Dian Wei", "text": "The exiles are losing their line. The boats rock like they want to leave without orders." },
{ "speaker": "Cao Cao", "text": "Then give them one order they cannot ignore." }
]
}
]
}
],
"rewards": {
"gold": 13000,
"items": ["bean", "wine", "iron_armor"]
},
"post_battle_dialogue": [
{ "speaker": "Guo Jia", "text": "The sea exiles are broken. Wei can settle them into the coastal register, or press the outer islands before refusal becomes a hidden harbor." },
{ "speaker": "Cao Ren", "text": "Settlement quiets the shore. Pressing the islands quiets the places the shore cannot see." },
{ "speaker": "Cao Cao", "text": "If a road reaches the sea, Wei's order must learn to cross it." }
],
"post_battle_choices": [
{
"id": "settle_sea_exiles",
"label": "Settle Exiles",
"description": "Cao Cao settles the sea exiles into Wei's coastal register.",
"set_flags": { "settled_sea_exiles": true, "pressed_outer_islands": false },
"gold": 2550,
"items": ["imperial_seal"]
},
{
"id": "press_outer_islands",
"label": "Press Islands",
"description": "Cao Cao presses the outer islands before the exiles can form a hidden harbor.",
"set_flags": { "settled_sea_exiles": false, "pressed_outer_islands": true },
"gold": 2350,
"items": ["war_drum"]
}
]
}

View File

@@ -76,6 +76,7 @@ data/scenarios/062_southern_fleet.json
data/scenarios/063_hainan_coast.json data/scenarios/063_hainan_coast.json
data/scenarios/064_final_harbor.json data/scenarios/064_final_harbor.json
data/scenarios/065_last_captains.json data/scenarios/065_last_captains.json
data/scenarios/066_sea_exiles.json
``` ```
## Campaign ## Campaign
@@ -153,7 +154,8 @@ The campaign file defines scenario order, resource paths, and officers who are a
{ "id": "062_southern_fleet", "title": "Southern Fleet", "path": "res://data/scenarios/062_southern_fleet.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": "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" } { "id": "065_last_captains", "title": "Last Captains", "path": "res://data/scenarios/065_last_captains.json" },
{ "id": "066_sea_exiles", "title": "Sea Exiles", "path": "res://data/scenarios/066_sea_exiles.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 sixty-five-scenario campaign. - Next-battle flow exists across the current sixty-six-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 sixty-five-scenario campaign order exists. - Linear sixty-six-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.
@@ -125,6 +125,7 @@
- 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-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-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. - 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.
- Sixty-sixth-scenario content exists with sea exile pressure, water-move outer boats, settled captains or pursued-exile branch reactions, and settled exiles or outer island follow-up flags.
## Milestone 5: Presentation ## Milestone 5: Presentation