Skip to content

内置脚本语言

本节内容

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

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

变量

你可能注意到,在自定义文案等地方,出现了一些以 $t 开头的东西,这些是海豹中的变量

变量的名称可以是汉字、字母和数字,$t 是一个特殊的变量前缀,还有其它的前缀。不同前缀代表不同的作用域:

变量名字用途举例
普通名字玩家的角色属性理智、力量、智力
$t开头个人临时变量,不存数据库$t随机点数
$m开头个人变量,跨群存在$m今日人品
$g开头群变量,群内所有人共享$g群主体重

所有变量均可以在 .rx / .rxh / .ra/ .text 等指令以及「自定义文案」中使用。

注意:$t 是临时变量

$t 开头的临时变量的存活周期仅为单次指令执行,执行完毕后不应当认为该变量值还保留

在下一次指令中使用上一次指令设置的 $t 变量属于未定义行为,可能会出现包括但不限于变量值不变,变量值丢失,变量值被覆盖,变量值变为随机数,变量值变成 114514 等任何情况。如果你需要这样的持久变量,请使用 $m$g 代替。

内置的 $t 变量的值固定并不代表它们是持久变量,其值是在每次指令执行的初始阶段设置的。

提示:变量不生效?

如果一部分变量无效,请检查海豹是否为最新版本。

一些内置变量

变量名内容示例结果
$t玩家当前人物卡的名字,如果不存在则为群昵称或 QQ 昵称。<木落>
$t玩家_RAW同上,但没有<>木落
$tQQ昵称QQ 昵称<木落>
$t账号ID海豹格式的 IDQQ:123456789
$t账号ID_RAW原始格式的 ID123456789
$tQQ海豹格式的 IDQQ:123456789
$t群名群名海豹核心·SealDice 用户群
$t群号海豹格式的 IDQQ-Group:987654321
$t群号_RAW原始格式的 ID987654321
$t个人骰子面数个人骰子面数100
$tDate数字格式的现日期20230109
$tYear数字格式的年份2023
$tMonth数字格式的现月份1
$tDay数字格式的现日期9
$tWeekday数字格式的星期(1-7)1
$tHour数字格式的现时间(小时)15
$tMinute数字格式的现时间(分钟)41
$tSecond数字格式的现时间(秒)55
$tTimestamp数字格式的 10 位时间戳1673250115
$t文本长度触发消息的文本,汉字长度为 3,英文字母和数字长度为 1。6
$t平台触发的平台QQ
$t游戏模式.set coc/dnd 改变coc7
$t消息类型触发位置为群还是私聊(group/private)group
娱乐:今日人品自定义文案<木落> 的今日人品为 0
常量:APPNAME软件名SealDice
常量:VERSION版本号1.4.0
$tMsgID消息 ID,仅自定义回复中可用。-123

所有自定义文案也均为可用变量。

数据类型和赋值

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
}

// 错误写法
if 1 {
    $t0 = 1;
    $t1 = 2;
}

运算符

数学运算

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 %}