combat: tune damage math and enemy scaling

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I983d5980f8d14ccebc6b681100af8a146a6a6964
This commit is contained in:
raf 2026-04-05 22:24:02 +03:00
commit 1875d94e44
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
3 changed files with 34 additions and 14 deletions

View file

@ -7,8 +7,9 @@ fn rng(min: c_int, max: c_int) c_int {
}
fn applyResistance(damage: c_int, resistance: c_int) c_int {
if (resistance >= 100) return 0;
const factor = 100 - resistance;
var r = resistance;
if (r > 75) r = 75;
const factor = 100 - r;
var result = @divTrunc(damage * factor, 100);
if (result < 1) result = 1;
return result;
@ -63,15 +64,17 @@ pub fn playerAttack(p: [*c]c.Player, e: [*c]c.Enemy) void {
base_attack -= c.WEAKEN_ATTACK_REDUCTION;
if (base_attack < 1) base_attack = 1;
const variance = rng(80, 120);
var damage = @divTrunc(base_attack * variance, 100);
if (damage < 1) damage = 1;
var damage = base_attack;
if (rng(0, 99) < crit_chance) {
damage = @divTrunc(damage * crit_mult, 100);
event.last.is_critical = 1;
}
const variance = rng(80, 120);
damage = @divTrunc(damage * variance, 100);
if (damage < 1) damage = 1;
const res_index: usize = @intCast(dmg_class);
if (res_index < c.NUM_DMG_CLASSES) {
damage = applyResistance(damage, e[0].resistance[res_index]);
@ -139,15 +142,19 @@ pub fn enemyAttack(e: [*c]c.Enemy, p: [*c]c.Player) void {
base_damage -= p[0].defense;
if (base_damage < 1) base_damage = 1;
const variance = rng(80, 120);
var damage = @divTrunc(base_damage * variance, 100);
if (damage < 1) damage = 1;
var damage = base_damage;
if (rng(0, 99) < c.ENEMY_CRIT_CHANCE) {
damage = @divTrunc(damage * c.ENEMY_CRIT_MULT, 100);
const e_crit_chance = if (e[0].crit_chance > 0) e[0].crit_chance else c.ENEMY_CRIT_CHANCE;
const e_crit_mult = if (e[0].crit_mult > 0) e[0].crit_mult else c.ENEMY_CRIT_MULT;
if (rng(0, 99) < e_crit_chance) {
damage = @divTrunc(damage * e_crit_mult, 100);
event.last.is_critical = 1;
}
const variance = rng(80, 120);
damage = @divTrunc(damage * variance, 100);
if (damage < 1) damage = 1;
if (p[0].block > 0 and rng(0, 99) < 30) {
var blocked = p[0].block;
if (blocked > damage) blocked = damage;