海豹骰插件↓
// ==UserScript==
// @name 士气系统(星尘的DND房规
// @author 星尘
// @version 1.0.0
// @description 士气系统,默认士气为0-20,可用指令如下\n .bp setmax < 整数 > 设置最大士气\n .bp set < 整数 > 直接设定士气\n .bp < 变化 >(如 + 1、-1) 士气变化.bp re 重置士气 .bp 查看当前士气
// @timestamp 1710647207
// 2024-03-17
// @license Apache-2
// @homepageURL https://github.com/sealdice/javascript
// ==/UserScript==
// 编写一条自定义指令
// 先将扩展模块创建出来,如果已创建就直接使用
let ext = seal.ext.find('士气');
if (!ext) {
ext = seal.ext.new('士气', '星尘', '1.0.0');
seal.ext.register(ext);
}
// 创建指令 .seal
// 这个命令的功能为,显示「抓到一只海豹」的文案;
// 如果命令写 .seal ABC,那么文案中将海豹命名为「ABC」;
// 如果命令中没写名字,那么命名为默认值「氪豹」。
const cmdBp = seal.ext.newCmdItemInfo();
cmdBp.name = 'bp'; // 指令名字,可用中文
cmdBp.help = `士气系统,默认士气为0-20,可用指令如下\n
.bp setmax <整数> 设置最大士气\n
.bp set <整数> 直接设定士气\n
.bp <变化>(如+1、-1) 士气变化
.bp re 重置士气\n
.bp help 查看帮助\n
.bp 查看当前士气`;
let bpMin = 0;
let bp = 10;
let bpMax = 20;
let bpMedian = 10;
let bpMaxConfigMap = new Map();
let bpDataMap = new Map();
let bpMedianMap = new Map();
/* 士气值打印函数,参数为当前士气与最大士气,返回值为美观的士气值字符串 ,例如 (Min<===|========>Max)*/
function printBP(bp, bpMax) {
let bpStr = '\(Min<';
for (let i = bpMin; i < bp - 1; i = i + 2) {
bpStr += '=';
}
bpStr += '|';
for (let i = bp; i < bpMax; i = i + 2) {
bpStr += '=';
}
bpStr += '>Max\)';
return bpStr;
}
// 主函数,指令解析器会将指令信息解析,并储存在几个参数中
// ctx 主要是和当前环境以及用户相关的内容,如当前发指令用户,当前群组信息等
// msg 为原生态的指令内容,如指令文本,发送平台,发送时间等
// cmdArgs 为指令信息,会将用户发的信息进行分段,方便快速取用
cmdBp.solve = (ctx, msg, cmdArgs) => {
// 获取第一个参数,例如 .seal A B C
// 这里 cmdArgs.getArgN(1) 的结果即是 A,传参为 2 的话结果是 B
let val = cmdArgs.getArgN(1);
switch (val) {
case 'help': {
// 命令为 .seal help
// 创建一个结果对象,并将 showHelp 标记为 true,这会自动给用户发送帮助
const ret = seal.ext.newCmdExecuteResult(true);
ret.showHelp = true;
return ret;
}
case 'setmax': {
// 检测该群组是否已设置最大士气值,没有则初始化
if (!(bpMaxConfigMap.has(ctx.group.groupId)) && !(bpDataMap.has(ctx.group.groupId))) {
bpMaxConfigMap.set(ctx.group.groupId, 20);
bpDataMap.set(ctx.group.groupId, 10);
bpMedianMap.set(ctx.group.groupId, 10);
}
bpMax = parseInt(cmdArgs.getArgN(2));
bpMedian = Math.round(bpMax / 2);
bpMaxConfigMap.set(ctx.group.groupId, bpMax);
bpMedianMap.set(ctx.group.groupId, bpMedian);
bpDataMap.set(ctx.group.groupId, bpMedian);
seal.replyToSender(ctx, msg, `\(最大士气值已设置为${bpMax}\)`);
return seal.ext.newCmdExecuteResult(true);
}
case 'maxset': {
// 检测该群组是否已设置最大士气值,没有则初始化
if (!(bpMaxConfigMap.has(ctx.group.groupId)) && !(bpDataMap.has(ctx.group.groupId))) {
bpMaxConfigMap.set(ctx.group.groupId, 20);
bpDataMap.set(ctx.group.groupId, 10);
bpMedianMap.set(ctx.group.groupId, 10);
}
bpMax = parseInt(cmdArgs.getArgN(2));
bpMaxConfigMap.set(ctx.group.groupId, bpMax);
bpMedianMap.set(ctx.group.groupId, Math.round(bpMax / 2));
seal.replyToSender(ctx, msg, `\(最大士气值已设置为${bpMax}\)`);
return seal.ext.newCmdExecuteResult(true);
}
case 'set': {
if (!(bpMaxConfigMap.has(ctx.group.groupId)) && !(bpDataMap.has(ctx.group.groupId))) {
bpMaxConfigMap.set(ctx.group.groupId, 20);
bpDataMap.set(ctx.group.groupId, 10);
bpMedianMap.set(ctx.group.groupId, 10);
}
bpMax = bpMaxConfigMap.get(ctx.group.groupId);
bp = parseInt(cmdArgs.getArgN(2));
if (bp > bpMax || bp < 0) {
seal.replyToSender(ctx, msg, `超出解限或为负数,最大士气为${bpMax}`);
return seal.ext.newCmdExecuteResult(true);
}
bpDataMap.set(ctx.group.groupId, bp);
seal.replyToSender(ctx, msg, printBP(bp, bpMax) + `\n\(士气值变化至${bp}\)`);
if (parseInt(bp) === parseInt(bpMax)) {
seal.replyToSender(ctx, msg, `(士气已经上升至最大!)`);
}
return seal.ext.newCmdExecuteResult(true);
}
case 're': {
if (!(bpMaxConfigMap.has(ctx.group.groupId)) && !(bpDataMap.has(ctx.group.groupId))) {
bpMaxConfigMap.set(ctx.group.groupId, 20);
bpDataMap.set(ctx.group.groupId, 10);
bpMedianMap.set(ctx.group.groupId, 10);
}
bpMax = bpMaxConfigMap.get(ctx.group.groupId);
bp = bpMedianMap.get(ctx.group.groupId);
bpDataMap.set(ctx.group.groupId, bp);
seal.replyToSender(ctx, msg, printBP(bp, bpMax) + `\n\(士气值已重置\)`);
return seal.ext.newCmdExecuteResult(true);
}
default: {
if (!(bpMaxConfigMap.has(ctx.group.groupId)) && !(bpDataMap.has(ctx.group.groupId))) {
bpMaxConfigMap.set(ctx.group.groupId, 20);
bpDataMap.set(ctx.group.groupId, 10);
bpMedianMap.set(ctx.group.groupId, 10);
}
bp = bpDataMap.get(ctx.group.groupId);
bpMax = bpMaxConfigMap.get(ctx.group.groupId);
// 如果是类似于-1 +1 *2 /2 这样的算式,就对bp的数值进行计算
if (val.match(/^[\+\-\*\/]\d+$/)) {
let op = val.charAt(0);
let num = parseInt(val.substring(1));
switch (op) {
case '+':
bp += num;
if (bp > bpMax) bp = bpMax;
break;
case '-':
bp -= num;
if (bp < 0) bp = 0;
break;
case '*':
bp *= num;
if (bp > bpMax) bp = bpMax;
break;
case '/':
bp /= num;
bp = Math.round(bp);
break;
}
bpDataMap.set(ctx.group.groupId, bp);
seal.replyToSender(ctx, msg, printBP(bp, bpMax) + `\n\(士气值${op}${num},变化至${bp}\)`);
if (parseInt(bp) === parseInt(bpMax)) {
seal.replyToSender(ctx, msg, `(士气已经上升至最大!)`);
return seal.ext.newCmdExecuteResult(true);
}
return seal.ext.newCmdExecuteResult(true);
}
// 如果为空则直接打印士气值
if (val === '') {
seal.replyToSender(ctx, msg, printBP(bp, bpMax) + `\n\(当前士气值为${bp}\)`);
return seal.ext.newCmdExecuteResult(true);
}
// 命令为 .seal XXXX,取第一个参数为名字
// if (!val) val = '氪豹';
// // 进行回复,如果是群聊发送那么在群里回复,私聊发送则在私聊回复 (听起来是废话文学,但详细区别见暗骰例子)
// seal.replyToSender(ctx, msg, `你抓到一只海豹!取名为${val}\n它的逃跑意愿为${Math.ceil(Math.random() * 100)}`);
// return seal.ext.newCmdExecuteResult(true);
}
}
};
// 将命令注册到扩展中
ext.cmdMap['bp'] = cmdBp;