From 458916fb78dcef3ff77cb29b7ba98d9f646819fc Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Fri, 19 Jun 2026 02:08:55 -0400 Subject: feat: rough pharmacy skill added --- internal/combat/formulas.go | 83 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 14 deletions(-) (limited to 'internal/combat') diff --git a/internal/combat/formulas.go b/internal/combat/formulas.go index 0b3248b..963ee9c 100644 --- a/internal/combat/formulas.go +++ b/internal/combat/formulas.go @@ -2,27 +2,33 @@ package combat import "math/rand" -func AttackRoll(attackLevel int, styleBonus int, equipBonus int) int { - return (attackLevel + styleBonus + 8) * (equipBonus + 64) +func AttackRoll(level int, styleBonus int, equipBonus int) int { + effective := level + styleBonus + 8 + return effective * (equipBonus + 64) } -func DefenseRoll(defenseLevel int, styleBonus int, equipBonus int) int { - return (defenseLevel + styleBonus + 8) * (equipBonus + 64) +func DefenseRoll(level int, styleBonus int, equipBonus int) int { + effective := level + styleBonus + 8 + return effective * (equipBonus + 64) } -func HitCheck(attackRoll, defenseRoll int) bool { - if attackRoll > defenseRoll { - return true - } - if attackRoll < defenseRoll { - return false +func HitChance(attackRoll, defenseRoll int) float64 { + a := float64(attackRoll) + d := float64(defenseRoll) + if a > d { + return 1.0 - (d+2.0)/(2.0*(a+1.0)) } - return rand.Intn(2) == 1 + return a / (2.0 * (d + 1.0)) +} + +func HitCheck(attackRoll, defenseRoll int) bool { + chance := HitChance(attackRoll, defenseRoll) + return rand.Float64() < chance } -func MaxHit(strengthLevel int, styleBonus int, equipBonus int) int { - effective := (strengthLevel + styleBonus + 8) * (equipBonus + 64) - hit := effective / 512 +func MaxHit(level int, styleBonus int, equipBonus int) int { + effective := level + styleBonus + 8 + hit := (effective * (equipBonus + 64)) / 512 if hit < 1 { hit = 1 } @@ -50,3 +56,52 @@ func AttackStyleBonus(style string) (attack, strength, defense int) { return 0, 0, 0 } } + +func RangedStyleBonus(style string) (ranged, defense int) { + switch style { + case "accurate": + return 3, 0 + case "aggressive": + return 3, 0 + case "defensive": + return 0, 3 + case "balanced": + return 1, 1 + default: + return 0, 0 + } +} + +func SelectAttackBonus(attackType string, stab, slash, crush, science, ranged int) int { + switch attackType { + case "stab": + return stab + case "slash": + return slash + case "crush": + return crush + case "science": + return science + case "ranged": + return ranged + default: + return crush + } +} + +func SelectDefenseBonus(attackType string, stab, slash, crush, science, ranged int) int { + switch attackType { + case "stab": + return stab + case "slash": + return slash + case "crush": + return crush + case "science": + return science + case "ranged": + return ranged + default: + return crush + } +} -- cgit v1.2.3