diff options
| -rw-r--r-- | main.py | 76 |
1 files changed, 75 insertions, 1 deletions
@@ -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() |
