aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/examples/rule_packs/basic_roller.py
blob: b12607cbcf0c0473716973e377b6d25e9a7f5903 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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}"