Skip to content

内置脚本语言 ​

本节内容

本节将介绍海豹内置的脚本语言,请善用侧边栏和搜索,按需阅读文档。

为了在很多地方支持实现一些逻辑,但又不至于直接使用学习门槛较高的正式编程语言,海豹提供了一种简单易学的脚本语言,可以称为「海豹语」「豹语」等。

变量 ​

你可能注意到,在自定义文案等地方,出现了一些以 $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.10v1.2.4 起改为按日期、骰子账号和用户 ID 稳定计算35
$t平台当前平台名称全部消息v1.1.0v1.5.0 起 QQ 官方机器人固定为 QQ-officialQQ

时间与群组 ​

变量名内容适用范围首次可用后续调整示例结果
$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.0v1.1.1 起周日从 0 调整为 71
$tHour小时,24 小时制全部消息v1.0.0-stable-15
$tMinute分钟全部消息v1.0.0-stable-41
$tSecond秒全部消息v1.0.0-stable-55
$tTimestamp10 位 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) 对应 $tAcc
常量:APPNAME软件名称全部文案v0.99.10-SealDice
常量:VERSION当前软件版本号全部文案v0.99.10随软件版本自动更新1.4.0
<分类>:<词条>任意自定义文案词条,例如 娱乐:今日人品对应文案上下文随词条提供由配置和扩展决定<木落> 今日人品为35,人品还行吧

具体指令或自定义文案还会在执行时额外写入结果变量,例如 $t结果文本、$t判定值、$t表达式文本。它们只对对应指令/词条有效,不是每次消息都存在;请以该文案编辑界面显示的变量标签和默认文案为准。

数据类型和赋值 ​

text
// 注意,目前并不支持写注释,此为教程中便于展示
// 文本类型
$t0 = '文本'
$t0 = "也是文本"
$t0 = `特殊文本类型,可以插入表达式,例如,玩家的力量数值: {力量}`
$t0 = `另一种插入表达式的写法 {% 力量 %} `

// 数字类型
$t0 = 1

// 布尔类型:没有专门的布尔类型,0 或空字符串被视为 False,非零和非空字符串为 True
$t0 > 1
$t0 >= 1
$t0 == 1
$t0 != 1
$t0 < 1
$t0 <= 1

注意:务必区分 = 与 ==

混淆 = 与 == 是小白常犯的错误之一。前者用于赋值而后者用于比较。当你试图在下文所述的条件算符或条件语句中,比较两个值时,需要使用 ==。

语句 ​

多个语句可以用 ; 分隔,取分隔后的最后一项的值,为整个表达式的值,例如:

text
$t0 = 1;2;3

此时 $t0 的值为 3。

注意:分号的使用

不要在最后一条语句的后面再使用分号,会变得不幸。

text
// 正确写法
if 1 {
    $t0 = 1;
    $t1 = 2 // [!code highlight]
}

// 错误写法
if 1 {
    $t0 = 1;
    $t1 = 2; // [!code error]
}

运算符 ​

数学运算 ​

text
加减乘除余 + - * / %
乘方 ^ ** // 2 ** 3 或 2 ^ 3,即 2 的 3 次方

逻辑运算 ​

text
&& 逻辑与
|| 逻辑或
!  逻辑非

骰子算符 ​

d 常规骰子算符,用法举例 d20 2d20k1 d20 优势。

f 命运骰,随机骰 4 次,每骰结果可能是 -1 0 1,记为 - 0 +。

b 奖励骰 (CoC)。

p 惩罚骰 (CoC)。

c 双十字。

条件算符 ​

条件算符 ? ​

text
灵视 >= 40 ? '如果灵视达到40以上,你就能看到这句话'

可以用这个指令测试,下同:

text
.st 灵视 41
.text {灵视 >= 40 ? '如果灵视达到 40 以上,你就能看到这句话'}

多重条件算符 ? , ​

text
灵视 >= 80 ? '看得很清楚吗?',
灵视 >= 50 ? '不错,再靠近一点……',
灵视 >= 30 ? '仔细听……',
灵视 >= 0 ? '呵,无知之人。'

应用举例,默认的 jrrp

text
{$t玩家} 今日人品为{$t人品},{%
    $t人品 > 95 ? '人品爆表!',
    $t人品 > 80 ? '运气还不错!',
    $t人品 > 50 ? '人品还行吧',
    $t人品 > 10 ? '今天不太行',
    1 ? '流年不利啊!'
%}

三目运算符 ? : ​

text
灵视 >= 40 ? '如果灵视达到 40 以上,你就能看到这句话' : '无知亦是幸运'

条件语句 ​

text
if $t0 > 10 {
    $t1 = "aaa"
} else {
    $t1 = 'bbb'
}

提示:出现格式化错误

如果上面的代码输出「格式化错误」,那是因为你的 $t0 不是数值。字符串当然不能和数值比较大小,所以会报错。

解决方法:.text {$t0=0}

实际测试:

text
.text {% if $t0 > 10 { $t1="aaa"} else { $t1 = 'bbb' }; $t1 %}