aboutsummaryrefslogtreecommitdiff
path: root/internal/combat
diff options
context:
space:
mode:
Diffstat (limited to 'internal/combat')
-rw-r--r--internal/combat/formulas.go83
1 files changed, 69 insertions, 14 deletions
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
+ }
+}