aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorHsiangNianian <i@jyunko.cn>2025-08-02 11:38:42 +0800
committerHsiangNianian <i@jyunko.cn>2025-08-02 11:38:42 +0800
commit9a7da1ef1b81736a3c72251ec456083d00ed26cd (patch)
treebc35c9a7be1a776dcf98c231d377faa6d3519349
parent138d4b0b0a873d853ff684690088f34f94ac9cb8 (diff)
downloadinfini-9a7da1ef1b81736a3c72251ec456083d00ed26cd.tar.gz
infini-9a7da1ef1b81736a3c72251ec456083d00ed26cd.zip
chore(examples): add rule packs examples
-rw-r--r--examples/main.py77
-rw-r--r--examples/rule_packs/basic_roller.py49
-rw-r--r--examples/rule_packs/coc.py40
3 files changed, 166 insertions, 0 deletions
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}"