import numpy as np from scipy.special import comb as combin def roll_weight(dice,rerolls): roll_vector = list(range(dice+1)) reroll_N = abs(rerolls)+1 reroll_coeffs = combin(reroll_N,list(range(1,reroll_N+1))) reroll_powers = list(range(reroll_N - 1,-1,-1)) roll_weights = [sum(reroll_coeffs * [pow(roll,rp) for rp in reroll_powers]) for roll in roll_vector] roll_p = roll_weights/sum(roll_weights) if (np.sign(rerolls) < 0): roll_weights = roll_weights[::-1] roll_p = roll_p[::-1] return {'roll': roll_vector, 'weight': roll_weights, 'prob': roll_p} def opposed_roll(offense_dice,offense_rerolls,defense_dice,defense_rerolls): offense_weight = roll_weight(dice=offense_dice,rerolls=offense_rerolls) defense_weight = roll_weight(dice=defense_dice,rerolls=defense_rerolls) psuccess = sum([defprob*offprob if defroll= 0.05 else 2 for roll,prob in zip(margin2,pmargin4)]) hihit = max([roll/offense_dice if prob <= 0.95 else -1 for roll,prob in zip(margin2,pmargin4)]) return {'offense_dice':offense_dice, 'offense_rerolls':offense_rerolls, 'defense_dice':defense_dice, 'defense_rerolls':defense_rerolls, 'psuccess':psuccess, 'mhit':mhit, 'lowhit': lowhit, 'hihit': hihit} test = opposed_roll(offense_dice=100,offense_rerolls=0,defense_dice=100,defense_rerolls=0) def opposed_target(offense_dice,offense_rerolls,target): offense_weight = roll_weight(dice=offense_dice,rerolls=offense_rerolls) psuccess = sum([offprob if target= 0.05 else 2 for roll,prob in zip(margin2,pmargin4)]) hihit = max([roll/offense_dice if prob <= 0.95 else -1 for roll,prob in zip(margin2,pmargin4)]) return {'offense_dice':offense_dice, 'offense_rerolls':offense_rerolls, 'target':target, 'psuccess':psuccess, 'mhit':mhit, 'lowhit': lowhit, 'hihit': hihit} test2 = opposed_target(offense_dice=100,offense_rerolls=0,target=50)