From 9a7da1ef1b81736a3c72251ec456083d00ed26cd Mon Sep 17 00:00:00 2001 From: HsiangNianian Date: Sat, 2 Aug 2025 11:38:42 +0800 Subject: chore(examples): add rule packs examples --- examples/main.py | 77 +++++++++++++++++++++++++++++++++++++ examples/rule_packs/basic_roller.py | 49 +++++++++++++++++++++++ examples/rule_packs/coc.py | 40 +++++++++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 examples/main.py create mode 100644 examples/rule_packs/basic_roller.py create mode 100644 examples/rule_packs/coc.py diff --git a/examples/main.py b/examples/main.py new file mode 100644 index 00000000..e7dffc1c --- /dev/null +++ b/examples/main.py @@ -0,0 +1,77 @@ +# main.py +import os +import importlib + +# --- 配置区 --- +# 在这里指定你想要加载的规则包文件名 (不含 .py) +# 你可以随时修改这个列表来开启或关闭不同的规则包 +ENABLED_RULE_PACKS = [ + "basic_roller", + "coc", +] + + +class DiceBotCore: + def __init__(self, rule_pack_names): + self.loaded_packs = [] + self.load_rule_packs(rule_pack_names) + + def load_rule_packs(self, rule_pack_names): + """动态加载指定的规则包""" + print("正在加载规则包...") + for name in rule_pack_names: + try: + # 动态导入模块 + module = importlib.import_module(f"rule_packs.{name}") + # 检查模块是否符合我们的结构要求 + if hasattr(module, "handle_command"): + self.loaded_packs.append(module) + print(f" - 规则包 '{name}' 加载成功。") + else: + print( + f" - 警告: 规则包 '{name}'缺少 'handle_command' 函数,已跳过。" + ) + except ImportError: + print(f" - 错误: 找不到名为 '{name}' 的规则包。") + print("-" * 20) + + def process_command(self, command): + """将指令传递给所有加载的规则包""" + for pack in self.loaded_packs: + result = pack.handle_command(command) + if result is not None: + return result # 一旦有规则包处理了指令,就立即返回结果 + return "无法识别的指令。输入 'help' 查看可用指令。" + + def get_all_help(self): + """收集所有已加载规则包的帮助信息""" + help_texts = ["--- 欢迎使用模块化骰子机器人 ---"] + for pack in self.loaded_packs: + if hasattr(pack, "get_help"): + help_texts.append(pack.get_help()) + return "\n".join(help_texts) + + +def main(): + """程序主循环""" + bot = DiceBotCore(ENABLED_RULE_PACKS) + + print("机器人已启动。输入 'exit' 退出。") + print(bot.get_all_help()) # 启动时显示帮助信息 + + while True: + user_input = input("\n> ") + + if user_input.lower() == "exit": + print("感谢使用,再见!") + break + elif user_input.lower() == "help": + print(bot.get_all_help()) + continue + + result = bot.process_command(user_input) + print(result) + + +if __name__ == "__main__": + main() diff --git a/examples/rule_packs/basic_roller.py b/examples/rule_packs/basic_roller.py new file mode 100644 index 00000000..b12607cb --- /dev/null +++ b/examples/rule_packs/basic_roller.py @@ -0,0 +1,49 @@ +import random +import re + + +def get_help(): + """返回此规则包的帮助信息""" + return """ +--- 基础掷骰 (Basic Roller) --- +.r <表达式> : 执行一个掷骰表达式。 + 示例: .r 2d6 + .r d100+10 + .r 1d20-2 +""" + + +def handle_command(command): + """处理基础掷骰指令""" + # 我们规定基础指令以 .r 开头 + if not command.lower().startswith(".r "): + return None # 不是我的指令,我不处理 + + expression = command[3:].strip() # 获取 .r 后面的内容 + + # 清理表达式中的空格 + expression = expression.lower().replace(" ", "") + + # 正则表达式来匹配 XdY+/-Z + match = re.match(r"(\d*)d(\d+)([+-]\d+)?", expression) + if not match: + return f"基础掷骰格式错误: {expression}" + + num_dice_str, num_sides_str, modifier_str = match.groups() + + num_dice = int(num_dice_str) if num_dice_str else 1 + num_sides = int(num_sides_str) + modifier = int(modifier_str) if modifier_str else 0 + + if num_dice <= 0 or num_sides <= 0: + return "骰子数量和面数必须大于0。" + + rolls = [random.randint(1, num_sides) for _ in range(num_dice)] + base_total = sum(rolls) + final_total = base_total + modifier + + roll_details = f"({'+'.join(map(str, rolls))})" + if modifier != 0: + return f"掷骰: {expression} -> {final_total} [{roll_details}{modifier:+}]" + else: + return f"掷骰: {expression} -> {final_total} {roll_details}" diff --git a/examples/rule_packs/coc.py b/examples/rule_packs/coc.py new file mode 100644 index 00000000..28548d03 --- /dev/null +++ b/examples/rule_packs/coc.py @@ -0,0 +1,40 @@ +import random +import re + + +def get_help(): + """返回此规则包的帮助信息""" + return """ +--- 克苏鲁的呼唤 (Call of Cthulhu) --- +.ra <技能值> : 对指定的技能值进行成功/失败检定。 + 示例: .ra 75 +""" + + +def handle_command(command): + """处理COC检定指令""" + command = command.lower().strip() + + # 我们规定COC检定指令以 .ra 开头 + match = re.match(r"^\.ra\s*(\d+)$", command) + if not match: + return None # 不是我的指令,我不处理 + + skill_value = int(match.group(1)) + roll = random.randint(1, 100) + + # 判断结果 + if roll <= 1: + result_text = "大成功 (Critical Success)" + elif roll > 95: # COC 7版规则大失败 + result_text = "大失败 (Fumble)" + elif roll <= skill_value / 5: + result_text = "极难成功 (Extreme Success)" + elif roll <= skill_value / 2: + result_text = "困难成功 (Hard Success)" + elif roll <= skill_value: + result_text = "成功 (Regular Success)" + else: + result_text = "失败 (Failure)" + + return f"COC检定 (目标: {skill_value}) -> 掷骰: {roll} -> {result_text}" -- cgit v1.2.3-70-g09d2