diff --git a/character/collab/skill.js b/character/collab/skill.js index 0d54eba03..688e953f0 100644 --- a/character/collab/skill.js +++ b/character/collab/skill.js @@ -82,8 +82,10 @@ const skills = { } list.forEach(name => { if (name !== "dc_wuyi") { - const skills = get.character(name).skills; + const skills = get.character(name, 3); skills.forEach(skill => { + const info = get.info(skill); + if (!info || (info.ai && info.ai.combo)) return; if (skill in _status.dcbenxi_map) return; const voices = game.parseSkillText(skill, name); if ( @@ -743,7 +745,7 @@ const skills = { player.addMark("dcbianzhuang", 1, false); if (player.countMark("dcbianzhuang") > 2) { player.storage.dcbianzhuang_inited = true; - player.reinitCharacter("zhutiexiong", "wu_zhutiexiong"); + player.reinitCharacter(get.character(player.name2, 3).includes("dcbianzhuang") ? player.name2 : player.name1, "wu_zhutiexiong"); } } }, diff --git a/character/diy/skill.js b/character/diy/skill.js index e3ed0ac77..31a7afe23 100644 --- a/character/diy/skill.js +++ b/character/diy/skill.js @@ -807,11 +807,14 @@ const skills = { }, noname_duocai2: { charlotte: true }, nsbizhao: { + unique: true, trigger: { player: "showCharacterAfter" }, forced: true, hiddenSkill: true, filter(event, player) { - return event.toShow && event.toShow.includes("ns_yanghu") && player != _status.currentPhase; + return event.toShow && event.toShow.some(name => { + return get.character(name, 3).includes("nsbizhao"); + }) && player != _status.currentPhase; }, content() { player.addTempSkill("nsbizhao2", { @@ -5175,7 +5178,7 @@ const skills = { trigger: { player: "dieBefore" }, forced: true, filter(event, player) { - return player.maxHp > 0; + return player.maxHp > 0 && event.getParent().name != "giveup"; }, content() { trigger.cancel(); @@ -5276,7 +5279,7 @@ const skills = { .set("logSkill", "nsduijue"); "step 1"; if (result.bool) { - player.addTempSkill("nsduijue_use"); + player.addTempSkill("nsduijue_use", "phaseUseAfter"); player.storage.nsduijue_use = get.color(result.cards[0]); } }, @@ -5393,7 +5396,7 @@ const skills = { unique: true, forceunique: true, init(player) { - if (player.storage.nscongjun_show) return false; + if (player.storage.nscongjun_show || ![player.name1, player.name2].includes("ns_huamulan")) return false; var change = function (target) { if (target == player) { var list; @@ -5424,7 +5427,12 @@ const skills = { show: { trigger: { global: "useCard" }, filter(event, player) { - return player.getEnemies().includes(event.player) && event.card.name == "wuxie" && event.getRand() < 0.1; + return ( + player.storage.nscongjun_show && + event.card.name == "wuxie" && + event.getRand() < 0.1 && + player.getEnemies().includes(event.player) + ); }, direct: true, skillAnimation: true, diff --git a/character/extra/skill.js b/character/extra/skill.js index 7354d3af0..fdc103f60 100644 --- a/character/extra/skill.js +++ b/character/extra/skill.js @@ -6323,6 +6323,7 @@ const skills = { combo: "sbaiyin", effect: { target(card, player, target) { + if (!target.hasSkill("sbaiyin") && !target.hasSkill("jilue") || !target.hasFriend()) return; if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; if (get.tag(card, "damage")) { if (target.hp == target.maxHp) { diff --git a/character/gujian.js b/character/gujian.js index 4585eab0c..32cb44d1d 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -630,7 +630,7 @@ game.import("character", function () { player.turnOver(false); "step 3"; player.draw(4); - player.reinit("gjqt_xieyi", "gjqt_chuqi"); + player.reinit(get.character(player.name2, 3).includes("humeng") ? player.name2 : player.name1, "gjqt_chuqi"); player.hp = player.maxHp; "step 4"; if (event.yanjia) { diff --git a/character/hearth.js b/character/hearth.js index 112dfdfe4..027c7363a 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -2382,7 +2382,7 @@ game.import("character", function () { trigger: { player: "phaseBefore" }, unique: true, skillAnimation: true, - forceunique: true, + //forceunique: true, filter() { return game.roundNumber >= 3; }, @@ -2407,7 +2407,7 @@ game.import("character", function () { }; player.awakenSkill("szbianshen"); "step 1"; - player.reinit("hs_shizugui", result.links[0]); + player.reinit(get.character(player.name2, 3).includes("szbianshen") ? player.name2 : player.name1, result.links[0]); player.hp = player.maxHp; player.update(); }, @@ -6851,7 +6851,7 @@ game.import("character", function () { guozai2: { mark: true, intro: { - content: "结束阶段需弃置&张牌", + content: "当前阶段结束时需弃置&张牌", }, trigger: { player: "phaseUseEnd" }, forced: true, @@ -6887,7 +6887,7 @@ game.import("character", function () { guozaix2: { mark: true, intro: { - content: "结束阶段需弃置&张牌", + content: "当前阶段结束时需弃置&张牌", }, trigger: { player: "phaseUseEnd" }, forced: true, diff --git a/character/huicui/skill.js b/character/huicui/skill.js index 35f685c7b..1fc55d0a3 100644 --- a/character/huicui/skill.js +++ b/character/huicui/skill.js @@ -12198,7 +12198,9 @@ const skills = { filter: function (event, player, name) { if (player.hasSkill("zhiwei2")) return false; if (!game.hasPlayer(current => current != player)) return false; - if (get.mode() == "guozhan") return event.name == "showCharacter" && (event.toShow.includes("gz_luyusheng") || event.toShow.includes("luyusheng")); + if (get.mode() == "guozhan") return event.name == "showCharacter" && event.toShow.some(name => { + return get.character(name, 3).includes("zhiwei"); + }); return event.name != "showCharacter" && (name != "phaseBefore" || game.phaseNumber == 0); }, content: function () { @@ -12298,8 +12300,8 @@ const skills = { player.removeSkill("zhiwei2"); if (trigger.name != "die" || get.mode() != "guozhan") event.finish(); "step 1"; - if (player.name1 == "gz_luyusheng" || player.name1 == "luyusheng") player.hideCharacter(0); - if (player.name2 == "gz_luyusheng" || player.name2 == "luyusheng") player.hideCharacter(1); + if (get.character(player.name1, 3).includes("zhiwei")) player.hideCharacter(0); + if (get.character(player.name2, 3).includes("zhiwei")) player.hideCharacter(1); }, }, }, @@ -12369,73 +12371,73 @@ const skills = { player: "damageEnd", source: "damageSource", }, - direct: true, filter: function (event, player) { - return player.hasSkill("wanggui") && !player.hasSkill("wanggui2"); + if (player.isUnseen()) return false; + if (!player.isUnseen(2)) return true; + return ( + !player.isUnseen(0) && get.character(player.name1, 3).includes("wanggui") || + !player.isUnseen(1) && get.character(player.name2, 3).includes("wanggui") + ); }, + usable: 1, preHidden: true, - content: function () { - "step 0"; - player.addTempSkill("wanggui2"); - var bool = player.isUnseen(2); - if (bool) { - player - .chooseTarget("望归:是否对一名势力不同的角色造成1点伤害?", function (card, player, target) { + async cost(event, trigger, player) { + if (player.isUnseen(2)) event.result = await player + .chooseTarget( + get.prompt("wanggui"), + "望归:是否对与你势力不同的一名角色造成1点伤害?", + (card, player, target) => { return target.isEnemyOf(player); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }) - .setHiddenSkill("wanggui"); - } else event.goto(2); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("wanggui", target); - target.damage(); + } + ) + .set("ai", (target) => { + let player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .setHiddenSkill("wanggui") + .forResult(); + else event.result = await player + .chooseBool("望归:是否令与你势力相同的角色各摸一张牌?") + .setHiddenSkill("wanggui") + .set("logSkill", ["wanggui", game.filterPlayer(current => { + return current.isFriendOf(player); + })]) + .forResult(); + }, + async content(event, trigger, player) { + if (player.isUnseen(2)) { + const target = event.targets[0]; + target.damage("nocard"); } - event.finish(); - "step 2"; - player.chooseBool("望归:是否令所有与自己势力相同的角色各摸一张牌?").setHiddenSkill("wanggui"); - "step 3"; - if (result.bool) { - var targets = game.filterPlayer(function (current) { + else { + const targets = game.filterPlayer(current => { return current.isFriendOf(player); }); targets.sortBySeat(); - player.logSkill("wanggui", targets); game.asyncDraw(targets); - } else event.finish(); - "step 4"; - game.delayx(); + } }, }, - wanggui2: {}, xibing: { audio: 2, trigger: { global: "useCardToPlayered" }, filter: function (event, player) { - if (player == event.player || event.targets.length != 1 || event.player.countCards("h") >= event.player.hp) return false; + if (player == event.player || event.targets.length != 1) return false; var bool = function (card) { return (card.name == "sha" || get.type(card, false) == "trick") && get.color(card, false) == "black"; }; if (!bool(event.card)) return false; var evt = event.getParent("phaseUse"); if (evt.player != event.player) return false; - return ( - get.mode() != "guozhan" || - event.player.getHistory("useCard", function (evtx) { - return bool(evtx.card) && evtx.getParent("phaseUse") == evt; - })[0] == event.getParent() - ); + return true; }, + usable: 1, logTarget: "player", check: function (event, player) { var target = event.player; var att = get.attitude(player, target); var num2 = Math.min(5, target.hp) - target.countCards("h"); - if (num2 <= 0) return att <= 0; + if (num2 <= 0) return false; var num = target.countCards("h", function (card) { return target.hasValueTarget(card, null, true); }); @@ -12446,42 +12448,24 @@ const skills = { content: function () { "step 0"; var num = Math.min(5, trigger.player.hp) - trigger.player.countCards("h"); - if (num > 0) trigger.player.draw(num); - "step 1"; - trigger.player.addTempSkill("xibing2"); - player._xibing = true; - if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2)) event.finish(); - "step 2"; - var target = trigger.player; - var players1 = [player.name1, player.name2]; - var players2 = [target.name1, target.name2]; - player - .chooseButton(2, ["是否暗置自己和" + get.translation(target) + "的各一张武将牌?", '
你的武将牌
', [players1, "character"], '
' + get.translation(target) + "的武将牌
", [players2, "character"]]) - .set("players", players1) - .set("complexSelect", true) - .set("filterButton", function (button) { - return !get.is.jun(button.link) && (ui.selected.buttons.length == 0) == _status.event.players.includes(button.link); - }); - "step 3"; - if (result.bool) { - var target = trigger.player; - player.hideCharacter(player.name1 == result.links[0] ? 0 : 1); - target.hideCharacter(target.name1 == result.links[1] ? 0 : 1); - player.addTempSkill("xibing3"); - target.addTempSkill("xibing3"); + if (num > 0) { + trigger.player.draw(num); + trigger.player.addTempSkill("xibing_banned"); } }, - }, - xibing2: { - mod: { - cardEnabled2: function (card) { - if (get.position(card) == "h") return false; + subSkill:{ + banned: { + mod: { + cardEnabled(card) { + return false; + }, + cardSavable(card) { + return false; + }, + }, }, }, }, - xibing3: { - ai: { nomingzhi: true }, - }, //小虎 remeibu: { audio: "meibu", diff --git a/character/huicui/translate.js b/character/huicui/translate.js index a93a50c0c..efc53f5a7 100644 --- a/character/huicui/translate.js +++ b/character/huicui/translate.js @@ -100,8 +100,7 @@ const translates = { spwanggui: "望归", spwanggui_info: "①当你受到伤害后,你可以摸一张牌,或和一名势力相同的其他角色各摸一张牌;②每回合限一次,当你造成伤害后,你可以对一名与你势力不同的角色造成1点伤害。", xibing: "息兵", - xibing_info: "当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)且本回合不能再使用手牌。", - xibing_info_guozhan: "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸至五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", + xibing_info: "每回合限一次,当其他角色于其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)。若其因此摸牌,其本回合不能再使用牌。", luyusheng: "陆郁生", zhente: "贞特", zhente2: "贞特", @@ -167,7 +166,7 @@ const translates = { weimeng_info: "出牌阶段限一次,你可以获得一名其他角色的至多X张手牌,然后交给其等量的牌(X为你的体力值)。若你给出的牌点数之和:大于得到的牌,则你摸一张牌;小于得到的牌,弃置该角色区域内的一张牌。", mamidi: "马日磾", bingjie: "秉节", - bingjie_info: "出牌阶段开始时,你可减1点体力上限,然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。", + bingjie_info: "出牌阶段开始时,你可减1点体力上限,然后当你本回合使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。", zhengding: "正订", zhengding_info: "锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌颜色相同,则你加1点体力上限并回复1点体力。", dc_jiben: "吉本", diff --git a/character/jsrg/skill.js b/character/jsrg/skill.js index 36a85cd8e..884ef38e4 100644 --- a/character/jsrg/skill.js +++ b/character/jsrg/skill.js @@ -619,7 +619,7 @@ const skills = { }, async content(event, trigger, player) { player.line(trigger.player); - trigger.player.addTempSkill("jsrglonglin_forbid"); + trigger.player.addTempSkill("jsrglonglin_forbid", "phaseUseAfter"); }, }, forbid: { @@ -3647,7 +3647,7 @@ const skills = { }, content: function () { "step 0"; - event.num = 0; + target.addTempSkill("jsrgyangming_lose", "phaseUseAfter"); "step 1"; player.chooseToCompare(target).set( "small", @@ -3667,9 +3667,11 @@ const skills = { .chooseBool("是否与其重复此拼点流程?") .set("ai", () => get.event("bool")) .set("bool", get.effect(target, "jsrgyangming", player, player) > 0); - event.num++; + game.broadcastAll((target)=>{ + target.storage.jsrgyangming_lose++; + }, target); } else { - if (event.num) target.draw(event.num); + if (target.storage.jsrgyangming_lose) target.draw(target.storage.jsrgyangming_lose); player.recover(); event.finish(); } @@ -3700,6 +3702,15 @@ const skills = { }, }, }, + subSkill: { + lose: { + init(player, skill) { + player.storage[skill] = 0; + }, + onremove: true, + charlotte: true + } + } }, //韩遂 jsrgniluan: { @@ -6014,6 +6025,9 @@ const skills = { lib.skill.sbyingmen.addVisitors(characters, player); game.delayx(); }, + ai: { + combo: "sbpingjian" + }, group: "sbyingmen_reload", subSkill: { reload: { @@ -6654,7 +6668,12 @@ const skills = { group: "jsrgguanhuo_viewas", content: function () { "step 0"; - var count = player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length; + var count = player.getHistory("useSkill", evt => { + return ( + evt.skill == "jsrgguanhuo_viewas" && + evt.getParent("phaseUse") === trigger.getParent("phaseUse") + ); + }).length; if (count == 1) { player.addTempSkill("jsrgguanhuo_ex", "phaseUseAfter"); player.addMark("jsrgguanhuo_ex", 1, false); @@ -6666,8 +6685,18 @@ const skills = { ai: { effect: { player: function (card, player) { - if (_status.event.getParent().skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length == 1) return "zeroplayertarget"; - if (_status.event.type == "phase" && _status.event.skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length > 1 && player.countCards("h") <= 3) return [0, 0]; + if (_status.event.getParent().skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => { + return ( + evt.skill == "jsrgguanhuo_viewas" && + evt.getParent("phaseUse") === _status.event.getParent("phaseUse") + ); + }).length == 1) return "zeroplayertarget"; + if (_status.event.type == "phase" && _status.event.skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => { + return ( + evt.skill == "jsrgguanhuo_viewas" && + evt.getParent("phaseUse") === _status.event.getParent("phaseUse") + ); + }).length > 1 && player.countCards("h") <= 3) return [0, 0]; }, }, }, diff --git a/character/key/skill.js b/character/key/skill.js index 1a835047c..0bdcaa800 100644 --- a/character/key/skill.js +++ b/character/key/skill.js @@ -463,6 +463,8 @@ const skills = { }, //加纳天善(旧) tenzen_yixing: { + unique: true, + forceunique: true, trigger: { global: "damageEnd", }, @@ -4756,6 +4758,8 @@ const skills = { }, }, yukito_yaxiang: { + unique: true, + forceunique: true, enable: "chooseToUse", limited: true, filter(event, player) { @@ -7070,7 +7074,7 @@ const skills = { let num = 1 + event.cost_data; await player.draw(num).set("gaintag", ["shiorimiyuki_tingxian"]); await player.recover(); - player.addTempSkill("shiorimiyuki_tingxian2"); + player.addTempSkill("shiorimiyuki_tingxian2", "phaseUseAfter"); }, group: "shiorimiyuki_tingxian1", }, @@ -7565,6 +7569,7 @@ const skills = { trigger: { player: "phaseZhunbeiBegin" }, limited: true, unique: true, + forceunique: true, charlotte: true, skillAnimation: true, animationColor: "water", @@ -7572,6 +7577,7 @@ const skills = { return player.isDamaged(); }, check(event, player) { + if (![player.name1, player.name2].includes("key_mio")) return false; return player.hp <= 1 || player.getDamagedHp() > 1; }, content() { @@ -7640,12 +7646,14 @@ const skills = { limited: true, charlotte: true, unique: true, + forceunique: true, skillAnimation: true, animationColor: "water", filter(event, player) { return player.isDamaged(); }, check(event, player) { + if (![player.name1, player.name2].includes("key_midori")) return false; return player.hp <= 1 || player.getDamagedHp() > 1; }, content() { @@ -8690,7 +8698,7 @@ const skills = { }); } } else { - player.addTempSkill("zishou2", "phaseEnd"); + player.addTempSkill("zishou2", "phaseUseAfter"); } }, ai: { expose: 0.2 }, @@ -10574,9 +10582,15 @@ const skills = { }, }, umi_qihuan: { + unique: true, + forceunique: true, enable: "chooseToUse", filter(summer, umi) { - return summer.type == "dying" && umi.isDying(); + return ( + summer.type == "dying" && + umi.isDying() && + [umi.name1, umi.name2].includes("key_umi") + ); }, limited: true, skillAnimation: true, diff --git a/character/mobile/skill.js b/character/mobile/skill.js index 087ba41fe..80dc050c4 100644 --- a/character/mobile/skill.js +++ b/character/mobile/skill.js @@ -1869,9 +1869,6 @@ const skills = { cardUsable: function (card, player) { if (player.countMark("mbzhixi") >= player.hp) return false; }, - cardRespondable: function (card, player) { - if (player.countMark("mbzhixi") >= player.hp) return false; - }, cardSavable: function (card, player) { if (player.countMark("mbzhixi") >= player.hp) return false; }, @@ -7173,10 +7170,11 @@ const skills = { }, check: function (event, player) { return ( - get.damageEffect(event.player, player, player) < 0 || - (!event.player.hasSkillTag("noe") && + get.damageEffect(event.player, player, player) <= 0 || + (get.attitude(player, event.player) <= 0 && + !event.player.hasSkillTag("noe") && event.player.hasCard(function (card) { - return get.value(card) > 6; + return get.value(card) > 9 - event.player.hp; }, "e")) ); }, @@ -14824,12 +14822,14 @@ const skills = { trigger.target.chooseToDiscard("he", true, 2); "step 1"; if (result.bool && result.cards && result.cards.length) { - if (result.cards.length == 1) { + const cards = result.cards.filterInD("d"); + if (cards.length == 1) { event._result = { bool: true, links: result.cards.slice(0) }; - } else - player.chooseButton(["选择获得其中的一张牌", result.cards.slice(0)], true).ai = function (button) { + } else if (cards.length > 1) { + player.chooseButton(["选择获得其中的一张牌", result.cards.slice(0)], true).set("ai", function (button) { return get.value(button.link); - }; + }); + } else event.finish(); } else event.finish(); "step 2"; if (result.links) player.gain(result.links, "gain2"); diff --git a/character/refresh/skill.js b/character/refresh/skill.js index cb2901f96..e48412b8e 100644 --- a/character/refresh/skill.js +++ b/character/refresh/skill.js @@ -11913,7 +11913,7 @@ const skills = { player.loseHp(); } "step 1"; - target.addTempSkill("reqiangxi_off"); + target.addTempSkill("reqiangxi_off", "phaseUseAfter"); target.damage("nocard"); }, check: function (card) { @@ -14207,7 +14207,7 @@ const skills = { .set("ai", () => { const player = get.event("player"), trigger = get.event().getTrigger(); - const cards = trigger.cards.filterInD(); + const cards = trigger.cards ? trigger.cards.filterInD() : []; if (get.event().controls.includes("拿牌")) { if ( cards.reduce((sum, card) => { diff --git a/character/shenhua/skill.js b/character/shenhua/skill.js index b0f259bf7..3700c8759 100644 --- a/character/shenhua/skill.js +++ b/character/shenhua/skill.js @@ -2419,6 +2419,9 @@ const skills = { if (cards.length) player.loseToDiscardpile(cards); }, group: ["nzry_mingren_1", "nzry_mingren_2"], + ai:{ + combo: "nzry_zhenliang", + }, subSkill: { 1: { audio: 2, diff --git a/character/sp/skill.js b/character/sp/skill.js index 3915d7fba..c3fec72f5 100644 --- a/character/sp/skill.js +++ b/character/sp/skill.js @@ -171,6 +171,9 @@ const skills = { result: { bool, moved }, } = await player .chooseToMove("易城:请选择你要交换的牌") + .set("filterMove", (from, to) => { + return typeof to !== "number"; + }) .set("list", [ [ "牌堆顶", @@ -2825,7 +2828,7 @@ const skills = { }, checkx: function (event, player) { var target = event.source; - return get.damageEffect(player, target, target) <= 0; + return get.damageEffect(player, target, player) <= 0; }, forced: true, content: function () { @@ -14611,7 +14614,7 @@ const skills = { if (!phsu || phsu.player != player) return false; if ( player.getHistory("gain", function (evt) { - return evt.getParent().name == "chengshang"; + return evt.getParent().name == "chengshang" && phsu === evt.getParent("phaseUse"); }).length ) return false; @@ -17173,9 +17176,6 @@ const skills = { cardUsable: function (card, player) { if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; }, - cardRespondable: function (card, player) { - if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; - }, cardSavable: function (card, player) { if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; }, @@ -19322,7 +19322,6 @@ const skills = { limited: true, skillAnimation: true, animationColor: "orange", - forceunique: true, filter: function (event, player) { return player.storage.fanghun2 > 0; }, @@ -19380,7 +19379,7 @@ const skills = { player.awakenSkill("fuhan"); "step 1"; event.num = Math.min(event.num, 8); - player.reinitCharacter("zhaoxiang", result.links[0]); + player.reinitCharacter(get.character(player.name2, 3).includes("fuhan") ? player.name2 : player.name1, result.links[0]); "step 2"; var num = event.num - player.maxHp; if (num > 0) player.gainMaxHp(num); @@ -19398,7 +19397,6 @@ const skills = { limited: true, skillAnimation: true, animationColor: "orange", - forceunique: true, filter: function (event, player) { return player.countMark("fanghun") > 0; }, @@ -22185,6 +22183,7 @@ const skills = { player.awakenSkill("zhiri"); player.loseMaxHp(); player.storage.zhiri = true; + player.addSkills("xintan"); }, ai: { combo: "fentian", @@ -24480,7 +24479,6 @@ const skills = { audio: 2, unique: true, juexingji: true, - forceunique: true, derivation: "xiaoji", trigger: { player: "phaseZhunbeiBegin" }, filter: function (event, player) { diff --git a/character/sp2/skill.js b/character/sp2/skill.js index fd632a408..35d07fde3 100644 --- a/character/sp2/skill.js +++ b/character/sp2/skill.js @@ -3338,6 +3338,9 @@ const skills = { if (event.num > 0) event.redo(); } }, + ai: { + halfneg: true + }, }, xiongrao: { audio: 2, diff --git a/character/sp2/translate.js b/character/sp2/translate.js index 338ab387f..980525913 100644 --- a/character/sp2/translate.js +++ b/character/sp2/translate.js @@ -110,7 +110,7 @@ const translates = { xpchijie_info: "每回合每项各限一次。1.当其他角色使用的牌对你结算结束后,你可以令此牌对所有后续目标无效。2.其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。", xpchijie2: "持节", yinju: "引裾", - yinju_info: "限定技,出牌阶段,你可以选择一名其他角色。若如此做,当你于此阶段内使用牌指定其为目标后,你与其各摸一张牌;当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。", + yinju_info: "限定技,出牌阶段,你可以选择一名其他角色。若如此做,直到回合结束:1.当你使用牌指定其为目标后,你与其各摸一张牌;2.当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。", yinju2: "引裾", spjiedao: "截刀", diff --git a/character/tw/skill.js b/character/tw/skill.js index 3c1d14aac..886a68faf 100644 --- a/character/tw/skill.js +++ b/character/tw/skill.js @@ -6257,7 +6257,7 @@ const skills = { var history = current.getHistory("useCard"); if (!history.length) return false; for (var evt of history) { - if (evt.card && evt.card.name == "shunshou") { + if (evt.card && evt.card.name == "shunshou" && evt.getParent("phaseUse") === event.getParent("phaseUse")) { targets.addArray(evt.targets); } } @@ -8260,6 +8260,9 @@ const skills = { }, }, }, + ai:{ + combo: "twzhenliang", + }, }, twzhenliang: { group: ["twzhenliang_1", "twzhenliang_2"], @@ -14734,12 +14737,12 @@ const skills = { order: 2.9, result: { target: function (player, target) { + if (get.attitude(player, target) >= 0) return -20; var cards = ui.selected.cards.slice(0); var names = []; for (var i of cards) names.add(i.name); if (names.length < player.hp) return 0; if (player.hasUnknown() && (player.identity != "fan" || !target.isZhu)) return 0; - if (get.attitude(player, target) >= 0) return -20; return lib.card.sha.ai.result.target.apply(this, arguments); }, }, @@ -15585,7 +15588,6 @@ const skills = { limited: true, skillAnimation: true, animationColor: "orange", - forceunique: true, filter: function (event, player) { return player.countMark("fanghun") > 0; }, diff --git a/character/xianding/skill.js b/character/xianding/skill.js index eda58f1f6..f9679030e 100644 --- a/character/xianding/skill.js +++ b/character/xianding/skill.js @@ -5075,6 +5075,7 @@ const skills = { }, }, dcxunbie: { + unique: true, audio: 2, trigger: { player: "dying", @@ -5090,7 +5091,9 @@ const skills = { characters.remove("dc_mifuren"); } }); - return characters.length; + return characters.length && [player.name1, player.name2].some(name => { + return get.character(name, 3).includes("dcxunbie"); + }); }, check: () => true, skillAnimation: true, @@ -5100,30 +5103,30 @@ const skills = { content: function () { "step 0"; player.awakenSkill("dcxunbie"); - if (player.name1 == "ganfurenmifuren" || player.name2 == "ganfurenmifuren") { - var characters = ["dc_ganfuren", "dc_mifuren"]; - game.countPlayer(current => { - if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") { - characters.remove("dc_ganfuren"); - } - if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") { - characters.remove("dc_mifuren"); - } - }); - if (characters.length == 1) event._result = { control: characters[0] }; - else { - player - .chooseControl(characters) - .set("dialog", ["选择要替换成的武将", [characters, "character"]]) - .set("ai", () => [0, 1].randomGet()); + var characters = ["dc_ganfuren", "dc_mifuren"]; + game.countPlayer(current => { + if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") { + characters.remove("dc_ganfuren"); } - } else event.goto(2); + if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") { + characters.remove("dc_mifuren"); + } + }); + if (characters.length == 1) event._result = { control: characters[0] }; + else { + player + .chooseControl(characters) + .set("dialog", ["选择要替换成的武将", [characters, "character"]]) + .set("ai", () => [0, 1].randomGet()); + } "step 1"; var character = result.control; if (!_status.characterlist) { lib.skill.pingjian.initList(); } - player.reinitCharacter("ganfurenmifuren", character); + player.reinitCharacter((get.character(player.name2, 3).includes("dcxunbie") ? + player.name2 : player.name1 + ), character); "step 2"; player.recover(1 - player.hp); player.addTempSkill("dcxunbie_muteki", { player: "phaseAfter" }); diff --git a/character/xianjian.js b/character/xianjian.js index 0df2f9431..f039adbb7 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -308,9 +308,9 @@ game.import("character", function () { }, content: function () { player.storage.yuexing2 = target; - player.addTempSkill("yuexing2"); + player.addTempSkill("yuexing2", "phaseUseAfter"); target.storage.yuexing2 = player; - target.addTempSkill("yuexing2"); + target.addTempSkill("yuexing2", "phaseUseAfter"); }, ai: { order: function () { @@ -2811,7 +2811,7 @@ game.import("character", function () { unique: true, forceunique: true, filter: function () { - return Math.random() < 0.5; + return Math.random() < 0.5 && [player.name1, player.name2].includes("pal_longkui"); }, derivation: ["diesha", "guijiang"], content: function () { diff --git a/character/xinghuoliaoyuan/skill.js b/character/xinghuoliaoyuan/skill.js index 80021689b..854741d6f 100644 --- a/character/xinghuoliaoyuan/skill.js +++ b/character/xinghuoliaoyuan/skill.js @@ -1238,7 +1238,10 @@ const skills = { aiOrder: function (player, card, num) { if (typeof card.number != "number") return; var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); + return ( + evt.isPhaseUsing() && + evt.getParent("phaseUse") === _status.event.getParent("phaseUse") + ); }); if (history.length == 0) return num + 10 * (14 - card.number); var num = get.number(history[0].card); @@ -1253,7 +1256,10 @@ const skills = { }, filter: function (event, player) { var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); + return ( + evt.isPhaseUsing() && + evt.getParent("phaseUse") === event.getParent("phaseUse") + ); }); if (history.length < 2) return false; var num = get.number(history[0].card); @@ -1291,7 +1297,10 @@ const skills = { aiOrder: function (player, card, num) { if (typeof card.number != "number") return; var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); + return ( + evt.isPhaseUsing() && + evt.getParent("phaseUse") === _status.event.getParent("phaseUse") + ); }); if (history.length == 0) return num + 10 * card.number; var num = get.number(history[0].card); @@ -1306,7 +1315,10 @@ const skills = { }, filter: function (event, player) { var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); + return ( + evt.isPhaseUsing() && + evt.getParent("phaseUse") === event.getParent("phaseUse") + ); }); if (history.length < 2) return false; var num = get.number(history[0].card); diff --git a/character/yijiang/skill.js b/character/yijiang/skill.js index 5ddfcc4e3..8a5d9b10a 100644 --- a/character/yijiang/skill.js +++ b/character/yijiang/skill.js @@ -11661,7 +11661,7 @@ const skills = { threaten: 0.8, effect: { target: function (card, player, target) { - if (get.tag(card, "damage")) { + if (get.tag(card, "damage") && (player.hasSkill("paiyi") || player.hasSkill("zili"))) { if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; if (!target.hasFriend()) return; if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; @@ -14447,7 +14447,8 @@ const skills = { aiOrder: function (player, card, num) { if (typeof card == "object" && player.isPhaseUsing()) { var evt = player.getLastUsed(); - if (evt && evt.card && ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card)))) { + if (!evt || !evt.card || evt.getParent("phaseUse") !== _status.event.getParent("phaseUse")) return num; + if ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card))) { return num + 10; } } @@ -14460,7 +14461,7 @@ const skills = { if (!evt || !evt.card) return false; if (!player.isPhaseUsing()) return false; var evt2 = evt.getParent("phaseUse"); - if (!evt2 || evt2.name != "phaseUse" || evt2.player != player) return false; + if (!evt2 || evt2.name != "phaseUse" || evt2 !== event.getParent("phaseUse")) return false; return (get.suit(evt.card) != "none" && get.suit(evt.card) == get.suit(event.card)) || (typeof get.number(evt.card, false) == "number" && get.number(evt.card, false) == get.number(event.card)); }, content: function () { diff --git a/character/yingbian/skill.js b/character/yingbian/skill.js index c584c0568..67c1b4f83 100644 --- a/character/yingbian/skill.js +++ b/character/yingbian/skill.js @@ -946,12 +946,15 @@ const skills = { }, }, gaoling: { + unique: true, audio: 2, trigger: { player: "showCharacterAfter" }, hiddenSkill: true, filter: function (event, player) { return ( - event.toShow.includes("xuangongzhu") && + event.toShow.some(name => { + return get.character(name, 3).includes("gaoling"); + }) && player != _status.currentPhase && game.hasPlayer(function (current) { return current.isDamaged(); diff --git a/character/yxs.js b/character/yxs.js index f08f705b5..65860cbd9 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -816,7 +816,11 @@ game.import("character", function () { forceunique: true, enable: "phaseUse", filter: function (event, player) { - return !player.hasSkill("tongyu_guiyin") && !player.getStat("damage"); + return ( + !player.hasSkill("tongyu_guiyin") && + !player.getStat("damage") && + [player.name1, player.name2].includes("yxs_luobinhan") + ); }, derivation: ["lzhangyi", "jimin", "tongyu"], content: function () { @@ -848,7 +852,11 @@ game.import("character", function () { forceunique: true, enable: "phaseUse", filter: function (event, player) { - return player.countCards("he") > 0 && !player.hasSkill("tongyu_guiyin"); + return ( + player.countCards("he") > 0 && + !player.hasSkill("tongyu_guiyin") && + [player.name1, player.name2].includes("yxs_luobinhan") + ); }, filterCard: true, position: "he", diff --git a/mode/guozhan.js b/mode/guozhan.js index d71dd0b2a..fa5b8866a 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -1158,50 +1158,56 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { const targets = list .slice() .filter((i) => (event.num1 - event.num2) * get.sgn(0.5 - list.indexOf(i)) <= 0); - return targets.some((i) => i.countGainableCards(list[1 - list.indexOf(i)], "e")); + return targets.some((i) => { + const target = list[1 - list.indexOf(i)]; + return target.hasCard((card) => { + return lib.filter.canBeGained(card, i, target); + }, "e"); + }); }, async cost(event, trigger, player) { let users = []; - const list = [event.player, event.target]; + const list = [trigger.player, trigger.target]; let targets = list .slice() - .filter((i) => (event.num1 - event.num2) * get.sgn(0.5 - list.indexOf(i)) <= 0); - targets = targets - .filter((i) => i.countGainableCards(list[1 - list.indexOf(i)], "e")) - .sortBySeat(player); + .filter((i) => (trigger.num1 - trigger.num2) * get.sgn(0.5 - list.indexOf(i)) <= 0); + targets = targets.filter((i) => { + const target = list[1 - list.indexOf(i)]; + return target.hasCard((card) => { + return lib.filter.canBeGained(card, i, target); + }, "e"); + }).sortBySeat(player); for (const i of targets) { const aim = list[1 - list.indexOf(i)]; const { result: { bool }, - } = await i - .chooseBool( + } = await i.chooseBool( get.prompt("fakehanzhan"), "获得" + get.translation(aim) + "装备区的一张牌" - ) - .set( - "choice", - target.hasCard((card) => { - return get.value(card, aim) * get.attitude(i, aim) < 0; - }, "e") - ); + ).set("choice", aim.hasCard((card) => { + return get.value(card, aim) * get.attitude(i, aim) < 0; + }, "e")); if (bool) users.push(i); } event.result = { bool: Boolean(users.length), targets: users }; }, + logLine: false, async content(event, trigger, player) { const list = [trigger.player, trigger.target]; let targets = list .slice() .filter((i) => (trigger.num1 - trigger.num2) * get.sgn(0.5 - list.indexOf(i)) <= 0); targets = targets - .filter( - (i) => - i.countGainableCards(list[1 - list.indexOf(i)], "e") && - event.targets.includes(i) - ) + .filter((i) => { + const target = list[1 - list.indexOf(i)]; + return target.hasCard((card) => { + return lib.filter.canBeGained(card, i, target); + }, "e"); + }) .sortBySeat(player); for (const i of targets) { const aim = list[1 - list.indexOf(i)]; + i.line(aim, "green"); await i.gainPlayerCard(aim, "e", true); } }, @@ -2501,14 +2507,37 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, fakexibing: { audio: "xibing", - inherit: "xibing", + filter: function (event, player) { + if (player == event.player || event.targets.length != 1 || event.player.countCards("h") >= event.player.hp) return false; + var bool = function (card) { + return (card.name == "sha" || get.type(card, false) == "trick") && get.color(card, false) == "black"; + }; + if (!bool(event.card)) return false; + var evt = event.getParent("phaseUse"); + if (evt.player != event.player) return false; + return event.player.getHistory("useCard", function (evtx) { + return bool(evtx.card) && evtx.getParent("phaseUse") == evt; + })[0] == event.getParent(); + }, + logTarget: "player", + check: function (event, player) { + var target = event.player; + var att = get.attitude(player, target); + var num2 = Math.min(5, target.hp) - target.countCards("h"); + if (num2 <= 0) return att <= 0; + var num = target.countCards("h", function (card) { + return target.hasValueTarget(card, null, true); + }); + if (!num) return att > 0; + return (num - num2) * att < 0; + }, + preHidden: true, content() { "step 0"; var num = trigger.player.hp - trigger.player.countCards("h"); if (num > 0) trigger.player.draw(num); "step 1"; - trigger.player.addTempSkill("xibing2"); - player._xibing = true; + trigger.player.addTempSkill("fakexibing_banned"); if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2)) event.finish(); "step 2"; @@ -2537,10 +2566,22 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { var target = trigger.player; player.hideCharacter(player.name1 == result.links[0] ? 0 : 1); target.hideCharacter(target.name1 == result.links[1] ? 0 : 1); - player.addTempSkill("xibing3"); - target.addTempSkill("xibing3"); + player.addTempSkill("fakexibing_nomingzhi"); + target.addTempSkill("fakexibing_nomingzhi"); } }, + subSkill: { + banned: { + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + }, + nomingzhi: { + ai: { nomingzhi: true }, + }, + }, }, fakechengshang: { audio: "chengshang", @@ -2595,14 +2636,14 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { const storage = player.getStorage("fakechengshang_effect"); const list = lib.card.list .filter((list) => { - const type = get.type(card[2]); + const type = get.type(list[2]); if (type != "basic" && type != "trick") return false; return storage.some( (card) => card[0] == list[0] && card[1] == list[1] && card[2] != list[2] ); }) - .map((card) => [get.translation(type), "", card[2], card[3]]); + .map((card) => [get.translation(get.type2(card[2])), "", card[2], card[3]]); return ui.create.dialog("承赏", [list, "vcard"]); }, filter(button, player) { @@ -2674,8 +2715,15 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, }, fakezhiwei: { + unique: true, audio: "zhiwei", inherit: "zhiwei", + filter: function (event, player, name) { + if (!game.hasPlayer(current => current != player)) return false; + return event.name == "showCharacter" && event.toShow.some(name => { + return get.character(name, 3).includes("fakezhiwei"); + }); + }, content() { "step 0"; player @@ -3724,21 +3772,19 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { audio: "mobiledanshou", trigger: { global: "phaseZhunbeiBegin" }, filter(event, player) { - return ["h", "e", "j"].some((pos) => - player.getCards(pos).every((card) => lib.filter.cardDiscardable(card, player)) - ); + return ["h", "e", "j"].some((pos) =>{ + const cards = player.getCards(pos); + return cards.length > 0 && cards.every((card) => lib.filter.cardDiscardable(card, player)); + }); }, async cost(event, trigger, player) { let list = [], map = { h: "手牌区", e: "装备区", j: "判定区" }; list.addArray( - ["h", "e", "j"] - .filter((pos) => { - return player - .getCards(pos) - .every((card) => lib.filter.cardDiscardable(card, player)); - }) - .map((i) => map[i]) + ["h", "e", "j"].filter((pos) => { + const cards = player.getCards(pos); + return cards.length > 0 && cards.every((card) => lib.filter.cardDiscardable(card, player)); + }).map((i) => map[i]) ); list.push("cancel2"); const { @@ -3787,7 +3833,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { result: { control }, } = await player .chooseControl("摸牌", "增加摸牌数") - .set("prompt", "胆守:请选择一项") + .set("prompt", `胆守:请选择一项(当前为${get.translation(trigger.name)})`) .set("ai", () => { const player = get.event().player, trigger = get.event().getTrigger(); @@ -4914,6 +4960,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, }, fakebaoqie: { + unique: true, audio: "baoqie", trigger: { player: "showCharacterEnd" }, filter(event, player) { @@ -5087,6 +5134,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, }, fakehuirong: { + unique: true, audio: "huirong", trigger: { player: "showCharacterEnd" }, filter(event, player) { @@ -5258,6 +5306,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, }, fakeshiren: { + unique: true, audio: "shiren", trigger: { player: "showCharacterEnd" }, filter(event, player) { @@ -6410,7 +6459,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }) ) return false; - return event.toShow.some((name) => lib.character[name][3].includes("gzjinyu")); + return event.toShow.some((name) => get.character(name, 3).includes("gzjinyu")); }, logTarget: function (event, player) { return game @@ -6439,8 +6488,8 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { .set("prompt", "近谀:请暗置一张武将牌") .set("ai", function () { var target = _status.event.player; - if (target.name == "gz_pengyang") return "主将"; - if (target.name2 == "gz_pengyang") return "副将"; + if (get.character(target.name, 3).includes("gzjinyu")) return "主将"; + if (get.character(target.name2, 3).includes("gzjinyu")) return "副将"; if ( lib.character[target.name][3].some((skill) => { var info = get.info(skill); @@ -7526,11 +7575,14 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, //黄权 gzdianhu: { + unique: true, audio: "xinfu_dianhu", trigger: { player: "showCharacterAfter" }, forced: true, filter: function (event, player) { - return event.toShow.includes("gz_xf_huangquan") && !player.storage.gzdianhu_effect; + return event.toShow.some(name => { + return get.character(name, 3).includes("gzdianhu"); + }) && !player.storage.gzdianhu_effect; }, content: function () { "step 0"; @@ -8647,7 +8699,9 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { audio: "xuanbei", trigger: { player: "showCharacterAfter" }, filter: function (event, player) { - return !player.storage.gzxuanbei && event.toShow.includes("gz_yangyan"); + return !player.storage.gzxuanbei && event.toShow.some(name => { + return get.character(name, 3).includes("gzxuanbei"); + }); }, forced: true, locked: false, @@ -9567,7 +9621,9 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { trigger: { player: "showCharacterAfter" }, forced: true, filter: function (event, player) { - return event.toShow.includes("gz_liaohua") && !player.storage.gzdangxian_draw; + return event.toShow.some(name => { + return get.character(name, 3).includes("gzdangxian"); + }) && !player.storage.gzdangxian_draw; }, content: function () { player.storage.gzdangxian_draw = true; @@ -13040,7 +13096,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, content: function () { trigger.cancel(); - player.removeCharacter(player.name1 == "gz_yanbaihu" ? 0 : 1); + player.removeCharacter(get.character(player.name1, 3).includes("gzyjili") ? 0 : 1); }, }, }, @@ -14723,7 +14779,9 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, forced: true, filter: function (event, player) { - return event.toShow.includes("gz_zuoci") && !player.storage.yigui_init; + return event.toShow.some(name => { + return get.character(name, 3).includes("yigui"); + }) && !player.storage.yigui_init; }, content: function () { player.storage.yigui_init = true; @@ -16349,8 +16407,9 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { if (event.filterName(event.current.name2)) list.push("副将"); if (list.length > 1) event.current.chooseControl(["主将", "副将"]).set("ai", function () { - if (player.name1 == "gz_fazheng") return 0; - if (player.name2 == "gz_fazheng") return 1; + let player = _status.event.player; + if (get.character(player.name1, 3).includes("gzxuanhuo")) return 0; + if (get.character(player.name2, 3).includes("gzxuanhuo")) return 1; return Math.random() > 0.5 ? 0 : 1; }).prompt = "选择并展示一张武将牌,然后执行军令"; else event._result = { index: list[0] == "主将" ? 0 : 1 }; @@ -17010,9 +17069,9 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { break; } } - if (event.target.name == "gz_zhoutai") { + if (get.character(event.target.name, 3).includes("buqu")) { choice = "主将"; - } else if (event.target.name2 == "gz_zhoutai") { + } else if (get.character(event.target.name2, 3).includes("buqu")) { choice = "副将"; } player @@ -20606,12 +20665,15 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { }, }, gzguixiu: { + unique: true, audio: "guixiu", trigger: { player: ["showCharacterAfter", "removeCharacterBefore"] }, filter: function (event, player) { if (event.name == "removeCharacter" || event.name == "changeVice") - return event.toRemove == "gz_mifuren" && player.isDamaged(); - return event.toShow.includes("gz_mifuren"); + return get.character(event.toRemove, 3).includes("gzguixiu") && player.isDamaged(); + return event.toShow.some(name => { + return get.character(name, 3).includes("gzguixiu"); + }); }, content: function () { if (trigger.name == "showCharacter") { @@ -23773,7 +23835,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) { "副将技。①此武将牌计算体力上限时减少半个阴阳鱼。②结束阶段,你可以弃置一张非基本牌并选择一名友方角色,令其选择摸两张牌或回复1点体力,然后其可以变更副将。", fakexibing: "息兵", fakexibing_info: - "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至体力值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", + "手牌数小于体力值的其他角色于其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至体力值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", fakechengshang: "承赏", fakechengshang_info: "出牌阶段限一次,当你使用存在花色和点数且指定了其他势力角色为目标的牌结算完毕后,若你未因此牌造成过伤害,则你可以摸一张牌,然后本阶段你可以将一张手牌当作初始游戏牌堆中与此牌花色和点数相同的另一张基本牌或普通锦囊牌使用一次。", diff --git a/noname.js b/noname.js index ab93299fa..0e58fdd9b 100644 --- a/noname.js +++ b/noname.js @@ -1,4 +1,4 @@ -export const rootURL = new URL(import.meta.url); +export const rootURL = new URL("../", import.meta.url); export { GNC, gnc, setGNC } from "./noname/gnc/index.js"; export { AI, ai, setAI } from "./noname/ai/index.js"; diff --git a/noname/get/index.js b/noname/get/index.js index 7706e0653..1cd4539c4 100644 --- a/noname/get/index.js +++ b/noname/get/index.js @@ -6,6 +6,7 @@ import { ui } from "../ui/index.js"; import { CacheContext } from "../library/cache/cacheContext.js"; import { Is } from "./is.js"; import { Promises } from "./promises.js"; +import { rootURL } from "../../noname.js"; export class Get { is = new Is(); @@ -36,8 +37,8 @@ export class Get { * @param { Array|Object|import("../library/element/character").Character } data * @returns {import("../library/element/character").Character} */ - convertedCharacter(data){ - if(!(data instanceof lib.element.Character)) return new lib.element.Character(data); + convertedCharacter(data) { + if (!(data instanceof lib.element.Character)) return new lib.element.Character(data); return data; } /** @@ -116,14 +117,7 @@ export class Get { objectURL(octetStream) { const objectURLMap = lib.objectURL; if (objectURLMap.has(octetStream)) return objectURLMap.get(octetStream); - const objectURL = URL.createObjectURL( - new Blob([ - Uint8Array.from( - atob(octetStream.replace(/^data:[\s\S]*\/[\s\S]*;base64,/, "")), - (character) => character.charCodeAt() - ), - ]) - ); + const objectURL = URL.createObjectURL(new Blob([Uint8Array.from(atob(octetStream.replace(/^data:[\s\S]*\/[\s\S]*;base64,/, "")), character => character.charCodeAt())])); objectURLMap.set(octetStream, objectURL); return objectURL; } @@ -149,15 +143,11 @@ export class Get { } complexYingbianConditions(card) { const complexYingbianConditions = Array.from(lib.yingbian.condition.complex.keys()); - return card - ? complexYingbianConditions.filter((value) => get.cardtag(card, `yingbian_${value}`)) - : complexYingbianConditions; + return card ? complexYingbianConditions.filter(value => get.cardtag(card, `yingbian_${value}`)) : complexYingbianConditions; } simpleYingbianConditions(card) { const simpleYingbianConditions = Array.from(lib.yingbian.condition.simple.keys()); - return card - ? simpleYingbianConditions.filter((value) => get.cardtag(card, `yingbian_${value}`)) - : simpleYingbianConditions; + return card ? simpleYingbianConditions.filter(value => get.cardtag(card, `yingbian_${value}`)) : simpleYingbianConditions; } /** * Get the Yingbian effects (of the card) @@ -166,9 +156,7 @@ export class Get { */ yingbianEffects(card) { const yingbianEffects = Array.from(lib.yingbian.effect.keys()); - return card - ? yingbianEffects.filter((value) => get.cardtag(card, `yingbian_${value}`)) - : yingbianEffects; + return card ? yingbianEffects.filter(value => get.cardtag(card, `yingbian_${value}`)) : yingbianEffects; } /** * Get the default Yingbian effect of the card @@ -234,8 +222,7 @@ export class Get { const pinyins = lib.pinyins; if (pinyins) { const pinyin = pinyins[chinese]; - if (Array.isArray(pinyin)) - return withTone === false ? pinyin.map(pinyinUtilx.removeTone) : pinyin.slice(); + if (Array.isArray(pinyin)) return withTone === false ? pinyin.map(pinyinUtilx.removeTone) : pinyin.slice(); } return pinyinUtilx.getPinyin(chinese, null, withTone, true); } @@ -249,8 +236,7 @@ export class Get { for (let i of lib.pinyins._metadata.shengmu) { if (str.startsWith(i)) { str = str.slice(i.length); - if (str[0] == "u" && lib.pinyins._metadata.special_shengmu.includes(i)) - str = "ü" + str.slice(1); + if (str[0] == "u" && lib.pinyins._metadata.special_shengmu.includes(i)) str = "ü" + str.slice(1); break; } } @@ -301,8 +287,7 @@ export class Get { for (let i of lib.pinyins._metadata.shengmu) { if (str.startsWith(i)) { str = str.slice(i.length); - if (str[0] == "u" && lib.pinyins._metadata.special_shengmu.includes(i)) - str = "ü" + str.slice(1); + if (str[0] == "u" && lib.pinyins._metadata.special_shengmu.includes(i)) str = "ü" + str.slice(1); break; } } @@ -342,18 +327,16 @@ export class Get { return list; } numOf(obj, item) { - return obj.filter((element) => element == item).length; + return obj.filter(element => element == item).length; } connectNickname() { - return typeof lib.config.connect_nickname == "string" - ? lib.config.connect_nickname.slice(0, 12) - : "无名玩家"; + return typeof lib.config.connect_nickname == "string" ? lib.config.connect_nickname.slice(0, 12) : "无名玩家"; } zhinangs(filter) { var list = (_status.connectMode ? lib.configOL : lib.config).zhinang_tricks; if (!list || !list.filter || !list.length) return get.inpile("trick", "trick").randomGets(3); if (filter === false) return list.slice(0); - list = list.filter((card) => lib.inpile.includes(card)); + list = list.filter(card => lib.inpile.includes(card)); if (list.length) return list; return get.inpile("trick", "trick").randomGets(3); } @@ -450,7 +433,7 @@ export class Get { return list; } discarded() { - return _status.discarded.filter((item) => item.parentNode == ui.discardPile); + return _status.discarded.filter(item => item.parentNode == ui.discardPile); } cardOffset() { var x = ui.arena.getBoundingClientRect(); @@ -612,7 +595,7 @@ export class Get { character(name, num) { let info = lib.character[name]; if (!info) { - const pack = Object.keys(lib.characterPack).find((pack) => name in lib.characterPack[pack]); + const pack = Object.keys(lib.characterPack).find(pack => name in lib.characterPack[pack]); if (pack) info = lib.characterPack[pack][name]; } if (typeof num === "number") { @@ -645,8 +628,8 @@ export class Get { return "暂无武将介绍"; } bordergroup(info, raw) { - if(typeof info == 'string') info = get.character(info); - if(info.groupBorder) return info.groupBorder; + if (typeof info == "string") info = get.character(info); + if (info.groupBorder) return info.groupBorder; return raw ? "" : info.group || ""; } groupnature(group, method) { @@ -839,16 +822,14 @@ export class Get { } }; if (/[^a-zA-Z]/.test(i)) { - insertDefaultString = - indent + ' "' + i + '":' + get.stringify(obj[i], level + 1) + ",\n"; + insertDefaultString = indent + ' "' + i + '":' + get.stringify(obj[i], level + 1) + ",\n"; if (typeof obj[i] !== "function") { str += insertDefaultString; } else { str += parseFunction(i); } } else { - insertDefaultString = - indent + " " + i + ":" + get.stringify(obj[i], level + 1) + ",\n"; + insertDefaultString = indent + " " + i + ":" + get.stringify(obj[i], level + 1) + ",\n"; if (typeof obj[i] !== "function") { str += insertDefaultString; } else { @@ -906,7 +887,7 @@ export class Get { copy(obj, copyKeyDeep = false, map = new WeakMap()) { // 参考[这里](https://juejin.cn/post/7315612852890026021)实现深拷贝 // 不再判断是否能structuredClone是因为structuredClone会把Symbol给毙了 - const getType = (obj) => Object.prototype.toString.call(obj); + const getType = obj => Object.prototype.toString.call(obj); const canTranverse = { "[object Map]": true, @@ -917,12 +898,7 @@ 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); @@ -933,17 +909,13 @@ export class Get { // (实际上需要处理的只有Map和Set) // 除此之外的就只能祝愿有拷贝构造函数了 const target = constructor - ? 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()) - ? // @ts-ignore - new constructor(obj) - : obj + : constructor.name in window && /\[native code\]/.test(constructor.toString()) + ? // @ts-ignore + new constructor(obj) + : obj : Object.create(null); if (target === obj) return target; @@ -951,13 +923,10 @@ export class Get { if (obj instanceof Map) { obj.forEach((value, key) => { - target.set( - copyKeyDeep ? get.copy(key, copyKeyDeep, map) : key, - get.copy(value, copyKeyDeep, map) - ); + target.set(copyKeyDeep ? get.copy(key, copyKeyDeep, map) : key, get.copy(value, copyKeyDeep, map)); }); } else if (obj instanceof Set) { - obj.forEach((value) => { + obj.forEach(value => { target.add(get.copy(value, copyKeyDeep, map)); }); } @@ -969,11 +938,7 @@ 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; @@ -986,7 +951,7 @@ export class Get { } const symbols = Object.getOwnPropertySymbols(obj); - symbols.forEach((symbol) => { + symbols.forEach(symbol => { target[symbol] = get.copy(obj[symbol], copyKeyDeep, map); }); @@ -1045,11 +1010,7 @@ export class Get { if (typeof filter == "function" && !filter(i)) continue; if (lib.config.bannedcards.includes(i)) continue; if (!lib.translate[i + "_info"]) continue; - if ( - (type.startsWith("equip") && type.length == 6) || - (type.startsWith("hslingjian") && type.length == 11) || - type.startsWith("spell_") - ) { + if ((type.startsWith("equip") && type.length == 6) || (type.startsWith("hslingjian") && type.length == 11) || type.startsWith("spell_")) { if (get.subtype(i) == type) list.push(i); } else { if (get.type(i) == type) list.push(i); @@ -1132,16 +1093,9 @@ export class Get { case "zhong": return (config.double_character ? "双将" : "") + "忠胆英杰"; case "stratagem": - return ( - get.cnNumber(parseInt(config.number)) + - "人" + - (config.double_character ? "双将" : "") + - "谋攻" - ); + return get.cnNumber(parseInt(config.number)) + "人" + (config.double_character ? "双将" : "") + "谋攻"; default: - return `${get.cnNumber(parseInt(config.number))}人${config.double_nei ? "双内" : ""}${ - config.enable_commoner ? "带民" : "" - }${config.double_character ? "双将" : ""}身份`; + return `${get.cnNumber(parseInt(config.number))}人${config.double_nei ? "双内" : ""}${config.enable_commoner ? "带民" : ""}${config.double_character ? "双将" : ""}身份`; } } if (config.mode == "guozhan") { @@ -1188,7 +1142,7 @@ export class Get { return lib[_status.connectMode ? "configOL" : "config"].mode; } idDialog(id) { - return ui.dialogs.find((dialog) => dialog.videoId == id) || null; + return ui.dialogs.find(dialog => dialog.videoId == id) || null; } arenaState() { var state = { @@ -1350,11 +1304,7 @@ export class Get { if (rank.c.includes(name)) return num ? Math.round((1 * (num - 1)) / 8 + 1) : "c"; if (rank.d.includes(name)) return num ? Math.round((0 * (num - 1)) / 8 + 1) : "d"; if (lib.character[name]) { - if ( - lib.character[name].isBoss || - lib.character[name].isBossAllowed || - lib.character[name].isHiddenBoss - ) { + if (lib.character[name].isBoss || lib.character[name].isBossAllowed || lib.character[name].isHiddenBoss) { return num ? Math.round((9 * (num - 1)) / 8 + 1) : "sp"; } } @@ -1401,11 +1351,7 @@ export class Get { if (add) break; } } - if ( - info.trigger && - ((typeof info.trigger.player == "string" && info.trigger.player.startsWith("use")) || - info.trigger.source) - ) { + if (info.trigger && ((typeof info.trigger.player == "string" && info.trigger.player.startsWith("use")) || info.trigger.source)) { num += 0.3; } if (num > 1 && threaten > 1) { @@ -1418,21 +1364,14 @@ export class Get { } if (info.trigger) { if (info.trigger.global) { - var list = Array.isArray(info.trigger.global) - ? info.trigger.global - : [info.trigger.global]; + var list = Array.isArray(info.trigger.global) ? info.trigger.global : [info.trigger.global]; num += Math.min(3, list.length) / 10; for (var i of list) { if (i.startsWith("lose") || i.startsWith("use")) num += 0.3; if (i.startsWith("cardsDiscard")) num += 0.4; } } - if ( - info.trigger.target || - (typeof info.trigger.player == "string" && - (info.trigger.player.startsWith("damage") || info.trigger.player.startsWith("lose"))) - ) - num += 0.1; + if (info.trigger.target || (typeof info.trigger.player == "string" && (info.trigger.player.startsWith("damage") || info.trigger.player.startsWith("lose")))) num += 0.1; } if (info.ai) { if (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend) { @@ -1469,7 +1408,7 @@ export class Get { return info; } infoTargets(infos) { - return Array.from(infos || []).map((info) => game.playerMap[info]); + return Array.from(infos || []).map(info => game.playerMap[info]); } cardInfo(card) { return [card.suit, card.number, card.name, card.nature]; @@ -1488,9 +1427,7 @@ export class Get { return Array.from(infos || []).map(get.infoCard); } cardInfoOL(card) { - return ( - "_noname_card:" + JSON.stringify([card.cardid, card.suit, card.number, card.name, card.nature]) - ); + return "_noname_card:" + JSON.stringify([card.cardid, card.suit, card.number, card.name, card.nature]); } infoCardOL(info) { if (!lib.cardOL) return info; @@ -1579,15 +1516,10 @@ export class Get { const key = entry[0]; if (key == "_trigger") { if (noMore !== false) stringifying[key] = get.eventInfoOL(entry[1], null, false); - } else if ( - !lib.element.GameEvent.prototype[key] && - key != "content" && - get.itemtype(entry[1]) != "event" - ) - stringifying[key] = get.stringifiedResult(entry[1], null, false); + } else if (!lib.element.GameEvent.prototype[key] && key != "content" && get.itemtype(entry[1]) != "event") stringifying[key] = get.stringifiedResult(entry[1], null, false); return stringifying; }, {}) - )}` + )}` : ""; } /** @@ -1596,7 +1528,7 @@ export class Get { infoEventOL(item) { const evt = new lib.element.GameEvent(); try { - Object.entries(JSON.parse(item.slice(14))).forEach((entry) => { + Object.entries(JSON.parse(item.slice(14))).forEach(entry => { const key = entry[0]; if (typeof evt[key] != "function") evt[key] = get.parsedResult(entry[1]); }); @@ -1689,7 +1621,7 @@ export class Get { verticalStr(str, sp) { if (typeof str != "string") return ""; return Array.from(str) - .filter((value) => value != "`") + .filter(value => value != "`") .join(""); } numStr(num, method) { @@ -1726,8 +1658,7 @@ export class Get { const prefix = lib.translate[`${str}_prefix`]; if (prefix && slimName.startsWith(prefix)) { //兼容版特化处理 - if (lib.compatibleEdition) - return `${get.prefixSpan(prefix, str)}${slimName.slice(prefix.length)} `; + if (lib.compatibleEdition) return `${get.prefixSpan(prefix, str)}${slimName.slice(prefix.length)} `; return `${get.prefixSpan(prefix, str)}${slimName.slice(prefix.length)}`; } return slimName; @@ -1844,37 +1775,28 @@ export class Get { } if (bool) return "position"; } - if ( - obj.includes(lib.natureSeparator) && - obj.split(lib.natureSeparator).every((n) => lib.nature.has(n)) - ) - return "natures"; + if (obj.includes(lib.natureSeparator) && obj.split(lib.natureSeparator).every(n => lib.nature.has(n))) return "natures"; if (lib.nature.has(obj)) return "nature"; } if (Array.isArray(obj) && obj.length > 0) { - if (obj.every((p) => p instanceof lib.element.Player)) return "players"; - if (obj.every((p) => p instanceof lib.element.Card)) return "cards"; + if (obj.every(p => p instanceof lib.element.Player)) return "players"; + if (obj.every(p => p instanceof lib.element.Card)) return "cards"; if (obj.length == 2) { if (typeof obj[0] == "number" && typeof obj[1] == "number") { if (obj[0] <= obj[1] || obj[1] <= -1) return "select"; } } if (obj.length == 4) { - if (obj.every((p) => typeof p == "number")) { + if (obj.every(p => typeof p == "number")) { return "divposition"; } } } - if ( - obj instanceof lib.element.Button || - (obj instanceof HTMLDivElement && obj.classList.contains("button")) - ) - return "button"; + if (obj instanceof lib.element.Button || (obj instanceof HTMLDivElement && obj.classList.contains("button"))) return "button"; if (obj instanceof lib.element.Card) return "card"; if (obj instanceof lib.element.Player) return "player"; if (obj instanceof lib.element.Dialog) return "dialog"; - if (obj instanceof lib.element.GameEvent || obj instanceof lib.element.GameEventPromise) - return "event"; + if (obj instanceof lib.element.GameEvent || obj instanceof lib.element.GameEventPromise) return "event"; if (typeof obj !== "object" || obj === null) return; @@ -1906,7 +1828,7 @@ export class Get { name .slice(4) .split("_") - .every((n) => lib.nature.has(n)) + .every(n => lib.nature.has(n)) ) return lib.card["sha"].type; } @@ -1966,13 +1888,7 @@ export class Get { if (player !== false) { const owner = player || get.owner(card); if (owner) { - return game.checkMod( - card, - owner, - game.checkMod(card, card.suit, "suit", owner), - "cardsuit", - owner - ); + return game.checkMod(card, owner, game.checkMod(card, card.suit, "suit", owner), "cardsuit", owner); } } if (card.suit === "unsure" || lib.suits.includes(card.suit)) return card.suit; @@ -2037,8 +1953,7 @@ export class Get { * @returns {string} */ nature(card, player) { - if (typeof card == "string") - return card.split(lib.natureSeparator).sort(lib.sort.nature).join(lib.natureSeparator); + if (typeof card == "string") return card.split(lib.natureSeparator).sort(lib.sort.nature).join(lib.natureSeparator); if (Array.isArray(card)) return card.sort(lib.sort.nature).join(lib.natureSeparator); var nature = card.nature; if (get.itemtype(player) == "player" || (player !== false && get.position(card) == "h")) { @@ -2123,24 +2038,13 @@ export class Get { for (let iwhile = 0; iwhile < totalPopulation; iwhile++) { if (player.nextSeat != to) { player = player.nextSeat; - if ( - player.isAlive() && - !player.isOut() && - !player.hasSkill("undist") && - !player.isMin(true) - ) - n++; + if (player.isAlive() && !player.isOut() && !player.hasSkill("undist") && !player.isMin(true)) n++; } else { break; } } for (let i = 0; i < game.players.length; i++) { - if ( - game.players[i].isOut() || - game.players[i].hasSkill("undist") || - game.players[i].isMin(true) - ) - length--; + if (game.players[i].isOut() || game.players[i].hasSkill("undist") || game.players[i].isMin(true)) length--; } if (method == "absolute") return n; if (from.isDead()) length++; @@ -2266,7 +2170,7 @@ export class Get { else players.sortBySeat(get.itemtype(sort) == "player" ? sort : _status.event.player); } if (dead) players = players.concat(game.dead); - if (!out) players = players.filter((current) => !current.isOut()); + if (!out) players = players.filter(current => !current.isOut()); return players; } position(card, ordering) { @@ -2275,8 +2179,7 @@ export class Get { if (card.destiny.classList.contains("equips")) return "e"; if (card.destiny.classList.contains("judges")) return "j"; if (card.destiny.classList.contains("expansions")) return "x"; - if (card.destiny.classList.contains("handcards")) - return card.classList.contains("glows") ? "s" : "h"; + if (card.destiny.classList.contains("handcards")) return card.classList.contains("glows") ? "s" : "h"; if (card.destiny.id == "cardPile") return "c"; if (card.destiny.id == "discardPile") return "d"; if (card.destiny.id == "special") return "s"; @@ -2287,8 +2190,7 @@ export class Get { if (card.parentNode.classList.contains("equips")) return "e"; if (card.parentNode.classList.contains("judges")) return "j"; if (card.parentNode.classList.contains("expansions")) return "x"; - if (card.parentNode.classList.contains("handcards")) - return card.classList.contains("glows") ? "s" : "h"; + if (card.parentNode.classList.contains("handcards")) return card.classList.contains("glows") ? "s" : "h"; if (card.parentNode.id == "cardPile") return "c"; if (card.parentNode.id == "discardPile") return "d"; if (card.parentNode.id == "special") return "s"; @@ -2460,21 +2362,19 @@ export class Get { if (numStr.length <= 2) { //两位数以下单独处理保证效率 if (numStr.length === 1) return !ordinal && num === 2 ? "两" : chars[num]; - return `${numStr[0] === "1" ? "" : chars[numStr[0]]}十${ - numStr[1] === "0" ? "" : chars[numStr[1]] - }`; + return `${numStr[0] === "1" ? "" : chars[numStr[0]]}十${numStr[1] === "0" ? "" : chars[numStr[1]]}`; } numStr = numStr .replace(/(?=(\d{4})+$)/g, ",") .split(",") .filter(Boolean); - const handleZero = (str) => { + const handleZero = str => { let result = str.replace(/零{2,}/g, "零"); if (result.length > 1) result = result.replace(/零+$/g, ""); return result; }; - const _transform = (str) => { + const _transform = str => { if (str === "2" && !ordinal) return "两"; let result = ""; for (let i = 0; i < str.length; i++) { @@ -2529,10 +2429,7 @@ export class Get { var buttons = _status.event.dialog.buttons; var selectable = []; for (var i = 0; i < buttons.length; i++) { - if ( - buttons[i].classList.contains("selectable") && - buttons[i].classList.contains("selected") == false - ) { + if (buttons[i].classList.contains("selectable") && buttons[i].classList.contains("selected") == false) { selectable.push(buttons[i]); } } @@ -2550,10 +2447,7 @@ export class Get { var cards = _status.event.player.getCards("hes"); var selectable = []; for (var i = 0; i < cards.length; i++) { - if ( - cards[i].classList.contains("selectable") && - cards[i].classList.contains("selected") == false - ) { + if (cards[i].classList.contains("selectable") && cards[i].classList.contains("selected") == false) { selectable.push(cards[i]); } } @@ -2591,8 +2485,7 @@ export class Get { var info = lib.skill[skill]; if (lib.filter.skillDisabled(skill)) continue; if (func && !func(info, skill, i)) continue; - if (player && player.hasSkill && info.ai && info.ai.combo && !player.hasSkill(info.ai.combo)) - continue; + if (player && player.hasSkill && info.ai && info.ai.combo && !player.hasSkill(info.ai.combo)) continue; list.add(skill); } } @@ -2643,10 +2536,7 @@ export class Get { var players = game.players.slice(0); if (_status.event.deadTarget) players.addArray(game.dead); for (var i = 0; i < players.length; i++) { - if ( - players[i].classList.contains("selectable") && - players[i].classList.contains("selected") == false - ) { + if (players[i].classList.contains("selectable") && players[i].classList.contains("selected") == false) { selectable.push(players[i]); } } @@ -2740,7 +2630,7 @@ export class Get { return num; } owner(card, method) { - return game.players.concat(game.dead).find((current) => { + return game.players.concat(game.dead).find(current => { if (current.judging[0] == card && method != "judge") return true; let parent = card.parentNode; if (parent == current.node.handcards1 || parent == current.node.handcards2) { @@ -2761,30 +2651,16 @@ export class Get { return ui.selected.buttons.length + ui.selected.cards.length + ui.selected.targets.length == 0; } population(identity) { - return identity == undefined - ? game.players.length + game.dead.length - : game.players.filter((current) => current.identity == identity).length; + return identity == undefined ? game.players.length + game.dead.length : game.players.filter(current => current.identity == identity).length; } totalPopulation(identity) { - return identity == undefined - ? game.players.length + game.dead.length - : game.players.concat(game.dead).filter((current) => current.identity == identity).length; + return identity == undefined ? game.players.length + game.dead.length : game.players.concat(game.dead).filter(current => current.identity == identity).length; } /** * @param { Card | VCard } item */ cardtag(item, tag) { - return ( - (item.cardid && - (get.itemtype(item) == "card" || - !item.cards || - !item.cards.length || - item.name == item.cards[0].name) && - _status.cardtag && - _status.cardtag[tag] && - _status.cardtag[tag].includes(item.cardid)) || - (item.cardtags && item.cardtags.includes(tag)) - ); + return (item.cardid && (get.itemtype(item) == "card" || !item.cards || !item.cards.length || item.name == item.cards[0].name) && _status.cardtag && _status.cardtag[tag] && _status.cardtag[tag].includes(item.cardid)) || (item.cardtags && item.cardtags.includes(tag)); } tag(item, tag, item2, bool) { var result; @@ -2933,16 +2809,7 @@ export class Get { opacity = ""; } var skilltrans = get.translation(skills[i]).slice(0, 2); - str += - '
【' + - skilltrans + - '】
' + - get.skillInfoTranslation(skills[i]) + - '
'; + str += '
【' + skilltrans + '】
' + get.skillInfoTranslation(skills[i]) + '
'; } } return str; @@ -3095,11 +2962,9 @@ export class Get { let capt = get.translation(node.name); const characterInfo = get.character(node.name), sex = node.sex || characterInfo[0]; - if (sex && sex != "unknown" && lib.config.show_sex) - capt += `  ${sex == "none" ? "无" : get.translation(sex)}`; + if (sex && sex != "unknown" && lib.config.show_sex) capt += `  ${sex == "none" ? "无" : get.translation(sex)}`; const group = node.group; - if (group && group != "unknown" && lib.config.show_group) - capt += `  ${get.translation(group)}`; + if (group && group != "unknown" && lib.config.show_group) capt += `  ${get.translation(group)}`; uiintro.add(capt); if (lib.characterTitle[node.name]) { @@ -3107,22 +2972,18 @@ export class Get { } if (get.characterInitFilter(node.name)) { - const initFilters = get.characterInitFilter(node.name).filter((tag) => { + const initFilters = get.characterInitFilter(node.name).filter(tag => { if (!lib.characterInitFilter[node.name]) return true; return lib.characterInitFilter[node.name](tag) !== false; }); if (initFilters.length) { - const str = initFilters - .reduce((strx, stry) => strx + lib.InitFilter[stry] + "
", "") - .slice(0, -4); + const str = initFilters.reduce((strx, stry) => strx + lib.InitFilter[stry] + "
", "").slice(0, -4); uiintro.addText(str); } } if (!node.noclick) { - const allShown = - node.isUnderControl() || - (!game.observe && game.me && game.me.hasSkillTag("viewHandcard", null, node, true)); + const allShown = node.isUnderControl() || (!game.observe && game.me && game.me.hasSkillTag("viewHandcard", null, node, true)); const shownHs = node.getShownCards(); if (shownHs.length) { uiintro.add('
明置的手牌
'); @@ -3150,17 +3011,12 @@ export class Get { skills.addArray(node.hiddenSkills); } for (var i in node.disabledSkills) { - if ( - node.disabledSkills[i].length == 1 && - node.disabledSkills[i][0] == i + "_awake" && - !node.hiddenSkills.includes(i) - ) { + if (node.disabledSkills[i].length == 1 && node.disabledSkills[i][0] == i + "_awake" && !node.hiddenSkills.includes(i)) { skills.add(i); } } for (i = 0; i < skills.length; i++) { - if (lib.skill[skills[i]] && (lib.skill[skills[i]].nopop || lib.skill[skills[i]].equipSkill)) - continue; + if (lib.skill[skills[i]] && (lib.skill[skills[i]].nopop || lib.skill[skills[i]].equipSkill)) continue; if (lib.translate[skills[i] + "_info"]) { if (lib.translate[skills[i] + "_ab"]) translation = lib.translate[skills[i] + "_ab"]; else { @@ -3169,11 +3025,9 @@ export class Get { } if (node.forbiddenSkills[skills[i]]) { - var forbidstr = - '
' + translation + "
"; + var forbidstr = '
' + translation + "
"; if (node.forbiddenSkills[skills[i]].length) { - forbidstr += - "(与" + get.translation(node.forbiddenSkills[skills[i]]) + "冲突)
"; + forbidstr += "(与" + get.translation(node.forbiddenSkills[skills[i]]) + "冲突)
"; } else { forbidstr += "(双将禁用)
"; } @@ -3181,40 +3035,17 @@ export class Get { uiintro.add(forbidstr); } else if (!skills2.includes(skills[i])) { if (lib.skill[skills[i]].preHidden && get.mode() == "guozhan") { - uiintro.add( - '
' + - translation + - '
' + - get.skillInfoTranslation(skills[i], node) + - '
预亮技能
' - ); + uiintro.add('
' + translation + '
' + get.skillInfoTranslation(skills[i], node) + '
预亮技能
'); var underlinenode = uiintro.content.lastChild.querySelector(".underlinenode"); if (_status.prehidden_skills.includes(skills[i])) { underlinenode.classList.remove("on"); } underlinenode.link = skills[i]; underlinenode.listen(ui.click.hiddenskill); - } else - uiintro.add( - '
' + - translation + - "
" + - get.skillInfoTranslation(skills[i], node) + - "
" - ); - } else if ( - lib.skill[skills[i]].temp || - !node.skills.includes(skills[i]) || - lib.skill[skills[i]].thundertext - ) { + } else uiintro.add('
' + translation + "
" + get.skillInfoTranslation(skills[i], node) + "
"); + } else if (lib.skill[skills[i]].temp || !node.skills.includes(skills[i]) || lib.skill[skills[i]].thundertext) { if (lib.skill[skills[i]].frequent || lib.skill[skills[i]].subfrequent) { - uiintro.add( - '
' + - translation + - '
' + - get.skillInfoTranslation(skills[i], node) + - '
自动发动
' - ); + uiintro.add('
' + translation + '
' + get.skillInfoTranslation(skills[i], node) + '
自动发动
'); var underlinenode = uiintro.content.lastChild.querySelector(".underlinenode"); if (lib.skill[skills[i]].frequent) { if (lib.config.autoskilllist.includes(skills[i])) { @@ -3223,11 +3054,7 @@ export class Get { } if (lib.skill[skills[i]].subfrequent) { for (var j = 0; j < lib.skill[skills[i]].subfrequent.length; j++) { - if ( - lib.config.autoskilllist.includes( - skills[i] + "_" + lib.skill[skills[i]].subfrequent[j] - ) - ) { + if (lib.config.autoskilllist.includes(skills[i] + "_" + lib.skill[skills[i]].subfrequent[j])) { underlinenode.classList.remove("on"); } } @@ -3238,22 +3065,10 @@ export class Get { underlinenode.link = skills[i]; underlinenode.listen(ui.click.autoskill2); } else { - uiintro.add( - '
' + - translation + - '
' + - get.skillInfoTranslation(skills[i], node) + - "
" - ); + uiintro.add('
' + translation + '
' + get.skillInfoTranslation(skills[i], node) + "
"); } } else if (lib.skill[skills[i]].frequent || lib.skill[skills[i]].subfrequent) { - uiintro.add( - '
' + - translation + - "
" + - get.skillInfoTranslation(skills[i], node) + - '
自动发动
' - ); + uiintro.add('
' + translation + "
" + get.skillInfoTranslation(skills[i], node) + '
自动发动
'); var underlinenode = uiintro.content.lastChild.querySelector(".underlinenode"); if (lib.skill[skills[i]].frequent) { if (lib.config.autoskilllist.includes(skills[i])) { @@ -3262,11 +3077,7 @@ export class Get { } if (lib.skill[skills[i]].subfrequent) { for (var j = 0; j < lib.skill[skills[i]].subfrequent.length; j++) { - if ( - lib.config.autoskilllist.includes( - skills[i] + "_" + lib.skill[skills[i]].subfrequent[j] - ) - ) { + if (lib.config.autoskilllist.includes(skills[i] + "_" + lib.skill[skills[i]].subfrequent[j])) { underlinenode.classList.remove("on"); } } @@ -3277,20 +3088,8 @@ export class Get { underlinenode.link = skills[i]; underlinenode.listen(ui.click.autoskill2); } else if (lib.skill[skills[i]].clickable && node.isIn() && node.isUnderControl(true)) { - var intronode = uiintro - .add( - '
' + - translation + - "
" + - get.skillInfoTranslation(skills[i], node) + - '
' - ) - .querySelector(".skillbutton"); - if ( - !_status.gameStarted || - (lib.skill[skills[i]].clickableFilter && - !lib.skill[skills[i]].clickableFilter(node)) - ) { + var intronode = uiintro.add('
' + translation + "
" + get.skillInfoTranslation(skills[i], node) + '
').querySelector(".skillbutton"); + if (!_status.gameStarted || (lib.skill[skills[i]].clickableFilter && !lib.skill[skills[i]].clickableFilter(node))) { intronode.classList.add("disabled"); intronode.style.opacity = 0.5; } else { @@ -3300,18 +3099,10 @@ export class Get { intronode.listen(ui.click.skillbutton); } } else { - uiintro.add( - '
' + - translation + - "
" + - get.skillInfoTranslation(skills[i], node) + - "
" - ); + uiintro.add('
' + translation + "
" + get.skillInfoTranslation(skills[i], node) + "
"); } if (lib.translate[skills[i] + "_append"]) { - uiintro._place_text = uiintro.add( - '
' + lib.translate[skills[i] + "_append"] + "
" - ); + uiintro._place_text = uiintro.add('
' + lib.translate[skills[i] + "_append"] + "
"); } } } @@ -3398,22 +3189,8 @@ export class Get { var es = node.getCards("e"); for (var i = 0; i < es.length; i++) { var cardinfo = lib.card[es[i].name]; - if (cardinfo && cardinfo.cardPrompt) - uiintro.add( - '
' + - es[i].outerHTML + - "
" + - cardinfo.cardPrompt(es[i]) + - "
" - ); - else - uiintro.add( - '
' + - es[i].outerHTML + - "
" + - lib.translate[es[i].name + "_info"] + - "
" - ); + if (cardinfo && cardinfo.cardPrompt) uiintro.add('
' + es[i].outerHTML + "
" + cardinfo.cardPrompt(es[i]) + "
"); + else uiintro.add('
' + es[i].outerHTML + "
" + lib.translate[es[i].name + "_info"] + "
"); uiintro.content.lastChild.querySelector(".skill>.card").style.transform = ""; if (lib.translate[es[i].name + "_append"]) { @@ -3433,23 +3210,9 @@ export class Get { if (!showCardIntro) { html = ui.create.button(js[i], "blank").outerHTML; } - uiintro.add( - '
' + - html + - "
" + - lib.translate[js[i].viewAs] + - ":" + - lib.translate[js[i].viewAs + "_info"] + - "
" - ); + uiintro.add('
' + html + "
" + lib.translate[js[i].viewAs] + ":" + lib.translate[js[i].viewAs + "_info"] + "
"); } else { - uiintro.add( - '
' + - js[i].outerHTML + - "
" + - lib.translate[js[i].name + "_info"] + - "
" - ); + uiintro.add('
' + js[i].outerHTML + "
" + lib.translate[js[i].name + "_info"] + "
"); } uiintro.content.lastChild.querySelector(".skill>.card").style.transform = ""; } @@ -3538,13 +3301,7 @@ export class Get { uiintro.content.appendChild(table); } var modepack = lib.characterPack["mode_" + get.mode()]; - if ( - lib.config.show_favourite && - lib.character[node.name] && - game.players.includes(node) && - (!modepack || !modepack[node.name]) && - (!simple || get.is.phoneLayout()) - ) { + if (lib.config.show_favourite && lib.character[node.name] && game.players.includes(node) && (!modepack || !modepack[node.name]) && (!simple || get.is.phoneLayout())) { var addFavourite = ui.create.div(".text.center.pointerdiv"); addFavourite.link = node.name; if (lib.config.favouriteCharacter.includes(node.name)) { @@ -3588,20 +3345,10 @@ export class Get { } else { delete lib.config.skin[nameskin]; if (avatar2) { - if ( - gzbool && - lib.character[nameskin2].hasSkinInGuozhan && - lib.config.mode_config.guozhan.guozhanSkin - ) - node.node.avatar2.setBackground(nameskin2, "character"); + if (gzbool && lib.character[nameskin2].hasSkinInGuozhan && lib.config.mode_config.guozhan.guozhanSkin) node.node.avatar2.setBackground(nameskin2, "character"); else node.node.avatar2.setBackground(nameskin, "character"); } else { - if ( - gzbool && - lib.character[nameskin2].hasSkinInGuozhan && - lib.config.mode_config.guozhan.guozhanSkin - ) - node.node.avatar.setBackground(nameskin2, "character"); + if (gzbool && lib.character[nameskin2].hasSkinInGuozhan && lib.config.mode_config.guozhan.guozhanSkin) node.node.avatar.setBackground(nameskin2, "character"); else node.node.avatar.setBackground(nameskin, "character"); } } @@ -3611,12 +3358,7 @@ export class Get { if (i) { button.setBackgroundImage("image/skin/" + nameskin + "/" + i + ".jpg"); } else { - if ( - gzbool && - lib.character[nameskin2].hasSkinInGuozhan && - lib.config.mode_config.guozhan.guozhanSkin - ) - button.setBackground(nameskin2, "character", "noskin"); + if (gzbool && lib.character[nameskin2].hasSkinInGuozhan && lib.config.mode_config.guozhan.guozhanSkin) button.setBackground(nameskin2, "character", "noskin"); else button.setBackground(nameskin, "character", "noskin"); } } @@ -3679,13 +3421,7 @@ export class Get { } uiintro.add(ui.create.div(".placeholder.slim")); - } else if ( - node.classList.contains("mark") && - node.info && - node.parentNode && - node.parentNode.parentNode && - node.parentNode.parentNode.classList.contains("player") - ) { + } else if (node.classList.contains("mark") && node.info && node.parentNode && node.parentNode.parentNode && node.parentNode.parentNode.classList.contains("player")) { var info = node.info; var player = node.parentNode.parentNode; if (info.name) { @@ -3700,13 +3436,7 @@ export class Get { } else if (info.name !== false) { uiintro.add(get.translation(node.skill)); } - if ( - typeof info.id == "string" && - info.id.startsWith("subplayer") && - player.isUnderControl(true) && - player.storage[info.id] && - !_status.video - ) { + if (typeof info.id == "string" && info.id.startsWith("subplayer") && player.isUnderControl(true) && player.storage[info.id] && !_status.video) { var storage = player.storage[info.id]; uiintro.addText("当前体力:" + storage.hp + "/" + storage.maxHp); if (storage.hs.length) { @@ -3721,9 +3451,7 @@ export class Get { if (typeof info.mark == "function") { var stint = info.mark(uiintro, player.storage[node.skill], player); if (stint) { - var placetext = uiintro.add( - '
' + stint + "
" - ); + var placetext = uiintro.add('
' + stint + "
"); if (!stint.startsWith('
' + stint.slice(1) + "
"); } else { - var placetext = uiintro.add( - '
' + stint + "
" - ); + var placetext = uiintro.add('
' + stint + "
"); if (!stint.startsWith('
' + item[1] + "
" - ); + uiintro._place_text = uiintro.add('
' + item[1] + "
"); } } if (moded) return uiintro; @@ -3793,10 +3511,7 @@ export class Get { var cardOwner = get.owner(node); if (cardOwner && !cardOwner.isUnderControl(true)) showCardIntro = false; } - if (showCardIntro) - uiintro.add( - '
(' + get.translation(get.translation(node)) + ")
" - ); + if (showCardIntro) uiintro.add('
(' + get.translation(get.translation(node)) + ")
"); // uiintro.add(get.translation(node.viewAs)+'
('+get.translation(node)+')
'); uiintro.nosub = true; name = node.viewAs; @@ -3840,11 +3555,7 @@ export class Get { var page = ui.create.div(".menu-buttons.configpopped", uiintro.content); var banall = false; for (var i = 0; i < list.length; i++) { - var cfg = ui.create.div( - ".config", - list[i] == "zhinang_tricks" ? "设为智囊" : lib.translate[list[i]] + "模式", - page - ); + var cfg = ui.create.div(".config", list[i] == "zhinang_tricks" ? "设为智囊" : lib.translate[list[i]] + "模式", page); cfg.classList.add("toggle"); if (list[i] == "zhinang_tricks") { cfg.bannedname = (node._banning == "offline" ? "" : "connect_") + "zhinang_tricks"; @@ -3861,63 +3572,38 @@ export class Get { banall = true; } } - ui.create.div( - ".menubutton.pointerdiv", - banall ? "全部禁用" : "全部启用", - uiintro.content, - function () { - if (this.innerHTML == "全部禁用") { - for (var i = 0; i < page.childElementCount; i++) { - if ( - page.childNodes[i].bannedname.indexOf("zhinang_tricks") == -1 && - page.childNodes[i].bannedname && - page.childNodes[i].classList.contains("on") - ) { - clickBanned.call(page.childNodes[i]); - } + ui.create.div(".menubutton.pointerdiv", banall ? "全部禁用" : "全部启用", uiintro.content, function () { + if (this.innerHTML == "全部禁用") { + for (var i = 0; i < page.childElementCount; i++) { + if (page.childNodes[i].bannedname.indexOf("zhinang_tricks") == -1 && page.childNodes[i].bannedname && page.childNodes[i].classList.contains("on")) { + clickBanned.call(page.childNodes[i]); } - this.innerHTML = "全部启用"; - } else { - for (var i = 0; i < page.childElementCount; i++) { - if ( - page.childNodes[i].bannedname.indexOf("zhinang_tricks") == -1 && - page.childNodes[i].bannedname && - !page.childNodes[i].classList.contains("on") - ) { - clickBanned.call(page.childNodes[i]); - } - } - this.innerHTML = "全部禁用"; } + this.innerHTML = "全部启用"; + } else { + for (var i = 0; i < page.childElementCount; i++) { + if (page.childNodes[i].bannedname.indexOf("zhinang_tricks") == -1 && page.childNodes[i].bannedname && !page.childNodes[i].classList.contains("on")) { + clickBanned.call(page.childNodes[i]); + } + } + this.innerHTML = "全部禁用"; } - ).style.marginTop = "-10px"; + }).style.marginTop = "-10px"; ui.create.div(".placeholder.slim", uiintro.content); } else { if (lib.translate[name + "_info"]) { if (!uiintro.nosub) { if (lib.card[name] && lib.card[name].derivation) { if (typeof lib.card[name].derivation == "string") { - uiintro.add( - '
来源:' + - get.translation(lib.card[name].derivation) + - "
" - ); + uiintro.add('
来源:' + get.translation(lib.card[name].derivation) + "
"); } else if (lib.card[name].derivationpack) { - uiintro.add( - '
来源:' + - get.translation(lib.card[name].derivationpack + "_card_config") + - "包
" - ); + uiintro.add('
来源:' + get.translation(lib.card[name].derivationpack + "_card_config") + "包
"); } } let typeinfo = ""; if (lib.card[name] && lib.card[name].unique) { typeinfo += "特殊" + get.translation(lib.card[name].type) + "牌"; - } else if ( - lib.card[name] && - lib.card[name].type && - lib.translate[lib.card[name].type] - ) { + } else if (lib.card[name] && lib.card[name].type && lib.translate[lib.card[name].type]) { typeinfo += get.translation(lib.card[name].type) + "牌"; } if (get.subtype(name, false)) { @@ -3928,11 +3614,9 @@ export class Get { } if (lib.card[name].unique && lib.card[name].type == "equip") { if (lib.cardPile.guozhan && lib.cardPack.guozhan.includes(name)) { - uiintro.add('
专属装备
').style.marginTop = - "-5px"; + uiintro.add('
专属装备
').style.marginTop = "-5px"; } else { - uiintro.add('
特殊装备
').style.marginTop = - "-5px"; + uiintro.add('
特殊装备
').style.marginTop = "-5px"; } } if (lib.card[name] && lib.card[name].addinfomenu) { @@ -3944,11 +3628,7 @@ export class Get { var dist = lib.card[node.name].distance; if (dist.attackFrom) { added = true; - uiintro.add( - '
攻击范围:' + - (-dist.attackFrom + 1) + - "
" - ); + uiintro.add('
攻击范围:' + (-dist.attackFrom + 1) + "
"); } } if (!added) { @@ -3958,18 +3638,12 @@ export class Get { } if (lib.card[name].cardPrompt) { var str = lib.card[name].cardPrompt(node.link || node), - placetext = uiintro.add( - '
' + str + "
" - ); + placetext = uiintro.add('
' + str + "
"); if (!str.startsWith('
' + - lib.translate[name + "_info"] + - "
" - ); + var placetext = uiintro.add('
' + lib.translate[name + "_info"] + "
"); if (!lib.translate[name + "_info"].startsWith('
应变:${yingbianEffects - .map((value) => lib.yingbian.prompt.get(value)) - .join(";")}
` - ); + if (yingbianEffects.length && showCardIntro) uiintro.add(`
应变:${yingbianEffects.map(value => lib.yingbian.prompt.get(value)).join(";")}
`); } if (lib.translate[name + "_append"]) { - uiintro.add( - '
' + - lib.translate[name + "_append"] + - "
" - ); + uiintro.add('
' + lib.translate[name + "_append"] + "
"); } } uiintro.add(ui.create.div(".placeholder.slim")); @@ -4004,13 +3668,11 @@ export class Get { let capt = get.translation(character); if (characterInfo) { const infoSex = characterInfo[0]; - if (infoSex && lib.config.show_sex) - capt += `  ${infoSex == "none" ? "无" : lib.translate[infoSex]}`; + if (infoSex && lib.config.show_sex) capt += `  ${infoSex == "none" ? "无" : lib.translate[infoSex]}`; const infoGroup = characterInfo[1]; if (infoGroup && lib.config.show_group) { const group = get.is.double(character, true); - if (group) - capt += `  ${group.map((value) => get.translation(value)).join("/")}`; + if (group) capt += `  ${group.map(value => get.translation(value)).join("/")}`; else capt += `  ${lib.translate[infoGroup]}`; } } @@ -4021,14 +3683,12 @@ export class Get { } if (get.characterInitFilter(node.link)) { - const initFilters = get.characterInitFilter(node.link).filter((tag) => { + const initFilters = get.characterInitFilter(node.link).filter(tag => { if (!lib.characterInitFilter[node.link]) return true; return lib.characterInitFilter[node.link](tag) !== false; }); if (initFilters.length) { - const str = initFilters - .reduce((strx, stry) => strx + lib.InitFilter[stry] + "
", "") - .slice(0, -4); + const str = initFilters.reduce((strx, stry) => strx + lib.InitFilter[stry] + "
", "").slice(0, -4); uiintro.addText(str); } } @@ -4104,34 +3764,23 @@ export class Get { cfg.classList.add("on"); } } - ui.create.div( - ".menubutton.pointerdiv", - banall ? "全部禁用" : "全部启用", - uiintro.content, - function () { - if (this.innerHTML == "全部禁用") { - for (var i = 0; i < page.childElementCount; i++) { - if ( - page.childNodes[i].bannedname && - page.childNodes[i].classList.contains("on") - ) { - clickBanned.call(page.childNodes[i]); - } + ui.create.div(".menubutton.pointerdiv", banall ? "全部禁用" : "全部启用", uiintro.content, function () { + if (this.innerHTML == "全部禁用") { + for (var i = 0; i < page.childElementCount; i++) { + if (page.childNodes[i].bannedname && page.childNodes[i].classList.contains("on")) { + clickBanned.call(page.childNodes[i]); } - this.innerHTML = "全部启用"; - } else { - for (var i = 0; i < page.childElementCount; i++) { - if ( - page.childNodes[i].bannedname && - !page.childNodes[i].classList.contains("on") - ) { - clickBanned.call(page.childNodes[i]); - } - } - this.innerHTML = "全部禁用"; } + this.innerHTML = "全部启用"; + } else { + for (var i = 0; i < page.childElementCount; i++) { + if (page.childNodes[i].bannedname && !page.childNodes[i].classList.contains("on")) { + clickBanned.call(page.childNodes[i]); + } + } + this.innerHTML = "全部禁用"; } - ).style.marginTop = "-10px"; + }).style.marginTop = "-10px"; ui.create.div(".placeholder.slim", uiintro.content); } else { var skills = get.character(character, 3); @@ -4140,32 +3789,18 @@ export class Get { if (lib.translate[skills[i] + "_ab"]) translation = lib.translate[skills[i] + "_ab"]; else { translation = get.translation(skills[i]); - if (!lib.skill[skills[i]].nobracket) - translation = `【${translation.slice(0, 2)}】`; + if (!lib.skill[skills[i]].nobracket) translation = `【${translation.slice(0, 2)}】`; } - uiintro.add( - '
' + - translation + - "
" + - get.skillInfoTranslation(skills[i]) + - "
" - ); + uiintro.add('
' + translation + "
" + get.skillInfoTranslation(skills[i]) + "
"); if (lib.translate[skills[i] + "_append"]) { - uiintro._place_text = uiintro.add( - '
' + lib.translate[skills[i] + "_append"] + "
" - ); + uiintro._place_text = uiintro.add('
' + lib.translate[skills[i] + "_append"] + "
"); } } } var modepack = lib.characterPack["mode_" + get.mode()]; - if ( - lib.config.show_favourite && - lib.character[node.link] && - (!modepack || !modepack[node.link]) && - (!simple || get.is.phoneLayout()) - ) { + if (lib.config.show_favourite && lib.character[node.link] && (!modepack || !modepack[node.link]) && (!simple || get.is.phoneLayout())) { var addFavourite = ui.create.div(".text.center.pointerdiv"); addFavourite.link = node.link; addFavourite.style.marginBottom = "15px"; @@ -4213,12 +3848,7 @@ export class Get { game.saveConfig("skin", lib.config.skin); } else { delete lib.config.skin[nameskin]; - if ( - gzbool && - lib.character[nameskin2].hasSkinInGuozhan && - lib.config.mode_config.guozhan.guozhanSkin - ) - node.setBackground(nameskin2, "character"); + if (gzbool && lib.character[nameskin2].hasSkinInGuozhan && lib.config.mode_config.guozhan.guozhanSkin) node.setBackground(nameskin2, "character"); else node.setBackground(nameskin, "character"); game.saveConfig("skin", lib.config.skin); } @@ -4227,12 +3857,7 @@ export class Get { if (i) { button.setBackgroundImage("image/skin/" + nameskin + "/" + i + ".jpg"); } else { - if ( - gzbool && - lib.character[nameskin2].hasSkinInGuozhan && - lib.config.mode_config.guozhan.guozhanSkin - ) - button.setBackground(nameskin2, "character", "noskin"); + if (gzbool && lib.character[nameskin2].hasSkinInGuozhan && lib.config.mode_config.guozhan.guozhanSkin) button.setBackground(nameskin2, "character", "noskin"); else button.setBackground(nameskin, "character", "noskin"); } } @@ -4263,9 +3888,7 @@ export class Get { (function () { uiintro.add("选择装备"); uiintro.addSmall( - Array.from(node.childNodes).filter( - (node) => !node.classList.contains("emptyequip") && !node.classList.contains("feichu") - ), + Array.from(node.childNodes).filter(node => !node.classList.contains("emptyequip") && !node.classList.contains("feichu")), true ); uiintro.clickintro = true; @@ -4320,22 +3943,14 @@ export class Get { } else if (node.classList.contains("identity") && node.dataset.career) { var career = node.dataset.career; uiintro.add(get.translation(career)); - uiintro.add( - '
' + - lib.translate["_" + career + "_skill_info"] + - "
" - ); + uiintro.add('
' + lib.translate["_" + career + "_skill_info"] + "
"); } else if (node.classList.contains("skillbar")) { if (node == ui.friendBar) { uiintro.add("友方怒气值"); - uiintro.add( - '
' + _status.friendRage + "/100
" - ); + uiintro.add('
' + _status.friendRage + "/100
"); } else if (node == ui.enemyBar) { uiintro.add("敌方怒气值"); - uiintro.add( - '
' + _status.enemyRage + "/100
" - ); + uiintro.add('
' + _status.enemyRage + "/100
"); } } else if (node.parentNode == ui.historybar) { if (node.dead) { @@ -4343,23 +3958,13 @@ export class Get { uiintro.add('
' + get.translation(node.player) + "阵亡
"); uiintro.addSmall([node.player]); } else { - uiintro.add( - '
' + - get.translation(node.player) + - "被" + - get.translation(node.source) + - "杀害
" - ); + uiintro.add('
' + get.translation(node.player) + "被" + get.translation(node.source) + "杀害
"); uiintro.addSmall([node.source]); } } if (node.skill) { uiintro.add('
' + get.translation(node.skill, "skill") + "
"); - uiintro._place_text = uiintro.add( - '
' + - get.translation(node.skill, "info") + - "
" - ); + uiintro._place_text = uiintro.add('
' + get.translation(node.skill, "info") + "
"); } if (node.targets && get.itemtype(node.targets) == "players") { uiintro.add('
目标
'); @@ -4393,11 +3998,7 @@ export class Get { dialog.add('
已横置
'); var list = []; for (var i = 0; i < game.players.length; i++) { - if ( - game.players[i].isLinked() && - game.players[i].name && - !game.players[i].name.startsWith("unknown") - ) { + if (game.players[i].isLinked() && game.players[i].name && !game.players[i].name.startsWith("unknown")) { list.push(game.players[i]); } } @@ -4801,11 +4402,7 @@ export class Get { ) temp2 = cache.delegate(temp2).effect(card, player, target, result2, isLink); else temp2 = undefined; - } else if ( - temp2 && - typeof temp2.effect == "object" && - typeof temp2.effect.target_use == "function" - ) { + } else if (temp2 && typeof temp2.effect == "object" && typeof temp2.effect.target_use == "function") { if ( !player.hasSkillTag("ignoreSkill", true, { card: card, @@ -4814,15 +4411,9 @@ export class Get { isLink: isLink, }) ) - temp2 = cache - .delegate(temp2.effect) - .target_use(card, player, target, result2, isLink); + temp2 = cache.delegate(temp2.effect).target_use(card, player, target, result2, isLink); else temp2 = undefined; - } else if ( - temp2 && - typeof temp2.effect == "object" && - typeof temp2.effect.target == "function" - ) { + } else if (temp2 && typeof temp2.effect == "object" && typeof temp2.effect.target == "function") { if ( !player.hasSkillTag("ignoreSkill", true, { card: card, @@ -4896,25 +4487,18 @@ export class Get { if (zerotarget) result2 = 0; var final = 0; if (player2) { - final = - result1 * cache.get.attitude(player2, player) + - (target ? result2 * cache.get.attitude(player2, target) : 0); - } else - final = - result1 * cache.get.attitude(player, player) + - (target ? result2 * cache.get.attitude(player, target) : 0); + final = result1 * cache.get.attitude(player2, player) + (target ? result2 * cache.get.attitude(player2, target) : 0); + } else final = result1 * cache.get.attitude(player, player) + (target ? result2 * cache.get.attitude(player, target) : 0); if (!isLink && get.tag(card, "natureDamage") && !zerotarget) { var info = get.info(card); if (!info || !info.ai || !info.ai.canLink) { if (target.isLinked()) game.players.forEach(function (current) { - if (current != target && current.isLinked()) - final += cache.get.effect(current, card, player, player2, true); + if (current != target && current.isLinked()) final += cache.get.effect(current, card, player, player2, true); }); } else if (info.ai.canLink(player, target, card)) { game.players.forEach(function (current) { - if (current != target && current.isLinked()) - final += cache.get.effect(current, card, player, player2, true); + if (current != target && current.isLinked()) final += cache.get.effect(current, card, player, player2, true); }); } } @@ -5001,11 +4585,7 @@ export class Get { ) temp2 = cache.delegate(temp2).effect(card, player, target, result2, isLink); else temp2 = undefined; - } else if ( - temp2 && - typeof temp2.effect == "object" && - typeof temp2.effect.target == "function" - ) { + } else if (temp2 && typeof temp2.effect == "object" && typeof temp2.effect.target == "function") { if ( !player.hasSkillTag("ignoreSkill", true, { card: card, @@ -5082,25 +4662,18 @@ export class Get { if (zerotarget) result2 = 0; var final = 0; if (player2) { - final = - result1 * cache.get.attitude(player2, player) + - (target ? result2 * cache.get.attitude(player2, target) : 0); - } else - final = - result1 * cache.get.attitude(player, player) + - (target ? result2 * cache.get.attitude(player, target) : 0); + final = result1 * cache.get.attitude(player2, player) + (target ? result2 * cache.get.attitude(player2, target) : 0); + } else final = result1 * cache.get.attitude(player, player) + (target ? result2 * cache.get.attitude(player, target) : 0); if (!isLink && get.tag(card, "natureDamage") && !zerotarget) { var info = get.info(card); if (!info || !info.ai || !info.ai.canLink) { if (target.isLinked()) game.players.forEach(function (current) { - if (current != target && current.isLinked()) - final += cache.get.effect(current, card, player, player2, true); + if (current != target && current.isLinked()) final += cache.get.effect(current, card, player, player2, true); }); } else if (info.ai.canLink(player, target, card)) { game.players.forEach(function (current) { - if (current != target && current.isLinked()) - final += cache.get.effect(current, card, player, player2, true); + if (current != target && current.isLinked()) final += cache.get.effect(current, card, player, player2, true); }); } } @@ -5109,10 +4682,7 @@ export class Get { damageEffect(target, player, viewer, nature) { if (get.itemtype(nature) == "natures") { var natures = get.natureList(nature); - return ( - natures.map((n) => get.damageEffect(target, player, viewer, n)).reduce((p, c) => p + c, 0) / - (natures.length || 1) - ); + return natures.map(n => get.damageEffect(target, player, viewer, n)).reduce((p, c) => p + c, 0) / (natures.length || 1); } if (!player) { player = target; @@ -5201,6 +4771,44 @@ export class Get { attitude2(to) { return get.attitude(_status.event.player, to); } + + /** + * 将URL转换成相对于无名杀根目录的路径 + * + * --- + * + * 在无名杀正式过渡到http协议前,无名杀的路径在不同端拥有不同的情况: + * - 网页端: 除了`db`外,没任何可能 + * - 电脑端(electron): 和`node.js`保持一致 + * - 手机端(cordova): 需要使用`cordova`的`cordova-plugin-file`插件实现,有较为严格的限制 + * + * 故之前的路径API基本如下: + * - 网页端完全不考虑 + * - 使用`lib.assetURL + `的形式,其中`lib.assetURL`的值为: + * - 在网页端和电脑端为空字符串 + * - 在手机端为无名杀包的`externalApplicationStorageDirectory`里(也就是`Android/data//`) + * + * 现在无名杀即将踏入http协议,也早已用上了ES Module,故活用`import.meta.url`来提供路径理应被重视,`URL`也理应成为路径的主要构成 + * + * 然而由于之前的API混乱且针对多端有不同的情况,故需要提供函数,来方便提供调用旧API的情况 + * + * @param {URL} url - 需要转换的URL对象 + * @param {boolean} [addAssetURL=false] - 是否需要在函数内加上`lib.assetURL`, + * 默认为`false`,当为`true`时会在协议为`file`时增加`lib.assetURL` + * @returns {string} + * + * @example + * // 当前文件以"noname/get/index.js"举例 + * let parsedPath = get.relativePath(import.meta.url, true); + * console.log(parsedPath == `${lib.assetURL}noname/get/index.js`) //=> true + */ + relativePath(url, addAssetURL = false) { + let base = lib.path.relative(decodeURI(rootURL.pathname), decodeURI(url.pathname)); + if (addAssetURL && rootURL.protocol == "file:") { + base = `${lib.assetURL}${base}`; + } + return base; + } } export let get = new Get(); diff --git a/noname/init/polyfill.js b/noname/init/polyfill.js index 1c685b50b..51fc9a8ce 100644 --- a/noname/init/polyfill.js +++ b/noname/init/polyfill.js @@ -142,17 +142,14 @@ Reflect.defineProperty(HTMLDivElement.prototype, "setBackground", { gzbool = false; const mode = get.mode(); if (type == "character") { + nameinfo = get.character(name); if (lib.characterPack[`mode_${mode}`] && lib.characterPack[`mode_${mode}`][name]) { if (mode == "guozhan") { - nameinfo = lib.character[name]; if (name.startsWith("gz_shibing")) name = name.slice(3, 11); else { - if ( - lib.config.mode_config.guozhan.guozhanSkin && - lib.character[name] && - lib.character[name].hasSkinInGuozhan - ) + if (lib.config.mode_config.guozhan.guozhanSkin && nameinfo && nameinfo.hasSkinInGuozhan){ gzbool = true; + } name = name.slice(3); } } else modeimage = mode; @@ -161,8 +158,6 @@ Reflect.defineProperty(HTMLDivElement.prototype, "setBackground", { name = name.split("::"); modeimage = name[0]; name = name[1]; - } else { - nameinfo = get.character(name); } } let imgPrefixUrl; diff --git a/noname/library/element/player.js b/noname/library/element/player.js index 6869e2278..27f4d5ba7 100644 --- a/noname/library/element/player.js +++ b/noname/library/element/player.js @@ -5848,6 +5848,7 @@ export class Player extends HTMLDivElement { return get.is.sameNature(natures, naturesx); }; if (next.hasNature("poison")) delete next._triggered; + else if(next.unreal) next._triggered = 2; next.setContent("damage"); next.filterStop = function () { if (this.source && this.source.isDead()) delete this.source; diff --git a/noname/ui/create/index.js b/noname/ui/create/index.js index b481146ff..7e32bc08e 100644 --- a/noname/ui/create/index.js +++ b/noname/ui/create/index.js @@ -1042,7 +1042,7 @@ export class Create { .setContent(function () { game.log(player, "投降"); player.popup("投降"); - player.die("nosource").includeOut = true; + player.die("nosource").set("_triggered", null).includeOut = true; }).player = player; } if (_status.paused && _status.imchoosing && !_status.auto) {