Initial Godot tactical RPG prototype

This commit is contained in:
2026-06-17 23:06:18 +09:00
commit b08c2ac37e
37 changed files with 13792 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
{
"id": "cao_cao_campaign",
"title": "Cao Cao Campaign",
"start_scenario": "001_yellow_turbans",
"initial_joined_officers": ["cao_cao", "xiahou_dun"],
"scenarios": [
{
"id": "001_yellow_turbans",
"title": "Yingchuan Skirmish",
"path": "res://data/scenarios/001_yellow_turbans.json"
},
{
"id": "002_sishui_gate",
"title": "Sishui Gate Vanguard",
"path": "res://data/scenarios/002_sishui_gate.json"
},
{
"id": "003_xingyang_ambush",
"title": "Xingyang Ambush",
"path": "res://data/scenarios/003_xingyang_ambush.json"
},
{
"id": "004_qingzhou_campaign",
"title": "Qingzhou Campaign",
"path": "res://data/scenarios/004_qingzhou_campaign.json"
},
{
"id": "005_puyang_raid",
"title": "Puyang Raid",
"path": "res://data/scenarios/005_puyang_raid.json"
},
{
"id": "006_dingtao_counterattack",
"title": "Dingtao Counterattack",
"path": "res://data/scenarios/006_dingtao_counterattack.json"
},
{
"id": "007_xian_emperor_escort",
"title": "Xian Emperor Escort",
"path": "res://data/scenarios/007_xian_emperor_escort.json"
},
{
"id": "008_wan_castle_escape",
"title": "Wan Castle Escape",
"path": "res://data/scenarios/008_wan_castle_escape.json"
},
{
"id": "009_xiapi_siege",
"title": "Xiapi Siege",
"path": "res://data/scenarios/009_xiapi_siege.json"
},
{
"id": "010_white_horse_relief",
"title": "White Horse Relief",
"path": "res://data/scenarios/010_white_horse_relief.json"
},
{
"id": "011_yan_ford_pursuit",
"title": "Yan Ford Pursuit",
"path": "res://data/scenarios/011_yan_ford_pursuit.json"
},
{
"id": "012_guandu_showdown",
"title": "Guandu Showdown",
"path": "res://data/scenarios/012_guandu_showdown.json"
},
{
"id": "013_wuchao_raid",
"title": "Wuchao Raid",
"path": "res://data/scenarios/013_wuchao_raid.json"
},
{
"id": "014_cangting_pursuit",
"title": "Cangting Pursuit",
"path": "res://data/scenarios/014_cangting_pursuit.json"
},
{
"id": "015_ye_campaign",
"title": "Ye Campaign",
"path": "res://data/scenarios/015_ye_campaign.json"
},
{
"id": "016_ye_siege",
"title": "Ye Siege",
"path": "res://data/scenarios/016_ye_siege.json"
},
{
"id": "017_ye_surrender",
"title": "Ye Surrender",
"path": "res://data/scenarios/017_ye_surrender.json"
}
]
}

203
data/defs/classes.json Normal file
View File

@@ -0,0 +1,203 @@
{
"hero": {
"name": "Hero",
"tier": 1,
"move_type": "foot",
"move": 4,
"attack_range": [1, 1],
"skills": ["spark", "fire_tactic", "mend"],
"growth": { "hp": "B", "mp": "B", "atk": "B", "def": "B", "int": "A", "agi": "B" },
"base_bonus": { "hp": 0, "atk": 0, "def": 0 },
"equipment_slots": {
"weapon": ["sword"],
"armor": ["robe", "light_armor"],
"accessory": ["accessory"]
},
"promotion": { "level": 15, "to": "commander" }
},
"commander": {
"name": "Commander",
"tier": 2,
"move_type": "foot",
"move": 5,
"attack_range": [1, 1],
"skills": ["spark", "fire_tactic", "mend", "great_mend"],
"growth": { "hp": "A", "mp": "B", "atk": "A", "def": "B", "int": "A", "agi": "B" },
"base_bonus": { "hp": 4, "atk": 1, "def": 1, "int": 1 },
"equipment_slots": {
"weapon": ["sword"],
"armor": ["robe", "light_armor"],
"accessory": ["accessory"]
}
},
"cavalry": {
"name": "Cavalry",
"tier": 1,
"move_type": "mounted",
"move": 5,
"attack_range": [1, 1],
"skills": [],
"growth": { "hp": "A", "mp": "D", "atk": "A", "def": "B", "int": "D", "agi": "B" },
"base_bonus": { "hp": 2, "atk": 0, "def": 0 },
"equipment_slots": {
"weapon": ["spear", "sword"],
"armor": ["light_armor", "heavy_armor"],
"accessory": ["accessory"]
},
"promotion": { "level": 15, "to": "elite_cavalry" }
},
"elite_cavalry": {
"name": "Elite Cavalry",
"tier": 2,
"move_type": "mounted",
"move": 6,
"attack_range": [1, 1],
"skills": [],
"growth": { "hp": "A", "mp": "D", "atk": "A", "def": "A", "int": "D", "agi": "A" },
"base_bonus": { "hp": 5, "atk": 2, "def": 1 },
"equipment_slots": {
"weapon": ["spear", "sword"],
"armor": ["light_armor", "heavy_armor"],
"accessory": ["accessory"]
}
},
"infantry": {
"name": "Infantry",
"tier": 1,
"move_type": "foot",
"move": 4,
"attack_range": [1, 1],
"skills": [],
"growth": { "hp": "B", "mp": "D", "atk": "B", "def": "B", "int": "D", "agi": "C" },
"base_bonus": { "hp": 0, "atk": 0, "def": 0 },
"equipment_slots": {
"weapon": ["sword", "spear"],
"armor": ["light_armor", "heavy_armor"],
"accessory": ["accessory"]
},
"promotion": { "level": 15, "to": "guard_captain" }
},
"guard_captain": {
"name": "Guard Captain",
"tier": 2,
"move_type": "foot",
"move": 5,
"attack_range": [1, 1],
"skills": [],
"growth": { "hp": "A", "mp": "D", "atk": "B", "def": "A", "int": "D", "agi": "C" },
"base_bonus": { "hp": 4, "atk": 1, "def": 2 },
"equipment_slots": {
"weapon": ["sword", "spear"],
"armor": ["light_armor", "heavy_armor"],
"accessory": ["accessory"]
}
},
"warrior": {
"name": "Warrior",
"tier": 1,
"move_type": "foot",
"move": 4,
"attack_range": [1, 1],
"skills": [],
"growth": { "hp": "A", "mp": "E", "atk": "A", "def": "B", "int": "E", "agi": "C" },
"base_bonus": { "hp": 4, "atk": 2, "def": 1, "int": -2 },
"equipment_slots": {
"weapon": ["axe", "sword"],
"armor": ["light_armor", "heavy_armor"],
"accessory": ["accessory"]
},
"promotion": { "level": 15, "to": "champion" }
},
"champion": {
"name": "Champion",
"tier": 2,
"move_type": "foot",
"move": 5,
"attack_range": [1, 1],
"skills": [],
"growth": { "hp": "A", "mp": "E", "atk": "A", "def": "A", "int": "E", "agi": "B" },
"base_bonus": { "hp": 6, "atk": 2, "def": 2, "int": -2 },
"equipment_slots": {
"weapon": ["axe", "sword"],
"armor": ["light_armor", "heavy_armor"],
"accessory": ["accessory"]
}
},
"archer": {
"name": "Archer",
"tier": 1,
"move_type": "archer",
"move": 4,
"attack_range": [2, 2],
"skills": [],
"growth": { "hp": "C", "mp": "D", "atk": "B", "def": "C", "int": "D", "agi": "A" },
"base_bonus": { "hp": 0, "atk": 0, "def": 0 },
"equipment_slots": {
"weapon": ["bow"],
"armor": ["robe", "light_armor"],
"accessory": ["accessory"]
},
"promotion": { "level": 15, "to": "marksman" }
},
"marksman": {
"name": "Marksman",
"tier": 2,
"move_type": "archer",
"move": 5,
"attack_range": [2, 2],
"skills": [],
"growth": { "hp": "B", "mp": "D", "atk": "A", "def": "C", "int": "D", "agi": "A" },
"base_bonus": { "hp": 3, "atk": 2, "agi": 1 },
"equipment_slots": {
"weapon": ["bow"],
"armor": ["robe", "light_armor"],
"accessory": ["accessory"]
}
},
"strategist": {
"name": "Strategist",
"tier": 1,
"move_type": "foot",
"move": 4,
"attack_range": [1, 1],
"skills": ["spark", "fire_tactic", "mend"],
"growth": { "hp": "C", "mp": "A", "atk": "E", "def": "D", "int": "A", "agi": "C" },
"base_bonus": { "hp": -2, "mp": 8, "atk": -2, "def": -1, "int": 2 },
"equipment_slots": {
"weapon": ["sword"],
"armor": ["robe", "light_armor"],
"accessory": ["accessory"]
},
"promotion": { "level": 15, "to": "military_advisor" }
},
"military_advisor": {
"name": "Military Advisor",
"tier": 2,
"move_type": "foot",
"move": 4,
"attack_range": [1, 1],
"skills": ["spark", "fire_tactic", "mend", "great_mend"],
"growth": { "hp": "B", "mp": "A", "atk": "E", "def": "C", "int": "A", "agi": "C" },
"base_bonus": { "hp": 2, "mp": 6, "atk": -2, "def": 1, "int": 2 },
"equipment_slots": {
"weapon": ["sword"],
"armor": ["robe", "light_armor"],
"accessory": ["accessory"]
}
},
"bandit": {
"name": "Bandit",
"tier": 1,
"move_type": "foot",
"move": 4,
"attack_range": [1, 1],
"skills": [],
"growth": { "hp": "B", "mp": "E", "atk": "B", "def": "C", "int": "E", "agi": "B" },
"base_bonus": { "hp": 0, "atk": 0, "def": 0 },
"equipment_slots": {
"weapon": ["sword", "axe"],
"armor": ["light_armor"],
"accessory": ["accessory"]
}
}
}

110
data/defs/items.json Normal file
View File

@@ -0,0 +1,110 @@
{
"bronze_sword": {
"name": "Bronze Sword",
"kind": "weapon",
"weapon_type": "sword",
"range": [1, 1],
"bonuses": { "atk": 3 },
"effects": [],
"price": 300
},
"iron_sword": {
"name": "Iron Sword",
"kind": "weapon",
"weapon_type": "sword",
"range": [1, 1],
"bonuses": { "atk": 5 },
"effects": [],
"price": 520
},
"training_spear": {
"name": "Training Spear",
"kind": "weapon",
"weapon_type": "spear",
"range": [1, 1],
"bonuses": { "atk": 4 },
"effects": [],
"price": 360
},
"short_bow": {
"name": "Short Bow",
"kind": "weapon",
"weapon_type": "bow",
"range": [2, 2],
"bonuses": { "atk": 3 },
"effects": [],
"price": 320
},
"hand_axe": {
"name": "Hand Axe",
"kind": "weapon",
"weapon_type": "axe",
"range": [1, 1],
"bonuses": { "atk": 4 },
"effects": [],
"price": 340
},
"war_axe": {
"name": "War Axe",
"kind": "weapon",
"weapon_type": "axe",
"range": [1, 1],
"bonuses": { "atk": 6 },
"effects": [],
"price": 680
},
"cloth_robe": {
"name": "Cloth Robe",
"kind": "armor",
"armor_type": "robe",
"bonuses": { "def": 1 },
"effects": [],
"price": 120
},
"leather_armor": {
"name": "Leather Armor",
"kind": "armor",
"armor_type": "light_armor",
"bonuses": { "def": 1 },
"effects": [],
"price": 180
},
"iron_armor": {
"name": "Iron Armor",
"kind": "armor",
"armor_type": "heavy_armor",
"bonuses": { "def": 3 },
"effects": [],
"price": 520
},
"war_drum": {
"name": "War Drum",
"kind": "accessory",
"accessory_type": "accessory",
"bonuses": { "atk": 1, "agi": 1 },
"effects": [],
"price": 640
},
"imperial_seal": {
"name": "Imperial Seal",
"kind": "accessory",
"accessory_type": "accessory",
"bonuses": { "mp": 4, "int": 1 },
"effects": [],
"price": 900
},
"bean": {
"name": "Bean",
"kind": "consumable",
"uses": 1,
"effects": [{ "type": "heal_hp", "amount": 20 }],
"price": 50
},
"wine": {
"name": "Wine",
"kind": "consumable",
"uses": 1,
"effects": [{ "type": "heal_mp", "amount": 8 }],
"price": 120
}
}

72
data/defs/officers.json Normal file
View File

@@ -0,0 +1,72 @@
{
"cao_cao": {
"name": "Cao Cao",
"faction": "wei",
"class_id": "hero",
"level": 1,
"exp": 0,
"base": { "hp": 38, "mp": 10, "atk": 10, "def": 7, "int": 12, "agi": 8 },
"growth_bonus": { "atk": 1, "int": 1 },
"equipment": { "weapon": "bronze_sword", "armor": "cloth_robe", "accessory": null }
},
"xiahou_dun": {
"name": "Xiahou Dun",
"faction": "wei",
"class_id": "cavalry",
"level": 1,
"exp": 0,
"base": { "hp": 40, "mp": 4, "atk": 11, "def": 6, "int": 5, "agi": 9 },
"growth_bonus": { "hp": 1, "atk": 1 },
"equipment": { "weapon": "training_spear", "armor": "leather_armor", "accessory": null }
},
"xiahou_yuan": {
"name": "Xiahou Yuan",
"faction": "wei",
"class_id": "archer",
"level": 1,
"exp": 0,
"base": { "hp": 32, "mp": 4, "atk": 9, "def": 5, "int": 6, "agi": 12 },
"growth_bonus": { "agi": 1 },
"equipment": { "weapon": "short_bow", "armor": "leather_armor", "accessory": null }
},
"cao_ren": {
"name": "Cao Ren",
"faction": "wei",
"class_id": "infantry",
"level": 1,
"exp": 0,
"base": { "hp": 36, "mp": 3, "atk": 10, "def": 8, "int": 5, "agi": 7 },
"growth_bonus": { "def": 1 },
"equipment": { "weapon": "bronze_sword", "armor": "leather_armor", "accessory": null }
},
"dian_wei": {
"name": "Dian Wei",
"faction": "wei",
"class_id": "warrior",
"level": 3,
"exp": 0,
"base": { "hp": 42, "mp": 2, "atk": 13, "def": 8, "int": 3, "agi": 7 },
"growth_bonus": { "hp": 1, "atk": 1 },
"equipment": { "weapon": "hand_axe", "armor": "leather_armor", "accessory": null }
},
"guo_jia": {
"name": "Guo Jia",
"faction": "wei",
"class_id": "strategist",
"level": 8,
"exp": 0,
"base": { "hp": 30, "mp": 18, "atk": 5, "def": 5, "int": 14, "agi": 9 },
"growth_bonus": { "mp": 1, "int": 1 },
"equipment": { "weapon": "bronze_sword", "armor": "cloth_robe", "accessory": null }
},
"zhang_he": {
"name": "Zhang He",
"faction": "wei",
"class_id": "elite_cavalry",
"level": 12,
"exp": 0,
"base": { "hp": 48, "mp": 6, "atk": 15, "def": 10, "int": 7, "agi": 14 },
"growth_bonus": { "atk": 1, "agi": 1 },
"equipment": { "weapon": "training_spear", "armor": "iron_armor", "accessory": null }
}
}

47
data/defs/skills.json Normal file
View File

@@ -0,0 +1,47 @@
{
"spark": {
"name": "Spark",
"kind": "damage",
"target": "enemy",
"mp_cost": 2,
"range": [1, 2],
"power": 5,
"stat": "int"
},
"fire_tactic": {
"name": "Fire",
"kind": "damage",
"target": "enemy",
"mp_cost": 4,
"range": [1, 3],
"power": 8,
"stat": "int"
},
"blaze": {
"name": "Blaze",
"kind": "damage",
"target": "enemy",
"mp_cost": 7,
"range": [1, 3],
"power": 13,
"stat": "int"
},
"mend": {
"name": "Mend",
"kind": "heal",
"target": "ally",
"mp_cost": 4,
"range": [0, 2],
"power": 12,
"stat": "int"
},
"great_mend": {
"name": "Great Mend",
"kind": "heal",
"target": "ally",
"mp_cost": 7,
"range": [0, 2],
"power": 20,
"stat": "int"
}
}

43
data/defs/terrain.json Normal file
View File

@@ -0,0 +1,43 @@
{
"G": {
"id": "plain",
"name": "Plain",
"color": "#6d9e4f",
"defense": 0,
"avoid": 0,
"move_cost": { "foot": 1, "mounted": 1, "archer": 1, "water": 99 }
},
"F": {
"id": "forest",
"name": "Forest",
"color": "#33733a",
"defense": 2,
"avoid": 10,
"move_cost": { "foot": 2, "mounted": 3, "archer": 2, "water": 99 }
},
"H": {
"id": "hill",
"name": "Hill",
"color": "#8c8057",
"defense": 1,
"avoid": 5,
"move_cost": { "foot": 2, "mounted": 3, "archer": 2, "water": 99 }
},
"R": {
"id": "road",
"name": "Road",
"color": "#a38c6b",
"defense": 0,
"avoid": 0,
"move_cost": { "foot": 1, "mounted": 1, "archer": 1, "water": 99 }
},
"W": {
"id": "water",
"name": "Water",
"color": "#2e5c9e",
"defense": 0,
"avoid": 0,
"move_cost": { "foot": 99, "mounted": 99, "archer": 99, "water": 1 }
}
}

View File

@@ -0,0 +1,124 @@
{
"id": "001_yellow_turbans",
"name": "Yingchuan Skirmish",
"objectives": {
"victory": "Defeat all Yellow Turban units.",
"defeat": "All allied units are defeated."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy" },
"defeat": { "type": "all_units_defeated", "team": "player" }
},
"briefing": {
"title": "Yingchuan Skirmish",
"location": "Yingchuan, 184 CE",
"lines": [
"Yellow Turban rebels have gathered near Yingchuan.",
"Cao Cao and Xiahou Dun must break their formation before the revolt spreads."
]
},
"shop": {
"items": ["bean"]
},
"formation": {
"cells": [[1, 3], [1, 4], [2, 3], [2, 4]]
},
"map": {
"width": 10,
"height": 8,
"terrain": [
"GGGGGGGGGG",
"GGGFFFFGGG",
"GGGFFFGGGG",
"GGGRRGGGGG",
"GGGRRGGHHG",
"GGGGGGGHHG",
"GGGWWGGGGG",
"GGGWWGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 3]
},
{
"unit_id": "xiahou_dun",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "yellow_turban_1",
"name": "Zhang Mancheng",
"class_id": "bandit",
"team": "enemy",
"level": 1,
"pos": [7, 2],
"base": { "hp": 34, "atk": 11, "def": 5 }
},
{
"unit_id": "yellow_turban_2",
"name": "Peasant Rebel",
"class_id": "infantry",
"team": "enemy",
"level": 1,
"pos": [8, 5],
"base": { "hp": 30, "atk": 10, "def": 5 }
},
{
"unit_id": "yellow_turban_3",
"name": "Rebel Archer",
"class_id": "archer",
"team": "enemy",
"level": 1,
"pos": [7, 6],
"base": { "hp": 26, "atk": 9, "def": 4 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Cao Cao engages the Yellow Turbans." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "The rebels are scattered, but their numbers will swell if we hesitate." },
{ "speaker": "Xiahou Dun", "text": "Then we strike now. I will open a path through their front line." }
]
}
]
},
{
"id": "turn_2_warning",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{ "type": "log", "text": "The Yellow Turbans are looking for an opening." }
]
}
],
"rewards": {
"gold": 300,
"items": ["bean"],
"join_officers": ["xiahou_yuan", "cao_ren"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Dun", "text": "The rebels are scattered. Yingchuan should breathe easier tonight." },
{ "speaker": "Cao Cao", "text": "This is only the first fire. If the court cannot move quickly, we must." },
{ "speaker": "Xiahou Yuan", "text": "Then call on us for the next campaign. We will ride with you." },
{ "speaker": "Cao Ren", "text": "The clan stands ready, my lord." }
]
}

View File

@@ -0,0 +1,201 @@
{
"id": "002_sishui_gate",
"name": "Sishui Gate Vanguard",
"objectives": {
"victory": "Defeat Hua Xiong's vanguard.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 9."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_2_warning" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 9, "team": "player" }
]
},
"briefing": {
"title": "Sishui Gate Vanguard",
"location": "Sishui Gate, 190 CE",
"lines": [
"The coalition gathers to challenge Dong Zhuo.",
"Cao Cao leads a small vanguard to test Hua Xiong's defenses."
]
},
"shop": {
"items": [
"bean",
"cloth_robe",
"leather_armor",
"short_bow",
"training_spear"
]
},
"roster": {
"max_units": 3,
"required_officers": ["cao_cao"]
},
"formation": {
"cells": [[1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5]]
},
"map": {
"width": 12,
"height": 9,
"terrain": [
"GGGGGRRGGGGG",
"GGGFFRRGHHGG",
"GGGFFRRGHHGG",
"GGGGGRRGGGGG",
"RRRRRRRRRRRR",
"GGGGGRRGGGGG",
"GGHGGFFGGGGG",
"GGHGGFFGGWWG",
"GGGGGGGGGWWG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch2",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "xiahou_dun_ch2",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "xiahou_yuan_ch2",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "cao_ren_ch2",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "hua_xiong_vanguard",
"name": "Hua Xiong Vanguard",
"class_id": "cavalry",
"team": "enemy",
"level": 2,
"pos": [9, 4],
"base": { "hp": 44, "atk": 15, "def": 7 }
},
{
"unit_id": "liang_spearman_1",
"name": "Liang Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 2,
"pos": [8, 3],
"base": { "hp": 34, "atk": 12, "def": 6 }
},
{
"unit_id": "liang_spearman_2",
"name": "Liang Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 2,
"pos": [8, 5],
"base": { "hp": 34, "atk": 12, "def": 6 }
},
{
"unit_id": "liang_archer",
"name": "Liang Archer",
"class_id": "archer",
"team": "enemy",
"level": 2,
"pos": [10, 2],
"base": { "hp": 28, "atk": 10, "def": 4 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "The coalition vanguard moves toward Sishui Gate." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Hua Xiong's vanguard is testing the coalition's nerve. We cannot give them ground." },
{ "speaker": "Xiahou Yuan", "text": "Their archers hold the ridge. I will keep pressure on their flank." }
]
}
]
},
{
"id": "turn_2_warning",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{ "type": "log", "text": "Hua Xiong's men tighten their formation." },
{
"type": "set_objective",
"victory": "Defeat Hua Xiong's vanguard and reinforcements.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 9."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "liang_reinforcement_1",
"name": "Liang Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 2,
"pos": [11, 3],
"base": { "hp": 36, "atk": 12, "def": 6 }
},
{
"unit_id": "liang_reinforcement_2",
"name": "Liang Guard",
"class_id": "infantry",
"team": "enemy",
"level": 2,
"pos": [11, 5],
"base": { "hp": 34, "atk": 11, "def": 7 }
}
]
}
]
}
],
"post_battle_choices": [
{
"id": "pursue_dong_zhuo",
"label": "Pursue Dong Zhuo",
"description": "Cao Cao presses the retreating army while Cao Ren secures Sishui.",
"leave_officers": ["cao_ren"],
"set_flags": { "pursued_dong_zhuo": true, "regrouped_after_sishui": false }
},
{
"id": "regroup_coalition",
"label": "Regroup",
"description": "The vanguard pauses to gather supplies.",
"set_flags": { "pursued_dong_zhuo": false, "regrouped_after_sishui": true }
}
],
"rewards": {
"gold": 500,
"items": ["bean"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Yuan", "text": "Sishui Gate is broken, but Dong Zhuo's main force is already moving west." },
{ "speaker": "Cao Cao", "text": "The coalition will argue while the enemy escapes. We must decide whether to pursue or regroup." }
]
}

View File

@@ -0,0 +1,330 @@
{
"id": "003_xingyang_ambush",
"name": "Xingyang Ambush",
"objectives": {
"victory": "Defeat Xu Rong's rearguard.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 11."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_ambush" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 11, "team": "player" }
]
},
"briefing": {
"title": "Xingyang Ambush",
"location": "Xingyang, 190 CE",
"lines": [
"Dong Zhuo abandons Luoyang and retreats west.",
"Cao Cao's vanguard turns toward the enemy rearguard near Xingyang.",
"The road narrows ahead. Keep the vanguard together and watch the forest line."
],
"conditional_lines": [
{
"campaign_flags": { "pursued_dong_zhuo": true },
"lines": [
"The rapid pursuit leaves little time for scouting, but may catch Xu Rong before he regroups."
]
},
{
"campaign_flags": { "regrouped_after_sishui": true },
"lines": [
"Scouts from Sishui report suspicious movement in the trees. Expect an ambush and prepare accordingly."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "pursued_dong_zhuo": true },
"items": ["hand_axe"]
},
{
"campaign_flags": { "regrouped_after_sishui": true },
"items": ["leather_armor"]
}
]
},
"roster": {
"max_units": 3,
"required_officers": ["cao_cao"]
},
"formation": {
"cells": [[1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5]]
},
"map": {
"width": 12,
"height": 9,
"terrain": [
"GGGFFRRGGGGG",
"GGGFFRRGHHGG",
"GGGGGRRGHHGG",
"RRRRRRRRRRRR",
"GGGGFRRFGGGG",
"GGGHFRRFGGGG",
"GGGHHRRGFFGG",
"GGGGGRRGFFGG",
"GGWWGRRGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch3",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "xiahou_dun_ch3",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "xiahou_yuan_ch3",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "cao_ren_ch3",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xu_rong_rearguard",
"name": "Xu Rong Rearguard",
"class_id": "cavalry",
"team": "enemy",
"level": 3,
"pos": [9, 4],
"base": { "hp": 46, "atk": 15, "def": 8 }
},
{
"unit_id": "liang_spearman",
"name": "Liang Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 3,
"pos": [7, 3],
"base": { "hp": 36, "atk": 12, "def": 7 }
},
{
"unit_id": "liang_strategist",
"name": "Liang Strategist",
"class_id": "strategist",
"team": "enemy",
"level": 3,
"pos": [8, 5],
"base": { "hp": 30, "mp": 14, "atk": 7, "def": 4, "int": 10 }
},
{
"unit_id": "rearguard_archer",
"name": "Rearguard Archer",
"class_id": "archer",
"team": "enemy",
"level": 3,
"pos": [8, 2],
"base": { "hp": 30, "atk": 11, "def": 5 }
}
],
"events": [
{
"id": "opening_pursuit",
"once": true,
"when": { "type": "battle_start", "campaign_flags": { "pursued_dong_zhuo": true } },
"actions": [
{ "type": "log", "text": "Cao Cao's rapid pursuit closes on Dong Zhuo's rearguard." }
]
},
{
"id": "opening_regroup",
"once": true,
"when": { "type": "battle_start", "campaign_flags": { "regrouped_after_sishui": true } },
"actions": [
{ "type": "log", "text": "Cao Cao advances after gathering scouts and supplies at Sishui." }
]
},
{
"id": "opening_dialogue_pursuit",
"once": true,
"when": { "type": "battle_begin", "campaign_flags": { "pursued_dong_zhuo": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "The coalition hesitates while Dong Zhuo escapes. We will not let this chance pass." },
{ "speaker": "Xiahou Dun", "text": "The road is too quiet. If they mean to spring a trap, let them try it." },
{ "speaker": "Xiahou Yuan", "text": "I will watch the ridges. Their bowmen will favor the high ground." }
]
}
]
},
{
"id": "opening_dialogue_regroup",
"once": true,
"when": { "type": "battle_begin", "campaign_flags": { "regrouped_after_sishui": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "The delay at Sishui bought us scouts and fresh supplies. Now we move with clear eyes." },
{ "speaker": "Cao Ren", "text": "Our riders report movement in the forest line. Xu Rong may be waiting ahead." },
{ "speaker": "Xiahou Yuan", "text": "Then we draw them out and break their trap before it closes." }
]
}
]
},
{
"id": "turn_3_ambush",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{ "type": "log", "text": "The forest line shifts as Xu Rong's ambush springs." }
]
},
{
"id": "turn_3_ambush_pursuit",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3, "campaign_flags": { "pursued_dong_zhuo": true } },
"actions": [
{ "type": "log", "text": "Xu Rong's ambush force closes in from the forest." },
{
"type": "dialogue",
"lines": [
{ "speaker": "Xu Rong", "text": "Cao Cao took the bait. Seal the road and cut down his vanguard." },
{ "speaker": "Cao Cao", "text": "So this was their plan. Hold formation and break through!" }
]
},
{
"type": "set_objective",
"victory": "Defeat Xu Rong and every ambush unit.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 11."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "ambush_bandit_1",
"name": "Ambush Raider",
"class_id": "bandit",
"team": "enemy",
"level": 3,
"pos": [5, 1],
"base": { "hp": 34, "atk": 12, "def": 5 }
},
{
"unit_id": "ambush_bandit_2",
"name": "Ambush Raider",
"class_id": "bandit",
"team": "enemy",
"level": 3,
"pos": [5, 7],
"base": { "hp": 34, "atk": 12, "def": 5 }
},
{
"unit_id": "ambush_archer",
"name": "Ambush Archer",
"class_id": "archer",
"team": "enemy",
"level": 3,
"pos": [10, 6],
"base": { "hp": 28, "atk": 11, "def": 4 }
}
]
}
]
},
{
"id": "turn_3_ambush_regroup",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3, "campaign_flags": { "regrouped_after_sishui": true } },
"actions": [
{ "type": "log", "text": "Scouts expose Xu Rong's ambush before the trap fully closes." },
{
"type": "dialogue",
"lines": [
{ "speaker": "Xu Rong", "text": "They found our screen too soon. Attack before Cao Cao can withdraw!" },
{ "speaker": "Cao Cao", "text": "Their trap is revealed. Strike the exposed units and keep the road open." }
]
},
{
"type": "set_objective",
"victory": "Defeat Xu Rong and the exposed ambush units.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 11."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "ambush_bandit_scouted",
"name": "Exposed Raider",
"class_id": "bandit",
"team": "enemy",
"level": 3,
"pos": [5, 1],
"base": { "hp": 32, "atk": 11, "def": 5 }
},
{
"unit_id": "ambush_archer_scouted",
"name": "Exposed Archer",
"class_id": "archer",
"team": "enemy",
"level": 3,
"pos": [10, 6],
"base": { "hp": 26, "atk": 10, "def": 4 }
}
]
}
]
},
{
"id": "turn_5_pressure",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 5, "campaign_flags": { "pursued_dong_zhuo": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "Their line is stretched. Push through the road before they regroup." }
]
}
]
},
{
"id": "turn_5_regroup_pressure",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 5, "campaign_flags": { "regrouped_after_sishui": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "Their hidden troops are fewer than expected. The scouts earned their pay." },
{ "speaker": "Cao Cao", "text": "Good. Keep the pressure on Xu Rong before he reforms the line." }
]
}
]
}
],
"rewards": {
"gold": 700,
"items": ["bean", "wine", "iron_sword"]
},
"post_battle_dialogue": [
{ "speaker": "Cao Cao", "text": "Xu Rong's trap failed, but Dong Zhuo has bought himself time." },
{ "speaker": "Xiahou Dun", "text": "Then we sharpen the army and wait for the next opening." }
]
}

View File

@@ -0,0 +1,247 @@
{
"id": "004_qingzhou_campaign",
"name": "Qingzhou Campaign",
"objectives": {
"victory": "Defeat the Yellow Turban remnant leaders.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_bandit_push" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 12, "team": "player" }
]
},
"briefing": {
"title": "Qingzhou Campaign",
"location": "Qingzhou, 192 CE",
"lines": [
"After the coalition fractures, Cao Cao turns toward Qingzhou.",
"Yellow Turban remnants threaten the villages and trade roads.",
"Secure the road, defeat the rebel leaders, and gather soldiers for a lasting army."
],
"conditional_lines": [
{
"campaign_flags": { "pursued_dong_zhuo": true },
"lines": [
"The army is still lean from the rapid pursuit after Sishui, but its veterans are hardened by the ambush at Xingyang."
]
},
{
"campaign_flags": { "regrouped_after_sishui": true },
"lines": [
"Supplies gathered after Sishui let Cao Cao press into Qingzhou with a steadier line."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"leather_armor",
"iron_armor"
]
},
"roster": {
"max_units": 4,
"required_officers": ["cao_cao"]
},
"formation": {
"cells": [[1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5]]
},
"map": {
"width": 14,
"height": 10,
"terrain": [
"GGGGGGGGGGGGGG",
"GGGFFFGGGHHGGG",
"GGGFFFGRRHHGGG",
"GGGGGGRRRGGGGG",
"RRRRRRRRRRRRRR",
"GGGGGGRRRGGGGG",
"GGHGGGFFFGGGGG",
"GGHHGGFFFGGWWG",
"GGGGGGGFFGGWWG",
"GGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch4",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "xiahou_dun_ch4",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [2, 4]
},
{
"unit_id": "xiahou_yuan_ch4",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch4",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "qingzhou_chief",
"name": "Qingzhou Chief",
"class_id": "bandit",
"team": "enemy",
"level": 4,
"pos": [11, 4],
"base": { "hp": 48, "atk": 15, "def": 7 }
},
{
"unit_id": "yellow_turban_spearman_1",
"name": "Yellow Turban Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 4,
"pos": [9, 3],
"base": { "hp": 38, "atk": 13, "def": 7 }
},
{
"unit_id": "yellow_turban_spearman_2",
"name": "Yellow Turban Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 4,
"pos": [9, 5],
"base": { "hp": 38, "atk": 13, "def": 7 }
},
{
"unit_id": "yellow_turban_archer",
"name": "Yellow Turban Archer",
"class_id": "archer",
"team": "enemy",
"level": 4,
"pos": [10, 2],
"base": { "hp": 30, "atk": 11, "def": 5 }
},
{
"unit_id": "yellow_turban_strategist",
"name": "Yellow Turban Mystic",
"class_id": "strategist",
"team": "enemy",
"level": 4,
"pos": [11, 6],
"base": { "hp": 32, "mp": 16, "atk": 7, "def": 4, "int": 11 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Cao Cao enters Qingzhou to pacify the Yellow Turban remnants." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "A commander needs more than victories. We need men who can hold the land after the banners move on." },
{ "speaker": "Xiahou Dun", "text": "Then we break these remnants and give the villages a reason to trust our flag." },
{ "speaker": "Xiahou Yuan", "text": "Their archers have taken the eastern ridge. I will keep them from harassing the road." }
]
}
]
},
{
"id": "turn_3_bandit_push",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{ "type": "log", "text": "Hidden Yellow Turban raiders rush from the woods." },
{
"type": "dialogue",
"lines": [
{ "speaker": "Qingzhou Chief", "text": "The villages are ours to feed from. Drive Cao Cao back to the west!" },
{ "speaker": "Cao Cao", "text": "They reveal themselves. Hold the road and cut them down in detail." }
]
},
{
"type": "set_objective",
"victory": "Defeat the Qingzhou chief and every raider.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "qingzhou_raider_north",
"name": "Qingzhou Raider",
"class_id": "bandit",
"team": "enemy",
"level": 4,
"pos": [6, 1],
"base": { "hp": 34, "atk": 12, "def": 5 }
},
{
"unit_id": "qingzhou_raider_south",
"name": "Qingzhou Raider",
"class_id": "bandit",
"team": "enemy",
"level": 4,
"pos": [6, 8],
"base": { "hp": 34, "atk": 12, "def": 5 }
},
{
"unit_id": "qingzhou_raider_archer",
"name": "Qingzhou Archer",
"class_id": "archer",
"team": "enemy",
"level": 4,
"pos": [13, 7],
"base": { "hp": 28, "atk": 11, "def": 4 }
}
]
}
]
},
{
"id": "turn_5_dian_wei_rumor",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 5 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Scout", "text": "My lord, a fierce warrior has been seen defending villagers east of the ridge." },
{ "speaker": "Cao Cao", "text": "Remember his name. Men who protect the weak are worth more than plunderers." }
]
}
]
}
],
"rewards": {
"gold": 800,
"items": ["bean", "hand_axe", "iron_armor"],
"join_officers": ["dian_wei"]
},
"post_battle_dialogue": [
{ "speaker": "Dian Wei", "text": "You fought the raiders instead of bargaining with them. I can respect that." },
{ "speaker": "Cao Cao", "text": "Then stand with me, Dian Wei. I need warriors who can guard more than their own fame." },
{ "speaker": "Dian Wei", "text": "Give me a place in the line, and I will hold it." }
]
}

View File

@@ -0,0 +1,267 @@
{
"id": "005_puyang_raid",
"name": "Puyang Raid",
"objectives": {
"victory": "Defeat Lu Bu's forward guard.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 11."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_lu_bu_arrives" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 11, "team": "player" }
]
},
"briefing": {
"title": "Puyang Raid",
"location": "Puyang, 194 CE",
"lines": [
"Lu Bu has seized momentum in Yan Province.",
"Cao Cao launches a night raid near Puyang to break the forward guard before the main cavalry can gather.",
"Dian Wei joins the front line as Cao Cao's personal shield."
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"iron_armor"
]
},
"roster": {
"max_units": 4,
"required_officers": ["cao_cao", "dian_wei"]
},
"formation": {
"cells": [[1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 4]]
},
"map": {
"width": 14,
"height": 10,
"terrain": [
"GGGGGHHGGGGGGG",
"GGGFFHHGGGFFGG",
"GGGFFRRRRRFFGG",
"GGGGGRGGGRGGGG",
"RRRRRRRRRRRRRR",
"GGGGGRGGGRGGGG",
"GGFFFRRRRRFFGG",
"GGFFFHHGGGFFGG",
"GGGGGHHGGGWWGG",
"GGGGGGGGGGWWGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch5",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "dian_wei_ch5",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch5",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "xiahou_yuan_ch5",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch5",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "zhang_liao_vanguard",
"name": "Zhang Liao Vanguard",
"class_id": "cavalry",
"team": "enemy",
"level": 5,
"pos": [10, 4],
"base": { "hp": 48, "atk": 16, "def": 8, "agi": 10 }
},
{
"unit_id": "gao_shun_guard",
"name": "Gao Shun Guard",
"class_id": "infantry",
"team": "enemy",
"level": 5,
"pos": [9, 3],
"base": { "hp": 44, "atk": 14, "def": 9 }
},
{
"unit_id": "puyang_cavalry_1",
"name": "Puyang Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 5,
"pos": [11, 3],
"base": { "hp": 38, "atk": 13, "def": 7 }
},
{
"unit_id": "puyang_cavalry_2",
"name": "Puyang Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 5,
"pos": [11, 5],
"base": { "hp": 38, "atk": 13, "def": 7 }
},
{
"unit_id": "puyang_archer",
"name": "Puyang Archer",
"class_id": "archer",
"team": "enemy",
"level": 5,
"pos": [10, 2],
"base": { "hp": 30, "atk": 12, "def": 5 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Cao Cao's raiding force slips toward Puyang under cover of darkness." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Lu Bu's cavalry is dangerous once it gathers speed. We strike before the whole camp wakes." },
{ "speaker": "Dian Wei", "text": "Stay behind me, my lord. Any rider who reaches you answers to my axe." },
{ "speaker": "Xiahou Dun", "text": "Good. We cut open their guard and withdraw before dawn." }
]
}
]
},
{
"id": "turn_2_alarm",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{ "type": "log", "text": "Puyang's forward camp sounds the alarm." },
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang Liao", "text": "Cao Cao comes in the night. Riders, close the road and pin him here." },
{ "speaker": "Cao Cao", "text": "The alarm is raised. Break their line before Lu Bu himself arrives." }
]
}
]
},
{
"id": "turn_3_lu_bu_arrives",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{ "type": "log", "text": "Lu Bu's banner appears beyond the eastern road." },
{
"type": "dialogue",
"lines": [
{ "speaker": "Lu Bu", "text": "Cao Cao dares raid Puyang? Then let him see how fast my riders wake." },
{ "speaker": "Dian Wei", "text": "That one has a loud voice. I will hold the road while you finish the guard." }
]
},
{
"type": "set_objective",
"victory": "Defeat Zhang Liao's guard and the arriving riders.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 11."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "lu_bu_banner",
"name": "Lu Bu Banner Guard",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 6,
"pos": [13, 4],
"base": { "hp": 54, "atk": 18, "def": 9, "agi": 12 }
},
{
"unit_id": "lu_bu_rider_north",
"name": "Lu Bu Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 5,
"pos": [12, 2],
"base": { "hp": 38, "atk": 14, "def": 7 }
},
{
"unit_id": "lu_bu_rider_south",
"name": "Lu Bu Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 5,
"pos": [12, 6],
"base": { "hp": 38, "atk": 14, "def": 7 }
}
]
}
]
},
{
"id": "turn_5_pressure",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 5 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Dian Wei", "text": "Their riders hit hard, but their line bends. Give the word and I will split it." },
{ "speaker": "Cao Cao", "text": "Press them. We leave Puyang with their vanguard broken." }
]
}
]
}
],
"rewards": {
"gold": 900,
"items": ["bean", "wine", "iron_sword"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Dun", "text": "Lu Bu's men still hold Puyang, but their forward guard will remember tonight." },
{ "speaker": "Dian Wei", "text": "They came fast. Next time, let them come closer." },
{ "speaker": "Cao Cao", "text": "We have measured their strength. Now we choose whether to fortify Yan Province or strike again." }
],
"post_battle_choices": [
{
"id": "fortify_yan_province",
"label": "Fortify Yan Province",
"description": "Secure supply roads before another clash with Lu Bu.",
"set_flags": { "fortified_yan_province": true, "pressed_lu_bu": false }
},
{
"id": "press_lu_bu",
"label": "Press Lu Bu",
"description": "Keep pressure on Puyang while Lu Bu's guard is shaken.",
"set_flags": { "fortified_yan_province": false, "pressed_lu_bu": true }
}
]
}

View File

@@ -0,0 +1,305 @@
{
"id": "006_dingtao_counterattack",
"name": "Dingtao Counterattack",
"objectives": {
"victory": "Defeat Lu Bu's counterattack force.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_counterattack" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 12, "team": "player" }
]
},
"briefing": {
"title": "Dingtao Counterattack",
"location": "Dingtao, 194 CE",
"lines": [
"After the raid at Puyang, Lu Bu moves to punish Cao Cao's army near Dingtao.",
"The field is broken by ridges and roads. Keep the line tight and blunt the cavalry charge."
],
"conditional_lines": [
{
"campaign_flags": { "fortified_yan_province": true },
"lines": [
"Fortified supply roads give Cao Cao time to choose the battlefield and prepare reserves."
]
},
{
"campaign_flags": { "pressed_lu_bu": true },
"lines": [
"Cao Cao's pressure has kept Lu Bu off balance, but the army enters Dingtao with little rest."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"leather_armor"
],
"conditional_items": [
{
"campaign_flags": { "fortified_yan_province": true },
"items": ["iron_armor"]
},
{
"campaign_flags": { "pressed_lu_bu": true },
"items": ["war_axe"]
}
]
},
"roster": {
"max_units": 4,
"required_officers": ["cao_cao", "dian_wei"]
},
"formation": {
"cells": [[1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5]]
},
"map": {
"width": 14,
"height": 10,
"terrain": [
"GGGGGGGGGGGGGG",
"GGGFFGGGHHGGGG",
"GGGFFRRRHHGGGG",
"GGGGGRRRGGGGGG",
"RRRRRRRRRRRRRR",
"GGGGGRRRGGGGGG",
"GGHHGFFFGRRGGG",
"GGHHGFFFGGGWWG",
"GGGGGGFFGGGWWG",
"GGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch6",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "dian_wei_ch6",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch6",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "xiahou_yuan_ch6",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch6",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "lu_bu_counterattack",
"name": "Lu Bu Counterattack",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 7,
"pos": [10, 4],
"base": { "hp": 58, "atk": 19, "def": 10, "agi": 12 }
},
{
"unit_id": "zhang_liao_pursuer",
"name": "Zhang Liao Pursuer",
"class_id": "cavalry",
"team": "enemy",
"level": 6,
"pos": [9, 3],
"base": { "hp": 46, "atk": 16, "def": 8, "agi": 11 }
},
{
"unit_id": "gao_shun_line",
"name": "Gao Shun Line",
"class_id": "infantry",
"team": "enemy",
"level": 6,
"pos": [9, 5],
"base": { "hp": 46, "atk": 15, "def": 10 }
},
{
"unit_id": "dingtao_archer",
"name": "Dingtao Archer",
"class_id": "archer",
"team": "enemy",
"level": 6,
"pos": [11, 2],
"base": { "hp": 32, "atk": 12, "def": 5 }
},
{
"unit_id": "dingtao_strategist",
"name": "Dingtao Strategist",
"class_id": "strategist",
"team": "enemy",
"level": 6,
"pos": [11, 6],
"base": { "hp": 34, "mp": 18, "atk": 7, "def": 5, "int": 12 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Lu Bu's counterattack sweeps toward Dingtao." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Lu Bu wants a swift decision. We deny him speed and break his vanguard." },
{ "speaker": "Dian Wei", "text": "Let the riders come. A road is narrow when I stand in it." },
{ "speaker": "Xiahou Dun", "text": "The center road is their best charge lane. We hold there, then counter." }
]
}
]
},
{
"id": "turn_3_fortified_reserve",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3, "campaign_flags": { "fortified_yan_province": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Scout", "text": "The eastern riders are moving exactly where the reserve scouts predicted." },
{ "speaker": "Cao Cao", "text": "Good. Let them spend their charge against prepared ground." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "screened_lu_bu_rider",
"name": "Screened Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 6,
"pos": [12, 3],
"base": { "hp": 38, "atk": 14, "def": 7 }
},
{
"unit_id": "screened_lu_bu_archer",
"name": "Screened Archer",
"class_id": "archer",
"team": "enemy",
"level": 6,
"pos": [12, 6],
"base": { "hp": 30, "atk": 12, "def": 5 }
}
]
}
]
},
{
"id": "turn_3_pressed_lu_bu_charge",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3, "campaign_flags": { "pressed_lu_bu": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Lu Bu", "text": "Cao Cao chased too far. Trample his tired line!" },
{ "speaker": "Dian Wei", "text": "Tired men still swing hard when cornered." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "fierce_lu_bu_rider",
"name": "Fierce Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 6,
"pos": [12, 2],
"base": { "hp": 40, "atk": 15, "def": 7 }
},
{
"unit_id": "fierce_lu_bu_guard",
"name": "Fierce Guard",
"class_id": "infantry",
"team": "enemy",
"level": 6,
"pos": [13, 4],
"base": { "hp": 42, "atk": 14, "def": 9 }
},
{
"unit_id": "fierce_lu_bu_rider_south",
"name": "Fierce Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 6,
"pos": [12, 6],
"base": { "hp": 40, "atk": 15, "def": 7 }
}
]
}
]
},
{
"id": "turn_3_counterattack",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{ "type": "log", "text": "Lu Bu commits his second wave." },
{
"type": "set_objective",
"victory": "Defeat Lu Bu's counterattack and every second-wave unit.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
}
]
},
{
"id": "turn_5_hold_center",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 5 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Their charge is spent. Now strike at the officers holding the line together." },
{ "speaker": "Xiahou Yuan", "text": "I have their archers marked. One clear shot can open the road." }
]
}
]
}
],
"rewards": {
"gold": 1000,
"items": ["bean", "wine", "war_axe"]
},
"post_battle_dialogue": [
{ "speaker": "Cao Cao", "text": "Lu Bu's charge is powerful, but not invincible." },
{ "speaker": "Dian Wei", "text": "His riders bleed like anyone else." },
{ "speaker": "Xiahou Dun", "text": "Then Yan Province is not lost. We keep fighting." }
]
}

View File

@@ -0,0 +1,319 @@
{
"id": "007_xian_emperor_escort",
"name": "Xian Emperor Escort",
"objectives": {
"victory": "Move Cao Cao to the eastern road marker.",
"defeat": "Cao Cao or the imperial envoy is defeated, or the battle reaches Turn 11."
},
"conditions": {
"victory": {
"type": "unit_reaches_tile",
"team": "player",
"officer_ids": ["cao_cao"],
"pos": [13, 4]
},
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "any_unit_defeated", "unit_ids": ["imperial_envoy_ch7"] },
{ "type": "turn_reached", "turn": 11, "team": "player" }
]
},
"briefing": {
"title": "Xian Emperor Escort",
"location": "Luoyang Road, 196 CE",
"lines": [
"The imperial carriage has slipped out of the ruined capital under pressure from rival warlords.",
"Cao Cao must reach the eastern road marker and secure the escort route before the remnants close in."
],
"conditional_lines": [
{
"campaign_flags": { "fortified_yan_province": true },
"lines": [
"The fortified roads in Yan Province have kept supplies moving, giving the escort column a steadier pace."
]
},
{
"campaign_flags": { "pressed_lu_bu": true },
"lines": [
"The army arrives quickly after pressing Lu Bu, but the forced march leaves little time to rest."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"leather_armor"
],
"conditional_items": [
{
"campaign_flags": { "fortified_yan_province": true },
"items": ["iron_armor"]
},
{
"campaign_flags": { "pressed_lu_bu": true },
"items": ["war_axe"]
}
]
},
"roster": {
"max_units": 5,
"required_officers": ["cao_cao"],
"required_units": ["imperial_envoy_ch7"]
},
"formation": {
"cells": [[1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 3], [3, 4], [3, 5]]
},
"map": {
"width": 15,
"height": 10,
"terrain": [
"GGGGGGGGGGGGGGG",
"GGGFFGGGHHGGGGG",
"GGGFFRRRHHGGGGG",
"GGGGGRRRGGFFFGG",
"RRRRRRRRRRRRRRR",
"GGGGGRRRGGFFFGG",
"GGHHGFFFGGGRRGG",
"GGHHGFFFGGGWWGG",
"GGGGGGFFGGGWWGG",
"GGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch7",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "imperial_envoy_ch7",
"name": "Imperial Envoy",
"class_id": "infantry",
"team": "player",
"level": 1,
"controllable": false,
"persist_progression": false,
"ai_target_priority": 6,
"pos": [1, 5],
"base": { "hp": 28, "mp": 0, "atk": 1, "def": 4, "int": 8, "agi": 5 }
},
{
"unit_id": "xiahou_dun_ch7",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [2, 4]
},
{
"unit_id": "dian_wei_ch7",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch7",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch7",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "li_jue_vanguard",
"name": "Li Jue Vanguard",
"class_id": "cavalry",
"team": "enemy",
"level": 7,
"pos": [9, 4],
"base": { "hp": 48, "atk": 16, "def": 8, "agi": 11 }
},
{
"unit_id": "guo_si_guard",
"name": "Guo Si Guard",
"class_id": "infantry",
"team": "enemy",
"level": 7,
"pos": [10, 5],
"base": { "hp": 48, "atk": 15, "def": 10 }
},
{
"unit_id": "escort_road_archer",
"name": "Road Archer",
"class_id": "archer",
"team": "enemy",
"level": 7,
"pos": [11, 3],
"base": { "hp": 34, "atk": 13, "def": 6 }
},
{
"unit_id": "escort_hill_bandit",
"name": "Hill Bandit",
"class_id": "bandit",
"team": "enemy",
"level": 7,
"pos": [8, 2],
"base": { "hp": 42, "atk": 14, "def": 7 }
},
{
"unit_id": "escort_strategist",
"name": "Court Remnant",
"class_id": "strategist",
"team": "enemy",
"level": 7,
"pos": [12, 6],
"base": { "hp": 36, "mp": 20, "atk": 7, "def": 6, "int": 13 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "The imperial escort road lies beyond the enemy vanguard." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Do not chase every remnant. Our task is the road ahead." },
{ "speaker": "Xiahou Dun", "text": "Then we punch through the center and keep you moving." },
{ "speaker": "Dian Wei", "text": "I will keep their blades away from the envoy." }
]
}
]
},
{
"id": "turn_3_rear_pressure",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Scout", "text": "Enemy riders are circling behind us!" },
{ "speaker": "Cao Cao", "text": "Then the envoy cannot linger. Forward." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "rear_pressure_rider",
"name": "Rear Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 7,
"pos": [4, 1],
"base": { "hp": 40, "atk": 15, "def": 7, "agi": 10 }
},
{
"unit_id": "rear_pressure_bandit",
"name": "Rear Bandit",
"class_id": "bandit",
"team": "enemy",
"level": 7,
"pos": [5, 7],
"base": { "hp": 40, "atk": 14, "def": 7 }
}
]
}
]
},
{
"id": "midroad_ambush",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "pos": [7, 4] },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Imperial Envoy", "text": "There are banners moving in the northern trees!" },
{ "speaker": "Cao Cao", "text": "So the road was bait. Keep the envoy covered and break through." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "midroad_ambush_guard",
"name": "Ambush Guard",
"class_id": "infantry",
"team": "enemy",
"level": 7,
"pos": [7, 2],
"base": { "hp": 42, "atk": 14, "def": 9 }
},
{
"unit_id": "midroad_ambush_archer",
"name": "Ambush Archer",
"class_id": "archer",
"team": "enemy",
"level": 7,
"pos": [8, 6],
"base": { "hp": 32, "atk": 13, "def": 6 }
}
]
}
]
},
{
"id": "turn_5_road_marker",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 5 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The eastern road marker is in sight. Cao Cao only needs a clear lane." },
{ "speaker": "Cao Cao", "text": "Good. Hold the flanks and do not let the rear pressure break our pace." }
]
}
]
}
],
"rewards": {
"gold": 1100,
"items": ["bean", "iron_armor"]
},
"post_battle_dialogue": [
{ "speaker": "Cao Cao", "text": "The Son of Heaven is safe on the road. That changes every banner in the realm." },
{ "speaker": "Xiahou Dun", "text": "Then every rival will look at us differently after today." },
{ "speaker": "Cao Cao", "text": "Let them. Authority is also a battlefield." }
],
"post_battle_choices": [
{
"id": "secure_imperial_court",
"label": "Secure the Court",
"description": "Cao Cao focuses on stabilizing the imperial court.",
"set_flags": { "secured_imperial_court": true },
"gold": 200,
"items": ["imperial_seal"]
},
{
"id": "pursue_li_jue_remnants",
"label": "Pursue Remnants",
"description": "The army presses the scattered warlord remnants.",
"set_flags": { "pursued_li_jue_remnants": true },
"items": ["war_drum", "training_spear", "bean", "wine"]
}
]
}

View File

@@ -0,0 +1,401 @@
{
"id": "008_wan_castle_escape",
"name": "Wan Castle Escape",
"objectives": {
"victory": "Move Cao Cao to the western road marker.",
"defeat": "Cao Cao or Cao Ang is defeated, or the battle reaches Turn 12."
},
"conditions": {
"victory": {
"type": "unit_reaches_tile",
"team": "player",
"officer_ids": ["cao_cao"],
"pos": [1, 4]
},
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "any_unit_defeated", "unit_ids": ["cao_ang_ch8"] },
{ "type": "turn_reached", "turn": 12, "team": "player" }
]
},
"briefing": {
"title": "Wan Castle Escape",
"location": "Wancheng, 197 CE",
"lines": [
"Zhang Xiu welcomes Cao Cao into Wan Castle, but Jia Xu's counsel turns the banquet into a trap.",
"The eastern gate is collapsing behind the army. Escort Cao Ang and move Cao Cao to the western road marker before the ambush closes."
],
"conditional_lines": [
{
"campaign_flags": { "secured_imperial_court": true },
"lines": [
"The imperial court's seal has opened a few guarded roads, giving Cao Cao one narrow escape lane through the west."
]
},
{
"campaign_flags": { "pursued_li_jue_remnants": true },
"lines": [
"The army's hard pursuit after the imperial escort keeps the vanguard sharp, but Zhang Xiu's scouts know Cao Cao's marching habits."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "secured_imperial_court": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "pursued_li_jue_remnants": true },
"items": ["war_drum"]
}
]
},
"roster": {
"max_units": 5,
"required_officers": ["cao_cao", "dian_wei"],
"required_units": ["cao_ang_ch8"]
},
"formation": {
"cells": [[10, 3], [10, 4], [10, 5], [11, 3], [11, 4], [11, 5], [12, 3], [12, 4], [12, 5]]
},
"map": {
"width": 15,
"height": 10,
"terrain": [
"GGGGGHHGGGFFFFG",
"GGFFGHHGGGFFFFG",
"GGFFRRRRRRGGGGG",
"GGGGRGGGGGRRRGG",
"RRRRRRRRRRRRRRR",
"GGGGRGGGGGRRRGG",
"GGFFRRRGGGFFFFG",
"GGFFGHHGGGFFFFG",
"GGGGGHHGGGWWGGG",
"GGGGGGGGGGWWGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch8",
"officer_id": "cao_cao",
"team": "player",
"pos": [12, 4]
},
{
"unit_id": "cao_ang_ch8",
"name": "Cao Ang",
"class_id": "cavalry",
"team": "player",
"level": 4,
"controllable": false,
"persist_progression": false,
"ai_target_priority": 5,
"pos": [12, 5],
"base": { "hp": 32, "mp": 2, "atk": 9, "def": 6, "int": 6, "agi": 8 }
},
{
"unit_id": "dian_wei_ch8",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [11, 4]
},
{
"unit_id": "xiahou_dun_ch8",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [12, 3]
},
{
"unit_id": "xiahou_yuan_ch8",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [11, 3]
},
{
"unit_id": "cao_ren_ch8",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [11, 5]
},
{
"unit_id": "zhang_xiu_vanguard",
"name": "Zhang Xiu Vanguard",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [6, 4],
"base": { "hp": 52, "atk": 17, "def": 9, "agi": 12 }
},
{
"unit_id": "wan_castle_guard_north",
"name": "Wan Castle Guard",
"class_id": "infantry",
"team": "enemy",
"level": 8,
"pos": [5, 3],
"base": { "hp": 46, "atk": 15, "def": 10 }
},
{
"unit_id": "wan_castle_guard_south",
"name": "Wan Castle Guard",
"class_id": "infantry",
"team": "enemy",
"level": 8,
"pos": [5, 5],
"base": { "hp": 46, "atk": 15, "def": 10 }
},
{
"unit_id": "jia_xu_strategist",
"name": "Jia Xu Strategist",
"class_id": "strategist",
"team": "enemy",
"level": 8,
"pos": [4, 6],
"skills": ["blaze"],
"base": { "hp": 38, "mp": 22, "atk": 7, "def": 6, "int": 14 }
},
{
"unit_id": "wan_castle_archer",
"name": "Wan Castle Archer",
"class_id": "archer",
"team": "enemy",
"level": 8,
"pos": [6, 2],
"base": { "hp": 34, "atk": 13, "def": 6 }
},
{
"unit_id": "southern_ambusher",
"name": "Southern Ambusher",
"class_id": "bandit",
"team": "enemy",
"level": 8,
"pos": [7, 7],
"base": { "hp": 42, "atk": 15, "def": 7 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Wan Castle's gates close behind Cao Cao's column." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "The music stopped too cleanly. This is Jia Xu's work." },
{ "speaker": "Dian Wei", "text": "Then I hold the gate while you cut west." },
{ "speaker": "Cao Ang", "text": "Father, the road is narrow. I will stay close." }
]
}
]
},
{
"id": "turn_2_gate_closes",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang Xiu", "text": "Close the eastern gate. Cao Cao leaves Wan Castle only through our blades." },
{ "speaker": "Jia Xu", "text": "Do not chase the guards. Strike the road and separate him from his son." }
]
},
{
"type": "set_objective",
"victory": "Break through the western road and move Cao Cao to the escape marker.",
"defeat": "Cao Cao or Cao Ang is defeated, or the battle reaches Turn 12."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "east_gate_rider_north",
"name": "East Gate Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [13, 2],
"base": { "hp": 40, "atk": 15, "def": 8, "agi": 10 }
},
{
"unit_id": "east_gate_rider_south",
"name": "East Gate Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [13, 6],
"base": { "hp": 40, "atk": 15, "def": 8, "agi": 10 }
}
]
}
]
},
{
"id": "court_escape_lane",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 3, "campaign_flags": { "secured_imperial_court": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Imperial Guard", "text": "The court seal opens the west postern. We can delay their riders for a moment." },
{ "speaker": "Cao Cao", "text": "Then one moment is enough. Keep the road open." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "imperial_guard_support_ch8",
"name": "Imperial Guard",
"class_id": "infantry",
"team": "player",
"level": 6,
"controllable": false,
"persist_progression": false,
"pos": [9, 4],
"base": { "hp": 34, "atk": 10, "def": 9, "int": 6, "agi": 6 }
}
}
]
},
{
"id": "remnant_scout_pressure",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3, "campaign_flags": { "pursued_li_jue_remnants": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Wan Scout", "text": "That is the same vanguard that chased Li Jue's remnants. Cut off their old marching path." },
{ "speaker": "Xiahou Dun", "text": "They know our pace. Then we change it by force." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "remnant_scout_rider",
"name": "Remnant Scout Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [10, 1],
"base": { "hp": 38, "atk": 14, "def": 7, "agi": 11 }
},
{
"unit_id": "remnant_scout_archer",
"name": "Remnant Scout Archer",
"class_id": "archer",
"team": "enemy",
"level": 8,
"pos": [10, 7],
"base": { "hp": 32, "atk": 13, "def": 5 }
}
]
}
]
},
{
"id": "midroad_trap",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "pos": [8, 4] },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ang", "text": "Archers in the trees!" },
{ "speaker": "Dian Wei", "text": "Stay behind the shields. I will make them aim at me." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "midroad_wan_archer_north",
"name": "Wan Ambush Archer",
"class_id": "archer",
"team": "enemy",
"level": 8,
"pos": [8, 2],
"base": { "hp": 32, "atk": 13, "def": 5 }
},
{
"unit_id": "midroad_wan_archer_south",
"name": "Wan Ambush Archer",
"class_id": "archer",
"team": "enemy",
"level": 8,
"pos": [8, 6],
"base": { "hp": 32, "atk": 13, "def": 5 }
}
]
}
]
},
{
"id": "turn_6_last_push",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 6 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "The western road is close. Do not spend lives chasing revenge inside these walls." },
{ "speaker": "Dian Wei", "text": "Then I spend steel instead. Move." }
]
}
]
}
],
"rewards": {
"gold": 1200,
"items": ["bean", "wine", "iron_sword"]
},
"post_battle_dialogue": [
{ "speaker": "Cao Ang", "text": "The road is clear. I thought Wan Castle would swallow us." },
{ "speaker": "Dian Wei", "text": "It tried. Its teeth broke first." },
{ "speaker": "Cao Cao", "text": "A trap survived is still a lesson. We will remember Jia Xu." }
],
"post_battle_choices": [
{
"id": "hold_wan_gate",
"label": "Hold the Gate",
"description": "Dian Wei holds the rear long enough to recover armor and baggage.",
"set_flags": { "held_wan_gate": true, "swift_wan_escape": false },
"gold": 100,
"items": ["iron_armor"]
},
{
"id": "swift_wan_withdrawal",
"label": "Swift Withdrawal",
"description": "Cao Cao leaves the baggage behind to keep the army intact.",
"set_flags": { "held_wan_gate": false, "swift_wan_escape": true },
"gold": 250,
"items": ["bean", "wine", "short_bow"]
}
]
}

View File

@@ -0,0 +1,369 @@
{
"id": "009_xiapi_siege",
"name": "Xiapi Siege",
"objectives": {
"victory": "Hold through the flood-gate operation, then defeat Lu Bu's army.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 13."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_flood_gates" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 13, "team": "player" }
]
},
"briefing": {
"title": "Xiapi Siege",
"location": "Xiapi, 198 CE",
"lines": [
"Lu Bu has withdrawn behind Xiapi's wet walls, trusting his cavalry and Chen Gong's counsel to break the siege.",
"Cao Cao orders the river channels opened. Survive the countercharge until the flood-gate signals confirm that Lu Bu's army has been forced into the open."
],
"conditional_lines": [
{
"campaign_flags": { "held_wan_gate": true },
"lines": [
"The baggage recovered at Wan Castle keeps the siege line supplied with heavier shields and dry bowstrings."
]
},
{
"campaign_flags": { "swift_wan_escape": true },
"lines": [
"The army reached Xiapi quickly after leaving Wan Castle behind, but some siege stores are still catching up."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "held_wan_gate": true },
"items": ["war_drum"]
},
{
"campaign_flags": { "swift_wan_escape": true },
"items": ["war_axe"]
}
]
},
"roster": {
"max_units": 5,
"required_officers": ["cao_cao", "dian_wei"]
},
"formation": {
"cells": [[1, 3], [1, 4], [1, 5], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4]]
},
"map": {
"width": 15,
"height": 10,
"terrain": [
"GGGGGHHGGGWWGGG",
"GGGFFHHGGGWWGGG",
"GGGFFRRRRGGGGGG",
"GGGGGRRRGGFFFGG",
"RRRRRRRRRRRRRRR",
"GGGGGRRRGGFFFGG",
"GGHHGFFFGGGRRGG",
"GGHHGFFFGGGWWGG",
"GGGGGGFFGGGWWGG",
"GGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch9",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "dian_wei_ch9",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch9",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "xiahou_yuan_ch9",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch9",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "lu_bu_xiapi",
"name": "Lu Bu",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 9,
"pos": [11, 4],
"base": { "hp": 64, "atk": 21, "def": 11, "agi": 13 }
},
{
"unit_id": "chen_gong_strategist",
"name": "Chen Gong",
"class_id": "strategist",
"team": "enemy",
"level": 9,
"pos": [10, 6],
"skills": ["blaze"],
"base": { "hp": 40, "mp": 24, "atk": 7, "def": 6, "int": 15 }
},
{
"unit_id": "gao_shun_trap_line",
"name": "Gao Shun Line",
"class_id": "infantry",
"team": "enemy",
"level": 9,
"pos": [9, 5],
"base": { "hp": 50, "atk": 16, "def": 11 }
},
{
"unit_id": "xiapi_rider_north",
"name": "Xiapi Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [9, 3],
"base": { "hp": 42, "atk": 15, "def": 8, "agi": 11 }
},
{
"unit_id": "xiapi_rider_south",
"name": "Xiapi Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [10, 5],
"base": { "hp": 42, "atk": 15, "def": 8, "agi": 11 }
},
{
"unit_id": "xiapi_wall_archer",
"name": "Wall Archer",
"class_id": "archer",
"team": "enemy",
"level": 8,
"pos": [12, 2],
"base": { "hp": 34, "atk": 13, "def": 6 }
},
{
"unit_id": "xiapi_gate_guard",
"name": "Gate Guard",
"class_id": "infantry",
"team": "enemy",
"level": 8,
"pos": [12, 6],
"base": { "hp": 46, "atk": 15, "def": 10 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "The siege lines tighten around Xiapi." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Lu Bu trusts his speed even behind walls. We will make the ground choose against him." },
{ "speaker": "Xiahou Dun", "text": "The channels are ready. We only need to hold the line until the signal rises." },
{ "speaker": "Dian Wei", "text": "Then I hold the road. Let the horsemen find me first." }
]
}
]
},
{
"id": "turn_2_lu_bu_charge",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Lu Bu", "text": "Cao Cao hides behind ditches and mud. Riders, break the siege line before the water rises!" },
{ "speaker": "Chen Gong", "text": "Strike the commander if the line bends. The flood plan dies with him." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "lu_bu_flank_rider_north",
"name": "Flank Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [6, 1],
"base": { "hp": 40, "atk": 15, "def": 8, "agi": 11 }
},
{
"unit_id": "lu_bu_flank_rider_south",
"name": "Flank Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 8,
"pos": [6, 8],
"base": { "hp": 40, "atk": 15, "def": 8, "agi": 11 }
}
]
}
]
},
{
"id": "turn_3_flood_gates",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 3 },
"actions": [
{ "type": "log", "text": "The flood-gate signal rises around Xiapi." },
{
"type": "dialogue",
"lines": [
{ "speaker": "Scout", "text": "The water is moving. Xiapi's outer detachments are falling back from the low roads!" },
{ "speaker": "Cao Cao", "text": "Good. Now Lu Bu must fight where we can reach him." }
]
},
{
"type": "set_objective",
"victory": "Defeat Lu Bu, Chen Gong, and the remaining Xiapi defenders.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 13."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "flooded_gate_guard",
"name": "Sluice Gate Guard",
"class_id": "infantry",
"team": "enemy",
"level": 8,
"pos": [8, 4],
"base": { "hp": 42, "atk": 14, "def": 9 }
},
{
"unit_id": "flooded_wall_archer",
"name": "Sluice Wall Archer",
"class_id": "archer",
"team": "enemy",
"level": 8,
"pos": [8, 6],
"base": { "hp": 32, "atk": 13, "def": 5 }
}
]
}
]
},
{
"id": "wan_gate_baggage_support",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 4, "campaign_flags": { "held_wan_gate": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "The baggage wagons from Wan have reached the siege line. The reserves are steady." },
{ "speaker": "Cao Cao", "text": "Then press forward carefully. We can afford patience." }
]
}
]
},
{
"id": "swift_wan_counterraid",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4, "campaign_flags": { "swift_wan_escape": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Chen Gong", "text": "Cao Cao came quickly, but speed thins a siege line. Strike the loose wagons." },
{ "speaker": "Xiahou Yuan", "text": "Their raiders found the supply road. I will cut them off." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "supply_road_raider",
"name": "Supply Road Raider",
"class_id": "bandit",
"team": "enemy",
"level": 8,
"pos": [4, 7],
"base": { "hp": 40, "atk": 14, "def": 7, "agi": 9 }
}
}
]
},
{
"id": "turn_6_lu_bu_cornered",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 6 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "His cavalry has nowhere clean to run. Close the ring and do not let Chen Gong buy another hour." },
{ "speaker": "Dian Wei", "text": "Then the road ends here." }
]
}
]
}
],
"rewards": {
"gold": 1400,
"items": ["bean", "wine", "war_axe"],
"join_officers": ["guo_jia"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Dun", "text": "Xiapi is broken. Lu Bu's riders will not trouble Yan Province again." },
{ "speaker": "Dian Wei", "text": "Fast horses drown the same as slow ones." },
{ "speaker": "Guo Jia", "text": "Lu Bu's fall leaves Yuan Shao as the real measure of the north." },
{ "speaker": "Cao Cao", "text": "Speed without judgment is only a longer fall. We turn now from survival to rule." }
],
"post_battle_choices": [
{
"id": "integrate_xu_province",
"label": "Integrate Xu Province",
"description": "Cao Cao places officials to secure the newly won territory.",
"set_flags": { "integrated_xu_province": true, "pressed_northern_campaign": false },
"gold": 200,
"items": ["iron_armor"]
},
{
"id": "press_northern_campaign",
"label": "Press North",
"description": "The army prepares to turn its momentum toward the northern rivals.",
"set_flags": { "integrated_xu_province": false, "pressed_northern_campaign": true },
"gold": 100,
"items": ["wine", "war_drum"]
}
]
}

View File

@@ -0,0 +1,364 @@
{
"id": "010_white_horse_relief",
"name": "White Horse Relief",
"objectives": {
"victory": "Defeat Yan Liang's vanguard after the decoy line is sprung.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_decoy_line" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 12, "team": "player" }
]
},
"briefing": {
"title": "White Horse Relief",
"location": "White Horse, 200 CE",
"lines": [
"Yuan Shao's forward army presses toward White Horse with Yan Liang at its point.",
"Guo Jia proposes a decoy line: draw the vanguard down the road, then strike once its wings stretch too far."
],
"conditional_lines": [
{
"campaign_flags": { "integrated_xu_province": true },
"lines": [
"Officials left in Xu Province keep the rear quiet, letting Cao Cao commit steadier reserves to the northern front."
]
},
{
"campaign_flags": { "pressed_northern_campaign": true },
"lines": [
"The army marches quickly from Xiapi, hoping speed can strike Yuan Shao's vanguard before it settles."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "integrated_xu_province": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "pressed_northern_campaign": true },
"items": ["war_drum"]
}
]
},
"roster": {
"max_units": 6,
"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, 3], [3, 4]]
},
"map": {
"width": 15,
"height": 10,
"terrain": [
"GGGGGGHHGGGGGGG",
"GGFFGGHHGGGFFGG",
"GGFFRRRRRRGFFGG",
"GGGGGRGGGRGGGGG",
"RRRRRRRRRRRRRRR",
"GGGGGRGGGRGGGGG",
"GGHHGRRRGGFFFGG",
"GGHHGFFFGGFFFGG",
"GGGGGFFFGGWWGGG",
"GGGGGGGGGGWWGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch10",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch10",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch10",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch10",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch10",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch10",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "yan_liang_vanguard",
"name": "Yan Liang Vanguard",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 10,
"pos": [11, 4],
"base": { "hp": 62, "atk": 20, "def": 11, "agi": 13 }
},
{
"unit_id": "yuan_shao_spear_line",
"name": "Yuan Spear Line",
"class_id": "infantry",
"team": "enemy",
"level": 9,
"pos": [9, 4],
"base": { "hp": 50, "atk": 16, "def": 10 }
},
{
"unit_id": "yuan_shao_guard",
"name": "Yuan Guard",
"class_id": "infantry",
"team": "enemy",
"level": 9,
"pos": [10, 5],
"base": { "hp": 48, "atk": 15, "def": 11 }
},
{
"unit_id": "white_horse_archer_north",
"name": "White Horse Archer",
"class_id": "archer",
"team": "enemy",
"level": 9,
"pos": [10, 2],
"base": { "hp": 34, "atk": 14, "def": 6 }
},
{
"unit_id": "white_horse_archer_south",
"name": "White Horse Archer",
"class_id": "archer",
"team": "enemy",
"level": 9,
"pos": [12, 6],
"base": { "hp": 34, "atk": 14, "def": 6 }
},
{
"unit_id": "yuan_shao_advisor",
"name": "Yuan Advisor",
"class_id": "strategist",
"team": "enemy",
"level": 9,
"pos": [12, 5],
"skills": ["blaze"],
"base": { "hp": 38, "mp": 22, "atk": 6, "def": 6, "int": 14 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Yuan Shao's vanguard advances toward White Horse." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "Yan Liang is brave enough to follow a retreating banner. That is the door we open." },
{ "speaker": "Cao Cao", "text": "Then the center yields just enough. When his wings stretch, we cut them." },
{ "speaker": "Xiahou Dun", "text": "A false retreat still needs men willing to look beaten." }
]
}
]
},
{
"id": "turn_2_yan_liang_push",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yan Liang", "text": "Cao Cao's line bends already. Drive straight down the road!" },
{ "speaker": "Guo Jia", "text": "He takes the bait. Hold until the second signal." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "yan_liang_rider_north",
"name": "Yan Liang Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 9,
"pos": [8, 2],
"base": { "hp": 42, "atk": 15, "def": 8, "agi": 11 }
},
{
"unit_id": "yan_liang_rider_south",
"name": "Yan Liang Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 9,
"pos": [8, 6],
"base": { "hp": 42, "atk": 15, "def": 8, "agi": 11 }
}
]
}
]
},
{
"id": "turn_3_decoy_line",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 3 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Signal the counterstroke. Yan Liang has outrun his supports." },
{ "speaker": "Guo Jia", "text": "The vanguard is isolated. Strike the horse first, then the spears." }
]
},
{
"type": "set_objective",
"victory": "Defeat Yan Liang and every isolated vanguard unit.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "decoy_cutoff_guard",
"name": "Cutoff Guard",
"class_id": "infantry",
"team": "enemy",
"level": 9,
"pos": [7, 4],
"base": { "hp": 44, "atk": 15, "def": 9 }
},
{
"unit_id": "decoy_cutoff_archer",
"name": "Cutoff Archer",
"class_id": "archer",
"team": "enemy",
"level": 9,
"pos": [7, 5],
"base": { "hp": 32, "atk": 13, "def": 5 }
}
]
}
]
},
{
"id": "xu_province_reserve",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 4, "campaign_flags": { "integrated_xu_province": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "Xu Province's roads are quiet. The reserve wagons have arrived on time." },
{ "speaker": "Cao Cao", "text": "Order and grain win battles before blades touch." }
]
}
]
},
{
"id": "northern_pressure",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4, "campaign_flags": { "pressed_northern_campaign": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Scout", "text": "Cao Cao came quickly. Send the rear riders before his men settle!" },
{ "speaker": "Xiahou Yuan", "text": "More riders from the east. They are trying to punish our speed." }
]
},
{
"type": "spawn_deployment",
"deployment": {
"unit_id": "yuan_rear_rider",
"name": "Yuan Rear Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 9,
"pos": [5, 8],
"base": { "hp": 40, "atk": 15, "def": 8, "agi": 11 }
}
}
]
},
{
"id": "turn_6_finish_vanguard",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 6 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "Yan Liang's formation is no longer an army. It is a collection of frightened men." },
{ "speaker": "Cao Cao", "text": "Then finish this cleanly. White Horse must not remain under threat." }
]
}
]
}
],
"rewards": {
"gold": 1500,
"items": ["bean", "wine", "iron_armor"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Dun", "text": "Yan Liang's charge broke exactly where Guo Jia said it would." },
{ "speaker": "Guo Jia", "text": "Bravery is useful. Predictable bravery is a road sign." },
{ "speaker": "Cao Cao", "text": "White Horse is relieved. Now Yuan Shao must answer us with more than numbers." }
],
"post_battle_choices": [
{
"id": "fortify_white_horse",
"label": "Fortify White Horse",
"description": "Cao Cao strengthens the crossing before the main Guandu confrontation.",
"set_flags": { "fortified_white_horse": true, "raided_yuan_supplies": false },
"gold": 150,
"items": ["iron_armor"]
},
{
"id": "raid_yuan_supplies",
"label": "Raid Supplies",
"description": "The army uses the vanguard's collapse to harass Yuan Shao's supply train.",
"set_flags": { "fortified_white_horse": false, "raided_yuan_supplies": true },
"gold": 100,
"items": ["wine", "training_spear"]
}
]
}

View File

@@ -0,0 +1,356 @@
{
"id": "011_yan_ford_pursuit",
"name": "Yan Ford Pursuit",
"objectives": {
"victory": "Defeat Wen Chou's countercharge after his riders commit.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_2_wen_chou_charge" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 12, "team": "player" }
]
},
"briefing": {
"title": "Yan Ford Pursuit",
"location": "Yan Ford, 200 CE",
"lines": [
"Yan Liang's defeat shakes Yuan Shao's forward army, but Wen Chou rides to restore its nerve.",
"Cao Cao moves toward Yan Ford, where the road narrows between wooded banks and the river crossing."
],
"conditional_lines": [
{
"campaign_flags": { "fortified_white_horse": true },
"lines": [
"The reinforced White Horse crossing slows Yuan Shao's messengers, buying time to arrange a tighter pursuit line."
]
},
{
"campaign_flags": { "raided_yuan_supplies": true },
"lines": [
"Raids against Yuan Shao's baggage train leave Wen Chou's riders angry and hungry, but still eager to strike."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "fortified_white_horse": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "raided_yuan_supplies": true },
"items": ["war_axe"]
}
]
},
"roster": {
"max_units": 6,
"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, 3], [3, 4]]
},
"map": {
"width": 16,
"height": 10,
"terrain": [
"GGGGHHGGGGGGGGGG",
"GGFFHHGGGFFGGGGG",
"GGRRRRRRRGGGHHGG",
"GGGGGGRGGGRRGGGG",
"RRRRRRRRRRRRRRRR",
"GGGGGGRGGGRRGGGG",
"GGHHGFFFGGWWGGGG",
"GGHHGFFFGGWWGGGG",
"GGGGGGFFGGWWGGGG",
"GGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch11",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch11",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch11",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch11",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch11",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch11",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "wen_chou_vanguard",
"name": "Wen Chou Vanguard",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 11,
"pos": [12, 4],
"base": { "hp": 66, "atk": 21, "def": 12, "agi": 14 }
},
{
"unit_id": "yan_ford_bridge_guard",
"name": "Yan Ford Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 10,
"pos": [10, 4],
"base": { "hp": 54, "atk": 17, "def": 13 }
},
{
"unit_id": "yuan_spear_north",
"name": "Yuan Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 10,
"pos": [10, 3],
"base": { "hp": 48, "atk": 16, "def": 10 }
},
{
"unit_id": "yuan_spear_south",
"name": "Yuan Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 10,
"pos": [10, 5],
"base": { "hp": 48, "atk": 16, "def": 10 }
},
{
"unit_id": "yan_ford_archer_north",
"name": "Yan Ford Archer",
"class_id": "marksman",
"team": "enemy",
"level": 10,
"pos": [12, 2],
"base": { "hp": 38, "atk": 15, "def": 7, "agi": 13 }
},
{
"unit_id": "yan_ford_archer_south",
"name": "Yan Ford Archer",
"class_id": "marksman",
"team": "enemy",
"level": 10,
"pos": [12, 6],
"base": { "hp": 38, "atk": 15, "def": 7, "agi": 13 }
},
{
"unit_id": "yuan_field_advisor",
"name": "Yuan Field Advisor",
"class_id": "strategist",
"team": "enemy",
"level": 10,
"pos": [13, 5],
"skills": ["blaze", "mend"],
"base": { "hp": 40, "mp": 24, "atk": 6, "def": 6, "int": 15 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Wen Chou's riders gather near Yan Ford." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "Wen Chou will not accept Yan Liang's defeat as a warning. He will treat it as an insult." },
{ "speaker": "Cao Cao", "text": "Then leave him a road wide enough to charge and narrow enough to close." },
{ "speaker": "Xiahou Yuan", "text": "The ford bends the field for us. I will watch the wooded banks." }
]
}
]
},
{
"id": "turn_2_wen_chou_charge",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Wen Chou", "text": "Yan Liang fell because he was alone. I bring enough horsemen to trample Cao Cao's tricks." },
{ "speaker": "Guo Jia", "text": "Good. Pride has supplied the second wing for us." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "wen_chou_rider_north",
"name": "Wen Chou Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 10,
"pos": [14, 3],
"base": { "hp": 44, "atk": 16, "def": 9, "agi": 12 }
},
{
"unit_id": "wen_chou_rider_south",
"name": "Wen Chou Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 10,
"pos": [14, 5],
"base": { "hp": 44, "atk": 16, "def": 9, "agi": 12 }
}
]
}
]
},
{
"id": "ford_ambush",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [9, 4] },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Guard", "text": "Cao Cao has reached the ford. Close the bank behind him!" },
{ "speaker": "Dian Wei", "text": "They picked the wrong bank to close." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "ford_bank_guard",
"name": "Ford Bank Guard",
"class_id": "infantry",
"team": "enemy",
"level": 10,
"pos": [8, 3],
"base": { "hp": 46, "atk": 16, "def": 10 }
},
{
"unit_id": "ford_bank_archer",
"name": "Ford Bank Archer",
"class_id": "archer",
"team": "enemy",
"level": 10,
"pos": [8, 5],
"base": { "hp": 34, "atk": 14, "def": 6, "agi": 12 }
}
]
}
]
},
{
"id": "white_horse_fortified",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 3, "campaign_flags": { "fortified_white_horse": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "The fortified crossing behind us holds. Wen Chou cannot expect quick help from White Horse." },
{ "speaker": "Cao Cao", "text": "Then this is his battle alone." }
]
}
]
},
{
"id": "yuan_supplies_raided",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3, "campaign_flags": { "raided_yuan_supplies": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Field Advisor", "text": "The supply carts are still scattered from Cao Cao's raid. The riders are charging hungry." },
{ "speaker": "Wen Chou", "text": "Hunger sharpens men. Forward!" }
]
}
]
},
{
"id": "turn_6_close_ford",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 6 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "The ford is nearly sealed. Wen Chou's courage cannot carry him back across it." },
{ "speaker": "Cao Cao", "text": "Finish the countercharge and prepare the Guandu line." }
]
}
]
}
],
"rewards": {
"gold": 1650,
"items": ["bean", "wine", "war_axe"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Yuan", "text": "Wen Chou's riders scattered at the ford. Yuan Shao has lost two blades in two strokes." },
{ "speaker": "Guo Jia", "text": "His numbers remain, but their certainty is damaged. That matters before Guandu." },
{ "speaker": "Cao Cao", "text": "Then we choose where the next certainty breaks." }
],
"post_battle_choices": [
{
"id": "secure_guandu_line",
"label": "Secure Guandu Line",
"description": "Cao Cao strengthens the main defensive camps before Yuan Shao commits his full army.",
"set_flags": { "secured_guandu_line": true, "scouted_wuchao_depots": false },
"gold": 200,
"items": ["iron_armor"]
},
{
"id": "scout_wuchao_depots",
"label": "Scout Wuchao",
"description": "Scouts follow the broken baggage routes toward Yuan Shao's supply depots.",
"set_flags": { "secured_guandu_line": false, "scouted_wuchao_depots": true },
"gold": 100,
"items": ["wine", "war_drum"]
}
]
}

View File

@@ -0,0 +1,395 @@
{
"id": "012_guandu_showdown",
"name": "Guandu Showdown",
"objectives": {
"victory": "Defeat Yuan Shao's main assault after the full line commits.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 13."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_4_yuan_main_assault" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 13, "team": "player" }
]
},
"briefing": {
"title": "Guandu Showdown",
"location": "Guandu, 200 CE",
"lines": [
"Yuan Shao's vast army presses into Guandu, confident that numbers will crush Cao Cao's thin line.",
"Guo Jia urges patience: hold the camps, expose the rhythm of Yuan Shao's command, and look for the supply wound."
],
"conditional_lines": [
{
"campaign_flags": { "secured_guandu_line": true },
"lines": [
"The defensive camps prepared after Yan Ford give the front line room to bend without breaking."
]
},
{
"campaign_flags": { "scouted_wuchao_depots": true },
"lines": [
"Scouts from Yan Ford report unusually heavy traffic toward Wuchao. Yuan Shao's grain may be less protected than his banners."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "secured_guandu_line": true },
"items": ["imperial_seal"]
},
{
"campaign_flags": { "scouted_wuchao_depots": true },
"items": ["war_drum"]
}
]
},
"roster": {
"max_units": 6,
"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, 3], [3, 4]]
},
"map": {
"width": 17,
"height": 11,
"terrain": [
"GGGGGHHGGGGHHGGGG",
"GGFFGHHGGFFHHGFFG",
"GGFFRRRRRRRRRFFGG",
"GGGGGRGGGGRGGGGGG",
"RRRRRRRRRRRRRRRRR",
"GGGGGRGGGGRGGGGGG",
"GGHHGFFFGGWWWGGGG",
"GGHHGFFFGGWWWGGGG",
"GGGGGGFFGGWWWGGGG",
"GGFFGGGGGGGGGFFGG",
"GGGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch12",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch12",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch12",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch12",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch12",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch12",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "yuan_shao_main_body",
"name": "Yuan Shao Main Body",
"class_id": "commander",
"team": "enemy",
"level": 12,
"pos": [14, 4],
"base": { "hp": 70, "mp": 16, "atk": 19, "def": 13, "int": 13, "agi": 10 }
},
{
"unit_id": "ju_shou_advisor",
"name": "Ju Shou Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 12,
"pos": [13, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 46, "mp": 32, "atk": 7, "def": 8, "int": 17, "agi": 10 }
},
{
"unit_id": "zhang_he_vanguard",
"name": "Zhang He Vanguard",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 12,
"pos": [11, 4],
"base": { "hp": 60, "atk": 20, "def": 12, "agi": 15 }
},
{
"unit_id": "yuan_center_guard",
"name": "Yuan Center Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 11,
"pos": [10, 4],
"base": { "hp": 56, "atk": 17, "def": 14 }
},
{
"unit_id": "yuan_north_guard",
"name": "Yuan North Guard",
"class_id": "infantry",
"team": "enemy",
"level": 11,
"pos": [11, 3],
"base": { "hp": 50, "atk": 16, "def": 11 }
},
{
"unit_id": "yuan_south_guard",
"name": "Yuan South Guard",
"class_id": "infantry",
"team": "enemy",
"level": 11,
"pos": [11, 5],
"base": { "hp": 50, "atk": 16, "def": 11 }
},
{
"unit_id": "guandu_archer_north",
"name": "Guandu Archer",
"class_id": "marksman",
"team": "enemy",
"level": 11,
"pos": [12, 2],
"base": { "hp": 40, "atk": 16, "def": 7, "agi": 14 }
},
{
"unit_id": "guandu_archer_south",
"name": "Guandu Archer",
"class_id": "marksman",
"team": "enemy",
"level": 11,
"pos": [13, 6],
"base": { "hp": 40, "atk": 16, "def": 7, "agi": 14 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Yuan Shao's main army bears down on Guandu." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Yuan Shao brings more banners than the field can hold." },
{ "speaker": "Guo Jia", "text": "Then each banner must be fed, signaled, and protected. A large army has larger seams." },
{ "speaker": "Xiahou Dun", "text": "Hold the front until those seams show. I understand." }
]
}
]
},
{
"id": "turn_2_siege_pressure",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Shao", "text": "Press the camps from both wings. Cao Cao cannot answer everywhere." },
{ "speaker": "Ju Shou", "text": "Steady pressure, my lord. Do not let their small line choose the tempo." }
]
}
]
},
{
"id": "secured_line_holds",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 3, "campaign_flags": { "secured_guandu_line": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "The camps we reinforced are holding. Their first push has spent itself on timber and earth." },
{ "speaker": "Cao Cao", "text": "Good. Let Yuan Shao pay for every step." }
]
}
]
},
{
"id": "wuchao_traces_found",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 3, "campaign_flags": { "scouted_wuchao_depots": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "The supply marks match the Yan Ford reports. Wuchao is feeding this entire assault." },
{ "speaker": "Cao Cao", "text": "Then this battle is not only a wall. It is a lantern pointing toward their granary." }
]
}
]
},
{
"id": "turn_4_yuan_main_assault",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 4 },
"actions": [
{
"type": "set_objective",
"victory": "Defeat Yuan Shao's main body and every committed assault unit.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 13."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang He", "text": "The center still stands. Send the rear cavalry in; break them before they settle." },
{ "speaker": "Guo Jia", "text": "Now the main weight is committed. If we endure this, Yuan Shao must expose his stores." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "yuan_rear_cavalry",
"name": "Yuan Rear Cavalry",
"class_id": "cavalry",
"team": "enemy",
"level": 11,
"pos": [15, 4],
"base": { "hp": 46, "atk": 17, "def": 9, "agi": 12 }
},
{
"unit_id": "yuan_north_crossbow",
"name": "Yuan Crossbow",
"class_id": "archer",
"team": "enemy",
"level": 11,
"pos": [16, 3],
"base": { "hp": 36, "atk": 15, "def": 6, "agi": 12 }
},
{
"unit_id": "yuan_south_crossbow",
"name": "Yuan Crossbow",
"class_id": "archer",
"team": "enemy",
"level": 11,
"pos": [16, 5],
"base": { "hp": 36, "atk": 15, "def": 6, "agi": 12 }
}
]
}
]
},
{
"id": "center_countertrap",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [9, 4] },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Guard", "text": "Cao Cao steps into the center! Close ranks around him." },
{ "speaker": "Dian Wei", "text": "Around him? Then you are around me too." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "yuan_center_spearman",
"name": "Yuan Center Spearman",
"class_id": "infantry",
"team": "enemy",
"level": 11,
"pos": [8, 3],
"base": { "hp": 48, "atk": 16, "def": 10 }
},
{
"unit_id": "yuan_center_archer",
"name": "Yuan Center Archer",
"class_id": "archer",
"team": "enemy",
"level": 11,
"pos": [8, 5],
"base": { "hp": 36, "atk": 15, "def": 6, "agi": 12 }
}
]
}
]
},
{
"id": "turn_7_guandu_holds",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 7 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "Their assault no longer moves as one army. It moves as arguments." },
{ "speaker": "Cao Cao", "text": "Then answer each argument with steel. Guandu will hold." }
]
}
]
}
],
"rewards": {
"gold": 1900,
"items": ["bean", "wine", "imperial_seal"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Dun", "text": "Yuan Shao's first great push is broken, but his camps still fill the horizon." },
{ "speaker": "Guo Jia", "text": "The horizon eats grain. Wuchao is now more important than the banners before us." },
{ "speaker": "Cao Cao", "text": "Then we decide whether to strike the grain or strengthen the wall before the next tide." }
],
"post_battle_choices": [
{
"id": "prepare_wuchao_raid",
"label": "Prepare Wuchao Raid",
"description": "Cao Cao commits scouts and fast troops toward Yuan Shao's exposed granaries.",
"set_flags": { "prepared_wuchao_raid": true, "strengthened_guandu_defense": false },
"gold": 100,
"items": ["wine", "war_drum"]
},
{
"id": "strengthen_guandu_defense",
"label": "Strengthen Guandu",
"description": "The army reinforces the camps before planning a deeper strike.",
"set_flags": { "prepared_wuchao_raid": false, "strengthened_guandu_defense": true },
"gold": 250,
"items": ["iron_armor"]
}
]
}

View File

@@ -0,0 +1,340 @@
{
"id": "013_wuchao_raid",
"name": "Wuchao Raid",
"objectives": {
"victory": "Reach Wuchao's depot with Cao Cao, then defeat the remaining defenders.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "wuchao_depot_burned" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 12, "team": "player" }
]
},
"briefing": {
"title": "Wuchao Raid",
"location": "Wuchao, 200 CE",
"lines": [
"The Guandu line holds, but Yuan Shao's army will not collapse while Wuchao feeds it.",
"Cao Cao leads a night raid toward the granaries, counting on speed, fire, and confusion."
],
"conditional_lines": [
{
"campaign_flags": { "prepared_wuchao_raid": true },
"lines": [
"Scouts placed after the Guandu assault mark a narrow path through the outer camp."
]
},
{
"campaign_flags": { "strengthened_guandu_defense": true },
"lines": [
"The reinforced Guandu camps can withstand a longer absence, but the raid must still finish before dawn."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "prepared_wuchao_raid": true },
"items": ["war_drum"]
},
{
"campaign_flags": { "strengthened_guandu_defense": true },
"items": ["imperial_seal"]
}
]
},
"roster": {
"max_units": 6,
"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, 3], [3, 4]]
},
"map": {
"width": 17,
"height": 11,
"terrain": [
"GGGGGHHGGGGGGGGGG",
"GGFFGHHGGGFFGGGGG",
"GGFFRRRRRRRRGGFFG",
"GGGGGRGGGGRRGGGGG",
"RRRRRRRRRRRRRRRRG",
"GGGGGRGGGGRRGGGGG",
"GGHHGFFFGGFFFGGGG",
"GGHHGFFFGGFFFGGGG",
"GGGGGGFFGGHHHGGGG",
"GGFFGGGGGGHHHFFGG",
"GGGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch13",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch13",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch13",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch13",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch13",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch13",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "chunyu_qiong_guard",
"name": "Chunyu Qiong Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 13,
"pos": [13, 4],
"base": { "hp": 64, "atk": 19, "def": 15, "agi": 9 }
},
{
"unit_id": "wuchao_granary_guard",
"name": "Granary Guard",
"class_id": "infantry",
"team": "enemy",
"level": 12,
"pos": [12, 4],
"base": { "hp": 52, "atk": 17, "def": 12 }
},
{
"unit_id": "wuchao_north_archer",
"name": "Wuchao Archer",
"class_id": "marksman",
"team": "enemy",
"level": 12,
"pos": [12, 2],
"base": { "hp": 40, "atk": 16, "def": 7, "agi": 14 }
},
{
"unit_id": "wuchao_south_archer",
"name": "Wuchao Archer",
"class_id": "marksman",
"team": "enemy",
"level": 12,
"pos": [12, 6],
"base": { "hp": 40, "atk": 16, "def": 7, "agi": 14 }
},
{
"unit_id": "wuchao_camp_advisor",
"name": "Camp Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 12,
"pos": [14, 5],
"skills": ["blaze", "mend"],
"base": { "hp": 44, "mp": 28, "atk": 7, "def": 7, "int": 16, "agi": 10 }
},
{
"unit_id": "wuchao_patrol_north",
"name": "Wuchao Patrol",
"class_id": "cavalry",
"team": "enemy",
"level": 12,
"pos": [9, 3],
"base": { "hp": 46, "atk": 17, "def": 9, "agi": 12 }
},
{
"unit_id": "wuchao_patrol_south",
"name": "Wuchao Patrol",
"class_id": "cavalry",
"team": "enemy",
"level": 12,
"pos": [9, 5],
"base": { "hp": 46, "atk": 17, "def": 9, "agi": 12 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Cao Cao's raiding force approaches Wuchao under cover of darkness." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "If Wuchao burns, Yuan Shao's numbers become mouths instead of soldiers." },
{ "speaker": "Guo Jia", "text": "Strike the granary first. The defenders will fight harder once they see the flame." },
{ "speaker": "Xiahou Dun", "text": "Then we give them fire before they give us formation." }
]
}
]
},
{
"id": "prepared_path",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "prepared_wuchao_raid": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "The scout marks are where they should be. The northern patrol is slower to answer." },
{ "speaker": "Cao Cao", "text": "Then we spend that advantage before dawn spends it for us." }
]
}
]
},
{
"id": "guandu_line_secure",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "strengthened_guandu_defense": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Ren", "text": "The Guandu camps remain firm behind us. We can commit fully to the raid." },
{ "speaker": "Cao Cao", "text": "A strong wall is useful because it lets the blade leave the gate." }
]
}
]
},
{
"id": "turn_3_alarm",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Chunyu Qiong", "text": "Cao Cao is near the stores! Wake the rear camp before the grain catches." },
{ "speaker": "Dian Wei", "text": "Too late to wake quietly." }
]
}
]
},
{
"id": "wuchao_depot_burned",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [14, 4] },
"actions": [
{
"type": "set_objective",
"victory": "Wuchao is burning. Defeat every defender before Yuan Shao can recover the stores.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 12."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Light the granaries. Let Yuan Shao see dawn from an empty bowl." },
{ "speaker": "Guo Jia", "text": "Now the raid becomes an escape through panic. Keep formation." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "wuchao_rear_guard",
"name": "Wuchao Rear Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 12,
"pos": [15, 4],
"base": { "hp": 54, "atk": 17, "def": 13 }
},
{
"unit_id": "wuchao_rear_rider",
"name": "Wuchao Rear Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 12,
"pos": [15, 5],
"base": { "hp": 46, "atk": 17, "def": 9, "agi": 12 }
}
]
}
]
},
{
"id": "turn_6_granary_collapse",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 6 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "Smoke is rising above the camp. Yuan Shao's army will feel this before his messengers explain it." },
{ "speaker": "Cao Cao", "text": "Then leave no guard behind to put the fire out." }
]
}
]
}
],
"rewards": {
"gold": 2100,
"items": ["bean", "wine", "war_drum"]
},
"post_battle_dialogue": [
{ "speaker": "Xiahou Dun", "text": "Wuchao burns. Yuan Shao's army will wake hungry." },
{ "speaker": "Guo Jia", "text": "Hunger breaks pride more cleanly than argument." },
{ "speaker": "Cao Cao", "text": "Now Guandu turns from endurance to pursuit." }
],
"post_battle_choices": [
{
"id": "press_yuan_rout",
"label": "Press the Rout",
"description": "Cao Cao prepares to chase Yuan Shao's shaken army before it reforms.",
"set_flags": { "pressed_yuan_rout": true, "secured_wuchao_stores": false },
"gold": 100,
"items": ["war_drum"]
},
{
"id": "secure_wuchao_stores",
"label": "Secure Stores",
"description": "The army gathers usable supplies from Wuchao before pursuing.",
"set_flags": { "pressed_yuan_rout": false, "secured_wuchao_stores": true },
"gold": 300,
"items": ["bean", "wine"]
}
]
}

View File

@@ -0,0 +1,373 @@
{
"id": "014_cangting_pursuit",
"name": "Cangting Pursuit",
"objectives": {
"victory": "Defeat Yuan Shao's rear guard after the retreat line rallies.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 13."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_yuan_rally" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 13, "team": "player" }
]
},
"briefing": {
"title": "Cangting Pursuit",
"location": "Cangting, 201 CE",
"lines": [
"With Wuchao destroyed, Yuan Shao's great army breaks into columns of wounded pride and hungry soldiers.",
"Cao Cao pursues the retreating rear guard before it can gather enough order to shield the northern crossings."
],
"conditional_lines": [
{
"campaign_flags": { "pressed_yuan_rout": true },
"lines": [
"The army gave Yuan Shao no room to breathe after Wuchao, and the rear guard is already fraying."
]
},
{
"campaign_flags": { "secured_wuchao_stores": true },
"lines": [
"Captured stores from Wuchao keep the pursuit fed, letting Cao Cao press north without stretching the supply train."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "pressed_yuan_rout": true },
"items": ["war_drum"]
},
{
"campaign_flags": { "secured_wuchao_stores": true },
"items": ["imperial_seal"]
}
]
},
"roster": {
"max_units": 6,
"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]]
},
"map": {
"width": 17,
"height": 11,
"terrain": [
"GGGGGHHGGGGGGGGGG",
"GGFFGHHGGGFFGGGGG",
"GGRRRRRRRRRRRGFFG",
"GGGGGRGGGGRRGGGGG",
"RRRRRRRRRRRRRRRRG",
"GGGGGRGGGGRRGGGGG",
"GGHHGFFFGGFFFGGGG",
"GGHHGFFFGGFFFGGGG",
"GGGGGGFFGGHHHGGGG",
"GGFFGGGGGGHHHFFGG",
"GGGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch14",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch14",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "xiahou_dun_ch14",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch14",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch14",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "cao_ren_ch14",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "yuan_shao_rearguard",
"name": "Yuan Shao Rear Guard",
"class_id": "commander",
"team": "enemy",
"level": 13,
"pos": [14, 4],
"base": { "hp": 72, "mp": 16, "atk": 20, "def": 14, "int": 13, "agi": 10 }
},
{
"unit_id": "zhang_he_rearguard",
"name": "Zhang He Rearguard",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 13,
"pos": [11, 4],
"base": { "hp": 62, "atk": 21, "def": 12, "agi": 16 }
},
{
"unit_id": "yuan_rally_advisor",
"name": "Yuan Rally Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 13,
"pos": [13, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 46, "mp": 30, "atk": 7, "def": 8, "int": 17, "agi": 10 }
},
{
"unit_id": "cangting_center_guard",
"name": "Cangting Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 12,
"pos": [10, 4],
"base": { "hp": 56, "atk": 18, "def": 14 }
},
{
"unit_id": "cangting_north_guard",
"name": "Cangting Guard",
"class_id": "infantry",
"team": "enemy",
"level": 12,
"pos": [11, 3],
"base": { "hp": 50, "atk": 17, "def": 11 }
},
{
"unit_id": "cangting_south_guard",
"name": "Cangting Guard",
"class_id": "infantry",
"team": "enemy",
"level": 12,
"pos": [11, 5],
"base": { "hp": 50, "atk": 17, "def": 11 }
},
{
"unit_id": "cangting_archer_north",
"name": "Cangting Archer",
"class_id": "marksman",
"team": "enemy",
"level": 12,
"pos": [12, 2],
"base": { "hp": 40, "atk": 16, "def": 7, "agi": 14 }
},
{
"unit_id": "cangting_archer_south",
"name": "Cangting Archer",
"class_id": "marksman",
"team": "enemy",
"level": 12,
"pos": [13, 6],
"base": { "hp": 40, "atk": 16, "def": 7, "agi": 14 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Yuan Shao's retreating army tries to rally near Cangting." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Wuchao broke their hunger. Cangting must break their confidence." },
{ "speaker": "Guo Jia", "text": "Zhang He holds the rear with more discipline than the rest. If he wavers, the rout becomes a road." },
{ "speaker": "Xiahou Yuan", "text": "Then we strike the disciplined men first." }
]
}
]
},
{
"id": "fast_pursuit_pressure",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "pressed_yuan_rout": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Dun", "text": "Our pursuit caught them before their wagons even formed a wall." },
{ "speaker": "Cao Cao", "text": "Momentum is a weapon. Keep it sharp." }
]
}
]
},
{
"id": "stored_supply_arrives",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "secured_wuchao_stores": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "The Wuchao stores are feeding our own pursuit now. Yuan Shao pays for both armies." },
{ "speaker": "Cao Cao", "text": "A pleasant economy." }
]
}
]
},
{
"id": "turn_3_yuan_rally",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{
"type": "set_objective",
"victory": "Defeat Yuan Shao's rallied rear guard and every covering unit.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 13."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang He", "text": "Hold the road. If the rear collapses, the whole army becomes fugitives." },
{ "speaker": "Guo Jia", "text": "He sees the truth. That makes him dangerous, and useful." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "yuan_rout_rider_north",
"name": "Rout Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 12,
"pos": [15, 3],
"base": { "hp": 46, "atk": 17, "def": 9, "agi": 12 }
},
{
"unit_id": "yuan_rout_rider_south",
"name": "Rout Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 12,
"pos": [15, 5],
"base": { "hp": 46, "atk": 17, "def": 9, "agi": 12 }
}
]
}
]
},
{
"id": "center_pursuit_trap",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [9, 4] },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Guard", "text": "Cao Cao is in the center road. Close the retreat line behind him!" },
{ "speaker": "Dian Wei", "text": "Try closing it from the ground." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "cangting_road_guard",
"name": "Road Guard",
"class_id": "infantry",
"team": "enemy",
"level": 12,
"pos": [8, 3],
"base": { "hp": 48, "atk": 17, "def": 11 }
},
{
"unit_id": "cangting_road_archer",
"name": "Road Archer",
"class_id": "archer",
"team": "enemy",
"level": 12,
"pos": [8, 5],
"base": { "hp": 36, "atk": 15, "def": 6, "agi": 12 }
}
]
}
]
},
{
"id": "turn_6_zhang_he_wavers",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 6 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "Zhang He is guarding a lord who no longer listens to his guards." },
{ "speaker": "Cao Cao", "text": "Then let him see which camp rewards judgment." }
]
}
]
}
],
"rewards": {
"gold": 2300,
"items": ["bean", "wine", "iron_armor"],
"join_officers": ["zhang_he"]
},
"post_battle_dialogue": [
{ "speaker": "Zhang He", "text": "Yuan Shao would rather lose an army than hear the men who tried to save it." },
{ "speaker": "Cao Cao", "text": "Then serve where clear eyes are useful." },
{ "speaker": "Guo Jia", "text": "Cangting breaks the pursuit open. The Yuan heirs will now fight over what remains." }
],
"post_battle_choices": [
{
"id": "advance_to_ye",
"label": "Advance to Ye",
"description": "Cao Cao prepares to press toward the Yuan heartland before the heirs can settle.",
"set_flags": { "advanced_to_ye": true, "secured_hebei_crossings": false },
"gold": 100,
"items": ["war_drum"]
},
{
"id": "secure_hebei_crossings",
"label": "Secure Crossings",
"description": "The army consolidates river crossings and supply lanes before moving deeper north.",
"set_flags": { "advanced_to_ye": false, "secured_hebei_crossings": true },
"gold": 300,
"items": ["imperial_seal"]
}
]
}

View File

@@ -0,0 +1,379 @@
{
"id": "015_ye_campaign",
"name": "Ye Campaign",
"objectives": {
"victory": "Defeat the Yuan heirs' outer defense after their split command reveals itself.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 14."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "turn_3_yuan_heir_split" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 14, "team": "player" }
]
},
"briefing": {
"title": "Ye Campaign",
"location": "Ye Outskirts, 202 CE",
"lines": [
"Yuan Shao's heirs inherit banners, grudges, and a northern capital that cannot obey two masters.",
"Cao Cao advances toward Ye, while Zhang He explains where the Yuan defense is strong and where pride has hollowed it out."
],
"conditional_lines": [
{
"campaign_flags": { "advanced_to_ye": true },
"lines": [
"The rapid march from Cangting catches Yuan Tan's scouts arguing over orders instead of watching the road."
]
},
{
"campaign_flags": { "secured_hebei_crossings": true },
"lines": [
"Secured crossings behind the army keep Cao Cao's supply line steady as the campaign enters Yuan territory."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "advanced_to_ye": true },
"items": ["war_drum"]
},
{
"campaign_flags": { "secured_hebei_crossings": true },
"items": ["imperial_seal"]
}
]
},
"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": [
"GGGGGHHGGGGGGGGGGG",
"GGFFGHHGGGFFGGGFFG",
"GGRRRRRRRRRRRRGFFG",
"GGGGGRGGGGRRGGGGGG",
"RRRRRRRRRRRRRRRRRR",
"GGGGGRGGGGRRGGGGGG",
"GGHHGFFFGGFFFGGHHG",
"GGHHGFFFGGFFFGGHHG",
"GGGGGGFFGGHHHGGGGG",
"GGFFGGGGGGHHHFFGGG",
"GGGGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch15",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch15",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch15",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch15",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch15",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch15",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch15",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "yuan_tan_outer_guard",
"name": "Yuan Tan Guard",
"class_id": "commander",
"team": "enemy",
"level": 14,
"pos": [14, 4],
"base": { "hp": 72, "mp": 16, "atk": 20, "def": 14, "int": 12, "agi": 11 }
},
{
"unit_id": "yuan_shang_inner_guard",
"name": "Yuan Shang Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 14,
"pos": [13, 5],
"base": { "hp": 64, "atk": 19, "def": 15, "agi": 10 }
},
{
"unit_id": "ye_council_advisor",
"name": "Ye Council Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 14,
"pos": [15, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 48, "mp": 34, "atk": 7, "def": 8, "int": 18, "agi": 10 }
},
{
"unit_id": "ye_center_guard",
"name": "Ye Center Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 13,
"pos": [11, 4],
"base": { "hp": 58, "atk": 18, "def": 14 }
},
{
"unit_id": "ye_north_guard",
"name": "Ye Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 13,
"pos": [12, 3],
"base": { "hp": 52, "atk": 17, "def": 12 }
},
{
"unit_id": "ye_south_guard",
"name": "Ye Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 13,
"pos": [12, 5],
"base": { "hp": 52, "atk": 17, "def": 12 }
},
{
"unit_id": "ye_archer_north",
"name": "Ye Archer",
"class_id": "marksman",
"team": "enemy",
"level": 13,
"pos": [13, 2],
"base": { "hp": 42, "atk": 17, "def": 7, "agi": 14 }
},
{
"unit_id": "ye_archer_south",
"name": "Ye Archer",
"class_id": "marksman",
"team": "enemy",
"level": 13,
"pos": [14, 6],
"base": { "hp": 42, "atk": 17, "def": 7, "agi": 14 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "The Yuan heirs argue behind Ye's outer defense." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang He", "text": "Ye's outer road looks strong, but Yuan Tan and Yuan Shang will not agree who commands it." },
{ "speaker": "Cao Cao", "text": "Then their wall already has two gates." },
{ "speaker": "Guo Jia", "text": "Let them quarrel loudly enough for our blades to hear." }
]
}
]
},
{
"id": "rapid_march_confusion",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "advanced_to_ye": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Tan Guard", "text": "Cao Cao is already here? Yuan Shang promised another day!" },
{ "speaker": "Zhang He", "text": "They are blaming one another before the first order is given." }
]
}
]
},
{
"id": "crossings_secure_supply",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "secured_hebei_crossings": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Yuan", "text": "The crossings behind us are secure. We can keep pressure on Ye without starving the rear." },
{ "speaker": "Cao Cao", "text": "A campaign is won by the road as much as the sword." }
]
}
]
},
{
"id": "turn_3_yuan_heir_split",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{
"type": "set_objective",
"victory": "Exploit the Yuan heirs' split command and defeat every outer defender.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 14."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Shang Guard", "text": "Hold for Yuan Shang! Do not yield command to Yuan Tan's men." },
{ "speaker": "Guo Jia", "text": "There it is. Two drums, one army, no rhythm." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "yuan_tan_rider",
"name": "Yuan Tan Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 13,
"pos": [16, 3],
"base": { "hp": 48, "atk": 17, "def": 9, "agi": 12 }
},
{
"unit_id": "yuan_shang_rider",
"name": "Yuan Shang Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 13,
"pos": [16, 5],
"base": { "hp": 48, "atk": 17, "def": 9, "agi": 12 }
}
]
}
]
},
{
"id": "outer_wall_trap",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Ye Guard", "text": "Cao Cao has pushed to the outer wall. Seal the road!" },
{ "speaker": "Zhang He", "text": "They seal late and from bad ground. Press through the center." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "ye_road_blocker",
"name": "Ye Road Blocker",
"class_id": "infantry",
"team": "enemy",
"level": 13,
"pos": [9, 3],
"base": { "hp": 50, "atk": 17, "def": 11 }
},
{
"unit_id": "ye_road_archer",
"name": "Ye Road Archer",
"class_id": "archer",
"team": "enemy",
"level": 13,
"pos": [9, 5],
"base": { "hp": 38, "atk": 16, "def": 6, "agi": 12 }
}
]
}
]
},
{
"id": "turn_7_ye_outer_breaks",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 7 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Their outer command breaks before the wall does." },
{ "speaker": "Guo Jia", "text": "A city divided is already partly open." }
]
}
]
}
],
"rewards": {
"gold": 2500,
"items": ["bean", "wine", "war_axe"]
},
"post_battle_dialogue": [
{ "speaker": "Zhang He", "text": "Ye's outer defense is broken. The heirs will blame each other before they blame us." },
{ "speaker": "Guo Jia", "text": "Good. Their family quarrel is now a campaign map." },
{ "speaker": "Cao Cao", "text": "Then we decide whether to strike the city or widen the fracture." }
],
"post_battle_choices": [
{
"id": "press_ye_siege",
"label": "Press Ye Siege",
"description": "Cao Cao prepares a direct siege before the Yuan heirs can reorganize.",
"set_flags": { "pressed_ye_siege": true, "split_yuan_heirs": false },
"gold": 100,
"items": ["war_drum"]
},
{
"id": "split_yuan_heirs",
"label": "Split Heirs",
"description": "The army spreads rumors and pressure to deepen Yuan Tan and Yuan Shang's rivalry.",
"set_flags": { "pressed_ye_siege": false, "split_yuan_heirs": true },
"gold": 250,
"items": ["imperial_seal"]
}
]
}

View File

@@ -0,0 +1,347 @@
{
"id": "016_ye_siege",
"name": "Ye Siege",
"objectives": {
"victory": "Reach Ye's inner gate with Cao Cao, then defeat the palace defenders.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 15."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "inner_gate_breached" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 15, "team": "player" }
]
},
"briefing": {
"title": "Ye Siege",
"location": "Ye, 202 CE",
"lines": [
"Ye's outer line has broken, but the Yuan heirs still command the inner city through suspicion and fear.",
"Cao Cao orders a direct push toward the inner gate while Zhang He marks the streets where the defenders will try to seal the advance."
],
"conditional_lines": [
{
"campaign_flags": { "pressed_ye_siege": true },
"lines": [
"The rapid siege leaves Yuan Shang's inner guard scrambling to reinforce streets that were still being repaired."
]
},
{
"campaign_flags": { "split_yuan_heirs": true },
"lines": [
"Rumors spread through Ye that Yuan Tan has been abandoned, and some defenders hesitate before answering Yuan Shang's orders."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "pressed_ye_siege": true },
"items": ["war_drum"]
},
{
"campaign_flags": { "split_yuan_heirs": true },
"items": ["imperial_seal"]
}
]
},
"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": [
"GGGGGHHGGGGGGGGGGG",
"GGFFGHHGGGFFGGGFFG",
"GGRRRRRRRRRRRRGFFG",
"GGGGGRGGGGRRGGGGGG",
"RRRRRRRRRRRRRRRRRR",
"GGGGGRGGGGRRGGGGGG",
"GGHHGFFFGGFFFGGHHG",
"GGHHGFFFGGFFFGGHHG",
"GGGGGGFFGGHHHGGGGG",
"GGFFGGGGGGHHHFFGGG",
"GGGGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch16",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch16",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch16",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch16",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch16",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch16",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch16",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "yuan_shang_inner_guard",
"name": "Yuan Shang Inner Guard",
"class_id": "commander",
"team": "enemy",
"level": 15,
"pos": [14, 4],
"base": { "hp": 76, "mp": 18, "atk": 21, "def": 15, "int": 13, "agi": 11 }
},
{
"unit_id": "ye_gate_captain",
"name": "Ye Gate Captain",
"class_id": "guard_captain",
"team": "enemy",
"level": 14,
"pos": [11, 4],
"base": { "hp": 62, "atk": 19, "def": 15 }
},
{
"unit_id": "ye_inner_advisor",
"name": "Inner City Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 14,
"pos": [15, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 50, "mp": 34, "atk": 7, "def": 8, "int": 18, "agi": 10 }
},
{
"unit_id": "ye_north_wall_guard",
"name": "Ye Wall Guard",
"class_id": "infantry",
"team": "enemy",
"level": 14,
"pos": [12, 3],
"base": { "hp": 54, "atk": 18, "def": 12 }
},
{
"unit_id": "ye_south_wall_guard",
"name": "Ye Wall Guard",
"class_id": "infantry",
"team": "enemy",
"level": 14,
"pos": [12, 5],
"base": { "hp": 54, "atk": 18, "def": 12 }
},
{
"unit_id": "ye_wall_archer_north",
"name": "Ye Wall Archer",
"class_id": "marksman",
"team": "enemy",
"level": 14,
"pos": [13, 2],
"base": { "hp": 44, "atk": 18, "def": 8, "agi": 14 }
},
{
"unit_id": "ye_wall_archer_south",
"name": "Ye Wall Archer",
"class_id": "marksman",
"team": "enemy",
"level": 14,
"pos": [14, 6],
"base": { "hp": 44, "atk": 18, "def": 8, "agi": 14 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Cao Cao's army enters the streets outside Ye's inner gate." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang He", "text": "The inner gate is not Ye's strongest point. It is simply where the heirs trust each other least." },
{ "speaker": "Cao Cao", "text": "Then we press where mistrust must give orders." },
{ "speaker": "Guo Jia", "text": "A siege ladder is useful. A frightened messenger is faster." }
]
}
]
},
{
"id": "direct_siege_pressure",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "pressed_ye_siege": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Dun", "text": "The rapid assault has them reinforcing with half-formed companies." },
{ "speaker": "Cao Cao", "text": "Then do not give the other half time to arrive." }
]
}
]
},
{
"id": "heirs_split_inside",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "split_yuan_heirs": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Ye Guard", "text": "Yuan Tan's men are refusing the inner gate order. They say Yuan Shang means to abandon them." },
{ "speaker": "Guo Jia", "text": "Good. Every rumor is now doing the work of a ram." }
]
}
]
},
{
"id": "turn_3_inner_gate_pressure",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Yuan Shang Inner Guard", "text": "Hold the gate. If Cao Cao takes the inner road, Ye will hear his drums before ours." },
{ "speaker": "Zhang He", "text": "He is defending the sound of command, not the city." }
]
}
]
},
{
"id": "inner_gate_breached",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "set_objective",
"victory": "The inner gate is breached. Defeat Yuan Shang's palace defenders.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 15."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "The gate is open. Drive through before the city remembers how to obey." },
{ "speaker": "Guo Jia", "text": "The palace guard is moving. This is the last hard knot." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "ye_palace_guard",
"name": "Ye Palace Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 14,
"pos": [16, 4],
"base": { "hp": 58, "atk": 18, "def": 14 }
},
{
"unit_id": "ye_palace_rider",
"name": "Ye Palace Rider",
"class_id": "cavalry",
"team": "enemy",
"level": 14,
"pos": [16, 5],
"base": { "hp": 50, "atk": 18, "def": 10, "agi": 12 }
}
]
}
]
},
{
"id": "turn_7_city_wavers",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 7 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang He", "text": "Ye's defenders are waiting to see which heir survives the day." },
{ "speaker": "Cao Cao", "text": "Then give them an easier answer." }
]
}
]
}
],
"rewards": {
"gold": 2800,
"items": ["bean", "wine", "imperial_seal"]
},
"post_battle_dialogue": [
{ "speaker": "Zhang He", "text": "The inner gate is broken. Ye cannot pretend the Yuan house is whole." },
{ "speaker": "Guo Jia", "text": "One city remains, but the family that held it has become several smaller enemies." },
{ "speaker": "Cao Cao", "text": "Then we choose whether to take the city by force or make the heirs surrender it piece by piece." }
],
"post_battle_choices": [
{
"id": "force_ye_surrender",
"label": "Force Surrender",
"description": "Cao Cao prepares a final direct pressure on Ye's remaining defenders.",
"set_flags": { "forced_ye_surrender": true, "negotiated_yuan_defections": false },
"gold": 150,
"items": ["war_drum"]
},
{
"id": "negotiate_yuan_defections",
"label": "Negotiate Defections",
"description": "The army courts frightened Yuan officers and turns the city's divisions inward.",
"set_flags": { "forced_ye_surrender": false, "negotiated_yuan_defections": true },
"gold": 300,
"items": ["iron_armor"]
}
]
}

View File

@@ -0,0 +1,347 @@
{
"id": "017_ye_surrender",
"name": "Ye Surrender",
"objectives": {
"victory": "Break the last Yuan holdouts after the surrender signal reaches the palace road.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 14."
},
"conditions": {
"victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "surrender_signal_sent" },
"defeat": [
{ "type": "any_officer_defeated", "team": "player", "officer_ids": ["cao_cao"] },
{ "type": "turn_reached", "turn": 14, "team": "player" }
]
},
"briefing": {
"title": "Ye Surrender",
"location": "Ye Palace Road, 202 CE",
"lines": [
"Ye's inner gate has fallen. Only palace loyalists and frightened Yuan officers remain between Cao Cao and the city's surrender.",
"Zhang He warns that the last defenders will either break quickly or fight wildly to prove loyalty to absent heirs."
],
"conditional_lines": [
{
"campaign_flags": { "forced_ye_surrender": true },
"lines": [
"Direct pressure on Ye leaves the palace guard short of time, but their cornered officers are ready for a final stand."
]
},
{
"campaign_flags": { "negotiated_yuan_defections": true },
"lines": [
"Negotiations have drawn several Yuan captains away from the palace, leaving the loyalists angry and isolated."
]
}
]
},
"shop": {
"items": [
"bean",
"wine",
"iron_sword",
"training_spear",
"short_bow",
"hand_axe",
"war_axe",
"leather_armor",
"iron_armor"
],
"conditional_items": [
{
"campaign_flags": { "forced_ye_surrender": true },
"items": ["war_drum"]
},
{
"campaign_flags": { "negotiated_yuan_defections": true },
"items": ["imperial_seal"]
}
]
},
"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": [
"GGGGGHHGGGGGGGGGGG",
"GGFFGHHGGGFFGGGFFG",
"GGRRRRRRRRRRRRGFFG",
"GGGGGRGGGGRRGGGGGG",
"RRRRRRRRRRRRRRRRRR",
"GGGGGRGGGGRRGGGGGG",
"GGHHGFFFGGFFFGGHHG",
"GGHHGFFFGGFFFGGHHG",
"GGGGGGFFGGHHHGGGGG",
"GGFFGGGGGGHHHFFGGG",
"GGGGGGGGGGGGGGGGGG"
]
},
"deployments": [
{
"unit_id": "cao_cao_ch17",
"officer_id": "cao_cao",
"team": "player",
"pos": [1, 4]
},
{
"unit_id": "guo_jia_ch17",
"officer_id": "guo_jia",
"team": "player",
"requires_joined": true,
"pos": [2, 4]
},
{
"unit_id": "zhang_he_ch17",
"officer_id": "zhang_he",
"team": "player",
"requires_joined": true,
"pos": [2, 3]
},
{
"unit_id": "xiahou_dun_ch17",
"officer_id": "xiahou_dun",
"team": "player",
"pos": [1, 5]
},
{
"unit_id": "dian_wei_ch17",
"officer_id": "dian_wei",
"team": "player",
"requires_joined": true,
"pos": [2, 5]
},
{
"unit_id": "xiahou_yuan_ch17",
"officer_id": "xiahou_yuan",
"team": "player",
"requires_joined": true,
"pos": [3, 3]
},
{
"unit_id": "cao_ren_ch17",
"officer_id": "cao_ren",
"team": "player",
"requires_joined": true,
"pos": [3, 4]
},
{
"unit_id": "ye_last_loyalist",
"name": "Ye Last Loyalist",
"class_id": "commander",
"team": "enemy",
"level": 16,
"pos": [14, 4],
"base": { "hp": 78, "mp": 18, "atk": 22, "def": 16, "int": 12, "agi": 11 }
},
{
"unit_id": "yuan_palace_guard",
"name": "Yuan Palace Guard",
"class_id": "guard_captain",
"team": "enemy",
"level": 15,
"pos": [12, 4],
"base": { "hp": 62, "atk": 19, "def": 15 }
},
{
"unit_id": "yuan_palace_advisor",
"name": "Palace Advisor",
"class_id": "military_advisor",
"team": "enemy",
"level": 15,
"pos": [15, 5],
"skills": ["blaze", "great_mend"],
"base": { "hp": 50, "mp": 34, "atk": 7, "def": 8, "int": 18, "agi": 10 }
},
{
"unit_id": "ye_palace_spear_north",
"name": "Palace Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 15,
"pos": [12, 3],
"base": { "hp": 54, "atk": 18, "def": 12 }
},
{
"unit_id": "ye_palace_spear_south",
"name": "Palace Spear Guard",
"class_id": "infantry",
"team": "enemy",
"level": 15,
"pos": [12, 5],
"base": { "hp": 54, "atk": 18, "def": 12 }
},
{
"unit_id": "ye_palace_archer_north",
"name": "Palace Archer",
"class_id": "marksman",
"team": "enemy",
"level": 15,
"pos": [13, 2],
"base": { "hp": 44, "atk": 18, "def": 8, "agi": 14 }
},
{
"unit_id": "ye_palace_archer_south",
"name": "Palace Archer",
"class_id": "marksman",
"team": "enemy",
"level": 15,
"pos": [14, 6],
"base": { "hp": 44, "atk": 18, "def": 8, "agi": 14 }
}
],
"events": [
{
"id": "opening",
"once": true,
"when": { "type": "battle_start" },
"actions": [
{ "type": "log", "text": "Ye's last loyalists gather near the palace road." }
]
},
{
"id": "opening_dialogue",
"once": true,
"when": { "type": "battle_begin" },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Zhang He", "text": "The loyalists have no plan left, only the need to be seen dying for one." },
{ "speaker": "Cao Cao", "text": "Then let the city see survival rewarded as clearly as resistance is ended." },
{ "speaker": "Guo Jia", "text": "A surrender must look inevitable before it is signed." }
]
}
]
},
{
"id": "forced_pressure",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 2, "campaign_flags": { "forced_ye_surrender": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Xiahou Dun", "text": "The direct pressure has them packed against the palace road." },
{ "speaker": "Cao Cao", "text": "Good. A cornered guard can no longer pretend to command a city." }
]
}
]
},
{
"id": "defection_pressure",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 2, "campaign_flags": { "negotiated_yuan_defections": true } },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Palace Advisor", "text": "Two more captains have opened their gates to Cao Cao. The loyalists are fighting alone." },
{ "speaker": "Guo Jia", "text": "A city can surrender one door at a time." }
]
}
]
},
{
"id": "turn_3_last_stand",
"once": true,
"when": { "type": "turn_start", "team": "enemy", "turn": 3 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Ye Last Loyalist", "text": "If the Yuan name must leave Ye, let Cao Cao pay for every stone." },
{ "speaker": "Zhang He", "text": "That is no longer strategy. It is grief with a spear." }
]
}
]
},
{
"id": "surrender_signal_sent",
"once": true,
"when": { "type": "unit_reaches_tile", "team": "player", "officer_ids": ["cao_cao"], "pos": [10, 4] },
"actions": [
{
"type": "set_objective",
"victory": "The surrender signal is sent. Defeat the loyalists who refuse it.",
"defeat": "Cao Cao is defeated or the battle reaches Turn 14."
},
{
"type": "dialogue",
"lines": [
{ "speaker": "Cao Cao", "text": "Raise the surrender banner. Those who lay down arms will live under law." },
{ "speaker": "Ye Last Loyalist", "text": "Then we die outside that law." }
]
},
{
"type": "spawn_deployments",
"deployments": [
{
"unit_id": "ye_last_rider",
"name": "Last Rider",
"class_id": "elite_cavalry",
"team": "enemy",
"level": 15,
"pos": [16, 4],
"base": { "hp": 56, "atk": 19, "def": 11, "agi": 14 }
},
{
"unit_id": "ye_last_archer",
"name": "Last Archer",
"class_id": "archer",
"team": "enemy",
"level": 15,
"pos": [16, 5],
"base": { "hp": 38, "atk": 16, "def": 6, "agi": 12 }
}
]
}
]
},
{
"id": "turn_7_city_surrenders",
"once": true,
"when": { "type": "turn_start", "team": "player", "turn": 7 },
"actions": [
{
"type": "dialogue",
"lines": [
{ "speaker": "Guo Jia", "text": "The palace road is quieting. Ye is deciding that tomorrow matters more than yesterday." },
{ "speaker": "Cao Cao", "text": "Then end the last yesterday standing in our way." }
]
}
]
}
],
"rewards": {
"gold": 3000,
"items": ["bean", "wine", "iron_armor"]
},
"post_battle_dialogue": [
{ "speaker": "Zhang He", "text": "Ye has surrendered. The Yuan house still runs north, but its capital is no longer theirs." },
{ "speaker": "Guo Jia", "text": "A capital lost is a family argument made permanent." },
{ "speaker": "Cao Cao", "text": "Then Hebei must learn whether it belongs to heirs, rebels, or order." }
],
"post_battle_choices": [
{
"id": "pursue_yuan_shang",
"label": "Pursue Yuan Shang",
"description": "Cao Cao turns immediately toward the fleeing Yuan heir.",
"set_flags": { "pursued_yuan_shang": true, "stabilized_ye": false },
"gold": 100,
"items": ["war_drum"]
},
{
"id": "stabilize_ye",
"label": "Stabilize Ye",
"description": "The army secures Ye's administration before marching farther north.",
"set_flags": { "pursued_yuan_shang": false, "stabilized_ye": true },
"gold": 350,
"items": ["imperial_seal"]
}
]
}