内置脚本语言
本节内容
本节将介绍海豹内置的脚本语言,请善用侧边栏和搜索,按需阅读文档。
为了在很多地方支持实现一些逻辑,但又不至于直接使用学习门槛较高的正式编程语言,海豹提供了一种简单易学的脚本语言,可以称为「海豹语」「豹语」等。
变量
你可能注意到,在自定义文案等地方,出现了一些以 $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 | 海豹格式的 ID | QQ:123456789 |
$t账号ID_RAW | 原始格式的 ID | 123456789 |
$tQQ | 海豹格式的 ID | QQ:123456789 |
$t群名 | 群名 | 海豹核心·SealDice 用户群 |
$t群号 | 海豹格式的 ID | QQ-Group:987654321 |
$t群号_RAW | 原始格式的 ID | 987654321 |
$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平台 | 触发的平台 | |
$t游戏模式 | 随 .set coc/dnd 改变 | coc7 |
$t消息类型 | 触发位置为群还是私聊(group/private) | group |
娱乐:今日人品 | 自定义文案 | <木落> 的今日人品为 0 |
常量:APPNAME | 软件名 | SealDice |
常量:VERSION | 版本号 | 1.4.0 |
$tMsgID | 消息 ID,仅自定义回复中可用。 | -123 |
所有自定义文案也均为可用变量。
数据类型和赋值
// 注意,目前并不支持写注释,此为教程中便于展示
// 文本类型
$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
}
// 错误写法
if 1 {
$t0 = 1;
$t1 = 2;
}
运算符
数学运算
加减乘除余 + - * / %
乘方 ^ ** // 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 %}