import math from character import CharacterPlan from game import Difficulty, Roll, d from creature import CreaturePlan from actions import Attack from items import Weapon import pb2e def treat_wounds(check_res, heal_bonus=0): if check_res <= Roll.Fumble: return -d(8) if check_res == Roll.Fail: return 0 if check_res == Roll.Success: return 2*d(8) + heal_bonus if check_res == Roll.Crit: return 4*d(8) + heal_bonus def strike(check_res, dmg, crit_dmg=0): if check_res == Roll.Success: return dmg if check_res == Roll.Crit: return 2*dmg + crit_dmg return 0 def show_stat(name, dist): print(name) values = list(dist.probabilities.keys()) mn = min(values) mx = max(values) print("min", mn, dist.probabilities[mn]) print("max", mx, dist.probabilities[mx]) print("Exp", dist.expected()) print("Std", dist.standard_deviation()) print("<0", dist.accumulate_prob(lambda x: x < 0)) print(">0", dist.accumulate_prob(lambda x: x > 0)) print("") assert abs(dist.accumulate_prob(lambda x: True) - 1) < math.pow(10, -10) def main(): treat_options = [ {"dc": 15, "heal_bonus": 0}, {"dc": 20, "heal_bonus": 15} ] bonus = 10 show_stat("Assurance 15", 2*d(8)) for opt in treat_options: dc = opt["dc"] treat = d(20).apply(Roll.check, dc, bonus).apply(treat_wounds, opt["heal_bonus"]) risky = d(20).apply(Roll.check, dc, bonus+2).apply(lambda x: Roll.Crit if x == Roll.Success else x) risky = risky.apply(treat_wounds, opt["heal_bonus"]) + (-d(8)) show_stat("Treat Wounds " + str(dc), treat) show_stat("Risky Surgery " + str(dc), risky) treat = d(20).apply(Roll.check, 20, bonus+1).apply(treat_wounds, 15) show_stat("Treat Wounds 20 +1", treat) def main2(): ac = 18 bonus = +8 dmg = d(6)+4 attack = d(20).apply(Roll.check, ac, bonus) show_stat("attack", attack) total_dmg = attack.apply(strike, dmg+1) show_stat("dogslicer", total_dmg) total_dmg = attack.apply(strike, dmg, d(8)) show_stat("rapier", total_dmg) def test3(): level = 2 #char_js = pb2e.download_character(pfb_id=160180) char_js = pb2e.open_character("quizrel2") char_plan = CharacterPlan(char_js) char = char_plan.build(level) falcata = Weapon("falcata", "martial", "sword", 8, fatal=12) char.weapons.append(falcata) char.update_fundamental_runes() creature_plan = CreaturePlan(default_difficulty=Difficulty.Moderate) # creature_plan["reflex"] = Difficulty.High # creature_plan["ac"] = Difficulty.High creature = creature_plan.build(level) attack = Attack(char, creature, falcata) print(char.toJSON()) print(f"Attack +{attack.bonus()} vs AC {attack.target.ac()}") show_stat("roll", attack.roll()) show_stat("falcata", attack.strike()) if __name__ == '__main__': test3()