✨
This commit is contained in:
@ -357,8 +357,14 @@ class ComparePoint(Exp):
|
||||
return None
|
||||
if self.comp_op == "=":
|
||||
return 1 if val == r else 0
|
||||
if self.comp_op == "<":
|
||||
return 1 if val < r else 0
|
||||
if self.comp_op == "<=":
|
||||
return 1 if val <= r else 0
|
||||
if self.comp_op == ">":
|
||||
return 1 if val <= r else 0
|
||||
if self.comp_op == ">=":
|
||||
return 1 if val <= r else 0
|
||||
else:
|
||||
raise Exception(f"Unknown binop {self.op}")
|
||||
|
||||
@ -451,11 +457,12 @@ class Roll(Exp):
|
||||
self.die_type = r2
|
||||
|
||||
self.result = [randint(1,r2) for _ in range(r1)]
|
||||
self.show_list = [str(i) for i in self.result]
|
||||
return self.result
|
||||
|
||||
def _show(self, vtable):
|
||||
result = self.eval(vtable)
|
||||
return [str(i) for i in result]
|
||||
self.eval(vtable)
|
||||
return self.show_list
|
||||
|
||||
@property
|
||||
def die(self) -> int:
|
||||
@ -505,10 +512,6 @@ class RollKeepHighest(Roll):
|
||||
self.show_list = [str(n) if i in max_indices else f"~~{n}~~" for i, n in enumerate(r1)]
|
||||
return self.result
|
||||
|
||||
def _show(self, vtable):
|
||||
self.eval(vtable)
|
||||
return self.show_list
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"kep_highest({self.roll},{self.exp})"
|
||||
|
||||
@ -548,10 +551,6 @@ class RollKeepLowest(Roll):
|
||||
self.show_list = [str(n) if i in min_indices else f"~~{n}~~" for i, n in enumerate(r1)]
|
||||
return self.result
|
||||
|
||||
def _show(self, vtable):
|
||||
self.eval(vtable)
|
||||
return self.show_list
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"kep_lowest({self.roll},{self.exp})"
|
||||
|
||||
@ -591,10 +590,6 @@ class RollMin(Roll):
|
||||
self.result = r1
|
||||
return self.result
|
||||
|
||||
def _show(self, vtable):
|
||||
self.eval(vtable)
|
||||
return self.show_list
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"min({self.roll},{self.exp})"
|
||||
|
||||
@ -634,10 +629,6 @@ class RollMax(Roll):
|
||||
self.result = r1
|
||||
return self.result
|
||||
|
||||
def _show(self, vtable):
|
||||
self.eval(vtable)
|
||||
return self.show_list
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"max({self.roll},{self.exp})"
|
||||
|
||||
@ -687,9 +678,53 @@ class RollExplode(Roll):
|
||||
|
||||
return self.result
|
||||
|
||||
def _show(self, vtable):
|
||||
self.eval(vtable)
|
||||
return self.show_list
|
||||
def __repr__(self) -> str:
|
||||
return f"max({self.roll},{self.exp})"
|
||||
|
||||
def __eq__(self, other: Exp) -> bool:
|
||||
return (
|
||||
isinstance(other, RollMax) and
|
||||
self.roll == other.roll and
|
||||
self.exp == other.exp
|
||||
)
|
||||
|
||||
class RollReroll(Roll):
|
||||
def __init__(self, roll: Roll, comp: ComparePoint = None, once: bool = False):
|
||||
self.roll = roll
|
||||
self.comp = comp
|
||||
self.once = once
|
||||
self.result = None
|
||||
self.show_list = None
|
||||
|
||||
def _eval(self, vtable):
|
||||
if self.result is not None:
|
||||
return self.result
|
||||
|
||||
r1 = self.roll.eval(vtable)
|
||||
|
||||
if not (isinstance(r1,list) and all(isinstance(i,int) for i in r1)):
|
||||
return []
|
||||
|
||||
d = self.die
|
||||
|
||||
if self.comp is None:
|
||||
self.comp = ComparePoint("=", ExpInt(1))
|
||||
|
||||
self.result = []
|
||||
self.show_list = []
|
||||
|
||||
def compare(n, rerolled):
|
||||
if self.comp.eval(vtable, n) and not (rerolled and self.once):
|
||||
self.show_list.append(f"~~{n}~~")
|
||||
compare(randint(1,d), True)
|
||||
else:
|
||||
self.result.append(n)
|
||||
self.show_list.append(str(n))
|
||||
|
||||
for n in r1:
|
||||
compare(n, False)
|
||||
|
||||
return self.result
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"max({self.roll},{self.exp})"
|
||||
|
Reference in New Issue
Block a user