From 662faed987adf3caded8b80f5cf7787038f92054 Mon Sep 17 00:00:00 2001 From: ZinGer_KyoN Date: Mon, 19 May 2025 16:49:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BA=8C=E5=85=83?= =?UTF-8?q?=E9=AA=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...03\351\252\260\346\217\222\344\273\266.js" | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 "scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" diff --git "a/scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" "b/scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" new file mode 100644 index 0000000..c90974e --- /dev/null +++ "b/scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" @@ -0,0 +1,156 @@ +// ==UserScript== +// @name DualityDice +// @author RO/zac +// @version 1.6.0 +// @description Daggerheart二元骰专用模式 使用方法:.dd adv/dis(优劣势) +调整值,如.dd adv +4。设置两枚十二面骰子,分别命名为hope和fear,同时掷出,将所得数值相加,结果为value。然后对比hope和fear的大小,若hope大于fear,输出value with hope;若fear大于hope,输出value with fear,若hope等于fear,输出critical success +// @timestamp 1671368035 +// @license Apache-2 +// @homepageURL https://github.com/sealdice/javascript +// ==/UserScript== + +// 编写一条自定义指令 +// 先将扩展模块创建出来,如果已创建就直接使用 +let ext = seal.ext.find('test'); +if (!ext) { + ext = seal.ext.new('test', 'twoDice', '1.6.0'); + seal.ext.register(ext); +} + +//设置两枚十二面骰子,分别命名为hope和fear,同时掷出,将所得数值相加,结果为value。 +// 然后对比hope和fear的大小,若hope大于fear,输出value with hope; +// 若fear大于hope,输出value with fear,若hope等于fear,输出critical success + +// 创建指令 .seal +// 这个命令的功能为,显示"抓到一只海豹的文案" +// 如果命令写".seal ABC",那么文案中将海豹命名为"ABC" +// 如果命令中没写名字,那么命名为默认值"氪豹" +const cmdSeal = seal.ext.newCmdItemInfo(); +cmdSeal.name = 'dd'; // 指令名字,可用中文 +cmdSeal.help = 'Daggerheart二元骰专用模式\n' + + '基础用法:.dd [adv/dis] [固定调整值:+/-N] [随机调整值:+/-XdY]\n' + + '多个优/劣势骰取高:.dd adv2/dis2 (数字表示骰子数量)\n' + + '优劣势可简写:优势:[adv/a/优势/优] 劣势:[dis/d/劣势/劣]\n' + + '组合使用可以任意顺序:.dd 1d6 a3 +4\n'; +// 主函数,指令解析器会将指令信息解析,并储存在几个参数中 +// ctx 主要是和当前环境以及用户相关的内容,如当前发指令用户,当前群组信息等 +// msg 为原生态的指令内容,如指令文本,发送平台,发送时间等 +// cmdArgs 为指令信息,会将用户发的信息进行分段,方便快速取用 +cmdSeal.solve = (ctx, msg, cmdArgs) => { + // 获取所有参数 + let args = cmdArgs.args; + + if (args.length === 1 && args[0].toLowerCase() === 'help') { + const ret = seal.ext.newCmdExecuteResult(true); + ret.showHelp = true; + return ret; + } + + function randomNum(minNum, maxNum) { + switch (arguments.length) { + case 1: + return parseInt(Math.random() * minNum + 1, 10); + break; + case 2: + return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10); + break; + default: + return 0; + break; + } + } + + let hope = randomNum(1,12); + let fear = randomNum(1,12); + let value = hope + fear; + let adv_dis = 0; + let modifier = 0; + let diceResults = []; // 用于存储所有随机骰子的结果 + let advDisResult = ''; // 用于存储优劣势骰的结果 + + // 定义优势/劣势的同义词列表 + const advantageKeywords = ['adv', 'a', '优势', '优']; + const disadvantageKeywords = ['dis', 'd', '劣势', '劣']; + + // 解析参数 + for (let arg of args) { + arg = arg.toLowerCase(); + // 检查是否是带数字的优势/劣势 + let advMatch = arg.match(/^(adv|a|优势|优)(\d+)$/); + let disMatch = arg.match(/^(dis|d|劣势|劣)(\d+)$/); + + if (advMatch) { + let numDice = parseInt(advMatch[2]); + let rolls = []; + for (let i = 0; i < numDice; i++) { + rolls.push(randomNum(1,6)); + } + adv_dis = Math.max(...rolls); + advDisResult = `优势骰${numDice}个: [${rolls.join(', ')}] 取最高:${adv_dis}`; + } else if (disMatch) { + let numDice = parseInt(disMatch[2]); + let rolls = []; + for (let i = 0; i < numDice; i++) { + rolls.push(randomNum(1,6)); + } + adv_dis = -1 * Math.max(...rolls); + advDisResult = `劣势骰${numDice}个: [${rolls.join(', ')}] 取最高:${-adv_dis}`; + } else if (advantageKeywords.includes(arg)) { + let roll = randomNum(1,6); + adv_dis = roll; + advDisResult = `优势骰: ${roll}`; + } else if (disadvantageKeywords.includes(arg)) { + let roll = randomNum(1,6); + adv_dis = -1 * roll; + advDisResult = `劣势骰: ${roll}`; + } else { + // 尝试解析为数字或随机值表达式 + let sign = 1; + if (arg.startsWith('+')) { + arg = arg.substring(1); // 移除加号 + } else if (arg.startsWith('-')) { + sign = -1; + arg = arg.substring(1); // 移除减号 + } + // 检查是否是随机值表达式 (如 1d6) + let diceMatch = arg.match(/^(\d+)d(\d+)$/); + if (diceMatch) { + let numDice = parseInt(diceMatch[1]); + let diceSize = parseInt(diceMatch[2]); + let rolls = []; + let sum = 0; + for (let i = 0; i < numDice; i++) { + let roll = randomNum(1, diceSize); + rolls.push(roll); + sum += roll; + } + modifier += sign * sum; + diceResults.push(`${sign === 1 ? '+' : '-'}${numDice}d${diceSize}: [${rolls.join(', ')}]`); + } else { + // 如果不是随机值表达式,尝试解析为普通数字 + let num = parseInt(arg); + if (!isNaN(num)) { + modifier += sign * num; + } + } + } + } + + value = value + adv_dis + modifier; + let ctxname = ctx.player.name; + + // 构建骰子结果字符串 + let diceResultStr = diceResults.length > 0 ? '\n 调整值结果: ' + diceResults.join(' ') : ''; + + if(hope > fear){ + seal.replyToSender(ctx, msg, `Alea iacta est【${ctxname} 】已掷下骰子... \n 希望骰:${hope} 恐惧骰:${fear} ${advDisResult} 调整值:${modifier}${diceResultStr} \n 骰值总和:${value} 希望尚存...`); + } + else if(hope < fear){ + seal.replyToSender(ctx, msg, `Alea iacta est【${ctxname}】 已掷下骰子... \n 希望骰:${hope} 恐惧骰:${fear} ${advDisResult} 调整值:${modifier}${diceResultStr} \n 骰值总和:${value} 直面恐惧...`); + } + else{ + seal.replyToSender(ctx, msg, `Alea iacta est【${ctxname} 】已掷下骰子... \n 希望骰:${hope} 恐惧骰:${fear} ${advDisResult} 调整值:${modifier}${diceResultStr} \n 骰值总和:${value} 关键成功,逆天改命!` ); + } + return seal.ext.newCmdExecuteResult(true); +}; +// 将命令注册到扩展中 +ext.cmdMap['dd'] = cmdSeal; From 86614fb62d118189dd8b829d1b74586fa78cdc4e Mon Sep 17 00:00:00 2001 From: ZinGer_KyoN Date: Fri, 27 Jun 2025 23:11:00 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Update=20daggerheart=20=E4=BA=8C=E5=85=83?= =?UTF-8?q?=E9=AA=B0=E6=8F=92=E4=BB=B6.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...03\351\252\260\346\217\222\344\273\266.js" | 311 ++++++++++-------- 1 file changed, 171 insertions(+), 140 deletions(-) diff --git "a/scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" "b/scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" index c90974e..7b1fbd9 100644 --- "a/scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" +++ "b/scripts/\346\241\214\346\270\270\350\247\204\345\210\231/daggerheart \344\272\214\345\205\203\351\252\260\346\217\222\344\273\266.js" @@ -1,156 +1,187 @@ // ==UserScript== // @name DualityDice // @author RO/zac -// @version 1.6.0 +// @version 1.8.0 // @description Daggerheart二元骰专用模式 使用方法:.dd adv/dis(优劣势) +调整值,如.dd adv +4。设置两枚十二面骰子,分别命名为hope和fear,同时掷出,将所得数值相加,结果为value。然后对比hope和fear的大小,若hope大于fear,输出value with hope;若fear大于hope,输出value with fear,若hope等于fear,输出critical success // @timestamp 1671368035 +// 2025-05-05 // @license Apache-2 // @homepageURL https://github.com/sealdice/javascript // ==/UserScript== - -// 编写一条自定义指令 -// 先将扩展模块创建出来,如果已创建就直接使用 -let ext = seal.ext.find('test'); -if (!ext) { - ext = seal.ext.new('test', 'twoDice', '1.6.0'); - seal.ext.register(ext); -} - -//设置两枚十二面骰子,分别命名为hope和fear,同时掷出,将所得数值相加,结果为value。 -// 然后对比hope和fear的大小,若hope大于fear,输出value with hope; -// 若fear大于hope,输出value with fear,若hope等于fear,输出critical success - -// 创建指令 .seal -// 这个命令的功能为,显示"抓到一只海豹的文案" -// 如果命令写".seal ABC",那么文案中将海豹命名为"ABC" -// 如果命令中没写名字,那么命名为默认值"氪豹" -const cmdSeal = seal.ext.newCmdItemInfo(); -cmdSeal.name = 'dd'; // 指令名字,可用中文 -cmdSeal.help = 'Daggerheart二元骰专用模式\n' + - '基础用法:.dd [adv/dis] [固定调整值:+/-N] [随机调整值:+/-XdY]\n' + - '多个优/劣势骰取高:.dd adv2/dis2 (数字表示骰子数量)\n' + - '优劣势可简写:优势:[adv/a/优势/优] 劣势:[dis/d/劣势/劣]\n' + - '组合使用可以任意顺序:.dd 1d6 a3 +4\n'; -// 主函数,指令解析器会将指令信息解析,并储存在几个参数中 -// ctx 主要是和当前环境以及用户相关的内容,如当前发指令用户,当前群组信息等 -// msg 为原生态的指令内容,如指令文本,发送平台,发送时间等 -// cmdArgs 为指令信息,会将用户发的信息进行分段,方便快速取用 -cmdSeal.solve = (ctx, msg, cmdArgs) => { - // 获取所有参数 - let args = cmdArgs.args; - - if (args.length === 1 && args[0].toLowerCase() === 'help') { - const ret = seal.ext.newCmdExecuteResult(true); - ret.showHelp = true; - return ret; - } - - function randomNum(minNum, maxNum) { - switch (arguments.length) { - case 1: - return parseInt(Math.random() * minNum + 1, 10); - break; - case 2: - return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10); - break; - default: - return 0; - break; - } +(() => { + // src/dice-logic.ts + function randomNum(minNum, maxNum) { + if (maxNum === void 0) { + maxNum = minNum; + minNum = 1; } - - let hope = randomNum(1,12); - let fear = randomNum(1,12); - let value = hope + fear; + return Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum; + } + function parseArgsAndRoll(args, userName) { + let hope = randomNum(12); + let fear = randomNum(12); let adv_dis = 0; let modifier = 0; - let diceResults = []; // 用于存储所有随机骰子的结果 - let advDisResult = ''; // 用于存储优劣势骰的结果 - - // 定义优势/劣势的同义词列表 - const advantageKeywords = ['adv', 'a', '优势', '优']; - const disadvantageKeywords = ['dis', 'd', '劣势', '劣']; - - // 解析参数 - for (let arg of args) { - arg = arg.toLowerCase(); - // 检查是否是带数字的优势/劣势 - let advMatch = arg.match(/^(adv|a|优势|优)(\d+)$/); - let disMatch = arg.match(/^(dis|d|劣势|劣)(\d+)$/); - - if (advMatch) { - let numDice = parseInt(advMatch[2]); - let rolls = []; - for (let i = 0; i < numDice; i++) { - rolls.push(randomNum(1,6)); - } - adv_dis = Math.max(...rolls); - advDisResult = `优势骰${numDice}个: [${rolls.join(', ')}] 取最高:${adv_dis}`; - } else if (disMatch) { - let numDice = parseInt(disMatch[2]); - let rolls = []; - for (let i = 0; i < numDice; i++) { - rolls.push(randomNum(1,6)); - } - adv_dis = -1 * Math.max(...rolls); - advDisResult = `劣势骰${numDice}个: [${rolls.join(', ')}] 取最高:${-adv_dis}`; - } else if (advantageKeywords.includes(arg)) { - let roll = randomNum(1,6); - adv_dis = roll; - advDisResult = `优势骰: ${roll}`; - } else if (disadvantageKeywords.includes(arg)) { - let roll = randomNum(1,6); - adv_dis = -1 * roll; - advDisResult = `劣势骰: ${roll}`; - } else { - // 尝试解析为数字或随机值表达式 - let sign = 1; - if (arg.startsWith('+')) { - arg = arg.substring(1); // 移除加号 - } else if (arg.startsWith('-')) { - sign = -1; - arg = arg.substring(1); // 移除减号 - } - // 检查是否是随机值表达式 (如 1d6) - let diceMatch = arg.match(/^(\d+)d(\d+)$/); - if (diceMatch) { - let numDice = parseInt(diceMatch[1]); - let diceSize = parseInt(diceMatch[2]); - let rolls = []; - let sum = 0; - for (let i = 0; i < numDice; i++) { - let roll = randomNum(1, diceSize); - rolls.push(roll); - sum += roll; - } - modifier += sign * sum; - diceResults.push(`${sign === 1 ? '+' : '-'}${numDice}d${diceSize}: [${rolls.join(', ')}]`); - } else { - // 如果不是随机值表达式,尝试解析为普通数字 - let num = parseInt(arg); - if (!isNaN(num)) { - modifier += sign * num; - } - } + let diceResults = []; + let advDisResult = ""; + let dc = null; + const filteredArgs = args.filter((arg) => { + const dcMatch = arg.match(/^\[(\d+)\]$/); + if (dcMatch) { + dc = parseInt(dcMatch[1], 10); + return false; + } + return true; + }); + const mathArgs = []; + const remainingArgs = filteredArgs.filter((arg) => { + arg = arg.toLowerCase(); + const advMatch = arg.match(/^(adv|优势|优)(\d*)$/); + const disMatch = arg.match(/^(dis|劣势|劣)(\d*)$/); + if (advMatch) { + const numDiceStr = advMatch[2] || "1"; + const numDice = parseInt(numDiceStr); + const rolls = []; + for (let i = 0; i < numDice; i++) { + rolls.push(randomNum(6)); + } + adv_dis = Math.max(...rolls); + advDisResult = `优势骰${numDice}个: [${rolls.join(", ")}] 取最高:${adv_dis}`; + return false; + } else if (disMatch) { + const numDiceStr = disMatch[2] || "1"; + const numDice = parseInt(numDiceStr); + const rolls = []; + for (let i = 0; i < numDice; i++) { + rolls.push(randomNum(6)); + } + adv_dis = -1 * Math.max(...rolls); + advDisResult = `劣势骰${numDice}个: [${rolls.join(", ")}] 取最高:${-adv_dis}`; + return false; + } + mathArgs.push(arg); + return true; + }); + const mathExpression = mathArgs.join("").toLowerCase(); + const regex = /([+-])?(\d*d\d+|\d+)/g; + let match; + while ((match = regex.exec(mathExpression)) !== null) { + const sign = match[1] === "-" ? -1 : 1; + let term = match[2]; + if (term.startsWith("d")) { + term = "1" + term; + } + const diceMatch = term.match(/^(\d+)d(\d+)$/); + if (diceMatch) { + const numDice = parseInt(diceMatch[1]); + const diceSize = parseInt(diceMatch[2]); + const rolls = []; + let sum = 0; + for (let i = 0; i < numDice; i++) { + const roll = randomNum(diceSize); + rolls.push(roll); + sum += roll; } + modifier += sign * sum; + diceResults.push(`${sign === 1 ? "+" : "-"}${term}: [${rolls.join(", ")}]`); + } else { + const num = parseInt(term); + if (!isNaN(num)) { + modifier += sign * num; + } + } } - - value = value + adv_dis + modifier; - let ctxname = ctx.player.name; - - // 构建骰子结果字符串 - let diceResultStr = diceResults.length > 0 ? '\n 调整值结果: ' + diceResults.join(' ') : ''; - - if(hope > fear){ - seal.replyToSender(ctx, msg, `Alea iacta est【${ctxname} 】已掷下骰子... \n 希望骰:${hope} 恐惧骰:${fear} ${advDisResult} 调整值:${modifier}${diceResultStr} \n 骰值总和:${value} 希望尚存...`); + const value = hope + fear + adv_dis + modifier; + const diceResultStr = diceResults.length > 0 ? "\n随机调整值结果: " + diceResults.join(" ") : ""; + let reply = `Alea iacta est【${userName}】已掷下骰子... +`; + reply += `希望骰:${hope} 恐惧骰:${fear} ${advDisResult} 调整值:${modifier}${diceResultStr} +`; + if (dc !== null) { + reply += `骰值总和:${value} / DC:${dc} `; + } else { + reply += `骰值总和:${value} `; } - else if(hope < fear){ - seal.replyToSender(ctx, msg, `Alea iacta est【${ctxname}】 已掷下骰子... \n 希望骰:${hope} 恐惧骰:${fear} ${advDisResult} 调整值:${modifier}${diceResultStr} \n 骰值总和:${value} 直面恐惧...`); + if (hope === fear) { + reply += "关键成功,逆天改命!"; + } else if (dc !== null) { + const success = value >= dc; + if (hope > fear) { + reply += success ? "希望成功" : "希望失败"; + } else { + reply += success ? "恐惧成功" : "恐惧失败"; + } + } else { + if (hope > fear) { + reply += "希望尚存..."; + } else { + reply += "直面恐惧..."; + } } - else{ - seal.replyToSender(ctx, msg, `Alea iacta est【${ctxname} 】已掷下骰子... \n 希望骰:${hope} 恐惧骰:${fear} ${advDisResult} 调整值:${modifier}${diceResultStr} \n 骰值总和:${value} 关键成功,逆天改命!` ); + return { + hope, + fear, + value, + adv_dis, + modifier, + diceResultStr, + advDisResult, + reply + }; + } + + // src/index.ts + function main() { + let ext = seal.ext.find("daggerheart"); + if (!ext) { + ext = seal.ext.new("daggerheart", "Daggerheart", "1.8.0"); + seal.ext.register(ext); } - return seal.ext.newCmdExecuteResult(true); -}; -// 将命令注册到扩展中 -ext.cmdMap['dd'] = cmdSeal; + const actionData = {}; + const cmdDaggerheart = seal.ext.newCmdItemInfo(); + cmdDaggerheart.name = "dd"; + cmdDaggerheart.help = "Daggerheart二元骰专用模式\n基础用法:.dd [adv/dis] [固定调整值:+/-N] [随机调整值:+/-XdY]\n多个优/劣势骰取高:.dd adv2/dis2 (数字表示骰子数量)\n优劣势可简写:优势:[adv/优势/优] 劣势:[dis/劣势/劣]\n组合使用可以任意顺序:.dd 1d6 a3 +4\nDC检定: .dd [DC]\n.dd getAction //查询当前所有用户掷骰的次数\n.dd clearAction //重置记录\n"; + cmdDaggerheart.solve = (ctx, msg, cmdArgs) => { + const userId = ctx.player.userId; + const userName = ctx.player.name; + if (cmdArgs.args.length === 1) { + const action = cmdArgs.args[0].toLowerCase(); + if (action === "help") { + const ret = seal.ext.newCmdExecuteResult(true); + ret.showHelp = true; + return ret; + } + if (action === "getaction") { + let reply = "当前掷骰次数记录:\n"; + if (Object.keys(actionData).length === 0) { + reply += "暂无记录。"; + } else { + for (const id in actionData) { + reply += `${actionData[id].name}: ${actionData[id].count}次 +`; + } + } + seal.replyToSender(ctx, msg, reply); + return seal.ext.newCmdExecuteResult(true); + } + if (action === "clearaction") { + for (const key in actionData) { + delete actionData[key]; + } + seal.replyToSender(ctx, msg, "所有用户的掷骰次数记录已重置。"); + return seal.ext.newCmdExecuteResult(true); + } + } + if (!actionData[userId]) { + actionData[userId] = { name: userName, count: 0 }; + } + actionData[userId].name = userName; + actionData[userId].count++; + const result = parseArgsAndRoll(cmdArgs.args, userName); + seal.replyToSender(ctx, msg, result.reply); + return seal.ext.newCmdExecuteResult(true); + }; + ext.cmdMap["dd"] = cmdDaggerheart; + } + main(); +})();