summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSupremist <sergkarv@gmail.com>2025-10-27 19:53:38 +0200
committerSupremist <sergkarv@gmail.com>2025-10-27 19:53:38 +0200
commit146aa6ddff5a347c61aef5ddd62bebd344508c3d (patch)
treeda92786fffa99f06df8785d5b526a4fe501988a6
parentd3e18471b664c9146f4255e7c23ea21c9cfa6130 (diff)
downloadpf2e_calc-146aa6ddff5a347c61aef5ddd62bebd344508c3d.tar.xz
pf2e_calc-146aa6ddff5a347c61aef5ddd62bebd344508c3d.zip
Add Weapon class
-rw-r--r--main.py76
1 files changed, 75 insertions, 1 deletions
diff --git a/main.py b/main.py
index c73a011..f5888c3 100644
--- a/main.py
+++ b/main.py
@@ -1,4 +1,5 @@
import math
+from sys import base_exec_prefix
from distribution import Distribution
@@ -45,6 +46,70 @@ class Roll:
return max(Roll.Fumble, min(Roll.Crit, value))
+class Weapon:
+ def __init__(self, crit_effect, main_die, potency, striking=1, fatal=0,
+ deadly=0, backstabber=False,
+ agile=False, twin=False) -> None:
+ self.main_die = main_die
+ self.striking = striking
+ self.potency = potency
+ self.backstabber = backstabber
+ self.fatal = fatal
+ self.deadly = deadly
+ self.agile = agile
+ self.twin = twin
+ self.crit_effect = crit_effect
+
+ def get_map(self, number):
+ number = max(0, min(2, number))
+ if self.agile:
+ return number * -4
+ return number * -5
+
+ def damage(self, dmg_bonus, check=Roll.Success, number = 0):
+ persistant_damage_factor = 3 + 1/3
+ if self.backstabber:
+ dmg_bonus += 1
+ if self.potency >= 3:
+ dmg_bonus += 1
+
+ if self.twin and number > 0:
+ dmg_bonus += self.striking
+
+ if check == Roll.Success:
+ return self.striking * d(self.main_die) + dmg_bonus
+ if check == Roll.Crit:
+ dmg = None
+ if self.fatal is not None and self.fatal > 0:
+ dmg = (self.striking + 1) * d(self.fatal)
+ else:
+ dmg = self.striking * d(self.main_die)
+ dmg = 2 * (dmg+dmg_bonus)
+
+ if self.deadly is not None and self.deadly > 0:
+ dmg += max(1, self.striking-1) * d(self.deadly)
+
+ if self.crit_effect == "crossbow":
+ dmg += persistant_damage_factor * d(8).expected()
+ elif self.crit_effect == "dart" or self.crit_effect == "knife":
+ dmg += persistant_damage_factor * d(6).expected()
+ elif self.crit_effect == "dagger":
+ dmg += persistant_damage_factor * d(6).expected()
+ elif self.crit_effect == "pick":
+ dmg += 2 * self.striking
+
+ return dmg
+ return 0
+
+
+ def strike(self, attack_bonus, dmg_bonus, ac, number = 0):
+ def strike_dmg(check):
+ return self.damage(dmg_bonus, check, number)
+ bonus = attack_bonus+self.potency+self.get_map(number)
+ attack_roll = d(20).apply(Roll.check, ac, bonus)
+ return attack_roll.apply(strike_dmg)
+
+
def treat_wounds(check_res, heal_bonus=0):
if check_res <= Roll.Fumble:
return -d(8)
@@ -111,6 +176,15 @@ def main2():
total_dmg = attack.apply(strike, dmg, d(8))
show_stat("rapier", total_dmg)
+def test3():
+ falcata = Weapon("sword", 8, 0, fatal=0)
+ ac = 18
+ bonus = +8 +3
+ dmg_bonus = d(6)+4
+ attack = d(20).apply(Roll.check, ac, bonus)
+ show_stat("attack", attack)
+ show_stat("falcata", falcata.strike(bonus, dmg_bonus, ac, 0))
+
if __name__ == '__main__':
- main2()
+ test3()