Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if in_crit:
dice_ast = d20.utils.tree_map(_crit_mapper, dice_ast)
if critdice and not autoctx.is_spell:
# add X critdice to the leftmost node if it's dice
left = d20.utils.leftmost(dice_ast)
if isinstance(left, d20.ast.Dice):
left.num += int(critdice)
# -c #
if c_arg and in_crit:
c_ast = d20.parse(c_arg)
dice_ast.roll = d20.ast.BinOp(dice_ast.roll, '+', c_ast.roll)
# max
if max_arg:
dice_ast = d20.utils.tree_map(_max_mapper, dice_ast)
# evaluate damage
dmgroll = roll(dice_ast)
# magic arg (#853)
always = {'magical'} if (autoctx.is_spell or magic_arg) else None
# dtype transforms/overrides (#876)
transforms = {}
for dtype in dtype_args:
if '>' in dtype:
*froms, to = dtype.split('>')
for frm in froms:
transforms[frm.strip()] = to.strip()
else:
transforms[None] = dtype
# display damage transforms (#1103)
level = autoctx.caster.spellbook.caster_level
if level < 5:
level_dice = 1
elif level < 11:
level_dice = 2
elif level < 17:
level_dice = 3
else:
level_dice = 4
def mapper(node):
if isinstance(node, d20.ast.Dice):
node.num = level_dice
return node
dice_ast = d20.utils.tree_map(mapper, dice_ast)
if effect.higher and not autoctx.get_cast_level() == autoctx.spell.level:
higher = effect.higher.get(str(autoctx.get_cast_level()))
if higher:
higher_ast = d20.parse(higher)
dice_ast.roll = d20.ast.BinOp(dice_ast.roll, '+', higher_ast.roll)
return dice_ast
def _vroll(dice, multiply=1, add=0, roller=None):
if roller is None:
roller = d20.Roller()
dice_ast = roller.parse(dice)
if multiply != 1 or add != 0:
def mapper(node):
if isinstance(node, d20.ast.Dice):
node.num = (node.num * multiply) + add
return node
dice_ast = d20.utils.tree_map(mapper, dice_ast)
try:
rolled = roller.roll(dice_ast)
except d20.RollError:
return None
return SimpleRollResult(rolled)
if mi_arg:
dice_ast = d20.utils.tree_map(_mi_mapper(mi_arg), dice_ast)
# -d #
if d_arg:
d_ast = d20.parse(d_arg)
dice_ast.roll = d20.ast.BinOp(dice_ast.roll, '+', d_ast.roll)
# crit
in_crit = autoctx.in_crit or crit_arg
roll_for = "Damage" if not in_crit else "Damage (CRIT!)"
if in_crit:
dice_ast = d20.utils.tree_map(_crit_mapper, dice_ast)
if critdice and not autoctx.is_spell:
# add X critdice to the leftmost node if it's dice
left = d20.utils.leftmost(dice_ast)
if isinstance(left, d20.ast.Dice):
left.num += int(critdice)
# -c #
if c_arg and in_crit:
c_ast = d20.parse(c_arg)
dice_ast.roll = d20.ast.BinOp(dice_ast.roll, '+', c_ast.roll)
# max
if max_arg:
dice_ast = d20.utils.tree_map(_max_mapper, dice_ast)
# evaluate damage
dmgroll = roll(dice_ast)
# magic arg (#853)
d_arg = f"{d_arg}+{effect_d}"
else:
d_arg = effect_d
# check if we actually need to care about the -d tag
if self.is_meta(autoctx):
d_arg = None # d was likely applied in the Roll effect already
# set up damage AST
damage = autoctx.parse_annostr(damage)
dice_ast = copy.copy(d20.parse(damage))
dice_ast = _upcast_scaled_dice(self, autoctx, dice_ast)
# -mi # (#527)
if mi_arg:
dice_ast = d20.utils.tree_map(_mi_mapper(mi_arg), dice_ast)
# -d #
if d_arg:
d_ast = d20.parse(d_arg)
dice_ast.roll = d20.ast.BinOp(dice_ast.roll, '+', d_ast.roll)
# crit
in_crit = autoctx.in_crit or crit_arg
roll_for = "Damage" if not in_crit else "Damage (CRIT!)"
if in_crit:
dice_ast = d20.utils.tree_map(_crit_mapper, dice_ast)
if critdice and not autoctx.is_spell:
# add X critdice to the leftmost node if it's dice
left = d20.utils.leftmost(dice_ast)
if isinstance(left, d20.ast.Dice):
left.num += int(critdice)