From 5dffc03b147170a3cc2afc45acf515967564096b Mon Sep 17 00:00:00 2001 From: kuangthree Date: Sat, 20 Apr 2024 13:01:41 +0800 Subject: [PATCH 01/11] =?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 16a391f74aa9048edd87aed0c52e94096cfe8dd3 Mon Sep 17 00:00:00 2001 From: kuangthree Date: Sat, 20 Apr 2024 13:23:28 +0800 Subject: [PATCH 02/11] =?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 03/11] =?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 04/11] =?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 05/11] =?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 06/11] =?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 07/11] =?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 08/11] 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 09/11] =?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 80a0b2df63d4066a94099a0582c528be6f9cb48b Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Sat, 20 Apr 2024 17:42:20 +0800 Subject: [PATCH 10/11] =?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 11/11] =?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