Balance adjustments: buff armor/delay on artillery units; rework rally to include caster when `all` is true and scale strike values; nerf flurry damage; simplify counter and bloodpact damage calculations.

This commit is contained in:
Brian Fertig 2026-03-16 21:33:31 -06:00
parent 14aaf03b33
commit c3e56fd6aa
2 changed files with 42 additions and 32 deletions

View File

@ -465,7 +465,7 @@
{ {
"attack": 2, "attack": 2,
"health": 6, "health": 6,
"armor": 0, "armor": 1,
"delay": 0, "delay": 0,
"skills": [ "skills": [
{ {
@ -478,7 +478,7 @@
{ {
"attack": 3, "attack": 3,
"health": 9, "health": 9,
"armor": 0, "armor": 3,
"delay": 0, "delay": 0,
"skills": [ "skills": [
{ {
@ -491,7 +491,7 @@
{ {
"attack": 5, "attack": 5,
"health": 14, "health": 14,
"armor": 1, "armor": 5,
"delay": 0, "delay": 0,
"skills": [ "skills": [
{ {
@ -505,7 +505,7 @@
"attack": 7, "attack": 7,
"health": 20, "health": 20,
"armor": 1, "armor": 1,
"delay": 0, "delay": 7,
"skills": [ "skills": [
{ {
"name": "mortar", "name": "mortar",
@ -517,7 +517,7 @@
{ {
"attack": 10, "attack": 10,
"health": 30, "health": 30,
"armor": 2, "armor": 10,
"delay": 0, "delay": 0,
"skills": [ "skills": [
{ {
@ -545,13 +545,14 @@
"delay": 2, "delay": 2,
"skills": [ "skills": [
{ {
"name": "berserk", "name": "rally",
"value": 1, "value": 1,
"trigger": "on_attack" "all": true,
"trigger": "preBattle"
}, },
{ {
"name": "strike", "name": "strike",
"value": 2, "value": 3,
"trigger": "preAttack" "trigger": "preAttack"
} }
] ]
@ -563,13 +564,14 @@
"delay": 2, "delay": 2,
"skills": [ "skills": [
{ {
"name": "berserk", "name": "rally",
"value": 2, "value": 3,
"trigger": "on_attack" "all": true,
"trigger": "preBattle"
}, },
{ {
"name": "strike", "name": "strike",
"value": 3, "value": 6,
"trigger": "preAttack" "trigger": "preAttack"
} }
] ]
@ -581,13 +583,14 @@
"delay": 2, "delay": 2,
"skills": [ "skills": [
{ {
"name": "berserk", "name": "rally",
"value": 2, "value": 6,
"trigger": "on_attack" "all": true,
"trigger": "preBattle"
}, },
{ {
"name": "strike", "name": "strike",
"value": 5, "value": 12,
"trigger": "preAttack" "trigger": "preAttack"
} }
] ]
@ -599,13 +602,14 @@
"delay": 2, "delay": 2,
"skills": [ "skills": [
{ {
"name": "berserk", "name": "rally",
"value": 3, "value": 12,
"trigger": "on_attack" "all": true,
"trigger": "preBattle"
}, },
{ {
"name": "strike", "name": "strike",
"value": 7, "value": 24,
"trigger": "preAttack" "trigger": "preAttack"
} }
] ]
@ -617,13 +621,14 @@
"delay": 2, "delay": 2,
"skills": [ "skills": [
{ {
"name": "berserk", "name": "rally",
"value": 5, "value": 24,
"trigger": "on_attack" "all": true,
"trigger": "preBattle"
}, },
{ {
"name": "strike", "name": "strike",
"value": 10, "value": 48,
"trigger": "preAttack" "trigger": "preAttack"
} }
] ]
@ -1480,7 +1485,7 @@
"skills": [ "skills": [
{ {
"name": "flurry", "name": "flurry",
"value": 2, "value": 1,
"trigger": "passive" "trigger": "passive"
}, },
{ {
@ -1498,7 +1503,7 @@
"skills": [ "skills": [
{ {
"name": "flurry", "name": "flurry",
"value": 2, "value": 1,
"trigger": "passive" "trigger": "passive"
}, },
{ {
@ -1516,7 +1521,7 @@
"skills": [ "skills": [
{ {
"name": "flurry", "name": "flurry",
"value": 3, "value": 1,
"trigger": "passive" "trigger": "passive"
}, },
{ {
@ -1534,7 +1539,7 @@
"skills": [ "skills": [
{ {
"name": "flurry", "name": "flurry",
"value": 5, "value": 1,
"trigger": "passive" "trigger": "passive"
}, },
{ {

View File

@ -105,10 +105,14 @@ export class SkillProcessor {
rally(skill, attacker, defender, allies, enemies, context) { rally(skill, attacker, defender, allies, enemies, context) {
const assaultAllies = allies.filter(a => a.type === 'assault' && a !== attacker && a.currentHP > 0); const assaultAllies = allies.filter(a => a.type === 'assault' && a !== attacker && a.currentHP > 0);
if (assaultAllies.length === 0) return;
if (skill.all) { if (skill.all) {
// Rally all includes the caster itself
const targets = attacker.type === 'assault' && attacker.currentHP > 0
? [attacker, ...assaultAllies]
: [...assaultAllies];
if (targets.length === 0) return;
const allTargets = []; const allTargets = [];
for (const t of assaultAllies) { for (const t of targets) {
t.currentAttack += skill.value; t.currentAttack += skill.value;
t._tempBuffs = t._tempBuffs || []; t._tempBuffs = t._tempBuffs || [];
t._tempBuffs.push({ stat: 'currentAttack', amount: skill.value, source: 'rally' }); t._tempBuffs.push({ stat: 'currentAttack', amount: skill.value, source: 'rally' });
@ -117,6 +121,7 @@ export class SkillProcessor {
if (context) context.rallyAllTargets = allTargets; if (context) context.rallyAllTargets = allTargets;
return; return;
} }
if (assaultAllies.length === 0) return;
const rng = context?.rng; const rng = context?.rng;
const idx = rng const idx = rng
? rng.nextInt(0, assaultAllies.length - 1) ? rng.nextInt(0, assaultAllies.length - 1)
@ -331,7 +336,7 @@ export class SkillProcessor {
counter(skill, attacker, defender, allies, enemies, context) { counter(skill, attacker, defender, allies, enemies, context) {
if (!context.attackingCard) return; if (!context.attackingCard) return;
const dmg = Math.max(0, skill.value - Math.max(0, context.attackingCard.currentArmor)); const dmg = skill.value;
context.attackingCard.currentHP -= dmg; context.attackingCard.currentHP -= dmg;
context.counterDamage = dmg; context.counterDamage = dmg;
} }
@ -408,7 +413,7 @@ export class SkillProcessor {
} }
bloodpact(skill, attacker, defender, allies, enemies, context) { bloodpact(skill, attacker, defender, allies, enemies, context) {
const hpCost = Math.ceil(skill.value * 0.75); const hpCost = skill.value;
attacker.currentHP -= hpCost; attacker.currentHP -= hpCost;
attacker.health -= hpCost; // permanently reduce max HP attacker.health -= hpCost; // permanently reduce max HP
attacker.currentAttack += skill.value; attacker.currentAttack += skill.value;