内置脚本语言
本节内容
本节将介绍海豹内置的脚本语言,请善用侧边栏和搜索,按需阅读文档。
为了在很多地方支持实现一些逻辑,但又不至于直接使用学习门槛较高的正式编程语言,海豹提供了一种简单易学的脚本语言,可以称为「海豹语」「豹语」等。
变量
你可能注意到,在自定义文案等地方,出现了一些以 $t 开头的东西,这些是海豹中的变量。
变量的名称可以是汉字、字母和数字,$t 是一个特殊的变量前缀,还有其它的前缀。不同前缀代表不同的作用域:
| 变量名字 | 用途 | 举例 |
|---|---|---|
| 普通名字 | 玩家的角色属性 | 理智、力量、智力 |
$t开头 | 个人临时变量,不存数据库 | $t随机点数 |
$m开头 | 个人变量,跨群存在 | $m今日人品 |
$g开头 | 群变量,群内所有人共享 | $g群主体重 |
所有变量均可以在 .rx / .rxh / .ra/ .text 等指令以及「自定义文案」中使用。
注意:$t 是临时变量
$t 开头的临时变量的存活周期仅为单次指令执行,执行完毕后不应当认为该变量值还保留。
在下一次指令中使用上一次指令设置的 $t 变量属于未定义行为,可能会出现包括但不限于变量值不变,变量值丢失,变量值被覆盖,变量值变为随机数,变量值变成 114514 等任何情况。如果你需要这样的持久变量,请使用 $m 或 $g 代替。
内置的 $t 变量的值固定并不代表它们是持久变量,其值是在每次指令执行的初始阶段设置的。
提示:变量不生效?
如果一部分变量无效,请检查海豹是否为最新版本。
内置变量与版本
下表依据 sealdice-core 的提交历史整理。版本列是首次包含该变量的正式发布标签;rc 和 fix 标签也按当时的发布版本记录。除非“适用范围”另有说明,变量在每次消息处理开始时初始化。当前代码中没有比 v1.5.1 更新、尚未打标签的全局内置变量。
示例结果以 QQ 群聊为例:玩家名和 QQ 昵称为“木落”,群组和个人骰子面数均为 100,当前规则模板为 coc7。日期、时间戳和人品值均为示例,实际结果会随运行时环境变化。
用户与骰子
| 变量名 | 内容 | 适用范围 | 首次可用 | 后续调整 | 示例结果 |
|---|---|---|---|---|---|
$t玩家 | 当前人物卡名;默认带尖括号,可由配置关闭 | 全部消息 | v0.99.10 | - | <木落> |
$t玩家_RAW | 当前人物卡名,不带尖括号 | 全部消息 | v1.0.0-rc0 | - | 木落 |
$tQQ昵称 | 触发者昵称,带尖括号 | 全部消息 | v0.99.10 | - | <木落> |
$t帐号昵称 | $tQQ昵称 的旧式写法 | 全部消息 | v0.99.13 | - | <木落> |
$t账号昵称 | $tQQ昵称 的简体别名 | 全部消息 | v1.1.0 | - | <木落> |
$t帐号ID | 触发者的海豹格式 ID | 全部消息 | v0.99.14.fix2 | - | QQ:123456789 |
$t账号ID | $t帐号ID 的简体别名 | 全部消息 | v1.1.0 | - | QQ:123456789 |
$t帐号ID_RAW | 触发者 ID 的原始部分 | 全部消息 | v0.99.14.fix3 | - | 123456789 |
$t账号ID_RAW | $t帐号ID_RAW 的简体别名 | 全部消息 | v1.1.0 | - | 123456789 |
$tQQ | 触发者的海豹格式 ID | 全部消息 | v0.99.10 | 历史兼容名称 | QQ:123456789 |
$t骰子帐号 | 当前骰子账号的海豹格式 ID | 全部消息 | v0.99.10 | - | QQ:123456789 |
$t骰子账号 | $t骰子帐号 的简体别名 | 全部消息 | v1.1.0 | - | QQ:123456789 |
$t骰子昵称 | 当前骰子的昵称 | 全部消息 | v0.99.10 | - | 海豹核心 |
$t人品 | 当日人品值,范围为 1 到 100 | 全部消息 | v0.99.10 | v1.2.4 起改为按日期、骰子账号和用户 ID 稳定计算 | 35 |
$t平台 | 当前平台名称 | 全部消息 | v1.1.0 | v1.5.0 起 QQ 官方机器人固定为 QQ-official | QQ |
时间与群组
| 变量名 | 内容 | 适用范围 | 首次可用 | 后续调整 | 示例结果 |
|---|---|---|---|---|---|
$tDate | 数字日期,格式 YYYYMMDD | 全部消息 | v1.0.0-stable | - | 20230109 |
$tYear | 四位年份 | 全部消息 | v1.0.0-stable | - | 2023 |
$tMonth | 月份 | 全部消息 | v1.0.0-stable | - | 1 |
$tDay | 日期中的日 | 全部消息 | v1.0.0-rc0 | - | 9 |
$tWeekday | 星期,周一为 1、周日为 7 | 全部消息 | v1.1.0 | v1.1.1 起周日从 0 调整为 7 | 1 |
$tHour | 小时,24 小时制 | 全部消息 | v1.0.0-stable | - | 15 |
$tMinute | 分钟 | 全部消息 | v1.0.0-stable | - | 41 |
$tSecond | 秒 | 全部消息 | v1.0.0-stable | - | 55 |
$tTimestamp | 10 位 Unix 时间戳 | 全部消息 | v1.0.0-stable | - | 1673250115 |
$t群名 | 当前群名称 | 群消息 | v0.99.10 | - | 海豹核心·SealDice 用户群 |
$t群号 | 当前群的海豹格式 ID | 群消息 | v0.99.10 | - | QQ-Group:987654321 |
$t群号_RAW | 当前群 ID 的原始部分 | 群消息 | v0.99.14.fix3 | - | 987654321 |
$t群组骰子面数 | 群组默认骰子面数 | 群消息 | v0.99.10 | - | 100 |
$t个人骰子面数 | 触发者设置的个人骰子面数 | 全部消息 | v0.99.10 | - | 100 |
$t当前骰子面数 | 本次掷骰实际采用的默认面数 | 群消息 | v0.99.10 | - | 100 |
$t游戏模式 | 群当前规则模板名称,例如 coc7 | 群消息 | v1.1.0 | - | coc7 |
$t规则模板 | $t游戏模式 的明确名称 | 群消息 | v1.2.5 | - | coc7 |
$tSystem | $t游戏模式 的英文兼容名称 | 群消息 | v1.2.5 | - | coc7 |
$t当前记录 | 当前正在记录的日志名称;没有时为空字符串 | 群消息 | v0.99.10 | - | 追书人 |
$t日志开启 | 日志是否开启,0 为关闭、1 为开启;私聊视为 0 | 群消息 | v1.5.0 | - | 0 |
$t权限等级 | 触发者的权限等级 | 群消息 | v1.5.0 | - | 100 |
消息、自定义回复与常量
| 变量名 | 内容 | 适用范围 | 首次可用 | 后续调整 | 示例结果 |
|---|---|---|---|---|---|
$t消息类型 | 消息位置:group 或 private | 全部消息 | v1.1.1 | - | group |
$tMsgID | 原始消息 ID | 自定义回复 | v0.99.14.fix3 | - | -123 |
$t文本长度 | 触发消息的字节长度;汉字通常为 3,英文字母和数字为 1 | 自定义回复 | v1.0.0-stable | - | 6 |
$t轮数 | 带轮数执行时的执行轮数 | 指令与自定义文案上下文 | v1.1.0 | - | 3 |
$t0 | 正则自定义回复匹配到的完整文本 | 正则自定义回复 | v0.99.14.fix3 | - | 购买猫粮 |
$t1、$t2、... | 正则自定义回复的第 1、2、... 个捕获组 | 正则自定义回复 | v0.99.14.fix3 | 捕获组数量决定实际可用变量 | 猫粮 |
$t<捕获组名> | 命名正则捕获组的匹配文本 | 正则自定义回复 | v0.99.14.fix3 | 例如 (?P<A>cc) 对应 $tA | cc |
常量:APPNAME | 软件名称 | 全部文案 | v0.99.10 | - | SealDice |
常量:VERSION | 当前软件版本号 | 全部文案 | v0.99.10 | 随软件版本自动更新 | 1.4.0 |
<分类>:<词条> | 任意自定义文案词条,例如 娱乐:今日人品 | 对应文案上下文 | 随词条提供 | 由配置和扩展决定 | <木落> 今日人品为35,人品还行吧 |
具体指令或自定义文案还会在执行时额外写入结果变量,例如 $t结果文本、$t判定值、$t表达式文本。它们只对对应指令/词条有效,不是每次消息都存在;请以该文案编辑界面显示的变量标签和默认文案为准。
数据类型和赋值
// 注意,目前并不支持写注释,此为教程中便于展示
// 文本类型
$t0 = '文本'
$t0 = "也是文本"
$t0 = `特殊文本类型,可以插入表达式,例如,玩家的力量数值: {力量}`
$t0 = `另一种插入表达式的写法 {% 力量 %} `
// 数字类型
$t0 = 1
// 布尔类型:没有专门的布尔类型,0 或空字符串被视为 False,非零和非空字符串为 True
$t0 > 1
$t0 >= 1
$t0 == 1
$t0 != 1
$t0 < 1
$t0 <= 1注意:务必区分 = 与 ==
混淆 = 与 == 是小白常犯的错误之一。前者用于赋值而后者用于比较。当你试图在下文所述的条件算符或条件语句中,比较两个值时,需要使用 ==。
语句
多个语句可以用 ; 分隔,取分隔后的最后一项的值,为整个表达式的值,例如:
$t0 = 1;2;3此时 $t0 的值为 3。
注意:分号的使用
不要在最后一条语句的后面再使用分号,会变得不幸。
// 正确写法
if 1 {
$t0 = 1;
$t1 = 2 // [!code highlight]
}
// 错误写法
if 1 {
$t0 = 1;
$t1 = 2; // [!code error]
}运算符
数学运算
加减乘除余 + - * / %
乘方 ^ ** // 2 ** 3 或 2 ^ 3,即 2 的 3 次方逻辑运算
&& 逻辑与
|| 逻辑或
! 逻辑非骰子算符
d 常规骰子算符,用法举例 d20 2d20k1 d20 优势。
f 命运骰,随机骰 4 次,每骰结果可能是 -1 0 1,记为 - 0 +。
b 奖励骰 (CoC)。
p 惩罚骰 (CoC)。
c 双十字。
条件算符
条件算符 ?
灵视 >= 40 ? '如果灵视达到40以上,你就能看到这句话'可以用这个指令测试,下同:
.st 灵视 41
.text {灵视 >= 40 ? '如果灵视达到 40 以上,你就能看到这句话'}多重条件算符 ? ,
灵视 >= 80 ? '看得很清楚吗?',
灵视 >= 50 ? '不错,再靠近一点……',
灵视 >= 30 ? '仔细听……',
灵视 >= 0 ? '呵,无知之人。'应用举例,默认的 jrrp
{$t玩家} 今日人品为{$t人品},{%
$t人品 > 95 ? '人品爆表!',
$t人品 > 80 ? '运气还不错!',
$t人品 > 50 ? '人品还行吧',
$t人品 > 10 ? '今天不太行',
1 ? '流年不利啊!'
%}三目运算符 ? :
灵视 >= 40 ? '如果灵视达到 40 以上,你就能看到这句话' : '无知亦是幸运'条件语句
if $t0 > 10 {
$t1 = "aaa"
} else {
$t1 = 'bbb'
}提示:出现格式化错误
如果上面的代码输出「格式化错误」,那是因为你的 $t0 不是数值。字符串当然不能和数值比较大小,所以会报错。
解决方法:.text {$t0=0}
实际测试:
.text {% if $t0 > 10 { $t1="aaa"} else { $t1 = 'bbb' }; $t1 %}