feat: add Imperial faction Chapter 5 campaign, cards, and missions

- Adds `campaign_imperial` (Level 5) with 8 missions (mission_030 to mission_037)
- Introduces 4 new Imperial Commander cards:
  - Iron Centurion (imp_cmd_2)
  - Grand Marshal Kyra (imp_cmd_3)
  - Imperator Dravus (imp_cmd_4)
- Adds 4 new Imperial Assault cards:
  - Imperial Dreadnought (imp_dreadnought_1)
  - Centurion Guard (imp_centurion_1)
  - Orbital Striker (imp_orbital_1)
  - Praetorian Elite (imp_praetorian_1)
- Configures mission progression, opponents, rewards, and lore entries
- Sets starter rewards for the campaign including Imperial Trooper, Gunner, and Guardian cards
This commit is contained in:
Brian Fertig 2026-03-22 09:20:11 -06:00
parent b2981cd389
commit 9c3f7bd424
10 changed files with 558 additions and 2 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

View File

@ -70,9 +70,13 @@
"level": 5,
"requiredLevel": 5,
"unlockCondition": "campaign_righteous",
"missions": [],
"missions": ["mission_030", "mission_031", "mission_032", "mission_033", "mission_034", "mission_035", "mission_036", "mission_037"],
"starterReward": {
"cards": []
"cards": [
"imp_trooper_1", "imp_trooper_1", "imp_trooper_1",
"imp_gunner_1", "imp_gunner_1", "imp_gunner_1",
"imp_guardian_1", "imp_guardian_1", "imp_guardian_1"
]
}
}
]

View File

@ -5895,5 +5895,437 @@
],
"flavorText": "Where the Seraph passes, wounds close and sins are burned away.",
"artKey": "right_seraph_1"
},
{
"id": "imp_cmd_2",
"name": "Iron Centurion",
"faction": "imperial",
"type": "commander",
"rarity": "legendary",
"levels": [
{
"attack": 4,
"health": 60,
"armor": 4,
"delay": 0,
"skills": [
{ "name": "fortify", "value": 2, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 6,
"health": 90,
"armor": 6,
"delay": 0,
"skills": [
{ "name": "fortify", "value": 3, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 9,
"health": 135,
"armor": 9,
"delay": 0,
"skills": [
{ "name": "fortify", "value": 5, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 14,
"health": 203,
"armor": 13,
"delay": 0,
"skills": [
{ "name": "fortify", "value": 7, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 20,
"health": 304,
"armor": 20,
"delay": 0,
"skills": [
{ "name": "fortify", "value": 10, "all": true, "trigger": "preBattle" }
]
}
],
"flavorText": "The Centurion's armor has never been breached. Neither has his line.",
"artKey": "imp_cmd_2"
},
{
"id": "imp_cmd_3",
"name": "Grand Marshal Kyra",
"faction": "imperial",
"type": "commander",
"rarity": "legendary",
"levels": [
{
"attack": 6,
"health": 50,
"armor": 1,
"delay": 0,
"skills": [
{ "name": "strike", "value": 1, "all": true, "trigger": "preAttack" }
]
},
{
"attack": 9,
"health": 75,
"armor": 2,
"delay": 0,
"skills": [
{ "name": "strike", "value": 2, "all": true, "trigger": "preAttack" }
]
},
{
"attack": 14,
"health": 113,
"armor": 3,
"delay": 0,
"skills": [
{ "name": "strike", "value": 3, "all": true, "trigger": "preAttack" }
]
},
{
"attack": 20,
"health": 169,
"armor": 4,
"delay": 0,
"skills": [
{ "name": "strike", "value": 5, "all": true, "trigger": "preAttack" }
]
},
{
"attack": 30,
"health": 253,
"armor": 5,
"delay": 0,
"skills": [
{ "name": "strike", "value": 7, "all": true, "trigger": "preAttack" }
]
}
],
"flavorText": "She does not command retreat. She commands annihilation.",
"artKey": "imp_cmd_3"
},
{
"id": "imp_cmd_4",
"name": "Imperator Dravus",
"faction": "imperial",
"type": "commander",
"rarity": "legendary",
"levels": [
{
"attack": 5,
"health": 60,
"armor": 3,
"delay": 0,
"skills": [
{ "name": "rally", "value": 1, "all": true, "trigger": "preBattle" },
{ "name": "enfeeble", "value": 1, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 8,
"health": 90,
"armor": 5,
"delay": 0,
"skills": [
{ "name": "rally", "value": 2, "all": true, "trigger": "preBattle" },
{ "name": "enfeeble", "value": 2, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 11,
"health": 135,
"armor": 7,
"delay": 0,
"skills": [
{ "name": "rally", "value": 3, "all": true, "trigger": "preBattle" },
{ "name": "enfeeble", "value": 3, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 17,
"health": 203,
"armor": 10,
"delay": 0,
"skills": [
{ "name": "rally", "value": 5, "all": true, "trigger": "preBattle" },
{ "name": "enfeeble", "value": 5, "all": true, "trigger": "preBattle" }
]
},
{
"attack": 25,
"health": 304,
"armor": 15,
"delay": 0,
"skills": [
{ "name": "rally", "value": 7, "all": true, "trigger": "preBattle" },
{ "name": "enfeeble", "value": 7, "all": true, "trigger": "preBattle" }
]
}
],
"flavorText": "He built an empire by breaking every enemy from within.",
"artKey": "imp_cmd_4"
},
{
"id": "imp_dreadnought_1",
"name": "Imperial Dreadnought",
"faction": "imperial",
"type": "assault",
"rarity": "legendary",
"levels": [
{
"attack": 7,
"health": 24,
"armor": 5,
"delay": 3,
"skills": [
{ "name": "siege", "value": 3, "trigger": "preBattle" },
{ "name": "mortar", "value": 3, "trigger": "preAttack" },
{ "name": "armored", "value": 1, "trigger": "passive" }
]
},
{
"attack": 11,
"health": 36,
"armor": 7,
"delay": 3,
"skills": [
{ "name": "siege", "value": 5, "trigger": "preBattle" },
{ "name": "mortar", "value": 5, "trigger": "preAttack" },
{ "name": "armored", "value": 2, "trigger": "passive" }
]
},
{
"attack": 16,
"health": 54,
"armor": 10,
"delay": 3,
"skills": [
{ "name": "siege", "value": 8, "trigger": "preBattle" },
{ "name": "mortar", "value": 8, "trigger": "preAttack" },
{ "name": "armored", "value": 3, "trigger": "passive" }
]
},
{
"attack": 24,
"health": 81,
"armor": 14,
"delay": 3,
"skills": [
{ "name": "siege", "value": 12, "trigger": "preBattle" },
{ "name": "mortar", "value": 12, "trigger": "preAttack" },
{ "name": "armored", "value": 5, "trigger": "passive" }
]
},
{
"attack": 36,
"health": 121,
"armor": 20,
"delay": 3,
"skills": [
{ "name": "siege", "value": 18, "trigger": "preBattle" },
{ "name": "mortar", "value": 18, "trigger": "preAttack" },
{ "name": "armored", "value": 7, "trigger": "passive" }
]
}
],
"flavorText": "It does not advance. It simply erases everything ahead of it.",
"artKey": "imp_dreadnought_1"
},
{
"id": "imp_centurion_1",
"name": "Centurion Guard",
"faction": "imperial",
"type": "assault",
"rarity": "legendary",
"levels": [
{
"attack": 6,
"health": 25,
"armor": 5,
"delay": 3,
"skills": [
{ "name": "protect", "value": 2, "trigger": "preBattle" },
{ "name": "counter", "value": 3, "trigger": "on_defend" },
{ "name": "rally", "value": 1, "trigger": "preBattle" }
]
},
{
"attack": 9,
"health": 38,
"armor": 7,
"delay": 3,
"skills": [
{ "name": "protect", "value": 3, "trigger": "preBattle" },
{ "name": "counter", "value": 5, "trigger": "on_defend" },
{ "name": "rally", "value": 2, "trigger": "preBattle" }
]
},
{
"attack": 14,
"health": 56,
"armor": 10,
"delay": 3,
"skills": [
{ "name": "protect", "value": 5, "trigger": "preBattle" },
{ "name": "counter", "value": 7, "trigger": "on_defend" },
{ "name": "rally", "value": 3, "trigger": "preBattle" }
]
},
{
"attack": 20,
"health": 84,
"armor": 14,
"delay": 3,
"skills": [
{ "name": "protect", "value": 7, "trigger": "preBattle" },
{ "name": "counter", "value": 10, "trigger": "on_defend" },
{ "name": "rally", "value": 5, "trigger": "preBattle" }
]
},
{
"attack": 30,
"health": 126,
"armor": 20,
"delay": 3,
"skills": [
{ "name": "protect", "value": 10, "trigger": "preBattle" },
{ "name": "counter", "value": 15, "trigger": "on_defend" },
{ "name": "rally", "value": 7, "trigger": "preBattle" }
]
}
],
"flavorText": "The Centurion Guard has held the line for three hundred years.",
"artKey": "imp_centurion_1"
},
{
"id": "imp_orbital_1",
"name": "Orbital Striker",
"faction": "imperial",
"type": "assault",
"rarity": "legendary",
"levels": [
{
"attack": 9,
"health": 18,
"armor": 2,
"delay": 3,
"skills": [
{ "name": "strike", "value": 2, "all": true, "trigger": "preAttack" },
{ "name": "pierce", "value": 1, "trigger": "preAttack" },
{ "name": "siege", "value": 2, "trigger": "preBattle" }
]
},
{
"attack": 14,
"health": 27,
"armor": 3,
"delay": 3,
"skills": [
{ "name": "strike", "value": 3, "all": true, "trigger": "preAttack" },
{ "name": "pierce", "value": 2, "trigger": "preAttack" },
{ "name": "siege", "value": 3, "trigger": "preBattle" }
]
},
{
"attack": 20,
"health": 41,
"armor": 5,
"delay": 3,
"skills": [
{ "name": "strike", "value": 5, "all": true, "trigger": "preAttack" },
{ "name": "pierce", "value": 3, "trigger": "preAttack" },
{ "name": "siege", "value": 5, "trigger": "preBattle" }
]
},
{
"attack": 30,
"health": 61,
"armor": 7,
"delay": 3,
"skills": [
{ "name": "strike", "value": 7, "all": true, "trigger": "preAttack" },
{ "name": "pierce", "value": 5, "trigger": "preAttack" },
{ "name": "siege", "value": 7, "trigger": "preBattle" }
]
},
{
"attack": 45,
"health": 91,
"armor": 10,
"delay": 3,
"skills": [
{ "name": "strike", "value": 10, "all": true, "trigger": "preAttack" },
{ "name": "pierce", "value": 7, "trigger": "preAttack" },
{ "name": "siege", "value": 10, "trigger": "preBattle" }
]
}
],
"flavorText": "By the time you hear the whistle, you are already dead.",
"artKey": "imp_orbital_1"
},
{
"id": "imp_praetorian_1",
"name": "Praetorian Elite",
"faction": "imperial",
"type": "assault",
"rarity": "epic",
"levels": [
{
"attack": 5,
"health": 18,
"armor": 3,
"delay": 2,
"skills": [
{ "name": "protect", "value": 2, "trigger": "preBattle" },
{ "name": "strike", "value": 2, "trigger": "preAttack" }
]
},
{
"attack": 8,
"health": 27,
"armor": 5,
"delay": 2,
"skills": [
{ "name": "protect", "value": 3, "trigger": "preBattle" },
{ "name": "strike", "value": 3, "trigger": "preAttack" }
]
},
{
"attack": 12,
"health": 41,
"armor": 7,
"delay": 2,
"skills": [
{ "name": "protect", "value": 5, "trigger": "preBattle" },
{ "name": "strike", "value": 5, "trigger": "preAttack" }
]
},
{
"attack": 18,
"health": 61,
"armor": 10,
"delay": 2,
"skills": [
{ "name": "protect", "value": 7, "trigger": "preBattle" },
{ "name": "strike", "value": 8, "trigger": "preAttack" }
]
},
{
"attack": 27,
"health": 91,
"armor": 15,
"delay": 2,
"skills": [
{ "name": "protect", "value": 10, "trigger": "preBattle" },
{ "name": "strike", "value": 12, "trigger": "preAttack" }
]
}
],
"flavorText": "The Praetorians serve one purpose: the Imperator lives.",
"artKey": "imp_praetorian_1"
}
]

View File

@ -602,5 +602,125 @@
},
"rewards": { "gold": 450, "cards": ["right_prophet_1"] },
"lore": "It called us heretics. It called us flawed. It was wrong. We are survivors."
},
{
"id": "mission_030",
"name": "The Iron Vanguard",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "The Iron Centurion's armored vanguard advances. Their shields gleam with the light of a dying star.",
"unlockCondition": null,
"opponent": {
"commander": "imp_cmd_2",
"cards": ["imp_shieldwall_1", "imp_juggernaut_1", "imp_mech_1", "imp_sentinel_1", "imp_praetorian_1", "imp_centurion_1"]
},
"rewards": { "gold": 200, "cards": ["imp_trooper_1"] },
"lore": "They marched in perfect formation. No fear. No hesitation. Only iron certainty."
},
{
"id": "mission_031",
"name": "Scorched Perimeter",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "The Centurion orders the perimeter burned. Nothing enters. Nothing leaves.",
"unlockCondition": "mission_030",
"opponent": {
"commander": "imp_cmd_2",
"cards": ["imp_mortar_1", "imp_sniper_1", "imp_juggernaut_1", "imp_sentinel_1", "imp_praetorian_1", "imp_dreadnought_1"]
},
"rewards": { "gold": 250, "cards": ["imp_shieldwall_1"] },
"lore": "The fires formed a perfect rectangle. Military precision, even in destruction."
},
{
"id": "mission_032",
"name": "Killzone",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "Grand Marshal Kyra has arrived. Her opening salvo levels the forward base.",
"unlockCondition": "mission_031",
"opponent": {
"commander": "imp_cmd_3",
"cards": ["imp_sniper_1", "imp_mech_1", "imp_sentinel_1", "imp_praetorian_1", "imp_dreadnought_1", "imp_orbital_1"]
},
"rewards": { "gold": 300, "cards": ["imp_gunner_1"] },
"lore": "The Marshal's first order was always the same: 'Fire everything.'"
},
{
"id": "mission_033",
"name": "The Marshal's Fist",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "Kyra deploys her personal strike force. Every unit is handpicked for lethality.",
"unlockCondition": "mission_032",
"opponent": {
"commander": "imp_cmd_3",
"cards": ["imp_mech_1", "imp_juggernaut_1", "imp_sentinel_1", "imp_praetorian_1", "imp_centurion_1", "imp_dreadnought_1", "imp_orbital_1"]
},
"rewards": { "gold": 350, "cards": ["imp_sniper_1"] },
"lore": "She called them her fist. They hit like a meteor."
},
{
"id": "mission_034",
"name": "Siege of Ashgate",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "The fortress of Ashgate falls under sustained orbital bombardment. Hold the walls.",
"unlockCondition": "mission_033",
"opponent": {
"commander": "imp_cmd_3",
"cards": ["imp_mortar_1", "imp_sentinel_1", "imp_praetorian_1", "imp_centurion_1", "imp_dreadnought_1", "imp_dreadnought_1", "imp_orbital_1"]
},
"rewards": { "gold": 400, "cards": ["imp_mortar_1"] },
"lore": "The bombardment lasted four days. On the fifth, the Marshal walked in unopposed."
},
{
"id": "mission_035",
"name": "The Imperator's Shadow",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "Imperator Dravus takes the field. His presence weakens the very will to fight.",
"unlockCondition": "mission_034",
"opponent": {
"commander": "imp_cmd_4",
"cards": ["imp_sentinel_1", "imp_praetorian_1", "imp_centurion_1", "imp_dreadnought_1", "imp_orbital_1", "imp_mech_1"]
},
"rewards": { "gold": 450, "cards": ["imp_praetorian_1"] },
"lore": "When the Imperator spoke, allies grew stronger and enemies forgot how to hold a weapon."
},
{
"id": "mission_036",
"name": "Total War",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "The full Imperial war machine deploys. This is not a battle. This is extermination.",
"unlockCondition": "mission_035",
"opponent": {
"commander": "imp_cmd_4",
"cards": ["imp_sentinel_1", "imp_centurion_1", "imp_centurion_1", "imp_dreadnought_1", "imp_dreadnought_1", "imp_orbital_1", "imp_praetorian_1"]
},
"rewards": { "gold": 500, "cards": ["imp_sentinel_1"] },
"lore": "He committed everything. Every mech, every dreadnought, every elite. He wanted no survivors."
},
{
"id": "mission_037",
"name": "Imperial Reckoning",
"chapter": 5,
"campaignId": "campaign_imperial",
"enemyLevel": 1,
"description": "The Imperator stands alone with his finest. End the Empire's reign, or kneel forever.",
"unlockCondition": "mission_036",
"opponent": {
"commander": "imp_cmd_4",
"cards": ["imp_sentinel_1", "imp_centurion_1", "imp_dreadnought_1", "imp_orbital_1", "imp_orbital_1", "imp_centurion_1"]
},
"rewards": { "gold": 600, "cards": ["imp_dreadnought_1"] },
"lore": "He smiled when we arrived. He had been waiting. This was always the plan."
}
]