feat(combat): add deterministic damage formula
This commit is contained in:
17
apps/api/src/combat/combat-damage.spec.ts
Normal file
17
apps/api/src/combat/combat-damage.spec.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { calculateDamage } from './combat-damage';
|
||||||
|
|
||||||
|
describe('calculateDamage', () => {
|
||||||
|
it('applies the established armor mitigation formula', () => {
|
||||||
|
// raw = 12 + 15 = 27; 27 * 60 / (60 + 20) = 20.25 -> rounds to 20
|
||||||
|
expect(calculateDamage({ attack: 12, weaponDamage: 15 }, 20)).toBe(20);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('never returns less than 1 damage, even against extreme armor', () => {
|
||||||
|
expect(calculateDamage({ attack: 1, weaponDamage: 0 }, 100_000)).toBe(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('treats an attacker with no weaponDamage as having attack alone as its raw damage', () => {
|
||||||
|
// raw = 9; 9 * 60 / (60 + 5) = 8.307... -> rounds to 8
|
||||||
|
expect(calculateDamage({ attack: 9 }, 5)).toBe(8);
|
||||||
|
});
|
||||||
|
});
|
||||||
13
apps/api/src/combat/combat-damage.ts
Normal file
13
apps/api/src/combat/combat-damage.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
export interface DamageAttacker {
|
||||||
|
attack: number;
|
||||||
|
weaponDamage?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ARMOR_MITIGATION_CONSTANT = 60;
|
||||||
|
|
||||||
|
export function calculateDamage(attacker: DamageAttacker, targetArmor: number): number {
|
||||||
|
const rawDamage = attacker.attack + (attacker.weaponDamage ?? 0);
|
||||||
|
const mitigatedDamage =
|
||||||
|
(rawDamage * ARMOR_MITIGATION_CONSTANT) / (ARMOR_MITIGATION_CONSTANT + targetArmor);
|
||||||
|
return Math.max(1, Math.round(mitigatedDamage));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user