import { lib, game, ui, get, ai, _status } from "../noname.js"; game.import("card", function () { return { name: "standard", connect: true, card: { damage: { ai: { result: { target: -1.5, }, tag: { damage: 1, }, }, }, draw: { ai: { result: { target: 1, }, tag: { draw: 1, }, }, }, losehp: { ai: { result: { target: -1.5, }, tag: { loseHp: 1, }, }, }, recover: { ai: { result: { target: 1.5, }, tag: { recover: 1, }, }, }, firedamage: { ai: { result: { target: -1.5, }, tag: { damage: 1, fireDamage: 1, natureDamage: 1, }, }, }, thunderdamage: { ai: { result: { target: -1.5, }, tag: { damage: 1, thunderDamage: 1, natureDamage: 1, }, }, }, icedamage: { ai: { result: { target: -1.5, }, tag: { damage: 1, iceDamage: 1, natureDamage: 1, }, }, }, respondShan: { ai: { result: { target: -1.5, }, tag: { respond: 1, respondShan: 1, damage: 1, }, }, }, sha: { audio: true, fullskin: true, nature: ["thunder", "fire", "kami", "ice"], type: "basic", enable: true, usable: 1, updateUsable: "phaseUse", global: "icesha_skill", range: function (card, player, target) { return player.inRange(target); }, selectTarget: 1, cardPrompt: function (card) { var natures = get.natureList(Array.isArray(card) ? card[3] : card); if (lib.translate["sha_nature_" + natures[0] + "_info"]) return lib.translate["sha_nature_" + natures[0] + "_info"]; var str = "出牌阶段,对你攻击范围内的一名角色使用。其须使用一张【闪】,"; if (natures.includes("stab")) { str += "且在此之后需弃置一张手牌(没有则不弃),"; } str += "否则你对其造成1点"; var linked = lib.linked.filter((n) => natures.includes(n)); if (linked.length) str += get.translation(get.nature(linked)) + "属性"; str += "伤害。"; return str; }, defaultYingbianEffect: "add", filterTarget: function (card, player, target) { return player != target; }, content: function () { "step 0"; if ( typeof event.shanRequired != "number" || !event.shanRequired || event.shanRequired < 0 ) { event.shanRequired = 1; } if (typeof event.baseDamage != "number") event.baseDamage = 1; if (typeof event.extraDamage != "number") event.extraDamage = 0; "step 1"; if ( event.directHit || event.directHit2 || (!_status.connectMode && lib.config.skip_shan && !target.hasShan()) ) { event._result = { bool: false }; } else if (event.skipShan) { event._result = { bool: true, result: "shaned" }; } else { var next = target.chooseToUse("请使用一张闪响应杀"); next.set("type", "respondShan"); next.set("filterCard", function (card, player) { if (get.name(card) != "shan") return false; return lib.filter.cardEnabled(card, player, "forceEnable"); }); if (event.shanRequired > 1) { next.set("prompt2", "(共需使用" + event.shanRequired + "张闪)"); } else if (game.hasNature(event.card, "stab")) { next.set("prompt2", "(在此之后仍需弃置一张手牌)"); } next.set("ai1", function (card) { if (_status.event.useShan) return get.order(card); return 0; }).set("shanRequired", event.shanRequired); next.set("respondTo", [player, card]); next.set( "useShan", (() => { if (target.hasSkillTag("noShan", null, event)) return false; if (target.hasSkillTag("useShan", null, event)) return true; if ( target.isLinked() && game.hasNature(event.card) && get.attitude(target, player._trueMe || player) > 0 ) return false; if ( event.baseDamage + event.extraDamage <= 0 && !game.hasNature(event.card, "ice") ) return false; if ( event.baseDamage + event.extraDamage >= target.hp + (player.hasSkillTag("jueqing", false, target) || target.hasSkill("gangzhi") ? target.hujia : 0) ) return true; if ( !game.hasNature(event.card, "ice") && get.damageEffect(target, player, target, get.nature(event.card)) >= 0 ) return false; if ( event.shanRequired > 1 && target.mayHaveShan(target, "use", null, "count") < event.shanRequired - (event.shanIgnored || 0) ) return false; return true; })() ); //next.autochoose=lib.filter.autoRespondShan; } "step 2"; if (!result || !result.bool || !result.result || result.result != "shaned") { event.trigger("shaHit"); } else { event.shanRequired--; if (event.shanRequired > 0) { event.goto(1); } else if (game.hasNature(event.card, "stab") && target.countCards("h") > 0) { event.responded = result; event.goto(4); } else { event.trigger("shaMiss"); event.responded = result; } } "step 3"; if ( (!result || !result.bool || !result.result || result.result != "shaned") && !event.unhurt ) { if ( !event.directHit && !event.directHit2 && lib.filter.cardEnabled( new lib.element.VCard({ name: "shan" }), target, "forceEnable" ) && target.countCards("hs") > 0 && get.damageEffect(target, player, target) < 0 ) target.addGaintag(target.getCards("hs"), "sha_notshan"); target.damage(get.nature(event.card)); event.result = { bool: true }; event.trigger("shaDamage"); } else { event.result = { bool: false }; event.trigger("shaUnhirt"); } event.finish(); "step 4"; target .chooseToDiscard("刺杀:请弃置一张牌,否则此【杀】依然造成伤害") .set("ai", function (card) { var target = _status.event.player; var evt = _status.event.getParent(); var bool = true; if (get.damageEffect(target, evt.player, target, evt.card.nature) >= 0) bool = false; if (bool) { return 8 - get.useful(card); } return 0; }); "step 5"; if ((!result || !result.bool) && !event.unhurt) { target.damage(get.nature(event.card)); event.result = { bool: true }; event.trigger("shaDamage"); event.finish(); } else { event.trigger("shaMiss"); } "step 6"; if ((!result || !result.bool) && !event.unhurt) { target.damage(get.nature(event.card)); event.result = { bool: true }; event.trigger("shaDamage"); event.finish(); } else { event.result = { bool: false }; event.trigger("shaUnhirt"); } }, ai: { yingbian: function (card, player, targets, viewer) { if (get.attitude(viewer, player) <= 0) return 0; var base = 0, hit = false; if (get.cardtag(card, "yingbian_hit")) { hit = true; if ( targets.some((target) => { return ( target.mayHaveShan( viewer, "use", target.getCards("h", (i) => { return i.hasGaintag("sha_notshan"); }) ) && get.attitude(viewer, target) < 0 && get.damageEffect(target, player, viewer, get.natureList(card)) > 0 ); }) ) base += 5; } if (get.cardtag(card, "yingbian_add")) { if ( game.hasPlayer(function (current) { return ( !targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && get.effect(current, card, player, player) > 0 ); }) ) base += 5; } if (get.cardtag(card, "yingbian_damage")) { if ( targets.some((target) => { return ( get.attitude(player, target) < 0 && (hit || !target.mayHaveShan( viewer, "use", target.getCards("h", (i) => { return i.hasGaintag("sha_notshan"); }) ) || player.hasSkillTag( "directHit_ai", true, { target: target, card: card, }, true )) && !target.hasSkillTag("filterDamage", null, { player: player, card: card, jiu: true, }) ); }) ) base += 5; } return base; }, canLink: function (player, target, card) { if (!target.isLinked() && !player.hasSkill("wutiesuolian_skill")) return false; if ( player.hasSkill("jueqing") || player.hasSkill("gangzhi") || target.hasSkill("gangzhi") ) return false; return true; }, basic: { useful: [5, 3, 1], value: [5, 3, 1], }, order(item, player) { let res = 3.2; if (player.hasSkillTag("presha", true, null, true)) res = 10; if ( typeof item !== "object" || !game.hasNature(item, "linked") || game.countPlayer((cur) => cur.isLinked()) < 2 ) return res; //let used = player.getCardUsable('sha') - 1.5, natures = ['thunder', 'fire', 'ice', 'kami']; let uv = player.getUseValue(item, true); if (uv <= 0) return res; let temp = player.getUseValue("sha", true) - uv; if (temp < 0) return res + 0.15; if (temp > 0) return res - 0.15; return res; }, result: { target: function (player, target, card, isLink) { let eff = -1.5, odds = 1.35, num = 1; if (isLink) { let cache = _status.event.getTempCache("sha_result", "eff"); if (typeof cache !== "object" || cache.card !== get.translation(card)) return eff; if (cache.odds < 1.35 && cache.bool) return 1.35 * cache.eff; return cache.odds * cache.eff; } if ( player.hasSkill("jiu") || player.hasSkillTag("damageBonus", true, { target: target, card: card, }) ) { if ( target.hasSkillTag("filterDamage", null, { player: player, card: card, jiu: true, }) ) eff = -0.5; else { num = 2; if (get.attitude(player, target) > 0) eff = -7; else eff = -4; } } if ( !player.hasSkillTag( "directHit_ai", true, { target: target, card: card, }, true ) ) odds -= 0.7 * target.mayHaveShan( player, "use", target.getCards("h", (i) => { return i.hasGaintag("sha_notshan"); }), "odds" ); _status.event.putTempCache("sha_result", "eff", { bool: target.hp > num && get.attitude(player, target) > 0, card: get.translation(card), eff: eff, odds: odds, }); return odds * eff; }, }, tag: { respond: 1, respondShan: 1, damage: function (card) { if (game.hasNature(card, "poison")) return; return 1; }, natureDamage: function (card) { if (game.hasNature(card, "linked")) return 1; }, fireDamage: function (card, nature) { if (game.hasNature(card, "fire")) return 1; }, thunderDamage: function (card, nature) { if (game.hasNature(card, "thunder")) return 1; }, poisonDamage: function (card, nature) { if (game.hasNature(card, "poison")) return 1; }, }, }, }, shacopy: { ai: { basic: { useful: [5, 3, 1], value: [5, 3, 1], }, order: 3, result: { target: -1.5, }, tag: { respond: 1, respondShan: 1, damage: function (card) { if (game.hasNature(card, "poison")) return; return 1; }, natureDamage: function (card) { if (game.hasNature(card)) return 1; }, fireDamage: function (card, nature) { if (game.hasNature(card, "fire")) return 1; }, thunderDamage: function (card, nature) { if (game.hasNature(card, "thunder")) return 1; }, poisonDamage: function (card, nature) { if (game.hasNature(card, "poison")) return 1; }, }, }, }, shan: { audio: true, fullskin: true, type: "basic", cardcolor: "red", notarget: true, nodelay: true, defaultYingbianEffect: "draw", content: function () { event.result = "shaned"; event.getParent().delayx = false; game.delay(0.5); }, ai: { order: 3, basic: { useful: (card, i) => { let player = _status.event.player, basic = [7, 5.1, 2], num = basic[Math.min(2, i)]; if (player.hp > 2 && player.hasSkillTag("maixie")) num *= 0.57; if ( player.hasSkillTag("freeShan", false, null, true) || player.getEquip("rewrite_renwang") ) num *= 0.8; return num; }, value: [7, 5.1, 2], }, result: { player: 1 }, //expose:0.2 }, }, tao: { fullskin: true, type: "basic", cardcolor: "red", toself: true, enable: function (card, player) { return player.hp < player.maxHp; }, savable: true, selectTarget: -1, filterTarget: function (card, player, target) { return target == player && target.hp < target.maxHp; }, modTarget: function (card, player, target) { return target.hp < target.maxHp; }, content: function () { target.recover(); }, ai: { basic: { order: (card, player) => { if (player.hasSkillTag("pretao")) return 9; return 2; }, useful: (card, i) => { let player = _status.event.player; if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player)) return 2 / (1 + i); let fs = game.filterPlayer((current) => { return get.attitude(player, current) > 0 && current.hp <= 2; }), damaged = 0, needs = 0; fs.forEach((f) => { if (f.hp > 3 || !lib.filter.cardSavable(card, player, f)) return; if (f.hp > 1) damaged++; else needs++; }); if (needs && damaged) return 5 * needs + 3 * damaged; if (needs + damaged > 1 || player.hasSkillTag("maixie")) return 8; if (player.hp / player.maxHp < 0.7) return 7 + Math.abs(player.hp / player.maxHp - 0.5); if (needs) return 7; if (damaged) return Math.max(3, 7.8 - i); return Math.max(1, 7.2 - i); }, value: (card, player) => { let fs = game.filterPlayer((current) => { return get.attitude(_status.event.player, current) > 0; }), damaged = 0, needs = 0; fs.forEach((f) => { if (!player.canUse("tao", f)) return; if (f.hp <= 1) needs++; else if (f.hp == 2) damaged++; }); if ((needs && damaged) || player.hasSkillTag("maixie")) return Math.max(9, 5 * needs + 3 * damaged); if (needs || damaged > 1) return 8; if (damaged) return 7.5; return Math.max(5, 9.2 - player.hp); }, }, result: { target: (player, target) => { if (target.hasSkillTag("maixie")) return 3; return 2; }, target_use: (player, target, card) => { let mode = get.mode(), taos = player.getCards( "hs", (i) => get.name(i) === "tao" && lib.filter.cardEnabled(i, target, "forceEnable") ); if (target !== _status.event.dying) { if ( !player.isPhaseUsing() || player.hasSkillTag( "nokeep", true, { card: card, target: target, }, true ) ) return 2; let min = 7.2 - (4 * player.hp) / player.maxHp, nd = player.needsToDiscard(0, (i, player) => { return ( !player.canIgnoreHandcard(i) && (taos.includes(i) || get.value(i) >= min) ); }), keep = nd ? 0 : 2; if ( nd > 2 || (taos.length > 1 && (nd > 1 || (nd && player.hp < 1 + taos.length))) || (target.identity === "zhu" && (nd || target.hp < 3) && (mode === "identity" || mode === "versus" || mode === "chess")) || !player.hasFriend() ) return 2; if ( game.hasPlayer((current) => { return ( player !== current && current.identity === "zhu" && current.hp < 3 && (mode === "identity" || mode === "versus" || mode === "chess") && get.attitude(player, current) > 0 ); }) ) keep = 3; else if (nd === 2 || player.hp < 2) return 2; if (nd === 2 && player.hp <= 1) return 2; if (keep === 3) return 0; if (taos.length <= player.hp / 2) keep = 1; if ( keep && game.countPlayer((current) => { if ( player !== current && current.hp < 3 && player.hp > current.hp && get.attitude(player, current) > 2 ) { keep += player.hp - current.hp; return true; } return false; }) ) { if (keep > 2) return 0; } return 2; } if (target.isZhu2() || target === game.boss) return 2; if (player !== target) { if (target.hp < 0 && taos.length + target.hp <= 0) return 0; if (Math.abs(get.attitude(player, target)) < 1) return 0; } if (!player.getFriends().length) return 2; let tri = _status.event.getTrigger(), num = game.countPlayer((current) => { if (get.attitude(current, target) > 0) return current.countCards( "hs", (i) => get.name(i) === "tao" && lib.filter.cardEnabled(i, target, "forceEnable") ); }), dis = 1, t = _status.currentPhase || game.me; while (t !== target) { let att = get.attitude(player, t); if (att < -2) dis++; else if (att < 1) dis += 0.45; t = t.next; } if (mode === "identity") { if (tri && tri.name === "dying") { if (target.identity === "fan") { if ( (!tri.source && player !== target) || (tri.source && tri.source !== target && player.getFriends().includes(tri.source.identity)) ) { if ( num > dis || (player === target && player.countCards("hs", { type: "basic" }) > 1.6 * dis) ) return 2; return 0; } } else if ( tri.source && tri.source.isZhu && (target.identity === "zhong" || target.identity === "mingzhong") && (tri.source.countCards("he") > 2 || (player === tri.source && player.hasCard((i) => i.name !== "tao", "he"))) ) return 2; //if(player!==target&&!target.isZhu&&target.countCards('hs') { return current.identity === "fan"; }) ) ) return 0; } } else if ( mode === "stone" && target.isMin() && player !== target && tri && tri.name === "dying" && player.side === target.side && tri.source !== target.getEnemy() ) return 0; return 2; }, }, tag: { recover: 1, save: 1, }, }, }, bagua: { fullskin: true, type: "equip", subtype: "equip2", ai: { basic: { equipValue: 7.5, }, }, skills: ["bagua_skill"], }, jueying: { fullskin: true, type: "equip", subtype: "equip3", distance: { globalTo: 1 }, }, dilu: { fullskin: true, type: "equip", subtype: "equip3", distance: { globalTo: 1 }, }, zhuahuang: { fullskin: true, type: "equip", subtype: "equip3", distance: { globalTo: 1 }, }, chitu: { fullskin: true, type: "equip", subtype: "equip4", distance: { globalFrom: -1 }, }, dawan: { fullskin: true, type: "equip", subtype: "equip4", distance: { globalFrom: -1 }, }, zixin: { fullskin: true, type: "equip", subtype: "equip4", distance: { globalFrom: -1 }, }, zhuge: { fullskin: true, type: "equip", subtype: "equip1", ai: { order: function () { return get.order({ name: "sha" }) - 0.1; }, equipValue: function (card, player) { if (player._zhuge_temp) return 1; player._zhuge_temp = true; var result = (function () { if ( !game.hasPlayer(function (current) { return ( get.distance(player, current) <= 1 && player.canUse("sha", current) && get.effect(current, { name: "sha" }, player, player) > 0 ); }) ) { return 1; } if (player.hasSha() && _status.currentPhase == player) { if ( (player.getEquip("zhuge") && player.countUsed("sha")) || player.getCardUsable("sha") == 0 ) { return 10; } } var num = player.countCards("h", "sha"); if (num > 1) return 6 + num; return 3 + num; })(); delete player._zhuge_temp; return result; }, basic: { equipValue: 5, }, tag: { valueswap: 1, }, }, skills: ["zhuge_skill"], }, cixiong: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -1 }, ai: { basic: { equipValue: 2, }, }, skills: ["cixiong_skill"], }, qinggang: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -1 }, ai: { basic: { equipValue: 2, }, }, skills: ["qinggang_skill"], }, qinglong: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -2 }, ai: { equipValue: function (card, player) { return Math.min(2.5 + player.countCards("h", "sha"), 4); }, basic: { equipValue: 3.5, }, }, skills: ["qinglong_skill", "qinglong_guozhan"], }, zhangba: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -2 }, ai: { equipValue: function (card, player) { var num = 2.5 + player.countCards("h") / 3; return Math.min(num, 4); }, basic: { equipValue: 3.5, }, }, skills: ["zhangba_skill"], }, guanshi: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -2 }, ai: { equipValue: function (card, player) { var num = 2.5 + (player.countCards("h") + player.countCards("e")) / 2.5; return Math.min(num, 5); }, basic: { equipValue: 4.5, }, }, skills: ["guanshi_skill"], }, fangtian: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -3 }, ai: { basic: { equipValue: 2.5, }, }, skills: ["fangtian_skill", "fangtian_guozhan"], }, qilin: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -4 }, ai: { basic: { equipValue: 3, }, }, skills: ["qilin_skill"], }, wugu: { audio: true, fullskin: true, type: "trick", enable: true, cardcolor: "red", selectTarget: -1, filterTarget: true, contentBefore: function () { "step 0"; if (!targets.length) { event.finish(); return; } if ((card.storage && card.storage.chooseDirection) || get.is.versus()) { player .chooseControl("顺时针", "逆时针", function (event, player) { if ( (get.event("isVersus") && player.next.side == player.side) || get.attitude(player, player.next) > get.attitude(player, player.previous) ) return "逆时针"; return "顺时针"; }) .set("prompt", "选择" + get.translation(card) + "的结算方向") .set("isVersus", get.is.versus()); } else { event.goto(2); } "step 1"; if (result && result.control == "顺时针") { var evt = event.getParent(), sorter = _status.currentPhase || player; evt.fixedSeat = true; evt.targets.sortBySeat(sorter); evt.targets.reverse(); if (evt.targets[evt.targets.length - 1] == sorter) { evt.targets.unshift(evt.targets.pop()); } } "step 2"; ui.clear(); var cards; if (card.storage && Array.isArray(card.storage.fixedShownCards)) { cards = card.storage.fixedShownCards.slice(); var lose_list = [], cards2 = []; cards.forEach((card) => { var owner = get.owner(card); if (owner) { var arr = lose_list.find((i) => i[0] == owner); if (arr) arr[1].push(card); else lose_list.push([owner, [card]]); } else cards2.add(card); }); if (lose_list.length) { lose_list.forEach((list) => { list[0].$throw(list[1]); game.log(list[0], "将", list[1], "置于了处理区"); }); game.loseAsync({ lose_list: lose_list, }).setContent("chooseToCompareLose"); } if (cards2.length) game.cardsGotoOrdering(cards2); game.delayex(); } else { var num; if (event.targets) { num = event.targets.length; } else { num = game.countPlayer(); } if (card.storage && typeof card.storage.extraCardsNum == "number") num += card.storage.extraCardsNum; cards = get.cards(num); game.cardsGotoOrdering(cards).relatedEvent = event.getParent(); } var dialog = ui.create.dialog("五谷丰登", cards, true); _status.dieClose.push(dialog); dialog.videoId = lib.status.videoId++; game.addVideo("cardDialog", null, ["五谷丰登", get.cardsInfo(cards), dialog.videoId]); event.getParent().preResult = dialog.videoId; game.broadcast( function (cards, id) { var dialog = ui.create.dialog("五谷丰登", cards, true); _status.dieClose.push(dialog); dialog.videoId = id; }, cards, dialog.videoId ); game.log(event.card, "亮出了", cards); }, content: function () { "step 0"; for (var i = 0; i < ui.dialogs.length; i++) { if (ui.dialogs[i].videoId == event.preResult) { event.dialog = ui.dialogs[i]; break; } } if (!event.dialog || event.dialog.buttons.length == 0) { event.finish(); return; } if (event.dialog.buttons.length > 1) { var next = target.chooseButton(true, function (button) { return get.value(button.link, _status.event.player); }); next.set("dialog", event.preResult); next.set("closeDialog", false); next.set("dialogdisplay", true); } else { event.directButton = event.dialog.buttons[0]; } "step 1"; var dialog = event.dialog; var card; if (event.directButton) { card = event.directButton.link; } else { for (var i of dialog.buttons) { if (i.link == result.links[0]) { card = i.link; break; } } if (!card) card = event.dialog.buttons[0].link; } var button; for (var i = 0; i < dialog.buttons.length; i++) { if (dialog.buttons[i].link == card) { button = dialog.buttons[i]; button.querySelector(".info").innerHTML = (function (target) { if (target._tempTranslate) return target._tempTranslate; var name = target.name; if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; return get.translation(name); })(target); dialog.buttons.remove(button); break; } } var capt = get.translation(target) + "选择了" + get.translation(button.link); if (card) { target.gain(card, "visible"); target.$gain2(card); game.broadcast( function (card, id, name, capt) { var dialog = get.idDialog(id); if (dialog) { dialog.content.firstChild.innerHTML = capt; for (var i = 0; i < dialog.buttons.length; i++) { if (dialog.buttons[i].link == card) { dialog.buttons[i].querySelector(".info").innerHTML = name; dialog.buttons.splice(i--, 1); break; } } } }, card, dialog.videoId, (function (target) { if (target._tempTranslate) return target._tempTranslate; var name = target.name; if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; return get.translation(name); })(target), capt ); } dialog.content.firstChild.innerHTML = capt; game.addVideo("dialogCapt", null, [dialog.videoId, dialog.content.firstChild.innerHTML]); game.log(target, "选择了", button.link); game.delay(); }, contentAfter: function () { for (var i = 0; i < ui.dialogs.length; i++) { if (ui.dialogs[i].videoId == event.preResult) { var dialog = ui.dialogs[i]; dialog.close(); _status.dieClose.remove(dialog); if (dialog.buttons.length) { event.remained = []; for (var i = 0; i < dialog.buttons.length; i++) { event.remained.push(dialog.buttons[i].link); } event.trigger("wuguRemained"); } break; } } game.broadcast(function (id) { var dialog = get.idDialog(id); if (dialog) { dialog.close(); _status.dieClose.remove(dialog); } }, event.preResult); game.addVideo("cardDialog", null, event.preResult); }, ai: { wuxie: function () { if (Math.random() < 0.5) return 0; }, basic: { order: 3, useful: 0.5, }, result: { target: function (player, target) { var sorter = _status.currentPhase || player; if (get.is.versus()) { if (target == sorter) return 1.5; return 1; } if (player.hasUnknown(2)) { return 0; } return (1 - get.distance(sorter, target, "absolute") / game.countPlayer()) * get.attitude(player, target) > 0 ? 0.5 : 0.7; }, }, tag: { draw: 1, multitarget: 1, }, }, }, taoyuan: { audio: true, fullskin: true, type: "trick", enable: true, selectTarget: -1, cardcolor: "red", reverseOrder: true, defaultYingbianEffect: "remove", filterTarget: function (card, player, target) { //return target.hp { if ( game.hasPlayer( (current) => current.hp <= 1 && get.recoverEffect(current, player, _status.event.player) < 0 ) ) return 1; return 10; }, useful: [3, 1], value: 0, }, result: { target: function (player, target) { return target.hp < target.maxHp ? 2 : 0; }, }, tag: { recover: 0.5, multitarget: 1, }, }, }, nanman: { audio: true, fullskin: true, type: "trick", enable: true, selectTarget: -1, defaultYingbianEffect: "remove", filterTarget: function (card, player, target) { return target != player; }, reverseOrder: true, content: function () { "step 0"; if (typeof event.shaRequired != "number" || !event.shaRequired || event.shaRequired < 0) event.shaRequired = 1; if (typeof event.baseDamage != "number") event.baseDamage = 1; "step 1"; if (event.directHit) event._result = { bool: false }; else { var next = target.chooseToRespond({ name: "sha" }); if (event.shaRequired > 1) { next.set("prompt2", "共需打出" + event.shaRequired + "张杀"); } next.set("ai", function (card) { var evt = _status.event.getParent(); if (get.damageEffect(evt.target, evt.player, evt.target) >= 0) return 0; if (evt.player.hasSkillTag("notricksource")) return 0; if (evt.target.hasSkillTag("notrick")) return 0; return get.order(card); }); next.autochoose = lib.filter.autoRespondSha; } "step 2"; if (result.bool == false) { target.damage(); } else { event.shaRequired--; if (event.shaRequired > 0) event.goto(1); } }, ai: { wuxie(target, card, player, viewer, status) { let att = get.attitude(viewer, target), eff = get.effect(target, card, player, target); if (Math.abs(att) < 1 || status * eff * att >= 0) return 0; let evt = _status.event.getParent("useCard"), pri = 1, bonus = player.hasSkillTag("damageBonus", true, { target: target, card: card, }), damage = 1, isZhu = function (tar) { return ( tar.isZhu || tar === game.boss || tar === game.trueZhu || tar === game.falseZhu ); }, canSha = function (tar, blur) { let known = tar.getKnownCards(viewer); if (!blur) return known.some((card) => { let name = get.name(card, tar); return ( (name === "sha" || name === "hufu" || name === "yuchanqian") && lib.filter.cardRespondable(card, tar) ); }); if ( tar.countCards("hs", (i) => !known.includes(i)) > 4.67 - (2 * tar.hp) / tar.maxHp ) return true; if (!tar.hasSkillTag("respondSha", true, "respond", true)) return false; if (tar.hp <= damage) return false; if (tar.hp <= damage + 1) return isZhu(tar); return true; }, self = false; if (canSha(target)) return 0; if ( bonus && !viewer.hasSkillTag("filterDamage", null, { player: player, card: card, }) ) damage = 2; if ( (viewer.hp <= damage || (viewer.hp <= damage + 1 && isZhu(viewer))) && !canSha(viewer) ) { if (viewer === target) return status; let fv = true; if (evt && evt.targets) for (let i of evt.targets) { if (fv) { if (target === i) fv = false; continue; } if (viewer == i) { if (isZhu(viewer)) return 0; self = true; break; } } } let maySha = canSha(target, true); if ( bonus && !target.hasSkillTag("filterDamage", null, { player: player, card: card, }) ) damage = 2; else damage = 1; if (isZhu(target)) { if (eff < 0) { if (target.hp <= damage + 1 || (!maySha && target.hp <= damage + 2)) return 1; if (maySha && target.hp > damage + 2) return 0; else if (maySha || target.hp > damage + 2) pri = 3; else pri = 4; } else if (target.hp > damage + 1) pri = 2; else return 0; } else if (self) return 0; else if (eff < 0) { if (!maySha && target.hp <= damage) pri = 5; else if (maySha) return 0; else if (target.hp > damage + 1) pri = 2; else if (target.hp === damage + 1) pri = 3; else pri = 4; } else if (target.hp <= damage) return 0; let find = false; if (evt && evt.targets) for (let i = 0; i < evt.targets.length; i++) { if (!find) { if (evt.targets[i] === target) find = true; continue; } let att1 = get.attitude(viewer, evt.targets[i]), eff1 = get.effect(evt.targets[i], card, player, evt.targets[i]), temp = 1; if (Math.abs(att1) < 1 || att1 * eff1 >= 0 || canSha(evt.targets[i])) continue; maySha = canSha(evt.targets[i], true); if ( bonus && !evt.targets[i].hasSkillTag("filterDamage", null, { player: player, card: card, }) ) damage = 2; else damage = 1; if (isZhu(evt.targets[i])) { if (eff1 < 0) { if ( evt.targets[i].hp <= damage + 1 || (!maySha && evt.targets[i].hp <= damage + 2) ) return 0; if (maySha && evt.targets[i].hp > damage + 2) continue; if (maySha || evt.targets[i].hp > damage + 2) temp = 3; else temp = 4; } else if (evt.targets[i].hp > damage + 1) temp = 2; else continue; } else if (eff1 < 0) { if (!maySha && evt.targets[i].hp <= damage) temp = 5; else if (maySha) continue; else if (evt.targets[i].hp > damage + 1) temp = 2; else if (evt.targets[i].hp === damage + 1) temp = 3; else temp = 4; } else if (evt.targets[i].hp > damage + 1) temp = 2; if (temp > pri) return 0; } return 1; }, basic: { order: 9, useful: [5, 1], value: 5, }, result: { player(player, target) { if (player._nanman_temp || player.hasSkillTag("jueqing", false, target)) return 0; player._nanman_temp = true; let eff = get.effect( target, new lib.element.VCard({ name: "nanman" }), player, target ); delete player._nanman_temp; if (eff >= 0) return 0; if ( target.hp > 2 || (target.hp > 1 && !target.isZhu && target != game.boss && target != game.trueZhu && target != game.falseZhu) ) return 0; if (target.hp > 1 && target.hasSkillTag("respondSha", true, "respond", true)) return 0; let known = target.getKnownCards(player); if ( known.some((card) => { let name = get.name(card, target); if (name === "sha" || name === "hufu" || name === "yuchanqian") return lib.filter.cardRespondable(card, target); if (name === "wuxie") return lib.filter.cardEnabled(card, target, "forceEnable"); }) ) return 0; if ( target.hp > 1 || target.countCards("hs", (i) => !known.includes(i)) > 4.67 - (2 * target.hp) / target.maxHp ) return 0; let res = 0, att = get.sgnAttitude(player, target); res -= att * (0.8 * target.countCards("hs") + 0.6 * target.countCards("e") + 3.6); if (get.mode() === "identity" && target.identity === "fan") res += 2.4; if ( (get.mode() === "guozhan" && player.identity !== "ye" && player.identity === target.identity) || (get.mode() === "identity" && player.identity === "zhu" && (target.identity === "zhong" || target.identity === "mingzhong")) ) res -= 0.8 * player.countCards("he"); return res; }, target(player, target) { let zhu = (get.mode() === "identity" && target.isZhu) || target.identity === "zhu"; if (!lib.filter.cardRespondable({ name: "sha" }, target)) { if (zhu) { if (target.hp < 2) return -99; if (target.hp === 2) return -3.6; } return -2; } let known = target.getKnownCards(player); if ( known.some((card) => { let name = get.name(card, target); if (name === "sha" || name === "hufu" || name === "yuchanqian") return lib.filter.cardRespondable(card, target); if (name === "wuxie") return lib.filter.cardEnabled(card, target, "forceEnable"); }) ) return -1.2; let nh = target.countCards("hs", (i) => !known.includes(i)); if (zhu && target.hp <= 1) { if (nh === 0) return -99; if (nh === 1) return -60; if (nh === 2) return -36; if (nh === 3) return -12; if (nh === 4) return -8; return -5; } if (target.hasSkillTag("respondSha", true, "respond", true)) return -1.35; if (!nh) return -2; if (nh === 1) return -1.8; return -1.5; }, }, tag: { respond: 1, respondSha: 1, damage: 1, multitarget: 1, multineg: 1, }, }, }, wanjian: { audio: true, fullskin: true, type: "trick", enable: true, selectTarget: -1, reverseOrder: true, defaultYingbianEffect: "remove", filterTarget: function (card, player, target) { return target != player; }, content: function () { "step 0"; if ( typeof event.shanRequired != "number" || !event.shanRequired || event.shanRequired < 0 ) event.shanRequired = 1; if (typeof event.baseDamage != "number") event.baseDamage = 1; "step 1"; if (event.directHit) event._result = { bool: false }; else { var next = target.chooseToRespond({ name: "shan" }); if (event.shanRequired > 1) { next.set("prompt2", "共需打出" + event.shanRequired + "张闪"); } next.set("ai", function (card) { var evt = _status.event.getParent(); if (get.damageEffect(evt.target, evt.player, evt.target) >= 0) return 0; if (evt.player.hasSkillTag("notricksource")) return 0; if (evt.target.hasSkillTag("notrick")) return 0; if (evt.target.hasSkillTag("noShan")) { return -1; } return get.order(card); }); next.autochoose = lib.filter.autoRespondShan; } "step 2"; if (result.bool == false) { target.damage(); } else { event.shanRequired--; if (event.shanRequired > 0) event.goto(1); } }, ai: { wuxie(target, card, player, viewer, status) { let att = get.attitude(viewer, target), eff = get.effect(target, card, player, target); if (Math.abs(att) < 1 || status * eff * att >= 0) return 0; let evt = _status.event.getParent("useCard"), pri = 1, bonus = player.hasSkillTag("damageBonus", true, { target: target, card: card, }), damage = 1, isZhu = function (tar) { return ( tar.isZhu || tar === game.boss || tar === game.trueZhu || tar === game.falseZhu ); }, canShan = function (tar, blur) { let known = tar.getKnownCards(viewer); if (!blur) return known.some((card) => { let name = get.name(card, tar); return ( (name === "shan" || name === "hufu") && lib.filter.cardRespondable(card, tar) ); }); if ( tar.countCards("hs", (i) => !known.includes(i)) > 3.67 - (2 * tar.hp) / tar.maxHp ) return true; if (!tar.hasSkillTag("respondShan", true, "respond", true)) return false; if (tar.hp <= damage) return false; if (tar.hp <= damage + 1) return isZhu(tar); return true; }, self = false; if (canShan(target)) return 0; if ( bonus && !viewer.hasSkillTag("filterDamage", null, { player: player, card: card, }) ) damage = 2; if ( (viewer.hp <= damage || (viewer.hp <= damage + 1 && isZhu(viewer))) && !canShan(viewer) ) { if (viewer === target) return status; let fv = true; if (evt && evt.targets) for (let i of evt.targets) { if (fv) { if (target === i) fv = false; continue; } if (viewer == i) { if (isZhu(viewer)) return 0; self = true; break; } } } let mayShan = canShan(target, true); if ( bonus && !target.hasSkillTag("filterDamage", null, { player: player, card: card, }) ) damage = 2; else damage = 1; if (isZhu(target)) { if (eff < 0) { if (target.hp <= damage + 1 || (!mayShan && target.hp <= damage + 2)) return 1; if (mayShan && target.hp > damage + 2) return 0; else if (mayShan || target.hp > damage + 2) pri = 3; else pri = 4; } else if (target.hp > damage + 1) pri = 2; else return 0; } else if (self) return 0; else if (eff < 0) { if (!mayShan && target.hp <= damage) pri = 5; else if (mayShan) return 0; else if (target.hp > damage + 1) pri = 2; else if (target.hp === damage + 1) pri = 3; else pri = 4; } else if (target.hp <= damage) return 0; let find = false; if (evt && evt.targets) for (let i = 0; i < evt.targets.length; i++) { if (!find) { if (evt.targets[i] === target) find = true; continue; } let att1 = get.attitude(viewer, evt.targets[i]), eff1 = get.effect(evt.targets[i], card, player, evt.targets[i]), temp = 1; if (Math.abs(att1) < 1 || att1 * eff1 >= 0 || canShan(evt.targets[i])) continue; mayShan = canShan(evt.targets[i], true); if ( bonus && !evt.targets[i].hasSkillTag("filterDamage", null, { player: player, card: card, }) ) damage = 2; else damage = 1; if (isZhu(evt.targets[i])) { if (eff1 < 0) { if ( evt.targets[i].hp <= damage + 1 || (!mayShan && evt.targets[i].hp <= damage + 2) ) return 0; if (mayShan && evt.targets[i].hp > damage + 2) continue; if (mayShan || evt.targets[i].hp > damage + 2) temp = 3; else temp = 4; } else if (evt.targets[i].hp > damage + 1) temp = 2; else continue; } else if (eff1 < 0) { if (!mayShan && evt.targets[i].hp <= damage) temp = 5; else if (mayShan) continue; else if (evt.targets[i].hp > damage + 1) temp = 2; else if (evt.targets[i].hp === damage + 1) temp = 3; else temp = 4; } else if (evt.targets[i].hp > damage + 1) temp = 2; if (temp > pri) return 0; } return 1; }, basic: { order: 9, useful: 1, value: 5, }, result: { player(player, target) { if (player._wanjian_temp || player.hasSkillTag("jueqing", false, target)) return 0; player._wanjian_temp = true; let eff = get.effect( target, new lib.element.VCard({ name: "wanjian" }), player, target ); delete player._wanjian_temp; if (eff >= 0) return 0; if ( target.hp > 2 || (target.hp > 1 && !target.isZhu && target != game.boss && target != game.trueZhu && target != game.falseZhu) ) return 0; if (target.hp > 1 && target.hasSkillTag("respondShan", true, "respond", true)) return 0; let known = target.getKnownCards(player); if ( known.some((card) => { let name = get.name(card, target); if (name === "shan" || name === "hufu") return lib.filter.cardRespondable(card, target); if (name === "wuxie") return lib.filter.cardEnabled(card, target, "forceEnable"); }) ) return 0; if ( target.hp > 1 || target.countCards("hs", (i) => !known.includes(i)) > 3.67 - (2 * target.hp) / target.maxHp ) return 0; let res = 0, att = get.sgnAttitude(player, target); res -= att * (0.8 * target.countCards("hs") + 0.6 * target.countCards("e") + 3.6); if (get.mode() === "identity" && target.identity === "fan") res += 2.4; if ( (get.mode() === "guozhan" && player.identity !== "ye" && player.identity === target.identity) || (get.mode() === "identity" && player.identity === "zhu" && (target.identity === "zhong" || target.identity === "mingzhong")) ) res -= 0.8 * player.countCards("he"); return res; }, target(player, target) { let zhu = (get.mode() === "identity" && target.isZhu) || target.identity === "zhu"; if (!lib.filter.cardRespondable({ name: "shan" }, target)) { if (zhu) { if (target.hp < 2) return -99; if (target.hp === 2) return -3.6; } return -2; } let known = target.getKnownCards(player); if ( known.some((card) => { let name = get.name(card, target); if (name === "shan" || name === "hufu") return lib.filter.cardRespondable(card, target); if (name === "wuxie") return lib.filter.cardEnabled(card, target, "forceEnable"); }) ) return -1.2; let nh = target.countCards("hs", (i) => !known.includes(i)); if (zhu && target.hp <= 1) { if (nh === 0) return -99; if (nh === 1) return -60; if (nh === 2) return -36; if (nh === 3) return -8; return -5; } if (target.hasSkillTag("respondShan", true, "respond", true)) return -1.35; if (!nh) return -2; if (nh === 1) return -1.65; return -1.5; }, }, tag: { respond: 1, respondShan: 1, damage: 1, multitarget: 1, multineg: 1, }, }, }, wuzhong: { audio: true, fullskin: true, type: "trick", enable: true, selectTarget: -1, cardcolor: "red", toself: true, filterTarget: function (card, player, target) { return target == player; }, modTarget: true, content: function () { if (get.is.versus()) { if (game.friend.includes(target)) { if (game.friend.length < game.enemy.length) { target.draw(3); return; } } else { if (game.friend.length > game.enemy.length) { target.draw(3); return; } } } target.draw(2); }, ai: { wuxie: function (target, card, player, viewer) { if (get.mode() == "guozhan") { if (!_status._aozhan) { if (!player.isMajor()) { if (!viewer.isMajor()) return 0; } } } }, basic: { order: 7.2, useful: 4.5, value: 9.2, }, result: { target: 2, }, tag: { draw: 2, }, }, }, juedou: { audio: true, fullskin: true, type: "trick", enable: true, defaultYingbianEffect: "hit", filterTarget: function (card, player, target) { return target != player; }, content: function () { "step 0"; if (event.turn == undefined) event.turn = target; if (typeof event.baseDamage != "number") event.baseDamage = 1; if (typeof event.extraDamage != "number") { event.extraDamage = 0; } if (!event.shaReq) event.shaReq = {}; if (typeof event.shaReq[player.playerid] != "number") event.shaReq[player.playerid] = 1; if (typeof event.shaReq[target.playerid] != "number") event.shaReq[target.playerid] = 1; event.playerCards = []; event.targetCards = []; "step 1"; event.trigger("juedou"); event.shaRequired = event.shaReq[event.turn.playerid]; "step 2"; if (event.directHit) { event._result = { bool: false }; } else { var next = event.turn.chooseToRespond({ name: "sha" }); if (event.shaRequired > 1) next.set("prompt2", "共需打出" + event.shaRequired + "张杀"); next.set("ai", function (card) { let event = _status.event, player = event.splayer, target = event.starget; if (player.hasSkillTag("notricksource") || target.hasSkillTag("notrick")) return 0; if (event.shaRequired > 1 && player.countCards("h", "sha") < event.shaRequired) return 0; if (event.player === target) { if (_status.event.tdamage >= 0 || player.hasSkill("naman")) return -1; if ( get.attitude(target, player) <= 0 || (event.player.hp <= 1 && _status.event.tdamage < _status.event.pdamage) ) { return get.order(card); } return -1; } else { if (_status.event.pdamage >= 0 || target.hasSkill("naman")) return -1; if ( get.attitude(player, target) <= 0 || (event.player.hp <= 1 && _status.event.tdamage > _status.event.pdamage) ) { return get.order(card); } return -1; } }); next.set("splayer", player); next.set("starget", target); next.set("pdamage", get.damageEffect(player, target, event.turn)); next.set("tdamage", get.damageEffect(target, player, event.turn)); next.set("shaRequired", event.shaRequired); next.autochoose = lib.filter.autoRespondSha; if (event.turn == target) { next.source = player; } else { next.source = target; } } "step 3"; if (result.bool) { event.shaRequired--; if (event.turn == target) { if (result.cards) event.targetCards.addArray(result.cards); if (event.shaRequired > 0) event.goto(2); else { event.turn = player; event.goto(1); } } else { if (result.cards) event.playerCards.addArray(result.cards); if (event.shaRequired > 0) event.goto(2); else { event.turn = target; event.goto(1); } } } else { if (event.turn == target) { target.damage(); } else { player.damage(target); } } event._result = {}; }, ai: { wuxie: function (target, card, player, viewer, status) { if (player === game.me && get.attitude(viewer, player._trueMe || player) > 0) return 0; if ( status * get.attitude(viewer, target) * get.effect(target, card, player, target) >= 0 ) return 0; }, basic: { order: 5, useful: 1, value: 5.5, }, result: { player(player, target, card) { if ( player.hasSkillTag( "directHit_ai", true, { target: target, card: card, }, true ) ) return 0; if (get.damageEffect(target, player, target) >= 0) return 0; let pd = get.damageEffect(player, target, player), att = get.attitude(player, target); if (att > 0 && get.damageEffect(target, player, player) > pd) return 0; let ts = target.mayHaveSha(player, "respond", null, "count"), ps = player.mayHaveSha( player, "respond", player.getCards("h", (i) => { return ( card === i || (card.cards && card.cards.includes(i)) || ui.selected.cards.includes(i) ); }), "count" ); if (ts < 1 && ts << 3 < Math.pow(player.hp, 2)) return 0; if (att > 0) { if (ts < 1) return 0; return -2; } if (ts - ps + Math.exp(0.8 - player.hp) < 1) return -ts; if (pd >= 0) return pd / get.attitude(player, player); return -2 - ts; }, target(player, target, card) { if ( player.hasSkillTag( "directHit_ai", true, { target: target, card: card, }, true ) ) return -2; let td = get.damageEffect(target, player, target); if (td >= 0) return td / get.attitude(target, target); let pd = get.damageEffect(player, target, player), att = get.attitude(player, target); if (att > 0 && get.damageEffect(target, player, player) > pd) return -2; let ts = target.mayHaveSha(player, "respond", null, "count"), ps = player.mayHaveSha( player, "respond", player.getCards("h", (i) => { return ( card === i || (card.cards && card.cards.includes(i)) || ui.selected.cards.includes(i) ); }), "count" ); if (ts < 1) return -1.5; if (att > 0) return -2; if (ts - ps < 1) return -2 - ts; if (pd >= 0) return -1; return -ts; }, }, tag: { respond: 2, respondSha: 2, damage: 1, }, }, }, shunshou: { audio: true, fullskin: true, type: "trick", enable: true, range: { global: 1 }, selectTarget: 1, postAi: function (targets) { return targets.length == 1 && targets[0].countCards("j"); }, filterTarget: function (card, player, target) { if (player == target) return false; return target.hasCard( (card) => lib.filter.canBeGained(card, player, target), get.is.single() ? "he" : "hej" ); }, content: function () { let pos = get.is.single() ? "he" : "hej"; if (target.countGainableCards(player, pos)) player .gainPlayerCard(pos, target, true) .set("target", target) .set("complexSelect", false) .set("ai", lib.card.shunshou.ai.button); }, ai: { wuxie: function (target, card, player, viewer) { if (get.attitude(viewer, player._trueMe || player) > 0) return 0; }, basic: { order: 7.5, useful: (card, i) => 8 / (3 + i), value: (card, player) => { let max = 0; game.countPlayer((cur) => { max = Math.max( max, lib.card.shunshou.ai.result.target(player, cur) * get.attitude(player, cur) ); }); if (max <= 0) return 2; return 0.53 * max; }, }, button: (button) => { let player = _status.event.player, target = _status.event.target; if (!lib.filter.canBeGained(button.link, player, target)) return 0; let att = get.attitude(player, target), val = get.value(button.link, player) / 60, btv = get.buttonValue(button), pos = get.position(button.link), name = get.name(button.link); if (pos == "j") { if (name == "lebu") { let needs = target.needsToDiscard(2); btv *= 1.08 + 0.2 * needs; } else if (name == "shandian" || name == "fulei" || name == "plague") btv /= 2; } if (get.attitude(player, get.owner(button.link)) > 0) btv = -btv; if (pos != "e") { if (pos == "h" && !player.hasSkillTag("viewHandcard", null, target, true)) return btv + 0.1; return btv + val; } let sub = get.subtype(button.link); if (sub == "equip1") return (btv * Math.min(3.6, target.hp)) / 3; if (sub == "equip2") { if (name == "baiyin" && pos == "e" && target.isDamaged()) { let by = 3 - 0.6 * Math.min(5, target.hp); return get.sgn(get.recoverEffect(target, player, player)) * by; } return 1.57 * btv + val; } if ( att <= 0 && (sub == "equip3" || sub == "equip4") && (player.hasSkill("shouli") || player.hasSkill("psshouli")) ) return 0; if ( sub == "equip3" && !game.hasPlayer((cur) => !cur.inRange(target) && get.attitude(cur, target) < 0) ) return 0.4 * btv + val; if (sub == "equip4") return btv / 2 + val; return btv + val; }, result: { player: function (player, target) { let att = get.attitude(player, target), hs = target.hasCard( (card) => lib.filter.canBeGained(card, player, target), "h" ), lose = hs, gain = att > 0 ? 0.52 : 1.28; if (Math.abs(att) < 5.03) { let temp = 0.015 * att * att; if (att < 0) gain = 0.9 + temp; else gain = 0.9 - temp; } target.countCards("e", function (card) { if ( card.name != "jinhe" && lib.filter.canBeGained(card, player, target) && att * get.value(card, target) < 0 ) { lose = true; let val = get.value(card, player); if (val > 0) gain = Math.max(gain, val / 7); } }); target.countCards("j", function (card) { let cardj = card.viewAs ? new lib.element.VCard({ name: card.viewAs }) : card; if ( lib.filter.canBeGained(card, player, target) && att * get.effect(target, cardj, target, target) < 0 ) { lose = true; if (cardj.name == "lebu") { let needs = target.needsToDiscard(2); if (att > 0) gain = Math.max(gain, 1.6 + needs / 10); } else if ( cardj.name == "shandian" || cardj.name == "fulei" || cardj.name == "plague" ) gain = Math.max(gain, 1.5 / Math.max(1, target.hp)); else if (att > 0) gain = Math.max(gain, 1.7); } }); if (!lose) return 0; return gain; }, target: function (player, target) { let att = get.attitude(player, target), hs = target.countCards("h", (card) => lib.filter.canBeGained(card, player, target) ), es = target.countCards("e", (card) => lib.filter.canBeGained(card, player, target) ), js = target.countCards("j", (card) => lib.filter.canBeGained(card, player, target) ), noh = !hs || target.hasSkillTag("noh"), noe = !es || target.hasSkillTag("noe"), check = [-1, att > 0 ? -1.3 : 1.3, att > 0 ? -2.5 : 2.5], idx = -1; if (hs) { idx = 0; if (noh) check[0] = 0.7; } if (es) { if (idx < 0) idx = 1; if ( target.getEquip("baiyin") && target.isDamaged() && lib.filter.canBeGained(target.getEquip("baiyin"), player, target) ) { let rec = get.recoverEffect(target, player, target); if (es == 1 || att * rec > 0) { let val = 3 - 0.6 * Math.min(5, target.hp); if (rec > 0) check[1] = val; else if (rec < 0) check[1] = -val; } } target.countCards("e", function (card) { let val = get.value(card, target); if ( card.name == "jinhe" || att * val >= 0 || !lib.filter.canBeGained(card, player, target) ) return false; if (att > 0) { check[1] = Math.max(1.3, check[1]); return true; } let sub = get.subtype(card); if (sub == "equip2" || sub == "equip5") val += 4; else if (sub == "equip1") val *= 0.4 * Math.min(3.6, target.hp); else val *= 0.6; if (target.hp < 3 && sub != "equip2" && sub != "equip5") val *= 0.4; check[1] = Math.min(-0.16 * val, check[1]); }); if (noe) check[1] += 0.9; } if (js) { let func = function (num) { if (att > 0) check[2] = Math.max(check[2], num); else check[2] = Math.min(check[2], 0.6 - num); }; if (idx < 0) idx = 2; target.countCards("j", function (card) { let cardj = card.viewAs ? new lib.element.VCard({ name: card.viewAs }) : card; if ( !lib.filter.canBeGained(card, player, target) || att * get.effect(target, cardj, target, target) >= 0 ) return false; if (cardj.name == "lebu") func(2.1 + 0.4 * target.needsToDiscard(2)); else if (cardj.name == "bingliang") func(2.4); else if ( cardj.name == "shandian" || cardj.name == "fulei" || cardj.name == "plague" ) func(Math.abs(check[2]) / (1 + target.hp)); else func(2.1); }); } if (idx < 0) return 0; for (let i = idx + 1; i < 3; i++) { if ((i == 1 && !es) || (i == 2 && !js)) continue; if ((att > 0 && check[i] > check[idx]) || (att <= 0 && check[i] < check[idx])) idx = i; } return check[idx]; }, }, tag: { loseCard: 1, gain: 1, }, }, }, shunshou_copy: { ai: { basic: { order: 7.5, useful: 4, value: 9, }, result: { target: function (player, target, card) { let position = "hej"; if (card && card.position) position = card.position; const hs = position.includes("h") ? target.getGainableCards(player, "h") : []; const es = position.includes("e") ? target.getGainableCards(player, "e") : []; const js = position.includes("j") ? target.getGainableCards(player, "j") : []; if (get.attitude(player, target) <= 0) { if (hs.length > 0) return -1.5; return es.some((card) => { return get.value(card, target) > 0 && card != target.getEquip("jinhe"); }) || js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; return get.effect(target, cardj, target, player) < 0; }) ? -1.5 : 1.5; } return es.some((card) => { return get.value(card, target) <= 0; }) || js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; return get.effect(target, cardj, target, player) < 0; }) ? 1.5 : -1.5; }, player: function (player, target, card) { let position = "hej"; if (card && card.position) position = card.position; const hs = position.includes("h") ? target.getGainableCards(player, "h") : []; const es = position.includes("e") ? target.getGainableCards(player, "e") : []; const js = position.includes("j") ? target.getGainableCards(player, "j") : []; const att = get.attitude(player, target); if (att < 0) { if ( !hs.length && !es.some((card) => { return ( get.value(card, target) > 0 && card != target.getEquip("jinhe") ); }) && !js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; return get.effect(target, cardj, target, player) < 0; }) ) return 0; } else if (att > 1) { return es.some((card) => { return get.value(card, target) <= 0; }) || js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; return get.effect(target, cardj, target, player) < 0; }) ? 1.5 : 0; } return 1; }, }, tag: { loseCard: 1, gain: 1, }, }, }, shunshou_copy2: { ai: { basic: { order: 7.5, useful: 4, value: 9, }, result: { target: function (player, target, card, isLink) { return lib.card.shunshou_copy.ai.result.target( player, target, { name: "shunshou_copy", position: "he", }, isLink ); }, player: function (player, target, card, isLink) { return lib.card.shunshou_copy.ai.result.player( player, target, { name: "shunshou_copy", position: "he", }, isLink ); }, }, tag: { loseCard: 1, gain: 1, }, }, }, guohe: { audio: true, fullskin: true, type: "trick", enable: true, selectTarget: 1, postAi: function (targets) { return targets.length == 1 && targets[0].countCards("j"); }, filterTarget: function (card, player, target) { if (player == target) return false; return target.hasCard( (card) => lib.filter.canBeDiscarded(card, player, target), get.is.single() ? "he" : "hej" ); }, defaultYingbianEffect: "add", content: function () { "step 0"; if (get.is.single()) { let bool1 = target.countDiscardableCards(player, "h"), bool2 = target.countDiscardableCards(player, "e"); if (bool1 && bool2) player .chooseControl("手牌区", "装备区") .set("ai", function () { return Math.random() < 0.5 ? 1 : 0; }) .set( "prompt", "弃置" + get.translation(target) + "装备区的一张牌,或观看其手牌并弃置其中的一张牌。" ); else event._result = { control: bool1 ? "手牌区" : "装备区" }; } else event._result = { control: "所有区域" }; "step 1"; let pos, vis = "visible"; if (result.control == "手牌区") pos = "h"; else if (result.control == "装备区") pos = "e"; else { pos = "hej"; vis = undefined; } if (target.countDiscardableCards(player, pos)) player .discardPlayerCard(pos, target, true, vis) .set("target", target) .set("complexSelect", false) .set("ai", lib.card.guohe.ai.button); }, ai: { wuxie: (target, card, player, viewer, status) => { if ( status * get.attitude(viewer, player._trueMe || player) > 0 || (target.hp > 2 && !target.hasCard((i) => { let val = get.value(i, target), subtypes = get.subtypes(i); if ( val < 8 && target.hp < 2 && !subtypes.includes("equip2") && !subtypes.includes("equip5") ) return false; return val > 3 + Math.min(5, target.hp); }, "e") && target.countCards("h") * _status.event.getRand("guohe_wuxie") > 1.57) ) return 0; }, basic: { order: 9, useful: (card, i) => 10 / (3 + i), value: (card, player) => { let max = 0; game.countPlayer((cur) => { max = Math.max( max, lib.card.guohe.ai.result.target(player, cur) * get.attitude(player, cur) ); }); if (max <= 0) return 5; return 0.42 * max; }, }, yingbian: function (card, player, targets, viewer) { if (get.attitude(viewer, player) <= 0) return 0; if ( game.hasPlayer(function (current) { return ( !targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && get.effect(current, card, player, player) > 0 ); }) ) return 6; return 0; }, button: (button) => { let player = _status.event.player, target = _status.event.target; if (!lib.filter.canBeDiscarded(button.link, player, target)) return 0; let att = get.attitude(player, target), val = get.buttonValue(button), pos = get.position(button.link), name = get.name(button.link); if (pos === "j") { if (name === "lebu") { let needs = target.needsToDiscard(2); val *= 1.08 + 0.2 * needs; } else if (name == "shandian" || name == "fulei" || name == "plague") val /= 2; } if (get.attitude(player, get.owner(button.link)) > 0) val = -val; if (pos !== "e") return val; let sub = get.subtypes(button.link); if (sub.includes("equip1")) return (val * Math.min(3.6, target.hp)) / 3; if (sub.includes("equip2")) { if (name === "baiyin" && pos === "e" && target.isDamaged()) { let by = 3 - 0.6 * Math.min(5, target.hp); return get.sgn(get.recoverEffect(target, player, player)) * by; } return 1.57 * val; } if ( att <= 0 && (sub.includes("equip3") || sub.includes("equip4")) && (player.hasSkill("shouli") || player.hasSkill("psshouli")) ) return 0; if (sub.includes("equip6")) return val; if (sub.includes("equip4")) return val / 2; if ( sub.includes("equip3") && !game.hasPlayer((cur) => { return !cur.inRange(target) && get.attitude(cur, target) < 0; }) ) return 0.4 * val; return val; }, result: { target: function (player, target) { let att = get.attitude(player, target), hs = target.countCards("h", (card) => lib.filter.canBeDiscarded(card, player, target) ), es = target.countCards("e", (card) => lib.filter.canBeDiscarded(card, player, target) ), js = target.countCards("j", (card) => lib.filter.canBeDiscarded(card, player, target) ), noh = !hs || target.hasSkillTag("noh"), noe = !es || target.hasSkillTag("noe"), check = [-1, att > 0 ? -1.3 : 1.3, att > 0 ? -2.5 : 2.5], idx = -1; if (hs) { idx = 0; if (noh) check[0] = 0.7; } if (es) { if (idx < 0) idx = 1; if ( target.getEquip("baiyin") && target.isDamaged() && lib.filter.canBeDiscarded(target.getEquip("baiyin"), player, target) ) { let rec = get.recoverEffect(target, player, target); if (es == 1 || att * rec > 0) { let val = 3 - 0.6 * Math.min(5, target.hp); if (rec > 0) check[1] = val; else if (rec < 0) check[1] = -val; } } target.countCards("e", function (card) { let val = get.value(card, target); if ( card.name == "jinhe" || att * val >= 0 || !lib.filter.canBeDiscarded(card, player, target) ) return false; if (att > 0) { check[1] = Math.max(1.3, check[1]); return true; } let sub = get.subtype(card); if (sub == "equip2" || sub == "equip5") val += 4; else if (sub == "equip1") val *= 0.4 * Math.min(3.6, target.hp); else val *= 0.6; if (target.hp < 3 && sub != "equip2" && sub != "equip5") val *= 0.4; check[1] = Math.min(-0.16 * val, check[1]); }); if (noe) check[1] += 0.9; } if (js) { let func = function (num) { if (att > 0) check[2] = Math.max(check[2], num); else check[2] = Math.min(check[2], 0.6 - num); }; if (idx < 0) idx = 2; target.countCards("j", function (card) { let cardj = card.viewAs ? new lib.element.VCard({ name: card.viewAs }) : card; if ( !lib.filter.canBeDiscarded(card, player, target) || att * get.effect(target, cardj, target, target) >= 0 ) return false; if (cardj.name == "lebu") func(2.1 + 0.4 * target.needsToDiscard(2)); else if (cardj.name == "bingliang") func(2.4); else if ( cardj.name == "shandian" || cardj.name == "fulei" || cardj.name == "plague" ) func(Math.abs(check[2]) / (1 + target.hp)); else func(2.1); }); } if (idx < 0) return 0; for (let i = idx + 1; i < 3; i++) { if ((i == 1 && !es) || (i == 2 && !js)) continue; if ((att > 0 && check[i] > check[idx]) || (att <= 0 && check[i] < check[idx])) idx = i; } return check[idx]; }, }, tag: { loseCard: 1, discard: 1, }, }, }, guohe_copy: { ai: { basic: { order: 9, useful: 5, value: 5, }, result: { target: function (player, target, card) { let position = "hej"; if (card && card.position) position = card.position; const att = get.attitude(player, target); const hs = position.includes("h") ? target.getDiscardableCards(player, "h") : []; const es = position.includes("e") ? target.getDiscardableCards(player, "e") : []; const js = position.includes("j") ? target.getDiscardableCards(player, "j") : []; if (!hs.length && !es.length && !js.length) return 0; if (att > 0) { if ( js.some((card) => { const cardj = card.viewAs ? { name: card.viewAs } : card; return get.effect(target, cardj, target, player) < 0; }) ) return 3; if ( target.isDamaged() && es.some((card) => card.name == "baiyin") && get.recoverEffect(target, player, player) > 0 ) { if (target.hp == 1 && !target.hujia) return 1.6; } if ( es.some((card) => { return get.value(card, target) < 0; }) ) return 1; return -1.5; } else { const noh = hs.length == 0 || target.hasSkillTag("noh"); const noe = es.length == 0 || target.hasSkillTag("noe"); const noe2 = noe || !es.some((card) => { return get.value(card, target) > 0; }); const noj = js.length == 0 || !js.some((card) => { const cardj = card.viewAs ? { name: card.viewAs } : card; return get.effect(target, cardj, target, player) < 0; }); if (noh && noe2 && noj) return 1.5; return -1.5; } }, }, tag: { loseCard: 1, discard: 1, }, }, }, guohe_copy2: { ai: { basic: { order: 9, useful: 5, value: 5, }, result: { target: function (player, target, card, isLink) { return lib.card.guohe_copy.ai.result.target( player, target, { name: "guohe_copy", position: "he", }, isLink ); }, }, tag: { loseCard: 1, discard: 1, }, }, }, jiedao: { audio: true, fullskin: true, type: "trick", enable: true, singleCard: true, targetprompt: ["被借刀", "出杀目标"], complexSelect: true, complexTarget: true, multicheck: function () { var card = { name: "sha", isCard: true }; return game.hasPlayer(function (current) { if (current.getEquips(1).length > 0) { return game.hasPlayer(function (current2) { return ( current.inRange(current2) && lib.filter.targetEnabled(card, current, current2) ); }); } }); }, filterTarget: function (card, player, target) { var card = { name: "sha", isCard: true }; return ( player != target && target.getEquips(1).length > 0 && game.hasPlayer(function (current) { return ( target != current && target.inRange(current) && lib.filter.targetEnabled(card, target, current) ); }) ); }, filterAddedTarget: function (card, player, target, preTarget) { var card = { name: "sha", isCard: true }; return ( target != preTarget && preTarget.inRange(target) && lib.filter.targetEnabled(card, preTarget, target) ); }, content: function () { "step 0"; if ( event.directHit || !event.addedTarget || (!_status.connectMode && lib.config.skip_shan && !target.hasSha()) ) { event.directfalse = true; } else { target .chooseToUse( "对" + get.translation(event.addedTarget) + "使用一张杀,或令" + get.translation(player) + "获得你的武器牌", function (card, player) { if (get.name(card) != "sha") return false; return lib.filter.filterCard.apply(this, arguments); } ) .set("targetRequired", true) .set("complexSelect", true) .set("filterTarget", function (card, player, target) { if ( target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex) ) return false; return lib.filter.filterTarget.apply(this, arguments); }) .set("sourcex", event.addedTarget) .set("addCount", false) .set("respondTo", [player, card]); } "step 1"; if (event.directfalse || result.bool == false) { var cards = target.getEquips(1); if (cards.length) player.gain(cards, target, "give", "bySelf"); } }, ai: { wuxie: function (target, card, player, viewer) { if (player == game.me && get.attitude(viewer, player._trueMe || player) > 0) return 0; }, basic: { order: 8, value: 2, useful: 1, }, result: { player: (player, target) => { if (!target.hasSkillTag("noe") && get.attitude(player, target) > 0) return 0; return ( (player.hasSkillTag("noe") ? 0.32 : 0.15) * target.getEquips(1).reduce((num, i) => { return num + get.value(i, player); }, 0) ); }, target: (player, target, card) => { let targets = [].concat(ui.selected.targets); if (_status.event.preTarget) targets.add(_status.event.preTarget); if (targets.length) { let preTarget = targets.lastItem, pre = _status.event.getTempCache("jiedao_result", preTarget.playerid); if (pre && pre.card === card && pre.target.isIn()) return target === pre.target ? pre.eff : 0; return ( get.effect(target, { name: "sha" }, preTarget, player) / get.attitude(player, target) ); } let arms = (target.hasSkillTag("noe") ? 0.32 : -0.15) * target.getEquips(1).reduce((num, i) => { return num + get.value(i, target); }, 0); if (!target.mayHaveSha(player, "use")) return arms; let sha = game.filterPlayer(get.info({ name: "jiedao" }).filterAddedTarget), addTar = null; sha = sha.reduce((num, current) => { let eff = get.effect(current, { name: "sha" }, target, player); if (eff <= num) return num; addTar = current; return eff; }, -100); if (!addTar) return arms; sha /= get.attitude(player, target); _status.event.putTempCache("jiedao_result", target.playerid, { card: card, target: addTar, eff: sha, }); return Math.max(arms, sha); }, }, tag: { gain: 1, use: 1, useSha: 1, loseCard: 1, }, }, }, wuxie: { audio: true, fullskin: true, type: "trick", ai: { basic: { useful: [6, 4, 3], value: [6, 4, 3], }, result: { player: 1 }, expose: 0.2, }, notarget: true, finalDelay: false, defaultYingbianEffect: "draw", contentBefore: function () { "step 0"; if (get.mode() == "guozhan" && get.cardtag(card, "guo")) { var trigger = event.getParent(2)._trigger; if ( trigger.name != "phaseJudge" && trigger.card.name != "wuxie" && trigger.targets.length > 1 ) { player .chooseControl("对单体使用", "对势力使用") .set("prompt", "请选择" + get.translation(card) + "的使用方式") .set("ai", function () { return "对势力使用"; }); } else event.finish(); } else event.finish(); "step 1"; if (result.control == "对势力使用") { player.chat("对势力使用"); event.getParent().guowuxie = true; } }, content: function () { var trigger = event.getParent(2)._trigger; if (trigger.name == "phaseJudge") { trigger.untrigger("currentOnly"); trigger.cancelled = true; } else { trigger.neutralize(); if (event.getParent().guowuxie == true) { trigger.getParent().excluded.addArray( game.filterPlayer(function (current) { return current.isFriendOf(trigger.target); }) ); } } /* event.result={ wuxied:true, directHit:evt.directHit||[], nowuxie:evt.nowuxie, };*/ if (player.isOnline()) { player.send(function (player) { if (ui.tempnowuxie && !player.hasWuxie()) { ui.tempnowuxie.close(); delete ui.tempnowuxie; } }, player); } else if (player == game.me) { if (ui.tempnowuxie && !player.hasWuxie()) { ui.tempnowuxie.close(); delete ui.tempnowuxie; } } }, }, lebu: { audio: true, fullskin: true, type: "delay", filterTarget: function (card, player, target) { return lib.filter.judge(card, player, target) && player != target; }, judge: function (card) { if (get.suit(card) == "heart") return 1; return -2; }, judge2: function (result) { if (result.bool == false) return true; return false; }, effect: function () { if (result.bool == false) { player.skip("phaseUse"); } }, ai: { basic: { order: 1, useful: 1, value: 8, }, result: { ignoreStatus: true, target: (player, target) => { if (target === _status.currentPhase && target.skipList.includes("phaseUse")) { let evt = _status.event.getParent("phase"); if (evt && evt.phaseList.indexOf("phaseJudge") <= evt.num) return 0; } let num = target.needsToDiscard(3), cf = Math.pow(get.threaten(target, player), 2); if (!num) return -0.01 * cf; if (target.hp > 2) num--; let dist = Math.sqrt(get.distance(player, target, "absolute")); if (dist < 1) dist = 1; if (target.isTurnedOver()) dist++; return (Math.min(-0.1, -num) * cf) / dist; }, }, tag: { skip: "phaseUse", }, }, }, shandian: { audio: true, fullskin: true, type: "delay", cardnature: "thunder", modTarget: function (card, player, target) { return lib.filter.judge(card, player, target); }, enable: function (card, player) { return player.canAddJudge(card); }, filterTarget: function (card, player, target) { return lib.filter.judge(card, player, target) && player == target; }, selectTarget: [-1, -1], toself: true, judge: function (card) { if (get.suit(card) == "spade" && get.number(card) > 1 && get.number(card) < 10) return -5; return 1; }, judge2: function (result) { if (result.bool == false) return true; return false; }, effect: function () { if (result.bool == false) { player.damage(3, "thunder", "nosource"); } else { player.addJudgeNext(card); } }, cancel: function () { player.addJudgeNext(card); }, ai: { basic: { order: 1, useful: 0, value: 0, }, result: { target: function (player, target) { var num = game.countPlayer(function (current) { //var skills=current.getSkills(); for (var j = 0; j < current.skills.length; j++) { var rejudge = get.tag(current.skills[j], "rejudge", current); if (rejudge != undefined) { if ( get.attitude(target, current) > 0 && get.attitude(current, target) > 0 ) { return rejudge; } else { return -rejudge; } } } }); if (num > 0) return num; if (num == 0) { var mode = get.mode(); if (mode == "identity") { if (target.identity == "nei") return 1; var situ = get.situation(); if (target.identity == "fan") { if (situ > 1) return 1; } else { if (situ < -1) return 1; } } else if (mode == "guozhan") { if (target.identity == "ye") return 1; if ( game.hasPlayer(function (current) { return current.identity == "unknown"; }) ) { return -1; } if (get.population(target.identity) == 1) { if (target.maxHp > 2 && target.hp < 2) return 1; if (game.countPlayer() < 3) return -1; if (target.hp <= 2 && target.countCards("he") <= 3) return 1; } } } return -1; }, }, tag: { damage: 0.16, natureDamage: 0.16, thunderDamage: 0.16, }, }, }, hanbing: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -1 }, skills: ["hanbing_skill"], ai: { basic: { equipValue: 2, }, }, }, renwang: { fullskin: true, type: "equip", subtype: "equip2", skills: ["renwang_skill"], ai: { basic: { equipValue: 7.5, }, }, }, }, skill: { qinglong_guozhan: { equipSkill: true, trigger: { player: "useCard" }, forced: true, audio: "qinglong_skill", filter: function (event, player) { return get.mode() == "guozhan" && event.card.name == "sha"; }, content: function () { if (!_status.qinglong_guozhan) _status.qinglong_guozhan = []; _status.qinglong_guozhan.add(trigger); game.countPlayer2(function (current) { current.addTempSkill("qinglong_guozhan_mingzhi"); }); game.broadcast( function (list) { _status.qinglong_guozhan = list; }, _status.qinglong_guozhan.map(function (i) { return { targets: i.targets }; }) ); var next = game.createEvent("qinglong_guozhan"); event.next.remove(next); trigger.after.add(next); next.setContent(function () { _status.qinglong_guozhan.remove(event.parent); game.broadcast( function (list) { _status.qinglong_guozhan = list; }, _status.qinglong_guozhan.map(function (i) { return { targets: i.targets }; }) ); }); }, }, qinglong_guozhan_mingzhi: { ai: { nomingzhi: true, skillTagFilter: function (player) { if (_status.qinglong_guozhan) { for (var i = 0; i < _status.qinglong_guozhan.length; i++) { if (_status.qinglong_guozhan[i].targets.includes(player)) return true; } } return false; }, }, }, hanbing_skill: { equipSkill: true, trigger: { source: "damageBegin2" }, //direct:true, audio: true, filter: function (event) { return ( event.card && event.card.name == "sha" && event.notLink() && event.player.getCards("he").length > 0 ); }, //priority:1, check: function (event, player) { var target = event.player; var eff = get.damageEffect(target, player, player, event.nature); if (get.attitude(player, target) > 0) { if (eff >= 0) return false; return true; } if (eff <= 0) return true; if (target.hp == 1) return false; if ( event.num > 1 || player.hasSkill("tianxianjiu") || player.hasSkill("luoyi2") || player.hasSkill("reluoyi2") ) return false; if (target.countCards("he") < 2) return false; var num = 0; var cards = target.getCards("he"); for (var i = 0; i < cards.length; i++) { if (get.value(cards[i]) > 6) num++; } if (num >= 2) return true; return false; }, logTarget: "player", content: function () { "step 0"; trigger.cancel(); "step 1"; if (trigger.player.countDiscardableCards(player, "he")) { player.line(trigger.player); player.discardPlayerCard("he", trigger.player, true); } "step 2"; if (trigger.player.countDiscardableCards(player, "he")) { player.line(trigger.player); player.discardPlayerCard("he", trigger.player, true); } }, }, icesha_skill: { inherit: "hanbing_skill", trigger: { source: "damageBegin3" }, equipSkill: false, ruleSkill: true, filter: function (event) { return ( event.hasNature("ice") && event.notLink() && event.player.getCards("he").length > 0 ); }, }, renwang_skill: { equipSkill: true, trigger: { target: "shaBegin" }, forced: true, priority: 6, audio: true, filter: function (event, player) { if (player.hasSkillTag("unequip2")) return false; if ( event.player.hasSkillTag("unequip", false, { name: event.card ? event.card.name : null, target: player, card: event.card, }) ) return false; return event.card.name == "sha" && get.color(event.card) == "black"; }, content: function () { trigger.cancel(); }, ai: { effect: { target: function (card, player, target) { if (typeof card !== "object" || target.hasSkillTag("unequip2")) return; if ( player.hasSkillTag("unequip", false, { name: card ? card.name : null, target: target, card: card, }) || player.hasSkillTag("unequip_ai", false, { name: card ? card.name : null, target: target, card: card, }) ) return; if (card.name == "sha" && get.color(card) == "black") return "zeroplayertarget"; }, }, }, }, zhuge_skill: { equipSkill: true, audio: true, firstDo: true, trigger: { player: "useCard1" }, forced: true, filter: function (event, player) { return ( !event.audioed && event.card.name == "sha" && player.countUsed("sha", true) > 1 && event.getParent().type == "phase" ); }, content: function () { trigger.audioed = true; }, mod: { cardUsable: function (card, player, num) { var cards = player.getEquips("zhuge"); if (card.name == "sha") { if ( !cards.length || player.hasSkill("zhuge_skill", null, false) || cards.some( (card) => card != _status.zhuge_temp && !ui.selected.cards.includes(card) ) ) { if (get.is.versus() || get.is.changban()) { return num + 3; } return Infinity; } } }, cardEnabled2: function (card, player) { if (!_status.event.addCount_extra || player.hasSkill("zhuge_skill", null, false)) return; var cards = player.getEquips("zhuge"); if (card && cards.includes(card)) { try { var cardz = get.card(); } catch (e) { return; } if (!cardz || cardz.name != "sha") return; _status.zhuge_temp = card; var bool = lib.filter.cardUsable( get.autoViewAs({ name: "sha" }, ui.selected.cards.concat([card])), player ); delete _status.zhuge_temp; if (!bool) return false; } }, }, }, cixiong_skill: { equipSkill: true, trigger: { player: "useCardToPlayered" }, audio: true, logTarget: "target", check: function (event, player) { if (get.attitude(player, event.target) > 0) return true; var target = event.target; return target.countCards("h") == 0 || !target.hasSkillTag("noh"); }, filter: function (event, player) { if (event.card.name != "sha") return false; return player.differentSexFrom(event.target); }, content: function () { "step 0"; if (!trigger.target.countCards("h")) event._result = { bool: false }; else trigger.target .chooseToDiscard("弃置一张手牌,或令" + get.translation(player) + "摸一张牌") .set("ai", function (card) { var trigger = _status.event.getTrigger(); return ( -get.attitude(trigger.target, trigger.player) - get.value(card) - Math.max(0, 4 - trigger.target.hp) * 2 ); }); "step 1"; if (result.bool == false) player.draw(); }, }, qinggang_skill: { equipSkill: true, audio: true, trigger: { player: "useCardToPlayered", }, filter: function (event) { return event.card.name == "sha"; }, forced: true, logTarget: "target", content: function () { trigger.target.addTempSkill("qinggang2"); trigger.target.storage.qinggang2.add(trigger.card); trigger.target.markSkill("qinggang2"); }, ai: { unequip_ai: true, skillTagFilter: function (player, tag, arg) { if (arg && arg.name == "sha") return true; return false; }, }, }, qinggang2: { firstDo: true, ai: { unequip2: true }, init: function (player, skill) { if (!player.storage[skill]) player.storage[skill] = []; }, onremove: true, trigger: { player: ["damage", "damageCancelled", "damageZero"], source: ["damage", "damageCancelled", "damageZero"], target: ["shaMiss", "useCardToExcluded", "useCardToEnd", "eventNeutralized"], global: ["useCardEnd"], }, charlotte: true, filter: function (event, player) { return ( player.storage.qinggang2 && event.card && player.storage.qinggang2.includes(event.card) && (event.name != "damage" || event.notLink()) ); }, silent: true, forced: true, popup: false, priority: 12, content: function () { player.storage.qinggang2.remove(trigger.card); if (!player.storage.qinggang2.length) player.removeSkill("qinggang2"); }, marktext: "※", intro: { content: "当前防具技能已失效" }, }, qinglong_skill: { equipSkill: true, trigger: { player: ["shaMiss", "eventNeutralized"] }, direct: true, filter: function (event, player) { if (get.mode() == "guozhan" || !event.card || event.card.name != "sha") return false; return ( event.target.isIn() && player.canUse("sha", event.target, false) && (player.hasSha() || (_status.connectMode && player.countCards("hs"))) ); }, content: function () { "step 0"; player .chooseToUse( get.prompt("qinglong", trigger.target), function (card, player, event) { if (get.name(card) != "sha") return false; if (!player.hasSkill("qinglong_skill", null, false)) { var cards = player.getEquips("qinglong"); if ( !cards.some( (card2) => card2 != card && !ui.selected.cards.includes(card2) ) ) return false; } return lib.filter.filterCard.apply(this, arguments); }, trigger.target, -1 ) .set("addCount", false).logSkill = "qinglong_skill"; }, }, zhangba_skill: { equipSkill: true, enable: ["chooseToUse", "chooseToRespond"], filterCard: true, selectCard: 2, position: "hs", viewAs: { name: "sha" }, complexCard: true, filter: function (event, player) { return player.countCards("hs") >= 2; }, audio: true, prompt: "将两张手牌当杀使用或打出", check: function (card) { let player = _status.event.player; if ( player.hasCard(function (card) { return get.name(card) == "sha"; }) ) return 0; if ( _status.event && _status.event.name == "chooseToRespond" && player.hp < 3 && !player.countCards("hs", function (card) { return get.name(card) != "tao" && get.name(card) != "jiu"; }) ) return (player.hp > 1 ? 10 : 8) - get.value(card); return Math.max(5, 8 - 0.7 * player.hp) - get.value(card); }, ai: { respondSha: true, skillTagFilter: function (player) { return player.countCards("hs") >= 2; }, }, }, guanshi_skill: { equipSkill: true, trigger: { player: ["shaMiss", "eventNeutralized"], }, direct: true, audio: true, filter: function (event, player) { if (event.type != "card" || event.card.name != "sha" || !event.target.isIn()) return false; var min = 2; if (!player.hasSkill("guanshi_skill", null, false)) min += get.sgn(player.getEquips("guanshi").length); return player.countCards("he") >= min; }, content: function () { "step 0"; //装备区内可能有多个贯石斧 或者玩家可能通过其他渠道获得贯石斧技能 只要留一张贯石斧不扔掉即可 var next = player .chooseToDiscard(get.prompt("guanshi"), 2, "he", function (card, player) { if (_status.event.ignoreCard) return true; var cards = player.getEquips("guanshi"); if (!cards.includes(card)) return true; return cards.some((cardx) => cardx != card && !ui.selected.cards.includes(cardx)); }) .set("ignoreCard", player.hasSkill("guanshi_skill", null, false)) .set("complexCard", true); next.logSkill = "guanshi_skill"; next.set("ai", function (card) { var evt = _status.event.getTrigger(); if (get.attitude(evt.player, evt.target) < 0) { if (evt.player.needsToDiscard()) return 15 - get.value(card); if (evt.baseDamage + evt.extraDamage >= Math.min(2, evt.target.hp)) return 8 - get.value(card); return 5 - get.value(card); } return -1; }); "step 1"; if (result.bool) { if (event.triggername == "shaMiss") { trigger.untrigger(); trigger.trigger("shaHit"); trigger._result.bool = false; trigger._result.result = null; } else { trigger.unneutralize(); } } }, ai: { directHit_ai: true, skillTagFilter: function (player, tag, arg) { if (player._guanshi_temp) return; player._guanshi_temp = true; var bool = get.attitude(player, arg.target) < 0 && arg.card && arg.card.name == "sha" && player.countCards("he", function (card) { return ( card != player.getEquip("guanshi") && card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) && get.value(card) < 5 ); }) > 1; delete player._guanshi_temp; return bool; }, }, }, fangtian_skill: { equipSkill: true, audio: true, trigger: { player: "useCard1" }, forced: true, firstDo: true, filter: function (event, player) { if (event.card.name != "sha" || get.mode() == "guozhan") return false; var card = event.card; var range; var select = get.copy(get.info(card).selectTarget); if (select == undefined) { if (get.info(card).filterTarget == undefined) return false; range = [1, 1]; } else if (typeof select == "number") range = [select, select]; else if (get.itemtype(select) == "select") range = select; else if (typeof select == "function") range = select(card, player); game.checkMod(card, player, range, "selectTarget", player); return range[1] != -1 && event.targets.length > range[1]; }, content: function () {}, mod: { selectTarget: function (card, player, range) { if (card.name != "sha") return; if (get.mode() == "guozhan") return; if (range[1] == -1) return; var cards = player.getCards("h"); if (!cards.length) return; for (var i = 0; i < cards.length; i++) { if (cards[i].classList.contains("selected") == false) return; } range[1] += 2; }, }, }, fangtian_guozhan: { equipSkill: true, trigger: { player: "useCard2" }, filter: function (event, player) { if (get.mode() != "guozhan") return false; if (event.card.name != "sha") return false; return game.hasPlayer(function (target) { if (event.targets.includes(target)) return false; if (!lib.filter.filterTarget(event.card, player, target)) return false; if (target.identity == "ye" || target.identity == "unknown") return true; for (var i = 0; i < event.targets.length; i++) { if (target.identity == event.targets[i].identity) return false; } return true; }); }, direct: true, content: function () { "step 0"; player .chooseTarget( get.prompt2("fangtian"), [1, Infinity], function (card, player, target) { var cardx = _status.event.cardx; if (!lib.filter.filterTarget(cardx, player, target)) return false; var targets = _status.event.targets.slice(0).concat(ui.selected.targets); if (targets.includes(target)) return false; if (target.identity == "ye" || target.identity == "unknown") return true; for (var i = 0; i < targets.length; i++) { if (target.identity == targets[i].identity) return false; } return true; } ) .set("promptbar", "none") .set("cardx", trigger.card) .set("targets", trigger.targets) .set("ai", function (target) { var player = _status.event.player; return get.effect(target, _status.event.cardx, player, player); }); "step 1"; if (result.bool) { player.logSkill("fangtian_skill", result.targets); if (!player.storage.fangtian_guozhan_trigger) player.storage.fangtian_guozhan_trigger = []; player.storage.fangtian_guozhan_trigger.add(trigger.card); trigger.targets.addArray(result.targets); player.addTempSkill("fangtian_guozhan_trigger"); } }, }, fangtian_guozhan_trigger: { trigger: { player: "shaMiss" }, silent: true, onremove: true, content: function () { if (player.storage[event.name].includes(trigger.card)) trigger.getParent().excluded.addArray(trigger.getParent().targets); }, group: "fangtian_guozhan_remove", }, fangtian_guozhan_remove: { trigger: { player: ["useCardAfter", "useCardCancelled"] }, silent: true, filter: function (event, player) { return ( player.storage.fangtian_guozhan_trigger && player.storage.fangtian_guozhan_trigger.includes(event.card) ); }, content: function () { player.storage.fangtian_guozhan_trigger.remove(trigger.card); }, }, qilin_skill: { equipSkill: true, trigger: { source: "damageBegin2" }, filter: function (event, player) { return ( event.card && event.card.name == "sha" && event.notLink() && event.player.getCards("e", { subtype: ["equip3", "equip4", "equip6"] }).length > 0 ); }, direct: true, audio: true, content: function () { "step 0"; var att = get.attitude(player, trigger.player) <= 0; var next = player.chooseButton(); next.set("att", att); next.set("createDialog", [ "是否发动【麒麟弓】,弃置" + get.translation(trigger.player) + "的一张坐骑牌?", trigger.player.getCards("e", { subtype: ["equip3", "equip4", "equip6"] }), ]); next.set("ai", function (button) { if (_status.event.att) return get.buttonValue(button); return 0; }); "step 1"; if (result.bool) { player.logSkill("qilin_skill", trigger.player); trigger.player.discard(result.links[0]); } }, }, bagua_skill: { equipSkill: true, trigger: { player: ["chooseToRespondBegin", "chooseToUseBegin"] }, filter: function (event, player) { if (event.responded) return false; if (event.bagua_skill) return false; if (!event.filterCard || !event.filterCard({ name: "shan" }, player, event)) return false; if ( event.name == "chooseToRespond" && !lib.filter.cardRespondable({ name: "shan" }, player, event) ) return false; if (player.hasSkillTag("unequip2")) return false; var evt = event.getParent(); if ( evt.player && evt.player.hasSkillTag("unequip", false, { name: evt.card ? evt.card.name : null, target: player, card: evt.card, }) ) return false; return true; }, audio: true, check: function (event, player) { if (!event) return true; if (event.ai) { var ai = event.ai; var tmp = _status.event; _status.event = event; var result = ai({ name: "shan" }, _status.event.player, event); _status.event = tmp; return result > 0; } let evt = event.getParent(); if (player.hasSkillTag("noShan", null, evt)) return false; if (!evt || !evt.card || !evt.player || player.hasSkillTag("useShan", null, evt)) return true; if ( evt.card && evt.player && player.isLinked() && game.hasNature(evt.card) && get.attitude(player, evt.player._trueMe || evt.player) > 0 ) return false; return true; }, content: function () { "step 0"; trigger.bagua_skill = true; player.judge("bagua", function (card) { return get.color(card) == "red" ? 1.5 : -0.5; }).judge2 = function (result) { return result.bool; }; "step 1"; if (result.judge > 0) { trigger.untrigger(); trigger.set("responded", true); trigger.result = { bool: true, card: { name: "shan", isCard: true } }; } }, ai: { respondShan: true, freeShan: true, skillTagFilter(player, tag, arg) { if (tag !== "respondShan" && tag !== "freeShan") return; if (player.hasSkillTag("unequip2")) return false; if (!arg || !arg.player) return true; if ( arg.player.hasSkillTag("unequip", false, { target: player, }) ) return false; return true; }, effect: { target: function (card, player, target, effect) { if (target.hasSkillTag("unequip2")) return; if ( player.hasSkillTag("unequip", false, { name: card ? card.name : null, target: target, card: card, }) || player.hasSkillTag("unequip_ai", false, { name: card ? card.name : null, target: target, card: card, }) ) return; if (get.tag(card, "respondShan")) return 0.5; }, }, }, }, _wuxie: { trigger: { player: ["useCardToBegin", "phaseJudge"] }, priority: 5, popup: false, forced: true, silent: true, filter: function (event, player) { if (event.card.storage && event.card.storage.nowuxie) return false; var card = event.card; if (event.name == "phaseJudge" && card.viewAs) card = { name: card.viewAs }; var info = get.info(card); if (info.wuxieable === false) return false; if (event.name != "phaseJudge") { if (event.getParent().nowuxie) return false; if (event.player.hasSkillTag("playernowuxie", false, event.card)) return false; if (get.type(event.card) != "trick" && !info.wuxieable) return false; } return true; }, forceLoad: true, forceDie: true, content: function () { "step 0"; delete event.wuxieresult; delete event.wuxieresult2; //创建map存储各种信息,用于hasHiddenWuxie判断 var map = {}; event._info_map = map; var card = trigger.card; var state = true; if (trigger.name == "phaseJudge") { if (get.itemtype(card) == "card" && card.viewAs) card = get.autoViewAs({ name: card.viewAs }, [card]); map.target = trigger.player; map.isJudge = true; } else { map.player = trigger.player; if (trigger.multitarget) map.multitargets = true; map.target = trigger.target; map.targets = trigger.targets; map.tempnowuxie = trigger.targets && trigger.targets.length > 1 && !trigger.multitarget; map.noai = Boolean(trigger.getParent().noai); //如果对拼无懈,获取历史数据 if (card.name == "wuxie") { var evt = event; while (true) { evt = evt.getParent(5); if (evt && evt.name == "_wuxie") { state = !state; var evtmap = evt._info_map; if (evtmap.card.name != "wuxie") { map._source = evtmap; } } else break; } } } map.card = card; map.state = state ? 1 : -1; map.id2 = trigger.getParent().id; event._global_waiting = true; //发送函数 event.send = function (player, map, skillState) { //获取技能数据 if (skillState) { player.applySkills(skillState); } //生成描述提示 var prompt = "", evtmap = map, state = map.state; if (map._source) evtmap = map._source; if (evtmap.isJudge) { prompt += get.translation(evtmap.target) + "的" + get.translation(evtmap.card) + "即将" + (state > 0 ? "生" : "失") + "效。"; } else { prompt += get.translation(evtmap.player); if (evtmap.multitarget) { if (evtmap.targets.length) { prompt += "对"; prompt += get.translation(evtmap.targets); } } else if (evtmap.target) { prompt += "对"; prompt += evtmap.target == evtmap.player ? "自己" : get.translation(evtmap.target); } prompt += "使用的" + get.translation(evtmap.card); prompt += "即将" + (state > 0 ? "生" : "失") + "效。"; } prompt += "是否使用【无懈可击】?"; if ( player.isUnderControl(true) && !_status.auto && !ui.tempnowuxie && map.tempnowuxie ) { var translation = get.translation(map.card.name); if (translation.length >= 4) { translation = lib.translate[map.card.name + "_ab"] || translation.slice(0, 2); } ui.tempnowuxie = ui.create.control( "不无懈" + translation, ui.click.tempnowuxie, "stayleft" ); ui.tempnowuxie._origin = map.id2; } var next = player.chooseToUse({ filterCard: function (card, player) { if (get.name(card) != "wuxie") return false; return lib.filter.cardEnabled(card, player, "forceEnable"); }, prompt: prompt, type: "wuxie", _global_waiting: true, ai1: function () { if (map.isJudge) { var card = evtmap.card, source = evtmap.target; var name = card.viewAs || card.name; var info = lib.card[name]; if (info && info.ai && info.ai.wuxie) { var aiii = info.ai.wuxie( source, card, source, _status.event.player, state ); if (typeof aiii == "number") return aiii; } if (Math.abs(get.attitude(_status.event.player, source)) < 3) return 0; if ( source.hasSkillTag("nowuxie_judge") || (source.hasSkillTag("guanxing") && (source != player || !source.hasSkill("guanxing_fail"))) ) return 0; if (name != "lebu" && name != "bingliang") { if (source != _status.event.player) { return 0; } } if ( name == "bingliang" && source.countCards("j") > 0 && source.countCards("h") >= source.hp - 1 ) { return 0; } var card2; if (name != card.name) { card2 = { name: name }; } else { card2 = card; } var eff = get.effect(source, card2, source, source); if (eff >= 0) return 0; return state * get.attitude(_status.event.player, source); } else if (evtmap.target) { var triggerevent = _status.event.getTrigger(); if ( triggerevent && triggerevent.parent && triggerevent.parent.postAi && triggerevent.player.isUnknown(_status.event.player) ) { return 0; } var card = evtmap.card, target = evtmap.target, source = evtmap.player; var info = get.info(card); if (info.ai && info.ai.wuxie) { var aiii = info.ai.wuxie( target, card, source, _status.event.player, state ); if (typeof aiii == "number") return aiii; } if (info.multitarget && targets) { var eff = 0; for (var i = 0; i < targets.length; i++) { eff += get.effect(targets[i], card, source, _status.event.player); } return -eff * state; } if (Math.abs(get.attitude(_status.event.player, target)) < 3) return 0; return -get.effect(target, card, source, _status.event.player) * state; } else { var triggerevent = _status.event.getTrigger(); if ( triggerevent && triggerevent.parent && triggerevent.parent.postAi && triggerevent.player.isUnknown(_status.event.player) ) { return 0; } var card = evtmap.card, source = evtmap.player; var info = get.info(card); if (info.ai && info.ai.wuxie) { var aiii = info.ai.wuxie( target, card, source, _status.event.player, state ); if (typeof aiii == "number") return aiii; } if (Math.abs(get.attitude(_status.event.player, source)) < 3) return 0; return -get.attitude(_status.event.player, source) * state; } }, source: evtmap.target, source2: evtmap.targets, id: map.id, id2: map.id2, state: state, info_map: map, }); if (map.card && map.player) next.respondTo = [map.player, map.card]; if (game.online) { _status.event._resultid = map.id; game.resume(); } else { next.nouse = true; } }; "step 1"; //判断谁有无懈 var map = event._info_map; var list = game.filterPlayer(function (current) { if (event.triggername == "phaseJudge") { if ( game.checkMod( map.card, map.target, current, "unchanged", "wuxieJudgeEnabled", current ) == false ) return false; if ( game.checkMod( map.card, map.target, current, "unchanged", "wuxieJudgeRespondable", map.target ) == false ) return false; } else { if (trigger.getParent().directHit.includes(current)) return false; if ( game.checkMod( map.card, map.player, map.target, current, "unchanged", "wuxieEnabled", current ) == false ) return false; if ( game.checkMod( map.card, map.player, map.target, current, "unchanged", "wuxieRespondable", map.player ) == false ) return false; } return current.hasWuxie(map); }); event.list = list; event.id = get.id(); map.id = event.id; list.sortBySeat(_status.currentPhase); "step 2"; if (event.list.length == 0) { event.finish(); } else if ( _status.connectMode && (event.list[0].isOnline() || event.list[0] == game.me) ) { event.goto(4); } else { event.current = event.list.shift(); event.send(event.current, event._info_map); } "step 3"; if (result.bool) { event.wuxieresult = event.current; event.wuxieresult2 = result; event.goto(8); } else { event.goto(2); } "step 4"; var id = event.id; var sendback = function (result, player) { if (result && result.id == id && !event.wuxieresult && result.bool) { event.wuxieresult = player; event.wuxieresult2 = result; game.broadcast("cancel", id); return function () { if ( _status.event.id == id && _status.event.name == "chooseToUse" && _status.paused ) event.resultOL = _status.event.resultOL; if (_status.event._parent_id == id) { ui.click.cancel(); } if (_status.event.id == id) { if (_status.event._backup) ui.click.cancel(); ui.click.cancel(); if (ui.confirm) { ui.confirm.close(); } if (_status.event.result) { _status.event.result.id = id; } } }; } else { if ( _status.event.id == id && _status.event.name == "chooseToUse" && _status.paused ) { return function () { event.resultOL = _status.event.resultOL; }; } } }; var withme = false; var withol = false; var list = event.list; for (var i = 0; i < list.length; i++) { if (list[i].isOnline()) { withol = true; list[i].wait(sendback); list[i].send(event.send, list[i], event._info_map, get.skillState(list[i])); list.splice(i--, 1); } else if (list[i] == game.me) { withme = true; event.send(list[i], event._info_map); list.splice(i--, 1); } } if (!withme) { event.goto(6); } if (_status.connectMode) { if (withme || withol) { for (var i = 0; i < game.players.length; i++) { game.players[i].showTimer(); } } } event.withol = withol; "step 5"; if (result && result.bool && !event.wuxieresult) { game.broadcast("cancel", event.id); event.wuxieresult = game.me; event.wuxieresult2 = result; } "step 6"; if (event.withol && !event.resultOL) { game.pause(); } "step 7"; for (var i = 0; i < game.players.length; i++) { game.players[i].hideTimer(); } "step 8"; if (event.wuxieresult2 && event.wuxieresult2._sendskill) lib.skill[event.wuxieresult2._sendskill[0]] = event.wuxieresult2._sendskill[1]; if (event.wuxieresult && event.wuxieresult2 && event.wuxieresult2.skill) { var info = get.info(event.wuxieresult2.skill); if (info && info.precontent && !game.online) { var next = game.createEvent("pre_" + event.wuxieresult2.skill); next.setContent(info.precontent); next.set("result", event.wuxieresult2); next.set("player", event.wuxieresult); } } "step 9"; if (event.wuxieresult) { var next = event.wuxieresult.useResult(event.wuxieresult2); if (event.triggername != "phaseJudge") { next.respondTo = [trigger.player, trigger.card]; } } }, }, /* _wuxie:{ trigger:{player:['useCardToBegin','phaseJudge']}, priority:5, popup:false, forced:true, filter:function(event,player){ if(event.card.storage&&event.card.storage.nowuxie) return false; var card=event.card; if(event.name=='phaseJudge'&&card.viewAs) card={name:card.viewAs}; var info=get.info(card); if(info.wuxieable===false) return false; if(event.name!='phaseJudge'){ if(event.getParent().nowuxie) return false; if(!event.target){ if(info.wuxieable) return true; return false; } if(event.player.hasSkillTag('playernowuxie',false,event.card)) return false; if(get.type(event.card)!='trick'&&!info.wuxieable) return false; } return true; }, forceLoad:true, content:function(){ 'step 0' delete event.wuxieresult; delete event.wuxieresult2; if(trigger.multitarget){ event.targets=trigger.targets; } event.target=trigger.target; if(event.triggername=='phaseJudge'){ event.target=trigger.player; } event.sourcex=event.targets||event.target; if(!event.targets&&trigger.targets&&trigger.targets.length==1){ event.sourcex2=trigger.player; } event.source=trigger.player; if(event.state==undefined) event.state=true; event.card=trigger.card; event._global_waiting=true; event.tempnowuxie=(trigger.targets&&trigger.targets.length>1&&!trigger.multitarget); event.filterCard=function(card,player){ if(get.name(card)!='wuxie') return false; return lib.filter.cardEnabled(card,player,'forceEnable'); }; event.send=function(player,state,isJudge,card,source,target,targets,id,id2,tempnowuxie,skillState,respondInfo){ if(skillState){ player.applySkills(skillState); } state=state?1:-1; var str=''; if(isJudge){ str+=get.translation(source)+'的'; } if(isJudge){ str+=get.translation(card,'viewAs'); } else{ str+=get.translation(card); } if((targets||target)&&!isJudge){ str+='对'+get.translation(targets||target); } str+='将'+(state>0?'生效':'失效')+',是否无懈?'; if(player.isUnderControl(true)&&!_status.auto&&!ui.tempnowuxie&&tempnowuxie){ var translation=get.translation(card.name); if(translation.length>=4){ translation=lib.translate[card.name+'_ab']||translation.slice(0,2); } ui.tempnowuxie=ui.create.control('不无懈'+translation,ui.click.tempnowuxie,'stayleft'); ui.tempnowuxie._origin=id2; } var next=player.chooseToUse({ filterCard:function(card,player){ if(get.name(card)!='wuxie') return false; return lib.filter.cardEnabled(card,player,'forceEnable'); }, prompt:str, type:'wuxie', state:state, _global_waiting:true, ai1:function(){ if(isJudge){ var name=card.viewAs||card.name; var info=lib.card[name]; if(info&&info.ai&&info.ai.wuxie){ var aiii=info.ai.wuxie(source,card,source,_status.event.player,state); if(typeof aiii=='number') return aiii; } if(Math.abs(get.attitude(_status.event.player,source))<3) return 0; if(source.hasSkillTag('nowuxie_judge')||source.hasSkillTag('guanxing')&&(source!=player||!source.hasSkill('guanxing_fail'))) return 0; if(name!='lebu'&&name!='bingliang'){ if(source!=_status.event.player){ return 0; } } var card2; if(name!=card.name){ card2={name:name}; } else{ card2=card; } var eff=get.effect(source,card2,source,source); if(eff>=0) return 0; return state*get.attitude(_status.event.player,source); } else if(target){ var triggerevent=_status.event.getTrigger(); if(triggerevent&&triggerevent.parent&& triggerevent.parent.postAi&& triggerevent.player.isUnknown(_status.event.player)){ return 0; } var info=get.info(card); if(info.ai&&info.ai.wuxie){ var aiii=info.ai.wuxie(target,card,source,_status.event.player,state); if(typeof aiii=='number') return aiii; } if(info.multitarget&&targets){ var eff=0; for(var i=0;i这是一种十分含蓄的计谋。', wuxie_info: "一张锦囊牌生效前,对此牌使用。抵消此牌对一名角色产生的效果,或抵消另一张【无懈可击】产生的效果。", lebu_info: "出牌阶段,对一名其他角色使用。若判定结果不为红桃,跳过其出牌阶段。", shandian_info: "出牌阶段,对自己使用。若判定结果为黑桃2~9,则目标角色受到3点雷电伤害。若判定不为黑桃2~9,将之移动到下家的判定区里。", icesha_skill: "冰冻", icesha_skill_info: "防止即将造成的伤害,改为依次弃置其两张牌。", sha_notshan: "invisible", qinggang2: "破防", }, list: [ ["spade", 7, "sha"], ["spade", 8, "sha"], ["spade", 8, "sha"], ["spade", 9, "sha"], ["spade", 9, "sha"], ["spade", 10, "sha"], ["spade", 10, "sha"], ["club", 2, "sha"], ["club", 3, "sha"], ["club", 4, "sha"], ["club", 5, "sha"], ["club", 6, "sha"], ["club", 7, "sha"], ["club", 8, "sha"], ["club", 8, "sha"], ["club", 9, "sha"], ["club", 9, "sha"], ["club", 10, "sha"], ["club", 10, "sha"], ["club", 11, "sha"], ["club", 11, "sha"], ["heart", 10, "sha"], ["heart", 10, "sha"], ["heart", 11, "sha"], ["diamond", 6, "sha"], ["diamond", 7, "sha"], ["diamond", 8, "sha"], ["diamond", 9, "sha"], ["diamond", 10, "sha"], ["diamond", 13, "sha"], ["heart", 2, "shan"], ["heart", 2, "shan"], ["heart", 13, "shan"], ["diamond", 2, "shan"], ["diamond", 2, "shan"], ["diamond", 3, "shan"], ["diamond", 4, "shan"], ["diamond", 5, "shan"], ["diamond", 6, "shan"], ["diamond", 7, "shan"], ["diamond", 8, "shan"], ["diamond", 9, "shan"], ["diamond", 10, "shan"], ["diamond", 11, "shan"], ["diamond", 11, "shan"], ["heart", 3, "tao"], ["heart", 4, "tao"], ["heart", 6, "tao"], ["heart", 7, "tao"], ["heart", 8, "tao"], ["heart", 9, "tao"], ["heart", 12, "tao"], ["diamond", 12, "tao"], ["spade", 2, "bagua"], ["club", 2, "bagua"], ["spade", 5, "jueying"], ["club", 5, "dilu"], ["heart", 13, "zhuahuang"], ["heart", 5, "chitu"], ["spade", 13, "dawan"], ["diamond", 13, "zixin"], ["club", 1, "zhuge"], ["diamond", 1, "zhuge"], ["spade", 2, "cixiong"], ["spade", 6, "qinggang"], ["spade", 5, "qinglong"], ["spade", 12, "zhangba"], ["diamond", 5, "guanshi"], ["diamond", 12, "fangtian"], ["heart", 5, "qilin"], ["heart", 3, "wugu"], ["heart", 4, "wugu"], ["heart", 1, "taoyuan"], ["spade", 7, "nanman"], ["spade", 13, "nanman"], ["club", 7, "nanman"], ["heart", 1, "wanjian"], ["spade", 1, "juedou"], ["club", 1, "juedou"], ["diamond", 1, "juedou"], ["heart", 7, "wuzhong"], ["heart", 8, "wuzhong"], ["heart", 9, "wuzhong"], ["heart", 11, "wuzhong"], ["spade", 3, "shunshou"], ["spade", 4, "shunshou"], ["spade", 11, "shunshou"], ["diamond", 3, "shunshou"], ["diamond", 4, "shunshou"], ["spade", 3, "guohe"], ["spade", 4, "guohe"], ["spade", 12, "guohe"], ["club", 3, "guohe"], ["club", 4, "guohe"], ["heart", 12, "guohe"], ["club", 12, "jiedao"], ["club", 13, "jiedao"], ["spade", 11, "wuxie"], ["club", 12, "wuxie"], ["club", 13, "wuxie"], ["spade", 6, "lebu"], ["club", 6, "lebu"], ["heart", 6, "lebu"], ["spade", 1, "shandian"], ["spade", 2, "hanbing"], ["club", 2, "renwang"], ["heart", 12, "shandian"], ["diamond", 12, "wuxie"], ], }; });