Implement new rolling system

This commit is contained in:
Joscha 2018-07-27 23:49:14 +00:00
parent 11b564e088
commit d29b342511

View file

@ -1,12 +1,16 @@
import asyncio import asyncio
import random import random
import re
import yaboli import yaboli
from yaboli.utils import * from yaboli.utils import *
from join_rooms import join_rooms # List of rooms kept in separate file, which is .gitignore'd from join_rooms import join_rooms # List of rooms kept in separate file, which is .gitignore'd
ROLL = r"[!/]roll (\d+)d(\d+)\s*(\+\s*(\d+))?" ROLL = r"[!/]roll\s+(.*)"
THROW = r"([+-])?\s*(\d+)?d(\d+)\s*" # 1: sign, 2: amount (default 1), 3: sides
ADVANTAGE = r"([+-])?\s*(\d+)?([ad])d(\d+)\s*" # 1: sign, 2: amount (default 2), 3: a/d, 4: sides
NUMBER = r"([+-])?\s*(\d+)\s*" # 1: sign, 2: number
class Roller(yaboli.Bot): class Roller(yaboli.Bot):
async def send(self, room, message): async def send(self, room, message):
@ -29,22 +33,87 @@ class Roller(yaboli.Bot):
@yaboli.trigger(ROLL) @yaboli.trigger(ROLL)
async def trigger_roll(self, room, message, match): async def trigger_roll(self, room, message, match):
amount = int(match.group(1)) result = 0
sides = int(match.group(2)) resultstr = ""
bonus = match.group(4)
if bonus:
bonus = int(bonus)
results = [random.randint(1, sides) for roll in range(amount)] rest = match.group(1)
result = sum(results) while True:
resultstr = ", ".join(str(r) for r in results) mthrow, mthrowrest = self.match_and_split(THROW, rest)
madvantage, madvantagerest = self.match_and_split(ADVANTAGE, rest)
if bonus is not None: mnumber, mnumberrest = self.match_and_split(NUMBER, rest)
text = f"{result + bonus}: {resultstr} + {bonus}" if mthrow:
sign = self.to_sign(mthrow.group(1))
amount = self.to_amount(mthrow.group(2), default=1)
sides = self.to_amount(mthrow.group(3))
r, rstr = self.throw(amount, sides)
rest = mthrowrest
elif madvantage:
sign = self.to_sign(madvantage.group(1))
amount = self.to_amount(madvantage.group(2), default=2)
dis = True if madvantage.group(3) == "d" else False
sides = self.to_amount(madvantage.group(4))
r, rstr = self.advantage(dis, amount, sides)
rest = madvantagerest
elif mnumber:
sign = self.to_sign(mnumber.group(1))
amount = self.to_amount(mnumber.group(2))
r, rstr = self.number(amount)
rest = mnumberrest
elif rest:
await room.send(f"Syntax error at: {rest!r}")
return
else: else:
text = f"{result}: {resultstr}" break
await room.send(text, message.mid) result += sign * r
if resultstr:
resultstr += f" {'+' if sign == 1 else '-'} "
elif sign == -1:
resultstr += "-"
resultstr += rstr
resultstr = f"{result}: {resultstr}"
await room.send(resultstr, message.mid)
@staticmethod
def match_and_split(regex, string):
match = re.match(regex, string)
if match:
string = string[match.end():]
return match, string
@staticmethod
def to_sign(string):
if string == "-":
return -1
else:
return 1
@staticmethod
def to_amount(string, default=0):
if string is None:
return default
else:
return int(string)
@staticmethod
def throw(amount, sides):
results = [random.randint(1, sides) for _ in range(amount)]
result = sum(results)
resultstr = "(" + "+".join(str(r) for r in results) + ")"
return result, resultstr
@staticmethod
def advantage(dis, amount, sides):
results = [random.randint(1, sides) for _ in range(amount)]
result = min(results) if dis else max(results)
resultstr = "(" + ",".join(str(r) for r in results) + ")"
resultstr = ("min" if dis else "max") + resultstr
return result, resultstr
@staticmethod
def number(number):
return number, str(number)
def main(): def main():
bot = Roller("Roller", "roller.cookie") bot = Roller("Roller", "roller.cookie")