Initial Godot tactical RPG prototype
This commit is contained in:
93
data/campaign/campaign.json
Normal file
93
data/campaign/campaign.json
Normal 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
203
data/defs/classes.json
Normal 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
110
data/defs/items.json
Normal 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
72
data/defs/officers.json
Normal 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
47
data/defs/skills.json
Normal 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
43
data/defs/terrain.json
Normal 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 }
|
||||
}
|
||||
}
|
||||
|
||||
124
data/scenarios/001_yellow_turbans.json
Normal file
124
data/scenarios/001_yellow_turbans.json
Normal 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." }
|
||||
]
|
||||
}
|
||||
201
data/scenarios/002_sishui_gate.json
Normal file
201
data/scenarios/002_sishui_gate.json
Normal 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." }
|
||||
]
|
||||
}
|
||||
330
data/scenarios/003_xingyang_ambush.json
Normal file
330
data/scenarios/003_xingyang_ambush.json
Normal 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." }
|
||||
]
|
||||
}
|
||||
247
data/scenarios/004_qingzhou_campaign.json
Normal file
247
data/scenarios/004_qingzhou_campaign.json
Normal 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." }
|
||||
]
|
||||
}
|
||||
267
data/scenarios/005_puyang_raid.json
Normal file
267
data/scenarios/005_puyang_raid.json
Normal 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 }
|
||||
}
|
||||
]
|
||||
}
|
||||
305
data/scenarios/006_dingtao_counterattack.json
Normal file
305
data/scenarios/006_dingtao_counterattack.json
Normal 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." }
|
||||
]
|
||||
}
|
||||
319
data/scenarios/007_xian_emperor_escort.json
Normal file
319
data/scenarios/007_xian_emperor_escort.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
401
data/scenarios/008_wan_castle_escape.json
Normal file
401
data/scenarios/008_wan_castle_escape.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
369
data/scenarios/009_xiapi_siege.json
Normal file
369
data/scenarios/009_xiapi_siege.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
364
data/scenarios/010_white_horse_relief.json
Normal file
364
data/scenarios/010_white_horse_relief.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
356
data/scenarios/011_yan_ford_pursuit.json
Normal file
356
data/scenarios/011_yan_ford_pursuit.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
395
data/scenarios/012_guandu_showdown.json
Normal file
395
data/scenarios/012_guandu_showdown.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
340
data/scenarios/013_wuchao_raid.json
Normal file
340
data/scenarios/013_wuchao_raid.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
373
data/scenarios/014_cangting_pursuit.json
Normal file
373
data/scenarios/014_cangting_pursuit.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
379
data/scenarios/015_ye_campaign.json
Normal file
379
data/scenarios/015_ye_campaign.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
347
data/scenarios/016_ye_siege.json
Normal file
347
data/scenarios/016_ye_siege.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
347
data/scenarios/017_ye_surrender.json
Normal file
347
data/scenarios/017_ye_surrender.json
Normal 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user