Add inner Jianye scenario

This commit is contained in:
2026-06-18 02:16:02 +09:00
parent e77b9ee201
commit e0496b2759
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
- Fifty-six campaign scenarios.
- Fifty-seven campaign scenarios.
- Grid movement.
- Unit selection.
- Move, attack, wait, end turn.
@@ -77,6 +77,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr
- Wu Counterstroke consumes the Jianye Approach branch flags and breaks Wu's forward answer into a held lower Yangtze route or Jianye gate pressure.
- Jianye Gate consumes the Wu Counterstroke branch flags and breaks the outer gate line toward a secured gate road or forced capital sortie.
- Jianye Sortie consumes the Jianye Gate branch flags and contains the capital sortie toward a held siege road or inner-city pressure.
- Inner Jianye consumes the Jianye Sortie branch flags and opens the inner city toward a secured road or forced Wu last stand.
- 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

@@ -283,6 +283,11 @@
"id": "056_jianye_sortie",
"title": "Jianye Sortie",
"path": "res://data/scenarios/056_jianye_sortie.json"
},
{
"id": "057_inner_jianye",
"title": "Inner Jianye",
"path": "res://data/scenarios/057_inner_jianye.json"
}
]
}

View File

@@ -0,0 +1,363 @@
{
"id": "057_inner_jianye",
"name": "Inner Jianye",
"objectives": {
"victory": "Reach the inner Jianye line with Cao Cao, then defeat the inner city commander.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "inner_jianye_line_reached" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 18, "team": "player" }
]
},
"briefing": {
"title": "Inner Jianye",
"location": "Inner Jianye Road, Eastern Front, 220 CE",
"lines": [
"The capital sortie has failed, and Wei's banners now press against the inner roads that protect Jianye's command district.",
"Cao Cao advances to break the inner line, force Wu's guard back again, and decide whether to secure the city road or provoke a final stand."
],
"conditional_lines": [
{
"campaign_flags": { "contained_capital_sortie": true },
"lines": [
"Containing the capital sortie leaves Wei with guarded roads, orderly supply carts, and enough time to advance into the inner city by measure."
]
},
{
"campaign_flags": { "pressed_inner_jianye": true },
"lines": [
"Pressing inner Jianye keeps the defenders reeling, but their commanders now crowd the canals and roads to stop Wei before the command district."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "contained_capital_sortie": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "pressed_inner_jianye": 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_ch57",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch57",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch57",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch57",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch57",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch57",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch57",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "inner_jianye_commander",
"name": "Inner Jianye Commander",
"class_id": "commander",
"team": "enemy",
"level": 54,
"pos": [14, 4],
"base": { "hp": 182, "mp": 88, "atk": 57, "def": 48, "int": 46, "agi": 33 }
},
{
"unit_id": "inner_city_captain",
"name": "Inner City Captain",
"class_id": "guard_captain",
"team": "enemy",
"level": 54,
"pos": [12, 4],
"base": { "hp": 142, "atk": 56, "def": 49 }
},
{
"unit_id": "lu_xun_canal_boat",
"name": "Lu Xun Canal Boat",
"class_id": "champion",
"team": "enemy",
"move_type": "water",
"level": 54,
"pos": [4, 3],
"base": { "hp": 170, "mp": 12, "atk": 58, "def": 44, "int": 16, "agi": 40 }
},
{
"unit_id": "inner_jianye_advisor",
"name": "Inner Jianye Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 54,
"pos": [13, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 128, "mp": 112, "atk": 8, "def": 35, "int": 57, "agi": 30 }
},
{
"unit_id": "inner_jianye_spear_north",
"name": "Inner Jianye Spear",
"class_id": "infantry",
"team": "enemy",
"level": 54,
"pos": [12, 3],
"base": { "hp": 130, "atk": 55, "def": 45 }
},
{
"unit_id": "inner_jianye_spear_south",
"name": "Inner Jianye Spear",
"class_id": "infantry",
"team": "enemy",
"level": 54,
"pos": [12, 5],
"base": { "hp": 130, "atk": 55, "def": 45 }
},
{
"unit_id": "inner_jianye_arrow_boat",
"name": "Inner Jianye Arrow Boat",
"class_id": "marksman",
"team": "enemy",
"move_type": "water",
"level": 54,
"pos": [5, 5],
"base": { "hp": 122, "atk": 56, "def": 31, "agi": 43 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Wei presses into inner Jianye after containing the capital sortie." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "The roads inside Jianye are narrower, but the enemy has fewer places left to trade for time." },
{ "speaker": "Guo Jia", "text": "An inner city fights with doors, canals, and fear. Strip one away and the rest answer loudly." },
{ "speaker": "Cao Cao", "text": "Then take the inner road. The capital has hidden behind enough answers." }
]
}
]
},
{
"id": "contained_sortie_orders_advance",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "contained_capital_sortie": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The contained sortie left the road clean behind us. Our rear guard can hold while the front advances." },
{ "speaker": "Cao Cao", "text": "An army that trusts its rear can make the road ahead smaller for the enemy." }
]
}
]
},
{
"id": "inner_pressure_draws_canal_boat",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "pressed_inner_jianye": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Inner Jianye Commander", "text": "Wei presses inside the city. Send the canal boat before their front can settle." },
{ "speaker": "Zhang He", "text": "They still trust the water. Take away that trust and the street line weakens." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "wu_inner_canal_boat",
"name": "Wu Inner Canal Boat",
"class_id": "champion",
"team": "enemy",
"move_type": "water",
"level": 54,
"pos": [5, 3],
"base": { "hp": 120, "atk": 51, "def": 35, "agi": 41 }
}
}
]
},
{
"id": "turn_4_inner_line_tightens",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Inner Jianye Advisor", "text": "Tighten the inner line. If Wei claims this road, the command district becomes the next battlefield." },
{ "speaker": "Guo Jia", "text": "They defend a district by admitting the city is already a battlefield." }
]
}
]
},
{
"id": "inner_jianye_line_reached",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "set_objective",
"victory": "The inner Jianye line is reached. Defeat the inner city commander.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 18."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "This is inner Jianye's line. Break its commander and the command district must show its hand." },
{ "speaker": "Inner Jianye Commander", "text": "A city still has teeth after the road is bloodied." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "inner_jianye_last_guard",
"name": "Inner Jianye Last Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 54,
"pos": [16, 4],
"base": { "hp": 138, "atk": 55, "def": 48 }
},
{
"unit_id": "inner_jianye_crossbow_boat",
"name": "Inner Jianye Crossbow Boat",
"class_id": "marksman",
"team": "enemy",
"move_type": "water",
"level": 54,
"pos": [10, 1],
"base": { "hp": 114, "atk": 54, "def": 28, "agi": 42 }
}
]
}
]
},
{
"id": "turn_9_inner_line_breaks",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 9 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "The inner line is breaking. The defenders are still fierce, but their orders no longer arrive together." },
{ "speaker": "Cao Cao", "text": "Then make each order answer alone." }
]
}
]
}
],
"rewards": {
"gold": 11200,
"items": ["bean", "wine", "war_drum"]
},
"post_battle_dialogue": [
{ "speaker": "Guo Jia", "text": "Inner Jianye is open enough to shape the next blow. Wei can secure the city road, or drive Wu toward a final stand before its command district." },
{ "speaker": "Cao Ren", "text": "Secure the inner road and the army controls the city's breath. Force the last stand and Wu spends what strength remains." },
{ "speaker": "Cao Cao", "text": "A city with no calm road left must choose where its courage dies." }
],
"post_battle_choices": [
{
"id": "secure_inner_jianye",
"label": "Secure Inner City",
"description": "Cao Cao secures inner Jianye's road before the final command district battle.",
"set_flags": { "secured_inner_jianye": true, "forced_wu_last_stand": false },
"gold": 2100,
"items": ["imperial_seal"]
},
{
"id": "force_wu_last_stand",
"label": "Force Last Stand",
"description": "Cao Cao drives Wu toward a final stand before the command district can recover.",
"set_flags": { "secured_inner_jianye": false, "forced_wu_last_stand": true },
"gold": 1900,
"items": ["war_drum"]
}
]
}

View File

@@ -67,6 +67,7 @@ data/scenarios/053_jianye_approach.json
data/scenarios/054_wu_counterstroke.json
data/scenarios/055_jianye_gate.json
data/scenarios/056_jianye_sortie.json
data/scenarios/057_inner_jianye.json
```
## Campaign
@@ -135,7 +136,8 @@ The campaign file defines scenario order, resource paths, and officers who are a
{ "id": "053_jianye_approach", "title": "Jianye Approach", "path": "res://data/scenarios/053_jianye_approach.json" },
{ "id": "054_wu_counterstroke", "title": "Wu Counterstroke", "path": "res://data/scenarios/054_wu_counterstroke.json" },
{ "id": "055_jianye_gate", "title": "Jianye Gate", "path": "res://data/scenarios/055_jianye_gate.json" },
{ "id": "056_jianye_sortie", "title": "Jianye Sortie", "path": "res://data/scenarios/056_jianye_sortie.json" }
{ "id": "056_jianye_sortie", "title": "Jianye Sortie", "path": "res://data/scenarios/056_jianye_sortie.json" },
{ "id": "057_inner_jianye", "title": "Inner Jianye", "path": "res://data/scenarios/057_inner_jianye.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 fifty-six-scenario campaign.
- Next-battle flow exists across the current fifty-seven-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 fifty-six-scenario campaign order exists.
- Linear fifty-seven-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.
@@ -116,6 +116,7 @@
- Fifty-fourth-scenario content exists with Wu counterstroke pressure, water-move counterboats, secured approach or forced-counterstroke branch reactions, and lower Yangtze route or Jianye gate follow-up flags.
- Fifty-fifth-scenario content exists with Jianye gate pressure, water-move sortie boats, lower Yangtze route or gate-pressure branch reactions, and secured gate or capital sortie follow-up flags.
- Fifty-sixth-scenario content exists with Jianye sortie pressure, water-move committed boats, secured gate or forced-sortie branch reactions, and contained sortie or inner Jianye follow-up flags.
- Fifty-seventh-scenario content exists with inner Jianye pressure, water-move canal boats, contained sortie or inner-pressure branch reactions, and secured inner city or Wu last-stand follow-up flags.
## Milestone 5: Presentation