6 个稳定版本
1.2.4 | 2024 年 5 月 31 日 |
---|---|
1.2.2 | 2024 年 5 月 25 日 |
1.1.1 | 2024 年 1 月 23 日 |
#430 在 解析器实现
65 每月下载量
在 appalachia 中使用
79KB
2K SLoC
🎲 Saikoro
Saikoro 是一个库,用于评估与许多桌面角色扮演游戏使用的骰子表示法(Dice Notation)语法相似的骰子投掷。表达式被视为数学表达式,其中 D
或 d
操作符用于投掷骰子,且是优先级高的操作符。它还附带了一个非常简单(令人痛苦)的命令行可执行实现。
代码示例
使用 Saikoro 库的基本示例可能如下所示
fn main() {
if let Ok(roll) = saikoro::evaluate("8d6") {
println!("Fireball deals {} fire damage", roll.value),
}
}
当前实现的功能
- 投掷骰子的操作符(
D
/d
) - 常用的数学操作符
- 加法 & 减法(
+
&-
) - 乘法 & 除法(
*
&/
) - 取模(
%
) - 指数运算(
^
)
- 加法 & 减法(
- 过滤比较操作符,用于条件性地移除骰子投掷(
==
、!=
、<
、>
、<=
、>=
) - 返回并能够单独使用单个投掷操作,而不仅仅是最终总和
- 上述过滤操作符移除的投掷实际上确实从返回的结构中移除,但被标记为已移除且不计入总和。因此,即使投掷被“移除”,您仍然可以看到它
功能标志
stats
- 添加了用于计算投掷骰子的统计信息的函数
语法文档
二进制操作符优先级
列表中位置靠前的元素将在位置靠后的元素之前进行评估
- 骰子
D
/d
- 指数运算
^
- 乘法
*
/
%
- 加法
+
-
一元运算符 +
和 -
已实现,以及一个一元 D
/d
操作符
一元 D
/d
的操作与二元 D
/d
操作相同,左侧为 1
(即 d20
等价于 1d20
)
比较运算符
比较运算符将从左侧掷骰结果中删除不符合运算符隐含的过滤条件的元素。
例如: 5d8 > 5
将导致 5d8
的结果只计算大于 5 的掷骰(例如,如果 5d8
会产生 {1, 3, 4, 5, 8}
),最终的总和将是 13
,因为 1
1
1
将被过滤掉)
D
/d
+ 比较运算符被视为具有最低优先级的三元运算符(即比较运算符将考虑表达式其余部分的整体,除非使用括号)
例如
// this will produce an error variant at parse-time, as the left-hand side is a constant 6
let result = saikoro::evaluate("6 > 3");
assert!(result.is_err());
// this will also produce an error variant at parse-time, as after the addition, the `2d6` is a value, not a roll expression
let maybe_unintuitive = saikoro::evaluate("(2d6 + 5) > 9");
assert!(maybe_unintuitive.is_err());
计划功能
-
H 和-
L 语法用于移除特定掷骰中的最高/最低值- 对 dice rolls 元素应用运算符的方法,而不是简单的总和(语法待定)
- 常见的数学函数(例如
abs
,sin
,max
,log
) - 支持自定义函数定义,以便解析器使用
- 在编译时构建固定表达式的宏
依赖项
~2.7–4.5MB
~77K SLoC