aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/hydrorollcore/rule.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/hydrorollcore/rule.py')
-rw-r--r--src/hydrorollcore/rule.py51
1 files changed, 48 insertions, 3 deletions
diff --git a/src/hydrorollcore/rule.py b/src/hydrorollcore/rule.py
index a1b07cb9..127ed805 100644
--- a/src/hydrorollcore/rule.py
+++ b/src/hydrorollcore/rule.py
@@ -1,7 +1,8 @@
from abc import ABCMeta, abstractmethod
from enum import Enum
+from .exceptions import HydroError
-__all__ = ["RuleLoadType", "Rule"]
+__all__ = ["RuleLoadType", "Result", "Dice", "Rule"]
class RuleLoadType(Enum):
@@ -13,6 +14,50 @@ class RuleLoadType(Enum):
CLASS = "class"
+class Result(metaclass=ABCMeta):
+ """规则检定结果基类"""
+
+ event: str
+ status: bool
+ exception: HydroError | None = None
+
+ def __init__(self, event: str, status: bool, exception: HydroError | None) -> None:
+ self.event = event
+ self.status = status
+ self.exception = exception
+
+ def ok(self):
+ """规则执行期间是否产生异常"""
+ return isinstance(self.exception, HydroError)
+
+
+class Dice(metaclass=ABCMeta):
+ """掷骰基类"""
+
+ roll_string: str
+ db: str
+ outcome: int
+
+ def __repr__(self) -> str:
+ return f'<HydroDice "{self.db.upper()}">'
+
+ def __str__(self) -> str:
+ return self.db.upper()
+
+ def __int__(self) -> int:
+ return self.outcome
+
+ @abstractmethod
+ def parse(self) -> "Dice":
+ """解析传入的掷骰字符串`roll_string`,返回一个`Dice`对象"""
+ raise NotImplementedError
+
+ @abstractmethod
+ def roll(self) -> int:
+ """掷骰方法,返回掷骰结果"""
+ raise NotImplementedError
+
+
class Rule(metaclass=ABCMeta):
"""规则基类"""
@@ -20,9 +65,9 @@ class Rule(metaclass=ABCMeta):
priority: int = 0
@abstractmethod
- def __init__(self):
+ def __init__(self) -> None:
raise NotImplementedError
@abstractmethod
- async def run(self):
+ def check(self, dice: Dice) -> Result:
raise NotImplementedError