def test_compile_int(self):
     expected = EvalTree(None)
     expected.root = EvalTreeNode(2)
     self.assertEqual(compile(2), expected)
     expected.root = EvalTreeNode(OPERATORS['+'], EvalTreeNode(2),
                                  EvalTreeNode(4))
     self.assertEqual(compile(2, 4), expected)
Exemple #2
0
 def ability_save(self, which: 'abil.AbilityName', adv=False, dis=False):
     roll = h.d20_roll(adv, dis, self.bonuses.get('lucky', False))
     roll += d.compile(self.abilities[which].modifier)
     if which in self.saves:
         roll += d.compile(self.proficiency)
     abilityBonus = self.bonuses.get('save_' + which.value)
     if abilityBonus:
         roll += d.compile(self.parse_vars(abilityBonus))
     return roll.evaluate(), roll
Exemple #3
0
 def do_attack(self, lucky=False):
     attack = self.adv.d20_roll(lucky)
     attack += d.compile(self.attack.get())
     attack.evaluate()
     damage = d.compile(self.damage.get())
     if attack.is_critical():
         damage.critify()
     self.attackResult.set(attack, 'Attack roll: {}')
     self.damageResult.set(damage, 'Damage roll: {}')
Exemple #4
0
def main():
    args = parse()
    mode = Mode.NORMAL
    if args.maximum:
        mode = Mode.MAX
    elif args.critical:
        mode = Mode.CRIT
    elif args.average:
        mode = Mode.AVERAGE
    func = basic
    if args.verbose:
        func = verbose
    wrap = args.wrap

    for expr in args.expression:
        length = 0
        compiled = compile(expr)
        for each in range(args.number):
            val = func(compiled, mode)
            s = "{} ".format(val)
            if wrap > 0:
                length += len(s)
                if length > wrap:
                    # print a newline before to prevent from
                    # overstepping the line length restriction
                    print()
                    length = len(s)
            print(s, end="")
        print()
 def test_compile_modifier(self):
     expected = EvalTree(None)
     expected.root = EvalTreeNode(
         OPERATORS['+'],
         EvalTreeNode(OPERATORS['d'], EvalTreeNode(3), EvalTreeNode(4)),
         EvalTreeNode(2))
     self.assertEqual(compile('3d4', 2), expected)
Exemple #6
0
 def __getitem__(self, expression: str) -> EvalTree:
     if expression not in self.cache:
         try:
             self.cache[expression] = compile(expression)
         except ParseError:
             raise
         return self.cache[expression]
         pass
     pass
Exemple #7
0
 def do_attack(self):
     adv = self.advantage.get()
     dis = self.disadvantage.get()
     attack = h.d20_roll(adv, dis)
     attack += d.compile(self.attack.get())
     attroll = d.verbose(attack)
     ###
     if attack.is_critical():
         attroll = 'Critical Hit'
         damresult = d.verbose(self.damage.get(), d.Mode.CRIT)
     elif attack.is_fail():
         attroll = 'Critical Miss'
         damresult = '0'
     else:
         damresult = d.verbose(self.damage.get())
     ###
     self.attackResult['text'] = 'Attack result: ' + attroll
     self.damageResult['text'] = 'Damage done: ' + damresult
Exemple #8
0
 def attack(self, which):
     advantage = self.adv.get()
     disadvantage = self.dis.get()
     attack_bonus = self.character.parse_vars(self.atkbonus.get(), False)
     damage_bonus = self.character.parse_vars(self.dambonus.get(), False)
     if which is None:
         attack = h.d20_roll(advantage, disadvantage, self.character.bonuses.get('lucky', False))
         attack += d.compile(attack_bonus)
         attackRoll = attack.evaluate()
         if attack.is_critical():
             attackRoll = 'Critical Hit!'
             damageRoll = d.basic(damage_bonus, mode=d.Mode.CRIT)
         elif attack.is_fail():
             attackRoll = 'Critical Miss.'
             damageRoll = 0
         else:
             # mode = 'execute'
             attackRoll = attack.verbose_result()
             damageRoll = d.basic(damage_bonus)
         result = ('Attack Roll: ' + str(attackRoll), 'Damage Roll: ' + str(damageRoll), '')
         # result = ('Attack Roll: ' + str(atk), 'Damage Roll: ' + str(dam), '')
     else:
         result = which.attack(self.character, advantage, disadvantage, attack_bonus, damage_bonus)
     self.output.update(*result)
Exemple #9
0
 def ability_check(self,
                   which: 'abil.AbilityName',
                   skill='',
                   adv=False,
                   dis=False):
     roll = h.d20_roll(adv, dis, self.bonuses.get('lucky', False))
     roll += d.compile(self.abilities[which].modifier)
     if skill == '':
         # plain ability check
         abilityBonus = self.bonuses.get('check_' + which.value)
         if abilityBonus:
             roll += d.compile(self.parse_vars(abilityBonus))
         if self.bonuses.get('jack_of_all_trades', False):
             roll += d.compile(self.proficiency // 2)
     else:
         if skill in self.skills:
             roll += d.compile(self.proficiency)
         elif self.bonuses.get('jack_of_all_trades', False):
             roll += d.compile(self.proficiency // 2)
         skillBonus = self.bonuses.get('skill_' + skill)
         if skillBonus:
             roll += d.compile(self.parse_vars(skillBonus))
     return roll.evaluate(), roll
Exemple #10
0
 def do_roll(self):
     self.result.set(d.compile(self.generalRoll.get()))
Exemple #11
0
 def roll(self, extra: Optional[d.core.EvalTree] = None):
     expr = self.advantage.d20_roll()
     expr += d.compile(self.ability.modifier)
     if extra:
         expr += extra
     self.display.set(expr)
Exemple #12
0
 def change_hp(self):
     tree = d.compile(self.entry.get())
     value = tree.evaluate()
     self.handler.change(value)
     self.amount.set(tree)
     self.onChange()
 def test_compile_wrong_type(self):
     with self.assertRaises(InputTypeError):
         compile([40, 2])
Exemple #14
0
 def do_roll(self):
     s = self.generalRoll.get()
     parsed = self.character.parse_vars(s, mathIt=False)
     self.result.set(d.compile(parsed))
Exemple #15
0
 def add_temp(self):
     tree = d.compile(self.entry.get())
     value = tree.evaluate()
     self.handler.add_temp(value)
     self.amount.set(tree)
     self.onTemp()
Exemple #16
0
import functools
import json
import os
import re
import typing
from operator import lt, gt

import dndice as r

D20 = r.compile('1d20')
D20_LUCK = r.compile('1d20r1')
ADV = r.compile('2d20h1')
ADV_LUCK = r.compile('2d20r1h1')
DIS = r.compile('2d20l1')
DIS_LUCK = r.compile('2d20r1l1')


def modifier(score):
    return (int(score) - 10) // 2


def d20_roll(adv=False, dis=False, luck=False):
    """Return the d20 roll to make under the given conditions."""
    if adv and not dis:
        if luck:
            return ADV_LUCK.copy()
        else:
            return ADV.copy()
    elif dis and not adv:
        if luck:
            return DIS_LUCK.copy()
 def test_compile(self):
     tree = compile('3d4')
     expected = EvalTree(None)
     expected.root = EvalTreeNode(OPERATORS['d'], EvalTreeNode(3),
                                  EvalTreeNode(4))
     self.assertEqual(tree, expected)