From 04480942a31b37a58a96fe13acdfd140cdad9b31 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Fri, 19 Apr 2024 22:55:01 +0800 Subject: [PATCH 01/57] =?UTF-8?q?=E8=B0=83=E6=95=B4=E3=80=90=E4=B9=89?= =?UTF-8?q?=E7=83=88=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/mobile.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/character/mobile.js b/character/mobile.js index eb8d7e132..9b33952ca 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -2442,9 +2442,9 @@ game.import("character", function () { mbyilie3: { audio: "mbyilie", trigger: { player: "phaseEnd" }, - //filter:function(event,player){ - // return player.countMark('mbyilie'); - //}, + filter: function (event, player) { + return player.hasMark('mbyilie'); + }, forced: true, content: function () { "step 0"; @@ -21154,7 +21154,7 @@ game.import("character", function () { mbyilie2: "义烈", mbyilie3: "义烈", mbyilie_info: - "锁定技。①游戏开始时,你选择一名其他角色,然后你获得以下效果:其受到伤害时,若你没有“烈”,则你获得等同于伤害值的“烈”标记,然后防止此伤害;其对其他角色造成伤害后,你回复1点体力。②结束阶段,你摸一张牌并失去X点体力,然后移去所有“烈”(X为你拥有的“烈”标记数)。", + "锁定技。①游戏开始时,你选择一名其他角色,然后你获得以下效果:其受到伤害时,若你没有“烈”,则你获得等同于伤害值的“烈”标记,然后防止此伤害;其对其他角色造成伤害后,你回复1点体力。②结束阶段,若你拥有“烈”标记,你摸一张牌并失去X点体力,然后移去所有“烈”(X为你拥有的“烈”标记数)。", muludawang: "木鹿大王", shoufa: "兽法", shoufa_info: From e7d94af9b4254675ca25ed7025f0b188b3a63b41 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Fri, 19 Apr 2024 23:08:05 +0800 Subject: [PATCH 02/57] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E3=80=90=E5=BC=93?= =?UTF-8?q?=E9=AA=91=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/refresh.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/character/refresh.js b/character/refresh.js index 295c285b7..8b8646886 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -8241,7 +8241,7 @@ game.import("character", function () { cardUsable: function (card, player) { if (card.name == "sha") { const suit = get.suit(card); - return suit === "unsure" || player.storage.xingongji2.includes(suit); + if (suit === "unsure" || player.storage.xingongji2.includes(suit)) return Infinity; } }, aiOrder: function (player, card, num) { From 29035c121181fed16a6f1eeeb6155cb92b812af8 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 12:45:55 +0800 Subject: [PATCH 03/57] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B9=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=A5=9E=E9=B2=81=E8=82=83=E6=8A=80=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra.js | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/character/extra.js b/character/extra.js index d38d9034e..f1e8dcd0e 100755 --- a/character/extra.js +++ b/character/extra.js @@ -673,7 +673,7 @@ game.import("character", function () { return game.hasPlayer((current) => { if (current == player) return false; const total = current.countCards("ej"); - return total > 0 && num > total; + return total > 0 && num >= total + (get.mode() != "doudizhu" ? 1 : 0); }); }, filterCard: true, @@ -682,7 +682,7 @@ game.import("character", function () { 1, Math.max( ...game.filterPlayer((i) => i != get.player()).map((i) => i.countCards("ej")) - ) + 1, + ) + (get.mode() != "doudizhu" ? 1 : 0), ]; }, check(card) { @@ -691,10 +691,10 @@ game.import("character", function () { filterTarget(card, player, target) { const num = target.countCards("ej"); if (!num) return false; - return ui.selected.cards.length == num + 1 && player != target; + return ui.selected.cards.length == num + (get.mode() != "doudizhu" ? 1 : 0) && player != target; }, filterOk() { - return ui.selected.cards.length == ui.selected.targets[0].countCards("ej") + 1; + return ui.selected.cards.length == ui.selected.targets[0].countCards("ej") + (get.mode() != "doudizhu" ? 1 : 0); }, position: "he", lose: false, @@ -746,8 +746,9 @@ game.import("character", function () { filter(event, player) { return ( (event.name != "phase" || game.phaseNumber == 0) && - game.countPlayer((current) => { - return !current.isZhu2(); + game.countPlayer(current => { + if (get.mode() != "doudizhu") return !current.isZhu2(); + return current.getSeatNum() != 3; }) > 1 ); }, @@ -756,15 +757,13 @@ game.import("character", function () { derivation: "tamo_faq", async content(event, trigger, player) { const toSortPlayers = game.filterPlayer((current) => { - return ( - !current.isZhu2() || - get.mode() == "doudizhu" && current.getSeatNum() == 3 - ); + if (get.mode() != "doudizhu") return !current.isZhu2(); + return current.getSeatNum() != 3; }); toSortPlayers.sortBySeat(game.findPlayer2((current) => current.getSeatNum() == 1, true)); const next = player.chooseToMove("榻谟:是否分配" + - (game.countPlayer() > toSortPlayers.length ? - "除主公" + (get.mode() == "doudizhu" ? "和三号位外" : "外") : "") + + (get.mode() != "doudizhu" ? + (game.hasPlayer(cur => cur.isZhu2()) ? "除主公外" : "") : "除三号位外") + "所有角色的座次?" ); next.set("list", [ @@ -10842,17 +10841,21 @@ game.import("character", function () { dingzhou: "定州", dingzhou_info: "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数+1)。", + dingzhou_info_doudizhu: + "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数)。", tamo: "榻谟", tamo_info: "游戏开始时,你可以重新分配除主公外所有角色的座次。", tamo_info_doudizhu: - "游戏开始时,你可以重新分配除主公和三号位外所有角色的座次。", + "游戏开始时,你可以重新分配除三号位外所有角色的座次。", tamo_faq: "FAQ", tamo_faq_info: "
  • Q:在一号位不为主公的情况下,〖榻谟〗如何结算?
  • A:该角色可以正常进行座次交换。若受此技能影响导致一号位角色发生了变化,则以排列后的一号位角色为起始角色开始本局游戏。
  • ", zhimeng: "智盟", - zhimeng_info_identity: '回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。', - zhimeng_info: '回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。', + zhimeng_info: + '回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。', + zhimeng_info_identity: + '回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。', shen_xuzhu: "神许褚", shen_xuzhu_prefix: "神", zhengqing: "争擎", From 86beb9057dae79c3f090f44523ba31bcb987277b Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 12:49:09 +0800 Subject: [PATCH 04/57] =?UTF-8?q?=E3=80=90=E4=BD=90=E4=BD=91=E3=80=91dynam?= =?UTF-8?q?icTranslate=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/mobile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/character/mobile.js b/character/mobile.js index 9b33952ca..dc1010d2a 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -20080,8 +20080,8 @@ game.import("character", function () { mbzuoyou(player) { const mbzuoyou = player.storage.mbzuoyou; if (mbzuoyou) - return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。'; - return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。'; + return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; + return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; }, }, perfectPair: { From b59024e95fa56f7ad016a0b88cbf300657d5a08f Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 12:54:26 +0800 Subject: [PATCH 05/57] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/character/extra.js b/character/extra.js index f1e8dcd0e..ac0fb3b9c 100755 --- a/character/extra.js +++ b/character/extra.js @@ -10853,9 +10853,9 @@ game.import("character", function () { "
  • Q:在一号位不为主公的情况下,〖榻谟〗如何结算?
  • A:该角色可以正常进行座次交换。若受此技能影响导致一号位角色发生了变化,则以排列后的一号位角色为起始角色开始本局游戏。
  • ", zhimeng: "智盟", zhimeng_info: - '回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。', + "回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", zhimeng_info_identity: - '回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。', + "回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", shen_xuzhu: "神许褚", shen_xuzhu_prefix: "神", zhengqing: "争擎", From 5dffc03b147170a3cc2afc45acf515967564096b Mon Sep 17 00:00:00 2001 From: kuangthree Date: Sat, 20 Apr 2024 13:01:41 +0800 Subject: [PATCH 06/57] =?UTF-8?q?=E6=96=B0=E5=A2=9Eui.create.toast?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E5=BC=B9=E5=87=BA=E6=96=87=E5=AD=97=E6=95=88?= =?UTF-8?q?=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/default/toast.css | 38 ++ noname/ui/create/index.js | 1198 +++++++++++++++++++++++++++---------- noname/ui/index.js | 5 + 3 files changed, 910 insertions(+), 331 deletions(-) create mode 100644 layout/default/toast.css diff --git a/layout/default/toast.css b/layout/default/toast.css new file mode 100644 index 000000000..ca4d5be32 --- /dev/null +++ b/layout/default/toast.css @@ -0,0 +1,38 @@ +.toast-container { + position: fixed; + top: 15%; + left: 50%; + transform: translateX(-50%); + z-index: 9999; +} + + +.toast { + display: none; + background-color: rgba(255, 165, 0, 0.7); + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); + color: white; + font-weight: bold; + padding: 10px 20px; + text-align: center; + white-space: nowrap; + width: max-content; + animation: fadeInOut 1500ms ease-in-out forwards; +} + + +@keyframes fadeInOut { + 0% { + opacity: 0; + } + 20% { + opacity: 1; + } + 80% { + opacity: 1; + } + 100% { + opacity: 0; + } +} \ No newline at end of file diff --git a/noname/ui/create/index.js b/noname/ui/create/index.js index 109b031a1..33b7283f9 100644 --- a/noname/ui/create/index.js +++ b/noname/ui/create/index.js @@ -21,9 +21,13 @@ export class Create { */ identityCard(identity, position, noclick) { const card = ui.create.card(position, "noclick", noclick); - card.removeEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.card); + card.removeEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.card + ); card.classList.add("button"); - card._customintro = (uiintro) => uiintro.add(`${get.translation(`${identity}${2}`)}的身份牌`); + card._customintro = (uiintro) => + uiintro.add(`${get.translation(`${identity}${2}`)}的身份牌`); const fileName = `image/card/identity_${identity}.jpg`; new Promise((resolve, reject) => { const image = new Image(); @@ -35,7 +39,8 @@ export class Create { card.classList.add("fullskin"); card.node.image.setBackgroundImage(fileName); }, - () => (card.node.background.innerHTML = get.translation(identity)[0]) + () => + (card.node.background.innerHTML = get.translation(identity)[0]) ); return card; } @@ -53,16 +58,19 @@ export class Create { card.classList.add("infohidden"); } card.style.transition = "all 0s"; - card.style.transform = "perspective(600px) rotateY(180deg) translateX(0)"; + card.style.transform = + "perspective(600px) rotateY(180deg) translateX(0)"; const onEnd01 = function () { setTimeout(function () { card.style.transition = "all ease-in 0.3s"; - card.style.transform = "perspective(600px) rotateY(270deg) translateX(52px)"; + card.style.transform = + "perspective(600px) rotateY(270deg) translateX(52px)"; var onEnd = function () { card.classList.remove("infohidden"); card.style.transition = "all 0s"; ui.refresh(card); - card.style.transform = "perspective(600px) rotateY(-90deg) translateX(52px)"; + card.style.transform = + "perspective(600px) rotateY(-90deg) translateX(52px)"; ui.refresh(card); card.style.transition = ""; ui.refresh(card); @@ -97,7 +105,8 @@ export class Create { //删除container的时候,删除创建的ul列表 container.delete = function () { for (let i = createList.length - 1; i >= 0; i--) { - createList[i].parentNode && createList[i].parentNode.removeChild(createList[i]); + createList[i].parentNode && + createList[i].parentNode.removeChild(createList[i]); } Array.from(editorpage.children).forEach((v) => { v.style.background = ""; @@ -132,7 +141,9 @@ export class Create { width: (pos.width * 4) / game.documentZoom + "px", //'font-family':'shousha', "font-size": - (lib.config.codeMirror_fontSize ? lib.config.codeMirror_fontSize.slice(0, -2) : 16) / + (lib.config.codeMirror_fontSize + ? lib.config.codeMirror_fontSize.slice(0, -2) + : 16) / game.documentZoom + "px", }); @@ -143,13 +154,20 @@ export class Create { const getActive = () => { let i = 0; while (i < ul.childElementCount) { - if (ul.childNodes[i].classList.contains("CodeMirror-hint-active")) break; + if ( + ul.childNodes[i].classList.contains( + "CodeMirror-hint-active" + ) + ) + break; else i++; } return i; }; const setActive = (i) => { - ul.childNodes[getActive()].classList.remove("CodeMirror-hint-active"); + ul.childNodes[getActive()].classList.remove( + "CodeMirror-hint-active" + ); ul.childNodes[i].classList.add("CodeMirror-hint-active"); return i; }; @@ -164,8 +182,11 @@ export class Create { } else { elt.innerHTML = cur; } - let className = "CodeMirror-hint" + (i != 0 ? "" : " " + "CodeMirror-hint-active"); - if (cur.className != null) className = cur.className + " " + className; + let className = + "CodeMirror-hint" + + (i != 0 ? "" : " " + "CodeMirror-hint-active"); + if (cur.className != null) + className = cur.className + " " + className; elt.className = className; elt.hintId = i; ui.window.listen.call(elt, function () { @@ -193,121 +214,201 @@ export class Create { createList.remove(ul); return ul; }; - const discardConfig = ui.create.div(".editbutton", "取消", editorpage, function () { - ui.window.classList.remove("shortcutpaused"); - ui.window.classList.remove("systempaused"); - container.delete(null); - delete window.saveNonameInput; - }); - const saveConfig = ui.create.div(".editbutton", "保存", editorpage, saveInput); - const theme = ui.create.div(".editbutton", "主题", editorpage, function () { - if (!this || this == window) return; - if (this.ul && this.ul.parentNode) { - return closeMenu.call(this); + const discardConfig = ui.create.div( + ".editbutton", + "取消", + editorpage, + function () { + ui.window.classList.remove("shortcutpaused"); + ui.window.classList.remove("systempaused"); + container.delete(null); + delete window.saveNonameInput; } - //this - const self = this; - if (!this.ul) { - //主题列表 - const list = ["mdn-like", "mbo"]; - //正在使用的主题 - const active = container.editor.options.theme; - //排个序 - list.remove(active).splice(0, 0, active); - //元素位置 - const pos = self.getBoundingClientRect(); - //点击事件 - const click = function (e) { - const theme = this.innerHTML; - container.editor.setOption("theme", theme); - setTimeout(() => container.editor.refresh(), 0); - game.saveConfig("codeMirror_theme", theme); - closeMenu.call(self); - }; - const ul = createMenu(pos, self, list, click); - self.ul = ul; - } else { - createMenu(null, self); + ); + const saveConfig = ui.create.div( + ".editbutton", + "保存", + editorpage, + saveInput + ); + const theme = ui.create.div( + ".editbutton", + "主题", + editorpage, + function () { + if (!this || this == window) return; + if (this.ul && this.ul.parentNode) { + return closeMenu.call(this); + } + //this + const self = this; + if (!this.ul) { + //主题列表 + const list = ["mdn-like", "mbo"]; + //正在使用的主题 + const active = container.editor.options.theme; + //排个序 + list.remove(active).splice(0, 0, active); + //元素位置 + const pos = self.getBoundingClientRect(); + //点击事件 + const click = function (e) { + const theme = this.innerHTML; + container.editor.setOption("theme", theme); + setTimeout(() => container.editor.refresh(), 0); + game.saveConfig("codeMirror_theme", theme); + closeMenu.call(self); + }; + const ul = createMenu(pos, self, list, click); + self.ul = ul; + } else { + createMenu(null, self); + } } - }); - const edit = ui.create.div(".editbutton", "编辑", editorpage, function () { - if (!this || this == window) return; - if (this.ul && this.ul.parentNode) { - return closeMenu.call(this); + ); + const edit = ui.create.div( + ".editbutton", + "编辑", + editorpage, + function () { + if (!this || this == window) return; + if (this.ul && this.ul.parentNode) { + return closeMenu.call(this); + } + const self = this; + if (!this.ul) { + const pos = this.getBoundingClientRect(); + const list = ["撤销 Ctrl+Z", "恢复撤销 Ctrl+Y"]; + const click = function (e) { + const num = this.innerHTML.indexOf("Ctrl"); + const inner = this.innerHTML + .slice(num) + .replace("+", "-"); + container.editor.execCommand( + container.editor.options.extraKeys[inner] + ); + setTimeout(() => container.editor.refresh(), 0); + closeMenu.call(self); + }; + const ul = createMenu(pos, self, list, click); + this.ul = ul; + } else { + createMenu(null, self); + } } - const self = this; - if (!this.ul) { - const pos = this.getBoundingClientRect(); - const list = ["撤销 Ctrl+Z", "恢复撤销 Ctrl+Y"]; - const click = function (e) { - const num = this.innerHTML.indexOf("Ctrl"); - const inner = this.innerHTML.slice(num).replace("+", "-"); - container.editor.execCommand(container.editor.options.extraKeys[inner]); - setTimeout(() => container.editor.refresh(), 0); - closeMenu.call(self); - }; - const ul = createMenu(pos, self, list, click); - this.ul = ul; - } else { - createMenu(null, self); + ); + const fontSize = ui.create.div( + ".editbutton", + "字号", + editorpage, + function () { + if (!this || this == window) return; + if (this.ul && this.ul.parentNode) { + return closeMenu.call(this); + } + const self = this; + if (!this.ul) { + const pos = this.getBoundingClientRect(); + const list = [ + "16px", + "18px", + "20px", + "22px", + "24px", + "26px", + ]; + const click = function (e) { + const size = this.innerHTML; + container.style.fontSize = + size.slice(0, -2) / game.documentZoom + "px"; + Array.from(self.parentElement.children) + .map((v) => v.ul) + .filter(Boolean) + .forEach((v) => { + v.style.fontSize = + size.slice(0, -2) / game.documentZoom + + "px"; + }); + setTimeout(() => container.editor.refresh(), 0); + game.saveConfig("codeMirror_fontSize", size); + closeMenu.call(self); + }; + const ul = createMenu(pos, self, list, click); + this.ul = ul; + } else { + createMenu(null, self); + } } - }); - const fontSize = ui.create.div(".editbutton", "字号", editorpage, function () { - if (!this || this == window) return; - if (this.ul && this.ul.parentNode) { - return closeMenu.call(this); - } - const self = this; - if (!this.ul) { - const pos = this.getBoundingClientRect(); - const list = ["16px", "18px", "20px", "22px", "24px", "26px"]; - const click = function (e) { - const size = this.innerHTML; - container.style.fontSize = size.slice(0, -2) / game.documentZoom + "px"; - Array.from(self.parentElement.children) - .map((v) => v.ul) - .filter(Boolean) - .forEach((v) => { - v.style.fontSize = size.slice(0, -2) / game.documentZoom + "px"; - }); - setTimeout(() => container.editor.refresh(), 0); - game.saveConfig("codeMirror_fontSize", size); - closeMenu.call(self); - }; - const ul = createMenu(pos, self, list, click); - this.ul = ul; - } else { - createMenu(null, self); - } - }); + ); const editor = ui.create.div(editorpage); return editor; } + /** + * 弹出提示。 + * @param {string} message 弹出的文字 + */ + toast(message) { + if(!ui.toastStyle){ + ui.toastStyle = lib.init.css(lib.assetURL+"layout/default/toast.css"); + } + const toastContainer = + document.querySelector(".toast-container") || + (() => { + const container = document.createElement("div"); + container.classList.add("toast-container"); + document.body.appendChild(container); + return container; + })(); + const toast = document.createElement("div"); + toast.textContent = message; + toast.classList.add("toast"); + toastContainer.appendChild(toast); + ui.toastQueue.push(toast); + ui.create.showNextToast(); + return toast; + } + showNextToast() { + const toast = ui.toastQueue.shift(); + if(!toast)return; + toast.style.display = "block"; + toast.addEventListener("animationend", () => { + toast.remove(); + ui.create.showNextToast(); + }); + return toast; + } cardTempName(card, applyNode) { let getApplyNode = applyNode || card; let cardName = get.name(card); let cardNature = get.nature(card); let tempname = get.translation(cardName); let cardTempNameConfig = lib.config.cardtempname; - let node = getApplyNode._tempName || ui.create.div(".tempname", getApplyNode); + let node = + getApplyNode._tempName || ui.create.div(".tempname", getApplyNode); let datasetNature = ""; getApplyNode._tempName = node; if (cardTempNameConfig != "image") { //清空,避免和下面的image部分有冲突 node.innerHTML = ""; datasetNature = "fire"; - if (get.position(card) == "j" && card.viewAs && card.viewAs != card.name) { + if ( + get.position(card) == "j" && + card.viewAs && + card.viewAs != card.name + ) { datasetNature = "wood"; tempname = get.translation(card.viewAs); } else { if (cardName == "sha") { - if (cardNature) tempname = get.translation(cardNature) + tempname; + if (cardNature) + tempname = get.translation(cardNature) + tempname; if (cardNature == "thunder") datasetNature = "thunder"; if (cardNature == "kami") datasetNature = "kami"; if (cardNature == "ice") datasetNature = "ice"; } } - if (cardTempNameConfig == "default") getApplyNode._tempName.classList.add("vertical"); + if (cardTempNameConfig == "default") + getApplyNode._tempName.classList.add("vertical"); if (datasetNature.length > 0) { node.dataset.nature = datasetNature; } else { @@ -315,12 +416,17 @@ export class Create { node.classList.add(datasetNature); } } else { - if (get.position(card) == "j" && card.viewAs && card.viewAs != card.name) { + if ( + get.position(card) == "j" && + card.viewAs && + card.viewAs != card.name + ) { cardName = card.viewAs; tempname = get.translation(card.viewAs); } if (cardName == "sha") { - if (cardNature) tempname = get.translation(cardNature) + tempname; + if (cardNature) + tempname = get.translation(cardNature) + tempname; if (cardNature == "fire") datasetNature = "fire"; if (cardNature == "thunder") datasetNature = "thunder"; if (cardNature == "kami") datasetNature = "kami"; @@ -344,65 +450,103 @@ export class Create { if (lib.card[cardName].fullskin) { if (img) { if (img.startsWith("ext:")) { - bg.setBackgroundImage(img.replace(/^ext:/, "extension/")); + bg.setBackgroundImage( + img.replace(/^ext:/, "extension/") + ); } else { bg.setBackgroundDB(img); } } else { if (lib.card[cardName].modeimage) { bg.setBackgroundImage( - "image/mode/" + lib.card[cardName].modeimage + "/card/" + cardName + ".png" + "image/mode/" + + lib.card[cardName].modeimage + + "/card/" + + cardName + + ".png" ); } else { if (cardName == "sha" && cardNature == "stab") bg.setBackgroundImage("image/card/cisha.png"); - else bg.setBackgroundImage("image/card/" + cardName + ".png"); + else + bg.setBackgroundImage( + "image/card/" + cardName + ".png" + ); } } - } else if (get.dynamicVariable(lib.card[cardName].image, card) == "background") { - if (cardNature) bg.setBackground(cardName + "_" + cardNature, "card"); + } else if ( + get.dynamicVariable(lib.card[cardName].image, card) == + "background" + ) { + if (cardNature) + bg.setBackground(cardName + "_" + cardNature, "card"); else bg.setBackground(cardName, "card"); } else if (lib.card[cardName].fullimage) { if (img) { if (img.startsWith("ext:")) { - bg.setBackgroundImage(img.replace(/^ext:/, "extension/")); + bg.setBackgroundImage( + img.replace(/^ext:/, "extension/") + ); bg.style.backgroundSize = "cover"; } else { bg.setBackgroundDB(img); } - } else if (get.dynamicVariable(lib.card[cardName].image, card)) { - if (get.dynamicVariable(lib.card[cardName].image, card).startsWith("character:")) { + } else if ( + get.dynamicVariable(lib.card[cardName].image, card) + ) { + if ( + get + .dynamicVariable(lib.card[cardName].image, card) + .startsWith("character:") + ) { bg.setBackground( - get.dynamicVariable(lib.card[cardName].image, card).slice(10), + get + .dynamicVariable(lib.card[cardName].image, card) + .slice(10), "character" ); } else { - bg.setBackground(get.dynamicVariable(lib.card[cardName].image, card)); + bg.setBackground( + get.dynamicVariable(lib.card[cardName].image, card) + ); } } else { let cardPack = lib.cardPack["mode_" + get.mode()]; - if (Array.isArray(cardPack) && cardPack.includes(cardName)) { - bg.setBackground("mode/" + get.mode() + "/card/" + cardName); + if ( + Array.isArray(cardPack) && + cardPack.includes(cardName) + ) { + bg.setBackground( + "mode/" + get.mode() + "/card/" + cardName + ); } else { bg.setBackground("card/" + cardName); } } - } else if (get.dynamicVariable(lib.card[cardName].image, card) == "card") { - if (cardNature) bg.setBackground(cardName + "_" + cardNature, "card"); + } else if ( + get.dynamicVariable(lib.card[cardName].image, card) == "card" + ) { + if (cardNature) + bg.setBackground(cardName + "_" + cardNature, "card"); else bg.setBackground(cardName, "card"); } else if ( - typeof get.dynamicVariable(lib.card[cardName].image, card) == "string" && + typeof get.dynamicVariable(lib.card[cardName].image, card) == + "string" && !lib.card[cardName].fullskin ) { if (img) { if (img.startsWith("ext:")) { - bg.setBackgroundImage(img.replace(/^ext:/, "extension/")); + bg.setBackgroundImage( + img.replace(/^ext:/, "extension/") + ); bg.style.backgroundSize = "cover"; } else { bg.setBackgroundDB(img); } } else { - bg.setBackground(get.dynamicVariable(lib.card[cardName].image, card)); + bg.setBackground( + get.dynamicVariable(lib.card[cardName].image, card) + ); } } else { console.warn("卡牌图片解析失败"); @@ -413,7 +557,9 @@ export class Create { delete node.dataset.nature; } node.innerHTML += `${ - cardTempNameConfig == "default" ? get.verticalStr(tempname) : tempname + cardTempNameConfig == "default" + ? get.verticalStr(tempname) + : tempname }`; node.tempname = tempname; return node; @@ -433,7 +579,10 @@ export class Create { ); player.roomindex = i; player.initRoom = lib.element.Player.prototype.initRoom; - player.addEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.connectroom); + player.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.connectroom + ); player.initRoom(list[i]); ui.rooms.push(player); } @@ -480,10 +629,15 @@ export class Create { } else { str = arguments[i]; } - } else if (["div", "table", "tr", "td", "body", "fragment"].includes(get.objtype(arguments[i]))) + } else if ( + ["div", "table", "tr", "td", "body", "fragment"].includes( + get.objtype(arguments[i]) + ) + ) position = arguments[i]; else if (typeof arguments[i] == "number") position2 = arguments[i]; - else if (get.itemtype(arguments[i]) == "divposition") divposition = arguments[i]; + else if (get.itemtype(arguments[i]) == "divposition") + divposition = arguments[i]; else if (typeof arguments[i] == "object") style = arguments[i]; else if (typeof arguments[i] == "function") listen = arguments[i]; } @@ -494,19 +648,30 @@ export class Create { if (node.className.length != 0) { node.className += " "; } - while (str[i + 1] != "." && str[i + 1] != "#" && i + 1 < str.length) { + while ( + str[i + 1] != "." && + str[i + 1] != "#" && + i + 1 < str.length + ) { node.className += str[i + 1]; i++; } } else if (str[i] == "#") { - while (str[i + 1] != "." && str[i + 1] != "#" && i + 1 < str.length) { + while ( + str[i + 1] != "." && + str[i + 1] != "#" && + i + 1 < str.length + ) { node.id += str[i + 1]; i++; } } } if (position) { - if (typeof position2 == "number" && position.childNodes.length > position2) { + if ( + typeof position2 == "number" && + position.childNodes.length > position2 + ) { position.insertBefore(node, position.childNodes[position2]); } else { position.appendChild(node); @@ -539,7 +704,14 @@ export class Create { return div; } node() { - var tagName, str, innerHTML, position, position2, style, divposition, listen; + var tagName, + str, + innerHTML, + position, + position2, + style, + divposition, + listen; for (var i = 0; i < arguments.length; i++) { if (typeof arguments[i] == "string") { if (typeof tagName == "string") { @@ -547,10 +719,15 @@ export class Create { } else { tagName = arguments[i]; } - } else if (["div", "table", "tr", "td", "body", "fragment"].includes(get.objtype(arguments[i]))) + } else if ( + ["div", "table", "tr", "td", "body", "fragment"].includes( + get.objtype(arguments[i]) + ) + ) position = arguments[i]; else if (typeof arguments[i] == "number") position2 = arguments[i]; - else if (get.itemtype(arguments[i]) == "divposition") divposition = arguments[i]; + else if (get.itemtype(arguments[i]) == "divposition") + divposition = arguments[i]; else if (typeof arguments[i] == "object") style = arguments[i]; else if (typeof arguments[i] == "function") listen = arguments[i]; } @@ -574,12 +751,20 @@ export class Create { if (node.className.length != 0) { node.className += " "; } - while (str[i + 1] != "." && str[i + 1] != "#" && i + 1 < str.length) { + while ( + str[i + 1] != "." && + str[i + 1] != "#" && + i + 1 < str.length + ) { node.className += str[i + 1]; i++; } } else if (str[i] == "#") { - while (str[i + 1] != "." && str[i + 1] != "#" && i + 1 < str.length) { + while ( + str[i + 1] != "." && + str[i + 1] != "#" && + i + 1 < str.length + ) { node.id += str[i + 1]; i++; } @@ -587,14 +772,18 @@ export class Create { } } if (position) { - if (typeof position2 == "number" && position.childNodes.length > position2) { + if ( + typeof position2 == "number" && + position.childNodes.length > position2 + ) { position.insertBefore(node, position.childNodes[position2]); } else { position.appendChild(node); } } if (style) HTMLDivElement.prototype.css.call(node, style); - if (divposition) HTMLDivElement.prototype.setPosition.call(node, divposition); + if (divposition) + HTMLDivElement.prototype.setPosition.call(node, divposition); if (innerHTML) node.innerHTML = innerHTML; if (listen) node.onclick = listen; return node; @@ -618,15 +807,21 @@ export class Create { webview.style.border = "none"; layer.appendChild(webview); - var backbutton = ui.create.div(".menubutton.round", "返", layer, function () { - layer.remove(); - }); + var backbutton = ui.create.div( + ".menubutton.round", + "返", + layer, + function () { + layer.remove(); + } + ); backbutton.style.bottom = "10px"; backbutton.style.right = "10px"; backbutton.style.background = "rgba(0,0,0,0.4)"; backbutton.style.color = "white"; backbutton.style.textShadow = "rgba(0,0,0,0.5) 0px 0px 2px"; - backbutton.style.boxShadow = "rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(0, 0, 0, 0.3) 0 3px 10px"; + backbutton.style.boxShadow = + "rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(0, 0, 0, 0.3) 0 3px 10px"; backbutton.style.position = "fixed"; ui.window.appendChild(layer); @@ -764,10 +959,15 @@ export class Create { if (typeof col == "number") position2 = arguments[i]; else col = arguments[i]; } else row = arguments[i]; - } else if (["div", "table", "tr", "td", "body", "fragment"].includes(get.objtype(arguments[i]))) + } else if ( + ["div", "table", "tr", "td", "body", "fragment"].includes( + get.objtype(arguments[i]) + ) + ) position = arguments[i]; else if (typeof arguments[i] == "boolean") fixed = arguments[i]; - else if (get.itemtype(arguments[i]) == "divposition") divposition = arguments[i]; + else if (get.itemtype(arguments[i]) == "divposition") + divposition = arguments[i]; else if (typeof arguments[i] == "object") style = arguments[i]; } if (str == undefined) str = ""; @@ -777,12 +977,20 @@ export class Create { if (node.className.length != 0) { node.className += " "; } - while (str[i + 1] != "." && str[i + 1] != "#" && i + 1 < str.length) { + while ( + str[i + 1] != "." && + str[i + 1] != "#" && + i + 1 < str.length + ) { node.className += str[i + 1]; i++; } } else if (str[i] == "#") { - while (str[i + 1] != "." && str[i + 1] != "#" && i + 1 < str.length) { + while ( + str[i + 1] != "." && + str[i + 1] != "#" && + i + 1 < str.length + ) { node.id += str[i + 1]; i++; } @@ -799,7 +1007,10 @@ export class Create { } } if (position) { - if (typeof position2 == "number" && position.childNodes.length > position2) { + if ( + typeof position2 == "number" && + position.childNodes.length > position2 + ) { position.insertBefore(node, position.childNodes[position2]); } else { position.appendChild(node); @@ -837,51 +1048,68 @@ export class Create { ); } groupControl(dialog) { - return ui.create.control("wei", "shu", "wu", "qun", "jin", "western", "key", function (link, node) { - if (link == "全部") { - dialog.currentcapt = ""; - dialog.currentgroup = ""; - for (var i = 0; i < dialog.buttons.length; i++) { - dialog.buttons[i].style.display = ""; - } - } else { - if (node.classList.contains("thundertext")) { - dialog.currentgroup = null; - dialog.currentgroupnode = null; - node.classList.remove("thundertext"); + return ui.create.control( + "wei", + "shu", + "wu", + "qun", + "jin", + "western", + "key", + function (link, node) { + if (link == "全部") { + dialog.currentcapt = ""; + dialog.currentgroup = ""; for (var i = 0; i < dialog.buttons.length; i++) { - if ( - dialog.currentcapt && - dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt) - ) { - dialog.buttons[i].classList.add("nodisplay"); - } else { - dialog.buttons[i].classList.remove("nodisplay"); - } + dialog.buttons[i].style.display = ""; } } else { - if (dialog.currentgroupnode) { - dialog.currentgroupnode.classList.remove("thundertext"); - } - dialog.currentgroup = link; - dialog.currentgroupnode = node; - node.classList.add("thundertext"); - for (var i = 0; i < dialog.buttons.length; i++) { - if ( - dialog.buttons[i].group != link || - (dialog.currentcapt && + if (node.classList.contains("thundertext")) { + dialog.currentgroup = null; + dialog.currentgroupnode = null; + node.classList.remove("thundertext"); + for (var i = 0; i < dialog.buttons.length; i++) { + if ( + dialog.currentcapt && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt)) - ) { - dialog.buttons[i].classList.add("nodisplay"); - } else { - dialog.buttons[i].classList.remove("nodisplay"); + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt + ) + ) { + dialog.buttons[i].classList.add("nodisplay"); + } else { + dialog.buttons[i].classList.remove("nodisplay"); + } + } + } else { + if (dialog.currentgroupnode) { + dialog.currentgroupnode.classList.remove( + "thundertext" + ); + } + dialog.currentgroup = link; + dialog.currentgroupnode = node; + node.classList.add("thundertext"); + for (var i = 0; i < dialog.buttons.length; i++) { + if ( + dialog.buttons[i].group != link || + (dialog.currentcapt && + dialog.buttons[i].capt != + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt + )) + ) { + dialog.buttons[i].classList.add("nodisplay"); + } else { + dialog.buttons[i].classList.remove("nodisplay"); + } } } } } - }); + ); } cardDialog() { var args = ["thisiscard"]; @@ -894,7 +1122,10 @@ export class Create { var list = []; for (var i in lib.character) { if (lib.character[i][4].includes("minskin")) continue; - if (lib.character[i][4].includes("boss") || lib.character[i][4].includes("hiddenboss")) { + if ( + lib.character[i][4].includes("boss") || + lib.character[i][4].includes("hiddenboss") + ) { if (lib.config.mode == "boss") continue; if (!lib.character[i][4].includes("bossallowed")) continue; } @@ -943,7 +1174,12 @@ export class Create { } else if (packname == "收藏") { pack = lib.config.favouriteCharacter; } - var node = ui.create.div(".dialogbutton.menubutton.large", packname, packnode, clickCapt); + var node = ui.create.div( + ".dialogbutton.menubutton.large", + packname, + packnode, + clickCapt + ); node.pack = pack; return node; }; @@ -974,7 +1210,11 @@ export class Create { clickCapt.call(packnode.firstChild); } - var node = ui.create.div(".dialogbutton.menubutton.large", "筛选", packnode); + var node = ui.create.div( + ".dialogbutton.menubutton.large", + "筛选", + packnode + ); return dialog; } characterDialog() { @@ -1009,9 +1249,15 @@ export class Create { precharacter = true; } else if (arguments[i] == "characterx") { characterx = true; - } else if (typeof arguments[i] == "string" && arguments[i].startsWith("onlypack:")) { + } else if ( + typeof arguments[i] == "string" && + arguments[i].startsWith("onlypack:") + ) { onlypack = arguments[i].slice(9); - } else if (typeof arguments[i] == "object" && typeof arguments[i].seperate == "function") { + } else if ( + typeof arguments[i] == "object" && + typeof arguments[i].seperate == "function" + ) { seperate = arguments[i].seperate; } else if (typeof arguments[i] === "string") { str = arguments[i]; @@ -1054,7 +1300,10 @@ export class Create { } else { for (var i in lib.character) { if (lib.character[i][4].includes("minskin")) continue; - if (lib.character[i][4].includes("boss") || lib.character[i][4].includes("hiddenboss")) { + if ( + lib.character[i][4].includes("boss") || + lib.character[i][4].includes("hiddenboss") + ) { if (lib.config.mode == "boss") continue; if (!lib.character[i][4].includes("bossallowed")) continue; } @@ -1062,7 +1311,11 @@ export class Create { if (lib.character[i][4].includes("stonehidden")) continue; if (lib.character[i][4].includes("unseen")) continue; if (lib.config.banned.includes(i)) continue; - if (lib.characterFilter[i] && !lib.characterFilter[i](get.mode())) continue; + if ( + lib.characterFilter[i] && + !lib.characterFilter[i](get.mode()) + ) + continue; if (filter && filter(i)) continue; list.push(i); if (get.is.double(i)) { @@ -1108,12 +1361,19 @@ export class Create { this.touchlink.classList.remove("active"); } for (var i = 0; i < dialog.buttons.length; i++) { - if (dialog.currentgroup && dialog.buttons[i].group != dialog.currentgroup) { + if ( + dialog.currentgroup && + dialog.buttons[i].group != dialog.currentgroup + ) { dialog.buttons[i].classList.add("nodisplay"); } else if ( dialog.currentcapt2 && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt, true) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt, + true + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else { @@ -1124,7 +1384,9 @@ export class Create { if (dialog.currentcaptnode) { dialog.currentcaptnode.classList.remove("thundertext"); if (dialog.currentcaptnode.touchlink) { - dialog.currentcaptnode.touchlink.classList.remove("active"); + dialog.currentcaptnode.touchlink.classList.remove( + "active" + ); } } dialog.currentcapt = this.link; @@ -1136,16 +1398,26 @@ export class Create { for (var i = 0; i < dialog.buttons.length; i++) { if ( dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else if ( dialog.currentcapt2 && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt, true) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt, + true + ) ) { dialog.buttons[i].classList.add("nodisplay"); - } else if (dialog.currentgroup && dialog.buttons[i].group != dialog.currentgroup) { + } else if ( + dialog.currentgroup && + dialog.buttons[i].group != dialog.currentgroup + ) { dialog.buttons[i].classList.add("nodisplay"); } else { dialog.buttons[i].classList.remove("nodisplay"); @@ -1157,7 +1429,10 @@ export class Create { newlined2.style.display = "none"; if (!packsource.onlypack) { packsource.classList.remove("thundertext"); - if (!get.is.phoneLayout() || !lib.config.filternode_button) { + if ( + !get.is.phoneLayout() || + !lib.config.filternode_button + ) { packsource.innerHTML = "武将包"; } } @@ -1170,12 +1445,18 @@ export class Create { this.touchlink.classList.remove("active"); } for (var i = 0; i < dialog.buttons.length; i++) { - if (dialog.currentgroup && dialog.buttons[i].group != dialog.currentgroup) { + if ( + dialog.currentgroup && + dialog.buttons[i].group != dialog.currentgroup + ) { dialog.buttons[i].classList.add("nodisplay"); } else if ( dialog.currentcapt && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else { @@ -1186,7 +1467,9 @@ export class Create { if (dialog.currentcaptnode2) { dialog.currentcaptnode2.classList.remove("thundertext"); if (dialog.currentcaptnode2.touchlink) { - dialog.currentcaptnode2.touchlink.classList.remove("active"); + dialog.currentcaptnode2.touchlink.classList.remove( + "active" + ); } } dialog.currentcapt2 = this.link; @@ -1202,15 +1485,25 @@ export class Create { if ( dialog.currentcapt && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else if ( dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt, true) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt, + true + ) ) { dialog.buttons[i].classList.add("nodisplay"); - } else if (dialog.currentgroup && dialog.buttons[i].group != dialog.currentgroup) { + } else if ( + dialog.currentgroup && + dialog.buttons[i].group != dialog.currentgroup + ) { dialog.buttons[i].classList.add("nodisplay"); } else { if (dialog.buttons[i].activate) { @@ -1223,7 +1516,11 @@ export class Create { } if (dialog.seperate) { for (var i = 0; i < dialog.seperate.length; i++) { - if (!dialog.seperate[i].nextSibling.querySelector(".button:not(.nodisplay)")) { + if ( + !dialog.seperate[i].nextSibling.querySelector( + ".button:not(.nodisplay)" + ) + ) { dialog.seperate[i].style.display = "none"; dialog.seperate[i].nextSibling.style.display = "none"; } else { @@ -1255,12 +1552,17 @@ export class Create { newlined.style.textAlign = "center"; node.appendChild(newlined); } else if (newlined) { - var span = ui.create.div(".tdnode.pointerdiv.shadowed.reduce_radius"); + var span = ui.create.div( + ".tdnode.pointerdiv.shadowed.reduce_radius" + ); span.style.margin = "3px"; span.style.width = "auto"; span.innerHTML = " " + namecapt[i].toUpperCase() + " "; span.link = namecapt[i]; - span.addEventListener(lib.config.touchscreen ? "touchend" : "click", clickCapt); + span.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + clickCapt + ); newlined.appendChild(span); node[namecapt[i]] = span; if (namecapt[i] == "收藏") { @@ -1273,7 +1575,10 @@ export class Create { span.innerHTML = " " + namecapt[i].toUpperCase() + " "; span.link = namecapt[i]; span.alphabet = true; - span.addEventListener(lib.config.touchscreen ? "touchend" : "click", clickCapt); + span.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + clickCapt + ); node.appendChild(span); } } @@ -1304,13 +1609,20 @@ export class Create { if ( dialog.currentcapt && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else if ( dialog.currentcapt2 && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt, true) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt, + true + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else { @@ -1328,13 +1640,20 @@ export class Create { if ( dialog.currentcapt && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else if ( dialog.currentcapt2 && dialog.buttons[i].capt != - dialog.getCurrentCapt(dialog.buttons[i].link, dialog.buttons[i].capt, true) + dialog.getCurrentCapt( + dialog.buttons[i].link, + dialog.buttons[i].capt, + true + ) ) { dialog.buttons[i].classList.add("nodisplay"); } else if (dialog.currentgroup == "double") { @@ -1359,20 +1678,27 @@ export class Create { } }; for (var i = 0; i < groups.length; i++) { - var span = ui.create.div(".tdnode.pointerdiv.shadowed.reduce_radius.reduce_margin"); + var span = ui.create.div( + ".tdnode.pointerdiv.shadowed.reduce_radius.reduce_margin" + ); span.style.margin = "3px"; newlined.appendChild(span); span.innerHTML = get.translation(groups[i]); span.link = groups[i]; span._nature = natures[i]; - span.addEventListener(lib.config.touchscreen ? "touchend" : "click", clickGroup); + span.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + clickGroup + ); } var span = document.createElement("span"); newlined.appendChild(span); span.style.margin = "8px"; - packsource = ui.create.div(".tdnode.pointerdiv.shadowed.reduce_radius.reduce_margin"); + packsource = ui.create.div( + ".tdnode.pointerdiv.shadowed.reduce_radius.reduce_margin" + ); packsource.style.margin = "3px"; newlined.appendChild(packsource); var filternode = null; @@ -1386,7 +1712,9 @@ export class Create { if (get.is.phoneLayout() && lib.config.filternode_button) { newlined.style.marginTop = ""; packsource.innerHTML = "筛选"; - filternode = ui.create.div(".popup-container.filter-character.modenopause"); + filternode = ui.create.div( + ".popup-container.filter-character.modenopause" + ); ui.create.div(filternode); filternode.listen(function (e) { if (this.classList.contains("removing")) return; @@ -1412,7 +1740,9 @@ export class Create { } else { if (onlypack) { packsource.onlypack = true; - packsource.innerHTML = get.translation(onlypack + "_character_config"); + packsource.innerHTML = get.translation( + onlypack + "_character_config" + ); packsource.style.display = "none"; packsource.previousSibling.style.display = "none"; } else { @@ -1433,32 +1763,46 @@ export class Create { newlined2.style.textAlign = "center"; node.appendChild(newlined2); - packsource.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { - if (packsource.onlypack) return; - if (_status.dragged) return; - if (get.is.phoneLayout() && lib.config.filternode_button && filternode) { - _status.filterCharacter = true; - ui.window.classList.add("shortcutpaused"); - ui.window.appendChild(filternode); - ui.refresh(filternode); - filternode.classList.add("shown"); - var dh = filternode.offsetHeight - filternode.firstChild.offsetHeight; - if (dh > 0) { - filternode.firstChild.style.top = dh / 2 + "px"; + packsource.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + function () { + if (packsource.onlypack) return; + if (_status.dragged) return; + if ( + get.is.phoneLayout() && + lib.config.filternode_button && + filternode + ) { + _status.filterCharacter = true; + ui.window.classList.add("shortcutpaused"); + ui.window.appendChild(filternode); + ui.refresh(filternode); + filternode.classList.add("shown"); + var dh = + filternode.offsetHeight - + filternode.firstChild.offsetHeight; + if (dh > 0) { + filternode.firstChild.style.top = dh / 2 + "px"; + } else { + filternode.firstChild.style.top = ""; + } } else { - filternode.firstChild.style.top = ""; - } - } else { - if (newlined2.style.display == "none") { - newlined2.style.display = "block"; - } else { - newlined2.style.display = "none"; + if (newlined2.style.display == "none") { + newlined2.style.display = "block"; + } else { + newlined2.style.display = "none"; + } } } - }); + ); var packlist = []; for (var i = 0; i < lib.config.all.characters.length; i++) { - if (!lib.config.characters.includes(lib.config.all.characters[i])) continue; + if ( + !lib.config.characters.includes( + lib.config.all.characters[i] + ) + ) + continue; packlist.add(lib.config.all.characters[i]); } Object.keys(lib.characterPack) @@ -1466,7 +1810,10 @@ export class Create { if (key.indexOf("mode_extension") != 0) return false; const extName = key.slice(15); //if (!game.hasExtension(extName) || !game.hasExtensionLoaded(extName)) return false; - return lib.config[`extension_${extName}_characters_enable`] === true; + return ( + lib.config[`extension_${extName}_characters_enable`] === + true + ); }) .forEach((key) => packlist.add(key)); for (var i = 0; i < packlist.length; i++) { @@ -1479,9 +1826,13 @@ export class Create { } else { span.style.fontSize = "22px"; } - span.innerHTML = lib.translate[packlist[i] + "_character_config"]; + span.innerHTML = + lib.translate[packlist[i] + "_character_config"]; span.link = packlist[i]; - span.addEventListener(lib.config.touchscreen ? "touchend" : "click", clickCapt); + span.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + clickCapt + ); newlined2.appendChild(span); if (filternode && !onlypack) { span.touchlink = ui.create.div( @@ -1543,11 +1894,16 @@ export class Create { dialog.classList.add("scroll1"); dialog.classList.add("scroll2"); dialog.classList.add("scroll3"); - dialog.addEventListener(lib.config.touchscreen ? "touchend" : "mouseup", function () { - _status.clicked2 = true; - }); + dialog.addEventListener( + lib.config.touchscreen ? "touchend" : "mouseup", + function () { + _status.clicked2 = true; + } + ); if (heightset) { - dialog.style.height = (game.layout == "long2" || game.layout == "nova" ? 380 : 350) + "px"; + dialog.style.height = + (game.layout == "long2" || game.layout == "nova" ? 380 : 350) + + "px"; dialog._scrollset = true; } dialog.getCurrentCapt = function (link, capt, noalph) { @@ -1594,7 +1950,10 @@ export class Create { span.innerHTML = i; span.link = i; span.seperate = true; - span.addEventListener(lib.config.touchscreen ? "touchend" : "click", clickCapt); + span.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + clickCapt + ); newlined.appendChild(span); } } @@ -1628,7 +1987,8 @@ export class Create { if (thisiscard) { dialog.buttons[i].capt = getCapt(dialog.buttons[i].link[2]); } else { - dialog.buttons[i].group = lib.character[dialog.buttons[i].link][1]; + dialog.buttons[i].group = + lib.character[dialog.buttons[i].link][1]; dialog.buttons[i].capt = getCapt(dialog.buttons[i].link); } } @@ -1698,8 +2058,12 @@ export class Create { func; var node = ui.create.div(".config"); for (var i = 0; i < arguments.length; i++) { - if (typeof arguments[i] == "string" || typeof arguments[i] == "number") { - if (two) ui.create.div(".toggle", node).innerHTML = arguments[i]; + if ( + typeof arguments[i] == "string" || + typeof arguments[i] == "number" + ) { + if (two) + ui.create.div(".toggle", node).innerHTML = arguments[i]; else { ui.create.div(node).innerHTML = arguments[i]; two = true; @@ -1707,7 +2071,8 @@ export class Create { } else if (typeof arguments[i] == "function") func = arguments[i]; } if (func) { - for (var i = 0; i < node.childNodes.length; i++) node.childNodes[i].listen(func); + for (var i = 0; i < node.childNodes.length; i++) + node.childNodes[i].listen(func); } return node; } @@ -1728,12 +2093,18 @@ export class Create { switcher.innerHTML = get.translation(current); switcher.contentEditable = true; switcher.style.webkitUserSelect = "text"; - switcher.addEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.editor); + switcher.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.editor + ); } else if (typeof current == "object") { switcher.link = current2 || current[0]; switcher.innerHTML = get.translation(switcher.link); switcher.choice = current; - switcher.addEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.switcher); + switcher.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.switcher + ); } else { if (current) { switcher.classList.add("on"); @@ -1741,7 +2112,10 @@ export class Create { switcher.classList.add("onoff"); ui.create.div(ui.create.div(switcher)); switcher.link = current ? true : false; - switcher.addEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.toggle); + switcher.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.toggle + ); } if (func) switcher.additionalCommand = func; return node; @@ -1789,7 +2163,10 @@ export class Create { skills(skills) { var i, same; if (ui.skills) { - if (ui.skills.skills.length == skills.length && ui.skills.style.display != "none") { + if ( + ui.skills.skills.length == skills.length && + ui.skills.style.display != "none" + ) { same = true; for (i = 0; i < skills.length; i++) { if (ui.skills.skills.includes(skills[i]) == false) { @@ -1825,7 +2202,10 @@ export class Create { skills2(skills) { var i, same; if (ui.skills2) { - if (ui.skills2.skills.length == skills.length && ui.skills2.style.display != "none") { + if ( + ui.skills2.skills.length == skills.length && + ui.skills2.style.display != "none" + ) { same = true; for (i = 0; i < skills.length; i++) { if (ui.skills2.skills.includes(skills[i]) == false) { @@ -1861,7 +2241,10 @@ export class Create { skills3(skills) { var i, same; if (ui.skills3) { - if (ui.skills3.skills.length == skills.length && ui.skills3.style.display != "none") { + if ( + ui.skills3.skills.length == skills.length && + ui.skills3.style.display != "none" + ) { same = true; for (i = 0; i < skills.length; i++) { if (ui.skills3.skills.includes(skills[i]) == false) { @@ -1911,7 +2294,11 @@ export class Create { ui.window.classList.add("server"); var serverinfo = ui.create.div(".serverinfo", ui.window); ui.create.div("", "服务器正在运行", serverinfo); - var serverinfotable = ui.create.table(2, 2, ui.create.div(serverinfo)); + var serverinfotable = ui.create.table( + 2, + 2, + ui.create.div(serverinfo) + ); serverinfotable.style.display = "inline-block"; serverinfotable.firstChild.firstChild.innerHTML = "房间人数:"; serverinfotable.firstChild.lastChild.id = "server_count"; @@ -1925,7 +2312,9 @@ export class Create { function () { if ( _status.gameStarted && - !confirm("关闭服务器当前进行的游戏将终止且不可恢复,是否确定关闭?") + !confirm( + "关闭服务器当前进行的游戏将终止且不可恢复,是否确定关闭?" + ) ) { return; } @@ -1936,7 +2325,10 @@ export class Create { ); } - ui.window.addEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.window); + ui.window.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.window + ); ui.system = ui.create.div("#system.", ui.window); ui.arena = ui.create.div("#arena.nome", ui.window); if (lib.device == "ios" && !get.is.phoneLayout()) { @@ -1971,7 +2363,11 @@ export class Create { if (game.layout == "default") { ui.arena.classList.add("oldlayout"); } - if (lib.config.player_border != "wide" || game.layout == "long" || game.layout == "long2") { + if ( + lib.config.player_border != "wide" || + game.layout == "long" || + game.layout == "long2" + ) { ui.arena.classList.add("slim_player"); } if (lib.config.player_border == "slim") { @@ -2021,7 +2417,8 @@ export class Create { document.body.classList.add("statusbar"); } if (lib.config.keep_awake) { - if (window.plugins && window.plugins.insomnia) window.plugins.insomnia.keepAwake(); + if (window.plugins && window.plugins.insomnia) + window.plugins.insomnia.keepAwake(); else { lib.init.js(lib.assetURL + "game", "NoSleep", function () { var noSleep = new NoSleep(); @@ -2044,12 +2441,14 @@ export class Create { lib.init.js(lib.assetURL + "game", "pinyinjs", function () {}); lib.init.js(lib.assetURL + "game", "keyWords", function () {}); - lib.updateURL = lib.updateURLS[lib.config.update_link] || lib.updateURLS.coding; + lib.updateURL = + lib.updateURLS[lib.config.update_link] || lib.updateURLS.coding; lib.init.cssstyles(); ui.arena.dataset.player_height = lib.config.player_height || "default"; - ui.arena.dataset.player_height_nova = lib.config.player_height_nova || "default"; + ui.arena.dataset.player_height_nova = + lib.config.player_height_nova || "default"; // if(lib.config.player_height_nova=='long') ui.arena.classList.add('player_autolong'); ui.arena.dataset.target_shake = lib.config.target_shake || "off"; ui.backgroundMusic = document.createElement("audio"); @@ -2083,9 +2482,15 @@ export class Create { ui.arena.classList.add("hide_name"); } if (lib.config.change_skin_auto != "off") { - _status.skintimeout = setTimeout(ui.click.autoskin, parseInt(lib.config.change_skin_auto)); + _status.skintimeout = setTimeout( + ui.click.autoskin, + parseInt(lib.config.change_skin_auto) + ); } - if (lib.config.border_style && lib.config.border_style.startsWith("dragon_")) { + if ( + lib.config.border_style && + lib.config.border_style.startsWith("dragon_") + ) { ui.arena.dataset.framedecoration = lib.config.border_style.slice(7); } @@ -2100,7 +2505,10 @@ export class Create { ui.historybar = ui.create.div("#historybar.shadowed", ui.window); lib.setScroll(ui.historybar); - ui.roundmenu = ui.create.div("#roundmenu.roundarenabutton.menubutton.round", ui.arena); + ui.roundmenu = ui.create.div( + "#roundmenu.roundarenabutton.menubutton.round", + ui.arena + ); ui.roundmenu._position = [180, 210]; ui.create.div(ui.roundmenu); ui.create.div(ui.roundmenu); @@ -2198,7 +2606,8 @@ export class Create { if (!ui.roundmenu._dragtransform) { ui.roundmenu._dragtransform = [0, 0]; } - ui.roundmenu._dragorigintransform = ui.roundmenu._dragtransform.slice(0); + ui.roundmenu._dragorigintransform = + ui.roundmenu._dragtransform.slice(0); ui.roundmenu._resetTimeout = setTimeout(function () { resetround(); delete ui.roundmenu._resetTimeout; @@ -2213,7 +2622,8 @@ export class Create { if (lib.config.roundmenu_transform) { var translate = lib.config.roundmenu_transform; ui.roundmenu._dragtransform = translate; - ui.roundmenu.style.transform = "translate(" + translate[0] + "px," + translate[1] + "px)"; + ui.roundmenu.style.transform = + "translate(" + translate[0] + "px," + translate[1] + "px)"; ui.click.checkroundtranslate(); } if (get.is.phoneLayout()) { @@ -2281,7 +2691,14 @@ export class Create { ui.pause.hide(); } if (!lib.config.touchscreen) { - lib.setPopped(ui.pause, ui.click.pausehistory, 220, 400, null, true); + lib.setPopped( + ui.pause, + ui.click.pausehistory, + 220, + 400, + null, + true + ); } if (!lib.config.show_pause) { ui.pause.style.display = "none"; @@ -2309,7 +2726,11 @@ export class Create { }); } ui.auto.id = "autobutton"; - ui.autonode = ui.create.div("#autonode", "
    托管中...
    ", ui.arena); + ui.autonode = ui.create.div( + "#autonode", + "
    托管中...
    ", + ui.arena + ); ui.autonode.listen(ui.click.auto); if (lib.config.mode == "connect") { ui.auto.hide(); @@ -2317,11 +2738,16 @@ export class Create { } if (lib.forcehide) { - if (lib.forcehide.includes("replay")) ui.replay.classList.add("forcehide"); - if (lib.forcehide.includes("auto")) ui.auto.classList.add("forcehide"); - if (lib.forcehide.includes("pause")) ui.pause.classList.add("forcehide"); - if (lib.forcehide.includes("wuxie")) ui.wuxie.classList.add("forcehide"); - if (lib.forcehide.includes("cardPileButton")) ui.cardPileButton.classList.add("forcehide"); + if (lib.forcehide.includes("replay")) + ui.replay.classList.add("forcehide"); + if (lib.forcehide.includes("auto")) + ui.auto.classList.add("forcehide"); + if (lib.forcehide.includes("pause")) + ui.pause.classList.add("forcehide"); + if (lib.forcehide.includes("wuxie")) + ui.wuxie.classList.add("forcehide"); + if (lib.forcehide.includes("cardPileButton")) + ui.cardPileButton.classList.add("forcehide"); } ui.volumn = ui.create.system("♫"); lib.setPopped(ui.volumn, ui.click.volumn, 200); @@ -2357,7 +2783,8 @@ export class Create { } else hs.sort(function (b, a) { if (a.name != b.name) return lib.sort.card(a.name, b.name); - else if (a.suit != b.suit) return lib.suit.indexOf(a) - lib.suit.indexOf(b); + else if (a.suit != b.suit) + return lib.suit.indexOf(a) - lib.suit.indexOf(b); else return a.number - b.number; }); game.me.directgain(hs, false); @@ -2400,9 +2827,12 @@ export class Create { "rotate(" + get.round((hours + 9) * 30, 2) + "deg)"; } else { ui.roundmenu.childNodes[13].style.transform = - "rotate(" + get.round((hours + minutes / 60 + 9) * 30, 2) + "deg)"; + "rotate(" + + get.round((hours + minutes / 60 + 9) * 30, 2) + + "deg)"; } - ui.roundmenu.childNodes[12].style.transform = "rotate(" + (minutes + 45) * 6 + "deg)"; + ui.roundmenu.childNodes[12].style.transform = + "rotate(" + (minutes + 45) * 6 + "deg)"; if (minutes < 10) { minutes = "0" + minutes.toString(); } @@ -2468,7 +2898,12 @@ export class Create { ui.shortcut, game.reload ).dataset.position = 1; - ui.create.div(".menubutton.round", "退出", ui.shortcut, game.exit).dataset.position = 3; + ui.create.div( + ".menubutton.round", + "退出", + ui.shortcut, + game.exit + ).dataset.position = 3; ui.create.div( ".menubutton.round", "记录", @@ -2493,7 +2928,9 @@ export class Create { } if (removed) game.saveConfigValue("favouriteMode"); this.innerHTML = ""; - favouriteMode.slice(0, 6).forEach((value, index) => this.add(value, index)); + favouriteMode + .slice(0, 6) + .forEach((value, index) => this.add(value, index)); let mode = lib.config.mode; const config = get.config(`${mode}_mode`); if (typeof config == "string") mode += `|${config}`; @@ -2506,7 +2943,10 @@ export class Create { submode = info[1], node = ui.create.div(".menubutton.large", this), dataset = node.dataset; - dataset.type = Math.min(6, lib.config.favouriteMode.length) % 2 == 0 ? "even" : "odd"; + dataset.type = + Math.min(6, lib.config.favouriteMode.length) % 2 == 0 + ? "even" + : "odd"; dataset.position = index; let str = lib.translate[name] || lib.translate[mode] || ""; if (str.length == 2) str += "模式"; @@ -2519,7 +2959,9 @@ export class Create { }; ui.favmode = ui.create.system("收藏", function () { const mode = - typeof _status.mode == "string" ? `${lib.config.mode}|${_status.mode}` : lib.config.mode; + typeof _status.mode == "string" + ? `${lib.config.mode}|${_status.mode}` + : lib.config.mode; if (this.classList.contains("glow")) { this.classList.remove("glow"); lib.config.favouriteMode.remove(mode); @@ -2561,9 +3003,12 @@ export class Create { // @ts-ignore while (lib.arenaReady.length) lib.arenaReady.shift()(); delete lib.arenaReady; - if (lib.config.auto_check_update && !sessionStorage.getItem("auto_check_update")) { + if ( + lib.config.auto_check_update && + !sessionStorage.getItem("auto_check_update") + ) { setTimeout(() => { - sessionStorage.setItem("auto_check_update", '1'); + sessionStorage.setItem("auto_check_update", "1"); game.checkForUpdate(false); }, 3000); } @@ -2574,8 +3019,12 @@ export class Create { game.saveConfig("asset_version", "无"); } else { var func = function () { - if (confirm("是否下载图片和字体素材?(约386.6MB)")) { - if (!ui.arena.classList.contains("menupaused")) { + if ( + confirm("是否下载图片和字体素材?(约386.6MB)") + ) { + if ( + !ui.arena.classList.contains("menupaused") + ) { ui.click.configMenu(); ui.click.menuTab("其它"); } @@ -2625,15 +3074,25 @@ export class Create { node.listen(func); } if (lib.config.button_press) { - node.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", function (e) { - if (!node.classList.contains("hidden")) node.classList.add("pressdown"); - }); - node.addEventListener(lib.config.touchscreen ? "touchend" : "mouseup", function (e) { - node.classList.remove("pressdown"); - }); - node.addEventListener(lib.config.touchscreen ? "touchmove" : "mousemove", function (e) { - node.classList.remove("pressdown"); - }); + node.addEventListener( + lib.config.touchscreen ? "touchstart" : "mousedown", + function (e) { + if (!node.classList.contains("hidden")) + node.classList.add("pressdown"); + } + ); + node.addEventListener( + lib.config.touchscreen ? "touchend" : "mouseup", + function (e) { + node.classList.remove("pressdown"); + } + ); + node.addEventListener( + lib.config.touchscreen ? "touchmove" : "mousemove", + function (e) { + node.classList.remove("pressdown"); + } + ); } return node; } @@ -2692,7 +3151,10 @@ export class Create { * @returns { import("../library/index.js").Button } */ tdnodes: (item, type, position, noclick, node) => { - node = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode.tdnodes", position); + node = ui.create.div( + ".shadowed.reduce_radius.pointerdiv.tdnode.tdnodes", + position + ); if (Array.isArray(item)) { node.innerHTML = "" + item[1] + ""; node.link = item[0]; @@ -2708,10 +3170,16 @@ export class Create { blank: (item, type, position, noclick, node) => { node = ui.create.div(".button.card", position); node.link = item; - if (get.position(item) == "j" && item.viewAs && lib.config.cardtempname != "off") { + if ( + get.position(item) == "j" && + item.viewAs && + lib.config.cardtempname != "off" + ) { node.classList.add("infoflip"); node.classList.add("infohidden"); - ui.create.cardTempName(item, node).style.setProperty("display", "block", "important"); + ui.create + .cardTempName(item, node) + .style.setProperty("display", "block", "important"); } return node; }, @@ -2776,9 +3244,13 @@ export class Create { node = ui.create.div(".button.character", position); } node._link = item; - if (_status.noReplaceCharacter && type == "characterx") type = "character"; + if (_status.noReplaceCharacter && type == "characterx") + type = "character"; if (type == "characterx") { - if (lib.characterReplace[item] && lib.characterReplace[item].length) + if ( + lib.characterReplace[item] && + lib.characterReplace[item].length + ) item = lib.characterReplace[item].randomGet(); } node.link = item; @@ -2798,7 +3270,8 @@ export class Create { node.node.hp.remove(); node.node.group.remove(); node.node.intro.remove(); - if (node.node.replaceButton) node.node.replaceButton.remove(); + if (node.node.replaceButton) + node.node.replaceButton.remove(); } node.node = { name: ui.create.div(".name", node), @@ -2824,8 +3297,13 @@ export class Create { node.node.group.style.display = "none"; } node.classList.add("newstyle"); - node.node.name.dataset.nature = get.groupnature(get.bordergroup(infoitem)); - node.node.group.dataset.nature = get.groupnature(get.bordergroup(infoitem), "raw"); + node.node.name.dataset.nature = get.groupnature( + get.bordergroup(infoitem) + ); + node.node.group.dataset.nature = get.groupnature( + get.bordergroup(infoitem), + "raw" + ); ui.create.div(node.node.hp); var hp = get.infoHp(infoitem[2]), maxHp = get.infoMaxHp(infoitem[2]), @@ -2852,7 +3330,8 @@ export class Create { var maxHp = get.infoMaxHp(infoitem[2]); var shield = get.infoHujia(infoitem[2]); if (maxHp > 14) { - if (typeof infoitem[2] == "string") node.node.hp.innerHTML = infoitem[2]; + if (typeof infoitem[2] == "string") + node.node.hp.innerHTML = infoitem[2]; else node.node.hp.innerHTML = get.numStr(infoitem[2]); node.node.hp.classList.add("text"); } else { @@ -2871,8 +3350,14 @@ export class Create { if (node.node.name.querySelectorAll("br").length >= 4) { node.node.name.classList.add("long"); if (lib.config.buttoncharacter_style == "old") { - node.addEventListener("mouseenter", ui.click.buttonnameenter); - node.addEventListener("mouseleave", ui.click.buttonnameleave); + node.addEventListener( + "mouseenter", + ui.click.buttonnameenter + ); + node.addEventListener( + "mouseleave", + ui.click.buttonnameleave + ); } } node.node.intro.innerHTML = lib.config.intro; @@ -2889,9 +3374,13 @@ export class Create { "" ); if (double.length > 4) - if (new Set([5, 6, 9]).has(double.length)) node.node.group.style.height = "48px"; + if (new Set([5, 6, 9]).has(double.length)) + node.node.group.style.height = "48px"; else node.node.group.style.height = "64px"; - } else node.node.group.innerHTML = `
    ${get.translation(infoitem[1])}
    `; + } else + node.node.group.innerHTML = `
    ${get.translation( + infoitem[1] + )}
    `; node.node.group.style.backgroundColor = get.translation( `${get.bordergroup(infoitem)}Color` ); @@ -2904,21 +3393,24 @@ export class Create { node.node.replaceButton = intro; intro.innerHTML = "切换"; intro._node = node; - intro.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { - _status.tempNoButton = true; - var node = this._node; - var list = lib.characterReplace[node._link]; - var link = node.link; - var index = list.indexOf(link); - if (index == list.length - 1) index = 0; - else index++; - link = list[index]; - node.link = link; - node.refresh(node, link); - setTimeout(function () { - delete _status.tempNoButton; - }, 200); - }); + intro.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + function () { + _status.tempNoButton = true; + var node = this._node; + var list = lib.characterReplace[node._link]; + var link = node.link; + var index = list.indexOf(link); + if (index == list.length - 1) index = 0; + else index++; + link = list[index]; + node.link = link; + node.refresh(node, link); + setTimeout(function () { + delete _status.tempNoButton; + }, 200); + } + ); } }; node.refresh = func; @@ -2930,7 +3422,13 @@ export class Create { * @returns { import("../library/index.js").Button } */ characterx: (item, type, position, noclick, node) => { - return ui.create.buttonPresets.character(item, type, position, noclick, node); + return ui.create.buttonPresets.character( + item, + type, + position, + noclick, + node + ); }, /** * @returns { import("../library/index.js").Button } @@ -2952,7 +3450,11 @@ export class Create { if (item.name && item.name.startsWith("unknown")) { if (item.node && item.node.name_seat) { node.classList.add("cardbg"); - ui.create.div(".avatar_name", node, get.translation(item.name)); + ui.create.div( + ".avatar_name", + node, + get.translation(item.name) + ); } else { node.setBackground(item.name1, "character"); } @@ -2984,9 +3486,18 @@ export class Create { var fragment = document.createDocumentFragment(); for (var i = 0; i < list.length; i++) { if (pre) { - buttons.push(ui.create.prebutton(list[i], type.slice(3), fragment, noclick)); + buttons.push( + ui.create.prebutton( + list[i], + type.slice(3), + fragment, + noclick + ) + ); } else { - buttons.push(ui.create.button(list[i], type, fragment, noclick)); + buttons.push( + ui.create.button(list[i], type, fragment, noclick) + ); } } if (position) position.appendChild(fragment); @@ -3002,7 +3513,8 @@ export class Create { str = item; link = item; } - if (!str.startsWith(""; + if (!str.startsWith(""; var next = dialog.add(str); if (!noclick) next.firstChild.addEventListener( @@ -3021,7 +3533,8 @@ export class Create { ui.updateConnectPlayerPositions(); game.connectPlayers = []; const configOL = lib.configOL; - const numberOfPlayers = parseInt(configOL.player_number) || configOL.number; + const numberOfPlayers = + parseInt(configOL.player_number) || configOL.number; for (let position = 0; position < numberOfPlayers; position++) { const player = ui.create.player(ui.window); player.dataset.position = position; @@ -3058,7 +3571,11 @@ export class Create { } else { var num = 0; for (var i of game.connectPlayers) { - if (!i.nickname && !i.classList.contains("unselectable2")) num++; + if ( + !i.nickname && + !i.classList.contains("unselectable2") + ) + num++; } if (num >= lib.configOL.number - 1) { alert("至少要有两名玩家才能开始游戏!"); @@ -3084,8 +3601,12 @@ export class Create { var text = `无名杀-联机-${lib.translate[get.mode()]}-${ game.connectPlayers.filter((p) => p.avatar).length }/${ - game.connectPlayers.filter((p) => !p.classList.contains("unselectable2")).length - }\n${get.connectNickname()}邀请你加入${game.roomId}房间\n联机地址:${ + game.connectPlayers.filter( + (p) => !p.classList.contains("unselectable2") + ).length + }\n${get.connectNickname()}邀请你加入${ + game.roomId + }房间\n联机地址:${ game.ip }\n请先通过游戏内菜单-开始-联机中启用“读取邀请链接”选项`; window.focus(); @@ -3099,7 +3620,9 @@ export class Create { game.alert(`分享内容复制失败${e || ""}`); }); } else { - var input = ui.create.node("textarea", ui.window, { opacity: "0" }); + var input = ui.create.node("textarea", ui.window, { + opacity: "0", + }); input.value = text; input.focus(); input.select(); @@ -3213,11 +3736,23 @@ export class Create { if (lib.card[lib.card.list[i][2]]) { if (!lib.card.list[i]._replaced) { if (!_status.connectMode) { - if (lib.config.bannedcards.includes(lib.card.list[i][2])) continue; + if ( + lib.config.bannedcards.includes(lib.card.list[i][2]) + ) + continue; } else { - if (lib.configOL.bannedcards.includes(lib.card.list[i][2])) continue; + if ( + lib.configOL.bannedcards.includes( + lib.card.list[i][2] + ) + ) + continue; } - if (game.bannedcards && game.bannedcards.includes(lib.card.list[i][2])) continue; + if ( + game.bannedcards && + game.bannedcards.includes(lib.card.list[i][2]) + ) + continue; } lib.inpile.add(lib.card.list[i][2]); if (lib.card.list[i][2] == "sha" && lib.card.list[i][3]) @@ -3235,7 +3770,8 @@ export class Create { } game.broadcastAll( function (num, pile, top, cardtag, inpile2) { - if (ui.cardPileNumber) ui.cardPileNumber.innerHTML = "0轮 剩余牌: " + num; + if (ui.cardPileNumber) + ui.cardPileNumber.innerHTML = "0轮 剩余牌: " + num; lib.inpile = pile; _status.pileTop = top; _status.cardtag = cardtag; diff --git a/noname/ui/index.js b/noname/ui/index.js index 638e0ca9d..b57bc9361 100644 --- a/noname/ui/index.js +++ b/noname/ui/index.js @@ -136,6 +136,11 @@ export class UI { * @type {HTMLDivElement} */ tempnowuxie; + /** + * @type {HTMLDivElement[]} + */ + toastQueue = []; + refresh(node) { void window.getComputedStyle(node, null).getPropertyValue("opacity"); } From a502b0bdf8afeb60d492b4f0d1701f83fb0d8b7f Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 13:03:35 +0800 Subject: [PATCH 07/57] =?UTF-8?q?=E3=80=90=E6=8B=92=E6=AD=A6=E3=80=91?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/offline.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/character/offline.js b/character/offline.js index 662a28be9..1c9ad4f72 100644 --- a/character/offline.js +++ b/character/offline.js @@ -703,7 +703,10 @@ game.import("character", function () { dragjuwu: { trigger: { target: "shaBefore" }, filter(event, player) { - return game.countPlayer((target) => event.player.inRange(target)) >= 3; + return ( + !game.hasNature(event.card) && + game.countPlayer((target) => event.player.inRange(target)) >= 3 + ); }, forced: true, content() { @@ -714,6 +717,7 @@ game.import("character", function () { target(card, player, target) { if ( card.name == "sha" && + !game.hasNature(card) && game.countPlayer((targetx) => player.inRange(targetx)) >= 3 ) return "zerotarget"; From 16a391f74aa9048edd87aed0c52e94096cfe8dd3 Mon Sep 17 00:00:00 2001 From: kuangthree Date: Sat, 20 Apr 2024 13:23:28 +0800 Subject: [PATCH 08/57] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=8C=E7=94=B2?= =?UTF-8?q?=E5=A4=A9=E4=B8=8B=E8=87=AA=E7=94=B1=E7=82=B9=E5=B0=86=E6=97=A0?= =?UTF-8?q?=E9=99=90=E5=88=B7=E9=87=91=E5=B8=81BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio/effect/coin.mp3 | Bin 0 -> 10074 bytes audio/effect/coin_cost.mp3 | Bin 0 -> 36614 bytes extension/coin/extension.js | 6 +++++- layout/default/toast.css | 2 +- mode/boss.js | 2 +- mode/brawl.js | 2 +- mode/chess.js | 2 +- mode/doudizhu.js | 2 +- mode/guozhan.js | 2 +- mode/identity.js | 2 +- mode/stone.js | 2 +- mode/versus.js | 8 ++++---- noname/ui/create/index.js | 2 +- 13 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 audio/effect/coin.mp3 create mode 100644 audio/effect/coin_cost.mp3 diff --git a/audio/effect/coin.mp3 b/audio/effect/coin.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c5be25569726ea38d74e0f6c6bf847e60f082140 GIT binary patch literal 10074 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 u-Jk#Ua$GB)!tlmj4&#Jb&5% literal 0 HcmV?d00001 diff --git a/audio/effect/coin_cost.mp3 b/audio/effect/coin_cost.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1bed546bb044bffaa2306b827bc00b5ea4cea0dd GIT binary patch literal 36614 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 ZWs7D`mzW_DN;Lpa##A$L)Sw|00sz1~4Ilsj literal 0 HcmV?d00001 diff --git a/extension/coin/extension.js b/extension/coin/extension.js index 0e59440fe..cf5aaa005 100644 --- a/extension/coin/extension.js +++ b/extension/coin/extension.js @@ -131,8 +131,12 @@ game.import("play", function () { } }, game: { - changeCoin: function (num) { + changeCoin: function (num,toast) { if (typeof num == "number" && ui.coin) { + if(num!=0 && toast!== false){ + game.playAudio('effect',num > 0?"coin":"coin_cost"); + ui.create.toast(`${num > 0 ? "获得":"花费"} ${num} 金币`); + } game.saveConfig("coin", lib.config.coin + num); var str; if (lib.config.coin_display_playpackconfig == "text") { diff --git a/layout/default/toast.css b/layout/default/toast.css index ca4d5be32..f177242c8 100644 --- a/layout/default/toast.css +++ b/layout/default/toast.css @@ -1,5 +1,5 @@ .toast-container { - position: fixed; + position: absolute; top: 15%; left: 50%; transform: translateX(-50%); diff --git a/mode/boss.js b/mode/boss.js index dc1b569a1..673a86cd2 100644 --- a/mode/boss.js +++ b/mode/boss.js @@ -1718,7 +1718,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/mode/brawl.js b/mode/brawl.js index 1ddbb59d8..7963c93b7 100644 --- a/mode/brawl.js +++ b/mode/brawl.js @@ -3420,7 +3420,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/mode/chess.js b/mode/chess.js index ca13e949d..16326c333 100644 --- a/mode/chess.js +++ b/mode/chess.js @@ -4306,7 +4306,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/mode/doudizhu.js b/mode/doudizhu.js index 9acb775e0..a0b6e7e94 100644 --- a/mode/doudizhu.js +++ b/mode/doudizhu.js @@ -1094,7 +1094,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/mode/guozhan.js b/mode/guozhan.js index b979e592c..5ef523cb5 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -22429,7 +22429,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/mode/identity.js b/mode/identity.js index 15c00e139..4bbd46f23 100644 --- a/mode/identity.js +++ b/mode/identity.js @@ -2303,7 +2303,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/mode/stone.js b/mode/stone.js index 9d7de1f9a..1a5ebf5f5 100644 --- a/mode/stone.js +++ b/mode/stone.js @@ -2486,7 +2486,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/mode/versus.js b/mode/versus.js index 8a1967da4..2ee231b97 100644 --- a/mode/versus.js +++ b/mode/versus.js @@ -841,7 +841,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; @@ -1115,7 +1115,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; @@ -1446,7 +1446,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; @@ -1637,7 +1637,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { - game.changeCoin(50); + game.changeCoin(10); } this.dialog.close(); _status.event.dialog = this.backup; diff --git a/noname/ui/create/index.js b/noname/ui/create/index.js index 33b7283f9..235a5cbc9 100644 --- a/noname/ui/create/index.js +++ b/noname/ui/create/index.js @@ -360,7 +360,7 @@ export class Create { return container; })(); const toast = document.createElement("div"); - toast.textContent = message; + toast.innerHTML = message; toast.classList.add("toast"); toastContainer.appendChild(toast); ui.toastQueue.push(toast); From 9a0d853afa36bbcd4a46a64a9bbbc8afee613040 Mon Sep 17 00:00:00 2001 From: kuangthree Date: Sat, 20 Apr 2024 13:35:48 +0800 Subject: [PATCH 09/57] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/default/toast.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/layout/default/toast.css b/layout/default/toast.css index f177242c8..b5486fb0b 100644 --- a/layout/default/toast.css +++ b/layout/default/toast.css @@ -1,4 +1,5 @@ .toast-container { + display:block; position: absolute; top: 15%; left: 50%; @@ -8,7 +9,10 @@ .toast { - display: none; + display: block; + position: absolute; + left: 50%; + transform: translateX(-50%); background-color: rgba(255, 165, 0, 0.7); border-radius: 10px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); From 7b939703d339748bf4d2469dbcf05c93eff1a9fa Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Sat, 20 Apr 2024 14:10:37 +0800 Subject: [PATCH 10/57] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BD=91=E9=A1=B5?= =?UTF-8?q?=E7=AB=AF=E8=AF=B7=E6=B1=82=E6=95=B0=E6=8D=AE=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname-server.exe | Bin 70687232 -> 70700544 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/noname-server.exe b/noname-server.exe index 09a1389ce529dfa164331d2189a4e4e8a0812386..69295a94e03f7bb7095a837c9aa8fa0616d788b7 100644 GIT binary patch delta 43201 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 S* Date: Sat, 20 Apr 2024 14:12:57 +0800 Subject: [PATCH 11/57] =?UTF-8?q?=E5=B0=86=E5=90=8C=E6=97=B6=E8=AF=BB?= =?UTF-8?q?=E5=86=99=E7=9A=84=E5=B9=B6=E5=8F=91=E6=95=B0=E4=BB=8E10?= =?UTF-8?q?=E6=94=B9=E4=B8=BA20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/ui/create/menu/pages/otherMenu.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/noname/ui/create/menu/pages/otherMenu.js b/noname/ui/create/menu/pages/otherMenu.js index 627c44a8b..4f6fe0943 100644 --- a/noname/ui/create/menu/pages/otherMenu.js +++ b/noname/ui/create/menu/pages/otherMenu.js @@ -439,11 +439,11 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM * @param { (value: T) => Promise } predicate */ const asyncFilter = async (arr, predicate) => { - //将arr每10个分为一个数组,分别使用Promise.all + //将arr每20个分为一个数组,分别使用Promise.all /** @type { boolean[] } */ const results = []; - for (let i = 0; i < arr.length; i += 10) { - const pushArr = arr.slice(i, i + 10); + for (let i = 0; i < arr.length; i += 20) { + const pushArr = arr.slice(i, i + 20); results.push( ...await Promise.all(pushArr.map(predicate)) ); From e85d403eaa0b5bf436d0a4277477db82b699c6da Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Sat, 20 Apr 2024 14:35:45 +0800 Subject: [PATCH 12/57] =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=B4=A0=E6=9D=90=E7=89=88=E6=9C=AC=E6=98=BE=E7=A4=BA=E5=92=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8D=E6=9B=BF=E6=8D=A2=E5=B7=B2=E6=9C=89?= =?UTF-8?q?=E7=B4=A0=E6=9D=90=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/ui/create/menu/pages/otherMenu.js | 46 ++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/noname/ui/create/menu/pages/otherMenu.js b/noname/ui/create/menu/pages/otherMenu.js index 4f6fe0943..c5092e6f3 100644 --- a/noname/ui/create/menu/pages/otherMenu.js +++ b/noname/ui/create/menu/pages/otherMenu.js @@ -453,8 +453,11 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM const result = await asyncFilter(files.flat(), async v => { return game.promises.readFile(v.path).then(data => { + // 有设置就不进行对比直接返回false + if (lib.config.asset_notReplaceExistingFiles) return false; return v.size != data.byteLength; - }).catch(()=>true) + // 报错了就是没有文件 + }).catch(() => true); }).then(arr => arr.map((v) => v.path)); console.log("需要更新的文件有:", result); @@ -463,6 +466,22 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM await lib.init.promises.js("game", "asset"); if (Array.isArray(window.noname_asset_list)) { game.saveConfig("asset_version", window.noname_asset_list[0]); + try { + // 动态更新素材版本显示 + if ( + li2 instanceof HTMLLIElement && + li2.childNodes[0] && + // nodeType = 3为text + li2.childNodes[0].nodeType === 3 && + li2.childNodes[0].textContent.startsWith( + "素材版本" + ) + ) { + li2.childNodes[0].textContent = `素材版本:${window.noname_asset_list[0]}`; + } + } catch (error) { + console.error("动态更新素材版本显示失败:", error); + } delete window.noname_asset_list; } if (confirm("更新完成,是否重启?")) { @@ -655,7 +674,9 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM if (!this.classList.toggle("on")) { game.saveConfig("asset_toggle_off", true); [ - /* span2, span2_br, span2_check,*/ + span7, + span7_br, + span7_check, span3, span3_br, span3_check, @@ -674,7 +695,9 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM } else { game.saveConfig("asset_toggle_off"); [ - /* span2, span2_br, span2_check,*/ + span7, + span7_br, + span7_check, span3, span3_br, span3_check, @@ -699,6 +722,23 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM // li2.lastChild.appendChild(span6_br); // var span2_br = ui.create.node('br'); + var span7 = ui.create.div("", `不替换已有素材`); + span7.style.fontSize = "small"; + span7.style.lineHeight = "16px"; + li2.lastChild.appendChild(span7); + var span7_check = document.createElement("input"); + span7_check.type = "checkbox"; + span7_check.style.marginLeft = "5px"; + if (lib.config.asset_notReplaceExistingFiles) { + span7_check.checked = true; + } + span7_check.onchange = function () { + game.saveConfig("asset_notReplaceExistingFiles", this.checked); + }; + li2.lastChild.appendChild(span7_check); + var span7_br = ui.create.node("br"); + li2.lastChild.appendChild(span7_br); + var span4 = ui.create.div("", `字体素材(${lib.config.asset_font_size || "23.4MB"})`); span4.style.fontSize = "small"; span4.style.lineHeight = "16px"; From 72481e71936c4fa83dcc420d2acec9035ca032e1 Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Sat, 20 Apr 2024 14:59:04 +0800 Subject: [PATCH 13/57] =?UTF-8?q?=E5=9B=9E=E9=80=80import('../library/inde?= =?UTF-8?q?x.js').GameEvent=E7=9A=84=E5=86=99=E6=B3=95=EF=BC=8C=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E9=83=A8=E5=88=86=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/game/index.js | 54 +++++----- noname/get/index.js | 31 ++++-- noname/library/element/button.js | 22 +++- noname/library/element/card.js | 169 ++++++++++++++++++++++++------- noname/library/element/dialog.js | 42 ++++++-- noname/library/element/player.js | 1 + 6 files changed, 234 insertions(+), 85 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index 002c12b42..297017ea8 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -557,8 +557,8 @@ export class Game { /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { boolean } */ hasGlobalHistory(key, filter, last) { @@ -580,8 +580,8 @@ export class Game { /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { void } */ checkGlobalHistory(key, filter, last) { @@ -608,8 +608,8 @@ export class Game { * @template { keyof GameHistory } T * @overload * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } [filter] - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] * @returns { GameHistory[T] } */ getGlobalHistory(key, filter, last) { @@ -630,8 +630,8 @@ export class Game { /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { boolean } */ hasAllGlobalHistory(key, filter, last) { @@ -656,8 +656,8 @@ export class Game { /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { void } */ checkAllGlobalHistory(key, filter, last) { @@ -686,8 +686,8 @@ export class Game { * @template { keyof GameHistory } T * @overload * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } [filter] - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] * @returns { GameHistory[T] } */ getAllGlobalHistory(key, filter, last) { @@ -718,12 +718,12 @@ export class Game { /** * @overload * @param { Card } cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ /** * @overload * @param {Card[]} cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ cardsDiscard(cards) { /** @type { 'cards' | 'card' | void } */ @@ -746,12 +746,12 @@ export class Game { /** * @overload * @param { Card } cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ /** * @overload * @param {Card[]} cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ cardsGotoOrdering(cards) { /** @type { 'cards' | 'card' | void } */ @@ -771,13 +771,13 @@ export class Game { * @overload * @param { Card } cards * @param { 'toRenku' | false } [bool] 为false时不触发trigger,为'toRenku'时牌放到仁库 - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ /** * @overload * @param {Card[]} cards * @param { 'toRenku' | false } [bool] 为false时不触发trigger,为'toRenku'时牌放到仁库 - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ cardsGotoSpecial(cards, bool) { /** @type { 'cards' | 'card' | void } */ @@ -836,7 +836,7 @@ export class Game { return next; } /** - * @param { import('../library/index.js').GameEventPromise } event + * @param { GameEventPromise } event */ $cardsGotoPile(event) { const cards = event.cards; @@ -4651,8 +4651,8 @@ export class Game { * @param { string } name * @param { string } skill * @param { Player } player - * @param { import('../library/index.js').GameEventPromise } event - * @returns { import('../library/index.js').GameEventPromise } + * @param { GameEventPromise } event + * @returns { GameEventPromise } */ createTrigger(name, skill, player, event, indexedData) { let info = get.info(skill); @@ -4675,7 +4675,7 @@ export class Game { * * @param { string } name * @param { false } [trigger] - * @param { import('../library/index.js').GameEventPromise } [triggerEvent] + * @param { GameEventPromise } [triggerEvent] */ createEvent(name, trigger, triggerEvent) { const next = new lib.element.GameEvent(name, trigger).toPromise(); @@ -5832,11 +5832,11 @@ export class Game { */ executingAsyncEventMap = new Map(); /** - * @type { import('../library/index.js').GameEventPromise[] } + * @type { GameEventPromise[] } */ belongAsyncEventList = []; /** - * @param { import('../library/index.js').GameEventPromise } [belongAsyncEvent] + * @param { GameEventPromise } [belongAsyncEvent] */ async loop(belongAsyncEvent) { if (belongAsyncEvent) { @@ -6017,7 +6017,7 @@ export class Game { } } /** - * @param { import('../library/index.js').GameEventPromise } [belongAsyncEvent] + * @param { GameEventPromise } [belongAsyncEvent] */ runContent(belongAsyncEvent) { return new Promise((resolve) => { @@ -6331,7 +6331,7 @@ export class Game { return game.asyncDelay(time, time2); } /** - * @param { import('../library/index.js').GameEventPromise } [event] + * @param { GameEventPromise } [event] */ check(event = _status.event) { game.callHook("checkBegin", [event]); @@ -7936,7 +7936,7 @@ export class Game { * @param { Player } player * @param { string | Card[] } card * @param { Player[] } [targets] - * @param { import('../library/index.js').GameEventPromise } [event] + * @param { GameEventPromise } [event] * @param { boolean } [forced] * @param { string } [logvid] */ diff --git a/noname/get/index.js b/noname/get/index.js index 1cfd07316..b1a632e09 100644 --- a/noname/get/index.js +++ b/noname/get/index.js @@ -916,23 +916,32 @@ export class Get { "[object Date]": true, }; - if (typeof obj !== "object" || obj === null || !canTranverse[getType(obj)]) return obj; + if ( + typeof obj !== "object" || + obj === null || + !canTranverse[getType(obj)] + ) + return obj; // @ts-ignore if (map.has(obj)) return map.get(obj); const constructor = obj.constructor; // @ts-ignore + // 这四类数据处理单独处理 + // (实际上需要处理的只有Map和Set) + // 除此之外的就只能祝愿有拷贝构造函数了 const target = constructor - ? // 这四类数据处理单独处理 - // (实际上需要处理的只有Map和Set) - // 除此之外的就只能祝愿有拷贝构造函数了 - Array.isArray(obj) || obj instanceof Map || obj instanceof Set || constructor === Object + ? Array.isArray(obj) || + obj instanceof Map || + obj instanceof Set || + constructor === Object ? // @ts-ignore - new constructor() - : constructor.name in window && /\[native code\]/.test(constructor.toString()) + new constructor() + : constructor.name in window && + /\[native code\]/.test(constructor.toString()) ? // @ts-ignore - new constructor(obj) + new constructor(obj) : obj : Object.create(null); if (target === obj) return target; @@ -959,7 +968,11 @@ export class Get { if (obj.hasOwnProperty(key)) { const result = { enumerable, configurable }; if (descriptor.hasOwnProperty("value")) { - result.value = get.copy(descriptor.value, copyKeyDeep, map); + result.value = get.copy( + descriptor.value, + copyKeyDeep, + map + ); result.writable = descriptor.writable; } else { const { get, set } = descriptor; diff --git a/noname/library/element/button.js b/noname/library/element/button.js index daf50ec3d..5f8fe51f3 100644 --- a/noname/library/element/button.js +++ b/noname/library/element/button.js @@ -6,6 +6,7 @@ export class Button extends HTMLDivElement { /** * @type { string | undefined } */ + // eslint-disable-next-line no-unreachable buttonid; /** * @param {{}} item @@ -21,13 +22,26 @@ export class Button extends HTMLDivElement { // @ts-ignore [item, type, position, noClick, button] = other._args; } - if (typeof type == "function") button = type(item, type, position, noClick, button); + if (typeof type == "function") + button = type(item, type, position, noClick, button); else if (ui.create.buttonPresets[type]) - button = ui.create.buttonPresets[type](item, type, position, noClick, button); + button = ui.create.buttonPresets[type]( + item, + type, + position, + noClick, + button + ); if (button) { - Object.setPrototypeOf(button, (lib.element.Button || Button).prototype); + Object.setPrototypeOf( + button, + (lib.element.Button || Button).prototype + ); if (!noClick) - button.addEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.button); + button.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.button + ); else { button.classList.add("noclick"); const intro = button.querySelector(".intro"); diff --git a/noname/library/element/card.js b/noname/library/element/card.js index f316b57cd..7e91d8be0 100644 --- a/noname/library/element/card.js +++ b/noname/library/element/card.js @@ -40,7 +40,10 @@ export class Card extends HTMLDivElement { buildEventListener(info) { let card = this; if (info != "noclick") { - card.addEventListener(lib.config.touchscreen ? "touchend" : "click", ui.click.card); + card.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + ui.click.card + ); if (lib.config.touchscreen) { card.addEventListener("touchstart", ui.click.cardtouchstart); card.addEventListener("touchmove", ui.click.cardtouchmove); @@ -75,6 +78,7 @@ export class Card extends HTMLDivElement { if (!noclick) lib.setIntro(this); } /** @type { SMap } */ + // eslint-disable-next-line no-unreachable node; /** * @type { string } @@ -192,7 +196,10 @@ export class Card extends HTMLDivElement { } removeGaintag(tag) { if (tag === true) { - if ((this.gaintag && this.gaintag.length) || this.node.gaintag.innerHTML.length) + if ( + (this.gaintag && this.gaintag.length) || + this.node.gaintag.innerHTML.length + ) this.addGaintag([]); } else if (this.hasGaintag(tag)) { this.gaintag.remove(tag); @@ -260,7 +267,11 @@ export class Card extends HTMLDivElement { this.number = parseInt(card[1]) || 0; this.name = card[2]; - if (info.destroy && typeof info.destroy != "boolean" && !lib.skill[info.destroy]) { + if ( + info.destroy && + typeof info.destroy != "boolean" && + !lib.skill[info.destroy] + ) { this.destroyed = info.destroy; } @@ -291,7 +302,21 @@ export class Card extends HTMLDivElement { var cardnum = card[1] || ""; if (parseInt(cardnum) == cardnum) cardnum = parseInt(cardnum); if (cardnum > 0 && cardnum < 14) { - cardnum = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"][cardnum - 1]; + cardnum = [ + "A", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "J", + "Q", + "K", + ][cardnum - 1]; } if (this.name) { this.classList.remove("epic"); @@ -338,14 +363,20 @@ export class Card extends HTMLDivElement { this.classList.add("fullskin"); if (img) { if (img.startsWith("ext:")) { - this.node.image.setBackgroundImage(img.replace(/^ext:/, "extension/")); + this.node.image.setBackgroundImage( + img.replace(/^ext:/, "extension/") + ); } else { this.node.image.setBackgroundDB(img); } } else { if (lib.card[bg].modeimage) { this.node.image.setBackgroundImage( - "image/mode/" + lib.card[bg].modeimage + "/card/" + bg + ".png" + "image/mode/" + + lib.card[bg].modeimage + + "/card/" + + bg + + ".png" ); } else { do { @@ -353,18 +384,29 @@ export class Card extends HTMLDivElement { if (bg == "sha" && typeof nature == "string") { let natures = get.natureList(nature), _bg; - for (const n of natures) if (lib.natureBg.has(n)) _bg = n; + for (const n of natures) + if (lib.natureBg.has(n)) _bg = n; if (_bg) { - this.node.image.setBackgroundImage(lib.natureBg.get(_bg)); + this.node.image.setBackgroundImage( + lib.natureBg.get(_bg) + ); break; } } - this.node.image.setBackgroundImage("image/card/" + bg + ".png"); + this.node.image.setBackgroundImage( + "image/card/" + bg + ".png" + ); } while (0); } } - } else if (get.dynamicVariable(lib.card[bg].image, this) == "background") { - if (card[3]) this.node.background.setBackground(bg + "_" + get.natureList(card[3])[0], "card"); + } else if ( + get.dynamicVariable(lib.card[bg].image, this) == "background" + ) { + if (card[3]) + this.node.background.setBackground( + bg + "_" + get.natureList(card[3])[0], + "card" + ); else this.node.background.setBackground(bg, "card"); } else if (lib.card[bg].fullimage) { this.classList.add("fullimage"); @@ -376,10 +418,19 @@ export class Card extends HTMLDivElement { this.setBackgroundDB(img); } } else if (get.dynamicVariable(lib.card[bg].image, this)) { - if (get.dynamicVariable(lib.card[bg].image, this).startsWith("character:")) { - this.setBackground(get.dynamicVariable(lib.card[bg].image, this).slice(10), "character"); + if ( + get + .dynamicVariable(lib.card[bg].image, this) + .startsWith("character:") + ) { + this.setBackground( + get.dynamicVariable(lib.card[bg].image, this).slice(10), + "character" + ); } else { - this.setBackground(get.dynamicVariable(lib.card[bg].image, this)); + this.setBackground( + get.dynamicVariable(lib.card[bg].image, this) + ); } } else { var cardPack = lib.cardPack["mode_" + get.mode()]; @@ -407,30 +458,44 @@ export class Card extends HTMLDivElement { } if (img) { if (img.startsWith("ext:")) { - this.node.avatar.setBackgroundImage(img.replace(/^ext:/, "extension/")); + this.node.avatar.setBackgroundImage( + img.replace(/^ext:/, "extension/") + ); this.node.avatar.style.backgroundSize = "cover"; } else { this.node.avatar.setBackgroundDB(img); } } else if (get.dynamicVariable(lib.card[bg].image, this)) { - if (get.dynamicVariable(lib.card[bg].image, this).startsWith("character:")) { + if ( + get + .dynamicVariable(lib.card[bg].image, this) + .startsWith("character:") + ) { this.node.avatar.setBackground( get.dynamicVariable(lib.card[bg].image, this).slice(10), "character" ); } else { - this.node.avatar.setBackground(get.dynamicVariable(lib.card[bg].image, this)); + this.node.avatar.setBackground( + get.dynamicVariable(lib.card[bg].image, this) + ); } } else { var cardPack = lib.cardPack["mode_" + get.mode()]; if (Array.isArray(cardPack) && cardPack.includes(bg)) { - this.node.avatar.setBackground("mode/" + get.mode() + "/card/" + bg); + this.node.avatar.setBackground( + "mode/" + get.mode() + "/card/" + bg + ); } else { this.node.avatar.setBackground("card/" + bg); } } } else if (get.dynamicVariable(lib.card[bg].image, this) == "card") { - if (card[3]) this.setBackground(bg + "_" + get.natureList(card[3])[0], "card"); + if (card[3]) + this.setBackground( + bg + "_" + get.natureList(card[3])[0], + "card" + ); else this.setBackground(bg, "card"); } else if ( typeof get.dynamicVariable(lib.card[bg].image, this) == "string" && @@ -444,13 +509,18 @@ export class Card extends HTMLDivElement { this.setBackgroundDB(img); } } else { - this.setBackground(get.dynamicVariable(lib.card[bg].image, this)); + this.setBackground( + get.dynamicVariable(lib.card[bg].image, this) + ); } } else { this.node.background.innerHTML = - lib.translate[bg + "_cbg"] || lib.translate[bg + "_bg"] || get.translation(bg)[0]; + lib.translate[bg + "_cbg"] || + lib.translate[bg + "_bg"] || + get.translation(bg)[0]; // this.node.background.style.fontFamily=lib.config.card_font; - if (this.node.background.innerHTML.length > 1) this.node.background.classList.add("tight"); + if (this.node.background.innerHTML.length > 1) + this.node.background.classList.add("tight"); else this.node.background.classList.remove("tight"); } if (!lib.card[bg].fullborder && this.node.avatar && this.node.framebg) { @@ -502,7 +572,10 @@ export class Card extends HTMLDivElement { let natures = get.natureList(nature); natures.sort(lib.sort.nature); for (let nature of natures) { - name += lib.translate["nature_" + nature] || lib.translate[nature] || ""; + name += + lib.translate["nature_" + nature] || + lib.translate[nature] || + ""; if (nature != "stab") this.node.image.classList.add(nature); } } @@ -515,7 +588,8 @@ export class Card extends HTMLDivElement { this.node.name.classList.add("longlong"); } } - this.node.name2.innerHTML = get.translation(card[0]) + cardnum + " " + name; + this.node.name2.innerHTML = + get.translation(card[0]) + cardnum + " " + name; this.classList.add("card"); if (card[3]) { let natures = get.natureList(card[3]); @@ -539,7 +613,8 @@ export class Card extends HTMLDivElement { var dist = lib.card[this.name].distance; if (dist.attackFrom) { added = true; - this.node.range.innerHTML = "范围: " + (-dist.attackFrom + 1); + this.node.range.innerHTML = + "范围: " + (-dist.attackFrom + 1); } } if (!added) { @@ -548,13 +623,15 @@ export class Card extends HTMLDivElement { break; case "equip3": if (info.distance && info.distance.globalTo) { - this.node.range.innerHTML = "防御: " + info.distance.globalTo; + this.node.range.innerHTML = + "防御: " + info.distance.globalTo; this.node.name2.innerHTML += "+"; } break; case "equip4": if (info.distance && info.distance.globalFrom) { - this.node.range.innerHTML = "进攻: " + -info.distance.globalFrom; + this.node.range.innerHTML = + "进攻: " + -info.distance.globalFrom; this.node.name2.innerHTML += "-"; } break; @@ -608,7 +685,8 @@ export class Card extends HTMLDivElement { game.layout == "nova") ) { if (bool) { - this.style.transform = this._transform + " translateY(-20px)"; + this.style.transform = + this._transform + " translateY(-20px)"; } else { this.style.transform = this._transform || ""; } @@ -659,12 +737,16 @@ export class Card extends HTMLDivElement { let owner = get.owner(this); if (owner) { if (owner == player) return true; //是牌主,必知情。 - if (player.hasSkillTag("viewHandcard", null, owner, true)) return true; //有viewHandcard标签,必知情。 + if (player.hasSkillTag("viewHandcard", null, owner, true)) + return true; //有viewHandcard标签,必知情。 if (owner.isUnderControl(true, player)) return true; //被操控,必知情。 } if (get.is.shownCard(this)) return true; //此牌是明置牌,必知情。 if (this._knowers) { - return this._knowers.includes("everyone") || this._knowers.includes(player.playerid); + return ( + this._knowers.includes("everyone") || + this._knowers.includes(player.playerid) + ); } return false; } @@ -702,8 +784,13 @@ export class Card extends HTMLDivElement { this.style.left = this.offsetLeft + "px"; this.style.top = this.offsetTop + "px"; - dx = player.getLeft() + player.offsetWidth / 2 - 52 - this.offsetLeft; - dy = player.getTop() + player.offsetHeight / 2 - 52 - this.offsetTop; + dx = + player.getLeft() + + player.offsetWidth / 2 - + 52 - + this.offsetLeft; + dy = + player.getTop() + player.offsetHeight / 2 - 52 - this.offsetTop; } if (get.is.mobileMe(player)) { dx += get.cardOffset(); @@ -753,8 +840,10 @@ export class Card extends HTMLDivElement { var clone = true; var position; for (var i = 0; i < arguments.length; i++) { - if (typeof arguments[i] == "string") node.classList.add(arguments[i]); - else if (["div", "fragment"].includes(get.objtype(arguments[i]))) position = arguments[i]; + if (typeof arguments[i] == "string") + node.classList.add(arguments[i]); + else if (["div", "fragment"].includes(get.objtype(arguments[i]))) + position = arguments[i]; else if (typeof arguments[i] == "boolean") clone = arguments[i]; } node.moveTo = lib.element.Card.prototype.moveTo; @@ -780,7 +869,9 @@ export class Card extends HTMLDivElement { * @returns {boolean} 是否包含class */ classListContains(className) { - return Array.from(arguments).some((name) => this.classList.contains(className)); + return Array.from(arguments).some((name) => + this.classList.contains(className) + ); } /** * 判断此牌是否包含class样式,参数有多个时,需全部满足。 @@ -790,7 +881,9 @@ export class Card extends HTMLDivElement { * @returns {boolean} 是否包含class */ classListContainsAll() { - return Array.from(arguments).every((name) => this.classList.contains(this.className)); + return Array.from(arguments).every((name) => + this.classList.contains(this.className) + ); } /** * 返回一个键值,用于在缓存中作为键名。 @@ -809,7 +902,9 @@ export class Card extends HTMLDivElement { if (bool === false) { ui.cardPile.insertBefore( this, - ui.cardPile.childNodes[Math.floor(Math.random() * ui.cardPile.childNodes.length)] + ui.cardPile.childNodes[ + Math.floor(Math.random() * ui.cardPile.childNodes.length) + ] ); } else { if (_status.discarded) { diff --git a/noname/library/element/dialog.js b/noname/library/element/dialog.js index 7ce4fda5b..138b32334 100644 --- a/noname/library/element/dialog.js +++ b/noname/library/element/dialog.js @@ -5,6 +5,7 @@ import { ui } from "../../ui/index.js"; export class Dialog extends HTMLDivElement { /** @type { HTMLDivElement } */ + // eslint-disable-next-line no-unreachable contentContainer; /** @type { HTMLDivElement } */ content; @@ -51,7 +52,8 @@ export class Dialog extends HTMLDivElement { else dialog.add(argument); }); //if (!hidden) dialog.open(); - if (!lib.config.touchscreen) dialog.contentContainer.onscroll = ui.update; + if (!lib.config.touchscreen) + dialog.contentContainer.onscroll = ui.update; if (!noTouchScroll) { dialog.contentContainer.ontouchstart = ui.click.dialogtouchStart; dialog.contentContainer.ontouchmove = ui.click.touchScroll; @@ -98,21 +100,27 @@ export class Dialog extends HTMLDivElement { const buttons = ui.create.div(".buttons", this.content); if (zoom) buttons.classList.add("smallzoom"); // @ts-ignore - this.buttons = this.buttons.concat(ui.create.buttons(item, "card", buttons, noclick)); + this.buttons = this.buttons.concat( + ui.create.buttons(item, "card", buttons, noclick) + ); } // @ts-ignore else if (get.itemtype(item) == "players") { var buttons = ui.create.div(".buttons", this.content); if (zoom) buttons.classList.add("smallzoom"); // @ts-ignore - this.buttons = this.buttons.concat(ui.create.buttons(item, "player", buttons, noclick)); + this.buttons = this.buttons.concat( + ui.create.buttons(item, "player", buttons, noclick) + ); } else if (item[1] == "textbutton") { ui.create.textbuttons(item[0], this, noclick); } else { var buttons = ui.create.div(".buttons", this.content); if (zoom) buttons.classList.add("smallzoom"); // @ts-ignore - this.buttons = this.buttons.concat(ui.create.buttons(item[0], item[1], buttons, noclick)); + this.buttons = this.buttons.concat( + ui.create.buttons(item[0], item[1], buttons, noclick) + ); } if (this.buttons.length) { if (this.forcebutton !== false) this.forcebutton = true; @@ -166,10 +174,19 @@ export class Dialog extends HTMLDivElement { } ui.dialog = this; let translate; - if (lib.config.remember_dialog && lib.config.dialog_transform && !this.classList.contains("fixed")) { + if ( + lib.config.remember_dialog && + lib.config.dialog_transform && + !this.classList.contains("fixed") + ) { translate = lib.config.dialog_transform; this._dragtransform = translate; - this.style.transform = "translate(" + translate[0] + "px," + translate[1] + "px) scale(0.8)"; + this.style.transform = + "translate(" + + translate[0] + + "px," + + translate[1] + + "px) scale(0.8)"; } else { this.style.transform = "scale(0.8)"; } @@ -179,8 +196,17 @@ export class Dialog extends HTMLDivElement { ui.dialogs.unshift(this); ui.update(); ui.refresh(this); - if (lib.config.remember_dialog && lib.config.dialog_transform && !this.classList.contains("fixed")) { - this.style.transform = "translate(" + translate[0] + "px," + translate[1] + "px) scale(1)"; + if ( + lib.config.remember_dialog && + lib.config.dialog_transform && + !this.classList.contains("fixed") + ) { + this.style.transform = + "translate(" + + translate[0] + + "px," + + translate[1] + + "px) scale(1)"; } else { this.style.transform = "scale(1)"; } diff --git a/noname/library/element/player.js b/noname/library/element/player.js index 0fabfa39b..8fc371d2b 100644 --- a/noname/library/element/player.js +++ b/noname/library/element/player.js @@ -165,6 +165,7 @@ export class Player extends HTMLDivElement { } } /** @type { SMap } */ + // eslint-disable-next-line no-unreachable node; /** * @type { number } From 68bf106ad374264c8f6f6da5581a30f5f6e9ed27 Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Sat, 20 Apr 2024 15:01:41 +0800 Subject: [PATCH 14/57] build typings --- .../noname-typings/nonameModules/noname.d.ts | 16 +- .../nonameModules/noname/ai/basic.d.ts | 6 +- .../nonameModules/noname/ai/index.d.ts | 2 +- .../nonameModules/noname/game/index.d.ts | 252 +++++----- .../nonameModules/noname/game/promises.d.ts | 6 +- .../nonameModules/noname/get/index.d.ts | 50 +- .../nonameModules/noname/get/is.d.ts | 18 +- .../library/cache/childNodesWatcher.d.ts | 4 +- .../noname/library/element/button.d.ts | 2 +- .../noname/library/element/card.d.ts | 2 +- .../noname/library/element/contents.d.ts | 2 +- .../noname/library/element/dialog.d.ts | 4 +- .../noname/library/element/gameEvent.d.ts | 22 +- .../library/element/gameEventPromise.d.ts | 10 +- .../noname/library/element/player.d.ts | 60 +-- .../noname/library/element/vcard.d.ts | 4 +- .../nonameModules/noname/library/index.d.ts | 441 +++++++++--------- .../nonameModules/noname/library/update.d.ts | 51 +- .../nonameModules/noname/status/index.d.ts | 40 +- .../nonameModules/noname/ui/click/index.d.ts | 4 + .../nonameModules/noname/ui/create/index.d.ts | 10 +- .../nonameModules/noname/ui/index.d.ts | 4 +- .../nonameModules/noname/util/browser.d.ts | 2 +- 23 files changed, 537 insertions(+), 475 deletions(-) diff --git a/node_modules/@types/noname-typings/nonameModules/noname.d.ts b/node_modules/@types/noname-typings/nonameModules/noname.d.ts index 24d68dcae..4221e9b7d 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname.d.ts @@ -1,8 +1,8 @@ -export { GNC, gnc, setGNC } from './noname/gnc/index.js'; -export { AI, ai, setAI } from './noname/ai/index.js'; -export { Game, game, setGame } from './noname/game/index.js'; -export { Get, get, setGet } from './noname/get/index.js'; -export { Library, lib, setLibrary } from './noname/library/index.js'; -export { status, _status, setStatus } from './noname/status/index.js'; -export { UI, ui, setUI } from './noname/ui/index.js'; -export { boot } from './noname/init/index.js'; +export { boot } from "./noname/init/index.js"; +export { GNC, gnc, setGNC } from "./noname/gnc/index.js"; +export { AI, ai, setAI } from "./noname/ai/index.js"; +export { Game, game, setGame } from "./noname/game/index.js"; +export { Get, get, setGet } from "./noname/get/index.js"; +export { Library, lib, setLibrary } from "./noname/library/index.js"; +export { status, _status, setStatus } from "./noname/status/index.js"; +export { UI, ui, setUI } from "./noname/ui/index.js"; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/ai/basic.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/ai/basic.d.ts index 3195ed436..5fcef7eef 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/ai/basic.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/ai/basic.d.ts @@ -5,7 +5,7 @@ export class Basic { * buttons?: Button[] * ) => number } check */ - chooseButton(check: (button: any, buttons?: Button[]) => number): boolean | undefined; + chooseButton(check: (button: Button, buttons?: Button[]) => number): boolean | undefined; /** * @param { ( * card?: Card, @@ -13,12 +13,12 @@ export class Basic { * ) => number } check * @returns { boolean | undefined } */ - chooseCard(check: (card?: any, cards?: Card[]) => number): boolean | undefined; + chooseCard(check: (card?: Card, cards?: Card[]) => number): boolean | undefined; /** * @param { ( * target?: Player, * targets?: Player[] * ) => number } check */ - chooseTarget(check: (target?: any, targets?: Player[]) => number): boolean | undefined; + chooseTarget(check: (target?: Player, targets?: Player[]) => number): boolean | undefined; } diff --git a/node_modules/@types/noname-typings/nonameModules/noname/ai/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/ai/index.d.ts index a5e8109d6..bf812acf2 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/ai/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/ai/index.d.ts @@ -5,4 +5,4 @@ export class AI { export let ai: AI; export function setAI(instance?: AI | undefined): void; export { Basic }; -import { Basic } from './basic.js'; +import { Basic } from "./basic.js"; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts index ce8f14d61..ae25557a7 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts @@ -15,7 +15,7 @@ export class Game { * @type { { [key: string]: Player } } */ playerMap: { - [key: string]: any; + [key: string]: import("noname-typings/nonameModules/noname/library/element/player.js").Player; }; phaseNumber: number; roundNumber: number; @@ -28,7 +28,7 @@ export class Game { /** * @type { Player } */ - me: any; + me: Player; /** * @type { boolean } */ @@ -173,19 +173,19 @@ export class Game { /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { boolean } */ - hasGlobalHistory(key: T, filter: (event: import('../library/index.js').GameEventPromise) => boolean, last?: import("../library/index.js").GameEventPromise | undefined): boolean; + hasGlobalHistory(key: T, filter: (event: GameEventPromise) => boolean, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): boolean; /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { void } */ - checkGlobalHistory(key: T_1, filter: (event: import('../library/index.js').GameEventPromise) => boolean, last?: import("../library/index.js").GameEventPromise | undefined): void; + checkGlobalHistory(key: T_1, filter: (event: GameEventPromise) => boolean, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): void; /** * @overload * @returns { GameHistory } @@ -195,27 +195,27 @@ export class Game { * @template { keyof GameHistory } T * @overload * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } [filter] - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] * @returns { GameHistory[T] } */ - getGlobalHistory(key: T_2, filter?: ((event: import('../library/index.js').GameEventPromise) => boolean) | undefined, last?: import("../library/index.js").GameEventPromise | undefined): GameHistory[T_2]; + getGlobalHistory(key: T_2, filter?: ((event: GameEventPromise) => boolean) | undefined, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): GameHistory[T_2]; /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { boolean } */ - hasAllGlobalHistory(key: T_3, filter: (event: import('../library/index.js').GameEventPromise) => boolean, last?: import("../library/index.js").GameEventPromise | undefined): boolean; + hasAllGlobalHistory(key: T_3, filter: (event: GameEventPromise) => boolean, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): boolean; /** * @template { keyof GameHistory } T * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } filter - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] * @returns { void } */ - checkAllGlobalHistory(key: T_4, filter: (event: import('../library/index.js').GameEventPromise) => boolean, last?: import("../library/index.js").GameEventPromise | undefined): void; + checkAllGlobalHistory(key: T_4, filter: (event: GameEventPromise) => boolean, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): void; /** * @overload * @returns { GameHistory[] } @@ -225,11 +225,11 @@ export class Game { * @template { keyof GameHistory } T * @overload * @param { T } key - * @param { (event: import('../library/index.js').GameEventPromise) => boolean } [filter] - * @param { import('../library/index.js').GameEventPromise } [last] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] * @returns { GameHistory[T] } */ - getAllGlobalHistory(key: T_5, filter?: ((event: import('../library/index.js').GameEventPromise) => boolean) | undefined, last?: import("../library/index.js").GameEventPromise | undefined): GameHistory[T_5]; + getAllGlobalHistory(key: T_5, filter?: ((event: GameEventPromise) => boolean) | undefined, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): GameHistory[T_5]; /** * @overload * @returns { void } @@ -238,15 +238,15 @@ export class Game { /** * @overload * @param { Card } cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ - cardsDiscard(cards: any): import('../library/index.js').GameEventPromise; + cardsDiscard(cards: Card): GameEventPromise; /** * @overload * @param {Card[]} cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ - cardsDiscard(cards: Card[]): import('../library/index.js').GameEventPromise; + cardsDiscard(cards: Card[]): GameEventPromise; /** * @overload * @returns { void } @@ -255,15 +255,15 @@ export class Game { /** * @overload * @param { Card } cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ - cardsGotoOrdering(cards: any): import('../library/index.js').GameEventPromise; + cardsGotoOrdering(cards: Card): GameEventPromise; /** * @overload * @param {Card[]} cards - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ - cardsGotoOrdering(cards: Card[]): import('../library/index.js').GameEventPromise; + cardsGotoOrdering(cards: Card[]): GameEventPromise; /** * @overload * @returns { void } @@ -273,16 +273,16 @@ export class Game { * @overload * @param { Card } cards * @param { 'toRenku' | false } [bool] 为false时不触发trigger,为'toRenku'时牌放到仁库 - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ - cardsGotoSpecial(cards: any, bool?: false | "toRenku" | undefined): import('../library/index.js').GameEventPromise; + cardsGotoSpecial(cards: Card, bool?: false | "toRenku" | undefined): GameEventPromise; /** * @overload * @param {Card[]} cards * @param { 'toRenku' | false } [bool] 为false时不触发trigger,为'toRenku'时牌放到仁库 - * @returns { import('../library/index.js').GameEventPromise } + * @returns { GameEventPromise } */ - cardsGotoSpecial(cards: Card[], bool?: false | "toRenku" | undefined): import('../library/index.js').GameEventPromise; + cardsGotoSpecial(cards: Card[], bool?: false | "toRenku" | undefined): GameEventPromise; /** * * @param {...( @@ -299,9 +299,9 @@ export class Game { any ])[]): import("../library/element/gameEvent.js").GameEvent & import("../library/element/gameEventPromise.js").GameEventPromise; /** - * @param { import('../library/index.js').GameEventPromise } event + * @param { GameEventPromise } event */ - $cardsGotoPile(event: import('../library/index.js').GameEventPromise): void; + $cardsGotoPile(event: GameEventPromise): void; /** * @param { false } [pause] */ @@ -316,16 +316,22 @@ export class Game { * @param { string } url * @param { Player } [player] */ - changeLand(url: string, player?: any): void; + changeLand(url: string, player?: import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): void; /** * @param { string[] } updates * @param { Function } proceed */ checkFileList(updates: string[], proceed: Function): void; /** - * @param {...(Player[] | Player)} args + * @overload + * @param {[Player[]]} args */ - replaceHandcards(...args: (Player[] | Player)[]): void; + replaceHandcards(args: [Player[]]): any; + /** + * @overload + * @param {Player[]} args + */ + replaceHandcards(args: Player[]): any; /** * @param { string } name */ @@ -447,44 +453,44 @@ export class Game { */ playAudio(...args: any[]): HTMLAudioElement; /** - * 根据skill中的audio,audioname,audioname2和player来获取音频地址列表 - * @typedef {[string,number]|string|number|boolean} audioInfo - * @typedef {{audio: audioInfo, audioname?:string[], audioname2?:{[playerName: string]: audioInfo}}} skillInfo - * @param { string } skill 技能名 - * @param { Player | string } [player] 角色/角色名 - * @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo),覆盖lib.skill[skill] - * @returns { string[] } 语音地址列表 - * @example - * ```js - * const info=lib.skill['skillname']; - * info.audio=undefined //默认值[true,2] - * info.audio=false // 不播放语音 - * info.audio=true // [skill/skillname.mp3] - * info.audio=3 // [skill/skillname1.mp3,skill/skillname2.mp3,skill/skillname3.mp3](项数为数字大小) - * info.audio="(ext:extName|db:extension-extName)(/anyPath):true|number(:format)" //间接路径 - * // 同上,只是将目录改为(ext:extName|db:extension-extName)(/anyPath),且可以指定格式(默认mp3) - * info.audio="(ext:extName|db:extension-extName/)(anyPath/)filename(.format)" //直接路径 - * //path和format至少有一个,否则会识别为引用技能 - * //起始位置为audio/(若无anyPath则为audio/skill/),若没有format默认mp3 - * info.audio="otherSkillname" //引用技能 - * //引用一个其他技能的语音,若lib.skill["otherSkillname"]不存在则读取"otherSkillname"的audio为默认值[true,2] - * info.audio=["otherSkillname", number] //带fixedNum的引用技能 - * //同样引用一个其他技能的语音,若lib.skill["otherSkillname"]不存在则读取"otherSkillname"的audio为number - * //若"otherSkillname"的语音数超过number,则只取前number个 - * info.audio=[true,2,"otherSkillname1",["otherSkillname2",2]] //任意元素拼接 - * //数组里可以放任何以上的格式,结果为分析完的结果合并 - * - * info.audioname=['player1','player2'] - * //audioname里可以放任意角色名。 - * //如果其中包含发动技能的角色名"player",且info.audio不是直接路径"(anyPath/)filename(.format)"的形式 - * //则在"skill"和number中插入"_player",形如 - * - * info.audioname2={'player1':audioInfo1,'player2':audioInfo2} - * //audioname2是一个对象,其中key为角色名,value的类型和info.audio一样 - * //如果key中包含发动技能的角色名player,则直接改用info.audioname2[player]来播放语音 - * ``` - */ - parseSkillAudio(skill: string, player?: Player | string, skillInfo?: { + * 根据skill中的audio,audioname,audioname2和player来获取音频地址列表 + * @typedef {[string,number]|string|number|boolean} audioInfo + * @typedef {{audio: audioInfo, audioname?:string[], audioname2?:{[playerName: string]: audioInfo}}} skillInfo + * @param { string } skill 技能名 + * @param { Player | string } [player] 角色/角色名 + * @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo),覆盖lib.skill[skill] + * @returns { string[] } 语音地址列表 + * @example + * ```js + * const info=lib.skill['skillname']; + * info.audio=undefined //默认值[true,2] + * info.audio=false // 不播放语音 + * info.audio=true // [skill/skillname.mp3] + * info.audio=3 // [skill/skillname1.mp3,skill/skillname2.mp3,skill/skillname3.mp3](项数为数字大小) + * info.audio="(ext:extName|db:extension-extName)(/anyPath):true|number(:format)" //间接路径 + * // 同上,只是将目录改为(ext:extName|db:extension-extName)(/anyPath),且可以指定格式(默认mp3) + * info.audio="(ext:extName|db:extension-extName/)(anyPath/)filename(.format)" //直接路径 + * //path和format至少有一个,否则会识别为引用技能 + * //起始位置为audio/(若无anyPath则为audio/skill/),若没有format默认mp3 + * info.audio="otherSkillname" //引用技能 + * //引用一个其他技能的语音,若lib.skill["otherSkillname"]不存在则读取"otherSkillname"的audio为默认值[true,2] + * info.audio=["otherSkillname", number] //带fixedNum的引用技能 + * //同样引用一个其他技能的语音,若lib.skill["otherSkillname"]不存在则读取"otherSkillname"的audio为number + * //若"otherSkillname"的语音数超过number,则只取前number个 + * info.audio=[true,2,"otherSkillname1",["otherSkillname2",2]] //任意元素拼接 + * //数组里可以放任何以上的格式,结果为分析完的结果合并 + * + * info.audioname=['player1','player2'] + * //audioname里可以放任意角色名。 + * //如果其中包含发动技能的角色名"player",且info.audio不是直接路径"(anyPath/)filename(.format)"的形式 + * //则在"skill"和number中插入"_player",形如 + * + * info.audioname2={'player1':audioInfo1,'player2':audioInfo2} + * //audioname2是一个对象,其中key为角色名,value的类型和info.audio一样 + * //如果key中包含发动技能的角色名player,则直接改用info.audioname2[player]来播放语音 + * ``` + */ + parseSkillAudio(skill: string, player?: string | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined, skillInfo?: { audio: string | number | boolean | [string, number]; audioname?: string[] | undefined; audioname2?: { @@ -838,7 +844,7 @@ export class Game { * @param { any } [content] * @returns */ - addVideo(type: string, player: any, content?: any): void; + addVideo(type: string, player: Player, content?: any): void; /** * @param { Function } func */ @@ -876,18 +882,18 @@ export class Game { * @param { string } name * @param { string } skill * @param { Player } player - * @param { import('../library/index.js').GameEventPromise } event - * @returns { import('../library/index.js').GameEventPromise } + * @param { GameEventPromise } event + * @returns { GameEventPromise } */ - createTrigger(name: string, skill: string, player: any, event: import('../library/index.js').GameEventPromise, indexedData: any): import('../library/index.js').GameEventPromise; + createTrigger(name: string, skill: string, player: Player, event: GameEventPromise, indexedData: any): GameEventPromise; /** * @legacy Use {@link lib.element.GameEvent.constructor} instead. * * @param { string } name * @param { false } [trigger] - * @param { import('../library/index.js').GameEventPromise } [triggerEvent] + * @param { GameEventPromise } [triggerEvent] */ - createEvent(name: string, trigger?: false | undefined, triggerEvent?: import("../library/index.js").GameEventPromise | undefined): import("../library/element/gameEvent.js").GameEvent & import("../library/element/gameEventPromise.js").GameEventPromise; + createEvent(name: string, trigger?: false | undefined, triggerEvent?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): import("../library/element/gameEvent.js").GameEvent & import("../library/element/gameEventPromise.js").GameEventPromise; /** * @param { string } name * @param { { extension: string, sex: Sex, group: string, hp: string | number, skills?: string[], tags?: any[], translate: string } } information @@ -921,7 +927,7 @@ export class Game { * @param { Card } info * @param { { extension: string, translate: string, description: string, number?: number, color?: string } } info2 */ - addCard(name: string, info: any, info2: { + addCard(name: string, info: Card, info2: { extension: string; translate: string; description: string; @@ -938,7 +944,7 @@ export class Game { forbid?: string[] | undefined; list: any[]; card: { - [key: string]: any; + [key: string]: import("noname-typings/nonameModules/noname/library/element/card.js").Card; }; skill: { [key: string]: any; @@ -970,7 +976,7 @@ export class Game { * @param { string } skill * @param { Player } [player] */ - addGlobalSkill(skill: string, player?: any): boolean; + addGlobalSkill(skill: string, player?: import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): boolean; /** * @param { string } skill * @param { lib.element.Player } player @@ -980,7 +986,7 @@ export class Game { /** * @param { string } extensionName */ - hasExtension(extensionName: string): any; + hasExtension(extensionName: string): boolean; /** * @param { string } extensionName */ @@ -988,7 +994,7 @@ export class Game { /** * @param { string } extensionName */ - hasExtensionLoaded(extensionName: string): any; + hasExtensionLoaded(extensionName: string): boolean; /** * @param { string } extensionName * @param { Function } runnable @@ -1004,7 +1010,7 @@ export class Game { * @overload * @returns { Card } */ - createCard(): any; + createCard(): Card; /** * @overload * @param { Card | string } name @@ -1017,7 +1023,7 @@ export class Game { * @overload * @returns { Card } */ - createCard2(): any; + createCard2(): Card; /** * @overload * @param { Card | string } name @@ -1046,17 +1052,17 @@ export class Game { */ executingAsyncEventMap: Map>; /** - * @type { import('../library/index.js').GameEventPromise[] } + * @type { GameEventPromise[] } */ - belongAsyncEventList: import('../library/index.js').GameEventPromise[]; + belongAsyncEventList: GameEventPromise[]; /** - * @param { import('../library/index.js').GameEventPromise } [belongAsyncEvent] + * @param { GameEventPromise } [belongAsyncEvent] */ - loop(belongAsyncEvent?: import("../library/index.js").GameEventPromise | undefined): Promise; + loop(belongAsyncEvent?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): Promise; /** - * @param { import('../library/index.js').GameEventPromise } [belongAsyncEvent] + * @param { GameEventPromise } [belongAsyncEvent] */ - runContent(belongAsyncEvent?: import("../library/index.js").GameEventPromise | undefined): Promise; + runContent(belongAsyncEvent?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): Promise; pause(): void; pause2(): void; resume(): void; @@ -1092,9 +1098,9 @@ export class Game { */ asyncDelayx(time?: number | undefined, time2?: number | undefined): Promise; /** - * @param { import('../library/index.js').GameEventPromise } [event] + * @param { GameEventPromise } [event] */ - check(event?: import("../library/index.js").GameEventPromise | undefined): boolean; + check(event?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): boolean; Check: Check; uncheck(...args: any[]): void; /** @@ -1104,21 +1110,21 @@ export class Game { * @param { boolean } [behind] * @param { boolean } [noanimate] */ - swapSeat(player1: any, player2: any, prompt?: boolean | undefined, behind?: boolean | undefined, noanimate?: boolean | undefined): void; + swapSeat(player1: Player, player2: Player, prompt?: boolean | undefined, behind?: boolean | undefined, noanimate?: boolean | undefined): void; /** * @param { Player } player1 * @param { Player } [player2] */ - swapPlayer(player: any, player2?: any): void; + swapPlayer(player: any, player2?: import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): void; /** * @param { Player } player */ - swapControl(player: any): void; + swapControl(player: Player): void; swapPlayerAuto(player: any): void; /** * @param { Player } player */ - findNext(player: any): any; + findNext(player: Player): import("noname-typings/nonameModules/noname/library/element/player.js").Player; /** * @param { string } name * @param { Function } callback @@ -1140,11 +1146,11 @@ export class Game { /** * @param { Player } player */ - phaseLoop(player: any): void; + phaseLoop(player: Player): void; /** * @param { Player } [player] */ - gameDraw(player?: any, num?: number): import("../library/element/gameEvent.js").GameEvent & import("../library/element/gameEventPromise.js").GameEventPromise; + gameDraw(player?: import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined, num?: number): import("../library/element/gameEvent.js").GameEvent & import("../library/element/gameEventPromise.js").GameEventPromise; chooseCharacterDouble(...args: any[]): void; updateRoundNumber(): void; /** @@ -1153,7 +1159,7 @@ export class Game { * @param { { drawDeck: boolean } } [drawDeck] * @param { boolean } [bottom] */ - asyncDraw(players: Player[], num: number | number[] | ((player: any) => number), drawDeck?: { + asyncDraw(players: Player[], num: number | number[] | ((player: Player) => number), drawDeck?: { drawDeck: boolean; } | undefined, bottom?: boolean | undefined): void; /** @@ -1161,7 +1167,7 @@ export class Game { * @param { number | number[] | (player: Player) => number } num * @param { { drawDeck: boolean } } [drawDeck] */ - asyncDrawAuto(players: Player[], num: number | number[] | ((player: any) => number), drawDeck?: { + asyncDrawAuto(players: Player[], num: number | number[] | ((player: Player) => number), drawDeck?: { drawDeck: boolean; } | undefined, ...args: any[]): void; finishSkill(i: any, sub: any): void; @@ -1181,11 +1187,11 @@ export class Game { * @param { Player } player * @param { string | Card[] } card * @param { Player[] } [targets] - * @param { import('../library/index.js').GameEventPromise } [event] + * @param { GameEventPromise } [event] * @param { boolean } [forced] * @param { string } [logvid] */ - logv(player: any, card: string | Card[], targets?: any[] | undefined, event?: import("../library/index.js").GameEventPromise | undefined, forced?: boolean | undefined, logvid?: string | undefined): HTMLDivElement | undefined; + logv(player: Player, card: string | Card[], targets?: import("noname-typings/nonameModules/noname/library/element/player.js").Player[] | undefined, event?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined, forced?: boolean | undefined, logvid?: string | undefined): HTMLDivElement | undefined; /** * @param { string } storeName * @param { string } idbValidKey @@ -1267,28 +1273,28 @@ export class Game { /** * @param { Player } player */ - triggerEnter(player: any): import("../library/element/gameEvent.js").GameEvent & import("../library/element/gameEventPromise.js").GameEventPromise; + triggerEnter(player: Player): import("../library/element/gameEvent.js").GameEvent & import("../library/element/gameEventPromise.js").GameEventPromise; /** * @param { Player } player */ - restorePlayer(player: any): any; + restorePlayer(player: Player): import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined; /** * @param { Player } player */ - removePlayer(player: any): any; + removePlayer(player: Player): import("noname-typings/nonameModules/noname/library/element/player.js").Player; /** * @param { Player } player * @param { string } [character] * @param { string } [character2] */ - replacePlayer(player: any, character?: string | undefined, character2?: string | undefined): import("../library/element/player.js").Player; + replacePlayer(player: Player, character?: string | undefined, character2?: string | undefined): import("../library/element/player.js").Player; arrangePlayers(): void; /** * @param { string[] } skills * @param { Player } player * @param { string[] } exclude */ - filterSkills(skills: string[], player: any, exclude: string[]): string[]; + filterSkills(skills: string[], player: Player, exclude: string[]): string[]; /** * @param { string[] } skills */ @@ -1303,22 +1309,22 @@ export class Game { * @param { (player: Player) => boolean } func * @param { boolean } [includeOut] */ - hasPlayer(func: (player: any) => boolean, includeOut?: boolean | undefined): boolean; + hasPlayer(func: (player: Player) => boolean, includeOut?: boolean | undefined): boolean; /** * @param { (player: Player) => boolean } func * @param { boolean } [includeOut] */ - hasPlayer2(func: (player: any) => boolean, includeOut?: boolean | undefined): boolean; + hasPlayer2(func: (player: Player) => boolean, includeOut?: boolean | undefined): boolean; /** * @param { (player: Player) => boolean } func * @param { boolean } [includeOut] */ - countPlayer(func: (player: any) => boolean, includeOut?: boolean | undefined): any; + countPlayer(func: (player: Player) => boolean, includeOut?: boolean | undefined): number; /** * @param { (player: Player) => boolean } func * @param { boolean } [includeOut] */ - countPlayer2(func: (player: any) => boolean, includeOut?: boolean | undefined): any; + countPlayer2(func: (player: Player) => boolean, includeOut?: boolean | undefined): number; /** * @overload * @returns { Player[] } @@ -1331,7 +1337,7 @@ export class Game { * @param { boolean } [includeOut] * @returns { Player[] } */ - filterPlayer(func: (player: any) => boolean, list?: any[] | undefined, includeOut?: boolean | undefined): Player[]; + filterPlayer(func: (player: Player) => boolean, list?: import("noname-typings/nonameModules/noname/library/element/player.js").Player[] | undefined, includeOut?: boolean | undefined): Player[]; /** * @overload * @returns { Player[] } @@ -1344,23 +1350,23 @@ export class Game { * @param { boolean } [includeOut] * @returns { Player[] } */ - filterPlayer2(func: (player: any) => boolean, list?: any[] | undefined, includeOut?: boolean | undefined): Player[]; + filterPlayer2(func: (player: Player) => boolean, list?: import("noname-typings/nonameModules/noname/library/element/player.js").Player[] | undefined, includeOut?: boolean | undefined): Player[]; /** * @param { (player: Player) => boolean } func * @param { boolean } [includeOut] */ - findPlayer(func: (player: any) => boolean, includeOut?: boolean | undefined): any; + findPlayer(func: (player: Player) => boolean, includeOut?: boolean | undefined): import("noname-typings/nonameModules/noname/library/element/player.js").Player | null; /** * @param { (player: Player) => boolean } func * @param { boolean } [includeOut] */ - findPlayer2(func: (player: any) => boolean, includeOut?: boolean | undefined): any; + findPlayer2(func: (player: Player) => boolean, includeOut?: boolean | undefined): import("noname-typings/nonameModules/noname/library/element/player.js").Player | null; /** * @param { (player: Player) => boolean } func * @param { boolean } [all] */ - findCards(func: (player: any) => boolean, all?: boolean | undefined): string[]; - countGroup(): any; + findCards(func: (player: Player) => boolean, all?: boolean | undefined): string[]; + countGroup(): number; /** * 此函数用于计算函数的时间消耗。 * @param {function} 测试的函数 @@ -1374,7 +1380,7 @@ export class Game { * @param { (player: Player, i: number) => Promise } asyncFunc 需要执行的async方法 * @param { (a: Player, b: Player) => number } sort 排序器,默认为lib.sort.seat */ - doAsyncInOrder(targets: Player[], asyncFunc: (player: any, i: number) => Promise, sort: (a: any, b: any) => number): Promise; + doAsyncInOrder(targets: Player[], asyncFunc: (player: Player, i: number) => Promise, sort: (a: Player, b: Player) => number): Promise; } export let game: Game; export function setGame(instance?: Game | undefined): void; @@ -1403,6 +1409,6 @@ export type Videos = { }; import { GamePromises } from "./promises.js"; import { DynamicStyle } from "./dynamic-style/index.js"; -import { lib } from '../library/index.js'; +import { lib } from "../library/index.js"; import { Check } from "./check.js"; import { delay } from "../util/index.js"; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/game/promises.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/game/promises.d.ts index 2f4e24fbc..c5b8861fd 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/game/promises.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/game/promises.d.ts @@ -25,7 +25,11 @@ export class GamePromises { */ alert(title: string): Promise; download(url: any, folder: any, dev: any, onprogress: any): Promise; - readFile(filename: any): Promise; + /** + * @param {string} filename + * @returns {Promise} + */ + readFile(filename: string): Promise; readFileAsText(filename: any): Promise; writeFile(data: any, path: any, name: any): Promise; ensureDirectory(list: any, callback: any, file: any): Promise; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts index e2aaa5672..1f94ae2ae 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts @@ -74,7 +74,7 @@ export class Get { * @param { false | Player } [player] * @returns { string[] } */ - subtypes(obj: string | Card | VCard | CardBaseUIData, player?: false | Player): string[]; + subtypes(obj: string | Card | VCard | CardBaseUIData, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string[]; /** * @returns { string[] } */ @@ -90,7 +90,7 @@ export class Get { * @param { Player } player * @returns { string[] } */ - skillCategoriesOf(skill: string, player: any): string[]; + skillCategoriesOf(skill: string, player: Player): string[]; numOf(obj: any, item: any): any; connectNickname(): any; zhinangs(filter: any): any; @@ -175,7 +175,7 @@ export class Get { charactersOL(func: any): number[]; trimip(str: any): any; mode(): any; - idDialog(id: any): any; + idDialog(id: any): import("noname-typings/nonameModules/noname/library/element/dialog.js").Dialog | null; arenaState(): { number: string | undefined; players: {}; @@ -198,7 +198,7 @@ export class Get { rank(name: any, num: any): number | "x" | "s" | "c" | "d" | "b" | "a" | "ap" | "am" | "bp" | "bm" | "sp"; skillRank(skill: any, type: any, grouped: any): number; targetsInfo(targets: any): any[]; - infoTargets(infos: any): any[]; + infoTargets(infos: any): import("noname-typings/nonameModules/noname/library/element/player.js").Player[]; cardInfo(card: any): any[]; cardsInfo(cards?: any[]): any[][]; infoCard(info: any): import("../library/element/card.js").Card; @@ -279,25 +279,25 @@ export class Get { * @param { Button } obj * @returns { 'button' } */ - itemtype(obj: any): 'button'; + itemtype(obj: Button): 'button'; /** * @overload * @param { Card } obj * @returns { 'card' } */ - itemtype(obj: any): 'card'; + itemtype(obj: Card): 'card'; /** * @overload * @param { Player } obj * @returns { 'player' } */ - itemtype(obj: any): 'player'; + itemtype(obj: Player): 'player'; /** * @overload * @param { Dialog } obj * @returns { 'dialog' } */ - itemtype(obj: any): 'dialog'; + itemtype(obj: Dialog): 'dialog'; /** * @overload * @param { GameEvent | GameEventPromise } obj @@ -314,7 +314,7 @@ export class Get { * @param { false | Player } [player] * @returns { string } */ - subtype(obj: string | Card | VCard | CardBaseUIData, player?: false | Player): string; + subtype(obj: string | Card | VCard | CardBaseUIData, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string; equiptype(card: any, player: any): number; /** * @@ -322,39 +322,39 @@ export class Get { * @param { false | Player } [player] * @returns { string } */ - name(card: Card | VCard | CardBaseUIData, player?: false | Player): string; + name(card: Card | VCard | CardBaseUIData, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string; /** * @param {Card | VCard | Card[] | VCard[]} card * @param {false | Player} [player] * @returns {string} */ - suit(card: Card | VCard | Card[] | VCard[], player?: false | Player): string; + suit(card: Card | VCard | Card[] | VCard[], player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string; /** * @param {Card | VCard | Card[] | VCard[]} card * @param {false | Player} [player] * @returns {string} */ - color(card: Card | VCard | Card[] | VCard[], player?: false | Player): string; + color(card: Card | VCard | Card[] | VCard[], player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string; /** * @param {Card | VCard} card * @param {false | Player} [player] * @returns {number} */ - number(card: Card | VCard, player?: false | Player): number; + number(card: Card | VCard, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): number; /** * 返回一张杀的属性。如有多种属性则用`lib.natureSeparator`分割开来。例:火雷【杀】的返回值为`fire|thunder` * @param {string | string[] | Card | VCard} card * @param {false | Player} [player] * @returns {string} */ - nature(card: string | string[] | Card | VCard, player?: false | Player): string; + nature(card: string | string[] | Card | VCard, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string; /** * 返回包含所有属性的数组 * @param {string[] | string} card * @param {false | Player} [player] * @returns {string[]} */ - natureList(card: string[] | string, player?: false | Player): string[]; + natureList(card: string[] | string, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string[]; cards(num: any, putBack: any): any; judge(card: any): any; judge2(card: any): any; @@ -371,7 +371,7 @@ export class Get { * @param { Player | false } [player] * @returns { any } */ - info(item: Card | VCard | CardBaseUIData, player?: Player | false): any; + info(item: Card | VCard | CardBaseUIData, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): any; /** * @param { number | Select | (()=>Select) } [select] * @returns { Select } @@ -382,16 +382,16 @@ export class Get { * @overload * @returns {GameEvent} */ - event(): any; + event(): GameEvent; /** * @template { keyof GameEvent } T * @overload * @param {T} key * @returns {GameEvent[T]} */ - event(key: T_2): any; + event(key: T_2): import("noname-typings/nonameModules/noname/library/element/gameEvent.js").GameEvent[T_2]; player(): any; - players(sort: any, dead: any, out: any): any[]; + players(sort: any, dead: any, out: any): import("noname-typings/nonameModules/noname/library/element/player.js").Player[]; position(card: any, ordering: any): number | "e" | "j" | "x" | "s" | "h" | "c" | "d" | "o" | null | undefined; skillTranslation(str: any, player: any): string; skillInfoTranslation(name: any, player: any): any; @@ -412,12 +412,12 @@ export class Get { * @param {((a: Button, b: Button) => number)} [sort] 排序函数 * @returns { Button[] } */ - selectableButtons(sort?: ((a: any, b: any) => number) | undefined): Button[]; + selectableButtons(sort?: ((a: Button, b: Button) => number) | undefined): Button[]; /** * @param {((a: Card, b: Card) => number)} [sort] 排序函数 * @returns { Card[] } */ - selectableCards(sort?: ((a: any, b: any) => number) | undefined): Card[]; + selectableCards(sort?: ((a: Card, b: Card) => number) | undefined): Card[]; /** * @returns { string[] } 技能名数组 */ @@ -429,11 +429,11 @@ export class Get { * @param {((a: Player, b: Player) => number)} [sort] 排序函数 * @returns { Player[] } */ - selectableTargets(sort?: ((a: any, b: any) => number) | undefined): Player[]; + selectableTargets(sort?: ((a: Player, b: Player) => number) | undefined): Player[]; filter(filter: any, i: any): any; cardCount(card: any, player: any): any; skillCount(skill: any, player: any): any; - owner(card: any, method: any): any; + owner(card: any, method: any): import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined; noSelected(): boolean; population(identity: any): number; totalPopulation(identity: any): number; @@ -467,8 +467,8 @@ export class Get { unuseful3(card: any): number; value(card: any, player: any, method: any): any; equipResult(player: any, target: any, name: any): number; - equipValue(card: any, player: any): any; - equipValueNumber(card: any): any; + equipValue(card: any, player: any): number; + equipValueNumber(card: any): number; disvalue(card: any, player: any): number; disvalue2(card: any, player: any): number; skillthreaten(skill: any, player: any, target: any): number | void; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts index 45add36bd..f2da42ab5 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts @@ -5,14 +5,14 @@ export class Is { * @param { false | Player } [player] * @returns { boolean } */ - attackingMount(card: Card | VCard, player?: false | Player): boolean; + attackingMount(card: Card | VCard, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): boolean; /** * 判断是否为防御坐骑 * @param { Card | VCard } card * @param { false | Player } [player] * @returns { boolean } */ - defendingMount(card: Card | VCard, player?: false | Player): boolean; + defendingMount(card: Card | VCard, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): boolean; /** * 判断坐骑栏是否被合并 * @returns { boolean } @@ -34,7 +34,7 @@ export class Is { * 判断一张牌是否为明置手牌 * @param { Card } card */ - shownCard(card: any): boolean; + shownCard(card: Card): boolean; /** * 是否是虚拟牌 * @param { Card | VCard } card @@ -61,7 +61,7 @@ export class Is { * @param { Player } player 玩家 * @returns */ - blocked(skill: string, player: any): boolean; + blocked(skill: string, player: Player): boolean; /** * 是否是双势力武将 * @param { string } name @@ -107,7 +107,7 @@ export class Is { /** * @param { GameEventPromise } event */ - converted(event: any): boolean; + converted(event: GameEventPromise): boolean; safari(): boolean; /** * @param { (Card | VCard)[]} cards @@ -162,14 +162,14 @@ export class Is { /** * @param { Player } [player] */ - mobileMe(player?: any): any; + mobileMe(player?: import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): boolean | undefined; newLayout(): boolean; phoneLayout(): boolean; singleHandcard(): any; /** * @param { Player } player */ - linked2(player: any): boolean; + linked2(player: Player): boolean; /** * @param { {} } obj */ @@ -183,11 +183,11 @@ export class Is { * @param { Player } player * @returns */ - locked(skill: string, player: any): any; + locked(skill: string, player: Player): any; /** * @param { string } skill * @param { Player } player * @returns */ - zhuanhuanji(skill: string, player: any): boolean; + zhuanhuanji(skill: string, player: Player): boolean; } diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/cache/childNodesWatcher.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/cache/childNodesWatcher.d.ts index e7efe33ae..ea1749c1e 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/cache/childNodesWatcher.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/cache/childNodesWatcher.d.ts @@ -1,6 +1,6 @@ /** -* 子节点观察器,对于需要频繁遍历子节点的DOM对象的实时变化进行缓存。 -*/ + * 子节点观察器,对于需要频繁遍历子节点的DOM对象的实时变化进行缓存。 + */ export class ChildNodesWatcher { constructor(dom: any); dom: any; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/button.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/button.d.ts index 58f5afd4d..98c3dd6a1 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/button.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/button.d.ts @@ -14,4 +14,4 @@ export class Button extends HTMLDivElement { exclude(): void; get updateTransform(): (bool: any, delay: any) => void; } -import { ui } from '../../ui/index.js'; +import { ui } from "../../ui/index.js"; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts index cce666e53..025d7e6b9 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts @@ -63,7 +63,7 @@ export class Card extends HTMLDivElement { cardid: string | undefined; /** * @param {[string, number, string, string]} card - */ + */ $init(card: [string, number, string, string]): this; updateTransform(bool: any, delay: any): void; aiexclude(): void; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/contents.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/contents.d.ts index 3d3de19f4..64d9acd0f 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/contents.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/contents.d.ts @@ -1,4 +1,4 @@ /** * @type { SMap<((event: GameEventPromise, trigger: GameEventPromise, player: Player) => Promise)[]> } */ -export const Contents: SMap<((event: any, trigger: any, player: any) => Promise)[]>; +export const Contents: SMap<((event: GameEventPromise, trigger: GameEventPromise, player: Player) => Promise)[]>; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/dialog.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/dialog.d.ts index 388b39ecc..dc2406ed3 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/dialog.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/dialog.d.ts @@ -22,14 +22,14 @@ export class Dialog extends HTMLDivElement { * @param {*} [noclick] * @param { boolean } [zoom] */ - add(item: string | HTMLDivElement | Card[] | Player[], noclick?: any, zoom?: boolean | undefined): string | any[] | HTMLDivElement; + add(item: string | HTMLDivElement | Card[] | Player[], noclick?: any, zoom?: boolean | undefined): string | HTMLDivElement | import("noname-typings/nonameModules/noname/library/element/player.js").Player[] | import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; forcebutton: boolean | undefined; /** * @param { string } str * @param { boolean } [center] */ addText(str: string, center?: boolean | undefined): this; - addSmall(item: any, noclick: any): string | any[] | HTMLDivElement; + addSmall(item: any, noclick: any): string | HTMLDivElement | import("noname-typings/nonameModules/noname/library/element/player.js").Player[] | import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; addAuto(content: any): void; open(): this | undefined; _dragtransform: any; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts index efa0b6699..09863751b 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts @@ -43,15 +43,19 @@ export class GameEvent { /** * @type { Player } */ - source: any; + source: Player; /** * @type { Player } */ - player: any; + player: Player; + /** + * @type { Player[] } + */ + players: Player[]; /** * @type { Player } */ - target: any; + target: Player; /** * @type { Player[] } */ @@ -59,7 +63,7 @@ export class GameEvent { /** * @type { Card } */ - card: any; + card: Card; /** * @type { Card[] } */ @@ -87,7 +91,7 @@ export class GameEvent { /** * @type { Player } */ - customSource: any; + customSource: Player; /** * @type { number } */ @@ -232,12 +236,12 @@ export class GameEvent { * 获取事件的父节点。 * 获取事件链上的指定事件。 * 默认获取上一个父节点(核心)。 - * @param {number|string|(evt:gameEvent)=>boolean} [level=1] 获取深度(number)/指定名字(string)/指定特征(function) + * @param {number|string|((evt:GameEvent)=>boolean)} [level=1] 获取深度(number)/指定名字(string)/指定特征(function) * @param {boolean} [forced] 若获取不到节点,默认返回{},若forced为true则返回null * @param {boolean} [includeSelf] 若level不是数字,指定搜索时是否包含事件本身 * @returns {GameEvent|{}|null} */ - getParent(level?: string | number | ((evt: gameEvent) => boolean) | undefined, forced?: boolean | undefined, includeSelf?: boolean | undefined): GameEvent | {} | null; + getParent(level?: string | number | ((evt: GameEvent) => boolean) | undefined, forced?: boolean | undefined, includeSelf?: boolean | undefined): GameEvent | {} | null; getTrigger(): any; getRand(name: any): any; _rand_map: {} | undefined; @@ -267,8 +271,8 @@ export class GameEvent { _cardChoice: any; _targetChoice: any; _skillChoice: any; - isMine(): any; - isOnline(): any; + isMine(): boolean; + isOnline(): boolean; notLink(): boolean; isPhaseUsing(player: any): boolean; addTrigger(skills: any, player: any): this; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEventPromise.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEventPromise.d.ts index eb2481761..8ca046c2b 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEventPromise.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEventPromise.d.ts @@ -21,7 +21,7 @@ * game.log('等待', player, '摸牌完成执行log'); * ``` */ -export class GameEventPromise extends Promise { +export class GameEventPromise extends Promise { /** * @param { import('./gameEvent.js').GameEvent } arg */ @@ -140,10 +140,6 @@ export class GameEventPromise extends Promise { * @returns { Promise[]> } */ forResult(params: T[]): Promise[]>; - /** - * 返回result中的bool项 - */ - forResultTest(): Promise<(boolean | any[])[]>; /** * 返回result中的bool项 */ @@ -151,11 +147,11 @@ export class GameEventPromise extends Promise { /** * 返回result中的targets项。 */ - forResultTargets(): Promise; + forResultTargets(): Promise; /** * 返回result中的cards项 */ - forResultCards(): Promise; + forResultCards(): Promise; /** * 返回result中的card项 * diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts index 34afa35d4..f27ba6702 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts @@ -295,13 +295,13 @@ export class Player extends HTMLDivElement { /** * 获取角色所有的明置手牌 */ - getShownCards(): any[]; + getShownCards(): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; /** * 获取该角色被other所知的牌 * @param { Player } [other] * @param { (card: Card) => boolean } [filter] */ - getKnownCards(other?: Player | undefined, filter?: ((card: any) => boolean) | undefined): any[]; + getKnownCards(other?: Player | undefined, filter?: ((card: Card) => boolean) | undefined): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; /** * 判断此角色的手牌是否已经被看光了 * @param { Player } [other] @@ -312,13 +312,13 @@ export class Player extends HTMLDivElement { * @param { Player } [other] * @param { (card: Card) => boolean } [filter] */ - hasKnownCards(other?: Player | undefined, filter?: ((card: any) => boolean) | undefined): boolean; + hasKnownCards(other?: Player | undefined, filter?: ((card: Card) => boolean) | undefined): boolean; /** * 数此角色被知道的牌 * @param { Player } [other] * @param { (card: Card) => boolean } [filter] */ - countKnownCards(other?: Player | undefined, filter?: ((card: any) => boolean) | undefined): number; + countKnownCards(other?: Player | undefined, filter?: ((card: Card) => boolean) | undefined): number; /** * Execute the delay card effect * @@ -336,7 +336,7 @@ export class Player extends HTMLDivElement { * 检测此牌是否不计入手牌上限 * @param { Card } card */ - canIgnoreHandcard(card: any): boolean; + canIgnoreHandcard(card: Card): boolean; /** * Gift * @@ -353,7 +353,7 @@ export class Player extends HTMLDivElement { * @param { Player } target * @param { boolean } [strict] */ - canGift(card: any, target: Player, strict?: boolean | undefined): boolean; + canGift(card: Card, target: Player, strict?: boolean | undefined): boolean; /** * Check if the player refuses gifts * @@ -361,7 +361,7 @@ export class Player extends HTMLDivElement { * @param { Card } card * @param { Player } player */ - refuseGifts(card: any, player: Player): boolean; + refuseGifts(card: Card, player: Player): boolean; /** * Gift AI related * @@ -369,12 +369,12 @@ export class Player extends HTMLDivElement { * @param { Card } card * @param { Player } target */ - getGiftAIResultTarget(card: any, target: Player): number; + getGiftAIResultTarget(card: Card, target: Player): number; /** * @param { Card } card * @param { Player } target */ - getGiftEffect(card: any, target: Player): number; + getGiftEffect(card: Card, target: Player): number; /** * 重铸 * @param { Card | Card[] } cards @@ -390,7 +390,7 @@ export class Player extends HTMLDivElement { * @param { Player } [source] * @param { boolean } [strict] */ - canRecast(card: any, source?: Player | undefined, strict?: boolean | undefined): boolean; + canRecast(card: Card, source?: Player | undefined, strict?: boolean | undefined): boolean; /** * 判断一名角色的某个区域是否被废除 * @@ -574,7 +574,7 @@ export class Player extends HTMLDivElement { * @param { string } tag * @param { Card[] } [cards] */ - removeGaintag(tag: string, cards?: any[] | undefined): void; + removeGaintag(tag: string, cards?: import("noname-typings/nonameModules/noname/library/element/card.js").Card[] | undefined): void; /** * @param { Player } target */ @@ -583,18 +583,18 @@ export class Player extends HTMLDivElement { * @param { Card } card * @param { Player } target */ - canSaveCard(card: any, target: Player): any; + canSaveCard(card: Card, target: Player): any; /** * @param { String } from * @param { String } to * @returns { GameEventPromise } */ - reinitCharacter(from: string, to: string, log?: boolean): any; + reinitCharacter(from: string, to: string, log?: boolean): GameEventPromise; /** * @param { String[] } newPairs * @returns { GameEventPromise } */ - changeCharacter(newPairs: string[], log?: boolean): any; + changeCharacter(newPairs: string[], log?: boolean): GameEventPromise; /** * @param { 0 | 1 | 2 } num * @param { false } [log] @@ -630,7 +630,7 @@ export class Player extends HTMLDivElement { * @param { string } [nature] * @param { string } [popname] */ - tryCardAnimate(card: any, name: string, nature?: string | undefined, popname?: string | undefined, ...args: any[]): void; + tryCardAnimate(card: Card, name: string, nature?: string | undefined, popname?: string | undefined, ...args: any[]): void; /** * @param { string } name * @param { string } type @@ -754,12 +754,12 @@ export class Player extends HTMLDivElement { name: string; name1: string; name2: string; - handcards: any[]; + handcards: import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; gaintag: never[]; - equips: any[]; - judges: any[]; - specials: any[]; - expansions: any[]; + equips: import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; + judges: import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; + specials: import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; + expansions: import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; expansion_gaintag: never[]; disableJudge: boolean; disabledSlots: SMap; @@ -812,17 +812,17 @@ export class Player extends HTMLDivElement { * @param { string | Record | ((card: Card) => boolean) } [arg2] * @returns { Iterable } */ - iterableGetCards(arg1?: string | undefined, arg2?: string | Record | ((card: any) => boolean) | undefined): Iterable; + iterableGetCards(arg1?: string | undefined, arg2?: string | Record | ((card: Card) => boolean) | undefined): Iterable; /** * @param { string } [arg1='h'] * @param { string | Record | ((card: Card) => boolean) } [arg2] * @returns { Card[] } */ - getCards(arg1?: string | undefined, arg2?: string | Record | ((card: any) => boolean) | undefined): Card[]; - iterableGetDiscardableCards(player: any, arg1: any, arg2: any): Generator; - getDiscardableCards(player: any, arg1: any, arg2: any): any[]; - iterableGetGainableCards(player: any, arg1: any, arg2: any): Generator; - getGainableCards(player: any, arg1: any, arg2: any): any[]; + getCards(arg1?: string | undefined, arg2?: string | Record | ((card: Card) => boolean) | undefined): Card[]; + iterableGetDiscardableCards(player: any, arg1: any, arg2: any): Generator; + getDiscardableCards(player: any, arg1: any, arg2: any): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; + iterableGetGainableCards(player: any, arg1: any, arg2: any): Generator; + getGainableCards(player: any, arg1: any, arg2: any): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; getGainableSkills(func: any): any[]; countCards(arg1: any, arg2: any): number; getCardIndex(arg1: any, name: any, card: any, max: any): number; @@ -879,7 +879,7 @@ export class Player extends HTMLDivElement { useSkill(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; drawTo(num: any, args: any): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; draw(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; - randomDiscard(...args: any[]): any[]; + randomDiscard(...args: any[]): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; randomGain(...args: any[]): any; discard(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; loseToDiscardpile(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; @@ -941,7 +941,7 @@ export class Player extends HTMLDivElement { hideTimer(): void; markAuto(name: any, info: any): void; unmarkAuto(name: any, info: any): void; - getExpansions(tag: any): any[]; + getExpansions(tag: any): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; countExpansions(tag: any): number; hasExpansions(tag: any): boolean; setStorage(name: any, value: any, mark: any): any; @@ -1037,7 +1037,7 @@ export class Player extends HTMLDivElement { getGlobalFrom(): number; getGlobalTo(): number; getHandcardLimit(): number; - getEnemies(func: any): any[] | undefined; + getEnemies(func: any): import("noname-typings/nonameModules/noname/library/element/player.js").Player[] | undefined; getFriends(func: any): any[]; isEnemyOf(...args: any[]): boolean; isFriendOf(player: any): boolean; @@ -1087,7 +1087,7 @@ export class Player extends HTMLDivElement { mayHaveSha(viewer: any, type: any, ignore: any, rvt: any): number | boolean; mayHaveShan(viewer: any, type: any, ignore: any, rvt: any): number | boolean; hasCard(name: any, position: any): boolean; - getEquip(name: any): any; + getEquip(name: any): import("noname-typings/nonameModules/noname/library/element/card.js").Card | null; getJudge(name: any): ChildNode | null; $drawAuto(cards: any, target: any): void; $draw(num: any, init: any, config: any): void; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/vcard.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/vcard.d.ts index d4dd547d9..5b04b8a3b 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/vcard.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/vcard.d.ts @@ -5,7 +5,7 @@ export class VCard { * @param { string } [name] * @param { string } [nature] */ - constructor(suitOrCard?: any, numberOrCards?: number | any[] | undefined, name?: string | undefined, nature?: string | undefined); + constructor(suitOrCard?: any, numberOrCards?: number | import("noname-typings/nonameModules/noname/library/element/card.js").Card[] | undefined, name?: string | undefined, nature?: string | undefined); /** * @type {string} */ @@ -43,7 +43,7 @@ export class VCard { /** * @param { Player } player */ - hasNature(nature: any, player: any): boolean; + hasNature(nature: any, player: Player): boolean; getCacheKey(): string; hasGaintag(tag: any): any; } diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/index.d.ts index 9f5125615..38a4c0d53 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/index.d.ts @@ -62,7 +62,10 @@ export class Library { onload: any[]; onload2: any[]; onprepare: any[]; - arenaReady: any[]; + /** + * @type { Function[] | undefined } + */ + arenaReady: Function[] | undefined; onfree: any[]; inpile: any[]; inpile_nature: any[]; @@ -503,11 +506,11 @@ export class Library { intro: string; init: string; item: { - '500': string; - '700': string; - '1000': string; - '1500': string; - '2500': string; + 500: string; + 700: string; + 1000: string; + 1500: string; + 2500: string; }; }; doubleclick_intro: { @@ -521,12 +524,12 @@ export class Library { init: string; intro: string; item: { - '0': string; - '5': string; - '10': string; - '20': string; - '50': string; - '10000': string; + 0: string; + 5: string; + 10: string; + 20: string; + 50: string; + 10000: string; }; unfrequent: boolean; }; @@ -719,10 +722,10 @@ export class Library { init: string; item: { off: string; - '30000': string; - '60000': string; - '120000': string; - '300000': string; + 30000: string; + 60000: string; + 120000: string; + 300000: string; }; intro: string; onclick(item: any): void; @@ -889,17 +892,17 @@ export class Library { name: string; init: string; item: { - '-5x': string; - '-4x': string; - '-3x': string; - '-2x': string; - '-1x': string; - '0x': string; - '1x': string; - '2x': string; - '3x': string; - '4x': string; - '5x': string; + "-5x": string; + "-4x": string; + "-3x": string; + "-2x": string; + "-1x": string; + "0x": string; + "1x": string; + "2x": string; + "3x": string; + "4x": string; + "5x": string; }; unfrequent: boolean; onclick(item: any): void; @@ -908,17 +911,17 @@ export class Library { name: string; init: string; item: { - '-5x': string; - '-4x': string; - '-3x': string; - '-2x': string; - '-1x': string; - '0x': string; - '1x': string; - '2x': string; - '3x': string; - '4x': string; - '5x': string; + "-5x": string; + "-4x": string; + "-3x": string; + "-2x": string; + "-1x": string; + "0x": string; + "1x": string; + "2x": string; + "3x": string; + "4x": string; + "5x": string; }; unfrequent: boolean; onclick(item: any): void; @@ -927,17 +930,17 @@ export class Library { name: string; init: string; item: { - '-5x': string; - '-4x': string; - '-3x': string; - '-2x': string; - '-1x': string; - '0x': string; - '1x': string; - '2x': string; - '3x': string; - '4x': string; - '5x': string; + "-5x": string; + "-4x": string; + "-3x": string; + "-2x": string; + "-1x": string; + "0x": string; + "1x": string; + "2x": string; + "3x": string; + "4x": string; + "5x": string; }; unfrequent: boolean; onclick(item: any): void; @@ -946,17 +949,17 @@ export class Library { name: string; init: string; item: { - '-5x': string; - '-4x': string; - '-3x': string; - '-2x': string; - '-1x': string; - '0x': string; - '1x': string; - '2x': string; - '3x': string; - '4x': string; - '5x': string; + "-5x": string; + "-4x": string; + "-3x": string; + "-2x": string; + "-1x": string; + "0x": string; + "1x": string; + "2x": string; + "3x": string; + "4x": string; + "5x": string; }; unfrequent: boolean; onclick(item: any): void; @@ -1390,10 +1393,10 @@ export class Library { intro: string; init: string; item: { - '6': string; - '12': string; - '20': string; - '30': string; + 6: string; + 12: string; + 20: string; + 30: string; }; unfrequent: boolean; }; @@ -1624,15 +1627,15 @@ export class Library { name: string; init: number; item: { - '0': string; - '1': string; - '2': string; - '3': string; - '4': string; - '5': string; - '6': string; - '7': string; - '8': string; + 0: string; + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; + 6: string; + 7: string; + 8: string; }; onclick(volume: any): void; }; @@ -1640,15 +1643,15 @@ export class Library { name: string; init: number; item: { - '0': string; - '1': string; - '2': string; - '3': string; - '4': string; - '5': string; - '6': string; - '7': string; - '8': string; + 0: string; + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; + 6: string; + 7: string; + 8: string; }; onclick(volume: any): void; }; @@ -1722,108 +1725,108 @@ export class Library { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; huosha: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; leisha: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; shan: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; tao: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; jiu: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; wuxie: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; nanman: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; wanjian: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; guohe: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; shunshou: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; tiesuo: { name: string; init: string; item: { - '1': string; - '0.5': string; - '0': string; + 1: string; + 0.5: string; + 0: string; }; }; hide: { @@ -1869,10 +1872,10 @@ export class Library { name: string; init: string; item: { - '0.1': string; - '0.2': string; - '0.3': string; - '0.5': string; + 0.1: string; + 0.2: string; + 0.3: string; + 0.5: string; }; }; hide: { @@ -1946,9 +1949,9 @@ export class Library { item: { off: string; group: string; - '4': string; - '6': string; - '8': string; + 4: string; + 6: string; + 8: string; }; }; connect_zhong_card: { @@ -2221,12 +2224,12 @@ export class Library { init: string; restart: boolean; item: { - '3': string; - '4': string; - '5': string; - '6': string; - '8': string; - '10': string; + 3: string; + 4: string; + 5: string; + 6: string; + 8: string; + 10: string; }; }; limit_zhu: { @@ -2236,9 +2239,9 @@ export class Library { item: { off: string; group: string; - '4': string; - '6': string; - '8': string; + 4: string; + 6: string; + 8: string; }; }; choice_zhong: { @@ -2246,12 +2249,12 @@ export class Library { init: string; restart: boolean; item: { - '3': string; - '4': string; - '5': string; - '6': string; - '8': string; - '10': string; + 3: string; + 4: string; + 5: string; + 6: string; + 8: string; + 10: string; }; }; choice_nei: { @@ -2259,12 +2262,12 @@ export class Library { init: string; restart: boolean; item: { - '3': string; - '4': string; - '5': string; - '6': string; - '8': string; - '10': string; + 3: string; + 4: string; + 5: string; + 6: string; + 8: string; + 10: string; }; }; choice_fan: { @@ -2272,12 +2275,12 @@ export class Library { init: string; restart: boolean; item: { - '3': string; - '4': string; - '5': string; - '6': string; - '8': string; - '10': string; + 3: string; + 4: string; + 5: string; + 6: string; + 8: string; + 10: string; }; }; enable_commoner: { @@ -2292,12 +2295,12 @@ export class Library { init: string; restart: boolean; item: { - '3': string; - '4': string; - '5': string; - '6': string; - '8': string; - '10': string; + 3: string; + 4: string; + 5: string; + 6: string; + 8: string; + 10: string; }; }; enable_year_limit: { @@ -2552,12 +2555,12 @@ export class Library { init: string; restart: boolean; item: { - '5': string; - '6': string; - '7': string; - '8': string; - '9': string; - '10': string; + 5: string; + 6: string; + 7: string; + 8: string; + 9: string; + 10: string; }; }; }; @@ -2570,10 +2573,10 @@ export class Library { name: string; init: string; item: { - '1v1': string; - '2v2': string; - '3v3': string; - '4v4': string; + "1v1": string; + "2v2": string; + "3v3": string; + "4v4": string; guandu: string; }; frequent: boolean; @@ -2595,11 +2598,11 @@ export class Library { init: string; frequent: boolean; item: { - '12': string; - '16': string; - '20': string; - '24': string; - '40': string; + 12: string; + 16: string; + 20: string; + 24: string; + 40: string; }; }; connect_replace_number: { @@ -2607,12 +2610,12 @@ export class Library { init: string; frequent: boolean; item: { - '0': string; - '1': string; - '2': string; - '3': string; - '4': string; - '5': string; + 0: string; + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; }; }; }; @@ -2949,12 +2952,12 @@ export class Library { init: string; restart: boolean; item: { - '3': string; - '4': string; - '5': string; - '6': string; - '8': string; - '10': string; + 3: string; + 4: string; + 5: string; + 6: string; + 8: string; + 10: string; }; }; choice_fan: { @@ -2962,12 +2965,12 @@ export class Library { init: string; restart: boolean; item: { - '3': string; - '4': string; - '5': string; - '6': string; - '8': string; - '10': string; + 3: string; + 4: string; + 5: string; + 6: string; + 8: string; + 10: string; }; }; edit_character: { @@ -3089,10 +3092,10 @@ export class Library { name: string; init: string; item: { - '0': string; - '0.2': string; - '0.333': string; - '0.5': string; + 0: string; + 0.2: string; + 0.333: string; + 0.5: string; }; frequent: boolean; }; @@ -3129,10 +3132,10 @@ export class Library { init: string; intro: string; item: { - '0': string; - '10': string; - '20': string; - '30': string; + 0: string; + 10: string; + 20: string; + 30: string; }; }; }; @@ -3145,10 +3148,10 @@ export class Library { init: string; frequent: boolean; item: { - '10': string; - '20': string; - '30': string; - '1000': string; + 10: string; + 20: string; + 30: string; + 1000: string; }; }; tafang_difficulty: { @@ -3156,9 +3159,9 @@ export class Library { init: string; frequent: boolean; item: { - '1': string; - '2': string; - '3': string; + 1: string; + 2: string; + 3: string; }; }; show_range: { @@ -3174,10 +3177,10 @@ export class Library { intro: string; init: string; item: { - '0': string; - '10': string; - '20': string; - '30': string; + 0: string; + 10: string; + 20: string; + 30: string; }; }; }; @@ -3255,13 +3258,13 @@ export class Library { init: string; frequent: boolean; item: { - '1': string; - '2': string; - '3': string; - '4': string; - '6': string; - '8': string; - '10': string; + 1: string; + 2: string; + 3: string; + 4: string; + 6: string; + 8: string; + 10: string; }; onclick(num: any): void; }; @@ -3992,7 +3995,7 @@ export class Library { link: () => void; chooseToGuanxing: () => void; }; - contents: SMap<((event: any, trigger: any, player: any) => Promise)[]>; + contents: SMap<((event: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise, trigger: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise, player: import("noname-typings/nonameModules/noname/library/element/player.js").Player) => Promise)[]>; Player: typeof Element.Player; Card: typeof Element.Card; VCard: typeof Element.VCard; @@ -4243,7 +4246,7 @@ export class Library { attackFrom: (card: any, player: any, target: any) => boolean; globalFrom: (card: any, player: any, target: any) => boolean; selectCard: () => number[]; - selectTarget: (card: any, player: any) => any; + selectTarget: (card: any, player: any) => number | number[] | (() => number | Select) | undefined; judge: (card: any, player: any, target: any) => any; autoRespondSha: () => boolean; autoRespondShan: () => boolean; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/update.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/update.d.ts index f52662f1a..20359ec48 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/update.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/update.d.ts @@ -1,3 +1,6 @@ +/** + * 获取github授权的token + */ export function gainAuthorization(): Promise; /** * 字节转换 @@ -6,9 +9,10 @@ export function gainAuthorization(): Promise; export function parseSize(limit: number): string; /** * 对比版本号 - * @param { string } ver1 - * @param { string } ver2 - * @returns { -1 | 0 | 1 } + * @param { string } ver1 版本号1 + * @param { string } ver2 版本号2 + * @returns { -1 | 0 | 1 } -1为ver1 < ver2, 0为ver1 == ver2, 1为ver1 > ver2 + * @throws {Error} */ export function checkVersion(ver1: string, ver2: string): -1 | 0 | 1; /** @@ -91,7 +95,7 @@ export function getRepoTagDescription(tagName: string, options?: { }>; /** * - * 获取仓库指定分支和指定目录内的所有文件和目录 + * 获取仓库指定分支和指定(单个)目录内的所有文件和目录 * @param { string } [path = ''] 路径名称(可放参数) * @param { string } [branch = ''] 仓库分支名称 * @param { Object } options @@ -128,6 +132,9 @@ export function getRepoFilesList(path?: string | undefined, branch?: string | un /** * * 获取仓库指定分支和指定目录内的所有文件(包含子目录的文件) + * + * **注意: 此api可能会大幅度消耗请求次数,请谨慎使用** + * * @param { string } [path = ''] 路径名称(可放参数) * @param { string } [branch = ''] 仓库分支名称 * @param { Object } options @@ -155,7 +162,7 @@ export function flattenRepositoryFiles(path?: string | undefined, branch?: strin type: 'file'; }[]>; /** - * 请求一个文件而不是直接储存为文件 + * 请求一个文件而不是直接储存为文件,这样可以省内存空间 * @param { string } url * @param { (receivedBytes: number, total?:number, filename?: string) => void } [onProgress] * @param { RequestInit } [options={}] @@ -174,3 +181,37 @@ export function request(url: string, onProgress?: ((receivedBytes: number, total * @returns { progress } */ export function createProgress(title?: string | undefined, max?: string | number | undefined, fileName?: string | undefined, value?: string | number | undefined): progress; +/** + * 从GitHub存储库检索最新版本(tag),不包括特定tag。 + * + * 此函数从GitHub存储库中获取由所有者和存储库名称指定的tags列表,然后返回不是“v1998”的最新tag名称。 + * @param {string} owner GitHub上拥有存储库的用户名或组织名称。 + * @param {string} repo 要从中提取tag的存储库的名称。 + * @returns {Promise} 以最新版本tag的名称解析的promise,或者如果操作失败则以错误拒绝。 + * @throws {Error} 如果获取操作失败或找不到有效tag,将抛出错误。 + */ +export function getLatestVersionFromGitHub(owner?: string, repo?: string): Promise; +/** + * 从指定目录中的GitHub存储库中获取树 + * @param {string[]} directories 要从中获取树的目录列表 + * @param {string} version 从中获取树的版本或分支。 + * @param {string} [owner = 'libccy'] GitHub上拥有存储库的用户名或组织名称。 + * @param {string} [repo = 'noname'] GitHub存储库的名称 + * @returns {Promise<{ + * path: string; + * mode: string; + * type: "blob" | "tree"; + * sha: string; + * size: number; + * url: string; + * }[][]>} A promise that resolves with trees from the specified directories. + * @throws {Error} Will throw an error if unable to fetch the repository tree from GitHub. + */ +export function getTreesFromGithub(directories: string[], version: string, owner?: string | undefined, repo?: string | undefined): Promise<{ + path: string; + mode: string; + type: "blob" | "tree"; + sha: string; + size: number; + url: string; +}[][]>; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/status/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/status/index.d.ts index 74198ffa9..4e22b6b21 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/status/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/status/index.d.ts @@ -8,7 +8,7 @@ export class status { /** * @type { GameEventPromise } */ - event: any; + event: GameEventPromise; ai: {}; lastdragchange: any[]; skillaudio: any[]; @@ -30,39 +30,43 @@ export class status { prehidden_skills: any[]; postReconnect: {}; /** - * @type { string | void } + * @type { string | undefined } */ - extension: string | void; + extension: string | undefined; /** - * @type { boolean | void } + * @type { boolean | undefined } */ - dragged: boolean | void; + dragged: boolean | undefined; /** - * @type { boolean | void } + * @type { boolean | undefined } */ - touchconfirmed: boolean | void; + touchconfirmed: boolean | undefined; /** - * @type { boolean | void } + * @type { boolean | undefined } */ - connectMode: boolean | void; + connectMode: boolean | undefined; /** - * @type { boolean | void } + * @type { boolean | undefined } */ - importingExtension: boolean | void; + importingExtension: boolean | undefined; /** - * @type { Promise[] | void } + * @type { Promise[] | undefined } */ - extensionLoaded: Promise[] | void; + extensionLoaded: Promise[] | undefined; /** - * @type { Promise[] | void } + * @type { Promise[] | undefined } */ - extensionLoading: Promise[] | void; + extensionLoading: Promise[] | undefined; /** - * @type { { [key: string]: Promise[] } | void } + * @type { { [key: string]: Promise[] } | undefined } */ - importing: void | { + importing: { [key: string]: Promise[]; - }; + } | undefined; + /** + * @type { Function | boolean | undefined } + */ + new_tutorial: Function | boolean | undefined; } export let _status: status; export function setStatus(instance?: status | undefined): void; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/ui/click/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/ui/click/index.d.ts index 35b3b467c..18a0944c2 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/ui/click/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/ui/click/index.d.ts @@ -7,6 +7,10 @@ export class Click { * @type {(arg0: string) => void} */ menuTab: (arg0: string) => void; + /** + * @type {() => void} + */ + configMenu: () => void; identitycircle(): void; connectEvents(): void; connectClients(): void; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/ui/create/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/ui/create/index.d.ts index ad87669c0..bd28a4c5b 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/ui/create/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/ui/create/index.d.ts @@ -2,7 +2,7 @@ export class Create { /** * @type {(video: Videos, before: boolean) => void} */ - videoNode: (video: any, before: boolean) => void; + videoNode: (video: Videos, before: boolean) => void; /** * 创建身份牌实例 */ @@ -62,9 +62,9 @@ export class Create { caption(str: any, position: any): HTMLDivElement; control(...args: any[]): import("../../library/element/control.js").Control; confirm(str: any, func: any): void; - skills(skills: any): any; - skills2(skills: any): any; - skills3(skills: any): any; + skills(skills: any): import("noname-typings/nonameModules/noname/library/element/control.js").Control | undefined; + skills2(skills: any): import("noname-typings/nonameModules/noname/library/element/control.js").Control | undefined; + skills3(skills: any): import("noname-typings/nonameModules/noname/library/element/control.js").Control | undefined; arena(): void; system(str: any, func: any, right: any, before: any): HTMLDivElement; pause(): HTMLDivElement | undefined; @@ -104,7 +104,7 @@ export class Create { textbuttons(list: any, dialog: any, noclick: any): void; player(position: any, noclick: any): import("../../library/element/player.js").Player; connectPlayers(ip: any): void; - players(numberOfPlayers: any): any[] | undefined; + players(numberOfPlayers: any): import("noname-typings/nonameModules/noname/library/element/player.js").Player[] | undefined; me(hasme: any): void; card(position: any, info: any, noclick: any): import("../../library/element/card.js").Card; cardsAsync(...args: any[]): void; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts index b99c9fecf..df605984f 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts @@ -30,7 +30,7 @@ export class UI { /** * @type { Dialog } */ - dialog: any; + dialog: Dialog; /** * @type { HTMLDivElement } */ @@ -42,7 +42,7 @@ export class UI { /** * @type { Control } */ - control: any; + control: Control; /** * @type { Control | undefined } */ diff --git a/node_modules/@types/noname-typings/nonameModules/noname/util/browser.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/util/browser.d.ts index 381e59efc..b03c4cfff 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/util/browser.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/util/browser.d.ts @@ -7,4 +7,4 @@ */ export const promiseErrorHandlerMap: Record<"firefox" | "chrome" | "safari" | "other", new () => PromiseErrorHandler>; export type PromiseErrorHandler = import('./struct/interface/promise-error-handler.js').PromiseErrorHandler; -import { PromiseErrorHandler } from './struct/index.js'; +import { PromiseErrorHandler } from "./struct/index.js"; From b5b9bac2ff5a6b0cd9b512f9eab917a73b49f2ed Mon Sep 17 00:00:00 2001 From: kuangthree Date: Sat, 20 Apr 2024 15:06:44 +0800 Subject: [PATCH 15/57] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extension/coin/extension.js | 17 +++++++++++++---- layout/default/toast.css | 7 ++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/extension/coin/extension.js b/extension/coin/extension.js index cf5aaa005..3e5e1293c 100644 --- a/extension/coin/extension.js +++ b/extension/coin/extension.js @@ -131,11 +131,20 @@ game.import("play", function () { } }, game: { - changeCoin: function (num,toast) { + changeCoin: function (num, toast, audio) { if (typeof num == "number" && ui.coin) { - if(num!=0 && toast!== false){ - game.playAudio('effect',num > 0?"coin":"coin_cost"); - ui.create.toast(`${num > 0 ? "获得":"花费"} ${num} 金币`); + if (num != 0 && toast !== false) { + ui.create.toast( + `${num > 0 ? "获得" : "花费"} ${Math.abs( + num + )} 金币` + ); + } + if (audio !== false) { + game.playAudio( + "effect", + num > 0 ? "coin" : "coin_cost" + ); } game.saveConfig("coin", lib.config.coin + num); var str; diff --git a/layout/default/toast.css b/layout/default/toast.css index b5486fb0b..b5f3d60bb 100644 --- a/layout/default/toast.css +++ b/layout/default/toast.css @@ -1,5 +1,5 @@ .toast-container { - display:block; + display: block; position: absolute; top: 15%; left: 50%; @@ -7,7 +7,6 @@ z-index: 9999; } - .toast { display: block; position: absolute; @@ -25,17 +24,19 @@ animation: fadeInOut 1500ms ease-in-out forwards; } - @keyframes fadeInOut { 0% { opacity: 0; } + 20% { opacity: 1; } + 80% { opacity: 1; } + 100% { opacity: 0; } From 83ff76d661e082ae98c0a96d7fbb702b3dd0634c Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 17:33:57 +0800 Subject: [PATCH 16/57] =?UTF-8?q?=E8=B0=83=E6=95=B4=E3=80=90=E5=AE=9A?= =?UTF-8?q?=E5=B7=9E=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/character/extra.js b/character/extra.js index ac0fb3b9c..443860763 100755 --- a/character/extra.js +++ b/character/extra.js @@ -673,7 +673,7 @@ game.import("character", function () { return game.hasPlayer((current) => { if (current == player) return false; const total = current.countCards("ej"); - return total > 0 && num >= total + (get.mode() != "doudizhu" ? 1 : 0); + return total > 0 && num >= total; }); }, filterCard: true, @@ -682,7 +682,7 @@ game.import("character", function () { 1, Math.max( ...game.filterPlayer((i) => i != get.player()).map((i) => i.countCards("ej")) - ) + (get.mode() != "doudizhu" ? 1 : 0), + ), ]; }, check(card) { @@ -691,10 +691,10 @@ game.import("character", function () { filterTarget(card, player, target) { const num = target.countCards("ej"); if (!num) return false; - return ui.selected.cards.length == num + (get.mode() != "doudizhu" ? 1 : 0) && player != target; + return ui.selected.cards.length == num && player != target; }, filterOk() { - return ui.selected.cards.length == ui.selected.targets[0].countCards("ej") + (get.mode() != "doudizhu" ? 1 : 0); + return ui.selected.cards.length == ui.selected.targets[0].countCards("ej"); }, position: "he", lose: false, @@ -10840,8 +10840,6 @@ game.import("character", function () { shen_lusu_prefix: "神", dingzhou: "定州", dingzhou_info: - "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数+1)。", - dingzhou_info_doudizhu: "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数)。", tamo: "榻谟", tamo_info: From 80a0b2df63d4066a94099a0582c528be6f9cb48b Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Sat, 20 Apr 2024 17:42:20 +0800 Subject: [PATCH 17/57] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=EF=BC=8C=E6=B6=88=E7=81=ADshenhua.js?= =?UTF-8?q?=E4=B8=AD=E7=9A=84function=E5=85=B3=E9=94=AE=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/shenhua.js | 1119 +++++++++-------- character/standard.js | 5 +- .../@types/noname-typings/Result.d.ts | 7 +- node_modules/@types/noname-typings/Skill.d.ts | 4 +- .../nonameModules/noname/game/index.d.ts | 16 +- .../nonameModules/noname/get/index.d.ts | 8 +- .../nonameModules/noname/get/is.d.ts | 2 +- .../noname/library/element/card.d.ts | 4 + .../noname/library/element/gameEvent.d.ts | 32 +- .../noname/library/element/player.d.ts | 296 ++++- .../nonameModules/noname/ui/index.d.ts | 4 + noname/game/index.js | 9 +- noname/library/element/card.js | 4 + noname/library/element/gameEvent.js | 48 +- noname/library/element/player.js | 224 +++- noname/ui/index.js | 4 + 16 files changed, 1111 insertions(+), 675 deletions(-) diff --git a/character/shenhua.js b/character/shenhua.js index 9df90bd42..1c61beb90 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -140,7 +140,7 @@ game.import("character", function () { guanqiujian: ["wenqin"], }, characterFilter: { - zuoci: function (mode) { + zuoci(mode) { return mode != "guozhan"; }, }, @@ -224,15 +224,16 @@ game.import("character", function () { chendao: "陈到,字叔至,生卒年不详,豫州汝南(今河南驻马店平舆县)人。三国时期蜀汉将领,刘备帐下白毦兵统领,名位常亚于赵云,以忠勇著称。蜀汉建兴年间,任征西将军、永安都督,封亭侯。在任期间去世。", }, + /** @type { importCharacterConfig['skill'] } */ skill: { //庞统写法修改 lianhuan: { audio: 2, - hiddenCard: (player, name) => { + hiddenCard(player, name) { return name == "tiesuo" && player.hasCard((card) => get.suit(card) == "club", "sh"); }, enable: "chooseToUse", - filter: function (event, player) { + filter(event, player) { if (!player.hasCard((card) => get.suit(card) == "club", "sh")) return false; return ( event.type == "phase" || @@ -240,7 +241,7 @@ game.import("character", function () { ); }, position: "hs", - filterCard: function (card, player, event) { + filterCard(card, player, event) { if (!event) event = _status.event; if (get.suit(card) != "club") return false; if (event.type == "phase" && get.position(card) != "s" && player.canRecast(card)) { @@ -252,7 +253,7 @@ game.import("character", function () { return event._backup.filterCard(cardx, player, event); } }, - filterTarget: function (fuck, player, target) { + filterTarget(fuck, player, target) { const card = ui.selected.cards[0], event = _status.event, backup = event._backup; @@ -263,7 +264,7 @@ game.import("character", function () { backup.filterCard(cardx, player, event) && backup.filterTarget(cardx, player, target) ); }, - selectTarget: function () { + selectTarget() { const card = ui.selected.cards[0], event = _status.event, player = event.player, @@ -282,7 +283,7 @@ game.import("character", function () { return select; } }, - filterOk: function () { + filterOk() { const card = ui.selected.cards[0], event = _status.event, player = event.player, @@ -306,13 +307,13 @@ game.import("character", function () { discard: false, lose: false, delay: false, - precontent: function () { + async precontent(event, trigger, player) { var result = event.result; if (result.targets.length > 0) result.card = get.autoViewAs({ name: "tiesuo" }, result.cards); }, - content: function () { - player.recast(cards); + async content(event, trigger, player) { + player.recast(event.cards); }, }, //新杀小加强 陈到 @@ -320,20 +321,20 @@ game.import("character", function () { audio: "drlt_wanglie", locked: false, mod: { - targetInRange: function (card, player, target) { + targetInRange(card, player, target) { if (player.hasSkill("dcwanglie_effect", null, null, false)) return true; }, }, trigger: { player: "useCard", }, - filter: function (event, player) { + filter(event, player) { return ( player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick") ); }, preHidden: true, - check: function (event, player) { + check(event, player) { if (player.hasSkill("dcwanglie2", null, null, false)) return true; if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; player._wanglie_temp = true; @@ -359,7 +360,7 @@ game.import("character", function () { return true; return false; }, - prompt2: function (event) { + prompt2(event) { return ( "令" + get.translation(event.card) + @@ -367,7 +368,7 @@ game.import("character", function () { ); }, group: "dcwanglie_startup", - content: function () { + async content(event, trigger, player) { trigger.nowuxie = true; trigger.directHit.addArray(game.players); player.addTempSkill("dcwanglie2", "phaseUseAfter"); @@ -377,7 +378,7 @@ game.import("character", function () { trigger: { player: "phaseUseBegin" }, forced: true, popup: false, - content: function () { + async content(event, trigger, player) { player.addTempSkill("dcwanglie_effect", "phaseUseAfter"); }, }, @@ -387,10 +388,10 @@ game.import("character", function () { firstDo: true, popup: false, trigger: { player: "useCard1" }, - filter: function (event, player) { + filter(event, player) { return event.targets.some((target) => target != player); }, - content: function () { + async content(event, trigger, player) { player.addMark("dcwanglie_effect", 1, false); if (player.countMark("dcwanglie_effect") >= 2) player.removeSkill("dcwanglie_effect"); @@ -401,7 +402,7 @@ game.import("character", function () { ai: { //pretao:true, directHit_ai: true, - skillTagFilter: function (player, tag, arg) { + skillTagFilter(player, tag, arg) { //if(tag=='pretao') return true; if (player._wanglie_temp) return false; player._wanglie_temp = true; @@ -438,7 +439,7 @@ game.import("character", function () { dcwanglie2: { charlotte: true, mod: { - playerEnabled: function (card, player, target) { + playerEnabled(card, player, target) { if (player != target) return false; }, }, @@ -449,7 +450,7 @@ game.import("character", function () { trigger: { global: ["loseAfter", "addToExpansionAfter", "cardsGotoSpecialAfter", "loseAsyncAfter"], }, - filter: function (event, player, name) { + filter(event, player, name) { if (event.name == "lose" || event.name == "loseAsync") return event.getlx !== false && event.toStorage == true; if (event.name == "cardsGotoSpecial") return !event.notrigger; @@ -457,7 +458,7 @@ game.import("character", function () { }, direct: true, usable: 1, - content: function () { + content() { "step 0"; player .chooseTarget( @@ -539,14 +540,14 @@ game.import("character", function () { ], }, direct: true, - filter: function (event, player) { + filter(event, player) { return game.hasPlayer(function (current) { var evt = event.getl(current); return evt && (evt.xs.length > 0 || evt.ss.length > 0); }); }, usable: 1, - content: function () { + content() { "step 0"; if ( !player.countCards("he") || @@ -561,10 +562,10 @@ game.import("character", function () { prompt2: "弃置一张牌,并令一名其他角色也弃置一张牌", position: "he", filterCard: lib.filter.cardDiscardable, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target != player && target.countCards("he") > 0; }, - ai1: function (card) { + ai1(card) { let player = _status.event.player; if (_status.event.me) { if (get.position(card) === _status.event.me) @@ -573,7 +574,7 @@ game.import("character", function () { } return 5 - get.value(card); }, - ai2: function (target) { + ai2(target) { let player = _status.event.player, att = get.attitude(player, target); if (att > 0 && (_status.event.me || target.isHealthy())) return -att; @@ -659,10 +660,10 @@ game.import("character", function () { audio: "kongsheng", trigger: { player: "phaseZhunbeiBegin" }, direct: true, - filter: function (event, player) { + filter(event, player) { return player.countCards("he") > 0; }, - content: function () { + content() { "step 0"; player .chooseCard( @@ -706,7 +707,7 @@ game.import("character", function () { player.addToExpansion(result.cards, player, "give").gaintag.add("olkongsheng"); } }, - onremove: function (player, skill) { + onremove(player, skill) { var cards = player.getExpansions(skill); if (cards.length) player.loseToDiscardpile(cards); }, @@ -720,14 +721,14 @@ game.import("character", function () { trigger: { player: "phaseJieshuBegin" }, forced: true, locked: false, - filter: function (event, player) { + filter(event, player) { return ( player.getExpansions("olkongsheng").filter(function (card) { return get.type(card, false) != "equip"; }).length > 0 ); }, - content: function () { + content() { "step 0"; var cards = player.getExpansions("olkongsheng").filter(function (card) { return get.type(card, false) != "equip"; @@ -776,7 +777,7 @@ game.import("character", function () { trigger: { player: "useCardToPlayered" }, direct: true, audio: "drlt_zhenrong", - filter: function (event, player) { + filter(event, player) { if (!event.isFirstTarget) return false; if (!["basic", "trick"].includes(get.type(event.card))) return false; if (get.tag(event.card, "damage")) @@ -789,7 +790,7 @@ game.import("character", function () { }); return false; }, - content: function () { + content() { "step 0"; player .chooseTarget( @@ -820,7 +821,7 @@ game.import("character", function () { player.addToExpansion(card, "give", "log", target).gaintag.add("zhengrong"); } }, - onremove: function (player, skill) { + onremove(player, skill) { var cards = player.getExpansions(skill); if (cards.length) player.loseToDiscardpile(cards); }, @@ -839,10 +840,10 @@ game.import("character", function () { skillAnimation: true, animationColor: "thunder", derivation: "qingce", - filter: function (event, player) { + filter(event, player) { return player.getExpansions("zhengrong").length >= 3; }, - content: function () { + content() { "step 0"; player.awakenSkill("hongju"); var cards = player.getExpansions("zhengrong"); @@ -888,23 +889,23 @@ game.import("character", function () { qingce: { enable: "phaseUse", audio: "drlt_qingce", - filter: function (event, player) { + filter(event, player) { return player.getExpansions("zhengrong").length > 0 && player.countCards("h") > 0; }, chooseButton: { - dialog: function (event, player) { + dialog(event, player) { return ui.create.dialog( "请选择要获得的「荣」", player.getExpansions("zhengrong"), "hidden" ); }, - backup: function (links, player) { + backup(links, player) { return { card: links[0], filterCard: true, position: "h", - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target.countDiscardableCards(player, "ej") > 0; }, delay: false, @@ -912,7 +913,7 @@ game.import("character", function () { content: lib.skill.qingce.contentx, ai: { result: { - target: function (player, target) { + target(player, target) { var att = get.attitude(player, target); if ( att > 0 && @@ -934,7 +935,7 @@ game.import("character", function () { }, }; }, - prompt: function (links, player) { + prompt(links, player) { return ( "选择弃置一张手牌,获得" + get.translation(links[0]) + @@ -942,7 +943,7 @@ game.import("character", function () { ); }, }, - contentx: function () { + contentx() { "step 0"; var card = lib.skill.qingce_backup.card; player.gain(card, "gain2", "log"); @@ -954,7 +955,7 @@ game.import("character", function () { ai: { order: 8, result: { - player: function (player) { + player(player) { if ( game.hasPlayer(function (current) { var att = get.attitude(player, current); @@ -984,11 +985,11 @@ game.import("character", function () { trigger: { source: "damageSource", }, - filter: function (event, player) { + filter(event, player) { return event.player != player && event.player.countCards("h") > player.countCards("h"); }, direct: true, - content: function () { + content() { "step 0"; player .choosePlayerCard("hej", get.prompt("drlt_zhenrong"), trigger.player) @@ -1016,10 +1017,10 @@ game.import("character", function () { unique: true, juexingji: true, derivation: ["drlt_qingce"], - filter: function (event, player) { + filter(event, player) { return player.getExpansions("drlt_zhenrong").length >= 3 && game.dead.length > 0; }, - content: function () { + content() { "step 0"; player.awakenSkill("drlt_hongju"); var cards = player.getExpansions("drlt_zhenrong"); @@ -1064,13 +1065,13 @@ game.import("character", function () { drlt_qingce: { audio: 2, enable: "phaseUse", - filter: function (event, player) { + filter(event, player) { return player.getExpansions("drlt_zhenrong").length > 0; }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target.countDiscardableCards(player, "ej") > 0; }, - content: function () { + content() { "step 0"; player.chooseCardButton( player.getExpansions("drlt_zhenrong"), @@ -1090,7 +1091,7 @@ game.import("character", function () { ai: { order: 13, result: { - target: function (player, target) { + target(player, target) { if (get.attitude(player, target) > 0 && target.countCards("j") > 0) return 1; return -1; }, @@ -1103,7 +1104,7 @@ game.import("character", function () { player: "phaseJieshuBegin", }, direct: true, - content: function () { + content() { "step 0"; player .chooseTarget(get.prompt2("drlt_zhenggu"), function (card, player, target) { @@ -1128,7 +1129,7 @@ game.import("character", function () { lib.skill.drlt_zhenggu.sync(player, target); } }, - sync: function (player, target) { + sync(player, target) { var num = player.countCards("h"); var num2 = target.countCards("h"); if (num < num2) { @@ -1144,13 +1145,13 @@ game.import("character", function () { forced: true, charlotte: true, logTarget: "player", - filter: function (event, player) { + filter(event, player) { return ( event.player.storage.drlt_zhenggu_mark && event.player.storage.drlt_zhenggu_mark.includes(player) ); }, - content: function () { + content() { while (trigger.player.storage.drlt_zhenggu_mark.includes(player)) { trigger.player.storage.drlt_zhenggu_mark.remove(player); } @@ -1160,7 +1161,7 @@ game.import("character", function () { }, }, drlt_zhenggu_mark: { - init: function (player, skill) { + init(player, skill) { if (!player.storage[skill]) player.storage[skill] = []; }, marktext: "镇", @@ -1174,7 +1175,7 @@ game.import("character", function () { trigger: { player: "phaseJieshuBegin", }, - check: function (event, player) { + check(event, player) { var num = 0; if ( player.hasHistory("lose", function (evt) { @@ -1187,7 +1188,7 @@ game.import("character", function () { if (num == 3) return player.hp >= 2; return true; }, - prompt: function (event, player) { + prompt(event, player) { var num = 3; if ( player.hasHistory("lose", function (evt) { @@ -1199,7 +1200,7 @@ game.import("character", function () { if (!player.getStat("damage")) num--; return get.prompt("xinfu_zuilun") + "(可获得" + get.cnNumber(num) + "张牌)"; }, - content: function () { + content() { "step 0"; event.num = 0; event.cards = get.cards(3); @@ -1292,7 +1293,7 @@ game.import("character", function () { }, forced: true, audio: 2, - filter: function (event, player) { + filter(event, player) { if (event.player.countCards("h") < player.countCards("h")) return false; if (event.card.name != "sha" && event.card.name != "juedou") return false; return !game.hasPlayer2(function (current) { @@ -1308,12 +1309,12 @@ game.import("character", function () { ); }); }, - content: function () { + content() { trigger.getParent().excluded.add(player); }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { let hs = player.getCards( "h", (i) => i !== card && (!card.cards || !card.cards.includes(i)) @@ -1360,7 +1361,7 @@ game.import("character", function () { locked: true, ai: { effect: { - target: function (card) { + target(card) { if (card.name == "tiesuo") return "zeroplayertarget"; }, }, @@ -1372,16 +1373,16 @@ game.import("character", function () { player: "linkBegin", }, forced: true, - filter: function (event, player) { + filter(event, player) { return !player.isLinked(); }, - content: function () { + content() { trigger.cancel(); }, }, 2: { mod: { - targetEnabled: function (card, player, target) { + targetEnabled(card, player, target) { if (get.type(card) == "delay") return false; }, }, @@ -1395,7 +1396,7 @@ game.import("character", function () { audio: 2, enable: "phaseUse", usable: 1, - filter: function (event, player) { + filter(event, player) { return ( player.hasEnabledSlot(1) || player.hasEnabledSlot(2) || @@ -1403,7 +1404,7 @@ game.import("character", function () { player.hasEnabledSlot("horse") ); }, - content: function () { + content() { "step 0"; player.chooseToDisable(true).set("ai", function (event, player, list) { if (list.includes("equip2")) return "equip2"; @@ -1444,7 +1445,7 @@ game.import("character", function () { ai: { order: 13, result: { - player: function (player) { + player(player) { if (player.hasEnabledSlot("equip2")) return 1; if ( player.hasEnabledSlot("equip1") && @@ -1470,7 +1471,7 @@ game.import("character", function () { }, drlt_jueyan1: { mod: { - cardUsable: function (card, player, num) { + cardUsable(card, player, num) { if (card.name == "sha") return num + 3; }, }, @@ -1480,7 +1481,7 @@ game.import("character", function () { }, drlt_jueyan2: { mod: { - targetInRange: function (card, player, target, now) { + targetInRange(card, player, target, now) { return true; }, }, @@ -1490,7 +1491,7 @@ game.import("character", function () { }, drlt_jueyan3: { mod: { - maxHandcard: function (player, num) { + maxHandcard(player, num) { return num + 3; }, }, @@ -1509,10 +1510,10 @@ game.import("character", function () { unique: true, juexingji: true, derivation: ["drlt_huairou"], - filter: function (event, player) { + filter(event, player) { return !player.hasEnabledSlot() || player.hp == 1; }, - content: function () { + content() { "step 0"; player.awakenSkill("drlt_poshi"); player.loseMaxHp(); @@ -1532,11 +1533,11 @@ game.import("character", function () { lib.skill.drlt_huairou.position ), filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), - check: function (card) { + check(card) { if (!_status.event.player.canEquip(card)) return 5; return 3 - get.value(card); }, - content: function () { + content() { player.recast(cards); }, discard: false, @@ -1561,10 +1562,10 @@ game.import("character", function () { player: "phaseDrawBegin2", }, forced: true, - filter: function (event, player) { + filter(event, player) { return !event.numFixed; }, - content: function () { + content() { trigger.num = game.countGroup(); }, }, @@ -1574,14 +1575,14 @@ game.import("character", function () { player: "phaseUseEnd", }, forced: true, - filter: function (event, player) { + filter(event, player) { var num = 0; player.getHistory("sourceDamage", function (evt) { if (evt.getParent("phaseUse") == event) num += evt.num; }); return !num || num > 1; }, - content: function () { + content() { var numx = 0; player.getHistory("sourceDamage", function (evt) { if (evt.getParent("phaseUse") == trigger) numx += evt.num; @@ -1598,7 +1599,7 @@ game.import("character", function () { }, drlt_yongsi1: { mod: { - maxHandcard: function (player, num) { + maxHandcard(player, num) { return num + player.maxHp - 2 * Math.max(0, player.hp); }, }, @@ -1612,7 +1613,7 @@ game.import("character", function () { player: "phaseDiscardBegin", }, direct: true, - filter: function (event, player) { + filter(event, player) { if (!player.hasZhuSkill("drlt_weidi")) return false; return ( player.needsToDiscard() > 0 && @@ -1621,7 +1622,7 @@ game.import("character", function () { }) > 0 ); }, - content: function () { + content() { "step 0"; var num = Math.min( player.needsToDiscard(), @@ -1638,17 +1639,17 @@ game.import("character", function () { get.cnNumber(num) + "张手牌交给等量的其他群势力角色。先按顺序选中所有要给出的手牌,然后再按顺序选择等量的目标角色", selectCard: [1, num], - selectTarget: function () { + selectTarget() { return ui.selected.cards.length; }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target != player && target.group == "qun"; }, complexSelect: true, - filterOk: function () { + filterOk() { return ui.selected.cards.length == ui.selected.targets.length; }, - ai1: function (card) { + ai1(card) { var player = _status.event.player; var value = get.value(card, player, "raw"); if ( @@ -1664,7 +1665,7 @@ game.import("character", function () { return 1 / Math.max(1, get.useful(card)); return -1; }, - ai2: function (target) { + ai2(target) { var player = _status.event.player; var card = ui.selected.cards[ui.selected.targets.length]; if (card && get.value(card, player, "raw") < 0) @@ -1700,13 +1701,13 @@ game.import("character", function () { skillAnimation: true, animationColor: "gray", limited: true, - filter: function (event, player) { + filter(event, player) { return !player.isDisabledJudge() || player.hasEnabledSlot(); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target != player; }, - content: function () { + content() { player.awakenSkill("drlt_xiongluan"); var disables = []; for (var i = 1; i <= 5; i++) { @@ -1755,18 +1756,18 @@ game.import("character", function () { }, }, drlt_xiongluan1: { - onremove: function (player) { + onremove(player) { player.storage.drlt_xiongluan1.removeSkill("drlt_xiongluan2"); player.storage.drlt_xiongluan1.unmarkSkill("drlt_xiongluan1"); delete player.storage.drlt_xiongluan1; }, mod: { - targetInRange: function (card, player, target) { + targetInRange(card, player, target) { if (target.hasSkill("drlt_xiongluan2")) { return true; } }, - cardUsableTarget: function (card, player, target) { + cardUsableTarget(card, player, target) { if (target.hasSkill("drlt_xiongluan2")) return true; }, }, @@ -1774,13 +1775,13 @@ game.import("character", function () { }, drlt_xiongluan2: { mod: { - cardEnabled2: function (card, player) { + cardEnabled2(card, player) { if (get.position(card) == "h") return false; }, }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if (get.tag(card, "damage")) return [0, -999999]; }, }, @@ -1794,29 +1795,29 @@ game.import("character", function () { target: "useCardToTargeted", }, direct: true, - filter: function (event, player) { + filter(event, player) { return ( get.type(event.card) == "trick" && event.targets.length > 1 && player.countCards("he") > 0 ); }, - content: function () { + content() { "step 0"; player.chooseCardTarget({ filterCard: true, selectCard: 1, position: "he", - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return player != target && _status.event.targets.includes(target); }, - ai1: function (card) { + ai1(card) { if (card.name == "du") return 20; if (_status.event.player.storage.drlt_xiongluan && get.type(card) == "equip") return 15; return 6 - get.value(card); }, - ai2: function (target) { + ai2(target) { var att = get.attitude(_status.event.player, target); if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { if (target.hasSkillTag("nodu")) return 0.1; @@ -1841,7 +1842,7 @@ game.import("character", function () { drlt_wanglie: { locked: false, mod: { - targetInRange: function (card, player, target, now) { + targetInRange(card, player, target, now) { if (game.online) { if (!player.countUsed()) return true; } else { @@ -1861,13 +1862,13 @@ game.import("character", function () { trigger: { player: "useCard", }, - filter: function (event, player) { + filter(event, player) { return ( player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick") ); }, preHidden: true, - check: function (event, player) { + check(event, player) { if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; player._wanglie_temp = true; var eff = 0; @@ -1892,10 +1893,10 @@ game.import("character", function () { return true; return false; }, - prompt2: function (event) { + prompt2(event) { return "令" + get.translation(event.card) + "不能被响应,然后本阶段不能再使用牌"; }, - content: function () { + content() { trigger.nowuxie = true; trigger.directHit.addArray(game.players); player.addTempSkill("drlt_wanglie2", "phaseUseAfter"); @@ -1903,7 +1904,7 @@ game.import("character", function () { ai: { pretao: true, directHit_ai: true, - skillTagFilter: function (player, tag, arg) { + skillTagFilter(player, tag, arg) { if (tag == "pretao") return true; if (player._wanglie_temp) return false; player._wanglie_temp = true; @@ -1939,7 +1940,7 @@ game.import("character", function () { }, drlt_wanglie2: { mod: { - cardEnabled: function (card, player) { + cardEnabled(card, player) { return false; }, }, @@ -1957,14 +1958,14 @@ game.import("character", function () { "loseAsyncAfter", ], }, - filter: function (event, player, name) { + filter(event, player, name) { if (event.name == "lose" || event.name == "loseAsync") return event.getlx !== false && event.toStorage == true; if (event.name == "cardsGotoSpecial") return !event.notrigger; return true; }, direct: true, - content: function () { + content() { "step 0"; player.chooseTarget( "是否发动【良姻】令手牌数大于你的一名角色摸一张牌?", @@ -1988,7 +1989,7 @@ game.import("character", function () { trigger: { global: "gainAfter", }, - filter: function (event, player) { + filter(event, player) { return ( event.fromStorage == true || game.hasPlayer2(function (current) { @@ -1998,7 +1999,7 @@ game.import("character", function () { ); }, direct: true, - content: function () { + content() { "step 0"; player.chooseTarget( "是否发动【良姻】令手牌数小于你的一名角色弃置一张牌?", @@ -2028,10 +2029,10 @@ game.import("character", function () { player: "phaseZhunbeiBegin", }, direct: true, - filter: function (event, player) { + filter(event, player) { return player.countCards("he") > 0; }, - content: function () { + content() { "step 0"; player .chooseCard(get.prompt("kongsheng"), "将任意张牌置于武将牌上", "he", [ @@ -2063,12 +2064,12 @@ game.import("character", function () { trigger: { player: "phaseJieshuBegin", }, - filter: function (event, player) { + filter(event, player) { return player.getExpansions("kongsheng2").length > 0; }, forced: true, charlotte: true, - content: function () { + content() { "step 0"; player.addTempSkill("kongsheng_ai", "kongsheng2After"); "step 1"; @@ -2099,7 +2100,7 @@ game.import("character", function () { zhuanhuanji: true, marktext: "☯", intro: { - content: function (storage, player, skill) { + content(storage, player, skill) { if (player.storage.nzry_juzhan == true) return "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌"; return "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌"; @@ -2114,11 +2115,11 @@ game.import("character", function () { }, prompt2: "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。", - filter: function (event, player) { + filter(event, player) { return event.card.name == "sha" && !player.storage.nzry_juzhan; }, logTarget: "player", - content: function () { + content() { "step 0"; game.asyncDraw([player, trigger.player]); trigger.player.addTempSkill("nzry_juzhany"); @@ -2135,14 +2136,14 @@ game.import("character", function () { }, prompt2: "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌", - filter: function (event, player) { + filter(event, player) { return ( event.card.name == "sha" && player.storage.nzry_juzhan == true && event.target.countGainableCards(player, "he") > 0 ); }, - check: function (event, player) { + check(event, player) { return ( event.player.countCards("he") > 0 && event.targets && @@ -2150,7 +2151,7 @@ game.import("character", function () { ); }, logTarget: "target", - content: function () { + content() { player.gainPlayerCard(trigger.targets[0], "he", true); player.changeZhuanhuanji("nzry_juzhan"); trigger.target.addTempSkill("nzry_juzhanx"); @@ -2161,7 +2162,7 @@ game.import("character", function () { }, nzry_juzhanx: { mod: { - targetEnabled: function (card, player, target) { + targetEnabled(card, player, target) { if (player.hasSkill("nzry_juzhany")) return false; }, }, @@ -2172,7 +2173,7 @@ game.import("character", function () { if (!Array.isArray(player.storage.nzry_feijun)) player.storage.nzry_feijun = []; }, intro: { - content: function (storage) { + content(storage) { if (!storage || !storage.length) return "尚未发动"; var str = get.translation(storage); return "已对" + str + "发动过〖飞军〗"; @@ -2183,7 +2184,7 @@ game.import("character", function () { usable: 1, position: "he", audio: 2, - filter: function (event, player) { + filter(event, player) { return ( game.hasPlayer(function (current) { return current.countCards("h") >= player.countCards("h"); @@ -2194,10 +2195,10 @@ game.import("character", function () { ); }, filterCard: true, - check: function (card) { + check(card) { return 5 - get.value(card); }, - content: function () { + content() { "step 0"; var list = []; if ( @@ -2285,7 +2286,7 @@ game.import("character", function () { ai: { order: 11, result: { - player: function (player) { + player(player) { if ( game.hasPlayer(function (current) { return ( @@ -2318,10 +2319,10 @@ game.import("character", function () { audio: 2, trigger: { player: "nzry_feijunAfter" }, forced: true, - filter: function (event, player) { + filter(event, player) { return event._nzry_binglve == true; }, - content: function () { + content() { player.draw(2); }, ai: { combo: "nzry_feijun" }, @@ -2330,7 +2331,7 @@ game.import("character", function () { charlotte: true, ai: { filterDamage: true, - skillTagFilter: function (player, tag, arg) { + skillTagFilter(player, tag, arg) { if (!player.hasMark("nzry_huaiju")) return false; if ( !game.hasPlayer(function (current) { @@ -2357,10 +2358,10 @@ game.import("character", function () { player: "enterGame", }, forced: true, - filter: function (event, player) { + filter(event, player) { return event.name != "phase" || game.phaseNumber == 0; }, - content: function () { + content() { player.addMark("nzry_huaiju", 3); player.addSkill("nzry_huaiju_ai"); }, @@ -2373,10 +2374,10 @@ game.import("character", function () { global: ["damageBegin4", "phaseDrawBegin2"], }, forced: true, - filter: function (event, player) { + filter(event, player) { return event.player.hasMark("nzry_huaiju") && (event.name == "damage" || !event.numFixed); }, - content: function () { + content() { player.line(trigger.player, "green"); if (trigger.name == "damage") { trigger.cancel(); @@ -2390,7 +2391,7 @@ game.import("character", function () { player: "phaseUseBegin", }, direct: true, - content: function () { + content() { "step 0"; player.chooseTarget( get.prompt("nzry_yili"), @@ -2438,13 +2439,13 @@ game.import("character", function () { trigger: { player: "phaseDrawBefore", }, - filter: function (event, player) { + filter(event, player) { return !player.hasMark("nzry_huaiju"); }, - check: function (event, player) { + check(event, player) { return player.countCards("h") >= 2 || player.skipList.includes("phaseUse"); }, - content: function () { + content() { trigger.cancel(); player.addMark("nzry_huaiju", 1); }, @@ -2458,7 +2459,7 @@ game.import("character", function () { player: "phaseDiscardAfter", }, direct: true, - filter: function (event, player) { + filter(event, player) { var cards = []; player.getHistory("lose", function (evt) { if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) @@ -2466,7 +2467,7 @@ game.import("character", function () { }); return cards.length > 0; }, - content: function () { + content() { "step 0"; var cards = []; player.getHistory("lose", function (evt) { @@ -2556,17 +2557,17 @@ game.import("character", function () { rechezheng: { audio: "nzry_zhizheng", trigger: { source: "damageBegin2" }, - filter: function (event, player) { + filter(event, player) { return player.isPhaseUsing() && !player.inRangeOf(event.player); }, forced: true, logTarget: "player", - content: function () { + content() { trigger.cancel(); }, ai: { effect: { - player: function (card, player, target) { + player(card, player, target) { if (get.tag(card, "damage") && !player.inRangeOf(target)) return "zerotarget"; }, }, @@ -2584,7 +2585,7 @@ game.import("character", function () { player: "phaseUseEnd", }, forced: true, - filter: function (event, player) { + filter(event, player) { return ( player.getHistory("useCard", function (evt) { return evt.getParent("phaseUse") == event; @@ -2601,7 +2602,7 @@ game.import("character", function () { }) ); }, - content: function () { + content() { "step 0"; player.chooseTarget( "请选择〖掣政〗的目标", @@ -2633,7 +2634,7 @@ game.import("character", function () { }, nzry_lijun2: { mod: { - cardUsable: function (card, player, num) { + cardUsable(card, player, num) { if (card.name == "sha") return num + player.countMark("nzry_lijun2"); }, }, @@ -2645,7 +2646,7 @@ game.import("character", function () { trigger: { player: "useCardAfter", }, - filter: function (event, player) { + filter(event, player) { if (event.card.name != "sha" || player.group != "wu") return false; if (player.hasSkill("nzry_lijun2")) return false; if (!player.isPhaseUsing()) return false; @@ -2663,7 +2664,7 @@ game.import("character", function () { return false; }, direct: true, - content: function () { + content() { "step 0"; var list = game.filterPlayer(function (target) { return player != target && target.hasZhuSkill("nzry_lijun", player); @@ -2715,7 +2716,7 @@ game.import("character", function () { zhuanhuanji: true, marktext: "☯", intro: { - content: function (storage, player, skill) { + content(storage, player, skill) { var str = player.storage.nzry_chenglve ? "出牌阶段限一次,你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制" : "出牌阶段限一次,你可以摸一张牌,然后弃置两张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制"; @@ -2729,7 +2730,7 @@ game.import("character", function () { enable: "phaseUse", usable: 1, audio: 2, - content: function () { + content() { "step 0"; if (player.storage.nzry_chenglve == true) { player.draw(2); @@ -2752,7 +2753,7 @@ game.import("character", function () { ai: { order: 2.7, result: { - player: function (player) { + player(player) { if (!player.storage.nzry_chenglve && player.countCards("h") < 3) return 0; return 1; }, @@ -2761,12 +2762,12 @@ game.import("character", function () { }, nzry_chenglve1: { mod: { - cardUsable: function (card, player) { + cardUsable(card, player) { const suit = get.suit(card); if (suit == "unsure" || player.getStorage("nzry_chenglve1").includes(suit)) return Infinity; }, - targetInRange: function (card, player) { + targetInRange(card, player) { const suit = get.suit(card); if (suit == "unsure" || player.getStorage("nzry_chenglve1").includes(suit)) return true; @@ -2777,7 +2778,7 @@ game.import("character", function () { nzry_shicai: { audio: "nzry_shicai_2", trigger: { player: ["useCardAfter", "useCardToTargeted"] }, - prompt2: function (event, player) { + prompt2(event, player) { const cards = event.cards.filterInD("oe"); return ( "你可以将" + @@ -2786,7 +2787,7 @@ game.import("character", function () { "置于牌堆顶,然后摸一张牌" ); }, - filter: function (event, player) { + filter(event, player) { if (!event.cards.someInD()) return false; let evt = event, type = get.type2(evt.card, false); @@ -2804,7 +2805,7 @@ game.import("character", function () { evt ); }, - check: function (event, player) { + check(event, player) { if (get.type(event.card) == "equip") { if (get.subtype(event.card) == "equip6") return true; if (get.equipResult(player, player, event.card.name) <= 0) return true; @@ -2818,7 +2819,7 @@ game.import("character", function () { } return true; }, - content: function () { + content() { "step 0"; var cards = trigger.cards.filterInD(); if (cards.length == 1) { @@ -2852,7 +2853,7 @@ game.import("character", function () { subSkill: { 2: { audio: 2 } }, ai: { reverseOrder: true, - skillTagFilter: function (player) { + skillTagFilter(player) { if ( player.getHistory("useCard", function (evt) { return get.type(evt.card) == "equip"; @@ -2861,7 +2862,7 @@ game.import("character", function () { return false; }, effect: { - target: function (card, player, target) { + target(card, player, target) { if ( player == target && get.type(card) == "equip" && @@ -2881,7 +2882,7 @@ game.import("character", function () { player: "drawBegin", }, forced: true, - content: function () { + content() { trigger.bottom = true; }, }, @@ -2893,7 +2894,7 @@ game.import("character", function () { content: "expansion", markcount: "expansion", }, - onremove: function (player, skill) { + onremove(player, skill) { var cards = player.getExpansions(skill); if (cards.length) player.loseToDiscardpile(cards); }, @@ -2908,13 +2909,13 @@ game.import("character", function () { }, forced: true, locked: false, - filter: function (event, player) { + filter(event, player) { return ( (event.name != "phase" || game.phaseNumber == 0) && !player.getExpansions("nzry_mingren").length ); }, - content: function () { + content() { "step 0"; player.draw(2); "step 1"; @@ -2937,13 +2938,13 @@ game.import("character", function () { trigger: { player: "phaseJieshuBegin", }, - filter: function (event, player) { + filter(event, player) { return ( player.countCards("h") > 0 && player.getExpansions("nzry_mingren").length > 0 ); }, direct: true, - content: function () { + content() { "step 0"; player .chooseCard( @@ -2998,7 +2999,7 @@ game.import("character", function () { zhuanhuanji: true, marktext: "☯", intro: { - content: function (storage, player, skill) { + content(storage, player, skill) { if (player.storage.nzry_zhenliang == true) return "当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。"; return "出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。"; @@ -3010,7 +3011,7 @@ game.import("character", function () { prompt: "弃置一张与“任”颜色相同的牌,并对攻击范围内的一名角色造成1点伤害。", audio: 2, enable: "phaseUse", - filter: function (event, player) { + filter(event, player) { if (player.storage.nzry_zhenliang) return false; var storage = player.getExpansions("nzry_mingren"); if (!storage.length) return false; @@ -3026,23 +3027,23 @@ game.import("character", function () { }); }, position: "he", - filterCard: function (card, player) { + filterCard(card, player) { return get.color(card) == get.color(player.getExpansions("nzry_mingren")[0]); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return player.inRange(target); }, - check: function (card) { + check(card) { return 6.5 - get.value(card); }, - content: function () { + content() { player.changeZhuanhuanji("nzry_zhenliang"); target.damage("nocard"); }, ai: { order: 5, result: { - player: function (player, target) { + player(player, target) { return get.damageEffect(target, player, player); }, }, @@ -3052,14 +3053,14 @@ game.import("character", function () { trigger: { player: ["useCardAfter", "respondAfter"], }, - filter: function (event, player) { + filter(event, player) { if (_status.currentPhase == player || !player.storage.nzry_zhenliang) return false; var card = player.getExpansions("nzry_mingren")[0]; return card && get.color(event.card) == get.color(card); }, direct: true, - content: function () { + content() { "step 0"; player.chooseTarget(get.prompt("nzry_zhenliang"), "令一名角色摸一张牌").ai = function (target) { @@ -3085,11 +3086,11 @@ game.import("character", function () { trigger: { target: "useCardToTargeted", }, - filter: function (event, player) { + filter(event, player) { return event.player != player; }, direct: true, - content: function () { + content() { "step 0"; player.chooseTarget( get.prompt("nzry_jianxiang"), @@ -3114,7 +3115,7 @@ game.import("character", function () { zhuanhuanji: true, marktext: "☯", intro: { - content: function (storage, player, skill) { + content(storage, player, skill) { if (player.storage.nzry_shenshi == true) return "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张"; return "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张"; @@ -3127,7 +3128,7 @@ game.import("character", function () { prompt: "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张", enable: "phaseUse", usable: 1, - filter: function (event, player) { + filter(event, player) { return player.countCards("he") > 0 && player.storage.nzry_shenshi != true; }, discard: false, @@ -3136,7 +3137,7 @@ game.import("character", function () { delay: false, position: "he", filterCard: true, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return ( target != player && !game.hasPlayer(function (current) { @@ -3146,10 +3147,10 @@ game.import("character", function () { }) ); }, - check: function (card) { + check(card) { return 5 - get.value(card); }, - content: function () { + content() { "step 0"; player.changeZhuanhuanji("nzry_shenshi"); player.give(cards, target); @@ -3178,7 +3179,7 @@ game.import("character", function () { ai: { order: 1, result: { - target: function (player, target) { + target(player, target) { return -1; }, }, @@ -3189,7 +3190,7 @@ game.import("character", function () { trigger: { player: "damageEnd", }, - filter: function (event, player) { + filter(event, player) { return ( player.countCards("he") > 0 && event.source && @@ -3197,7 +3198,7 @@ game.import("character", function () { player.storage.nzry_shenshi == true ); }, - check: function (event, player) { + check(event, player) { return ( event.source && event.source.countCards("h") <= 2 && @@ -3207,7 +3208,7 @@ game.import("character", function () { logTarget: "source", prompt2: "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张", - content: function () { + content() { "step 0"; player.changeZhuanhuanji("nzry_shenshi"); player.viewHandcards(trigger.source); @@ -3235,12 +3236,12 @@ game.import("character", function () { forced: true, popup: false, charlotte: true, - filter: function (event, player) { + filter(event, player) { return ( player.storage.nzry_shenshi1 != undefined && player.storage.nzry_shenshi2 != undefined ); }, - content: function () { + content() { var pl = player.storage.nzry_shenshi2; var card = player.storage.nzry_shenshi1; if (player.getCards("he").includes(card) && 4 - pl.countCards("h") > 0) { @@ -3255,7 +3256,7 @@ game.import("character", function () { xinjushou: { audio: 2, trigger: { player: "phaseJieshuBegin" }, - content: function () { + content() { "step 0"; player.draw(4); player.turnOver(); @@ -3281,7 +3282,7 @@ game.import("character", function () { }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if (card.name == "guiyoujie") return [0, 1]; }, }, @@ -3293,14 +3294,14 @@ game.import("character", function () { filterCard: true, position: "e", viewAs: { name: "wuxie" }, - filter: function (event, player) { + filter(event, player) { return player.countCards("e") > 0; }, - viewAsFilter: function (player) { + viewAsFilter(player) { return player.countCards("e") > 0; }, prompt: "将一张装备区内的牌当无懈可击使用", - check: function (card) { + check(card) { return 8 - get.equipValue(card); }, threaten: 1.2, @@ -3310,10 +3311,10 @@ game.import("character", function () { trigger: { player: "turnOverEnd" }, direct: true, audio: "jiewei", - filter: function (event, player) { + filter(event, player) { return !player.isTurnedOver() && player.canMoveCard(); }, - content: function () { + content() { "step 0"; player .chooseToDiscard( @@ -3343,15 +3344,15 @@ game.import("character", function () { audio: 2, audioname: ["re_pangde"], trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { + filter(event, player) { return event.card.name == "sha" && event.target.countDiscardableCards(player, "he") > 0; }, preHidden: true, - check: function (event, player) { + check(event, player) { return get.attitude(player, event.target) <= 0; }, logTarget: "target", - content: function () { + content() { "step 0"; player .discardPlayerCard(trigger.target, get.prompt("jianchu", trigger.target), true) @@ -3386,7 +3387,7 @@ game.import("character", function () { ai: { unequip_ai: true, directHit_ai: true, - skillTagFilter: function (player, tag, arg) { + skillTagFilter(player, tag, arg) { if (tag == "directHit_ai") return ( arg.card.name == "sha" && @@ -3404,7 +3405,7 @@ game.import("character", function () { enable: "phaseUse", usable: 1, position: "he", - filterCard: function () { + filterCard() { if (ui.selected.targets.length == 2) return false; return true; }, @@ -3412,7 +3413,7 @@ game.import("character", function () { selectTarget: 2, complexCard: true, complexSelect: true, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { if (player == target) return false; if (ui.selected.targets.length == 0) return true; return ( @@ -3422,7 +3423,7 @@ game.import("character", function () { }, multitarget: true, multiline: true, - content: function () { + content() { "step 0"; var cards = targets[0].getCards("h").concat(targets[1].getCards("h")); var dialog = ui.create.dialog("缔盟", true); @@ -3556,7 +3557,7 @@ game.import("character", function () { game.addVideo("cardDialog", null, dialog.videoId); }, targetprompt: ["先拿牌", "后拿牌"], - find: function (type) { + find(type) { var list = game.filterPlayer(function (current) { return current != player && get.attitude(player, current) > 3; }); @@ -3592,7 +3593,7 @@ game.import("character", function () { if (type == 3) return count; return list[i]; }, - check: function (card) { + check(card) { var count = lib.skill.redimeng.find(3); if (count == null) return -1; if (ui.selected.cards.length < count) return 7 - get.value(card); @@ -3603,7 +3604,7 @@ game.import("character", function () { threaten: 1.6, expose: 0.5, result: { - player: function (player, target) { + player(player, target) { if (ui.selected.targets.length == 0) { if (target == lib.skill.redimeng.find(1)) return 1; return 0; @@ -3619,13 +3620,13 @@ game.import("character", function () { audio: 2, enable: "phaseUse", viewAs: { name: "wanjian" }, - filterCard: function (card, player) { + filterCard(card, player) { if (!player.storage.reluanji) return true; return !player.storage.reluanji.includes(get.suit(card)); }, position: "hs", selectCard: 2, - check: function (card) { + check(card) { var player = _status.event.player; var targets = game.filterPlayer(function (current) { return player.canUse("wanjian", current); @@ -3663,7 +3664,7 @@ game.import("character", function () { reset: { trigger: { player: "phaseAfter" }, silent: true, - content: function () { + content() { delete player.storage.reluanji; delete player.storage.reluanji2; }, @@ -3671,10 +3672,10 @@ game.import("character", function () { count: { trigger: { player: "useCard" }, silent: true, - filter: function (event) { + filter(event) { return event.skill == "reluanji"; }, - content: function () { + content() { player.storage.reluanji2 = trigger.card; if (!player.storage.reluanji) { player.storage.reluanji = []; @@ -3687,10 +3688,10 @@ game.import("character", function () { respond: { trigger: { global: "respond" }, silent: true, - filter: function (event) { + filter(event) { return event.getParent(2).skill == "reluanji"; }, - content: function () { + content() { trigger.player.draw(); }, }, @@ -3699,10 +3700,10 @@ game.import("character", function () { forced: true, silent: true, popup: false, - filter: function (event, player) { + filter(event, player) { return player.storage.reluanji2 && event.card == player.storage.reluanji2; }, - content: function () { + content() { delete player.storage.reluanji2; }, }, @@ -3711,10 +3712,10 @@ game.import("character", function () { forced: true, silent: true, popup: false, - filter: function (event, player) { + filter(event, player) { return player.storage.reluanji2 && event.card == player.storage.reluanji2; }, - content: function () { + content() { player.draw(trigger.targets.length); delete player.storage.reluanji2; }, @@ -3726,10 +3727,10 @@ game.import("character", function () { limited: true, audio: 2, enable: "phaseUse", - filter: function (event, player) { + filter(event, player) { return !player.storage.qimou; }, - init: function (player) { + init(player) { player.storage.qimou = false; }, mark: true, @@ -3738,7 +3739,7 @@ game.import("character", function () { }, skillAnimation: true, animationColor: "orange", - content: function () { + content() { "step 0"; var shas = player.getCards("h", "sha"); var num; @@ -3774,7 +3775,7 @@ game.import("character", function () { ai: { order: 2, result: { - player: function (player) { + player(player) { if (player.hp == 1) return 0; var shas = player.getCards("h", "sha"); if (!shas.length) return 0; @@ -3809,12 +3810,12 @@ game.import("character", function () { qimou2: { onremove: true, mod: { - cardUsable: function (card, player, num) { + cardUsable(card, player, num) { if (typeof player.storage.qimou2 == "number" && card.name == "sha") { return num + player.storage.qimou2; } }, - globalFrom: function (from, to, distance) { + globalFrom(from, to, distance) { if (typeof from.storage.qimou2 == "number") { return distance - from.storage.qimou2; } @@ -3825,12 +3826,12 @@ game.import("character", function () { audio: "kuanggu", audioname: ["re_weiyan", "ol_weiyan"], trigger: { source: "damageSource" }, - filter: function (event, player) { + filter(event, player) { return event.kuangguCheck && event.num > 0; }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; event.num = trigger.num; "step 1"; @@ -3867,10 +3868,10 @@ game.import("character", function () { xinliegong: { shaRelated: true, mod: { - aiOrder: function (player, card, num) { + aiOrder(player, card, num) { if (num > 0 && (card.name === "sha" || get.tag(card, "draw"))) return num + 6; }, - targetInRange: function (card, player, target) { + targetInRange(card, player, target) { if (card.name == "sha" && typeof get.number(card) == "number") { if (get.distance(player, target) <= get.number(card)) return true; } @@ -3881,16 +3882,16 @@ game.import("character", function () { trigger: { player: "useCardToTargeted" }, logTarget: "target", locked: false, - check: function (event, player) { + check(event, player) { return get.attitude(player, event.target) <= 0; }, - filter: function (event, player) { + filter(event, player) { if (event.card.name != "sha") return false; if (event.target.countCards("h") <= player.countCards("h")) return true; if (event.target.hp >= player.hp) return true; return false; }, - content: function () { + content() { if (trigger.target.countCards("h") <= player.countCards("h")) trigger.getParent().directHit.push(trigger.target); if (trigger.target.hp >= player.hp) { @@ -3906,7 +3907,7 @@ game.import("character", function () { ai: { threaten: 0.5, directHit_ai: true, - skillTagFilter: function (player, tag, arg) { + skillTagFilter(player, tag, arg) { if ( get.attitude(player, arg.target) <= 0 && arg.card.name == "sha" && @@ -3929,10 +3930,10 @@ game.import("character", function () { }, enable: "phaseUse", usable: 1, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target != player && target.inRange(player) && target.countCards("he") > 0; }, - content: function () { + content() { "step 0"; target .chooseToUse(function (card, player, event) { @@ -3962,7 +3963,7 @@ game.import("character", function () { expose: 0.2, result: { target: -1, - player: function (player, target) { + player(player, target) { if (target.countCards("h") == 0) return 0; if (target.countCards("h") == 1) return -0.1; if (player.hp <= 2) return -2; @@ -3985,11 +3986,11 @@ game.import("character", function () { derivation: "reguanxing", trigger: { player: "phaseZhunbeiBegin" }, forced: true, - filter: function (event, player) { + filter(event, player) { if (player.storage.zhiji) return false; return player.countCards("h") == 0; }, - content: function () { + content() { "step 0"; player.awakenSkill("zhiji"); player.chooseDrawRecover(2, true); @@ -4004,10 +4005,10 @@ game.import("character", function () { trigger: { target: "useCardToTargeted" }, forced: true, preHidden: true, - filter: function (event, player) { + filter(event, player) { return event.card.name == "sha"; }, - content: function () { + content() { "step 0"; var eff = get.effect(player, trigger.card, trigger.player, trigger.player); trigger.player @@ -4031,7 +4032,7 @@ game.import("character", function () { }, ai: { effect: { - target_use: function (card, player, target, current) { + target_use(card, player, target, current) { if (card.name == "sha" && get.attitude(player, target) < 0) { if (_status.event.name == "xiangle") return; if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; @@ -4058,12 +4059,12 @@ game.import("character", function () { fangquan: { audio: 2, trigger: { player: "phaseUseBefore" }, - filter: function (event, player) { + filter(event, player) { return player.countCards("h") > 0 && !player.hasSkill("fangquan3"); }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; var fang = player.countMark("fangquan2") == 0 && @@ -4105,7 +4106,7 @@ game.import("character", function () { audio: false, //priority:-50, onremove: true, - content: function () { + content() { "step 0"; event.count = player.countMark(event.name); player.removeMark(event.name, event.count); @@ -4144,7 +4145,7 @@ game.import("character", function () { forced: true, popup: false, audio: false, - content: function () { + content() { player.unmarkSkill("fangquan"); player.removeSkill("fangquan3"); }, @@ -4161,10 +4162,10 @@ game.import("character", function () { derivation: "rejijiang", trigger: { player: "phaseZhunbeiBegin" }, forced: true, - filter: function (event, player) { + filter(event, player) { return player.isMinHp(); }, - content: function () { + content() { "step 0"; player.awakenSkill("ruoyu"); player.gainMaxHp(); @@ -4178,12 +4179,12 @@ game.import("character", function () { trigger: { player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore"], }, - filter: function (event, player) { + filter(event, player) { return player.countCards("h") > 0; }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; var check, str = "弃置一张手牌并跳过"; @@ -4304,13 +4305,13 @@ game.import("character", function () { }, frequent: true, preHidden: true, - filter: function (event, player) { + filter(event, player) { if (player == _status.currentPhase) return false; if (event.name == "gain" && event.player == player) return false; var evt = event.getl(player); return evt && evt.cards2 && evt.cards2.length > 0; }, - content: function () { + content() { "step 0"; var next = player.judge(function (card) { if (get.suit(card) == "heart") return -1; @@ -4340,7 +4341,7 @@ game.import("character", function () { } player.addToExpansion(event.card, "gain2").gaintag.add("tuntian"); }, - callback: function () { + callback() { if (!event.judgeResult.bool) { event.finish(); return; @@ -4352,7 +4353,7 @@ game.import("character", function () { content: "expansion", markcount: "expansion", }, - onremove: function (player, skill) { + onremove(player, skill) { var cards = player.getExpansions(skill); if (cards.length) player.loseToDiscardpile(cards); }, @@ -4362,7 +4363,7 @@ game.import("character", function () { dist: { locked: false, mod: { - globalFrom: function (from, to, distance) { + globalFrom(from, to, distance) { var num = distance - from.getExpansions("tuntian").length; if ( _status.event.skill == "jixi_backup" || @@ -4376,7 +4377,7 @@ game.import("character", function () { }, ai: { effect: { - target: function (card, player, target, current) { + target(card, player, target, current) { if ( typeof card === "object" && get.name(card) === "sha" && @@ -4423,7 +4424,7 @@ game.import("character", function () { } }, }, - threaten: function (player, target) { + threaten(player, target) { if (target.countCards("h") == 0) return 2; return 0.5; }, @@ -4440,11 +4441,11 @@ game.import("character", function () { juexingji: true, trigger: { player: "phaseZhunbeiBegin" }, forced: true, - filter: function (event, player) { + filter(event, player) { return player.getExpansions("tuntian").length >= 3; }, derivation: "jixi", - content: function () { + content() { player.awakenSkill("zaoxian"); player.loseMaxHp(); player.addSkills("jixi"); @@ -4454,23 +4455,23 @@ game.import("character", function () { audio: 2, audioname: ["re_dengai", "gz_dengai", "ol_dengai"], enable: "phaseUse", - filter: function (event, player) { + filter(event, player) { return ( player.getExpansions("tuntian").length > 0 && event.filterCard({ name: "shunshou" }, player, event) ); }, chooseButton: { - dialog: function (event, player) { + dialog(event, player) { return ui.create.dialog("急袭", player.getExpansions("tuntian"), "hidden"); }, - filter: function (button, player) { + filter(button, player) { var card = button.link; if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player)) return false; var evt = _status.event.getParent(); return evt.filterCard(get.autoViewAs({ name: "shunshou" }, [card]), player, evt); }, - backup: function (links, player) { + backup(links, player) { var skill = _status.event.buttoned; return { audio: "jixi", @@ -4485,14 +4486,14 @@ game.import("character", function () { card: links[0], }; }, - prompt: function (links, player) { + prompt(links, player) { return "选择 顺手牵羊(" + get.translation(links[0]) + ")的目标"; }, }, ai: { order: 10, result: { - player: function (player) { + player(player) { return player.getExpansions("tuntian").length - 1; }, }, @@ -4505,7 +4506,7 @@ game.import("character", function () { preHidden: true, audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], mod: { - aiOrder: function (player, card, num) { + aiOrder(player, card, num) { if (get.color(card) === "red" && get.name(card) === "sha") return get.order({ name: "sha" }) + 0.15; }, @@ -4514,7 +4515,7 @@ game.import("character", function () { player: "useCardToPlayered", target: "useCardToTargeted", }, - filter: function (event, player) { + filter(event, player) { if ( !( event.card.name == "juedou" || @@ -4526,15 +4527,15 @@ game.import("character", function () { }, locked: false, frequent: true, - content: function () { + content() { player.draw(); }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; }, - player: function (card, player, target) { + player(card, player, target) { if (card.name == "sha" && get.color(card) == "red") return [1, 1]; }, }, @@ -4549,24 +4550,24 @@ game.import("character", function () { derivation: ["reyingzi", "gzyinghun"], unique: true, trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { + filter(event, player) { return player.hp <= 1 && !player.storage.hunzi; }, forced: true, //priority:3, - content: function () { + content() { player.awakenSkill(event.name); player.loseMaxHp(); player.addSkills(["reyingzi", "gzyinghun"]); }, ai: { - threaten: function (player, target) { + threaten(player, target) { if (target.hp == 1) return 2; return 0.5; }, maixie: true, effect: { - target: function (card, player, target) { + target(card, player, target) { if (!target.hasFriend()) return; if ( target.hp === 2 && @@ -4600,7 +4601,7 @@ game.import("character", function () { audioname: ["re_sunben"], //forceaudio:true, enable: "phaseUse", - prompt: function () { + prompt() { var player = _status.event.player; var list = game.filterPlayer(function (target) { return target.hasZhuSkill("zhiba", player) && player.canCompare(target); @@ -4610,21 +4611,21 @@ game.import("character", function () { str += "进行拼点。若你没赢,其可以获得两张拼点牌。"; return str; }, - filter: function (event, player) { + filter(event, player) { if (player.group != "wu" || player.countCards("h") == 0) return false; return game.hasPlayer(function (target) { return target.hasZhuSkill("zhiba", player) && player.canCompare(target); }); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target.hasZhuSkill("zhiba", player) && player.canCompare(target); }, log: false, - prepare: function (cards, player, targets) { + prepare(cards, player, targets) { targets[0].logSkill("zhiba"); }, usable: 1, - content: function () { + content() { "step 0"; if (target.storage.hunzi || target.storage.rehunzi) { target @@ -4674,7 +4675,7 @@ game.import("character", function () { }, expose: 0.2, result: { - target: function (player, target) { + target(player, target) { if (player.countCards("h", "du") && get.attitude(player, target) < 0) return -1; if (player.countCards("h") <= player.hp) return 0; var maxnum = 0; @@ -4698,20 +4699,20 @@ game.import("character", function () { zhijian: { audio: 2, enable: "phaseUse", - filter: function (event, player) { + filter(event, player) { return player.countCards("h", { type: "equip" }) > 0; }, - filterCard: function (card) { + filterCard(card) { return get.type(card) == "equip"; }, - check: function (card) { + check(card) { var player = _status.currentPhase; if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { return 11 - get.equipValue(card); } return 6 - get.value(card); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { if (target.isMin()) return false; return player != target && target.canEquip(card); }, @@ -4721,7 +4722,7 @@ game.import("character", function () { }, discard: false, lose: false, - prepare: function (cards, player, targets) { + prepare(cards, player, targets) { player.$give(cards, targets[0], false); }, ai: { @@ -4729,7 +4730,7 @@ game.import("character", function () { order: 10, }, result: { - target: function (player, target) { + target(player, target) { var card = ui.selected.cards[0]; if (card) return get.effect(target, card, target, target); return 0; @@ -4742,7 +4743,7 @@ game.import("character", function () { audio: 2, audioname: ["re_zhangzhang"], trigger: { global: "phaseDiscardAfter" }, - filter: function (event, player) { + filter(event, player) { if (event.player != player && event.player.isIn()) { return ( event.player.getHistory("lose", function (evt) { @@ -4756,7 +4757,7 @@ game.import("character", function () { } return false; }, - checkx: function (event, player, cards, cards2) { + checkx(event, player, cards, cards2) { if (cards.length > 2 || get.attitude(player, event.player) > 0) return true; for (var i = 0; i < cards2.length; i++) { if (get.value(cards2[i], event.player, "raw") < 0) return true; @@ -4765,7 +4766,7 @@ game.import("character", function () { }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; var cards = [], cards2 = []; @@ -4878,7 +4879,7 @@ game.import("character", function () { audio: 2, audioname: ["re_caiwenji", "ol_caiwenji"], trigger: { global: "damageEnd" }, - filter: function (event, player) { + filter(event, player) { return ( event.card && event.card.name == "sha" && @@ -4888,13 +4889,13 @@ game.import("character", function () { ); }, direct: true, - checkx: function (event, player) { + checkx(event, player) { var att1 = get.attitude(player, event.player); var att2 = get.attitude(player, event.source); return att1 > 0 && att2 <= 0; }, preHidden: true, - content: function () { + content() { "step 0"; var next = player.chooseToDiscard("he", get.prompt2("beige", trigger.player)); var check = lib.skill.beige.checkx(trigger, player); @@ -4940,21 +4941,21 @@ game.import("character", function () { forceDie: true, skillAnimation: true, animationColor: "gray", - filter: function (event) { + filter(event) { return event.source && event.source.isIn(); }, - content: function () { + content() { trigger.source.clearSkills(); }, logTarget: "source", ai: { maixie_defend: true, - threaten: function (player, target) { + threaten(player, target) { if (target.hp == 1) return 0.2; return 1.5; }, effect: { - target: function (card, player, target, current) { + target(card, player, target, current) { if (!target.hasFriend()) return; if (target.hp <= 1 && get.tag(card, "damage")) { if (player.hasSkillTag("jueqing", false, target)) return 3; @@ -4967,7 +4968,7 @@ game.import("character", function () { huashen: { audio: "huashen2", unique: true, - init: function (player) { + init(player) { if (!player.storage.huashen) { player.storage.huashen = { owned: {}, @@ -4993,7 +4994,7 @@ game.import("character", function () { }); }, intro: { - content: function (storage, player) { + content(storage, player) { var str = ""; var list = Object.keys(storage.owned); if (list.length) { @@ -5008,11 +5009,11 @@ game.import("character", function () { } return str; }, - onunmark: function (storage, player) { + onunmark(storage, player) { _status.characterlist.addArray(Object.keys(storage.owned)); storage.owned = []; }, - mark: function (dialog, content, player) { + mark(dialog, content, player) { var list = Object.keys(content.owned); if (list.length) { var skill = player.storage.huashen.current2; @@ -5060,7 +5061,7 @@ game.import("character", function () { } }, }, - addHuashen: function (player) { + addHuashen(player) { if (!player.storage.huashen) return; if (!_status.characterlist) { lib.skill.pingjian.initList(); @@ -5087,7 +5088,7 @@ game.import("character", function () { } } }, - addHuashens: function (player, num) { + addHuashens(player, num) { var list = []; for (var i = 0; i < num; i++) { var name = lib.skill.huashen.addHuashen(player); @@ -5104,13 +5105,13 @@ game.import("character", function () { global: "phaseBefore", player: ["enterGame", "phaseBegin", "phaseEnd"], }, - filter: function (event, player, name) { + filter(event, player, name) { if (event.name != "phase") return true; if (name == "phaseBefore") return game.phaseNumber == 0; return !get.is.empty(player.storage.huashen.owned); }, direct: true, - content: function () { + content() { "step 0"; var name = event.triggername; if (trigger.name != "phase" || (name == "phaseBefore" && game.phaseNumber == 0)) { @@ -5332,7 +5333,7 @@ game.import("character", function () { unique: true, trigger: { player: "damageEnd" }, frequent: true, - content: function () { + content() { "step 0"; event.num = trigger.num; "step 1"; @@ -5360,7 +5361,7 @@ game.import("character", function () { preHidden: ["huoshou1", "huoshou2"], ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if (card.name == "nanman") return 0; }, }, @@ -5372,10 +5373,10 @@ game.import("character", function () { trigger: { target: "useCardToBefore" }, forced: true, priority: 15, - filter: function (event, player) { + filter(event, player) { return event.card.name == "nanman"; }, - content: function () { + content() { trigger.cancel(); }, }, @@ -5384,10 +5385,10 @@ game.import("character", function () { audioname: ["re_menghuo"], trigger: { global: "useCard" }, forced: true, - filter: function (event, player) { + filter(event, player) { return event.card && event.card.name == "nanman" && event.player != player; }, - content: function () { + content() { trigger.customArgs.default.customSource = player; }, }, @@ -5398,10 +5399,10 @@ game.import("character", function () { zaiqi: { audio: 2, trigger: { player: "phaseDrawBegin1" }, - filter: function (event, player) { + filter(event, player) { return !event.numFixed && player.hp < player.maxHp; }, - check: function (event, player) { + check(event, player) { if (player.getDamagedHp() < 2) { return false; } else if (player.getDamagedHp() == 2) { @@ -5409,7 +5410,7 @@ game.import("character", function () { } return true; }, - content: function () { + content() { "step 0"; trigger.changeToZero(); event.cards = get.cards(player.getDamagedHp() + (event.name == "zaiqi" ? 0 : 1)); @@ -5432,7 +5433,7 @@ game.import("character", function () { } }, ai: { - threaten: function (player, target) { + threaten(player, target) { if (target.hp == 1) return 2; if (target.hp == 2) return 1.5; return 1; @@ -5448,7 +5449,7 @@ game.import("character", function () { preHidden: ["juxiang1", "juxiang2"], ai: { effect: { - target: function (card) { + target(card) { if (card.name == "nanman") return [0, 1]; }, }, @@ -5460,10 +5461,10 @@ game.import("character", function () { trigger: { target: "useCardToBefore" }, forced: true, priority: 15, - filter: function (event, player) { + filter(event, player) { return event.card.name == "nanman"; }, - content: function () { + content() { trigger.cancel(); }, }, @@ -5472,10 +5473,10 @@ game.import("character", function () { audioname: ["re_zhurong", "ol_zhurong"], trigger: { global: "useCardAfter" }, forced: true, - filter: function (event, player) { + filter(event, player) { return event.card.name == "nanman" && event.player != player && event.cards.someInD(); }, - content: function () { + content() { player.gain(trigger.cards.filterInD(), "gain2"); }, }, @@ -5484,7 +5485,7 @@ game.import("character", function () { audio: 2, audioname: ["boss_lvbu3", "ol_zhurong"], trigger: { source: "damageSource" }, - filter: function (event, player) { + filter(event, player) { if (event._notrigger.includes(event.player)) return false; return ( event.card && @@ -5494,11 +5495,11 @@ game.import("character", function () { player.canCompare(event.player) ); }, - check: function (event, player) { + check(event, player) { return get.attitude(player, event.player) < 0 && player.countCards("h") > 1; }, //priority:5, - content: function () { + content() { "step 0"; player.chooseToCompare(trigger.player); "step 1"; @@ -5511,10 +5512,10 @@ game.import("character", function () { audio: 2, trigger: { global: "die" }, preHidden: true, - filter: function (event) { + filter(event) { return event.player.countCards("he") > 0; }, - content: function () { + content() { "step 0"; event.togain = trigger.player.getCards("he"); player.gain(event.togain, trigger.player, "giveAuto", "bySelf"); @@ -5525,7 +5526,7 @@ game.import("character", function () { trigger: { player: "damageEnd" }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; var draw = player.getDamagedHp(); player @@ -5580,7 +5581,7 @@ game.import("character", function () { maixie: true, maixie_hp: true, effect: { - target: function (card, player, target) { + target(card, player, target) { if (get.tag(card, "damage")) { if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; if (target.hp <= 1) return; @@ -5617,13 +5618,13 @@ game.import("character", function () { audioname: ["re_caopi"], forceaudio: true, trigger: { global: "judgeEnd" }, - filter: function (event, player) { + filter(event, player) { if (event.player == player || event.player.group != "wei") return false; if (event.result.color != "black") return false; return player.hasZhuSkill("songwei", event.player); }, direct: true, - content: function () { + content() { "step 0"; trigger.player .chooseBool("是否发动【颂威】,令" + get.translation(player) + "摸一张牌?") @@ -5640,10 +5641,10 @@ game.import("character", function () { trigger: { global: ["phaseDrawSkipped", "phaseDrawCancelled"] }, audio: 2, forced: true, - filter: function (event, player) { + filter(event, player) { return event.player != player; }, - content: function () { + content() { player.draw(); }, }, @@ -5667,17 +5668,17 @@ game.import("character", function () { audio: 2, audioname: ["re_xuhuang"], enable: "chooseToUse", - filterCard: function (card) { + filterCard(card) { if (get.type(card) != "basic" && get.type(card) != "equip") return false; return get.color(card) == "black"; }, - filter: function (event, player) { + filter(event, player) { return player.countCards("hes", { type: ["basic", "equip"], color: "black" }); }, position: "hes", viewAs: { name: "bingliang" }, prompt: "将一黑色的基本牌或装备牌当兵粮寸断使用", - check: function (card) { + check(card) { return 6 - get.value(card); }, ai: { @@ -5686,7 +5687,7 @@ game.import("character", function () { }, duanliang2: { mod: { - targetInRange: function (card, player, target) { + targetInRange(card, player, target) { if (card.name == "bingliang") { if (get.distance(player, target) <= 2) return true; } @@ -5695,7 +5696,7 @@ game.import("character", function () { }, duanliang3: { mod: { - targetInRange: function (card, player, target) { + targetInRange(card, player, target) { if (card.name == "bingliang") { if (target.countCards("h") >= player.countCards("h")) return true; } @@ -5705,11 +5706,11 @@ game.import("character", function () { haoshi: { audio: 2, trigger: { player: "phaseDrawBegin2" }, - filter: function (event, player) { + filter(event, player) { return !event.numFixed; }, preHidden: true, - check: function (event, player) { + check(event, player) { return ( player.countCards("h") + 2 + event.num <= 5 || game.hasPlayer(function (target) { @@ -5727,14 +5728,14 @@ game.import("character", function () { }) ); }, - content: function () { + content() { trigger.num += 2; player.addSkill("haoshi2"); }, ai: { threaten: 2, noh: true, - skillTagFilter: function (player, tag) { + skillTagFilter(player, tag) { if (tag == "noh") { if (player.countCards("h") != 2) return false; } @@ -5746,7 +5747,7 @@ game.import("character", function () { forced: true, popup: false, audio: false, - content: function () { + content() { "step 0"; player.removeSkill("haoshi2"); if (player.countCards("h") <= 5) { @@ -5755,12 +5756,12 @@ game.import("character", function () { } player.chooseCardTarget({ selectCard: Math.floor(player.countCards("h") / 2), - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target.isMinHandcard(); }, prompt: "将一半的手牌交给场上手牌数最少的一名角色", forced: true, - ai2: function (target) { + ai2(target) { return get.attitude(_status.event.player, target); }, }); @@ -5775,7 +5776,7 @@ game.import("character", function () { enable: "phaseUse", usable: 1, position: "he", - filterCard: function () { + filterCard() { var targets = ui.selected.targets; if (targets.length == 2) { if ( @@ -5789,11 +5790,11 @@ game.import("character", function () { selectCard: [0, Infinity], selectTarget: 2, complexCard: true, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { if (player == target) return false; return true; }, - filterOk: function () { + filterOk() { var targets = ui.selected.targets; if (targets.length != 2) return false; return ( @@ -5803,10 +5804,10 @@ game.import("character", function () { }, multitarget: true, multiline: true, - content: function () { + content() { targets[0].swapHandcards(targets[1]); }, - check: function (card) { + check(card) { var list = [], player = _status.event.player; var num = player.countCards("he"); @@ -5847,7 +5848,7 @@ game.import("character", function () { threaten: 3, expose: 0.9, result: { - target: function (player, target) { + target(player, target) { var list = []; var num = player.countCards("he"); var players = game.filterPlayer(); @@ -5898,7 +5899,7 @@ game.import("character", function () { tw_ol_sunjian: "yinghun_ol_sunjian", }, mod: { - aiOrder: function (player, card, num) { + aiOrder(player, card, num) { if ( num > 0 && _status.event && @@ -5914,7 +5915,7 @@ game.import("character", function () { trigger: { player: "phaseZhunbeiBegin" }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; player .chooseTarget(get.prompt2("yinghun"), function (card, player, target) { @@ -5966,7 +5967,7 @@ game.import("character", function () { }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if ( get.tag(card, "damage") && get.itemtype(player) === "player" && @@ -5981,7 +5982,7 @@ game.import("character", function () { return [1, 1]; }, }, - threaten: function (player, target) { + threaten(player, target) { return Math.max(0.5, target.getDamagedHp() / 2); }, maixie: true, @@ -5995,7 +5996,7 @@ game.import("character", function () { tw_ol_sunjian: "yinghun_ol_sunjian", }, mod: { - aiOrder: function (player, card, num) { + aiOrder(player, card, num) { if ( num > 0 && _status.event && @@ -6009,12 +6010,12 @@ game.import("character", function () { }, locked: false, trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { + filter(event, player) { return player.getDamagedHp() > 0; }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; player .chooseTarget(get.prompt2("gzyinghun"), function (card, player, target) { @@ -6065,7 +6066,7 @@ game.import("character", function () { }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if ( get.tag(card, "damage") && get.itemtype(player) === "player" && @@ -6080,7 +6081,7 @@ game.import("character", function () { return [1, 1]; }, }, - threaten: function (player, target) { + threaten(player, target) { return Math.max(0.5, target.getDamagedHp() / 2); }, maixie: true, @@ -6091,16 +6092,16 @@ game.import("character", function () { audio: 2, audioname: ["re_dongzhuo"], enable: "chooseToUse", - filterCard: function (card) { + filterCard(card) { return get.suit(card) == "spade"; }, viewAs: { name: "jiu" }, - viewAsFilter: function (player) { + viewAsFilter(player) { if (!player.countCards("hs", { suit: "spade" })) return false; return true; }, prompt: "将一张黑桃手牌当酒使用", - check: function (card) { + check(card) { if (_status.event.type == "dying") return 1 / Math.max(0.1, get.value(card)); return 4 - get.value(card); }, @@ -6113,17 +6114,17 @@ game.import("character", function () { audioname: ["re_dongzhuo", "ol_dongzhuo"], trigger: { player: "useCardToPlayered", target: "useCardToTargeted" }, forced: true, - filter: function (event, player) { + filter(event, player) { if (event.card.name != "sha") return false; if (player == event.player) { return event.target.hasSex("female"); } return event.player.hasSex("female"); }, - check: function (event, player) { + check(event, player) { return player == event.player; }, - content: function () { + content() { var id = (player == trigger.player ? trigger.target : player).playerid; var map = trigger.getParent().customArgs; if (!map[id]) map[id] = {}; @@ -6136,7 +6137,7 @@ game.import("character", function () { ai: { halfneg: true, directHit_ai: true, - skillTagFilter: function (player, tag, arg) { + skillTagFilter(player, tag, arg) { if (tag === "directHit_ai") return; if ( arg.card.name != "sha" || @@ -6152,17 +6153,17 @@ game.import("character", function () { audioname: ["zhugedan", "re_dongzhuo", "ol_dongzhuo", "re_zhugedan"], trigger: { player: "phaseJieshuBegin" }, forced: true, - check: function () { + check() { return false; }, - filter: function (event, player) { + filter(event, player) { return ( !player.isMinHp() && !player.hasSkill("rejiuchi_air") && !player.hasSkill("oljiuchi_air") ); }, - content: function () { + content() { "step 0"; player .chooseControl("baonue_hp", "baonue_maxHp", function (event, player) { @@ -6195,12 +6196,12 @@ game.import("character", function () { audioname: ["re_dongzhuo"], //forceaudio:true, trigger: { global: "damageSource" }, - filter: function (event, player) { + filter(event, player) { if (player == event.source || !event.source || event.source.group != "qun") return false; return player.hasZhuSkill("baonue", event.source); }, direct: true, - content: function () { + content() { "step 0"; trigger.source .chooseBool("是否对" + get.translation(player) + "发动【暴虐】?") @@ -6232,13 +6233,13 @@ game.import("character", function () { limited: true, skillAnimation: "epic", animationColor: "thunder", - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target != player; }, selectTarget: -1, multitarget: true, multiline: true, - content: function () { + content() { "step 0"; player.awakenSkill("luanwu"); event.current = player.next; @@ -6283,7 +6284,7 @@ game.import("character", function () { ai: { order: 1, result: { - player: function (player) { + player(player) { if (lib.config.mode == "identity" && game.zhu.isZhu && player.identity == "fan") { if (game.zhu.hp == 1 && game.zhu.countCards("h") <= 2) return 1; } @@ -6320,14 +6321,14 @@ game.import("character", function () { priority: 15, forced: true, preHidden: true, - filter: function (event, player, name) { + filter(event, player, name) { return _status.currentPhase == player && event.player != player; }, - content: function () {}, + content() {}, }, wansha2: { mod: { - cardSavable: function (card, player) { + cardSavable(card, player) { if ( card.name == "tao" && _status.currentPhase && @@ -6338,7 +6339,7 @@ game.import("character", function () { if (!player.isDying()) return false; } }, - cardEnabled: function (card, player) { + cardEnabled(card, player) { if ( card.name == "tao" && _status.currentPhase && @@ -6356,7 +6357,7 @@ game.import("character", function () { audio: 2, forced: true, firstDo: true, - filter: function (event, player, card) { + filter(event, player, card) { if (get.color(event.card) != "black") return false; return ( (event.card.name == "nanman" && player != event.player) || @@ -6365,9 +6366,9 @@ game.import("character", function () { event.card.name == "wugu" ); }, - content: function () {}, + content() {}, mod: { - targetEnabled: function (card) { + targetEnabled(card) { if ( (get.type(card) == "trick" || get.type(card) == "delay") && get.color(card) == "black" @@ -6379,16 +6380,16 @@ game.import("character", function () { huoji: { audio: 2, enable: "chooseToUse", - filterCard: function (card) { + filterCard(card) { return get.color(card) == "red"; }, viewAs: { name: "huogong" }, - viewAsFilter: function (player) { + viewAsFilter(player) { if (!player.countCards("hs", { color: "red" })) return false; }, position: "hs", prompt: "将一张红色牌当火攻使用", - check: function (card) { + check(card) { var player = get.player(); if (player.countCards("h") > player.hp) { return 6 - get.value(card); @@ -6411,7 +6412,7 @@ game.import("character", function () { equipSkill: true, noHidden: true, inherit: "bagua_skill", - filter: function (event, player) { + filter(event, player) { if (!lib.skill.bagua_skill.filter(event, player)) return false; if (!player.hasEmptySlot(2)) return false; return true; @@ -6432,7 +6433,7 @@ game.import("character", function () { return true; }, effect: { - target: function (card, player, target) { + target(card, player, target) { if (player == target && get.subtype(card) == "equip2") { if (get.equipValue(card) <= 7.5) return 0; } @@ -6444,7 +6445,7 @@ game.import("character", function () { }, kanpo: { mod: { - aiValue: function (player, card, num) { + aiValue(player, card, num) { if (get.name(card) != "wuxie" && get.color(card) != "black") return; var cards = player.getCards("hs", function (card) { return get.name(card) == "wuxie" || get.color(card) == "black"; @@ -6462,23 +6463,23 @@ game.import("character", function () { return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; return Math.max(num, [6, 4, 3][Math.min(geti(), 2)]); }, - aiUseful: function () { + aiUseful() { return lib.skill.kanpo.mod.aiValue.apply(this, arguments); }, }, locked: false, audio: 2, enable: "chooseToUse", - filterCard: function (card) { + filterCard(card) { return get.color(card) == "black"; }, - viewAsFilter: function (player) { + viewAsFilter(player) { return player.countCards("hs", { color: "black" }) > 0; }, viewAs: { name: "wuxie" }, position: "hs", prompt: "将一张黑色手牌当无懈可击使用", - check: function (card) { + check(card) { var tri = _status.event.getTrigger(); if (tri && tri.card && tri.card.name == "chiling") return -1; return 8 - get.value(card); @@ -6494,10 +6495,10 @@ game.import("character", function () { limited: true, skillAnimation: true, animationColor: "fire", - init: function (player) { + init(player) { player.storage.niepan = false; }, - filter: function (event, player) { + filter(event, player) { if (player.storage.niepan) return false; if (event.type == "dying") { if (player != event.dying) return false; @@ -6507,7 +6508,7 @@ game.import("character", function () { } return false; }, - content: function () { + content() { "step 0"; player.awakenSkill("niepan"); player.storage.niepan = true; @@ -6525,18 +6526,18 @@ game.import("character", function () { }, ai: { order: 0.5, - skillTagFilter: function (player, tag, target) { + skillTagFilter(player, tag, target) { if (player != target || player.storage.niepan) return false; }, save: true, result: { - player: function (player) { + player(player) { if (player.hp <= 0) return 10; if (player.hp <= 1 && player.countCards("he") <= 1) return 10; return 0; }, }, - threaten: function (player, target) { + threaten(player, target) { if (!target.storage.niepan) return 0.6; }, }, @@ -6552,10 +6553,10 @@ game.import("character", function () { skillAnimation: true, limited: true, animationColor: "orange", - init: function (player) { + init(player) { player.storage.oldniepan = false; }, - filter: function (event, player) { + filter(event, player) { if (player.storage.oldniepan) return false; if (event.type == "dying") { if (player != event.dying) return false; @@ -6563,7 +6564,7 @@ game.import("character", function () { } return false; }, - content: function () { + content() { "step 0"; player.awakenSkill("oldniepan"); player.storage.oldniepan = true; @@ -6581,18 +6582,18 @@ game.import("character", function () { }, ai: { order: 1, - skillTagFilter: function (player, arg, target) { + skillTagFilter(player, arg, target) { if (player != target || player.storage.oldniepan) return false; }, save: true, result: { - player: function (player) { + player(player) { if (player.hp <= 0) return 10; if (player.hp <= 2 && player.countCards("he") <= 1) return 10; return 0; }, }, - threaten: function (player, target) { + threaten(player, target) { if (!target.storage.oldniepan) return 0.6; }, }, @@ -6605,16 +6606,16 @@ game.import("character", function () { audioname: ["re_xunyu", "ol_xunyu"], enable: "phaseUse", usable: 1, - filter: function (event, player) { + filter(event, player) { if (player.countCards("h") == 0) return false; return game.hasPlayer(function (current) { return current.hp > player.hp && player.canCompare(current); }); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return target.hp > player.hp && player.canCompare(target); }, - content: function () { + content() { "step 0"; player.chooseToCompare(target); "step 1"; @@ -6649,7 +6650,7 @@ game.import("character", function () { ai: { order: 0.5, result: { - target: function (player, target) { + target(player, target) { var att = get.attitude(player, target); var oc = target.countCards("h") == 1; if (att > 0 && oc) return 0; @@ -6667,7 +6668,7 @@ game.import("character", function () { } return 0; }, - player: function (player, target) { + player(player, target) { if (target.hasSkillTag("jueqing", false, target)) return -10; var mn = 1; var hs = player.getCards("h"); @@ -6706,7 +6707,7 @@ game.import("character", function () { audio: 2, trigger: { player: "damageEnd" }, direct: true, - content: function () { + content() { "step 0"; event.count = trigger.num; "step 1"; @@ -6736,7 +6737,7 @@ game.import("character", function () { maixie: true, maixie_hp: true, effect: { - target: function (card, player, target, current) { + target(card, player, target, current) { if (get.tag(card, "damage") && target.hp > 1) { if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; var max = 0; @@ -6775,7 +6776,7 @@ game.import("character", function () { audioname: ["boss_lvbu3"], audio: "qiangxi", usable: 2, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { if (player == target) return false; if (target.hasSkill("reqiangxi_off")) return false; return true; @@ -6786,15 +6787,15 @@ game.import("character", function () { enable: "phaseUse", usable: 1, audioname: ["boss_lvbu3"], - filterCard: function (card) { + filterCard(card) { return get.subtype(card) == "equip1"; }, selectCard: [0, 1], - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { if (player == target) return false; return player.inRange(target); }, - content: function () { + content() { "step 0"; if (cards.length == 0) { player.loseHp(); @@ -6802,7 +6803,7 @@ game.import("character", function () { "step 1"; target.damage("nocard"); }, - check: function (card) { + check(card) { return 10 - get.value(card); }, position: "he", @@ -6810,13 +6811,13 @@ game.import("character", function () { damage: true, order: 8, result: { - player: function (player, target) { + player(player, target) { if (ui.selected.cards.length) return 0; if (player.hp >= target.hp) return -0.9; if (player.hp <= 2) return -10; return -2; }, - target: function (player, target) { + target(player, target) { if (!ui.selected.cards.length) { if (player.hp < 2) return 0; if (player.hp == 2 && target.hp >= 2) return 0; @@ -6831,7 +6832,7 @@ game.import("character", function () { xinqiangxi: { audio: "qiangxi", enable: "phaseUse", - filter: function (event, player) { + filter(event, player) { if (player.hasSkill("xinqiangxi2")) { return !player.hasSkill("xinqiangxi3"); } else if (player.hasSkill("xinqiangxi3")) { @@ -6842,22 +6843,22 @@ game.import("character", function () { return true; } }, - filterCard: function (card) { + filterCard(card) { var player = _status.event.player; if (player.hasSkill("xinqiangxi2")) return false; return get.type(card) == "equip"; }, - selectCard: function () { + selectCard() { var player = _status.event.player; if (player.hasSkill("xinqiangxi2")) return -1; if (player.hasSkill("xinqiangxi3")) return [1, 1]; return [0, 1]; }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { if (player == target) return false; return player.inRange(target); }, - content: function () { + content() { "step 0"; if (cards.length == 0) { player.loseHp(); @@ -6868,14 +6869,14 @@ game.import("character", function () { "step 1"; target.damage("nocard"); }, - check: function (card) { + check(card) { return 10 - get.value(card); }, position: "he", ai: { order: 8.5, result: { - target: function (player, target) { + target(player, target) { if (!ui.selected.cards.length) { if (player.hp < 2) return 0; if (target.hp >= player.hp) return 0; @@ -6893,13 +6894,13 @@ game.import("character", function () { audioname: ["re_taishici"], enable: "phaseUse", usable: 1, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return player.canCompare(target); }, - filter: function (event, player) { + filter(event, player) { return player.countCards("h") > 0; }, - content: function () { + content() { "step 0"; player.chooseToCompare(target); "step 1"; @@ -6910,7 +6911,7 @@ game.import("character", function () { } }, ai: { - order: function (name, player) { + order(name, player) { var cards = player.getCards("h"); if (player.countCards("h", "sha") == 0) { return 1; @@ -6927,7 +6928,7 @@ game.import("character", function () { return get.order({ name: "sha" }) - 1; }, result: { - player: function (player) { + player(player) { if (player.countCards("h", "sha") > 0) return 0.6; var num = player.countCards("h"); if (num > player.hp) return 0; @@ -6935,7 +6936,7 @@ game.import("character", function () { if (num == 2) return -1; return -0.7; }, - target: function (player, target) { + target(player, target) { var num = target.countCards("h"); if (num == 1) return -1; if (num == 2) return -0.7; @@ -6947,13 +6948,13 @@ game.import("character", function () { }, tianyi2: { mod: { - targetInRange: function (card, player, target, now) { + targetInRange(card, player, target, now) { if (card.name == "sha") return true; }, - selectTarget: function (card, player, range) { + selectTarget(card, player, range) { if (card.name == "sha" && range[1] != -1) range[1]++; }, - cardUsable: function (card, player, num) { + cardUsable(card, player, num) { if (card.name == "sha") return num + 1; }, }, @@ -6961,7 +6962,7 @@ game.import("character", function () { }, tianyi3: { mod: { - cardEnabled: function (card) { + cardEnabled(card) { if (card.name == "sha") return false; }, }, @@ -6979,21 +6980,21 @@ game.import("character", function () { shuangxiong1: { audio: true, trigger: { player: "phaseDrawBegin1" }, - check: function (event, player) { + check(event, player) { if (player.countCards("h") > player.hp) return true; if (player.countCards("h") > 3) return true; return false; }, - filter: function (event, player) { + filter(event, player) { return !event.numFixed; }, preHidden: true, prompt2: () => "进行一次判定,本回合可以将一张与此牌颜色不同的手牌当作【决斗】使用", - content: function () { + content() { player.judge().set("callback", lib.skill.shuangxiong1.callback); trigger.changeToZero(); }, - callback: function () { + callback() { player.gain(card, "gain2"); player.addTempSkill("shuangxiong2"); player.markAuto("shuangxiong2", [event.judgeResult.color]); @@ -7009,10 +7010,10 @@ game.import("character", function () { enable: "chooseToUse", viewAs: { name: "juedou" }, position: "hs", - viewAsFilter: function (player) { + viewAsFilter(player) { return player.hasCard((card) => lib.skill.shuangxiong2.filterCard(card, player), "hs"); }, - filterCard: function (card, player) { + filterCard(card, player) { var color = get.color(card), colors = player.getStorage("shuangxiong2"); for (var i of colors) { @@ -7020,7 +7021,7 @@ game.import("character", function () { } return false; }, - prompt: function () { + prompt() { var colors = _status.event.player.getStorage("shuangxiong2"); var str = "将一张颜色"; for (var i = 0; i < colors.length; i++) { @@ -7031,7 +7032,7 @@ game.import("character", function () { str += "的牌当做【决斗】使用"; return str; }, - check: function (card) { + check(card) { var player = _status.event.player; var raw = player.getUseValue(card, null, true); var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); @@ -7044,7 +7045,7 @@ game.import("character", function () { enable: "phaseUse", position: "hs", viewAs: { name: "wanjian" }, - filterCard: function (card, player) { + filterCard(card, player) { if (ui.selected.cards.length) { return get.suit(card) == get.suit(ui.selected.cards[0]); } @@ -7058,7 +7059,7 @@ game.import("character", function () { }, selectCard: 2, complexCard: true, - check: function (card) { + check(card) { var player = _status.event.player; var targets = game.filterPlayer(function (current) { return player.canUse("wanjian", current); @@ -7092,7 +7093,7 @@ game.import("character", function () { audioname: ["re_yuanshao"], forced: true, firstDo: true, - filter: function (event, player) { + filter(event, player) { return ( player.hasZhuSkill("xueyi") && game.hasPlayer(function (current) { @@ -7101,9 +7102,9 @@ game.import("character", function () { player.countCards("h") > player.hp ); }, - content: function () {}, + content() {}, mod: { - maxHandcard: function (player, num) { + maxHandcard(player, num) { if (player.hasZhuSkill("xueyi")) { return ( num + @@ -7122,14 +7123,14 @@ game.import("character", function () { audio: 2, trigger: { player: "shaMiss" }, //priority:-1, - filter: function (event) { + filter(event) { return event.target.countCards("he") > 0; }, - check: function (event, player) { + check(event, player) { return get.attitude(player, event.target) < 0; }, logTarget: "target", - content: function () { + content() { player.discardPlayerCard("he", trigger.target, true); }, }, @@ -7138,7 +7139,7 @@ game.import("character", function () { //direct:true, frequent: true, audio: "xinjiewei", - content: function () { + content() { "step 0"; player.draw(); player.chooseToUse(function (card) { @@ -7200,11 +7201,11 @@ game.import("character", function () { audio: 2, audioname: ["boss_qinglong"], trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { + filter(event, player) { return event.card.name == "shan"; }, direct: true, - content: function () { + content() { "step 0"; player.chooseTarget(get.prompt2("releiji"), function (card, player, target) { return target != player; @@ -7243,7 +7244,7 @@ game.import("character", function () { ai: { useShan: true, effect: { - target: function (card, player, target, current) { + target(card, player, target, current) { if ( get.tag(card, "respondShan") && !player.hasSkillTag( @@ -7336,7 +7337,7 @@ game.import("character", function () { }, trigger: { player: "phaseJudgeBefore" }, direct: true, - content: function () { + content() { "step 0"; player .chooseTarget( @@ -7370,7 +7371,7 @@ game.import("character", function () { }, trigger: { player: "phaseUseBefore" }, direct: true, - filter: function (event, player) { + filter(event, player) { return ( player.countCards("he", function (card) { if (_status.connectMode) return true; @@ -7378,25 +7379,25 @@ game.import("character", function () { }) > 0 ); }, - content: function () { + content() { "step 0"; player .chooseCardTarget({ prompt: get.prompt("shensu"), prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", - filterCard: function (card, player) { + filterCard(card, player) { return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); }, position: "he", - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { if (player == target) return false; return player.canUse({ name: "sha" }, target, false); }, - ai1: function (card) { + ai1(card) { if (_status.event.check) return 0; return 6 - get.value(card); }, - ai2: function (target) { + ai2(target) { if (_status.event.check) return 0; return get.effect(target, { name: "sha" }, _status.event.player); }, @@ -7424,7 +7425,7 @@ game.import("character", function () { }, trigger: { player: "phaseDiscardBefore" }, direct: true, - content: function () { + content() { "step 0"; var check = player.needsToDiscard() || @@ -7461,16 +7462,16 @@ game.import("character", function () { jushou: { audio: 2, trigger: { player: "phaseJieshuBegin" }, - check: function (event, player) { + check(event, player) { return event.player.hp + player.countCards("h") < 4; }, - content: function () { + content() { player.draw(3); player.turnOver(); }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if (card.name == "guiyoujie") return [0, 1]; }, }, @@ -7479,16 +7480,16 @@ game.import("character", function () { moon_jushou: { audio: "xinjushou", trigger: { player: "phaseJieshuBegin" }, - check: function (event, player) { + check(event, player) { return event.player.hp + player.countCards("h") < 4; }, - content: function () { + content() { player.draw(); player.turnOver(); }, ai: { effect: { - target: function (card, player, target) { + target(card, player, target) { if (card.name == "guiyoujie") return [0, 1]; }, }, @@ -7499,28 +7500,28 @@ game.import("character", function () { audio: 2, audioname: ["re_huangzhong"], trigger: { player: "useCardToPlayered" }, - check: function (event, player) { + check(event, player) { return get.attitude(player, event.target) <= 0; }, logTarget: "target", - filter: function (event, player) { + filter(event, player) { if (event.card.name != "sha") return false; var length = event.target.countCards("h"); return length >= player.hp || length <= player.getAttackRange(); }, preHidden: true, - content: function () { + content() { trigger.getParent().directHit.push(trigger.target); }, locked: false, mod: { - attackRange: function (player, distance) { + attackRange(player, distance) { if (get.zhu(player, "shouyue")) return distance + 1; }, }, ai: { directHit_ai: true, - skillTagFilter: function (player, tag, arg) { + skillTagFilter(player, tag, arg) { if (get.attitude(player, arg.target) > 0 || arg.card.name != "sha") return false; var length = arg.target.countCards("h"); return length >= player.hp || length <= player.getAttackRange(); @@ -7532,10 +7533,10 @@ game.import("character", function () { audioname: ["re_weiyan", "ol_weiyan"], trigger: { source: "damageSource" }, forced: true, - filter: function (event, player) { + filter(event, player) { return event.kuangguCheck && player.isDamaged(); }, - content: function () { + content() { player.recover(trigger.num); }, group: "kuanggu_check", @@ -7543,12 +7544,12 @@ game.import("character", function () { check: { charlotte: true, trigger: { source: "damage" }, - filter: function (event, player) { + filter(event, player) { return get.distance(player, event.player) <= 1; }, firstDo: true, silent: true, - content: function () { + content() { trigger.kuangguCheck = true; }, }, @@ -7559,22 +7560,22 @@ game.import("character", function () { audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], trigger: { player: "damageBegin3" }, direct: true, - filter: function (event, player) { + filter(event, player) { return player.countCards("h", { suit: "heart" }) > 0 && event.num > 0; }, - content: function () { + content() { "step 0"; player.chooseCardTarget({ - filterCard: function (card, player) { + filterCard(card, player) { return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return player != target; }, - ai1: function (card) { + ai1(card) { return 10 - get.value(card); }, - ai2: function (target) { + ai2(target) { var att = get.attitude(_status.event.player, target); var trigger = _status.event.getTrigger(); var da = 0; @@ -7620,12 +7621,12 @@ game.import("character", function () { ai: { maixie_defend: true, effect: { - target: function (card, player, target) { + target(card, player, target) { if (player.hasSkillTag("jueqing", false, target)) return; if (get.tag(card, "damage") && target.countCards("h") > 1) return 0.7; }, }, - threaten: function (player, target) { + threaten(player, target) { if (target.countCards("h") == 0) return 2; }, }, @@ -7637,7 +7638,7 @@ game.import("character", function () { audio: false, vanish: true, charlotte: true, - content: function () { + content() { if (player.getDamagedHp()) player.draw(player.getDamagedHp()); player.removeSkill("tianxiang2"); player.popup("tianxiang"); @@ -7649,27 +7650,27 @@ game.import("character", function () { trigger: { player: "damageBegin4" }, direct: true, preHidden: true, - filter: function (event, player) { + filter(event, player) { return ( player.countCards("h", function (card) { return _status.connectMode || get.suit(card, player) == "heart"; }) > 0 && event.num > 0 ); }, - content: function () { + content() { "step 0"; player .chooseCardTarget({ - filterCard: function (card, player) { + filterCard(card, player) { return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return player != target; }, - ai1: function (card) { + ai1(card) { return 10 - get.value(card); }, - ai2: function (target) { + ai2(target) { var att = get.attitude(_status.event.player, target); var trigger = _status.event.getTrigger(); var da = 0; @@ -7743,7 +7744,7 @@ game.import("character", function () { ai: { maixie_defend: true, effect: { - target: function (card, player, target) { + target(card, player, target) { if (player.hasSkillTag("jueqing", false, target)) return; if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; }, @@ -7754,17 +7755,17 @@ game.import("character", function () { trigger: { player: "loseHpAfter" }, forced: true, popup: false, - filter: function (event) { + filter(event) { return event.type == "retianxiang"; }, vanish: true, - content: function () { + content() { "step 0"; player.gain(player.storage.retianxiang3, "gain2"); "step 1"; player.removeSkill("retianxiang3"); }, - onremove: function (player) { + onremove(player) { var card = player.storage.retianxiang3; if (get.position(card) == "s") { game.cardsDiscard(card); @@ -7776,11 +7777,11 @@ game.import("character", function () { trigger: { player: "damageAfter" }, forced: true, popup: false, - filter: function (event) { + filter(event) { return event.type == "retianxiang"; }, vanish: true, - content: function () { + content() { if (player.isDamaged()) { player.draw(player.getDamagedHp()); } @@ -7791,27 +7792,27 @@ game.import("character", function () { audio: "tianxiang", trigger: { player: "damageBefore" }, direct: true, - filter: function (event, player) { + filter(event, player) { return ( player.countCards("he", { suit: "heart" }) > 0 && event.num > 0 && !player.hasSkill("xintianxiang3") ); }, - content: function () { + content() { "step 0"; player.chooseCardTarget({ - filterCard: function (card, player) { + filterCard(card, player) { return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); }, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return player != target; }, position: "he", - ai1: function (card) { + ai1(card) { return 10 - get.value(card); }, - ai2: function (target) { + ai2(target) { var att = get.attitude(_status.event.player, target); var trigger = _status.event.getTrigger(); var da = 0; @@ -7860,7 +7861,7 @@ game.import("character", function () { ai: { maixie_defend: true, effect: { - target: function (card, player, target) { + target(card, player, target) { if (player.hasSkillTag("jueqing", false, target)) return; if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; }, @@ -7873,7 +7874,7 @@ game.import("character", function () { popup: false, audio: false, vanish: true, - content: function () { + content() { "step 0"; var source = player.storage.xintianxiang; if (source.isDead()) { @@ -7920,7 +7921,7 @@ game.import("character", function () { xintianxiang3: { trigger: { player: ["phaseZhunbeiBegin", "dieBegin"] }, silent: true, - content: function () { + content() { if (player.storage.xintianxiang3) { player.storage.xintianxiang3.removeSkill("xintianxiang4"); delete player.storage.xintianxiang3; @@ -7936,7 +7937,7 @@ game.import("character", function () { content: "防止造成和受到的一切伤害", }, priority: 15, - content: function () { + content() { trigger.cancel(); }, ai: { @@ -7946,12 +7947,12 @@ game.import("character", function () { notrick: true, notricksource: true, effect: { - target: function (card, player, target, current) { + target(card, player, target, current) { if (get.tag(card, "damage")) { return "zeroplayertarget"; } }, - player: function (card, player, target, current) { + player(card, player, target, current) { if (get.tag(card, "damage")) { return "zeroplayertarget"; } @@ -7961,7 +7962,7 @@ game.import("character", function () { }, hongyan: { mod: { - suit: function (card, suit) { + suit(card, suit) { if (suit == "spade") return "heart"; }, }, @@ -7970,17 +7971,17 @@ game.import("character", function () { audio: 2, audioname: ["sb_xiaoqiao"], mod: { - suit: function (card, suit) { + suit(card, suit) { if (suit == "spade") return "heart"; }, }, trigger: { global: "judge" }, direct: true, - filter: function (event, player) { + filter(event, player) { if (event.fixedResult && event.fixedResult.suit) return event.fixedResult.suit == "heart"; return get.suit(event.player.judging[0], event.player) == "heart"; }, - content: function () { + content() { "step 0"; var str = "红颜:" + @@ -8035,7 +8036,7 @@ game.import("character", function () { gzbuqu: { audio: 2, trigger: { player: "changeHp" }, - filter: function (event, player) { + filter(event, player) { return player.hp <= 0 && event.num < 0; }, marktext: "创", @@ -8046,7 +8047,7 @@ game.import("character", function () { group: "gzbuqu_recover", frequent: true, ondisable: true, - onremove: function (player, skill) { + onremove(player, skill) { var cards = player.getExpansions(skill); if (cards.length) { //delete player.nodying; @@ -8054,7 +8055,7 @@ game.import("character", function () { if (player.hp <= 0) player.dying({}); } }, - process: function (player) { + process(player) { //delete player.nodying; var nums = []; var cards = player.getExpansions("gzbuqu"); @@ -8071,12 +8072,12 @@ game.import("character", function () { subSkill: { recover: { trigger: { player: "recoverAfter" }, - filter: function (event, player) { + filter(event, player) { return player.getExpansions("gzbuqu").length > 0 && event.num > 0; }, forced: true, popup: false, - content: function () { + content() { "step 0"; event.count = trigger.num; "step 1"; @@ -8122,7 +8123,7 @@ game.import("character", function () { }, }, }, - content: function () { + content() { "step 0"; var num = -trigger.num - Math.max(player.hp - trigger.num, 1) + 1; player.addToExpansion(get.cards(num), "gain2").gaintag.add("gzbuqu"); @@ -8144,7 +8145,7 @@ game.import("character", function () { trigger: { player: "chooseToUseBefore" }, forced: true, preHidden: true, - filter: function (event, player) { + filter(event, player) { return ( event.type == "dying" && player.isDying() && @@ -8152,7 +8153,7 @@ game.import("character", function () { !event.getParent()._buqu ); }, - content: function () { + content() { "step 0"; trigger.getParent()._buqu = true; var card = get.cards()[0]; @@ -8175,7 +8176,7 @@ game.import("character", function () { } }, mod: { - maxHandcardBase: function (player, num) { + maxHandcardBase(player, num) { if (get.mode() != "guozhan" && player.getExpansions("buqu").length) return player.getExpansions("buqu").length; }, @@ -8183,7 +8184,7 @@ game.import("character", function () { ai: { save: true, mingzhi: true, - skillTagFilter: function (player, tag, target) { + skillTagFilter(player, tag, target) { if (player != target) return false; }, }, @@ -8198,7 +8199,7 @@ game.import("character", function () { global: ["gainAfter", "loseAfter", "loseAsyncAfter"], }, direct: true, - filter: function (event, player) { + filter(event, player) { if (event.name == "lose") { if (event.type != "discard" || !event.player.isIn()) return false; if ((event.discarder || event.getParent(2).player) == event.player) return false; @@ -8234,7 +8235,7 @@ game.import("character", function () { } return false; }, - content: function () { + content() { "step 0"; var targets = []; if (trigger.name == "gain") { @@ -8290,15 +8291,15 @@ game.import("character", function () { trigger: { global: "phaseJieshuBegin", }, - filter: function (event, player) { + filter(event, player) { if (event.player.countCards("h") == 0 && event.player.isIn()) return true; return false; }, preHidden: true, - check: function (event, player) { + check(event, player) { return get.attitude(player, event.player) > 2; }, - content: function () { + content() { player.line(trigger.player, "green"); trigger.player.draw(2); player.loseHp(); @@ -8307,12 +8308,12 @@ game.import("character", function () { leiji: { audio: 2, trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { + filter(event, player) { return event.card.name == "shan"; }, direct: true, preHidden: true, - content: function () { + content() { "step 0"; player.chooseTarget(get.prompt2("leiji")).setHiddenSkill(event.name).ai = function ( target @@ -8347,7 +8348,7 @@ game.import("character", function () { mingzhi: false, useShan: true, effect: { - target: function (card, player, target, current) { + target(card, player, target, current) { if ( get.tag(card, "respondShan") && !player.hasSkillTag( @@ -8401,11 +8402,11 @@ game.import("character", function () { audio: 2, audioname: ["sp_zhangjiao"], trigger: { global: "judge" }, - filter: function (event, player) { + filter(event, player) { return player.countCards("hes", { color: "black" }) > 0; }, direct: true, - content: function () { + content() { "step 0"; player .chooseCard( @@ -8550,10 +8551,10 @@ game.import("character", function () { lose: false, delay: false, line: true, - prepare: function (cards, player, targets) { + prepare(cards, player, targets) { targets[0].logSkill("huangtian"); }, - prompt: function () { + prompt() { var player = _status.event.player; var list = game.filterPlayer(function (target) { return target != player && target.hasZhuSkill("huangtian", player); @@ -8562,7 +8563,7 @@ game.import("character", function () { if (list.length > 1) str += "中的一人"; return str; }, - filter: function (event, player) { + filter(event, player) { if (player.group != "qun") return false; if (player.countCards("h", "shan") + player.countCards("h", "shandian") == 0) return 0; return game.hasPlayer(function (target) { @@ -8573,12 +8574,12 @@ game.import("character", function () { ); }); }, - filterCard: function (card) { + filterCard(card) { return card.name == "shan" || card.name == "shandian"; }, log: false, visible: true, - filterTarget: function (card, player, target) { + filterTarget(card, player, target) { return ( target != player && target.hasZhuSkill("huangtian", player) && @@ -8587,7 +8588,7 @@ game.import("character", function () { }, //usable:1, //forceaudio:true, - content: function () { + content() { player.give(cards, target); target.addTempSkill("huangtian3", "phaseUseEnd"); }, @@ -8604,14 +8605,14 @@ game.import("character", function () { audio: "guhuo_guess", derivation: ["chanyuan"], enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { + hiddenCard(player, name) { return ( lib.inpile.includes(name) && player.countCards("hs") > 0 && !player.hasSkill("guhuo_phase") ); }, - filter: function (event, player) { + filter(event, player) { if (player.hasSkill("guhuo_phase")) return false; if (!player.countCards("hs")) return false; for (var i of lib.inpile) { @@ -8637,7 +8638,7 @@ game.import("character", function () { return false; }, chooseButton: { - dialog: function (event, player) { + dialog(event, player) { var list = []; for (var i of lib.inpile) { if (event.type != "phase") @@ -8660,11 +8661,11 @@ game.import("character", function () { } return ui.create.dialog("蛊惑", [list, "vcard"]); }, - filter: function (button, player) { + filter(button, player) { var evt = _status.event.getParent(); return evt.filterCard({ name: button.link[2], nature: button.link[3] }, player, evt); }, - check: function (button) { + check(button) { var player = _status.event.player; var enemyNum = game.countPlayer(function (current) { return ( @@ -8695,9 +8696,9 @@ game.import("character", function () { } return val; }, - backup: function (links, player) { + backup(links, player) { return { - filterCard: function (card, player, target) { + filterCard(card, player, target) { var result = true; var suit = card.suit, number = card.number; @@ -8719,7 +8720,7 @@ game.import("character", function () { suit: "none", number: null, }, - ai1: function (card) { + ai1(card) { var player = _status.event.player; var enemyNum = game.countPlayer(function (current) { return ( @@ -8740,7 +8741,7 @@ game.import("character", function () { } return 6 - get.value(card); }, - precontent: function () { + precontent() { player.logSkill("xinfu_guhuo"); player.addTempSkill("guhuo_guess"); var card = event.result.cards[0]; @@ -8749,7 +8750,7 @@ game.import("character", function () { }, }; }, - prompt: function (links, player) { + prompt(links, player) { return ( "将一张手牌当做" + get.translation(links[0][2]) + @@ -8762,7 +8763,7 @@ game.import("character", function () { respondSha: true, respondShan: true, fireAttack: true, - skillTagFilter: function (player) { + skillTagFilter(player) { if (!player.countCards("hs") || player.hasSkill("guhuo_phase")) return false; }, threaten: 1.2, @@ -8780,13 +8781,13 @@ game.import("character", function () { popup: false, firstDo: true, charlotte: true, - filter: function (event, player) { + filter(event, player) { return ( event.skill && (event.skill.indexOf("guhuo_") == 0 || event.skill.indexOf("xinfu_guhuo_") == 0) ); }, - content: function () { + content() { "step 0"; player.addTempSkill("guhuo_phase"); event.fake = false; @@ -8933,14 +8934,14 @@ game.import("character", function () { }, }, chanyuan: { - init: function (player, skill) { + init(player, skill) { if (player.hp == 1) player.logSkill(skill); player.addSkillBlocker(skill); }, - onremove: function (player, skill) { + onremove(player, skill) { player.removeSkillBlocker(skill); }, - skillBlocker: function (skill, player) { + skillBlocker(skill, player) { return ( skill != "chanyuan" && skill != "rechanyuan" && @@ -8950,7 +8951,7 @@ game.import("character", function () { }, mark: true, intro: { - content: function (storage, player, skill) { + content(storage, player, skill) { var str = "
  • 锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。"; var list = player.getSkills(null, false, false).filter(function (i) { @@ -8962,32 +8963,32 @@ game.import("character", function () { }, audio: 2, trigger: { player: "changeHp" }, - filter: function (event, player) { + filter(event, player) { return player.hp == 1; }, forced: true, - content: function () {}, + content() {}, }, guhuo_phase: {}, }, card: {}, dynamicTranslate: { - nzry_juzhan: function (player) { + nzry_juzhan(player) { if (player.storage.nzry_juzhan == true) return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; }, - nzry_zhenliang: function (player) { + nzry_zhenliang(player) { if (player.storage.nzry_zhenliang == true) return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; }, - nzry_chenglve: function (player) { + nzry_chenglve(player) { if (player.storage.nzry_chenglve == true) return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; }, - nzry_shenshi: function (player) { + nzry_shenshi(player) { if (player.storage.nzry_shenshi == true) return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; diff --git a/character/standard.js b/character/standard.js index 6f2226595..7b5f1c003 100755 --- a/character/standard.js +++ b/character/standard.js @@ -129,6 +129,7 @@ game.import("character", function () { ganning: ["lingtong", "xf_sufei"], guanyu: ["zhangfei", "liaohua"], }, + /** @type { importCharacterConfig['skill'] } */ skill: { //标准版甘夫人 stdshushen: { @@ -578,7 +579,7 @@ game.import("character", function () { async cost(event, trigger, player) { let num = game.countPlayer( (current) => - current != player && current.countCards("h") && get.attitude(player, current) <= 0 + current != player && current.countCards("h") > 0 && get.attitude(player, current) <= 0 ); let check = num >= 2; const { result } = await player @@ -2611,7 +2612,7 @@ game.import("character", function () { global: ["dying", "gainAfter", "loseAsyncAfter"], }, audio: 2, - getIndex: function (event, player) { + getIndex(event, player) { if (event.name !== "loseAsync") return [event.player]; else return game diff --git a/node_modules/@types/noname-typings/Result.d.ts b/node_modules/@types/noname-typings/Result.d.ts index 24bfb85aa..80a75be54 100644 --- a/node_modules/@types/noname-typings/Result.d.ts +++ b/node_modules/@types/noname-typings/Result.d.ts @@ -37,7 +37,12 @@ declare interface Result { * 当前有“视为”操作,该card参数特供给视为牌,不需要cards[0]获取视为牌 ; * 判断是否为视为牌:card.isCard,false为视为牌 */ - card: Card; + card: Card | CardBaseUIData; + + + cost_data: { + [key: string]: any; + }; [key: string]: any; } \ No newline at end of file diff --git a/node_modules/@types/noname-typings/Skill.d.ts b/node_modules/@types/noname-typings/Skill.d.ts index cbc602a8a..1fbb75517 100644 --- a/node_modules/@types/noname-typings/Skill.d.ts +++ b/node_modules/@types/noname-typings/Skill.d.ts @@ -442,7 +442,7 @@ declare interface Skill { * * 若该属性值是“check”,则调用当前技能得check方法检测 */ - frequent?: boolean | string | TwoParmFun; + frequent?: boolean | string | TwoParmFun; /** * 此技能是否可以被设置为自动发动2 * @@ -1285,7 +1285,7 @@ declare interface Skill { * * @param target v1.10.11 触发的目标 */ - logTarget?: string | ((event?: GameEventPromise, player?: Player, triggername?: string, target?: Player) => string | Player | Player[] | null); + logTarget?: string | ((event?: GameEventPromise, player?: Player, triggername?: string, target?: Player) => string | Player | Player[] | null | undefined); /** * 是否通过logTarget显示触发者的目标日志; * diff --git a/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts index ae25557a7..9971c369c 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/game/index.d.ts @@ -33,6 +33,10 @@ export class Game { * @type { boolean } */ chess: boolean; + /** + * @type { Player } + */ + zhu: Player; globalEventHandlers: { _handlers: {}; getHandler(name: any, type: any): any; @@ -350,7 +354,7 @@ export class Game { * @param { ...Parameters } args * @returns { void } */ - broadcast(func: T_6, ...args: Parameters<{ + broadcast(func: T_6, ...args: Parameters<{ log: (arr: any) => void; opened: () => void; onconnection: (id: any) => void; @@ -382,7 +386,7 @@ export class Game { * @param { ...T } args * @returns { void } */ - broadcast(func: (...args: T_6) => void, ...args: T_6 | undefined): void; + broadcast(func: (...args: T_6) => void, ...args: T_6 | undefined): void; /** * @template { keyof typeof lib.message.client } T * @overload @@ -390,7 +394,7 @@ export class Game { * @param { ...Parameters } args * @returns { void } */ - broadcastAll(func: T_7, ...args: Parameters<{ + broadcastAll(func: T_7, ...args: Parameters<{ log: (arr: any) => void; opened: () => void; onconnection: (id: any) => void; @@ -422,7 +426,7 @@ export class Game { * @param { ...T } args * @returns { void } */ - broadcastAll(func: (...args: T_7) => void, ...args: T_7 | undefined): void; + broadcastAll(func: (...args: T_7) => void, ...args: T_7 | undefined): void; syncState(): void; updateWaiting(): void; /** @@ -1155,11 +1159,11 @@ export class Game { updateRoundNumber(): void; /** * @param { Player[] } players - * @param { number | number[] | (player: Player) => number } num + * @param { number | number[] | (player: Player) => number } [num] * @param { { drawDeck: boolean } } [drawDeck] * @param { boolean } [bottom] */ - asyncDraw(players: Player[], num: number | number[] | ((player: Player) => number), drawDeck?: { + asyncDraw(players: Player[], num?: number | number[] | ((player: Player) => number) | undefined, drawDeck?: { drawDeck: boolean; } | undefined, bottom?: boolean | undefined): void; /** diff --git a/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts index 1f94ae2ae..b4290be5e 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/get/index.d.ts @@ -99,7 +99,7 @@ export class Get { infoHp(hp: any): number; infoMaxHp(hp: any): number; infoHujia(hp: any): number; - bottomCards(num: any, putBack: any): any; + bottomCards(num: any, putBack: any): Node | Node[]; discarded(): any; cardOffset(): number; colorspan(str: any): any; @@ -355,7 +355,7 @@ export class Get { * @returns {string[]} */ natureList(card: string[] | string, player?: false | import("noname-typings/nonameModules/noname/library/element/player.js").Player | undefined): string[]; - cards(num: any, putBack: any): any; + cards(num: any, putBack: any): Node | Node[]; judge(card: any): any; judge2(card: any): any; distance(from: any, to: any, method: any): number; @@ -390,7 +390,7 @@ export class Get { * @returns {GameEvent[T]} */ event(key: T_2): import("noname-typings/nonameModules/noname/library/element/gameEvent.js").GameEvent[T_2]; - player(): any; + player(): import("noname-typings/nonameModules/noname/library/element/player.js").Player; players(sort: any, dead: any, out: any): import("noname-typings/nonameModules/noname/library/element/player.js").Player[]; position(card: any, ordering: any): number | "e" | "j" | "x" | "s" | "h" | "c" | "d" | "o" | null | undefined; skillTranslation(str: any, player: any): string; @@ -476,7 +476,7 @@ export class Get { /** * @returns { number } */ - order(item: any, player?: any): number; + order(item: any, player?: import("noname-typings/nonameModules/noname/library/element/player.js").Player): number; result(item: any, skill: any): any; cacheEffectUse(target: any, card: any, player: any, player2: any, isLink: any): number; effect_use(target: any, card: any, player: any, player2: any, isLink: any): number; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts index f2da42ab5..dfcf107d3 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/get/is.d.ts @@ -49,7 +49,7 @@ export class Is { * 是否是实体牌 * @param { Card | VCard } card */ - ordinaryCard(card: Card | VCard): any; + ordinaryCard(card: Card | VCard): boolean; /** * 押韵判断 * @param { string } str1 diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts index 025d7e6b9..d0e622684 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/card.d.ts @@ -34,6 +34,10 @@ export class Card extends HTMLDivElement { * @type { string } */ name: string; + /** + * @type { boolean } + */ + isCard: boolean; selfDestroy(event: any): void; willBeDestroyed(targetPosition: any, player: any, event: any): any; hasNature(nature: any, player: any): boolean; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts index 09863751b..de20fcee0 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/gameEvent.d.ts @@ -125,9 +125,37 @@ export class GameEvent { */ parent: GameEventPromise | void | null; /** - * @type { Function | void | null } + * @type { (this: GameEventPromise) => any | undefined | void | null } */ - filterStop: Function | void | null; + filterStop: (this: GameEventPromise) => any | undefined | void | null; + /** + * @type { Result['cost_data'] } + */ + cost_data: Result['cost_data']; + /** + * @type { boolean } + */ + responded: boolean; + /** + * @type { string | undefined } + */ + judgestr: string | undefined; + /** + * @type { boolean } + */ + judging: boolean; + /** + * @type { Function | undefined } + */ + judge2: Function | undefined; + /** + * @type { Card[] } + */ + orderingCards: Card[]; + /** + * @type { Function | undefined } + */ + ai: Function | undefined; /** * @param {keyof this} key * @param {number} [value] diff --git a/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts index f27ba6702..be00c0882 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/library/element/player.d.ts @@ -69,29 +69,9 @@ export class Player extends HTMLDivElement { skill: {}; }[]; /** - * @type { { - * useCard: GameEventPromise[], - * respond: GameEventPromise[], - * skipped: GameEventPromise[], - * lose: GameEventPromise[], - * gain: GameEventPromise[], - * sourceDamage: GameEventPromise[], - * damage: GameEventPromise[], - * custom: GameEventPromise[], - * useSkill: GameEventPromise[], - * }[] } + * @type { ActionHistory[] } */ - actionHistory: { - useCard: GameEventPromise[]; - respond: GameEventPromise[]; - skipped: GameEventPromise[]; - lose: GameEventPromise[]; - gain: GameEventPromise[]; - sourceDamage: GameEventPromise[]; - damage: GameEventPromise[]; - custom: GameEventPromise[]; - useSkill: GameEventPromise[]; - }[]; + actionHistory: ActionHistory[]; /** * @type { SMap } */ @@ -117,7 +97,8 @@ export class Player extends HTMLDivElement { * friend: [], * enemy: [], * neutral: [], - * handcards: { + * shown?: number, + * handcards?: { * global: [], * source: [], * viewed: [] @@ -128,7 +109,8 @@ export class Player extends HTMLDivElement { friend: []; enemy: []; neutral: []; - handcards: { + shown?: number; + handcards?: { global: []; source: []; viewed: []; @@ -208,6 +190,18 @@ export class Player extends HTMLDivElement { * @type { ((player: this) => any)[] } */ _inits: ((player: this) => any)[]; + /** + * @type { boolean } + */ + isZhu: boolean; + /** + * @type { string } + */ + identity: string; + /** + * @type { boolean | undefined } + */ + identityShown: boolean | undefined; /** * 怒气 * @param { number } amount @@ -516,10 +510,10 @@ export class Player extends HTMLDivElement { /** * 向target发起协力 * @param { Player } target - * @param {*} type + * @param { string } type * @param {*} reason */ - cooperationWith(target: Player, type: any, reason: any): void; + cooperationWith(target: Player, type: string, reason: any): void; chooseCooperationFor(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; checkCooperationStatus(target: any, reason: any): boolean; removeCooperation(info: any): void; @@ -634,8 +628,9 @@ export class Player extends HTMLDivElement { /** * @param { string } name * @param { string } type + * @returns { boolean } */ - hasUsableCard(name: string, type: string): true | undefined; + hasUsableCard(name: string, type: string): boolean; /** * @param { Player } to * @returns { boolean } @@ -768,9 +763,9 @@ export class Player extends HTMLDivElement { position: number; hujia: number; side: any; - identityShown: any; + identityShown: boolean | undefined; identityNode: (string | undefined)[]; - identity: any; + identity: string; dead: boolean; linked: boolean; turnedover: boolean; @@ -806,7 +801,13 @@ export class Player extends HTMLDivElement { countUsed(card: any, type: any): number; getCacheKey(): string; countSkill(skill: any): any; - getStockSkills(unowned: any, unique: any, hidden: any): any[]; + /** + * @param {*} [unowned] + * @param {*} [unique] + * @param {*} [hidden] + * @returns { string[] } + */ + getStockSkills(unowned?: any, unique?: any, hidden?: any): string[]; /** * @param { string } [arg1='h'] * @param { string | Record | ((card: Card) => boolean) } [arg2] @@ -821,16 +822,41 @@ export class Player extends HTMLDivElement { getCards(arg1?: string | undefined, arg2?: string | Record | ((card: Card) => boolean) | undefined): Card[]; iterableGetDiscardableCards(player: any, arg1: any, arg2: any): Generator; getDiscardableCards(player: any, arg1: any, arg2: any): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; - iterableGetGainableCards(player: any, arg1: any, arg2: any): Generator; - getGainableCards(player: any, arg1: any, arg2: any): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; + /** + * @param {Parameters[1]} player + * @param {Parameters[0]} arg1 + * @param {Parameters[1]} arg2 + */ + iterableGetGainableCards(player: [card?: any, player?: any, target?: any, event?: any][1], arg1: Parameters[0], arg2: Parameters[1]): Generator; + /** + * + * @param {Parameters[0]} player + * @param {Parameters[1]} [arg1] + * @param {Parameters[2]} [arg2] + */ + getGainableCards(player: Parameters[0], arg1?: Parameters[1] | undefined, arg2?: Parameters[2] | undefined): import("noname-typings/nonameModules/noname/library/element/card.js").Card[]; getGainableSkills(func: any): any[]; - countCards(arg1: any, arg2: any): number; + /** + * @param { Parameters[0] } [arg1] + * @param { Parameters[1] } [arg2] + */ + countCards(arg1?: Parameters[0] | undefined, arg2?: Parameters[1] | undefined): number; getCardIndex(arg1: any, name: any, card: any, max: any): number; countDiscardableCards(player: any, arg1: any, arg2: any): number; - countGainableCards(player: any, arg1: any, arg2: any): number; + /** + * @param {Parameters[0]} player + * @param {Parameters[1]} [arg1] + * @param {Parameters[2]} [arg2] + */ + countGainableCards(player: Parameters[0], arg1?: Parameters[1] | undefined, arg2?: Parameters[2] | undefined): number; getOriginalSkills(): any[]; getModableSkills(): any[]; - getSkills(arg2: any, arg3: any, arg4: any): any[]; + /** + * @param { string | boolean | null } [arg2] + * @param { boolean | null} [arg3] + * @param {boolean} [arg4] + */ + getSkills(arg2?: string | boolean | null | undefined, arg3?: boolean | null | undefined, arg4?: boolean | undefined): any[]; get(arg1: any, arg2: any, arg3: any, arg4: any, ...args: any[]): any[] | ChildNode | undefined; syncStorage(skill: any): void; syncSkills(): void; @@ -889,16 +915,30 @@ export class Player extends HTMLDivElement { $addToExpansion(cards: any, broadcast: any, gaintag: any): this; directgain(cards: any, broadcast: any, gaintag: any): this; directgains(cards: any, broadcast: any, gaintag: any): this; - gainMultiple(targets: any, position: any): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; + /** + * + * @param { Player[] } targets + * @param { string } [position] + */ + gainMultiple(targets: Player[], position?: string | undefined): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; gain(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; addToExpansion(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; - give(cards: any, target: any, visible: any): any; + /** + * + * @param { Card | Card[] } cards + * @param { Player } target + * @param { boolean } [visible] + */ + give(cards: Card | Card[], target: Player, visible?: boolean | undefined): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; lose(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; damage(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; recover(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; recoverTo(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; doubleDraw(): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; - loseHp(num: any): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; + /** + * @param { number } [num] + */ + loseHp(num?: number | undefined): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; loseMaxHp(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; gainMaxHp(...args: any[]): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; changeHp(num: any, popup: any): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; @@ -930,11 +970,23 @@ export class Player extends HTMLDivElement { wait(callback: any): void; unwait(result: any): void; tempUnwait(result: any): void; - logSkill(name: any, targets: any, nature: any, logv: any): void; + /** + * @param { string | string[] } name + * @param { Player | Player[] } [targets] + * @param { boolean | string } [nature] + * @param { boolean } [logv] + */ + logSkill(name: string | string[], targets?: Player | Player[] | undefined, nature?: string | boolean | undefined, logv?: boolean | undefined): void; unprompt(): void; prompt(str: any, nature: any): void; prompt_old(name2: any, className: any): void; - popup(name: any, className: any, nobroadcast: any): void; + /** + * + * @param { string } name + * @param { string } className + * @param { Parameters[3] } [nobroadcast] + */ + popup(name: string, className?: string, nobroadcast?: Parameters[3] | undefined): void; popup_old(name: any, className: any): HTMLDivElement; _popup(): void; showTimer(time: any): void; @@ -961,7 +1013,14 @@ export class Player extends HTMLDivElement { unmark(name: any, info: any): void; addLink(): void; removeLink(): void; - canUse(card: any, target: any, distance: any, includecard: any): any; + /** + * @param { string | Card | VCard } card + * @param { Player } target + * @param { boolean } [distance] + * @param { GameEventPromise | boolean } [includecard] + * @returns { boolean } + */ + canUse(card: string | Card | VCard, target: Player, distance?: boolean | undefined, includecard?: boolean | import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): boolean; hasUseTarget(card: any, distance: any, includecard: any): boolean; hasValueTarget(card: any, distance: any, includecard: any): boolean; getUseValue(card: any, distance: any, includecard: any): number; @@ -997,7 +1056,20 @@ export class Player extends HTMLDivElement { removeSkillTrigger(skills: any, triggeronly: any): this; removeSkill(skill: any, ...args: any[]): any; addTempSkills(skillsToAdd: any, expire: any): import("./gameEvent.js").GameEvent & import("./gameEventPromise.js").GameEventPromise; - addTempSkill(skill: any, expire: any, checkConflict: any): any; + /** + * @overload + * @param { string } skill + * @param { SkillTrigger | string } [expire] + * @param { boolean } [checkConflict] + */ + addTempSkill(skill: string, expire?: string | SkillTrigger | undefined, checkConflict?: boolean | undefined): any; + /** + * @overload + * @param { string[] } skill + * @param { SkillTrigger } [expire] + * @param { boolean } [checkConflict] + */ + addTempSkill(skill: string[], expire?: SkillTrigger | undefined, checkConflict?: boolean | undefined): any; tempBanSkill(skill: any, expire: any, log: any): any; isTempBanned(skill: any): boolean; attitudeTo(target: any): any; @@ -1019,14 +1091,68 @@ export class Player extends HTMLDivElement { * @param { string | function | number | boolean | object } map */ getRoundHistory(key: any, filter: any, num: any, keep: any, last: any): any[]; - getHistory(key: any, filter: any, last: any): any; - checkHistory(key: any, filter: any, last: any): void; - hasHistory(key: any, filter: any, last: any): any; - getLastHistory(key: any, filter: any, last: any): any; - checkAllHistory(key: any, filter: any, last: any): void; - getAllHistory(key: any, filter: any, last: any): any[]; - hasAllHistory(key: any, filter: any, last: any): boolean; - getLastUsed(num: any): any; + /** + * @overload + * @returns { ActionHistory } + */ + getHistory(): ActionHistory; + /** + * @template { keyof ActionHistory } T + * @overload + * @param { T } key + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { ActionHistory[T] } + */ + getHistory(key: T, filter?: ((event: GameEventPromise) => boolean) | undefined, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): ActionHistory[T]; + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] + */ + checkHistory(key: T_1, filter: (event: GameEventPromise) => boolean, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): void; + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { boolean } + */ + hasHistory(key: T_2, filter?: ((event: GameEventPromise) => boolean) | undefined, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): boolean; + /** + * @template { keyof ActionHistory } T + * @overload + * @param { T } [key] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { null | ActionHistory[T] | boolean } + */ + getLastHistory(key?: T_3 | undefined, filter?: ((event: GameEventPromise) => boolean) | undefined, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): boolean | ActionHistory[T_3] | null; + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] + */ + checkAllHistory(key: T_4, filter: (event: GameEventPromise) => boolean, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): void; + /** + * @template { keyof ActionHistory } T + * @param { T } [key] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { ActionHistory[T] } + */ + getAllHistory(key?: T_5 | undefined, filter?: ((event: GameEventPromise) => boolean) | undefined, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): ActionHistory[T_5]; + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] + * @returns { boolean } + */ + hasAllHistory(key: T_6, filter: (event: GameEventPromise) => boolean, last?: import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | undefined): boolean; + getLastUsed(num: any): import("noname-typings/nonameModules/noname/library/index.js").GameEventPromise | null; getStat(key: any): any; getLastStat(key: any): any; queue(time: any): void; @@ -1067,23 +1193,59 @@ export class Player extends HTMLDivElement { isOnline2(): boolean; isOffline(): boolean; checkShow(skill: any, showonly: any): false | "main" | "vice"; - needsToDiscard(add: any, filter: any, pure: any): number; + /** + * + * @param { number | Card[] | Card } [add] + * @param { (card?: Card, player?: Player) => boolean } [filter] + * @param { boolean } [pure] + */ + needsToDiscard(add?: number | import("noname-typings/nonameModules/noname/library/element/card.js").Card | import("noname-typings/nonameModules/noname/library/element/card.js").Card[] | undefined, filter?: ((card?: Card, player?: Player) => boolean) | undefined, pure?: boolean | undefined): number; distanceTo(target: any, method: any): number; distanceFrom(target: any, method: any): number; - hasSkill(skill: any, arg2: any, arg3: any, arg4: any): boolean; - hasStockSkill(skill: any, arg1: any, arg2: any, arg3: any): boolean; + /** + * @param { string } skill + * @param { Parameters[0] } arg2 + * @param { Parameters[1] } arg3 + * @param { Parameters[2] } arg4 + * @returns { boolean } + */ + hasSkill(skill: string, arg2: Parameters[0], arg3: Parameters[1], arg4: Parameters[2]): boolean; + /** + * @param { string } skill + * @param { Parameters[0] } arg1 + * @param { Parameters[1] } arg2 + * @param { Parameters[2] } arg3 + * @returns { boolean } + */ + hasStockSkill(skill: string, arg1: Parameters[0], arg2: Parameters[1], arg3: Parameters[2]): boolean; isZhu2(): boolean; isInitFilter(tag: any): boolean; - hasZhuSkill(skill: any, player: any): boolean; + /** + * + * @param {string} skill + * @param {Player} [player] + */ + hasZhuSkill(skill: string, player?: Player | undefined): boolean; hasGlobalTag(tag: any, arg: any): boolean; - hasSkillTag(tag: any, hidden: any, arg: any, globalskill: any): boolean; + /** + * @param {string} tag + * @param {Parameters[0]} hidden + * @param {Parameters[2]} arg + * @param {boolean} [globalskill] + */ + hasSkillTag(tag: string, hidden: Parameters[0], arg: [player: import("noname-typings/nonameModules/noname/library/element/player.js").Player, tag: string, arg: any][2], globalskill?: boolean | undefined): boolean; hasJudge(name: any): boolean; hasFriend(): boolean; hasUnknown(num: any): boolean; isUnknown(player: any): boolean; hasWuxie(info: any): boolean; - hasSha(respond: any, noauto: any): true | undefined; - hasShan(respond: any): true | undefined; + /** + * + * @param {string|boolean} [respond] + * @param {boolean} [noauto] + */ + hasSha(respond?: string | boolean | undefined, noauto?: boolean | undefined): boolean; + hasShan(respond: any): boolean; mayHaveSha(viewer: any, type: any, ignore: any, rvt: any): number | boolean; mayHaveShan(viewer: any, type: any, ignore: any, rvt: any): number | boolean; hasCard(name: any, position: any): boolean; @@ -1119,9 +1281,27 @@ export class Player extends HTMLDivElement { $dust(): void; $recover(): void; $fullscreenpop(str: any, nature: any, avatar: any, broadcast: any): void; - $damagepop(num: any, nature: any, font: any, nobroadcast: any): void; + /** + * + * @param { number | string } num + * @param { string } [nature] + * @param { boolean } [font] + * @param { boolean } [nobroadcast] + */ + $damagepop(num: number | string, nature?: string | undefined, font?: boolean | undefined, nobroadcast?: boolean | undefined): void; $damage(source: any, ...args: any[]): void; $die(): void; $dieflip(type: any): void; $phaseJudge(card: any): void; } +export type ActionHistory = { + useCard: GameEventPromise[]; + respond: GameEventPromise[]; + skipped: GameEventPromise[]; + lose: GameEventPromise[]; + gain: GameEventPromise[]; + sourceDamage: GameEventPromise[]; + damage: GameEventPromise[]; + custom: GameEventPromise[]; + useSkill: GameEventPromise[]; +}; diff --git a/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts b/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts index df605984f..a51c397cf 100644 --- a/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts +++ b/node_modules/@types/noname-typings/nonameModules/noname/ui/index.d.ts @@ -129,6 +129,10 @@ export class UI { * @type {HTMLDivElement} */ tempnowuxie: HTMLDivElement; + /** + * @type {HTMLDivElement} + */ + cardPile: HTMLDivElement; refresh(node: any): void; clear(): void; updatec(): void; diff --git a/noname/game/index.js b/noname/game/index.js index 297017ea8..16a193d3f 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -53,18 +53,19 @@ export class Game { /** * @type { string } */ - // @ts-ignore layout; /** * @type { Player } */ - // @ts-ignore me; /** * @type { boolean } */ - // @ts-ignore chess; + /** + * @type { Player } + */ + zhu; globalEventHandlers = new (class { constructor() { this._handlers = {}; @@ -7486,7 +7487,7 @@ export class Game { } /** * @param { Player[] } players - * @param { number | number[] | (player: Player) => number } num + * @param { number | number[] | (player: Player) => number } [num] * @param { { drawDeck: boolean } } [drawDeck] * @param { boolean } [bottom] */ diff --git a/noname/library/element/card.js b/noname/library/element/card.js index 7e91d8be0..d793cb1bf 100644 --- a/noname/library/element/card.js +++ b/noname/library/element/card.js @@ -100,6 +100,10 @@ export class Card extends HTMLDivElement { * @type { any[] } */ _uncheck; + /** + * @type { boolean } + */ + isCard; //执行销毁一张牌的钩子函数 selfDestroy(event) { if (this._selfDestroyed) return; diff --git a/noname/library/element/gameEvent.js b/noname/library/element/gameEvent.js index 736855ee6..a19280100 100644 --- a/noname/library/element/gameEvent.js +++ b/noname/library/element/gameEvent.js @@ -67,37 +67,30 @@ export class GameEvent { /** * @type { Player } */ - // @ts-ignore source; /** * @type { Player } */ - // @ts-ignore player; /** * @type { Player[] } */ - // @ts-ignore players; /** * @type { Player } */ - // @ts-ignore target; /** * @type { Player[] } */ - // @ts-ignore targets; /** * @type { Card } */ - // @ts-ignore card; /** * @type { Card[] } */ - // @ts-ignore cards; /** * @type { string } @@ -114,7 +107,6 @@ export class GameEvent { /** * @type { GameEvent } */ - // @ts-ignore _trigger; /** * @type { Result } @@ -123,61 +115,79 @@ export class GameEvent { /** * @type { number } */ - // @ts-ignore baseDamage; /** * @type { Player } */ - // @ts-ignore customSource; /** * @type { number } */ - // @ts-ignore extraDamage; /** * @type { string } */ - // @ts-ignore nature; /** * @type { boolean } */ - // @ts-ignore notrigger; /** * @type { number } */ - // @ts-ignore original_num; /** * @type { boolean } */ - // @ts-ignore unreal; /** * @type { Button[] } */ - // @ts-ignore excludeButton; /** * @type { Result } */ - // @ts-ignore result; /** * @type { GameEventPromise | void | null } */ - // @ts-ignore parent; /** * @type { string } */ name; /** - * @type { Function | void | null } + * @type { (this: GameEventPromise) => any | undefined | void | null } */ filterStop; + /** + * @type { Result['cost_data'] } + */ + cost_data; + /** + * @type { boolean } + */ + responded; + /** + * @type { string | undefined } + */ + judgestr; + /** + * @type { boolean } + */ + judging; + /** + * @type { Function | undefined } + */ + judge2; + /** + * @type { Card[] } + */ + orderingCards; + /** + * @type { Function | undefined } + */ + ai; /** * @param {keyof this} key * @param {number} [value] diff --git a/noname/library/element/player.js b/noname/library/element/player.js index 8fc371d2b..65ea80540 100644 --- a/noname/library/element/player.js +++ b/noname/library/element/player.js @@ -1,3 +1,17 @@ +/** + * @typedef { { + * useCard: GameEventPromise[], + * respond: GameEventPromise[], + * skipped: GameEventPromise[], + * lose: GameEventPromise[], + * gain: GameEventPromise[], + * sourceDamage: GameEventPromise[], + * damage: GameEventPromise[], + * custom: GameEventPromise[], + * useSkill: GameEventPromise[], + * }} ActionHistory + */ + import { ai } from "../../ai/index.js"; import { get } from "../../get/index.js"; import { game } from "../../game/index.js"; @@ -224,17 +238,7 @@ export class Player extends HTMLDivElement { */ stat; /** - * @type { { - * useCard: GameEventPromise[], - * respond: GameEventPromise[], - * skipped: GameEventPromise[], - * lose: GameEventPromise[], - * gain: GameEventPromise[], - * sourceDamage: GameEventPromise[], - * damage: GameEventPromise[], - * custom: GameEventPromise[], - * useSkill: GameEventPromise[], - * }[] } + * @type { ActionHistory[] } */ actionHistory; /** @@ -262,7 +266,8 @@ export class Player extends HTMLDivElement { * friend: [], * enemy: [], * neutral: [], - * handcards: { + * shown?: number, + * handcards?: { * global: [], * source: [], * viewed: [] @@ -342,6 +347,18 @@ export class Player extends HTMLDivElement { * @type { ((player: this) => any)[] } */ _inits; + /** + * @type { boolean } + */ + isZhu; + /** + * @type { string } + */ + identity; + /** + * @type { boolean | undefined } + */ + identityShown; //新函数 /** * 怒气 @@ -1402,7 +1419,7 @@ export class Player extends HTMLDivElement { /** * 向target发起协力 * @param { Player } target - * @param {*} type + * @param { string } type * @param {*} reason */ cooperationWith(target, type, reason) { @@ -2023,6 +2040,7 @@ export class Player extends HTMLDivElement { /** * @param { string } name * @param { string } type + * @returns { boolean } */ hasUsableCard(name, type) { if (typeof type !== "string") type = type ? "limit" : "all"; @@ -3698,6 +3716,12 @@ export class Player extends HTMLDivElement { if (num == undefined) return 0; return num; } + /** + * @param {*} [unowned] + * @param {*} [unique] + * @param {*} [hidden] + * @returns { string[] } + */ getStockSkills(unowned, unique, hidden) { var list = []; if (lib.character[this.name] && (hidden || !this.isUnseen(0))) { @@ -3842,6 +3866,11 @@ export class Player extends HTMLDivElement { getDiscardableCards(player, arg1, arg2) { return Array.from(this.iterableGetDiscardableCards(player, arg1, arg2)); } + /** + * @param {Parameters[1]} player + * @param {Parameters[0]} arg1 + * @param {Parameters[1]} arg2 + */ *iterableGetGainableCards(player, arg1, arg2) { for (let card of this.iterableGetCards(arg1, arg2)) { if (lib.filter.canBeGained(card, player, this)) { @@ -3849,6 +3878,12 @@ export class Player extends HTMLDivElement { } } } + /** + * + * @param {Parameters[0]} player + * @param {Parameters[1]} [arg1] + * @param {Parameters[2]} [arg2] + */ getGainableCards(player, arg1, arg2) { return Array.from(this.iterableGetGainableCards(player, arg1, arg2)); } @@ -3860,6 +3895,10 @@ export class Player extends HTMLDivElement { } return list; } + /** + * @param { Parameters[0] } [arg1] + * @param { Parameters[1] } [arg2] + */ countCards(arg1, arg2) { let count = 0; for (let item of this.iterableGetCards(arg1, arg2)) { @@ -3883,6 +3922,11 @@ export class Player extends HTMLDivElement { countDiscardableCards(player, arg1, arg2) { return this.getDiscardableCards(player, arg1, arg2).length; } + /** + * @param {Parameters[0]} player + * @param {Parameters[1]} [arg1] + * @param {Parameters[2]} [arg2] + */ countGainableCards(player, arg1, arg2) { return this.getGainableCards(player, arg1, arg2).length; } @@ -3906,6 +3950,11 @@ export class Player extends HTMLDivElement { skills.sort((a, b) => get.priority(a) - get.priority(b)); return skills; } + /** + * @param { string | boolean | null } [arg2] + * @param { boolean | null} [arg3] + * @param {boolean} [arg4] + */ getSkills(arg2, arg3, arg4) { var skills = this.skills.slice(0); var es = []; @@ -5781,7 +5830,12 @@ export class Player extends HTMLDivElement { ); return this; } - gainMultiple(targets, position) { + /** + * + * @param { Player[] } targets + * @param { string } [position] + */ + gainMultiple(targets, position = "h") { var next = game.createEvent("gainMultiple", false); next.setContent("gainMultiple"); next.player = this; @@ -5945,6 +5999,12 @@ export class Player extends HTMLDivElement { next.gaintag = []; return next; } + /** + * + * @param { Card | Card[] } cards + * @param { Player } target + * @param { boolean } [visible] + */ give(cards, target, visible) { var next = target.gain(cards, this); next.animate = visible ? "give" : "giveAuto"; @@ -6136,6 +6196,9 @@ export class Player extends HTMLDivElement { next.setContent("doubleDraw"); return next; } + /** + * @param { number } [num] + */ loseHp(num) { var next = game.createEvent("loseHp"); next.num = num; @@ -6787,6 +6850,12 @@ export class Player extends HTMLDivElement { } if (typeof proceed == "function") proceed(); } + /** + * @param { string | string[] } name + * @param { Player | Player[] } [targets] + * @param { boolean | string } [nature] + * @param { boolean } [logv] + */ logSkill(name, targets, nature, logv) { if (get.itemtype(targets) == "player") targets = [targets]; var nopop = false; @@ -6980,7 +7049,13 @@ export class Player extends HTMLDivElement { node.classList.add(className); } } - popup(name, className, nobroadcast) { + /** + * + * @param { string } name + * @param { string } className + * @param { Parameters[3] } [nobroadcast] + */ + popup(name, className = "water", nobroadcast) { var name2 = get.translation(name); if (!name2) return; this.$damagepop(name2, className || "water", true, nobroadcast); @@ -7403,6 +7478,13 @@ export class Player extends HTMLDivElement { this.classList.remove("linked"); } } + /** + * @param { string | Card | VCard } card + * @param { Player } target + * @param { boolean } [distance] + * @param { GameEventPromise | boolean } [includecard] + * @returns { boolean } + */ canUse(card, target, distance, includecard) { if (typeof card == "string") card = { name: card, isCard: true }; var info = get.info(card); @@ -8247,6 +8329,18 @@ export class Player extends HTMLDivElement { } }); } + /** + * @overload + * @param { string } skill + * @param { SkillTrigger | string } [expire] + * @param { boolean } [checkConflict] + */ + /** + * @overload + * @param { string[] } skill + * @param { SkillTrigger } [expire] + * @param { boolean } [checkConflict] + */ addTempSkill(skill, expire, checkConflict) { if (Array.isArray(skill)) { for (var i = 0; i < skill.length; i++) { @@ -8417,6 +8511,18 @@ export class Player extends HTMLDivElement { } return evts; } + /** + * @overload + * @returns { ActionHistory } + */ + /** + * @template { keyof ActionHistory } T + * @overload + * @param { T } key + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { ActionHistory[T] } + */ getHistory(key, filter, last) { if (!key) return this.actionHistory[this.actionHistory.length - 1]; if (!filter) return this.actionHistory[this.actionHistory.length - 1][key]; @@ -8432,6 +8538,12 @@ export class Player extends HTMLDivElement { return history.filter(filter); } } + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] + */ checkHistory(key, filter, last) { if (!key || !filter) return; else { @@ -8447,7 +8559,14 @@ export class Player extends HTMLDivElement { } } } - hasHistory(key, filter, last) { + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { boolean } + */ + hasHistory(key, filter = lib.filter.all, last) { const history = this.getHistory(key); if (!filter || typeof filter != "function") filter = lib.filter.all; if (last) { @@ -8459,6 +8578,14 @@ export class Player extends HTMLDivElement { } return history.some(filter); } + /** + * @template { keyof ActionHistory } T + * @overload + * @param { T } [key] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { null | ActionHistory[T] | boolean } + */ getLastHistory(key, filter, last) { let history = false; for (let i = this.actionHistory.length - 1; i >= 0; i--) { @@ -8481,6 +8608,12 @@ export class Player extends HTMLDivElement { return history.filter(filter); } } + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] + */ checkAllHistory(key, filter, last) { if (!key || !filter) return; this.actionHistory.forEach((value) => { @@ -8496,6 +8629,13 @@ export class Player extends HTMLDivElement { } }); } + /** + * @template { keyof ActionHistory } T + * @param { T } [key] + * @param { (event: GameEventPromise) => boolean } [filter] + * @param { GameEventPromise } [last] + * @returns { ActionHistory[T] } + */ getAllHistory(key, filter, last) { const history = []; this.actionHistory.forEach((value) => { @@ -8517,6 +8657,13 @@ export class Player extends HTMLDivElement { } return history; } + /** + * @template { keyof ActionHistory } T + * @param { T } key + * @param { (event: GameEventPromise) => boolean } filter + * @param { GameEventPromise } [last] + * @returns { boolean } + */ hasAllHistory(key, filter, last) { return this.actionHistory.some((value) => { let history = value[key]; @@ -9096,6 +9243,12 @@ export class Player extends HTMLDivElement { } return false; } + /** + * + * @param { number | Card[] | Card } [add] + * @param { (card?: Card, player?: Player) => boolean } [filter] + * @param { boolean } [pure] + */ needsToDiscard(add, filter, pure) { /** * add: (逻辑上)同时考虑“获得”的这张/些牌 @@ -9124,9 +9277,23 @@ export class Player extends HTMLDivElement { distanceFrom(target, method) { return get.distance(target, this, method); } + /** + * @param { string } skill + * @param { Parameters[0] } arg2 + * @param { Parameters[1] } arg3 + * @param { Parameters[2] } arg4 + * @returns { boolean } + */ hasSkill(skill, arg2, arg3, arg4) { return game.expandSkills(this.getSkills(arg2, arg3, arg4)).includes(skill); } + /** + * @param { string } skill + * @param { Parameters[0] } arg1 + * @param { Parameters[1] } arg2 + * @param { Parameters[2] } arg3 + * @returns { boolean } + */ hasStockSkill(skill, arg1, arg2, arg3) { return game.expandSkills(this.getStockSkills(arg1, arg2, arg3)).includes(skill); } @@ -9153,6 +9320,11 @@ export class Player extends HTMLDivElement { } return false; } + /** + * + * @param {string} skill + * @param {Player} [player] + */ hasZhuSkill(skill, player) { if (!this.hasSkill(skill)) return false; if (player) { @@ -9187,6 +9359,12 @@ export class Player extends HTMLDivElement { } return false; } + /** + * @param {string} tag + * @param {Parameters[0]} hidden + * @param {Parameters[2]} arg + * @param {boolean} [globalskill] + */ hasSkillTag(tag, hidden, arg, globalskill) { var skills = this.getSkills(hidden); if (globalskill) { @@ -9281,6 +9459,11 @@ export class Player extends HTMLDivElement { } return false; } + /** + * + * @param {string|boolean} [respond] + * @param {boolean} [noauto] + */ hasSha(respond, noauto) { if (this.countCards("hs", "sha")) return true; if (this.countCards("hs", "hufu")) return true; @@ -10848,7 +11031,14 @@ export class Player extends HTMLDivElement { avatar ? 1600 : 1000 ); } - $damagepop(num, nature, font, nobroadcast) { + /** + * + * @param { number | string } num + * @param { string } [nature] + * @param { boolean } [font] + * @param { boolean } [nobroadcast] + */ + $damagepop(num, nature = "soil", font, nobroadcast) { if (typeof num == "number" || typeof num == "string") { game.addVideo("damagepop", this, [num, nature, font]); if (nobroadcast !== false) diff --git a/noname/ui/index.js b/noname/ui/index.js index 638e0ca9d..cc4a257d7 100644 --- a/noname/ui/index.js +++ b/noname/ui/index.js @@ -136,6 +136,10 @@ export class UI { * @type {HTMLDivElement} */ tempnowuxie; + /** + * @type {HTMLDivElement} + */ + cardPile; refresh(node) { void window.getComputedStyle(node, null).getPropertyValue("opacity"); } From a2d78f873b586c9052f924e730b85301852faad3 Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Sat, 20 Apr 2024 18:05:05 +0800 Subject: [PATCH 18/57] =?UTF-8?q?game.asyncDraw=E6=94=B9=E4=B8=BAasync?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=91=A8=E5=A6=83?= =?UTF-8?q?=E7=9A=84=E8=89=AF=E5=A7=BB=E6=8A=80=E8=83=BD=E4=BD=9C=E4=B8=BA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/shenhua.js | 173 +++++++++++++++++++++---------------------- noname/game/index.js | 13 ++-- 2 files changed, 90 insertions(+), 96 deletions(-) diff --git a/character/shenhua.js b/character/shenhua.js index 1c61beb90..37ae98e7d 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -458,9 +458,8 @@ game.import("character", function () { }, direct: true, usable: 1, - content() { - "step 0"; - player + async content(event, trigger, player) { + const { result: { bool, targets } } = await player .chooseTarget( get.prompt("olliangyin"), "选择一名其他角色,你与其各摸一张牌", @@ -479,32 +478,32 @@ game.import("character", function () { return 3 * att; return att; }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; + if (bool) { + const target = targets[0]; event.target = target; player.logSkill("olliangyin", target); - game.asyncDraw([player, target].sortBySeat()); - } else event.finish(); - "step 2"; - game.delayx(); - var num = player.getExpansions("olkongsheng").length; - var check = function (player) { + await game.asyncDraw([player, target].sortBySeat()); + } + else return; + await game.asyncDelayx(); + let num = player.getExpansions("olkongsheng").length; + let check = player => { if (!player.isIn() || player.isHealthy()) return false; return player.countCards("h") == num; }; + const { target } = event; if (check(player) || check(target)) { - var choiceList = [ + const choiceList = [ "令自己回复1点体力", "令" + get.translation(target) + "回复1点体力", ]; - var choices = []; + const choices = []; if (check(player)) choices.push("选项一"); else choiceList[0] = '' + choiceList[0] + ""; if (check(target)) choices.push("选项二"); else choiceList[1] = '' + choiceList[1] + ""; choices.push("cancel2"); - player + const { result : { control } } = await player .chooseControl(choices) .set("choiceList", choiceList) .set("prompt", "良姻:是否令一名角色回复体力?") @@ -520,10 +519,9 @@ game.import("character", function () { if (eff2 > 0) return "选项二"; return "cancel2"; }); - } else event.finish(); - "step 3"; - if (result.control == "选项一") player.recover(); - else if (result.control == "选项二") target.recover(); + if (control == "选项一") await player.recover(); + else if (control == "选项二") await target.recover(); + } }, group: "olliangyin_gain", subSkill: { @@ -547,90 +545,86 @@ game.import("character", function () { }); }, usable: 1, - content() { - "step 0"; + async content(event, trigger, player) { if ( !player.countCards("he") || - !game.hasPlayer(function (current) { - return current != player && current.countCards("he") > 0; - }) - ) - event.finish(); - else - player.chooseCardTarget({ - prompt: get.prompt("olliangyin"), - prompt2: "弃置一张牌,并令一名其他角色也弃置一张牌", - position: "he", - filterCard: lib.filter.cardDiscardable, - filterTarget(card, player, target) { - return target != player && target.countCards("he") > 0; - }, - ai1(card) { - let player = _status.event.player; - if (_status.event.me) { - if (get.position(card) === _status.event.me) - return 12 - player.hp - get.value(card); - return 0; - } - return 5 - get.value(card); - }, - ai2(target) { - let player = _status.event.player, - att = get.attitude(player, target); - if (att > 0 && (_status.event.me || target.isHealthy())) return -att; - if ( - att > 0 && - (target.countCards("he") > target.hp || - target.hasCard(function (card) { - return get.value(card, target) <= 0; - }, "e")) - ) - return att; - return -att; - }, - me: (function () { - if ( - player.isHealthy() || - get.recoverEffect(player, player, _status.event.player) <= 0 - ) - return false; - let ph = player.countCards("h"), - num = player.getExpansions("olkongsheng").length; - if (ph === num) { - if (player.hasSkillTag("noh")) return "h"; - return "e"; - } - if (ph - 1 === num) return "h"; + !game.hasPlayer(current => current != player && + current.countCards("he") > 0) + ) return; + const { result: { bool, targets, cards } } = await player.chooseCardTarget({ + prompt: get.prompt("olliangyin"), + prompt2: "弃置一张牌,并令一名其他角色也弃置一张牌", + position: "he", + filterCard: lib.filter.cardDiscardable, + filterTarget(card, player, target) { + return target != player && target.countCards("he") > 0; + }, + ai1(card) { + let player = _status.event.player; + if (_status.event.me) { + if (get.position(card) === _status.event.me) + return 12 - player.hp - get.value(card); + return 0; + } + return 5 - get.value(card); + }, + ai2(target) { + let player = _status.event.player, + att = get.attitude(player, target); + if (att > 0 && (_status.event.me || target.isHealthy())) return -att; + if ( + att > 0 && + (target.countCards("he") > target.hp || + target.hasCard(function (card) { + return get.value(card, target) <= 0; + }, "e")) + ) + return att; + return -att; + }, + me: (() => { + if ( + player.isHealthy() || + get.recoverEffect(player, player, _status.event.player) <= 0 + ) return false; - })(), - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; + let ph = player.countCards("h"), + num = player.getExpansions("olkongsheng").length; + if (ph === num) { + if (player.hasSkillTag("noh")) return "h"; + return "e"; + } + if (ph - 1 === num) return "h"; + return false; + })(), + }); + if (bool) { + const target = targets[0]; event.target = target; player.logSkill("olliangyin_gain", target); - player.discard(result.cards); - target.chooseToDiscard("he", true); - } else event.finish(); - "step 2"; - game.delayx(); - var num = player.getExpansions("olkongsheng").length; - var check = function (player) { + await player.discard(cards); + await target.chooseToDiscard("he", true); + } + else return; + await game.asyncDelayx(); + let num = player.getExpansions("olkongsheng").length; + let check = player => { if (!player.isIn() || player.isHealthy()) return false; return player.countCards("h") == num; }; + const { target } = event; if (check(player) || check(target)) { - var choiceList = [ + const choiceList = [ "令自己回复1点体力", "令" + get.translation(target) + "回复1点体力", ]; - var choices = []; + const choices = []; if (check(player)) choices.push("选项一"); else choiceList[0] = '' + choiceList[0] + ""; if (check(target)) choices.push("选项二"); else choiceList[1] = '' + choiceList[1] + ""; choices.push("cancel2"); - player + const { result: { control } } = await player .chooseControl(choices) .set("choiceList", choiceList) .set("prompt", "良姻:是否令一名角色回复体力?") @@ -648,10 +642,9 @@ game.import("character", function () { if (eff2 > 0) return "选项二"; return "cancel2"; }); - } else event.finish(); - "step 3"; - if (result.control == "选项一") player.recover(); - else if (result.control == "选项二") target.recover(); + if (control == "选项一") await player.recover(); + else if (control == "选项二") await target.recover(); + } }, }, }, diff --git a/noname/game/index.js b/noname/game/index.js index 16a193d3f..9053a1371 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -7491,16 +7491,17 @@ export class Game { * @param { { drawDeck: boolean } } [drawDeck] * @param { boolean } [bottom] */ - asyncDraw(players, num, drawDeck, bottom) { - return players.forEach((value, index) => { + async asyncDraw(players, num, drawDeck, bottom) { + for (let index = 0; index < players.length; index++) { + const value = players[index]; let num2 = 1; if (typeof num == "number") num2 = num; else if (Array.isArray(num)) num2 = num[index]; else if (typeof num == "function") num2 = num(value); - if (drawDeck && drawDeck.drawDeck) value.draw(num2, false, drawDeck); - else if (bottom) value.draw(num2, "nodelay", "bottom"); - else value.draw(num2, "nodelay"); - }); + if (drawDeck && drawDeck.drawDeck) await value.draw(num2, false, drawDeck); + else if (bottom) await value.draw(num2, "nodelay", "bottom"); + else await value.draw(num2, "nodelay"); + } } /** * @param { Player[] } players From 5d93081ed07fcc321aabdba566ccfde81e59fd3b Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 21:50:58 +0800 Subject: [PATCH 19/57] =?UTF-8?q?=E3=80=90=E7=82=BC=E9=AD=84=E3=80=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra.js | 5 ++--- character/refresh.js | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/character/extra.js b/character/extra.js index 443860763..6746813d8 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1421,8 +1421,7 @@ game.import("character", function () { group: "jxlianpo_show", *content(event, map) { var source = map.trigger.source; - source.draw(2); - source.recover(); + source.chooseDrawRecover(2, true); }, mark: true, intro: { @@ -10816,7 +10815,7 @@ game.import("character", function () { le_shen_jiaxu_prefix: "神", jxlianpo: "炼魄", jxlianpo_info: - "锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1,所有角色使用【杀】的次数上限和攻击范围+1;主忠,其他角色不能对其以外的角色使用【桃】。其他角色死亡后,若有多个最大阵营,来源摸两张牌并回复1点体力。②一轮游戏开始时,你展示一张未加入游戏或已死亡角色的身份牌,本轮视为该身份对应阵营的角色数+1。", + "锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1,所有角色使用【杀】的次数上限和攻击范围+1;主忠,其他角色不能对其以外的角色使用【桃】。若有多个最大阵营,其他角色死亡后,来源摸两张牌或回复1点体力。②一轮游戏开始时,你展示一张未加入游戏或已死亡角色的身份牌,本轮视为该身份对应阵营的角色数+1。", jxzhaoluan: "兆乱", jxzhaoluan_info: "限定技。一名角色死亡前,若其此次进入过濒死状态,你可以取消之,令其加3点体力上限并失去所有非锁定技,回复体力至3点,摸四张牌。然后你获得如下效果:出牌阶段,你可以令一名成为过你〖兆乱〗目标的角色减1点体力上限,然后对一名此阶段未以此法选择过的角色造成1点伤害。", diff --git a/character/refresh.js b/character/refresh.js index 8b8646886..cbcb65b29 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -18102,9 +18102,9 @@ game.import("character", function () { reluoyi_info: "你可以跳过摸牌阶段,然后亮出牌堆顶的三张牌,获得其中的基本牌、武器牌和【决斗】,若如此做,直到你的下回合开始,你为伤害来源的【杀】或【决斗】造成的伤害+1。", reganglie_info: - "当你受到1点伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害,;黑色,你弃置伤害来源一张牌。", + "当你受到1点伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害;黑色,你弃置伤害来源一张牌。", reganglie_info_guozhan: - "当你受到伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害,;黑色,你弃置伤害来源一张牌。", + "当你受到伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害;黑色,你弃置伤害来源一张牌。", botu: "博图", botu_info: "回合结束时,若你本回合出牌阶段内使用的牌包含四种花色,则你可以进行一个额外回合。", rebotu: "博图", From 4e9d0e9d058d339e6fc25bcf3a19cc90ff56c829 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 21:52:28 +0800 Subject: [PATCH 20/57] =?UTF-8?q?=E3=80=90=E6=83=8A=E6=BE=9C=E3=80=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index d1bc8a563..22102cd40 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -9905,7 +9905,7 @@ game.import("character", function () { var delta = player.countCards("h") - player.hp; if (delta > 0) player.chooseToDiscard("h", 4, true); else if (delta == 0) { - player.chooseToDiscard("h", true); + player.chooseToDiscard("he", true); player.recover(); } else { player.damage("fire", "nosource"); @@ -15868,7 +15868,7 @@ game.import("character", function () { lianzhou_info: "锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。", jinglan: "惊澜", jinglan_info: - "锁定技。当你造成伤害后,若你的手牌数:大于体力值,你弃置四张手牌;等于体力值,你弃置一张手牌并回复1点体力;小于体力值,你受到1点无来源火焰伤害并摸五张牌。", + "锁定技。当你造成伤害后,若你的手牌数:大于体力值,你弃置四张手牌;等于体力值,你弃置一张牌并回复1点体力;小于体力值,你受到1点无来源火焰伤害并摸五张牌。", dc_yanghu: "羊祜", dcdeshao: "德劭", dcdeshao_info: From 7e12f9d35c0f9e14f23d019ecfd5e75c32761288 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 22:01:05 +0800 Subject: [PATCH 21/57] =?UTF-8?q?=E8=B0=83=E6=95=B4=E3=80=90=E6=81=AF?= =?UTF-8?q?=E5=85=B5=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index 22102cd40..380fa70f4 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -14163,18 +14163,18 @@ game.import("character", function () { check: function (event, player) { var target = event.player; var att = get.attitude(player, target); - var num2 = Math.min(5, target.hp - target.countCards("h")); + var num2 = Math.min(5, target.hp) - target.countCards("h"); if (num2 <= 0) return att <= 0; var num = target.countCards("h", function (card) { return target.hasValueTarget(card, null, true); }); if (!num) return att > 0; - return num > num2; + return (num - num2) * att < 0; }, preHidden: true, content: function () { "step 0"; - var num = Math.min(5, trigger.player.hp - trigger.player.countCards("h")); + var num = Math.min(5, trigger.player.hp) - trigger.player.countCards("h"); if (num > 0) trigger.player.draw(num); "step 1"; trigger.player.addTempSkill("xibing2"); @@ -15731,9 +15731,9 @@ game.import("character", function () { "①当你受到伤害后,你可以摸一张牌,或和一名势力相同的其他角色各摸一张牌;②每回合限一次,当你造成伤害后,你可以对一名与你势力不同的角色造成1点伤害。", xibing: "息兵", xibing_info: - "当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸五张)且本回合不能再使用手牌。", + "当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)且本回合不能再使用手牌。", xibing_info_guozhan: - "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", + "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸至五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", luyusheng: "陆郁生", zhente: "贞特", zhente2: "贞特", From 1e029df1abd58d9e8ace921198ff7f51b225ed62 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 22:32:48 +0800 Subject: [PATCH 22/57] =?UTF-8?q?=E8=B0=83=E6=95=B4=E3=80=90=E5=AE=88?= =?UTF-8?q?=E6=88=90=E3=80=91=E3=80=90=E6=80=A5=E7=AD=B9=E3=80=91=E3=80=90?= =?UTF-8?q?=E5=8B=8B=E5=BE=B7=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 38 +++++++++++++------------------------- character/mobile.js | 6 +++--- character/tw.js | 4 ++-- 3 files changed, 18 insertions(+), 30 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index 380fa70f4..2aa470492 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -1536,38 +1536,26 @@ game.import("character", function () { return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; }); }, - direct: true, - async content(event, trigger, player) { + async cost(event, trigger, player) { const targetx = _status.currentPhase; const targets = game .filterPlayer((current) => { - if (targetx && current == targetx) return false; + if (targetx && current == targetx || !current.isIn()) return false; let evt = trigger.getl(current); return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; }) .sortBySeat(targetx || player); - for (const target of targets) { - if (!target.isIn()) continue; - const { - result: { bool }, - } = await player - .chooseBool(get.prompt2("dcshoucheng", target)) - .set("choice", get.attitude(player, target) > 0); - if (bool) { - player.logSkill("dcshoucheng", target); - if (target != player) player.addExpose(0.2); - target.draw(2); - } - } + event.result = await player + .chooseTarget("是否对" + (targets.length > 1 ? "其中一名角色" : get.translation(targets[0])) + "发动【守成】?", + "令其摸两张牌") + .set("ai", target => get.attitude(get.event(player), target)) + .forResult(); }, - ai: { - threaten(player, target) { - return Math.sqrt( - game.countPlayer((i) => { - return get.attitude(target, i) > 0; - }) - ); - }, + usable: 1, + async content(event, trigger, player) { + const target = event.targets[0]; + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); + target.draw(2); }, subSkill: { ai: { @@ -16244,7 +16232,7 @@ game.import("character", function () { dcshengxi: "生息", dcshengxi_info: "弃牌阶段结束时,若你本回合未造成过伤害,你可以摸两张牌。", dcshoucheng: "守成", - dcshoucheng_info: "一名角色于其回合外失去最后的手牌后,你可令其摸两张牌。", + dcshoucheng_info: "每回合限一次,当一名角色于其回合外失去手牌后,若其没有手牌,你可令其摸两张牌。", dc_liuli: "刘理", dcfuli: "抚黎", dcfuli_info: diff --git a/character/mobile.js b/character/mobile.js index dc1010d2a..5441f9d7a 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -9722,9 +9722,9 @@ game.import("character", function () { "step 1"; if (result.number < 7) { var source = trigger.source; - if (source && source.isIn() && source.countCards("he") > 0) { + if (source && source.isIn() && source.countCards("h") > 0) { player.line(source); - source.chooseToDiscard("he", true); + source.chooseToDiscard("h", true); } } }, @@ -20724,7 +20724,7 @@ game.import("character", function () { simafu: "司马孚", xunde: "勋德", xunde_info: - "一名角色受到伤害后,若你至其的距离不大于1,则你可判定。若判定结果:大于5,你令该角色获得判定牌;小于7,你令伤害来源弃置一张牌。", + "一名角色受到伤害后,若你至其的距离不大于1,则你可判定。若判定结果:大于5,你令该角色获得判定牌;小于7,你令伤害来源弃置一张手牌。", chenjie: "臣节", chenjie_info: "一名角色的判定牌生效前,你可打出一张花色相同的牌。系统将你打出的牌作为新判定牌,将原判定牌置入弃牌堆。然后你摸两张牌。", diff --git a/character/tw.js b/character/tw.js index e4e72e310..8ef63639e 100644 --- a/character/tw.js +++ b/character/tw.js @@ -5425,7 +5425,7 @@ game.import("character", function () { return val; }, prompt: () => "选择要交出的牌和要交给的目标", - selectCard: 1, + selectCard: [1, Infinity], discard: false, lose: false, delay: false, @@ -20495,7 +20495,7 @@ game.import("character", function () { tw_jiangji_prefix: "TW", twjichou: "急筹", twjichou_info: - "①每回合限一次。你可以视为使用一张未被〖急筹①〗记录过的普通锦囊牌并记录此牌。②你无法响应或{使用对应实体牌包含你的手牌的}〖急筹①〗记录过的锦囊牌。③出牌阶段限一次。你可将手牌中的一张〖急筹①〗记录过的锦囊牌交给其他角色。", + "①每回合限一次。你可以视为使用一张未被〖急筹①〗记录过的普通锦囊牌并记录此牌。②你无法响应或{使用对应实体牌包含你的手牌的}〖急筹①〗记录过的锦囊牌。③出牌阶段限一次。你可将手牌中任意张〖急筹①〗记录过的锦囊牌交给其他角色。", twjilun: "机论", twjilun_info: "当你受到伤害后,你可以摸X张牌(X为〖急筹①〗记录数且至少为1,至多为5),或视为使用一张〖急筹①〗记录过且未被〖机论〗记录过的普通锦囊牌并记录此牌。", From 707aca8959c8c27456dc527b4b0217ae1c61de39 Mon Sep 17 00:00:00 2001 From: copcap Date: Sat, 20 Apr 2024 00:01:10 +0800 Subject: [PATCH 23/57] =?UTF-8?q?=E7=A5=9E=E5=8D=8E=E4=BD=97bugfix?= =?UTF-8?q?=EF=BC=9B=E7=A5=9E=E9=B2=81=E8=82=83=E6=A6=BB=E8=B0=9F=E5=92=8C?= =?UTF-8?q?=E6=99=BA=E7=9B=9F=E5=86=8D=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra.js | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/character/extra.js b/character/extra.js index 6746813d8..c70a11367 100755 --- a/character/extra.js +++ b/character/extra.js @@ -126,7 +126,7 @@ game.import("character", function () { if (!skill || skill === "jingyu") return false; let info = get.info(skill); while (true) { - if (!info || info.charlotte) return false; + if (!info || info.charlotte || info.equipSkill) return false; if (info && !info.sourceSkill) break; skill = info.sourceSkill; info = get.info(skill); @@ -235,13 +235,13 @@ game.import("character", function () { if (["global", "equip"].includes(event.type)) return false; const skill = event.sourceSkill || event.skill; const info = get.info(skill); - return info && !info.charlotte; + return info && !info.charlotte && !info.equipSkill; }, forced: true, onremove: true, charlotte: true, async content(event, trigger, player) { - player.loseHp(player.countMark("lvxin_recover")); + player.recover(player.countMark("lvxin_recover")); player.removeSkill("lvxin_recover"); }, intro: { @@ -256,7 +256,7 @@ game.import("character", function () { if (["global", "equip"].includes(event.type)) return false; const skill = event.sourceSkill || event.skill; const info = get.info(skill); - return info && !info.charlotte; + return info && !info.charlotte && !info.equipSkill; }, forced: true, onremove: true, @@ -746,9 +746,9 @@ game.import("character", function () { filter(event, player) { return ( (event.name != "phase" || game.phaseNumber == 0) && - game.countPlayer(current => { - if (get.mode() != "doudizhu") return !current.isZhu2(); - return current.getSeatNum() != 3; + game.countPlayer((current) => { + if (get.mode() === "doudizhu") return current.getSeatNum() !== 3; + return !current.isZhu2(); }) > 1 ); }, @@ -757,8 +757,8 @@ game.import("character", function () { derivation: "tamo_faq", async content(event, trigger, player) { const toSortPlayers = game.filterPlayer((current) => { - if (get.mode() != "doudizhu") return !current.isZhu2(); - return current.getSeatNum() != 3; + if (get.mode() === "doudizhu") return current.getSeatNum() !== 3; + return !current.isZhu2(); }); toSortPlayers.sortBySeat(game.findPlayer2((current) => current.getSeatNum() == 1, true)); const next = player.chooseToMove("榻谟:是否分配" + @@ -900,7 +900,12 @@ game.import("character", function () { game.swapSeat(list[0], list[1], false); } }, toSwapList); - if (trigger.name === "phase" && !trigger.player.isZhu2() && trigger.player !== toSortPlayers[0] && !trigger._finished) { + if ( + trigger.name === "phase" && + !trigger.player.isZhu2() && + trigger.player !== toSortPlayers[0] && + !trigger._finished + ) { trigger.finish(); trigger._triggered = 5; const evt = toSortPlayers[0].insertPhase(); @@ -911,10 +916,7 @@ game.import("character", function () { } //跳过新回合的phaseBefore evt.pushHandler("onPhase", (event, option) => { - if ( - event.step === 0 && - option.state === "begin" - ) { + if (event.step === 0 && option.state === "begin") { event.step = 1; } }); @@ -929,7 +931,8 @@ game.import("character", function () { filter(event, player) { return game.hasPlayer(target => { if (target == player || target.countCards('h') + player.countCards('h') == 0) return false; - return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; + // return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; + return true; }); }, direct: true, @@ -942,7 +945,8 @@ game.import("character", function () { "与一名其他角色平分手牌", (card, player, target) => { if (target == player || target.countCards('h') + player.countCards('h') == 0) return false; - return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; + // return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; + return true; } ) .set("ai", (target) => { @@ -10841,17 +10845,13 @@ game.import("character", function () { dingzhou_info: "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数)。", tamo: "榻谟", - tamo_info: - "游戏开始时,你可以重新分配除主公外所有角色的座次。", - tamo_info_doudizhu: - "游戏开始时,你可以重新分配除三号位外所有角色的座次。", + tamo_info_doudizhu: "游戏开始时,你可以重新分配除三号位角色外所有角色的座次。", + tamo_info: "游戏开始时,你可以重新分配除主公外所有角色的座次。", tamo_faq: "FAQ", tamo_faq_info: "
  • Q:在一号位不为主公的情况下,〖榻谟〗如何结算?
  • A:该角色可以正常进行座次交换。若受此技能影响导致一号位角色发生了变化,则以排列后的一号位角色为起始角色开始本局游戏。
  • ", zhimeng: "智盟", zhimeng_info: - "回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", - zhimeng_info_identity: "回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", shen_xuzhu: "神许褚", shen_xuzhu_prefix: "神", From b59fc7d7cd69cb51886651171071fc663613ff79 Mon Sep 17 00:00:00 2001 From: copcap Date: Sat, 20 Apr 2024 00:07:57 +0800 Subject: [PATCH 24/57] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=86=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=89=8B=E7=89=8C=E4=BD=9C=E4=B8=BA=E4=BA=94=E8=B0=B7?= =?UTF-8?q?=E4=BA=AE=E5=87=BA=E7=89=8C=E7=9B=B8=E5=85=B3=E7=9A=84loseAsync?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8D=E4=B8=BA=E6=AD=A3=E9=9D=A2=E5=90=91?= =?UTF-8?q?=E4=B8=8A=E5=A4=B1=E5=8E=BB=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- card/standard.js | 1 + 1 file changed, 1 insertion(+) diff --git a/card/standard.js b/card/standard.js index 9ea1a0d37..cb42ca830 100644 --- a/card/standard.js +++ b/card/standard.js @@ -1007,6 +1007,7 @@ game.import("card", function () { }); game.loseAsync({ lose_list: lose_list, + visible: true, }).setContent("chooseToCompareLose"); } if (cards2.length) game.cardsGotoOrdering(cards2); From ce37dab302f39e2eded8fbfba955e7605869f7d4 Mon Sep 17 00:00:00 2001 From: copcap Date: Sat, 20 Apr 2024 00:36:32 +0800 Subject: [PATCH 25/57] =?UTF-8?q?SP=E7=94=84=E5=A7=AC=E5=8E=9F=E7=94=BB?= =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image/character/sp_zhenji.jpg | Bin 0 -> 80577 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 image/character/sp_zhenji.jpg diff --git a/image/character/sp_zhenji.jpg b/image/character/sp_zhenji.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ce90fb419c33a3cd07435aedfc9b8d964792248 GIT binary patch literal 80577 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

    NXiVU{e%;%U(m0{{SiIa#SgY7jqQz-Nuvp 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 literal 0 HcmV?d00001 From 39af1a521240d8f59b8bc6fcfbf0742a52702ea2 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Sat, 20 Apr 2024 23:06:19 +0800 Subject: [PATCH 26/57] =?UTF-8?q?=E8=B0=83=E6=95=B4=E3=80=90=E5=BA=94?= =?UTF-8?q?=E6=97=B6=E3=80=91=EF=BC=8C=E4=BF=AE=E5=A4=8Dui/index.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 30 +++++++++++++----------------- noname/ui/index.js | 1 + 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index 2aa470492..72a1c7331 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -1063,39 +1063,30 @@ game.import("character", function () { filter(event, player) { if (!event.isFirstTarget) return false; if (get.type(event.card) !== "trick") return false; - const evt = event.getParent(); - const evts = game.getGlobalHistory("useCard", null, evt).slice().remove(evt); - return event.targets.some((target) => { - return evts.some((evt) => evt.targets.includes(target)); - }); + return true; }, direct: true, async content(event, trigger, player) { - const evt = trigger.getParent(); - const evts = game.getGlobalHistory("useCard", null, evt).slice().remove(evt); - const chooseableTargets = trigger.targets.filter((target) => { - return evts.some((evt) => evt.targets.includes(target)); - }); const result = await player .chooseTarget() .set("prompt", get.prompt("dcyingshi")) .set( "prompt2", - `令一名可选角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation( + `令其中一名角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation( trigger.card.name )};⒉弃置${get.cnNumber(player.countCards("e"))}张牌,此牌对其无效。` ) .set("filterTarget", (card, player, target) => { return get.event("targets").includes(target); }) - .set("targets", chooseableTargets) + .set("targets", trigger.targets) .set( "toFriends", (() => { - const isPositive = chooseableTargets.some((current) => { + const isPositive = trigger.targets.some((current) => { return get.effect(current, trigger.card, trigger.player, player) > 0; }), - isNegative = chooseableTargets.some((current) => { + isNegative = trigger.targets.some((current) => { return get.effect(current, trigger.card, trigger.player, player) < -5; }); if ( @@ -1547,8 +1538,13 @@ game.import("character", function () { .sortBySeat(targetx || player); event.result = await player .chooseTarget("是否对" + (targets.length > 1 ? "其中一名角色" : get.translation(targets[0])) + "发动【守成】?", - "令其摸两张牌") - .set("ai", target => get.attitude(get.event(player), target)) + "令其摸两张牌", + (card, player, target) => { + return get.event("targets").includes(target); + } + ) + .set("targets", targets) + .set("ai", target => get.attitude(get.event("player"), target)) .forResult(); }, usable: 1, @@ -16252,7 +16248,7 @@ game.import("character", function () { "其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。", dcyingshi: "应时", dcyingshi_info: - "每回合每项各限一次。当你使用普通锦囊牌指定第一个目标后,若有目标不为本回合第一次成为牌的目标,则你可以令其选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。", + "每回合每项各限一次。当你使用普通锦囊牌指定目标后,你可令其中一个目标选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。", dc_wangling: "王淩", dcjichou: "集筹", dcjichou_info: diff --git a/noname/ui/index.js b/noname/ui/index.js index aedd06936..2d524574e 100644 --- a/noname/ui/index.js +++ b/noname/ui/index.js @@ -141,6 +141,7 @@ export class UI { */ toastQueue = []; + /** * @type {HTMLDivElement} */ cardPile; From c9fe123b9021058faeb943803e46037827f4a9a6 Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 00:43:24 +0800 Subject: [PATCH 27/57] =?UTF-8?q?=E6=97=8F=E9=92=9F=E7=B9=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/clan.js | 326 +++++++++++++++++++++++++++++++++++++--------- character/rank.js | 2 + 2 files changed, 268 insertions(+), 60 deletions(-) diff --git a/character/clan.js b/character/clan.js index c99823343..1a6400698 100644 --- a/character/clan.js +++ b/character/clan.js @@ -73,6 +73,8 @@ game.import("character", function () { ["clantanque", "clanshengmo", "clanzhongliu"], ["clan:太原王氏"], ], + //笑点解析——群雄 + clan_zhongyao: ["male", "qun", 3, ["clanchengqi", "clanjieli", "clanbaozu"], ["clan:颍川钟氏"]], }, characterSort: { clan: { @@ -87,11 +89,208 @@ game.import("character", function () { "clan_wangguang", "clan_wangmingshan", ], - clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu"], + clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"], }, }, /** @type { importCharacterConfig['skill'] } */ skill: { + //族钟繇 + clanchengqi: { + hiddenCard(player, name) { + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + if (player.getStorage("clanchengqi_effect").includes(name)) return false; + return player.countCards("hs") > 1 && lib.inpile.includes(name); + }, + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if (player.countCards("hs") < 2) return false; + return get.inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return !player.getStorage("clanchengqi_effect").includes(name); + }).some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + }, + chooseButton: { + dialog(event, player) { + const list = get.inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return !player.getStorage("clanchengqi_effect").includes(name); + }).filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + return ui.create.dialog("承启", [list, "vcard"]); + }, + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get.event("player").getUseValue({ name: button.link[2], nature: button.link[3] }); + }, + backup(links, player) { + return { + audio: "clanchengqi", + filterCard: true, + complexCard: true, + selectCard: [2, Infinity], + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + filterOk() { + return (ui.selected.cards || []).reduce((sum, card) => { + return sum + get.cardNameLength(card); + }, 0) >= get.cardNameLength(lib.skill.clanchengqi_backup.viewAs.name); + }, + check(card) { + const player = get.event("player"); + const name = lib.skill.clanchengqi_backup.viewAs.name; + if (ui.selected.cards.length > 1 || card.name == name) return 0; + if (ui.selected.cards.length && game.hasPlayer(target => { + return get.effect(target, { name: "draw" }, player, player) > 0; + })) { + if (get.cardNameLength(name) <= get.cardNameLength(card) + get.cardNameLength(ui.selected.cards[0])) { + return 10 / (get.value(card) || 0.5); + } + } + return 1 / (get.value(card) || 0.5); + }, + position: "hs", + precontent() { + player.addTempSkill("clanchengqi_effect"); + player.markAuto("clanchengqi_effect", [event.result.card.name]); + }, + }; + }, + }, + ai: { + order(item, player) { + if (player && get.event().type == "phase") { + let list = get.inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return !player.getStorage("clanchengqi_effect").includes(name); + }).map(card => { return { name: card[2], nature: card[3] } }).filter(card => player.getUseValue(card, true, true) > 0); + if (!list.length) return 0; + list.sort((a, b) => (player.getUseValue(b, true, true) || 0) - (player.getUseValue(a, true, true) || 0)); + return get.order(list[0], player) * 0.99; + } + return 0.001; + }, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + const name = tag == "respondSha" ? "sha" : "shan"; + return get.info("clanchengqi").hiddenCard(player, name); + }, + result: { player: 1 }, + }, + subSkill: { + backup: { audio: "clanchengqi" }, + effect: { + charlotte: true, + onremove: true, + trigger: { player: "useCard" }, + filter(event, player) { + return event.skill == "clanchengqi_backup" && get.cardNameLength(event.card) == (event.cards || []).reduce((sum, card) => { + return sum + get.cardNameLength(card); + }, 0); + }, + async cost(event, trigger, player) { + event.result = await player.chooseTarget("承启:是否令一名角色摸一张牌?").set('ai', target => { + const player = get.event("player"); + return get.effect(target, { name: "draw" }, player, player); + }).forResult(); + }, + popup: false, + content() { + player.line(event.targets); + event.targets[0].draw(); + }, + }, + }, + }, + clanjieli: { + audio: 2, + trigger: { player: 'phaseJieshuBegin' }, + filter(event, player) { + return game.hasPlayer(target => { + return target.countCards("h"); + }); + }, + async cost(event, trigger, player) { + let num = 0; + if (player.getHistory("useCard").length) { + for (const history of player.getHistory("useCard")) { + if (num < get.cardNameLength(history.card)) { + num = get.cardNameLength(history.card); + } + } + } + const str = (num > 0 ? ("并观看牌堆顶" + get.cnNumber(num) + "张牌,然后你可以交换其中等量的牌") : ""); + event.result = await player.chooseTarget(get.prompt("clanjieli"), "观看一名角色的牌名字数最多的手牌" + str, (card, player, target) => { + return target.countCards("h"); + }).set('ai', target => { + const player = get.event("player"); + return get.effect(target, { name: "draw" }, player, player); + }).forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + let num = 0; + if (player.getHistory("useCard").length) { + for (const history of player.getHistory("useCard")) { + if (num < get.cardNameLength(history.card)) { + num = get.cardNameLength(history.card); + } + } + } + let map = {}; + for (const i of target.getCards("h")) { + if (!map[get.cardNameLength(i)]) { + map[get.cardNameLength(i)] = 0; + } + map[get.cardNameLength(i)]++; + } + const num2 = Object.keys(map).sort((a, b) => map[b] - map[a])[0]; + const cards = target.getCards("he", card => get.cardNameLength(card) == num2); + if (num > 0 && cards.length >= num) { + const topCards = get.cards(num); + game.updateRoundNumber(); + const result = await player.chooseToMove( + "诫厉:交换其中" + get.cnNumber(num) + "张牌" + ).set("list", [ + [get.translation(target) + "牌名字数最多的手牌", cards, "dcsushou_tag"], + ["牌堆顶", topCards], + ]).set("filterMove", (from, to) => { + return typeof to != "number"; + }).set('num', num).set("filterOk", moved => { + return moved[1].every(card => get.owner(card)); + }).set("processAI", list => { + const player = get.event("player"), target = get.event().getParent().targets[0]; + const sgn = get.sgn(get.sgn(get.attitude(player, target)) - 0.5); + const cards1 = list[0][1].slice().sort((a, b) => get.value(a, "raw") * sgn - get.value(b, "raw") * sgn); + const cards2 = list[1][1].slice().sort((a, b) => get.value(b, "raw") * sgn - get.value(a, "raw") * sgn); + return [cards1.slice().addArray(cards2.slice(0, get.event("num"))), cards2.slice().addArray(cards1.slice(0, get.event("num")))]; + }).forResult(); + if (result.bool) { + const lose = result.moved[1].slice(); + const gain = result.moved[0].slice().filter(i => !get.owner(i)); + if (lose.length) await target.lose(lose, ui.special); + for (let i = lose.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(lose[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + if (gain.length) await target.gain(gain, "draw"); + } + } + else { + const topCards = get.cards(num, true); + game.updateRoundNumber(); + const content = [get.translation(target) + "牌名字数最多的手牌", cards, "牌堆顶", topCards]; + await player.chooseControl("ok").set("dialog", content); + } + }, + }, //族王明山 clantanque: { audio: 2, @@ -179,9 +378,9 @@ game.import("character", function () { filter(event, player) { if (event.responded) return false; const names = lib.inpile.filter( - (name) => - get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name) - ), + (name) => + get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name) + ), cards = get.event("clanshengmo_cards") || []; return ( cards.length > 0 && @@ -216,9 +415,9 @@ game.import("character", function () { async content(event, trigger, player) { const evt = event.getParent(2); const names = lib.inpile.filter( - (name) => - get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name) - ), + (name) => + get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name) + ), cards = evt.clanshengmo_cards; const links = await player .chooseButton(["剩墨:获得其中一张牌", cards], true) @@ -276,7 +475,7 @@ game.import("character", function () { evt.set("norestore", true); evt.set("custom", { add: {}, - replace: { window() {} }, + replace: { window() { } }, }); evt.goto(0); }, @@ -428,8 +627,8 @@ game.import("character", function () { let str = ""; const card = new lib.element.VCard({ name: "sha" }); const targets = game.filterPlayer((target) => { - return event.player.getPrevious() == target || event.player.getNext() == target; - }), + return event.player.getPrevious() == target || event.player.getNext() == target; + }), bool = !targets.some((target) => { return target.getHistory("useCard").length; }), @@ -455,8 +654,8 @@ game.import("character", function () { check(event, player) { const card = new lib.element.VCard({ name: "sha" }); const targets = game.filterPlayer((target) => { - return event.player.getPrevious() == target || event.player.getNext() == target; - }), + return event.player.getPrevious() == target || event.player.getNext() == target; + }), bool = !targets.some((target) => { return target.getHistory("useCard").length; }), @@ -481,10 +680,10 @@ game.import("character", function () { player.awakenSkill("clanjianji"); const card = new lib.element.VCard({ name: "sha" }); const targets = game.filterPlayer((target) => { - return ( - trigger.player.getPrevious() == target || trigger.player.getNext() == target - ); - }), + return ( + trigger.player.getPrevious() == target || trigger.player.getNext() == target + ); + }), boolx = !targets.some((target) => { return target.getHistory("useCard").length; }), @@ -507,7 +706,7 @@ game.import("character", function () { .set( "choice", get.attitude(player, trigger.player) > 0 || - trigger.player.countCards("h") > player.countCards("h") + trigger.player.countCards("h") > player.countCards("h") ); if (bool) draw = true; } else draw = true; @@ -546,9 +745,9 @@ game.import("character", function () { .set( "prompt", "当前手牌点数和为" + - player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) + - "," + - get.prompt("clanqiajue") + player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) + + "," + + get.prompt("clanqiajue") ) .set( "prompt2", @@ -972,7 +1171,7 @@ game.import("character", function () { return false; return ( get.effect(target, card, player, player) + - get.effect(target, { name: "draw" }, player, player) > + get.effect(target, { name: "draw" }, player, player) > 0 ); }); @@ -1130,10 +1329,10 @@ game.import("character", function () { .set( "dying", player.hp + - player.countCards("hs", { - name: ["tao", "jiu"], - }) < - 1 + player.countCards("hs", { + name: ["tao", "jiu"], + }) < + 1 ) .set("num", event.num1); } else event.finish(); @@ -1353,7 +1552,7 @@ game.import("character", function () { next.set("_backupevent", "clanfuxun_backup"); next.set("custom", { add: {}, - replace: { window() {} }, + replace: { window() { } }, }); next.backup("clanfuxun_backup"); } @@ -2488,13 +2687,13 @@ game.import("character", function () { if (eff > 0) return eff; return Math.max( 2 * get.effect(target, { name: "draw" }, player, player) + - 0.6 * get.effect(player, { name: "draw" }, player, player), + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player) ); } return Math.max( 2 * get.effect(target, { name: "draw" }, player, player) + - 0.6 * get.effect(player, { name: "draw" }, player, player), + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player) ); }) @@ -2503,10 +2702,10 @@ game.import("character", function () { player.countCards("hs", (card) => { return get.name(card) == "jiu" && player.hasUseTarget(card); }) && - player.countCards("hs", (card) => { - if (get.name(card) != "sha") return false; - return game.hasNature(card, "linked"); - }) + player.countCards("hs", (card) => { + if (get.name(card) != "sha") return false; + return game.hasNature(card, "linked"); + }) ); "step 1"; if (result.bool) { @@ -2782,11 +2981,11 @@ game.import("character", function () { trigger.player .chooseCard( "连和:交给" + - get.translation(player) + - get.cnNumber(num - 1) + - "张牌,或点“取消”令其摸" + - get.cnNumber(num + 1) + - "张牌", + get.translation(player) + + get.cnNumber(num - 1) + + "张牌,或点“取消”令其摸" + + get.cnNumber(num + 1) + + "张牌", num - 1, pos ) @@ -2966,8 +3165,8 @@ game.import("character", function () { .chooseTarget( "三恇:选择一名其他角色", "令其交给你至少X张牌" + - (cards.length ? ",然后其获得" + get.translation(cards) : "") + - "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)", + (cards.length ? ",然后其获得" + get.translation(cards) : "") + + "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)", true, lib.filter.notMe ) @@ -3007,15 +3206,15 @@ game.import("character", function () { "prompt", num > 0 ? "是否交给" + - get.translation(player) + - "任意张牌" + - (cards.length ? "并获得" + get.translation(cards) : "") + - "?" + get.translation(player) + + "任意张牌" + + (cards.length ? "并获得" + get.translation(cards) : "") + + "?" : "交给" + - get.translation(player) + - "至少" + - get.cnNumber(num) + - "张牌" + get.translation(player) + + "至少" + + get.cnNumber(num) + + "张牌" ); } } else event.finish(); @@ -3194,19 +3393,19 @@ game.import("character", function () { next.set( "openskilldialog", "将" + - get.cnNumber(cards.length) + - "张牌当做" + - (get.translation(nature) || "") + - "【" + - get.translation(name) + - "】使用" + get.cnNumber(cards.length) + + "张牌当做" + + (get.translation(nature) || "") + + "【" + + get.translation(name) + + "】使用" ); next.set("norestore", true); next.set("addCount", false); next.set("_backupevent", "clanshenjun_backup"); next.set("custom", { add: {}, - replace: { window() {} }, + replace: { window() { } }, }); next.backup("clanshenjun_backup"); } @@ -3405,7 +3604,7 @@ game.import("character", function () { filter(event, player) { return player.getStorage("clanfenchai").length; }, - content() {}, + content() { }, }, }, mod: { @@ -3441,8 +3640,8 @@ game.import("character", function () { return ( num > 0 && num == - player.getDiscardableCards(player, "h").filter((i) => get.name(i) == link) - .length + player.getDiscardableCards(player, "h").filter((i) => get.name(i) == link) + .length ); }, check(button) { @@ -3830,8 +4029,8 @@ game.import("character", function () { player .chooseTarget( "蹈节:将" + - get.translation(trigger.cards.filterInD()) + - "交给一名颍川荀氏角色", + get.translation(trigger.cards.filterInD()) + + "交给一名颍川荀氏角色", true, (card, player, target) => { return target == player || target.hasClan("颍川荀氏"); @@ -3924,7 +4123,7 @@ game.import("character", function () { player.countCards("h", function (card) { return lib.skill.clanyirong.checkx(card) > 0; }) + - 1 < + 1 < player.countCards("h") - player.getHandcardLimit() ) return 0; @@ -4284,6 +4483,13 @@ game.import("character", function () { clanshengmo: "剩墨", clanshengmo_info: "当你需要使用一张未以此法使用过的基本牌时,你可以获得一张于本回合进入弃牌堆且点数不为这些牌中最大且不为这些牌中最小的牌,视为你使用需要使用的牌。", + clan_zhongyao: "族钟繇", + clan_zhongyao_prefix: "族", + clanchengqi: "承启", + clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", + clanjieli: "诫厉", + clanjieli_info: "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶X张牌,然后你可以交换其中的X张牌(X为你本回合使用过的牌中的牌名字数最大值)。", + clan_wu: "陈留·吴氏", clan_xun: "颍川·荀氏", diff --git a/character/rank.js b/character/rank.js index 3ad34972e..76252d8b8 100644 --- a/character/rank.js +++ b/character/rank.js @@ -142,6 +142,7 @@ window.noname_character_rank = { "dc_shen_huatuo", "sp_zhenji", "wu_guanyu", + "clan_zhongyao", ], a: [ "star_caoren", @@ -1916,6 +1917,7 @@ window.noname_character_rank = { "wu_guanyu", ], epic: [ + "clan_zhongyao", "dc_caoshuang", "tianchou", "star_yuanshao", From 4dbe771586133be15238778f5c14a3384e80a6af Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 00:44:35 +0800 Subject: [PATCH 28/57] =?UTF-8?q?=E6=97=8F=E9=92=9F=E4=BC=9A=E3=80=90?= =?UTF-8?q?=E6=8C=9F=E6=9C=AF=E3=80=91bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/clan.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/character/clan.js b/character/clan.js index 1a6400698..ab8296e3f 100644 --- a/character/clan.js +++ b/character/clan.js @@ -1366,7 +1366,7 @@ game.import("character", function () { str = ""; if (player.getDamagedHp() > 0) str += ",然后摸" + get.cnNumber(player.getDamagedHp()) + "张牌"; - player + event.result=await player .chooseToDiscard( get.prompt("clanxieshu"), "横置武将牌并弃置" + get.cnNumber(num) + "张牌" + str, From 27e269ec160985e96c522dab24bb0ad864cb4fd5 Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 00:46:20 +0800 Subject: [PATCH 29/57] =?UTF-8?q?=E7=A5=9E=E9=B2=81=E8=82=83=E5=8F=88?= =?UTF-8?q?=E5=8F=8C=E5=8F=92=E5=8F=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/character/extra.js b/character/extra.js index c70a11367..acd1b10ee 100755 --- a/character/extra.js +++ b/character/extra.js @@ -33,7 +33,7 @@ game.import("character", function () { character: { dc_shen_huatuo: ["male", "shen", 3, ["jingyu", "lvxin", "huandao"], ["qun"]], shen_xuzhu: ["male", "shen", 5, ["zhengqing", "zhuangpo"], ["wei"]], - shen_lusu: ["male", "shen", 3, ["dingzhou", "tamo", "zhimeng"], ["wu"]], + shen_lusu: ["male", "shen", 3, ["tamo", "dingzhou", "zhimeng"], ["wu"]], shen_huatuo: ["male", "shen", 3, ["wuling", "youyi"], ["qun"]], le_shen_jiaxu: ["male", "shen", 4, ["jxlianpo", "jxzhaoluan"], ["qun"]], shen_dianwei: ["male", "shen", 4, ["juanjia", "qiexie", "cuijue"], ["wei"]], @@ -715,7 +715,7 @@ game.import("character", function () { eff = ui.selected.cards .map((card) => get.value(card)) .reduce((p, c) => p + c, 0); - if (player.hasSkill("zhimeng")) eff *= 1 + get.sgnAttitude(player, target) * 0.15; + if (player.hasSkill("zhimeng") && (get.mode() == 'identity' || (player.countCards('h') - target.countCards('h') > 2 * ui.selected.cards.length))) eff *= 1 + get.sgnAttitude(player, target) * 0.15; const es = target.getCards("e"), js = target.getCards("j"); es.forEach((card) => { @@ -931,8 +931,7 @@ game.import("character", function () { filter(event, player) { return game.hasPlayer(target => { if (target == player || target.countCards('h') + player.countCards('h') == 0) return false; - // return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; - return true; + return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; }); }, direct: true, @@ -945,8 +944,7 @@ game.import("character", function () { "与一名其他角色平分手牌", (card, player, target) => { if (target == player || target.countCards('h') + player.countCards('h') == 0) return false; - // return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; - return true; + return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; } ) .set("ai", (target) => { @@ -10845,14 +10843,16 @@ game.import("character", function () { dingzhou_info: "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数)。", tamo: "榻谟", - tamo_info_doudizhu: "游戏开始时,你可以重新分配除三号位角色外所有角色的座次。", tamo_info: "游戏开始时,你可以重新分配除主公外所有角色的座次。", + tamo_info_doudizhu: "游戏开始时,你可以重新分配除三号位角色外所有角色的座次。", tamo_faq: "FAQ", tamo_faq_info: "

  • Q:在一号位不为主公的情况下,〖榻谟〗如何结算?
  • A:该角色可以正常进行座次交换。若受此技能影响导致一号位角色发生了变化,则以排列后的一号位角色为起始角色开始本局游戏。
  • ", zhimeng: "智盟", - zhimeng_info: + zhimeng_info_identity: "回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", + zhimeng_info: + "回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", shen_xuzhu: "神许褚", shen_xuzhu_prefix: "神", zhengqing: "争擎", From d7a57a37ca39b448efcf4107728b4a687058372e Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 00:51:56 +0800 Subject: [PATCH 30/57] =?UTF-8?q?=E8=B0=8B=E6=9B=B9=E4=B8=95=E3=80=90?= =?UTF-8?q?=E6=94=BE=E9=80=90=E3=80=91=E9=80=89=E9=A1=B9=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E9=94=99=E8=AF=AFbugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/sb.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/character/sb.js b/character/sb.js index 519e02fdc..57a039e83 100644 --- a/character/sb.js +++ b/character/sb.js @@ -1424,22 +1424,21 @@ game.import("character", function () { player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num + 4)); switch (num) { case 1: - case 2: + case 5: case 6: - const type = ["basic", "equip", "trick"][[1, 2, 6].indexOf(num)]; + const type = ["basic", "equip", "trick"][[1, 5, 6].indexOf(num)]; target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); target.markAuto("sbfangzhu_ban", [type]); break; + case 2: + target.addTempSkill("baiban", { player: "phaseEnd" }); + break; case 3: target.addTempSkill("sbfangzhu_kill", { player: "phaseEnd" }); break; case 4: target.turnOver(); break; - case 5: - target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); - target.markAuto("sbfangzhu_ban", ["equip"]); - break; } }, ai: { From dbe0847053abe25632ce808bb735882ccc7893c9 Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 01:02:16 +0800 Subject: [PATCH 31/57] =?UTF-8?q?=E6=97=8F=E9=92=9F=E7=B9=87=E5=8E=9F?= =?UTF-8?q?=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/clan.js | 17 +++++++++++++---- image/character/clan_zhongyao.jpg | Bin 0 -> 60947 bytes 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 image/character/clan_zhongyao.jpg diff --git a/character/clan.js b/character/clan.js index ab8296e3f..6c9b05290 100644 --- a/character/clan.js +++ b/character/clan.js @@ -230,9 +230,18 @@ game.import("character", function () { event.result = await player.chooseTarget(get.prompt("clanjieli"), "观看一名角色的牌名字数最多的手牌" + str, (card, player, target) => { return target.countCards("h"); }).set('ai', target => { - const player = get.event("player"); - return get.effect(target, { name: "draw" }, player, player); - }).forResult(); + const player = get.event("player"), num = get.event('num'); + let map = {}; + for (const i of target.getCards("h")) { + if (!map[get.cardNameLength(i)]) { + map[get.cardNameLength(i)] = 0; + } + map[get.cardNameLength(i)]++; + } + const num2 = Object.keys(map).sort((a, b) => map[b] - map[a])[0]; + if (num >= num2) return target.countCards('h') * 5 * get.sgn(get.sgn(get.attitude(player, target)) - 0.5); + return -target.countCards('h'); + }).set('num', num).forResult(); }, async content(event, trigger, player) { const target = event.targets[0]; @@ -1366,7 +1375,7 @@ game.import("character", function () { str = ""; if (player.getDamagedHp() > 0) str += ",然后摸" + get.cnNumber(player.getDamagedHp()) + "张牌"; - event.result=await player + event.result = await player .chooseToDiscard( get.prompt("clanxieshu"), "横置武将牌并弃置" + get.cnNumber(num) + "张牌" + str, diff --git a/image/character/clan_zhongyao.jpg b/image/character/clan_zhongyao.jpg new file mode 100644 index 0000000000000000000000000000000000000000..face96ba0ecb9ea63650d2cb4127fab34283db30 GIT binary patch literal 60947 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 n)8z8UmlVW<>%pscGK6d*07)k# Date: Sun, 21 Apr 2024 09:54:41 +0800 Subject: [PATCH 32/57] =?UTF-8?q?=E6=97=8F=E9=92=9F=E7=B9=87=E6=8A=80?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/clan.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/character/clan.js b/character/clan.js index 6c9b05290..4eaddce5c 100644 --- a/character/clan.js +++ b/character/clan.js @@ -160,6 +160,9 @@ game.import("character", function () { }, }; }, + prompt(links, player) { + return "将至少两张牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】使用"; + }, }, ai: { order(item, player) { @@ -293,9 +296,13 @@ game.import("character", function () { } } else { - const topCards = get.cards(num, true); - game.updateRoundNumber(); - const content = [get.translation(target) + "牌名字数最多的手牌", cards, "牌堆顶", topCards]; + let content = ['
    ' + get.translation(target) + "牌名字数最多的手牌
    ", cards]; + if (num > 0) { + const topCards = get.cards(num, true); + game.updateRoundNumber(); + content.push('
    牌堆顶
    '); + content.push(topCards); + } await player.chooseControl("ok").set("dialog", content); } }, From 62797a75bf2f57cd8555ea6912e8550509443503 Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 10:23:06 +0800 Subject: [PATCH 33/57] =?UTF-8?q?=E6=97=8F=E9=92=9F=E7=B9=87=E3=80=90?= =?UTF-8?q?=E8=AF=AB=E5=8E=89=E3=80=91bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/clan.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/character/clan.js b/character/clan.js index 4eaddce5c..9df46279e 100644 --- a/character/clan.js +++ b/character/clan.js @@ -241,9 +241,12 @@ game.import("character", function () { } map[get.cardNameLength(i)]++; } - const num2 = Object.keys(map).sort((a, b) => map[b] - map[a])[0]; - if (num >= num2) return target.countCards('h') * 5 * get.sgn(get.sgn(get.attitude(player, target)) - 0.5); - return -target.countCards('h'); + let list = Object.keys(map).sort((a, b) => map[b] - map[a]); + list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i)); + if (num >= target.countCards("h", card => { + return list.includes(get.cardNameLength(card)); + })) return target.countCards("h") * 5 * get.sgn(get.sgn(get.attitude(player, target)) - 0.5); + return -target.countCards("h"); }).set('num', num).forResult(); }, async content(event, trigger, player) { @@ -263,8 +266,11 @@ game.import("character", function () { } map[get.cardNameLength(i)]++; } - const num2 = Object.keys(map).sort((a, b) => map[b] - map[a])[0]; - const cards = target.getCards("he", card => get.cardNameLength(card) == num2); + let list = Object.keys(map).sort((a, b) => map[b] - map[a]); + list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i)); + const cards = target.getCards("h", card => { + return list.includes(get.cardNameLength(card)); + }); if (num > 0 && cards.length >= num) { const topCards = get.cards(num); game.updateRoundNumber(); From bd0e7a52ad8e4f431d7666576a3581ea32a13fbd Mon Sep 17 00:00:00 2001 From: awnlzw Date: Sun, 21 Apr 2024 10:25:23 +0800 Subject: [PATCH 34/57] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dissue=20#1247:=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8F=8D=E5=90=91=E4=BB=A3=E7=90=86=E6=9C=89?= =?UTF-8?q?=E5=AD=90=E8=B7=AF=E5=BE=84=E6=97=B6=EF=BC=8CserviceWorker?= =?UTF-8?q?=E7=9A=84scope=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/game.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/game.js b/game/game.js index b682ef2f2..48eb3c44b 100644 --- a/game/game.js +++ b/game/game.js @@ -244,7 +244,7 @@ new Promise((resolve) => { "serviceWorker" in navigator ) { let scope = - window.location.protocol + "//" + window.location.host + "/"; + window.location.protocol + "//" + window.location.host + window.location.pathname; navigator.serviceWorker .getRegistrations() .then(async (registrations) => { From 349bfacb73ddbc3b78009eb83446ba636a27bf5a Mon Sep 17 00:00:00 2001 From: kuangthree Date: Sun, 21 Apr 2024 12:15:29 +0800 Subject: [PATCH 35/57] bugfix --- noname/ui/create/index.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/noname/ui/create/index.js b/noname/ui/create/index.js index 235a5cbc9..c975bcbc4 100644 --- a/noname/ui/create/index.js +++ b/noname/ui/create/index.js @@ -348,9 +348,6 @@ export class Create { * @param {string} message 弹出的文字 */ toast(message) { - if(!ui.toastStyle){ - ui.toastStyle = lib.init.css(lib.assetURL+"layout/default/toast.css"); - } const toastContainer = document.querySelector(".toast-container") || (() => { @@ -361,15 +358,24 @@ export class Create { })(); const toast = document.createElement("div"); toast.innerHTML = message; - toast.classList.add("toast"); - toastContainer.appendChild(toast); - ui.toastQueue.push(toast); - ui.create.showNextToast(); + const toShow = () => { + toast.classList.add("toast"); + toastContainer.appendChild(toast); + ui.toastQueue.push(toast); + ui.create.showNextToast(); + }; + if (!ui.toastStyle) { + ui.toastStyle = lib.init.promises + .css(lib.assetURL + "layout/default/toast.css") + .then(() => toShow()); + } else { + toShow(); + } return toast; } showNextToast() { const toast = ui.toastQueue.shift(); - if(!toast)return; + if (!toast) return; toast.style.display = "block"; toast.addEventListener("animationend", () => { toast.remove(); From 448937978874fb0cbc010f820489eac7d5c85442 Mon Sep 17 00:00:00 2001 From: lieren2023 <131325076+lieren2023@users.noreply.github.com> Date: Sun, 21 Apr 2024 13:04:33 +0800 Subject: [PATCH 36/57] =?UTF-8?q?OL=E8=91=A3=E7=99=BD=E9=BB=A0=E6=85=A7?= =?UTF-8?q?=E8=B5=A0=E6=AF=92=E5=BC=B9=E7=AA=97=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/sp.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/character/sp.js b/character/sp.js index 8b9ace269..915ad0956 100755 --- a/character/sp.js +++ b/character/sp.js @@ -23921,17 +23921,16 @@ game.import("character", function () { filter: function (event, player) { if (event.name == "loseAsync") { if (event.type != "gain") return false; - var hs = current.getCards("h"), - cards = event.getl(player).cards2; return game.hasPlayer(function (current) { if (current == player) return false; + var hs = current.getCards("h"), + cards = event.getl(player).cards2; var cardsx = event.getg(current); for (var i of cardsx) { if ( + hs.includes(i) && cards.includes(i) && - hs.includes(card) && - cards.includes(card) && - get.color(card, player) == "black" + get.color(i, player) == "black" ) return true; } From effbeeb8f0ce95e10f29d342b1ec3c61c3b4b9cf Mon Sep 17 00:00:00 2001 From: lieren2023 <131325076+lieren2023@users.noreply.github.com> Date: Sun, 21 Apr 2024 13:04:56 +0800 Subject: [PATCH 37/57] =?UTF-8?q?=E9=99=88=E7=99=BB=E6=9C=9B=E6=97=8F?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index 72a1c7331..3a979c9fc 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -12962,14 +12962,13 @@ game.import("character", function () { }, usable: 1, async cost(event, trigger, player) { - "step 0"; var num = player.getFriends().length; if ( !game.hasPlayer(function (current) { return current != player && current.getFriends().length > num; }) ) { - player + event.result = await player .chooseToDiscard( "h", get.prompt("rewangzu"), @@ -12978,12 +12977,11 @@ game.import("character", function () { ) .set("ai", function (card) { return 7 - get.value(card); - }); + }) + .forResult(); } else { - player.chooseBool(get.prompt("rewangzu"), "随机弃置一张牌并令伤害-1"); + event.result = await player.chooseBool(get.prompt("rewangzu"), "随机弃置一张牌并令伤害-1").forResult(); } - "step 1"; - event.result = result; }, async content(event, trigger, player) { trigger.num--; From 5974c8b28a08478c48a99662d233de3aec59f5c2 Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 15:36:25 +0800 Subject: [PATCH 38/57] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96clan.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 但是... --- character/clan.js | 2883 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 2190 insertions(+), 693 deletions(-) diff --git a/character/clan.js b/character/clan.js index 9df46279e..0da01f5c0 100644 --- a/character/clan.js +++ b/character/clan.js @@ -5,10 +5,34 @@ game.import("character", function () { name: "clan", connect: true, character: { - clan_wuxian: ["female", "shu", 3, ["clanyirong", "clanguixiang", "clanmuyin"], ["clan:陈留吴氏"]], - clan_wuban: ["male", "shu", 4, ["clanzhanding", "clanmuyin"], ["clan:陈留吴氏"]], - clan_xunshu: ["male", "qun", 3, ["clanshenjun", "clanbalong", "clandaojie"], ["clan:颍川荀氏"]], - clan_xunchen: ["male", "qun", 3, ["clansankuang", "clanbeishi", "clandaojie"], ["clan:颍川荀氏"]], + clan_wuxian: [ + "female", + "shu", + 3, + ["clanyirong", "clanguixiang", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_wuban: [ + "male", + "shu", + 4, + ["clanzhanding", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_xunshu: [ + "male", + "qun", + 3, + ["clanshenjun", "clanbalong", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_xunchen: [ + "male", + "qun", + 3, + ["clansankuang", "clanbeishi", "clandaojie"], + ["clan:颍川荀氏"], + ], clan_xuncai: [ "female", "qun", @@ -23,10 +47,34 @@ game.import("character", function () { ["clanyunshen", "clanshangshen", "clanfenchai", "clandaojie"], ["clan:颍川荀氏"], ], - clan_hanshao: ["male", "qun", 3, ["clanfangzhen", "clanliuju", "clanxumin"], ["clan:颍川韩氏"]], - clan_hanrong: ["male", "qun", 3, ["clanlianhe", "clanhuanjia", "clanxumin"], ["clan:颍川韩氏"]], - clan_wukuang: ["male", "qun", 4, ["clanlianzhu", "clanmuyin"], ["clan:陈留吴氏"]], - clan_wangling: ["male", "wei", 4, ["clanbolong", "clanzhongliu"], ["clan:太原王氏"]], + clan_hanshao: [ + "male", + "qun", + 3, + ["clanfangzhen", "clanliuju", "clanxumin"], + ["clan:颍川韩氏"], + ], + clan_hanrong: [ + "male", + "qun", + 3, + ["clanlianhe", "clanhuanjia", "clanxumin"], + ["clan:颍川韩氏"], + ], + clan_wukuang: [ + "male", + "qun", + 4, + ["clanlianzhu", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_wangling: [ + "male", + "wei", + 4, + ["clanbolong", "clanzhongliu"], + ["clan:太原王氏"], + ], clan_zhongyan: [ "female", "jin", @@ -41,7 +89,13 @@ game.import("character", function () { ["clanjiexuan", "clanmingjie", "clanzhongliu"], ["clan:太原王氏"], ], - clan_wanghun: ["male", "jin", 3, ["clanfuxun", "clanchenya", "clanzhongliu"], ["clan:太原王氏"]], + clan_wanghun: [ + "male", + "jin", + 3, + ["clanfuxun", "clanchenya", "clanzhongliu"], + ["clan:太原王氏"], + ], clan_zhonghui: [ "male", "wei", @@ -49,7 +103,13 @@ game.import("character", function () { ["clanyuzhi", "clanxieshu", "clanbaozu"], ["clan:颍川钟氏"], ], - clan_zhongyu: ["male", "wei", 3, ["clanjiejian", "clanhuanghan", "clanbaozu"], ["clan:颍川钟氏"]], + clan_zhongyu: [ + "male", + "wei", + 3, + ["clanjiejian", "clanhuanghan", "clanbaozu"], + ["clan:颍川钟氏"], + ], clan_wanglun: [ "male", "jin", @@ -57,8 +117,20 @@ game.import("character", function () { ["clanqiuxin", "clanjianyuan", "clanzhongliu"], ["clan:太原王氏"], ], - clan_xunyou: ["male", "wei", 3, ["clanbaichu", "clandaojie"], ["clan:颍川荀氏"]], - clan_wuqiao: ["male", "jin", 4, ["clanqiajue", "clanmuyin"], ["clan:陈留吴氏"]], + clan_xunyou: [ + "male", + "wei", + 3, + ["clanbaichu", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_wuqiao: [ + "male", + "jin", + 4, + ["clanqiajue", "clanmuyin"], + ["clan:陈留吴氏"], + ], clan_wangguang: [ "male", "wei", @@ -74,12 +146,29 @@ game.import("character", function () { ["clan:太原王氏"], ], //笑点解析——群雄 - clan_zhongyao: ["male", "qun", 3, ["clanchengqi", "clanjieli", "clanbaozu"], ["clan:颍川钟氏"]], + clan_zhongyao: [ + "male", + "qun", + 3, + ["clanchengqi", "clanjieli", "clanbaozu"], + ["clan:颍川钟氏"], + ], }, characterSort: { clan: { - clan_wu: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"], - clan_xun: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"], + clan_wu: [ + "clan_wuxian", + "clan_wuban", + "clan_wukuang", + "clan_wuqiao", + ], + clan_xun: [ + "clan_xunshu", + "clan_xunchen", + "clan_xuncai", + "clan_xuncan", + "clan_xunyou", + ], clan_han: ["clan_hanshao", "clan_hanrong"], clan_wang: [ "clan_wangling", @@ -89,7 +178,12 @@ game.import("character", function () { "clan_wangguang", "clan_wangmingshan", ], - clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"], + clan_zhong: [ + "clan_zhongyan", + "clan_zhonghui", + "clan_zhongyu", + "clan_zhongyao", + ], }, }, /** @type { importCharacterConfig['skill'] } */ @@ -97,32 +191,69 @@ game.import("character", function () { //族钟繇 clanchengqi: { hiddenCard(player, name) { - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - if (player.getStorage("clanchengqi_effect").includes(name)) return false; - return player.countCards("hs") > 1 && lib.inpile.includes(name); + if (get.type(name) != "basic" && get.type(name) != "trick") + return false; + if (player.getStorage("clanchengqi_effect").includes(name)) + return false; + return ( + player.countCards("hs") > 1 && lib.inpile.includes(name) + ); }, audio: 2, enable: "chooseToUse", filter(event, player) { if (player.countCards("hs") < 2) return false; - return get.inpileVCardList(info => { - const name = info[2]; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); - }).some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + return get + .inpileVCardList((info) => { + const name = info[2]; + if ( + get.type(name) != "basic" && + get.type(name) != "trick" + ) + return false; + return !player + .getStorage("clanchengqi_effect") + .includes(name); + }) + .some((card) => + event.filterCard( + { name: card[2], nature: card[3] }, + player, + event + ) + ); }, chooseButton: { dialog(event, player) { - const list = get.inpileVCardList(info => { - const name = info[2]; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); - }).filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + const list = get + .inpileVCardList((info) => { + const name = info[2]; + if ( + get.type(name) != "basic" && + get.type(name) != "trick" + ) + return false; + return !player + .getStorage("clanchengqi_effect") + .includes(name); + }) + .filter((card) => + event.filterCard( + { name: card[2], nature: card[3] }, + player, + event + ) + ); return ui.create.dialog("承启", [list, "vcard"]); }, check(button) { if (get.event().getParent().type != "phase") return 1; - return get.event("player").getUseValue({ name: button.link[2], nature: button.link[3] }); + return get + .event("player") + .getUseValue({ + name: button.link[2], + nature: button.link[3], + }); }, backup(links, player) { return { @@ -136,18 +267,49 @@ game.import("character", function () { nature: links[0][3], }, filterOk() { - return (ui.selected.cards || []).reduce((sum, card) => { - return sum + get.cardNameLength(card); - }, 0) >= get.cardNameLength(lib.skill.clanchengqi_backup.viewAs.name); + return ( + (ui.selected.cards || []).reduce( + (sum, card) => { + return ( + sum + get.cardNameLength(card) + ); + }, + 0 + ) >= + get.cardNameLength( + lib.skill.clanchengqi_backup.viewAs.name + ) + ); }, check(card) { const player = get.event("player"); - const name = lib.skill.clanchengqi_backup.viewAs.name; - if (ui.selected.cards.length > 1 || card.name == name) return 0; - if (ui.selected.cards.length && game.hasPlayer(target => { - return get.effect(target, { name: "draw" }, player, player) > 0; - })) { - if (get.cardNameLength(name) <= get.cardNameLength(card) + get.cardNameLength(ui.selected.cards[0])) { + const name = + lib.skill.clanchengqi_backup.viewAs.name; + if ( + ui.selected.cards.length > 1 || + card.name == name + ) + return 0; + if ( + ui.selected.cards.length && + game.hasPlayer((target) => { + return ( + get.effect( + target, + { name: "draw" }, + player, + player + ) > 0 + ); + }) + ) { + if ( + get.cardNameLength(name) <= + get.cardNameLength(card) + + get.cardNameLength( + ui.selected.cards[0] + ) + ) { return 10 / (get.value(card) || 0.5); } } @@ -156,24 +318,50 @@ game.import("character", function () { position: "hs", precontent() { player.addTempSkill("clanchengqi_effect"); - player.markAuto("clanchengqi_effect", [event.result.card.name]); + player.markAuto("clanchengqi_effect", [ + event.result.card.name, + ]); }, }; }, prompt(links, player) { - return "将至少两张牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】使用"; + return ( + "将至少两张牌当作" + + get.translation(links[0][3] || "") + + "【" + + get.translation(links[0][2]) + + "】使用" + ); }, }, ai: { order(item, player) { if (player && get.event().type == "phase") { - let list = get.inpileVCardList(info => { - const name = info[2]; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); - }).map(card => { return { name: card[2], nature: card[3] } }).filter(card => player.getUseValue(card, true, true) > 0); + let list = get + .inpileVCardList((info) => { + const name = info[2]; + if ( + get.type(name) != "basic" && + get.type(name) != "trick" + ) + return false; + return !player + .getStorage("clanchengqi_effect") + .includes(name); + }) + .map((card) => { + return { name: card[2], nature: card[3] }; + }) + .filter( + (card) => + player.getUseValue(card, true, true) > 0 + ); if (!list.length) return 0; - list.sort((a, b) => (player.getUseValue(b, true, true) || 0) - (player.getUseValue(a, true, true) || 0)); + list.sort( + (a, b) => + (player.getUseValue(b, true, true) || 0) - + (player.getUseValue(a, true, true) || 0) + ); return get.order(list[0], player) * 0.99; } return 0.001; @@ -194,15 +382,27 @@ game.import("character", function () { onremove: true, trigger: { player: "useCard" }, filter(event, player) { - return event.skill == "clanchengqi_backup" && get.cardNameLength(event.card) == (event.cards || []).reduce((sum, card) => { - return sum + get.cardNameLength(card); - }, 0); + return ( + event.skill == "clanchengqi_backup" && + get.cardNameLength(event.card) == + (event.cards || []).reduce((sum, card) => { + return sum + get.cardNameLength(card); + }, 0) + ); }, async cost(event, trigger, player) { - event.result = await player.chooseTarget("承启:是否令一名角色摸一张牌?").set('ai', target => { - const player = get.event("player"); - return get.effect(target, { name: "draw" }, player, player); - }).forResult(); + event.result = await player + .chooseTarget("承启:是否令一名角色摸一张牌?") + .set("ai", (target) => { + const player = get.event("player"); + return get.effect( + target, + { name: "draw" }, + player, + player + ); + }) + .forResult(); }, popup: false, content() { @@ -214,9 +414,9 @@ game.import("character", function () { }, clanjieli: { audio: 2, - trigger: { player: 'phaseJieshuBegin' }, + trigger: { player: "phaseJieshuBegin" }, filter(event, player) { - return game.hasPlayer(target => { + return game.hasPlayer((target) => { return target.countCards("h"); }); }, @@ -229,25 +429,56 @@ game.import("character", function () { } } } - const str = (num > 0 ? ("并观看牌堆顶" + get.cnNumber(num) + "张牌,然后你可以交换其中等量的牌") : ""); - event.result = await player.chooseTarget(get.prompt("clanjieli"), "观看一名角色的牌名字数最多的手牌" + str, (card, player, target) => { - return target.countCards("h"); - }).set('ai', target => { - const player = get.event("player"), num = get.event('num'); - let map = {}; - for (const i of target.getCards("h")) { - if (!map[get.cardNameLength(i)]) { - map[get.cardNameLength(i)] = 0; + const str = + num > 0 + ? "并观看牌堆顶" + + get.cnNumber(num) + + "张牌,然后你可以交换其中等量的牌" + : ""; + event.result = await player + .chooseTarget( + get.prompt("clanjieli"), + "观看一名角色的牌名字数最多的手牌" + str, + (card, player, target) => { + return target.countCards("h"); } - map[get.cardNameLength(i)]++; - } - let list = Object.keys(map).sort((a, b) => map[b] - map[a]); - list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i)); - if (num >= target.countCards("h", card => { - return list.includes(get.cardNameLength(card)); - })) return target.countCards("h") * 5 * get.sgn(get.sgn(get.attitude(player, target)) - 0.5); - return -target.countCards("h"); - }).set('num', num).forResult(); + ) + .set("ai", (target) => { + const player = get.event("player"), + num = get.event("num"); + let map = {}; + for (const i of target.getCards("h")) { + if (!map[get.cardNameLength(i)]) { + map[get.cardNameLength(i)] = 0; + } + map[get.cardNameLength(i)]++; + } + let list = Object.keys(map).sort( + (a, b) => map[b] - map[a] + ); + list = list + .filter((i) => map[i] == map[list[0]]) + .map((i) => parseInt(i)); + if ( + num >= + target.countCards("h", (card) => { + return list.includes( + get.cardNameLength(card) + ); + }) + ) + return ( + target.countCards("h") * + 5 * + get.sgn( + get.sgn(get.attitude(player, target)) - + 0.5 + ) + ); + return -target.countCards("h"); + }) + .set("num", num) + .forResult(); }, async content(event, trigger, player) { const target = event.targets[0]; @@ -267,46 +498,100 @@ game.import("character", function () { map[get.cardNameLength(i)]++; } let list = Object.keys(map).sort((a, b) => map[b] - map[a]); - list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i)); - const cards = target.getCards("h", card => { + list = list + .filter((i) => map[i] == map[list[0]]) + .map((i) => parseInt(i)); + const cards = target.getCards("h", (card) => { return list.includes(get.cardNameLength(card)); }); if (num > 0 && cards.length >= num) { const topCards = get.cards(num); game.updateRoundNumber(); - const result = await player.chooseToMove( - "诫厉:交换其中" + get.cnNumber(num) + "张牌" - ).set("list", [ - [get.translation(target) + "牌名字数最多的手牌", cards, "dcsushou_tag"], - ["牌堆顶", topCards], - ]).set("filterMove", (from, to) => { - return typeof to != "number"; - }).set('num', num).set("filterOk", moved => { - return moved[1].every(card => get.owner(card)); - }).set("processAI", list => { - const player = get.event("player"), target = get.event().getParent().targets[0]; - const sgn = get.sgn(get.sgn(get.attitude(player, target)) - 0.5); - const cards1 = list[0][1].slice().sort((a, b) => get.value(a, "raw") * sgn - get.value(b, "raw") * sgn); - const cards2 = list[1][1].slice().sort((a, b) => get.value(b, "raw") * sgn - get.value(a, "raw") * sgn); - return [cards1.slice().addArray(cards2.slice(0, get.event("num"))), cards2.slice().addArray(cards1.slice(0, get.event("num")))]; - }).forResult(); + const result = await player + .chooseToMove( + "诫厉:交换其中" + get.cnNumber(num) + "张牌" + ) + .set("list", [ + [ + get.translation(target) + + "牌名字数最多的手牌", + cards, + "dcsushou_tag", + ], + ["牌堆顶", topCards], + ]) + .set("filterMove", (from, to) => { + return typeof to != "number"; + }) + .set("num", num) + .set("filterOk", (moved) => { + return moved[1].every((card) => + get.owner(card) + ); + }) + .set("processAI", (list) => { + const player = get.event("player"), + target = get.event().getParent().targets[0]; + const sgn = get.sgn( + get.sgn(get.attitude(player, target)) - 0.5 + ); + const cards1 = list[0][1] + .slice() + .sort( + (a, b) => + get.value(a, "raw") * sgn - + get.value(b, "raw") * sgn + ); + const cards2 = list[1][1] + .slice() + .sort( + (a, b) => + get.value(b, "raw") * sgn - + get.value(a, "raw") * sgn + ); + return [ + cards1 + .slice() + .addArray( + cards2.slice(0, get.event("num")) + ), + cards2 + .slice() + .addArray( + cards1.slice(0, get.event("num")) + ), + ]; + }) + .forResult(); if (result.bool) { const lose = result.moved[1].slice(); - const gain = result.moved[0].slice().filter(i => !get.owner(i)); - if (lose.length) await target.lose(lose, ui.special); + const gain = result.moved[0] + .slice() + .filter((i) => !get.owner(i)); + if (lose.length) + await target.lose(lose, ui.special); for (let i = lose.length - 1; i--; i >= 0) { - ui.cardPile.insertBefore(lose[i], ui.cardPile.firstChild); + ui.cardPile.insertBefore( + lose[i], + ui.cardPile.firstChild + ); } game.updateRoundNumber(); if (gain.length) await target.gain(gain, "draw"); } - } - else { - let content = ['
    ' + get.translation(target) + "牌名字数最多的手牌
    ", cards]; + } else { + let content = [ + '
    ' + + get.translation(target) + + "牌名字数最多的手牌
    ", + cards, + ]; if (num > 0) { const topCards = get.cards(num, true); game.updateRoundNumber(); - content.push('
    牌堆顶
    '); + content.push( + '
    牌堆顶
    ' + ); content.push(topCards); } await player.chooseControl("ok").set("dialog", content); @@ -325,7 +610,8 @@ game.import("character", function () { prevCard = evt.card; const curNum = get.number(curCard), prevNum = get.number(prevCard); - if (typeof curNum != "number" || typeof prevNum != "number") return false; + if (typeof curNum != "number" || typeof prevNum != "number") + return false; const delNum = Math.abs(curNum - prevNum); if (delNum === 0) return false; return game.hasPlayer((current) => { @@ -334,7 +620,10 @@ game.import("character", function () { }, locked: false, async cost(event, trigger, player) { - const evt = lib.skill.dcjianying.getLastUsed(player, trigger); + const evt = lib.skill.dcjianying.getLastUsed( + player, + trigger + ); const curCard = trigger.card, prevCard = evt.card; const curNum = get.number(curCard), @@ -350,7 +639,11 @@ game.import("character", function () { ) .set("delNum", delNum) .set("ai", (target) => { - return get.damageEffect(target, get.player(), get.player()); + return get.damageEffect( + target, + get.player(), + get.player() + ); }) .forResult(); }, @@ -366,11 +659,18 @@ game.import("character", function () { if (!evt || !evt.card) return; const curNum = get.number(card), prevNum = get.number(evt.card); - if (typeof curNum != "number" || typeof prevNum != "number") return; + if ( + typeof curNum != "number" || + typeof prevNum != "number" + ) + return; const pairs = game .filterPlayer() .map((current) => { - return [current.getHp(), get.damageEffect(current, player, player)]; + return [ + current.getHp(), + get.damageEffect(current, player, player), + ]; }) .filter((pair) => pair[1] > 0); if (!pairs.length) return; @@ -380,7 +680,10 @@ game.import("character", function () { return ( num + 10 + - pairs.filter((pair) => pair[0] === hp).sort((a, b) => b[1] - a[1])[0][1] / 20 + pairs + .filter((pair) => pair[0] === hp) + .sort((a, b) => b[1] - a[1])[0][1] / + 20 ); } }, @@ -400,14 +703,19 @@ game.import("character", function () { filter(event, player) { if (event.responded) return false; const names = lib.inpile.filter( - (name) => - get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name) - ), + (name) => + get.type(name) == "basic" && + !player.getStorage("clanshengmo").includes(name) + ), cards = get.event("clanshengmo_cards") || []; return ( cards.length > 0 && names.some((name) => { - return event.filterCard({ name, isCard: true }, player, event); + return event.filterCard( + { name, isCard: true }, + player, + event + ); }) ); }, @@ -418,13 +726,23 @@ game.import("character", function () { game.checkGlobalHistory("cardMove", (evt) => { if ( evt.name != "cardsDiscard" && - (evt.name != "lose" || evt.position != ui.discardPile) + (evt.name != "lose" || + evt.position != ui.discardPile) ) return; - cards.addArray(evt.cards.filter((card) => get.position(card, true) == "d")); + cards.addArray( + evt.cards.filter( + (card) => get.position(card, true) == "d" + ) + ); }); - const numbers = cards.map((card) => get.number(card, false)).unique(); - const [min, max] = [Math.min(...numbers), Math.max(...numbers)]; + const numbers = cards + .map((card) => get.number(card, false)) + .unique(); + const [min, max] = [ + Math.min(...numbers), + Math.max(...numbers), + ]; event.set( "clanshengmo_cards", cards.filter((card) => { @@ -437,9 +755,10 @@ game.import("character", function () { async content(event, trigger, player) { const evt = event.getParent(2); const names = lib.inpile.filter( - (name) => - get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name) - ), + (name) => + get.type(name) == "basic" && + !player.getStorage("clanshengmo").includes(name) + ), cards = evt.clanshengmo_cards; const links = await player .chooseButton(["剩墨:获得其中一张牌", cards], true) @@ -465,7 +784,13 @@ game.import("character", function () { } if (!list.length) return; const links2 = await player - .chooseButton(["视为使用一张未以此法使用过的基本牌", [list, "vcard"]], true) + .chooseButton( + [ + "视为使用一张未以此法使用过的基本牌", + [list, "vcard"], + ], + true + ) .set("ai", (button) => { return get.player().getUseValue(button.link) + 1; }) @@ -492,12 +817,14 @@ game.import("character", function () { evt.backup("clanshengmo_backup"); evt.set( "openskilldialog", - `选择${get.translation(nature)}【${get.translation(name)}】的目标` + `选择${get.translation(nature)}【${get.translation( + name + )}】的目标` ); evt.set("norestore", true); evt.set("custom", { add: {}, - replace: { window() { } }, + replace: { window() {} }, }); evt.goto(0); }, @@ -510,8 +837,14 @@ game.import("character", function () { precontent() { delete event.result.skill; event.result.card.storage.clanshengmo = true; - player.markAuto("clanshengmo", event.result.card.name); - player.gain(lib.skill.clanshengmo_backup.cardToGain, "gain2"); + player.markAuto( + "clanshengmo", + event.result.card.name + ); + player.gain( + lib.skill.clanshengmo_backup.cardToGain, + "gain2" + ); }, filterCard: () => false, selectCard: -1, @@ -521,12 +854,15 @@ game.import("character", function () { order: 3, result: { player(player) { - if (get.event().dying) return get.attitude(player, get.event().dying); + if (get.event().dying) + return get.attitude(player, get.event().dying); if (get.event().type != "phase") return 1; const names = lib.inpile.filter( (name) => get.type(name) == "basic" && - !player.getStorage("clanshengmo").includes(name) + !player + .getStorage("clanshengmo") + .includes(name) ); if (Array.isArray(names)) { return names.some((name) => { @@ -543,13 +879,27 @@ game.import("character", function () { audio: 2, enable: "phaseUse", filter(event, player) { - return player.hasCard((card) => get.info("clanlilun").filterCard(card, player), "h"); + return player.hasCard( + (card) => + get.info("clanlilun").filterCard(card, player), + "h" + ); }, filterCard(card, player) { - if (player.getStorage("clanlilun").includes(card.name)) return false; - if (ui.selected.cards.length && ui.selected.cards[0].name != card.name) return false; - const cards = player.getCards("h", (cardx) => player.canRecast(cardx)); - return cards.includes(card) && cards.filter((i) => i.name == card.name).length > 1; + if (player.getStorage("clanlilun").includes(card.name)) + return false; + if ( + ui.selected.cards.length && + ui.selected.cards[0].name != card.name + ) + return false; + const cards = player.getCards("h", (cardx) => + player.canRecast(cardx) + ); + return ( + cards.includes(card) && + cards.filter((i) => i.name == card.name).length > 1 + ); }, selectCard: 2, position: "h", @@ -557,9 +907,15 @@ game.import("character", function () { const player = get.event("player"); const value = function (card, player) { const num = player.getUseValue(card); - return num > 0 ? num + 1 / (get.value(card) || 0.5) + 7 : 7 - get.value(card); + return num > 0 + ? num + 1 / (get.value(card) || 0.5) + 7 + : 7 - get.value(card); }; - if (ui.selected.cards.length && value(card, player) < value(ui.selected.cards[0], player)) + if ( + ui.selected.cards.length && + value(card, player) < + value(ui.selected.cards[0], player) + ) return 20 - get.value(card); return value(card, player); }, @@ -585,12 +941,19 @@ game.import("character", function () { const { result: { bool, links }, } = await player - .chooseButton(["离论:是否使用其中的一张牌?", cards]) + .chooseButton([ + "离论:是否使用其中的一张牌?", + cards, + ]) .set("filterButton", (button) => { - return get.event("player").hasUseTarget(button.link); + return get + .event("player") + .hasUseTarget(button.link); }) .set("ai", (button) => { - return get.event("player").getUseValue(button.link); + return get + .event("player") + .getUseValue(button.link); }); if (bool) { const card = links[0]; @@ -607,9 +970,16 @@ game.import("character", function () { let cards = player.getCards( "h", (card) => - get.info("clanlilun").filterCard(card, player) && player.getUseValue(card) > 0 + get + .info("clanlilun") + .filterCard(card, player) && + player.getUseValue(card) > 0 + ); + cards = cards.filter( + (card) => + cards.filter((i) => i.name == card.name) + .length > 1 ); - cards = cards.filter((card) => cards.filter((i) => i.name == card.name).length > 1); if (!cards.length) return 1; cards.sort((a, b) => get.order(b) - get.order(a)); return get.order(cards[0]) - 0.001; @@ -625,7 +995,10 @@ game.import("character", function () { filter(event, player) { if (!event.player.isIn()) return false; const targets = game.filterPlayer((target) => { - return event.player.getPrevious() == target || event.player.getNext() == target; + return ( + event.player.getPrevious() == target || + event.player.getNext() == target + ); }); if (!targets.length) return false; const card = new lib.element.VCard({ name: "sha" }); @@ -636,9 +1009,15 @@ game.import("character", function () { (player.hasUseTarget(card) && !targets.some((target) => { return game.hasPlayer2((current) => { - return current.getHistory("useCard", (evt) => { - return evt.targets && evt.targets.includes(target); - }).length; + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; }); })) ); @@ -649,8 +1028,11 @@ game.import("character", function () { let str = ""; const card = new lib.element.VCard({ name: "sha" }); const targets = game.filterPlayer((target) => { - return event.player.getPrevious() == target || event.player.getNext() == target; - }), + return ( + event.player.getPrevious() == target || + event.player.getNext() == target + ); + }), bool = !targets.some((target) => { return target.getHistory("useCard").length; }), @@ -658,14 +1040,23 @@ game.import("character", function () { player.hasUseTarget(card) && !targets.some((target) => { return game.hasPlayer2((current) => { - return current.getHistory("useCard", (evt) => { - return evt.targets && evt.targets.includes(target); - }).length; + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; }); }); if (bool) { if (goon) str += "你可以"; - str += "与" + get.translation(get.translation(event.player)) + "各摸一张牌"; + str += + "与" + + get.translation(get.translation(event.player)) + + "各摸一张牌"; } if (goon) { if (bool) str += ",然后你可以"; @@ -676,8 +1067,11 @@ game.import("character", function () { check(event, player) { const card = new lib.element.VCard({ name: "sha" }); const targets = game.filterPlayer((target) => { - return event.player.getPrevious() == target || event.player.getNext() == target; - }), + return ( + event.player.getPrevious() == target || + event.player.getNext() == target + ); + }), bool = !targets.some((target) => { return target.getHistory("useCard").length; }), @@ -685,15 +1079,22 @@ game.import("character", function () { player.hasUseTarget(card) && !targets.some((target) => { return game.hasPlayer2((current) => { - return current.getHistory("useCard", (evt) => { - return evt.targets && evt.targets.includes(target); - }).length; + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; }); }); return ( (bool && (get.attitude(player, event.player) > 0 || - event.player.countCards("h") > player.countCards("h"))) || + event.player.countCards("h") > + player.countCards("h"))) || (goon && player.hasValueTarget(card)) ); }, @@ -702,10 +1103,11 @@ game.import("character", function () { player.awakenSkill("clanjianji"); const card = new lib.element.VCard({ name: "sha" }); const targets = game.filterPlayer((target) => { - return ( - trigger.player.getPrevious() == target || trigger.player.getNext() == target - ); - }), + return ( + trigger.player.getPrevious() == target || + trigger.player.getNext() == target + ); + }), boolx = !targets.some((target) => { return target.getHistory("useCard").length; }), @@ -713,9 +1115,15 @@ game.import("character", function () { player.hasUseTarget(card) && !targets.some((target) => { return game.hasPlayer2((current) => { - return current.getHistory("useCard", (evt) => { - return evt.targets && evt.targets.includes(target); - }).length; + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; }); }); if (boolx) { @@ -724,11 +1132,16 @@ game.import("character", function () { const { result: { bool }, } = await player - .chooseBool("是否与" + get.translation(trigger.player) + "各摸一张牌?") + .chooseBool( + "是否与" + + get.translation(trigger.player) + + "各摸一张牌?" + ) .set( "choice", get.attitude(player, trigger.player) > 0 || - trigger.player.countCards("h") > player.countCards("h") + trigger.player.countCards("h") > + player.countCards("h") ); if (bool) draw = true; } else draw = true; @@ -747,9 +1160,14 @@ game.import("character", function () { filter(event, player) { return ( player.countCards("he", (card) => { - if (_status.connectMode && get.position(card) == "h") return true; + if ( + _status.connectMode && + get.position(card) == "h" + ) + return true; return ( - get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player) + get.color(card, player) == "black" && + lib.filter.cardDiscardable(card, player) ); }) > 0 ); @@ -761,41 +1179,69 @@ game.import("character", function () { } = await player .chooseToDiscard((card, player) => { return ( - get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player) + get.color(card, player) == "black" && + lib.filter.cardDiscardable(card, player) ); }, "he") .set( "prompt", "当前手牌点数和为" + - player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) + - "," + - get.prompt("clanqiajue") + player + .getCards("h") + .reduce( + (sum, card) => sum + get.number(card), + 0 + ) + + "," + + get.prompt("clanqiajue") ) .set( "prompt2", lib.translate.clanqiajue_info - .slice(lib.translate.clanqiajue_info.indexOf("弃置")) + .slice( + lib.translate.clanqiajue_info.indexOf( + "弃置" + ) + ) .slice(0, -1) ) .set("ai", (card) => { const player = get.event("player"), goon = get.position(card) == "h"; - let num = player.getCards("h").reduce((sum, card) => sum + get.number(card), 0); - if (num - (goon ? get.number(card) : 0) > 30) return 0; - return goon ? get.number(card) : 1 / (get.value(card) || 0.5); + let num = player + .getCards("h") + .reduce( + (sum, card) => sum + get.number(card), + 0 + ); + if (num - (goon ? get.number(card) : 0) > 30) + return 0; + return goon + ? get.number(card) + : 1 / (get.value(card) || 0.5); }) .set("logSkill", "clanqiajue"); if (bool) { player .when({ - player: ["phaseDrawEnd", "phaseDrawCancelled", "phaseUseSkipped"], + player: [ + "phaseDrawEnd", + "phaseDrawCancelled", + "phaseUseSkipped", + ], }) .filter((evt) => evt == trigger) .then(() => { const cards = player.getCards("h"), - num = cards.reduce((sum, card) => sum + get.number(card), 0); + num = cards.reduce( + (sum, card) => sum + get.number(card), + 0 + ); if (cards.length) - player.showCards(cards, get.translation(player) + "【跒倔】展示"); + player.showCards( + cards, + get.translation(player) + "【跒倔】展示" + ); if (num > 30) { player.popup("杯具"); lib.skill.chenliuwushi.change(player, -2); @@ -816,7 +1262,8 @@ game.import("character", function () { trigger: { player: "useCardAfter" }, filter(event, player) { const storage = player.storage.clanbaichu || {}; - if (Object.values(storage).includes(event.card.name)) return true; + if (Object.values(storage).includes(event.card.name)) + return true; const suit = get.suit(event.card); if (suit == "none") return false; if (!player.hasSkill("qice")) return true; @@ -838,35 +1285,62 @@ game.import("character", function () { } event.goto(2); } else { - var list = lib.inpile.filter((name) => get.type(name) == "trick"); + var list = lib.inpile.filter( + (name) => get.type(name) == "trick" + ); list.removeArray(Object.values(storage)); if (list.length > 0) { - var dialog = ["百出:选择记录一种普通锦囊牌", [list, "vcard"]]; - player.chooseButton(dialog, true).set("ai", function (button) { - var player = _status.event.player, - name = button.link[2]; - if (name == _status.event.getTrigger().card.name) return 1919810; - if (name == "wuxie") return 114514; - return ( - get.effect(player, { name: name }, player, player) * - (1 + player.countCards("hs", name)) - ); - }); + var dialog = [ + "百出:选择记录一种普通锦囊牌", + [list, "vcard"], + ]; + player + .chooseButton(dialog, true) + .set("ai", function (button) { + var player = _status.event.player, + name = button.link[2]; + if ( + name == + _status.event.getTrigger().card.name + ) + return 1919810; + if (name == "wuxie") return 114514; + return ( + get.effect( + player, + { name: name }, + player, + player + ) * + (1 + player.countCards("hs", name)) + ); + }); } else event.goto(2); } } else event.goto(2); - "step 1"; + ("step 1"); if (result.bool) { - var key = `${get.suit(trigger.card)}+${get.type2(trigger.card)}`, + var key = `${get.suit(trigger.card)}+${get.type2( + trigger.card + )}`, name = result.links[0][2]; - if (!player.storage.clanbaichu) player.storage.clanbaichu = {}; + if (!player.storage.clanbaichu) + player.storage.clanbaichu = {}; player.storage.clanbaichu[key] = name; player.markSkill("clanbaichu"); - game.log(player, "记录了", "#y" + get.translation(name)); + game.log( + player, + "记录了", + "#y" + get.translation(name) + ); game.delayx(); } - "step 2"; - if (Object.values(player.getStorage("clanbaichu")).includes(trigger.card.name)) { + ("step 2"); + if ( + Object.values(player.getStorage("clanbaichu")).includes( + trigger.card.name + ) + ) { player.chooseDrawRecover(true); } }, @@ -876,16 +1350,26 @@ game.import("character", function () { }, content(storage) { if (!storage) return "当前暂无记录"; - const keys = Object.keys(storage).map((i) => i.split("+")); + const keys = Object.keys(storage).map((i) => + i.split("+") + ); keys.sort((a, b) => { - if (a[0] != b[0]) return lib.suit.indexOf(b[0]) - lib.suit.indexOf(a[0]); + if (a[0] != b[0]) + return ( + lib.suit.indexOf(b[0]) - + lib.suit.indexOf(a[0]) + ); return lib.sort.name(a[1], b[1]); }); return keys .map((item) => { - return `
  • ${get.translation(item[0])}+${get.translation( + return `
  • ${get.translation( + item[0] + )}+${get.translation( item[1] - )}:【${get.translation(storage[item.join("+")])}】`; + )}:【${get.translation( + storage[item.join("+")] + )}】`; }) .join("
    "); }, @@ -903,8 +1387,10 @@ game.import("character", function () { target .chooseControl() .set("choiceList", [ - str + "下次对你使用【杀】后,其视为对你使用任意普通锦囊牌", - str + "下次对你使用任意普通锦囊牌后,其视为对你使用【杀】", + str + + "下次对你使用【杀】后,其视为对你使用任意普通锦囊牌", + str + + "下次对你使用任意普通锦囊牌后,其视为对你使用【杀】", ]) .set("ai", function () { var target = _status.event.player; @@ -915,14 +1401,31 @@ game.import("character", function () { player, player ); - if (!player.canUse(get.autoViewAs({ name: "sha" }, []), target)) num1 = 0; + if ( + !player.canUse( + get.autoViewAs({ name: "sha" }, []), + target + ) + ) + num1 = 0; var num2 = 0; for (var name of lib.inpile) { if (get.type(name) != "trick") continue; - if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue; + if ( + !player.canUse( + get.autoViewAs({ name: name }, []), + target + ) + ) + continue; if ( num2 < - get.effect(target, get.autoViewAs({ name: name }, []), player, player) + get.effect( + target, + get.autoViewAs({ name: name }, []), + player, + player + ) ) num2 = get.effect( target, @@ -934,16 +1437,21 @@ game.import("character", function () { return num1 >= num2 ? 1 : 0; }) .set("target", player); - "step 1"; + ("step 1"); player.addSkill("clanqiuxin_effect"); - player.markAuto("clanqiuxin_effect", [[target, result.index]]); + player.markAuto("clanqiuxin_effect", [ + [target, result.index], + ]); }, ai: { order: 9, result: { target(player, target) { var cards = player.getCards("hs", (card) => { - if (get.name(card, player) != "sha" && get.type(card, player) != "trick") + if ( + get.name(card, player) != "sha" && + get.type(card, player) != "trick" + ) return false; return player.hasValueTarget(card); }); @@ -951,7 +1459,12 @@ game.import("character", function () { cards.some( (card) => player.canUse(card, target) && - get.effect(target, card, player, player) > 0 + get.effect( + target, + card, + player, + player + ) > 0 ) ) { var att = get.attitude(player, target); @@ -993,18 +1506,27 @@ game.import("character", function () { }, trigger: { player: "useCardAfter" }, filter(event, player) { - if (!event.targets || !event.targets.length) return false; + if (!event.targets || !event.targets.length) + return false; if (event.card.name == "sha") return event.targets.some((target) => { return player .getStorage("clanqiuxin_effect") - .some((list) => list[0] == target && list[1] == 0); + .some( + (list) => + list[0] == target && + list[1] == 0 + ); }); if (get.type(event.card) == "trick") return event.targets.some((target) => { return player .getStorage("clanqiuxin_effect") - .some((list) => list[0] == target && list[1] == 1); + .some( + (list) => + list[0] == target && + list[1] == 1 + ); }); return false; }, @@ -1016,31 +1538,62 @@ game.import("character", function () { if (trigger.card.name == "sha") list = player .getStorage("clanqiuxin_effect") - .filter((listx) => trigger.targets.includes(listx[0]) && listx[1] == 0); + .filter( + (listx) => + trigger.targets.includes( + listx[0] + ) && listx[1] == 0 + ); if (get.type(trigger.card) == "trick") list = player .getStorage("clanqiuxin_effect") - .filter((listx) => trigger.targets.includes(listx[0]) && listx[1] == 1); + .filter( + (listx) => + trigger.targets.includes( + listx[0] + ) && listx[1] == 1 + ); player.unmarkAuto("clanqiuxin_effect", list); var targets = list.map((listx) => listx[0]); event.targets = targets; - "step 1"; + ("step 1"); var target = event.targets.shift(); event.target = target; var list = []; for (var name of lib.inpile) { - if (name != "sha" && get.type(name) != "trick") continue; - if (trigger.card.name == "sha" && get.type(name) != "trick") continue; - if (name == "sha" && get.type(trigger.card) != "trick") continue; - if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue; - list.push([get.translation(get.type(name)), "", name]); + if (name != "sha" && get.type(name) != "trick") + continue; + if ( + trigger.card.name == "sha" && + get.type(name) != "trick" + ) + continue; + if ( + name == "sha" && + get.type(trigger.card) != "trick" + ) + continue; + if ( + !player.canUse( + get.autoViewAs({ name: name }, []), + target + ) + ) + continue; + list.push([ + get.translation(get.type(name)), + "", + name, + ]); } if (!list.length) event.goto(3); else { player .chooseButton( [ - "求心:视为对" + get.translation(target) + "使用一张牌", + "求心:视为对" + + get.translation(target) + + "使用一张牌", [list, "vcard"], ], true @@ -1060,7 +1613,7 @@ game.import("character", function () { }) .set("target", target); } - "step 2"; + ("step 2"); if (result.bool) { var card = { name: result.links[0][2], @@ -1068,9 +1621,11 @@ game.import("character", function () { }; player.useCard(card, target, false); } - "step 3"; + ("step 3"); if (event.targets.length) event.goto(1); - else if (!player.getStorage("clanqiuxin_effect").length) + else if ( + !player.getStorage("clanqiuxin_effect").length + ) player.removeSkill("clanqiuxin_effect"); }, }, @@ -1083,10 +1638,15 @@ game.import("character", function () { var evt = event.getParent(phase); if (evt && evt.name == phase) { if ( - event.player.getHistory("useCard", (evtx) => evtx.getParent(phase) == evt) - .length + event.player.getHistory( + "useCard", + (evtx) => evtx.getParent(phase) == evt + ).length ) - return lib.skill.clanchenya.filter(event, player); + return lib.skill.clanchenya.filter( + event, + player + ); } } return false; @@ -1108,7 +1668,9 @@ game.import("character", function () { "是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", - (card, player) => _status.event.cards.includes(card) && player.canRecast(card) + (card, player) => + _status.event.cards.includes(card) && + player.canRecast(card) ) .set("ai", (card) => { var val = get.value(card); @@ -1120,7 +1682,7 @@ game.import("character", function () { return get.cardNameLength(card) == num; }) ); - "step 1"; + ("step 1"); if (result.bool) trigger.player.recast(result.cards); }, }, @@ -1129,10 +1691,14 @@ game.import("character", function () { audio: 2, trigger: { player: "useCardToPlayered" }, filter(event, player) { - if (!event.isFirstTarget || get.type(event.card) == "equip") return false; + if (!event.isFirstTarget || get.type(event.card) == "equip") + return false; return ( get.cardNameLength(event.card) == - player.getHistory("useCard").indexOf(event.getParent()) + 1 + player + .getHistory("useCard") + .indexOf(event.getParent()) + + 1 ); }, direct: true, @@ -1146,11 +1712,15 @@ game.import("character", function () { get.prompt("clanjiejian"), "令一名目标角色摸" + get.cnNumber(num) + "张牌", function (card, player, target) { - return _status.event.getTrigger().targets.includes(target); + return _status.event + .getTrigger() + .targets.includes(target); } ) - .set("ai", (target) => get.attitude(_status.event.player, target)); - "step 1"; + .set("ai", (target) => + get.attitude(_status.event.player, target) + ); + ("step 1"); if (result.bool) { var target = result.targets[0]; player.logSkill("clanjiejian", target); @@ -1167,21 +1737,33 @@ game.import("character", function () { player._clanjiejian_mod_temp || get.type(card) === "equip" || get.attitude(player, target) <= 0 || - get.cardNameLength(card) !== player.getHistory("useCard").length + 1 + get.cardNameLength(card) !== + player.getHistory("useCard").length + 1 ) return; let targets = [target], evt = _status.event.getParent("useCard"); targets.addArray(ui.selected.targets); - if (evt && evt.card == card) targets.addArray(evt.targets); - return [1, (0.8 * get.cardNameLength(card)) / targets.length]; + if (evt && evt.card == card) + targets.addArray(evt.targets); + return [ + 1, + (0.8 * get.cardNameLength(card)) / + targets.length, + ]; }, }, }, mod: { aiOrder(player, card, num) { - if (typeof card == "object" && get.type(card) !== "equip") { - let cs = get.cardNameLength(card) - player.getHistory("useCard").length - 1; + if ( + typeof card == "object" && + get.type(card) !== "equip" + ) { + let cs = + get.cardNameLength(card) - + player.getHistory("useCard").length - + 1; if (cs < 0) return num; if (cs > 0) return num / 3; player._clanjiejian_mod_temp = true; @@ -1193,7 +1775,12 @@ game.import("character", function () { return false; return ( get.effect(target, card, player, player) + - get.effect(target, { name: "draw" }, player, player) > + get.effect( + target, + { name: "draw" }, + player, + player + ) > 0 ); }); @@ -1212,7 +1799,8 @@ game.import("character", function () { return typeof num == "number" && num > 0; }, check(event, player) { - let num = get.cardNameLength(event.card) - player.getDamagedHp(); + let num = + get.cardNameLength(event.card) - player.getDamagedHp(); if (num >= 0) return true; if (num < -1) return false; if ( @@ -1228,10 +1816,18 @@ game.import("character", function () { content() { "step 0"; player.draw(get.cardNameLength(trigger.card)); - if (player.isDamaged()) player.chooseToDiscard(player.getDamagedHp(), "he", true); - "step 1"; + if (player.isDamaged()) + player.chooseToDiscard( + player.getDamagedHp(), + "he", + true + ); + ("step 1"); if ( - player.getHistory("useSkill", (evt) => evt.skill == "clanhuanghan").length > 1 && + player.getHistory( + "useSkill", + (evt) => evt.skill == "clanhuanghan" + ).length > 1 && player.hasSkill("clanbaozu", null, false, false) && player.awakenedSkills.includes("clanbaozu") ) { @@ -1244,9 +1840,14 @@ game.import("character", function () { threaten: 3, effect: { target(card, player, target) { - if (!get.tag(card, "damage") || player.hasSkillTag("jueqing", false, target)) + if ( + !get.tag(card, "damage") || + player.hasSkillTag("jueqing", false, target) + ) return; - let num = get.cardNameLength(card) - target.getDamagedHp(); + let num = + get.cardNameLength(card) - + target.getDamagedHp(); if (num > 0) return [1, num + 0.1]; }, }, @@ -1268,7 +1869,10 @@ game.import("character", function () { player.unmarkSkill("clanyuzhi"); if ( player.countCards("h", (card) => { - return card.hasGaintag("clanyuzhi") && lib.filter.cardDiscardable(card, player); + return ( + card.hasGaintag("clanyuzhi") && + lib.filter.cardDiscardable(card, player) + ); }) ) { event.logged = true; @@ -1281,13 +1885,16 @@ game.import("character", function () { true ).logSkill = "clanyuzhi"; } - "step 1"; + ("step 1"); player.removeGaintag("clanyuzhi"); var num1 = player .getRoundHistory( "gain", (evt) => { - return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi"; + return ( + evt.getParent().name == "draw" && + evt.getParent(2).name == "clanyuzhi" + ); }, 1 ) @@ -1296,7 +1903,10 @@ game.import("character", function () { .getRoundHistory( "gain", (evt) => { - return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi"; + return ( + evt.getParent().name == "draw" && + evt.getParent(2).name == "clanyuzhi" + ); }, 2 ) @@ -1314,20 +1924,34 @@ game.import("character", function () { if ((num1 > 0 && num2 > 0 && num1 > num2) || num1 > num3) { if (!event.logged) player.logSkill("clanyuzhi"); if (num2 > 0 && num1 > num2) - game.log(player, "的野心已开始膨胀", "#y(" + num1 + "张>" + num2 + "张)"); + game.log( + player, + "的野心已开始膨胀", + "#y(" + num1 + "张>" + num2 + "张)" + ); if (num1 > num3) - game.log(player, "的行动未达到野心", "#y(" + num3 + "张<" + num1 + "张)"); + game.log( + player, + "的行动未达到野心", + "#y(" + num3 + "张<" + num1 + "张)" + ); if (player.hasSkill("clanbaozu", null, false, false)) player - .chooseBool("迂志:是否失去〖保族〗?", "若选择“否”,则你受到1点雷属性伤害") - .set("choice", player.awakenedSkills.includes("clanbaozu")); + .chooseBool( + "迂志:是否失去〖保族〗?", + "若选择“否”,则你受到1点雷属性伤害" + ) + .set( + "choice", + player.awakenedSkills.includes("clanbaozu") + ); else event._result = { bool: false }; } else event.goto(3); - "step 2"; + ("step 2"); if (result.bool) { player.removeSkills("clanbaozu"); } else player.damage(1, "thunder"); - "step 3"; + ("step 3"); if (player.countCards("h")) { player .chooseCard( @@ -1351,20 +1975,25 @@ game.import("character", function () { .set( "dying", player.hp + - player.countCards("hs", { - name: ["tao", "jiu"], - }) < - 1 + player.countCards("hs", { + name: ["tao", "jiu"], + }) < + 1 ) .set("num", event.num1); } else event.finish(); - "step 4"; + ("step 4"); if (result.bool) { player.logSkill("clanyuzhi"); - player.showCards(result.cards, get.translation(player) + "发动了【迂志】"); + player.showCards( + result.cards, + get.translation(player) + "发动了【迂志】" + ); player.addGaintag(result.cards, "clanyuzhi"); player.draw(get.cardNameLength(result.cards[0])); - player.storage.clanyuzhi = get.cardNameLength(result.cards[0]); + player.storage.clanyuzhi = get.cardNameLength( + result.cards[0] + ); player.markSkill("clanyuzhi"); } }, @@ -1381,17 +2010,27 @@ game.import("character", function () { filter(event, player) { if (!event.card || player.isLinked()) return false; var num = get.cardNameLength(event.card); - return typeof num == "number" && num > 0 && player.countCards("he") > 0; + return ( + typeof num == "number" && + num > 0 && + player.countCards("he") > 0 + ); }, async cost(event, trigger, player) { var num = get.cardNameLength(trigger.card), str = ""; if (player.getDamagedHp() > 0) - str += ",然后摸" + get.cnNumber(player.getDamagedHp()) + "张牌"; + str += + ",然后摸" + + get.cnNumber(player.getDamagedHp()) + + "张牌"; event.result = await player .chooseToDiscard( get.prompt("clanxieshu"), - "横置武将牌并弃置" + get.cnNumber(num) + "张牌" + str, + "横置武将牌并弃置" + + get.cnNumber(num) + + "张牌" + + str, "he", num ) @@ -1401,7 +2040,8 @@ game.import("character", function () { var num2 = player.getDamagedHp(); if (!num2) return 0; if (num < num2) return 8 - get.value(card); - if (num == num2 || num2 >= 2 + num - num2) return lib.skill.zhiheng.check(card); + if (num == num2 || num2 >= 2 + num - num2) + return lib.skill.zhiheng.check(card); return 0; }) .set("num", num) @@ -1411,7 +2051,8 @@ game.import("character", function () { popup: false, content() { player.link(true); - if (player.getDamagedHp() > 0) player.draw(player.getDamagedHp()); + if (player.getDamagedHp() > 0) + player.draw(player.getDamagedHp()); }, ai: { threaten: 3 }, group: "clanxieshu_ban", @@ -1453,13 +2094,17 @@ game.import("character", function () { delay: false, selectCard() { var player = _status.event.player; - if (ui.selected.targets.length && !ui.selected.targets[0].countGainableCards(player, "h")) + if ( + ui.selected.targets.length && + !ui.selected.targets[0].countGainableCards(player, "h") + ) return 1; return [0, 1]; }, filterTarget(card, player, target) { if (player == target) return false; - if (!ui.selected.cards.length) return target.countGainableCards(player, "h") > 0; + if (!ui.selected.cards.length) + return target.countGainableCards(player, "h") > 0; return true; }, check(card) { @@ -1467,12 +2112,20 @@ game.import("character", function () { var evtx = _status.event.getParent("phaseUse"); var targets = game.filterPlayer( (target) => - target != player && lib.skill.clanfuxun.ai.result.target(player, target) != 0 + target != player && + lib.skill.clanfuxun.ai.result.target( + player, + target + ) != 0 ); targets.sort( (a, b) => - Math.abs(lib.skill.clanfuxun.ai.result.target(player, b)) - - Math.abs(lib.skill.clanfuxun.ai.result.target(player, a)) + Math.abs( + lib.skill.clanfuxun.ai.result.target(player, b) + ) - + Math.abs( + lib.skill.clanfuxun.ai.result.target(player, a) + ) ); if (evtx && targets.length) { var target = targets[0]; @@ -1491,7 +2144,9 @@ game.import("character", function () { evt.cards.length ); }) && - Math.abs(player.countCards("h") - target.countCards("h")) == 2 + Math.abs( + player.countCards("h") - target.countCards("h") + ) == 2 ) { if (player.countCards("h") > target.countCards("h")) return 1 / (get.value(card) || 0.5); @@ -1510,7 +2165,7 @@ game.import("character", function () { } else { player.gainPlayerCard(target, "h", true); } - "step 1"; + ("step 1"); var evtx = event.getParent("phaseUse"); if ( player.countCards("h") == target.countCards("h") && @@ -1534,7 +2189,8 @@ game.import("character", function () { var list = []; for (var name of lib.inpile) { if (get.type(name) != "basic") continue; - if (player.hasUseTarget({ name: name })) list.push(["基本", "", name]); + if (player.hasUseTarget({ name: name })) + list.push(["基本", "", name]); if (name == "sha") { for (var nature of lib.inpile_nature) { if ( @@ -1549,7 +2205,10 @@ game.import("character", function () { } if (list.length) { player - .chooseButton(["是否将一张牌当做一种基本牌使用?", [list, "vcard"]]) + .chooseButton([ + "是否将一张牌当做一种基本牌使用?", + [list, "vcard"], + ]) .set("ai", (button) => { return _status.event.player.getUseValue({ name: button.link[2], @@ -1558,7 +2217,7 @@ game.import("character", function () { }); } else event.finish(); } else event.finish(); - "step 2"; + ("step 2"); if (result.bool) { var card = { name: result.links[0][2], @@ -1568,13 +2227,16 @@ game.import("character", function () { lib.skill.clanfuxun_backup.viewAs = card; }, card); var next = player.chooseToUse(); - next.set("openskilldialog", "将一张牌当做" + get.translation(card) + "使用"); + next.set( + "openskilldialog", + "将一张牌当做" + get.translation(card) + "使用" + ); next.set("norestore", true); next.set("addCount", false); next.set("_backupevent", "clanfuxun_backup"); next.set("custom", { add: {}, - replace: { window() { } }, + replace: { window() {} }, }); next.backup("clanfuxun_backup"); } @@ -1584,24 +2246,33 @@ game.import("character", function () { var evtx = _status.event.getParent("phaseUse"); if ( game.hasPlayer((current) => { - if (current == player || !evtx || get.attitude(player, current) == 0) + if ( + current == player || + !evtx || + get.attitude(player, current) == 0 + ) return false; return ( !current.hasHistory("lose", (evt) => { return ( - evt.getParent(3).name != "clanfuxun" && + evt.getParent(3).name != + "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length ); }) && !current.hasHistory("gain", (evt) => { return ( - evt.getParent().name != "clanfuxun" && + evt.getParent().name != + "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length ); }) && - Math.abs(player.countCards("h") - current.countCards("h")) == 2 + Math.abs( + player.countCards("h") - + current.countCards("h") + ) == 2 ); }) ) @@ -1613,29 +2284,43 @@ game.import("character", function () { var evtx = _status.event.getParent("phaseUse"); var num = get.sgn(get.attitude(player, target)); var targets = game.filterPlayer((current) => { - if (current == player || !evtx || get.attitude(player, current) == 0) + if ( + current == player || + !evtx || + get.attitude(player, current) == 0 + ) return false; return ( !current.hasHistory("lose", (evt) => { return ( - evt.getParent(3).name != "clanfuxun" && + evt.getParent(3).name != + "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length ); }) && !current.hasHistory("gain", (evt) => { return ( - evt.getParent().name != "clanfuxun" && + evt.getParent().name != + "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length ); }) && - Math.abs(player.countCards("h") - current.countCards("h")) == 2 + Math.abs( + player.countCards("h") - + current.countCards("h") + ) == 2 ); }); if (targets.includes(target)) { - if (player.countCards("h") < target.countCards("h")) - return get.sgn(num + 0.5) * Math.sqrt(2 - num); + if ( + player.countCards("h") < + target.countCards("h") + ) + return ( + get.sgn(num + 0.5) * Math.sqrt(2 - num) + ); else return num * (2 + num); } return get.sgn(num + 0.5) * (1 - num) * 0.25; @@ -1652,7 +2337,10 @@ game.import("character", function () { selectCard: 1, check(card) { var player = _status.event.player; - if (player.hasSkill("clanzhongliu") && get.position(card) != "h") + if ( + player.hasSkill("clanzhongliu") && + get.position(card) != "h" + ) return 10 - get.value(card); return 5 - get.value(card); }, @@ -1673,10 +2361,17 @@ game.import("character", function () { var skill = event.sourceSkill || event.skill; var info = get.info(skill); if (info.charlotte) return false; - var translation = get.skillInfoTranslation(skill, event.player); + var translation = get.skillInfoTranslation( + skill, + event.player + ); if (!translation) return false; var match = translation.match(/“?出牌阶段限一次/g); - if (!match || match.every((value) => value != "出牌阶段限一次")) return false; + if ( + !match || + match.every((value) => value != "出牌阶段限一次") + ) + return false; return event.player.countCards("h") > 0; }, check(event, player) { @@ -1691,7 +2386,9 @@ game.import("character", function () { "是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", - (card, player) => _status.event.cards.includes(card) && player.canRecast(card) + (card, player) => + _status.event.cards.includes(card) && + player.canRecast(card) ) .set("ai", (card) => { var val = get.value(card); @@ -1703,7 +2400,7 @@ game.import("character", function () { return get.cardNameLength(card) == num; }) ); - "step 1"; + ("step 1"); if (result.bool) trigger.player.recast(result.cards); }, }, @@ -1720,7 +2417,9 @@ game.import("character", function () { content(storage) { return ( "限定技,转换技。你可以将一张" + - ((storage || 0) % 2 ? "黑色牌当【过河拆桥】" : "红色牌当【顺手牵羊】") + + ((storage || 0) % 2 + ? "黑色牌当【过河拆桥】" + : "红色牌当【顺手牵羊】") + "使用。" ); }, @@ -1734,17 +2433,28 @@ game.import("character", function () { var player = _status.event.player; var storage = player.storage.clanjiexuan; var name = (storage || 0) % 2 ? "guohe" : "shunshou"; - var fix = player.hasSkill("clanzhongliu") && get.position(card) != "h" ? 2 : 1; - return (get.value({ name: name }, player) - get.value(card)) * fix; + var fix = + player.hasSkill("clanzhongliu") && + get.position(card) != "h" + ? 2 + : 1; + return ( + (get.value({ name: name }, player) - get.value(card)) * + fix + ); }, position: "hes", filterCard(card, player) { var storage = player.storage.clanjiexuan; - return get.color(card) == ((storage || 0) % 2 ? "black" : "red"); + return ( + get.color(card) == + ((storage || 0) % 2 ? "black" : "red") + ); }, prompt() { var storage = _status.event.player.storage.clanjiexuan; - if ((storage || 0) % 2) return "将一张黑色牌当【过河拆桥】使用"; + if ((storage || 0) % 2) + return "将一张黑色牌当【过河拆桥】使用"; return "将一张红色牌当【顺手牵羊】使用"; }, skillAnimation: true, @@ -1805,18 +2515,39 @@ game.import("character", function () { order: 10, result: { target(player, target) { - if (player.hasSkill("clanzhongliu") || player.hp == 1) { + if ( + player.hasSkill("clanzhongliu") || + player.hp == 1 + ) { if ( !player.hasCard((card) => { var info = get.info(card); - if (info.allowMultiple == false) return false; - if (!lib.filter.targetEnabled2(card, player, target)) return false; + if (info.allowMultiple == false) + return false; + if ( + !lib.filter.targetEnabled2( + card, + player, + target + ) + ) + return false; return game.hasPlayer((current) => { return ( player.canUse(card, current) && - get.effect(current, card, player, player) > 0 && + get.effect( + current, + card, + player, + player + ) > 0 && current != target && - get.effect(target, card, player, player) > 0 + get.effect( + target, + card, + player, + player + ) > 0 ); }); }, "hs") @@ -1826,14 +2557,32 @@ game.import("character", function () { if ( player.countCards("hs", (card) => { var info = get.info(card); - if (info.allowMultiple == false) return false; - if (!lib.filter.targetEnabled2(card, player, target)) return false; + if (info.allowMultiple == false) + return false; + if ( + !lib.filter.targetEnabled2( + card, + player, + target + ) + ) + return false; return game.hasPlayer((current) => { return ( player.canUse(card, current) && - get.effect(current, card, player, player) > 0 && + get.effect( + current, + card, + player, + player + ) > 0 && current != target && - get.effect(target, card, player, player) > 0 + get.effect( + target, + card, + player, + player + ) > 0 ); }); }) < 3 @@ -1855,11 +2604,24 @@ game.import("character", function () { if (info.allowMultiple == false) return false; if (event.targets && !info.multitarget) { return game.filterPlayer().some((current) => { - if (!current.hasSkill("clanmingjie_" + player.playerid)) return false; + if ( + !current.hasSkill( + "clanmingjie_" + player.playerid + ) + ) + return false; return ( !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) && - lib.filter.targetInRange(card, player, current) + lib.filter.targetEnabled2( + card, + player, + current + ) && + lib.filter.targetInRange( + card, + player, + current + ) ); }); } @@ -1871,18 +2633,31 @@ game.import("character", function () { player .chooseTarget( get.prompt("clanmingjie_effect"), - "令任意【铭戒】目标角色成为" + get.translation(trigger.card) + "的目标", + "令任意【铭戒】目标角色成为" + + get.translation(trigger.card) + + "的目标", function (card, player, target) { - var trigger = _status.event.getTrigger(); + var trigger = + _status.event.getTrigger(); if ( trigger.targets.includes(target) || !target.isIn() || - !target.hasSkill("clanmingjie_" + player.playerid) + !target.hasSkill( + "clanmingjie_" + player.playerid + ) ) return false; return ( - lib.filter.targetEnabled2(trigger.card, player, target) && - lib.filter.targetInRange(trigger.card, player, target) + lib.filter.targetEnabled2( + trigger.card, + player, + target + ) && + lib.filter.targetInRange( + trigger.card, + player, + target + ) ); }, [1, Infinity] @@ -1890,14 +2665,24 @@ game.import("character", function () { .set("ai", function (target) { var player = _status.event.player; var trigger = _status.event.getTrigger(); - return get.effect(target, trigger.card, player, player); + return get.effect( + target, + trigger.card, + player, + player + ); }); - "step 1"; + ("step 1"); if (result.bool) { var targets = result.targets.sortBySeat(); player.logSkill("clanmingjie_effect", targets); trigger.targets.addArray(targets); - game.log(targets, "成为了", trigger.card, "的额外目标"); + game.log( + targets, + "成为了", + trigger.card, + "的额外目标" + ); } }, group: "clanmingjie_targeted", @@ -1906,26 +2691,46 @@ game.import("character", function () { charlotte: true, trigger: { global: "phaseEnd" }, filter(event, player) { - var cards = player.getStorage("clanmingjie_record").slice(); + var cards = player + .getStorage("clanmingjie_record") + .slice(); cards = cards.filterInD("d"); if (!cards.length) return false; - var history = player.getHistory("useSkill", (evt) => evt.skill == "clanmingjie"); + var history = player.getHistory( + "useSkill", + (evt) => evt.skill == "clanmingjie" + ); if (history.length) { - var targets = history.reduce((list, evt) => list.addArray(evt.targets), []); - if (event.player != player && targets.includes(event.player)) return true; + var targets = history.reduce( + (list, evt) => list.addArray(evt.targets), + [] + ); + if ( + event.player != player && + targets.includes(event.player) + ) + return true; } if (player.actionHistory.length >= 2) { - for (var i = player.actionHistory.length - 2; i >= 0; i--) { + for ( + var i = player.actionHistory.length - 2; + i >= 0; + i-- + ) { if (!player.actionHistory[i].isMe) continue; - var history2 = player.actionHistory[i].useSkill.filter( + var history2 = player.actionHistory[ + i + ].useSkill.filter( (evt) => evt.skill == "clanmingjie" ); if (history2.length) { var targets2 = history2.reduce( - (list, evt) => list.addArray(evt.targets), + (list, evt) => + list.addArray(evt.targets), [] ); - if (targets2.includes(event.player)) return true; + if (targets2.includes(event.player)) + return true; } break; } @@ -1936,19 +2741,25 @@ game.import("character", function () { popup: false, content() { "step 0"; - var cards = player.getStorage("clanmingjie_record").slice(); + var cards = player + .getStorage("clanmingjie_record") + .slice(); cards = cards.filterInD("d"); event.cards = cards; - "step 1"; + ("step 1"); player .chooseButton(["铭戒:是否使用这些牌?", cards]) .set("filterButton", (button) => { - return _status.event.player.hasUseTarget(button.link); + return _status.event.player.hasUseTarget( + button.link + ); }) .set("ai", (button) => { - return _status.event.player.getUseValue(button.link); + return _status.event.player.getUseValue( + button.link + ); }); - "step 2"; + ("step 2"); if (result.bool) { var card = result.links[0]; event.cards.remove(card); @@ -1956,10 +2767,13 @@ game.import("character", function () { game.delayx(); player.chooseUseTarget(card, true); } else event.finish(); - "step 3"; + ("step 3"); if ( event.cards.filter((card) => { - return get.position(card, true) == "d" && player.hasUseTarget(card); + return ( + get.position(card, true) == "d" && + player.hasUseTarget(card) + ); }).length ) event.goto(1); @@ -1968,7 +2782,12 @@ game.import("character", function () { record: { charlotte: true, trigger: { - global: ["shaMiss", "eventNeutralized", "useCard1", "phaseAfter"], + global: [ + "shaMiss", + "eventNeutralized", + "useCard1", + "phaseAfter", + ], }, filter(event, player) { if (event.name == "useCard") { @@ -1986,7 +2805,10 @@ game.import("character", function () { delete player.storage.clanmingjie_record; return; } - player.markAuto("clanmingjie_record", trigger.cards); + player.markAuto( + "clanmingjie_record", + trigger.cards + ); }, }, }, @@ -2003,7 +2825,9 @@ game.import("character", function () { content(storage) { return ( "转换技。出牌阶段限一次,你可以观看" + - (storage ? "一名角色的至多四张手" : "牌堆顶的至多四张") + + (storage + ? "一名角色的至多四张手" + : "牌堆顶的至多四张") + "牌,然后可以使用其中的一张牌。" ); }, @@ -2017,8 +2841,12 @@ game.import("character", function () { }, chooseButton: { dialog(event, player) { - var dialog = ui.create.dialog("观骨:选择观看牌堆的牌数", "hidden"); - if (player.storage.clanguangu) dialog.forceDirect = true; + var dialog = ui.create.dialog( + "观骨:选择观看牌堆的牌数", + "hidden" + ); + if (player.storage.clanguangu) + dialog.forceDirect = true; return dialog; }, chooseControl(event, player) { @@ -2065,94 +2893,156 @@ game.import("character", function () { var cards = get.cards(num); event.cards = cards.slice(0); while (cards.length) - ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + ui.cardPile.insertBefore( + cards.pop().fix(), + ui.cardPile.firstChild + ); game.updateRoundNumber(); event.goto(2); } else { var ret; - if (!player.hasSkill("clanxiaoyong")) ret = 4; + if (!player.hasSkill("clanxiaoyong")) + ret = 4; else { var list = [4, 3, 2, 1]; player.getHistory("useCard", (evt) => { - var len = get.cardNameLength(evt.card); + var len = get.cardNameLength( + evt.card + ); list.remove(len); }); if (list.length) ret = list[0]; else ret = 4; } player - .choosePlayerCard(target, "h", true, [1, 4]) + .choosePlayerCard( + target, + "h", + true, + [1, 4] + ) .set( "prompt", - "观骨:观看" + get.translation(target) + "的至多四张牌" + "观骨:观看" + + get.translation(target) + + "的至多四张牌" ) .set("ai", (button) => { - if (ui.selected.buttons.length >= _status.event.num) return 0; + if ( + ui.selected.buttons.length >= + _status.event.num + ) + return 0; return Math.random(); }) .set("num", ret); } - "step 1"; + ("step 1"); if (result.bool) { event.cards = result.links; } else { event.finish(); } - "step 2"; + ("step 2"); var count = cards.length; event.getParent().viewedCount = count; player - .chooseButton(["观骨:是否使用其中一张牌?", cards]) + .chooseButton([ + "观骨:是否使用其中一张牌?", + cards, + ]) .set("filterButton", (button) => { var player = _status.event.player; var card = button.link; var cardx = { - name: get.name(card, get.owner(card)), - nature: get.nature(card, get.owner(card)), + name: get.name( + card, + get.owner(card) + ), + nature: get.nature( + card, + get.owner(card) + ), cards: [card], }; - return player.hasUseTarget(cardx, null, false); + return player.hasUseTarget( + cardx, + null, + false + ); }) .set("ai", (button) => { var len = _status.event.len; var card = button.link; var fix = 1; - if (get.cardNameLength(card) == len) fix = 2; - return fix * _status.event.player.getUseValue(card); + if (get.cardNameLength(card) == len) + fix = 2; + return ( + fix * + _status.event.player.getUseValue( + card + ) + ); }) .set( "len", (function () { - if (!player.hasSkill("clanxiaoyong")) return 0; + if ( + !player.hasSkill("clanxiaoyong") + ) + return 0; var list = []; - player.getHistory("useCard", (evt) => { - var len = get.cardNameLength(evt.card); - list.add(len); - }); - if (!list.includes(count)) return count; - if (list.length) return list.randomGet(); + player.getHistory( + "useCard", + (evt) => { + var len = + get.cardNameLength( + evt.card + ); + list.add(len); + } + ); + if (!list.includes(count)) + return count; + if (list.length) + return list.randomGet(); return 4; })() ); - "step 3"; + ("step 3"); if (result.bool) { var card = result.links[0]; cards.remove(card); var cardx = { name: get.name(card, get.owner(card)), - nature: get.nature(card, get.owner(card)), + nature: get.nature( + card, + get.owner(card) + ), cards: [card], }; var next = player - .chooseUseTarget(cardx, [card], true, false) + .chooseUseTarget( + cardx, + [card], + true, + false + ) .set("oncard", (card) => { - var owner = _status.event.getParent().owner; + var owner = + _status.event.getParent().owner; if (owner) owner.$throw(card.cards); }); - if (card.name === cardx.name && get.is.sameNature(card, cardx, true)) + if ( + card.name === cardx.name && + get.is.sameNature(card, cardx, true) + ) next.viewAs = false; var owner = get.owner(card); - if (owner != player && get.position(card) == "h") { + if ( + owner != player && + get.position(card) == "h" + ) { next.throw = false; next.set("owner", owner); } @@ -2162,14 +3052,20 @@ game.import("character", function () { order: 10, result: { target(player, target) { - return -Math.min(target.countCards("h"), 4) / 2; + return ( + -Math.min( + target.countCards("h"), + 4 + ) / 2 + ); }, }, }, }; }, prompt(result, player) { - if (!player.storage.clanguangu) return "点击“确定”以观看牌堆顶牌"; + if (!player.storage.clanguangu) + return "点击“确定”以观看牌堆顶牌"; return "观骨:选择观看牌的目标"; }, }, @@ -2194,7 +3090,10 @@ game.import("character", function () { player.hasHistory( "useCard", function (evt) { - return evt != event && get.cardNameLength(evt.card) == len; + return ( + evt != event && + get.cardNameLength(evt.card) == len + ); }, event ) @@ -2229,7 +3128,11 @@ game.import("character", function () { }, mod: { aiOrder(player, card, num) { - if (!player.hasSkill("clanguangu") || !player.getStat().skill.clanguangu) return; + if ( + !player.hasSkill("clanguangu") || + !player.getStat().skill.clanguangu + ) + return; var history = player .getAllHistory("useSkill", (evt) => { return evt.skill == "clanguangu_backup"; @@ -2266,7 +3169,8 @@ game.import("character", function () { animationColor: "water", filter(event, player) { return ( - (event.player == player || event.player.hasClan("颍川钟氏")) && + (event.player == player || + event.player.hasClan("颍川钟氏")) && event.player.hp <= 0 && !event.player.isLinked() ); @@ -2278,7 +3182,7 @@ game.import("character", function () { content() { "step 0"; player.awakenSkill("clanbaozu"); - "step 1"; + ("step 1"); trigger.player.link(true); trigger.player.recover(); }, @@ -2299,22 +3203,39 @@ game.import("character", function () { "是否交给其" + get.cnNumber(num) + "张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。"; - if (!num || target.countCards("he") < num) event._result = { bool: false }; + if (!num || target.countCards("he") < num) + event._result = { bool: false }; else target - .chooseCard(get.translation(player) + "对你发动了【驳龙】", str, num, "he") + .chooseCard( + get.translation(player) + "对你发动了【驳龙】", + str, + num, + "he" + ) .set("ai", (card) => { if (_status.event.canGive) return ( - 5 + Math.max(0, 3 - _status.event.player.hp) / 1.5 - get.value(card) + 5 + + Math.max( + 0, + 3 - _status.event.player.hp + ) / + 1.5 - + get.value(card) ); return 0; }) .set( "canGive", (function () { - if (get.attitude(target, player) > 1) return true; - if (!player.hasSha() && player.countCards("h") <= 4) return true; + if (get.attitude(target, player) > 1) + return true; + if ( + !player.hasSha() && + player.countCards("h") <= 4 + ) + return true; var sha = { name: "sha", nature: "thunder", @@ -2323,9 +3244,22 @@ game.import("character", function () { if ( game.hasPlayer((current) => { return ( - player.canUse(sha, current, true, true) && - get.effect(current, sha, player, target) < 0 && - !current.countCards("hs", ["shan", "caochuan"]) + player.canUse( + sha, + current, + true, + true + ) && + get.effect( + current, + sha, + player, + target + ) < 0 && + !current.countCards("hs", [ + "shan", + "caochuan", + ]) ); }) ) @@ -2333,22 +3267,33 @@ game.import("character", function () { return true; })() ); - "step 1"; + ("step 1"); if (result.bool) { var cards = result.cards; target.give(cards, player); - if (lib.filter.targetEnabled2({ name: "jiu", isCard: true }, target, player)) - target.useCard({ name: "jiu", isCard: true }, player, false); + if ( + lib.filter.targetEnabled2( + { name: "jiu", isCard: true }, + target, + player + ) + ) + target.useCard( + { name: "jiu", isCard: true }, + player, + false + ); event.finish(); } else { player.chooseCard( "驳龙:交给" + get.translation(target) + "一张牌", - get.translation(target) + "拒绝给牌,请交给其一张牌然后视为对其使用一张雷【杀】", + get.translation(target) + + "拒绝给牌,请交给其一张牌然后视为对其使用一张雷【杀】", true, "he" ); } - "step 2"; + ("step 2"); if (result.bool) { var cards = result.cards; player.give(cards, target); @@ -2357,7 +3302,8 @@ game.import("character", function () { nature: "thunder", isCard: true, }; - if (player.canUse(sha, target, false, false)) player.useCard(sha, target, false); + if (player.canUse(sha, target, false, false)) + player.useCard(sha, target, false); } }, ai: { @@ -2371,7 +3317,13 @@ game.import("character", function () { player.hasCard((card) => { return ( get.value(card) < 5 && - !["shan", "tao", "jiu", "wuxie", "caochuan"].includes(get.name(card)) + ![ + "shan", + "tao", + "jiu", + "wuxie", + "caochuan", + ].includes(get.name(card)) ); }, "he") ) @@ -2397,9 +3349,12 @@ game.import("character", function () { filter(event, player) { if (!event.cards.length) return true; return !game.hasPlayer2((current) => { - if (!current.hasClan("太原王氏") && current != player) return false; + if (!current.hasClan("太原王氏") && current != player) + return false; return current.hasHistory("lose", (evt) => { - return evt.getParent() == event && evt.hs.length > 0; + return ( + evt.getParent() == event && evt.hs.length > 0 + ); }); }); }, @@ -2420,12 +3375,18 @@ game.import("character", function () { delete player.storage.counttrigger[skill]; resetSkills.add(skill); } - if (typeof get.skillCount(skill) == "number" && get.skillCount(skill) >= 1) { + if ( + typeof get.skillCount(skill) == "number" && + get.skillCount(skill) >= 1 + ) { delete player.getStat("skill")[skill]; resetSkills.add(skill); } } - if (info.round && player.storage[skill + "_roundcount"]) { + if ( + info.round && + player.storage[skill + "_roundcount"] + ) { delete player.storage[skill + "_roundcount"]; resetSkills.add(skill); } @@ -2478,7 +3439,11 @@ game.import("character", function () { enable: "phaseUse", filter: (event, player) => game.hasPlayer((current) => - lib.skill.clanlianzhu_global.filterTarget(null, player, current) + lib.skill.clanlianzhu_global.filterTarget( + null, + player, + current + ) ), filterCard: (card, player) => game.hasPlayer( @@ -2498,15 +3463,26 @@ game.import("character", function () { (!target.storage.clanlianzhu || (target.storage.clanlianzhu && game.hasPlayer((current) => { - if (current == player || current == target) return false; - return current.inRangeOf(player) || current.inRangeOf(target); + if ( + current == player || + current == target + ) + return false; + return ( + current.inRangeOf(player) || + current.inRangeOf(target) + ); }))) ); }, selectTarget() { var player = _status.event.player; var count = game.countPlayer((current) => - lib.skill.clanlianzhu_global.filterTarget(null, player, current) + lib.skill.clanlianzhu_global.filterTarget( + null, + player, + current + ) ); return count == 1 ? -1 : 1; }, @@ -2534,13 +3510,21 @@ game.import("character", function () { if (target.storage.clanlianzhu) { if ( game.hasPlayer((current) => { - if (current == player || current == target) return false; - return current.inRangeOf(player) || current.inRangeOf(target); + if ( + current == player || + current == target + ) + return false; + return ( + current.inRangeOf(player) || + current.inRangeOf(target) + ); }) ) kita.add(target); } else { - if (player.countCards("he") > 0) bocchi.add(target); + if (player.countCards("he") > 0) + bocchi.add(target); } } }); @@ -2569,32 +3553,52 @@ game.import("character", function () { }, content() { "step 0"; - target.addTempSkill("clanlianzhu_targeted", "phaseUseAfter"); + target.addTempSkill( + "clanlianzhu_targeted", + "phaseUseAfter" + ); if (target.storage.clanlianzhu) event.goto(4); target.changeZhuanhuanji("clanlianzhu"); - "step 1"; + ("step 1"); player.recast(cards); - "step 2"; - if (!target.countCards("he") && !_status.connectMode) + ("step 2"); + if ( + !target.countCards("he") && + !_status.connectMode + ) event._result = { bool: false }; - else target.chooseCard("he", "联诛:是否重铸一张牌?", lib.filter.cardRecastable); - "step 3"; + else + target.chooseCard( + "he", + "联诛:是否重铸一张牌?", + lib.filter.cardRecastable + ); + ("step 3"); if (result.bool) { target.recast(result.cards); - if (get.color(cards[0]) === get.color(result.cards[0])) + if ( + get.color(cards[0]) === + get.color(result.cards[0]) + ) lib.skill.chenliuwushi.change(target, 1); } event.finish(); - "step 4"; + ("step 4"); target .chooseTarget( "联诛:选择其与你使用【杀】的目标", true, (card, player, target) => { - if (target == player || target == _status.event.sourcex) return false; + if ( + target == player || + target == _status.event.sourcex + ) + return false; return ( target.inRangeOf(player) || - target.inRangeOf(_status.event.sourcex) + target.inRangeOf( + _status.event.sourcex + ) ); } ) @@ -2607,45 +3611,68 @@ game.import("character", function () { ); }) .set("sourcex", player); - "step 5"; + ("step 5"); if (result.bool) { var targetx = result.targets[0]; event.targetx = targetx; target.line(targetx); event.targets = [player, target]; event.cards = []; - if (!event.isMine() && !event.isOnline()) game.delayx(); + if (!event.isMine() && !event.isOnline()) + game.delayx(); } else event.finish(); - "step 6"; + ("step 6"); var current = targets.shift(); current .chooseToUse(function (card, player, event) { if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "联诛:是否对" + get.translation(event.targetx) + "使用一张杀?") + return lib.filter.filterCard.apply( + this, + arguments + ); + }, "联诛:是否对" + + get.translation(event.targetx) + + "使用一张杀?") .set("targetRequired", true) .set("complexSelect", true) - .set("filterTarget", function (card, player, target) { - if ( - target != _status.event.sourcex && - !ui.selected.targets.includes(_status.event.sourcex) - ) - return false; - return lib.filter.targetEnabled.apply(this, arguments); - }) + .set( + "filterTarget", + function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes( + _status.event.sourcex + ) + ) + return false; + return lib.filter.targetEnabled.apply( + this, + arguments + ); + } + ) .set("sourcex", event.targetx) .set("addCount", false); - "step 7"; + ("step 7"); if (result.bool) cards.push(result.card); if (targets.length > 0) event.goto(6); - "step 8"; + ("step 8"); if (cards.length > 1) { const color = get.color(cards[0], false); if (color != "none") { for (let i = 1; i < cards.length; i++) { - const color2 = get.color(cards[i], false); - if (color !== color2 && color2 !== "none") { - lib.skill.chenliuwushi.change(target, -1); + const color2 = get.color( + cards[i], + false + ); + if ( + color !== color2 && + color2 !== "none" + ) { + lib.skill.chenliuwushi.change( + target, + -1 + ); break; } } @@ -2658,13 +3685,20 @@ game.import("character", function () { player(player, target) { if ( !target.storage.clanlianzhu && - player.hasCard((card) => get.value(card) < 5, "he") + player.hasCard( + (card) => get.value(card) < 5, + "he" + ) ) return 1; return 0; }, target(player, target) { - if (target.storage.clanlianzhu && player.hasSha()) return 1; + if ( + target.storage.clanlianzhu && + player.hasSha() + ) + return 1; return 0; }, }, @@ -2684,20 +3718,33 @@ game.import("character", function () { content() { "step 0"; player - .chooseTarget(get.prompt2("clanfangzhen"), (card, player, target) => { - return !target.isLinked(); - }) + .chooseTarget( + get.prompt2("clanfangzhen"), + (card, player, target) => { + return !target.isLinked(); + } + ) .set("ai", (target) => { var player = _status.event.player; if (_status.event.goon && target != player) { target.classList.add("linked"); target.classList.add("linked2"); try { - var cards = player.getCards("hs", (cardx) => { - if (get.name(cardx) != "sha") return false; - return game.hasNature(cardx, "linked"); - }); - cards.map((i) => [i, get.effect(target, i, player, player)]); + var cards = player.getCards( + "hs", + (cardx) => { + if (get.name(cardx) != "sha") + return false; + return game.hasNature( + cardx, + "linked" + ); + } + ); + cards.map((i) => [ + i, + get.effect(target, i, player, player), + ]); cards.sort((a, b) => b[1] - a[1]); } catch (e) { target.classList.remove("linked"); @@ -2708,42 +3755,77 @@ game.import("character", function () { var eff = cards[0][1]; if (eff > 0) return eff; return Math.max( - 2 * get.effect(target, { name: "draw" }, player, player) + - 0.6 * get.effect(player, { name: "draw" }, player, player), + 2 * + get.effect( + target, + { name: "draw" }, + player, + player + ) + + 0.6 * + get.effect( + player, + { name: "draw" }, + player, + player + ), get.recoverEffect(target, player, player) ); } return Math.max( - 2 * get.effect(target, { name: "draw" }, player, player) + - 0.6 * get.effect(player, { name: "draw" }, player, player), + 2 * + get.effect( + target, + { name: "draw" }, + player, + player + ) + + 0.6 * + get.effect( + player, + { name: "draw" }, + player, + player + ), get.recoverEffect(target, player, player) ); }) .set( "goon", player.countCards("hs", (card) => { - return get.name(card) == "jiu" && player.hasUseTarget(card); + return ( + get.name(card) == "jiu" && + player.hasUseTarget(card) + ); }) && - player.countCards("hs", (card) => { - if (get.name(card) != "sha") return false; - return game.hasNature(card, "linked"); - }) + player.countCards("hs", (card) => { + if (get.name(card) != "sha") return false; + return game.hasNature(card, "linked"); + }) ); - "step 1"; + ("step 1"); if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("clanfangzhen", target); player.addSkill("clanfangzhen_remove"); - player.markAuto("clanfangzhen_remove", [target.getSeatNum()]); + player.markAuto("clanfangzhen_remove", [ + target.getSeatNum(), + ]); target.link(true); var choices = ["选项一"], choiceList = [ - "摸两张牌,然后交给" + get.translation(target) + "两张牌", + "摸两张牌,然后交给" + + get.translation(target) + + "两张牌", "令" + get.translation(target) + "回复1点体力", ]; if (target.isDamaged()) choices.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; + else + choiceList[1] = + '' + + choiceList[1] + + ""; player .chooseControl(choices) .set("prompt", "放赈:请选择一项") @@ -2754,17 +3836,32 @@ game.import("character", function () { if (!target.isDamaged()) return 0; if ( get.attitude(player, target) <= 0 && - player.countCards("he", (card) => get.value(card) < 0) >= 2 + player.countCards( + "he", + (card) => get.value(card) < 0 + ) >= 2 ) return 0; - return 2 * get.effect(target, { name: "draw" }, player, player) + - 0.6 * get.effect(player, { name: "draw" }, player, player) > + return 2 * + get.effect( + target, + { name: "draw" }, + player, + player + ) + + 0.6 * + get.effect( + player, + { name: "draw" }, + player, + player + ) > get.recoverEffect(target, player, player) ? 0 : 1; }); } else event.finish(); - "step 2"; + ("step 2"); if (result.control == "选项一") { player.draw(2); if (player == target) event.finish(); @@ -2772,7 +3869,7 @@ game.import("character", function () { target.recover(); event.finish(); } - "step 3"; + ("step 3"); if (!player.countCards("he")) event.finish(); else if (player.countCards("he") <= 2) event._result = { @@ -2780,9 +3877,14 @@ game.import("character", function () { cards: player.getCards("he"), }; else { - player.chooseCard("放赈:交给" + get.translation(target) + "两张牌", "he", 2, true); + player.chooseCard( + "放赈:交给" + get.translation(target) + "两张牌", + "he", + 2, + true + ); } - "step 4"; + ("step 4"); if (result.bool) { player.give(result.cards, target); } @@ -2798,7 +3900,9 @@ game.import("character", function () { locked: false, charlotte: true, filter(event, player) { - return player.getStorage("clanfangzhen_remove").includes(game.roundNumber); + return player + .getStorage("clanfangzhen_remove") + .includes(game.roundNumber); }, content() { player.removeSkills("clanfangzhen"); @@ -2810,7 +3914,9 @@ game.import("character", function () { audio: 2, trigger: { player: "phaseUseEnd" }, filter(event, player) { - return game.hasPlayer((current) => player.canCompare(current)); + return game.hasPlayer((current) => + player.canCompare(current) + ); }, direct: true, content() { @@ -2825,11 +3931,21 @@ game.import("character", function () { ) .set("ai", (target) => { var player = _status.event.player; - var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b)); + var ts = target + .getCards("h") + .sort((a, b) => get.number(a) - get.number(b)); if (get.attitude(player, target) < 0) { - var hs = player.getCards("h").sort((a, b) => get.number(a) - get.number(b)); + var hs = player + .getCards("h") + .sort( + (a, b) => get.number(a) - get.number(b) + ); if (!hs.length || !ts.length) return 0; - if (get.type(hs[0], null, false) == "basic" && get.value(hs[0]) > 6) return 0; + if ( + get.type(hs[0], null, false) == "basic" && + get.value(hs[0]) > 6 + ) + return 0; if ( get.number(hs[0]) < get.number(ts[0]) || get.type(hs[0], null, false) == "basic" @@ -2839,14 +3955,14 @@ game.import("character", function () { } return get.type(ts[0]) != "basic"; }); - "step 1"; + ("step 1"); if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("clanliuju", target); player.chooseToCompare(target).set("small", true); } else event.finish(); - "step 2"; + ("step 2"); if (!result.tie) { var loser = result.bool ? target : player; var cards = []; @@ -2862,25 +3978,39 @@ game.import("character", function () { ); }); event.loser = loser; - event.distance = [get.distance(player, target), get.distance(target, player)]; + event.distance = [ + get.distance(player, target), + get.distance(target, player), + ]; if (cards.length) event.cards = cards; else event.finish(); } else event.finish(); - "step 3"; + ("step 3"); var cardsx = cards.filter( - (i) => get.position(i, true) == "d" && event.loser.hasUseTarget(i) + (i) => + get.position(i, true) == "d" && + event.loser.hasUseTarget(i) ); if (!cardsx.length) event.goto(6); else event.loser - .chooseButton(["留驹:是否使用其中的一张牌?", cardsx]) + .chooseButton([ + "留驹:是否使用其中的一张牌?", + cardsx, + ]) .set("filterButton", (button) => { - return _status.event.player.hasUseTarget(button.link); + return _status.event.player.hasUseTarget( + button.link + ); }) .set("ai", (button) => { - return _status.event.player.getUseValue(button.link) + 0.1; + return ( + _status.event.player.getUseValue( + button.link + ) + 0.1 + ); }); - "step 4"; + ("step 4"); if (result.bool) { var card = result.links[0]; event.cards.remove(card); @@ -2888,13 +4018,16 @@ game.import("character", function () { game.delayx(); event.loser.chooseUseTarget(true, card, false); } else event.goto(6); - "step 5"; + ("step 5"); if ( - cards.filter((i) => get.position(i, true) == "d" && event.loser.hasUseTarget(i)) - .length + cards.filter( + (i) => + get.position(i, true) == "d" && + event.loser.hasUseTarget(i) + ).length ) event.goto(3); - "step 6"; + ("step 6"); if ( get.distance(player, target) != event.distance[0] || get.distance(target, player) != event.distance[1] @@ -2945,15 +4078,22 @@ game.import("character", function () { content() { "step 0"; player - .chooseTarget(get.prompt2("clanlianhe"), 2, (card, player, target) => { - return !target.isLinked(); - }) + .chooseTarget( + get.prompt2("clanlianhe"), + 2, + (card, player, target) => { + return !target.isLinked(); + } + ) .set("ai", (target) => { - var att = get.attitude(_status.event.player, target); + var att = get.attitude( + _status.event.player, + target + ); if (att > 0) att /= 1.2; return Math.abs(att); }); - "step 1"; + ("step 1"); if (result.bool) { var targets = result.targets.sortBySeat(); targets.forEach((i) => i.link(true)); @@ -2971,43 +4111,53 @@ game.import("character", function () { popup: false, onremove: true, filter(event, player) { - return player.getStorage("clanlianhe_effect").includes(event.player); + return player + .getStorage("clanlianhe_effect") + .includes(event.player); }, marktext: "连", intro: { content: "已选择目标:$" }, content() { "step 0"; - player.unmarkAuto("clanlianhe_effect", [trigger.player]); + player.unmarkAuto("clanlianhe_effect", [ + trigger.player, + ]); if (trigger.name == "die") event.finish(); - "step 1"; + ("step 1"); if ( trigger.player.hasHistory("gain", (evt) => { return ( - evt.getParent().name == "draw" && evt.getParent("phaseUse") == trigger + evt.getParent().name == "draw" && + evt.getParent("phaseUse") == trigger ); }) ) event.finish(); else { - player.logSkill("clanlianhe_effect", trigger.player); + player.logSkill( + "clanlianhe_effect", + trigger.player + ); var num = 0; trigger.player.getHistory("gain", (evt) => { - if (evt.getParent("phaseUse") != trigger) return false; + if (evt.getParent("phaseUse") != trigger) + return false; num += evt.cards.length; }); num = Math.min(num, 3); event.num = num; if (num <= 1) event._result = { bool: false }; else { - var pos = player == trigger.player ? "e" : "he"; + var pos = + player == trigger.player ? "e" : "he"; trigger.player .chooseCard( "连和:交给" + - get.translation(player) + - get.cnNumber(num - 1) + - "张牌,或点“取消”令其摸" + - get.cnNumber(num + 1) + - "张牌", + get.translation(player) + + get.cnNumber(num - 1) + + "张牌,或点“取消”令其摸" + + get.cnNumber(num + 1) + + "张牌", num - 1, pos ) @@ -3015,10 +4165,16 @@ game.import("character", function () { if (_status.event.draw) return 0; return 5 - get.value(card); }) - .set("draw", get.attitude(trigger.player, player) >= 0); + .set( + "draw", + get.attitude( + trigger.player, + player + ) >= 0 + ); } } - "step 2"; + ("step 2"); if (result.bool) { trigger.player.give(result.cards, player); } else player.draw(num + 1); @@ -3030,7 +4186,9 @@ game.import("character", function () { audio: 2, trigger: { player: "phaseUseEnd" }, filter(event, player) { - return game.hasPlayer((current) => player.canCompare(current)); + return game.hasPlayer((current) => + player.canCompare(current) + ); }, direct: true, content() { @@ -3046,8 +4204,16 @@ game.import("character", function () { .set("ai", (target) => { var player = _status.event.player; if (get.attitude(player, target) <= 0) { - var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); - var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + var hs = player + .getCards("h") + .sort( + (a, b) => get.number(b) - get.number(a) + ); + var ts = target + .getCards("h") + .sort( + (a, b) => get.number(b) - get.number(a) + ); if (!hs.length || !ts.length) return 0; if ( get.number(hs[0]) > get.number(ts[0]) && @@ -3059,42 +4225,60 @@ game.import("character", function () { } return 0; }); - "step 1"; + ("step 1"); if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("clanhuanjia", target); player.chooseToCompare(target); } else event.finish(); - "step 2"; + ("step 2"); if (!result.tie) { var winner = result.bool ? player : target; var cards = []; game.getGlobalHistory("cardMove", (evt) => { - if (evt.getParent(3) == event) cards.addArray(evt.cards.filterInD("d")); + if (evt.getParent(3) == event) + cards.addArray(evt.cards.filterInD("d")); }); event.winner = winner; if (cards.length) event.cards = cards; else event.finish(); } else event.finish(); - "step 3"; + ("step 3"); var cardsx = cards.filter( - (i) => get.position(i, true) == "d" && event.winner.hasUseTarget(i) + (i) => + get.position(i, true) == "d" && + event.winner.hasUseTarget(i) ); if (!cardsx.length) event.goto(6); else event.winner - .chooseButton(["缓颊:是否使用其中的一张牌?", cardsx]) + .chooseButton([ + "缓颊:是否使用其中的一张牌?", + cardsx, + ]) .set("filterButton", (button) => { - return _status.event.player.hasUseTarget(button.link); + return _status.event.player.hasUseTarget( + button.link + ); }) .set("ai", (button) => { var damage = 1; - if (_status.event.att > 2 && get.tag(button.link, "damage")) damage *= 2; - return _status.event.player.getUseValue(button.link) * damage + 0.1; + if ( + _status.event.att > 2 && + get.tag(button.link, "damage") + ) + damage *= 2; + return ( + _status.event.player.getUseValue( + button.link + ) * + damage + + 0.1 + ); }) .set("att", get.attitude(event.winner, player)); - "step 4"; + ("step 4"); if (result.bool) { var card = result.links[0]; event.card = card; @@ -3103,7 +4287,7 @@ game.import("character", function () { game.delayx(); event.winner.chooseUseTarget(true, card, false); } - "step 5"; + ("step 5"); if ( game.hasPlayer2((current) => { return current.hasHistory( @@ -3112,11 +4296,18 @@ game.import("character", function () { ); }) ) { - var skills = player.getSkills(null, false, false).filter((skill) => { - var info = get.info(skill); - if (!info || get.is.empty(info) || info.charlotte) return false; - return true; - }); + var skills = player + .getSkills(null, false, false) + .filter((skill) => { + var info = get.info(skill); + if ( + !info || + get.is.empty(info) || + info.charlotte + ) + return false; + return true; + }); player .chooseControl(skills) .set( @@ -3125,7 +4316,8 @@ game.import("character", function () { return ( '
    【' + get.translation( - lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) + lib.translate[i + "_ab"] || + get.translation(i).slice(0, 2) ) + "】
    " + get.skillInfoTranslation(i, player) + @@ -3138,12 +4330,23 @@ game.import("character", function () { .set("ai", () => { var choices = _status.event.controls.slice(); var value = (skill) => - get.skillRank(skill, "in") + get.skillRank(skill, "out"); - choices = choices.map((skill) => [skill, value(skill)]); - var list = choices.sort((a, b) => a[1] - b[1])[0]; + get.skillRank(skill, "in") + + get.skillRank(skill, "out"); + choices = choices.map((skill) => [ + skill, + value(skill), + ]); + var list = choices.sort( + (a, b) => a[1] - b[1] + )[0]; if (list[1] < 2) return list[0]; else { - if (_status.event.controls.includes("clanxumin")) return "clanxumin"; + if ( + _status.event.controls.includes( + "clanxumin" + ) + ) + return "clanxumin"; return list[0]; } }); @@ -3151,7 +4354,7 @@ game.import("character", function () { player.gain(cards, "gain2"); event.finish(); } - "step 6"; + ("step 6"); player.removeSkills(result.control); }, ai: { @@ -3165,11 +4368,15 @@ game.import("character", function () { direct: true, forced: true, filter(event, player) { - if (!game.hasPlayer((current) => current != player)) return false; + if (!game.hasPlayer((current) => current != player)) + return false; const type = get.type2(event.card); return ( player - .getRoundHistory("useCard", (evt) => get.type2(evt.card) == type) + .getRoundHistory( + "useCard", + (evt) => get.type2(evt.card) == type + ) .indexOf(event) == 0 ); }, @@ -3187,8 +4394,10 @@ game.import("character", function () { .chooseTarget( "三恇:选择一名其他角色", "令其交给你至少X张牌" + - (cards.length ? ",然后其获得" + get.translation(cards) : "") + - "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)", + (cards.length + ? ",然后其获得" + get.translation(cards) + : "") + + "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)", true, lib.filter.notMe ) @@ -3197,7 +4406,10 @@ game.import("character", function () { num = lib.skill.clansankuang.getNum(target); if (num == 0) return att; if (_status.event.goon) return -att; - return -Math.sqrt(Math.abs(att)) - lib.skill.clansankuang.getNum(target); + return ( + -Math.sqrt(Math.abs(att)) - + lib.skill.clansankuang.getNum(target) + ); }) .set( "goon", @@ -3206,7 +4418,7 @@ game.import("character", function () { trigger.cards.map((i) => get.value(i)) ) <= 5 || trigger.cards.filterInD("oe").length == 0 ); - "step 1"; + ("step 1"); if (result.bool) { var target = result.targets[0], num = lib.skill.clansankuang.getNum(target), @@ -3228,27 +4440,34 @@ game.import("character", function () { "prompt", num > 0 ? "是否交给" + - get.translation(player) + - "任意张牌" + - (cards.length ? "并获得" + get.translation(cards) : "") + - "?" + get.translation(player) + + "任意张牌" + + (cards.length + ? "并获得" + + get.translation(cards) + : "") + + "?" : "交给" + - get.translation(player) + - "至少" + - get.cnNumber(num) + - "张牌" + get.translation(player) + + "至少" + + get.cnNumber(num) + + "张牌" ); } } else event.finish(); - "step 2"; + ("step 2"); if (result.bool) { var cards = result.cards; target.give(cards, player); game.delayx(); } else event.finish(); - "step 3"; + ("step 3"); if (trigger.cards.filterInD().length) - target.gain(trigger.cards.filterInD(), "gain2", "bySelf"); + target.gain( + trigger.cards.filterInD(), + "gain2", + "bySelf" + ); else if (trigger.cards.filterInD("e").length) target.gain( trigger.cards.filterInD("e"), @@ -3259,7 +4478,12 @@ game.import("character", function () { ai: { reverseOrder: true, skillTagFilter(player) { - if (player.getHistory("useCard", (evt) => get.type(evt.card) == "equip").length > 0) + if ( + player.getHistory( + "useCard", + (evt) => get.type(evt.card) == "equip" + ).length > 0 + ) return false; }, effect: { @@ -3267,8 +4491,10 @@ game.import("character", function () { if ( player == target && get.type(card) == "equip" && - !player.getHistory("useCard", (evt) => get.type(evt.card) == "equip") - .length == 0 + !player.getHistory( + "useCard", + (evt) => get.type(evt.card) == "equip" + ).length == 0 ) return [1, 3]; }, @@ -3290,7 +4516,10 @@ game.import("character", function () { }, forced: true, filter(event, player) { - var history = player.getAllHistory("useSkill", (evt) => evt.skill == "clansankuang"); + var history = player.getAllHistory( + "useSkill", + (evt) => evt.skill == "clansankuang" + ); if (!history.length) return false; var target = history[0].targets[0]; if (target.countCards("h")) return false; @@ -3314,29 +4543,40 @@ game.import("character", function () { locked: false, filter(event, player) { return ( - (event.card.name == "sha" || get.type(event.card) == "trick") && + (event.card.name == "sha" || + get.type(event.card) == "trick") && player.countCards("h", event.card.name) > 0 ); }, content() { var cards = player.getCards("h", trigger.card.name); - player.showCards(cards, get.translation(player) + "发动了【神君】"); + player.showCards( + cards, + get.translation(player) + "发动了【神君】" + ); player.markSkill("clanshenjun"); player.addGaintag(cards, "clanshenjun"); for (var name of lib.phaseName) { var evt = _status.event.getParent(name); if (!evt || evt.name != name) continue; - player.addTempSkill("clanshenjun_viewAs", name + "After"); + player.addTempSkill( + "clanshenjun_viewAs", + name + "After" + ); break; } }, marktext: "君", intro: { markcount(storage, player) { - return player.countCards("h", (card) => card.hasGaintag("clanshenjun")); + return player.countCards("h", (card) => + card.hasGaintag("clanshenjun") + ); }, mark(dialog, content, player) { - var cards = player.getCards("h", (card) => card.hasGaintag("clanshenjun")); + var cards = player.getCards("h", (card) => + card.hasGaintag("clanshenjun") + ); if (cards.length) { dialog.addAuto(cards); } else return "无展示牌"; @@ -3355,13 +4595,19 @@ game.import("character", function () { ], }, filter(event, player) { - return player.countCards("h", (card) => card.hasGaintag("clanshenjun")) > 0; + return ( + player.countCards("h", (card) => + card.hasGaintag("clanshenjun") + ) > 0 + ); }, forced: true, charlotte: true, content() { "step 0"; - var cards = player.getCards("h", (card) => card.hasGaintag("clanshenjun")); + var cards = player.getCards("h", (card) => + card.hasGaintag("clanshenjun") + ); var list = [], names = []; for (var card of cards) { @@ -3371,7 +4617,12 @@ game.import("character", function () { if (nature && nature.length) { namex += nature; if (names.includes(namex)) continue; - list.push([get.type(card), "", name, nature]); + list.push([ + get.type(card), + "", + name, + nature, + ]); } else { if (names.includes(namex)) continue; list.push([get.type(card), "", name]); @@ -3379,7 +4630,9 @@ game.import("character", function () { names.push(namex); } list.sort((a, b) => { - var del1 = lib.inpile.indexOf(a[2]) - lib.inpile.indexOf(b[2]); + var del1 = + lib.inpile.indexOf(a[2]) - + lib.inpile.indexOf(b[2]); if (del1 != 0) return del1; var a1 = 0, b1 = 0; @@ -3389,7 +4642,9 @@ game.import("character", function () { }); player .chooseButton([ - "是否将" + get.cnNumber(cards.length) + "张牌当下列一张牌使用?", + "是否将" + + get.cnNumber(cards.length) + + "张牌当下列一张牌使用?", [list, "vcard"], ]) .set("ai", function (button) { @@ -3398,15 +4653,19 @@ game.import("character", function () { nature: button.link[3], }); }); - "step 1"; + ("step 1"); if (result.bool) { var name = result.links[0][2], nature = result.links[0][3]; - var cards = player.getCards("h", (card) => card.hasGaintag("clanshenjun")); + var cards = player.getCards("h", (card) => + card.hasGaintag("clanshenjun") + ); game.broadcastAll( function (num, card) { - lib.skill.clanshenjun_backup.selectCard = num; - lib.skill.clanshenjun_backup.viewAs = card; + lib.skill.clanshenjun_backup.selectCard = + num; + lib.skill.clanshenjun_backup.viewAs = + card; }, cards.length, { name: name, nature: nature } @@ -3415,19 +4674,19 @@ game.import("character", function () { next.set( "openskilldialog", "将" + - get.cnNumber(cards.length) + - "张牌当做" + - (get.translation(nature) || "") + - "【" + - get.translation(name) + - "】使用" + get.cnNumber(cards.length) + + "张牌当做" + + (get.translation(nature) || "") + + "【" + + get.translation(name) + + "】使用" ); next.set("norestore", true); next.set("addCount", false); next.set("_backupevent", "clanshenjun_backup"); next.set("custom", { add: {}, - replace: { window() { } }, + replace: { window() {} }, }); next.backup("clanshenjun_backup"); } @@ -3454,7 +4713,12 @@ game.import("character", function () { }, forced: true, filter(event, player) { - if (game.getGlobalHistory("changeHp", (evt) => evt.player == player).length != 1) + if ( + game.getGlobalHistory( + "changeHp", + (evt) => evt.player == player + ).length != 1 + ) return false; var cards = player.getCards("h"), map = {}; @@ -3469,10 +4733,15 @@ game.import("character", function () { if (map[i] > 0) list.push([i, map[i]]); } list.sort((a, b) => b[1] - a[1]); - return list[0][0] == "trick" && (list.length == 1 || list[0][1] > list[1][1]); + return ( + list[0][0] == "trick" && + (list.length == 1 || list[0][1] > list[1][1]) + ); }, content() { - player.showHandcards(get.translation(player) + "发动了【八龙】"); + player.showHandcards( + get.translation(player) + "发动了【八龙】" + ); player.drawTo(game.countPlayer()); }, }, @@ -3487,7 +4756,7 @@ game.import("character", function () { content() { "step 0"; target.recover(); - "step 1"; + ("step 1"); var name = get.translation(target); player .chooseControl() @@ -3505,13 +4774,23 @@ game.import("character", function () { nature: "ice", isCard: true, }; - var eff = get.effect(player, card, target, player), - eff2 = get.effect(target, card, player, player); + var eff = get.effect( + player, + card, + target, + player + ), + eff2 = get.effect( + target, + card, + player, + player + ); if (eff > eff2) return "选项一"; else return "选项二"; })() ); - "step 2"; + ("step 2"); var players = [target, player]; if (result.control == "选项二") players.reverse(); var card = { name: "sha", nature: "ice", isCard: true }; @@ -3547,7 +4826,8 @@ game.import("character", function () { audio: 2, trigger: { global: "damageEnd" }, filter(event, player) { - if (!event.hasNature() || !event.player.isIn()) return false; + if (!event.hasNature() || !event.player.isIn()) + return false; return ( game.countPlayer2((current) => { return current.hasHistory("damage", (evt) => { @@ -3579,7 +4859,12 @@ game.import("character", function () { var info = get.info(skill); if (!info || info.charlotte) return false; if (targets && targets.length) { - if (targets.filter((i) => player.differentSexFrom(i)).length > 0) return true; + if ( + targets.filter((i) => + player.differentSexFrom(i) + ).length > 0 + ) + return true; } return false; }); @@ -3600,7 +4885,8 @@ game.import("character", function () { onremove: true, marktext: "钗", intro: { - content: (storage, player) => "对象:" + get.translation(storage), + content: (storage, player) => + "对象:" + get.translation(storage), }, group: "clanfenchai_audio", filter(event, player) { @@ -3609,13 +4895,19 @@ game.import("character", function () { if (!targets || !targets.length) return false; var info = get.info(event.sourceSkill || event.skill); if (!info || info.charlotte) return false; - if (player.getStorage("clanfenchai").length != 0) return false; - return targets.filter((i) => player.differentSexFrom(i)).length > 0; + if (player.getStorage("clanfenchai").length != 0) + return false; + return ( + targets.filter((i) => player.differentSexFrom(i)) + .length > 0 + ); }, content() { player.markAuto( "clanfenchai", - trigger.targets.filter((i) => player.differentSexFrom(i)) + trigger.targets.filter((i) => + player.differentSexFrom(i) + ) ); }, subSkill: { @@ -3626,16 +4918,23 @@ game.import("character", function () { filter(event, player) { return player.getStorage("clanfenchai").length; }, - content() { }, + content() {}, }, }, mod: { suit(card, suit) { var player = get.owner(card) || _status.event.player; - if (!player || !player.judging || player.judging[0] != card) return; + if ( + !player || + !player.judging || + player.judging[0] != card + ) + return; var storage = player.getStorage("clanfenchai"); if (!storage.length) return; - return storage.filter((i) => i.isIn()).length > 0 ? "heart" : "spade"; + return storage.filter((i) => i.isIn()).length > 0 + ? "heart" + : "spade"; }, }, }, @@ -3646,13 +4945,21 @@ game.import("character", function () { filter(event, player) { return ( !player.isDisabledJudge() || - player.countCards("h", (card) => ["sha", "shan"].includes(get.name(card))) > 0 + player.countCards("h", (card) => + ["sha", "shan"].includes(get.name(card)) + ) > 0 ); }, chooseButton: { dialog(event, player) { - var dialog = ui.create.dialog("烈誓:选择一项", "hidden"); - dialog.add([lib.skill.clanlieshi.choices.slice(), "textbutton"]); + var dialog = ui.create.dialog( + "烈誓:选择一项", + "hidden" + ); + dialog.add([ + lib.skill.clanlieshi.choices.slice(), + "textbutton", + ]); return dialog; }, filter(button, player) { @@ -3662,32 +4969,49 @@ game.import("character", function () { return ( num > 0 && num == - player.getDiscardableCards(player, "h").filter((i) => get.name(i) == link) - .length + player + .getDiscardableCards(player, "h") + .filter((i) => get.name(i) == link).length ); }, check(button) { var player = _status.event.player; switch (button.link) { case "damage": - if (get.damageEffect(player, player, player, "fire") >= 0) return 10; if ( - player.hp >= Math.max(2, 3 - player.getFriends().length) && + get.damageEffect( + player, + player, + player, + "fire" + ) >= 0 + ) + return 10; + if ( + player.hp >= + Math.max( + 2, + 3 - player.getFriends().length + ) && game.countPlayer( (current) => get.attitude(player, current) < 0 && current.countCards("h", (card) => - ["sha", "shan"].includes(get.name(card)) + ["sha", "shan"].includes( + get.name(card) + ) ) ) ) return 0.8 + Math.random(); return 0; case "shan": - if (player.countCards("h", "shan") == 1) return 8 + Math.random(); + if (player.countCards("h", "shan") == 1) + return 8 + Math.random(); return 1 + Math.random(); case "sha": - if (player.countCards("h", "sha") == 1) return 8 + Math.random(); + if (player.countCards("h", "sha") == 1) + return 8 + Math.random(); return 0.9 + Math.random(); } }, @@ -3697,7 +5021,8 @@ game.import("character", function () { return next; }, prompt(links) { - if (links[0] == "damage") return "废除判定区并受到1点火焰伤害"; + if (links[0] == "damage") + return "废除判定区并受到1点火焰伤害"; return "弃置所有【" + get.translation(links[0]) + "】"; }, }, @@ -3709,10 +5034,16 @@ game.import("character", function () { ai: { order(item, player) { if (!player) return; - var eff = get.damageEffect(player, player, player, "fire"), + var eff = get.damageEffect( + player, + player, + player, + "fire" + ), disabled = !player.isDisabledJudge(); if ( - (player.countCards("h", "sha") == 1 || player.countCards("h", "shan") == 1) && + (player.countCards("h", "sha") == 1 || + player.countCards("h", "shan") == 1) && eff < 0 && !disabled ) @@ -3720,22 +5051,35 @@ game.import("character", function () { else if (eff >= 0 && !disabled) return 5.8; if ( !disabled && - !player.countCards("h", (card) => ["sha", "shan"].includes(get.name(card))) + !player.countCards("h", (card) => + ["sha", "shan"].includes(get.name(card)) + ) ) { if ( - (!player.hasSkill("clanhuanyin") || !player.canSave(player)) && + (!player.hasSkill("clanhuanyin") || + !player.canSave(player)) && player.hp <= 1 ) return 0; - if (player.canSave(player) && player.hp == 1 && player.countCards("h") <= 1) + if ( + player.canSave(player) && + player.hp == 1 && + player.countCards("h") <= 1 + ) return 2.6; if ( - player.hp < Math.max(2, 3 - player.getFriends().length) || + player.hp < + Math.max( + 2, + 3 - player.getFriends().length + ) || !game.countPlayer( (current) => get.attitude(player, current) < 0 && current.countCards("h", (card) => - ["sha", "shan"].includes(get.name(card)) + ["sha", "shan"].includes( + get.name(card) + ) ) ) ) @@ -3761,57 +5105,91 @@ game.import("character", function () { event.choice = choice; if (choice == "damage") { player.damage("fire"); - if (!player.isDisabledJudge()) player.disableJudge(); + if (!player.isDisabledJudge()) + player.disableJudge(); } else { var cards = player.getCards("h", choice); if (cards.length) player.discard(cards); } - "step 1"; - if (!player.isIn() || !game.hasPlayer((current) => current != player)) + ("step 1"); + if ( + !player.isIn() || + !game.hasPlayer((current) => current != player) + ) event.finish(); else player - .chooseTarget("烈誓:令一名其他角色选择另一项", lib.filter.notMe, true) + .chooseTarget( + "烈誓:令一名其他角色选择另一项", + lib.filter.notMe, + true + ) .set("ai", (target) => { var player = _status.event.player, - chosen = _status.event.getParent().choice, + chosen = + _status.event.getParent() + .choice, att = get.attitude(player, target); if (chosen == "damage") { if (att > 0) return 0; return ( -att / 2 + target.countCards("h", (card) => - ["sha", "shan"].includes(get.name(card)) + ["sha", "shan"].includes( + get.name(card) + ) ) ); } - return get.damageEffect(target, player, player, "fire"); + return get.damageEffect( + target, + player, + player, + "fire" + ); }); - "step 2"; + ("step 2"); if (result.bool) { var target = result.targets[0]; event.target = target; player.line(target, "fire"); var list = [], choice = event.choice; - var choiceList = lib.skill.clanlieshi.choices.slice(); - choiceList = choiceList.map((link, ind, arr) => { - link = link[1]; - var ok = true; - if (arr[ind][0] == choice) { - link += "(" + get.translation(player) + "已选)"; - ok = false; + var choiceList = + lib.skill.clanlieshi.choices.slice(); + choiceList = choiceList.map( + (link, ind, arr) => { + link = link[1]; + var ok = true; + if (arr[ind][0] == choice) { + link += + "(" + + get.translation(player) + + "已选)"; + ok = false; + } + if (ind == 0) { + if (target.isDisabledJudge()) + ok = false; + } else if (ind > 0) { + var name = + ind == 1 ? "shan" : "sha"; + if (!target.countCards("h", name)) + ok = false; + } + if (!ok) + link = + '' + + link + + ""; + else + list.push( + "选项" + + get.cnNumber(ind + 1, true) + ); + return link; } - if (ind == 0) { - if (target.isDisabledJudge()) ok = false; - } else if (ind > 0) { - var name = ind == 1 ? "shan" : "sha"; - if (!target.countCards("h", name)) ok = false; - } - if (!ok) link = '' + link + ""; - else list.push("选项" + get.cnNumber(ind + 1, true)); - return link; - }); + ); if (!list.length) { game.log(target, "没有能执行的选项"); event.finish(); @@ -3821,43 +5199,71 @@ game.import("character", function () { .chooseControl(list) .set("choiceList", choiceList) .set("ai", () => { - var controls = _status.event.controls.slice(), + var controls = + _status.event.controls.slice(), player = _status.event.player, - user = _status.event.getParent().player; - if (controls.length == 1) return controls[0]; + user = + _status.event.getParent() + .player; + if (controls.length == 1) + return controls[0]; if ( controls.includes("选项一") && - get.damageEffect(player, user, player, "fire") >= 0 + get.damageEffect( + player, + user, + player, + "fire" + ) >= 0 ) return "选项一"; if ( controls.includes("选项一") && player.hp <= 2 && player.countCards("h", (card) => - ["sha", "shan"].includes(get.name(card)) + ["sha", "shan"].includes( + get.name(card) + ) ) <= 3 ) controls.remove("选项一"); - if (controls.length == 1) return controls[0]; + if (controls.length == 1) + return controls[0]; if ( player .getCards("h", "sha") - .reduce((p, c) => p + get.value(c, player), 0) > + .reduce( + (p, c) => + p + + get.value(c, player), + 0 + ) > player .getCards("h", "sha") - .reduce((p, c) => p + get.value(c, player), 0) + .reduce( + (p, c) => + p + + get.value(c, player), + 0 + ) ) { - if (controls.includes("选项三")) return "选项三"; - } else if (controls.includes("选项二")) return "选项二"; + if (controls.includes("选项三")) + return "选项三"; + } else if (controls.includes("选项二")) + return "选项二"; return controls.randomGet(); }); } else event.finish(); - "step 3"; + ("step 3"); if (result.control == "选项一") { - if (!target.isDisabledJudge()) target.disableJudge(); + if (!target.isDisabledJudge()) + target.disableJudge(); target.damage("fire"); } else { - var cards = target.getCards("h", result.control == "选项二" ? "shan" : "sha"); + var cards = target.getCards( + "h", + result.control == "选项二" ? "shan" : "sha" + ); if (cards.length) target.discard(cards); } }, @@ -3877,33 +5283,46 @@ game.import("character", function () { const suit = get.suit(event.card); if ( player - .getRoundHistory("useCard", (evt) => get.suit(evt.card) == suit) + .getRoundHistory( + "useCard", + (evt) => get.suit(evt.card) == suit + ) .indexOf(event) != 0 ) return false; return ( - (event.targets && event.targets.length == 1 && !event.targets[0].isLinked()) || + (event.targets && + event.targets.length == 1 && + !event.targets[0].isLinked()) || player.hasCard( - (card) => get.suit(card) == get.suit(event.card) && player.canRecast(card), + (card) => + get.suit(card) == get.suit(event.card) && + player.canRecast(card), "h" ) ); }, content() { "step 0"; - if (trigger.targets && trigger.targets.length == 1 && !trigger.targets[0].isLinked()) { + if ( + trigger.targets && + trigger.targets.length == 1 && + !trigger.targets[0].isLinked() + ) { trigger.targets[0].link(true); event.link = true; } var cards = player.getCards( "h", - (card) => get.suit(card) == get.suit(trigger.card) && player.canRecast(card) + (card) => + get.suit(card) == get.suit(trigger.card) && + player.canRecast(card) ); if (cards.length > 0) { player.recast(cards); event.recast = true; } - "step 1"; + ("step 1"); if (event.link && event.recast) player.draw(); }, group: "clandianzhan_count", @@ -3914,7 +5333,10 @@ game.import("character", function () { filter(event, player) { let suit = get.suit(event.card); return ( - lib.suits.includes(suit) && !player.getStorage("clandianzhan").includes(suit) + lib.suits.includes(suit) && + !player + .getStorage("clandianzhan") + .includes(suit) ); }, forced: true, @@ -3922,17 +5344,25 @@ game.import("character", function () { content() { let suits = player .getRoundHistory("useCard", (evt) => { - return lib.suits.includes(get.suit(evt.card)); + return lib.suits.includes( + get.suit(evt.card) + ); }) .reduce((list, evt) => { return list.add(get.suit(evt.card)); }, []) - .sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b)); + .sort( + (a, b) => + lib.suits.indexOf(a) - + lib.suits.indexOf(b) + ); if (!player.storage.clandianzhan) { - player.when({ global: "roundStart" }).then(() => { - delete player.storage.clandianzhan; - player.unmarkSkill("clandianzhan"); - }); + player + .when({ global: "roundStart" }) + .then(() => { + delete player.storage.clandianzhan; + player.unmarkSkill("clandianzhan"); + }); } player.storage.clandianzhan = suits; player.markSkill("clandianzhan"); @@ -3947,7 +5377,10 @@ game.import("character", function () { .reduce((list, evt) => { return list.add(get.suit(evt.card)); }, []) - .sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b)); + .sort( + (a, b) => + lib.suits.indexOf(a) - lib.suits.indexOf(b) + ); if (suits.length) { if (!player.storage.clandianzhan) { player.when({ global: "roundStart" }).then(() => { @@ -3974,7 +5407,13 @@ game.import("character", function () { }, clandaojie: { audio: 2, - audioname: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"], + audioname: [ + "clan_xunshu", + "clan_xunchen", + "clan_xuncai", + "clan_xuncan", + "clan_xunyou", + ], trigger: { player: "useCardAfter" }, filter(event, player) { return ( @@ -3984,7 +5423,8 @@ game.import("character", function () { player .getHistory("useCard", (evt) => { return ( - get.type(evt.card, null, false) == "trick" && !get.tag(evt.card, "damage") + get.type(evt.card, null, false) == + "trick" && !get.tag(evt.card, "damage") ); }) .indexOf(event) == 0 @@ -3994,17 +5434,20 @@ game.import("character", function () { clanSkill: true, content() { "step 0"; - var skills = player.getSkills(null, false, false).filter((skill) => { - var info = get.info(skill); - if ( - !info || - info.charlotte || - !get.is.locked(skill) || - get.skillInfoTranslation(skill, player).length == 0 - ) - return false; - return true; - }); + var skills = player + .getSkills(null, false, false) + .filter((skill) => { + var info = get.info(skill); + if ( + !info || + info.charlotte || + !get.is.locked(skill) || + get.skillInfoTranslation(skill, player) + .length == 0 + ) + return false; + return true; + }); player .chooseControl(skills, "cancel2") .set( @@ -4013,7 +5456,8 @@ game.import("character", function () { return ( '
    【' + get.translation( - lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) + lib.translate[i + "_ab"] || + get.translation(i).slice(0, 2) ) + "】
    " + get.skillInfoTranslation(i, player) + @@ -4022,7 +5466,10 @@ game.import("character", function () { }) ) .set("displayIndex", false) - .set("prompt", "蹈节:失去一个锁定技,或点“取消”失去1点体力") + .set( + "prompt", + "蹈节:失去一个锁定技,或点“取消”失去1点体力" + ) .set("ai", () => { var player = _status.event.player, choices = _status.event.controls.slice(); @@ -4032,34 +5479,51 @@ game.import("character", function () { return info.ai.neg || info.ai.halfneg; }); if (negs.length) return negs.randomGet(); - if (get.effect(player, { name: "losehp" }, player, player) >= 0) return "cancel2"; + if ( + get.effect( + player, + { name: "losehp" }, + player, + player + ) >= 0 + ) + return "cancel2"; if (player.hp > 3) return "cancel2"; - return Math.random() < 0.75 ? "clandaojie" : choices.randomGet(); + return Math.random() < 0.75 + ? "clandaojie" + : choices.randomGet(); }); - "step 1"; + ("step 1"); if (result.control != "cancel2") { player.removeSkills(result.control); } else { player.loseHp(); } - "step 2"; + ("step 2"); var targets = game.filterPlayer( - (current) => current == player || current.hasClan("颍川荀氏") + (current) => + current == player || current.hasClan("颍川荀氏") ); - if (targets.length == 1) event._result = { bool: true, targets: targets }; + if (targets.length == 1) + event._result = { bool: true, targets: targets }; else player .chooseTarget( "蹈节:将" + - get.translation(trigger.cards.filterInD()) + - "交给一名颍川荀氏角色", + get.translation(trigger.cards.filterInD()) + + "交给一名颍川荀氏角色", true, (card, player, target) => { - return target == player || target.hasClan("颍川荀氏"); + return ( + target == player || + target.hasClan("颍川荀氏") + ); } ) - .set("ai", (target) => get.attitude(_status.event.player, target)); - "step 3"; + .set("ai", (target) => + get.attitude(_status.event.player, target) + ); + ("step 3"); if (result.bool) { var target = result.targets[0]; player.line(target, "green"); @@ -4102,13 +5566,17 @@ game.import("character", function () { }, content() { if ( - player.hasHistory("sourceDamage", function (evt) { - return evt.card == trigger.card; - }) + player.hasHistory( + "sourceDamage", + function (evt) { + return evt.card == trigger.card; + } + ) ) { var num1 = player.countCards("h"), num2 = player.getHandcardLimit(); - if (num1 < num2) player.draw(Math.min(5, num2 - num1)); + if (num1 < num2) + player.draw(Math.min(5, num2 - num1)); } else if (trigger.addCount !== false) { trigger.addCount = false; player.getStat().card.sha--; @@ -4145,7 +5613,7 @@ game.import("character", function () { player.countCards("h", function (card) { return lib.skill.clanyirong.checkx(card) > 0; }) + - 1 < + 1 < player.countCards("h") - player.getHandcardLimit() ) return 0; @@ -4153,7 +5621,8 @@ game.import("character", function () { }, checkx(card) { var num = 1; - if (_status.event.player.getUseValue(card, null, true) <= 0) num = 1.5; + if (_status.event.player.getUseValue(card, null, true) <= 0) + num = 1.5; return (15 - get.value(card)) * num; }, prompt() { @@ -4162,9 +5631,15 @@ game.import("character", function () { num2 = player.getHandcardLimit(); var str = ''; if (num1 > num2) { - str += "弃置" + get.cnNumber(num1 - num2) + "张牌,然后手牌上限+1。"; + str += + "弃置" + + get.cnNumber(num1 - num2) + + "张牌,然后手牌上限+1。"; } else { - str += "摸" + get.cnNumber(Math.min(8, num2 - num1)) + "张牌,然后手牌上限-1。"; + str += + "摸" + + get.cnNumber(Math.min(8, num2 - num1)) + + "张牌,然后手牌上限-1。"; } str += "
    ※当前手牌上限:" + num2; var num3 = (_status.event.getParent().phaseIndex || 0) + 1; @@ -4184,14 +5659,20 @@ game.import("character", function () { num2 = player.getHandcardLimit(); if (num1 < num2) player.draw(Math.min(8, num2 - num1)); } - "step 1"; + ("step 1"); lib.skill.chenliuwushi.change(player, -1); }, ai: { order(item, player) { var num = player.getHandcardLimit(), - numx = (_status.event.getParent().phaseIndex || 0) + 1; - if (num == 5 && numx == 4 && player.getStat("skill").clanyirong) return 0; + numx = + (_status.event.getParent().phaseIndex || 0) + 1; + if ( + num == 5 && + numx == 4 && + player.getStat("skill").clanyirong + ) + return 0; if ( player.countCards("h") == num + 1 && num != 2 && @@ -4211,7 +5692,8 @@ game.import("character", function () { }, forced: true, filter(event, player) { - if (event.phaseList[event.num].startsWith("phaseUse")) return false; + if (event.phaseList[event.num].startsWith("phaseUse")) + return false; var num1 = player.getHandcardLimit() - 1, num2 = event.num; return num1 == num2; @@ -4224,18 +5706,27 @@ game.import("character", function () { clanmuyin: { audio: 2, clanSkill: true, - audioname: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"], + audioname: [ + "clan_wuxian", + "clan_wuban", + "clan_wukuang", + "clan_wuqiao", + ], trigger: { player: "phaseBegin" }, isMax(player) { var num = player.getHandcardLimit(); return !game.hasPlayer(function (current) { - return current != player && current.getHandcardLimit() > num; + return ( + current != player && + current.getHandcardLimit() > num + ); }); }, filter(event, player) { return game.hasPlayer(function (current) { return ( - (current == player || current.hasClan("陈留吴氏")) && + (current == player || + current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current) ); }); @@ -4249,7 +5740,8 @@ game.import("character", function () { "令一名陈留吴氏角色的手牌上限+1", function (card, player, current) { return ( - (current == player || current.hasClan("陈留吴氏")) && + (current == player || + current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current) ); } @@ -4257,7 +5749,7 @@ game.import("character", function () { .set("ai", function (target) { return get.attitude(_status.event.player, target); }); - "step 1"; + ("step 1"); if (result.bool) { var target = result.targets[0]; player.logSkill("clanmuyin", target); @@ -4271,9 +5763,11 @@ game.import("character", function () { change(player, num) { player.addSkill("chenliuwushi"); var info = player.storage; - if (typeof info.chenliuwushi != "number") info.chenliuwushi = 0; + if (typeof info.chenliuwushi != "number") + info.chenliuwushi = 0; info.chenliuwushi += num; - if (info.chenliuwushi == 0) player.unmarkSkill("chenliuwushi"); + if (info.chenliuwushi == 0) + player.unmarkSkill("chenliuwushi"); else player.markSkill("chenliuwushi"); if (num >= 0) game.log(player, "的手牌上限", "#y+" + num); else game.log(player, "的手牌上限", "#g" + num); @@ -4418,7 +5912,8 @@ game.import("character", function () { clanliuju_info: "出牌阶段结束时,你可以与一名角色A拼点,输的角色可以使用任意张拼点牌中的非基本牌。然后若你至A的距离或A至你的距离发生了变化,你重置〖恤民〗。", clanxumin: "恤民", - clanxumin_info: "宗族技,限定技。你可以将一张牌当做【五谷丰登】对任意名其他角色使用。", + clanxumin_info: + "宗族技,限定技。你可以将一张牌当做【五谷丰登】对任意名其他角色使用。", clan_hanrong: "族韩融", clanlianhe: "连和", clanlianhe_info: @@ -4445,7 +5940,8 @@ game.import("character", function () { clanxiaoyong_info: "锁定技。当你于回合内首次使用字数为X的牌时,你重置〖观骨〗(X为你上次发动〖观骨〗观看的牌数)。", clanbaozu: "保族", - clanbaozu_info: "宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。", + clanbaozu_info: + "宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。", clan_wangyun: "族王允", clanjiexuan: "解悬", clanjiexuan_info: @@ -4508,10 +6004,11 @@ game.import("character", function () { clan_zhongyao: "族钟繇", clan_zhongyao_prefix: "族", clanchengqi: "承启", - clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", + clanchengqi_info: + "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", clanjieli: "诫厉", - clanjieli_info: "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶X张牌,然后你可以交换其中的X张牌(X为你本回合使用过的牌中的牌名字数最大值)。", - + clanjieli_info: + "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶X张牌,然后你可以交换其中的X张牌(X为你本回合使用过的牌中的牌名字数最大值)。", clan_wu: "陈留·吴氏", clan_xun: "颍川·荀氏", From c17bccd0df47fdc9464ffb5be43d66f62768c0df Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 15:37:39 +0800 Subject: [PATCH 39/57] noname/ui/index.js bugfix --- noname/ui/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noname/ui/index.js b/noname/ui/index.js index aedd06936..0904e9d17 100644 --- a/noname/ui/index.js +++ b/noname/ui/index.js @@ -140,7 +140,7 @@ export class UI { * @type {HTMLDivElement[]} */ toastQueue = []; - + /** * @type {HTMLDivElement} */ cardPile; From a4eeb4cfd3a3e771293b0ed2940f44a6d8ea81ef Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 15:38:35 +0800 Subject: [PATCH 40/57] Revert "noname/ui/index.js bugfix" This reverts commit c17bccd0df47fdc9464ffb5be43d66f62768c0df. --- noname/ui/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noname/ui/index.js b/noname/ui/index.js index 0904e9d17..aedd06936 100644 --- a/noname/ui/index.js +++ b/noname/ui/index.js @@ -140,7 +140,7 @@ export class UI { * @type {HTMLDivElement[]} */ toastQueue = []; - /** + * @type {HTMLDivElement} */ cardPile; From 643fe71f3818ef133019d345baea2494fa2d4da5 Mon Sep 17 00:00:00 2001 From: mengxinzxz <2223529500@qq.com> Date: Sun, 21 Apr 2024 15:50:50 +0800 Subject: [PATCH 41/57] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E7=AB=AFspan7=E4=B8=8E=E7=B4=A0=E6=9D=90=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E8=A1=8C=E9=87=8D=E5=8F=A0=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/ui/create/menu/pages/otherMenu.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/noname/ui/create/menu/pages/otherMenu.js b/noname/ui/create/menu/pages/otherMenu.js index c5092e6f3..83ff92ce0 100644 --- a/noname/ui/create/menu/pages/otherMenu.js +++ b/noname/ui/create/menu/pages/otherMenu.js @@ -674,6 +674,7 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM if (!this.classList.toggle("on")) { game.saveConfig("asset_toggle_off", true); [ + span114514_br, span7, span7_br, span7_check, @@ -695,6 +696,7 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM } else { game.saveConfig("asset_toggle_off"); [ + span114514_br, span7, span7_br, span7_check, @@ -721,6 +723,8 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM // var span6_br = ui.create.node('br'); // li2.lastChild.appendChild(span6_br); // var span2_br = ui.create.node('br'); + var span114514_br = ui.create.node('br'); + li2.lastChild.appendChild(span114514_br); var span7 = ui.create.div("", `不替换已有素材`); span7.style.fontSize = "small"; From 3d977b28474710ad5c71d4b71e556469d0966e6b Mon Sep 17 00:00:00 2001 From: lieren2023 <131325076+lieren2023@users.noreply.github.com> Date: Sun, 21 Apr 2024 18:40:59 +0800 Subject: [PATCH 42/57] =?UTF-8?q?ui.create.characterDialog=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/ui/create/index.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/noname/ui/create/index.js b/noname/ui/create/index.js index 235a5cbc9..0d088100b 100644 --- a/noname/ui/create/index.js +++ b/noname/ui/create/index.js @@ -1299,17 +1299,19 @@ export class Create { } } else { for (var i in lib.character) { - if (lib.character[i][4].includes("minskin")) continue; - if ( - lib.character[i][4].includes("boss") || - lib.character[i][4].includes("hiddenboss") - ) { - if (lib.config.mode == "boss") continue; - if (!lib.character[i][4].includes("bossallowed")) continue; - } + if(lib.character[i][4]) { + if (lib.character[i][4].includes("minskin")) continue; + if ( + lib.character[i][4].includes("boss") || + lib.character[i][4].includes("hiddenboss") + ) { + if (lib.config.mode == "boss") continue; + if (!lib.character[i][4].includes("bossallowed")) continue; + } - if (lib.character[i][4].includes("stonehidden")) continue; - if (lib.character[i][4].includes("unseen")) continue; + if (lib.character[i][4].includes("stonehidden")) continue; + if (lib.character[i][4].includes("unseen")) continue; + } if (lib.config.banned.includes(i)) continue; if ( lib.characterFilter[i] && From 9b4b06a3ebe5bae05d8de05e9e508a7b2582e0a5 Mon Sep 17 00:00:00 2001 From: Rintim Date: Sun, 21 Apr 2024 20:59:55 +0800 Subject: [PATCH 43/57] feat: character direct image support. --- noname/init/polyfill.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/noname/init/polyfill.js b/noname/init/polyfill.js index 1f25b12d0..3f4dede17 100644 --- a/noname/init/polyfill.js +++ b/noname/init/polyfill.js @@ -165,8 +165,13 @@ Reflect.defineProperty(HTMLDivElement.prototype, "setBackground", { nameinfo = get.character(name); } } - if (!modeimage && nameinfo && nameinfo[4]) + let imgPrefixUrl; + if (!modeimage && nameinfo && nameinfo[4]) { for (const value of nameinfo[4]) { + if (value.startsWith("img:")) { + imgPrefixUrl = value.slice(4); + break; + } if (value.startsWith("ext:")) { extimage = value; break; @@ -181,7 +186,9 @@ Reflect.defineProperty(HTMLDivElement.prototype, "setBackground", { break; } } - if (extimage) src = extimage.replace(/^ext:/, "extension/"); + } + if (imgPrefixUrl) src = imgPrefixUrl; + else if (extimage) src = extimage.replace(/^ext:/, "extension/"); else if (dbimage) { this.setBackgroundDB(dbimage.slice(3)); return this; @@ -225,6 +232,8 @@ HTMLDivElement.prototype.setBackgroundImage = function (img) { .unique() .map((v) => `url("${lib.assetURL}${v}")`) .join(","); + } else if (URL.canParse(img)) { + this.style.backgroundImage = `url("${img}")`; } else { this.style.backgroundImage = `url("${lib.assetURL}${img}")`; } From a1d6180e9ac75bbf41786f6cb370031725d3344d Mon Sep 17 00:00:00 2001 From: Rintim Date: Sun, 21 Apr 2024 21:04:20 +0800 Subject: [PATCH 44/57] feat: audio blob support. --- noname/game/index.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index 9053a1371..993b7d30c 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -409,7 +409,9 @@ export class Game { style.transform = "scale(1.05)"; } document.body.insertBefore(uiBackground, document.body.firstChild); - if (background.startsWith("db:")) uiBackground.setBackgroundDB(background.slice(3)); + if (background.startsWith("blob:") || background.startsWith("data:")) { + uiBackground.setBackgroundImage(background); + } else if (background.startsWith("db:")) uiBackground.setBackgroundDB(background.slice(3)); else if (background.startsWith("ext:")) uiBackground.setBackgroundImage(`extension/${background.slice(4)}`); else if (background == "default") { @@ -1441,7 +1443,8 @@ export class Game { if (_status.video) break; } if (path.startsWith("ext:")) path = path.replace(/^ext:/, "extension/"); - else if (!path.startsWith("db:")) path = `audio/${path}`; + else if (!["db:", "blob:", "data:"].some((prefix) => path.startsWith(prefix))) + path = `audio/${path}`; if (!lib.config.repeat_audio && _status.skillaudio.includes(path)) return; } const audio = document.createElement("audio"); From 0eec71eb01ed9658314785d50803f1d49a5c8b4f Mon Sep 17 00:00:00 2001 From: Rintim Date: Sun, 21 Apr 2024 21:06:57 +0800 Subject: [PATCH 45/57] feat: card audio blob support. --- noname/game/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/noname/game/index.js b/noname/game/index.js index 993b7d30c..9887c3a8b 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -1737,7 +1737,9 @@ export class Game { const audio = get.dynamicVariable(lib.card[card.name].audio, card, sex); if (typeof audio == "string") { const audioInfo = audio.split(":"); - if (audio.startsWith("db:")) + if (["blob:", "data:"].some((prefix) => audio.startsWith(prefix))) { + game.playAudio(audio); + } else if (audio.startsWith("db:")) game.playAudio( `${audioInfo[0]}:${audioInfo[1]}`, audioInfo[2], From 6e6662553c0eaab789c2440918238731b5bc8b57 Mon Sep 17 00:00:00 2001 From: Rintim Date: Sun, 21 Apr 2024 21:24:24 +0800 Subject: [PATCH 46/57] fix: audio path fix. --- noname/game/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/noname/game/index.js b/noname/game/index.js index 9887c3a8b..0b681754f 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -1469,6 +1469,7 @@ export class Game { reject ); else if (lib.path.extname(path)) resolve(`${lib.assetURL}${path}`); + else if (URL.canParse(path)) resolve(path); else resolve(`${lib.assetURL}${path}.mp3`); }).then((resolvedPath) => { audio.src = resolvedPath; @@ -1603,7 +1604,11 @@ export class Game { let path = "", format = ""; if (!/^db:|^ext:|\//.test(audioInfo)) path = "skill/"; - if (!/\.\w+$/.test(audioInfo)) format = ".mp3"; + if ( + !/\.\w+$/.test(audioInfo) && + !["data:", "blob:"].some((name) => audioInfo.startsWith(name)) + ) + format = ".mp3"; if (path && format) return parseAudio(audioInfo, options, [true, 2]); return [`${path}${audioInfo}${format}`]; } From 68129fc8c852326e9d7ced70bd7fd2e9a623f261 Mon Sep 17 00:00:00 2001 From: Rintim Date: Sun, 21 Apr 2024 21:46:51 +0800 Subject: [PATCH 47/57] feat: background music blob support. --- noname/game/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index 0b681754f..26c194869 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -1776,7 +1776,9 @@ export class Game { _status.currentAozhan ); _status.currentAozhan = aozhan; - if (aozhan.startsWith("db:")) + if (["blob:", "data:"].some((prefix) => aozhan.startsWith(prefix))) { + ui.backgroundMusic.src = aozhan; + } else if (aozhan.startsWith("db:")) game.getDB("image", aozhan.slice(3)).then((result) => (ui.backgroundMusic.src = result)); else if (aozhan.startsWith("ext:")) ui.backgroundMusic.src = `${lib.assetURL}extension/${aozhan.slice(4)}`; @@ -1799,7 +1801,9 @@ export class Game { ui.backgroundMusic.src = backgroundMusicSourceConfiguration; return; } - if (music.startsWith("db:")) + if (["blob:", "data:"].some((prefix) => music.startsWith(prefix))) { + ui.backgroundMusic.src = music; + } else if (music.startsWith("db:")) game.getDB("image", music.slice(3)).then((result) => (ui.backgroundMusic.src = result)); else if (music.startsWith("ext:")) ui.backgroundMusic.src = `${lib.assetURL}extension/${music.slice(4)}`; From 3215b0caa9e1e17658b24f1545eedb32d09f2ad6 Mon Sep 17 00:00:00 2001 From: Rintim Date: Sun, 21 Apr 2024 21:55:11 +0800 Subject: [PATCH 48/57] feat: some custom url support. --- noname/game/index.js | 37 ++++++++++++++++++++++--------------- noname/init/polyfill.js | 3 +-- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index 26c194869..d3363b59f 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -4751,7 +4751,8 @@ export class Game { const audiosrc = "die:ext:" + extname + "/" + j + ".mp3"; if ( !pack[i][j][4].some( - (str) => typeof str == "string" && /^(?:db:extension-|ext:):(?:.+)/.test(str) + (str) => + typeof str == "string" && /^(?:db:extension-.+?|ext|img):(?:.+)/.test(str) ) ) pack[i][j][4].add(imgsrc); @@ -4800,17 +4801,19 @@ export class Game { if (info.audio == true) { info.audio = "ext:" + extname; } - if (info.fullskin) { - if (_status.evaluatingExtension) { - info.image = "db:extension-" + extname + ":" + name + ".png"; - } else { - info.image = "ext:" + extname + "/" + name + ".png"; - } - } else if (info.fullimage) { - if (_status.evaluatingExtension) { - info.image = "db:extension-" + extname + ":" + name + ".jpg"; - } else { - info.image = "ext:" + extname + "/" + name + ".jpg"; + if (!info.image || typeof info.image !== "string") { + if (info.fullskin) { + if (_status.evaluatingExtension) { + info.image = "db:extension-" + extname + ":" + name + ".png"; + } else { + info.image = "ext:" + extname + "/" + name + ".png"; + } + } else if (info.fullimage) { + if (_status.evaluatingExtension) { + info.image = "db:extension-" + extname + ":" + name + ".jpg"; + } else { + info.image = "ext:" + extname + "/" + name + ".jpg"; + } } } lib.card[name] = info; @@ -4930,10 +4933,14 @@ export class Game { lib.translate[name] = info2.translate; let imgsrc; let extname = _status.extension || info2.extension; - if (_status.evaluatingExtension) { - imgsrc = "extension-" + extname + ":" + name + ".jpg"; + if (info.splash) { + imgsrc = info.splash; } else { - imgsrc = "ext:" + extname + "/" + name + ".jpg"; + if (_status.evaluatingExtension) { + imgsrc = "extension-" + extname + ":" + name + ".jpg"; + } else { + imgsrc = "ext:" + extname + "/" + name + ".jpg"; + } } lib.mode[name] = { name: info2.translate, diff --git a/noname/init/polyfill.js b/noname/init/polyfill.js index 3f4dede17..471c087f5 100644 --- a/noname/init/polyfill.js +++ b/noname/init/polyfill.js @@ -171,8 +171,7 @@ Reflect.defineProperty(HTMLDivElement.prototype, "setBackground", { if (value.startsWith("img:")) { imgPrefixUrl = value.slice(4); break; - } - if (value.startsWith("ext:")) { + } else if (value.startsWith("ext:")) { extimage = value; break; } else if (value.startsWith("db:")) { From 09db53562fcd9a5d32b72d74c2d0f2bbb8c24949 Mon Sep 17 00:00:00 2001 From: Spmario233 Date: Mon, 22 Apr 2024 18:40:47 +0800 Subject: [PATCH 49/57] =?UTF-8?q?=E6=8B=86=E5=88=86diy.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/diy.js | 9913 +----------------------------------- character/key/card.js | 103 + character/key/character.js | 86 + character/key/index.js | 101 + character/key/pinyin.js | 91 + character/key/skill.js | 8949 ++++++++++++++++++++++++++++++++ character/key/translate.js | 599 +++ game/package.js | 1 + 8 files changed, 9941 insertions(+), 9902 deletions(-) create mode 100644 character/key/card.js create mode 100644 character/key/character.js create mode 100644 character/key/index.js create mode 100644 character/key/pinyin.js create mode 100644 character/key/skill.js create mode 100644 character/key/translate.js diff --git a/character/diy.js b/character/diy.js index 4d338ba34..21eaf15e8 100755 --- a/character/diy.js +++ b/character/diy.js @@ -15,88 +15,6 @@ game.import("character", function () { ], character: { noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"]], - sp_key_yuri: ["female", "qun", 4, ["mubing", "ziqu", "diaoling"], ["border:key"]], - key_lucia: ["female", "key", "2/3", ["lucia_duqu", "lucia_zhenren"]], - key_kyousuke: ["male", "key", 4, ["nk_shekong", "key_huanjie"]], - key_yuri: ["female", "key", 3, ["yuri_xingdong", "key_huanjie", "yuri_wangxi"], ["zhu"]], - key_haruko: ["female", "key", 4, ["haruko_haofang", "haruko_zhuishi"]], - key_umi: ["female", "key", 3, ["umi_chaofan", "umi_lunhui", "umi_qihuan"]], - key_umi2: ["female", "key", 3, [], ["unseen"]], - key_rei: ["male", "key", 4, ["xiandeng", "shulv", "xisheng"]], - key_komari: ["female", "key", 3, ["komari_tiankou", "komari_xueshang"]], - key_yukine: ["female", "key", 3, ["yukine_wenzhou"]], - key_yusa: ["female", "key", 3, ["yusa_yanyi", "yusa_misa", "dualside"], ["dualside:key_misa"]], - key_misa: ["female", "key", 3, ["misa_yehuo", "misa_yusa", "dualside"], ["unseen"]], - key_masato: ["male", "key", "4/8", ["masato_baoquan"]], - key_iwasawa: ["female", "key", 3, ["iwasawa_yinhang", "iwasawa_mysong"]], - key_kengo: ["male", "key", 4, ["kengo_weishang", "kengo_guidui"]], - key_yoshino: ["male", "key", 4, ["yoshino_jueyi"]], - key_yui: ["female", "key", 3, ["yui_jiang", "yui_lieyin", "yui_takaramono"]], - key_tsumugi: ["female", "key", 3, ["tsumugi_mugyu", "tsumugi_huilang"]], - key_saya: ["female", "key", 3, ["saya_shouji", "saya_powei"]], - key_harukakanata: ["female", "key", 3, ["haruka_shuangche"]], - key_inari: ["female", "key", 2, ["inari_baiwei", "inari_huhun"]], - key_shiina: ["female", "key", 3, ["shiina_qingshen", "shiina_feiyan"]], - key_sunohara: [ - "double", - "key", - "3/3/2", - ["sunohara_chengshuang", "sunohara_tiaoyin", "sunohara_jianren"], - ], - key_rin: ["female", "key", 3, ["rin_baoqiu"]], - key_sasami: ["female", "key", 3, ["sasami_miaobian"]], - key_akane: ["female", "key", 3, ["akane_jugu", "akane_quanqing", "akane_yifu"], ["zhu"]], - key_doruji: ["female", "key", 16, ["doruji_feiqu"]], - key_yuiko: ["female", "key", 3, ["yuiko_fenglun", "yuiko_dilve"]], - key_riki: ["double", "key", 3, ["riki_spwenji", "riki_nvzhuang", "riki_mengzhong"]], - key_hisako: ["female", "key", 3, ["hisako_yinbao", "hisako_zhuanyun"]], - key_hinata: ["male", "key", 4, ["hinata_qiulve", "hinata_ehou"]], - key_noda: ["male", "key", 4, ["noda_fengcheng", "noda_xunxin"]], - key_tomoya: ["male", "key", 4, ["tomoya_shangxian", "tomoya_wangjin"]], - key_nagisa: ["female", "key", 3, ["nagisa_tiandu", "nagisa_fuxin"]], - key_ayato: ["male", "key", 3, ["ayato_jianshen", "ayato_zonghuan"]], - key_ao: ["female", "key", 3, ["ao_xishi", "ao_kuihun", "ao_shixin"]], - key_yuzuru: ["male", "key", 5, ["yuzuru_wuxin", "yuzuru_deyi"]], - sp_key_kanade: ["female", "key", 3, ["kanade_mapo", "kanade_benzhan"]], - key_mio: ["female", "key", 3, ["mio_tuifu", "mio_tishen"]], - key_midori: ["female", "key", 3, ["midori_nonghuan", "midori_tishen"]], - key_kyoko: ["female", "key", 3, ["kyoko_juwu", "kyoko_zhengyi"]], - key_shizuru: ["female", "key", 3, ["shizuru_nianli", "shizuru_benzhan"]], - key_shiorimiyuki: ["female", "key", 3, ["shiorimiyuki_banyin", "shiorimiyuki_tingxian"]], - key_miki: ["female", "key", 3, ["miki_shenqiang", "miki_huanmeng", "miki_zhiluo"]], - key_shiori: ["female", "key", "2/3", ["shiori_huijuan"]], - key_kaori: ["female", "key", "3/4", ["kaori_siyuan"]], - key_akiko: ["female", "key", 3, ["akiko_dongcha"]], - key_abyusa: ["female", "key", 3, ["abyusa_jueqing", "abyusa_dunying"]], - key_godan: ["male", "key", 6, ["godan_yuanyi", "godan_feiqu", "godan_xiaoyuan"]], - key_yuu: ["male", "key", 3, ["yuu_lveduo"]], - key_ryoichi: ["male", "key", 4, ["ryoichi_baoyi", "ryoichi_tuipi"]], - key_kotori: ["female", "key", 3, ["kotori_yumo", "kotori_huazhan"]], - key_jojiro: ["male", "key", 4, ["jojiro_shensu", "jojiro_shunying"]], - key_shiroha: ["female", "key", 3, ["shiroha_yuzhao", "shiroha_guying", "shiroha_jiezhao"]], - key_shizuku: ["female", "key", 3, ["shizuku_sizhi", "shizuku_biyi", "shizuku_sanhua"]], - key_hiroto: ["male", "key", 3, ["hiroto_huyu", "hiroto_tuolao"]], - key_sakuya: ["male", "key", 3, ["youlong", "luanfeng", "sakuya_junbu"]], - key_youta: ["male", "key", 4, []], - key_rumi: ["female", "key", "3/4", ["rumi_shuwu"]], - key_chihaya: ["female", "key", 3, ["chihaya_liewu", "chihaya_youfeng"]], - key_yukito: ["male", "key", 4, ["yukito_kongwu", "yukito_yaxiang"]], - key_crow: ["male", "key", 4, [], ["unseen"]], - key_asara: ["female", "key", 3, ["asara_shelu", "asara_yingwei"]], - key_kotomi: ["female", "key", 3, ["kotomi_qinji", "kotomi_chuanxiang"]], - key_mia: ["female", "key", 3, ["mia_shihui", "mia_qianmeng"]], - key_kano: ["female", "key", 3, ["kano_liezhen", "kano_poyu"]], - db_key_liyingxia: [ - "female", - "shu", - 3, - ["liyingxia_sanli", "liyingxia_zhenjun", "liyingxia_wumai"], - ["doublegroup:shu:key"], - ], - key_erika: ["female", "key", "3/3/2", ["erika_shisong", "erika_yousheng"]], - key_satomi: ["female", "key", 3, ["satomi_luodao", "satomi_daohai"]], - key_iriya: ["female", "key", 3, ["iriya_yinji", "iriya_haozhi"]], - key_fuuko: ["female", "key", 3, ["fuuko_xingdiao", "fuuko_chuanyuan"]], key_kud: ["female", "key", 3, ["kud_qiaoshou", "kud_buhui"]], key_misuzu: ["female", "key", 3, ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"]], @@ -227,23 +145,6 @@ game.import("character", function () { junk_guanyu: ["male", "shu", 4, ["olsbfumeng", "olsbguidao"]], }, characterFilter: { - key_jojiro(mode) { - return mode == "chess" || mode == "tafang"; - }, - key_yuu(mode) { - return ( - mode == "identity" || - mode == "doudizhu" || - mode == "single" || - (mode == "versus" && _status.mode != "standard" && _status.mode != "three") - ); - }, - key_tomoya(mode) { - return mode != "chess" && mode != "tafang" && mode != "stone"; - }, - key_sunohara(mode) { - return mode != "guozhan"; - }, ns_duangui(mode) { return mode == "identity" && _status.mode == "normal"; }, @@ -342,77 +243,6 @@ game.import("character", function () { ], diy_default: ["diy_yuji", "diy_caiwenji", "diy_lukang", "diy_zhenji", "old_majun"], diy_noname: ["noname"], - diy_key: [ - "key_lucia", - "key_kyousuke", - "key_yuri", - "key_haruko", - "key_umi", - "key_rei", - "key_komari", - "key_yukine", - "key_yusa", - "key_misa", - "key_masato", - "key_iwasawa", - "key_kengo", - "key_yoshino", - "key_yui", - "key_tsumugi", - "key_saya", - "key_harukakanata", - "key_inari", - "key_shiina", - "key_sunohara", - "key_rin", - "key_sasami", - "key_akane", - "key_doruji", - "key_yuiko", - "key_riki", - "key_hisako", - "key_hinata", - "key_noda", - "key_tomoya", - "key_nagisa", - "key_ayato", - "key_ao", - "key_yuzuru", - "sp_key_kanade", - "key_mio", - "key_midori", - "key_kyoko", - "key_shizuru", - "key_shiorimiyuki", - "key_miki", - "key_shiori", - "key_kaori", - "sp_key_yuri", - "key_akiko", - "key_abyusa", - "key_godan", - "key_yuu", - "key_ryoichi", - "key_kotori", - "key_jojiro", - "key_shiroha", - "key_shizuku", - "key_hiroto", - "key_sakuya", - "key_youta", - "key_rumi", - "key_chihaya", - "key_yukito", - "key_asara", - "key_kotomi", - "key_mia", - "key_kano", - "db_key_liyingxia", - "key_erika", - "key_satomi", - "key_iriya", - "key_fuuko", - ], diy_trashbin: [ "junk_guanyu", "junk_zhangjiao", @@ -459,71 +289,6 @@ game.import("character", function () { "王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。", }, characterTitle: { - key_satomi: "#rHeaven Burns Red", - key_erika: "#rHeaven Burns Red", - db_key_liyingxia: "#rHeaven Burns Red", - key_kano: "#bAIR", - key_mia: "#bLoopers", - key_kotomi: "#gClannad", - key_asara: "#bRewrite", - key_yukito: "#bAIR", - key_chihaya: "#bRewrite", - key_rumi: "#rONE ~輝く季節へ~", - key_youta: "#b神様になった日", - key_sakuya: "#bRewrite", - key_hiroto: "#b神様になった日", - key_shizuku: "#bSummer Pockets", - key_shiroha: "#bSummer Pockets", - key_jojiro: "#bCharlotte
    战棋专属角色", - key_kotori: "#bRewrite", - key_ryoichi: "#bSummer Pockets", - key_yuu: "#bCharlotte", - key_godan: "#rAngel Beats!", - key_abyusa: "#rAngel Beats!", - key_akiko: "#bKanon", - key_kaori: "#bKanon", - key_shiori: "#bKanon", - key_miki: "#bSummer Pockets", - key_shiorimiyuki: "#rAngel Beats!", - key_shizuru: "#bRewrite", - key_kyoko: "#bSummer Pockets", - sp_key_kanade: "#rAngel Beats!", - key_yuzuru: "#rAngel Beats!", - key_tsumugi: "#bSummer Pockets", - key_ayato: "#rAngel Beats!", - key_nagisa: "#gClannad", - key_tomoya: "#gClannad", - key_noda: "#rAngel Beats!", - key_hinata: "#rAngel Beats!", - key_hisako: "#rAngel Beats!", - key_doruji: "#bLittle Busters!", - key_riki: "#bLittle Busters!", - key_yuiko: "#bLittle Busters!", - key_akane: "#bRewrite", - key_sasami: "#bLittle Busters!", - key_rin: "#bLittle Busters!", - key_shiina: "#rAngel Beats!", - key_inari: "#bSummer Pockets", - key_saya: "#bLittle Busters!", - key_harukakanata: "#bLittle Busters!", - key_yui: "#rAngel Beats!", - key_yoshino: "#bRewrite", - key_kengo: "#bLittle Busters!", - key_iwasawa: "#rAngel Beats!", - key_masato: "#bLittle Busters!", - key_yusa: "#bCharlotte", - key_misa: "#rCharlotte", - key_yukine: "#gClannad", - key_komari: "#bLittle Busters!", - key_umi: "#bSummer Pockets", - key_rei: "#gHarmonia", - key_lucia: "#bRewrite", - key_kyousuke: "#bLittle Busters!", - key_yuri: "#rAngel Beats!", - key_haruko: "#bAIR", - sp_key_yuri: "#bAngel Beats!", - key_fuuko: "#gClannad", - key_kud: "#b千夜", key_misuzu: "#b长发及腰黑长直", key_kamome: "#b仿生纱", @@ -588,106 +353,6 @@ game.import("character", function () { ns_mengyou: "#g残昼厄夜", }, card: { - kano_paibingbuzhen: { - fullskin: true, - type: "trick", - enable: true, - filterTarget: true, - selectTarget: [1, 3], - derivation: "key_kano", - content() { - "step 0"; - target.draw(); - "step 1"; - var hs = target.getCards("he"); - if (!hs.length) event.finish(); - else if (hs.length == 1) event._result = { bool: true, cards: hs }; - else target.chooseCard("he", true, "选择一张牌置入仁库"); - "step 2"; - if (result.bool) { - var card = result.cards[0]; - target.$throw(card, 1000); - target.lose(card, "toRenku"); - } - }, - contentAfter() { - if ( - player.isIn() && - _status.renku.length && - (function () { - var cards = _status.renku; - if (cards.length == 1) return true; - var color = get.color(cards[0], false), - type = get.type(cards[0], false); - for (var i = 1; i < cards.length; i++) { - if (color && get.color(cards[i], false) != color) color = false; - if (type && get.type(cards[i], false) != type) type = false; - if (!color && !type) return false; - } - return true; - })() - ) - player.draw(); - }, - ai: { - order: 1, - result: { - player(player, target) { - if (player.hasSkill("kano_poyu")) return 2; - return 0; - }, - target: 0.1, - }, - }, - }, - kamome_suitcase: { - fullskin: true, - type: "equip", - subtype: "equip5", - derivation: "key_kamome", - skills: ["kamome_suitcase"], - ai: { - equipValue(card) { - return 7; - }, - basic: { - equipValue: 7, - }, - }, - }, - miki_hydrogladiator: { - fullskin: true, - type: "equip", - subtype: "equip1", - derivation: "key_miki", - skills: ["miki_hydrogladiator_skill"], - distance: { - attackFrom: -5, - }, - ai: { - equipValue(card) { - return 7; - }, - basic: { - equipValue: 7, - }, - }, - }, - miki_binoculars: { - fullskin: true, - type: "equip", - subtype: "equip5", - derivation: "key_miki", - skills: ["miki_binoculars"], - ai: { - equipValue(card) { - return 7; - }, - basic: { - equipValue: 7, - }, - }, - }, nsfuzhou_card: { fullskin: true, type: "delay", @@ -765,985 +430,6 @@ game.import("character", function () { }, /** @type { importCharacterConfig['skill'] } */ skill: { - //伊吹风子 - fuuko_xingdiao: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: (event) => { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - "step 0"; - player.drawTo(8); - "step 1"; - var hs = player.getCards("h"); - if (hs.length > 0) player.addShownCards(hs, "visible_fuuko_xingdiao"); - }, - mod: { - ignoredHandcard(card) { - if (card.hasGaintag("visible_fuuko_xingdiao")) { - return true; - } - }, - cardDiscardable(card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("visible_fuuko_xingdiao")) { - return false; - } - }, - }, - onremove: true, - global: "fuuko_xingdiao_gain", - subSkill: { - gain: { - enable: "phaseUse", - filter: (event, player) => { - return game.hasPlayer((current) => - lib.skill.fuuko_xingdiao_gain.filterTarget(null, player, current) - ); - }, - filterTarget: (card, player, target) => { - return ( - target != player && - target.hasCard((card) => card.hasGaintag("visible_fuuko_xingdiao"), "h") && - !target.getStorage("fuuko_xingdiao").includes(player) && - target.hasSkill("fuuko_xingdiao") - ); - }, - selectTarget: () => { - const num = game.countPlayer((current) => - lib.skill.fuuko_xingdiao_gain.filterTarget( - null, - _status.event.player, - current - ) - ); - return num > 1 ? 1 : -1; - }, - content() { - "step 0"; - target.markAuto("fuuko_xingdiao", [player]); - var cards = target.getCards("h", (card) => - card.hasGaintag("visible_fuuko_xingdiao") - ); - if (!cards.length) event.finish(); - else if (cards.length == 1) event._result = { bool: true, links: cards }; - else - player.chooseButton(true, [ - "选择获得" + get.translation(target) + "的一张“星”", - cards, - ]); - "step 1"; - if (result.bool) { - player.gain(result.links, target, "give"); - target.draw(); - } - }, - ai: { - order: 6, - result: { - target: 1, - }, - }, - }, - }, - }, - fuuko_chuanyuan: { - trigger: { - player: "loseAfter", - global: [ - "gainAfter", - "equipAfter", - "addJudgeAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter(event, player) { - const evt = event.getl(player); - if (!evt.hs.length) return false; - for (let i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("visible_fuuko_xingdiao")) return true; - } - return false; - }, - content() { - var evt = trigger.getl(player), - gains = [], - draws = 0; - var map = evt.gaintag_map; - var cards = evt.hs.filter((card) => { - return map[card.cardid] && map[card.cardid].includes("visible_fuuko_xingdiao"); - }); - cards.forEach((card) => { - var suit = get.suit(card, player), - num = get.number(card, player); - var card2 = get.cardPile2(function (card) { - if (gains.includes(card)) return false; - return get.suit(card, player) == suit && get.number(card, player) == num; - }); - if (card2) gains.push(card2); - else draws++; - }); - if (gains.length) player.gain(gains, "gain2").gaintag.add("fuuko_chuanyuan"); - if (draws) player.draw(draws).gaintag = ["fuuko_chuanyuan"]; - player.addSkill("fuuko_chuanyuan_effect"); - }, - subSkill: { - effect: { - mod: { - targetInRange(card) { - if (!card.cards || !card.cards.length) return; - for (var i of card.cards) { - if (!i.hasGaintag("fuuko_chuanyuan")) return; - } - return true; - }, - cardUsable(card) { - if (!card.cards || !card.cards.length) return; - for (var i of card.cards) { - if (!i.hasGaintag("fuuko_chuanyuan")) return; - } - return Infinity; - }, - }, - charlotte: true, - trigger: { player: "useCard1" }, - forced: true, - popup: false, - firstDo: true, - filter(event, player) { - if (event.addCount === false) return false; - return player.hasHistory("lose", (evt) => { - if (evt.getParent() != event) return false; - for (let i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("fuuko_chuanyuan")) return true; - } - }); - //return false; - }, - content() { - trigger.addCount = false; - player.getStat("card")[trigger.card.name]--; - }, - }, - }, - }, - //伊莉雅 - iriya_yinji: { - trigger: { player: "phaseUseBegin" }, - forced: true, - filter(event, player) { - return player.countCards("h") < 17; - }, - content() { - player.drawTo(17).gaintag = ["iriya_yinji_tag"]; - player.addSkill("iriya_yinji_tag"); - }, - subSkill: { - tag: { - charlotte: true, - mod: { - cardEnabled(card) { - if (get.itemtype(card) == "card") { - if (card.hasGaintag("iriya_yinji_tag")) return false; - } else if (card.isCard && card.cards) { - if (card.cards.some((card) => card.hasGaintag("iriya_yinji_tag"))) - return false; - } - }, - aiValue(player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) - return num / 10000; - }, - aiUseful(player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) - return num / 10000; - }, - }, - }, - }, - }, - iriya_haozhi: { - enable: "phaseUse", - filterCard: true, - selectCard: [2, Infinity], - promptfunc: () => - "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。", - position: "he", - getType(cards, player) { - var nums = cards - .map((card) => { - var num = get.number(card, player); - if (num <= 2) return num + 13; - return num; - }) - .sort((a, b) => a - b), - len = nums.length; - if (len == 1) return ["单张", nums[0], 1]; - if (len == 2) return nums[1] == nums[0] ? ["对子", nums[0], 1] : null; - var map = {}; - for (var i = 0; i < len; i++) { - var count = get.numOf(nums, nums[i]); - if (!map[count]) map[count] = []; - map[count].push(nums[i]); - i += count - 1; - } - if (len == 3) { - if (map[3]) return ["三张", nums[0], 1]; - return null; - } - if (map[len]) { - return ["炸弹", nums[0], length]; - } - if (map[1]) { - if (map[1].length == len && len > 4) { - for (var i = 0; i < map[1].length - 1; i++) { - if (map[1][i + 1] - map[1][i] != 1) return null; - if (map[1][i + 1] == 15) return null; - } - return ["单顺", nums[0], len]; - } else if (map[1].length == 2 && map[4] && len == 6) { - return ["四带二", map[4][0], 1]; - } else if (map[3] && map[1].length == map[3].length && len == map[1].length * 4) { - if (map[3].length == 1) return ["三带一", map[3][0], 1]; - for (var i = 0; i < map[3].length - 1; i++) { - if (map[3][i + 1] - map[3][i] != 1) return null; - } - return ["单带飞机", map[3][0], map[3].length]; - } - return null; - } - if (map[2]) { - if (map[2].length * 2 == len && len > 5) { - for (var i = 0; i < map[2].length - 1; i++) { - if (map[2][i + 1] - map[2][i] != 1) return null; - if (map[2][i + 1] == 15) return null; - } - return ["双顺", nums[0], len]; - } else if (map[4] && len == 6) { - return ["四带二", map[4][0], 1]; - } else if (map[3] && map[2].length == map[3].length && len == map[2].length * 5) { - if (map[3].length == 1) return ["三带二", map[3][0], 1]; - for (var i = 0; i < map[3].length - 1; i++) { - if (map[3][i + 1] - map[3][i] != 1) return null; - if (map[3][i + 1] == 15) return null; - } - return ["双带飞机", map[3][0], map[3].length]; - } - return null; - } - if (map[3]) { - if (map[3].length * 3 == len && len > 5) { - for (var i = 0; i < map[3].length - 1; i++) { - if (map[3][i + 1] - map[3][i] != 1) return null; - if (map[3][i + 1] == 15) return null; - } - return ["三顺", nums[0], len]; - } - return null; - } - return null; - }, - filterOk() { - return Array.isArray( - lib.skill.iriya_haozhi.getType(ui.selected.cards, _status.event.player) - ); - }, - check(card) { - var player = _status.event.player; - //收益都一样 多一牌不如少一牌 - var types = ["炸弹", "三顺", "单顺", "双顺", "三张", "对子"]; - var getNum = function (card, player) { - var num = get.number(card, player); - if (num <= 2) return num + 13; - return num; - }, - hasEnemy = game.hasPlayer((current) => get.attitude(player, current) < 0); - //所有手牌 - var nums = player - .getCards("he", function (card) { - return lib.filter.cardDiscardable(card, player); - }) - .map((card) => getNum(card, player)); - var numu = ui.selected.cards.map((card) => getNum(card, player)); - var num = getNum(card, player); - if (!_status.event._iriya_haozhi_type) { - for (var type of types) { - switch (type) { - case "炸弹": - if (!hasEnemy) break; - for (var i of nums) { - if (get.numOf(nums, i) >= 4) { - _status.event._iriya_haozhi_type = "炸弹"; - break; - } - } - break; - case "三顺": - if (!hasEnemy) break; - for (var i of nums) { - if ( - i < 14 && - get.numOf(nums, i) >= 3 && - get.numOf(nums, i + 1) >= 3 - ) { - _status.event._iriya_haozhi_type = "三顺"; - break; - } - } - break; - case "双顺": - if (!hasEnemy) break; - for (var i of nums) { - if (i < 13 && get.numOf(nums, i) >= 2) { - for (var j = 1; j < 3; j++) { - if (get.numOf(nums, i + j) < 2) break; - if (j == 2) _status.event._iriya_haozhi_type = "双顺"; - } - } - } - break; - case "单顺": - if (!hasEnemy) break; - for (var i of nums) { - if (i < 11) { - for (var j = 1; j < 5; j++) { - if (!nums.includes(i + j)) break; - if (j == 4) _status.event._iriya_haozhi_type = "单顺"; - } - } - } - break; - case "三张": - if (!hasEnemy) break; - for (var i of nums) { - if (get.numOf(nums, i) >= 3) { - _status.event._iriya_haozhi_type = "三张"; - break; - } - } - break; - case "对子": - for (var i of nums) { - if (get.numOf(nums, i) >= 2) { - _status.event._iriya_haozhi_type = "对子"; - break; - } - } - break; - } - if (_status.event._iriya_haozhi_type) break; - } - if (!_status.event._iriya_haozhi_type) _status.event._iriya_haozhi_type = "要不起"; - } - if (_status.event._iriya_haozhi_type == "要不起") return 0; - //复用响应AI - if (!ui.selected.cards.length) { - var count = get.numOf(nums, num); - switch (_status.event._iriya_haozhi_type) { - case "炸弹": - if (count >= 4) return 15; - break; - case "对子": - if ( - count > 1 && - player.hasCard(function (cardx) { - return ( - cardx != card && - getNum(cardx, player) == num && - cardx.hasGaintag("iriya_yinji_tag") - ); - }, "he") - ) - return 4 - get.value(card); - break; - case "三张": - if (count > 2) return 8 - get.value(card); - break; - case "单顺": - if (num > 10) return 0; - for (var i = 1; i < 5; i++) { - if (get.numOf(nums, num + i) < 1) return 0; - } - return 9 - get.value(card); - case "双顺": - if (count < 2 || num > 12) return 0; - for (var i = 1; i < 3; i++) { - if (get.numOf(nums, num + i) < 2) return 0; - } - return 9 - get.value(card); - case "三顺": - if (count < 3 || num > 13) return 0; - for (var i = 1; i < 2; i++) { - if (get.numOf(nums, num + i) < 2) return 0; - } - return 12 - get.value(card); - } - return 0; - } else { - switch (_status.event._iriya_haozhi_type) { - case "炸弹": - if (numu.length >= 4) return 0; - if (num == numu[0]) return 15; - return 0; - case "对子": - if (numu.length >= 2) return 0; - if (num == numu[0]) return 3 - get.value(card); - return 0; - case "三张": - if (numu.length >= 3) return 0; - if (num == numu[0]) return 9 - get.value(card); - return 0; - case "单顺": - case "双顺": - case "三顺": - var map = { - 单顺: [5, 0], - 双顺: [3, 1], - 三顺: [2, 2], - }, - len = map[_status.event._iriya_haozhi_type][0], - addNum = map[_status.event._iriya_haozhi_type][1]; - if (numu.length >= len) return 0; - var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); - if (num == numt) return 10 + addNum - get.value(card); - return 0; - } - } - }, - //响应AI - respondAI(card) { - if (!_status.event.goon) return 0; - var type = _status.event.type, - player = _status.event.player; - var getNum = function (card, player) { - var num = get.number(card, player); - if (num <= 2) return num + 13; - return num; - }, - nums = player - .getCards("he", function (card) { - return lib.filter.cardDiscardable(card, player, "iriya_haozhi"); - }) - .map((card) => getNum(card, player)); - var num = getNum(card, player); - if (!ui.selected.cards.length) { - var count = get.numOf(nums, num); - if (count >= 4 && (type[0] != "炸弹" || num > type[1] || count > type[2])) return 15; - switch (type[0]) { - case "对子": - if (count > 1 && num > type[1]) return 8 - get.value(card); - break; - case "三张": - case "三带一": - case "三带二": - if (count > 2 && num > type[1]) return 9 - get.value(card); - break; - case "单顺": - if (num <= type[1] || num > 15 - type[2]) return 0; - for (var i = 1; i < type[2]; i++) { - if (get.numOf(nums, num + i) < 1) return 0; - } - return 10 - get.value(card); - case "双顺": - if (num <= type[1] || count < 2 || num > 15 - type[2] / 2) return 0; - for (var i = 1; i < type[2] / 2; i++) { - if (get.numOf(nums, num + i) < 2) return 0; - } - return 11 - get.value(card); - case "三顺": - case "单带飞机": - case "双带飞机": - var size = 3 + ["三顺", "单带飞机", "双带飞机"].indexOf(type[0]); - if (num <= type[1] || count < 3 || num > 15 - type[2] / size) return 0; - for (var i = 1; i < type[2] / size; i++) { - if (get.numOf(nums, num + i) < 2) return 0; - } - return 12 - get.value(card); - } - return 0; - } else { - var numu = ui.selected.cards.map((card) => getNum(card, player)); - var numx = numu[0]; - if (num == numx) { - var count = get.numOf(nums, numx); - if ( - count >= 4 && - (type[0] != "炸弹" || num > type[1] || count > type[2]) && - numu.length < (type[0] == "炸弹" ? type2 : 4) - ) - return 15; - } - switch (type[0]) { - case "对子": - if (numu.length >= 2) return 0; - if (num == numu[0]) return 8 - get.value(card); - return 0; - case "三张": - if (numu.length >= 3) return 0; - if (num == numu[0]) return 9 - get.value(card); - return 0; - case "三带一": - if (numu.length == 3 || num == numu[0]) return 9 - get.value(card); - return 0; - case "三带二": - if (numu.length >= 5) return false; - if (numu.length == 3) { - if (num == numu[0] || get.numOf(nums, num) < 2) return 0; - } else if (numu.length == 4) { - return num == numu[3] ? 9 - get.value(card) : 0; - } - if (num == numu[0]) return 9 - get.value(card); - return 0; - case "单顺": - case "双顺": - case "三顺": - if (numu.length >= type[2]) return 0; - var addNum = ["单顺", "双顺", "三顺"].indexOf(type[0]); - var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); - if (num == numt) return 10 + addNum - get.value(card); - return 0; - case "单带飞机": - if (numu.length >= type[2]) return 0; - var len = (type[2] / 4) * 3; - if (numu.length < len) { - var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); - if (num == numt) return 12 - get.value(card); - } else { - if (num >= numu[0] || num <= numu[len - 1]) return 0; - return 12 - get.value(card); - } - return 0; - case "双带飞机": - if (numu.length >= type[2]) return 0; - var len = (type[2] / 5) * 3; - if (numu.length < len) { - var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); - if (num == numt) return 12 - get.value(card); - } else { - if ((numu.length - len) % 2 == 0) { - if (numu.includes(num) || get.numOf(nums, num) < 2) return 0; - return 12 - get.value(card); - } else { - return num == numu[numu.length - 1] ? 12 - get.value(card) : 0; - } - } - return 0; - } - } - }, - content() { - "step 0"; - var players = game.filterPlayer().sortBySeat(player.getNext()); - event.players = players; - event.current = player; - event.current_type = lib.skill.iriya_haozhi.getType(cards, player); - event.current_cards = cards.slice(0); - if (!event.current_type) event.finish(); - "step 1"; - var target = event.players.shift(); - if ( - (target != player || event.current != player) && - target.isIn() && - target.countCards("h") >= Math.min(cards.length, 4) - ) { - event.target = target; - target.addTempSkill("iriya_haozhi_temp", { - global: ["discardBefore", "chooseToDiscardEnd", "phaseAfter"], - }); - var trans = get.translation(event.current); - var cardsn = (function (cards, player) { - var getn = (card, player) => { - var num = get.number(card, player); - if (num <= 2) return num + 13; - return num; - }; - cards.sort(function (a, b) { - var numa = getn(a, player), - numb = getn(b, player); - if (numa != numb) return numa - numb; - return lib.suit.indexOf(get.suit(a, player) - get.suit(b, player)); - }); - var str = ""; - for (var i of cards) { - str += ","; - str += get.strNumber(get.number(i, player)); - str += get.translation(get.suit(i, player)); - } - return str.slice(1); - })(event.current_cards, event.current); - var next = target.chooseToDiscard( - "是否响应" + trans + "的" + get.translation(event.current_type[0]) + "?", - trans + "的牌组为" + cardsn + "。您此时可以点击“整理手牌”,将手牌按点数排序。", - [2, Infinity], - "he" - ); - next.set("type", event.current_type); - next.set("filterOk", function () { - var type = lib.skill.iriya_haozhi.getType( - ui.selected.cards, - _status.event.player - ); - if (!type) return false; - var ptype = _status.event.type; - if (type[0] == "炸弹") { - if (ptype[0] == "炸弹") { - if (type[2] > ptype[2]) return true; - return type[1] > ptype[1] && type[2] == ptype[2]; - } - return true; - } - return type[0] == ptype[0] && type[2] == ptype[2] && type[1] > ptype[1]; - }); - next.set("goon", get.attitude(target, event.current) < 0); - next.set("ai", lib.skill.iriya_haozhi.respondAI); - } else if (event.players.length > 0) event.redo(); - else event.goto(3); - "step 2"; - if (result.bool) { - event.current = target; - event.current_type = lib.skill.iriya_haozhi.getType(result.cards.slice(0), target); - event.current_cards = result.cards.slice(0); - if (!event.current_type) event.finish(); - event.current.addExpose(0.5); - } - if (event.players.length > 0) event.goto(1); - "step 3"; - var current = event.current, - type = 0; - if (!current.isIn()) return; - switch (event.current_type[0]) { - case "对子": - type = 1; - break; - case "三张": - case "三带一": - case "三带二": - type = 2; - break; - case "单顺": - type = 3; - break; - case "双顺": - type = 4; - break; - case "三顺": - case "单带飞机": - case "双带飞机": - type = 5; - break; - case "炸弹": - case "四带二": - type = 6; - break; - } - /*if(type==2){ - current.addSkill('iriya_haozhi_extra'); - current.addMark('iriya_haozhi_extra',1,false); - } - else */ - if (type > 0) { - var next = game.createEvent("iriya_haozhi_effect", false); - next.player = current; - next.setContent(lib.skill.iriya_haozhi["content" + type]); - } - }, - content1() { - "step 0"; - player - .chooseTarget([1, 2], "是否令至多两名角色各摸一张牌?") - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.line(targets); - game.asyncDraw(targets); - game.delayex(); - } - }, - content2() { - "step 0"; - player - .chooseTarget( - [1, 3], - "是否弃置至多三名角色的各一张牌?", - function (card, player, target) { - return ( - target != player && - target.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }, "he") - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.line(targets, "green"); - for (var target of targets) { - player.discardPlayerCard(target, true, "he"); - } - } - "step 2"; - //player.recover(); - player.draw(); - }, - content3() { - "step 0"; - event.count = 0; - "step 1"; - var next = player - .chooseTarget("是否弃置一名其他角色的一张牌?", function (card, player, target) { - return ( - target != player && - target.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }, "he") - ); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - if (event.color) - next.set( - "prompt2", - "若你弃置的牌为" + get.translation(event.color) + ",则你可以重复此流程" - ); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - player.discardPlayerCard(target, true, "he"); - } else event.goto(4); - "step 3"; - if (result.bool) { - event.count++; - var card = result.cards[0], - color = get.color(card, false); - if (!event.color) { - event.color = color; - event.goto(1); - } else if (color == event.color) event.goto(1); - } - "step 4"; - if (event.count > 0) player.draw(event.count); - }, - content4() { - "step 0"; - event.count = 0; - "step 1"; - var next = player - .chooseTarget("是否获得一名其他角色的一张牌?", function (card, player, target) { - return ( - target != player && - target.hasCard(function (card) { - return lib.filter.canBeGained(card, player, target); - }, "he") - ); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "shunshou_copy2" }, player, player); - }); - if (event.color) - next.set( - "prompt2", - "若你得到的牌为" + get.translation(event.color) + ",则你可以重复此流程" - ); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - player.gainPlayerCard(target, true, "he"); - } else event.goto(4); - "step 3"; - if (result.bool) { - event.count++; - var card = result.cards[0], - color = get.color(card, false); - if (!event.color) { - event.color = color; - event.goto(1); - } else if (color == event.color) event.goto(1); - //player.draw(); - } - "step 4"; - if (event.count > 0) player.recover(event.count); - }, - content5() { - "step 0"; - player - .chooseTarget([1, 3], "是否令至多三名其他角色翻面?", lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.isTurnedOver()) return 10 * att; - return -6 * att; - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.line(targets, "thunder"); - event.targets = targets; - for (var target of targets) target.turnOver(); - } - "step 2"; - player - .chooseTarget( - "是否对一名目标角色造成1点火属性伤害?", - function (card, player, target) { - return _status.event.getParent().targets.includes(target); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player, "fire"); - }); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - target.damage("fire"); - } - }, - content6() { - "step 0"; - player - .chooseTarget( - "是否对一名其他角色进行核打击?", - "你对该角色造成2点雷属性伤害,然后该角色翻面,弃置装备区内的所有牌和四张手牌。", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.isTurnedOver()) - return -6 * att * Math.sqrt(2 + target.countCards("he")); - return -att * Math.sqrt(2 + target.countCards("he")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "thunder"); - target.damage("thunder", 2); - target.turnOver(); - } else event.finish(); - "step 2"; - var num = target.countCards("e"); - if (num > 0) target.chooseToDiscard("e", true, num); - "step 3"; - var num = target.countCards("h"); - if (num > 0) target.chooseToDiscard("h", true, Math.min(4, num)); - }, - ai: { - sortCardByNum: true, - order: 13, - result: { - player: 1, - }, - }, - subSkill: { - extra: { - charlotte: true, - mod: { - targetInRange: () => true, - cardUsable: () => Infinity, - }, - trigger: { player: "useCard2" }, - forced: true, - onremove: true, - content() { - "step 0"; - var num = player.countMark("iriya_haozhi_extra"); - player.removeSkill("iriya_haozhi_extra"); - var card = trigger.card; - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat().card; - if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; - } - var info = get.info(card); - if (info.allowMultiple == false) event.finish(); - if (trigger.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); - }) - ) { - var prompt2 = - "为" + - get.translation(card) + - "增加" + - (num > 1 ? "至多" : "") + - get.cnNumber(num) + - "个目标"; - player - .chooseTarget( - get.prompt("iriya_haozhi_extra"), - [1, num], - function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2( - _status.event.card, - player, - target - ) - ); - } - ) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - } - } - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("iriya_haozhi_extra", event.targets); - trigger.targets.addArray(event.targets); - } - }, - intro: { - content: "使用下一张牌无距离和次数限制,且可以增加#个目标", - }, - }, - temp: { - ai: { sortCardByNum: true }, - charlotte: true, - }, - }, - }, //远野美凪&远野小满 minagi_peiquan: { enable: "phaseUse", @@ -3459,6 +2145,7 @@ game.import("character", function () { }, }, }, + //加纳天善(改版) tenzen_fenghuan: { trigger: { global: "useCardAfter" }, filter(event, player) { @@ -3624,667 +2311,7 @@ game.import("character", function () { } }, }, - satomi_luodao: { - trigger: { player: "useCardToPlayered" }, - logTarget: "target", - filter(event, player) { - return event.card.name == "sha" && event.target.countCards("h") > 0; - }, - content() { - "step 0"; - var target = trigger.target; - event.target = target; - target.showHandcards( - get.translation(player) + "对" + get.translation(target) + "发动了【落刀】" - ); - "step 1"; - if ( - target.hasCard(function (card) { - return get.name(card, target) == "shan"; - }, "h") - ) { - player - .discardPlayerCard(target, true, "h", "visible") - .set("filterButton", function (button) { - return get.name(button.link) == "shan"; - }); - } else if (player.countCards("he") > 0) player.chooseToDiscard("he", true); - }, - }, - satomi_daohai: { - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return ( - player.hasHistory("lose", function (evt) { - return evt.type == "discard" && evt.cards2.length > 0; - }) && player.hasUseTarget({ name: "wugu" }) - ); - }, - check(event, player) { - return player.getUseValue({ name: "wugu" }) + player.getUseValue({ name: "lebu" }) > 0; - }, - content() { - "step 0"; - player.chooseUseTarget("wugu", true); - "step 1"; - if (result.bool) { - var cards = []; - player.getHistory("gain", function (evt) { - if (evt.getParent().name == "wugu" && evt.getParent(4) == event) { - cards.addArray(evt.cards); - } - }); - cards = cards.filter(function (card) { - return ( - player.getCards("h").includes(card) && - game.checkMod(card, player, "unchanged", "cardEnabled2", player) - ); - }); - if (cards.length) { - player.chooseCardTarget({ - prompt: "是否将得到的牌当做【乐不思蜀】使用?", - filterCard(card) { - return _status.event.cards.includes(card); - }, - cards: cards, - filterTarget(card, player, target) { - var card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); - return player.canUse(card, target); - }, - ai1: () => 1, - ai2(target) { - var player = _status.event.player, - card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); - return get.effect(target, { name: "lebu" }, player, player); - }, - }); - } else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) { - player.useCard({ name: "lebu" }, result.cards, result.targets[0]); - } - }, - }, - erika_shisong: { - trigger: { player: "useCard" }, - forced: true, - charlotte: true, - filter(event, player) { - if (player != _status.currentPhase) return false; - var index = player.getHistory("useCard").indexOf(event), - history = player.actionHistory; - for (var i = history.length - 2; i >= 0; i--) { - if (history[i].isMe) { - var evt = history[i].useCard[index]; - return evt && get.type2(evt.card) == get.type(event.card); - } - } - return false; - }, - content() { - player.draw(); - }, - mod: { - maxHandcard(player, num) { - return num + player.hujia; - }, - }, - }, - erika_yousheng: { - init: (player) => { - player.addSkill("erika_yousheng_mamori"); - }, - dutySkill: true, - group: ["erika_yousheng_achieve", "erika_yousheng_fail"], - trigger: { global: "useCardToTarget" }, - filter(event, player) { - return ( - player.getStorage("erika_yousheng").includes(event.target) && - (event.card.name == "sha" || - (get.type2(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)) && - player.countMark("erika_yousheng_ruka") + 1 <= player.countCards("he") - ); - }, - intro: { - content: "已保护$", - }, - async cost(event, trigger, player) { - const num = player.countMark("erika_yousheng_ruka") + 1; - event.result = await player - .chooseToDiscard( - "he", - num, - get.prompt("erika_yousheng", trigger.target), - "弃置" + num + "张牌,并转移" + get.translation(trigger.card) - ) - .forResult(); - }, - async content(event, trigger, player) { - player.discard(event.cards); - var ruka = trigger.target, - evt = trigger.getParent(); - evt.targets.remove(ruka); - evt.triggeredTargets2.remove(ruka); - evt.targets.push(player); - evt.triggeredTargets2.push(player); - player.addTempSkill("erika_yousheng_ruka"); - var str = "erika_yousheng_" + player.playerid; - if (!evt[str]) evt[str] = []; - evt[str].add(ruka); - }, - subSkill: { - achieve: { - trigger: { player: "changeHujiaAfter" }, - forced: true, - skillAnimation: "legend", - animationColor: "water", - filter(event, player) { - return player.storage.erika_yousheng && event.num < 0 && !player.hujia; - }, - content() { - "step 0"; - player.awakenSkill("erika_yousheng"); - game.log(player, "成功完成使命"); - var list = [player]; - list.addArray(player.storage.erika_yousheng); - list.sortBySeat(); - list = list.filter(function (current) { - return current.isAlive(); - }); - player.line(list, "green"); - game.asyncDraw(list, 3); - "step 1"; - game.delayx(); - }, - }, - fail: { - trigger: { global: "damageEnd" }, - forced: true, - filter(event, player) { - return ( - player.getStorage("erika_yousheng").includes(event.player) && - event.card && - (event.card.name == "sha" || - (get.type2(event.card, false) == "trick" && - get.tag(event.card, "damage") > 0)) - ); - }, - content() { - player.awakenSkill("erika_yousheng"); - game.log(player, "使命失败"); - var num = player.hujia; - if (num > 0) { - player.changeHujia(-num); - player.chooseToDiscard(num, true, "he"); - } - }, - }, - mamori: { - trigger: { global: "roundStart" }, - skillAnimation: true, - animationColor: "wood", - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("erika_yousheng"), - [1, 2], - lib.filter.notMe, - "选择至多两名其他角色。你减2点体力上限并获得3点护甲。" - ) - .set("ai", function (ruka) { - return -1; - }) - .forResult(); - }, - async content(event, trigger, player) { - player.awakenSkill("erika_yousheng_mamori"); - player.markAuto("erika_yousheng", event.targets); - await player.loseMaxHp(2); - await player.changeHujia(3); - }, - }, - ruka: { - trigger: { global: "useCardAfter" }, - charlotte: true, - filter(event, player) { - return ( - event["erika_yousheng_" + player.playerid] && - event.cards.filterInD().length > 0 - ); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - "是否令一名原目标角色获得" + - get.translation(trigger.cards.filterInD()) + - "?", - function (card, player, target) { - return _status.event.targets.includes(target); - } - ) - .set("targets", trigger["erika_yousheng_" + player.playerid]) - .forResult(); - }, - async content(event, trigger, player) { - const ruka = event.targets[0]; - player.line(ruka, "green"); - ruka.gain(trigger.cards.filterInD(), "gain2"); - }, - }, - }, - }, - liyingxia_sanli: { - trigger: { target: "useCardToTargeted" }, - forced: true, - filter(event, player) { - if (event.player == player || event.player != _status.currentPhase) return false; - var index = event.player - .getHistory("useCard", function (evt) { - return evt.targets.includes(player); - }) - .indexOf(event.getParent()); - if (index == 2) return event.player.isIn() && player.countCards("he") > 0; - return index < 2 && index > -1; - }, - logTarget: "player", - content() { - "step 0"; - var index = trigger.player - .getHistory("useCard", function (evt) { - return evt.targets.includes(player); - }) - .indexOf(trigger.getParent()); - if (index == 2) { - player.chooseCard( - "he", - true, - "三礼:交给" + get.translation(trigger.player) + "一张牌" - ); - } else { - player.draw(); - event.finish(); - } - "step 1"; - if (result.bool) { - player.give(result.cards, trigger.player); - } - }, - }, - liyingxia_zhenjun: { - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return player.group == "key"; - }, - async cost(event, trigger, player) { - const num = - player.getHistory("useCard", function (evt) { - return ( - evt.card.name == "sha" || - (get.type(evt.card) == "trick" && get.tag(evt.card, "damage") > 0) - ); - }).length + 1; - event.result = await player - .chooseTarget( - get.prompt("liyingxia_zhenjun"), - [1, num], - "令至多" + get.cnNumber(num) + "名角色各摸一张牌" - ) - .set("ai", (serafu) => get.attitude(_status.event.player, serafu)) - .forResult(); - }, - content() { - targets.sortBySeat(); - game.asyncDraw(targets); - for (var i of targets) - i.addTempSkill("liyingxia_zhenjun_enhance", { - player: player == i ? "phaseJieshuBegin" : "phaseAfter", - }); - game.delayx(); - }, - subSkill: { - enhance: { - trigger: { source: "damageBegin1" }, - forced: true, - charlotte: true, - mark: true, - filter: (event, player) => player == _status.currentPhase, - intro: { content: "下回合首次造成的伤害+1" }, - content() { - trigger.num++; - player.removeSkill(event.name); - }, - }, - }, - }, - liyingxia_wumai: { - trigger: { global: "roundStart" }, - filter(event, player) { - return ( - player.group == "shu" && - (player.getStorage("liyingxia_wumai").length < 4 || - game.hasPlayer((current) => current.isDamaged())) - ); - }, - async cost(event, trigger, player) { - var list = lib.skill.liyingxia_wumai.derivation.slice(0); - list.removeArray(player.getStorage("liyingxia_wumai")); - if (list.length) { - const { result } = await player - .chooseControl(list, "cancel2") - .set("prompt", get.prompt("liyingxia_wumai")) - .set("prompt2", "获得一个技能直到本轮结束"); - if (result.control !== "cancel2") { - event.result = { - bool: true, - cost_data: { - type: "addSkill", - skill: result.control, - }, - }; - } - } else { - const num = Math.min( - 3, - game.countPlayer((current) => current.isDamaged()) - ); - const { result } = await player.chooseBool( - get.prompt("liyingxia_wumai") + "(可摸" + get.cnNumber(num) + "张牌)" - ); - if (result.bool) { - event.result = { - bool: true, - cost_data: { - type: "drawCards", - num, - }, - }; - } - } - }, - async content(event, trigger, player) { - const result = event.cost_data; - if (result.type === "addSkill") { - player.markAuto("liyingxia_wumai", [result.skill]); - player.addTempSkills(result.skill, "roundStart"); - } else if (result.type === "drawCards") { - player.draw(result.num); - } - }, - derivation: ["bazhen", "rejizhi", "reguanxing", "youlong"], - }, - kano_liezhen: { - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return player.getHistory("useCard").length > 0; - }, - frequent: true, - async cost(event, trigger, player) { - var history = player.getHistory("useCard"); - if (history.length > 1) { - var type = get.type2(history[0].card, false); - for (var i = 1; i < history.length; i++) { - if (get.type2(history[i].card, false) != type) { - const result = await player - .chooseButton([ - "列阵:是否视为使用其中一种牌?", - [["kano_paibingbuzhen"].concat(get.zhinangs()), "vcard"], - ]) - .set("filterButton", function (button) { - return _status.event.player.hasUseTarget({ - name: button.link[2], - isCard: true, - }); - }) - .set("ai", function (button) { - return _status.event.player.getUseValue({ - name: button.link[2], - isCard: true, - }); - }) - .forResult(); - if (result.bool) - event.result = { - bool: true, - cost_data: { - links: result.links, - }, - }; - return; - } - } - } - var str = _status.renku.length ? "获得仁库中的所有牌" : "摸两张牌"; - event.result = await player - .chooseBool(get.prompt("kano_liezhen"), str) - .set("frequentSkill", "kano_liezhen") - .forResult(); - }, - async content(event, trigger, player) { - const result = event.cost_data; - if (!result || !result.links.length) { - if (_status.renku.length) { - const cards = _status.renku.slice(0); - _status.renku.length = 0; - game.updateRenku(); - await player.gain(cards, "gain2", "fromRenku"); - } else player.draw(2); - } else { - player.chooseUseTarget(result.links[0][2], true); - } - }, - init(player) { - player.storage.renku = true; - }, - }, - kano_poyu: { - trigger: { target: "useCardToTargeted" }, - charlotte: true, - filter(event, player) { - return ( - _status.renku.length > 0 && - (event.card.name == "sha" || - (get.type(event.card) == "trick" && get.tag(event.card, "damage") > 0)) - ); - }, - check(trigger, player) { - return get.effect(player, trigger.card, trigger.player, player) < 0; - }, - content() { - "step 0"; - player.judge(); - "step 1"; - var bool = false, - type = get.type2(result.card.name); - for (var i of _status.renku) { - if (get.suit(i) == result.suit || get.type2(i) == type) { - bool = true; - break; - } - } - if (bool) { - player - .chooseButton([ - "是否移去一张牌,令" + get.translation(trigger.card) + "对你无效?", - _status.renku, - ]) - .set("types", [result.suit, type]) - .set("filterButton", function (button) { - var types = _status.event.types; - return ( - get.suit(button.link, false) == types[0] || - get.type2(button.link, false) == types[1] - ); - }) - .set("ai", () => 1); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.links[0]; - player.$throw(card, 1000); - _status.renku.remove(card); - game.cardsDiscard(card).fromRenku = true; - game.log(player, "将", card, "置入了弃牌堆"); - trigger.excluded.add(player); - game.updateRenku(); - } - }, - init(player) { - player.storage.renku = true; - }, - }, - mia_shihui: { - trigger: { player: "phaseDrawBegin1" }, - forced: true, - filter(event, player) { - return !event.numFixed; - }, - content() { - trigger.changeToZero(); - var num = 0; - all = player.getAllHistory(); - if (all.length > 1) { - for (var i = all.length - 2; i >= 0; i--) { - if (all[i].isMe) { - for (var evt of all[i].lose) { - if (evt.type == "discard") num += evt.cards2.length; - } - break; - } - } - } - player.draw(1 + num); - }, - group: "mia_shihui_recover", - subSkill: { - recover: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter(event, player) { - return player.isDamaged() || player.countCards("he") > 0; - }, - content() { - player.chooseToDiscard("he", true); - player.recover(); - }, - }, - }, - }, - mia_qianmeng: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - dutySkill: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - "step 0"; - player.draw(); - "step 1"; - if (player.countCards("he") > 0) { - player.chooseCard("he", true, "潜梦:选择一张牌置于牌堆中"); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.cards[0]; - player.storage.mia_qianmeng = card; - player.$throw(card, 1000); - player.lose(card, ui.cardPile).insert_index = function () { - return ui.cardPile.childNodes[Math.ceil(ui.cardPile.childNodes.length / 2)]; - }; - } else event.finish(); - "step 3"; - game.delayx(); - }, - onremove: true, - group: ["mia_qianmeng_achieve", "mia_qianmeng_fail"], - subSkill: { - achieve: { - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - forced: true, - filter(event, player) { - var card = player.storage.mia_qianmeng; - if (event.name == "gain") { - var source = event.player, - cards = event.getg(source); - return cards.includes(card) && source.getCards("hejsx").includes(card); - } else { - if (event.type != "gain") return false; - var owner = get.owner(card); - return owner && event.getg(owner).includes(card); - } - }, - skillAnimation: true, - animationColor: "key", - content() { - "step 0"; - game.log(player, "成功完成使命"); - player.awakenSkill("mia_qianmeng"); - var card = player.storage.mia_qianmeng, - owner = get.owner(card); - if (owner && owner != player) owner.give(card, player); - "step 1"; - if (player.hp < player.maxHp) player.recover(player.maxHp - player.hp); - player.changeSkills(["mia_fengfa"], ["mia_shihui"]); - }, - }, - fail: { - trigger: { player: "die" }, - forceDie: true, - filter(event, player) { - return get.itemtype(player.storage.mia_qianmeng) == "card"; - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("mia_qianmeng"), - "令一名角色获得牌堆中所有点数为" + - player.storage.mia_qianmeng.number + - "的牌", - lib.filter.notMe - ) - .forResult(); - }, - async content(event, trigger, player) { - game.log(player, "使命失败"); - var target = event.targets[0]; - var num = player.storage.mia_qianmeng.number, - suit = player.storage.mia_qianmeng.suit, - cards = []; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (card.number == num && card.suit == suit) cards.push(card); - } - if (cards.length) await target.gain(cards, "gain2"); - }, - }, - }, - }, - mia_fengfa: { - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter(event, player) { - return !event.numFixed; - }, - content() { - var num = 0; - all = player.getAllHistory(); - if (all.length > 1) { - for (var i = all.length - 2; i >= 0; i--) { - if (all[i].isMe) { - num += all[i].useCard.length; - break; - } - } - } - trigger.num += num; - }, - }, + //藤林杏 kyou_zhidian: { locked: false, mod: { @@ -4429,6 +2456,7 @@ game.import("character", function () { }, }, }, + //天王寺瑚太朗 kotarou_aurora: { trigger: { player: ["damageEnd", "loseHpEnd", "gainMaxHpEnd"], @@ -4614,6 +2642,7 @@ game.import("character", function () { if (player.maxHp > 3) player.loseMaxHp(player.maxHp - 3); }, }, + //加纳天善(旧) tenzen_yixing: { trigger: { global: "damageEnd", @@ -4838,6 +2867,7 @@ game.import("character", function () { } }, }, + //伊座并杏子 kyouko_rongzhu: { trigger: { global: "gainEnd" }, filter(event, player) { @@ -5089,6 +3119,7 @@ game.import("character", function () { } }, }, + //冰室忧希 yuuki_yicha: { trigger: { player: "phaseUseBegin" }, frequent: true, @@ -5300,2932 +3331,7 @@ game.import("character", function () { } }, }, - kotomi_qinji: { - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return player.hasUseTarget("wanjian"); - }, - //chooseUseTarget也不好改 先放着 - direct: true, - content() { - player.addTempSkill("kotomi_qinji2"); - player.chooseUseTarget( - { name: "wanjian", isCard: true }, - get.prompt("kotomi_qinji"), - "视为使用一张【万箭齐发】" - ).logSkill = "kotomi_qinji"; - }, - }, - kotomi_qinji2: { - trigger: { source: "damageBefore" }, - forced: true, - popup: false, - filter(event, player) { - return event.getParent().skill == "kotomi_qinji"; - }, - content() { - trigger.cancel(); - trigger.player.loseHp(trigger.num); - }, - }, - kotomi_chuanxiang: { - global: "kotomi_chuanxiang2", - }, - kotomi_chuanxiang2: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return ( - !player.hasSkill("kotomi_chuanxiang") && - player.countCards("e", lib.skill.kotomi_chuanxiang2.filterCard) > 0 - ); - }, - filterCard(card, player) { - if (!player) player = _status.event.player; - return game.hasPlayer(function (current) { - return current != player && current.canEquip(card); - }); - }, - position: "e", - filterTarget(card, player, target) { - return target != player && target.canEquip(ui.selected.cards[0]); - }, - check(card) { - if (get.value(card) <= 0) return 10; - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return current.hasSkill("kotomi_chuanxiang") && get.attitude(player, current) > 0; - }) - ) { - var subtype = get.subtype(card, false); - if ( - player.countCards("hs", function (cardx) { - return ( - get.type(cardx) == "equip" && - get.subtype(cardx, false) == subtype && - player.canUse(cardx, player) && - get.effect(player, cardx, player, player) > 0 - ); - }) - ) - return 8; - return 7 / Math.max(1, get.value(card)); - } - return 0; - }, - promptfunc() { - var players = game.filterPlayer(function (current) { - return current.hasSkill("kotomi_chuanxiang"); - }); - return ( - "将一张装备牌传给其他角色,然后令" + - get.translation(players) + - "摸一张牌。若传给该角色,则其改为摸两张牌。" - ); - }, - prepare: "give", - discard: false, - lose: false, - content() { - "step 0"; - target.equip(cards[0]); - var list = game.filterPlayer(function (current) { - return current.hasSkill("kotomi_chuanxiang"); - }); - game.asyncDraw(list, function (targetx) { - return targetx == target ? 2 : 1; - }); - "step 1"; - game.delayx(); - }, - ai: { - order: 8, - result: { - target(player, target) { - var card = ui.selected.cards[0]; - if (!card) return 0; - var eff = get.effect(target, card, player, target); - if (target.hasSkill("kotomi_chuanxiang")) eff++; - return eff; - }, - }, - }, - }, - asara_shelu: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return ( - player.countCards("he") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ); - }, - filterCard: true, - position: "he", - filterTarget(card, player, target) { - return target != player && target.countCards("h") > 0; - }, - check(card) { - return 6 - get.value(card); - }, - content() { - "step 0"; - if (!target.countCards("h")) event.finish(); - else player.choosePlayerCard(target, "h", true); - "step 1"; - player.showCards(result.cards); - event.cards2 = result.cards; - "step 2"; - target.$give(event.cards2, player, false); - target.loseToSpecial(event.cards2, "asara_yingwei", player).visible = true; - var card1 = cards[0], - card2 = event.cards2[0]; - if (card1.suit == card2.suit) player.draw(2); - if (card1.number == card2.number) player.recover(); - }, - ai: { - order: 6, - result: { - target: -1, - }, - }, - }, - asara_yingwei: { - trigger: { player: "yingbian" }, - forced: true, - filter: (event, player) => - event.card.isCard && - player.hasHistory( - "lose", - (evt) => - evt.getParent() == event && - Object.values(evt.gaintag_map).some((value) => value.includes("asara_yingwei")) - ), - content: () => { - trigger.forceYingbian = true; - }, - ai: { - combo: "asara_shelu" - }, - }, - yukito_kongwu: { - enable: "phaseUse", - usable: 1, - content() { - "step 0"; - if (_status.connectMode) event.time = lib.configOL.choose_timeout; - event.videoId = lib.status.videoId++; - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - game.pause(); - game.countChoose(); - setTimeout(function () { - _status.imchoosing = false; - event._result = { - bool: true, - score: get.rand(1, 5), - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - game.resume(); - }, 5000); - }; - var createDialog = function (player, id) { - if (_status.connectMode) lib.configOL.choose_timeout = "30"; - if (player == game.me) return; - var str = get.translation(player) + "正在表演《小空飞天》...
    "; - ui.create.dialog(str).videoId = id; - }; - var chooseButton = function () { - lib.skill.yufeng.$playFlappyBird(5, "小空飞天"); - }; - //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog, player, event.videoId); - if (event.isMine()) { - chooseButton(); - } else if (event.isOnline()) { - event.player.send(chooseButton); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - game.broadcastAll( - function (id, time) { - if (_status.connectMode) lib.configOL.choose_timeout = time; - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - } - }, - event.videoId, - event.time - ); - var result = event.result || result; - game.log(player, "获得了", "#g" + result.score + "分"); - if (!result.score) { - player.chooseToDiscard(2, true, "he"); - event.finish(); - return; - } - var list = []; - var list2 = []; - for (var i = 0; i < 5; i++) { - if (lib.skill.yukito_kongwu.moves[i].filter(player, true)) list.push(i); - else list2.push(i); - } - if (list.length >= result.score) list = list.randomGets(result.score); - else list.addArray(list2.randomGets(result.score - list.length)); - list.sort(); - var next = player.chooseButton([ - "控物:请选择一项", - [ - list.map((i) => { - return [i, lib.skill.yukito_kongwu.moves[i].prompt]; - }), - "textbutton", - ], - ]); - next.set("forced", true); - next.set("filterButton", function (button) { - return lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player); - }); - next.set("ai", function (button) { - if (lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player, true)) - return 1 + Math.random(); - return Math.random(); - }); - "step 2"; - var num = result.links[0]; - switch (num) { - case 0: - event.goto(3); - break; - case 1: - event.goto(5); - break; - case 2: - event.goto(7); - break; - case 3: - event.goto(9); - break; - case 4: - player.moveCard(true); - event.finish(); - break; - } - "step 3"; - player.chooseTarget(true, "令一名角色摸两张牌").set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.draw(2); - } - event.finish(); - "step 5"; - player.chooseTarget(true, "对一名角色造成1点伤害").set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 6"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.damage(); - } - event.finish(); - "step 7"; - player - .chooseTarget(true, "令一名已受伤的角色回复1点体力", function (card, player, target) { - return target.isDamaged(); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.recoverEffect(target, player, player); - }); - "step 8"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.recover(); - } - event.finish(); - "step 9"; - player - .chooseTarget(true, "弃置一名角色区域内的两张牌", function (card, player, target) { - return target.countDiscardableCards(player, "hej") > 0; - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 10"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.discardPlayerCard(target, "hej", true, 2); - } - event.finish(); - }, - moves: [ - { - prompt: "令一名角色摸两张牌", - filter: () => true, - }, - { - prompt: "对一名角色造成1点伤害", - filter(player, ai) { - if (!ai) return true; - return game.hasPlayer(function (current) { - return get.damageEffect(current, player, player) > 0; - }); - }, - }, - { - prompt: "令一名已受伤的角色回复1点体力", - filter(player, ai) { - return game.hasPlayer(function (current) { - if (current.isDamaged()) - return !ai || get.recoverEffect(current, player, player) > 0; - }); - }, - }, - { - prompt: "弃置一名角色区域内的两张牌", - filter(player, ai) { - return game.hasPlayer(function (current) { - return ( - current.countDiscardableCards(player, "hej", function (card) { - if (!ai) return true; - return ( - get.buttonValue({ - link: card, - }) * - get.attitude(player, current) > - 0 - ); - }) >= (ai ? 1 : Math.min(2, current.countDiscardableCards(player, "hej"))) - ); - }); - }, - }, - { - prompt: "移动场上的一张牌", - filter(player, ai) { - return player.canMoveCard(ai); - }, - }, - ], - ai: { - order: 10, - result: { player: 1 }, - threaten: 3.2, - }, - }, - yukito_yaxiang: { - enable: "chooseToUse", - limited: true, - filter(event, player) { - return ( - event.type == "dying" && - (player.name1 == "key_yukito" || player.name2 == "key_yukito") - ); - }, - filterTarget(card, player, target) { - return target == _status.event.dying; - }, - selectTarget: -1, - skillAnimation: true, - animationColor: "key", - content() { - "step 0"; - player.awakenSkill("yukito_yaxiang"); - player.reinitCharacter("key_yukito", "key_crow", false); - "step 1"; - if (target.hp < 3) target.recover(3 - target.hp); - "step 2"; - var cards = target.getCards("j"); - if (cards.length) target.discard(cards); - "step 3"; - target.addSkills("misuzu_zhongyuan"); - }, - derivation: "misuzu_zhongyuan", - ai: { - save: true, - order: 4, - result: { - target(player, target) { - if (get.attitude(player, target) < 4) return false; - if ( - player.countCards("h", function (card) { - var mod2 = game.checkMod( - card, - player, - "unchanged", - "cardEnabled2", - player - ); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod( - card, - player, - target, - "unchanged", - "cardSavable", - player - ); - if (mod != "unchanged") return mod; - var savable = get.info(card).savable; - if (typeof savable == "function") savable = savable(card, player, target); - return savable; - }) >= - 1 - target.hp - ) - return false; - if (target == player || target == get.zhu(player)) return true; - return !player.hasUnknown(); - }, - }, - }, - }, - misuzu_zhongyuan: { - trigger: { player: "judge" }, - skillAnimation: true, - animationColor: "key", - logTarget: "player", - cost() { - "step 0"; - var str = - "你的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - ",是否发动【终愿】修改判定结果?"; - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - _status.imchoosing = false; - event._result = { - bool: false, - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - }; - var chooseButton = function (player, str) { - var event = _status.event; - player = player || event.player; - if (!event._result) event._result = {}; - var dialog = ui.create.dialog(str, "forcebutton", "hidden"); - event.dialog = dialog; - dialog.addText("花色"); - var table = document.createElement("div"); - table.classList.add("add-setting"); - table.style.margin = "0"; - table.style.width = "100%"; - table.style.position = "relative"; - var listi = ["spade", "heart", "club", "diamond"]; - for (var i = 0; i < listi.length; i++) { - var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); - td.link = listi[i]; - table.appendChild(td); - td.innerHTML = "" + get.translation(listi[i]) + ""; - td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { - if (_status.dragged) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - var current = this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - } - this.classList.add("bluebg"); - event._result.suit = link; - }); - } - dialog.content.appendChild(table); - dialog.addText("点数"); - var table2 = document.createElement("div"); - table2.classList.add("add-setting"); - table2.style.margin = "0"; - table2.style.width = "100%"; - table2.style.position = "relative"; - for (var i = 1; i < 14; i++) { - var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); - td.link = i; - table2.appendChild(td); - var num = i; - td.innerHTML = "" + get.strNumber(num) + ""; - td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { - if (_status.dragged) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - var current = this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - } - this.classList.add("bluebg"); - event._result.number = link; - }); - } - dialog.content.appendChild(table2); - dialog.add("  "); - event.dialog.open(); - event.switchToAuto = function () { - event._result = { - bool: false, - }; - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; - }; - event.control = ui.create.control("ok", "cancel2", function (link) { - var result = event._result; - if (link == "cancel2") result.bool = false; - else { - if (!result.number || !result.suit) return; - result.bool = true; - } - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; - }); - for (var i = 0; i < event.dialog.buttons.length; i++) { - event.dialog.buttons[i].classList.add("selectable"); - } - game.pause(); - game.countChoose(); - }; - if (event.isMine()) { - chooseButton(player, str); - } else if (event.isOnline()) { - event.player.send(chooseButton, event.player, str); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - var map = event.result || result; - if (map.bool) { - event.result = { - bool: true, - cost_data: map, - }; - } - }, - async content(event, trigger, player) { - var map = event.cost_data; - player.awakenSkill("misuzu_zhongyuan"); - game.log( - player, - "将判定结果修改为了", - "#g" + get.translation(map.suit + 2) + get.strNumber(map.number) - ); - trigger.fixedResult = { - suit: map.suit, - color: get.color({ suit: map.suit }), - number: map.number, - }; - player.popup(get.translation(map.suit + 2) + get.strNumber(map.number), "thunder"); - event.getParent("arrangeTrigger").finish(); - }, - }, - chihaya_liewu: { - derivation: "chihaya_huairou", - mod: { - cardUsable(card) { - if (card.name == "sha") return Infinity; - }, - targetInRange(card) { - if (card.name == "sha") return true; - }, - }, - trigger: { player: "useCard2" }, - filter(event, player) { - var card = event.card; - var info = get.info(card); - if (info.type != "trick" || info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - async cost(event, trigger, player) { - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - event.result = await player - .chooseTarget(get.prompt("chihaya_liewu"), function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets) - .forResult(); - }, - autodelay: true, - async content(event, trigger, player) { - trigger.targets.addArray(event.targets); - game.log(event.targets, "也成为了", trigger.card, "的目标"); - }, - group: "chihaya_liewu2", - }, - chihaya_liewu2: { - trigger: { player: "disableEquipAfter" }, - forced: true, - filter(event, player) { - return !player.hasEnabledSlot() && !player._chihaya_liewu; - }, - skillAnimation: true, - animationColor: "orange", - content() { - player._chihaya_liewu = true; - player.loseMaxHp(4); - player.addSkills("chihaya_huairou"); - }, - }, - chihaya_huairou: { - audio: 2, - enable: "phaseUse", - position: "he", - filter: (event, player) => - player.hasCard( - (card) => lib.skill.chihaya_huairou.filterCard(card, player), - lib.skill.chihaya_huairou.position - ), - filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), - check(card) { - if (!_status.event.player.hasEquipableSlot(get.subtype(card))) return 5; - return 3 - get.value(card); - }, - content() { - player.recast(cards); - }, - discard: false, - lose: false, - delay: false, - prompt: "将一张装备牌置入弃牌堆并摸一张牌", - ai: { - order: 10, - result: { - player: 1, - }, - }, - }, - chihaya_youfeng: { - enable: "chooseToUse", - zhuanhuanji: true, - mark: true, - intro: { - content(storage, player) { - return storage - ? "每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。" - : "每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌。"; - }, - }, - marktext: "☯", - init(player) { - player.storage.chihaya_youfeng = false; - }, - hiddenCard(player, name) { - if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; - if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) - return false; - var type = get.type(name); - if (player.storage.chihaya_youfeng) return type == "basic"; - return type == "trick"; - }, - filter(event, player) { - if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; - if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) - return false; - var type = player.storage.chihaya_youfeng ? "basic" : "trick"; - for (var name of lib.inpile) { - if (get.type(name) != type) continue; - if (event.filterCard({ name: name, isCard: true }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog(event, player) { - const dialog = ui.create.dialog("游凤", "hidden"); - const equips = []; - if (player.storage.chihaya_youfeng) { - for (let i = 1; i < 6; i++) { - if (!player.hasEnabledSlot(i)) continue; - equips.push([i, get.translation("equip" + i)]); - } - if (equips.length > 0) dialog.add([equips, "tdnodes"]); - } - const type = player.storage.chihaya_youfeng ? "basic" : "trick"; - const list = []; - for (const name of lib.inpile) { - if (get.type(name) != type) continue; - if (event.filterCard({ name: name, isCard: true }, player, event)) { - list.push([type, "", name]); - if (name == "sha") { - for (let j of lib.inpile_nature) list.push([type, "", name, j]); - } - } - } - dialog.add([list, "vcard"]); - return dialog; - }, - filter(button) { - if ( - ui.selected.buttons.length && - typeof button.link == typeof ui.selected.buttons[0].link - ) - return false; - return true; - }, - select() { - if (_status.event.player.storage.chihaya_youfeng) return 2; - return 1; - }, - check(button) { - var player = _status.event.player; - if (typeof button.link == "number") { - if (!player.hasEmptySlot(button.link)) { - var card = player.getEquip(button.link); - if (card) { - var val = get.value(card); - if (val > 0) return 0; - return 5 - val; - } - } - switch (button.link) { - case 3: - return 4.5; - case 4: - return 4.4; - case 5: - return 4.3; - case 2: - return (3 - player.hp) * 1.5; - case 1: { - if ( - game.hasPlayer(function (current) { - return ( - (get.realAttitude || get.attitude)(player, current) < 0 && - get.distance(player, current) > 1 - ); - }) - ) - return 0; - return 3.2; - } - } - } - var name = button.link[2]; - var evt = _status.event.getParent(); - if (get.type(name) == "basic") { - if (name == "shan") return 2; - if (evt.type == "dying") { - if (get.attitude(player, evt.dying) < 2) return false; - if (name == "jiu") return 2.1; - return 1.9; - } - if (evt.type == "phase") - return player.getUseValue({ - name: name, - nature: button.link[3], - isCard: true, - }); - return 1; - } - if ( - ![ - "chuqibuyi", - "shuiyanqijunx", - "juedou", - "nanman", - "wanjian", - "shunshou", - "zhujinqiyuan", - ].includes(name) - ) - return 0; - var card = { name: name, isCard: true }; - if (["shunshou", "zhujinqiyuan"].includes(card.name)) { - if ( - !game.hasPlayer(function (current) { - return ( - get.attitude(player, current) != 0 && - get.distance(player, current) <= 1 && - player.canUse(card, current) && - get.effect(current, card, player, player) > 0 - ); - }) - ) - return 0; - return player.getUseValue(card) - 7; - } - return player.getUseValue(card) - 4; - }, - backup(links, player) { - if (links.length == 1) - return { - filterCard() { - return false; - }, - selectCard: -1, - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - }, - popname: true, - precontent() { - player.logSkill("chihaya_youfeng"); - player.gainMaxHp(); - delete event.result.skill; - player.addTempSkill( - "chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), - "roundStart" - ); - player.changeZhuanhuanji("chihaya_youfeng"); - }, - }; - if (typeof links[1] == "number") links.reverse(); - var equip = links[0]; - var name = links[1][2]; - var nature = links[1][3]; - return { - filterCard() { - return false; - }, - selectCard: -1, - equip: equip, - viewAs: { - name: name, - nature: nature, - isCard: true, - }, - popname: true, - precontent() { - player.logSkill("chihaya_youfeng"); - player.disableEquip(lib.skill.chihaya_youfeng_backup.equip); - delete event.result.skill; - player.addTempSkill( - "chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), - "roundStart" - ); - player.changeZhuanhuanji("chihaya_youfeng"); - }, - }; - }, - prompt(links, player) { - if (links.length == 1) - return ( - "增加1点体力上限,视为使用" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) - ); - if (typeof links[1] == "number") links.reverse(); - var equip = "equip" + links[0]; - var name = links[1][2]; - var nature = links[1][3]; - return ( - "废除自己的" + - get.translation(equip) + - "栏,视为使用" + - (get.translation(nature) || "") + - get.translation(name) - ); - }, - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - if (arg == "respond") return false; - if (!player.storage.chihaya_youfeng || player.hasSkill("chihaya_youfeng_true")) - return false; - }, - order: 1, - result: { - player: 1, - }, - }, - }, - chihaya_youfeng_true: { charlotte: true }, - chihaya_youfeng_false: { charlotte: true }, - rumi_shuwu: { - mod: { - cardUsable(card) { - if (card.name == "sha") return Infinity; - }, - targetInRange(card) { - if (card.name == "sha") return true; - }, - }, - trigger: { player: "useCard2" }, - filter(event, player) { - var card = event.card; - var info = get.info(card); - if (info.type != "trick" || info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - autodelay: true, - async cost(event, trigger, player) { - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - const { result } = await player - .chooseTarget(get.prompt("rumi_shuwu"), function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - event.result = result; - }, - content() { - trigger.targets.addArray(event.targets); - game.log(event.targets, "也成为了", trigger.card, "的目标"); - }, - group: "rumi_shuwu2", - }, - rumi_shuwu2: { - trigger: { player: "phaseUseEnd" }, - forced: true, - filter(event, player) { - if (player.hp <= 3) return true; - if ( - player.getHistory("useCard", function (evt) { - return ( - evt.card.name == "sha" && - evt.addCount !== false && - evt.getParent("phaseUse") == event - ); - }).length <= 1 - ) - return true; - if ( - player.getHistory("sourceDamage", function (evt) { - return get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == event; - }).length == 0 - ) - return true; - return false; - }, - content() { - var num = 0; - if (player.hp <= 3) num++; - if ( - player.getHistory("useCard", function (evt) { - return ( - evt.card.name == "sha" && - evt.addCount !== false && - evt.getParent("phaseUse") == trigger - ); - }).length <= 1 - ) - num++; - if ( - player.getHistory("sourceDamage", function (evt) { - return ( - get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == trigger - ); - }).length == 0 - ) - num++; - player.draw(num); - player.addTempSkill("rumi_shuwu3"); - player.addMark("rumi_shuwu3", num, false); - }, - }, - rumi_shuwu3: { - mod: { - maxHandcard(player, num) { - return num + player.countMark("rumi_shuwu3"); - }, - }, - onremove: true, - }, - sakuya_junbu: { - mod: { - targetInRange(card, player) { - if (player.countDisabledSlot() >= 1) return true; - }, - cardUsable(card, player) { - if (player.countDisabledSlot() >= 2) return Infinity; - }, - }, - trigger: { player: "useCard2" }, - filter(event, player) { - if (player.countDisabledSlot() >= 4) return true; - return lib.skill.sakuya_junbu.filter2.apply(this, arguments); - }, - filter2(event, player) { - if (player.countDisabledSlot() < 3) return false; - var card = event.card; - var info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - async cost(event, trigger, player) { - const result = { bool: false }; - event.result = result; - if (player.countDisabledSlot() >= 4) { - result.bool = true; - if (!lib.skill.sakuya_junbu.filter2(trigger, player)) { - return; - } - } - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - const { result: result2 } = await player - .chooseTarget(get.prompt("sakuya_junbu"), function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - if (result2.bool) { - result.bool = true; - result.targets = result2.targets; - } - }, - async content(event, trigger, player) { - if (player.countDisabledSlot() >= 4) { - trigger.directHit.addArray(game.players); - game.log(trigger.card, "不可被响应"); - } - if (event.targets && event.targets.length > 0) { - trigger.targets.addArray(event.targets); - game.log(event.targets, "也成为了", trigger.card, "的目标"); - } - }, - group: "sakuya_junbu_damage", - subSkill: { - damage: { - trigger: { source: "damageBegin1" }, - forced: true, - sub: true, - filter(event, player) { - return !player.hasEnabledSlot() && event.getParent().type == "card"; - }, - logTarget: "player", - content() { - player.loseHp(); - trigger.num++; - }, - }, - }, - }, - hiroto_huyu: { - trigger: { global: "phaseUseEnd" }, - noHidden: true, - filter(event, player) { - return ( - player != event.player && - player.hasSkill("hiroto_huyu") && - !player.hasSkill("hiroto_zonglve") && - event.player.countCards("h") > 0 - ); - }, - async cost(event, trigger, player) { - event.result = await trigger.player - .chooseCard( - 2, - "h", - "是否对" + get.translation(player) + "发动【虎驭】?", - "将两张手牌交给该角色,然后令其获得〖纵略〗并于下回合获得该角色得到的所有牌" - ) - .set( - "goon", - (function () { - var source = trigger.player; - if (get.attitude(source, player) > 0) return 7; - if (source.hp > 2) return 4; - return 0; - })() - ) - .set("ai", function (card) { - return _status.event.goon - get.value(card); - }) - .forResult(); - }, - content() { - var target = trigger.player; - target.give(cards, player); - player.storage.hiroto_huyu2 = target; - player.addSkills("hiroto_zonglve"); - player.addSkill("hiroto_huyu2"); - }, - derivation: "hiroto_zonglve", - }, - hiroto_huyu2: { - trigger: { player: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - async content(event, trigger, player) { - player.removeSkill("hiroto_huyu2"); - await player.removeSkills("hiroto_zonglve"); - player.removeGaintag("hiroto_huyu2"); - var target = player.storage.hiroto_huyu2; - if (target && target.isIn()) { - var cards = []; - player.getHistory("gain", function (evt) { - cards.addArray(evt.cards); - }); - var he = player.getCards("he"); - cards = cards.filter(function (card) { - return he.includes(card); - }); - if (cards.length) target.gain(cards, player, "giveAuto", "bySelf"); - } - }, - mark: "character", - intro: { content: "已成为$的工具人" }, - group: "hiroto_huyu_gain", - }, - hiroto_huyu_gain: { - trigger: { player: "gainBegin" }, - silent: true, - filter(event, player) { - if (player == _status.currentPhase) event.gaintag.add("hiroto_huyu2"); - return false; - }, - }, - hiroto_zonglve: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ); - }, - filterTarget(card, player, target) { - return target != player && target.countCards("h") > 0; - }, - filterCard: true, - delay: false, - charlotte: true, - position: "h", - discard: false, - lose: false, - content() { - "step 0"; - player.choosePlayerCard(true, target, "h"); - "step 1"; - event.card = result.cards[0]; - player.$compare(cards[0], target, event.card); - game.log(player, "展示了", cards[0]); - game.log(target, "展示了", event.card); - game.delay(3.5); - "step 2"; - game.broadcastAll(ui.clear); - if (get.color(cards[0], player) == get.color(card, target)) { - target.damage("nocard"); - target.discard(card).animate = false; - } else player.gainPlayerCard(target, true, 2, "hej"); - }, - mod: { - maxHandcard(player, num) { - return num + 3; - }, - }, - ai: { - order: 7, - result: { - target: -1, - }, - }, - }, - hiroto_tuolao: { - trigger: { player: "phaseAfter" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return ( - player.phaseNumber > 1 && - !player.getHistory("lose", function (evt) { - return evt.getParent(2).name == "hiroto_huyu2"; - }).length - ); - }, - content() { - player.awakenSkill("hiroto_tuolao"); - player.draw(3); - player.changeSkills(["hiroto_zonglve"], ["hiroto_huyu"]); - }, - }, - shizuku_sizhi: { - audio: 2, - enable: "phaseUse", - getResult(cards) { - var l = cards.length; - var all = Math.pow(l, 2); - var list = []; - for (var i = 1; i < all; i++) { - var array = []; - for (var j = 0; j < l; j++) { - if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) - array.push(cards[j]); - } - var num = 0; - for (var k of array) { - num += get.number(k); - } - if (num == 13) list.push(array); - } - if (list.length) { - list.sort(function (a, b) { - if (a.length != b.length) return b.length - a.length; - return get.value(a) - get.value(b); - }); - return list[0]; - } - return list; - }, - usable: 1, - filterCard(card) { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - return get.number(card) + num <= 13; - }, - complexCard: true, - selectCard() { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - if (num == 13) return ui.selected.cards.length; - return ui.selected.cards.length + 2; - }, - check(card) { - var evt = _status.event; - if (!evt.shizuku_sizhi_choice) - evt.shizuku_sizhi_choice = lib.skill.shizuku_sizhi.getResult( - evt.player.getCards("he") - ); - if (!evt.shizuku_sizhi_choice.includes(card)) return 0; - return 1; - }, - position: "he", - content() { - player.draw(cards.length * 2).gaintag = ["shizuku_sizhi2"]; - player.addTempSkill("shizuku_sizhi2"); - }, - ai: { - order: 5, - result: { player: 1 }, - }, - }, - shizuku_sizhi2: { - onremove(player) { - player.removeGaintag("shizuku_sizhi2"); - }, - mod: { - targetInRange(card) { - if (!card.cards || !card.cards.length) return; - for (var i of card.cards) { - if (!i.hasGaintag("shizuku_sizhi2") || get.color(i) != "black") return; - } - return true; - }, - cardUsable(card) { - if (!card.cards || !card.cards.length) return; - for (var i of card.cards) { - if (!i.hasGaintag("shizuku_sizhi2") || get.color(i) != "black") return; - } - return Infinity; - }, - ignoredHandcard(card, player) { - if (card.hasGaintag("shizuku_sizhi2") && get.color(card) == "red") { - return true; - } - }, - cardDiscardable(card, player, name) { - if ( - name == "phaseDiscard" && - card.hasGaintag("shizuku_sizhi2") && - get.color(card) == "red" - ) { - return false; - } - }, - aiOrder(player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("shizuku_sizhi2") && - get.color(card) == "black" - ) - return num - 0.1; - }, - }, - }, - shizuku_biyi: { - trigger: { player: "damageEnd" }, - frequent: true, - content() { - "step 0"; - player.judge(); - "step 1"; - var num = result.number; - var next = player.chooseToDiscard( - "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", - function (card) { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - return get.number(card) + num <= _status.event.num; - }, - "he" - ); - next.set("num", num); - next.set("complexCard", true); - next.set("selectCard", function () { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - if (num == _status.event.num) return ui.selected.cards.length; - return ui.selected.cards.length + 2; - }); - next.set( - "cardResult", - (function () { - var cards = player.getCards("he"); - var l = cards.length; - var all = Math.pow(l, 2); - var list = []; - for (var i = 1; i < all; i++) { - var array = []; - for (var j = 0; j < l; j++) { - if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) - array.push(cards[j]); - } - var numx = 0; - for (var k of array) { - numx += get.number(k); - } - if (numx == num) list.push(array); - } - if (list.length) { - list.sort(function (a, b) { - return get.value(a) - get.value(b); - }); - return list[0]; - } - return list; - })() - ); - next.set("ai", function (card) { - if (!_status.event.cardResult.includes(card)) return 0; - return 6 - get.value(card); - }); - "step 2"; - if (result.bool) player.recover(); - }, - }, - shizuku_sanhua: { - trigger: { player: "die" }, - forceDie: true, - skillAnimation: true, - animationColor: "thunder", - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("shizuku_sanhua"), lib.filter.notMe) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .forResult(); - }, - async content(event, trigger, player) { - var target = event.targets[0]; - var names = []; - var cards = []; - while (cards.length < 4) { - var card = get.cardPile2(function (card) { - return ( - !cards.includes(card) && - !names.includes(card.name) && - get.type(card) == "basic" - ); - }); - if (card) { - cards.push(card); - names.push(card.name); - } else break; - } - if (cards.length) await target.gain(cards, "gain2"); - }, - }, - shiroha_yuzhao: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - charlotte: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - player.addToExpansion(get.cards(game.countGroup()), "draw").gaintag.add("shiroha_yuzhao"); - }, - marktext: "兆", - intro: { - markcount: "expansion", - mark(dialog, content, player) { - var content = player.getExpansions("shiroha_yuzhao"); - if (content && content.length) { - if (player == game.me || player.isUnderControl()) { - dialog.addAuto(content); - } else { - return "共有" + get.cnNumber(content.length) + "张牌"; - } - } - }, - content(content, player) { - var content = player.getExpansions("shiroha_yuzhao"); - if (content && content.length) { - if (player == game.me || player.isUnderControl()) { - return get.translation(content); - } - return "共有" + get.cnNumber(content.length) + "张牌"; - } - }, - }, - group: "shiroha_yuzhao_umi", - }, - shiroha_yuzhao_umi: { - trigger: { global: "phaseBegin" }, - forced: true, - filter(event, player) { - return ( - player.getExpansions("shiroha_yuzhao").length > 0 && - get.distance(event.player, player) <= 1 - ); - }, - content() { - "step 0"; - event.num = game.countGroup(); - player.addToExpansion(get.cards(event.num)).gaintag.add("shiroha_yuzhao"); - "step 1"; - var next = player.chooseToMove(), - num = game.countGroup(); - next.set("prompt", "预兆:将" + get.cnNumber(num) + "张牌置于牌堆顶"); - next.set("num", num); - next.set("forced", true); - next.set("filterOk", function (moved) { - return moved[1].length == _status.event.num; - }); - next.set("filterMove", function (from, to, moved) { - if (to != 1) return true; - return moved[1].length < _status.event.num; - }); - next.set("list", [ - [get.translation(player) + "(你)的“兆”", player.getExpansions("shiroha_yuzhao")], - ["牌堆顶"], - ]); - next.set("processAI", function (list) { - var cards = list[0][1], - cards2 = cards.randomRemove(_status.event.num); - return [cards, cards2]; - }); - "step 2"; - if (result && result.bool) { - var cards = result.moved[1]; - player.lose(cards, ui.cardPile, "insert"); - } - game.updateRoundNumber(); - }, - }, - shiroha_guying: { - derivation: "shiroha_guying_rewrite", - trigger: { - player: "damageBegin3", - source: "damageBegin1", - }, - filter(event, player, name) { - if (!player.storage.shiroha_jiezhao && player.hasSkill("shiroha_guying_temp")) - return false; - if (name == "damageBegin3") return true; - return player != event.player; - }, - locked(skill, player) { - if (!player || !player.storage.shiroha_jiezhao) return true; - return false; - }, - cost() { - "step 0"; - var num = event.triggername == "damageBegin3" ? -1 : 1; - if (player.storage.shiroha_jiezhao || !player.hasSkill("shiroha_guying")) { - if (num > 0) - player.chooseBool( - get.prompt("shiroha_guying", trigger.player), - "进行判定。若判定结果为黑色,则即将对其造成的伤害+1" - ); - else - player.chooseBool( - get.prompt("shiroha_guying"), - "进行判定。若判定结果为红色,则即将受到的伤害-1" - ); - } else event._result = { bool: true }; - "step 1"; - event.result = result; - }, - content() { - "step 0"; - var num = event.triggername == "damageBegin3" ? -1 : 1; - event.num = num; - player.addTempSkill("shiroha_guying_temp"); - player.judge(function (card) { - return get.color(card) == - (_status.event.getParent("shiroha_guying").num > 0 ? "black" : "red") - ? 2 - : 0; - }).judge2 = function (result) { - return result.bool ? true : false; - }; - "step 1"; - if (result.bool) trigger.num += num; - }, - }, - shiroha_guying_temp: { charlotte: true }, - shiroha_jiezhao: { - trigger: { global: "judge" }, - filter(event, player) { - return player.getExpansions("shiroha_yuzhao").length && event.player.isIn(); - }, - async cost(event, trigger, player) { - const list = player.getExpansions("shiroha_yuzhao"); - const { result } = await player - .chooseButton( - [ - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - "," + - get.prompt("shiroha_jiezhao"), - list, - "hidden", - ], - function (button) { - var card = button.link; - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - return result * attitude; - } - ) - .set("judging", trigger.player.judging[0]) - .set("filterButton", function (button) { - var player = _status.event.player; - var card = button.link; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }); - if (result.bool) { - event.result = { bool: true, cards: result.links }; - } - }, - //logSkill留给respond - popup: false, - async content(event, trigger, player) { - const cards = event.cards; - await player.respond(cards, "shiroha_jiezhao", "highlight", "noOrdering"); - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - const oldJudgeCard = trigger.player.judging[0]; - trigger.player.judging[0] = cards[0]; - trigger.orderingCards.addArray(cards); - game.log(trigger.player, "的判定牌改为", cards[0]); - await game.cardsDiscard(oldJudgeCard); - await game.asyncDelay(2); - if (!player.getExpansions("shiroha_yuzhao").length) { - player.storage.shiroha_jiezhao = true; - player.gainMaxHp(); - player.recover(); - var list = ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"]; - var skill = list.randomGet(); - player.flashAvatar("shiroha_jiezhao", "key_" + skill.split("_")[0]); - await player.addSkills(skill); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 0.6, - }, - combo: "shiroha_yuzhao" - }, - derivation: ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"], - }, - jojiro_shensu: { - group: ["jojiro_shensu1", "jojiro_shensu2", "jojiro_shensu4"], - charlotte: true, - }, - jojiro_shensu1: { - trigger: { player: "phaseJudgeBefore" }, - async cost(event, trigger, player) { - const check = player.countCards("h") > 2; - event.result = await player - .chooseTarget( - get.prompt("jojiro_shensu"), - "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", - function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - } - ) - .set("check", check) - .set("ai", function (target) { - if (!_status.event.check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }) - .forResult(); - }, - async content(event, trigger, player) { - await trigger.cancel(); - player.skip("phaseDraw"); - await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); - }, - }, - jojiro_shensu2: { - trigger: { player: "phaseUseBefore" }, - filter(event, player) { - return player.countCards("he", { type: "equip" }) > 0; - }, - async cost(event, trigger, player) { - const check = player.needsToDiscard(); - event.result = await player - .chooseCardTarget({ - prompt: get.prompt("jojiro_shensu"), - prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", - filterCard(card, player) { - return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); - }, - position: "he", - filterTarget(card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - }, - ai1(card) { - if (_status.event.check) return 0; - return 6 - get.value(card); - }, - ai2(target) { - if (_status.event.check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }, - check: check, - }) - .forResult(); - }, - async content(event, trigger, player) { - await trigger.cancel(); - await player.discard(event.cards[0]); - await player.useCard({ name: "sha", isCard: true }, event.targets[0]); - }, - }, - jojiro_shensu4: { - trigger: { player: "phaseDiscardBefore" }, - async cost(event, trigger, player) { - var check = - player.needsToDiscard() || - player.isTurnedOver() || - (player.hasSkill("shebian") && player.canMoveCard(true, true)); - event.result = await player - .chooseTarget( - get.prompt("jojiro_shensu"), - "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", - function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - } - ) - .set("check", check) - .set("ai", function (target) { - if (!_status.event.check) return 0; - return get.effect( - target, - { name: "sha" }, - _status.event.player, - _status.event.player - ); - }) - .forResult(); - }, - async content(event, trigger, player) { - await trigger.cancel(); - await player.turnOver(); - await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); - }, - }, - jojiro_shunying: { - trigger: { player: "phaseEnd" }, - forced: true, - charlotte: true, - filter(event, player) { - return player.getHistory("skipped").length > 0; - }, - content() { - "step 0"; - var num = player.getHistory("skipped").length; - event.num = num; - player.chooseToMoveChess(num, "瞬影:移动至多" + get.cnNumber(num) + "格或失去1点体力"); - "step 1"; - if (!result.bool) player.loseHp(); - else player.draw(num); - }, - }, - kotori_yumo: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - charlotte: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - var list = ["wei", "shu", "wu", "qun", "jin"]; - for (var i of list) { - if (!player.hasMark("kotori_yumo_" + i)) { - player.addMark("kotori_yumo_" + i, 1, false); - game.log( - player, - "获得了一个", - lib.translate["kotori_yumo_" + i].replace(/魔物/g, "【魔物】") - ); - } - } - }, - group: ["kotori_yumo_damage", "kotori_yumo_gain"], - }, - kotori_yumo_damage: { - trigger: { global: "damageEnd" }, - forced: true, - filter(event, player) { - var name = "kotori_yumo_" + event.player.group; - return lib.skill[name] && !player.hasMark(name); - }, - popup: false, - content() { - game.log(player, "对", trigger.player, "发动了", "#g【驭魔】"); - var group = trigger.player.group; - player.popup("驭魔", get.groupnature(group)); - player.addMark("kotori_yumo_" + group, 1, false); - game.log( - player, - "获得了一个", - lib.translate["kotori_yumo_" + group].replace(/魔物/g, "【魔物】") - ); - }, - }, - kotori_yumo_gain: { - trigger: { player: "phaseBegin" }, - filter(event, player) { - var list = ["wei", "shu", "wu", "qun", "key", "jin"]; - for (var i in list) { - if (player.hasMark("kotori_yumo_" + list[i])) return true; - } - return false; - }, - async cost(event, trigger, player) { - const list = ["wei", "shu", "wu", "qun", "key", "jin"]; - const list2 = []; - for (const i of list) { - if (player.hasMark("kotori_yumo_" + i)) list2.push("kotori_skill_" + i); - } - list2.push("cancel2"); - const { control } = await player - .chooseControl(list2) - .set( - "prompt", - "###是否发动【驭魔】?###弃置对应的标记并获得下列技能中的一个,或点取消,不获得技能" - ) - .set( - "choice", - (function () { - if ( - list2.includes("kotori_skill_shu") && - player.countCards("h", function (card) { - return ( - get.name(card, player) == "sha" && player.getUseValue(card) > 0 - ); - }) > 1 - ) - return "kotori_skill_shu"; - if (list2.includes("kotori_skill_key") && player.hp > 1) - return "kotori_skill_key"; - if ( - list2.includes("kotori_skill_qun") && - player.isDamaged() && - player.needsToDiscard() > 1 - ) - return "kotori_skill_qun"; - return "cancel2"; - })() - ) - .set("ai", function () { - return _status.event.choice; - }) - .forResult(); - event.result = { - bool: control !== "cancel2", - cost_data: { control }, - }; - }, - content() { - const result = event.cost_data; - if (result.control != "cancel2") { - var name = "kotori_yumo_" + result.control.slice(13); - player.removeMark(name, 1, false); - game.log(player, "移去了一个", lib.translate[name].replace(/魔物/g, "【魔物】")); - player.addTempSkills(result.control); - game.log( - player, - "获得了技能", - lib.translate[name].replace( - /魔物/g, - "【" + get.translation(result.control) + "】" - ) - ); - } - }, - }, - kotori_skill_wei: { - trigger: { player: "phaseBegin" }, - filter(event, player) { - return player.countCards("he") > 0; - }, - async cost(event, trigger, player) { - event.result = await player - .chooseCardTarget({ - prompt: get.prompt2(event.skill), - filterCard: lib.filter.cardDiscardable, - filterTarget(card, player, target) { - return player != target; - }, - position: "he", - ai1(card) { - return 6 - get.value(card); - }, - ai2(target) { - return ( - (1 / (1 + target.countCards("he"))) * - -get.attitude(_status.event.player, target) - ); - }, - }) - .forResult(); - }, - content() { - "step 0"; - player.discard(cards); - targets[0].chooseToDiscard( - "弃置一张牌,或令" + get.translation(player) + "摸一张牌", - "he" - ).ai = lib.skill.zhiheng.check; - "step 1"; - if (!result.bool) player.draw(); - }, - }, - kotori_skill_shu: { - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - trigger: { player: "phaseUseEnd" }, - forced: true, - filter(event, player) { - return ( - player.getHistory("useCard", function (evt) { - return evt.card && evt.card.name == "sha" && evt.getParent("phaseUse") == event; - }).length > 1 - ); - }, - content() { - player.draw(); - }, - }, - kotori_skill_wu: { - trigger: { player: "phaseEnd" }, - forced: true, - filter(event, player) { - return player.countCards("h") != player.hp; - }, - content() { - player.draw(); - }, - }, - kotori_skill_qun: { - trigger: { player: "phaseDiscardBegin" }, - forced: true, - filter(event, player) { - return player.getDamagedHp() > 1 || player.countCards("h") - player.getHp() > 1; - }, - content() { - var num = 0; - if (player.getDamagedHp() > 1) num++; - if (player.countCards("h") - player.getHp() > 1) num++; - player.addMark("kotori_qunxin_temp", num, false); - player.addTempSkill("kotori_qunxin_temp", "phaseDiscardEnd"); - }, - }, - kotori_skill_key: { - enable: "phaseUse", - usable: 1, - content() { - "step 0"; - player.draw(); - "step 1"; - player.changeHujia(1); - "step 2"; - var evt = event.getParent("phase"); - if (evt && evt.after) { - var next = player.loseHp(); - event.next.remove(next); - evt.after.push(next); - } - }, - ai: { - order: 10, - result: { - player(player) { - return player.hp - 1; - }, - }, - }, - }, - kotori_skill_jin: { - trigger: { player: "phaseDrawEnd" }, - filter(event, player) { - var hs = player.getCards("h"); - return ( - hs.length > 0 && - player.getHistory("gain", function (evt) { - if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) - return false; - for (var i of evt.cards) { - if (hs.includes(i)) return true; - } - return false; - }).length > 0 - ); - }, - check(event, player) { - var hs = player.getCards("h"), - cards = [], - suits = []; - player.getHistory("gain", function (evt) { - if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) - return false; - for (var i of evt.cards) { - if (hs.includes(i)) { - cards.add(i); - suits.add(get.suit(i, player)); - } - } - }); - return cards.length == suits.length; - }, - content() { - var hs = player.getCards("h"), - cards = [], - suits = []; - player.getHistory("gain", function (evt) { - if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != trigger) - return false; - for (var i of evt.cards) { - if (hs.includes(i)) { - cards.add(i); - suits.add(get.suit(i, player)); - } - } - }); - player.showCards(cards, get.translation(player) + "发动了【晋势】"); - if (cards.length == suits.length) player.draw(); - }, - }, - kotori_qunxin_temp: { - onremove: true, - mod: { - maxHandcard(player, num) { - return num + player.countMark("kotori_qunxin_temp"); - }, - }, - }, - kotori_yumo_wei: { - marktext: '', - intro: { - name: '魔物', - content: "mark", - }, - }, - kotori_yumo_shu: { - marktext: '', - intro: { - name: '魔物', - content: "mark", - }, - }, - kotori_yumo_wu: { - marktext: '', - intro: { - name: '魔物', - content: "mark", - }, - }, - kotori_yumo_qun: { - marktext: '', - intro: { - name: '魔物', - content: "mark", - }, - }, - kotori_yumo_key: { - marktext: '', - intro: { - name: '魔物', - content: "mark", - }, - }, - kotori_yumo_jin: { - marktext: '', - intro: { - name: '魔物', - content: "mark", - }, - }, - kotori_huazhan: { - charlotte: true, - enable: "chooseToUse", - filter(event, player) { - var bool = false; - var list = ["wei", "shu", "wu", "qun", "key", "jin"]; - for (var i of list) { - if ( - player.hasMark("kotori_yumo_" + i) && - !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) - ) { - bool = true; - break; - } - } - return bool && event.filterCard({ name: "kaihua", isCard: true }, player, event); - }, - chooseButton: { - dialog(event, player) { - return ui.create.dialog("###花绽###" + lib.translate.kotori_huazhan_info); - }, - chooseControl(event, player) { - var list = ["wei", "shu", "wu", "qun", "key", "jin"]; - var list2 = []; - for (var i of list) { - if ( - player.hasMark("kotori_yumo_" + i) && - !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) - ) - list2.push("kotori_yumo_" + i); - } - list2.push("cancel2"); - return list2; - }, - check() { - var player = _status.event.player; - var list = ["wei", "shu", "wu", "qun", "key", "jin"]; - var list2 = []; - for (var i of list) { - if ( - player.hasMark("kotori_yumo_" + i) && - !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) - ) - list2.push("kotori_yumo_" + i); - } - if (list2.includes("kotori_yumo_wei")) return "kotori_yumo_wei"; - if (list2.includes("kotori_yumo_wu")) return "kotori_yumo_wu"; - if (list2.includes("kotori_yumo_qun")) return "kotori_yumo_qun"; - if (list2.includes("kotori_yumo_key")) return "kotori_yumo_key"; - if ( - list2.includes("kotori_yumo_shu") && - game.hasPlayer(function (current) { - return current.group == "shu"; - }) - ) - return "kotori_yumo_shu"; - return "cancel2"; - }, - backup(result, player) { - return { - markname: result.control, - viewAs: { name: "kaihua", isCard: true }, - filterCard() { - return false; - }, - selectCard: -1, - precontent() { - delete event.result.skill; - var name = lib.skill.kotori_huazhan_backup.markname; - if (!player.storage.kotori_huazhan2) player.storage.kotori_huazhan2 = []; - player.storage.kotori_huazhan2.push(name); - player.addTempSkill("kotori_huazhan2"); - player.popup("花绽", get.groupnature(name.slice(12))); - game.log( - player, - "发动了技能", - lib.translate[name].replace(/魔物/g, "【花绽】") - ); - player.removeMark(name, 1, false); - game.log( - player, - "移去了一个", - lib.translate[name].replace(/魔物/g, "【魔物】") - ); - }, - }; - }, - }, - ai: { - order: 1, - result: { - player(player) { - if ( - player.countCards("he", function (card) { - if (get.type(card, player) == "equip") return get.value(card) < 6; - return get.value(card) < 5; - }) < 2 - ) - return 0; - return player.getUseValue({ name: "kaihua" }); - }, - }, - }, - }, - kotori_huazhan2: { onremove: true }, - ryoichi_baoyi: { - trigger: { - player: "loseAfter", - global: [ - "gainAfter", - "equipAfter", - "addJudgeAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filterTarget(card, player, target) { - return target != player && (target.hasSex("female") || target.countCards("hej") > 0); - }, - filter(event, player) { - var evt = event.getl(player); - return ( - evt && - evt.es && - evt.es.length > 0 && - game.hasPlayer(function (target) { - return lib.skill.ryoichi_baoyi.filterTarget; - }) - ); - }, - forced: true, - content() { - "step 0"; - event.count = trigger.getl(player).es.length; - player.draw(event.count); - "step 1"; - event.count--; - if ( - game.hasPlayer(function (target) { - return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); - }) - ) { - player - .chooseTarget(true, lib.skill.ryoichi_baoyi.filterTarget, "请选择【爆衣】的目标") - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - } else event.finish(); - "step 2"; - if (result.bool && result.targets && result.targets.length) { - var target = result.targets[0]; - player.line(target, "green"); - if (target.hasSex("female")) target.loseHp(); - else player.discardPlayerCard(target, 2, "hej", true); - } else event.finish(); - "step 3"; - if ( - event.count && - game.hasPlayer(function (target) { - return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); - }) - ) - event.goto(1); - }, - }, - ryoichi_tuipi: { - mod: { - targetEnabled(card) { - if (card.name == "shunshou" || card.name == "guohe") return false; - }, - }, - trigger: { player: "phaseDiscardBegin" }, - forced: true, - content() { - trigger.setContent(lib.skill.ryoichi_tuipi.phaseDiscardContent); - }, - phaseDiscardContent() { - "step 0"; - event.num = Math.max( - 0, - player.countCards("he", (card) => !player.canIgnoreHandcard(card)) - - player.getHandcardLimit() - ); - if (event.num <= 0) event.finish(); - else { - if (lib.config.show_phase_prompt) { - player.popup("弃牌阶段"); - } - } - event.trigger("phaseDiscard"); - "step 1"; - player.chooseToDiscard(num, true, "he"); - "step 2"; - event.cards = result.cards; - }, - }, - yuu_lveduo: { - mod: { - cardEnabled(card, player) { - if (player.isTurnedOver()) return false; - }, - cardRespondable(card, player) { - if (player.isTurnedOver()) return false; - }, - cardSavable(card, player) { - if (player.isTurnedOver()) return false; - }, - }, - trigger: { global: "phaseBeginStart" }, - filter(event, player) { - return ( - player != event.player && - !event.player._trueMe && - !player.getStorage("yuu_lveduo").includes(event.player) && - !player.isTurnedOver() && - !player.hasSkill("yuu_lveduo4") - ); - }, - charlotte: true, - check(event, player) { - if (get.attitude(player, event.player) > 0) return false; - if (event.player.hasJudge("lebu") || !event.player.needsToDiscard()) return false; - return true; - }, - logTarget: "player", - content() { - "step 0"; - player.turnOver(); - "step 1"; - if (player.isTurnedOver()) { - player.addTempSkill("yuu_lveduo4", "roundStart"); - if (!player.storage.yuu_lveduo) player.storage.yuu_lveduo = []; - player.storage.yuu_lveduo.push(trigger.player); - trigger.player._trueMe = player; - game.addGlobalSkill("autoswap"); - if (trigger.player == game.me) { - game.notMe = true; - if (!_status.auto) ui.click.auto(); - } - player.addSkill("yuu_lveduo2"); - trigger.player.addSkill("yuu_lveduo3"); - } - }, - }, - yuu_lveduo2: { - trigger: { - player: "turnOverEnd", - }, - lastDo: true, - charlotte: true, - forceDie: true, - forced: true, - silent: true, - filter(event, player) { - return !player.isTurnedOver(); - }, - content() { - var target = game.findPlayer(function (current) { - return current._trueMe == player; - }); - if (target) { - if (target == game.me) { - if (!game.notMe) game.swapPlayerAuto(target._trueMe); - else delete game.notMe; - if (_status.auto) ui.click.auto(); - } - delete target._trueMe; - target.removeSkill("yuu_lveduo3"); - var skills = target.getStockSkills(true, true).filter(function (skill) { - var info = get.info(skill); - return info && info.charlotte == true; - }); - if (skills.length) { - target.removeSkills(skills); - player.addSkills(skills); - lib.translate.yuu_lveduo_info = lib.translate.yuu_lveduo_full_info; - } - if (target.name == "key_yusa") { - delete target.storage.dualside; - target.storage.dualside_over = true; - target.unmarkSkill("dualside"); - target.removeSkill("dualside"); - } else if (target.name == "key_misa") { - delete target.storage.dualside; - target.storage.dualside_over = true; - target.unmarkSkill("dualside"); - target.reinit("key_misa", "key_yusa"); - target.removeSkill("yusa_misa"); - target.removeSkill("dualside"); - target.turnOver(false); - } - } - player.removeSkill("yuu_lveduo2"); - }, - }, - yuu_lveduo3: { - trigger: { - player: ["phaseAfter", "dieAfter"], - global: "phaseBefore", - }, - lastDo: true, - charlotte: true, - forceDie: true, - forced: true, - silent: true, - content() { - player.removeSkill("yuu_lveduo3"); - }, - onremove(player) { - if (player._trueMe && player._trueMe.isTurnedOver()) player._trueMe.turnOver(); - }, - }, - yuu_lveduo4: { charlotte: true }, - godan_yuanyi: { - trigger: { player: "phaseBegin" }, - forced: true, - content() { - "step 0"; - var num = game.roundNumber; - if (num && typeof num == "number") player.draw(Math.min(3, num)); - "step 1"; - trigger.phaseList.splice(trigger.num, 0, "phaseUse|godan_yuanyi"); - }, - }, - godan_feiqu: { - inherit: "doruji_feiqu", - }, - godan_xiaoyuan: { - trigger: { player: "changeHp" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "soil", - filter(event, player) { - return event.num < 0 && player.hp < 4; - }, - content() { - player.awakenSkill("godan_xiaoyuan"); - player.loseMaxHp(3); - player.draw(3); - player.removeSkills("godan_feiqu"); - }, - }, - abyusa_jueqing: { - audio: 2, - trigger: { source: "damageBegin2" }, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return player != event.player && !player.storage.abyusa_jueqing_rewrite; - }, - prompt2(event, player) { - var num = get.cnNumber(2 * event.num, true); - return ( - "令即将对其造成的伤害翻倍至" + - num + - "点,并令自己失去" + - get.cnNumber(event.num) + - "点体力" - ); - }, - check(event, player) { - return ( - player.hp > event.num && - event.player.hp > event.num && - !event.player.hasSkillTag("filterDamage", null, { - player: player, - card: event.card, - }) && - get.attitude(player, event.player) < 0 - ); - }, - locked(skill, player) { - return player && player.storage.abyusa_jueqing_rewrite; - }, - logTarget: "player", - content() { - player.loseHp(trigger.num); - trigger.num *= 2; - player.storage.abyusa_jueqing_rewrite = true; - }, - derivation: "abyusa_jueqing_rewrite", - group: "abyusa_jueqing_rewrite", - subSkill: { - rewrite: { - audio: "abyusa_jueqing", - trigger: { source: "damageBefore" }, - forced: true, - charlotte: true, - filter(event, player) { - return player.storage.abyusa_jueqing_rewrite == true; - }, - check() { - return false; - }, - content() { - trigger.cancel(); - trigger.player.loseHp(trigger.num); - }, - ai: { - jueqing: true, - skillTagFilter(player) { - return player.storage.abyusa_jueqing_rewrite == true; - }, - }, - }, - }, - }, - akiko_dongcha: { - trigger: { global: "phaseBefore" }, - forced: true, - filter(event, player) { - return get.mode() == "identity" && game.phaseNumber == 0; - }, - content() { - var func = function () { - game.countPlayer(function (current) { - current.setIdentity(); - }); - }; - if (player == game.me) func(); - else if (player.isOnline()) player.send(func); - if (!player.storage.zhibi) player.storage.zhibi = []; - player.storage.zhibi.addArray(game.players); - }, - ai: { - viewHandcard: true, - skillTagFilter(player, tag, arg) { - if (player == arg) return false; - }, - }, - }, - abyusa_dunying: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - forced: true, - filter(event, player) { - return player.isDamaged(); - }, - content() { - player.draw(player.getDamagedHp()); - }, - mod: { - globalTo(from, to, num) { - return num + to.getDamagedHp(); - }, - }, - }, - kaori_siyuan: { - enable: "phaseUse", - filter(event, player) { - return player.countCards("he", lib.skill.kaori_siyuan.filterCard); - }, - filterCard(card) { - return ["equip", "delay"].includes(get.type(card, false)); - }, - filterTarget(card, player, target) { - if (player == target) return false; - var card = ui.selected.cards[0]; - if (get.type(card, false) == "delay") return target.canAddJudge({ name: card.name }); - return target.canEquip(card); - }, - discard: false, - lose: false, - prepare: "give", - content() { - "step 0"; - var card = cards[0]; - if (get.type(card, false) == "equip") target.equip(card); - else target.addJudge(card); - "step 1"; - var list = []; - for (var i of lib.inpile) { - var type = get.type(i); - if (type == "basic" || type == "trick") list.push([type, "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) list.push([type, "", i, j]); - } - } - player - .chooseButton(["是否视为使用一张基本牌或普通锦囊牌?", [list, "vcard"]]) - .set("filterButton", function (button) { - return player.hasUseTarget({ - name: button.link[2], - nature: button.link[3], - isCard: true, - }); - }) - .set("ai", function (button) { - return player.getUseValue({ - name: button.link[2], - nature: button.link[3], - isCard: true, - }); - }); - "step 2"; - if (result.bool) { - player.chooseUseTarget(true, { - name: result.links[0][2], - nature: result.links[0][3], - isCard: true, - }); - } - }, - ai: { - basic: { - order: 10, - }, - result: { - target(player, target) { - var card = ui.selected.cards[0]; - if (card) return get.effect(target, card, target, target); - return 0; - }, - }, - }, - }, - shiori_huijuan: { - trigger: { global: "phaseJieshuBegin" }, - locked: true, - filter(event, player) { - return ( - event.player != player && - event.player.getHistory("useCard", function (evt) { - return ( - evt.isPhaseUsing() && - ["basic", "trick"].includes(get.type(evt.card)) && - player.hasUseTarget({ - name: evt.card.name, - nature: evt.card.nature, - isCard: true, - }) - ); - }).length > 0 - ); - }, - async cost(event, trigger, player) { - const list = []; - trigger.player.getHistory("useCard", function (evt) { - if (!evt.isPhaseUsing() || !["basic", "trick"].includes(get.type(evt.card))) return; - if (evt.card.name == "sha" && evt.card.nature) list.add("sha:" + evt.card.nature); - else list.add(evt.card.name); - }); - for (var i = 0; i < list.length; i++) { - if (list[i].indexOf("sha:") == 0) list[i] = ["基本", "", "sha", list[i].slice(4)]; - else list[i] = [get.type(list[i]), "", list[i]]; - } - const { result } = await player - .chooseButton([get.prompt("shiori_huijuan"), [list, "vcard"]]) - .set("filterButton", function (button) { - return player.hasUseTarget({ - name: button.link[2], - nature: button.link[3], - isCard: true, - }); - }) - .set("ai", function (button) { - return player.getUseValue({ - name: button.link[2], - nature: button.link[3], - isCard: true, - }); - }); - if (result.bool) { - event.result = { - bool: true, - cost_data: { - card: { - name: result.links[0][2], - nature: result.links[0][3], - isCard: true, - }, - }, - }; - } - }, - async content(event, trigger, player) { - player.chooseUseTarget(true, event.cost_data.card); - player.getStat("skill").shiori_huijuan = 1; - }, - group: "shiori_huijuan_discard", - }, - shiori_huijuan_discard: { - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - var num = 0; - var stat = player.stat; - for (var i = stat.length - 2; i--; i >= 0) { - if (stat[i].isMe) break; - if (stat[i].skill && stat[i].skill.shiori_huijuan) num++; - } - return num >= Math.max(2, game.countPlayer() / 2); - }, - forced: true, - content() { - "step 0"; - if (!player.countDiscardableCards(player, "ej")) event._result = { bool: false }; - else - player.discardPlayerCard(player, "ej").set("ai", function (button) { - var card = button.link; - var player = _status.event.player; - if (get.position(card) == "j") return 7 + Math.random(); - return 4 + player.needsToDiscard() - get.value(card); - }); - "step 1"; - if (!result.bool) player.skip("phaseUse"); - }, - }, - miki_shenqiang: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - player.equip(game.createCard2("miki_hydrogladiator", "club", 6)); - player.equip(game.createCard2("miki_binoculars", "diamond", 6)); - }, - mod: { - canBeDiscarded(card) { - if (get.position(card) == "e" && ["equip1", "equip5"].includes(get.subtype(card))) - return false; - }, - }, - }, - miki_huanmeng: { - inherit: "kamome_huanmeng", - }, - miki_zhiluo: { - trigger: { global: "phaseEnd" }, - filter(event, player) { - return !event.player.countCards("e") && player.inRange(event.player); - }, - locked: true, - async cost(event, trigger, player) { - event.result = { bool: true, cost_data: { index: 0 } }; - if (player.canUse("sha", trigger.player, false)) { - const { index } = await player - .chooseControl() - .set("prompt", "制裸:请选择一项") - .set("choiceList", [ - "摸一张牌", - "视为对" + get.translation(trigger.player) + "使用一张【杀】", - ]) - .set("ai", function () { - if ( - get.effect( - _status.event.getTrigger().player, - { name: "sha" }, - _status.event.player - ) > 0 - ) - return 1; - return 0; - }) - .forResult(); - event.result.cost_data.index = index; - } - }, - async content(event, trigger, player) { - const result = event.cost_data; - if (result.index == 0) { - player.logSkill("miki_zhiluo"); - player.draw(); - } else player.useCard({ name: "sha", isCard: true }, trigger.player, "miki_zhiluo"); - }, - }, - miki_hydrogladiator_skill: { - trigger: { - source: "damageSource", - }, - locked: true, - popup: "海德洛", - filter(event, player) { - return ( - event.getParent().name == "sha" && - game.hasPlayer(function (current) { - return ( - (current == event.player || - (current != player && get.distance(current, event.player) <= 1)) && - current.countDiscardableCards(player, "he") > 0 - ); - }) - ); - }, - cost() { - "step 0"; - var list = []; - var choiceList = []; - if (trigger.player.countDiscardableCards(player, "he") > 0) { - list.push(true); - choiceList.push("弃置" + get.translation(trigger.player) + "的两张牌"); - } - if ( - game.hasPlayer(function (current) { - return current != player && get.distance(current, trigger.player) <= 1; - }) - ) { - list.push(false); - choiceList.push( - "弃置所有至" + get.translation(trigger.player) + "距离为1的角色的各一张牌" - ); - } - event.list = list; - if (list.length == 1) event._result = { index: 0 }; - else { - player - .chooseControl() - .set("choiceList", choiceList) - .set("prompt", "海德洛格拉迪尔特·改") - .set("ai", function () { - var player = _status.event.player; - var source = _status.event.getTrigger().player; - var num = game.countPlayer(function (current) { - if ( - current != player && - get.distance(current, source) <= 1 && - current.countDiscardableCards(player, "he") > 0 - ) - return -get.sgn(get.attitude(player, current)); - }); - if (num > Math.min(2, source.countDiscardableCards(player, "he"))) return 1; - return 0; - }); - } - "step 1"; - if (event.list[result.index]) { - event.result = { - bool: true, - cost_data: { type: "single" }, - targets: [trigger.player], - }; - } else { - event.result = { - bool: true, - cost_data: { type: "multiple" }, - targets: game - .filterPlayer(function (current) { - return current != player && get.distance(current, trigger.player) <= 1; - }) - .sortBySeat(), - }; - } - }, - content() { - "step 0"; - if (event.cost_data.type == "single") { - player.discardPlayerCard(targets[0], "he", 2, true); - event.finish(); - } - "step 1"; - var target = targets.shift(); - if (target.countDiscardableCards(player, "he") > 0) - player.discardPlayerCard(target, "he", true); - if (targets.length) event.redo(); - }, - }, - miki_binoculars: { - locked: true, - ai: { - viewHandcard: true, - skillTagFilter(player, tag, arg) { - if (player == arg) return false; - }, - }, - }, + //库特莉亚芙卡 kud_qiaoshou: { enable: "phaseUse", usable: 1, @@ -8510,6 +3616,7 @@ game.import("character", function () { kud_chongzhen: { inherit: "riki_chongzhen", }, + //神尾观铃 misuzu_hengzhou: { trigger: { player: [ @@ -8619,6 +3726,7 @@ game.import("character", function () { }, }, misuzu_zhongxing_haruko: { charlotte: true }, + //久岛鸥 kamome_suitcase: { trigger: { player: ["phaseJudgeBefore", "phaseDiscardBefore", "turnOverBefore"], @@ -8826,6 +3934,7 @@ game.import("character", function () { }, }, kamome_jieban_phase: { charlotte: true }, + //友利奈绪 nao_duyin: { trigger: { global: "phaseBegin" }, filter(event, player) { @@ -8987,3592 +4096,7 @@ game.import("character", function () { player.draw(); }, }, - shiorimiyuki_banyin: { - audio: 2, - trigger: { player: ["damageEnd", "recoverEnd"] }, - filter(event, player) { - return game.hasPlayer(function (current) { - return current != player && current.isDamaged(); - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("shiorimiyuki_banyin"), - "令一名其他角色回复1点体力", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.recoverEffect(target, player, player); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - target.recover(); - }, - }, - shiorimiyuki_tingxian: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - async cost(event, trigger, player) { - const { control, index } = await player - .chooseControl("一张", "两张", "三张", "cancel2") - .set("prompt", get.prompt2("shiorimiyuki_tingxian")) - .set("ai", function () { - var player = _status.event.player; - var max = Math.min(player.hp + 1, player.maxHp); - var min = Math.min(Math.max(max - 2, max - player.hp), 3); - if (min) return min - 1; - return 3; - }) - .forResult(); - if (control != "cancel2") event.result = { bool: true, cost_data: index }; - }, - async content(event, trigger, player) { - let num = 1 + event.cost_data; - await player.draw(num).set("gaintag", ["shiorimiyuki_tingxian"]); - await player.recover(); - player.addTempSkill("shiorimiyuki_tingxian2"); - }, - group: "shiorimiyuki_tingxian1", - }, - shiorimiyuki_tingxian1: { audio: true }, - shiorimiyuki_tingxian2: { - audio: true, - trigger: { player: "phaseUseEnd" }, - forced: true, - charlotte: true, - mod: { - aiOrder(player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) - return num + 2; - }, - aiValue(player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) - return 0; - }, - }, - filter(event, player) { - return ( - player.countCards("h", function (card) { - return card.hasGaintag("shiorimiyuki_tingxian"); - }) > 0 - ); - }, - content() { - player.loseHp( - player.countCards("h", function (card) { - return card.hasGaintag("shiorimiyuki_tingxian"); - }) - ); - player.removeGaintag("shiorimiyuki_tingxian"); - }, - }, - shizuru_nianli: { - enable: "chooseToUse", - charlotte: true, - prompt: "展示一张♦/♣/♥/♠手牌,然后视为使用一张雷杀/闪/桃/无懈可击", - viewAs(cards, player) { - var name = false; - var nature = null; - switch (get.suit(cards[0], player)) { - case "club": - name = "shan"; - break; - case "diamond": - name = "sha"; - nature = "thunder"; - break; - case "spade": - name = "wuxie"; - break; - case "heart": - name = "tao"; - break; - } - if (name) return { name: name, nature: nature, isCard: true }; - return null; - }, - check(card) { - var player = _status.event.player; - if (_status.event.type == "phase") { - var max = 0; - var name2; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("h", function (card) { - return get.suit(card, player) == map[name]; - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) { - max = temp; - name2 = map[name]; - } - } - } - if (name2 == get.suit(card, player)) return 1; - return 0; - } - return 1; - }, - ignoreMod: true, - filterCard(card, player, event) { - event = event || _status.event; - var filter = event._backup.filterCard; - var name = get.suit(card, player); - if (name == "club" && filter({ name: "shan" }, player, event)) return true; - if (name == "diamond" && filter({ name: "sha", nature: "thunder" }, player, event)) - return true; - if (name == "spade" && filter({ name: "wuxie" }, player, event)) return true; - if (name == "heart" && filter({ name: "tao" }, player, event)) return true; - return false; - }, - filter(event, player) { - if (player.hasSkill("shizuru_nianli_round")) return false; - var filter = event.filterCard; - if ( - filter({ name: "sha", nature: "thunder" }, player, event) && - player.countCards("h", { suit: "diamond" }) - ) - return true; - if (filter({ name: "shan" }, player, event) && player.countCards("h", { suit: "club" })) - return true; - if (filter({ name: "tao" }, player, event) && player.countCards("h", { suit: "heart" })) - return true; - if (filter({ name: "wuxie" }, player, event) && player.countCards("h", { suit: "spade" })) - return true; - return false; - }, - precontent() { - player.logSkill("shizuru_nianli"); - player.addTempSkill("shizuru_nianli_round", "roundStart"); - player.showCards(get.translation(player) + "发动了【念力】", event.result.cards.slice(0)); - event.result.card.cards = []; - event.result.cards = []; - delete event.result.skill; - delete event.result.card.suit; - delete event.result.card.number; - event.getParent().addCount = false; - event.getParent().shizuru_nianli = true; - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(player, tag) { - if (player.hasSkill("shizuru_nianli_round")) return false; - var name; - switch (tag) { - case "respondSha": - name = "diamond"; - break; - case "respondShan": - name = "club"; - break; - case "save": - name = "heart"; - break; - } - if (!player.countCards("h", { suit: name })) return false; - }, - order(item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("h", function (card) { - return get.suit(card, player) == map[name]; - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "thunder" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "thunder" : null, - }); - if (temp > max) max = temp; - } - } - max /= 1.1; - return max; - } - return 2; - }, - }, - hiddenCard(player, name) { - if (name == "wuxie") - return ( - player.countCards("h", function (card) { - return _status.connectMode || get.suit(card) == "spade"; - }) > 0 && !player.hasSkill("shizuru_nianli_round") - ); - if (name == "tao") - return ( - player.countCards("h", { suit: "heart" }) > 0 && - !player.hasSkill("shizuru_nianli_round") - ); - return false; - }, - group: "shizuru_nianli_clear", - subSkill: { - round: { - mark: true, - intro: { content: "本轮已发动" }, - }, - clear: { - trigger: { player: "useCardAfter" }, - lastDo: true, - silent: true, - filter(event, player) { - return event.getParent().shizuru_nianli == true; - }, - content() { - player.getHistory("useCard").remove(trigger); - }, - }, - }, - }, - shizuru_benzhan: { - trigger: { global: ["useCard", "respond"] }, - usable: 1, - filter(event, player) { - return ( - Array.isArray(event.respondTo) && - event.respondTo[0] != event.player && - [event.respondTo[0], event.player].includes(player) - ); - }, - async cost(event, trigger, player) { - event.type = get.type(trigger.card) == "basic"; - var prompt = event.type - ? "令一名角色摸两张牌或弃置两张牌" - : "令一名角色回复1点体力或对其造成1点伤害"; - event.result = await player - .chooseTarget(get.prompt("shizuru_benzhan"), prompt) - .set("ai", function (target) { - var player = _status.event.player; - if (_status.event.getParent().type) { - var att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) return -att; - if (target.countCards("he") == 1 && att < 0) att /= 2; - return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); - } - return Math.max( - get.recoverEffect(target, player, player), - get.damageEffect(target, player, player) - ); - }) - .forResult(); - }, - content() { - "step 0"; - event.type = get.type(trigger.card) == "basic"; - var target = event.targets[0]; - event.target = target; - var trans = get.translation(target); - var list; - if (event.type) { - if (!target.countCards("he")) event._result = { index: 0 }; - else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; - } else { - if (target.isHealthy()) event._result = { index: 1 }; - else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; - } - player - .chooseControl() - .set("choiceList", list) - .set( - "choice", - (function () { - if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; - return get.recoverEffect(target, player, player) > - get.damageEffect(target, player, player) - ? 0 - : 1; - })() - ) - .set("ai", function () { - return _status.event.choice; - }); - "step 1"; - player.addExpose(0.2); - if (event.type) { - if (result.index == 0) target.draw(2); - else target.chooseToDiscard(2, "he", true); - } else { - if (result.index == 0) target.recover(); - else target.damage(); - } - }, - }, - kyoko_juwu: { - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - filter(event, player) { - if (player == _status.currentPhase) return false; - var cards = event.getd(); - if (!cards.length) return false; - cards.removeArray(event.getd(player)); - for (var card of cards) { - if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") - return true; - } - return false; - }, - autodelay(event, player) { - return event.delay === false; - }, - async cost(event, trigger, player) { - var cards = trigger.getd(); - cards.removeArray(trigger.getd(player)); - cards = cards.filter(function (card) { - if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") - return true; - }); - const { result } = await player - .chooseButton([get.prompt("kyoko_juwu"), cards], [1, cards.length]) - .set("ai", function () { - return 1; - }); - if (result.bool) - event.result = { - bool: true, - cards: result.links, - }; - }, - async content(event, trigger, player) { - await player.gain(event.cards, "gain2", "log"); - }, - }, - kyoko_zhengyi: { - group: ["kyoko_jingce", "kyoko_shelie", "kyoko_zhiheng"], - count(player) { - var list = []; - player.countCards("e", function (card) { - list.add(get.suit(card, player)); - }); - return list.length; - }, - }, - kyoko_jingce: { - trigger: { player: ["phaseUseEnd", "phaseJieshuBegin"] }, - filter(event, player) { - var num = lib.skill.kyoko_zhengyi.count(player); - if (!num || (event.name == "phaseUse") == num > 3) return false; - return ( - player.getHistory("useCard", function (evt) { - return event.name != "phaseUse" || evt.getParent("phaseUse") == event; - }).length >= player.hp - ); - }, - frequent: true, - content() { - "step 0"; - if (trigger.name == "phaseUse") { - player.draw(2); - event.finish(); - return; - } - var list = [], - history = player.getHistory("useCard"); - for (var i of history) { - list.add(get.suit(i.card)); - if (list.length >= player.hp) break; - } - if (list.length >= player.hp) event.goon = true; - else - player - .chooseControl("摸牌阶段", "出牌阶段") - .set("prompt", "精策:选择要执行的额外阶段"); - "step 1"; - if (event.goon || result.index == 0) { - var next = player.phaseDraw(); - event.next.remove(next); - trigger.getParent().next.push(next); - } - if (event.goon || result.index == 1) { - var next = player.phaseUse(); - event.next.remove(next); - trigger.getParent().next.push(next); - } - }, - }, - kyoko_shelie: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter(event, player) { - return !event.numFixed && lib.skill.kyoko_zhengyi.count(player) > 1; - }, - content() { - "step 0"; - trigger.changeToZero(); - event.cards = get.cards(5); - game.cardsGotoOrdering(event.cards); - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards) { - var str; - if (player == game.me && !_status.auto) { - str = "涉猎:获取花色各不相同的牌"; - } else { - str = "涉猎"; - } - var dialog = ui.create.dialog(str, cards); - dialog.videoId = id; - }, - player, - event.videoId, - event.cards - ); - event.time = get.utc(); - game.addVideo("showCards", player, ["涉猎", get.cardsInfo(event.cards)]); - game.addVideo("delay", null, 2); - "step 1"; - var next = player.chooseButton([0, 5], true); - next.set("dialog", event.videoId); - next.set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; - } - return true; - }); - next.set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 2"; - if (result.bool && result.links) { - event.cards2 = result.links; - } else { - event.finish(); - } - var time = 1000 - (get.utc() - event.time); - if (time > 0) { - game.delay(0, time); - } - "step 3"; - game.broadcastAll("closeDialog", event.videoId); - var cards2 = event.cards2; - player.gain(cards2, "log", "gain2"); - }, - }, - kyoko_zhiheng: { - enable: "phaseUse", - usable: 1, - position: "he", - filter(event, player) { - return lib.skill.kyoko_zhengyi.count(player) > 2; - }, - prompt() { - var str = "弃置任意张牌并摸等量的牌"; - if (lib.skill.kyoko_zhengyi.count(_status.event.player) > 3) - str += ",若弃置了所有手牌则多摸一张牌。"; - return str; - }, - filterCard: lib.filter.cardDiscardable, - discard: false, - lose: false, - delay: false, - selectCard: [1, Infinity], - check(card) { - var player = _status.event.player; - if (get.position(card) == "h") { - return 8 - get.value(card); - } - return 6 - get.value(card); - }, - content() { - "step 0"; - player.discard(cards); - event.num = 1; - var hs = player.getCards("h"); - if (!hs.length || lib.skill.kyoko_zhengyi.count(player) < 4) event.num = 0; - else - for (var i = 0; i < hs.length; i++) { - if (!cards.includes(hs[i])) { - event.num = 0; - break; - } - } - "step 1"; - player.draw(event.num + cards.length); - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - }, - yuzuru_bujin: { - global: "yuzuru_bujin2", - trigger: { global: "phaseDrawBegin" }, - forced: true, - logTarget: "player", - filter(event, player) { - return event.player != player && event.player.isFriendOf(player); - }, - content() { - trigger.num++; - }, - }, - yuzuru_bujin2: { - mod: { - globalFrom(from, to, num) { - return ( - num - - game.countPlayer(function (current) { - return ( - current != from && - current.hasSkill("yuzuru_bujin") && - current.isFriendOf(from) - ); - }) - ); - }, - }, - }, - mio_tuifu: { - trigger: { global: "damageBegin1" }, - forced: true, - filter(event, player) { - return event.source && event.source.sameSexAs(event.player); - }, - content() { - player.draw(); - }, - }, - mio_tishen: { - trigger: { player: "phaseZhunbeiBegin" }, - limited: true, - unique: true, - charlotte: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return player.isDamaged(); - }, - check(event, player) { - return player.hp <= 1 || player.getDamagedHp() > 1; - }, - content() { - player.awakenSkill(event.name); - var num = player.maxHp - player.hp; - player.recover(num); - player.draw(num); - if (_status.characterlist && _status.characterlist.includes("key_midori")) { - player.reinitCharacter("key_mio", "key_midori", false); - } - }, - }, - midori_nonghuan: { - enable: "phaseUse", - charlotte: true, - filter(event, player) { - return (player.getStat("skill").midori_nonghuan || 0) < player.hp; - }, - filterTarget(card, player, target) { - var stat = player.getStat("midori_nonghuan"); - return ( - target != player && - (!stat || !stat.includes(target)) && - target.countGainableCards(player, "hej") > 0 - ); - }, - content() { - "step 0"; - var stat = player.getStat(); - if (!stat.midori_nonghuan) stat.midori_nonghuan = []; - stat.midori_nonghuan.push(target); - player.gainPlayerCard(target, "hej", true); - player.draw(); - "step 1"; - if (player.countCards("he") > 0) - player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); - else event.goto(3); - "step 2"; - player.give(result.cards, target); - "step 3"; - var history = game.getGlobalHistory("cardMove"); - for (var i = 0; i < history.length; i++) { - if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); - } - game.countPlayer2(function (current) { - var history = current.getHistory("lose"); - for (var i = 0; i < history.length; i++) { - if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); - } - var history = current.getHistory("gain"); - for (var i = 0; i < history.length; i++) { - if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); - } - }); - }, - ai: { - order: 9, - result: { - player() { - return lib.card.shunshou.ai.result.player.apply(this, arguments); - }, - target() { - return lib.card.shunshou.ai.result.target.apply(this, arguments); - }, - }, - }, - }, - midori_tishen: { - trigger: { player: "phaseZhunbeiBegin" }, - limited: true, - charlotte: true, - unique: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return player.isDamaged(); - }, - check(event, player) { - return player.hp <= 1 || player.getDamagedHp() > 1; - }, - content() { - player.awakenSkill(event.name); - var num = player.maxHp - player.hp; - player.recover(num); - player.draw(num); - if (_status.characterlist && _status.characterlist.includes("key_mio")) { - player.reinitCharacter("key_midori", "key_mio", false); - } - }, - }, - kanade_mapo: { - audio: 2, - derivation: "mapodoufu", - enable: "chooseToUse", - viewAs: { name: "mapodoufu" }, - filterCard: { suit: "heart" }, - viewAsFilter(player) { - return player.countCards("hes", { suit: "heart" }) > 0; - }, - position: "hes", - mod: { - selectTarget(card, player, range) { - if (card.name == "mapodoufu" && range[1] != -1) range[1]++; - }, - }, - check(card) { - var player = _status.event.player; - if ( - game.countPlayer(function (current) { - return ( - player.canUse("mapodoufu", current) && - get.effect(current, { name: "mapodoufu" }, player, player) > 0 - ); - }) > 1 - ) - return 6 - get.value(card); - return 4 - get.value(card); - }, - }, - kanade_benzhan: { - audio: 3, - trigger: { global: ["useCard", "respond"] }, - usable: 1, - filter(event, player) { - return ( - Array.isArray(event.respondTo) && - event.respondTo[0] != event.player && - [event.respondTo[0], event.player].includes(player) - ); - }, - async cost(event, trigger, player) { - event.type = get.type(trigger.card) == "basic"; - var prompt = event.type - ? "令一名角色摸两张牌或弃置两张牌" - : "令一名角色回复1点体力或对其造成1点伤害"; - event.result = await player - .chooseTarget(get.prompt("kanade_benzhan"), prompt) - .set("ai", function (target) { - var player = _status.event.player; - if (_status.event.getParent().type) { - var att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) return -att; - if (target.countCards("he") == 1 && att < 0) att /= 2; - return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); - } - return Math.max( - get.recoverEffect(target, player, player), - get.damageEffect(target, player, player) - ); - }) - .forResult(); - }, - content() { - "step 0"; - event.type = get.type(trigger.card) == "basic"; - var target = event.targets[0]; - event.target = target; - var trans = get.translation(target); - var list; - if (event.type) { - if (!target.countCards("he")) event._result = { index: 0 }; - else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; - } else { - if (target.isHealthy()) event._result = { index: 1 }; - else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; - } - player - .chooseControl() - .set("choiceList", list) - .set( - "choice", - (function () { - if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; - return get.recoverEffect(target, player, player) > - get.damageEffect(target, player, player) - ? 0 - : 1; - })() - ) - .set("ai", function () { - return _status.event.choice; - }); - "step 1"; - player.addExpose(0.2); - if (event.type) { - if (result.index == 0) target.draw(2); - else target.chooseToDiscard(2, "he", true); - } else { - if (result.index == 0) target.recover(); - else target.damage(); - } - }, - }, - yuzuru_wuxin: { - trigger: { player: "phaseJieshuBegin" }, - async cost(event, trigger, player) { - event.result = await player - .chooseCardTarget({ - filterTarget() { - if (ui.selected.cards.length) return false; - return true; - }, - filterCard() { - if (ui.selected.targets.length) return false; - return lib.filter.cardDiscardable.apply(this, arguments); - }, - selectTarget() { - if (!ui.selected.cards.length) return [1, 1]; - return [0, 0]; - }, - selectCard() { - if (ui.selected.targets.length) return [0, 0]; - if (!ui.selected.cards.length) return [0, 2]; - return [2, 2]; - }, - prompt: get.prompt2("yuzuru_wuxin"), - complexCard: true, - complexTarget: true, - ai1(card) { - var player = _status.event.player; - if (player.hp > 3) return 0; - return player.getDamagedHp() * 2 - get.value(card); - }, - ai2(target) { - if (player.hp < 4 || target.hasSkillTag("nogain")) return 0; - return get.attitude(_status.event.player, target); - }, - }) - .forResult(); - }, - async content(event, trigger, player) { - if (event.cards && event.cards.length) { - player.discard(event.cards); - player.recover(); - } else { - const target = event.targets[0]; - player.loseHp(); - target.draw(2); - } - }, - }, - yuzuru_deyi: { - derivation: [ - "yuzuru_kunfen", - "yuzuru_quji", - "yuzuru_wangsheng", - "yuzuru_kunfen_rewrite", - "yuzuru_quji_rewrite", - ], - trigger: { global: "dieAfter" }, - forced: true, - unique: true, - juexingji: true, - skillAnimation: true, - animationColor: "orange", - content() { - player.awakenSkill("yuzuru_deyi"); - player.changeSkills( - ["yuzuru_kunfen", "yuzuru_quji", "yuzuru_wangsheng"], - ["yuzuru_wuxin"] - ); - player.loseMaxHp(); - player.recover(); - }, - }, - yuzuru_kunfen: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - content() { - "step 0"; - if (!player.storage._yuzuru_sss) player.loseHp(); - player.draw(2); - "step 1"; - if (player.countCards("he") < 2) event.finish(); - else { - player.chooseCardTarget({ - selectCard: 2, - filterTarget: lib.filter.notMe, - prompt: "是否交给一名其他角色两张牌?", - position: "he", - ai1(card) { - var player = _status.event.player; - if (player.maxHp - player.hp == 1 && card.name == "du") return 30; - var check = player.countCards("h") - 2; - if (check < 1) return 0; - if (player.hp > 1 && check < 2) return 0; - return get.unuseful(card) + 9; - }, - ai2(target) { - var att = get.attitude(_status.event.player, target); - if (ui.selected.cards.length == 1 && ui.selected.cards[0].name == "du") - return 1 - att; - return att - 2; - }, - }); - } - "step 2"; - if (result.bool) player.give(result.cards, result.targets[0]); - }, - }, - yuzuru_quji: { - audio: 2, - enable: "phaseUse", - usable: 1, - position: "he", - filterCard: true, - selectCard() { - var player = _status.event.player; - return player.getDamagedHp(); - }, - filterTarget(card, player, target) { - return target != player && target.hp < target.maxHp; - }, - filter(event, player) { - return player.hp < player.maxHp; - }, - selectTarget() { - return [1, ui.selected.cards.length]; - }, - complexSelect: true, - check(card) { - if (!_status.event.player.storage._yuzuru_sss && get.color(card) == "black") return -1; - return 9 - get.value(card); - }, - line: { color: [194, 117, 92] }, - content() { - "step 0"; - target.recover(); - "step 1"; - if (target == targets[targets.length - 1] && !player.storage._yuzuru_sss) { - for (var i = 0; i < cards.length; i++) { - if (get.color(cards[i], player) == "black") { - player.loseHp(); - break; - } - } - } - }, - ai: { - result: { - target: 1, - }, - order: 6, - }, - }, - yuzuru_wangsheng: { - trigger: { player: "dieBegin" }, - forced: true, - juexingji: true, - unique: true, - skillAnimation: true, - animationColor: "soil", - content() { - "step 0"; - trigger.cancel(); - player.awakenSkill("yuzuru_wangsheng"); - player.storage._yuzuru_sss = true; - if (player.countCards("he") > 0) { - player.chooseCardTarget({ - selectCard: [1, Infinity], - filterTarget: lib.filter.notMe, - prompt: "将任意张牌交给一名其他角色,或点【取消】。", - position: "he", - ai1(card) { - var player = _status.event.player; - if ( - get.suit(card, false) == "heart" && - game.hasPlayer(function (current) { - return ( - current.hasSkill("kanade_mapo") && - get.attitude(player, current) > 0 - ); - }) - ) - return 1; - return 0; - }, - ai2(kanade) { - if ( - kanade.hasSkill("kanade_mapo") && - get.attitude(_status.event.player, kanade) > 0 - ) - return 2; - return 0; - }, - }); - } else event.goto(2); - "step 1"; - if (result.bool) player.give(result.cards, result.targets[0]); - "step 2"; - player.loseMaxHp(); - "step 3"; - if (player.hp < 2) player.recover(2 - player.hp); - }, - }, - ao_xishi: { - trigger: { - player: ["useCard", "respond"], - target: "useCardToTargeted", - }, - forced: true, - filter(event, player, name) { - return ( - (name == "useCard" || name == "respond" || event.player != player) && - get.suit(event.card) == "diamond" - ); - }, - content() { - player.draw(); - }, - }, - ao_kuihun: { - trigger: { global: "dying" }, - logTarget: "player", - line: "thunder", - filter(event, player) { - return player != event.player; - }, - content() { - "step 0"; - player.draw(); - "step 1"; - if (!trigger.player.countCards("h")) event.finish(); - else - player - .chooseButton(["选择一张牌作为「蝶」", trigger.player.getCards("h")]) - .set("ai", function (button) { - var val = get.buttonValue(button); - if (get.attitude(_status.event.player, get.owner(button.link)) <= 0) - return 10 + val; - if (val <= 0) return 20; - if (button.link.name == "tao" || button.link.name == "jiu") return 0; - return 1 / val; - }); - "step 2"; - if (result.bool) { - player - .addToExpansion(result.links, trigger.player, "give") - .set("log", false) - .gaintag.add("ao_diegui"); - game.log(result.links, "飞向了", player); - } - }, - locked: false, - mod: { - targetInRange(card, player) { - const cardSuit = get.suit(card, false); - const list = player.getExpansions("ao_diegui"); - for (let i = 0; i < list.length; i++) { - if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) return true; - } - }, - cardUsable(card, player) { - const cardSuit = get.suit(card, false); - const list = player.getExpansions("ao_diegui"); - for (let i = 0; i < list.length; i++) { - if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) - return Infinity; - } - }, - maxHandcard(player, num) { - return num + player.getExpansions("ao_diegui").length; - }, - }, - }, - ao_shixin: { - derivation: "ao_diegui", - trigger: { player: "phaseZhunbeiBegin" }, - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "key", - unique: true, - filter(event, player) { - var list = player.getExpansions("ao_diegui"); - var list2 = []; - for (var i = 0; i < list.length; i++) { - list2.add(get.suit(list[i], false)); - } - return list2.length > 2; - }, - content() { - player.awakenSkill("ao_shixin"); - player.changeSkills(["ao_diegui"], ["ao_kuihun"]); - player.gainMaxHp(); - player.recover(); - }, - ai: { - combo: "ao_kuihun" - }, - }, - ao_diegui: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.getExpansions("ao_diegui").length > 0; - }, - chooseButton: { - dialog(event, player) { - return ui.create.dialog("蝶归", player.getExpansions("ao_diegui"), "hidden"); - }, - backup(links, player) { - return { - card: links, - filterCard() { - return false; - }, - selectCard: -1, - filterTarget: true, - delay: false, - content: lib.skill.ao_diegui.contentx, - line: "thunder", - ai: { - result: { - target(player, target) { - if (target != player && target.hasSkillTag("nogain")) return 0; - var num = 1; - if (target.isTurnedOver()) num += 2; - if (target.isLinked()) num += 0.5; - return num; - }, - }, - }, - }; - }, - prompt(links, player) { - return ( - "选择一名角色,令其获得" + - get.translation(links[0]) + - ",摸两张牌并将武将牌复原。" - ); - }, - }, - contentx() { - "step 0"; - player.give(lib.skill.ao_diegui_backup.card, target, "visible"); - target.draw(2); - "step 1"; - target.link(false); - "step 2"; - target.turnOver(false); - }, - intro: { - name: "七影蝶", - content: "expansion", - markcount: "expansion", - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { order: 1, result: { player: 1 } }, - }, - ayato_jianshen: { - mod: { - cardnature(card, player) { - if (get.name(card) == "sha") return "kami"; - }, - }, - ai: { threaten: 3 }, - }, - ayato_zonghuan: { - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content() { - "step 0"; - player - .chooseButton( - ["请选择" + get.translation(target) + "的一张手牌", target.getCards("h")], - true - ) - .set("ai", get.buttonValue); - "step 1"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - if (!lib.filter.cardEnabled(card, target)) event._result = { bool: false }; - else { - var targets = game.players.slice(0); - var info = get.info(card); - var range; - if (!info.notarget) { - var select = get.copy(info.selectTarget); - if (select == undefined) { - range = [1, 1]; - } else if (typeof select == "number") range = [select, select]; - else if (get.itemtype(select) == "select") range = select; - else if (typeof select == "function") range = select(card, player); - game.checkMod(card, target, range, "selectTarget", target); - } - if (info.notarget || range[1] == -1) { - if (range[1] == -1) { - for (var i = 0; i < targets.length; i++) { - if (!target.canUse(card, targets[i])) { - targets.splice(i--, 1); - } - } - if (targets.length) { - event.targets2 = targets; - } else { - event.finish(); - return; - } - } else event.targets2 = []; - var next = player.chooseBool(); - next.set( - "prompt", - event.prompt || - "是否令" + - get.translation(target) + - (event.targets2.length ? "对" : "") + - get.translation(event.targets2) + - "使用" + - get.translation(card) + - "?" - ); - next.set("prompt2", "或点「取消」,令其将此牌置入弃牌堆"); - next.ai = function () { - var eff = 0; - for (var i = 0; i < event.targets2.length; i++) { - eff += get.effect(event.targets2[i], card, target, player); - } - return eff > 0; - }; - } else { - var next = player.chooseTarget(); - next.set("_get_card", card); - next.set("source", target); - next.set("filterTarget", function (card, player, target) { - return lib.filter.filterTarget( - _status.event._get_card, - _status.event.source, - target - ); - }); - next.set("ai", function (target) { - var evt = _status.event; - return get.effect(target, evt._get_card, evt.source, evt.player); - }); - next.set("selectTarget", function () { - var card = get.card(), - player = _status.event.source; - if (card == undefined) return; - var range; - var select = get.copy(get.info(card).selectTarget); - if (select == undefined) { - if (get.info(card).filterTarget == undefined) return [0, 0]; - range = [1, 1]; - } else if (typeof select == "number") range = [select, select]; - else if (get.itemtype(select) == "select") range = select; - else if (typeof select == "function") range = select(card, player); - game.checkMod(card, player, range, "selectTarget", player); - return range; - }); - next.set( - "prompt", - event.prompt || - "选择" + - get.translation(target) + - "使用" + - get.translation(card) + - "的目标" - ); - next.set("prompt2", "或点「取消」令其将此牌置入弃牌堆"); - } - } - } else event.finish(); - "step 2"; - if (result.bool) { - target.useCard(card, event.targets2 || result.targets, false, "noai"); - player.draw(); - } else { - target.lose(card, ui.discardPile); - target.$throw(card); - game.log(target, "将", card, "置入了弃牌堆"); - } - }, - ai: { order: 10, result: { target: -1 } }, - }, - nagisa_tiandu: { - trigger: { player: "judgeEnd" }, - charlotte: true, - frequent(event) { - if (event.result.card.name == "du") return false; - return true; - }, - check(event) { - if (event.result.card.name == "du") return false; - return true; - }, - filter(event, player) { - return get.position(event.result.card, true) == "o"; - }, - content() { - player.gain(trigger.result.card, "gain2"); - }, - }, - nagisa_fuxin: { - trigger: { - global: ["gainAfter", "loseAfter", "loseAsyncAfter", "damageEnd"], - }, - filterx(event, player) { - var source = _status.currentPhase; - if (event.name == "damage") { - return event.player.isAlive() && event.player != source; - } else if (event.name == "lose") { - if (event.type != "discard" || event.player == source || event.player.isDead()) - return false; - if ((event.discarder || event.getParent(2).player) == event.player) return false; - if (!event.getl(event.player).hs.length) return false; - return true; - } else if (event.name == "gain") { - if (event.giver || event.getParent().name == "gift") return false; - var cards = event.getg(event.player); - if (!cards.length) return false; - return game.hasPlayer(function (current) { - if (current == event.player || current == source) return false; - var hs = event.getl(current).hs; - for (var i of hs) { - if (cards.includes(i)) return true; - } - return false; - }); - } else if (event.type == "gain") { - if (event.giver || !event.player || event.player == source || event.player.isDead()) - return false; - var hs = event.getl(event.player); - return game.hasPlayer(function (current) { - if (current == event.player) return false; - var cards = event.getg(current); - for (var i of cards) { - if (hs.includes(i)) return true; - } - }); - } else if (event.type == "discard") { - if (!event.discarder) return false; - return game.hasPlayer(function (current) { - return ( - current != source && - current != event.discarder && - event.getl(current).hs.length > 0 - ); - }); - } - return false; - }, - filter(event, player, triggername, target) { - return target.isIn(); - }, - getIndex(trigger, player, triggername) { - if (!lib.skill.nagisa_fuxin.filterx(trigger, player)) return false; - const targets = [], - source = _status.currentPhase; - if (trigger.name == "gain") { - const cards = trigger.getg(trigger.player); - targets.addArray( - game.filterPlayer(function (current) { - if (current === trigger.player || current === source) return false; - const hs = trigger.getl(current).hs; - for (const i of hs) { - if (cards.includes(i)) return true; - } - return false; - }) - ); - } else if (trigger.name == "loseAsync" && trigger.type == "discard") { - targets.addArray( - game.filterPlayer(function (current) { - return ( - current != trigger.discarder && - current != source && - trigger.getl(current).hs.length > 0 - ); - }) - ); - } else targets.push(trigger.player); - targets.sortBySeat(); - return targets; - }, - logTarget: (event, player, triggername, target) => target, - check(event, player, triggername, target) { - const source = _status.currentPhase; - if (source && source.isIn() && get.attitude(player, source) > 0) return false; - return get.attitude(player, target) > 0; - }, - async content(event, trigger, player) { - const target = event.indexedData; - const { result } = await target.judge(); - if (result.color === "red" && target.isIn()) { - await target.draw(); - } else { - const source = _status.currentPhase; - if (source && source.isIn() && source.countCards("h") > 0) { - source.chooseToDiscard("he", true); - } - } - }, - ai: { expose: 0.2 }, - }, - tomoya_shangxian: { - trigger: { player: "phaseUseBegin" }, - mark: true, - locked: true, - intro: { - content(s) { - return "计算与其他角色的距离时始终从" + (s ? "逆" : "顺") + "时针计算"; - }, - }, - content() { - player.draw(); - player.storage.tomoya_shangxian = !player.storage.tomoya_shangxian; - }, - ai: { - left_hand: true, - right_hand: true, - skillTagFilter(player, tag) { - return (player.storage.tomoya_shangxian == true) == (tag == "left_hand"); - }, - }, - }, - tomoya_wangjin: { - trigger: { global: "phaseJieshuBegin" }, - filter(event, player) { - return ( - player != event.player && - !player.hasSkill("tomoya_wangjin_" + player.inRange(event.player)) - ); - }, - logTarget: "player", - check(event, player) { - var target = event.player; - var bool = player.inRange(target); - if (!bool) { - if (target.hp > player.hp) - return get.effect(target, { name: "sha", isCard: true }, player, player) > 0; - var temp = target; - while (true) { - temp = temp.getNext(); - if (temp == target || temp == _status.roundStart) return true; - if (temp == player) continue; - if ( - temp.hp > player.hp && - !player.inRange(temp) && - get.effect(temp, { name: "sha", isCard: true }, player, player) > 0 - ) - return false; - } - } - if (get.attitude(player, target) < 2) return false; - if (target.hp < player.hp && !target.hasSkillTag("nogain")) return true; - var temp = target; - while (true) { - temp = temp.getNext(); - if (temp == target || temp == _status.roundStart) return true; - if (temp == player) continue; - if ( - temp.hp < player.hp && - player.inRange(temp) && - get.attitude(player, target) >= 2 && - !temp.hasSkillTag("nogain") - ) - return false; - } - }, - content() { - "step 0"; - event.bool = player.inRange(trigger.player); - player.addTempSkill("tomoya_wangjin_" + event.bool, "roundStart"); - if (event.bool) { - trigger.player.draw(); - } else player.draw(2); - "step 1"; - if (event.bool) { - if (trigger.player.hp < player.hp) player.draw(); - else event.finish(); - } else { - if (player.countDiscardableCards(trigger.player, "h") > 0) - trigger.player.discardPlayerCard(player, "h", true); - else event.finish(); - } - "step 2"; - if (event.bool) { - player.chooseCard("h", "是否交给" + get.translation(trigger.player) + "一张牌?"); - } else { - event.finish(); - if (player.hp >= trigger.player.hp) return; - var card = { name: "sha", isCard: true }; - if (player.canUse(card, trigger.player, false)) - player.useCard(card, trigger.player, false); - } - "step 3"; - if (result.bool) player.give(result.cards, target); - }, - subSkill: { - true: { charlotte: true }, - false: { charlotte: true }, - }, - ai: { expose: 0.2 }, - }, - noda_fengcheng: { - audio: 2, - trigger: { - player: "gainAfter", - }, - forced: true, - filter(event, player) { - return get.itemtype(event.source) == "player" && event.bySelf != true; - }, - check(event, player) { - return get.attitude(player, event.source) > 0; - }, - logTarget: "source", - content() { - trigger.source.draw(); - }, - }, - noda_xunxin: { - audio: 2, - enable: "phaseUse", - viewAs: { name: "juedou" }, - filter(event, player) { - return (player.getStat("skill").noda_xunxin || 0) < player.hp; - }, - filterTarget(event, player, target) { - if (target.hp < player.hp) return false; - return lib.filter.filterTarget.apply(this, arguments); - }, - selectCard: -1, - filterCard() { - return false; - }, - group: "noda_xunxin2", - }, - noda_xunxin2: { - trigger: { player: "juedouAfter" }, - popup: false, - forced: true, - filter(event, player) { - if (event.target.isDead()) return false; - return event.turn && event.turn.countCards("he") > 0; - }, - content() { - "step 0"; - event.giver = trigger.turn; - event.gainner = event.giver == player ? trigger.target : player; - event.giver.chooseCard("he", true, "交给" + get.translation(event.gainner) + "一张牌"); - "step 1"; - event.giver.give(result.cards, event.gainner); - }, - }, - hinata_qiulve: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - viewAsFilter(player) { - return ( - player.countCards("hes", function (card) { - return get.type(card) != "basic"; - }) > 0 - ); - }, - viewAs: { name: "sha" }, - filterCard(card, player) { - return get.type(card) != "basic"; - }, - locked: false, - position: "hes", - check(card) { - var val = get.value(card); - if (val >= 6) return 0; - if (get.color(card) == "black") return 12 - val; - return 6 - val; - }, - mod: { - targetInRange(card, player, target) { - if (_status.event.skill == "hinata_qiulve") return true; - }, - }, - group: "hinata_qiulve_clear", - ai: { - respondSha: true, - skillTagFilter(player) { - return ( - player.countCards("hes", function (card) { - return get.type(card) != "basic"; - }) > 0 - ); - }, - }, - }, - hinata_qiulve_clear: { - trigger: { player: "useCard1" }, - firstDo: true, - silent: true, - filter(event, player) { - return event.skill == "hinata_qiulve"; - }, - content() { - if (get.color(trigger.card) == "red") trigger.directHit.addArray(game.players); - else if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat().card; - if (stat.sha) stat.sha--; - } - }, - }, - hinata_ehou: { - audio: 2, - trigger: { global: "useCardAfter" }, - //这个也是chooseToUse 改不了 - direct: true, - filter(event, player) { - return ( - player != event.player && - event.targets && - event.targets.includes(player) && - (_status.connectMode || player.hasSha()) - ); - }, - content() { - "step 0"; - player.chooseToUse({ - logSkill: "hinata_ehou", - preTarget: trigger.player, - prompt: "是否发动【扼喉】,对" + get.translation(trigger.player) + "使用一张【杀】?", - filterCard(card, player) { - return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); - }, - filterTarget(card, player, target) { - return ( - target == _status.event.preTarget && - lib.filter.filterTarget.apply(this, arguments) - ); - }, - addCount: false, - }); - "step 1"; - if ( - result.bool && - player.getHistory("sourceDamage", function (evt) { - return evt.getParent(4) == event; - }).length - ) - player.draw(); - }, - }, - hisako_yinbao: { - audio: 2, - trigger: { player: ["damageEnd", "recoverAfter"] }, - content() { - "step 0"; - player.judge(function (card) { - return get.suit(card) == "spade" ? 2 : -2; - }).judge2 = function (result) { - return result.bool; - }; - "step 1"; - if (result.bool && game.hasPlayer((current) => current != player)) { - player - .chooseTarget(lib.filter.notMe, true, "选择一名其他角色,对其造成1点雷属性伤害") - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player, "thunder"); - }); - } else event.finish(); - "step 2"; - var target = result.targets[0]; - player.addExpose(0.2); - player.line(target, "thunder"); - target.damage("thunder"); - }, - }, - hisako_zhuanyun: { - trigger: { player: "judgeBegin" }, - forced: true, - charlotte: true, - silent: true, - filter(event, player) { - return !event.directresult; - }, - content() { - var tempcard = false, - temp = -Infinity; - for (var i = 0; i < ui.cardPile.childElementCount; i++) { - var card = ui.cardPile.childNodes[i]; - var temp2 = trigger.judge(card); - if (temp2 > temp) { - tempcard = card; - temp = temp2; - } - } - if (tempcard) trigger.directresult = tempcard; - }, - ai: { luckyStar: true }, - }, - riki_spwenji: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("he"); - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("riki_spwenji"), function (card, player, target) { - return target != player && target.countCards("he"); - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) return Math.sqrt(att) / 10; - return 5 - att; - }) - .forResult(); - }, - content() { - "step 0"; - target = targets[0]; - event.target = target; - target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); - "step 1"; - if (result.bool) { - player.addTempSkill("riki_spwenji_respond"); - player.storage.riki_spwenji_respond = get.type2(result.cards[0], target); - event.target.give(result.cards, player, true); - } - }, - ai: { expose: 0.2 }, - subSkill: { - respond: { - onremove: true, - trigger: { player: "useCard" }, - forced: true, - charlotte: true, - audio: "riki_spwenji", - filter(event, player) { - return get.type2(event.card) == player.storage.riki_spwenji_respond; - }, - content() { - trigger.directHit.addArray(game.players); - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return get.type2(arg.card) == player.storage.riki_spwenji_respond; - }, - }, - }, - }, - }, - riki_nvzhuang: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - content() { - player.draw(player.countCards("h") == 0 ? 2 : 1); - }, - }, - riki_mengzhong: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - derivation: "riki_chongzhen", - juexingji: true, - unique: true, - skillAnimation: true, - animationColor: "key", - filter(event, player) { - var num = 0; - player.getAllHistory("gain", function (evt) { - if (evt.getParent().name == "riki_spwenji") num += evt.cards.length; - }); - return num >= 3; - }, - content() { - player.awakenSkill("riki_mengzhong"); - player.removeSkills("riki_spwenji"); - player.gainMaxHp(); - player.recover(); - player.addSkills("riki_chongzhen"); - }, - ai: { - combo: "riki_spwenji" - }, - }, - riki_chongzhen: { - trigger: { - player: "phaseUseBegin", - }, - filter(event, player) { - return game.hasPlayer((current) => player.canCompare(current)); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("riki_chongzhen"), function (card, player, target) { - return player.canCompare(target); - }) - .set("ai", function (target) { - return ( - (-get.attitude(player, target) * (1 + target.countCards("e"))) / - (1 + target.countCards("j")) - ); - }) - .forResult(); - }, - content() { - "step 0"; - var target = targets[0]; - event.target = target; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - var num = 0; - if (target.countCards("h")) num++; - if (target.countCards("e")) num++; - if (target.countCards("j")) num++; - if (num) { - player - .gainPlayerCard(target, num, "hej", true) - .set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if ( - get.position(button.link) == - get.position(ui.selected.buttons[i].link) - ) - return false; - } - return true; - }); - } - } else { - player.addTempSkill("zishou2", "phaseEnd"); - } - }, - ai: { expose: 0.2 }, - }, - yuiko_fenglun: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return player.canCompare(current); - }) - ); - }, - filterTarget(card, player, target) { - return player.canCompare(target); - }, - content() { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) player.addTempSkill("yuiko_fenglun2", "phaseUseEnd"); - }, - ai: { - order: 10, - result: { target: -1 }, - }, - }, - yuiko_fenglun2: { - mod: { - cardUsable() { - return Infinity; - }, - targetInRange() { - return true; - }, - }, - }, - yuiko_dilve: { - enable: "chooseCard", - check() { - return 20; - }, - filter(event) { - return event.type == "compare" && !event.directresult; - }, - onCompare(player) { - return game.cardsGotoOrdering(get.bottomCards()).cards; - }, - group: "yuiko_dilve_gain", - subSkill: { - gain: { - trigger: { - player: ["chooseToCompareAfter", "compareMultipleAfter"], - target: ["chooseToCompareAfter", "compareMultipleAfter"], - }, - filter(event, player) { - if (event.preserve) return false; - return [event.card1, event.card2].filterInD("od").length > 0; - }, - prompt2(event, player) { - return "获得" + get.translation([event.card1, event.card2].filterInD("od")); - }, - content() { - player.gain([trigger.card1, trigger.card2].filterInD("od"), "gain2", "log"); - }, - }, - }, - }, - doruji_feiqu: { - trigger: { - player: "useCard", - target: "useCardToTargeted", - }, - forced: true, - filter(event, player) { - return event.card.name == "sha"; - }, - content() { - if (trigger.name == "useCard") trigger.directHit.addArray(game.players); - else trigger.directHit.add(player); - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return arg.card.name == "sha"; - }, - }, - global: "doruji_feiqu_ai", - }, - doruji_feiqu_ai: { - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return ( - arg.card.name == "sha" && - (arg.target.hasSkill("doruji_feiqu") || arg.target.hasSkill("godan_feiqu")) - ); - }, - }, - }, - akane_jugu: { - audio: 2, - mod: { - maxHandcard(player, num) { - return num + player.maxHp; - }, - }, - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - player.draw(player.maxHp); - }, - }, - akane_quanqing: { - enable: "phaseUse", - filterCard: true, - filterTarget(card, player, target) { - return target != player && player.inRange(target); - }, - position: "he", - check(card) { - var val = get.value(card); - var num = card.number; - if (num > 10) return 8 - val; - var player = _status.event.player; - if (player.getUseValue(card, null, true) > player.getUseValue({ name: "guohe" })) - return 0; - if (num > 6) return 6 - val; - return 3 - val; - }, - content() { - "step 0"; - var num = cards[0].number; - var trans = get.translation(target); - var list = ["令" + trans + "摸一张牌"]; - event.addIndex = 0; - if (num > 6) { - if (target.countDiscardableCards(player, "hej") > 0) - list.push("弃置" + trans + "区域内的一张牌"); - else event.addIndex++; - } - if (num > 10) list.push("对" + trans + "造成1点伤害"); - if (list.length == 1) event._result = { index: 0 }; - else - player - .chooseControl() - .set("choiceList", list) - .set("index", list.length - 1) - .set("ai", function () { - return _status.event.index; - }); - "step 1"; - if (result.index > 0) result.index += event.addIndex; - switch (result.index) { - case 0: - target.draw(); - break; - case 1: - player.discardPlayerCard(target, "hej", true); - break; - case 2: - target.damage("nocard"); - break; - } - }, - ai: { - order: 4, - result: { - target(player, target) { - var card = ui.selected.cards[0]; - if (card) { - if (card.number > 10) return get.damageEffect(target, player, target); - if (card.number > 6) - return lib.card.guohe.ai.result.target.apply(this, arguments); - return 1; - } - }, - }, - }, - }, - akane_yifu: { - unique: true, - global: "akane_yifu2", - zhuSkill: true, - }, - akane_yifu2: { - audio: 2, - enable: "phaseUse", - discard: false, - line: true, - log: false, - delay: false, - lose: false, - prepare(cards, player, targets) { - targets[0].logSkill("akane_yifu"); - }, - prompt() { - var player = _status.event.player; - var list = game.filterPlayer(function (target) { - return target != player && target.hasZhuSkill("akane_yifu", player); - }); - var str = "将一张手牌交给" + get.translation(list); - if (list.length > 1) str += "中的一人"; - return str; - }, - filter(event, player) { - if (player.group != "key") return false; - if (player.countCards("h") == 0) return 0; - return game.hasPlayer(function (target) { - return ( - target != player && - target.hasZhuSkill("akane_yifu", player) && - !target.hasSkill("akane_yifu3") - ); - }); - }, - filterCard: true, - filterTarget(card, player, target) { - return ( - target != player && - target.hasZhuSkill("akane_yifu", player) && - !target.hasSkill("akane_yifu3") - ); - }, - content() { - "step 0"; - player.give(cards, target); - target.addTempSkill("akane_yifu3", "phaseUseEnd"); - target.draw(); - "step 1"; - if (target.countCards("h") > 0) - target - .chooseCard("h", true, "交给" + get.translation(player) + "一张牌") - .set("ai", function (card) { - return 14 - get.value(card); - }); - else event.finish(); - "step 2"; - target.give(result.cards, player); - }, - ai: { - expose: 0.3, - order: 10, - result: { - target: 5, - }, - }, - }, - akane_yifu3: { charlotte: true }, - sasami_miaobian: { - derivation: ["sasami_gongqing", "sasami_funan", "sasami_baoqiu"], - init2(player) { - if (player.hp <= 3) player.addSkill("sasami_gongqing"); - if (player.hp <= 2) player.addSkill("sasami_funan"); - if (player.hp <= 1) player.addSkill("sasami_baoqiu"); - }, - trigger: { player: "changeHp" }, - firstDo: true, - silent: true, - content() { - lib.skill.sasami_miaobian.init2(player); - }, - }, - sasami_baoqiu: { - line: { color: [173, 149, 206] }, - inherit: "rin_baoqiu", - }, - sasami_gongqing: { - audio: true, - trigger: { - player: ["damageBegin3", "damageBegin4"], - }, - forced: true, - filter(event, player, name) { - if (!event.source) return false; - var range = event.source.getAttackRange(); - if (name == "damageBegin3") return range > 3; - return event.num > 1 && range < 3; - }, - content() { - trigger.num = event.triggername == "damageBegin4" ? 1 : trigger.num + 1; - }, - ai: { - filterDamage: true, - skillTagFilter(player, tag, arg) { - if (arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) return false; - if (arg.player.getAttackRange() < 3) return true; - } - return false; - }, - }, - }, - sasami_funan: { - audio: 2, - trigger: { global: ["respond", "useCard"] }, - line: { color: [173, 149, 206] }, - filter(event, player) { - if (!event.respondTo) return false; - if (event.player == player) return false; - if (player != event.respondTo[0]) return false; - if (!player.hasSkill("sasami_funan_jiexun")) { - var cards = []; - if (get.itemtype(event.respondTo[1]) == "card") cards.push(event.respondTo[1]); - else if (event.respondTo[1].cards) cards.addArray(event.respondTo[1].cards); - return cards.filterInD("od").length > 0; - } else return event.cards.filterInD("od").length > 0; - }, - logTarget: "player", - content() { - "step 0"; - if (!player.hasSkill("sasami_funan_jiexun")) { - var cards = []; - if (get.itemtype(trigger.respondTo[1]) == "card") cards.push(trigger.respondTo[1]); - else if (trigger.respondTo[1].cards) cards.addArray(trigger.respondTo[1].cards); - cards = cards.filterInD("od"); - trigger.player.gain(cards, "gain2", "log").gaintag.add("sasami_funan"); - trigger.player.addTempSkill("sasami_funan_use"); - } - "step 1"; - var cards = trigger.cards.filterInD("od"); - player.gain(cards, "log", "gain2"); - }, - subSkill: { - use: { - onremove(player) { - player.removeGaintag("sasami_funan"); - }, - charlotte: true, - mod: { - cardEnabled2(card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("sasami_funan")) { - return false; - } - }, - }, - }, - }, - }, - rin_baoqiu: { - mod: { - attackRange(rin, ball) { - return ball + 2; - }, - }, - trigger: { player: "useCardToPlayered" }, - forced: true, - logTarget: "target", - filter(event, player) { - return event.card.name == "sha"; - }, - line: { color: [194, 117, 92] }, - content() { - "step 0"; - player.judge(function () { - return 0; - }); - "step 1"; - var target = trigger.target; - var map = trigger.customArgs; - var id = target.playerid; - if (!map[id]) map[id] = {}; - if (result.color == "red") { - if (!map[id].extraDamage) map[id].extraDamage = 0; - map[id].extraDamage++; - } - if (result.color == "black") { - trigger.directHit.add(target); - } - if (result.suit == "spade" || result.suit == "heart") { - var evt = trigger.getParent(); - if (evt.addCount !== false) { - evt.addCount = false; - player.getStat().card.sha--; - } - player.draw(); - } - if (result.suit == "diamond" || result.suit == "club") { - target.addTempSkill("fengyin"); - if (target.countDiscardableCards(player, "he") > 0) - player.discardPlayerCard(target, "he", true); - } - }, - }, - sunohara_chengshuang: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - group: "sunohara_chengshuang_phase", - forced: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - "step 0"; - var evt = event.getParent("phase"); - if (evt && evt.player == player) evt.sunohara_chengshuang = true; - player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); - "step 1"; - var sex = result.control; - game.broadcastAll( - function (player, sex) { - player.sex = sex; - if (player.marks && player.marks.sunohara_chengshuang) - player.marks.sunohara_chengshuang.firstChild.innerHTML = - sex == "male" ? "♂" : "♀"; - }, - player, - sex - ); - game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); - }, - mark: true, - intro: { - content(storage, player) { - if (player.sex == "unknown" || player.sex == "double") return "当前性别未确定"; - return "当前性别:" + get.translation(player.sex); - }, - }, - }, - sunohara_chengshuang_phase: { - trigger: { - player: "phaseBegin", - }, - filter(event, player) { - if (event.sunohara_chengshuang) return false; - return game.phaseNumber > 1; - }, - prompt2(event, player) { - if (player.sex == "unknown" || player.sex == "double") return "选择自己的性别"; - return "将自己的性别变更为" + (player.sex == "male" ? "女性" : "男性"); - }, - content() { - "step 0"; - if (player.sex == "unknown" || player.sex == "double") - player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); - else - event._result = { - control: player.sex == "male" ? "female" : "male", - }; - "step 1"; - var sex = result.control; - game.broadcastAll( - function (player, sex) { - player.sex = sex; - if (player.marks && player.marks.sunohara_chengshuang) - player.marks.sunohara_chengshuang.firstChild.innerHTML = - sex == "male" ? "♂" : "♀"; - }, - player, - sex - ); - game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); - }, - }, - sunohara_tiaoyin: { - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.countGainableCards(player, "hej") > 0; - }, - selectCard: [1, 4], - filterCard(card) { - for (var i = 0; i < ui.selected.cards.length; i++) { - if (get.suit(ui.selected.cards[i]) == get.suit(card)) return false; - } - return true; - }, - complexSelect: true, - complexCard: true, - complexTarget: true, - selectTarget() { - return [ui.selected.cards.length, ui.selected.cards.length]; - }, - line: { color: [239, 204, 96] }, - content() { - if (target.countGainableCards(player, "hej") > 0) - player.gainPlayerCard(target, "hej", "visible"); - }, - contentAfter() { - var bool = false; - for (var i = 0; i < targets.length; i++) { - if (targets[i].differentSexFrom(player)) { - bool = true; - break; - } - } - if (bool) player.loseHp(); - }, - ai: { - order: 6, - result: { - target(player, target) { - return lib.card.shunshou.ai.result.target.apply(this, arguments); - }, - player(player, target) { - if (target.sameSexAs(player)) return 0; - for (var i = 0; i < ui.selected.targets.length; i++) { - if (ui.selected.targets[i].differentSexFrom(player)) return 0; - } - return get.attitude(player, target) < 0 && target.countCards("h", "tao") > 0 - ? 1 - : -2; - }, - }, - }, - }, - sunohara_jianren: { - trigger: { player: "damageEnd" }, - line: { color: [145, 149, 179] }, - async cost(event, trigger, player) { - const num = - !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) - ? 3 - : 1; - event.result = await player - .chooseTarget( - get.prompt("sunohara_jianren"), - "令一名角色摸" + get.cnNumber(num) + "张牌。" - ) - .set("ai", function (target) { - var att = get.attitude(player, target); - if (att <= 0) return 0; - if (target.hasSkillTag("nogain") && target != _status.currentPhase) return 0.1; - return att / (1 + 0.1 * target.countCards("h")); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - const num = - !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) - ? 3 - : 1; - target.draw(num); - }, - }, - shiina_qingshen: { - audio: 1, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - filter(event, player) { - return event.cards && event.cards.filterInD().length > 0; - }, - frequent: true, - content() { - "step 0"; - var cards = trigger.cards.filterInD("od"); - player.gain(cards, "gain2", "log"); - event.count = cards.length; - "step 1"; - var cards = player.getCards("he"); - if (cards.length == 0) { - event.finish(); - return; - } else if (cards.length <= event.count) { - event._result = { bool: true, cards: cards }; - } else player.chooseCard(true, "he", event.count, "请选择要置于武将牌上的牌"); - "step 2"; - if (result.bool && result.cards.length) { - var cards = result.cards; - player.addToExpansion(cards, player, "give").gaintag.add("shiina_qingshen"); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - mod: { - attackRange(from, num) { - return num + from.getExpansions("shiina_qingshen").length; - }, - maxHandcard(from, num) { - return num + from.getExpansions("shiina_qingshen").length; - }, - }, - ai: { - notemp: true, - }, - }, - shiina_feiyan: { - audio: 1, - animalList: ["key_inari", "key_doruji"], - trigger: { global: "phaseBegin" }, - filter(event, player) { - if (lib.skill.shiina_feiyan.animalList.includes(event.player.name)) return false; - return player.getExpansions("shiina_qingshen").length > 0 && player.inRange(event.player); - }, - async cost(event, trigger, player) { - const { result } = await player - .chooseButton([ - get.prompt("shiina_feiyan", trigger.player), - player.getExpansions("shiina_qingshen"), - ]) - .set("goon", get.attitude(player, trigger.player) < 0 ? 1 : -1) - .set("ai", function () { - return _status.event.goon; - }); - if (result.bool) - event.result = { - bool: true, - cards: result.links, - }; - }, - logTarget: "player", - async content(event, trigger, player) { - await player.loseToDiscardpile(event.cards); - const cardToUse = { name: "sha", isCard: true }; - if (lib.filter.targetEnabled(cardToUse, player, trigger.player)) { - const { card } = await player.useCard(cardToUse, trigger.player); - console.log(card); - if ( - !player.hasHistory("sourceDamage", function (evt) { - return evt.card === card; - }) - ) - await player.draw(); - } - }, - group: "shiina_retieji", - ai: { - notemp: true, - combo: "shiina_feiyan", - }, - }, - shiina_retieji: { - audio: 1, - shaRelated: true, - trigger: { player: "useCardToPlayered" }, - check(event, player) { - return get.attitude(player, event.target) < 0; - }, - filter(event, player) { - return event.card.name == "sha" && event.getParent(2).name == "shiina_feiyan"; - }, - logTarget: "target", - content() { - "step 0"; - player.judge(function () { - return 0; - }); - if (!trigger.target.hasSkill("fengyin")) { - trigger.target.addTempSkill("fengyin"); - } - "step 1"; - var suit = get.suit(result.card); - var target = trigger.target; - var num = target.countCards("h", "shan"); - target - .chooseToDiscard( - "请弃置一张" + get.translation(suit) + "牌,否则不能使用闪抵消此杀", - "he", - function (card) { - return get.suit(card) == _status.event.suit; - } - ) - .set("ai", function (card) { - var num = _status.event.num; - if (num == 0) return 0; - if (card.name == "shan") return num > 1 ? 2 : 0; - return 8 - get.value(card); - }) - .set("num", num) - .set("suit", suit); - "step 2"; - if (!result.bool) { - trigger.getParent().directHit.add(trigger.target); - } - }, - }, - inari_baiwei: { - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard(player, name) { - return ( - name != "du" && - get.type(name) == "basic" && - player.countCards("hes", { suit: "diamond" }) > 0 - ); - }, - filter(event, player) { - if (event.type == "wuxie" || !player.countCards("hse", { suit: "diamond" })) return false; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if ( - name != "du" && - get.type(name) == "basic" && - event.filterCard(get.autoViewAs({ name: name }, "unsure"), player, event) - ) - return true; - } - return false; - }, - chooseButton: { - dialog(event, player) { - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (name == "du") continue; - if (name == "sha") { - list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) list.push(["基本", "", name, j]); - } else if (get.type(name) == "basic") { - list.push(["基本", "", name]); - } - } - return ui.create.dialog("摆尾", [list, "vcard"], "hidden"); - }, - filter(button, player) { - return _status.event - .getParent() - .filterCard( - get.autoViewAs({ name: button.link[2] }, "unsure"), - player, - _status.event.getParent() - ); - }, - check(button) { - if (_status.event.getParent().type == "phase") { - var player = _status.event.player; - var fakecard = { - name: button.link[2], - nature: button.link[3], - }; - if (player.getUseValue(fakecard) > 0) return get.order(fakecard); - return 0; - } - return 1; - }, - backup(links, player) { - return { - selectCard: 1, - filterCard: { suit: "diamond" }, - popname: true, - check(card) { - if (get.type(card) == "basic") return 6; - return 1 / Math.max(0.1, get.value(card)); - }, - position: "hse", - viewAs: { name: links[0][2], nature: links[0][3] }, - }; - }, - prompt(links, player) { - return ( - "将一张♦牌当做" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "使用或打出" - ); - }, - }, - ai: { - order(item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (get.type(name) == "basic" && player.getUseValue({ name: name }) > 0) { - var temp = get.order({ name: name }); - if (temp > max) max = temp; - } - } - if (max > 0) max += 0.5; - return max; - } - return 4; - }, - result: { - player: 1, - }, - respondSha: true, - fireAttack: true, - skillTagFilter(player, tag) { - return tag == "fireAttack" || player.countCards("he", { suit: "diamond" }) > 0; - }, - }, - group: ["inari_baiwei_draw"], - }, - inari_baiwei_draw: { - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - popup: false, - filter(event, player) { - return event.skill && event.skill.indexOf("inari_baiwei") == 0; - }, - content() { - player.draw(); - }, - }, - inari_huhun: { - mod: { - suit(card, suit) { - if (suit == "club") return "diamond"; - }, - maxHandcard(player, num) { - return num + 1; - }, - }, - }, - saya_powei: { - audio: 2, - trigger: { player: "phaseAfter" }, - locked: true, - limited: true, - unique: true, - skillAnimation: true, - animationColor: "metal", - filter(event, player) { - return ( - event.type != "saya_powei" && - game.hasPlayer(function (current) { - return current.hp > player.hp; - }) - ); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("saya_powei"), function (card, saya, kyousuke) { - return kyousuke.hp > saya.hp; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att >= -2) return 0; - if (target != get.zhu(target) && player.hasUnknown()) return 0; - if (target.getEquip(3) && !player.getEquip(4)) att /= 2; - if (player.hp <= 1) att *= 1.5; - return -att; - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - player.awakenSkill("saya_powei"); - game.asyncDelay(3); - var next = game.createEvent("saya_powei_loop", false, trigger); - next.playertrue = player; - next.playerfalse = target; - next.setContent(lib.skill.saya_powei.content2); - }, - content2() { - "step 0"; - event.count = 0; - event.stat = true; - event.current = event["player" + event.stat]; - game.countPlayer2(function (current) { - if (current != event.playertrue && current != event.playerfalse) - current.addSkill("saya_nodis"); - }); - event.playertrue.addSkill("saya_judge"); - "step 1"; - event.count++; - event.current.phase().set("type", "saya_powei"); - "step 2"; - if (event.count == 9 || event.playertrue.isDead() || event.playerfalse.isDead()) { - game.countPlayer2(function (current) { - current.removeSkill("saya_nodis"); - current.removeSkill("saya_judge"); - }); - } else { - event.stat = !event.stat; - event.current = event["player" + event.stat]; - event.goto(1); - } - }, - }, - saya_nodis: { - group: "undist", - mark: true, - intro: { content: "不计入距离和座次的计算" }, - }, - saya_judge: { - trigger: { player: "phaseBegin" }, - forced: true, - popup: false, - filter(event, player) { - return event.type == "saya_powei" && player == event.getParent().playertrue; - }, - content() { - "step 0"; - player.judge(function (card) { - return get.color(card) == "red" ? 5 : 0; - }).judge2 = function (result) { - return result.bool ? true : false; - }; - "step 1"; - if (result.bool) { - player.line(trigger.getParent().playerfalse); - trigger.getParent().playerfalse.damage(); - } - }, - }, - saya_shouji: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter(event, player) { - return event.cards.filterInD().length > 0; - }, - usable: 1, - async cost(event, trigger, player) { - const goon = (function () { - var num = 0; - var cards = trigger.cards.filterInD(); - for (var i = 0; i < cards.length; i++) { - num += player.getUseValue(cards[i]); - } - return ( - player.countCards("h", function (card) { - return player.getUseValue(card, null, true) > num; - }) == 0 - ); - })(); - event.result = await player - .chooseTarget(get.prompt2("saya_shouji"), lib.filter.notMe) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - var player = _status.event.player; - var cards = _status.event.getTrigger().cards.filterInD(); - var att = get.attitude(player, target); - var num = 0; - for (var i = 0; i < cards.length; i++) { - num += target.getUseValue(cards[i]); - } - return Math.max(num, 0.1) * att; - }) - .set("goon", goon) - .forResult(); - }, - content() { - "step 0"; - event.cards = trigger.cards.filterInD(); - var target = targets[0]; - event.target = target; - target.gain(event.cards, "gain2", "log"); - "step 2"; - target.chooseToUse({ - cards: cards, - filterCard(card) { - if ( - get.itemtype(card) != "card" || - !_status.event.cards || - !_status.event.cards.includes(card) - ) - return false; - return lib.filter.filterCard.apply(this, arguments); - }, - prompt: "是否使用得到的牌中的一张?", - }); - "step 3"; - if (result.bool) player.draw(); - }, - }, - haruka_shuangche: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return !player.hasSkill("haruka_kanata"); - }, - chooseButton: { - dialog(event, player) { - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (name == "boss_mengpohuihun") continue; - if (name == "sha") { - list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) list.push(["基本", "", name, j]); - } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); - else if (get.type(name) == "basic") list.push(["基本", "", name]); - } - return ui.create.dialog("双掣", [list, "vcard"]); - }, - filter(button, player) { - return _status.event - .getParent() - .filterCard({ name: button.link[2] }, player, _status.event.getParent()); - }, - check(button) { - var player = _status.event.player; - if (player.countCards("h", button.link[2]) > 0) return 0; - if (["wugu", "zhulu_card"].includes(button.link[2])) return 0; - var effect = player.getUseValue(button.link[2]); - if (effect > 0) return effect; - return 0; - }, - backup(links, player) { - return { - audio: "haruka_shuangche", - filterCard() { - return false; - }, - selectCard: -1, - popname: true, - check(card) { - return 6 - get.value(card); - }, - position: "he", - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - }, - }; - }, - prompt(links, player) { - return ( - "请选择" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "的目标" - ); - }, - }, - ai: { - order: 1, - result: { - player(player) { - var cards = player.getCards("he").sort(function (a, b) { - return get.value(a) - get.value(b); - }); - var num = (player.getStat("skill").haruka_shuangche || 0) + 1; - if (player.needsToDiscard() >= num) return 1; - if (player.hp > 2) return 1; - if (cards.length >= num) { - var val = 0; - for (var i = 0; i < cards.length; i++) { - val += get.value(cards[i]); - } - return 12 - val; - } - return 0; - }, - }, - fireAttack: true, - }, - group: "kanata_shuangche", - }, - kanata_shuangche: { - trigger: { player: "useCardAfter" }, - forced: true, - filter(event, player) { - return event.skill == "haruka_shuangche_backup"; - }, - content() { - "step 0"; - var num = player.getStat("skill").haruka_shuangche || 1; - player - .chooseToDiscard( - "###双掣:请选择一项###选择弃置" + - get.cnNumber(num) + - "张牌,或失去1点体力且令〖双掣〗失效至回合结束", - num, - "he" - ) - .set("ai", function (card) { - var total = 12; - for (var i = 0; i < ui.selected.cards.length; i++) { - total -= get.value(ui.selected.cards[i]); - } - return total - get.value(card); - }); - "step 1"; - if (!result.bool) { - player.addTempSkill("haruka_kanata"); - player.loseHp(); - } - }, - }, - haruka_kanata: { charlotte: true }, - tsumugi_mugyu: { - audio: 5, - trigger: { target: "useCardToTargeted" }, - frequent: true, - filter(event, player) { - return player.countCards("h") < player.maxHp; - }, - content() { - player.draw(); - }, - }, - tsumugi_huilang: { - trigger: { player: "phaseEnd" }, - charlotte: true, - line: { color: [253, 198, 116] }, - filter(event, player) { - return player.countCards("he") > 0; - }, - async cost(event, trigger, player) { - event.result = await player - .chooseCard("he", [1, player.countCards("he")], get.prompt2("tsumugi_huilang")) - .set("ai", function (card) { - if (get.position(card) != "h") return -1; - if (!["shan", "wuxie", "caochuan"].includes(get.name(card))) return 9; - return 5 - get.value(card); - }) - .forResult(); - }, - async content(event, trigger, player) { - const cards = event.cards; - player.addSkill("tsumugi_huilang2"); - player.addToExpansion("giveAuto", cards, player).gaintag.add("tsumugi_huilang2"); - }, - }, - tsumugi_huilang2: { - charlotte: true, - marktext: "隐", - intro: { content: "隐藏于回廊之牌", markcount: "expansion" }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - trigger: { player: "phaseBegin" }, - forced: true, - filter(event, player) { - return player.getExpansions("tsumugi_huilang2").length > 0; - }, - content() { - "step 0"; - var cards = player.getExpansions("tsumugi_huilang2"); - event.num = cards.length; - player.gain(cards, "draw"); - "step 1"; - player - .chooseTarget([1, num], "是否令至多" + get.cnNumber(num) + "名角色各摸一张牌?") - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - var targets = result.targets; - player.line(targets, lib.skill.tsumugi_huilang.line); - targets.sortBySeat(); - game.asyncDraw(targets); - } else event.finish(); - "step 3"; - game.delay(); - }, - }, - yui_jiang: { - shaRelated: true, - audio: 2, - audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - filter(event, player) { - if ( - !( - event.card.name == "juedou" || - (event.card.name == "sha" && get.color(event.card) == "red") - ) - ) - return false; - return player == event.target || event.getParent().triggeredTargets3.length == 1; - }, - frequent: true, - content() { - player.draw(); - }, - ai: { - effect: { - target(card, player, target) { - if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; - }, - player(card, player, target) { - if (card.name == "sha" && get.color(card) == "red") return [1, 1]; - }, - }, - }, - }, - yui_lieyin: { - trigger: { player: "phaseUseBegin" }, - locked: true, - async cost(event, trigger, player) { - const list = []; - if (player.storage._ichiban_no_takaramono) list.push("cancel2"); - const { control, index } = await player - .chooseControl(...list) - .set("choiceList", [ - "令此阶段内的所有红色牌视为【杀】", - "令此阶段内的所有【杀】视为【决斗】", - ]) - .set( - "prompt", - player.storage._ichiban_no_takaramono - ? get.prompt("yui_lieyin") - : "烈音:请选择一项" - ) - .set("ai", function () { - var player = _status.event.player; - var shas = player.countCards("h", "sha"); - if (shas > 0) { - if ( - game.hasPlayer(function (current) { - return ( - get.attitude(player, current) < 0 && - player.canUse("juedou", current) && - !current.hasSha() && - get.effect(current, { name: "juedou" }, player, player) > 0 - ); - }) - ) - return 1; - if (player.storage._ichiban_no_takaramono) return "cancel2"; - } - if ( - player.countCards("h", function (card) { - return ( - get.color(card) == "red" && - card.name != "sha" && - player.hasValueTarget(card) - ); - }) == 0 - ) - return 0; - if (player.storage._ichiban_no_takaramono) return "cancel2"; - return 1; - }) - .forResult(); - if (control !== "cancel2") { - event.result = { - bool: true, - cost_data: { index }, - }; - } - }, - async content(event, trigger, player) { - player.addTempSkill(`yui_lieyin${event.cost_data.index}`, "phaseUseEnd"); - }, - }, - yui_lieyin0: { - mod: { - cardname(card) { - if (get.color(card) == "red") return "sha"; - }, - }, - }, - yui_lieyin1: { - mod: { - cardname(card) { - if (card.name == "sha") return "juedou"; - }, - }, - }, - yui_takaramono: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - unique: true, - juexingji: true, - skillAnimation: true, - animationColor: "key", - filter(event, player) { - var num = 0; - if (player.hp <= 1) num++; - if (game.dead.length > 0) num++; - if (num != 1) return num > 1; - var draw = 0; - player.getAllHistory("gain", function (evt) { - if (evt.getParent(2).name == "yui_jiang") draw += evt.cards.length; - }); - return draw >= 3; - }, - content() { - player.awakenSkill("yui_takaramono"); - player.addSkills("yui_yinhang"); - player.storage._ichiban_no_takaramono = true; - player.gainMaxHp(); - player.recover(); - }, - derivation: "yui_yinhang", - }, - yui_yinhang: { - trigger: { player: "changeHp" }, - locked: true, - getIndex: (event) => Math.abs(event.num), - line: { color: [253, 153, 182] }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget([1, 2], get.prompt("yui_yinhang"), "令至多两名角色各摸一张牌") - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .forResult(); - }, - async content(event, trigger, player) { - const targets = event.targets; - targets.sortBySeat(); - game.asyncDraw(targets); - }, - }, - yoshino_jueyi: { - trigger: { player: "phaseUseBegin" }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(lib.filter.notMe, get.prompt2("yoshino_jueyi")) - .set("ai", function (target) { - var player = _status.event.player; - if (get.damageEffect(target, player, player) < 0) return 0; - var att = get.attitude(player, target); - if (att > 0) return 0; - if (att == 0) return 0.1; - var eff = 0; - var hs = player.getCards("h"); - for (var i = 0; i < hs.length; i++) { - if (player.canUse(hs[i], target)) { - var eff2 = get.effect(target, hs[i], player, player); - if (eff2 > 0) eff += eff2; - } - } - return -att / (1 + eff); - }) - .forResult(); - }, - content() { - "step 0"; - var target = targets[0]; - event.target = target; - player.draw(); - "step 1"; - player.chooseToPSS(target); - "step 2"; - if (result.tie) event.goto(1); - else if (result.bool) target.damage(); - else target.addTempSkill("yoshino_fail", "phaseUseEnd"); - }, - }, - yoshino_fail: { - mod: { - targetEnabled(card, player, target) { - if (player == _status.currentPhase) return false; - }, - }, - }, - kengo_weishang: { - locked: false, - mod: { - cardUsable(card, player, num) { - if (card.name == "sha" && player.hasDisabledSlot(1)) return num + 1; - }, - globalFrom(from, to, distance) { - if (from.hasDisabledSlot(4)) return distance - 1; - }, - globalTo(from, to, distance) { - if (to.hasDisabledSlot(3)) return distance + 1; - }, - }, - enable: "phaseUse", - usable: 1, - filter(event, player) { - var list = ["equip1", "equip2", "equip3", "equip4", "equip5"]; - for (var i = 0; i < list.length; i++) { - if ( - player.hasEnabledSlot(list[i]) && - (!player.storage.kengo_guidui2 || !player.storage.kengo_guidui2.includes(list[i])) - ) - return true; - } - return false; - }, - content() { - "step 0"; - var list = ["equip1", "equip2", "equip3", "equip4", "equip5"]; - for (var i = 0; i < list.length; i++) { - if ( - !player.hasEnabledSlot(list[i]) || - (player.storage.kengo_guidui2 && player.storage.kengo_guidui2.includes(list[i])) - ) - list.splice(i--, 1); - } - player.chooseControl(list).set("prompt", "请选择废除一个装备栏").ai = function () { - if ( - list.includes("equip1") && - player.hasEmptySlot("equip1") && - player.countCards("h", function (card) { - return card.name == "sha" && player.getUseValue(card) > 0; - }) - ) - return "equip1"; - if (list.includes("equip3") && player.hasEmptySlot("equip3")) return "equip3"; - if (list.includes("equip4") && player.hasEmptySlot("equip4")) return "equip4"; - if (list.includes("equip5") && player.hasEmptySlot("equip5")) return "equip5"; - if (list.includes("equip2") && player.hasEmptySlot("equip2")) return "equip2"; - return list.randomGet(); - }; - "step 1"; - player.disableEquip(result.control); - player.draw(2); - }, - group: ["kengo_weishang_sha", "kengo_weishang_shan"], - ai: { - order: 10, - result: { player: 1 }, - }, - }, - kengo_weishang_sha: { - trigger: { player: "useCardToPlayered" }, - forced: true, - filter(event, player) { - return ( - event.card.name == "sha" && - player.hasDisabledSlot(1) && - event.target.countCards("he") > 0 - ); - }, - logTarget: "target", - content() { - trigger.target.chooseToDiscard("he", true); - }, - }, - kengo_weishang_shan: { - enable: ["chooseToUse", "chooseToRespond"], - viewAs: { name: "shan" }, - filterCard: true, - position: "hes", - prompt: "将一张牌当做闪使用或打出", - viewAsFilter(player) { - return player.hasDisabledSlot(2) && player.countCards("hes") > 0; - }, - check(card) { - return 1 / Math.max(0.1, get.value(card)); - }, - ai: { - respondShan: true, - skillTagFilter(player) { - return player.hasDisabledSlot(2) && player.countCards("he") > 0; - }, - }, - }, - kengo_guidui: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter(event, player) { - return player.countDisabledSlot() > 0; - }, - content() { - var list = []; - for (var i = 1; i <= 5; i++) { - for (var j = 0; j < player.countDisabledSlot(i); j++) { - list.push("equip" + i); - } - } - player.enableEquip(list); - if (!player.storage.kengo_guidui2) player.storage.kengo_guidui2 = []; - player.storage.kengo_guidui2.addArray(list); - }, - }, - kengo_guidui2: { onremove: true }, - iwasawa_yinhang: { - trigger: { player: "changeHp" }, - locked: true, - line: { color: [235, 96, 138] }, - getIndex: (event) => Math.abs(event.num), - async cost(event, trigger, player) { - event.result = await player - .chooseTarget([1, 2], get.prompt("iwasawa_yinhang"), "令至多两名角色各摸一张牌") - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .forResult(); - }, - async content(event, trigger, player) { - const targets = event.targets; - targets.sortBySeat(); - game.asyncDraw(targets); - }, - }, - iwasawa_mysong: { - trigger: { - player: ["phaseBeginStart", "phaseAfter", "dyingBefore"], - }, - forced: true, - filter(event, player) { - return event.name == "dying" || player.hp < 1; - }, - content() { - if (trigger.name == "dying") trigger.cancel(); - else if (event.triggername == "phaseBeginStart") player.addTempSkill("iwasawa_fenyin"); - else player.die(); - }, - nobracket: true, - derivation: "iwasawa_fenyin", - }, - iwasawa_refenyin: { - audio: 2, - audioname2: { - wufan: "refenyin_wufan", - }, - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "equipAfter"], - }, - forced: true, - filter(event, player) { - if (player != _status.currentPhase) return false; - var cards = event.getd(); - var list = []; - for (var i = 0; i < cards.length; i++) { - var card = cards[i]; - list.add(card.suit); - } - game.getGlobalHistory("cardMove", function (evt) { - if ( - evt == event || - evt.getParent() == event || - (evt.name != "lose" && evt.name != "cardsDiscard") - ) - return false; - if (evt.name == "lose" && evt.position != ui.discardPile) return false; - for (var i = 0; i < evt.cards.length; i++) { - var card = evt.cards[i]; - list.remove(card.suit); - } - }); - return list.length > 0; - }, - content() { - var list = []; - var list2 = []; - var cards = trigger.getd(); - for (var i = 0; i < cards.length; i++) { - var card = cards[i]; - var suit = card.suit; - list.add(suit); - list2.add(suit); - } - game.getGlobalHistory("cardMove", function (evt) { - if ( - evt == trigger || - evt.getParent() == trigger || - (evt.name != "lose" && evt.name != "cardsDiscard") - ) - return false; - if (evt.name == "lose" && evt.position != ui.discardPile) return false; - for (var i = 0; i < evt.cards.length; i++) { - var card = evt.cards[i]; - var suit = card.suit; - list.remove(suit); - list2.add(suit); - } - }); - list2.sort(); - player.draw(list.length); - player.storage.iwasawa_refenyin_mark = list2; - player.addTempSkill("iwasawa_refenyin_mark"); - player.markSkill("iwasawa_refenyin_mark"); - }, - subSkill: { - mark: { - onremove: true, - intro: { - content(s) { - var str = "本回合已经进入过弃牌堆的卡牌的花色:"; - for (var i = 0; i < s.length; i++) { - str += get.translation(s[i]); - } - return str; - }, - }, - }, - }, - }, - iwasawa_fenyin: { - mod: { - aiOrder(player, card, num) { - if (typeof card == "object" && player == _status.currentPhase) { - var evt = player.getLastUsed(); - if ( - evt && - evt.card && - get.color(evt.card) != "none" && - get.color(card) != "none" && - get.color(evt.card) != get.color(card) - ) { - return num + 10; - } - } - }, - }, - audio: 2, - trigger: { player: "useCard" }, - frequent: true, - //usable:3, - filter(event, player) { - if (_status.currentPhase != player) return false; - var evt = player.getLastUsed(1); - if (!evt) return false; - var color1 = get.color(evt.card); - var color2 = get.color(event.card); - return color1 && color2 && color1 != "none" && color2 != "none" && color1 != color2; - }, - content() { - player.draw(); - }, - ai: { - threaten(player, target) { - if (target.hp < 1) return 3; - return 1; - }, - }, - }, - masato_baoquan: { - trigger: { source: "damageBefore" }, - forced: true, - content() { - "step 0"; - player - .chooseControl("防止伤害", "增加伤害") - .set( - "prompt", - "暴拳:防止即将对" + - get.translation(trigger.player) + - "造成的伤害,或失去1点体力上限并令此伤害+2" - ) - .set("choice", get.attitude(player, trigger.player) >= 0 ? 0 : 1) - .set("ai", function () { - return _status.event.choice; - }); - "step 1"; - if (result.control == "增加伤害") { - player.loseMaxHp(); - trigger.num += 2; - } else trigger.cancel(); - }, - ai: { - effect: { - player(card, player, target) { - if (target && get.attitude(player, target) > 0 && get.tag(card, "damage")) - return "zeroplayertarget"; - }, - }, - }, - }, - yusa_yanyi: { - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return get.distance(player, target) <= player.hp; - }, - selectTarget() { - return [1, Math.max(_status.event.player.getAttackRange())]; - }, - line: "thunder", - content() { - "step 0"; - if (target.isHealthy()) { - player.draw(); - event.finish(); - } else { - var name = get.translation(player); - target - .chooseControl() - .set("choiceList", [ - "令" + name + "摸一张牌", - "回复1点体力,然后交给" + name + "一张牌", - ]) - .set("ai", function () { - return 1; - }); - } - "step 1"; - if (result.index == 0) { - player.draw(); - event.finish(); - } else { - target.recover(); - } - "step 2"; - if (target != player && target.countCards("he") > 0) { - target.chooseCard("交给" + get.translation(player) + "一张牌", "he", true); - } else event.finish(); - "step 3"; - target.give(result.cards, player, "giveAuto"); - }, - ai: { - order: 10, - result: { - player(player, target) { - return target.isHealthy() ? 1 : 0; - }, - target(player, target) { - if (target.isHealthy()) return 0; - return get.recoverEffect(target, player, target); - }, - }, - }, - }, - yusa_misa: { - charlotte: true, - trigger: { player: "useSkillAfter" }, - filter(event, player) { - return ( - event.skill == "yusa_yanyi" && - !player.storage.dualside_over && - Array.isArray(player.storage.dualside) - ); - }, - content() { - player.turnOver(); - }, - }, - misa_yusa: { - charlotte: true, - trigger: { player: "misa_yehuoAfter" }, - filter(event, player) { - return ( - event.bool === true && - !player.storage.dualside_over && - Array.isArray(player.storage.dualside) - ); - }, - content() { - player.turnOver(); - }, - }, - misa_yehuo: { - charlotte: true, - trigger: { global: "phaseDrawBegin1" }, - locked: true, - line: { color: [236, 137, 52] }, - filter(event, player) { - var target = event.player; - return player.inRange(target) && player.countCards("he") >= get.distance(player, target); - }, - async cost(event, trigger, player) { - var next = player.chooseToDiscard( - "he", - get.distance(player, trigger.player) || 1, - get.prompt2("misa_yehuo", trigger.player), - "chooseonly" - ); - next.set("ai", function (card) { - var val = _status.event.val; - for (var i = 0; i < ui.selected.cards.length; i++) { - val -= get.value(ui.selected.cards[i]); - } - return val - get.value(card); - }); - next.set("val", -2 * get.attitude(player, trigger.player)); - event.result = await next.forResult(); - }, - logTarget: "player", - content() { - "step 0"; - player.discard(cards); - "step 1"; - event.bool = true; - if (trigger.numFixed) event._result = { index: 0 }; - else if (trigger.player.isIn()) { - var name = get.translation(trigger.player); - player - .chooseControl() - .set("choiceList", [ - "对" + name + "造成1点火属性伤害", - "令" + name + "此出牌阶段的额定摸牌数改为0", - ]); - } else event.finish(); - "step 2"; - if (result.index == 0) trigger.player.damage("fire"); - else trigger.changeToZero(); - }, - ai: { - fireAttack: true, - }, - }, + nsqiyue: { trigger: { global: [ @@ -12602,735 +4126,6 @@ game.import("character", function () { return !event.player.isTurnedOver() || get.attitude(player, event.player) > 0; }, }, - yukine_wenzhou: { - trigger: { global: "phaseUseBegin" }, - filter(event, player) { - return event.player.countCards("he") > 0; - }, - async cost(event, trigger, player) { - event.forceDie = true; - var ask = trigger.player.chooseCard("he", get.prompt("yukine_wenzhou")); - if (player === trigger.player) { - ask.set( - "prompt2", - "选择一张牌,然后从牌堆中获得一张与此牌类型相同的牌。本回合内使用与此牌类型相同的牌时不可被其他角色响应。" - ); - } else - ask.set( - "prompt2", - "将一张牌交给" + - get.translation(player) + - "然后其可以选择:交给你一张牌;或令你从牌堆中获得一张与此牌类型相同的牌,且你本回合内使用与此牌类型相同的牌时不可被响应。" - ); - ask.set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) - return 10 - get.value(card); - return -1; - }); - event.result = await ask.forResult(); - }, - content() { - "step 0"; - event.forceDie = true; - event.type = get.type(cards[0], "trick"); - if (trigger.player != player) trigger.player.give(cards, player, "giveAuto"); - "step 1"; - if (player == trigger.player || player.countCards("he") == 0) { - event._result = { index: 1 }; - } else { - player - .chooseControl() - .set("choiceList", [ - "将一张牌交给" + get.translation(trigger.player), - "令" + - get.translation(trigger.player) + - "从牌堆中获得一张" + - get.translation(event.type) + - "牌,且其本回合内使用与此牌名称相同的牌时不可被响应", - ]) - .set("forceDie", true) - .set("ai", function () { - if (get.attitude(_status.event.player, _status.event.getTrigger().player) > 0) - return 1; - return 0; - }); - } - "step 2"; - event.index = result.index; - if (result.index == 1) { - var magic = get.cardPile2(function (card) { - return get.type(card, "trick") == event.type; - }); - if (magic) { - trigger.player.addTempSkill("yukine_magic", "phaseUseEnd"); - trigger.player.storage.yukine_magic.add(magic.name); - trigger.player.gain(magic, "draw"); - } else event.finish(); - } else - player - .chooseCard("he", true, "选择要交给" + get.translation(trigger.player) + "的牌") - .set("ai", function (card) { - return -get.value(card, _status.event.getTrigger().player); - }); - "step 3"; - if (event.index == 1) game.updateRoundNumber(); - else if (result.bool) player.give(result.cards, trigger.player, "giveAuto"); - }, - }, - yukine_magic: { - trigger: { player: "useCard" }, - forced: true, - popup: false, - charlotte: true, - filter(event, player) { - return ( - player.storage.yukine_magic && player.storage.yukine_magic.includes(event.card.name) - ); - }, - content() { - trigger.directHit.addArray( - game.filterPlayer(function (current) { - if (player != current) return true; - return !player.hasSkill("yukine_wenzhou"); - }) - ); - }, - onremove: true, - init(player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return ( - player.storage.yukine_magic && player.storage.yukine_magic.includes(arg.card.name) - ); - }, - }, - }, - komari_tiankou: { - trigger: { - player: "useCard2", - target: "useCardToTarget", - }, - forced: true, - filter(event, player, name) { - if (name == "useCardToTarget" && player == event.player) return false; - if (get.color(event.card) != "red") return false; - if (get.tag(event.card, "damage")) return false; - return ["basic", "trick"].includes(get.type(event.card)); - }, - content() { - "step 0"; - var info = get.info(trigger.card); - var bool = true; - if (info.multitarget || info.allowMultiple === false) bool = false; - else { - var list = game.filterPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.targetEnabled2(trigger.card, trigger.player, current) - ); - }); - if (!list.length) bool = false; - } - if (bool) - player - .chooseTarget( - "甜口:为" + - get.translation(trigger.card) + - "增加一个额外目标,或点【取消】摸一张牌。", - function (candy, komari, rin) { - return _status.event.rin_chan.includes(rin); - } - ) - .set("rin_chan", list) - .set("ai", function (target) { - var evt = _status.event; - return get.effect(target, evt.candy, evt.source, evt.player); - }) - .set("candy", trigger.card) - .set("", trigger.player); - else event._result = { bool: false }; - "step 1"; - if (result.bool) { - var rin = result.targets[0]; - trigger.targets.push(rin); - player.line(rin, { color: [255, 224, 172] }); - } else player.draw(); - }, - }, - komari_xueshang: { - trigger: { global: "die" }, - forced: true, - skillAnimation: true, - chargingSkill: true, - filter(event, player) { - return player.hp > 0; - }, - animationColor: "metal", - content() { - "step 0"; - player.addSkill("riki_xueshang"); - var map = {}; - var list = []; - for (var i = 1; i <= player.hp; i++) { - var cn = get.cnNumber(i, true); - map[cn] = i; - list.push(cn); - } - event.map = map; - player - .chooseControl(list, function () { - return "一"; - }) - .set("prompt", "血殇:请选择自己受到的伤害的点数"); - "step 1"; - var num = event.map[result.control] || 1; - event.num = num > 1 ? 2 : 1; - event.list = game - .filterPlayer(function (current) { - return current != player; - }) - .sortBySeat(); - player.damage(num); - player.line(event.list, { color: [255, 224, 172] }); - "step 2"; - if (!player.hasSkill(event.name)) return; - else { - event.list.shift().damage(num); - if (event.list.length) event.redo(); - } - }, - }, - riki_xueshang: { - trigger: { global: "dying" }, - forced: true, - popup: false, - charlotte: true, - filter(event, player) { - return ( - event.getParent(2).name == "komari_xueshang" && event.getParent(2).player == player - ); - }, - content() { - player.removeSkills("komari_xueshang"); - player.gainMaxHp(true); - player.recover(); - }, - }, - umi_chaofan: { - enable: "phaseUse", - usable: 1, - selectCard: 2, - complexCard: true, - filter(summer, umi) { - return umi.countCards("h") > 1; - }, - check(ingredient) { - return 7 - get.value(ingredient); - }, - filterCard(ingredient) { - if (ui.selected.cards.length) - return get.suit(ingredient) != get.suit(ui.selected.cards[0]); - return true; - }, - line: { color: [251, 193, 217] }, - filterTarget: lib.filter.notMe, - content() { - "step 0"; - player.draw(); - "step 1"; - if (player.hp > 2) target.recover(); - else if (player.hp == 2) target.draw(2); - else target.damage("fire", "nosource"); - }, - ai: { - order: 2, - result: { - target(umi, takahara) { - if (umi.hp > 2 && takahara.isDamaged()) return 2.2; - if (umi.hp == 2 && !takahara.hasSkillTag("nogain")) return 2; - if (umi.hp < 2) return get.damageEffect(takahara, umi, umi, "fire"); - }, - }, - }, - }, - umi_lunhui: { - trigger: { global: "phaseAfter" }, - filter(summer, umi) { - return summer.player != umi && umi.countCards("h") < umi.hp; - }, - line: { color: [251, 193, 217] }, - logTarget: "player", - charlotte: true, - content() { - "step 0"; - player.loseHp(); - "step 1"; - player.draw(2); - player.insertPhase(); - player.storage.umi_shiroha = trigger.player; - player.addTempSkill("umi_shiroha"); - }, - }, - umi_shiroha: { - mark: "character", - intro: { - content: "到$的距离视为1", - }, - onremove: true, - charlotte: true, - mod: { - globalFrom(umi, shiroha) { - if (umi.storage.umi_shiroha == shiroha) return -Infinity; - }, - }, - }, - umi_qihuan: { - enable: "chooseToUse", - filter(summer, umi) { - return summer.type == "dying" && umi.isDying(); - }, - limited: true, - skillAnimation: true, - charlotte: true, - animationColor: "key", - content() { - "step 0"; - player.awakenSkill("umi_qihuan"); - player.reinitCharacter("key_umi", "key_umi2", false); - player.recover(game.countGroup() || 1); - if (!game.dead.length) event.finish(); - "step 1"; - var chara = []; - var skills = []; - for (var i = 0; i < game.dead.length; i++) { - var name = game.dead[i].name; - var name2 = game.dead[i].name2; - var skill = []; - if (name && lib.character[name]) skill.addArray(lib.character[name][3]); - if (name2 && lib.character[name2]) skill.addArray(lib.character[name2][3]); - if (skill.length) { - chara.push(game.dead[i]); - skills.push(skill); - } - } - if (!chara.length) event.finish(); - event.chara = chara; - event.skills = skills; - event.chosen = []; - "step 2"; - var next = player.chooseTarget("是否获得一名已死亡角色的一个技能?"); - next.set("chara", event.chara); - next.set("skills", event.skills); - next.set("chosen", event.chosen); - next.set("filterTarget", function (card, player, target) { - if (target.isAlive()) return false; - var evt = _status.event; - if (!evt.chosen.length) return true; - var skills = evt.skills[evt.chara.indexOf(target)]; - if (skills.length == 1 && skills[0] == evt.chosen[0]) return false; - return true; - }); - next.set("deadTarget", true); - next.set("ai", function () { - return Math.random(); - }); - "step 3"; - if (!result.bool) event.finish(); - else { - event.temp = result.targets[0]; - var list = event.skills[event.chara.indexOf(result.targets[0])]; - result.targets[0].line(player, { - color: [251, 193, 217], - }); - list.removeArray(event.chosen); - player.chooseControl(list).set("prompt", "选择获得一个技能"); - } - "step 4"; - //player.addSkills(result.control,get.groupnature(event.temp.group)||'key'); - player.addSkills(result.control); - var info = get.info(result.control); - if (info.zhuSkill) { - if (!player.storage.zhuSkill_umi_qihuan) player.storage.zhuSkill_umi_qihuan = []; - player.storage.zhuSkill_umi_qihuan.push(result.control); - } - event.chosen.push(result.control); - if (event.chosen.length < 2) event.goto(2); - }, - ai: { - order: 10, - save: true, - skillTagFilter(player, tag, target) { - return player == target; - }, - result: { - player: 1, - }, - }, - }, - haruko_haofang: { - mod: { - cardname(card, player, name) { - if (lib.card[card.name].type == "delay") return "wuzhong"; - }, - }, - trigger: { player: "drawBefore" }, - forced: true, - filter(event, player) { - return event.getParent().name == "wuzhong"; - }, - content() { - trigger.num += 2; - }, - }, - haruko_zhuishi: { - trigger: { global: "phaseJudgeBegin" }, - filter(misuzu) { - return misuzu.player.countCards("j") > 0; - }, - check(event, player) { - return get.attitude(player, event.player) > 1; - }, - logTarget: "player", - content() { - "step 0"; - player.gain(trigger.player.getCards("j"), trigger.player, "give", "bySelf"); - "step 1"; - if (player.hp > 1) player.loseHp(); - }, - }, - yuri_xingdong: { - audio: 3, - group: "yuri_xingdong_gain", - subSkill: { - mark: { - mark: true, - marktext: "令", - intro: { - content: "跳过下个回合的判定阶段和摸牌阶段", - }, - }, - gain: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - forced: true, - content() { - "step 0"; - var card = get.cardPile(function (card) { - return card.name == "sha" || get.type(card) == "trick"; - }); - if (card) player.gain(card, "gain2", "log"); - "step 1"; - game.updateRoundNumber(); - }, - }, - }, - enable: "phaseUse", - usable: 1, - locked: true, - filter(event, player) { - return player.countCards("h", lib.skill.yuri_xingdong.filterCard); - }, - filterCard(card) { - return card.name == "sha" || get.type(card) == "trick"; - }, - check(card) { - return 1; - }, - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: 0, - content() { - "step 0"; - player.give(cards, target); - "step 1"; - if (!target.getCards("h").includes(cards[0])) event._result = { bool: false }; - else - target.chooseUseTarget( - cards[0], - game.filterPlayer(function (current) { - return current != player; - }), - "请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段" - ); - "step 2"; - if (result.bool) game.asyncDraw([player, target]); - else { - target.addTempSkill("yuri_xingdong_mark", "phaseJudgeSkipped"); - target.skip("phaseJudge"); - target.skip("phaseDraw"); - target.addTempSkill("zhengjing3", { - player: "phaseAfter", - }); - event.finish(); - } - "step 3"; - game.delay(); - }, - ai: { - order: 12, - result: { - target(player, target) { - var card = ui.selected.cards[0]; - if (target.hasSkill("pingkou")) return 1; - if (!card) return 0; - var info = get.info(card); - if (info.selectTarget == -1) { - var eff = 0; - game.countPlayer(function (current) { - if (current != player && target.canUse(card, current)) - eff += get.effect(current, card, target, target); - }); - if (eff > 0 || get.value(card) < 3) return eff; - return 0; - } else if ( - game.hasPlayer(function (current) { - return ( - current != player && - target.canUse(card, current) && - get.effect(current, card, target, target) > 0 - ); - }) - ) - return 1.5; - else if (get.value(card) < 3) return -1; - return 0; - }, - }, - }, - }, - yuri_wangxi: { - audio: 2, - trigger: { global: "dieAfter" }, - limited: true, - mark: false, - init(player) { - if (player.hasZhuSkill("yuri_wangxi")) { - player.markSkill("yuri_wangxi"); - player.storage.yuri_wangxi = false; - } - }, - zhuSkill: true, - unique: true, - skillAnimation: true, - animationColor: "thunder", - filter(event, player) { - if (get.mode() != "identity") return false; - if (!player.hasZhuSkill("yuri_wangxi")) return false; - if (event.player.isIn()) return false; - if (event.player.identity == "mingzhong") return false; - var evt = event.getParent("yuri_xingdong"); - return evt && evt.name == "yuri_xingdong" && evt.player == player; - }, - async cost(event, trigger, player) { - event.result = await trigger.player - .chooseBool("是否发动" + get.translation(player) + "的【忘隙】?") - .set("forceDie", true) - .forResult(); - }, - logTarget: "player", - async content(event, trigger, player) { - player.awakenSkill("yuri_wangxi"); - var identity = "zhong"; - if (_status.mode == "purple") { - if (["rNei", "bNei"].includes(player.identity)) identity = player.identity; - else if (["rZhu", "rZhong", "bNei"].includes(player.identity)) identity = "rZhong"; - else identity = "bZhong"; - } - game.broadcastAll( - function (source, identity) { - if (source.node.dieidentity) { - source.node.dieidentity.innerHTML = get.translation(identity + 2); - } - source.revive(2, false); - source.identity = identity; - source.setIdentity(); - }, - trigger.player, - identity - ); - var evt = trigger.getParent("damage"); - if (evt.untrigger) evt.untrigger(false, trigger.player); - game.addVideo("setIdentity", trigger.player, "zhong"); - - await trigger.player.changeGroup(player.group); - await trigger.player.draw(); - }, - }, - nk_shekong: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - selectCard() { - if (ui.selected.targets.length) return [1, ui.selected.targets[0].countCards("he")]; - return [1, Infinity]; - }, - filterTarget(event, player, target) { - return ( - target != player && target.countCards("he") >= Math.max(1, ui.selected.cards.length) - ); - }, - check(card) { - if ( - !game.hasPlayer(function (current) { - return ( - current != _status.event.player && - get.attitude(_status.event.player, current) < 0 && - current.countCards("he") > ui.selected.cards.length - ); - }) - ) - return 0; - return 6 - get.value(card); - }, - content() { - "step 0"; - event.cardsx = cards.slice(0); - var num = get.cnNumber(cards.length); - var trans = get.translation(player); - var prompt = "弃置" + num + "张牌,然后" + trans + "摸一张牌"; - if (cards.length > 1) prompt += ";或弃置一张牌,然后" + trans + "摸" + num + "张牌"; - var next = target.chooseToDiscard(prompt, "he", true); - next.numx = cards.length; - next.selectCard = function () { - if (ui.selected.cards.length > 1) return _status.event.numx; - return [1, _status.event.numx]; - }; - next.complexCard = true; - next.ai = function (card) { - if ( - ui.selected.cards.length == 0 || - _status.event.player.countCards("he", function (cardxq) { - return get.value(cardxq) < 7; - }) >= _status.event.numx - ) - return 7 - get.value(card); - return -1; - }; - "step 1"; - if (result.bool) { - if (result.cards.length == cards.length) player.draw(); - else player.draw(cards.length); - event.cardsx.addArray(result.cards); - for (var i = 0; i < event.cardsx.length; i++) { - if (get.position(event.cardsx[i]) != "d") event.cardsx.splice(i--, 1); - } - } else event.finish(); - "step 2"; - if (event.cardsx.length) { - player.chooseButton( - ["请按顺序将卡牌置于牌堆顶(先选择的在上)", event.cardsx], - true, - event.cardsx.length - ); - } else event.finish(); - "step 3"; - if (result.bool) { - var cardsx = result.links; - while (cardsx.length) { - var card = cardsx.pop(); - card.fix(); - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - } - } - }, - ai: { - order: 10, - result: { - target: -1, - }, - }, - }, - key_huanjie: { - trigger: { player: ["drawBegin", "judgeBegin"] }, - forced: true, - silent: true, - popup: false, - lastDo: true, - filter(event) { - return event.name == "draw" || !event.directresult; - }, - content() { - if (trigger.name == "draw") { - if (trigger.bottom) trigger.bottom = false; - else trigger.bottom = true; - } else trigger.directresult = get.bottomCards()[0]; - }, - }, - lucia_duqu: { - trigger: { - player: ["damage", "loseHpBefore", "useCardBefore"], - source: "damage", - }, - forced: true, - charlotte: true, - filter(event, player, onrewrite) { - if (onrewrite == "loseHpBefore") { - return event.type == "du"; - } - return event.source != undefined && event.source != event.player; - }, - content() { - var onrewrite = event.triggername; - if (onrewrite == "loseHpBefore") { - trigger.cancel(); - player.recover(trigger.num); - } else { - var another = trigger[trigger.source == player ? "player" : "source"]; - player.line(another, { color: [220, 90, 139] }); - another.gain(game.createCard2("du"), "gain2"); - } - }, - ai: { - usedu: true, - }, - }, - lucia_zhenren: { - trigger: { global: "phaseJieshuBegin" }, - forced: true, - charlotte: true, - filter(event, player) { - return player.countCards("e") > 0; - }, - content() { - "step 0"; - var es = player.getCards("e"); - event.count = es.length; - player.discard(es); - "step 1"; - event.count--; - if ( - game.hasPlayer(function (current) { - return current.countDiscardableCards(player, "ej") > 0; - }) - ) { - player.chooseTarget( - "请选择一名角色,弃置其装备区或判定区内的一张牌。", - true, - function (card, player, target) { - return target.countDiscardableCards(player, "ej") > 0; - } - ).ai = function (target) { - var att = get.attitude(_status.event.player, target); - if (target.countCards("j") && att > 0) return att * 1.5; - return -att; - }; - } else event.finish(); - "step 2"; - if (result.bool && result.targets && result.targets.length) { - var target = result.targets[0]; - player.line(target, { color: [220, 90, 139] }); - player.discardPlayerCard(target, "ej", true); - if (event.count) event.goto(1); - } - }, - }, noname_zhuyuan: { enable: "phaseUse", position: "he", @@ -21047,602 +11842,6 @@ game.import("character", function () { ns_xinnanhua: "南华老仙", ns_luyusheng: "陆郁生", - sp_key_yuri: "SP仲村由理", - sp_key_yuri_prefix: "SP", - key_lucia: "此花露西娅", - key_kyousuke: "枣恭介", - key_yuri: "仲村由理", - key_haruko: "神尾晴子", - key_umi: "加藤うみ", - key_umi2: "鹰原羽未", - key_rei: "零", - key_komari: "神北小毬", - key_yukine: "宫泽有纪宁", - key_yusa: "西森柚咲", - key_misa: "黑羽美砂", - key_masato: "井之原真人", - key_iwasawa: "岩泽雅美", - key_kengo: "宫泽谦吾", - key_yoshino: "吉野晴彦", - key_yui: "由依", - key_tsumugi: "紬文德斯", - key_saya: "朱鹭户沙耶", - key_harukakanata: "三枝叶留佳&二木佳奈多", - key_harukakanata_ab: "三枝二木", - key_inari: "稻荷", - key_shiina: "椎名", - key_sunohara: "春原阳平&春原芽衣", - key_sunohara_ab: "阳平芽衣", - //该武将国战模式下不可用 - key_rin: "枣铃", - key_sasami: "笹濑川佐佐美", - key_akane: "千里朱音", - key_doruji: "多鲁基", - key_yuiko: "来谷唯湖", - key_riki: "直枝理树" /*+'子'*/, - key_hisako: "渕田久子", - key_hinata: "日向秀树", - key_noda: "野田", - key_tomoya: "冈崎朋也", - key_nagisa: "古河渚", - key_ayato: "直井文人", - key_ao: "空门苍", - key_yuzuru: "音无结弦", - sp_key_kanade: "SP立华奏", - sp_key_kanade_prefix: "SP", - key_mio: "西园美鱼", - key_midori: "西园美鸟", - key_kyoko: "岬镜子", - key_shizuru: "中津静流", - key_shiorimiyuki: "关根诗织&入江美雪", - key_shiorimiyuki_ab: "关根入江", - key_miki: "野村美希", - key_shiori: "美坂栞", - key_kaori: "美坂香里", - key_akiko: "水濑秋子", - key_abyusa: "游佐", - key_godan: "松下护騨", - key_yuu: "乙坂有宇", - key_ryoichi: "三谷良一", - key_kotori: "神户小鸟", - key_jojiro: "高城丈士朗", - key_shiroha: "鸣濑白羽", - key_shizuku: "水织静久", - key_hiroto: "铃木央人", - key_sakuya: "凤咲夜", - key_youta: "成神阳太", - key_rumi: "七濑留美", - key_chihaya: "凤千早", - key_yukito: "国崎往人", - key_crow: "小空", - key_asara: "井上晶", - key_kotomi: "一之濑琴美", - key_mia: "藤川米娅", - key_kano: "雾岛佳乃", - db_key_liyingxia: "李映夏", - key_erika: "苍井绘梨花", - key_satomi: "藏里见", - key_iriya: "喵呜·喵呼", - key_iriya_ab: "喵呜喵呼", - key_fuuko: "伊吹风子", - lucia_duqu: "毒躯", - lucia_duqu_info: - "锁定技,①当你对其他角色造成伤害或受到其他角色的伤害时,你令对方获得一张花色点数随机的【毒】。
    ②当你因【毒】失去体力时,你改为回复等量的体力。", - lucia_zhenren: "振刃", - lucia_zhenren_info: - "锁定技,每个结束阶段,若你的装备区内有牌,则你弃置之。然后,你依次弃置场上的X张牌。(X为你以此法弃置的牌数)", - nk_shekong: "设控", - nk_shekong_info: - "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色(不能超过该角色的牌数),然后令其选择一项:弃置一张牌并令你摸X张牌,或弃置X张牌并令你摸一张牌。然后,你将你与其弃置的且位于弃牌堆中的牌以任意顺序置于牌堆顶。", - key_huanjie: "幻界", - key_huanjie_info: "锁定技,当你进行判定或摸牌时,你改为从牌堆的另一端获取相应的牌。", - yuri_xingdong: "行动", - yuri_xingdong_info: - "锁定技,出牌阶段开始时,你获得一张【杀】或普通锦囊牌。出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", - //目标角色跳过阶段的同时 该回合不能发动〖整经(郑玄)〗 - yuri_wangxi: "忘隙", - yuri_wangxi_info: - "主公技,限定技,当有角色因你发动的【行动】而死亡后,若其身份不为【明忠】,则其可以将身份改为忠臣并重新加入游戏,然后将势力改为与你相同,将体力值回复至2点并摸一张牌。", - haruko_haofang: "豪放", - haruko_haofang_info: - "锁定技,你的延时锦囊牌视为【无中生有】。当你因执行【无中生有】的效果而摸牌时,你令摸牌数+2。", - haruko_zhuishi: "追逝", - haruko_zhuishi_info: - "一名角色的判定阶段开始时,若其判定区内有牌,则你可以获得其判定区内的所有牌。若你的体力值大于1,你失去1点体力。", - umi_chaofan: "炒饭", - umi_chaofan_info: - "出牌阶段限一次,你可以弃置两张花色不同的手牌并选择一名其他角色。你摸一张牌,若你的体力值:大于2,目标角色回复1点体力;等于2,目标角色摸两张牌;小于2,目标角色受到1点无来源且对应渠道为这两张牌的火焰伤害。", - umi_lunhui: "轮回", - umi_lunhui_info: - "一名其他角色的回合结束时,若你的手牌数小于体力值,则你可以失去1点体力。若如此做,你摸两张牌并进行一个额外回合,且你于此回合内计算与此角色的距离视为1。", - umi_shiroha: "轮回 - 延时效果", - umi_qihuan: "七幻", - umi_qihuan_info: - "限定技,当你处于濒死状态时,你可以移去此武将牌。若如此做,你回复X点体力(X为场上势力数)。然后,你可获得场上已死亡角色武将牌上的至多两个技能。", - komari_tiankou: "甜口", - komari_tiankou_info: - "锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标。", - komari_xueshang: "血殇", - komari_xueshang_info: - "锁定技,蓄能技,当有角色死亡时,你对自己造成1点伤害,然后对所有其他角色依次造成1点伤害。当有角色因此法进入濒死状态时,你加1点体力上限并回复1点体力,然后失去此技能并终止此技能的所有后续结算。", - yukine_wenzhou: "问咒", - yukine_wenzhou_info: - "一名角色的出牌阶段开始时,其可以交给你一张牌。若如此做,你选择一项:交给其一张牌,或令其从牌堆中获得一张与此牌类型相同的牌,且其于此阶段内使用与此牌牌名相同的牌时无法被响应。", - //如果对自己发动【问咒】,则自己可以响应这些牌。但其他角色发动【问咒】时,该角色自己并不能响应 - yusa_yanyi: "演艺", - yusa_yanyi_info: - "出牌阶段限一次,你可以指定至多X名与你距离不大于你的体力值的角色。这些角色选择一项:①令你摸一张牌。②回复1点体力,然后交给你一张牌。(X为你的攻击范围且至少为1)", - misa_yehuo: "业火", - misa_yehuo_info: - "一名角色的摸牌阶段开始时,若其在你的攻击范围内,你可以弃置X张牌并选择一项:①对其造成1点火属性伤害。②令其于此摸牌阶段放弃摸牌。(X为你与其的的距离)", - yusa_misa: "通灵", - yusa_misa_info: "当你发动的〖演艺〗结算完成之后,你可以将武将牌翻面。", - misa_yusa: "归魂", - misa_yusa_info: "当你发动的〖业火〗结算完成后,你可以将武将牌翻面。", - masato_baoquan: "暴拳", - masato_baoquan_info: - "锁定技,当你即将造成伤害时,你选择一项:1.令此伤害+2并减1点体力上限。2.防止此伤害。", - iwasawa_yinhang: "引吭", - iwasawa_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", - iwasawa_mysong: "My Song", - iwasawa_mysong_info: - "锁定技,当你即将进行濒死结算时,取消之。回合开始时,若你的体力值小于1,则你获得技能〖奋音〗直到回合结束。回合结束时,若你的体力值小于1,你死亡。", - iwasawa_fenyin: "奋音", - iwasawa_fenyin_info: - "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", - iwasawa_refenyin: "奋音", - iwasawa_refenyin_info: - "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。", - //卡牌花色的计算不受〖红颜〗等技能的影响 - kengo_weishang: "伪伤", - kengo_weishang_sha: "伪伤", - kengo_weishang_shan: "伪伤", - kengo_weishang_info: - "出牌阶段限一次,你可以废除一个装备栏并摸两张牌。若你的武器栏已废除,则你使用【杀】的次数上限+1,且当你使用【杀】指定目标后,目标角色弃置一张牌;若你的防具栏已废除,则你可以将一张牌当做【闪】使用或打出;若你的攻击/防御坐骑栏已废除,则你至其他角色的距离-1/其他角色至你的距离-1。", - kengo_guidui: "归队", - kengo_guidui_info: - "锁定技,准备阶段,若你有已废除的装备栏,则你恢复这些装备栏,且本局游戏内发动【伪伤】时不能废除这些装备栏。", - yoshino_jueyi: "决义", - yoshino_jueyi_info: - "出牌阶段开始时,你可以选择一名其他角色。你摸一张牌并与其猜拳(平局则重来)。若你赢,你对其造成1点伤害。若你没赢,你本阶段内使用牌时不能指定其为目标。", - yui_jiang: "激昂", - yui_jiang_info: - "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", - yui_lieyin: "烈音", - yui_lieyin_info: - "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。", - yui_takaramono: "珍宝", - yui_takaramono_info: - "觉醒技,准备阶段,若你满足以下条件中的至少两个:①体力值不大于1;②场上有已死亡的角色;③已因〖激昂〗累计获得过至少三张牌;则你获得技能〖引吭〗,将〖烈音〗描述中的「你选择」改为「你可选择」,然后加1点体力上限并回复1点体力。", - //ユイ/孙笨双将组合时,孙笨的〖激昂〗不计入〖珍宝〗的次数统计 - yui_yinhang: "引吭", - yui_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", - tsumugi_mugyu: "姆啾", - tsumugi_mugyu_info: "当你成为牌的目标后,若你的手牌数小于体力上限,则你可以摸一张牌。", - tsumugi_huilang: "回廊", - tsumugi_huilang2: "回廊", - tsumugi_huilang_info: - "回合结束时,你可以将任意张牌扣置于武将牌下(均称为「隐」)。回合开始时,你获得所有「隐」,然后可令等量的角色各摸一张牌。", - //〖回廊〗涉及的所有卡牌移动的结算不会触发〖良姻〗 - haruka_shuangche: "双掣", - kanata_shuangche: "双掣", - haruka_shuangche_backup: "双掣", - haruka_shuangche_info: - "出牌阶段,你可以视为使用任意基本牌或普通锦囊牌。此牌结算完成后,你选择一项:1.弃置X张牌。2.失去1点体力且本回合内不能再发动〖双掣〗。(X为你于此回合内发动过〖双掣〗的次数)", - //你不能以此法使用〖回魂〗 - saya_shouji: "授计", - saya_shouji_info: - "每回合限一次,当你使用的牌结算完成后,你可以将此牌对应的所有实体牌交给一名其他角色。其可以使用这些牌中的一张,若如此做,你摸一张牌。", - saya_powei: "破围", - saya_powei_info: - "限定技,回合结束后,你可以选择一名体力值大于你的其他角色。你与其交替进行额外回合,直到你与其中的一名角色死亡或进行到九个回合。你于回合开始时进行判定,若结果为红色,则你对其造成1点伤害。此过程中其他角色不计入距离和座次计算。", - saya_judge: "破围", - saya_nodis: "破围", - //〖破围〗不会因为〖铁骑〗无效 - inari_baiwei: "摆尾", - inari_baiwei_draw: "摆尾", - inari_baiwei_info: "你可以将一张♦牌当做任意基本牌使用或打出。此牌结算完成后,你摸一张牌。", - //你不能以此法使用【毒】 - inari_baiwei_backup: "摆尾", - inari_baiwei_sha: "摆尾", - inari_baiwei_shan: "摆尾", - inari_huhun: "狐魂", - inari_huhun_info: "锁定技,你的♣牌的花色均视为♦。你的手牌上限+1。", - shiina_qingshen: "轻身", - shiina_qingshen_info: - "当你受到或造成伤害后,你可以获得此次伤害的渠道对应的实体牌,然后将等量的牌置于你的武将牌上,称为「轻」。锁定技,你的手牌上限和攻击范围+X(X为「轻」数)。", - shiina_feiyan: "飞燕", - shiina_feiyan_info: - "一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能〖铁骑〗。", - shiina_retieji: "铁骑", - //你不能对稻荷和多鲁基发动〖飞燕〗 - sunohara_chengshuang: "成双", - sunohara_chengshuang_phase: "成双", - sunohara_chengshuang_info: "锁定技,游戏开始时,你选择你的性别。回合开始时,你可以切换你的性别。", - sunohara_tiaoyin: "挑引", - sunohara_tiaoyin_info: - "出牌阶段限一次,你可以弃置任意张花色各不相同的手牌,然后获得等量角色区域内的各一张牌。若你以此法获得了异性角色区域内的牌,则你失去1点体力。", - sunohara_jianren: "坚忍", - sunohara_jianren_info: - "当你受到伤害后,你可以令一名角色摸一张牌。若伤害无来源或来源与你性别不同,则改为摸三张牌。", - rin_baoqiu: "暴球", - rin_baoqiu_info: - "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", - sasami_miaobian: "喵变", - sasami_miaobian_info: - "当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗。", - sasami_gongqing: "公清", - sasami_gongqing_info: - "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", - sasami_funan: "复难", - sasami_funan_info: - "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", - sasami_baoqiu: "暴球", - sasami_baoqiu_info: - "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", - akane_jugu: "巨贾", - akane_jugu_info: "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", - akane_quanqing: "权倾", - akane_quanqing_info: - "出牌阶段,你可选择:1.弃置一张点数大于10的牌并对攻击范围内的一名其他角色造成1点伤害;2.弃置一张点数大于6的牌并弃置攻击范围内的一名其他角色区域内的一张牌。3.弃置一张牌并令攻击范围内的一名其他角色摸一张牌。", - akane_yifu: "蚁附", - akane_yifu2: "蚁附", - akane_yifu_info: - "主公技,其他键势力角色的出牌阶段限一次,其可交给你一张手牌。然后你摸一张牌,并将一张手牌交给该角色。", - doruji_feiqu: "肥躯", - doruji_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", - yuiko_fenglun: "锋论", - yuiko_fenglun_info: - "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本阶段内使用牌没有次数和距离限制。", - yuiko_dilve: "底略", - yuiko_dilve_info: "你可以使用牌堆底的一张牌进行拼点。当你拼点后,你可以获得两张拼点牌。", - riki_spwenji: "问计", - riki_spwenji_info: - "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", - riki_nvzhuang: "女装", - riki_nvzhuang_info: - "锁定技,此武将牌视为包含女性性别。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。", - riki_mengzhong: "梦终", - riki_mengzhong_info: - "觉醒技,准备阶段,若你已因〖问计〗获得了三张或更多的牌,则你加1点体力上限并回复1点体力,失去〖问计〗并获得〖重振〗。", - riki_chongzhen: "重振", - riki_chongzhen_info: - "出牌阶段开始时,你可以与一名角色拼点。若你赢,你获得该角色手牌区,装备区,判定区的各一张牌;若你没赢,你于此阶段内使用牌时不能指定其他角色为目标。", - hisako_yinbao: "音爆", - hisako_yinbao_info: - "当你受到伤害/回复体力后,你可以判定。若结果为♠,则你对一名其他角色造成1点雷属性伤害。", - hisako_zhuanyun: "转运", - hisako_zhuanyun_info: "锁定技,你的判定会朝向对你有利的方向倾斜。", - hinata_qiulve: "球略", - hinata_qiulve_info: - "你可以将一张非基本牌当做【杀】使用或打出(无距离限制)。你以此法使用的红色【杀】不可被响应,黑色【杀】不计入使用次数限制。", - hinata_ehou: "扼喉", - hinata_ehou_info: - "其他角色对你使用的牌结算完成后,你可对其使用一张【杀】。若此【杀】造成伤害,则你摸一张牌。", - noda_fengcheng: "奉承", - noda_fengcheng_info: "锁定技,其他角色交给你牌后,其摸一张牌。", - noda_xunxin: "寻衅", - noda_xunxin2: "寻衅", - noda_xunxin_info: - "出牌阶段限X次,你可以视为对一名体力值不小于你的角色使用【决斗】。若如此做,此【决斗】结算完成后,没赢的角色交给赢的角色一张牌。(X为你的体力值)", - tomoya_shangxian: "伤弦", - tomoya_shangxian_info: - "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。", - tomoya_wangjin: "往今", - tomoya_wangjin_info: - "每项每轮各限一次。一名其他角色的回合结束时,若其:在你的攻击范围内,你可令其摸一张牌。若其的体力值小于你,则你摸一张牌,并可交给其一张牌。不在你的攻击范围内,则你摸两张牌,并令其弃置你的一张手牌。若其的体力值大于你,则你视为对其使用一张【杀】(无距离限制)。", - nagisa_tiandu: "天妒", - nagisa_tiandu_info: "当你的判定牌生效后,你可以获得此牌。", - nagisa_fuxin: "抚心", - nagisa_fuxin_info: - "当一名角色于回合外受到伤害,或其手牌被其他角色弃置或获得后,你可以令其判定。若结果为:红色,其摸一张牌。黑色,当前回合角色弃置一张牌。", - ayato_jianshen: "僭神", - ayato_jianshen_info: "锁定技,你手牌中的【杀】均视为神属性。", - ayato_zonghuan: "纵幻", - ayato_zonghuan_info: - "出牌阶段限一次,你可以观看一名其他角色的手牌,然后选择一项:将其中的一张牌置入弃牌堆,或以该角色的视角使用其中的一张,然后摸一张牌。", - ao_xishi: "习事", - ao_xishi_info: "锁定技,当你使用或打出♦牌时,或其他角色使用♦牌指定你为目标后,你摸一张牌。", - ao_kuihun: "窥魂", - ao_kuihun_info: - "其他角色进入濒死状态时,你可以摸一张牌,然后观看其手牌并将其中一张牌置于你的武将牌上,称为「蝶」。你使用与一张「蝶」花色相同的牌时无距离和次数限制。你的手牌上限+X(X为蝶数)。", - ao_shixin: "释心", - ao_shixin_info: - "觉醒技,准备阶段,若你的「蝶」中包含至少三种花色,则你加1点体力上限并回复1点体力,失去〖窥魂〗并获得〖蝶归〗。", - ao_diegui: "蝶归", - ao_diegui_backup: "蝶归", - ao_diegui_info: "出牌阶段限一次,你可以将一张「蝶」交给一名角色,该角色摸两张牌并复原武将牌。", - yuzuru_wuxin: "无心", - yuzuru_wuxin_info: - "结束阶段,你可以选择一项:失去1点体力并令一名角色摸两张牌,或弃置两张牌并回复1点体力。", - yuzuru_deyi: "得义", - yuzuru_deyi_info: - "觉醒技,当有其他角色死亡后,你减1点体力上限并回复1点体力,失去技能〖无心〗,获得技能〖往生〗〖困奋〗和〖去疾〗。", - yuzuru_wangsheng: "往生", - yuzuru_wangsheng_info: - "觉醒技,当你即将死亡时,你防止此次死亡。你可以将任意张牌交给一名其他角色,然后减1点体力上限并将体力回复至2点,修改技能〖困奋〗和〖去疾〗。", - yuzuru_kunfen: "困奋", - yuzuru_kunfen_info: - "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。", - yuzuru_quji: "去疾", - yuzuru_quji_info: - "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)", - yuzuru_kunfen_rewrite: "困奋·改", - yuzuru_kunfen_rewrite_info: "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。", - yuzuru_quji_rewrite: "去疾·改", - yuzuru_quji_rewrite_info: - "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)", - yuzuru_bujin: "步进", - yuzuru_bujin_info: "锁定技,己方其他角色计算与其他角色的距离-1且摸牌阶段的额定摸牌数+1。", - kanade_mapo: "麻婆", - kanade_mapo_info: "你可以将一张♥牌当做【麻婆豆腐】使用。你使用的【麻婆豆腐】可以多指定一个目标。", - kanade_benzhan: "奔战", - kanade_benzhan_info: - "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", - mio_tuifu: "推腐", - mio_tuifu_info: "锁定技,当一名角色对一名同性角色造成伤害时,你摸一张牌。", - mio_tishen: "替身", - mio_tishen_info: - "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鸟】。", - midori_nonghuan: "弄幻", - midori_nonghuan_info: - "出牌阶段限X次(X为你的体力值),你可以获得一名本阶段内未选择过的其他角色的区域内的一张牌。你摸一张牌,然后将一张牌交给该角色。然后你清除此技能结算过程中所有卡牌移动事件的移动记录。", - //即技能结算完成后,所有涉及到的牌移动事件不会再被getHistory获取 - midori_tishen: "替身", - midori_tishen_info: - "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鱼】。", - kyoko_juwu: "聚物", - kyoko_juwu_info: - "你的回合外,当有装备牌进入弃牌堆后,若这些牌不是从你的区域移动的,则你可以获得这些牌。", - kyoko_zhengyi: "整遗", - kyoko_zhengyi_info: - "锁定技,若你装备区的花色数:大于等于1,你视为拥有〖精策〗;大于等于2,你视为拥有〖涉猎〗:大于等于3,你视为拥有〖制衡〗;大于等于4,你将〖精策〗和〖制衡〗改为界限突破版本。", - kyoko_jingce: "精策", - kyoko_shelie: "涉猎", - kyoko_zhiheng: "制衡", - shizuru_nianli: "念力", - shizuru_nianli_info: - "每轮限一次,你可以展示一张♦/♣/♥/♠手牌,然后视为使用一张不计入次数限制和记录的雷【杀】/【闪】/【桃】/【无懈可击】。", - shizuru_benzhan: "奔战", - shizuru_benzhan_info: - "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", - shiorimiyuki_banyin: "伴音", - shiorimiyuki_banyin_info: "当你受到伤害或回复体力后,你可令一名其他角色回复1点体力。", - shiorimiyuki_tingxian: "铤险", - shiorimiyuki_tingxian_info: - "出牌阶段开始时,你可以摸至多三张牌。若如此做,你回复1点体力,且此阶段结束时你失去X点体力。(X为你得到的牌中仍在手牌区的牌的数量)", - shiorimiyuki_tingxian2: "铤险", - miki_shenqiang: "神枪", - miki_shenqiang_info: - "锁定技,游戏开始时,你将一张【海德洛格拉迪尔特·改】和一张【望远镜】置入你的装备区。你装备区内的武器牌和宝物牌不能被其他角色弃置。", - miki_huanmeng: "幻梦", - miki_huanmeng_info: - "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", - miki_zhiluo: "治裸", - miki_zhiluo_info: - "锁定技,一名其他角色的回合结束时,若其在你的攻击范围内且其装备区内没有牌,则你选择:①摸一张牌。②视为对其使用一张【杀】。", - miki_hydrogladiator: "海德洛", - miki_hydrogladiator_info: - "全名为【海德洛格拉迪尔特·改】。锁定技,当你因执行【杀】的效果而对目标角色造成伤害后,你弃置所有至目标角色距离为1的其他角色的一张牌或弃置其两张牌。", - miki_hydrogladiator_skill: "海德洛格拉迪尔特·改", - miki_binoculars: "望远镜", - miki_binoculars_info: "锁定技,其他角色的手牌对你可见。", - shiori_huijuan: "绘卷", - shiori_huijuan_discard: "绘卷", - shiori_huijuan_info: - "锁定技,其他角色的结束阶段开始时,你可以视为使用一张该角色本回合出牌阶段内使用过的基本牌或普通锦囊牌。准备阶段开始时,若你自上个回合起以此法使用的牌数不小于X,则你选择一项:①弃置装备区或判定区内的一张牌。②跳过本回合的出牌阶段。(X为场上玩家数的一半且至少为2)", - kaori_siyuan: "思愿", - kaori_siyuan_info: - "出牌阶段,你可以将一张装备牌或延时锦囊牌置于一名其他角色的装备区内,然后可以视为使用一张基本牌或普通锦囊牌。", - akiko_dongcha: "洞察", - akiko_dongcha_info_identity: - "锁定技,其他角色的手牌对你可见。游戏开始时,你令其他角色的身份牌对你可见。", - akiko_dongcha_info: "锁定技,其他角色的手牌对你可见。", - abyusa_jueqing: "绝情", - abyusa_jueqing_info: - "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。", - abyusa_jueqing_1st: "绝情", - abyusa_jueqing_rewrite: "绝情·改", - abyusa_jueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。", - abyusa_dunying: "遁影", - abyusa_dunying_info: - "锁定技,其他角色计算与你的距离时+X。准备阶段和结束阶段,你摸X张牌(X为你已损失的体力值)。", - godan_yuanyi: "远忆", - godan_yuanyi_info: - "锁定技,回合开始时,你摸X张牌并进行一个额外的出牌阶段。(X为游戏轮数且至多为3)", - godan_feiqu: "肥躯", - godan_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", - godan_xiaoyuan: "消元", - godan_xiaoyuan_info: - "觉醒技,当你扣减体力时,若你的体力值小于4,则你减3点体力上限并摸三张牌,失去【肥躯】。", - yuu_lveduo: "掠夺", - yuu_lveduo_info: - "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", - yuu_lveduo_full_info: - "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面,获得该角色武将牌上所有的带有「Charlotte」标签的技能,且该角色失去这些技能。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", - ryoichi_baoyi: "爆衣", - ryoichi_baoyi_info: - "锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①令一名其他女性角色失去1点体力。②弃置一名其他非女性角色区域内的两张牌。", - ryoichi_tuipi: "褪皮", - ryoichi_tuipi_info: - "锁定技,你不是【顺手牵羊】和【过河拆桥】的合法目标。你装备区的牌于弃牌阶段内计入手牌上限。", - kotori_yumo: "驭魔", - kotori_yumo_damage: "驭魔", - kotori_yumo_gain: "驭魔", - kotori_yumo_info: - "锁定技,游戏开始时,你获得蓝色、红色、绿色、黄色、灰色魔物各一个。当有角色受到伤害后,若你没有对应的标记,你根据其势力获得一个对应魔物:魏:蓝、蜀:红、吴:绿、群:黄、灰:晋、键:紫。回合开始时,你可以弃置一个对应的魔物并获得以下技能之一直到回合结束:蓝:魏业、红:蜀义、绿:吴耀、黄:群心、灰:晋势、紫:键魂。", - kotori_skill_wei: "魏业", - kotori_skill_wei_info: - "回合开始时,你可以弃置一张牌并指定一名其他角色,该角色须弃置一张牌,否则你摸一张牌。", - kotori_skill_shu: "蜀义", - kotori_skill_shu_info: - "你使用【杀】上限+1;出牌阶段结束时,若你于此阶段使用【杀】次数不少于2,摸一张牌。", - kotori_skill_wu: "吴耀", - kotori_skill_wu_info: "回合结束时,若你的手牌数不等于你的体力值,则你摸一张牌。", - kotori_skill_qun: "群心", - kotori_skill_qun_info: - "锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1。", - kotori_skill_key: "键魂", - kotori_skill_key_info: - "出牌阶段限一次,你可以摸一张牌并获得1点护甲。若如此做,你于当前回合结束时失去1点体力。", - kotori_skill_jin: "晋势", - kotori_skill_jin_info: - "摸牌阶段结束时,你可以展示你于此阶段内因摸牌而得到的牌。若这些牌的花色均不同,则你摸一张牌。", - kotori_yumo_wei: '魔物', - kotori_yumo_shu: '魔物', - kotori_yumo_wu: '魔物', - kotori_yumo_qun: '魔物', - kotori_yumo_key: '魔物', - kotori_yumo_jin: '魔物', - kotori_huazhan: "花绽", - kotori_huazhan_info: - "每回合每种魔物限一次,你可将一个蓝色/红色/绿色/黄色/紫色/灰色魔物当做【树上开花】使用。", - jojiro_shensu: "神速", - jojiro_shensu_info: - "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", - jojiro_shensu1: "神速", - jojiro_shensu2: "神速", - jojiro_shensu4: "神速", - jojiro_shunying: "瞬影", - jojiro_shunying_info: - "锁定技,回合结束时,若你本回合内跳过了阶段,则你选择一项:1.失去1点体力。2.移动至多X格并摸X张牌(X为你本回合内跳过的阶段数)。", - shiroha_yuzhao: "预兆", - shiroha_yuzhao_umi: "预兆", - shiroha_yuzhao_info: - "锁定技,游戏开始时,你将牌堆顶的X张牌扣置于你的武将牌上,称为「兆」。一名角色的回合开始时,若你有「兆」且其至你的距离不大于1,则你将牌堆顶的X张牌扣置为「兆」,然后将等量的「兆」置于牌堆顶。(X为势力数)", - shiroha_guying: "孤影", - shiroha_guying_info: - "锁定技,每回合限一次,当你受到伤害/对其他角色造成伤害时,你进行判定。若结果为红色/黑色,此伤害-1/+1。", - shiroha_guying_rewrite: "孤影·改", - shiroha_guying_rewrite_info: - "当你受到伤害/对其他角色造成伤害时,你可进行判定。若结果为红色/黑色,此伤害-1/+1。", - shiroha_jiezhao: "解兆", - shiroha_jiezhao_info: - "一名角色的判定牌生效前,你可打出一张「兆」代替之。当你以此法移去最后一张「兆」后,你加1点体力上限并回复1点体力,然后修改〖孤影〗并随机获得以下技能中的一个:〖炒饭〗/〖习事〗/〖呣啾〗/〖结伴〗。", - //猴年马月爆料再利用 - shizuku_sizhi: "思智", - shizuku_sizhi2: "思智", - shizuku_sizhi_info: - "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离和次数限制,红色牌本回合不计入手牌上限。", - shizuku_biyi: "避忆", - shizuku_biyi_info: - "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", - shizuku_sanhua: "散花", - shizuku_sanhua_info: "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", - hiroto_huyu: "虎驭", - hiroto_huyu2: "虎驭", - hiroto_huyu_info: - "其他角色的出牌阶段结束时,若你没有技能〖纵略〗,则其可将两张手牌交给你。若如此做,你获得〖纵略〗。你的下回合结束时,你失去〖纵略〗并将本回合内得到的所有牌交给该角色。", - hiroto_zonglve: "纵略", - hiroto_zonglve_info: - "锁定技,你的手牌上限+3。出牌阶段限一次,你可以将一张手牌背面朝下放置,并展示一名其他角色的一张手牌。若这两张牌:颜色相同,你对其造成1点伤害并弃置其展示的牌。颜色不同,你获得该角色区域内的两张牌。", - hiroto_tuolao: "脱牢", - hiroto_tuolao_info: - "觉醒技,回合结束后,若此回合不是你的第一个回合且你本轮内未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。", - sakuya_junbu: "均步", - sakuya_junbu_info: - "锁定技,若你已废除的装备栏数量:≥1,你使用牌无距离限制。≥2,你使用牌无次数限制。≥3,你使用牌时可以多指定一个目标。≥4,你使用的牌不可被响应。≥5,你使用牌造成伤害时失去1点体力,令此伤害+1。", - rumi_shuwu: "淑武", - rumi_shuwu2: "淑武", - rumi_shuwu_info: - "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。出牌阶段结束时,你令X=0,且每满足一项便令X+1:①你于本阶段内使用【杀】的次数不大于1。②你于本阶段内未使用锦囊牌造成过伤害。③你的体力值不大于3。你摸X张牌,且本回合手牌上限+X。", - chihaya_liewu: "烈武", - chihaya_liewu2: "烈武", - chihaya_liewu_info: - "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。当你首次废除最后一个装备栏后,你减4点体力上限并获得技能〖怀柔〗。", - chihaya_youfeng: "游凤", - chihaya_youfeng_info: - "转换技,阴,每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。", - chihaya_huairou: "怀柔", - chihaya_huairou_info: "出牌阶段,你可以重铸装备牌。", - yukito_kongwu: "控物", - yukito_kongwu_info: - "出牌阶段限一次,你可以表演《小空飞天》。若如此做,你从以下项目中随机选择X项,并执行其中的一项:①令一名角色摸两张牌。②对一名角色造成1点伤害。③令一名已受伤的角色回复1点体力。④弃置一名角色区域内的两张牌。⑤移动场上的一张牌。若X=0,则你弃置两张牌。(X为你的得分)", - yukito_yaxiang: "鸦翔", - yukito_yaxiang_info: - "限定技,当有角色进入濒死状态时,你可移去此武将牌,然后令该角色将体力值回复至3点,弃置判定区的所有牌并获得技能〖终愿〗。", - misuzu_zhongyuan: "终愿", - misuzu_zhongyuan_info: - "限定技。当你的判定结果生效时,你可将判定结果改为任意花色和点数并结束此时机。", - asara_shelu: "摄录", - asara_shelu_info: - "出牌阶段限一次,你可以弃置一张牌,然后展示一名其他角色的一张手牌并将其置于你的武将牌上,称为“影”。若你以此法弃置的牌和展示的牌:花色相同,则你摸两张牌。点数相同,则你回复1点体力。", - asara_yingwei: "影威", - asara_yingwei_info: - "你可以如手牌般使用或打出“影”。锁定技,当你使用“影”时,强制触发对应的应变效果。", - kotomi_qinji: "琴击", - kotomi_qinji_info: - "出牌阶段开始时,你可视为使用使用【万箭齐发】。你以此法使用【万箭齐发】造成的伤害视为失去体力。", - kotomi_chuanxiang: "传箱", - kotomi_chuanxiang2: "传箱", - kotomi_chuanxiang_info: - "其他角色的出牌阶段限一次,其可以将装备区内的一张牌移动到另一名角色的装备区内,然后你摸一张牌。若你是目标角色,则你改为摸两张牌。", - mia_shihui: "时迴", - mia_shihui_info: - "锁定技,摸牌阶段,你改为摸X+1张牌(X为你上回合弃置的牌数);结束阶段,你弃置一张牌并回复1点体力。", - mia_qianmeng: "潜梦", - mia_qianmeng_info: - "使命技。①游戏开始时,你摸一张牌,然后将一张牌置于牌堆的正中央。②使命:当有角色获得“潜梦”牌时,其将此牌交给你。你将体力值回复至上限,失去〖时迴〗并获得〖风发〗。③失败:当你死亡时,你可令一名角色获得牌堆中所有与“潜梦”牌花色点数相同的牌。", - mia_fengfa: "风发", - mia_fengfa_info: "锁定技。摸牌阶段,你多摸X张牌(X为你上回合使用过的牌数)。", - kano_liezhen: "列阵", - kano_liezhen_info: - "结束阶段,若你本回合内使用过牌且这些牌的类型:不均相同,你可视为使用【排兵布阵】或智囊;均相同,你获得仁库中的所有牌(没有则改为摸两张牌)。", - kano_paibingbuzhen: "排兵布阵", - kano_paibingbuzhen_info: - "出牌阶段,对至多三名角色使用。目标角色摸一张牌,然后将一张牌置入仁库。若仁库中的牌类型或颜色均相同,则你摸一张牌。", - kano_poyu: "破羽", - kano_poyu_info: - "当你成为【杀】或伤害性锦囊牌的目标后,若仁库中有牌,你可判定。然后你可从仁库中移去一张与此牌类型或花色相同的牌,令此牌对你无效。", - liyingxia_sanli: "三礼", - liyingxia_sanli_info: - "锁定技。其他角色于其回合内前两次使用牌指定你为目标后,你摸一张牌;第三次使用牌指定你为目标后,你交给其一张牌。", - liyingxia_zhenjun: "振军", - liyingxia_zhenjun_info: - "键势力技。结束阶段,你可以令至多X+1名角色各摸一张牌,且这些角色于自己的下个回合内第一次造成的伤害+1(X为你本回合内使用【杀】和伤害性锦囊牌的次数)。", - liyingxia_wumai: "武脉", - liyingxia_wumai_info: - "蜀势力技。一轮游戏开始时,你可以选择获得其中一个未选择过的技能直到本轮结束:〖八阵〗/〖集智〗/〖观星〗/〖游龙〗。若均已选择过,则你可以摸X张牌(X为场上已受伤的角色数且至多为3)。", - erika_shisong: "识诵", - erika_shisong_info: - "锁定技。①你的手牌上限+X(X为你的护甲数)。②当你于回合内使用第Y张牌时,若此牌与你上回合使用的第Y张牌类型相同,则你摸一张牌。", - erika_yousheng: "佑生", - erika_yousheng_info: - "使命技。①限定技。一轮游戏开始时,你可以选择至多两名其他角色。你减2点体力上限并增加3点护甲。②当你〖佑生①〗选择的角色成为【杀】或伤害类锦囊牌的目标时,你可以弃置X张牌并将此目标转移给自己(X为你本轮内发动过〖佑生②〗的次数)。此牌结算结束后,你可令一名原目标角色获得此牌。③成功:当你失去最后的护甲后,若你已发动过〖佑生①〗,则你和所有〖佑生①〗选择的角色各摸三张牌。④失败:当一名〖佑生①〗选择的角色因【杀】或伤害类锦囊牌而受到伤害时,你失去所有护甲并弃置等量的牌。", - erika_yousheng_append: - 'Death is not the end of life, but the completion of life.', - satomi_luodao: "落刀", - satomi_luodao_info: - "当你使用【杀】指定目标后,你可以展示目标角色的所有手牌。若其中:有【闪】,则你弃置其中的一张【闪】;没有【闪】,则你弃置一张牌。", - satomi_daohai: "稻海", - satomi_daohai_info: - "结束阶段,若你本回合内弃置过牌,则你可以视为使用一张【五谷丰登】。然后你可以将你于此【五谷丰登】中得到的牌当做【乐不思蜀】使用。", - satomi_daohai_append: '五穀豊穣、刈り入れ時だね!', - tenzen_fenghuan: "封还", - tenzen_fenghuan_info: - "其他角色使用的【杀】或伤害性锦囊牌结算结束后,若你是此牌的唯一目标,则你可以弃置任意张点数之和大于等于此牌点数两倍的牌,然后视为对其使用一张名称相同的牌。", - tenzen_retianquan: "天全", - tenzen_retianquan_info: - "每回合限一次。当你使用【杀】指定目标后,你可失去1点体力或弃置一张牌,然后亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。这些牌中每有一张基本牌,响应此牌所需的【闪】的数量便+1。此牌结算结束后,若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", - iriya_yinji: "殷极", - iriya_yinji_info: "锁定技。出牌阶段开始时,你将手牌摸至17张。你不能直接使用以此法得到的牌。", - iriya_haozhi: "豪掷", - iriya_haozhi_info: - "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。" + - "对子:其可以令至多两名角色各摸一张牌。" + - "三带:其可以弃置至多三名其他角色的各一张牌,然后摸一张牌。" + - "单顺:其可以弃置一名其他角色的一张牌。若其未以此法弃置过颜色相同的牌,则其可以重复此流程。然后其摸等量的牌。" + - "双顺:其可以获得一名其他角色的一张牌。若其未以此法获得过颜色相同的牌,则其可以重复此流程。然后其回复等量的体力。" + - "三顺/飞机:其可以令至多3名其他角色翻面,然后对其中一名角色造成1点火属性伤害。" + - "炸弹/四带二:其可以对一名角色造成2点雷属性伤害,然后目标角色翻面,弃置装备区的所有牌和四张手牌。", - visible_fuuko_xingdiao: '', - fuuko_xingdiao: "星雕", - fuuko_xingdiao_info: - "锁定技。游戏开始时,你将手牌摸至8张,然后将所有手牌明置(称为“星”,不计入手牌上限)。每名其他角色限一次,其可以于出牌阶段选择获得你的一张“星”,然后你摸一张牌。", - fuuko_chuanyuan: "传愿", - fuuko_chuanyuan_info: - "锁定技。当你失去一张“星”后,你回复1点体力,然后从牌堆中获得一张和“星”花色点数相同的牌(没有则改为摸一张牌,且使用此牌无距离和次数限制)。", - key_kud: "库特莉亚芙卡", kud_qiaoshou: "巧手", kud_qiaoshou_equip: "巧手", @@ -22304,95 +12503,5 @@ game.import("character", function () { diy_fakenews: "杀海流言", diy_trashbin: "垃圾桶", }, - pinyins: { - 加藤うみ: ["Kato", "Umi"], - 仲村由理: ["Nakamura", "Yuri"], - 此花露西娅: ["Konohana", "Lucia"], - 枣恭介: ["Natsume", "Kyousuke"], - 神尾晴子: ["Kamio", "Haruko"], - 神北小毬: ["Kamikita", "Komari"], - 宫泽有纪宁: ["Miyazawa", "Yukine"], - 西森柚咲: ["Nishimori", "Yusa"], - 黑羽美砂: ["Kurobane", "Misa"], - 井之原真人: ["Inohara", "Masato"], - 岩泽雅美: ["Iwasawa", "Masami"], - 宫泽谦吾: ["Miyazawa", "Kengo"], - 吉野晴彦: ["Yoshino", "Haruhiko"], - 由依: ["Yui"], - 紬文德斯: ["Tsumugi", "Wenders"], - 朱鹭户沙耶: ["Tokido", "Saya"], - "三枝叶留佳&二木佳奈多": ["Saigusa", "Haruka", "Futaki", "Kanata"], - 三枝二木: ["Saigusa", "Haruka", "Futaki", "Kanata"], - 稻荷: ["Inari"], - 椎名: ["Shiina"], - "春原阳平&春原芽衣": ["Sunohara", "Youhei", "Sunohara", "Mei"], - 阳平芽衣: ["Sunohara", "Youhei", "Sunohara", "Mei"], - 枣铃: ["Natsume", "Rin"], - 笹濑川佐佐美: ["Sasasegawa", "Sasami"], - 千里朱音: ["Senri", "Akane"], - 多鲁基: ["Dorj"], - 来谷唯湖: ["Kurugaya", "Yuiko"], - 直枝理树: ["Naoe", "Riki"], - 渕田久子: ["Fuchita", "Hisako"], - 日向秀树: ["Hinata", "Hideki"], - 野田: ["Noda"], - 冈崎朋也: ["Okazaki", "Tomoya"], - 古河渚: ["Furukawa", "Nagisa"], - 直井文人: ["Naoi", "Ayato"], - 空门苍: ["Sorakado", "Ao"], - 音无结弦: ["Otonashi", "Yuzuru"], - 立华奏: ["Tachibana", "Kanade"], - 西园美鱼: ["Nishizono", "Mio"], - 西园美鸟: ["Nishizono", "Midori"], - 岬镜子: ["Misaki", "Kyoko"], - 中津静流: ["Nakatsu", "Shizuru"], - "关根诗织&入江美雪": ["Sekine", "Shiori", "Irie", "Miyuki"], - 关根入江: ["Sekine", "Shiori", "Irie", "Miyuki"], - 野村美希: ["Nomura", "Miki"], - 美坂栞: ["Misaka", "Shiori"], - 美坂香里: ["Misaka", "Kaori"], - 水濑秋子: ["Minase", "Akiko"], - 游佐: ["Yusa"], - 松下护騨: ["Matsushita", "Godan"], - 乙坂有宇: ["Otosaka", "Yuu"], - 三谷良一: ["Mitani", "Ryoichi"], - 神户小鸟: ["Kanbe", "Kotori"], - 高城丈士朗: ["Takajyo", "Jyojirou"], - 鸣濑白羽: ["Naruse", "Shiroha"], - 水织静久: ["Mizuori", "Shizuku"], - 铃木央人: ["Suzuki", "Hiroto"], - 凤咲夜: ["Ootori", "Sakuya"], - 成神阳太: ["Narukami", "Youta"], - 七濑留美: ["Nanase", "Rumi"], - 凤千早: ["Ootori", "Chihaya"], - 国崎往人: ["Kunisaki", "Yukito"], - 井上晶: ["Inoue", "Asara"], - 一之濑琴美: ["Ichinose", "Kotomi"], - 藤川米娅: ["Fujikawa", "Mia"], - 雾岛佳乃: ["Kirishima", "Kano"], - 苍井绘梨花: ["Aoi", "Erika"], - 藏里见: ["Kura", "Satomi"], - "喵呜·喵呼": ["Myau", "Mya-fu"], - 喵呜喵呼: ["Myau", "Mya-fu"], - 伊吹风子: ["Ibuki", "Fuuko"], - 久岛鸥: ["Kushima", "Kamome"], - 库特莉亚芙卡: ["Noumi", "Kudryavka"], - 神尾观铃: ["Kamio", "Misuzu"], - 友利奈绪: ["Tomori", "Nao"], - 天王寺瑚太朗: ["Tennouji", "Kotarou"], - 藤林杏: ["Fujibayashi", "Kyou"], - 伊座并杏子: ["Izanami", "Kyouko"], - 加纳天善: ["Kano", "Tenzen"], - 冰室忧希: ["Himuro", "Yuuki"], - 露娜Q: ["Lunar", "Q"], - 远野小满: ["Toono", "Michiru"], - 远野美凪: ["Toono", "Minagi"], - 樱庭星罗: ["Sakuraba", "Seira"], - 坂上智代: ["Sakagami", "Tomoyo"], - 冈崎汐: ["Okazaki", "Ushio"], - 神山识: ["Kamiyama", "Shiki"], - 佐藤雏: ["Satou", "Hina"], - 篝: ["Kagari"], - }, }; }); diff --git a/character/key/card.js b/character/key/card.js new file mode 100644 index 000000000..64d1fc461 --- /dev/null +++ b/character/key/card.js @@ -0,0 +1,103 @@ +const cards = { + kano_paibingbuzhen: { + fullskin: true, + type: "trick", + enable: true, + filterTarget: true, + selectTarget: [1, 3], + derivation: "key_kano", + content() { + "step 0"; + target.draw(); + "step 1"; + var hs = target.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length == 1) event._result = { bool: true, cards: hs }; + else target.chooseCard("he", true, "选择一张牌置入仁库"); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + target.$throw(card, 1000); + target.lose(card, "toRenku"); + } + }, + contentAfter() { + if ( + player.isIn() && + _status.renku.length && + (function () { + var cards = _status.renku; + if (cards.length == 1) return true; + var color = get.color(cards[0], false), + type = get.type(cards[0], false); + for (var i = 1; i < cards.length; i++) { + if (color && get.color(cards[i], false) != color) color = false; + if (type && get.type(cards[i], false) != type) type = false; + if (!color && !type) return false; + } + return true; + })() + ) + player.draw(); + }, + ai: { + order: 1, + result: { + player(player, target) { + if (player.hasSkill("kano_poyu")) return 2; + return 0; + }, + target: 0.1, + }, + }, + }, + kamome_suitcase: { + fullskin: true, + type: "equip", + subtype: "equip5", + derivation: "key_kamome", + skills: ["kamome_suitcase"], + ai: { + equipValue(card) { + return 7; + }, + basic: { + equipValue: 7, + }, + }, + }, + miki_hydrogladiator: { + fullskin: true, + type: "equip", + subtype: "equip1", + derivation: "key_miki", + skills: ["miki_hydrogladiator_skill"], + distance: { + attackFrom: -5, + }, + ai: { + equipValue(card) { + return 7; + }, + basic: { + equipValue: 7, + }, + }, + }, + miki_binoculars: { + fullskin: true, + type: "equip", + subtype: "equip5", + derivation: "key_miki", + skills: ["miki_binoculars"], + ai: { + equipValue(card) { + return 7; + }, + basic: { + equipValue: 7, + }, + }, + }, +} +export default cards; \ No newline at end of file diff --git a/character/key/character.js b/character/key/character.js new file mode 100644 index 000000000..38968de1c --- /dev/null +++ b/character/key/character.js @@ -0,0 +1,86 @@ +const characters = { + sp_key_yuri: ["female", "qun", 4, ["mubing", "ziqu", "diaoling"], ["border:key"]], + key_lucia: ["female", "key", "2/3", ["lucia_duqu", "lucia_zhenren"]], + key_kyousuke: ["male", "key", 4, ["nk_shekong", "key_huanjie"]], + key_yuri: ["female", "key", 3, ["yuri_xingdong", "key_huanjie", "yuri_wangxi"], ["zhu"]], + key_haruko: ["female", "key", 4, ["haruko_haofang", "haruko_zhuishi"]], + key_umi: ["female", "key", 3, ["umi_chaofan", "umi_lunhui", "umi_qihuan"]], + key_umi2: ["female", "key", 3, [], ["unseen"]], + key_rei: ["male", "key", 4, ["xiandeng", "shulv", "xisheng"]], + key_komari: ["female", "key", 3, ["komari_tiankou", "komari_xueshang"]], + key_yukine: ["female", "key", 3, ["yukine_wenzhou"]], + key_yusa: ["female", "key", 3, ["yusa_yanyi", "yusa_misa", "dualside"], ["dualside:key_misa"]], + key_misa: ["female", "key", 3, ["misa_yehuo", "misa_yusa", "dualside"], ["unseen"]], + key_masato: ["male", "key", "4/8", ["masato_baoquan"]], + key_iwasawa: ["female", "key", 3, ["iwasawa_yinhang", "iwasawa_mysong"]], + key_kengo: ["male", "key", 4, ["kengo_weishang", "kengo_guidui"]], + key_yoshino: ["male", "key", 4, ["yoshino_jueyi"]], + key_yui: ["female", "key", 3, ["yui_jiang", "yui_lieyin", "yui_takaramono"]], + key_tsumugi: ["female", "key", 3, ["tsumugi_mugyu", "tsumugi_huilang"]], + key_saya: ["female", "key", 3, ["saya_shouji", "saya_powei"]], + key_harukakanata: ["female", "key", 3, ["haruka_shuangche"]], + key_inari: ["female", "key", 2, ["inari_baiwei", "inari_huhun"]], + key_shiina: ["female", "key", 3, ["shiina_qingshen", "shiina_feiyan"]], + key_sunohara: [ + "double", + "key", + "3/3/2", + ["sunohara_chengshuang", "sunohara_tiaoyin", "sunohara_jianren"], + ], + key_rin: ["female", "key", 3, ["rin_baoqiu"]], + key_sasami: ["female", "key", 3, ["sasami_miaobian"]], + key_akane: ["female", "key", 3, ["akane_jugu", "akane_quanqing", "akane_yifu"], ["zhu"]], + key_doruji: ["female", "key", 16, ["doruji_feiqu"]], + key_yuiko: ["female", "key", 3, ["yuiko_fenglun", "yuiko_dilve"]], + key_riki: ["double", "key", 3, ["riki_spwenji", "riki_nvzhuang", "riki_mengzhong"]], + key_hisako: ["female", "key", 3, ["hisako_yinbao", "hisako_zhuanyun"]], + key_hinata: ["male", "key", 4, ["hinata_qiulve", "hinata_ehou"]], + key_noda: ["male", "key", 4, ["noda_fengcheng", "noda_xunxin"]], + key_tomoya: ["male", "key", 4, ["tomoya_shangxian", "tomoya_wangjin"]], + key_nagisa: ["female", "key", 3, ["nagisa_tiandu", "nagisa_fuxin"]], + key_ayato: ["male", "key", 3, ["ayato_jianshen", "ayato_zonghuan"]], + key_ao: ["female", "key", 3, ["ao_xishi", "ao_kuihun", "ao_shixin"]], + key_yuzuru: ["male", "key", 5, ["yuzuru_wuxin", "yuzuru_deyi"]], + sp_key_kanade: ["female", "key", 3, ["kanade_mapo", "kanade_benzhan"]], + key_mio: ["female", "key", 3, ["mio_tuifu", "mio_tishen"]], + key_midori: ["female", "key", 3, ["midori_nonghuan", "midori_tishen"]], + key_kyoko: ["female", "key", 3, ["kyoko_juwu", "kyoko_zhengyi"]], + key_shizuru: ["female", "key", 3, ["shizuru_nianli", "shizuru_benzhan"]], + key_shiorimiyuki: ["female", "key", 3, ["shiorimiyuki_banyin", "shiorimiyuki_tingxian"]], + key_miki: ["female", "key", 3, ["miki_shenqiang", "miki_huanmeng", "miki_zhiluo"]], + key_shiori: ["female", "key", "2/3", ["shiori_huijuan"]], + key_kaori: ["female", "key", "3/4", ["kaori_siyuan"]], + key_akiko: ["female", "key", 3, ["akiko_dongcha"]], + key_abyusa: ["female", "key", 3, ["abyusa_jueqing", "abyusa_dunying"]], + key_godan: ["male", "key", 6, ["godan_yuanyi", "godan_feiqu", "godan_xiaoyuan"]], + key_yuu: ["male", "key", 3, ["yuu_lveduo"]], + key_ryoichi: ["male", "key", 4, ["ryoichi_baoyi", "ryoichi_tuipi"]], + key_kotori: ["female", "key", 3, ["kotori_yumo", "kotori_huazhan"]], + key_jojiro: ["male", "key", 4, ["jojiro_shensu", "jojiro_shunying"]], + key_shiroha: ["female", "key", 3, ["shiroha_yuzhao", "shiroha_guying", "shiroha_jiezhao"]], + key_shizuku: ["female", "key", 3, ["shizuku_sizhi", "shizuku_biyi", "shizuku_sanhua"]], + key_hiroto: ["male", "key", 3, ["hiroto_huyu", "hiroto_tuolao"]], + key_sakuya: ["male", "key", 3, ["youlong", "luanfeng", "sakuya_junbu"]], + key_youta: ["male", "key", 4, []], + key_rumi: ["female", "key", "3/4", ["rumi_shuwu"]], + key_chihaya: ["female", "key", 3, ["chihaya_liewu", "chihaya_youfeng"]], + key_yukito: ["male", "key", 4, ["yukito_kongwu", "yukito_yaxiang"]], + key_crow: ["male", "key", 4, [], ["unseen"]], + key_asara: ["female", "key", 3, ["asara_shelu", "asara_yingwei"]], + key_kotomi: ["female", "key", 3, ["kotomi_qinji", "kotomi_chuanxiang"]], + key_mia: ["female", "key", 3, ["mia_shihui", "mia_qianmeng"]], + key_kano: ["female", "key", 3, ["kano_liezhen", "kano_poyu"]], + db_key_liyingxia: [ + "female", + "shu", + 3, + ["liyingxia_sanli", "liyingxia_zhenjun", "liyingxia_wumai"], + ["doublegroup:shu:key"], + ], + key_erika: ["female", "key", "3/3/2", ["erika_shisong", "erika_yousheng"]], + key_satomi: ["female", "key", 3, ["satomi_luodao", "satomi_daohai"]], + key_iriya: ["female", "key", 3, ["iriya_yinji", "iriya_haozhi"]], + key_fuuko: ["female", "key", 3, ["fuuko_xingdiao", "fuuko_chuanyuan"]], +}; + +export default characters; \ No newline at end of file diff --git a/character/key/index.js b/character/key/index.js new file mode 100644 index 000000000..8cfe49741 --- /dev/null +++ b/character/key/index.js @@ -0,0 +1,101 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; + +game.import("character", function () { + return { + name: "key/index", + character: { ...characters }, + characterFilter: { + key_jojiro(mode) { + return mode == "chess" || mode == "tafang"; + }, + key_yuu(mode) { + return ( + mode == "identity" || + mode == "doudizhu" || + mode == "single" || + (mode == "versus" && _status.mode != "standard" && _status.mode != "three") + ); + }, + key_tomoya(mode) { + return mode != "chess" && mode != "tafang" && mode != "stone"; + }, + key_sunohara(mode) { + return mode != "guozhan"; + }, + }, + characterTitle: { + key_satomi: "#rHeaven Burns Red", + key_erika: "#rHeaven Burns Red", + db_key_liyingxia: "#rHeaven Burns Red", + key_kano: "#bAIR", + key_mia: "#bLoopers", + key_kotomi: "#gClannad
    技能设计:落英逐紫裙", + key_asara: "#bRewrite", + key_yukito: "#bAIR", + key_chihaya: "#bRewrite", + key_rumi: "#rONE ~輝く季節へ~", + key_youta: "#b神様になった日", + key_sakuya: "#bRewrite", + key_hiroto: "#b神様になった日", + key_shizuku: "#bSummer Pockets", + key_shiroha: "#bSummer Pockets", + key_jojiro: "#bCharlotte
    战棋专属角色", + key_kotori: "#bRewrite", + key_ryoichi: "#bSummer Pockets", + key_yuu: "#bCharlotte", + key_godan: "#rAngel Beats!", + key_abyusa: "#rAngel Beats!", + key_akiko: "#bKanon", + key_kaori: "#bKanon", + key_shiori: "#bKanon", + key_miki: "#bSummer Pockets", + key_shiorimiyuki: "#rAngel Beats!", + key_shizuru: "#bRewrite", + key_kyoko: "#bSummer Pockets", + sp_key_kanade: "#rAngel Beats!", + key_yuzuru: "#rAngel Beats!", + key_tsumugi: "#bSummer Pockets", + key_ayato: "#rAngel Beats!", + key_nagisa: "#gClannad", + key_tomoya: "#gClannad", + key_noda: "#rAngel Beats!", + key_hinata: "#rAngel Beats!", + key_hisako: "#rAngel Beats!", + key_doruji: "#bLittle Busters!", + key_riki: "#bLittle Busters!", + key_yuiko: "#bLittle Busters!", + key_akane: "#bRewrite", + key_sasami: "#bLittle Busters!", + key_rin: "#bLittle Busters!", + key_shiina: "#rAngel Beats!", + key_inari: "#bSummer Pockets", + key_saya: "#bLittle Busters!", + key_harukakanata: "#bLittle Busters!", + key_yui: "#rAngel Beats!", + key_yoshino: "#bRewrite", + key_kengo: "#bLittle Busters!", + key_iwasawa: "#rAngel Beats!", + key_masato: "#bLittle Busters!", + key_yusa: "#bCharlotte", + key_misa: "#rCharlotte", + key_yukine: "#gClannad", + key_komari: "#bLittle Busters!", + key_umi: "#bSummer Pockets", + key_rei: "#gHarmonia", + key_lucia: "#bRewrite", + key_kyousuke: "#bLittle Busters!", + key_yuri: "#rAngel Beats!", + key_haruko: "#bAIR", + sp_key_yuri: "#bAngel Beats!", + key_fuuko: "#gClannad", + }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/key/pinyin.js b/character/key/pinyin.js new file mode 100644 index 000000000..791ab327b --- /dev/null +++ b/character/key/pinyin.js @@ -0,0 +1,91 @@ +const pinyins = { + 加藤うみ: ["Kato", "Umi"], + 仲村由理: ["Nakamura", "Yuri"], + 此花露西娅: ["Konohana", "Lucia"], + 枣恭介: ["Natsume", "Kyousuke"], + 神尾晴子: ["Kamio", "Haruko"], + 神北小毬: ["Kamikita", "Komari"], + 宫泽有纪宁: ["Miyazawa", "Yukine"], + 西森柚咲: ["Nishimori", "Yusa"], + 黑羽美砂: ["Kurobane", "Misa"], + 井之原真人: ["Inohara", "Masato"], + 岩泽雅美: ["Iwasawa", "Masami"], + 宫泽谦吾: ["Miyazawa", "Kengo"], + 吉野晴彦: ["Yoshino", "Haruhiko"], + 由依: ["Yui"], + 紬文德斯: ["Tsumugi", "Wenders"], + 朱鹭户沙耶: ["Tokido", "Saya"], + "三枝叶留佳&二木佳奈多": ["Saigusa", "Haruka", "Futaki", "Kanata"], + 三枝二木: ["Saigusa", "Haruka", "Futaki", "Kanata"], + 稻荷: ["Inari"], + 椎名: ["Shiina"], + "春原阳平&春原芽衣": ["Sunohara", "Youhei", "Sunohara", "Mei"], + 阳平芽衣: ["Sunohara", "Youhei", "Sunohara", "Mei"], + 枣铃: ["Natsume", "Rin"], + 笹濑川佐佐美: ["Sasasegawa", "Sasami"], + 千里朱音: ["Senri", "Akane"], + 多鲁基: ["Dorj"], + 来谷唯湖: ["Kurugaya", "Yuiko"], + 直枝理树: ["Naoe", "Riki"], + 渕田久子: ["Fuchita", "Hisako"], + 日向秀树: ["Hinata", "Hideki"], + 野田: ["Noda"], + 冈崎朋也: ["Okazaki", "Tomoya"], + 古河渚: ["Furukawa", "Nagisa"], + 直井文人: ["Naoi", "Ayato"], + 空门苍: ["Sorakado", "Ao"], + 音无结弦: ["Otonashi", "Yuzuru"], + 立华奏: ["Tachibana", "Kanade"], + 西园美鱼: ["Nishizono", "Mio"], + 西园美鸟: ["Nishizono", "Midori"], + 岬镜子: ["Misaki", "Kyoko"], + 中津静流: ["Nakatsu", "Shizuru"], + "关根诗织&入江美雪": ["Sekine", "Shiori", "Irie", "Miyuki"], + 关根入江: ["Sekine", "Shiori", "Irie", "Miyuki"], + 野村美希: ["Nomura", "Miki"], + 美坂栞: ["Misaka", "Shiori"], + 美坂香里: ["Misaka", "Kaori"], + 水濑秋子: ["Minase", "Akiko"], + 游佐: ["Yusa"], + 松下护騨: ["Matsushita", "Godan"], + 乙坂有宇: ["Otosaka", "Yuu"], + 三谷良一: ["Mitani", "Ryoichi"], + 神户小鸟: ["Kanbe", "Kotori"], + 高城丈士朗: ["Takajyo", "Jyojirou"], + 鸣濑白羽: ["Naruse", "Shiroha"], + 水织静久: ["Mizuori", "Shizuku"], + 铃木央人: ["Suzuki", "Hiroto"], + 凤咲夜: ["Ootori", "Sakuya"], + 成神阳太: ["Narukami", "Youta"], + 七濑留美: ["Nanase", "Rumi"], + 凤千早: ["Ootori", "Chihaya"], + 国崎往人: ["Kunisaki", "Yukito"], + 井上晶: ["Inoue", "Asara"], + 一之濑琴美: ["Ichinose", "Kotomi"], + 藤川米娅: ["Fujikawa", "Mia"], + 雾岛佳乃: ["Kirishima", "Kano"], + 苍井绘梨花: ["Aoi", "Erika"], + 藏里见: ["Kura", "Satomi"], + "喵呜·喵呼": ["Myau", "Mya-fu"], + 喵呜喵呼: ["Myau", "Mya-fu"], + 伊吹风子: ["Ibuki", "Fuuko"], + 久岛鸥: ["Kushima", "Kamome"], + 库特莉亚芙卡: ["Noumi", "Kudryavka"], + 神尾观铃: ["Kamio", "Misuzu"], + 友利奈绪: ["Tomori", "Nao"], + 天王寺瑚太朗: ["Tennouji", "Kotarou"], + 藤林杏: ["Fujibayashi", "Kyou"], + 伊座并杏子: ["Izanami", "Kyouko"], + 加纳天善: ["Kano", "Tenzen"], + 冰室忧希: ["Himuro", "Yuuki"], + 露娜Q: ["Lunar", "Q"], + 远野小满: ["Toono", "Michiru"], + 远野美凪: ["Toono", "Minagi"], + 樱庭星罗: ["Sakuraba", "Seira"], + 坂上智代: ["Sakagami", "Tomoyo"], + 冈崎汐: ["Okazaki", "Ushio"], + 神山识: ["Kamiyama", "Shiki"], + 佐藤雏: ["Satou", "Hina"], + 篝: ["Kagari"], +} +export default pinyins; \ No newline at end of file diff --git a/character/key/skill.js b/character/key/skill.js new file mode 100644 index 000000000..1e4fc2f31 --- /dev/null +++ b/character/key/skill.js @@ -0,0 +1,8949 @@ +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //伊吹风子 + fuuko_xingdiao: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: (event) => { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + "step 0"; + player.drawTo(8); + "step 1"; + var hs = player.getCards("h"); + if (hs.length > 0) player.addShownCards(hs, "visible_fuuko_xingdiao"); + }, + mod: { + ignoredHandcard(card) { + if (card.hasGaintag("visible_fuuko_xingdiao")) { + return true; + } + }, + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("visible_fuuko_xingdiao")) { + return false; + } + }, + }, + onremove: true, + global: "fuuko_xingdiao_gain", + subSkill: { + gain: { + enable: "phaseUse", + filter: (event, player) => { + return game.hasPlayer((current) => + lib.skill.fuuko_xingdiao_gain.filterTarget(null, player, current) + ); + }, + filterTarget: (card, player, target) => { + return ( + target != player && + target.hasCard((card) => card.hasGaintag("visible_fuuko_xingdiao"), "h") && + !target.getStorage("fuuko_xingdiao").includes(player) && + target.hasSkill("fuuko_xingdiao") + ); + }, + selectTarget: () => { + const num = game.countPlayer((current) => + lib.skill.fuuko_xingdiao_gain.filterTarget( + null, + _status.event.player, + current + ) + ); + return num > 1 ? 1 : -1; + }, + content() { + "step 0"; + target.markAuto("fuuko_xingdiao", [player]); + var cards = target.getCards("h", (card) => + card.hasGaintag("visible_fuuko_xingdiao") + ); + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, links: cards }; + else + player.chooseButton(true, [ + "选择获得" + get.translation(target) + "的一张“星”", + cards, + ]); + "step 1"; + if (result.bool) { + player.gain(result.links, target, "give"); + target.draw(); + } + }, + ai: { + order: 6, + result: { + target: 1, + }, + }, + }, + }, + }, + fuuko_chuanyuan: { + trigger: { + player: "loseAfter", + global: [ + "gainAfter", + "equipAfter", + "addJudgeAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + forced: true, + filter(event, player) { + const evt = event.getl(player); + if (!evt.hs.length) return false; + for (let i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("visible_fuuko_xingdiao")) return true; + } + return false; + }, + content() { + var evt = trigger.getl(player), + gains = [], + draws = 0; + var map = evt.gaintag_map; + var cards = evt.hs.filter((card) => { + return map[card.cardid] && map[card.cardid].includes("visible_fuuko_xingdiao"); + }); + cards.forEach((card) => { + var suit = get.suit(card, player), + num = get.number(card, player); + var card2 = get.cardPile2(function (card) { + if (gains.includes(card)) return false; + return get.suit(card, player) == suit && get.number(card, player) == num; + }); + if (card2) gains.push(card2); + else draws++; + }); + if (gains.length) player.gain(gains, "gain2").gaintag.add("fuuko_chuanyuan"); + if (draws) player.draw(draws).gaintag = ["fuuko_chuanyuan"]; + player.addSkill("fuuko_chuanyuan_effect"); + }, + subSkill: { + effect: { + mod: { + targetInRange(card) { + if (!card.cards || !card.cards.length) return; + for (var i of card.cards) { + if (!i.hasGaintag("fuuko_chuanyuan")) return; + } + return true; + }, + cardUsable(card) { + if (!card.cards || !card.cards.length) return; + for (var i of card.cards) { + if (!i.hasGaintag("fuuko_chuanyuan")) return; + } + return Infinity; + }, + }, + charlotte: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter(event, player) { + if (event.addCount === false) return false; + return player.hasHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + for (let i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("fuuko_chuanyuan")) return true; + } + }); + //return false; + }, + content() { + trigger.addCount = false; + player.getStat("card")[trigger.card.name]--; + }, + }, + }, + }, + //伊莉雅 + iriya_yinji: { + trigger: { player: "phaseUseBegin" }, + forced: true, + filter(event, player) { + return player.countCards("h") < 17; + }, + content() { + player.drawTo(17).gaintag = ["iriya_yinji_tag"]; + player.addSkill("iriya_yinji_tag"); + }, + subSkill: { + tag: { + charlotte: true, + mod: { + cardEnabled(card) { + if (get.itemtype(card) == "card") { + if (card.hasGaintag("iriya_yinji_tag")) return false; + } else if (card.isCard && card.cards) { + if (card.cards.some((card) => card.hasGaintag("iriya_yinji_tag"))) + return false; + } + }, + aiValue(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) + return num / 10000; + }, + aiUseful(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) + return num / 10000; + }, + }, + }, + }, + }, + iriya_haozhi: { + enable: "phaseUse", + filterCard: true, + selectCard: [2, Infinity], + promptfunc: () => + "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。", + position: "he", + getType(cards, player) { + var nums = cards + .map((card) => { + var num = get.number(card, player); + if (num <= 2) return num + 13; + return num; + }) + .sort((a, b) => a - b), + len = nums.length; + if (len == 1) return ["单张", nums[0], 1]; + if (len == 2) return nums[1] == nums[0] ? ["对子", nums[0], 1] : null; + var map = {}; + for (var i = 0; i < len; i++) { + var count = get.numOf(nums, nums[i]); + if (!map[count]) map[count] = []; + map[count].push(nums[i]); + i += count - 1; + } + if (len == 3) { + if (map[3]) return ["三张", nums[0], 1]; + return null; + } + if (map[len]) { + return ["炸弹", nums[0], length]; + } + if (map[1]) { + if (map[1].length == len && len > 4) { + for (var i = 0; i < map[1].length - 1; i++) { + if (map[1][i + 1] - map[1][i] != 1) return null; + if (map[1][i + 1] == 15) return null; + } + return ["单顺", nums[0], len]; + } else if (map[1].length == 2 && map[4] && len == 6) { + return ["四带二", map[4][0], 1]; + } else if (map[3] && map[1].length == map[3].length && len == map[1].length * 4) { + if (map[3].length == 1) return ["三带一", map[3][0], 1]; + for (var i = 0; i < map[3].length - 1; i++) { + if (map[3][i + 1] - map[3][i] != 1) return null; + } + return ["单带飞机", map[3][0], map[3].length]; + } + return null; + } + if (map[2]) { + if (map[2].length * 2 == len && len > 5) { + for (var i = 0; i < map[2].length - 1; i++) { + if (map[2][i + 1] - map[2][i] != 1) return null; + if (map[2][i + 1] == 15) return null; + } + return ["双顺", nums[0], len]; + } else if (map[4] && len == 6) { + return ["四带二", map[4][0], 1]; + } else if (map[3] && map[2].length == map[3].length && len == map[2].length * 5) { + if (map[3].length == 1) return ["三带二", map[3][0], 1]; + for (var i = 0; i < map[3].length - 1; i++) { + if (map[3][i + 1] - map[3][i] != 1) return null; + if (map[3][i + 1] == 15) return null; + } + return ["双带飞机", map[3][0], map[3].length]; + } + return null; + } + if (map[3]) { + if (map[3].length * 3 == len && len > 5) { + for (var i = 0; i < map[3].length - 1; i++) { + if (map[3][i + 1] - map[3][i] != 1) return null; + if (map[3][i + 1] == 15) return null; + } + return ["三顺", nums[0], len]; + } + return null; + } + return null; + }, + filterOk() { + return Array.isArray( + lib.skill.iriya_haozhi.getType(ui.selected.cards, _status.event.player) + ); + }, + check(card) { + var player = _status.event.player; + //收益都一样 多一牌不如少一牌 + var types = ["炸弹", "三顺", "单顺", "双顺", "三张", "对子"]; + var getNum = function (card, player) { + var num = get.number(card, player); + if (num <= 2) return num + 13; + return num; + }, + hasEnemy = game.hasPlayer((current) => get.attitude(player, current) < 0); + //所有手牌 + var nums = player + .getCards("he", function (card) { + return lib.filter.cardDiscardable(card, player); + }) + .map((card) => getNum(card, player)); + var numu = ui.selected.cards.map((card) => getNum(card, player)); + var num = getNum(card, player); + if (!_status.event._iriya_haozhi_type) { + for (var type of types) { + switch (type) { + case "炸弹": + if (!hasEnemy) break; + for (var i of nums) { + if (get.numOf(nums, i) >= 4) { + _status.event._iriya_haozhi_type = "炸弹"; + break; + } + } + break; + case "三顺": + if (!hasEnemy) break; + for (var i of nums) { + if ( + i < 14 && + get.numOf(nums, i) >= 3 && + get.numOf(nums, i + 1) >= 3 + ) { + _status.event._iriya_haozhi_type = "三顺"; + break; + } + } + break; + case "双顺": + if (!hasEnemy) break; + for (var i of nums) { + if (i < 13 && get.numOf(nums, i) >= 2) { + for (var j = 1; j < 3; j++) { + if (get.numOf(nums, i + j) < 2) break; + if (j == 2) _status.event._iriya_haozhi_type = "双顺"; + } + } + } + break; + case "单顺": + if (!hasEnemy) break; + for (var i of nums) { + if (i < 11) { + for (var j = 1; j < 5; j++) { + if (!nums.includes(i + j)) break; + if (j == 4) _status.event._iriya_haozhi_type = "单顺"; + } + } + } + break; + case "三张": + if (!hasEnemy) break; + for (var i of nums) { + if (get.numOf(nums, i) >= 3) { + _status.event._iriya_haozhi_type = "三张"; + break; + } + } + break; + case "对子": + for (var i of nums) { + if (get.numOf(nums, i) >= 2) { + _status.event._iriya_haozhi_type = "对子"; + break; + } + } + break; + } + if (_status.event._iriya_haozhi_type) break; + } + if (!_status.event._iriya_haozhi_type) _status.event._iriya_haozhi_type = "要不起"; + } + if (_status.event._iriya_haozhi_type == "要不起") return 0; + //复用响应AI + if (!ui.selected.cards.length) { + var count = get.numOf(nums, num); + switch (_status.event._iriya_haozhi_type) { + case "炸弹": + if (count >= 4) return 15; + break; + case "对子": + if ( + count > 1 && + player.hasCard(function (cardx) { + return ( + cardx != card && + getNum(cardx, player) == num && + cardx.hasGaintag("iriya_yinji_tag") + ); + }, "he") + ) + return 4 - get.value(card); + break; + case "三张": + if (count > 2) return 8 - get.value(card); + break; + case "单顺": + if (num > 10) return 0; + for (var i = 1; i < 5; i++) { + if (get.numOf(nums, num + i) < 1) return 0; + } + return 9 - get.value(card); + case "双顺": + if (count < 2 || num > 12) return 0; + for (var i = 1; i < 3; i++) { + if (get.numOf(nums, num + i) < 2) return 0; + } + return 9 - get.value(card); + case "三顺": + if (count < 3 || num > 13) return 0; + for (var i = 1; i < 2; i++) { + if (get.numOf(nums, num + i) < 2) return 0; + } + return 12 - get.value(card); + } + return 0; + } else { + switch (_status.event._iriya_haozhi_type) { + case "炸弹": + if (numu.length >= 4) return 0; + if (num == numu[0]) return 15; + return 0; + case "对子": + if (numu.length >= 2) return 0; + if (num == numu[0]) return 3 - get.value(card); + return 0; + case "三张": + if (numu.length >= 3) return 0; + if (num == numu[0]) return 9 - get.value(card); + return 0; + case "单顺": + case "双顺": + case "三顺": + var map = { + 单顺: [5, 0], + 双顺: [3, 1], + 三顺: [2, 2], + }, + len = map[_status.event._iriya_haozhi_type][0], + addNum = map[_status.event._iriya_haozhi_type][1]; + if (numu.length >= len) return 0; + var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); + if (num == numt) return 10 + addNum - get.value(card); + return 0; + } + } + }, + //响应AI + respondAI(card) { + if (!_status.event.goon) return 0; + var type = _status.event.type, + player = _status.event.player; + var getNum = function (card, player) { + var num = get.number(card, player); + if (num <= 2) return num + 13; + return num; + }, + nums = player + .getCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "iriya_haozhi"); + }) + .map((card) => getNum(card, player)); + var num = getNum(card, player); + if (!ui.selected.cards.length) { + var count = get.numOf(nums, num); + if (count >= 4 && (type[0] != "炸弹" || num > type[1] || count > type[2])) return 15; + switch (type[0]) { + case "对子": + if (count > 1 && num > type[1]) return 8 - get.value(card); + break; + case "三张": + case "三带一": + case "三带二": + if (count > 2 && num > type[1]) return 9 - get.value(card); + break; + case "单顺": + if (num <= type[1] || num > 15 - type[2]) return 0; + for (var i = 1; i < type[2]; i++) { + if (get.numOf(nums, num + i) < 1) return 0; + } + return 10 - get.value(card); + case "双顺": + if (num <= type[1] || count < 2 || num > 15 - type[2] / 2) return 0; + for (var i = 1; i < type[2] / 2; i++) { + if (get.numOf(nums, num + i) < 2) return 0; + } + return 11 - get.value(card); + case "三顺": + case "单带飞机": + case "双带飞机": + var size = 3 + ["三顺", "单带飞机", "双带飞机"].indexOf(type[0]); + if (num <= type[1] || count < 3 || num > 15 - type[2] / size) return 0; + for (var i = 1; i < type[2] / size; i++) { + if (get.numOf(nums, num + i) < 2) return 0; + } + return 12 - get.value(card); + } + return 0; + } else { + var numu = ui.selected.cards.map((card) => getNum(card, player)); + var numx = numu[0]; + if (num == numx) { + var count = get.numOf(nums, numx); + if ( + count >= 4 && + (type[0] != "炸弹" || num > type[1] || count > type[2]) && + numu.length < (type[0] == "炸弹" ? type2 : 4) + ) + return 15; + } + switch (type[0]) { + case "对子": + if (numu.length >= 2) return 0; + if (num == numu[0]) return 8 - get.value(card); + return 0; + case "三张": + if (numu.length >= 3) return 0; + if (num == numu[0]) return 9 - get.value(card); + return 0; + case "三带一": + if (numu.length == 3 || num == numu[0]) return 9 - get.value(card); + return 0; + case "三带二": + if (numu.length >= 5) return false; + if (numu.length == 3) { + if (num == numu[0] || get.numOf(nums, num) < 2) return 0; + } else if (numu.length == 4) { + return num == numu[3] ? 9 - get.value(card) : 0; + } + if (num == numu[0]) return 9 - get.value(card); + return 0; + case "单顺": + case "双顺": + case "三顺": + if (numu.length >= type[2]) return 0; + var addNum = ["单顺", "双顺", "三顺"].indexOf(type[0]); + var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); + if (num == numt) return 10 + addNum - get.value(card); + return 0; + case "单带飞机": + if (numu.length >= type[2]) return 0; + var len = (type[2] / 4) * 3; + if (numu.length < len) { + var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); + if (num == numt) return 12 - get.value(card); + } else { + if (num >= numu[0] || num <= numu[len - 1]) return 0; + return 12 - get.value(card); + } + return 0; + case "双带飞机": + if (numu.length >= type[2]) return 0; + var len = (type[2] / 5) * 3; + if (numu.length < len) { + var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); + if (num == numt) return 12 - get.value(card); + } else { + if ((numu.length - len) % 2 == 0) { + if (numu.includes(num) || get.numOf(nums, num) < 2) return 0; + return 12 - get.value(card); + } else { + return num == numu[numu.length - 1] ? 12 - get.value(card) : 0; + } + } + return 0; + } + } + }, + content() { + "step 0"; + var players = game.filterPlayer().sortBySeat(player.getNext()); + event.players = players; + event.current = player; + event.current_type = lib.skill.iriya_haozhi.getType(cards, player); + event.current_cards = cards.slice(0); + if (!event.current_type) event.finish(); + "step 1"; + var target = event.players.shift(); + if ( + (target != player || event.current != player) && + target.isIn() && + target.countCards("h") >= Math.min(cards.length, 4) + ) { + event.target = target; + target.addTempSkill("iriya_haozhi_temp", { + global: ["discardBefore", "chooseToDiscardEnd", "phaseAfter"], + }); + var trans = get.translation(event.current); + var cardsn = (function (cards, player) { + var getn = (card, player) => { + var num = get.number(card, player); + if (num <= 2) return num + 13; + return num; + }; + cards.sort(function (a, b) { + var numa = getn(a, player), + numb = getn(b, player); + if (numa != numb) return numa - numb; + return lib.suit.indexOf(get.suit(a, player) - get.suit(b, player)); + }); + var str = ""; + for (var i of cards) { + str += ","; + str += get.strNumber(get.number(i, player)); + str += get.translation(get.suit(i, player)); + } + return str.slice(1); + })(event.current_cards, event.current); + var next = target.chooseToDiscard( + "是否响应" + trans + "的" + get.translation(event.current_type[0]) + "?", + trans + "的牌组为" + cardsn + "。您此时可以点击“整理手牌”,将手牌按点数排序。", + [2, Infinity], + "he" + ); + next.set("type", event.current_type); + next.set("filterOk", function () { + var type = lib.skill.iriya_haozhi.getType( + ui.selected.cards, + _status.event.player + ); + if (!type) return false; + var ptype = _status.event.type; + if (type[0] == "炸弹") { + if (ptype[0] == "炸弹") { + if (type[2] > ptype[2]) return true; + return type[1] > ptype[1] && type[2] == ptype[2]; + } + return true; + } + return type[0] == ptype[0] && type[2] == ptype[2] && type[1] > ptype[1]; + }); + next.set("goon", get.attitude(target, event.current) < 0); + next.set("ai", lib.skill.iriya_haozhi.respondAI); + } else if (event.players.length > 0) event.redo(); + else event.goto(3); + "step 2"; + if (result.bool) { + event.current = target; + event.current_type = lib.skill.iriya_haozhi.getType(result.cards.slice(0), target); + event.current_cards = result.cards.slice(0); + if (!event.current_type) event.finish(); + event.current.addExpose(0.5); + } + if (event.players.length > 0) event.goto(1); + "step 3"; + var current = event.current, + type = 0; + if (!current.isIn()) return; + switch (event.current_type[0]) { + case "对子": + type = 1; + break; + case "三张": + case "三带一": + case "三带二": + type = 2; + break; + case "单顺": + type = 3; + break; + case "双顺": + type = 4; + break; + case "三顺": + case "单带飞机": + case "双带飞机": + type = 5; + break; + case "炸弹": + case "四带二": + type = 6; + break; + } + /*if(type==2){ + current.addSkill('iriya_haozhi_extra'); + current.addMark('iriya_haozhi_extra',1,false); + } + else */ + if (type > 0) { + var next = game.createEvent("iriya_haozhi_effect", false); + next.player = current; + next.setContent(lib.skill.iriya_haozhi["content" + type]); + } + }, + content1() { + "step 0"; + player + .chooseTarget([1, 2], "是否令至多两名角色各摸一张牌?") + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets); + game.asyncDraw(targets); + game.delayex(); + } + }, + content2() { + "step 0"; + player + .chooseTarget( + [1, 3], + "是否弃置至多三名角色的各一张牌?", + function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var target of targets) { + player.discardPlayerCard(target, true, "he"); + } + } + "step 2"; + //player.recover(); + player.draw(); + }, + content3() { + "step 0"; + event.count = 0; + "step 1"; + var next = player + .chooseTarget("是否弃置一名其他角色的一张牌?", function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + if (event.color) + next.set( + "prompt2", + "若你弃置的牌为" + get.translation(event.color) + ",则你可以重复此流程" + ); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.discardPlayerCard(target, true, "he"); + } else event.goto(4); + "step 3"; + if (result.bool) { + event.count++; + var card = result.cards[0], + color = get.color(card, false); + if (!event.color) { + event.color = color; + event.goto(1); + } else if (color == event.color) event.goto(1); + } + "step 4"; + if (event.count > 0) player.draw(event.count); + }, + content4() { + "step 0"; + event.count = 0; + "step 1"; + var next = player + .chooseTarget("是否获得一名其他角色的一张牌?", function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeGained(card, player, target); + }, "he") + ); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }); + if (event.color) + next.set( + "prompt2", + "若你得到的牌为" + get.translation(event.color) + ",则你可以重复此流程" + ); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.gainPlayerCard(target, true, "he"); + } else event.goto(4); + "step 3"; + if (result.bool) { + event.count++; + var card = result.cards[0], + color = get.color(card, false); + if (!event.color) { + event.color = color; + event.goto(1); + } else if (color == event.color) event.goto(1); + //player.draw(); + } + "step 4"; + if (event.count > 0) player.recover(event.count); + }, + content5() { + "step 0"; + player + .chooseTarget([1, 3], "是否令至多三名其他角色翻面?", lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) return 10 * att; + return -6 * att; + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "thunder"); + event.targets = targets; + for (var target of targets) target.turnOver(); + } + "step 2"; + player + .chooseTarget( + "是否对一名目标角色造成1点火属性伤害?", + function (card, player, target) { + return _status.event.getParent().targets.includes(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "fire"); + }); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + target.damage("fire"); + } + }, + content6() { + "step 0"; + player + .chooseTarget( + "是否对一名其他角色进行核打击?", + "你对该角色造成2点雷属性伤害,然后该角色翻面,弃置装备区内的所有牌和四张手牌。", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) + return -6 * att * Math.sqrt(2 + target.countCards("he")); + return -att * Math.sqrt(2 + target.countCards("he")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "thunder"); + target.damage("thunder", 2); + target.turnOver(); + } else event.finish(); + "step 2"; + var num = target.countCards("e"); + if (num > 0) target.chooseToDiscard("e", true, num); + "step 3"; + var num = target.countCards("h"); + if (num > 0) target.chooseToDiscard("h", true, Math.min(4, num)); + }, + ai: { + sortCardByNum: true, + order: 13, + result: { + player: 1, + }, + }, + subSkill: { + extra: { + charlotte: true, + mod: { + targetInRange: () => true, + cardUsable: () => Infinity, + }, + trigger: { player: "useCard2" }, + forced: true, + onremove: true, + content() { + "step 0"; + var num = player.countMark("iriya_haozhi_extra"); + player.removeSkill("iriya_haozhi_extra"); + var card = trigger.card; + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card; + if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; + } + var info = get.info(card); + if (info.allowMultiple == false) event.finish(); + if (trigger.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { + var prompt2 = + "为" + + get.translation(card) + + "增加" + + (num > 1 ? "至多" : "") + + get.cnNumber(num) + + "个目标"; + player + .chooseTarget( + get.prompt("iriya_haozhi_extra"), + [1, num], + function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2( + _status.event.card, + player, + target + ) + ); + } + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + } + } + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("iriya_haozhi_extra", event.targets); + trigger.targets.addArray(event.targets); + } + }, + intro: { + content: "使用下一张牌无距离和次数限制,且可以增加#个目标", + }, + }, + temp: { + ai: { sortCardByNum: true }, + charlotte: true, + }, + }, + }, + //藏里见 + satomi_luodao: { + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter(event, player) { + return event.card.name == "sha" && event.target.countCards("h") > 0; + }, + content() { + "step 0"; + var target = trigger.target; + event.target = target; + target.showHandcards( + get.translation(player) + "对" + get.translation(target) + "发动了【落刀】" + ); + "step 1"; + if ( + target.hasCard(function (card) { + return get.name(card, target) == "shan"; + }, "h") + ) { + player + .discardPlayerCard(target, true, "h", "visible") + .set("filterButton", function (button) { + return get.name(button.link) == "shan"; + }); + } else if (player.countCards("he") > 0) player.chooseToDiscard("he", true); + }, + }, + satomi_daohai: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard" && evt.cards2.length > 0; + }) && player.hasUseTarget({ name: "wugu" }) + ); + }, + check(event, player) { + return player.getUseValue({ name: "wugu" }) + player.getUseValue({ name: "lebu" }) > 0; + }, + content() { + "step 0"; + player.chooseUseTarget("wugu", true); + "step 1"; + if (result.bool) { + var cards = []; + player.getHistory("gain", function (evt) { + if (evt.getParent().name == "wugu" && evt.getParent(4) == event) { + cards.addArray(evt.cards); + } + }); + cards = cards.filter(function (card) { + return ( + player.getCards("h").includes(card) && + game.checkMod(card, player, "unchanged", "cardEnabled2", player) + ); + }); + if (cards.length) { + player.chooseCardTarget({ + prompt: "是否将得到的牌当做【乐不思蜀】使用?", + filterCard(card) { + return _status.event.cards.includes(card); + }, + cards: cards, + filterTarget(card, player, target) { + var card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); + return player.canUse(card, target); + }, + ai1: () => 1, + ai2(target) { + var player = _status.event.player, + card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); + return get.effect(target, { name: "lebu" }, player, player); + }, + }); + } else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + player.useCard({ name: "lebu" }, result.cards, result.targets[0]); + } + }, + }, + //苍井绘梨花 + erika_shisong: { + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + filter(event, player) { + if (player != _status.currentPhase) return false; + var index = player.getHistory("useCard").indexOf(event), + history = player.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + if (history[i].isMe) { + var evt = history[i].useCard[index]; + return evt && get.type2(evt.card) == get.type(event.card); + } + } + return false; + }, + content() { + player.draw(); + }, + mod: { + maxHandcard(player, num) { + return num + player.hujia; + }, + }, + }, + erika_yousheng: { + init: (player) => { + player.addSkill("erika_yousheng_mamori"); + }, + dutySkill: true, + group: ["erika_yousheng_achieve", "erika_yousheng_fail"], + trigger: { global: "useCardToTarget" }, + filter(event, player) { + return ( + player.getStorage("erika_yousheng").includes(event.target) && + (event.card.name == "sha" || + (get.type2(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)) && + player.countMark("erika_yousheng_ruka") + 1 <= player.countCards("he") + ); + }, + intro: { + content: "已保护$", + }, + async cost(event, trigger, player) { + const num = player.countMark("erika_yousheng_ruka") + 1; + event.result = await player + .chooseToDiscard( + "he", + num, + get.prompt("erika_yousheng", trigger.target), + "弃置" + num + "张牌,并转移" + get.translation(trigger.card) + ) + .forResult(); + }, + async content(event, trigger, player) { + player.discard(event.cards); + var ruka = trigger.target, + evt = trigger.getParent(); + evt.targets.remove(ruka); + evt.triggeredTargets2.remove(ruka); + evt.targets.push(player); + evt.triggeredTargets2.push(player); + player.addTempSkill("erika_yousheng_ruka"); + var str = "erika_yousheng_" + player.playerid; + if (!evt[str]) evt[str] = []; + evt[str].add(ruka); + }, + subSkill: { + achieve: { + trigger: { player: "changeHujiaAfter" }, + forced: true, + skillAnimation: "legend", + animationColor: "water", + filter(event, player) { + return player.storage.erika_yousheng && event.num < 0 && !player.hujia; + }, + content() { + "step 0"; + player.awakenSkill("erika_yousheng"); + game.log(player, "成功完成使命"); + var list = [player]; + list.addArray(player.storage.erika_yousheng); + list.sortBySeat(); + list = list.filter(function (current) { + return current.isAlive(); + }); + player.line(list, "green"); + game.asyncDraw(list, 3); + "step 1"; + game.delayx(); + }, + }, + fail: { + trigger: { global: "damageEnd" }, + forced: true, + filter(event, player) { + return ( + player.getStorage("erika_yousheng").includes(event.player) && + event.card && + (event.card.name == "sha" || + (get.type2(event.card, false) == "trick" && + get.tag(event.card, "damage") > 0)) + ); + }, + content() { + player.awakenSkill("erika_yousheng"); + game.log(player, "使命失败"); + var num = player.hujia; + if (num > 0) { + player.changeHujia(-num); + player.chooseToDiscard(num, true, "he"); + } + }, + }, + mamori: { + trigger: { global: "roundStart" }, + skillAnimation: true, + animationColor: "wood", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("erika_yousheng"), + [1, 2], + lib.filter.notMe, + "选择至多两名其他角色。你减2点体力上限并获得3点护甲。" + ) + .set("ai", function (ruka) { + return -1; + }) + .forResult(); + }, + async content(event, trigger, player) { + player.awakenSkill("erika_yousheng_mamori"); + player.markAuto("erika_yousheng", event.targets); + await player.loseMaxHp(2); + await player.changeHujia(3); + }, + }, + ruka: { + trigger: { global: "useCardAfter" }, + charlotte: true, + filter(event, player) { + return ( + event["erika_yousheng_" + player.playerid] && + event.cards.filterInD().length > 0 + ); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + "是否令一名原目标角色获得" + + get.translation(trigger.cards.filterInD()) + + "?", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("targets", trigger["erika_yousheng_" + player.playerid]) + .forResult(); + }, + async content(event, trigger, player) { + const ruka = event.targets[0]; + player.line(ruka, "green"); + ruka.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + }, + }, + //李映夏 + liyingxia_sanli: { + trigger: { target: "useCardToTargeted" }, + forced: true, + filter(event, player) { + if (event.player == player || event.player != _status.currentPhase) return false; + var index = event.player + .getHistory("useCard", function (evt) { + return evt.targets.includes(player); + }) + .indexOf(event.getParent()); + if (index == 2) return event.player.isIn() && player.countCards("he") > 0; + return index < 2 && index > -1; + }, + logTarget: "player", + content() { + "step 0"; + var index = trigger.player + .getHistory("useCard", function (evt) { + return evt.targets.includes(player); + }) + .indexOf(trigger.getParent()); + if (index == 2) { + player.chooseCard( + "he", + true, + "三礼:交给" + get.translation(trigger.player) + "一张牌" + ); + } else { + player.draw(); + event.finish(); + } + "step 1"; + if (result.bool) { + player.give(result.cards, trigger.player); + } + }, + }, + liyingxia_zhenjun: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.group == "key"; + }, + async cost(event, trigger, player) { + const num = + player.getHistory("useCard", function (evt) { + return ( + evt.card.name == "sha" || + (get.type(evt.card) == "trick" && get.tag(evt.card, "damage") > 0) + ); + }).length + 1; + event.result = await player + .chooseTarget( + get.prompt("liyingxia_zhenjun"), + [1, num], + "令至多" + get.cnNumber(num) + "名角色各摸一张牌" + ) + .set("ai", (serafu) => get.attitude(_status.event.player, serafu)) + .forResult(); + }, + content() { + targets.sortBySeat(); + game.asyncDraw(targets); + for (var i of targets) + i.addTempSkill("liyingxia_zhenjun_enhance", { + player: player == i ? "phaseJieshuBegin" : "phaseAfter", + }); + game.delayx(); + }, + subSkill: { + enhance: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + mark: true, + filter: (event, player) => player == _status.currentPhase, + intro: { content: "下回合首次造成的伤害+1" }, + content() { + trigger.num++; + player.removeSkill(event.name); + }, + }, + }, + }, + liyingxia_wumai: { + trigger: { global: "roundStart" }, + filter(event, player) { + return ( + player.group == "shu" && + (player.getStorage("liyingxia_wumai").length < 4 || + game.hasPlayer((current) => current.isDamaged())) + ); + }, + async cost(event, trigger, player) { + var list = lib.skill.liyingxia_wumai.derivation.slice(0); + list.removeArray(player.getStorage("liyingxia_wumai")); + if (list.length) { + const { result } = await player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("liyingxia_wumai")) + .set("prompt2", "获得一个技能直到本轮结束"); + if (result.control !== "cancel2") { + event.result = { + bool: true, + cost_data: { + type: "addSkill", + skill: result.control, + }, + }; + } + } else { + const num = Math.min( + 3, + game.countPlayer((current) => current.isDamaged()) + ); + const { result } = await player.chooseBool( + get.prompt("liyingxia_wumai") + "(可摸" + get.cnNumber(num) + "张牌)" + ); + if (result.bool) { + event.result = { + bool: true, + cost_data: { + type: "drawCards", + num, + }, + }; + } + } + }, + async content(event, trigger, player) { + const result = event.cost_data; + if (result.type === "addSkill") { + player.markAuto("liyingxia_wumai", [result.skill]); + player.addTempSkills(result.skill, "roundStart"); + } else if (result.type === "drawCards") { + player.draw(result.num); + } + }, + derivation: ["bazhen", "rejizhi", "reguanxing", "youlong"], + }, + //雾岛佳乃 + kano_liezhen: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.getHistory("useCard").length > 0; + }, + frequent: true, + async cost(event, trigger, player) { + var history = player.getHistory("useCard"); + if (history.length > 1) { + var type = get.type2(history[0].card, false); + for (var i = 1; i < history.length; i++) { + if (get.type2(history[i].card, false) != type) { + const result = await player + .chooseButton([ + "列阵:是否视为使用其中一种牌?", + [["kano_paibingbuzhen"].concat(get.zhinangs()), "vcard"], + ]) + .set("filterButton", function (button) { + return _status.event.player.hasUseTarget({ + name: button.link[2], + isCard: true, + }); + }) + .set("ai", function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + isCard: true, + }); + }) + .forResult(); + if (result.bool) + event.result = { + bool: true, + cost_data: { + links: result.links, + }, + }; + return; + } + } + } + var str = _status.renku.length ? "获得仁库中的所有牌" : "摸两张牌"; + event.result = await player + .chooseBool(get.prompt("kano_liezhen"), str) + .set("frequentSkill", "kano_liezhen") + .forResult(); + }, + async content(event, trigger, player) { + const result = event.cost_data; + if (!result || !result.links.length) { + if (_status.renku.length) { + const cards = _status.renku.slice(0); + _status.renku.length = 0; + game.updateRenku(); + await player.gain(cards, "gain2", "fromRenku"); + } else player.draw(2); + } else { + player.chooseUseTarget(result.links[0][2], true); + } + }, + init(player) { + player.storage.renku = true; + }, + }, + kano_poyu: { + trigger: { target: "useCardToTargeted" }, + charlotte: true, + filter(event, player) { + return ( + _status.renku.length > 0 && + (event.card.name == "sha" || + (get.type(event.card) == "trick" && get.tag(event.card, "damage") > 0)) + ); + }, + check(trigger, player) { + return get.effect(player, trigger.card, trigger.player, player) < 0; + }, + content() { + "step 0"; + player.judge(); + "step 1"; + var bool = false, + type = get.type2(result.card.name); + for (var i of _status.renku) { + if (get.suit(i) == result.suit || get.type2(i) == type) { + bool = true; + break; + } + } + if (bool) { + player + .chooseButton([ + "是否移去一张牌,令" + get.translation(trigger.card) + "对你无效?", + _status.renku, + ]) + .set("types", [result.suit, type]) + .set("filterButton", function (button) { + var types = _status.event.types; + return ( + get.suit(button.link, false) == types[0] || + get.type2(button.link, false) == types[1] + ); + }) + .set("ai", () => 1); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.links[0]; + player.$throw(card, 1000); + _status.renku.remove(card); + game.cardsDiscard(card).fromRenku = true; + game.log(player, "将", card, "置入了弃牌堆"); + trigger.excluded.add(player); + game.updateRenku(); + } + }, + init(player) { + player.storage.renku = true; + }, + }, + //藤川米亚 + mia_shihui: { + trigger: { player: "phaseDrawBegin1" }, + forced: true, + filter(event, player) { + return !event.numFixed; + }, + content() { + trigger.changeToZero(); + var num = 0; + all = player.getAllHistory(); + if (all.length > 1) { + for (var i = all.length - 2; i >= 0; i--) { + if (all[i].isMe) { + for (var evt of all[i].lose) { + if (evt.type == "discard") num += evt.cards2.length; + } + break; + } + } + } + player.draw(1 + num); + }, + group: "mia_shihui_recover", + subSkill: { + recover: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter(event, player) { + return player.isDamaged() || player.countCards("he") > 0; + }, + content() { + player.chooseToDiscard("he", true); + player.recover(); + }, + }, + }, + }, + mia_qianmeng: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + dutySkill: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + "step 0"; + player.draw(); + "step 1"; + if (player.countCards("he") > 0) { + player.chooseCard("he", true, "潜梦:选择一张牌置于牌堆中"); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + player.storage.mia_qianmeng = card; + player.$throw(card, 1000); + player.lose(card, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[Math.ceil(ui.cardPile.childNodes.length / 2)]; + }; + } else event.finish(); + "step 3"; + game.delayx(); + }, + onremove: true, + group: ["mia_qianmeng_achieve", "mia_qianmeng_fail"], + subSkill: { + achieve: { + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + forced: true, + filter(event, player) { + var card = player.storage.mia_qianmeng; + if (event.name == "gain") { + var source = event.player, + cards = event.getg(source); + return cards.includes(card) && source.getCards("hejsx").includes(card); + } else { + if (event.type != "gain") return false; + var owner = get.owner(card); + return owner && event.getg(owner).includes(card); + } + }, + skillAnimation: true, + animationColor: "key", + content() { + "step 0"; + game.log(player, "成功完成使命"); + player.awakenSkill("mia_qianmeng"); + var card = player.storage.mia_qianmeng, + owner = get.owner(card); + if (owner && owner != player) owner.give(card, player); + "step 1"; + if (player.hp < player.maxHp) player.recover(player.maxHp - player.hp); + player.changeSkills(["mia_fengfa"], ["mia_shihui"]); + }, + }, + fail: { + trigger: { player: "die" }, + forceDie: true, + filter(event, player) { + return get.itemtype(player.storage.mia_qianmeng) == "card"; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("mia_qianmeng"), + "令一名角色获得牌堆中所有点数为" + + player.storage.mia_qianmeng.number + + "的牌", + lib.filter.notMe + ) + .forResult(); + }, + async content(event, trigger, player) { + game.log(player, "使命失败"); + var target = event.targets[0]; + var num = player.storage.mia_qianmeng.number, + suit = player.storage.mia_qianmeng.suit, + cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.number == num && card.suit == suit) cards.push(card); + } + if (cards.length) await target.gain(cards, "gain2"); + }, + }, + }, + }, + mia_fengfa: { + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter(event, player) { + return !event.numFixed; + }, + content() { + var num = 0; + all = player.getAllHistory(); + if (all.length > 1) { + for (var i = all.length - 2; i >= 0; i--) { + if (all[i].isMe) { + num += all[i].useCard.length; + break; + } + } + } + trigger.num += num; + }, + }, + //一之濑琴美 + kotomi_qinji: { + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return player.hasUseTarget("wanjian"); + }, + //chooseUseTarget也不好改 先放着 + direct: true, + content() { + player.addTempSkill("kotomi_qinji2"); + player.chooseUseTarget( + { name: "wanjian", isCard: true }, + get.prompt("kotomi_qinji"), + "视为使用一张【万箭齐发】" + ).logSkill = "kotomi_qinji"; + }, + }, + kotomi_qinji2: { + trigger: { source: "damageBefore" }, + forced: true, + popup: false, + filter(event, player) { + return event.getParent().skill == "kotomi_qinji"; + }, + content() { + trigger.cancel(); + trigger.player.loseHp(trigger.num); + }, + }, + kotomi_chuanxiang: { + global: "kotomi_chuanxiang2", + }, + kotomi_chuanxiang2: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + !player.hasSkill("kotomi_chuanxiang") && + player.countCards("e", lib.skill.kotomi_chuanxiang2.filterCard) > 0 + ); + }, + filterCard(card, player) { + if (!player) player = _status.event.player; + return game.hasPlayer(function (current) { + return current != player && current.canEquip(card); + }); + }, + position: "e", + filterTarget(card, player, target) { + return target != player && target.canEquip(ui.selected.cards[0]); + }, + check(card) { + if (get.value(card) <= 0) return 10; + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current.hasSkill("kotomi_chuanxiang") && get.attitude(player, current) > 0; + }) + ) { + var subtype = get.subtype(card, false); + if ( + player.countCards("hs", function (cardx) { + return ( + get.type(cardx) == "equip" && + get.subtype(cardx, false) == subtype && + player.canUse(cardx, player) && + get.effect(player, cardx, player, player) > 0 + ); + }) + ) + return 8; + return 7 / Math.max(1, get.value(card)); + } + return 0; + }, + promptfunc() { + var players = game.filterPlayer(function (current) { + return current.hasSkill("kotomi_chuanxiang"); + }); + return ( + "将一张装备牌传给其他角色,然后令" + + get.translation(players) + + "摸一张牌。若传给该角色,则其改为摸两张牌。" + ); + }, + prepare: "give", + discard: false, + lose: false, + content() { + "step 0"; + target.equip(cards[0]); + var list = game.filterPlayer(function (current) { + return current.hasSkill("kotomi_chuanxiang"); + }); + game.asyncDraw(list, function (targetx) { + return targetx == target ? 2 : 1; + }); + "step 1"; + game.delayx(); + }, + ai: { + order: 8, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (!card) return 0; + var eff = get.effect(target, card, player, target); + if (target.hasSkill("kotomi_chuanxiang")) eff++; + return eff; + }, + }, + }, + }, + //井上晶 + asara_shelu: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + }, + filterCard: true, + position: "he", + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; + }, + check(card) { + return 6 - get.value(card); + }, + content() { + "step 0"; + if (!target.countCards("h")) event.finish(); + else player.choosePlayerCard(target, "h", true); + "step 1"; + player.showCards(result.cards); + event.cards2 = result.cards; + "step 2"; + target.$give(event.cards2, player, false); + target.loseToSpecial(event.cards2, "asara_yingwei", player).visible = true; + var card1 = cards[0], + card2 = event.cards2[0]; + if (card1.suit == card2.suit) player.draw(2); + if (card1.number == card2.number) player.recover(); + }, + ai: { + order: 6, + result: { + target: -1, + }, + }, + }, + asara_yingwei: { + trigger: { player: "yingbian" }, + forced: true, + filter: (event, player) => + event.card.isCard && + player.hasHistory( + "lose", + (evt) => + evt.getParent() == event && + Object.values(evt.gaintag_map).some((value) => value.includes("asara_yingwei")) + ), + content: () => { + trigger.forceYingbian = true; + }, + ai: { + combo: "asara_shelu" + }, + }, + //国崎往人 + yukito_kongwu: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + game.pause(); + game.countChoose(); + setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, + score: get.rand(1, 5), + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + game.resume(); + }, 5000); + }; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在表演《小空飞天》...
    "; + ui.create.dialog(str).videoId = id; + }; + var chooseButton = function () { + lib.skill.yufeng.$playFlappyBird(5, "小空飞天"); + }; + //event.switchToAuto=switchToAuto; + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { + chooseButton(); + } else if (event.isOnline()) { + event.player.send(chooseButton); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + game.broadcastAll( + function (id, time) { + if (_status.connectMode) lib.configOL.choose_timeout = time; + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + }, + event.videoId, + event.time + ); + var result = event.result || result; + game.log(player, "获得了", "#g" + result.score + "分"); + if (!result.score) { + player.chooseToDiscard(2, true, "he"); + event.finish(); + return; + } + var list = []; + var list2 = []; + for (var i = 0; i < 5; i++) { + if (lib.skill.yukito_kongwu.moves[i].filter(player, true)) list.push(i); + else list2.push(i); + } + if (list.length >= result.score) list = list.randomGets(result.score); + else list.addArray(list2.randomGets(result.score - list.length)); + list.sort(); + var next = player.chooseButton([ + "控物:请选择一项", + [ + list.map((i) => { + return [i, lib.skill.yukito_kongwu.moves[i].prompt]; + }), + "textbutton", + ], + ]); + next.set("forced", true); + next.set("filterButton", function (button) { + return lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player); + }); + next.set("ai", function (button) { + if (lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player, true)) + return 1 + Math.random(); + return Math.random(); + }); + "step 2"; + var num = result.links[0]; + switch (num) { + case 0: + event.goto(3); + break; + case 1: + event.goto(5); + break; + case 2: + event.goto(7); + break; + case 3: + event.goto(9); + break; + case 4: + player.moveCard(true); + event.finish(); + break; + } + "step 3"; + player.chooseTarget(true, "令一名角色摸两张牌").set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.draw(2); + } + event.finish(); + "step 5"; + player.chooseTarget(true, "对一名角色造成1点伤害").set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 6"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.damage(); + } + event.finish(); + "step 7"; + player + .chooseTarget(true, "令一名已受伤的角色回复1点体力", function (card, player, target) { + return target.isDamaged(); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }); + "step 8"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.recover(); + } + event.finish(); + "step 9"; + player + .chooseTarget(true, "弃置一名角色区域内的两张牌", function (card, player, target) { + return target.countDiscardableCards(player, "hej") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 10"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "hej", true, 2); + } + event.finish(); + }, + moves: [ + { + prompt: "令一名角色摸两张牌", + filter: () => true, + }, + { + prompt: "对一名角色造成1点伤害", + filter(player, ai) { + if (!ai) return true; + return game.hasPlayer(function (current) { + return get.damageEffect(current, player, player) > 0; + }); + }, + }, + { + prompt: "令一名已受伤的角色回复1点体力", + filter(player, ai) { + return game.hasPlayer(function (current) { + if (current.isDamaged()) + return !ai || get.recoverEffect(current, player, player) > 0; + }); + }, + }, + { + prompt: "弃置一名角色区域内的两张牌", + filter(player, ai) { + return game.hasPlayer(function (current) { + return ( + current.countDiscardableCards(player, "hej", function (card) { + if (!ai) return true; + return ( + get.buttonValue({ + link: card, + }) * + get.attitude(player, current) > + 0 + ); + }) >= (ai ? 1 : Math.min(2, current.countDiscardableCards(player, "hej"))) + ); + }); + }, + }, + { + prompt: "移动场上的一张牌", + filter(player, ai) { + return player.canMoveCard(ai); + }, + }, + ], + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, + }, + }, + yukito_yaxiang: { + enable: "chooseToUse", + limited: true, + filter(event, player) { + return ( + event.type == "dying" && + (player.name1 == "key_yukito" || player.name2 == "key_yukito") + ); + }, + filterTarget(card, player, target) { + return target == _status.event.dying; + }, + selectTarget: -1, + skillAnimation: true, + animationColor: "key", + content() { + "step 0"; + player.awakenSkill("yukito_yaxiang"); + player.reinitCharacter("key_yukito", "key_crow", false); + "step 1"; + if (target.hp < 3) target.recover(3 - target.hp); + "step 2"; + var cards = target.getCards("j"); + if (cards.length) target.discard(cards); + "step 3"; + target.addSkills("misuzu_zhongyuan"); + }, + derivation: "misuzu_zhongyuan", + ai: { + save: true, + order: 4, + result: { + target(player, target) { + if (get.attitude(player, target) < 4) return false; + if ( + player.countCards("h", function (card) { + var mod2 = game.checkMod( + card, + player, + "unchanged", + "cardEnabled2", + player + ); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod( + card, + player, + target, + "unchanged", + "cardSavable", + player + ); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, target); + return savable; + }) >= + 1 - target.hp + ) + return false; + if (target == player || target == get.zhu(player)) return true; + return !player.hasUnknown(); + }, + }, + }, + }, + misuzu_zhongyuan: { + trigger: { player: "judge" }, + skillAnimation: true, + animationColor: "key", + logTarget: "player", + cost() { + "step 0"; + var str = + "你的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + ",是否发动【终愿】修改判定结果?"; + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + _status.imchoosing = false; + event._result = { + bool: false, + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var chooseButton = function (player, str) { + var event = _status.event; + player = player || event.player; + if (!event._result) event._result = {}; + var dialog = ui.create.dialog(str, "forcebutton", "hidden"); + event.dialog = dialog; + dialog.addText("花色"); + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var listi = ["spade", "heart", "club", "diamond"]; + for (var i = 0; i < listi.length; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = listi[i]; + table.appendChild(td); + td.innerHTML = "" + get.translation(listi[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + } + this.classList.add("bluebg"); + event._result.suit = link; + }); + } + dialog.content.appendChild(table); + dialog.addText("点数"); + var table2 = document.createElement("div"); + table2.classList.add("add-setting"); + table2.style.margin = "0"; + table2.style.width = "100%"; + table2.style.position = "relative"; + for (var i = 1; i < 14; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = i; + table2.appendChild(td); + var num = i; + td.innerHTML = "" + get.strNumber(num) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + } + this.classList.add("bluebg"); + event._result.number = link; + }); + } + dialog.content.appendChild(table2); + dialog.add("  "); + event.dialog.open(); + event.switchToAuto = function () { + event._result = { + bool: false, + }; + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }; + event.control = ui.create.control("ok", "cancel2", function (link) { + var result = event._result; + if (link == "cancel2") result.bool = false; + else { + if (!result.number || !result.suit) return; + result.bool = true; + } + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }); + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("selectable"); + } + game.pause(); + game.countChoose(); + }; + if (event.isMine()) { + chooseButton(player, str); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.player, str); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + var map = event.result || result; + if (map.bool) { + event.result = { + bool: true, + cost_data: map, + }; + } + }, + async content(event, trigger, player) { + var map = event.cost_data; + player.awakenSkill("misuzu_zhongyuan"); + game.log( + player, + "将判定结果修改为了", + "#g" + get.translation(map.suit + 2) + get.strNumber(map.number) + ); + trigger.fixedResult = { + suit: map.suit, + color: get.color({ suit: map.suit }), + number: map.number, + }; + player.popup(get.translation(map.suit + 2) + get.strNumber(map.number), "thunder"); + event.getParent("arrangeTrigger").finish(); + }, + }, + //凤千早 + chihaya_liewu: { + derivation: "chihaya_huairou", + mod: { + cardUsable(card) { + if (card.name == "sha") return Infinity; + }, + targetInRange(card) { + if (card.name == "sha") return true; + }, + }, + trigger: { player: "useCard2" }, + filter(event, player) { + var card = event.card; + var info = get.info(card); + if (info.type != "trick" || info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { + return true; + } + } + return false; + }, + async cost(event, trigger, player) { + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + event.result = await player + .chooseTarget(get.prompt("chihaya_liewu"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets) + .forResult(); + }, + autodelay: true, + async content(event, trigger, player) { + trigger.targets.addArray(event.targets); + game.log(event.targets, "也成为了", trigger.card, "的目标"); + }, + group: "chihaya_liewu2", + }, + chihaya_liewu2: { + trigger: { player: "disableEquipAfter" }, + forced: true, + filter(event, player) { + return !player.hasEnabledSlot() && !player._chihaya_liewu; + }, + skillAnimation: true, + animationColor: "orange", + content() { + player._chihaya_liewu = true; + player.loseMaxHp(4); + player.addSkills("chihaya_huairou"); + }, + }, + chihaya_huairou: { + audio: 2, + enable: "phaseUse", + position: "he", + filter: (event, player) => + player.hasCard( + (card) => lib.skill.chihaya_huairou.filterCard(card, player), + lib.skill.chihaya_huairou.position + ), + filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), + check(card) { + if (!_status.event.player.hasEquipableSlot(get.subtype(card))) return 5; + return 3 - get.value(card); + }, + content() { + player.recast(cards); + }, + discard: false, + lose: false, + delay: false, + prompt: "将一张装备牌置入弃牌堆并摸一张牌", + ai: { + order: 10, + result: { + player: 1, + }, + }, + }, + chihaya_youfeng: { + enable: "chooseToUse", + zhuanhuanji: true, + mark: true, + intro: { + content(storage, player) { + return storage + ? "每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。" + : "每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌。"; + }, + }, + marktext: "☯", + init(player) { + player.storage.chihaya_youfeng = false; + }, + hiddenCard(player, name) { + if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; + if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) + return false; + var type = get.type(name); + if (player.storage.chihaya_youfeng) return type == "basic"; + return type == "trick"; + }, + filter(event, player) { + if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; + if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) + return false; + var type = player.storage.chihaya_youfeng ? "basic" : "trick"; + for (var name of lib.inpile) { + if (get.type(name) != type) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog(event, player) { + const dialog = ui.create.dialog("游凤", "hidden"); + const equips = []; + if (player.storage.chihaya_youfeng) { + for (let i = 1; i < 6; i++) { + if (!player.hasEnabledSlot(i)) continue; + equips.push([i, get.translation("equip" + i)]); + } + if (equips.length > 0) dialog.add([equips, "tdnodes"]); + } + const type = player.storage.chihaya_youfeng ? "basic" : "trick"; + const list = []; + for (const name of lib.inpile) { + if (get.type(name) != type) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) { + list.push([type, "", name]); + if (name == "sha") { + for (let j of lib.inpile_nature) list.push([type, "", name, j]); + } + } + } + dialog.add([list, "vcard"]); + return dialog; + }, + filter(button) { + if ( + ui.selected.buttons.length && + typeof button.link == typeof ui.selected.buttons[0].link + ) + return false; + return true; + }, + select() { + if (_status.event.player.storage.chihaya_youfeng) return 2; + return 1; + }, + check(button) { + var player = _status.event.player; + if (typeof button.link == "number") { + if (!player.hasEmptySlot(button.link)) { + var card = player.getEquip(button.link); + if (card) { + var val = get.value(card); + if (val > 0) return 0; + return 5 - val; + } + } + switch (button.link) { + case 3: + return 4.5; + case 4: + return 4.4; + case 5: + return 4.3; + case 2: + return (3 - player.hp) * 1.5; + case 1: { + if ( + game.hasPlayer(function (current) { + return ( + (get.realAttitude || get.attitude)(player, current) < 0 && + get.distance(player, current) > 1 + ); + }) + ) + return 0; + return 3.2; + } + } + } + var name = button.link[2]; + var evt = _status.event.getParent(); + if (get.type(name) == "basic") { + if (name == "shan") return 2; + if (evt.type == "dying") { + if (get.attitude(player, evt.dying) < 2) return false; + if (name == "jiu") return 2.1; + return 1.9; + } + if (evt.type == "phase") + return player.getUseValue({ + name: name, + nature: button.link[3], + isCard: true, + }); + return 1; + } + if ( + ![ + "chuqibuyi", + "shuiyanqijunx", + "juedou", + "nanman", + "wanjian", + "shunshou", + "zhujinqiyuan", + ].includes(name) + ) + return 0; + var card = { name: name, isCard: true }; + if (["shunshou", "zhujinqiyuan"].includes(card.name)) { + if ( + !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) != 0 && + get.distance(player, current) <= 1 && + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return 0; + return player.getUseValue(card) - 7; + } + return player.getUseValue(card) - 4; + }, + backup(links, player) { + if (links.length == 1) + return { + filterCard() { + return false; + }, + selectCard: -1, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + popname: true, + precontent() { + player.logSkill("chihaya_youfeng"); + player.gainMaxHp(); + delete event.result.skill; + player.addTempSkill( + "chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), + "roundStart" + ); + player.changeZhuanhuanji("chihaya_youfeng"); + }, + }; + if (typeof links[1] == "number") links.reverse(); + var equip = links[0]; + var name = links[1][2]; + var nature = links[1][3]; + return { + filterCard() { + return false; + }, + selectCard: -1, + equip: equip, + viewAs: { + name: name, + nature: nature, + isCard: true, + }, + popname: true, + precontent() { + player.logSkill("chihaya_youfeng"); + player.disableEquip(lib.skill.chihaya_youfeng_backup.equip); + delete event.result.skill; + player.addTempSkill( + "chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), + "roundStart" + ); + player.changeZhuanhuanji("chihaya_youfeng"); + }, + }; + }, + prompt(links, player) { + if (links.length == 1) + return ( + "增加1点体力上限,视为使用" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + ); + if (typeof links[1] == "number") links.reverse(); + var equip = "equip" + links[0]; + var name = links[1][2]; + var nature = links[1][3]; + return ( + "废除自己的" + + get.translation(equip) + + "栏,视为使用" + + (get.translation(nature) || "") + + get.translation(name) + ); + }, + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + if (!player.storage.chihaya_youfeng || player.hasSkill("chihaya_youfeng_true")) + return false; + }, + order: 1, + result: { + player: 1, + }, + }, + }, + chihaya_youfeng_true: { charlotte: true }, + chihaya_youfeng_false: { charlotte: true }, + //七濑留美 + rumi_shuwu: { + mod: { + cardUsable(card) { + if (card.name == "sha") return Infinity; + }, + targetInRange(card) { + if (card.name == "sha") return true; + }, + }, + trigger: { player: "useCard2" }, + filter(event, player) { + var card = event.card; + var info = get.info(card); + if (info.type != "trick" || info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { + return true; + } + } + return false; + }, + autodelay: true, + async cost(event, trigger, player) { + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + const { result } = await player + .chooseTarget(get.prompt("rumi_shuwu"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + event.result = result; + }, + content() { + trigger.targets.addArray(event.targets); + game.log(event.targets, "也成为了", trigger.card, "的目标"); + }, + group: "rumi_shuwu2", + }, + rumi_shuwu2: { + trigger: { player: "phaseUseEnd" }, + forced: true, + filter(event, player) { + if (player.hp <= 3) return true; + if ( + player.getHistory("useCard", function (evt) { + return ( + evt.card.name == "sha" && + evt.addCount !== false && + evt.getParent("phaseUse") == event + ); + }).length <= 1 + ) + return true; + if ( + player.getHistory("sourceDamage", function (evt) { + return get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == event; + }).length == 0 + ) + return true; + return false; + }, + content() { + var num = 0; + if (player.hp <= 3) num++; + if ( + player.getHistory("useCard", function (evt) { + return ( + evt.card.name == "sha" && + evt.addCount !== false && + evt.getParent("phaseUse") == trigger + ); + }).length <= 1 + ) + num++; + if ( + player.getHistory("sourceDamage", function (evt) { + return ( + get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == trigger + ); + }).length == 0 + ) + num++; + player.draw(num); + player.addTempSkill("rumi_shuwu3"); + player.addMark("rumi_shuwu3", num, false); + }, + }, + rumi_shuwu3: { + mod: { + maxHandcard(player, num) { + return num + player.countMark("rumi_shuwu3"); + }, + }, + onremove: true, + }, + //凤咲夜 + sakuya_junbu: { + mod: { + targetInRange(card, player) { + if (player.countDisabledSlot() >= 1) return true; + }, + cardUsable(card, player) { + if (player.countDisabledSlot() >= 2) return Infinity; + }, + }, + trigger: { player: "useCard2" }, + filter(event, player) { + if (player.countDisabledSlot() >= 4) return true; + return lib.skill.sakuya_junbu.filter2.apply(this, arguments); + }, + filter2(event, player) { + if (player.countDisabledSlot() < 3) return false; + var card = event.card; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { + return true; + } + } + return false; + }, + async cost(event, trigger, player) { + const result = { bool: false }; + event.result = result; + if (player.countDisabledSlot() >= 4) { + result.bool = true; + if (!lib.skill.sakuya_junbu.filter2(trigger, player)) { + return; + } + } + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + const { result: result2 } = await player + .chooseTarget(get.prompt("sakuya_junbu"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + if (result2.bool) { + result.bool = true; + result.targets = result2.targets; + } + }, + async content(event, trigger, player) { + if (player.countDisabledSlot() >= 4) { + trigger.directHit.addArray(game.players); + game.log(trigger.card, "不可被响应"); + } + if (event.targets && event.targets.length > 0) { + trigger.targets.addArray(event.targets); + game.log(event.targets, "也成为了", trigger.card, "的目标"); + } + }, + group: "sakuya_junbu_damage", + subSkill: { + damage: { + trigger: { source: "damageBegin1" }, + forced: true, + sub: true, + filter(event, player) { + return !player.hasEnabledSlot() && event.getParent().type == "card"; + }, + logTarget: "player", + content() { + player.loseHp(); + trigger.num++; + }, + }, + }, + }, + //铃木央人 + hiroto_huyu: { + trigger: { global: "phaseUseEnd" }, + noHidden: true, + filter(event, player) { + return ( + player != event.player && + player.hasSkill("hiroto_huyu") && + !player.hasSkill("hiroto_zonglve") && + event.player.countCards("h") > 0 + ); + }, + async cost(event, trigger, player) { + event.result = await trigger.player + .chooseCard( + 2, + "h", + "是否对" + get.translation(player) + "发动【虎驭】?", + "将两张手牌交给该角色,然后令其获得〖纵略〗并于下回合获得该角色得到的所有牌" + ) + .set( + "goon", + (function () { + var source = trigger.player; + if (get.attitude(source, player) > 0) return 7; + if (source.hp > 2) return 4; + return 0; + })() + ) + .set("ai", function (card) { + return _status.event.goon - get.value(card); + }) + .forResult(); + }, + content() { + var target = trigger.player; + target.give(cards, player); + player.storage.hiroto_huyu2 = target; + player.addSkills("hiroto_zonglve"); + player.addSkill("hiroto_huyu2"); + }, + derivation: "hiroto_zonglve", + }, + hiroto_huyu2: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + async content(event, trigger, player) { + player.removeSkill("hiroto_huyu2"); + await player.removeSkills("hiroto_zonglve"); + player.removeGaintag("hiroto_huyu2"); + var target = player.storage.hiroto_huyu2; + if (target && target.isIn()) { + var cards = []; + player.getHistory("gain", function (evt) { + cards.addArray(evt.cards); + }); + var he = player.getCards("he"); + cards = cards.filter(function (card) { + return he.includes(card); + }); + if (cards.length) target.gain(cards, player, "giveAuto", "bySelf"); + } + }, + mark: "character", + intro: { content: "已成为$的工具人" }, + group: "hiroto_huyu_gain", + }, + hiroto_huyu_gain: { + trigger: { player: "gainBegin" }, + silent: true, + filter(event, player) { + if (player == _status.currentPhase) event.gaintag.add("hiroto_huyu2"); + return false; + }, + }, + hiroto_zonglve: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + }, + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; + }, + filterCard: true, + delay: false, + charlotte: true, + position: "h", + discard: false, + lose: false, + content() { + "step 0"; + player.choosePlayerCard(true, target, "h"); + "step 1"; + event.card = result.cards[0]; + player.$compare(cards[0], target, event.card); + game.log(player, "展示了", cards[0]); + game.log(target, "展示了", event.card); + game.delay(3.5); + "step 2"; + game.broadcastAll(ui.clear); + if (get.color(cards[0], player) == get.color(card, target)) { + target.damage("nocard"); + target.discard(card).animate = false; + } else player.gainPlayerCard(target, true, 2, "hej"); + }, + mod: { + maxHandcard(player, num) { + return num + 3; + }, + }, + ai: { + order: 7, + result: { + target: -1, + }, + }, + }, + hiroto_tuolao: { + trigger: { player: "phaseAfter" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return ( + player.phaseNumber > 1 && + !player.getHistory("lose", function (evt) { + return evt.getParent(2).name == "hiroto_huyu2"; + }).length + ); + }, + content() { + player.awakenSkill("hiroto_tuolao"); + player.draw(3); + player.changeSkills(["hiroto_zonglve"], ["hiroto_huyu"]); + }, + }, + //水织静久 + shizuku_sizhi: { + audio: 2, + enable: "phaseUse", + getResult(cards) { + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) + array.push(cards[j]); + } + var num = 0; + for (var k of array) { + num += get.number(k); + } + if (num == 13) list.push(array); + } + if (list.length) { + list.sort(function (a, b) { + if (a.length != b.length) return b.length - a.length; + return get.value(a) - get.value(b); + }); + return list[0]; + } + return list; + }, + usable: 1, + filterCard(card) { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + return get.number(card) + num <= 13; + }, + complexCard: true, + selectCard() { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + if (num == 13) return ui.selected.cards.length; + return ui.selected.cards.length + 2; + }, + check(card) { + var evt = _status.event; + if (!evt.shizuku_sizhi_choice) + evt.shizuku_sizhi_choice = lib.skill.shizuku_sizhi.getResult( + evt.player.getCards("he") + ); + if (!evt.shizuku_sizhi_choice.includes(card)) return 0; + return 1; + }, + position: "he", + content() { + player.draw(cards.length * 2).gaintag = ["shizuku_sizhi2"]; + player.addTempSkill("shizuku_sizhi2"); + }, + ai: { + order: 5, + result: { player: 1 }, + }, + }, + shizuku_sizhi2: { + onremove(player) { + player.removeGaintag("shizuku_sizhi2"); + }, + mod: { + targetInRange(card) { + if (!card.cards || !card.cards.length) return; + for (var i of card.cards) { + if (!i.hasGaintag("shizuku_sizhi2") || get.color(i) != "black") return; + } + return true; + }, + cardUsable(card) { + if (!card.cards || !card.cards.length) return; + for (var i of card.cards) { + if (!i.hasGaintag("shizuku_sizhi2") || get.color(i) != "black") return; + } + return Infinity; + }, + ignoredHandcard(card, player) { + if (card.hasGaintag("shizuku_sizhi2") && get.color(card) == "red") { + return true; + } + }, + cardDiscardable(card, player, name) { + if ( + name == "phaseDiscard" && + card.hasGaintag("shizuku_sizhi2") && + get.color(card) == "red" + ) { + return false; + } + }, + aiOrder(player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("shizuku_sizhi2") && + get.color(card) == "black" + ) + return num - 0.1; + }, + }, + }, + shizuku_biyi: { + trigger: { player: "damageEnd" }, + frequent: true, + content() { + "step 0"; + player.judge(); + "step 1"; + var num = result.number; + var next = player.chooseToDiscard( + "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", + function (card) { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + return get.number(card) + num <= _status.event.num; + }, + "he" + ); + next.set("num", num); + next.set("complexCard", true); + next.set("selectCard", function () { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + if (num == _status.event.num) return ui.selected.cards.length; + return ui.selected.cards.length + 2; + }); + next.set( + "cardResult", + (function () { + var cards = player.getCards("he"); + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) + array.push(cards[j]); + } + var numx = 0; + for (var k of array) { + numx += get.number(k); + } + if (numx == num) list.push(array); + } + if (list.length) { + list.sort(function (a, b) { + return get.value(a) - get.value(b); + }); + return list[0]; + } + return list; + })() + ); + next.set("ai", function (card) { + if (!_status.event.cardResult.includes(card)) return 0; + return 6 - get.value(card); + }); + "step 2"; + if (result.bool) player.recover(); + }, + }, + shizuku_sanhua: { + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "thunder", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("shizuku_sanhua"), lib.filter.notMe) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); + }, + async content(event, trigger, player) { + var target = event.targets[0]; + var names = []; + var cards = []; + while (cards.length < 4) { + var card = get.cardPile2(function (card) { + return ( + !cards.includes(card) && + !names.includes(card.name) && + get.type(card) == "basic" + ); + }); + if (card) { + cards.push(card); + names.push(card.name); + } else break; + } + if (cards.length) await target.gain(cards, "gain2"); + }, + }, + //鸣濑白羽 + shiroha_yuzhao: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + charlotte: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + player.addToExpansion(get.cards(game.countGroup()), "draw").gaintag.add("shiroha_yuzhao"); + }, + marktext: "兆", + intro: { + markcount: "expansion", + mark(dialog, content, player) { + var content = player.getExpansions("shiroha_yuzhao"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { + dialog.addAuto(content); + } else { + return "共有" + get.cnNumber(content.length) + "张牌"; + } + } + }, + content(content, player) { + var content = player.getExpansions("shiroha_yuzhao"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { + return get.translation(content); + } + return "共有" + get.cnNumber(content.length) + "张牌"; + } + }, + }, + group: "shiroha_yuzhao_umi", + }, + shiroha_yuzhao_umi: { + trigger: { global: "phaseBegin" }, + forced: true, + filter(event, player) { + return ( + player.getExpansions("shiroha_yuzhao").length > 0 && + get.distance(event.player, player) <= 1 + ); + }, + content() { + "step 0"; + event.num = game.countGroup(); + player.addToExpansion(get.cards(event.num)).gaintag.add("shiroha_yuzhao"); + "step 1"; + var next = player.chooseToMove(), + num = game.countGroup(); + next.set("prompt", "预兆:将" + get.cnNumber(num) + "张牌置于牌堆顶"); + next.set("num", num); + next.set("forced", true); + next.set("filterOk", function (moved) { + return moved[1].length == _status.event.num; + }); + next.set("filterMove", function (from, to, moved) { + if (to != 1) return true; + return moved[1].length < _status.event.num; + }); + next.set("list", [ + [get.translation(player) + "(你)的“兆”", player.getExpansions("shiroha_yuzhao")], + ["牌堆顶"], + ]); + next.set("processAI", function (list) { + var cards = list[0][1], + cards2 = cards.randomRemove(_status.event.num); + return [cards, cards2]; + }); + "step 2"; + if (result && result.bool) { + var cards = result.moved[1]; + player.lose(cards, ui.cardPile, "insert"); + } + game.updateRoundNumber(); + }, + }, + shiroha_guying: { + derivation: "shiroha_guying_rewrite", + trigger: { + player: "damageBegin3", + source: "damageBegin1", + }, + filter(event, player, name) { + if (!player.storage.shiroha_jiezhao && player.hasSkill("shiroha_guying_temp")) + return false; + if (name == "damageBegin3") return true; + return player != event.player; + }, + locked(skill, player) { + if (!player || !player.storage.shiroha_jiezhao) return true; + return false; + }, + cost() { + "step 0"; + var num = event.triggername == "damageBegin3" ? -1 : 1; + if (player.storage.shiroha_jiezhao || !player.hasSkill("shiroha_guying")) { + if (num > 0) + player.chooseBool( + get.prompt("shiroha_guying", trigger.player), + "进行判定。若判定结果为黑色,则即将对其造成的伤害+1" + ); + else + player.chooseBool( + get.prompt("shiroha_guying"), + "进行判定。若判定结果为红色,则即将受到的伤害-1" + ); + } else event._result = { bool: true }; + "step 1"; + event.result = result; + }, + content() { + "step 0"; + var num = event.triggername == "damageBegin3" ? -1 : 1; + event.num = num; + player.addTempSkill("shiroha_guying_temp"); + player.judge(function (card) { + return get.color(card) == + (_status.event.getParent("shiroha_guying").num > 0 ? "black" : "red") + ? 2 + : 0; + }).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 1"; + if (result.bool) trigger.num += num; + }, + }, + shiroha_guying_temp: { charlotte: true }, + shiroha_jiezhao: { + trigger: { global: "judge" }, + filter(event, player) { + return player.getExpansions("shiroha_yuzhao").length && event.player.isIn(); + }, + async cost(event, trigger, player) { + const list = player.getExpansions("shiroha_yuzhao"); + const { result } = await player + .chooseButton( + [ + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("shiroha_jiezhao"), + list, + "hidden", + ], + function (button) { + var card = button.link; + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + return result * attitude; + } + ) + .set("judging", trigger.player.judging[0]) + .set("filterButton", function (button) { + var player = _status.event.player; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }); + if (result.bool) { + event.result = { bool: true, cards: result.links }; + } + }, + //logSkill留给respond + popup: false, + async content(event, trigger, player) { + const cards = event.cards; + await player.respond(cards, "shiroha_jiezhao", "highlight", "noOrdering"); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + const oldJudgeCard = trigger.player.judging[0]; + trigger.player.judging[0] = cards[0]; + trigger.orderingCards.addArray(cards); + game.log(trigger.player, "的判定牌改为", cards[0]); + await game.cardsDiscard(oldJudgeCard); + await game.asyncDelay(2); + if (!player.getExpansions("shiroha_yuzhao").length) { + player.storage.shiroha_jiezhao = true; + player.gainMaxHp(); + player.recover(); + var list = ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"]; + var skill = list.randomGet(); + player.flashAvatar("shiroha_jiezhao", "key_" + skill.split("_")[0]); + await player.addSkills(skill); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 0.6, + }, + combo: "shiroha_yuzhao" + }, + derivation: ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"], + }, + //高城丈士朗 + jojiro_shensu: { + group: ["jojiro_shensu1", "jojiro_shensu2", "jojiro_shensu4"], + charlotte: true, + }, + jojiro_shensu1: { + trigger: { player: "phaseJudgeBefore" }, + async cost(event, trigger, player) { + const check = player.countCards("h") > 2; + event.result = await player + .chooseTarget( + get.prompt("jojiro_shensu"), + "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + } + ) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }) + .forResult(); + }, + async content(event, trigger, player) { + await trigger.cancel(); + player.skip("phaseDraw"); + await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); + }, + }, + jojiro_shensu2: { + trigger: { player: "phaseUseBefore" }, + filter(event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + async cost(event, trigger, player) { + const check = player.needsToDiscard(); + event.result = await player + .chooseCardTarget({ + prompt: get.prompt("jojiro_shensu"), + prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", + filterCard(card, player) { + return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); + }, + position: "he", + filterTarget(card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }, + ai1(card) { + if (_status.event.check) return 0; + return 6 - get.value(card); + }, + ai2(target) { + if (_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }, + check: check, + }) + .forResult(); + }, + async content(event, trigger, player) { + await trigger.cancel(); + await player.discard(event.cards[0]); + await player.useCard({ name: "sha", isCard: true }, event.targets[0]); + }, + }, + jojiro_shensu4: { + trigger: { player: "phaseDiscardBefore" }, + async cost(event, trigger, player) { + var check = + player.needsToDiscard() || + player.isTurnedOver() || + (player.hasSkill("shebian") && player.canMoveCard(true, true)); + event.result = await player + .chooseTarget( + get.prompt("jojiro_shensu"), + "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + } + ) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect( + target, + { name: "sha" }, + _status.event.player, + _status.event.player + ); + }) + .forResult(); + }, + async content(event, trigger, player) { + await trigger.cancel(); + await player.turnOver(); + await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); + }, + }, + jojiro_shunying: { + trigger: { player: "phaseEnd" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.getHistory("skipped").length > 0; + }, + content() { + "step 0"; + var num = player.getHistory("skipped").length; + event.num = num; + player.chooseToMoveChess(num, "瞬影:移动至多" + get.cnNumber(num) + "格或失去1点体力"); + "step 1"; + if (!result.bool) player.loseHp(); + else player.draw(num); + }, + }, + //神户小鸟 + kotori_yumo: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + charlotte: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + var list = ["wei", "shu", "wu", "qun", "jin"]; + for (var i of list) { + if (!player.hasMark("kotori_yumo_" + i)) { + player.addMark("kotori_yumo_" + i, 1, false); + game.log( + player, + "获得了一个", + lib.translate["kotori_yumo_" + i].replace(/魔物/g, "【魔物】") + ); + } + } + }, + group: ["kotori_yumo_damage", "kotori_yumo_gain"], + }, + kotori_yumo_damage: { + trigger: { global: "damageEnd" }, + forced: true, + filter(event, player) { + var name = "kotori_yumo_" + event.player.group; + return lib.skill[name] && !player.hasMark(name); + }, + popup: false, + content() { + game.log(player, "对", trigger.player, "发动了", "#g【驭魔】"); + var group = trigger.player.group; + player.popup("驭魔", get.groupnature(group)); + player.addMark("kotori_yumo_" + group, 1, false); + game.log( + player, + "获得了一个", + lib.translate["kotori_yumo_" + group].replace(/魔物/g, "【魔物】") + ); + }, + }, + kotori_yumo_gain: { + trigger: { player: "phaseBegin" }, + filter(event, player) { + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + for (var i in list) { + if (player.hasMark("kotori_yumo_" + list[i])) return true; + } + return false; + }, + async cost(event, trigger, player) { + const list = ["wei", "shu", "wu", "qun", "key", "jin"]; + const list2 = []; + for (const i of list) { + if (player.hasMark("kotori_yumo_" + i)) list2.push("kotori_skill_" + i); + } + list2.push("cancel2"); + const { control } = await player + .chooseControl(list2) + .set( + "prompt", + "###是否发动【驭魔】?###弃置对应的标记并获得下列技能中的一个,或点取消,不获得技能" + ) + .set( + "choice", + (function () { + if ( + list2.includes("kotori_skill_shu") && + player.countCards("h", function (card) { + return ( + get.name(card, player) == "sha" && player.getUseValue(card) > 0 + ); + }) > 1 + ) + return "kotori_skill_shu"; + if (list2.includes("kotori_skill_key") && player.hp > 1) + return "kotori_skill_key"; + if ( + list2.includes("kotori_skill_qun") && + player.isDamaged() && + player.needsToDiscard() > 1 + ) + return "kotori_skill_qun"; + return "cancel2"; + })() + ) + .set("ai", function () { + return _status.event.choice; + }) + .forResult(); + event.result = { + bool: control !== "cancel2", + cost_data: { control }, + }; + }, + content() { + const result = event.cost_data; + if (result.control != "cancel2") { + var name = "kotori_yumo_" + result.control.slice(13); + player.removeMark(name, 1, false); + game.log(player, "移去了一个", lib.translate[name].replace(/魔物/g, "【魔物】")); + player.addTempSkills(result.control); + game.log( + player, + "获得了技能", + lib.translate[name].replace( + /魔物/g, + "【" + get.translation(result.control) + "】" + ) + ); + } + }, + }, + kotori_skill_wei: { + trigger: { player: "phaseBegin" }, + filter(event, player) { + return player.countCards("he") > 0; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + prompt: get.prompt2(event.skill), + filterCard: lib.filter.cardDiscardable, + filterTarget(card, player, target) { + return player != target; + }, + position: "he", + ai1(card) { + return 6 - get.value(card); + }, + ai2(target) { + return ( + (1 / (1 + target.countCards("he"))) * + -get.attitude(_status.event.player, target) + ); + }, + }) + .forResult(); + }, + content() { + "step 0"; + player.discard(cards); + targets[0].chooseToDiscard( + "弃置一张牌,或令" + get.translation(player) + "摸一张牌", + "he" + ).ai = lib.skill.zhiheng.check; + "step 1"; + if (!result.bool) player.draw(); + }, + }, + kotori_skill_shu: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + trigger: { player: "phaseUseEnd" }, + forced: true, + filter(event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.card && evt.card.name == "sha" && evt.getParent("phaseUse") == event; + }).length > 1 + ); + }, + content() { + player.draw(); + }, + }, + kotori_skill_wu: { + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.countCards("h") != player.hp; + }, + content() { + player.draw(); + }, + }, + kotori_skill_qun: { + trigger: { player: "phaseDiscardBegin" }, + forced: true, + filter(event, player) { + return player.getDamagedHp() > 1 || player.countCards("h") - player.getHp() > 1; + }, + content() { + var num = 0; + if (player.getDamagedHp() > 1) num++; + if (player.countCards("h") - player.getHp() > 1) num++; + player.addMark("kotori_qunxin_temp", num, false); + player.addTempSkill("kotori_qunxin_temp", "phaseDiscardEnd"); + }, + }, + kotori_skill_key: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + player.draw(); + "step 1"; + player.changeHujia(1); + "step 2"; + var evt = event.getParent("phase"); + if (evt && evt.after) { + var next = player.loseHp(); + event.next.remove(next); + evt.after.push(next); + } + }, + ai: { + order: 10, + result: { + player(player) { + return player.hp - 1; + }, + }, + }, + }, + kotori_skill_jin: { + trigger: { player: "phaseDrawEnd" }, + filter(event, player) { + var hs = player.getCards("h"); + return ( + hs.length > 0 && + player.getHistory("gain", function (evt) { + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) + return false; + for (var i of evt.cards) { + if (hs.includes(i)) return true; + } + return false; + }).length > 0 + ); + }, + check(event, player) { + var hs = player.getCards("h"), + cards = [], + suits = []; + player.getHistory("gain", function (evt) { + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) + return false; + for (var i of evt.cards) { + if (hs.includes(i)) { + cards.add(i); + suits.add(get.suit(i, player)); + } + } + }); + return cards.length == suits.length; + }, + content() { + var hs = player.getCards("h"), + cards = [], + suits = []; + player.getHistory("gain", function (evt) { + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != trigger) + return false; + for (var i of evt.cards) { + if (hs.includes(i)) { + cards.add(i); + suits.add(get.suit(i, player)); + } + } + }); + player.showCards(cards, get.translation(player) + "发动了【晋势】"); + if (cards.length == suits.length) player.draw(); + }, + }, + kotori_qunxin_temp: { + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("kotori_qunxin_temp"); + }, + }, + }, + kotori_yumo_wei: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, + }, + kotori_yumo_shu: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, + }, + kotori_yumo_wu: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, + }, + kotori_yumo_qun: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, + }, + kotori_yumo_key: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, + }, + kotori_yumo_jin: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, + }, + kotori_huazhan: { + charlotte: true, + enable: "chooseToUse", + filter(event, player) { + var bool = false; + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + for (var i of list) { + if ( + player.hasMark("kotori_yumo_" + i) && + !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) + ) { + bool = true; + break; + } + } + return bool && event.filterCard({ name: "kaihua", isCard: true }, player, event); + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("###花绽###" + lib.translate.kotori_huazhan_info); + }, + chooseControl(event, player) { + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + var list2 = []; + for (var i of list) { + if ( + player.hasMark("kotori_yumo_" + i) && + !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) + ) + list2.push("kotori_yumo_" + i); + } + list2.push("cancel2"); + return list2; + }, + check() { + var player = _status.event.player; + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + var list2 = []; + for (var i of list) { + if ( + player.hasMark("kotori_yumo_" + i) && + !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) + ) + list2.push("kotori_yumo_" + i); + } + if (list2.includes("kotori_yumo_wei")) return "kotori_yumo_wei"; + if (list2.includes("kotori_yumo_wu")) return "kotori_yumo_wu"; + if (list2.includes("kotori_yumo_qun")) return "kotori_yumo_qun"; + if (list2.includes("kotori_yumo_key")) return "kotori_yumo_key"; + if ( + list2.includes("kotori_yumo_shu") && + game.hasPlayer(function (current) { + return current.group == "shu"; + }) + ) + return "kotori_yumo_shu"; + return "cancel2"; + }, + backup(result, player) { + return { + markname: result.control, + viewAs: { name: "kaihua", isCard: true }, + filterCard() { + return false; + }, + selectCard: -1, + precontent() { + delete event.result.skill; + var name = lib.skill.kotori_huazhan_backup.markname; + if (!player.storage.kotori_huazhan2) player.storage.kotori_huazhan2 = []; + player.storage.kotori_huazhan2.push(name); + player.addTempSkill("kotori_huazhan2"); + player.popup("花绽", get.groupnature(name.slice(12))); + game.log( + player, + "发动了技能", + lib.translate[name].replace(/魔物/g, "【花绽】") + ); + player.removeMark(name, 1, false); + game.log( + player, + "移去了一个", + lib.translate[name].replace(/魔物/g, "【魔物】") + ); + }, + }; + }, + }, + ai: { + order: 1, + result: { + player(player) { + if ( + player.countCards("he", function (card) { + if (get.type(card, player) == "equip") return get.value(card) < 6; + return get.value(card) < 5; + }) < 2 + ) + return 0; + return player.getUseValue({ name: "kaihua" }); + }, + }, + }, + }, + kotori_huazhan2: { onremove: true, charlotte: true }, + //三谷良一 + ryoichi_baoyi: { + trigger: { + player: "loseAfter", + global: [ + "gainAfter", + "equipAfter", + "addJudgeAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + filterTarget(card, player, target) { + return target != player && (target.hasSex("female") || target.countCards("hej") > 0); + }, + filter(event, player) { + var evt = event.getl(player); + return ( + evt && + evt.es && + evt.es.length > 0 && + game.hasPlayer(function (target) { + return lib.skill.ryoichi_baoyi.filterTarget; + }) + ); + }, + forced: true, + content() { + "step 0"; + event.count = trigger.getl(player).es.length; + player.draw(event.count); + "step 1"; + event.count--; + if ( + game.hasPlayer(function (target) { + return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); + }) + ) { + player + .chooseTarget(true, lib.skill.ryoichi_baoyi.filterTarget, "请选择【爆衣】的目标") + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + "step 2"; + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + if (target.hasSex("female")) target.loseHp(); + else player.discardPlayerCard(target, 2, "hej", true); + } else event.finish(); + "step 3"; + if ( + event.count && + game.hasPlayer(function (target) { + return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); + }) + ) + event.goto(1); + }, + }, + ryoichi_tuipi: { + mod: { + targetEnabled(card) { + if (card.name == "shunshou" || card.name == "guohe") return false; + }, + }, + trigger: { player: "phaseDiscardBegin" }, + forced: true, + content() { + trigger.setContent(lib.skill.ryoichi_tuipi.phaseDiscardContent); + }, + phaseDiscardContent() { + "step 0"; + event.num = Math.max( + 0, + player.countCards("he", (card) => !player.canIgnoreHandcard(card)) - + player.getHandcardLimit() + ); + if (event.num <= 0) event.finish(); + else { + if (lib.config.show_phase_prompt) { + player.popup("弃牌阶段"); + } + } + event.trigger("phaseDiscard"); + "step 1"; + player.chooseToDiscard(num, true, "he"); + "step 2"; + event.cards = result.cards; + }, + }, + //乙坂有宇 + yuu_lveduo: { + mod: { + cardEnabled(card, player) { + if (player.isTurnedOver()) return false; + }, + cardRespondable(card, player) { + if (player.isTurnedOver()) return false; + }, + cardSavable(card, player) { + if (player.isTurnedOver()) return false; + }, + }, + trigger: { global: "phaseBeginStart" }, + filter(event, player) { + return ( + player != event.player && + !event.player._trueMe && + !player.getStorage("yuu_lveduo").includes(event.player) && + !player.isTurnedOver() && + !player.hasSkill("yuu_lveduo4") + ); + }, + charlotte: true, + check(event, player) { + if (get.attitude(player, event.player) > 0) return false; + if (event.player.hasJudge("lebu") || !event.player.needsToDiscard()) return false; + return true; + }, + logTarget: "player", + content() { + "step 0"; + player.turnOver(); + "step 1"; + if (player.isTurnedOver()) { + player.addTempSkill("yuu_lveduo4", "roundStart"); + if (!player.storage.yuu_lveduo) player.storage.yuu_lveduo = []; + player.storage.yuu_lveduo.push(trigger.player); + trigger.player._trueMe = player; + game.addGlobalSkill("autoswap"); + if (trigger.player == game.me) { + game.notMe = true; + if (!_status.auto) ui.click.auto(); + } + player.addSkill("yuu_lveduo2"); + trigger.player.addSkill("yuu_lveduo3"); + } + }, + }, + yuu_lveduo2: { + trigger: { + player: "turnOverEnd", + }, + lastDo: true, + charlotte: true, + forceDie: true, + forced: true, + silent: true, + filter(event, player) { + return !player.isTurnedOver(); + }, + content() { + var target = game.findPlayer(function (current) { + return current._trueMe == player; + }); + if (target) { + if (target == game.me) { + if (!game.notMe) game.swapPlayerAuto(target._trueMe); + else delete game.notMe; + if (_status.auto) ui.click.auto(); + } + delete target._trueMe; + target.removeSkill("yuu_lveduo3"); + var skills = target.getStockSkills(true, true).filter(function (skill) { + var info = get.info(skill); + return info && info.charlotte == true; + }); + if (skills.length) { + target.removeSkills(skills); + player.addSkills(skills); + lib.translate.yuu_lveduo_info = lib.translate.yuu_lveduo_full_info; + } + if (target.name == "key_yusa") { + delete target.storage.dualside; + target.storage.dualside_over = true; + target.unmarkSkill("dualside"); + target.removeSkill("dualside"); + } else if (target.name == "key_misa") { + delete target.storage.dualside; + target.storage.dualside_over = true; + target.unmarkSkill("dualside"); + target.reinit("key_misa", "key_yusa"); + target.removeSkill("yusa_misa"); + target.removeSkill("dualside"); + target.turnOver(false); + } + } + player.removeSkill("yuu_lveduo2"); + }, + }, + yuu_lveduo3: { + trigger: { + player: ["phaseAfter", "dieAfter"], + global: "phaseBefore", + }, + lastDo: true, + charlotte: true, + forceDie: true, + forced: true, + silent: true, + content() { + player.removeSkill("yuu_lveduo3"); + }, + onremove(player) { + if (player._trueMe && player._trueMe.isTurnedOver()) player._trueMe.turnOver(); + }, + }, + yuu_lveduo4: { charlotte: true }, + //松下五段 + godan_yuanyi: { + trigger: { player: "phaseBegin" }, + forced: true, + content() { + "step 0"; + var num = game.roundNumber; + if (num && typeof num == "number") player.draw(Math.min(3, num)); + "step 1"; + trigger.phaseList.splice(trigger.num, 0, "phaseUse|godan_yuanyi"); + }, + }, + godan_feiqu: { + inherit: "doruji_feiqu", + }, + godan_xiaoyuan: { + trigger: { player: "changeHp" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "soil", + filter(event, player) { + return event.num < 0 && player.hp < 4; + }, + content() { + player.awakenSkill("godan_xiaoyuan"); + player.loseMaxHp(3); + player.draw(3); + player.removeSkills("godan_feiqu"); + }, + }, + //游佐 + abyusa_jueqing: { + audio: 2, + trigger: { source: "damageBegin2" }, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player != event.player && !player.storage.abyusa_jueqing_rewrite; + }, + prompt2(event, player) { + var num = get.cnNumber(2 * event.num, true); + return ( + "令即将对其造成的伤害翻倍至" + + num + + "点,并令自己失去" + + get.cnNumber(event.num) + + "点体力" + ); + }, + check(event, player) { + return ( + player.hp > event.num && + event.player.hp > event.num && + !event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) && + get.attitude(player, event.player) < 0 + ); + }, + locked(skill, player) { + return player && player.storage.abyusa_jueqing_rewrite; + }, + logTarget: "player", + content() { + player.loseHp(trigger.num); + trigger.num *= 2; + player.storage.abyusa_jueqing_rewrite = true; + }, + derivation: "abyusa_jueqing_rewrite", + group: "abyusa_jueqing_rewrite", + subSkill: { + rewrite: { + audio: "abyusa_jueqing", + trigger: { source: "damageBefore" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.storage.abyusa_jueqing_rewrite == true; + }, + check() { + return false; + }, + content() { + trigger.cancel(); + trigger.player.loseHp(trigger.num); + }, + ai: { + jueqing: true, + skillTagFilter(player) { + return player.storage.abyusa_jueqing_rewrite == true; + }, + }, + }, + }, + }, + abyusa_dunying: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + filter(event, player) { + return player.isDamaged(); + }, + content() { + player.draw(player.getDamagedHp()); + }, + mod: { + globalTo(from, to, num) { + return num + to.getDamagedHp(); + }, + }, + }, + //水濑秋子 + akiko_dongcha: { + trigger: { global: "phaseBefore" }, + forced: true, + filter(event, player) { + return get.mode() == "identity" && game.phaseNumber == 0; + }, + content() { + var func = function () { + game.countPlayer(function (current) { + current.setIdentity(); + }); + }; + if (player == game.me) func(); + else if (player.isOnline()) player.send(func); + if (!player.storage.zhibi) player.storage.zhibi = []; + player.storage.zhibi.addArray(game.players); + }, + ai: { + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; + }, + }, + }, + //美坂香里 + kaori_siyuan: { + enable: "phaseUse", + filter(event, player) { + return player.countCards("he", lib.skill.kaori_siyuan.filterCard); + }, + filterCard(card) { + return ["equip", "delay"].includes(get.type(card, false)); + }, + filterTarget(card, player, target) { + if (player == target) return false; + var card = ui.selected.cards[0]; + if (get.type(card, false) == "delay") return target.canAddJudge({ name: card.name }); + return target.canEquip(card); + }, + discard: false, + lose: false, + prepare: "give", + content() { + "step 0"; + var card = cards[0]; + if (get.type(card, false) == "equip") target.equip(card); + else target.addJudge(card); + "step 1"; + var list = []; + for (var i of lib.inpile) { + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push([type, "", i, j]); + } + } + player + .chooseButton(["是否视为使用一张基本牌或普通锦囊牌?", [list, "vcard"]]) + .set("filterButton", function (button) { + return player.hasUseTarget({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }) + .set("ai", function (button) { + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + "step 2"; + if (result.bool) { + player.chooseUseTarget(true, { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }); + } + }, + ai: { + basic: { + order: 10, + }, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); + return 0; + }, + }, + }, + }, + //美坂栞 + shiori_huijuan: { + trigger: { global: "phaseJieshuBegin" }, + locked: true, + filter(event, player) { + return ( + event.player != player && + event.player.getHistory("useCard", function (evt) { + return ( + evt.isPhaseUsing() && + ["basic", "trick"].includes(get.type(evt.card)) && + player.hasUseTarget({ + name: evt.card.name, + nature: evt.card.nature, + isCard: true, + }) + ); + }).length > 0 + ); + }, + async cost(event, trigger, player) { + const list = []; + trigger.player.getHistory("useCard", function (evt) { + if (!evt.isPhaseUsing() || !["basic", "trick"].includes(get.type(evt.card))) return; + if (evt.card.name == "sha" && evt.card.nature) list.add("sha:" + evt.card.nature); + else list.add(evt.card.name); + }); + for (var i = 0; i < list.length; i++) { + if (list[i].indexOf("sha:") == 0) list[i] = ["基本", "", "sha", list[i].slice(4)]; + else list[i] = [get.type(list[i]), "", list[i]]; + } + const { result } = await player + .chooseButton([get.prompt("shiori_huijuan"), [list, "vcard"]]) + .set("filterButton", function (button) { + return player.hasUseTarget({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }) + .set("ai", function (button) { + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + if (result.bool) { + event.result = { + bool: true, + cost_data: { + card: { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }, + }, + }; + } + }, + async content(event, trigger, player) { + player.chooseUseTarget(true, event.cost_data.card); + player.getStat("skill").shiori_huijuan = 1; + }, + group: "shiori_huijuan_discard", + }, + shiori_huijuan_discard: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + var num = 0; + var stat = player.stat; + for (var i = stat.length - 2; i--; i >= 0) { + if (stat[i].isMe) break; + if (stat[i].skill && stat[i].skill.shiori_huijuan) num++; + } + return num >= Math.max(2, game.countPlayer() / 2); + }, + forced: true, + content() { + "step 0"; + if (!player.countDiscardableCards(player, "ej")) event._result = { bool: false }; + else + player.discardPlayerCard(player, "ej").set("ai", function (button) { + var card = button.link; + var player = _status.event.player; + if (get.position(card) == "j") return 7 + Math.random(); + return 4 + player.needsToDiscard() - get.value(card); + }); + "step 1"; + if (!result.bool) player.skip("phaseUse"); + }, + }, + //野村美希 + miki_shenqiang: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + player.equip(game.createCard2("miki_hydrogladiator", "club", 6)); + player.equip(game.createCard2("miki_binoculars", "diamond", 6)); + }, + mod: { + canBeDiscarded(card) { + if (get.position(card) == "e" && ["equip1", "equip5"].includes(get.subtype(card))) + return false; + }, + }, + }, + miki_huanmeng: { + inherit: "kamome_huanmeng", + }, + miki_zhiluo: { + trigger: { global: "phaseEnd" }, + filter(event, player) { + return !event.player.countCards("e") && player.inRange(event.player); + }, + locked: true, + async cost(event, trigger, player) { + event.result = { bool: true, cost_data: { index: 0 } }; + if (player.canUse("sha", trigger.player, false)) { + const { index } = await player + .chooseControl() + .set("prompt", "制裸:请选择一项") + .set("choiceList", [ + "摸一张牌", + "视为对" + get.translation(trigger.player) + "使用一张【杀】", + ]) + .set("ai", function () { + if ( + get.effect( + _status.event.getTrigger().player, + { name: "sha" }, + _status.event.player + ) > 0 + ) + return 1; + return 0; + }) + .forResult(); + event.result.cost_data.index = index; + } + }, + async content(event, trigger, player) { + const result = event.cost_data; + if (result.index == 0) { + player.logSkill("miki_zhiluo"); + player.draw(); + } else player.useCard({ name: "sha", isCard: true }, trigger.player, "miki_zhiluo"); + }, + }, + miki_hydrogladiator_skill: { + trigger: { + source: "damageSource", + }, + locked: true, + popup: "海德洛", + filter(event, player) { + return ( + event.getParent().name == "sha" && + game.hasPlayer(function (current) { + return ( + (current == event.player || + (current != player && get.distance(current, event.player) <= 1)) && + current.countDiscardableCards(player, "he") > 0 + ); + }) + ); + }, + cost() { + "step 0"; + var list = []; + var choiceList = []; + if (trigger.player.countDiscardableCards(player, "he") > 0) { + list.push(true); + choiceList.push("弃置" + get.translation(trigger.player) + "的两张牌"); + } + if ( + game.hasPlayer(function (current) { + return current != player && get.distance(current, trigger.player) <= 1; + }) + ) { + list.push(false); + choiceList.push( + "弃置所有至" + get.translation(trigger.player) + "距离为1的角色的各一张牌" + ); + } + event.list = list; + if (list.length == 1) event._result = { index: 0 }; + else { + player + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", "海德洛格拉迪尔特·改") + .set("ai", function () { + var player = _status.event.player; + var source = _status.event.getTrigger().player; + var num = game.countPlayer(function (current) { + if ( + current != player && + get.distance(current, source) <= 1 && + current.countDiscardableCards(player, "he") > 0 + ) + return -get.sgn(get.attitude(player, current)); + }); + if (num > Math.min(2, source.countDiscardableCards(player, "he"))) return 1; + return 0; + }); + } + "step 1"; + if (event.list[result.index]) { + event.result = { + bool: true, + cost_data: { type: "single" }, + targets: [trigger.player], + }; + } else { + event.result = { + bool: true, + cost_data: { type: "multiple" }, + targets: game + .filterPlayer(function (current) { + return current != player && get.distance(current, trigger.player) <= 1; + }) + .sortBySeat(), + }; + } + }, + content() { + "step 0"; + if (event.cost_data.type == "single") { + player.discardPlayerCard(targets[0], "he", 2, true); + event.finish(); + } + "step 1"; + var target = targets.shift(); + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true); + if (targets.length) event.redo(); + }, + }, + miki_binoculars: { + locked: true, + ai: { + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; + }, + }, + }, + //关根诗织&入江美雪 + shiorimiyuki_banyin: { + audio: 2, + trigger: { player: ["damageEnd", "recoverEnd"] }, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.isDamaged(); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("shiorimiyuki_banyin"), + "令一名其他角色回复1点体力", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + target.recover(); + }, + }, + shiorimiyuki_tingxian: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + async cost(event, trigger, player) { + const { control, index } = await player + .chooseControl("一张", "两张", "三张", "cancel2") + .set("prompt", get.prompt2("shiorimiyuki_tingxian")) + .set("ai", function () { + var player = _status.event.player; + var max = Math.min(player.hp + 1, player.maxHp); + var min = Math.min(Math.max(max - 2, max - player.hp), 3); + if (min) return min - 1; + return 3; + }) + .forResult(); + if (control != "cancel2") event.result = { bool: true, cost_data: index }; + }, + async content(event, trigger, player) { + let num = 1 + event.cost_data; + await player.draw(num).set("gaintag", ["shiorimiyuki_tingxian"]); + await player.recover(); + player.addTempSkill("shiorimiyuki_tingxian2"); + }, + group: "shiorimiyuki_tingxian1", + }, + shiorimiyuki_tingxian1: { audio: true }, + shiorimiyuki_tingxian2: { + audio: true, + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + mod: { + aiOrder(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) + return num + 2; + }, + aiValue(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) + return 0; + }, + }, + filter(event, player) { + return ( + player.countCards("h", function (card) { + return card.hasGaintag("shiorimiyuki_tingxian"); + }) > 0 + ); + }, + content() { + player.loseHp( + player.countCards("h", function (card) { + return card.hasGaintag("shiorimiyuki_tingxian"); + }) + ); + player.removeGaintag("shiorimiyuki_tingxian"); + }, + }, + //中津静流 + shizuru_nianli: { + enable: "chooseToUse", + charlotte: true, + prompt: "展示一张♦/♣/♥/♠手牌,然后视为使用一张雷杀/闪/桃/无懈可击", + viewAs(cards, player) { + var name = false; + var nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "thunder"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; + } + if (name) return { name: name, nature: nature, isCard: true }; + return null; + }, + check(card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; + var name2; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("h", function (card) { + return get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.suit(card, player)) return 1; + return 0; + } + return 1; + }, + ignoreMod: true, + filterCard(card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan" }, player, event)) return true; + if (name == "diamond" && filter({ name: "sha", nature: "thunder" }, player, event)) + return true; + if (name == "spade" && filter({ name: "wuxie" }, player, event)) return true; + if (name == "heart" && filter({ name: "tao" }, player, event)) return true; + return false; + }, + filter(event, player) { + if (player.hasSkill("shizuru_nianli_round")) return false; + var filter = event.filterCard; + if ( + filter({ name: "sha", nature: "thunder" }, player, event) && + player.countCards("h", { suit: "diamond" }) + ) + return true; + if (filter({ name: "shan" }, player, event) && player.countCards("h", { suit: "club" })) + return true; + if (filter({ name: "tao" }, player, event) && player.countCards("h", { suit: "heart" })) + return true; + if (filter({ name: "wuxie" }, player, event) && player.countCards("h", { suit: "spade" })) + return true; + return false; + }, + precontent() { + player.logSkill("shizuru_nianli"); + player.addTempSkill("shizuru_nianli_round", "roundStart"); + player.showCards(get.translation(player) + "发动了【念力】", event.result.cards.slice(0)); + event.result.card.cards = []; + event.result.cards = []; + delete event.result.skill; + delete event.result.card.suit; + delete event.result.card.number; + event.getParent().addCount = false; + event.getParent().shizuru_nianli = true; + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + if (player.hasSkill("shizuru_nianli_round")) return false; + var name; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; + } + if (!player.countCards("h", { suit: name })) return false; + }, + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("h", function (card) { + return get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "thunder" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "thunder" : null, + }); + if (temp > max) max = temp; + } + } + max /= 1.1; + return max; + } + return 2; + }, + }, + hiddenCard(player, name) { + if (name == "wuxie") + return ( + player.countCards("h", function (card) { + return _status.connectMode || get.suit(card) == "spade"; + }) > 0 && !player.hasSkill("shizuru_nianli_round") + ); + if (name == "tao") + return ( + player.countCards("h", { suit: "heart" }) > 0 && + !player.hasSkill("shizuru_nianli_round") + ); + return false; + }, + group: "shizuru_nianli_clear", + subSkill: { + round: { + mark: true, + intro: { content: "本轮已发动" }, + }, + clear: { + trigger: { player: "useCardAfter" }, + lastDo: true, + silent: true, + filter(event, player) { + return event.getParent().shizuru_nianli == true; + }, + content() { + player.getHistory("useCard").remove(trigger); + }, + }, + }, + }, + shizuru_benzhan: { + trigger: { global: ["useCard", "respond"] }, + usable: 1, + filter(event, player) { + return ( + Array.isArray(event.respondTo) && + event.respondTo[0] != event.player && + [event.respondTo[0], event.player].includes(player) + ); + }, + async cost(event, trigger, player) { + event.type = get.type(trigger.card) == "basic"; + var prompt = event.type + ? "令一名角色摸两张牌或弃置两张牌" + : "令一名角色回复1点体力或对其造成1点伤害"; + event.result = await player + .chooseTarget(get.prompt("shizuru_benzhan"), prompt) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.getParent().type) { + var att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) return -att; + if (target.countCards("he") == 1 && att < 0) att /= 2; + return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); + } + return Math.max( + get.recoverEffect(target, player, player), + get.damageEffect(target, player, player) + ); + }) + .forResult(); + }, + content() { + "step 0"; + event.type = get.type(trigger.card) == "basic"; + var target = event.targets[0]; + event.target = target; + var trans = get.translation(target); + var list; + if (event.type) { + if (!target.countCards("he")) event._result = { index: 0 }; + else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; + } else { + if (target.isHealthy()) event._result = { index: 1 }; + else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; + } + player + .chooseControl() + .set("choiceList", list) + .set( + "choice", + (function () { + if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; + return get.recoverEffect(target, player, player) > + get.damageEffect(target, player, player) + ? 0 + : 1; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); + "step 1"; + player.addExpose(0.2); + if (event.type) { + if (result.index == 0) target.draw(2); + else target.chooseToDiscard(2, "he", true); + } else { + if (result.index == 0) target.recover(); + else target.damage(); + } + }, + }, + //岬镜子 + kyoko_juwu: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + filter(event, player) { + if (player == _status.currentPhase) return false; + var cards = event.getd(); + if (!cards.length) return false; + cards.removeArray(event.getd(player)); + for (var card of cards) { + if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") + return true; + } + return false; + }, + autodelay(event, player) { + return event.delay === false; + }, + async cost(event, trigger, player) { + var cards = trigger.getd(); + cards.removeArray(trigger.getd(player)); + cards = cards.filter(function (card) { + if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") + return true; + }); + const { result } = await player + .chooseButton([get.prompt("kyoko_juwu"), cards], [1, cards.length]) + .set("ai", function () { + return 1; + }); + if (result.bool) + event.result = { + bool: true, + cards: result.links, + }; + }, + async content(event, trigger, player) { + await player.gain(event.cards, "gain2", "log"); + }, + }, + kyoko_zhengyi: { + group: ["kyoko_jingce", "kyoko_shelie", "kyoko_zhiheng"], + count(player) { + var list = []; + player.countCards("e", function (card) { + list.add(get.suit(card, player)); + }); + return list.length; + }, + }, + kyoko_jingce: { + trigger: { player: ["phaseUseEnd", "phaseJieshuBegin"] }, + filter(event, player) { + var num = lib.skill.kyoko_zhengyi.count(player); + if (!num || (event.name == "phaseUse") == num > 3) return false; + return ( + player.getHistory("useCard", function (evt) { + return event.name != "phaseUse" || evt.getParent("phaseUse") == event; + }).length >= player.hp + ); + }, + frequent: true, + content() { + "step 0"; + if (trigger.name == "phaseUse") { + player.draw(2); + event.finish(); + return; + } + var list = [], + history = player.getHistory("useCard"); + for (var i of history) { + list.add(get.suit(i.card)); + if (list.length >= player.hp) break; + } + if (list.length >= player.hp) event.goon = true; + else + player + .chooseControl("摸牌阶段", "出牌阶段") + .set("prompt", "精策:选择要执行的额外阶段"); + "step 1"; + if (event.goon || result.index == 0) { + var next = player.phaseDraw(); + event.next.remove(next); + trigger.getParent().next.push(next); + } + if (event.goon || result.index == 1) { + var next = player.phaseUse(); + event.next.remove(next); + trigger.getParent().next.push(next); + } + }, + }, + kyoko_shelie: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter(event, player) { + return !event.numFixed && lib.skill.kyoko_zhengyi.count(player) > 1; + }, + content() { + "step 0"; + trigger.changeToZero(); + event.cards = get.cards(5); + game.cardsGotoOrdering(event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) { + str = "涉猎:获取花色各不相同的牌"; + } else { + str = "涉猎"; + } + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + event.time = get.utc(); + game.addVideo("showCards", player, ["涉猎", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + "step 1"; + var next = player.chooseButton([0, 5], true); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; + } + return true; + }); + next.set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 2"; + if (result.bool && result.links) { + event.cards2 = result.links; + } else { + event.finish(); + } + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); + } + "step 3"; + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + player.gain(cards2, "log", "gain2"); + }, + }, + kyoko_zhiheng: { + enable: "phaseUse", + usable: 1, + position: "he", + filter(event, player) { + return lib.skill.kyoko_zhengyi.count(player) > 2; + }, + prompt() { + var str = "弃置任意张牌并摸等量的牌"; + if (lib.skill.kyoko_zhengyi.count(_status.event.player) > 3) + str += ",若弃置了所有手牌则多摸一张牌。"; + return str; + }, + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + check(card) { + var player = _status.event.player; + if (get.position(card) == "h") { + return 8 - get.value(card); + } + return 6 - get.value(card); + }, + content() { + "step 0"; + player.discard(cards); + event.num = 1; + var hs = player.getCards("h"); + if (!hs.length || lib.skill.kyoko_zhengyi.count(player) < 4) event.num = 0; + else + for (var i = 0; i < hs.length; i++) { + if (!cards.includes(hs[i])) { + event.num = 0; + break; + } + } + "step 1"; + player.draw(event.num + cards.length); + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + //音无结弦(3v3) + yuzuru_bujin: { + global: "yuzuru_bujin2", + trigger: { global: "phaseDrawBegin" }, + forced: true, + logTarget: "player", + filter(event, player) { + return event.player != player && event.player.isFriendOf(player); + }, + content() { + trigger.num++; + }, + }, + yuzuru_bujin2: { + mod: { + globalFrom(from, to, num) { + return ( + num - + game.countPlayer(function (current) { + return ( + current != from && + current.hasSkill("yuzuru_bujin") && + current.isFriendOf(from) + ); + }) + ); + }, + }, + }, + //西园美鱼 + mio_tuifu: { + trigger: { global: "damageBegin1" }, + forced: true, + filter(event, player) { + return event.source && event.source.sameSexAs(event.player); + }, + content() { + player.draw(); + }, + }, + mio_tishen: { + trigger: { player: "phaseZhunbeiBegin" }, + limited: true, + unique: true, + charlotte: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player.isDamaged(); + }, + check(event, player) { + return player.hp <= 1 || player.getDamagedHp() > 1; + }, + content() { + player.awakenSkill(event.name); + var num = player.maxHp - player.hp; + player.recover(num); + player.draw(num); + if (_status.characterlist && _status.characterlist.includes("key_midori")) { + player.reinitCharacter("key_mio", "key_midori", false); + } + }, + }, + //西园美鸟 + midori_nonghuan: { + enable: "phaseUse", + charlotte: true, + filter(event, player) { + return (player.getStat("skill").midori_nonghuan || 0) < player.hp; + }, + filterTarget(card, player, target) { + var stat = player.getStat("midori_nonghuan"); + return ( + target != player && + (!stat || !stat.includes(target)) && + target.countGainableCards(player, "hej") > 0 + ); + }, + content() { + "step 0"; + var stat = player.getStat(); + if (!stat.midori_nonghuan) stat.midori_nonghuan = []; + stat.midori_nonghuan.push(target); + player.gainPlayerCard(target, "hej", true); + player.draw(); + "step 1"; + if (player.countCards("he") > 0) + player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); + else event.goto(3); + "step 2"; + player.give(result.cards, target); + "step 3"; + var history = game.getGlobalHistory("cardMove"); + for (var i = 0; i < history.length; i++) { + if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); + } + game.countPlayer2(function (current) { + var history = current.getHistory("lose"); + for (var i = 0; i < history.length; i++) { + if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); + } + var history = current.getHistory("gain"); + for (var i = 0; i < history.length; i++) { + if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); + } + }); + }, + ai: { + order: 9, + result: { + player() { + return lib.card.shunshou.ai.result.player.apply(this, arguments); + }, + target() { + return lib.card.shunshou.ai.result.target.apply(this, arguments); + }, + }, + }, + }, + midori_tishen: { + trigger: { player: "phaseZhunbeiBegin" }, + limited: true, + charlotte: true, + unique: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player.isDamaged(); + }, + check(event, player) { + return player.hp <= 1 || player.getDamagedHp() > 1; + }, + content() { + player.awakenSkill(event.name); + var num = player.maxHp - player.hp; + player.recover(num); + player.draw(num); + if (_status.characterlist && _status.characterlist.includes("key_mio")) { + player.reinitCharacter("key_midori", "key_mio", false); + } + }, + }, + //立华奏 + kanade_mapo: { + audio: 2, + derivation: "mapodoufu", + enable: "chooseToUse", + viewAs: { name: "mapodoufu" }, + filterCard: { suit: "heart" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "heart" }) > 0; + }, + position: "hes", + mod: { + selectTarget(card, player, range) { + if (card.name == "mapodoufu" && range[1] != -1) range[1]++; + }, + }, + check(card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return ( + player.canUse("mapodoufu", current) && + get.effect(current, { name: "mapodoufu" }, player, player) > 0 + ); + }) > 1 + ) + return 6 - get.value(card); + return 4 - get.value(card); + }, + }, + kanade_benzhan: { + audio: 3, + trigger: { global: ["useCard", "respond"] }, + usable: 1, + filter(event, player) { + return ( + Array.isArray(event.respondTo) && + event.respondTo[0] != event.player && + [event.respondTo[0], event.player].includes(player) + ); + }, + async cost(event, trigger, player) { + event.type = get.type(trigger.card) == "basic"; + var prompt = event.type + ? "令一名角色摸两张牌或弃置两张牌" + : "令一名角色回复1点体力或对其造成1点伤害"; + event.result = await player + .chooseTarget(get.prompt("kanade_benzhan"), prompt) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.getParent().type) { + var att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) return -att; + if (target.countCards("he") == 1 && att < 0) att /= 2; + return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); + } + return Math.max( + get.recoverEffect(target, player, player), + get.damageEffect(target, player, player) + ); + }) + .forResult(); + }, + content() { + "step 0"; + event.type = get.type(trigger.card) == "basic"; + var target = event.targets[0]; + event.target = target; + var trans = get.translation(target); + var list; + if (event.type) { + if (!target.countCards("he")) event._result = { index: 0 }; + else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; + } else { + if (target.isHealthy()) event._result = { index: 1 }; + else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; + } + player + .chooseControl() + .set("choiceList", list) + .set( + "choice", + (function () { + if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; + return get.recoverEffect(target, player, player) > + get.damageEffect(target, player, player) + ? 0 + : 1; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); + "step 1"; + player.addExpose(0.2); + if (event.type) { + if (result.index == 0) target.draw(2); + else target.chooseToDiscard(2, "he", true); + } else { + if (result.index == 0) target.recover(); + else target.damage(); + } + }, + }, + //音无结弦 + yuzuru_wuxin: { + trigger: { player: "phaseJieshuBegin" }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + filterTarget() { + if (ui.selected.cards.length) return false; + return true; + }, + filterCard() { + if (ui.selected.targets.length) return false; + return lib.filter.cardDiscardable.apply(this, arguments); + }, + selectTarget() { + if (!ui.selected.cards.length) return [1, 1]; + return [0, 0]; + }, + selectCard() { + if (ui.selected.targets.length) return [0, 0]; + if (!ui.selected.cards.length) return [0, 2]; + return [2, 2]; + }, + prompt: get.prompt2("yuzuru_wuxin"), + complexCard: true, + complexTarget: true, + ai1(card) { + var player = _status.event.player; + if (player.hp > 3) return 0; + return player.getDamagedHp() * 2 - get.value(card); + }, + ai2(target) { + if (player.hp < 4 || target.hasSkillTag("nogain")) return 0; + return get.attitude(_status.event.player, target); + }, + }) + .forResult(); + }, + async content(event, trigger, player) { + if (event.cards && event.cards.length) { + player.discard(event.cards); + player.recover(); + } else { + const target = event.targets[0]; + player.loseHp(); + target.draw(2); + } + }, + }, + yuzuru_deyi: { + derivation: [ + "yuzuru_kunfen", + "yuzuru_quji", + "yuzuru_wangsheng", + "yuzuru_kunfen_rewrite", + "yuzuru_quji_rewrite", + ], + trigger: { global: "dieAfter" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "orange", + content() { + player.awakenSkill("yuzuru_deyi"); + player.changeSkills( + ["yuzuru_kunfen", "yuzuru_quji", "yuzuru_wangsheng"], + ["yuzuru_wuxin"] + ); + player.loseMaxHp(); + player.recover(); + }, + }, + yuzuru_kunfen: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { + "step 0"; + if (!player.storage._yuzuru_sss) player.loseHp(); + player.draw(2); + "step 1"; + if (player.countCards("he") < 2) event.finish(); + else { + player.chooseCardTarget({ + selectCard: 2, + filterTarget: lib.filter.notMe, + prompt: "是否交给一名其他角色两张牌?", + position: "he", + ai1(card) { + var player = _status.event.player; + if (player.maxHp - player.hp == 1 && card.name == "du") return 30; + var check = player.countCards("h") - 2; + if (check < 1) return 0; + if (player.hp > 1 && check < 2) return 0; + return get.unuseful(card) + 9; + }, + ai2(target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length == 1 && ui.selected.cards[0].name == "du") + return 1 - att; + return att - 2; + }, + }); + } + "step 2"; + if (result.bool) player.give(result.cards, result.targets[0]); + }, + }, + yuzuru_quji: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + selectCard() { + var player = _status.event.player; + return player.getDamagedHp(); + }, + filterTarget(card, player, target) { + return target != player && target.hp < target.maxHp; + }, + filter(event, player) { + return player.hp < player.maxHp; + }, + selectTarget() { + return [1, ui.selected.cards.length]; + }, + complexSelect: true, + check(card) { + if (!_status.event.player.storage._yuzuru_sss && get.color(card) == "black") return -1; + return 9 - get.value(card); + }, + line: { color: [194, 117, 92] }, + content() { + "step 0"; + target.recover(); + "step 1"; + if (target == targets[targets.length - 1] && !player.storage._yuzuru_sss) { + for (var i = 0; i < cards.length; i++) { + if (get.color(cards[i], player) == "black") { + player.loseHp(); + break; + } + } + } + }, + ai: { + result: { + target: 1, + }, + order: 6, + }, + }, + yuzuru_wangsheng: { + trigger: { player: "dieBegin" }, + forced: true, + juexingji: true, + unique: true, + skillAnimation: true, + animationColor: "soil", + content() { + "step 0"; + trigger.cancel(); + player.awakenSkill("yuzuru_wangsheng"); + player.storage._yuzuru_sss = true; + if (player.countCards("he") > 0) { + player.chooseCardTarget({ + selectCard: [1, Infinity], + filterTarget: lib.filter.notMe, + prompt: "将任意张牌交给一名其他角色,或点【取消】。", + position: "he", + ai1(card) { + var player = _status.event.player; + if ( + get.suit(card, false) == "heart" && + game.hasPlayer(function (current) { + return ( + current.hasSkill("kanade_mapo") && + get.attitude(player, current) > 0 + ); + }) + ) + return 1; + return 0; + }, + ai2(kanade) { + if ( + kanade.hasSkill("kanade_mapo") && + get.attitude(_status.event.player, kanade) > 0 + ) + return 2; + return 0; + }, + }); + } else event.goto(2); + "step 1"; + if (result.bool) player.give(result.cards, result.targets[0]); + "step 2"; + player.loseMaxHp(); + "step 3"; + if (player.hp < 2) player.recover(2 - player.hp); + }, + }, + //空门苍 + ao_xishi: { + trigger: { + player: ["useCard", "respond"], + target: "useCardToTargeted", + }, + forced: true, + filter(event, player, name) { + return ( + (name == "useCard" || name == "respond" || event.player != player) && + get.suit(event.card) == "diamond" + ); + }, + content() { + player.draw(); + }, + }, + ao_kuihun: { + trigger: { global: "dying" }, + logTarget: "player", + line: "thunder", + filter(event, player) { + return player != event.player; + }, + content() { + "step 0"; + player.draw(); + "step 1"; + if (!trigger.player.countCards("h")) event.finish(); + else + player + .chooseButton(["选择一张牌作为「蝶」", trigger.player.getCards("h")]) + .set("ai", function (button) { + var val = get.buttonValue(button); + if (get.attitude(_status.event.player, get.owner(button.link)) <= 0) + return 10 + val; + if (val <= 0) return 20; + if (button.link.name == "tao" || button.link.name == "jiu") return 0; + return 1 / val; + }); + "step 2"; + if (result.bool) { + player + .addToExpansion(result.links, trigger.player, "give") + .set("log", false) + .gaintag.add("ao_diegui"); + game.log(result.links, "飞向了", player); + } + }, + locked: false, + mod: { + targetInRange(card, player) { + const cardSuit = get.suit(card, false); + const list = player.getExpansions("ao_diegui"); + for (let i = 0; i < list.length; i++) { + if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) return true; + } + }, + cardUsable(card, player) { + const cardSuit = get.suit(card, false); + const list = player.getExpansions("ao_diegui"); + for (let i = 0; i < list.length; i++) { + if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) + return Infinity; + } + }, + maxHandcard(player, num) { + return num + player.getExpansions("ao_diegui").length; + }, + }, + }, + ao_shixin: { + derivation: "ao_diegui", + trigger: { player: "phaseZhunbeiBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "key", + unique: true, + filter(event, player) { + var list = player.getExpansions("ao_diegui"); + var list2 = []; + for (var i = 0; i < list.length; i++) { + list2.add(get.suit(list[i], false)); + } + return list2.length > 2; + }, + content() { + player.awakenSkill("ao_shixin"); + player.changeSkills(["ao_diegui"], ["ao_kuihun"]); + player.gainMaxHp(); + player.recover(); + }, + ai: { + combo: "ao_kuihun" + }, + }, + ao_diegui: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.getExpansions("ao_diegui").length > 0; + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("蝶归", player.getExpansions("ao_diegui"), "hidden"); + }, + backup(links, player) { + return { + card: links, + filterCard() { + return false; + }, + selectCard: -1, + filterTarget: true, + delay: false, + content: lib.skill.ao_diegui.contentx, + line: "thunder", + ai: { + result: { + target(player, target) { + if (target != player && target.hasSkillTag("nogain")) return 0; + var num = 1; + if (target.isTurnedOver()) num += 2; + if (target.isLinked()) num += 0.5; + return num; + }, + }, + }, + }; + }, + prompt(links, player) { + return ( + "选择一名角色,令其获得" + + get.translation(links[0]) + + ",摸两张牌并将武将牌复原。" + ); + }, + }, + contentx() { + "step 0"; + player.give(lib.skill.ao_diegui_backup.card, target, "visible"); + target.draw(2); + "step 1"; + target.link(false); + "step 2"; + target.turnOver(false); + }, + intro: { + name: "七影蝶", + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { order: 1, result: { player: 1 } }, + }, + //直井文人 + ayato_jianshen: { + mod: { + cardnature(card, player) { + if (get.name(card) == "sha") return "kami"; + }, + }, + ai: { threaten: 3 }, + }, + ayato_zonghuan: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content() { + "step 0"; + player + .chooseButton( + ["请选择" + get.translation(target) + "的一张手牌", target.getCards("h")], + true + ) + .set("ai", get.buttonValue); + "step 1"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + if (!lib.filter.cardEnabled(card, target)) event._result = { bool: false }; + else { + var targets = game.players.slice(0); + var info = get.info(card); + var range; + if (!info.notarget) { + var select = get.copy(info.selectTarget); + if (select == undefined) { + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, target, range, "selectTarget", target); + } + if (info.notarget || range[1] == -1) { + if (range[1] == -1) { + for (var i = 0; i < targets.length; i++) { + if (!target.canUse(card, targets[i])) { + targets.splice(i--, 1); + } + } + if (targets.length) { + event.targets2 = targets; + } else { + event.finish(); + return; + } + } else event.targets2 = []; + var next = player.chooseBool(); + next.set( + "prompt", + event.prompt || + "是否令" + + get.translation(target) + + (event.targets2.length ? "对" : "") + + get.translation(event.targets2) + + "使用" + + get.translation(card) + + "?" + ); + next.set("prompt2", "或点「取消」,令其将此牌置入弃牌堆"); + next.ai = function () { + var eff = 0; + for (var i = 0; i < event.targets2.length; i++) { + eff += get.effect(event.targets2[i], card, target, player); + } + return eff > 0; + }; + } else { + var next = player.chooseTarget(); + next.set("_get_card", card); + next.set("source", target); + next.set("filterTarget", function (card, player, target) { + return lib.filter.filterTarget( + _status.event._get_card, + _status.event.source, + target + ); + }); + next.set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt._get_card, evt.source, evt.player); + }); + next.set("selectTarget", function () { + var card = get.card(), + player = _status.event.source; + if (card == undefined) return; + var range; + var select = get.copy(get.info(card).selectTarget); + if (select == undefined) { + if (get.info(card).filterTarget == undefined) return [0, 0]; + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); + return range; + }); + next.set( + "prompt", + event.prompt || + "选择" + + get.translation(target) + + "使用" + + get.translation(card) + + "的目标" + ); + next.set("prompt2", "或点「取消」令其将此牌置入弃牌堆"); + } + } + } else event.finish(); + "step 2"; + if (result.bool) { + target.useCard(card, event.targets2 || result.targets, false, "noai"); + player.draw(); + } else { + target.lose(card, ui.discardPile); + target.$throw(card); + game.log(target, "将", card, "置入了弃牌堆"); + } + }, + ai: { order: 10, result: { target: -1 } }, + }, + //古河渚 + nagisa_tiandu: { + trigger: { player: "judgeEnd" }, + charlotte: true, + frequent(event) { + if (event.result.card.name == "du") return false; + return true; + }, + check(event) { + if (event.result.card.name == "du") return false; + return true; + }, + filter(event, player) { + return get.position(event.result.card, true) == "o"; + }, + content() { + player.gain(trigger.result.card, "gain2"); + }, + }, + nagisa_fuxin: { + trigger: { + global: ["gainAfter", "loseAfter", "loseAsyncAfter", "damageEnd"], + }, + filterx(event, player) { + var source = _status.currentPhase; + if (event.name == "damage") { + return event.player.isAlive() && event.player != source; + } else if (event.name == "lose") { + if (event.type != "discard" || event.player == source || event.player.isDead()) + return false; + if ((event.discarder || event.getParent(2).player) == event.player) return false; + if (!event.getl(event.player).hs.length) return false; + return true; + } else if (event.name == "gain") { + if (event.giver || event.getParent().name == "gift") return false; + var cards = event.getg(event.player); + if (!cards.length) return false; + return game.hasPlayer(function (current) { + if (current == event.player || current == source) return false; + var hs = event.getl(current).hs; + for (var i of hs) { + if (cards.includes(i)) return true; + } + return false; + }); + } else if (event.type == "gain") { + if (event.giver || !event.player || event.player == source || event.player.isDead()) + return false; + var hs = event.getl(event.player); + return game.hasPlayer(function (current) { + if (current == event.player) return false; + var cards = event.getg(current); + for (var i of cards) { + if (hs.includes(i)) return true; + } + }); + } else if (event.type == "discard") { + if (!event.discarder) return false; + return game.hasPlayer(function (current) { + return ( + current != source && + current != event.discarder && + event.getl(current).hs.length > 0 + ); + }); + } + return false; + }, + filter(event, player, triggername, target) { + return target.isIn(); + }, + getIndex(trigger, player, triggername) { + if (!lib.skill.nagisa_fuxin.filterx(trigger, player)) return false; + const targets = [], + source = _status.currentPhase; + if (trigger.name == "gain") { + const cards = trigger.getg(trigger.player); + targets.addArray( + game.filterPlayer(function (current) { + if (current === trigger.player || current === source) return false; + const hs = trigger.getl(current).hs; + for (const i of hs) { + if (cards.includes(i)) return true; + } + return false; + }) + ); + } else if (trigger.name == "loseAsync" && trigger.type == "discard") { + targets.addArray( + game.filterPlayer(function (current) { + return ( + current != trigger.discarder && + current != source && + trigger.getl(current).hs.length > 0 + ); + }) + ); + } else targets.push(trigger.player); + targets.sortBySeat(); + return targets; + }, + logTarget: (event, player, triggername, target) => target, + check(event, player, triggername, target) { + const source = _status.currentPhase; + if (source && source.isIn() && get.attitude(player, source) > 0) return false; + return get.attitude(player, target) > 0; + }, + async content(event, trigger, player) { + const target = event.indexedData; + const { result } = await target.judge(); + if (result.color === "red" && target.isIn()) { + await target.draw(); + } else { + const source = _status.currentPhase; + if (source && source.isIn() && source.countCards("h") > 0) { + source.chooseToDiscard("he", true); + } + } + }, + ai: { expose: 0.2 }, + }, + //冈崎朋也 + tomoya_shangxian: { + trigger: { player: "phaseUseBegin" }, + mark: true, + locked: true, + intro: { + content(s) { + return "计算与其他角色的距离时始终从" + (s ? "逆" : "顺") + "时针计算"; + }, + }, + content() { + player.draw(); + player.storage.tomoya_shangxian = !player.storage.tomoya_shangxian; + }, + ai: { + left_hand: true, + right_hand: true, + skillTagFilter(player, tag) { + return (player.storage.tomoya_shangxian == true) == (tag == "left_hand"); + }, + }, + }, + tomoya_wangjin: { + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player != event.player && + !player.hasSkill("tomoya_wangjin_" + player.inRange(event.player)) + ); + }, + logTarget: "player", + check(event, player) { + var target = event.player; + var bool = player.inRange(target); + if (!bool) { + if (target.hp > player.hp) + return get.effect(target, { name: "sha", isCard: true }, player, player) > 0; + var temp = target; + while (true) { + temp = temp.getNext(); + if (temp == target || temp == _status.roundStart) return true; + if (temp == player) continue; + if ( + temp.hp > player.hp && + !player.inRange(temp) && + get.effect(temp, { name: "sha", isCard: true }, player, player) > 0 + ) + return false; + } + } + if (get.attitude(player, target) < 2) return false; + if (target.hp < player.hp && !target.hasSkillTag("nogain")) return true; + var temp = target; + while (true) { + temp = temp.getNext(); + if (temp == target || temp == _status.roundStart) return true; + if (temp == player) continue; + if ( + temp.hp < player.hp && + player.inRange(temp) && + get.attitude(player, target) >= 2 && + !temp.hasSkillTag("nogain") + ) + return false; + } + }, + content() { + "step 0"; + event.bool = player.inRange(trigger.player); + player.addTempSkill("tomoya_wangjin_" + event.bool, "roundStart"); + if (event.bool) { + trigger.player.draw(); + } else player.draw(2); + "step 1"; + if (event.bool) { + if (trigger.player.hp < player.hp) player.draw(); + else event.finish(); + } else { + if (player.countDiscardableCards(trigger.player, "h") > 0) + trigger.player.discardPlayerCard(player, "h", true); + else event.finish(); + } + "step 2"; + if (event.bool) { + player.chooseCard("h", "是否交给" + get.translation(trigger.player) + "一张牌?"); + } else { + event.finish(); + if (player.hp >= trigger.player.hp) return; + var card = { name: "sha", isCard: true }; + if (player.canUse(card, trigger.player, false)) + player.useCard(card, trigger.player, false); + } + "step 3"; + if (result.bool) player.give(result.cards, target); + }, + subSkill: { + true: { charlotte: true }, + false: { charlotte: true }, + }, + ai: { expose: 0.2 }, + }, + //野田 + noda_fengcheng: { + audio: 2, + trigger: { + player: "gainAfter", + }, + forced: true, + filter(event, player) { + return get.itemtype(event.source) == "player" && event.bySelf != true; + }, + check(event, player) { + return get.attitude(player, event.source) > 0; + }, + logTarget: "source", + content() { + trigger.source.draw(); + }, + }, + noda_xunxin: { + audio: 2, + enable: "phaseUse", + viewAs: { name: "juedou" }, + filter(event, player) { + return (player.getStat("skill").noda_xunxin || 0) < player.hp; + }, + filterTarget(event, player, target) { + if (target.hp < player.hp) return false; + return lib.filter.filterTarget.apply(this, arguments); + }, + selectCard: -1, + filterCard() { + return false; + }, + group: "noda_xunxin2", + }, + noda_xunxin2: { + trigger: { player: "juedouAfter" }, + popup: false, + forced: true, + filter(event, player) { + if (event.target.isDead()) return false; + return event.turn && event.turn.countCards("he") > 0; + }, + content() { + "step 0"; + event.giver = trigger.turn; + event.gainner = event.giver == player ? trigger.target : player; + event.giver.chooseCard("he", true, "交给" + get.translation(event.gainner) + "一张牌"); + "step 1"; + event.giver.give(result.cards, event.gainner); + }, + }, + //日向秀树 + hinata_qiulve: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter(player) { + return ( + player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) > 0 + ); + }, + viewAs: { name: "sha" }, + filterCard(card, player) { + return get.type(card) != "basic"; + }, + locked: false, + position: "hes", + check(card) { + var val = get.value(card); + if (val >= 6) return 0; + if (get.color(card) == "black") return 12 - val; + return 6 - val; + }, + mod: { + targetInRange(card, player, target) { + if (_status.event.skill == "hinata_qiulve") return true; + }, + }, + group: "hinata_qiulve_clear", + ai: { + respondSha: true, + skillTagFilter(player) { + return ( + player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) > 0 + ); + }, + }, + }, + hinata_qiulve_clear: { + trigger: { player: "useCard1" }, + firstDo: true, + silent: true, + filter(event, player) { + return event.skill == "hinata_qiulve"; + }, + content() { + if (get.color(trigger.card) == "red") trigger.directHit.addArray(game.players); + else if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card; + if (stat.sha) stat.sha--; + } + }, + }, + hinata_ehou: { + audio: 2, + trigger: { global: "useCardAfter" }, + //这个也是chooseToUse 改不了 + direct: true, + filter(event, player) { + return ( + player != event.player && + event.targets && + event.targets.includes(player) && + (_status.connectMode || player.hasSha()) + ); + }, + content() { + "step 0"; + player.chooseToUse({ + logSkill: "hinata_ehou", + preTarget: trigger.player, + prompt: "是否发动【扼喉】,对" + get.translation(trigger.player) + "使用一张【杀】?", + filterCard(card, player) { + return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); + }, + filterTarget(card, player, target) { + return ( + target == _status.event.preTarget && + lib.filter.filterTarget.apply(this, arguments) + ); + }, + addCount: false, + }); + "step 1"; + if ( + result.bool && + player.getHistory("sourceDamage", function (evt) { + return evt.getParent(4) == event; + }).length + ) + player.draw(); + }, + }, + //高桥久子 + hisako_yinbao: { + audio: 2, + trigger: { player: ["damageEnd", "recoverAfter"] }, + content() { + "step 0"; + player.judge(function (card) { + return get.suit(card) == "spade" ? 2 : -2; + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (result.bool && game.hasPlayer((current) => current != player)) { + player + .chooseTarget(lib.filter.notMe, true, "选择一名其他角色,对其造成1点雷属性伤害") + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder"); + }); + } else event.finish(); + "step 2"; + var target = result.targets[0]; + player.addExpose(0.2); + player.line(target, "thunder"); + target.damage("thunder"); + }, + }, + hisako_zhuanyun: { + trigger: { player: "judgeBegin" }, + forced: true, + charlotte: true, + silent: true, + filter(event, player) { + return !event.directresult; + }, + content() { + var tempcard = false, + temp = -Infinity; + for (var i = 0; i < ui.cardPile.childElementCount; i++) { + var card = ui.cardPile.childNodes[i]; + var temp2 = trigger.judge(card); + if (temp2 > temp) { + tempcard = card; + temp = temp2; + } + } + if (tempcard) trigger.directresult = tempcard; + }, + ai: { luckyStar: true }, + }, + //直枝理树 + riki_spwenji: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("riki_spwenji"), function (card, player, target) { + return target != player && target.countCards("he"); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }) + .forResult(); + }, + content() { + "step 0"; + target = targets[0]; + event.target = target; + target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); + "step 1"; + if (result.bool) { + player.addTempSkill("riki_spwenji_respond"); + player.storage.riki_spwenji_respond = get.type2(result.cards[0], target); + event.target.give(result.cards, player, true); + } + }, + ai: { expose: 0.2 }, + subSkill: { + respond: { + onremove: true, + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + audio: "riki_spwenji", + filter(event, player) { + return get.type2(event.card) == player.storage.riki_spwenji_respond; + }, + content() { + trigger.directHit.addArray(game.players); + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return get.type2(arg.card) == player.storage.riki_spwenji_respond; + }, + }, + }, + }, + }, + riki_nvzhuang: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { + player.draw(player.countCards("h") == 0 ? 2 : 1); + }, + }, + riki_mengzhong: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + derivation: "riki_chongzhen", + juexingji: true, + unique: true, + skillAnimation: true, + animationColor: "key", + filter(event, player) { + var num = 0; + player.getAllHistory("gain", function (evt) { + if (evt.getParent().name == "riki_spwenji") num += evt.cards.length; + }); + return num >= 3; + }, + content() { + player.awakenSkill("riki_mengzhong"); + player.removeSkills("riki_spwenji"); + player.gainMaxHp(); + player.recover(); + player.addSkills("riki_chongzhen"); + }, + ai: { + combo: "riki_spwenji" + }, + }, + riki_chongzhen: { + trigger: { + player: "phaseUseBegin", + }, + filter(event, player) { + return game.hasPlayer((current) => player.canCompare(current)); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("riki_chongzhen"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + return ( + (-get.attitude(player, target) * (1 + target.countCards("e"))) / + (1 + target.countCards("j")) + ); + }) + .forResult(); + }, + content() { + "step 0"; + var target = targets[0]; + event.target = target; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + var num = 0; + if (target.countCards("h")) num++; + if (target.countCards("e")) num++; + if (target.countCards("j")) num++; + if (num) { + player + .gainPlayerCard(target, num, "hej", true) + .set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if ( + get.position(button.link) == + get.position(ui.selected.buttons[i].link) + ) + return false; + } + return true; + }); + } + } else { + player.addTempSkill("zishou2", "phaseEnd"); + } + }, + ai: { expose: 0.2 }, + }, + //来谷唯湖 + yuiko_fenglun: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return player.canCompare(current); + }) + ); + }, + filterTarget(card, player, target) { + return player.canCompare(target); + }, + content() { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) player.addTempSkill("yuiko_fenglun2", "phaseUseEnd"); + }, + ai: { + order: 10, + result: { target: -1 }, + }, + }, + yuiko_fenglun2: { + mod: { + cardUsable() { + return Infinity; + }, + targetInRange() { + return true; + }, + }, + }, + yuiko_dilve: { + enable: "chooseCard", + check() { + return 20; + }, + filter(event) { + return event.type == "compare" && !event.directresult; + }, + onCompare(player) { + return game.cardsGotoOrdering(get.bottomCards()).cards; + }, + group: "yuiko_dilve_gain", + subSkill: { + gain: { + trigger: { + player: ["chooseToCompareAfter", "compareMultipleAfter"], + target: ["chooseToCompareAfter", "compareMultipleAfter"], + }, + filter(event, player) { + if (event.preserve) return false; + return [event.card1, event.card2].filterInD("od").length > 0; + }, + prompt2(event, player) { + return "获得" + get.translation([event.card1, event.card2].filterInD("od")); + }, + content() { + player.gain([trigger.card1, trigger.card2].filterInD("od"), "gain2", "log"); + }, + }, + }, + }, + //多鲁基 + doruji_feiqu: { + trigger: { + player: "useCard", + target: "useCardToTargeted", + }, + forced: true, + filter(event, player) { + return event.card.name == "sha"; + }, + content() { + if (trigger.name == "useCard") trigger.directHit.addArray(game.players); + else trigger.directHit.add(player); + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return arg.card.name == "sha"; + }, + }, + global: "doruji_feiqu_ai", + }, + doruji_feiqu_ai: { + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return ( + arg.card.name == "sha" && + (arg.target.hasSkill("doruji_feiqu") || arg.target.hasSkill("godan_feiqu")) + ); + }, + }, + }, + //千里朱音 + akane_jugu: { + audio: 2, + mod: { + maxHandcard(player, num) { + return num + player.maxHp; + }, + }, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + player.draw(player.maxHp); + }, + }, + akane_quanqing: { + enable: "phaseUse", + filterCard: true, + filterTarget(card, player, target) { + return target != player && player.inRange(target); + }, + position: "he", + check(card) { + var val = get.value(card); + var num = card.number; + if (num > 10) return 8 - val; + var player = _status.event.player; + if (player.getUseValue(card, null, true) > player.getUseValue({ name: "guohe" })) + return 0; + if (num > 6) return 6 - val; + return 3 - val; + }, + content() { + "step 0"; + var num = cards[0].number; + var trans = get.translation(target); + var list = ["令" + trans + "摸一张牌"]; + event.addIndex = 0; + if (num > 6) { + if (target.countDiscardableCards(player, "hej") > 0) + list.push("弃置" + trans + "区域内的一张牌"); + else event.addIndex++; + } + if (num > 10) list.push("对" + trans + "造成1点伤害"); + if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl() + .set("choiceList", list) + .set("index", list.length - 1) + .set("ai", function () { + return _status.event.index; + }); + "step 1"; + if (result.index > 0) result.index += event.addIndex; + switch (result.index) { + case 0: + target.draw(); + break; + case 1: + player.discardPlayerCard(target, "hej", true); + break; + case 2: + target.damage("nocard"); + break; + } + }, + ai: { + order: 4, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (card) { + if (card.number > 10) return get.damageEffect(target, player, target); + if (card.number > 6) + return lib.card.guohe.ai.result.target.apply(this, arguments); + return 1; + } + }, + }, + }, + }, + akane_yifu: { + unique: true, + global: "akane_yifu2", + zhuSkill: true, + }, + akane_yifu2: { + audio: 2, + enable: "phaseUse", + discard: false, + line: true, + log: false, + delay: false, + lose: false, + prepare(cards, player, targets) { + targets[0].logSkill("akane_yifu"); + }, + prompt() { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target != player && target.hasZhuSkill("akane_yifu", player); + }); + var str = "将一张手牌交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; + return str; + }, + filter(event, player) { + if (player.group != "key") return false; + if (player.countCards("h") == 0) return 0; + return game.hasPlayer(function (target) { + return ( + target != player && + target.hasZhuSkill("akane_yifu", player) && + !target.hasSkill("akane_yifu3") + ); + }); + }, + filterCard: true, + filterTarget(card, player, target) { + return ( + target != player && + target.hasZhuSkill("akane_yifu", player) && + !target.hasSkill("akane_yifu3") + ); + }, + content() { + "step 0"; + player.give(cards, target); + target.addTempSkill("akane_yifu3", "phaseUseEnd"); + target.draw(); + "step 1"; + if (target.countCards("h") > 0) + target + .chooseCard("h", true, "交给" + get.translation(player) + "一张牌") + .set("ai", function (card) { + return 14 - get.value(card); + }); + else event.finish(); + "step 2"; + target.give(result.cards, player); + }, + ai: { + expose: 0.3, + order: 10, + result: { + target: 5, + }, + }, + }, + akane_yifu3: { charlotte: true }, + //笹濑川佐佐美 + sasami_miaobian: { + derivation: ["sasami_gongqing", "sasami_funan", "sasami_baoqiu"], + init2(player) { + if (player.hp <= 3) player.addSkill("sasami_gongqing"); + if (player.hp <= 2) player.addSkill("sasami_funan"); + if (player.hp <= 1) player.addSkill("sasami_baoqiu"); + }, + trigger: { player: "changeHp" }, + firstDo: true, + silent: true, + content() { + lib.skill.sasami_miaobian.init2(player); + }, + }, + sasami_baoqiu: { + line: { color: [173, 149, 206] }, + inherit: "rin_baoqiu", + }, + sasami_gongqing: { + audio: true, + trigger: { + player: ["damageBegin3", "damageBegin4"], + }, + forced: true, + filter(event, player, name) { + if (!event.source) return false; + var range = event.source.getAttackRange(); + if (name == "damageBegin3") return range > 3; + return event.num > 1 && range < 3; + }, + content() { + trigger.num = event.triggername == "damageBegin4" ? 1 : trigger.num + 1; + }, + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + if (arg.player.getAttackRange() < 3) return true; + } + return false; + }, + }, + }, + sasami_funan: { + audio: 2, + trigger: { global: ["respond", "useCard"] }, + line: { color: [173, 149, 206] }, + filter(event, player) { + if (!event.respondTo) return false; + if (event.player == player) return false; + if (player != event.respondTo[0]) return false; + if (!player.hasSkill("sasami_funan_jiexun")) { + var cards = []; + if (get.itemtype(event.respondTo[1]) == "card") cards.push(event.respondTo[1]); + else if (event.respondTo[1].cards) cards.addArray(event.respondTo[1].cards); + return cards.filterInD("od").length > 0; + } else return event.cards.filterInD("od").length > 0; + }, + logTarget: "player", + content() { + "step 0"; + if (!player.hasSkill("sasami_funan_jiexun")) { + var cards = []; + if (get.itemtype(trigger.respondTo[1]) == "card") cards.push(trigger.respondTo[1]); + else if (trigger.respondTo[1].cards) cards.addArray(trigger.respondTo[1].cards); + cards = cards.filterInD("od"); + trigger.player.gain(cards, "gain2", "log").gaintag.add("sasami_funan"); + trigger.player.addTempSkill("sasami_funan_use"); + } + "step 1"; + var cards = trigger.cards.filterInD("od"); + player.gain(cards, "log", "gain2"); + }, + subSkill: { + use: { + onremove(player) { + player.removeGaintag("sasami_funan"); + }, + charlotte: true, + mod: { + cardEnabled2(card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("sasami_funan")) { + return false; + } + }, + }, + }, + }, + }, + //枣铃 + rin_baoqiu: { + mod: { + attackRange(rin, ball) { + return ball + 2; + }, + }, + trigger: { player: "useCardToPlayered" }, + forced: true, + logTarget: "target", + filter(event, player) { + return event.card.name == "sha"; + }, + line: { color: [194, 117, 92] }, + content() { + "step 0"; + player.judge(function () { + return 0; + }); + "step 1"; + var target = trigger.target; + var map = trigger.customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (result.color == "red") { + if (!map[id].extraDamage) map[id].extraDamage = 0; + map[id].extraDamage++; + } + if (result.color == "black") { + trigger.directHit.add(target); + } + if (result.suit == "spade" || result.suit == "heart") { + var evt = trigger.getParent(); + if (evt.addCount !== false) { + evt.addCount = false; + player.getStat().card.sha--; + } + player.draw(); + } + if (result.suit == "diamond" || result.suit == "club") { + target.addTempSkill("fengyin"); + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true); + } + }, + }, + //春原阳平&春原芽衣 + sunohara_chengshuang: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + group: "sunohara_chengshuang_phase", + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + "step 0"; + var evt = event.getParent("phase"); + if (evt && evt.player == player) evt.sunohara_chengshuang = true; + player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); + "step 1"; + var sex = result.control; + game.broadcastAll( + function (player, sex) { + player.sex = sex; + if (player.marks && player.marks.sunohara_chengshuang) + player.marks.sunohara_chengshuang.firstChild.innerHTML = + sex == "male" ? "♂" : "♀"; + }, + player, + sex + ); + game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); + }, + mark: true, + intro: { + content(storage, player) { + if (player.sex == "unknown" || player.sex == "double") return "当前性别未确定"; + return "当前性别:" + get.translation(player.sex); + }, + }, + }, + sunohara_chengshuang_phase: { + trigger: { + player: "phaseBegin", + }, + filter(event, player) { + if (event.sunohara_chengshuang) return false; + return game.phaseNumber > 1; + }, + prompt2(event, player) { + if (player.sex == "unknown" || player.sex == "double") return "选择自己的性别"; + return "将自己的性别变更为" + (player.sex == "male" ? "女性" : "男性"); + }, + content() { + "step 0"; + if (player.sex == "unknown" || player.sex == "double") + player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); + else + event._result = { + control: player.sex == "male" ? "female" : "male", + }; + "step 1"; + var sex = result.control; + game.broadcastAll( + function (player, sex) { + player.sex = sex; + if (player.marks && player.marks.sunohara_chengshuang) + player.marks.sunohara_chengshuang.firstChild.innerHTML = + sex == "male" ? "♂" : "♀"; + }, + player, + sex + ); + game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); + }, + }, + sunohara_tiaoyin: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countGainableCards(player, "hej") > 0; + }, + selectCard: [1, 4], + filterCard(card) { + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.suit(ui.selected.cards[i]) == get.suit(card)) return false; + } + return true; + }, + complexSelect: true, + complexCard: true, + complexTarget: true, + selectTarget() { + return [ui.selected.cards.length, ui.selected.cards.length]; + }, + line: { color: [239, 204, 96] }, + content() { + if (target.countGainableCards(player, "hej") > 0) + player.gainPlayerCard(target, "hej", "visible"); + }, + contentAfter() { + var bool = false; + for (var i = 0; i < targets.length; i++) { + if (targets[i].differentSexFrom(player)) { + bool = true; + break; + } + } + if (bool) player.loseHp(); + }, + ai: { + order: 6, + result: { + target(player, target) { + return lib.card.shunshou.ai.result.target.apply(this, arguments); + }, + player(player, target) { + if (target.sameSexAs(player)) return 0; + for (var i = 0; i < ui.selected.targets.length; i++) { + if (ui.selected.targets[i].differentSexFrom(player)) return 0; + } + return get.attitude(player, target) < 0 && target.countCards("h", "tao") > 0 + ? 1 + : -2; + }, + }, + }, + }, + sunohara_jianren: { + trigger: { player: "damageEnd" }, + line: { color: [145, 149, 179] }, + async cost(event, trigger, player) { + const num = + !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) + ? 3 + : 1; + event.result = await player + .chooseTarget( + get.prompt("sunohara_jianren"), + "令一名角色摸" + get.cnNumber(num) + "张牌。" + ) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.hasSkillTag("nogain") && target != _status.currentPhase) return 0.1; + return att / (1 + 0.1 * target.countCards("h")); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const num = + !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) + ? 3 + : 1; + target.draw(num); + }, + }, + //椎名 + shiina_qingshen: { + audio: 1, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter(event, player) { + return event.cards && event.cards.filterInD().length > 0; + }, + frequent: true, + content() { + "step 0"; + var cards = trigger.cards.filterInD("od"); + player.gain(cards, "gain2", "log"); + event.count = cards.length; + "step 1"; + var cards = player.getCards("he"); + if (cards.length == 0) { + event.finish(); + return; + } else if (cards.length <= event.count) { + event._result = { bool: true, cards: cards }; + } else player.chooseCard(true, "he", event.count, "请选择要置于武将牌上的牌"); + "step 2"; + if (result.bool && result.cards.length) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("shiina_qingshen"); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + mod: { + attackRange(from, num) { + return num + from.getExpansions("shiina_qingshen").length; + }, + maxHandcard(from, num) { + return num + from.getExpansions("shiina_qingshen").length; + }, + }, + ai: { + notemp: true, + }, + }, + shiina_feiyan: { + audio: 1, + animalList: ["key_inari", "key_doruji"], + trigger: { global: "phaseBegin" }, + filter(event, player) { + if (lib.skill.shiina_feiyan.animalList.includes(event.player.name)) return false; + return player.getExpansions("shiina_qingshen").length > 0 && player.inRange(event.player); + }, + async cost(event, trigger, player) { + const { result } = await player + .chooseButton([ + get.prompt("shiina_feiyan", trigger.player), + player.getExpansions("shiina_qingshen"), + ]) + .set("goon", get.attitude(player, trigger.player) < 0 ? 1 : -1) + .set("ai", function () { + return _status.event.goon; + }); + if (result.bool) + event.result = { + bool: true, + cards: result.links, + }; + }, + logTarget: "player", + async content(event, trigger, player) { + await player.loseToDiscardpile(event.cards); + const cardToUse = { name: "sha", isCard: true }; + if (lib.filter.targetEnabled(cardToUse, player, trigger.player)) { + const { card } = await player.useCard(cardToUse, trigger.player); + console.log(card); + if ( + !player.hasHistory("sourceDamage", function (evt) { + return evt.card === card; + }) + ) + await player.draw(); + } + }, + group: "shiina_retieji", + ai: { + notemp: true, + combo: "shiina_feiyan", + }, + }, + shiina_retieji: { + audio: 1, + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + check(event, player) { + return get.attitude(player, event.target) < 0; + }, + filter(event, player) { + return event.card.name == "sha" && event.getParent(2).name == "shiina_feiyan"; + }, + logTarget: "target", + content() { + "step 0"; + player.judge(function () { + return 0; + }); + if (!trigger.target.hasSkill("fengyin")) { + trigger.target.addTempSkill("fengyin"); + } + "step 1"; + var suit = get.suit(result.card); + var target = trigger.target; + var num = target.countCards("h", "shan"); + target + .chooseToDiscard( + "请弃置一张" + get.translation(suit) + "牌,否则不能使用闪抵消此杀", + "he", + function (card) { + return get.suit(card) == _status.event.suit; + } + ) + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return 8 - get.value(card); + }) + .set("num", num) + .set("suit", suit); + "step 2"; + if (!result.bool) { + trigger.getParent().directHit.add(trigger.target); + } + }, + }, + //稻荷 + inari_baiwei: { + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard(player, name) { + return ( + name != "du" && + get.type(name) == "basic" && + player.countCards("hes", { suit: "diamond" }) > 0 + ); + }, + filter(event, player) { + if (event.type == "wuxie" || !player.countCards("hse", { suit: "diamond" })) return false; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if ( + name != "du" && + get.type(name) == "basic" && + event.filterCard(get.autoViewAs({ name: name }, "unsure"), player, event) + ) + return true; + } + return false; + }, + chooseButton: { + dialog(event, player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (name == "du") continue; + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) list.push(["基本", "", name, j]); + } else if (get.type(name) == "basic") { + list.push(["基本", "", name]); + } + } + return ui.create.dialog("摆尾", [list, "vcard"], "hidden"); + }, + filter(button, player) { + return _status.event + .getParent() + .filterCard( + get.autoViewAs({ name: button.link[2] }, "unsure"), + player, + _status.event.getParent() + ); + }, + check(button) { + if (_status.event.getParent().type == "phase") { + var player = _status.event.player; + var fakecard = { + name: button.link[2], + nature: button.link[3], + }; + if (player.getUseValue(fakecard) > 0) return get.order(fakecard); + return 0; + } + return 1; + }, + backup(links, player) { + return { + selectCard: 1, + filterCard: { suit: "diamond" }, + popname: true, + check(card) { + if (get.type(card) == "basic") return 6; + return 1 / Math.max(0.1, get.value(card)); + }, + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + }; + }, + prompt(links, player) { + return ( + "将一张♦牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用或打出" + ); + }, + }, + ai: { + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (get.type(name) == "basic" && player.getUseValue({ name: name }) > 0) { + var temp = get.order({ name: name }); + if (temp > max) max = temp; + } + } + if (max > 0) max += 0.5; + return max; + } + return 4; + }, + result: { + player: 1, + }, + respondSha: true, + fireAttack: true, + skillTagFilter(player, tag) { + return tag == "fireAttack" || player.countCards("he", { suit: "diamond" }) > 0; + }, + }, + group: ["inari_baiwei_draw"], + }, + inari_baiwei_draw: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + filter(event, player) { + return event.skill && event.skill.indexOf("inari_baiwei") == 0; + }, + content() { + player.draw(); + }, + }, + inari_huhun: { + mod: { + suit(card, suit) { + if (suit == "club") return "diamond"; + }, + maxHandcard(player, num) { + return num + 1; + }, + }, + }, + //朱鹭户沙耶 + saya_powei: { + audio: 2, + trigger: { player: "phaseAfter" }, + locked: true, + limited: true, + unique: true, + skillAnimation: true, + animationColor: "metal", + filter(event, player) { + return ( + event.type != "saya_powei" && + game.hasPlayer(function (current) { + return current.hp > player.hp; + }) + ); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("saya_powei"), function (card, saya, kyousuke) { + return kyousuke.hp > saya.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att >= -2) return 0; + if (target != get.zhu(target) && player.hasUnknown()) return 0; + if (target.getEquip(3) && !player.getEquip(4)) att /= 2; + if (player.hp <= 1) att *= 1.5; + return -att; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + player.awakenSkill("saya_powei"); + game.asyncDelay(3); + var next = game.createEvent("saya_powei_loop", false, trigger); + next.playertrue = player; + next.playerfalse = target; + next.setContent(lib.skill.saya_powei.content2); + }, + content2() { + "step 0"; + event.count = 0; + event.stat = true; + event.current = event["player" + event.stat]; + game.countPlayer2(function (current) { + if (current != event.playertrue && current != event.playerfalse) + current.addSkill("saya_nodis"); + }); + event.playertrue.addSkill("saya_judge"); + "step 1"; + event.count++; + event.current.phase().set("type", "saya_powei"); + "step 2"; + if (event.count == 9 || event.playertrue.isDead() || event.playerfalse.isDead()) { + game.countPlayer2(function (current) { + current.removeSkill("saya_nodis"); + current.removeSkill("saya_judge"); + }); + } else { + event.stat = !event.stat; + event.current = event["player" + event.stat]; + event.goto(1); + } + }, + }, + saya_nodis: { + group: "undist", + mark: true, + intro: { content: "不计入距离和座次的计算" }, + }, + saya_judge: { + trigger: { player: "phaseBegin" }, + forced: true, + popup: false, + filter(event, player) { + return event.type == "saya_powei" && player == event.getParent().playertrue; + }, + content() { + "step 0"; + player.judge(function (card) { + return get.color(card) == "red" ? 5 : 0; + }).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 1"; + if (result.bool) { + player.line(trigger.getParent().playerfalse); + trigger.getParent().playerfalse.damage(); + } + }, + }, + saya_shouji: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + return event.cards.filterInD().length > 0; + }, + usable: 1, + async cost(event, trigger, player) { + const goon = (function () { + var num = 0; + var cards = trigger.cards.filterInD(); + for (var i = 0; i < cards.length; i++) { + num += player.getUseValue(cards[i]); + } + return ( + player.countCards("h", function (card) { + return player.getUseValue(card, null, true) > num; + }) == 0 + ); + })(); + event.result = await player + .chooseTarget(get.prompt2("saya_shouji"), lib.filter.notMe) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var player = _status.event.player; + var cards = _status.event.getTrigger().cards.filterInD(); + var att = get.attitude(player, target); + var num = 0; + for (var i = 0; i < cards.length; i++) { + num += target.getUseValue(cards[i]); + } + return Math.max(num, 0.1) * att; + }) + .set("goon", goon) + .forResult(); + }, + content() { + "step 0"; + event.cards = trigger.cards.filterInD(); + var target = targets[0]; + event.target = target; + target.gain(event.cards, "gain2", "log"); + "step 2"; + target.chooseToUse({ + cards: cards, + filterCard(card) { + if ( + get.itemtype(card) != "card" || + !_status.event.cards || + !_status.event.cards.includes(card) + ) + return false; + return lib.filter.filterCard.apply(this, arguments); + }, + prompt: "是否使用得到的牌中的一张?", + }); + "step 3"; + if (result.bool) player.draw(); + }, + }, + //三枝叶留佳&二木佳奈多 + haruka_shuangche: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return !player.hasSkill("haruka_kanata"); + }, + chooseButton: { + dialog(event, player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (name == "boss_mengpohuihun") continue; + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) list.push(["基本", "", name, j]); + } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); + else if (get.type(name) == "basic") list.push(["基本", "", name]); + } + return ui.create.dialog("双掣", [list, "vcard"]); + }, + filter(button, player) { + return _status.event + .getParent() + .filterCard({ name: button.link[2] }, player, _status.event.getParent()); + }, + check(button) { + var player = _status.event.player; + if (player.countCards("h", button.link[2]) > 0) return 0; + if (["wugu", "zhulu_card"].includes(button.link[2])) return 0; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; + return 0; + }, + backup(links, player) { + return { + audio: "haruka_shuangche", + filterCard() { + return false; + }, + selectCard: -1, + popname: true, + check(card) { + return 6 - get.value(card); + }, + position: "he", + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + }; + }, + prompt(links, player) { + return ( + "请选择" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "的目标" + ); + }, + }, + ai: { + order: 1, + result: { + player(player) { + var cards = player.getCards("he").sort(function (a, b) { + return get.value(a) - get.value(b); + }); + var num = (player.getStat("skill").haruka_shuangche || 0) + 1; + if (player.needsToDiscard() >= num) return 1; + if (player.hp > 2) return 1; + if (cards.length >= num) { + var val = 0; + for (var i = 0; i < cards.length; i++) { + val += get.value(cards[i]); + } + return 12 - val; + } + return 0; + }, + }, + fireAttack: true, + }, + group: "kanata_shuangche", + }, + kanata_shuangche: { + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return event.skill == "haruka_shuangche_backup"; + }, + content() { + "step 0"; + var num = player.getStat("skill").haruka_shuangche || 1; + player + .chooseToDiscard( + "###双掣:请选择一项###选择弃置" + + get.cnNumber(num) + + "张牌,或失去1点体力且令〖双掣〗失效至回合结束", + num, + "he" + ) + .set("ai", function (card) { + var total = 12; + for (var i = 0; i < ui.selected.cards.length; i++) { + total -= get.value(ui.selected.cards[i]); + } + return total - get.value(card); + }); + "step 1"; + if (!result.bool) { + player.addTempSkill("haruka_kanata"); + player.loseHp(); + } + }, + }, + haruka_kanata: { charlotte: true }, + //紬文德斯 + tsumugi_mugyu: { + audio: 5, + trigger: { target: "useCardToTargeted" }, + frequent: true, + filter(event, player) { + return player.countCards("h") < player.maxHp; + }, + content() { + player.draw(); + }, + }, + tsumugi_huilang: { + trigger: { player: "phaseEnd" }, + charlotte: true, + line: { color: [253, 198, 116] }, + filter(event, player) { + return player.countCards("he") > 0; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCard("he", [1, player.countCards("he")], get.prompt2("tsumugi_huilang")) + .set("ai", function (card) { + if (get.position(card) != "h") return -1; + if (!["shan", "wuxie", "caochuan"].includes(get.name(card))) return 9; + return 5 - get.value(card); + }) + .forResult(); + }, + async content(event, trigger, player) { + const cards = event.cards; + player.addSkill("tsumugi_huilang2"); + player.addToExpansion("giveAuto", cards, player).gaintag.add("tsumugi_huilang2"); + }, + }, + tsumugi_huilang2: { + charlotte: true, + marktext: "隐", + intro: { content: "隐藏于回廊之牌", markcount: "expansion" }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.getExpansions("tsumugi_huilang2").length > 0; + }, + content() { + "step 0"; + var cards = player.getExpansions("tsumugi_huilang2"); + event.num = cards.length; + player.gain(cards, "draw"); + "step 1"; + player + .chooseTarget([1, num], "是否令至多" + get.cnNumber(num) + "名角色各摸一张牌?") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + var targets = result.targets; + player.line(targets, lib.skill.tsumugi_huilang.line); + targets.sortBySeat(); + game.asyncDraw(targets); + } else event.finish(); + "step 3"; + game.delay(); + }, + }, + //由依 + yui_jiang: { + shaRelated: true, + audio: 2, + audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + filter(event, player) { + if ( + !( + event.card.name == "juedou" || + (event.card.name == "sha" && get.color(event.card) == "red") + ) + ) + return false; + return player == event.target || event.getParent().triggeredTargets3.length == 1; + }, + frequent: true, + content() { + player.draw(); + }, + ai: { + effect: { + target(card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; + }, + player(card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 1]; + }, + }, + }, + }, + yui_lieyin: { + trigger: { player: "phaseUseBegin" }, + locked: true, + async cost(event, trigger, player) { + const list = []; + if (player.storage._ichiban_no_takaramono) list.push("cancel2"); + const { control, index } = await player + .chooseControl(...list) + .set("choiceList", [ + "令此阶段内的所有红色牌视为【杀】", + "令此阶段内的所有【杀】视为【决斗】", + ]) + .set( + "prompt", + player.storage._ichiban_no_takaramono + ? get.prompt("yui_lieyin") + : "烈音:请选择一项" + ) + .set("ai", function () { + var player = _status.event.player; + var shas = player.countCards("h", "sha"); + if (shas > 0) { + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + player.canUse("juedou", current) && + !current.hasSha() && + get.effect(current, { name: "juedou" }, player, player) > 0 + ); + }) + ) + return 1; + if (player.storage._ichiban_no_takaramono) return "cancel2"; + } + if ( + player.countCards("h", function (card) { + return ( + get.color(card) == "red" && + card.name != "sha" && + player.hasValueTarget(card) + ); + }) == 0 + ) + return 0; + if (player.storage._ichiban_no_takaramono) return "cancel2"; + return 1; + }) + .forResult(); + if (control !== "cancel2") { + event.result = { + bool: true, + cost_data: { index }, + }; + } + }, + async content(event, trigger, player) { + player.addTempSkill(`yui_lieyin${event.cost_data.index}`, "phaseUseEnd"); + }, + }, + yui_lieyin0: { + mod: { + cardname(card) { + if (get.color(card) == "red") return "sha"; + }, + }, + }, + yui_lieyin1: { + mod: { + cardname(card) { + if (card.name == "sha") return "juedou"; + }, + }, + }, + yui_takaramono: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "key", + filter(event, player) { + var num = 0; + if (player.hp <= 1) num++; + if (game.dead.length > 0) num++; + if (num != 1) return num > 1; + var draw = 0; + player.getAllHistory("gain", function (evt) { + if (evt.getParent(2).name == "yui_jiang") draw += evt.cards.length; + }); + return draw >= 3; + }, + content() { + player.awakenSkill("yui_takaramono"); + player.addSkills("yui_yinhang"); + player.storage._ichiban_no_takaramono = true; + player.gainMaxHp(); + player.recover(); + }, + derivation: "yui_yinhang", + }, + yui_yinhang: { + trigger: { player: "changeHp" }, + locked: true, + getIndex: (event) => Math.abs(event.num), + line: { color: [253, 153, 182] }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget([1, 2], get.prompt("yui_yinhang"), "令至多两名角色各摸一张牌") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const targets = event.targets; + targets.sortBySeat(); + game.asyncDraw(targets); + }, + }, + //吉野晴彦 + yoshino_jueyi: { + trigger: { player: "phaseUseBegin" }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(lib.filter.notMe, get.prompt2("yoshino_jueyi")) + .set("ai", function (target) { + var player = _status.event.player; + if (get.damageEffect(target, player, player) < 0) return 0; + var att = get.attitude(player, target); + if (att > 0) return 0; + if (att == 0) return 0.1; + var eff = 0; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + if (player.canUse(hs[i], target)) { + var eff2 = get.effect(target, hs[i], player, player); + if (eff2 > 0) eff += eff2; + } + } + return -att / (1 + eff); + }) + .forResult(); + }, + content() { + "step 0"; + var target = targets[0]; + event.target = target; + player.draw(); + "step 1"; + player.chooseToPSS(target); + "step 2"; + if (result.tie) event.goto(1); + else if (result.bool) target.damage(); + else target.addTempSkill("yoshino_fail", "phaseUseEnd"); + }, + }, + yoshino_fail: { + mod: { + targetEnabled(card, player, target) { + if (player == _status.currentPhase) return false; + }, + }, + }, + //宫泽谦吾 + kengo_weishang: { + locked: false, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha" && player.hasDisabledSlot(1)) return num + 1; + }, + globalFrom(from, to, distance) { + if (from.hasDisabledSlot(4)) return distance - 1; + }, + globalTo(from, to, distance) { + if (to.hasDisabledSlot(3)) return distance + 1; + }, + }, + enable: "phaseUse", + usable: 1, + filter(event, player) { + var list = ["equip1", "equip2", "equip3", "equip4", "equip5"]; + for (var i = 0; i < list.length; i++) { + if ( + player.hasEnabledSlot(list[i]) && + (!player.storage.kengo_guidui2 || !player.storage.kengo_guidui2.includes(list[i])) + ) + return true; + } + return false; + }, + content() { + "step 0"; + var list = ["equip1", "equip2", "equip3", "equip4", "equip5"]; + for (var i = 0; i < list.length; i++) { + if ( + !player.hasEnabledSlot(list[i]) || + (player.storage.kengo_guidui2 && player.storage.kengo_guidui2.includes(list[i])) + ) + list.splice(i--, 1); + } + player.chooseControl(list).set("prompt", "请选择废除一个装备栏").ai = function () { + if ( + list.includes("equip1") && + player.hasEmptySlot("equip1") && + player.countCards("h", function (card) { + return card.name == "sha" && player.getUseValue(card) > 0; + }) + ) + return "equip1"; + if (list.includes("equip3") && player.hasEmptySlot("equip3")) return "equip3"; + if (list.includes("equip4") && player.hasEmptySlot("equip4")) return "equip4"; + if (list.includes("equip5") && player.hasEmptySlot("equip5")) return "equip5"; + if (list.includes("equip2") && player.hasEmptySlot("equip2")) return "equip2"; + return list.randomGet(); + }; + "step 1"; + player.disableEquip(result.control); + player.draw(2); + }, + group: ["kengo_weishang_sha", "kengo_weishang_shan"], + ai: { + order: 10, + result: { player: 1 }, + }, + }, + kengo_weishang_sha: { + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return ( + event.card.name == "sha" && + player.hasDisabledSlot(1) && + event.target.countCards("he") > 0 + ); + }, + logTarget: "target", + content() { + trigger.target.chooseToDiscard("he", true); + }, + }, + kengo_weishang_shan: { + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "shan" }, + filterCard: true, + position: "hes", + prompt: "将一张牌当做闪使用或打出", + viewAsFilter(player) { + return player.hasDisabledSlot(2) && player.countCards("hes") > 0; + }, + check(card) { + return 1 / Math.max(0.1, get.value(card)); + }, + ai: { + respondShan: true, + skillTagFilter(player) { + return player.hasDisabledSlot(2) && player.countCards("he") > 0; + }, + }, + }, + kengo_guidui: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter(event, player) { + return player.countDisabledSlot() > 0; + }, + content() { + var list = []; + for (var i = 1; i <= 5; i++) { + for (var j = 0; j < player.countDisabledSlot(i); j++) { + list.push("equip" + i); + } + } + player.enableEquip(list); + if (!player.storage.kengo_guidui2) player.storage.kengo_guidui2 = []; + player.storage.kengo_guidui2.addArray(list); + }, + }, + kengo_guidui2: { onremove: true }, + //岩泽雅美 + iwasawa_yinhang: { + trigger: { player: "changeHp" }, + locked: true, + line: { color: [235, 96, 138] }, + getIndex: (event) => Math.abs(event.num), + async cost(event, trigger, player) { + event.result = await player + .chooseTarget([1, 2], get.prompt("iwasawa_yinhang"), "令至多两名角色各摸一张牌") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const targets = event.targets; + targets.sortBySeat(); + game.asyncDraw(targets); + }, + }, + iwasawa_mysong: { + trigger: { + player: ["phaseBeginStart", "phaseAfter", "dyingBefore"], + }, + forced: true, + filter(event, player) { + return event.name == "dying" || player.hp < 1; + }, + content() { + if (trigger.name == "dying") trigger.cancel(); + else if (event.triggername == "phaseBeginStart") player.addTempSkill("iwasawa_fenyin"); + else player.die(); + }, + nobracket: true, + derivation: "iwasawa_fenyin", + }, + iwasawa_refenyin: { + audio: 2, + audioname2: { + wufan: "refenyin_wufan", + }, + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "equipAfter"], + }, + forced: true, + filter(event, player) { + if (player != _status.currentPhase) return false; + var cards = event.getd(); + var list = []; + for (var i = 0; i < cards.length; i++) { + var card = cards[i]; + list.add(card.suit); + } + game.getGlobalHistory("cardMove", function (evt) { + if ( + evt == event || + evt.getParent() == event || + (evt.name != "lose" && evt.name != "cardsDiscard") + ) + return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + for (var i = 0; i < evt.cards.length; i++) { + var card = evt.cards[i]; + list.remove(card.suit); + } + }); + return list.length > 0; + }, + content() { + var list = []; + var list2 = []; + var cards = trigger.getd(); + for (var i = 0; i < cards.length; i++) { + var card = cards[i]; + var suit = card.suit; + list.add(suit); + list2.add(suit); + } + game.getGlobalHistory("cardMove", function (evt) { + if ( + evt == trigger || + evt.getParent() == trigger || + (evt.name != "lose" && evt.name != "cardsDiscard") + ) + return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + for (var i = 0; i < evt.cards.length; i++) { + var card = evt.cards[i]; + var suit = card.suit; + list.remove(suit); + list2.add(suit); + } + }); + list2.sort(); + player.draw(list.length); + player.storage.iwasawa_refenyin_mark = list2; + player.addTempSkill("iwasawa_refenyin_mark"); + player.markSkill("iwasawa_refenyin_mark"); + }, + subSkill: { + mark: { + onremove: true, + intro: { + content(s) { + var str = "本回合已经进入过弃牌堆的卡牌的花色:"; + for (var i = 0; i < s.length; i++) { + str += get.translation(s[i]); + } + return str; + }, + }, + }, + }, + }, + iwasawa_fenyin: { + mod: { + aiOrder(player, card, num) { + if (typeof card == "object" && player == _status.currentPhase) { + var evt = player.getLastUsed(); + if ( + evt && + evt.card && + get.color(evt.card) != "none" && + get.color(card) != "none" && + get.color(evt.card) != get.color(card) + ) { + return num + 10; + } + } + }, + }, + audio: 2, + trigger: { player: "useCard" }, + frequent: true, + //usable:3, + filter(event, player) { + if (_status.currentPhase != player) return false; + var evt = player.getLastUsed(1); + if (!evt) return false; + var color1 = get.color(evt.card); + var color2 = get.color(event.card); + return color1 && color2 && color1 != "none" && color2 != "none" && color1 != color2; + }, + content() { + player.draw(); + }, + ai: { + threaten(player, target) { + if (target.hp < 1) return 3; + return 1; + }, + }, + }, + //井之原真人 + masato_baoquan: { + trigger: { source: "damageBefore" }, + forced: true, + content() { + "step 0"; + player + .chooseControl("防止伤害", "增加伤害") + .set( + "prompt", + "暴拳:防止即将对" + + get.translation(trigger.player) + + "造成的伤害,或失去1点体力上限并令此伤害+2" + ) + .set("choice", get.attitude(player, trigger.player) >= 0 ? 0 : 1) + .set("ai", function () { + return _status.event.choice; + }); + "step 1"; + if (result.control == "增加伤害") { + player.loseMaxHp(); + trigger.num += 2; + } else trigger.cancel(); + }, + ai: { + effect: { + player(card, player, target) { + if (target && get.attitude(player, target) > 0 && get.tag(card, "damage")) + return "zeroplayertarget"; + }, + }, + }, + }, + //西森柚咲&黑羽美砂 + yusa_yanyi: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return get.distance(player, target) <= player.hp; + }, + selectTarget() { + return [1, Math.max(_status.event.player.getAttackRange())]; + }, + line: "thunder", + content() { + "step 0"; + if (target.isHealthy()) { + player.draw(); + event.finish(); + } else { + var name = get.translation(player); + target + .chooseControl() + .set("choiceList", [ + "令" + name + "摸一张牌", + "回复1点体力,然后交给" + name + "一张牌", + ]) + .set("ai", function () { + return 1; + }); + } + "step 1"; + if (result.index == 0) { + player.draw(); + event.finish(); + } else { + target.recover(); + } + "step 2"; + if (target != player && target.countCards("he") > 0) { + target.chooseCard("交给" + get.translation(player) + "一张牌", "he", true); + } else event.finish(); + "step 3"; + target.give(result.cards, player, "giveAuto"); + }, + ai: { + order: 10, + result: { + player(player, target) { + return target.isHealthy() ? 1 : 0; + }, + target(player, target) { + if (target.isHealthy()) return 0; + return get.recoverEffect(target, player, target); + }, + }, + }, + }, + yusa_misa: { + charlotte: true, + trigger: { player: "useSkillAfter" }, + filter(event, player) { + return ( + event.skill == "yusa_yanyi" && + !player.storage.dualside_over && + Array.isArray(player.storage.dualside) + ); + }, + content() { + player.turnOver(); + }, + }, + misa_yusa: { + charlotte: true, + trigger: { player: "misa_yehuoAfter" }, + filter(event, player) { + return ( + event.bool === true && + !player.storage.dualside_over && + Array.isArray(player.storage.dualside) + ); + }, + content() { + player.turnOver(); + }, + }, + misa_yehuo: { + charlotte: true, + trigger: { global: "phaseDrawBegin1" }, + locked: true, + line: { color: [236, 137, 52] }, + filter(event, player) { + var target = event.player; + return player.inRange(target) && player.countCards("he") >= get.distance(player, target); + }, + async cost(event, trigger, player) { + var next = player.chooseToDiscard( + "he", + get.distance(player, trigger.player) || 1, + get.prompt2("misa_yehuo", trigger.player), + "chooseonly" + ); + next.set("ai", function (card) { + var val = _status.event.val; + for (var i = 0; i < ui.selected.cards.length; i++) { + val -= get.value(ui.selected.cards[i]); + } + return val - get.value(card); + }); + next.set("val", -2 * get.attitude(player, trigger.player)); + event.result = await next.forResult(); + }, + logTarget: "player", + content() { + "step 0"; + player.discard(cards); + "step 1"; + event.bool = true; + if (trigger.numFixed) event._result = { index: 0 }; + else if (trigger.player.isIn()) { + var name = get.translation(trigger.player); + player + .chooseControl() + .set("choiceList", [ + "对" + name + "造成1点火属性伤害", + "令" + name + "此出牌阶段的额定摸牌数改为0", + ]); + } else event.finish(); + "step 2"; + if (result.index == 0) trigger.player.damage("fire"); + else trigger.changeToZero(); + }, + ai: { + fireAttack: true, + }, + }, + //宫泽有纪宁 + yukine_wenzhou: { + trigger: { global: "phaseUseBegin" }, + filter(event, player) { + return event.player.countCards("he") > 0; + }, + async cost(event, trigger, player) { + event.forceDie = true; + var ask = trigger.player.chooseCard("he", get.prompt("yukine_wenzhou")); + if (player === trigger.player) { + ask.set( + "prompt2", + "选择一张牌,然后从牌堆中获得一张与此牌类型相同的牌。本回合内使用与此牌类型相同的牌时不可被其他角色响应。" + ); + } else + ask.set( + "prompt2", + "将一张牌交给" + + get.translation(player) + + "然后其可以选择:交给你一张牌;或令你从牌堆中获得一张与此牌类型相同的牌,且你本回合内使用与此牌类型相同的牌时不可被响应。" + ); + ask.set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) + return 10 - get.value(card); + return -1; + }); + event.result = await ask.forResult(); + }, + content() { + "step 0"; + event.forceDie = true; + event.type = get.type(cards[0], "trick"); + if (trigger.player != player) trigger.player.give(cards, player, "giveAuto"); + "step 1"; + if (player == trigger.player || player.countCards("he") == 0) { + event._result = { index: 1 }; + } else { + player + .chooseControl() + .set("choiceList", [ + "将一张牌交给" + get.translation(trigger.player), + "令" + + get.translation(trigger.player) + + "从牌堆中获得一张" + + get.translation(event.type) + + "牌,且其本回合内使用与此牌名称相同的牌时不可被响应", + ]) + .set("forceDie", true) + .set("ai", function () { + if (get.attitude(_status.event.player, _status.event.getTrigger().player) > 0) + return 1; + return 0; + }); + } + "step 2"; + event.index = result.index; + if (result.index == 1) { + var magic = get.cardPile2(function (card) { + return get.type(card, "trick") == event.type; + }); + if (magic) { + trigger.player.addTempSkill("yukine_magic", "phaseUseEnd"); + trigger.player.storage.yukine_magic.add(magic.name); + trigger.player.gain(magic, "draw"); + } else event.finish(); + } else + player + .chooseCard("he", true, "选择要交给" + get.translation(trigger.player) + "的牌") + .set("ai", function (card) { + return -get.value(card, _status.event.getTrigger().player); + }); + "step 3"; + if (event.index == 1) game.updateRoundNumber(); + else if (result.bool) player.give(result.cards, trigger.player, "giveAuto"); + }, + }, + yukine_magic: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + return ( + player.storage.yukine_magic && player.storage.yukine_magic.includes(event.card.name) + ); + }, + content() { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + if (player != current) return true; + return !player.hasSkill("yukine_wenzhou"); + }) + ); + }, + onremove: true, + init(player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return ( + player.storage.yukine_magic && player.storage.yukine_magic.includes(arg.card.name) + ); + }, + }, + }, + //神北小毬 + komari_tiankou: { + trigger: { + player: "useCard2", + target: "useCardToTarget", + }, + forced: true, + filter(event, player, name) { + if (name == "useCardToTarget" && player == event.player) return false; + if (get.color(event.card) != "red") return false; + if (get.tag(event.card, "damage")) return false; + return ["basic", "trick"].includes(get.type(event.card)); + }, + content() { + "step 0"; + var info = get.info(trigger.card); + var bool = true; + if (info.multitarget || info.allowMultiple === false) bool = false; + else { + var list = game.filterPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, trigger.player, current) + ); + }); + if (!list.length) bool = false; + } + if (bool) + player + .chooseTarget( + "甜口:为" + + get.translation(trigger.card) + + "增加一个额外目标,或点【取消】摸一张牌。", + function (candy, komari, rin) { + return _status.event.rin_chan.includes(rin); + } + ) + .set("rin_chan", list) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt.candy, evt.source, evt.player); + }) + .set("candy", trigger.card) + .set("", trigger.player); + else event._result = { bool: false }; + "step 1"; + if (result.bool) { + var rin = result.targets[0]; + trigger.targets.push(rin); + player.line(rin, { color: [255, 224, 172] }); + } else player.draw(); + }, + }, + komari_xueshang: { + trigger: { global: "die" }, + forced: true, + skillAnimation: true, + chargingSkill: true, + filter(event, player) { + return player.hp > 0; + }, + animationColor: "metal", + content() { + "step 0"; + player.addSkill("riki_xueshang"); + var map = {}; + var list = []; + for (var i = 1; i <= player.hp; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; + list.push(cn); + } + event.map = map; + player + .chooseControl(list, function () { + return "一"; + }) + .set("prompt", "血殇:请选择自己受到的伤害的点数"); + "step 1"; + var num = event.map[result.control] || 1; + event.num = num > 1 ? 2 : 1; + event.list = game + .filterPlayer(function (current) { + return current != player; + }) + .sortBySeat(); + player.damage(num); + player.line(event.list, { color: [255, 224, 172] }); + "step 2"; + if (!player.hasSkill(event.name)) return; + else { + event.list.shift().damage(num); + if (event.list.length) event.redo(); + } + }, + }, + riki_xueshang: { + trigger: { global: "dying" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + return ( + event.getParent(2).name == "komari_xueshang" && event.getParent(2).player == player + ); + }, + content() { + player.removeSkills("komari_xueshang"); + player.gainMaxHp(true); + player.recover(); + }, + }, + //鹰原羽未 + umi_chaofan: { + enable: "phaseUse", + usable: 1, + selectCard: 2, + complexCard: true, + filter(summer, umi) { + return umi.countCards("h") > 1; + }, + check(ingredient) { + return 7 - get.value(ingredient); + }, + filterCard(ingredient) { + if (ui.selected.cards.length) + return get.suit(ingredient) != get.suit(ui.selected.cards[0]); + return true; + }, + line: { color: [251, 193, 217] }, + filterTarget: lib.filter.notMe, + content() { + "step 0"; + player.draw(); + "step 1"; + if (player.hp > 2) target.recover(); + else if (player.hp == 2) target.draw(2); + else target.damage("fire", "nosource"); + }, + ai: { + order: 2, + result: { + target(umi, takahara) { + if (umi.hp > 2 && takahara.isDamaged()) return 2.2; + if (umi.hp == 2 && !takahara.hasSkillTag("nogain")) return 2; + if (umi.hp < 2) return get.damageEffect(takahara, umi, umi, "fire"); + }, + }, + }, + }, + umi_lunhui: { + trigger: { global: "phaseAfter" }, + filter(summer, umi) { + return summer.player != umi && umi.countCards("h") < umi.hp; + }, + line: { color: [251, 193, 217] }, + logTarget: "player", + charlotte: true, + content() { + "step 0"; + player.loseHp(); + "step 1"; + player.draw(2); + player.insertPhase(); + player.storage.umi_shiroha = trigger.player; + player.addTempSkill("umi_shiroha"); + }, + }, + umi_shiroha: { + mark: "character", + intro: { + content: "到$的距离视为1", + }, + onremove: true, + charlotte: true, + mod: { + globalFrom(umi, shiroha) { + if (umi.storage.umi_shiroha == shiroha) return -Infinity; + }, + }, + }, + umi_qihuan: { + enable: "chooseToUse", + filter(summer, umi) { + return summer.type == "dying" && umi.isDying(); + }, + limited: true, + skillAnimation: true, + charlotte: true, + animationColor: "key", + content() { + "step 0"; + player.awakenSkill("umi_qihuan"); + player.reinitCharacter("key_umi", "key_umi2", false); + player.recover(game.countGroup() || 1); + if (!game.dead.length) event.finish(); + "step 1"; + var chara = []; + var skills = []; + for (var i = 0; i < game.dead.length; i++) { + var name = game.dead[i].name; + var name2 = game.dead[i].name2; + var skill = []; + if (name && lib.character[name]) skill.addArray(lib.character[name][3]); + if (name2 && lib.character[name2]) skill.addArray(lib.character[name2][3]); + if (skill.length) { + chara.push(game.dead[i]); + skills.push(skill); + } + } + if (!chara.length) event.finish(); + event.chara = chara; + event.skills = skills; + event.chosen = []; + "step 2"; + var next = player.chooseTarget("是否获得一名已死亡角色的一个技能?"); + next.set("chara", event.chara); + next.set("skills", event.skills); + next.set("chosen", event.chosen); + next.set("filterTarget", function (card, player, target) { + if (target.isAlive()) return false; + var evt = _status.event; + if (!evt.chosen.length) return true; + var skills = evt.skills[evt.chara.indexOf(target)]; + if (skills.length == 1 && skills[0] == evt.chosen[0]) return false; + return true; + }); + next.set("deadTarget", true); + next.set("ai", function () { + return Math.random(); + }); + "step 3"; + if (!result.bool) event.finish(); + else { + event.temp = result.targets[0]; + var list = event.skills[event.chara.indexOf(result.targets[0])]; + result.targets[0].line(player, { + color: [251, 193, 217], + }); + list.removeArray(event.chosen); + player.chooseControl(list).set("prompt", "选择获得一个技能"); + } + "step 4"; + //player.addSkills(result.control,get.groupnature(event.temp.group)||'key'); + player.addSkills(result.control); + var info = get.info(result.control); + if (info.zhuSkill) { + if (!player.storage.zhuSkill_umi_qihuan) player.storage.zhuSkill_umi_qihuan = []; + player.storage.zhuSkill_umi_qihuan.push(result.control); + } + event.chosen.push(result.control); + if (event.chosen.length < 2) event.goto(2); + }, + ai: { + order: 10, + save: true, + skillTagFilter(player, tag, target) { + return player == target; + }, + result: { + player: 1, + }, + }, + }, + //神尾晴子 + haruko_haofang: { + mod: { + cardname(card, player, name) { + if (lib.card[card.name].type == "delay") return "wuzhong"; + }, + }, + trigger: { player: "drawBefore" }, + forced: true, + filter(event, player) { + return event.getParent().name == "wuzhong"; + }, + content() { + trigger.num += 2; + }, + }, + haruko_zhuishi: { + trigger: { global: "phaseJudgeBegin" }, + filter(misuzu) { + return misuzu.player.countCards("j") > 0; + }, + check(event, player) { + return get.attitude(player, event.player) > 1; + }, + logTarget: "player", + content() { + "step 0"; + player.gain(trigger.player.getCards("j"), trigger.player, "give", "bySelf"); + "step 1"; + if (player.hp > 1) player.loseHp(); + }, + }, + yuri_xingdong: { + audio: 3, + group: "yuri_xingdong_gain", + subSkill: { + mark: { + mark: true, + marktext: "令", + intro: { + content: "跳过下个回合的判定阶段和摸牌阶段", + }, + }, + gain: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + content() { + "step 0"; + var card = get.cardPile(function (card) { + return card.name == "sha" || get.type(card) == "trick"; + }); + if (card) player.gain(card, "gain2", "log"); + "step 1"; + game.updateRoundNumber(); + }, + }, + }, + enable: "phaseUse", + usable: 1, + locked: true, + filter(event, player) { + return player.countCards("h", lib.skill.yuri_xingdong.filterCard); + }, + filterCard(card) { + return card.name == "sha" || get.type(card) == "trick"; + }, + check(card) { + return 1; + }, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: 0, + content() { + "step 0"; + player.give(cards, target); + "step 1"; + if (!target.getCards("h").includes(cards[0])) event._result = { bool: false }; + else + target.chooseUseTarget( + cards[0], + game.filterPlayer(function (current) { + return current != player; + }), + "请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段" + ); + "step 2"; + if (result.bool) game.asyncDraw([player, target]); + else { + target.addTempSkill("yuri_xingdong_mark", "phaseJudgeSkipped"); + target.skip("phaseJudge"); + target.skip("phaseDraw"); + target.addTempSkill("zhengjing3", { + player: "phaseAfter", + }); + event.finish(); + } + "step 3"; + game.delay(); + }, + ai: { + order: 12, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (target.hasSkill("pingkou")) return 1; + if (!card) return 0; + var info = get.info(card); + if (info.selectTarget == -1) { + var eff = 0; + game.countPlayer(function (current) { + if (current != player && target.canUse(card, current)) + eff += get.effect(current, card, target, target); + }); + if (eff > 0 || get.value(card) < 3) return eff; + return 0; + } else if ( + game.hasPlayer(function (current) { + return ( + current != player && + target.canUse(card, current) && + get.effect(current, card, target, target) > 0 + ); + }) + ) + return 1.5; + else if (get.value(card) < 3) return -1; + return 0; + }, + }, + }, + }, + yuri_wangxi: { + audio: 2, + trigger: { global: "dieAfter" }, + limited: true, + mark: false, + init(player) { + if (player.hasZhuSkill("yuri_wangxi")) { + player.markSkill("yuri_wangxi"); + player.storage.yuri_wangxi = false; + } + }, + zhuSkill: true, + unique: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + if (get.mode() != "identity") return false; + if (!player.hasZhuSkill("yuri_wangxi")) return false; + if (event.player.isIn()) return false; + if (event.player.identity == "mingzhong") return false; + var evt = event.getParent("yuri_xingdong"); + return evt && evt.name == "yuri_xingdong" && evt.player == player; + }, + async cost(event, trigger, player) { + event.result = await trigger.player + .chooseBool("是否发动" + get.translation(player) + "的【忘隙】?") + .set("forceDie", true) + .forResult(); + }, + logTarget: "player", + async content(event, trigger, player) { + player.awakenSkill("yuri_wangxi"); + var identity = "zhong"; + if (_status.mode == "purple") { + if (["rNei", "bNei"].includes(player.identity)) identity = player.identity; + else if (["rZhu", "rZhong", "bNei"].includes(player.identity)) identity = "rZhong"; + else identity = "bZhong"; + } + game.broadcastAll( + function (source, identity) { + if (source.node.dieidentity) { + source.node.dieidentity.innerHTML = get.translation(identity + 2); + } + source.revive(2, false); + source.identity = identity; + source.setIdentity(); + }, + trigger.player, + identity + ); + var evt = trigger.getParent("damage"); + if (evt.untrigger) evt.untrigger(false, trigger.player); + game.addVideo("setIdentity", trigger.player, "zhong"); + + await trigger.player.changeGroup(player.group); + await trigger.player.draw(); + }, + }, + //枣恭介 + nk_shekong: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + selectCard() { + if (ui.selected.targets.length) return [1, ui.selected.targets[0].countCards("he")]; + return [1, Infinity]; + }, + filterTarget(event, player, target) { + return ( + target != player && target.countCards("he") >= Math.max(1, ui.selected.cards.length) + ); + }, + check(card) { + if ( + !game.hasPlayer(function (current) { + return ( + current != _status.event.player && + get.attitude(_status.event.player, current) < 0 && + current.countCards("he") > ui.selected.cards.length + ); + }) + ) + return 0; + return 6 - get.value(card); + }, + content() { + "step 0"; + event.cardsx = cards.slice(0); + var num = get.cnNumber(cards.length); + var trans = get.translation(player); + var prompt = "弃置" + num + "张牌,然后" + trans + "摸一张牌"; + if (cards.length > 1) prompt += ";或弃置一张牌,然后" + trans + "摸" + num + "张牌"; + var next = target.chooseToDiscard(prompt, "he", true); + next.numx = cards.length; + next.selectCard = function () { + if (ui.selected.cards.length > 1) return _status.event.numx; + return [1, _status.event.numx]; + }; + next.complexCard = true; + next.ai = function (card) { + if ( + ui.selected.cards.length == 0 || + _status.event.player.countCards("he", function (cardxq) { + return get.value(cardxq) < 7; + }) >= _status.event.numx + ) + return 7 - get.value(card); + return -1; + }; + "step 1"; + if (result.bool) { + if (result.cards.length == cards.length) player.draw(); + else player.draw(cards.length); + event.cardsx.addArray(result.cards); + for (var i = 0; i < event.cardsx.length; i++) { + if (get.position(event.cardsx[i]) != "d") event.cardsx.splice(i--, 1); + } + } else event.finish(); + "step 2"; + if (event.cardsx.length) { + player.chooseButton( + ["请按顺序将卡牌置于牌堆顶(先选择的在上)", event.cardsx], + true, + event.cardsx.length + ); + } else event.finish(); + "step 3"; + if (result.bool) { + var cardsx = result.links; + while (cardsx.length) { + var card = cardsx.pop(); + card.fix(); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + } + } + }, + ai: { + order: 10, + result: { + target: -1, + }, + }, + }, + key_huanjie: { + trigger: { player: ["drawBegin", "judgeBegin"] }, + forced: true, + silent: true, + popup: false, + lastDo: true, + filter(event) { + return event.name == "draw" || !event.directresult; + }, + content() { + if (trigger.name == "draw") { + if (trigger.bottom) trigger.bottom = false; + else trigger.bottom = true; + } else trigger.directresult = get.bottomCards()[0]; + }, + }, + //此花露西娅 + lucia_duqu: { + trigger: { + player: ["damage", "loseHpBefore", "useCardBefore"], + source: "damage", + }, + forced: true, + charlotte: true, + filter(event, player, onrewrite) { + if (onrewrite == "loseHpBefore") { + return event.type == "du"; + } + return event.source != undefined && event.source != event.player; + }, + content() { + var onrewrite = event.triggername; + if (onrewrite == "loseHpBefore") { + trigger.cancel(); + player.recover(trigger.num); + } else { + var another = trigger[trigger.source == player ? "player" : "source"]; + player.line(another, { color: [220, 90, 139] }); + another.gain(game.createCard2("du"), "gain2"); + } + }, + ai: { + usedu: true, + }, + }, + lucia_zhenren: { + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.countCards("e") > 0; + }, + content() { + "step 0"; + var es = player.getCards("e"); + event.count = es.length; + player.discard(es); + "step 1"; + event.count--; + if ( + game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "ej") > 0; + }) + ) { + player.chooseTarget( + "请选择一名角色,弃置其装备区或判定区内的一张牌。", + true, + function (card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; + } + ).ai = function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("j") && att > 0) return att * 1.5; + return -att; + }; + } else event.finish(); + "step 2"; + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, { color: [220, 90, 139] }); + player.discardPlayerCard(target, "ej", true); + if (event.count) event.goto(1); + } + }, + }, +} + +export default skills; \ No newline at end of file diff --git a/character/key/translate.js b/character/key/translate.js new file mode 100644 index 000000000..59501c347 --- /dev/null +++ b/character/key/translate.js @@ -0,0 +1,599 @@ +const translates = { + sp_key_yuri: "SP仲村由理", + sp_key_yuri_prefix: "SP", + key_lucia: "此花露西娅", + key_kyousuke: "枣恭介", + key_yuri: "仲村由理", + key_haruko: "神尾晴子", + key_umi: "加藤うみ", + key_umi2: "鹰原羽未", + key_rei: "零", + key_komari: "神北小毬", + key_yukine: "宫泽有纪宁", + key_yusa: "西森柚咲", + key_misa: "黑羽美砂", + key_masato: "井之原真人", + key_iwasawa: "岩泽雅美", + key_kengo: "宫泽谦吾", + key_yoshino: "吉野晴彦", + key_yui: "由依", + key_tsumugi: "紬文德斯", + key_saya: "朱鹭户沙耶", + key_harukakanata: "三枝叶留佳&二木佳奈多", + key_harukakanata_ab: "三枝二木", + key_inari: "稻荷", + key_shiina: "椎名", + key_sunohara: "春原阳平&春原芽衣", + key_sunohara_ab: "阳平芽衣", + //该武将国战模式下不可用 + key_rin: "枣铃", + key_sasami: "笹濑川佐佐美", + key_akane: "千里朱音", + key_doruji: "多鲁基", + key_yuiko: "来谷唯湖", + key_riki: "直枝理树" /*+'子'*/, + key_hisako: "渕田久子", + key_hinata: "日向秀树", + key_noda: "野田", + key_tomoya: "冈崎朋也", + key_nagisa: "古河渚", + key_ayato: "直井文人", + key_ao: "空门苍", + key_yuzuru: "音无结弦", + sp_key_kanade: "SP立华奏", + sp_key_kanade_prefix: "SP", + key_mio: "西园美鱼", + key_midori: "西园美鸟", + key_kyoko: "岬镜子", + key_shizuru: "中津静流", + key_shiorimiyuki: "关根诗织&入江美雪", + key_shiorimiyuki_ab: "关根入江", + key_miki: "野村美希", + key_shiori: "美坂栞", + key_kaori: "美坂香里", + key_akiko: "水濑秋子", + key_abyusa: "游佐", + key_godan: "松下护騨", + key_yuu: "乙坂有宇", + key_ryoichi: "三谷良一", + key_kotori: "神户小鸟", + key_jojiro: "高城丈士朗", + key_shiroha: "鸣濑白羽", + key_shizuku: "水织静久", + key_hiroto: "铃木央人", + key_sakuya: "凤咲夜", + key_youta: "成神阳太", + key_rumi: "七濑留美", + key_chihaya: "凤千早", + key_yukito: "国崎往人", + key_crow: "小空", + key_asara: "井上晶", + key_kotomi: "一之濑琴美", + key_mia: "藤川米娅", + key_kano: "雾岛佳乃", + db_key_liyingxia: "李映夏", + key_erika: "苍井绘梨花", + key_satomi: "藏里见", + key_iriya: "喵呜·喵呼", + key_iriya_ab: "喵呜喵呼", + key_fuuko: "伊吹风子", + lucia_duqu: "毒躯", + lucia_duqu_info: + "锁定技,①当你对其他角色造成伤害或受到其他角色的伤害时,你令对方获得一张花色点数随机的【毒】。
    ②当你因【毒】失去体力时,你改为回复等量的体力。", + lucia_zhenren: "振刃", + lucia_zhenren_info: + "锁定技,每个结束阶段,若你的装备区内有牌,则你弃置之。然后,你依次弃置场上的X张牌。(X为你以此法弃置的牌数)", + nk_shekong: "设控", + nk_shekong_info: + "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色(不能超过该角色的牌数),然后令其选择一项:弃置一张牌并令你摸X张牌,或弃置X张牌并令你摸一张牌。然后,你将你与其弃置的且位于弃牌堆中的牌以任意顺序置于牌堆顶。", + key_huanjie: "幻界", + key_huanjie_info: "锁定技,当你进行判定或摸牌时,你改为从牌堆的另一端获取相应的牌。", + yuri_xingdong: "行动", + yuri_xingdong_info: + "锁定技,出牌阶段开始时,你获得一张【杀】或普通锦囊牌。出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", + //目标角色跳过阶段的同时 该回合不能发动〖整经(郑玄)〗 + yuri_wangxi: "忘隙", + yuri_wangxi_info: + "主公技,限定技,当有角色因你发动的【行动】而死亡后,若其身份不为【明忠】,则其可以将身份改为忠臣并重新加入游戏,然后将势力改为与你相同,将体力值回复至2点并摸一张牌。", + haruko_haofang: "豪放", + haruko_haofang_info: + "锁定技,你的延时锦囊牌视为【无中生有】。当你因执行【无中生有】的效果而摸牌时,你令摸牌数+2。", + haruko_zhuishi: "追逝", + haruko_zhuishi_info: + "一名角色的判定阶段开始时,若其判定区内有牌,则你可以获得其判定区内的所有牌。若你的体力值大于1,你失去1点体力。", + umi_chaofan: "炒饭", + umi_chaofan_info: + "出牌阶段限一次,你可以弃置两张花色不同的手牌并选择一名其他角色。你摸一张牌,若你的体力值:大于2,目标角色回复1点体力;等于2,目标角色摸两张牌;小于2,目标角色受到1点无来源且对应渠道为这两张牌的火焰伤害。", + umi_lunhui: "轮回", + umi_lunhui_info: + "一名其他角色的回合结束时,若你的手牌数小于体力值,则你可以失去1点体力。若如此做,你摸两张牌并进行一个额外回合,且你于此回合内计算与此角色的距离视为1。", + umi_shiroha: "轮回 - 延时效果", + umi_qihuan: "七幻", + umi_qihuan_info: + "限定技,当你处于濒死状态时,你可以移去此武将牌。若如此做,你回复X点体力(X为场上势力数)。然后,你可获得场上已死亡角色武将牌上的至多两个技能。", + komari_tiankou: "甜口", + komari_tiankou_info: + "锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标。", + komari_xueshang: "血殇", + komari_xueshang_info: + "锁定技,蓄能技,当有角色死亡时,你对自己造成1点伤害,然后对所有其他角色依次造成1点伤害。当有角色因此法进入濒死状态时,你加1点体力上限并回复1点体力,然后失去此技能并终止此技能的所有后续结算。", + yukine_wenzhou: "问咒", + yukine_wenzhou_info: + "一名角色的出牌阶段开始时,其可以交给你一张牌。若如此做,你选择一项:交给其一张牌,或令其从牌堆中获得一张与此牌类型相同的牌,且其于此阶段内使用与此牌牌名相同的牌时无法被响应。", + //如果对自己发动【问咒】,则自己可以响应这些牌。但其他角色发动【问咒】时,该角色自己并不能响应 + yusa_yanyi: "演艺", + yusa_yanyi_info: + "出牌阶段限一次,你可以指定至多X名与你距离不大于你的体力值的角色。这些角色选择一项:①令你摸一张牌。②回复1点体力,然后交给你一张牌。(X为你的攻击范围且至少为1)", + misa_yehuo: "业火", + misa_yehuo_info: + "一名角色的摸牌阶段开始时,若其在你的攻击范围内,你可以弃置X张牌并选择一项:①对其造成1点火属性伤害。②令其于此摸牌阶段放弃摸牌。(X为你与其的的距离)", + yusa_misa: "通灵", + yusa_misa_info: "当你发动的〖演艺〗结算完成之后,你可以将武将牌翻面。", + misa_yusa: "归魂", + misa_yusa_info: "当你发动的〖业火〗结算完成后,你可以将武将牌翻面。", + masato_baoquan: "暴拳", + masato_baoquan_info: + "锁定技,当你即将造成伤害时,你选择一项:1.令此伤害+2并减1点体力上限。2.防止此伤害。", + iwasawa_yinhang: "引吭", + iwasawa_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", + iwasawa_mysong: "My Song", + iwasawa_mysong_info: + "锁定技,当你即将进行濒死结算时,取消之。回合开始时,若你的体力值小于1,则你获得技能〖奋音〗直到回合结束。回合结束时,若你的体力值小于1,你死亡。", + iwasawa_fenyin: "奋音", + iwasawa_fenyin_info: + "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", + iwasawa_refenyin: "奋音", + iwasawa_refenyin_info: + "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。", + //卡牌花色的计算不受〖红颜〗等技能的影响 + kengo_weishang: "伪伤", + kengo_weishang_sha: "伪伤", + kengo_weishang_shan: "伪伤", + kengo_weishang_info: + "出牌阶段限一次,你可以废除一个装备栏并摸两张牌。若你的武器栏已废除,则你使用【杀】的次数上限+1,且当你使用【杀】指定目标后,目标角色弃置一张牌;若你的防具栏已废除,则你可以将一张牌当做【闪】使用或打出;若你的攻击/防御坐骑栏已废除,则你至其他角色的距离-1/其他角色至你的距离-1。", + kengo_guidui: "归队", + kengo_guidui_info: + "锁定技,准备阶段,若你有已废除的装备栏,则你恢复这些装备栏,且本局游戏内发动【伪伤】时不能废除这些装备栏。", + yoshino_jueyi: "决义", + yoshino_jueyi_info: + "出牌阶段开始时,你可以选择一名其他角色。你摸一张牌并与其猜拳(平局则重来)。若你赢,你对其造成1点伤害。若你没赢,你本阶段内使用牌时不能指定其为目标。", + yui_jiang: "激昂", + yui_jiang_info: + "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", + yui_lieyin: "烈音", + yui_lieyin_info: + "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。", + yui_takaramono: "珍宝", + yui_takaramono_info: + "觉醒技,准备阶段,若你满足以下条件中的至少两个:①体力值不大于1;②场上有已死亡的角色;③已因〖激昂〗累计获得过至少三张牌;则你获得技能〖引吭〗,将〖烈音〗描述中的「你选择」改为「你可选择」,然后加1点体力上限并回复1点体力。", + //ユイ/孙笨双将组合时,孙笨的〖激昂〗不计入〖珍宝〗的次数统计 + yui_yinhang: "引吭", + yui_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", + tsumugi_mugyu: "姆啾", + tsumugi_mugyu_info: "当你成为牌的目标后,若你的手牌数小于体力上限,则你可以摸一张牌。", + tsumugi_huilang: "回廊", + tsumugi_huilang2: "回廊", + tsumugi_huilang_info: + "回合结束时,你可以将任意张牌扣置于武将牌下(均称为「隐」)。回合开始时,你获得所有「隐」,然后可令等量的角色各摸一张牌。", + //〖回廊〗涉及的所有卡牌移动的结算不会触发〖良姻〗 + haruka_shuangche: "双掣", + kanata_shuangche: "双掣", + haruka_shuangche_backup: "双掣", + haruka_shuangche_info: + "出牌阶段,你可以视为使用任意基本牌或普通锦囊牌。此牌结算完成后,你选择一项:1.弃置X张牌。2.失去1点体力且本回合内不能再发动〖双掣〗。(X为你于此回合内发动过〖双掣〗的次数)", + //你不能以此法使用〖回魂〗 + saya_shouji: "授计", + saya_shouji_info: + "每回合限一次,当你使用的牌结算完成后,你可以将此牌对应的所有实体牌交给一名其他角色。其可以使用这些牌中的一张,若如此做,你摸一张牌。", + saya_powei: "破围", + saya_powei_info: + "限定技,回合结束后,你可以选择一名体力值大于你的其他角色。你与其交替进行额外回合,直到你与其中的一名角色死亡或进行到九个回合。你于回合开始时进行判定,若结果为红色,则你对其造成1点伤害。此过程中其他角色不计入距离和座次计算。", + saya_judge: "破围", + saya_nodis: "破围", + //〖破围〗不会因为〖铁骑〗无效 + inari_baiwei: "摆尾", + inari_baiwei_draw: "摆尾", + inari_baiwei_info: "你可以将一张♦牌当做任意基本牌使用或打出。此牌结算完成后,你摸一张牌。", + //你不能以此法使用【毒】 + inari_baiwei_backup: "摆尾", + inari_baiwei_sha: "摆尾", + inari_baiwei_shan: "摆尾", + inari_huhun: "狐魂", + inari_huhun_info: "锁定技,你的♣牌的花色均视为♦。你的手牌上限+1。", + shiina_qingshen: "轻身", + shiina_qingshen_info: + "当你受到或造成伤害后,你可以获得此次伤害的渠道对应的实体牌,然后将等量的牌置于你的武将牌上,称为「轻」。锁定技,你的手牌上限和攻击范围+X(X为「轻」数)。", + shiina_feiyan: "飞燕", + shiina_feiyan_info: + "一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能〖铁骑〗。", + shiina_retieji: "铁骑", + //你不能对稻荷和多鲁基发动〖飞燕〗 + sunohara_chengshuang: "成双", + sunohara_chengshuang_phase: "成双", + sunohara_chengshuang_info: "锁定技,游戏开始时,你选择你的性别。回合开始时,你可以切换你的性别。", + sunohara_tiaoyin: "挑引", + sunohara_tiaoyin_info: + "出牌阶段限一次,你可以弃置任意张花色各不相同的手牌,然后获得等量角色区域内的各一张牌。若你以此法获得了异性角色区域内的牌,则你失去1点体力。", + sunohara_jianren: "坚忍", + sunohara_jianren_info: + "当你受到伤害后,你可以令一名角色摸一张牌。若伤害无来源或来源与你性别不同,则改为摸三张牌。", + rin_baoqiu: "暴球", + rin_baoqiu_info: + "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", + sasami_miaobian: "喵变", + sasami_miaobian_info: + "当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗。", + sasami_gongqing: "公清", + sasami_gongqing_info: + "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", + sasami_funan: "复难", + sasami_funan_info: + "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", + sasami_baoqiu: "暴球", + sasami_baoqiu_info: + "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", + akane_jugu: "巨贾", + akane_jugu_info: "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", + akane_quanqing: "权倾", + akane_quanqing_info: + "出牌阶段,你可选择:1.弃置一张点数大于10的牌并对攻击范围内的一名其他角色造成1点伤害;2.弃置一张点数大于6的牌并弃置攻击范围内的一名其他角色区域内的一张牌。3.弃置一张牌并令攻击范围内的一名其他角色摸一张牌。", + akane_yifu: "蚁附", + akane_yifu2: "蚁附", + akane_yifu_info: + "主公技,其他键势力角色的出牌阶段限一次,其可交给你一张手牌。然后你摸一张牌,并将一张手牌交给该角色。", + doruji_feiqu: "肥躯", + doruji_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", + yuiko_fenglun: "锋论", + yuiko_fenglun_info: + "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本阶段内使用牌没有次数和距离限制。", + yuiko_dilve: "底略", + yuiko_dilve_info: "你可以使用牌堆底的一张牌进行拼点。当你拼点后,你可以获得两张拼点牌。", + riki_spwenji: "问计", + riki_spwenji_info: + "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", + riki_nvzhuang: "女装", + riki_nvzhuang_info: + "锁定技,此武将牌视为包含女性性别。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。", + riki_mengzhong: "梦终", + riki_mengzhong_info: + "觉醒技,准备阶段,若你已因〖问计〗获得了三张或更多的牌,则你加1点体力上限并回复1点体力,失去〖问计〗并获得〖重振〗。", + riki_chongzhen: "重振", + riki_chongzhen_info: + "出牌阶段开始时,你可以与一名角色拼点。若你赢,你获得该角色手牌区,装备区,判定区的各一张牌;若你没赢,你于此阶段内使用牌时不能指定其他角色为目标。", + hisako_yinbao: "音爆", + hisako_yinbao_info: + "当你受到伤害/回复体力后,你可以判定。若结果为♠,则你对一名其他角色造成1点雷属性伤害。", + hisako_zhuanyun: "转运", + hisako_zhuanyun_info: "锁定技,你的判定会朝向对你有利的方向倾斜。", + hinata_qiulve: "球略", + hinata_qiulve_info: + "你可以将一张非基本牌当做【杀】使用或打出(无距离限制)。你以此法使用的红色【杀】不可被响应,黑色【杀】不计入使用次数限制。", + hinata_ehou: "扼喉", + hinata_ehou_info: + "其他角色对你使用的牌结算完成后,你可对其使用一张【杀】。若此【杀】造成伤害,则你摸一张牌。", + noda_fengcheng: "奉承", + noda_fengcheng_info: "锁定技,其他角色交给你牌后,其摸一张牌。", + noda_xunxin: "寻衅", + noda_xunxin2: "寻衅", + noda_xunxin_info: + "出牌阶段限X次,你可以视为对一名体力值不小于你的角色使用【决斗】。若如此做,此【决斗】结算完成后,没赢的角色交给赢的角色一张牌。(X为你的体力值)", + tomoya_shangxian: "伤弦", + tomoya_shangxian_info: + "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。", + tomoya_wangjin: "往今", + tomoya_wangjin_info: + "每项每轮各限一次。一名其他角色的回合结束时,若其:在你的攻击范围内,你可令其摸一张牌。若其的体力值小于你,则你摸一张牌,并可交给其一张牌。不在你的攻击范围内,则你摸两张牌,并令其弃置你的一张手牌。若其的体力值大于你,则你视为对其使用一张【杀】(无距离限制)。", + nagisa_tiandu: "天妒", + nagisa_tiandu_info: "当你的判定牌生效后,你可以获得此牌。", + nagisa_fuxin: "抚心", + nagisa_fuxin_info: + "当一名角色于回合外受到伤害,或其手牌被其他角色弃置或获得后,你可以令其判定。若结果为:红色,其摸一张牌。黑色,当前回合角色弃置一张牌。", + ayato_jianshen: "僭神", + ayato_jianshen_info: "锁定技,你手牌中的【杀】均视为神属性。", + ayato_zonghuan: "纵幻", + ayato_zonghuan_info: + "出牌阶段限一次,你可以观看一名其他角色的手牌,然后选择一项:将其中的一张牌置入弃牌堆,或以该角色的视角使用其中的一张,然后摸一张牌。", + ao_xishi: "习事", + ao_xishi_info: "锁定技,当你使用或打出♦牌时,或其他角色使用♦牌指定你为目标后,你摸一张牌。", + ao_kuihun: "窥魂", + ao_kuihun_info: + "其他角色进入濒死状态时,你可以摸一张牌,然后观看其手牌并将其中一张牌置于你的武将牌上,称为「蝶」。你使用与一张「蝶」花色相同的牌时无距离和次数限制。你的手牌上限+X(X为蝶数)。", + ao_shixin: "释心", + ao_shixin_info: + "觉醒技,准备阶段,若你的「蝶」中包含至少三种花色,则你加1点体力上限并回复1点体力,失去〖窥魂〗并获得〖蝶归〗。", + ao_diegui: "蝶归", + ao_diegui_backup: "蝶归", + ao_diegui_info: "出牌阶段限一次,你可以将一张「蝶」交给一名角色,该角色摸两张牌并复原武将牌。", + yuzuru_wuxin: "无心", + yuzuru_wuxin_info: + "结束阶段,你可以选择一项:失去1点体力并令一名角色摸两张牌,或弃置两张牌并回复1点体力。", + yuzuru_deyi: "得义", + yuzuru_deyi_info: + "觉醒技,当有其他角色死亡后,你减1点体力上限并回复1点体力,失去技能〖无心〗,获得技能〖往生〗〖困奋〗和〖去疾〗。", + yuzuru_wangsheng: "往生", + yuzuru_wangsheng_info: + "觉醒技,当你即将死亡时,你防止此次死亡。你可以将任意张牌交给一名其他角色,然后减1点体力上限并将体力回复至2点,修改技能〖困奋〗和〖去疾〗。", + yuzuru_kunfen: "困奋", + yuzuru_kunfen_info: + "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。", + yuzuru_quji: "去疾", + yuzuru_quji_info: + "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)", + yuzuru_kunfen_rewrite: "困奋·改", + yuzuru_kunfen_rewrite_info: "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。", + yuzuru_quji_rewrite: "去疾·改", + yuzuru_quji_rewrite_info: + "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)", + yuzuru_bujin: "步进", + yuzuru_bujin_info: "锁定技,己方其他角色计算与其他角色的距离-1且摸牌阶段的额定摸牌数+1。", + kanade_mapo: "麻婆", + kanade_mapo_info: "你可以将一张♥牌当做【麻婆豆腐】使用。你使用的【麻婆豆腐】可以多指定一个目标。", + kanade_benzhan: "奔战", + kanade_benzhan_info: + "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", + mio_tuifu: "推腐", + mio_tuifu_info: "锁定技,当一名角色对一名同性角色造成伤害时,你摸一张牌。", + mio_tishen: "替身", + mio_tishen_info: + "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鸟】。", + midori_nonghuan: "弄幻", + midori_nonghuan_info: + "出牌阶段限X次(X为你的体力值),你可以获得一名本阶段内未选择过的其他角色的区域内的一张牌。你摸一张牌,然后将一张牌交给该角色。然后你清除此技能结算过程中所有卡牌移动事件的移动记录。", + //即技能结算完成后,所有涉及到的牌移动事件不会再被getHistory获取 + midori_tishen: "替身", + midori_tishen_info: + "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鱼】。", + kyoko_juwu: "聚物", + kyoko_juwu_info: + "你的回合外,当有装备牌进入弃牌堆后,若这些牌不是从你的区域移动的,则你可以获得这些牌。", + kyoko_zhengyi: "整遗", + kyoko_zhengyi_info: + "锁定技,若你装备区的花色数:大于等于1,你视为拥有〖精策〗;大于等于2,你视为拥有〖涉猎〗:大于等于3,你视为拥有〖制衡〗;大于等于4,你将〖精策〗和〖制衡〗改为界限突破版本。", + kyoko_jingce: "精策", + kyoko_shelie: "涉猎", + kyoko_zhiheng: "制衡", + shizuru_nianli: "念力", + shizuru_nianli_info: + "每轮限一次,你可以展示一张♦/♣/♥/♠手牌,然后视为使用一张不计入次数限制和记录的雷【杀】/【闪】/【桃】/【无懈可击】。", + shizuru_benzhan: "奔战", + shizuru_benzhan_info: + "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", + shiorimiyuki_banyin: "伴音", + shiorimiyuki_banyin_info: "当你受到伤害或回复体力后,你可令一名其他角色回复1点体力。", + shiorimiyuki_tingxian: "铤险", + shiorimiyuki_tingxian_info: + "出牌阶段开始时,你可以摸至多三张牌。若如此做,你回复1点体力,且此阶段结束时你失去X点体力。(X为你得到的牌中仍在手牌区的牌的数量)", + shiorimiyuki_tingxian2: "铤险", + miki_shenqiang: "神枪", + miki_shenqiang_info: + "锁定技,游戏开始时,你将一张【海德洛格拉迪尔特·改】和一张【望远镜】置入你的装备区。你装备区内的武器牌和宝物牌不能被其他角色弃置。", + miki_huanmeng: "幻梦", + miki_huanmeng_info: + "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", + miki_zhiluo: "治裸", + miki_zhiluo_info: + "锁定技,一名其他角色的回合结束时,若其在你的攻击范围内且其装备区内没有牌,则你选择:①摸一张牌。②视为对其使用一张【杀】。", + miki_hydrogladiator: "海德洛", + miki_hydrogladiator_info: + "全名为【海德洛格拉迪尔特·改】。锁定技,当你因执行【杀】的效果而对目标角色造成伤害后,你弃置所有至目标角色距离为1的其他角色的一张牌或弃置其两张牌。", + miki_hydrogladiator_skill: "海德洛格拉迪尔特·改", + miki_binoculars: "望远镜", + miki_binoculars_info: "锁定技,其他角色的手牌对你可见。", + shiori_huijuan: "绘卷", + shiori_huijuan_discard: "绘卷", + shiori_huijuan_info: + "锁定技,其他角色的结束阶段开始时,你可以视为使用一张该角色本回合出牌阶段内使用过的基本牌或普通锦囊牌。准备阶段开始时,若你自上个回合起以此法使用的牌数不小于X,则你选择一项:①弃置装备区或判定区内的一张牌。②跳过本回合的出牌阶段。(X为场上玩家数的一半且至少为2)", + kaori_siyuan: "思愿", + kaori_siyuan_info: + "出牌阶段,你可以将一张装备牌或延时锦囊牌置于一名其他角色的装备区内,然后可以视为使用一张基本牌或普通锦囊牌。", + akiko_dongcha: "洞察", + akiko_dongcha_info_identity: + "锁定技,其他角色的手牌对你可见。游戏开始时,你令其他角色的身份牌对你可见。", + akiko_dongcha_info: "锁定技,其他角色的手牌对你可见。", + abyusa_jueqing: "绝情", + abyusa_jueqing_info: + "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。", + abyusa_jueqing_1st: "绝情", + abyusa_jueqing_rewrite: "绝情·改", + abyusa_jueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。", + abyusa_dunying: "遁影", + abyusa_dunying_info: + "锁定技,其他角色计算与你的距离时+X。准备阶段和结束阶段,你摸X张牌(X为你已损失的体力值)。", + godan_yuanyi: "远忆", + godan_yuanyi_info: + "锁定技,回合开始时,你摸X张牌并进行一个额外的出牌阶段。(X为游戏轮数且至多为3)", + godan_feiqu: "肥躯", + godan_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", + godan_xiaoyuan: "消元", + godan_xiaoyuan_info: + "觉醒技,当你扣减体力时,若你的体力值小于4,则你减3点体力上限并摸三张牌,失去【肥躯】。", + yuu_lveduo: "掠夺", + yuu_lveduo_info: + "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", + yuu_lveduo_full_info: + "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面,获得该角色武将牌上所有的带有「Charlotte」标签的技能,且该角色失去这些技能。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", + ryoichi_baoyi: "爆衣", + ryoichi_baoyi_info: + "锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①令一名其他女性角色失去1点体力。②弃置一名其他非女性角色区域内的两张牌。", + ryoichi_tuipi: "褪皮", + ryoichi_tuipi_info: + "锁定技,你不是【顺手牵羊】和【过河拆桥】的合法目标。你装备区的牌于弃牌阶段内计入手牌上限。", + kotori_yumo: "驭魔", + kotori_yumo_damage: "驭魔", + kotori_yumo_gain: "驭魔", + kotori_yumo_info: + "锁定技,游戏开始时,你获得蓝色、红色、绿色、黄色、灰色魔物各一个。当有角色受到伤害后,若你没有对应的标记,你根据其势力获得一个对应魔物:魏:蓝、蜀:红、吴:绿、群:黄、灰:晋、键:紫。回合开始时,你可以弃置一个对应的魔物并获得以下技能之一直到回合结束:蓝:魏业、红:蜀义、绿:吴耀、黄:群心、灰:晋势、紫:键魂。", + kotori_skill_wei: "魏业", + kotori_skill_wei_info: + "回合开始时,你可以弃置一张牌并指定一名其他角色,该角色须弃置一张牌,否则你摸一张牌。", + kotori_skill_shu: "蜀义", + kotori_skill_shu_info: + "你使用【杀】上限+1;出牌阶段结束时,若你于此阶段使用【杀】次数不少于2,摸一张牌。", + kotori_skill_wu: "吴耀", + kotori_skill_wu_info: "回合结束时,若你的手牌数不等于你的体力值,则你摸一张牌。", + kotori_skill_qun: "群心", + kotori_skill_qun_info: + "锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1。", + kotori_skill_key: "键魂", + kotori_skill_key_info: + "出牌阶段限一次,你可以摸一张牌并获得1点护甲。若如此做,你于当前回合结束时失去1点体力。", + kotori_skill_jin: "晋势", + kotori_skill_jin_info: + "摸牌阶段结束时,你可以展示你于此阶段内因摸牌而得到的牌。若这些牌的花色均不同,则你摸一张牌。", + kotori_yumo_wei: '魔物', + kotori_yumo_shu: '魔物', + kotori_yumo_wu: '魔物', + kotori_yumo_qun: '魔物', + kotori_yumo_key: '魔物', + kotori_yumo_jin: '魔物', + kotori_huazhan: "花绽", + kotori_huazhan_info: + "每回合每种魔物限一次,你可将一个蓝色/红色/绿色/黄色/紫色/灰色魔物当做【树上开花】使用。", + jojiro_shensu: "神速", + jojiro_shensu_info: + "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", + jojiro_shensu1: "神速", + jojiro_shensu2: "神速", + jojiro_shensu4: "神速", + jojiro_shunying: "瞬影", + jojiro_shunying_info: + "锁定技,回合结束时,若你本回合内跳过了阶段,则你选择一项:1.失去1点体力。2.移动至多X格并摸X张牌(X为你本回合内跳过的阶段数)。", + shiroha_yuzhao: "预兆", + shiroha_yuzhao_umi: "预兆", + shiroha_yuzhao_info: + "锁定技,游戏开始时,你将牌堆顶的X张牌扣置于你的武将牌上,称为「兆」。一名角色的回合开始时,若你有「兆」且其至你的距离不大于1,则你将牌堆顶的X张牌扣置为「兆」,然后将等量的「兆」置于牌堆顶。(X为势力数)", + shiroha_guying: "孤影", + shiroha_guying_info: + "锁定技,每回合限一次,当你受到伤害/对其他角色造成伤害时,你进行判定。若结果为红色/黑色,此伤害-1/+1。", + shiroha_guying_rewrite: "孤影·改", + shiroha_guying_rewrite_info: + "当你受到伤害/对其他角色造成伤害时,你可进行判定。若结果为红色/黑色,此伤害-1/+1。", + shiroha_jiezhao: "解兆", + shiroha_jiezhao_info: + "一名角色的判定牌生效前,你可打出一张「兆」代替之。当你以此法移去最后一张「兆」后,你加1点体力上限并回复1点体力,然后修改〖孤影〗并随机获得以下技能中的一个:〖炒饭〗/〖习事〗/〖呣啾〗/〖结伴〗。", + //猴年马月爆料再利用 + shizuku_sizhi: "思智", + shizuku_sizhi2: "思智", + shizuku_sizhi_info: + "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离和次数限制,红色牌本回合不计入手牌上限。", + shizuku_biyi: "避忆", + shizuku_biyi_info: + "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", + shizuku_sanhua: "散花", + shizuku_sanhua_info: "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", + hiroto_huyu: "虎驭", + hiroto_huyu2: "虎驭", + hiroto_huyu_info: + "其他角色的出牌阶段结束时,若你没有技能〖纵略〗,则其可将两张手牌交给你。若如此做,你获得〖纵略〗。你的下回合结束时,你失去〖纵略〗并将本回合内得到的所有牌交给该角色。", + hiroto_zonglve: "纵略", + hiroto_zonglve_info: + "锁定技,你的手牌上限+3。出牌阶段限一次,你可以将一张手牌背面朝下放置,并展示一名其他角色的一张手牌。若这两张牌:颜色相同,你对其造成1点伤害并弃置其展示的牌。颜色不同,你获得该角色区域内的两张牌。", + hiroto_tuolao: "脱牢", + hiroto_tuolao_info: + "觉醒技,回合结束后,若此回合不是你的第一个回合且你本轮内未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。", + sakuya_junbu: "均步", + sakuya_junbu_info: + "锁定技,若你已废除的装备栏数量:≥1,你使用牌无距离限制。≥2,你使用牌无次数限制。≥3,你使用牌时可以多指定一个目标。≥4,你使用的牌不可被响应。≥5,你使用牌造成伤害时失去1点体力,令此伤害+1。", + rumi_shuwu: "淑武", + rumi_shuwu2: "淑武", + rumi_shuwu_info: + "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。出牌阶段结束时,你令X=0,且每满足一项便令X+1:①你于本阶段内使用【杀】的次数不大于1。②你于本阶段内未使用锦囊牌造成过伤害。③你的体力值不大于3。你摸X张牌,且本回合手牌上限+X。", + chihaya_liewu: "烈武", + chihaya_liewu2: "烈武", + chihaya_liewu_info: + "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。当你首次废除最后一个装备栏后,你减4点体力上限并获得技能〖怀柔〗。", + chihaya_youfeng: "游凤", + chihaya_youfeng_info: + "转换技,阴,每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。", + chihaya_huairou: "怀柔", + chihaya_huairou_info: "出牌阶段,你可以重铸装备牌。", + yukito_kongwu: "控物", + yukito_kongwu_info: + "出牌阶段限一次,你可以表演《小空飞天》。若如此做,你从以下项目中随机选择X项,并执行其中的一项:①令一名角色摸两张牌。②对一名角色造成1点伤害。③令一名已受伤的角色回复1点体力。④弃置一名角色区域内的两张牌。⑤移动场上的一张牌。若X=0,则你弃置两张牌。(X为你的得分)", + yukito_yaxiang: "鸦翔", + yukito_yaxiang_info: + "限定技,当有角色进入濒死状态时,你可移去此武将牌,然后令该角色将体力值回复至3点,弃置判定区的所有牌并获得技能〖终愿〗。", + misuzu_zhongyuan: "终愿", + misuzu_zhongyuan_info: + "限定技。当你的判定结果生效时,你可将判定结果改为任意花色和点数并结束此时机。", + asara_shelu: "摄录", + asara_shelu_info: + "出牌阶段限一次,你可以弃置一张牌,然后展示一名其他角色的一张手牌并将其置于你的武将牌上,称为“影”。若你以此法弃置的牌和展示的牌:花色相同,则你摸两张牌。点数相同,则你回复1点体力。", + asara_yingwei: "影威", + asara_yingwei_info: + "你可以如手牌般使用或打出“影”。锁定技,当你使用“影”时,强制触发对应的应变效果。", + kotomi_qinji: "琴击", + kotomi_qinji_info: + "出牌阶段开始时,你可视为使用使用【万箭齐发】。你以此法使用【万箭齐发】造成的伤害视为失去体力。", + kotomi_chuanxiang: "传箱", + kotomi_chuanxiang2: "传箱", + kotomi_chuanxiang_info: + "其他角色的出牌阶段限一次,其可以将装备区内的一张牌移动到另一名角色的装备区内,然后你摸一张牌。若你是目标角色,则你改为摸两张牌。", + mia_shihui: "时迴", + mia_shihui_info: + "锁定技,摸牌阶段,你改为摸X+1张牌(X为你上回合弃置的牌数);结束阶段,你弃置一张牌并回复1点体力。", + mia_qianmeng: "潜梦", + mia_qianmeng_info: + "使命技。①游戏开始时,你摸一张牌,然后将一张牌置于牌堆的正中央。②使命:当有角色获得“潜梦”牌时,其将此牌交给你。你将体力值回复至上限,失去〖时迴〗并获得〖风发〗。③失败:当你死亡时,你可令一名角色获得牌堆中所有与“潜梦”牌花色点数相同的牌。", + mia_fengfa: "风发", + mia_fengfa_info: "锁定技。摸牌阶段,你多摸X张牌(X为你上回合使用过的牌数)。", + kano_liezhen: "列阵", + kano_liezhen_info: + "结束阶段,若你本回合内使用过牌且这些牌的类型:不均相同,你可视为使用【排兵布阵】或智囊;均相同,你获得仁库中的所有牌(没有则改为摸两张牌)。", + kano_paibingbuzhen: "排兵布阵", + kano_paibingbuzhen_info: + "出牌阶段,对至多三名角色使用。目标角色摸一张牌,然后将一张牌置入仁库。若仁库中的牌类型或颜色均相同,则你摸一张牌。", + kano_poyu: "破羽", + kano_poyu_info: + "当你成为【杀】或伤害性锦囊牌的目标后,若仁库中有牌,你可判定。然后你可从仁库中移去一张与此牌类型或花色相同的牌,令此牌对你无效。", + liyingxia_sanli: "三礼", + liyingxia_sanli_info: + "锁定技。其他角色于其回合内前两次使用牌指定你为目标后,你摸一张牌;第三次使用牌指定你为目标后,你交给其一张牌。", + liyingxia_zhenjun: "振军", + liyingxia_zhenjun_info: + "键势力技。结束阶段,你可以令至多X+1名角色各摸一张牌,且这些角色于自己的下个回合内第一次造成的伤害+1(X为你本回合内使用【杀】和伤害性锦囊牌的次数)。", + liyingxia_wumai: "武脉", + liyingxia_wumai_info: + "蜀势力技。一轮游戏开始时,你可以选择获得其中一个未选择过的技能直到本轮结束:〖八阵〗/〖集智〗/〖观星〗/〖游龙〗。若均已选择过,则你可以摸X张牌(X为场上已受伤的角色数且至多为3)。", + erika_shisong: "识诵", + erika_shisong_info: + "锁定技。①你的手牌上限+X(X为你的护甲数)。②当你于回合内使用第Y张牌时,若此牌与你上回合使用的第Y张牌类型相同,则你摸一张牌。", + erika_yousheng: "佑生", + erika_yousheng_info: + "使命技。①限定技。一轮游戏开始时,你可以选择至多两名其他角色。你减2点体力上限并增加3点护甲。②当你〖佑生①〗选择的角色成为【杀】或伤害类锦囊牌的目标时,你可以弃置X张牌并将此目标转移给自己(X为你本轮内发动过〖佑生②〗的次数)。此牌结算结束后,你可令一名原目标角色获得此牌。③成功:当你失去最后的护甲后,若你已发动过〖佑生①〗,则你和所有〖佑生①〗选择的角色各摸三张牌。④失败:当一名〖佑生①〗选择的角色因【杀】或伤害类锦囊牌而受到伤害时,你失去所有护甲并弃置等量的牌。", + erika_yousheng_append: + 'Death is not the end of life, but the completion of life.', + satomi_luodao: "落刀", + satomi_luodao_info: + "当你使用【杀】指定目标后,你可以展示目标角色的所有手牌。若其中:有【闪】,则你弃置其中的一张【闪】;没有【闪】,则你弃置一张牌。", + satomi_daohai: "稻海", + satomi_daohai_info: + "结束阶段,若你本回合内弃置过牌,则你可以视为使用一张【五谷丰登】。然后你可以将你于此【五谷丰登】中得到的牌当做【乐不思蜀】使用。", + satomi_daohai_append: '五穀豊穣、刈り入れ時だね!', + tenzen_fenghuan: "封还", + tenzen_fenghuan_info: + "其他角色使用的【杀】或伤害性锦囊牌结算结束后,若你是此牌的唯一目标,则你可以弃置任意张点数之和大于等于此牌点数两倍的牌,然后视为对其使用一张名称相同的牌。", + tenzen_retianquan: "天全", + tenzen_retianquan_info: + "每回合限一次。当你使用【杀】指定目标后,你可失去1点体力或弃置一张牌,然后亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。这些牌中每有一张基本牌,响应此牌所需的【闪】的数量便+1。此牌结算结束后,若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", + iriya_yinji: "殷极", + iriya_yinji_info: "锁定技。出牌阶段开始时,你将手牌摸至17张。你不能直接使用以此法得到的牌。", + iriya_haozhi: "豪掷", + iriya_haozhi_info: + "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。" + + "对子:其可以令至多两名角色各摸一张牌。" + + "三带:其可以弃置至多三名其他角色的各一张牌,然后摸一张牌。" + + "单顺:其可以弃置一名其他角色的一张牌。若其未以此法弃置过颜色相同的牌,则其可以重复此流程。然后其摸等量的牌。" + + "双顺:其可以获得一名其他角色的一张牌。若其未以此法获得过颜色相同的牌,则其可以重复此流程。然后其回复等量的体力。" + + "三顺/飞机:其可以令至多3名其他角色翻面,然后对其中一名角色造成1点火属性伤害。" + + "炸弹/四带二:其可以对一名角色造成2点雷属性伤害,然后目标角色翻面,弃置装备区的所有牌和四张手牌。", + visible_fuuko_xingdiao: '', + fuuko_xingdiao: "星雕", + fuuko_xingdiao_info: + "锁定技。游戏开始时,你将手牌摸至8张,然后将所有手牌明置(称为“星”,不计入手牌上限)。每名其他角色限一次,其可以于出牌阶段选择获得你的一张“星”,然后你摸一张牌。", + fuuko_chuanyuan: "传愿", + fuuko_chuanyuan_info: + "锁定技。当你失去一张“星”后,你回复1点体力,然后从牌堆中获得一张和“星”花色点数相同的牌(没有则改为摸一张牌,且使用此牌无距离和次数限制)。", +} + +export default translates; \ No newline at end of file diff --git a/game/package.js b/game/package.js index d59c37dac..fb9054467 100644 --- a/game/package.js +++ b/game/package.js @@ -23,6 +23,7 @@ window.noname_package = { old: "怀旧", diy: "DIY", ddd: "3D精选", + 'key/index' : "Key", yxs: "英雄杀", hearth: "炉石传说", gwent: "昆特牌", From 9bb432062d0b1bdf2c4c1101f51b85d9d9b53cfd Mon Sep 17 00:00:00 2001 From: Spmario233 Date: Mon, 22 Apr 2024 20:02:52 +0800 Subject: [PATCH 50/57] bugfix --- character/key/card.js | 2 ++ character/key/index.js | 1 + character/key/skill.js | 2 ++ 3 files changed, 5 insertions(+) diff --git a/character/key/card.js b/character/key/card.js index 64d1fc461..207763dbd 100644 --- a/character/key/card.js +++ b/character/key/card.js @@ -1,3 +1,5 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + const cards = { kano_paibingbuzhen: { fullskin: true, diff --git a/character/key/index.js b/character/key/index.js index 8cfe49741..0c2812ac4 100644 --- a/character/key/index.js +++ b/character/key/index.js @@ -1,5 +1,6 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; import characters from "./character.js"; +import cards from "./card.js"; import pinyins from "./pinyin.js"; import skills from "./skill.js"; import translates from "./translate.js"; diff --git a/character/key/skill.js b/character/key/skill.js index 1e4fc2f31..871ce471f 100644 --- a/character/key/skill.js +++ b/character/key/skill.js @@ -1,3 +1,5 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + /** @type { importCharacterConfig['skill'] } */ const skills = { //伊吹风子 From a943d43409f1fef131c8e0daae64d31f5d95904c Mon Sep 17 00:00:00 2001 From: Rintim Date: Mon, 22 Apr 2024 20:58:09 +0800 Subject: [PATCH 51/57] feat: change origin import character function. --- noname/init/import.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/noname/init/import.js b/noname/init/import.js index 776ea605c..a20bc3dc8 100644 --- a/noname/init/import.js +++ b/noname/init/import.js @@ -11,10 +11,13 @@ export const importCardPack = generateImportFunction("card", (name) => `../../ca * @param {string} name - 武将包名 * @returns {Promise} */ -export const importCharacterPack = generateImportFunction( - "character", - (name) => `../../character/${name}.js` -); +export const importCharacterPack = generateImportFunction("character", (name) => { + const alreadyModernCharacterPack = ["key"]; + + return alreadyModernCharacterPack.includes(name) + ? `../../character/${name}/index.js` + : `../../character/${name}.js`; +}); /** * @param {string} name - 扩展名 From 479559493f7e80df17a2a33b4986a9a8c781f565 Mon Sep 17 00:00:00 2001 From: Rintim Date: Mon, 22 Apr 2024 20:58:21 +0800 Subject: [PATCH 52/57] refactor: rename. --- game/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/package.js b/game/package.js index fb9054467..d50575b1b 100644 --- a/game/package.js +++ b/game/package.js @@ -23,7 +23,7 @@ window.noname_package = { old: "怀旧", diy: "DIY", ddd: "3D精选", - 'key/index' : "Key", + key: "Key", yxs: "英雄杀", hearth: "炉石传说", gwent: "昆特牌", From 3a3d3cd5217b31b23eb6774e74950367a3f9c4a5 Mon Sep 17 00:00:00 2001 From: Rintim Date: Mon, 22 Apr 2024 20:58:31 +0800 Subject: [PATCH 53/57] feat: add game.promises.getFileList. --- noname/game/promises.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/noname/game/promises.js b/noname/game/promises.js index a79a407d3..a8c3943d9 100644 --- a/noname/game/promises.js +++ b/noname/game/promises.js @@ -126,4 +126,17 @@ export class GamePromises { }) ); } + + /** + * 获取文件列表 + * + * @param { string } dir 目录 + * @returns { Promise<[string[], string[]]> } 返回一个数组,第一个元素是文件夹列表,第二个元素是文件列表 + */ + getFileList(dir) { + return new Promise((resolve, reject) => { + // @ts-ignore + game.getFileList(dir, (folders, files) => resolve([folders, files]), reject); + }); + } } From 9b0de829230f761b7241869dc60046a646e513e7 Mon Sep 17 00:00:00 2001 From: Rintim Date: Mon, 22 Apr 2024 20:59:46 +0800 Subject: [PATCH 54/57] fix: allow ts import with ts extension. --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 8ae43aff5..36330b331 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -43,6 +43,7 @@ // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ /* JavaScript Support */ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + "allowImportingTsExtensions": true, "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ /* Emit */ @@ -101,4 +102,4 @@ "ignoreDeprecations": "5.0", "suppressImplicitAnyIndexErrors": true } -} \ No newline at end of file +} From 8e12c5a2ea23c26f3f168fb7b1170891fc93c344 Mon Sep 17 00:00:00 2001 From: Rintim Date: Mon, 22 Apr 2024 21:00:14 +0800 Subject: [PATCH 55/57] feat: add project root url to relative. --- noname.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/noname.js b/noname.js index 24d68dcae..ab93299fa 100644 --- a/noname.js +++ b/noname.js @@ -1,8 +1,10 @@ -export { GNC, gnc, setGNC } from './noname/gnc/index.js'; -export { AI, ai, setAI } from './noname/ai/index.js'; -export { Game, game, setGame } from './noname/game/index.js'; -export { Get, get, setGet } from './noname/get/index.js'; -export { Library, lib, setLibrary } from './noname/library/index.js'; -export { status, _status, setStatus } from './noname/status/index.js'; -export { UI, ui, setUI } from './noname/ui/index.js'; -export { boot } from './noname/init/index.js'; +export const rootURL = new URL(import.meta.url); + +export { GNC, gnc, setGNC } from "./noname/gnc/index.js"; +export { AI, ai, setAI } from "./noname/ai/index.js"; +export { Game, game, setGame } from "./noname/game/index.js"; +export { Get, get, setGet } from "./noname/get/index.js"; +export { Library, lib, setLibrary } from "./noname/library/index.js"; +export { status, _status, setStatus } from "./noname/status/index.js"; +export { UI, ui, setUI } from "./noname/ui/index.js"; +export { boot } from "./noname/init/index.js"; From 8a28a7f00d828ba9ed1d35529fa66ca3453985e8 Mon Sep 17 00:00:00 2001 From: Rintim Date: Mon, 22 Apr 2024 21:47:07 +0800 Subject: [PATCH 56/57] fix: api error and format. --- index.html | 175 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 101 insertions(+), 74 deletions(-) diff --git a/index.html b/index.html index 4fa7ada28..9573fe2c0 100755 --- a/index.html +++ b/index.html @@ -1,28 +1,29 @@ - + - - - - + + + + 无名杀 - \ No newline at end of file + From 150c503ca193fe8f6416ce6544e8fe6723b74459 Mon Sep 17 00:00:00 2001 From: Rintim Date: Mon, 22 Apr 2024 22:11:56 +0800 Subject: [PATCH 57/57] fix: pretteir format uncheck. --- noname/library/init/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noname/library/init/index.js b/noname/library/init/index.js index 380e5018a..61f512b81 100644 --- a/noname/library/init/index.js +++ b/noname/library/init/index.js @@ -724,7 +724,7 @@ export class LibInit { let k = 0; let result; //去除99个step的限制 - while ((result = str.slice(skip).match(new RegExp(`['"]step ${k}['"]`))) != null) { + while ((result = str.slice(skip).match(new RegExp(`\\(?['"]step ${k}['"]\\)?;?`))) != null) { let insertStr; if (k == 0) { insertStr = `switch(step){case 0:`;