import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { //星孙坚 starruijun: { audio: 2, trigger: { player: "useCardToPlayered", }, filter(event, player) { if (event.targets.length > 1) return false; if ( player.hasHistory("useCard", evt => { if (evt === event.getParent()) return false; const targets = evt.targets; return targets.length === 1 && targets[0] !== player; }) ) return false; const target = event.target; if (target === player || !target.isIn()) return false; return true; }, logTarget: "target", locked: false, check(event, player) { return ( get.attitude(player, event.target) <= 0 || !player.hasCard(card => { return game.hasPlayer(current => { return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true); }); }, "hs") ); }, prompt2(event, player) { return `摸${get.cnNumber(player.getDamagedHp() + 1)}张牌,令所有除${get.translation(event.target)}外的其他角色不在你的攻击范围内,且你对其造成的伤害逐次增加。`; }, async content(event, trigger, player) { await player.draw(player.getDamagedHp() + 1); player.addTempSkill("starruijun_effect", "phaseChange"); player.markAuto("starruijun_effect", trigger.target); }, subSkill: { effect: { audio: "starruijun", trigger: { source: "damageBegin2", }, charlotte: true, forced: true, onremove: true, async content(event, trigger, player) { let num = 1; const evts = player.getHistory("sourceDamage", evt => { return evt.source === player && evt.player === trigger.player; }); if (evts.length) num += evts.lastItem.num; trigger.num = Math.min(5, num); }, mod: { inRange(from, to) { if (!from.getStorage("starruijun_effect").includes(to)) return false; }, }, }, }, mod: { aiOrder(player, card, num) { const event = get.event(); if (!event || event.type !== "phase") return; if ( game.hasPlayer(current => { return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true) && get.damageEffect(current, player, player) > 0; }) ) return num * 2; return num / 1.5; }, }, }, stargangyi: { audio: 2, trigger: { source: "damage", }, silent: true, forced: true, group: "stargangyi_recover", async content(event, trigger, player) { player.addTempSkill("stargangyi_access"); }, subSkill: { recover: { audio: "stargangyi", trigger: { player: "recoverBegin", }, filter(event, player) { const evt = event.getParent(3); if (!player.isDying() || evt.type !== "dying") return false; return ["tao", "jiu"].includes(event.getParent().name); }, forced: true, async content(event, trigger, player) { trigger.num++; }, }, access: { charlotte: true, }, }, mod: { cardEnabled(card, player) { if (player.hasSkill("stargangyi_access")) return; if (player === _status.currentPhase && card.name === "tao") return false; }, cardSavable(card, player) { if (player.hasSkill("stargangyi_access")) return; if (player === _status.currentPhase && card.name === "tao") return false; }, }, }, //李傕郭汜 xiongsuan: { audio: 2, enable: "phaseUse", filterTarget: true, filterCard: lib.filter.cardDiscardable, position: "h", usable: 1, async content(event, trigger, player) { const target = event.target; await target.damage(); await player.draw(3); if (target != player) await player.loseHp(); }, ai: { order: 9, result: { player(player, target) { let res = 2 * get.effect(player, { name: "draw" }, player, player); if (player !== target) res += get.effect(player, { name: "losehp" }, player, player); return res; }, target(player, target) { return get.damageEffect(target, player, target); }, }, }, }, //张春华 starliangyan: { audio: 2, enable: "phaseUse", usable: 1, filterTarget: lib.filter.notMe, chooseButton: { dialog(event, player) { const name = get.translation(event.result.targets[0]); const list = ["你摸一张牌,其弃置一张牌", "你弃置一张牌,其摸一张牌", "你摸两张牌,其弃置两张牌", "你弃置两张牌,其摸两张牌"].map((item, i) => [i, item]); const dialog = ui.create.dialog(`梁燕:请选择你与${name}要执行的选项`, [list.slice(0, 2), "tdnodes"], [list.slice(2, 4), "tdnodes"], "hidden"); return dialog; }, filter(button, player) { const link = button.link; if (link % 2 === 0) return true; return player.countDiscardableCards(player, "he") >= (link + 1) / 2; }, check(button) { const player = get.player(), target = get.event().getParent().result.targets[0]; const link = button.link; if (get.attitude(player, target) <= 0 && link === 2) return 100; const ph = player.countCards("h"), th = target.countCards("h"); if (link % 2 === 0) { const num = link / 2 + 1; if (ph + num === th - num) return 10; } else { const num = (link + 1) / 2; if (ph - num === th + num) return 10; } return 5; }, backup(links) { return { audio: "starliangyan", target: get.event().result.targets[0], link: links[0], filterTarget(card, player, target) { return target === lib.skill.starliangyan_backup.target; }, selectTarget: -1, async content(content, trigger, player) { const target = lib.skill.starliangyan_backup.target; const link = lib.skill.starliangyan_backup.link; const num = link <= 1 ? 1 : 2; const fn = ["draw", "chooseToDiscard"]; if (link % 2 === 1) fn.reverse(); await player[fn[0]](num, true, "he"); await target[fn[1]](num, true, "he"); if (player.countCards("h") === target.countCards("h")) { const skipper = [player, target][link % 2]; skipper.skip("phaseDiscard"); game.log(skipper, "跳过了下一个", "#y弃牌阶段"); } }, }; }, prompt(links) { return "点击“确定”以执行效果"; }, }, subSkill: { backup: {}, }, ai: { order(item, player) { if (!game.hasPlayer(current => current !== player && get.attitude(player, current) > 0) && game.hasPlayer(current => get.attitude(player, current) <= 0)) return 10; if ( game.hasPlayer(current => { const del = player.countCards("h") - current.countCards("h"), toFind = [2, 4].find(num => Math.abs(del) === num); if (toFind === 4 && del < 0 && get.attitude(player, current) <= 0) { return true; } return false; }) ) return 10; return 1; }, result: { target(player, target) { const del = player.countCards("h") - target.countCards("h"), toFind = [2, 4].find(num => Math.abs(del) === num); if (toFind) { return (-del * (get.attitude(player, target) * Math.min(3, target.countCards("h"))) * toFind) / 10; } return -1; }, }, }, }, starminghui: { audio: 2, trigger: { global: "phaseEnd" }, filter(event, player) { return player.isMinHandcard() || player.isMaxHandcard(); }, direct: true, async content(event, trigger, player) { let logged = false; if (player.isMinHandcard()) { const card = new lib.element.VCard({ name: "sha", }); const result = await player .chooseUseTarget(`###${get.prompt("starminghui")}###视为使用一张无距离限制的【杀】`, card, false, "nodistance") .set("logSkill", "starminghui") .forResult(); if (result.bool) logged = true; } const num = player.countCards("h"); if (player.isMaxHandcard() && num > 0) { const maxNum = game .findPlayer(current => { if (current === player) return false; return !game.hasPlayer(current2 => { if (current2 === player) return false; return current2.countCards("h") > current.countCards("h"); }); }) .countCards("h"); const leastDiscardNum = num - maxNum + 1; const prompt = logged ? `是否将手牌弃置至不为最多?` : get.prompt("starminghui"); const next = player .chooseToDiscard(prompt, `弃置至少${get.cnNumber(leastDiscardNum)}张手牌,然后你令一名角色回复1点体力`) .set("selectCard", [leastDiscardNum, Infinity]) .set( "goon", game.hasPlayer(current => get.recoverEffect(current, get.player(), get.player())) ) .set("ai", card => { if (!get.event("goon")) return 0; if (get.tag(card, "recover")) return 0; if (ui.selected.cards.length === get.event("selectCard")[0] - 1) return 6.5 - get.value(card); return 4 - get.value(card); }); if (!logged) next.set("logSkill", "starminghui"); const result = await next.forResult(); if (!result.bool) return; if (!player.isUnderControl(true) && !player.isOnline()) await game.asyncDelayx(); const [bool, targets] = await player .chooseTarget("令一名角色回复1点体力") .set("ai", target => get.recoverEffect(target, get.player(), get.player())) .forResult("bool", "targets"); if (bool) { const target = targets[0]; player.line(target, "green"); await target.recover(); } } }, }, //星袁绍 starxiaoyan: { audio: 2, trigger: { global: "phaseBefore", player: ["enterGame" /*,'logSkill'*/], }, filter(event, player) { if (!game.hasPlayer(current => current != player)) return false; //if(event.name=='logSkill'&&evt.skill!='starjiaowang') return false; return event.name != "phase" || game.phaseNumber == 0; }, forced: true, async content(event, trigger, player) { let targets = game.filterPlayer(current => current != player); player.line(targets); for (const target of targets) await target.damage("fire"); targets = targets.filter(i => i.isIn()); if (targets.length) { for (const target of targets) { if (!target.countCards("he")) continue; const { result: { bool }, } = await target .chooseToGive("he", player) .set("prompt", "是否交给" + get.translation(player) + "一张牌" + (target.isDamaged() ? "并回复1点体力" : "") + "?") .set("ai", card => { const target = get.event("player"), player = get.event("target"); const att = get.attitude(target, player); if (get.recoverEffect(target, target, target) <= 0) { if (att <= 0) return -get.value(card); return 0; } return 7 - get.value(card); }) .set("target", player); if (bool) await target.recover(); } } }, }, starzongshi: { audio: 2, enable: "phaseUse", filter(event, player) { const cards = player.getCards("h", card => { const type = get.type(card, player); if (type != "basic" && type != "trick") return false; return ( lib.filter.cardUsable(card, player) && game.hasPlayer(target => { return lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/; }) ); }); if (!cards.length) return false; return cards.some(card => { const cardss = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); return cardss.length && !cardss.some(cardx => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player)); }); }, filterCard(card, player) { if (ui.selected.cards.length) return false; const cards = player.getCards("h", card => { const type = get.type(card, player); if (type != "basic" && type != "trick") return false; return ( lib.filter.cardUsable(card, player) && game.hasPlayer(target => { return lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/; }) ); }); if (!cards.includes(card)) return false; const cardss = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); return cardss.length && !cardss.some(cardx => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player)); }, selectCard: [1, 2], complexCard: true, check(card) { const player = get.event("player"), select = get.copy(get.info(card).selectTarget); let range; if (select == undefined) range = [1, 1]; else if (typeof select == "number") range = [select, select]; else if (get.itemtype(select) == "select") range = select; else if (typeof select == "function") range = select(card, player); game.checkMod(card, player, range, "selectTarget", player); const cards = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); let targets = game.filterPlayer(target => lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/ && get.effect(target, card, player, player) > 0); const max = range[1], max2 = Math.min(cards.length, targets.length); if (max > max2) return 0; targets = targets.sort((a, b) => get.effect(b, card, player, player) - get.effect(a, card, player, player)).slice(0, max2); const sum = targets.reduce((num, target) => num + get.effect(target, card, player, player), 0); if (max == -1) { if ( game .filterPlayer(target => { return lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/; }) .reduce((num, target) => num + get.effect(target, card, player, player), 0) > sum ) return 0; } return sum; }, position: "h", discard: false, lose: false, delay: false, async content(event, trigger, player) { const card = event.cards[0], cards = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); await player.showCards([card], get.translation(player) + "发动了【纵势】"); const cardx = new lib.element.VCard({ name: get.name(card, player), nature: get.nature(card, player), cards: cards, }); const { result: { bool, targets }, } = await player .chooseTarget((card, player, target) => { //return player.canUse(get.event('cardx'),target); return lib.filter.targetEnabled2(get.event("cardx"), player, target) /*&&lib.filter.targetInRange(get.event('cardx'),player,target)*/; }, true) .set("cardx", cardx) .set("selectTarget", [1, cards.length]) .set("prompt", "请选择" + (game.hasNature(cardx) ? get.translation(get.nature(cardx)) : "") + "【" + get.translation(cardx) + "】(" + get.translation(cards) + ")的目标") .set("ai", target => { const player = get.event("player"), card = get.event("cardx"); return get.effect(target, card, player, player); }); if (bool) player.useCard(cardx, cards, targets.sortBySeat()); }, ai: { order: 9, result: { player: 1 }, }, }, starjiaowang: { audio: 2, trigger: { global: "roundStart" }, filter(event, player) { if (game.roundNumber <= 1) return false; const history = game.getAllGlobalHistory(); for (let i = history.length - 2; i >= 0; i--) { const evt = history[i]["everything"]; for (let j = evt.length - 1; j >= 0; j--) { if (evt[j].name == "die" && evt[j].getParent(3).name != "starxiaoyan") return false; } if (history[i].isRound) break; } return true; }, forced: true, async content(event, trigger, player) { await player.loseHp(); if (game.hasPlayer(current => current != player)) player.useResult({ skill: "starxiaoyan" }, event); }, }, staraoshi: { audio: 2, zhuSkill: true, global: "staraoshi_global", subSkill: { global: { audio: "staraoshi", forceaudio: true, enable: "phaseUse", filter(event, player) { return player.group == "qun" && game.hasPlayer(target => lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target)); }, filterTarget(card, player, target) { return target != player && target.hasZhuSkill("staraoshi"); }, prompt() { const player = get.event("player"); const targets = game.filterPlayer(target => lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target)); return "交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : "") + "一张手牌,然后其可以发动一次【纵势】"; }, filterCard: true, check(card) { const player = get.event("player"); const target = game .filterPlayer(target => { return lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target); }) .sort((a, b) => b.countCards("h") - a.countCards("h"))[0]; return target.getUseValue(card); }, discard: false, lose: false, delay: false, usable: 1, async content(event, trigger, player) { const target = event.target, info = get.info("starzongshi"); await player.give(event.cards, target); const { result: { bool, cards }, } = await target .chooseCard(info.position, (card, player) => { return get.event("info").filterCard(card, player); }) .set("info", info) .set("ai", card => get.event("info").check(card)) .set("selectCard", [1, 2]) .set("complexCard", true) .set("prompt", get.prompt("starzongshi")) .set("prompt2", lib.translate.starzongshi_info.slice(8).slice(0, -1)); if (bool) target.useResult({ skill: "starzongshi", cards: cards }, event); }, ai: { order: 9, result: { target(player, target) { return target.countCards("h") + 1; }, }, }, }, }, }, //星董卓 starweilin: { audio: 2, trigger: { source: "damageBegin1" }, filter: function (event, player) { return !event.player.getHistory("damage").length && player.getHistory("useCard").length >= event.player.getHp(); }, forced: true, logTarget: "player", content: function () { trigger.num++; }, }, starzhangrong: { audio: 2, trigger: { player: "phaseZhunbeiBegin" }, filter: function (event, player) { return player.getHp() > 0; }, direct: true, content: function* (event, map) { var player = map.player; var str = get.cnNumber(player.getHp()); var choiceList = ["令至多" + str + "名体力值大于等于你的角色各失去1点体力", "令至多" + str + "名手牌数大于等于你的角色各弃置一张手牌"], list = ["cancel2"]; if ( game.hasPlayer(target => { if (target == player) return player.countCards("h", card => lib.filter.cardDiscardable(card, player)); return target.countCards("h") >= Math.max(1, player.countCards("h")); }) ) list.unshift("弃牌"); else choiceList[1] = '' + choiceList[1] + ""; list.unshift("扣血"); var result = yield player .chooseControl(list) .set("prompt", "###" + get.prompt("starzhangrong") + "###选择其中一项令任意名符合条件的角色执行,然后你摸等量的牌,回合结束时,若这些角色中有本回合未受到过伤害的角色,则你失去1点体力") .set("ai", () => { var player = _status.event.player; var controls = _status.event.controls.slice(); /* var cards=player.getCards('hes',card=>get.tag(card,'damage')&&player.hasValueTarget(card)); var cardx=cards.filter(card=>get.name(card)=='sha'); cardx.sort((a,b)=>player.getUseValue(b)-player.getUseValue(a)); cardx=cardx.slice(Math.min(cardx.length,player.getCardUsable('sha')),cardx.length); cards.removeArray(cardx); */ var targets1 = game.filterPlayer(target => get.attitude(player, target) < 0 && target.getHp() >= player.getHp() && get.effect(target, { name: "losehp" }, player, player) > 0 /*&&cards.some(card=>player.canUse(card,target))*/); _status.starzhangrong_check = true; var targets2 = game.filterPlayer(target => get.attitude(player, target) < 0 && target.countCards("h") >= Math.max(1, player.countCards("h")) && get.effect(target, { name: "guohe_copy2" }, player, player) > 0 /*&&cards.some(card=>player.canUse(card,target))*/); delete _status.starzhangrong_check; [targets1, targets2].forEach(list => { list.sort((a, b) => get.damageEffect(b) - get.damageEffect(a)); list = list.slice(0, Math.min(player.getHp() /*,cards.length*/)); }); if (!controls.includes("弃牌")) return 1 - get.sgn(targets1.length); return Math.max(0, get.sgn(targets2.length - targets1.length)); }) .set("choiceList", choiceList); if (result.control != "cancel2") { var choice = result.index; var result2 = yield player .chooseTarget([1, player.getHp()], "请选择【掌戎】的目标", "令至多" + str + "名" + (choice ? "手牌数" : "体力值") + "大于你的角色各" + (choice ? "弃置一张手牌" : "失去1点体力"), (card, player, target) => { var name = _status.event.card.name; if (name == "guohe_copy2") { if (target == player) return player.countCards("h", card => lib.filter.cardDiscardable(card, player)); return target.countCards("h") >= Math.max(1, player.countCards("h")); } return target.getHp() >= player.getHp(); }) .set("ai", target => { var player = _status.event.player; if (get.attitude(player, target) >= 0) return 0; return get.effect(target, _status.event.card, player, player); }) .set("card", { name: choice ? "guohe_copy2" : "losehp" }); if (result2.bool) { var targets = result2.targets.sortBySeat(); player.logSkill("starzhangrong", targets); targets.forEach(target => { target.addTempSkill("starzhangrong_threaten"); if (choice) target.chooseToDiscard("h", true); else target.loseHp(); }); player.draw(targets.length); player .when("phaseEnd") .then(() => { targets.forEach(target => target.removeSkill("starzhangrong_threaten")); var targetx = targets.filter(target => !target.getHistory("damage").length); if (targetx.length) { targetx.forEach(target => target.chat("乐")); player.popup("杯具"); player.loseHp(); return; } player.popup("洗具"); }) .vars({ targets: targets }); } } }, global: "starzhangrong_check", subSkill: { check: { mod: { canBeDiscarded: function (card, player, target) { if (!_status.starzhangrong_check) return; if (player.hasSkill("starzhangrong") && get.position(card) != "h") return false; }, }, }, threaten: { charlotte: true, trigger: { player: "damageEnd" }, firstDo: true, forced: true, popup: false, content: function () { player.removeSkill("starzhangrong_threaten"); }, ai: { threaten: 114514 + 1919810 }, mark: true, markimage: "image/card/sha.png", intro: { content: "我还没受到伤害哟!" }, }, }, }, starhaoshou: { unique: true, audio: 2, trigger: { global: "useCardAfter" }, filter: function (event, player) { return event.player != player && event.card.name == "jiu" && player.isDamaged() && event.player.group == "qun"; }, direct: true, zhuSkill: true, content: function* (event, map) { var player = map.player, target = map.trigger.player; var result = yield target.chooseBool(get.prompt("starhaoshou", player), "令" + get.translation(player) + "回复1点体力").set("choice", get.recoverEffect(player, target, target) > 0); if (result.bool) { target.line(player); player.logSkill("starhaoshou"); player.recover(); } }, //global:'starhaoshou_global', subSkill: { global: { audio: "starhaoshou", forceaudio: true, filter: function (event, player) { if ( !player.countCards("hes", card => { if (get.position(card) == "h" && _status.connectMode) return true; return get.name(card) == "jiu"; }) ) return false; return event.type == "dying" && event.dying && event.dying != player && event.dying.hp <= 0 && event.dying.hasZhuSkill("starhaoshou") && player.group == "qun"; }, filterCard: function (card, player) { return get.name(card) == "jiu"; }, check: () => 1, viewAs: { name: "tao" }, position: "hes", prompt: function () { return "将一张【酒】当作【桃】对" + get.translation(_status.event.dying) + "使用"; }, ai: { save: true, skillTagFilter: function (player, arg, target) { if ( !player.countCards("hes", card => { if (get.position(card) == "h" && _status.connectMode) return true; return get.name(card) == "jiu"; }) || player == target || !target.hasSkill("starhaoshou") || player.group != "qun" ) return false; }, }, }, }, }, //星袁术 starcanxi: { audio: 2, trigger: { global: ["phaseBefore", "roundStart"], player: "enterGame", }, filter: function (event, player, name) { if (name == "roundStart") return player.getSkills().some(skill => skill.indexOf("starcanxi_") == 0); return event.name != "phase" || game.phaseNumber == 0; }, forced: true, content: function () { "step 0"; if (event.triggername != "roundStart") { var list = game.filterPlayer().reduce((list, target) => list.add(target.group), []); list.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); list.forEach(group => lib.skill.starcanxi.create(group, player)); event.finish(); return; } "step 1"; var groups = player.getSkills().filter(skill => skill.indexOf("starcanxi_") == 0); groups = groups.map(group => group.slice(10)); groups.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); var map = {}; groups.forEach(group => (map[group] = get.translation(group + "2"))); event.map = map; player .chooseButton( [ '###残玺###
请选择势力和效果
', [Object.values(map), "tdnodes"], [ [ ["wangsheng", ''], ["xiangsi", ''], ], "textbutton", ], ], 2, true ) .set("filterButton", function (button) { var list = ["wangsheng", "xiangsi"]; if (!ui.selected.buttons.length) return true; return list.includes(ui.selected.buttons[0].link) != list.includes(button.link); }) .set("ai", function (button) { var player = _status.event.player; var map = _status.event.map, list = ["wangsheng", "xiangsi"]; var getNum = function (group, effect) { var num = 0, sgn = effect == "wangsheng" ? 1.05 : -1; game.countPlayer(function (current) { if (!(current == player && sgn == -1)) num += get.sgn(get.attitude(player, current)) * sgn; }); return num; }; var listx = []; Object.keys(map).forEach(group => list.forEach(effect => listx.add([group, effect]))); listx.sort((a, b) => getNum(b[0], b[1]) - getNum(a[0], a[1])); if (button.link == map[listx[0][0]] || button.link == listx[0][1]) return 1; return 0; }) .set("map", map); "step 2"; if (result.bool) { if (!Object.keys(event.map).some(group => event.map[group] == result.links[0])) result.links.reverse(); player.popup(result.links[0]); var group = Object.keys(event.map).find(group => event.map[group] == result.links[0]); var skill = "starcanxi_" + result.links[1]; player.popup(skill); game.log(player, "选择了", "#g" + result.links[0], "、", "#y" + get.translation(skill)); player.addTempSkill(skill, "roundStart"); player.markAuto(skill, [group]); } }, create: function (group, player) { const skill = "starcanxi_" + group; get.info("starcanxi").createSkill(skill); if (!_status.postReconnect.starcanxi) { _status.postReconnect.starcanxi = [get.info("starcanxi").createSkill, []]; } _status.postReconnect.starcanxi[1].add(skill); player.addSkill(skill); }, createSkill(skill) { if (!lib.skill[skill]) game.broadcastAll(skill => { const group = skill.slice("starcanxi_".length); lib.skill[skill] = { mark: true, charlotte: true, onremove: function (player) { player.addMark("starpizhi", 1, false); }, intro: { content: "玉玺的一角" }, }; lib.translate[skill] = "残玺·" + get.translation(group + "2"); lib.skill[skill].marktext = get.translation(group); lib.translate[skill + "_bg"] = get.translation(group); }, skill); }, subSkill: { wangsheng: { charlotte: true, onremove: true, trigger: { global: "damageBegin1" }, filter: function (event, player) { if (!event.source || !player.getStorage("starcanxi_wangsheng").includes(event.source.group)) return false; return !event.source.getHistory("sourceDamage").length; }, forced: true, logTarget: "source", content: function () { trigger.num++; }, group: "starcanxi_remove", global: "starcanxi_effect", intro: { content: "$势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1" }, }, xiangsi: { charlotte: true, onremove: true, trigger: { global: "recoverEnd" }, filter: function (event, player) { if (!player.getStorage("starcanxi_xiangsi").includes(event.player.group) || event.player == player) return false; return ( game.getGlobalHistory("changeHp", function (evt) { return evt.getParent().name == "recover" && evt.player == event.player; }).length == 1 ); }, forced: true, logTarget: "player", content: function () { trigger.player.loseHp(); }, group: ["starcanxi_remove", "starcanxi_cancel"], global: "starcanxi_effect", intro: { content: "其他$势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效", }, }, cancel: { charlotte: true, trigger: { global: "useCard" }, filter: function (event, player) { if (!event.targets || !event.targets.includes(player) || !player.getStorage("starcanxi_xiangsi").includes(event.player.group) || event.player == player) return false; return event.player.getHistory("useCard", evt => evt.targets && evt.targets.includes(player)).indexOf(event) == 0; }, forced: true, logTarget: "player", content: function () { trigger.excluded.add(player); }, }, effect: { mod: { globalFrom: function (from, to, distance) { if (game.hasPlayer(target => target.getStorage("starcanxi_wangsheng").includes(from.group))) return distance - 1; }, }, ai: { effect: { player_use: function (card, player, target) { var targets = game.filterPlayer(targetx => targetx != player && targetx.getStorage("starcanxi_xiangsi").includes(player.group)); if (!targets.length) return; if (get.tag(card, "recover") && target == player && target.hp > 2) return 0; if (get.tag(card, "damage") && targets.includes(target)) return 0.5; }, }, }, }, remove: { charlotte: true, trigger: { player: "die" }, forced: true, popup: false, firstDo: true, forceDie: true, content: function () { player.removeSkill("starcanxi_wangsheng"); player.removeSkill("starcanxi_xiangsi"); }, }, }, }, starpizhi: { audio: 2, trigger: { player: "phaseEnd", global: "die" }, filter: function (event, player) { if (event.name == "phase") return player.hasMark("starpizhi"); if (!player.getStorage("starcanxi_wangsheng").includes(event.player.group) && !player.getStorage("starcanxi_xiangsi").includes(event.player.group)) return false; var groups = player.getSkills().filter(skill => skill.indexOf("starcanxi_") == 0); groups = groups.map(group => group.slice(10)); return groups.includes(event.player.group); }, forced: true, content: function () { "step 0"; if (trigger.name == "die") { var skills = player.getSkills().filter(skill => skill.indexOf("starcanxi_") == 0 && skill.slice(10) == trigger.player.group); player.removeSkill(skills); } "step 1"; player.draw(player.countMark("starpizhi")); }, intro: { content: "已失去#个“玺角”" }, ai: { combo: "starcanxi" }, }, starzhonggu: { unique: true, audio: 2, trigger: { player: "phaseDrawBegin2" }, filter: function (event, player) { return !event.numFixed; }, forced: true, zhuSkill: true, content: function () { var num = game.roundNumber >= game.countPlayer(current => current.group == "qun") ? 2 : -1; trigger.num += num; }, }, //星曹仁 starsujun: { audio: 2, trigger: { player: "useCard" }, filter: function (event, player) { return player.countCards("h", { type: "basic" }) * 2 == player.countCards("h"); }, frequent: true, locked: false, content: function () { player.draw(2); }, mod: { aiOrder: function (player, card, num) { var num = player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); if (Math.abs(num) != 1) return; if (num == 1 && get.type(card) != "basic") return num + 10; if (num == -1 && get.type(card) == "basic") return num + 10; }, }, }, starlifeng: { audio: 2, enable: "chooseToUse", filter: function (event, player) { if (!event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && !event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) return false; return player.hasCard(card => { return !player.getStorage("starlifeng_count").includes(get.color(card, player)); }, "hs"); }, chooseButton: { dialog: function (event, player) { var list = []; if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) list.push(["基本", "", "sha"]); if (event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) list.push(["锦囊", "", "wuxie"]); return ui.create.dialog("砺锋", [list, "vcard"]); }, check: function (button) { var player = _status.event.player; return _status.event.getParent().type == "phase" ? player.getUseValue({ name: button.link[2] }) : 1; }, backup: function (links, player) { return { filterCard: function (card, player) { return !player.getStorage("starlifeng_count").includes(get.color(card, player)); }, precontent: function () { delete event.result.skill; player.logSkill("starlifeng"); event.getParent().addCount = false; }, popname: true, viewAs: { name: links[0][2], }, ai1: function (card) { var player = _status.event.player; var num = player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); if (player.hasSkill("starsujin") && Math.abs(num) == 1) { if (num == 1 && get.type(card) != "basic") return 15 - get.value(card); if (num == -1 && get.type(card) == "basic") return 15 - get.value(card); } return 7 - get.value(card); }, }; }, prompt: function (links) { return "将一张本回合未使用过的颜色的手牌当做【" + get.translation(links[0][2]) + "】使用"; }, }, hiddenCard: function (player, name) { if (name == "wuxie") return player.countCards("hs", card => { return !player.getStorage("starlifeng_count").includes(get.color(card, player)) || _status.connectMode; }); }, ai: { respondSha: true, skillTagFilter: function (player, tag, arg) { if (arg == "respond") return false; if ( !player.countCards("hs", card => { return !player.getStorage("starlifeng_count").includes(get.color(card, player)) || _status.connectMode; }) ) return false; }, order: 10, result: { player: 1 }, }, group: "starlifeng_mark", subSkill: { mark: { charlotte: true, trigger: { global: "useCard1" }, filter: function (event, player) { return !player.getStorage("starlifeng_count").includes(get.color(event.card)); }, forced: true, popup: false, firstDo: true, content: function () { player.addTempSkill("starlifeng_count"); player.markAuto("starlifeng_count", [get.color(trigger.card)]); }, }, count: { charlotte: true, onremove: true, }, }, }, //小程序刘伶 mpjiusong: { audio: 2, enable: "chooseToUse", trigger: { global: "useCard" }, filterCard: function (card) { return get.type2(card) == "trick"; }, viewAs: { name: "jiu" }, position: "hs", viewAsFilter: function (player) { return player.hasCard(card => get.type2(card) == "trick", "hs"); }, check: function (card) { if (get.itemtype(card) !== "card") return true; if (get.event().type == "dying") return 1 / Math.max(0.1, get.value(card)); return 4 - get.value(card); }, prompt: "将一张锦囊牌当【酒】使用", filter: function (event, player) { if (event.name == "chooseToUse") return player.hasCard(card => get.type2(card) == "trick", "hs"); return event.card.name == "jiu" && player.countMark("mpjiusong") < 3; }, forced: true, locked: false, content: function () { player.addMark("mpjiusong"); }, marktext: "醉", intro: { name: "醉(酒颂/酕醄)", name2: "醉", content: "mark", }, }, mpmaotao: { audio: 2, trigger: { global: "useCardToPlayer" }, filter: function (event, player) { if (event.targets.length != 1 || !event.isFirstTarget) return false; if (!["basic", "trick"].includes(get.type(event.card))) return false; return event.player != player && player.countMark("mpjiusong"); }, prompt2: function (event, player) { let list; if (get.type(event.card) != "delay") list = game.filterPlayer(current => { return lib.filter.targetEnabled2(event.card, event.player, current); }); else list = game.filterPlayer(current => current.canAddJudge(event.card)); const gainText = `${list.length > 1 && !player.storage.mpmaotao_gained ? `若新目标与原目标相同,你` : ""}${!player.storage.mpmaotao_gained ? "获得牌堆中的一张锦囊牌。" : ""}`; return `移去1枚“醉”${list.length > 1 ? `,令${get.translation(event.card)}目标改为${get.translation(list)}中的一名随机角色` : ""}。${gainText}`; }, check: function (event, player) { const eff = get.effect(event.target, event.card, player, player); let list; if (get.type(event.card) != "delay") list = game.filterPlayer(current => { return lib.filter.targetEnabled2(event.card, event.player, current); }); else list = game.filterPlayer(current => current.canAddJudge(event.card)); let list2 = list.filter(current => get.effect(current, event.card, player, player) > eff); let list3 = list.filter(current => get.effect(current, event.card, player, player) > 0); return list2.length >= list.length / 2 || (player.countMark("mpjiusong") >= 2 && list3.length >= list.length / 2); }, content: function () { player.removeMark("mpjiusong", 1); var list, oriTarget = trigger.target; trigger.targets.remove(oriTarget); trigger.getParent().triggeredTargets1.remove(oriTarget); trigger.untrigger(); game.delayx(); if (get.type(trigger.card) != "delay") list = game.filterPlayer(current => { return lib.filter.targetEnabled2(trigger.card, trigger.player, current); }); else list = game.filterPlayer(current => current.canAddJudge(trigger.card)); if (list.length) target = list.randomGet(); trigger.targets.push(target); trigger.player.line(target, "thunder"); game.log(trigger.card, "的目标被改为", target); if (target == oriTarget && !player.storage.mpmaotao_gained) { var card = get.cardPile2(card => get.type2(card) == "trick"); if (card) { if (!player.storage.mpmaotao_gained) { player.when({ global: "phaseAfter" }).then(() => { delete player.storage.mpmaotao_gained; }); player.storage.mpmaotao_gained = true; } player.gain(card, "gain2"); } else { // player.chat('没酒了!'); // game.log('但是牌堆中已经没有','#y酒','了!'); player.chat("没牌了!"); game.log("但是牌堆中已经没有", "#y锦囊牌", "了!"); } } }, }, mpbishi: { audio: 2, forced: true, trigger: { global: "useCard1" }, filter: function (event, player) { if (get.type2(event.card) != "trick" || !get.tag(event.card, "damage")) return false; if (!lib.skill.xunshi.isXunshi(event.card)) return false; const targets = event.targets.slice(); targets.remove(event.player); return targets.length == game.countPlayer() - 2; }, content: function* () {}, mod: { targetEnabled: function (card) { if (get.type2(card) == "trick" && get.tag(card, "damage") > 0) return false; }, }, }, //十周年嵇康 dcjuexiang: { derivation: "dccanyun", audio: "juexiang", trigger: { player: "die" }, forced: true, locked: false, forceDie: true, skillAnimation: true, animationColor: "water", content: function () { "step 0"; if (trigger.source && trigger.source.isIn()) { trigger.source.discard(trigger.source.getCards("e")); trigger.source.loseHp(); } "step 1"; player .chooseTarget("绝响:是否令一名其他角色获得技能〖残韵〗?", lib.filter.notMe) .set("ai", function (target) { return get.attitude(_status.event.player, target); }) .set("forceDie", true); "step 2"; if (result.bool) { var target = result.targets[0]; player.line(target, "thunder"); target.addSkills("dccanyun"); } }, }, dccanyun: { enable: "phaseUse", filter: function (event, player) { return game.hasPlayer(function (target) { return lib.skill.dccanyun.filterTarget(null, player, target); }); }, filterTarget: function (card, player, target) { var list = [player]; player.getAllHistory("useSkill", function (evt) { if (evt.skill == "dccanyun") list.addArray(evt.targets); }); return !list.includes(target) && !ui.selected.targets.length; }, selectTarget: [1, 2], targetprompt: function (target) { var pe = _status.event.player.countCards("e", function (card) { return ui.selected.cards.includes(card) == false; }); var te = target.countCards("e"); if (pe > te) return "回复体力"; else if (pe == te) return "摸一张牌"; else if (pe < te) return "失去体力"; }, filterCard: true, position: "he", check: function (cardx) { var player = _status.event.player; var number = game.countPlayer(function (target) { if (player == target) return false; var pe = player.countCards("e", function (card) { return card != cardx && ui.selected.cards.includes(card) == false; }); var te = target.countCards("e"); if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; else if (pe < te && get.attitude(player, target) < 0) return true; return false; }); if (ui.selected.cards.length < number) return 6 - get.value(cardx); else return 0; }, usable: 1, content: function () { var pe = player.countCards("e"); var te = target.countCards("e"); if (pe > te) target.recover(); else if (pe == te) target.draw(); else if (pe < te) target.loseHp(); }, contentAfter: function () { if (player.hp == 1) player.draw(); }, ai: { order: 10, result: { target: function (player, target) { var pe = player.countCards("e"); var te = target.countCards("e"); if (pe > te && target.isDamaged()) return 2; else if (pe == te) return 1; else if (pe < te) return -2.5; else return 0; }, }, }, }, //董翓 dcjiaoxia: { mod: { cardUsableTarget: function (card, player, target) { if (!player.isPhaseUsing()) return; if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) return true; }, targetInRange: function (card, player, target) { if (!player.isPhaseUsing()) return; if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) return true; }, }, audio: 2, locked: false, trigger: { player: "phaseUseBegin" }, filter: function (event, player) { return player.countCards("h"); }, check: function (event, player) { return player.countCards("h", card => { return game.hasPlayer(target => { var cardx = get.autoViewAs({ name: "sha" }, [card]); return player.canUse(cardx, target) && get.effect(target, cardx, player, player) > 0 && (!player.hasUseTarget(card) || player.hasValueTarget(card)); }); }); }, content: function () { var cards = player.getCards("h"); player.addTempSkill("dcjiaoxia_used", "phaseUseAfter"); player.addGaintag(cards, "dcjiaoxia_used"); }, group: "dcjiaoxia_load", subSkill: { load: { charlotte: true, trigger: { player: "useCard1" }, filter: function (event, player) { if (!player.isPhaseUsing()) return false; return event.card.name == "sha" && event.targets && event.targets.some(target => !player.getStorage("dcjiaoxia_mark").includes(target)); }, forced: true, popup: false, firstDo: true, content: function () { player.addTempSkill("dcjiaoxia_mark", "phaseUseAfter"); player.markAuto( "dcjiaoxia_mark", trigger.targets.filter(target => !player.getStorage("dcjiaoxia_mark").includes(target)) ); }, }, mark: { charlotte: true, onremove: true, }, used: { mod: { aiOrder: function (player, card, num) { if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) return num + 1; }, cardname: function (card, player) { if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) return "sha"; }, }, charlotte: true, onremove: function (player) { player.removeGaintag("dcjiaoxia_used"); }, trigger: { player: "useCardAfter" }, filter: function (event, player) { return ( event.cards && event.cards.length == 1 && player.hasUseTarget(get.copy(event.cards[0])) && player.getHistory("lose", evt => { if (evt.getParent() != event) return false; for (var i in evt.gaintag_map) { if (evt.gaintag_map[i].includes("dcjiaoxia_used")) return true; } return false; }).length && player.getHistory("sourceDamage", evt => evt.card == event.card).length && player.hasUseTarget(event.cards[0]) ); }, direct: true, content: function () { player.chooseUseTarget(trigger.cards[0], get.prompt("dcjiaoxia"), false, false).set("prompt2", "使用" + get.translation(card)).logSkill = "dcjiaoxia"; }, }, }, }, dchumei: { subSkill: { 0: { charlotte: true }, 1: { charlotte: true }, 2: { charlotte: true }, }, onChooseToUse: function (event) { if (!game.online && !event.dchumei_num) { var player = event.player; var evtx = event.getParent("phaseUse"); event.set( "dchumei_num", player .getHistory("sourceDamage", evt => { return evt.getParent("phaseUse") == evtx; }) .reduce((sum, evt) => sum + evt.num, 0) ); } }, audio: 2, enable: "phaseUse", filter: function (event, player) { if (typeof event.dchumei_num != "number") return false; return game.hasPlayer(target => lib.skill.dchumei.filterTarget(null, player, target)); }, filterTarget: function (card, player, target) { if (target.getHp() > _status.event.dchumei_num) return false; if (!player.hasSkill("dchumei_0")) return true; if (!player.hasSkill("dchumei_1") && target.countCards("he")) return true; if (!player.hasSkill("dchumei_2") && target.isDamaged()) return true; return false; }, content: function () { "step 0"; var str = get.translation(target); player .chooseButton( [ "狐魅:请选择一项", [ [ [0, "令" + str + "摸一张牌"], [1, "令" + str + "交给你一张牌"], [2, "令" + str + "回复1点体力"], ].filter(list => { if (player.hasSkill("dchumei_" + list[0])) return false; if (list[0] == 1 && !target.countCards("he")) return false; if (list[0] == 2 && target.isHealthy()) return false; return true; }), "textbutton", ], ], true ) .set("filterButton", button => { var target = _status.event.target; if (player.hasSkill("dchumei_" + button.link)) return false; if (button.link == 1 && !target.countCards("he")) return false; if (button.link == 2 && target.isHealthy()) return false; return true; }) .set("ai", function (button) { var target = _status.event.target; return [get.effect(target, { name: "draw" }, player, player), get.effect(target, { name: "shunshou_copy2" }, player, player), get.recoverEffect(target, player, player)][button.link]; }) .set("target", target); "step 1"; if (result.bool) { var num = result.links[0]; player.addTempSkill("dchumei_" + num, "phaseUseAfter"); switch (num) { case 0: target.draw(); break; case 1: target.chooseCard("狐魅:交给" + get.translation(player) + "一张牌", "he", true); break; case 2: target.recover(); break; } if (num != 1) event.finish(); } else event.finish(); "step 2"; if (result.bool) player.gain(result.cards, target, "giveAuto"); }, ai: { order: 1, result: { target: function (player, target) { if (!player.hasSkill("dchumei_0")) return 1; if (!player.hasSkill("dchumei_1")) return -1; if (!player.hasSkill("dchumei_2")) return 1; }, }, }, }, //魏关羽 dcdanji: { audio: "danji", skillAnimation: true, animationColor: "water", trigger: { player: "phaseZhunbeiBegin" }, forced: true, juexingji: true, derivation: ["mashu", "dcnuchen"], filter(event, player) { return player.countCards("hej") > player.getHp(); }, async content(event, trigger, player) { player.awakenSkill("dcdanji"); await player.loseMaxHp(); await player.recover(player.maxHp - player.hp); await player.draw(player.getHp()); await player.addSkills(["mashu", "dcnuchen"]); }, ai: { maixie: true, skillTagFilter: (player, tag, arg) => { if (tag === "maixie") return player.hp >= 2 && !player.storage.dcdanji && !player.hasSkill("dcnuchen") && player.countCards("h") === player.hp; }, effect: { target: (card, player, target) => { let hs = target.countCards("h"); if (target.hp < 3 || target.storage.dcdanji || target.hasSkill("dcnuchen") || hs > target.hp + 1) return; if (get.tag(card, "draw")) return 1.6; if (get.tag(card, "lose") || get.tag(card, "discard")) return [1, -0.8]; if (hs === target.hp && get.tag(card, "damage")) return [1, target.hp / 3]; if (hs > target.hp && target.hp > 3 && (card.name === "shan" || card.name === "wuxie")) return "zeroplayertarget"; }, }, }, }, dcnuchen: { audio: 2, enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return target.countCards("h") && target != player; }, content: function () { "step 0"; player.choosePlayerCard(target, true, "h"); "step 1"; if (result.bool) { var card = result.cards[0]; event.card = card; player.showCards(card, get.translation(player) + "对" + get.translation(target) + "发动了【怒嗔】"); } else event.finish(); "step 2"; var suit = get.suit(card); var str = get.translation(suit); player .chooseToDiscard("怒嗔:是否弃置至少一张" + str + "牌?", "若如此做,你对其造成等量伤害;或点击“取消”,获得其所有" + str + "手牌", "he", { suit: suit }, [1, Infinity]) .set("ai", card => { if (ui.selected.cards.length >= _status.event.num) return 0; return 6 - get.value(card); }) .set( "num", (function () { var eff = get.damageEffect(target, player, player); if (eff > 0) { if (get.attitude(player, target) > 0) { return 1; } var cards = target.getCards("h", { suit: suit }); if (cards.length > 2 || get.value(cards) >= 6) { return 0; } if (!player.hasSkillTag("jueqing", false, target) && target.hasSkillTag("filterDamage", null, { player: player })) return 1; return Infinity; } return 0; })() ); "step 3"; if (result.bool) { target.damage(result.cards.length); } else { var cards = target.getCards("h", { suit: get.suit(card) }); if (cards.length) player.gain(cards, target, "giveAuto", "bySelf"); } }, ai: { expose: 0.4, order: 10, result: { target: function (player, target) { return -Math.sqrt(target.countCards("h")); }, }, }, }, //孟达 dclibang: { audio: 2, enable: "phaseUse", usable: 1, filterCard: true, position: "he", filter: function (event, player) { return ( player.hasCard(function (card) { return lib.filter.cardDiscardable(card, player, "dclibang"); }, "he") && game.countPlayer(current => current != player) >= 2 ); }, filterTarget: function (card, player, target) { return target != player; }, selectTarget: 2, multiline: true, multitarget: true, content: function () { "step 0"; event.num = 0; event.cardsx = []; event.targets.sortBySeat(); "step 1"; var current = targets[event.num]; if (current.countCards("he")) player.gainPlayerCard(current, "he", true, "visibleMove"); event.num++; "step 2"; if (result.bool) { var card = result.cards[0]; event.cardsx.push(card); } if (event.num < targets.length) event.goto(1); "step 3"; player.judge().set("callback", lib.skill.dclibang.contentx); }, contentx: function () { "step 0"; var card = event.judgeResult.card; var color = event.judgeResult.color; var player = event.getParent(2).player; var cards = event.getParent(2).cardsx; for (var cardx of cards) { if (get.color(cardx) == color) { if (get.position(card, true) == "o") player.gain(card, "gain2"); return; } } event.goto(3); "step 1"; var targets = event.getParent(2).targets.filter(target => { return player.canUse("sha", target); }); if (!targets.length) event.finish(); else player .chooseTarget("利傍:视为对其中一名角色使用一张【杀】", true, (card, player, target) => { return _status.event.targets.includes(target); }) .set("targets", targets) .set("ai", target => { return get.effect(target, { name: "sha" }, player, player); }); "step 2"; if (result.bool) { player.useCard({ name: "sha", isCard: true }, result.targets[0], false); } event.finish(); "step 3"; player.chooseCardTarget({ filterCard: function (card) { return get.itemtype(card) == "card"; }, filterTarget: function (card, player, target) { return _status.event.targets.includes(target); }, selectCard: 2, targets: event.getParent(2).targets, position: "he", prompt: "交给其中一名角色两张牌,或失去1点体力", ai1: function (card) { return 1; }, ai2: function (target) { var player = _status.event.player, card = ui.selected.cards[0]; var val = get.value(card, target); if (val > 0) return get.attitude(player, target) * 2; return (val - 2) * get.attitude(player, target); }, }); "step 4"; if (result.bool) { player.give(result.cards, result.targets[0]); } else player.loseHp(); }, ai: { order: 8, result: { target: function (player, target) { if (get.attitude(player, target) > 0 && ui.selected.targets.length) return 0.1; return -1; }, }, }, }, dcwujie: { audio: 2, trigger: { global: ["discardBegin", "drawBegin"], }, forced: true, forceDie: true, group: "dcwujie_inf", logTarget: "player", filter: function (event, player) { return event.getParent().name == "die" && event.getParent().source == event.player && event.player != player && event.getParent().player == player; }, content: function () { trigger.cancel(); }, subSkill: { inf: { trigger: { player: "useCard1" }, forced: true, popup: false, firstDo: true, filter: function (event, player) { if (get.color(event.card) == "none" && event.addCount !== false) return true; return false; }, content: function () { trigger.addCount = false; var stat = player.getStat().card, name = trigger.card.name; if (typeof stat[name] == "number") stat[name]--; }, }, }, mod: { targetInRange: function (card, player) { const color = get.color(card); if (color === "none" || color === "unsure") return true; }, cardUsable: function (card) { const color = get.color(card); if (color === "none" || color === "unsure") return Infinity; }, }, }, //关宁 dcxiuwen: { audio: 2, trigger: { player: "useCard" }, filter: function (event, player) { return !player.getStorage("dcxiuwen").includes(event.card.name); }, frequent: true, content: function () { player.draw(); player.markAuto("dcxiuwen", [trigger.card.name]); }, intro: { content: "已使用:$" }, }, oldlongsong: { audio: "dclongsong", trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { return player.countCards("h") > 0; }, getSkills: function (target, player, trigger) { return target.getSkills(null, false).filter(skill => { var skills = game.expandSkills([skill]); if ( skills.filter(skillx => { var info = get.info(skillx); if (!info || !info.enable || (info.usable && !(info.usable >= 1))) return false; if (info.enable != "phaseUse" && (!Array.isArray(info.enable) || !info.enable.includes("phaseUse"))) return false; if (info.viewAs && info.usable && info.usable != 1) return false; if (info.juexingji || info.hiddenSkill || info.charlotte || info.limited || info.dutySkill) return false; if ((!info.usable || info.usable > 1) && info.filter) { try { var bool1 = info.filter(trigger, player); var num = player.getStat().skill[skillx]; player.getStat().skill[skillx] = 1; var bool2 = info.filter(trigger, player); if (!num) delete player.getStat().skill[skillx]; else player.getStat().skill[skillx] = num; var bool3 = !(bool1 && !bool2); } catch (e) { console.trace(e); } if (!bool1 && !bool2 && get.skillInfoTranslation(skill, player).indexOf("出牌阶段限一次") == -1) return false; if ((bool1 || bool2) && bool3) return false; } return true; }).length ) return true; return false; }); }, content: function () { "step 0"; player.chooseCardTarget({ filterCard: true, selectCard: 1, filterTarget: function (card, player, target) { return player != target; }, ai1: function (card) { return 6 - get.value(card); }, ai2: function (target) { var att = get.attitude(_status.event.player, target), trigger = _status.event.getTrigger(), player = _status.event.player; return lib.skill.oldlongsong.getSkills(target, player, trigger).length * 3 + att / 3; }, prompt: get.prompt2("oldlongsong"), }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("oldlongsong", target); event.target = target; player.line(target, "green"); player.give(result.cards, target); var skills = lib.skill.oldlongsong.getSkills(target, player, trigger); if (skills.length) { if (!event.isMine() && !event.isOnline()) game.delayx(); target.disableSkill("oldlongsong_back", skills); target.markAuto("oldlongsong_back", skills); target.addTempSkill("oldlongsong_back", ["phaseUseAfter", "phaseAfter"]); var str = ""; for (var i = 0; i < skills.length; i++) { str += "【" + get.translation(skills[i]) + "】"; if (i != skills.length - 1) str += "、"; } game.log(target, "的技能", "#g" + str, "失效了"); // game.log(player,'获得了技能','#g'+str); player.popup(skills, "thunder"); for (var skill of skills) { player.addTempSkills(skill, ["phaseUseAfter", "phaseAfter"]); } } } }, ai: { expose: 0.2 }, subSkill: { back: { charlotte: true, onremove: function (player, skill) { var skills = player.getStorage("oldlongsong_back"); for (var key of skills) { game.log(player, "恢复了技能", "#g【" + get.translation(key) + "】"); delete player.storage[key]; } player.enableSkill(skill); player.popup(skills, "thunder"); }, }, }, }, dclongsong: { audio: 2, trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { return player.countCards("h") > 0; }, getSkills(target, skills) { return (target && !skills ? target.getSkills(null, false) : skills).filter(skill => { var str = get.skillInfoTranslation(skill, target); if (str.indexOf("当你于出牌阶段") != -1) return true; var skills = game.expandSkills([skill]); if ( skills.some(skillx => { var info = get.info(skillx); if (!info || !info.enable) return false; if (info.enable != "phaseUse" && info.enable != "chooseToUse" && (!Array.isArray(info.enable) || (!info.enable.includes("phaseUse") && !info.enable.includes("chooseToUse")))) return false; if (info.juexingji || info.hiddenSkill || info.charlotte || info.limited || info.dutySkill) return false; if (info.ai && info.ai.notemp) return false; return true; }) ) return true; return false; }); }, content: function () { "step 0"; player.chooseCardTarget({ filterCard: { color: "red" }, selectCard: 1, position: "he", filterTarget: function (card, player, target) { return player != target; }, ai1: function (card) { return 6 - get.value(card); }, ai2: function (target) { var att = get.attitude(_status.event.player, target); return lib.skill.dclongsong.getSkills(target).length * 2 + att / 2.5; }, prompt: get.prompt2("dclongsong"), }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("dclongsong", target); event.target = target; player.line(target, "green"); player.give(result.cards, target); var skills = lib.skill.dclongsong.getSkills(target); if (skills.length) { if (!event.isMine() && !event.isOnline()) game.delayx(); target.disableSkill("dclongsong_back", skills); target.markAuto("dclongsong_back", skills); player.addTempSkill("dclongsong_remove", ["phaseUseAfter", "phaseAfter"]); player.markAuto("dclongsong_remove", skills); target.addTempSkill("dclongsong_back", ["phaseUseAfter", "phaseAfter"]); var str = ""; for (var i = 0; i < skills.length; i++) { str += "【" + get.translation(skills[i]) + "】"; if (i != skills.length - 1) str += "、"; } game.log(target, "的技能", "#g" + str, "失效了"); // game.log(player,'获得了技能','#g'+str); player.popup(skills, "thunder"); for (var skill of skills) { player.addTempSkills(skill, ["phaseUseAfter", "phaseAfter"]); } } } }, ai: { expose: 0.2 }, subSkill: { back: { charlotte: true, onremove: function (player, skill) { var skills = player.getStorage("dclongsong_back"); for (var key of skills) { game.log(player, "恢复了技能", "#g【" + get.translation(key) + "】"); //delete player.storage[key]; } player.enableSkill(skill); player.popup(skills, "thunder"); }, }, remove: { trigger: { player: ["useSkill", "logSkillBegin"] }, forced: true, charlotte: true, popup: false, onremove: true, filter: function (event, player) { var skill = event.sourceSkill || event.skill; return player.getStorage("dclongsong_remove").includes(skill) && !player.getStockSkills(false, true).includes(skill); }, content: function () { "step 0"; var skill = trigger.sourceSkill || trigger.skill; player.removeSkills(skill); player.unmarkAuto("dclongsong_remove", [skill]); }, }, }, }, longsong: { audio: "dclongsong", trigger: { player: "phaseUseBegin" }, filter(event, player) { return game.hasPlayer(target => { if (target == player) return false; return target.hasCard(card => { if (get.position(card) == "h") return true; return get.color(card) == "red" && lib.filter.canBeGained(card, player, target); }, "he"); }); }, async cost(event, trigger, player) { event.result = await player .chooseCardTarget({ prompt: get.prompt2("longsong"), filterTarget(card, player, target) { if (target === player) return false; const skills = lib.skill.dclongsong.getSkills(target).map(skill => get.translation(skill)); if (skills.length) { target.prompt(skills.join("
")); } return ( ui.selected.cards.length || target.hasCard(card => { if (get.position(card) == "h") return true; return get.color(card) == "red" && lib.filter.canBeGained(card, player, target); }, "he") ); }, filterCard: { color: "red" }, selectCard: [0, 1], multitarget: true, ai1(card) { const ai2 = get.event("ai2"); if ( game.hasPlayer(current => { return ai2(current) > 0; }) ) { return -1 - get.value(card); } return 6 - get.value(card); }, ai2(target) { const player = get.event("player"), att = get.attitude(player, target); if (att > 0 && !target.getGainableCards(player, "he").some(card => get.color(card) == "red")) return 0; return lib.skill.dclongsong.getSkills(target).length + (att > 0 ? 0 : Math.max(0, get.effect(target, { name: "shunshou_copy2" }, player, player))); }, }) .forResult(); }, async content(event, trigger, player) { const target = event.targets[0], cards = event.cards, gainableCards = target.getGainableCards(player, "he").filter(card => get.color(card) == "red"); if (cards) { await player.give(cards, target); } else { if (gainableCards.length) { let dialog = ["龙诵:获得" + get.translation(target) + "的一张红色牌"]; let cards1 = gainableCards.filter(i => get.position(i) == "h"), cards2 = gainableCards.filter(i => get.position(i) == "e"); if (cards1.length) { dialog.push('
手牌区
'); if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(cards1); else dialog.push([cards1.randomSort(), "blank"]); } if (cards2.length) { dialog.push('
装备区
'); dialog.push(cards2); } const { result: { bool, links }, } = await player.chooseButton(dialog, true).set("ai", button => { const player = get.event("player"), target = get.event().getParent().targets[0]; return get.value(button.link, player) * get.value(button.link, target) * (1 + Math.random()); }); if (!bool) return; await player.gain(links, target, "giveAuto", "bySelf"); } else { player.popup("杯具"); player.chat("无牌可得?!"); game.log("但是", target, "没有红色牌可被" + get.translation(player) + "获得!"); } } let skills = lib.skill.dclongsong.getSkills(target), fromTarget = true; if (!skills.length) { if (!_status.characterlist) { lib.skill.pingjian.initList(); } const allList = _status.characterlist.slice(0); allList.randomSort(); for (const name of allList) { const curSkills = lib.character[name][3]; const filteredSkills = lib.skill.dclongsong.getSkills(null, curSkills); if (filteredSkills.length > 0) { skills = filteredSkills.randomGets(1); fromTarget = false; break; } } } if (!skills.length) return; if (!event.isMine() && !event.isOnline()) await game.asyncDelayx(); skills.forEach(skill => { player.popup(skill, "thunder"); }); if (fromTarget) { target.disableSkill("dclongsong_back", skills); target.markAuto("dclongsong_back", skills); target.addTempSkill("dclongsong_back", ["phaseUseAfter", "phaseAfter"]); let str = ""; for (let i = 0; i < skills.length; i++) { str += "【" + get.translation(skills[i]) + "】"; if (i != skills.length - 1) str += "、"; } game.log(target, "的技能", "#g" + str, "失效了"); } player.addTempSkill("dclongsong_remove", ["phaseUseAfter", "phaseAfter"]); player.markAuto("dclongsong_remove", skills); await player.addTempSkills(skills, ["phaseUseAfter", "phaseAfter"]); }, }, //伏完 dcmoukui: { audio: "moukui", trigger: { player: "useCardToPlayered" }, direct: true, filter: function (event, player) { return event.card && event.card.name == "sha" && event.isFirstTarget; }, content: function () { "step 0"; player .chooseButton([ get.prompt("dcmoukui"), [ [ ["draw", "摸一张牌"], ["discard", "弃置" + (trigger.targets.length == 1 ? get.translation(trigger.targets[0]) : "一名目标角色") + "的一张牌"], ], "textbutton", ], ]) .set("filterButton", button => { if ( button.link == "discard" && _status.event.getTrigger().targets.every(target => { return target.countDiscardableCards(_status.event.player, "he") == 0; }) ) return false; return true; }) .set("ai", function (button) { if ( button.link == "discard" && _status.event.getTrigger().targets.every(target => { return get.effect(target, { name: "guohe_copy2" }, _status.event.player) <= 0; }) ) return 0; return 1; }) .set("selectButton", [1, 2]); "step 1"; if (result.bool) { player.logSkill("dcmoukui"); var choices = result.links; event.choices = choices; if (choices.includes("draw")) { game.log(player, "选择了", "#y选项一"); player.draw(); } if (choices.includes("discard")) { game.log(player, "选择了", "#y选项二"); if (trigger.targets.length == 1) event.directtarget = trigger.targets[0]; else player .chooseTarget("谋溃:弃置一名目标角色的一张牌", true, (card, player, target) => { return _status.event.getTrigger().targets.includes(target) && target.countDiscardableCards(player, "he") > 0; }) .set("ai", target => { return get.effect(target, { name: "guohe_copy2" }, _status.event.player); }); } else event.finish(); if (choices.length >= 2) { player.addTempSkill("dcmoukui_conseq"); player.markAuto("dcmoukui_conseq", [trigger.card]); } } "step 2"; player.discardPlayerCard(event.directtarget || result.targets[0], true, "he").boolline = true; }, subSkill: { conseq: { trigger: { global: ["shaMiss", "useCardToExcluded", "eventNeutralized", "shaCancelled"], }, forced: true, popup: false, charlotte: true, onremove: true, filter: function (event, player, name) { if (!event.card) return false; var cards = player.getStorage("dcmoukui_conseq"); if (!cards.includes(event.card)) return false; return true; }, content: function () { "step 0"; game.delayx(); "step 1"; trigger.target.discardPlayerCard(player, true, "he").boolline = true; }, }, }, }, //孙桓 dcniji: { audio: 2, trigger: { target: "useCardToTargeted" }, filter: function (event, player) { return get.type(event.card) != "equip"; }, frequent: true, group: "dcniji_discard", content: function () { var next = player.draw(); var evt = trigger.getParent("dcniji_discard"); if (!evt || evt.player != player) next.gaintag = ["dcniji"]; player.addTempSkill("dcniji_clear"); }, subSkill: { clear: { charlotte: true, onremove: function (player) { player.removeGaintag("dcniji"); }, }, discard: { audio: "dcniji", trigger: { global: "phaseJieshuBegin" }, filter: function (event, player) { return player.hasCard(card => card.hasGaintag("dcniji") && lib.filter.cardDiscardable(card, player, "dcniji"), "h"); }, forced: true, locked: false, content: function () { "step 0"; var cards = player.getCards("h", card => card.hasGaintag("dcniji") && lib.filter.cardDiscardable(card, player, "dcniji")); event.cards = cards; // if(cards.length>=player.hp){ if (cards.some(card => player.hasUseTarget(card))) { player.chooseToUse({ prompt: "是否使用一张“逆击”牌?", filterCard: function (card, player) { if (get.itemtype(card) == "card" && !card.hasGaintag("dcniji")) return false; return lib.filter.filterCard.apply(this, arguments); }, ai1: function (card) { return get.player().getUseValue(card); }, }); } // } "step 1"; if (result.bool) game.delayex(); var cards = cards.filter(card => get.owner(card) == player && get.position(card) == "h" && lib.filter.cardDiscardable(card, player, "dcniji")); if (cards.length) player.discard(cards); }, }, }, }, //孙狼 dctingxian: { audio: 2, trigger: { player: "useCardToPlayered" }, usable: 1, filter: function (event, player) { return event.card.name == "sha" && event.getParent().triggeredTargets3.length == event.targets.length; }, check: function (event, player) { return event.targets.some(target => get.effect(target, event.card, player, player) <= 0); }, content: function () { "step 0"; var num = player.countCards("e") + 1; event.num = num; player.draw(num); "step 1"; var num = Math.min(trigger.targets.length, num); player .chooseTarget("铤险:令此杀对其中至多" + get.cnNumber(num) + "个目标无效", [1, num], true, (card, player, target) => { return _status.event.getTrigger().targets.includes(target); }) .set("ai", target => { return 1 - get.effect(target, _status.event.getTrigger().card, _status.event.player, _status.event.player); }); "step 2"; if (result.bool) { player.line(result.targets); trigger.getParent().excluded.addArray(result.targets); } }, ai: { effect: { player: function (card, player, target) { if (_status.event.name == "chooseToUse" && get.name(card) == "sha" && (!player.storage.counttrigger || !player.storage.counttrigger.dctingxian) && !_status._dctingxian_aiChecking) { _status._dctingxian_aiChecking = true; var eff = get.effect(target, { name: "sha" }, player, player); delete _status._dctingxian_aiChecking; if ( eff < 0 && ui.selected.targets.filter(targetx => { if (targetx == target) return false; _status._dctingxian_aiChecking = true; var eff = get.effect(targetx, { name: "sha" }, player, player); delete _status._dctingxian_aiChecking; if (eff < 0) return true; }).length < player.countCards("e") + 1 ) return [0, 0, 0, 0.5]; } }, }, }, }, dcbenshi: { audio: 2, forced: true, trigger: { player: "useCard1" }, filter: function (event, player) { if (event.card.name != "sha") 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; }, content: function () {}, mod: { attackRangeBase: function (player, num) { if (num !== "unchanged") return num; var range = 1; var equips = player.getCards("e", function (card) { return get.subtype(card) != "equip1" && (!ui.selected.cards || !ui.selected.cards.includes(card)); }); for (var i = 0; i < equips.length; i++) { var info = get.info(equips[i], false).distance; if (!info) continue; if (info.attackFrom) { range -= info.attackFrom; } } return range; }, attackRange: function (player, num) { return num + 1; }, selectTarget: function (card, player, range) { if (card.name == "sha") { range[0] = -1; range[1] = -1; } }, }, }, //是仪 dccuichuan: { audio: 2, enable: "phaseUse", usable: 1, filterTarget: true, filterCard: true, derivation: "dczuojian", filter: function (event, player) { return player.countCards("h") > 0; }, content: function () { "step 0"; event.num = target.countCards("e"); var subtypes = []; for (var i = 1; i < 7; i++) { if (target.hasEmptySlot(i)) subtypes.push("equip" + i); } if (subtypes.length) { subtypes.randomSort(); for (var subtype of subtypes) { var card = get.cardPile2(card => get.subtype(card) == subtype); if (card && target.canUse(card, target)) { target.chooseUseTarget(card, true, "nopopup"); break; } } } "step 1"; var numx = target.countCards("e"); if (numx > 0) player.draw(numx); game.delayx(); "step 2"; event.num2 = target.countCards("e"); if (event.num2 == 4 && num != 4) { player.trySkillAnimate("dccuichuan_animate", "dccuichuan_animate", player.checkShow("dccuichuan")); //player.removeSkill('dccuichuan'); //game.log(player,'失去了技能','#g【榱椽】'); player.changeSkills(["dczuojian"], ["dccuichuan"]); target.insertPhase(); game.delayx(); } }, subSkill: { animate: { skillAnimation: true, animationColor: "wood", }, }, ai: { order: 7, result: { target: function (player, target) { if (target.countCards("e") == 3) return 2; return 1; }, player: function (player, target) { if (target.countCards("e") == 3) return 0.5; return target.countCards("e") + 1; }, }, }, }, dczhengxu: { audio: 2, group: ["dczhengxu_lose", "dczhengxu_damage"], subSkill: { lose: { audio: "dczhengxu", trigger: { player: "loseAfter", global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], }, prompt2: function (event, player) { return "当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌(" + get.cnNumber(event.getl(player).cards2.length) + "张)"; }, check: () => true, filter: function (event, player) { if (event.name == "gain" && event.player == player) return false; if (!player.getHistory("damage").length || player.hasHistory("useSkill", evt => evt.skill == "dczhengxu_lose")) return false; var evt = event.getl(player); return evt && evt.cards2 && evt.cards2.length > 0; }, content: function () { player.draw(trigger.getl(player).cards2.length); }, ai: { effect: { target: (card, player, target) => { if ((get.tag(card, "lose") || get.tag(card, "discard")) && target.getHistory("damage").length && !target.hasHistory("useSkill", evt => evt.skill == "dczhengxu_lose")) return [1, 1]; }, }, }, }, damage: { audio: "dczhengxu", trigger: { player: "damageBegin4", }, prompt2: "当你受到伤害时,若你本回合失去过牌,你可以防止之", check: () => true, filter: function (event, player) { if (!player.hasHistory("lose", evt => evt.cards2 && evt.cards2.length) || player.hasHistory("useSkill", evt => evt.skill == "dczhengxu_damage")) return false; return true; }, content: function () { trigger.cancel(); }, ai: { effect: { target: (card, player, target) => { if (player.hasSkillTag("jueqing", false, target) || !get.tag(card, "damage")) return; if (target.hasHistory("useSkill", evt => evt.skill == "dczhengxu_damage") || !target.hasHistory("lose", evt => evt.cards2 && evt.cards2.length)) return; if (get.attitude(player, target) >= 0) return "zeroplayertarget"; let num = 0, shas = player.getCardUsable("sha"), hs = player.getCards("hs", i => { if (i === card || (card.cards && card.cards.includes(i)) || !get.tag(i, "damage") || !player.canUse(i, target)) return false; if (get.name(i) === "sha") { num++; return false; } return true; }); if (card.name === "sha") shas--; num = Math.min(num, shas); num += hs.length; if (!num) return "zeroplayertarget"; num = 1 - 2 / 3 / num; return [num, 0, num, 0]; }, }, }, }, }, }, dczuojian: { audio: 2, trigger: { player: "phaseUseEnd" }, filter: function (event, player) { return ( player.getHistory("useCard", evt => { var evtx = evt.getParent("phaseUse"); if (evtx && evtx == event) return true; return false; }).length >= player.hp ); }, direct: true, content: function () { "step 0"; var choices = []; var choiceList = ["令装备区牌数多于你的角色各摸一张牌", "令装备区牌数少于你的角色各弃置一张手牌"]; var num = player.countCards("e"); var targets = [], targets2 = []; var eff = 0, eff2 = 0; for (var target of game.filterPlayer()) { if (target.countCards("e") > num) { targets.push(target); eff += get.attitude(player, target); } if (target.countCards("e") < num) { targets2.push(target); eff2 -= get.attitude(player, target); } } event.targets = targets; event.targets2 = targets2; if (targets.length) { choices.push("选项一"); choiceList[0] += "(" + get.translation(targets) + ")"; } else choiceList[0] = '' + choiceList[0] + ""; if (targets2.length) { choices.push("选项二"); choiceList[1] += "(" + get.translation(targets2) + ")"; } else choiceList[1] = '' + choiceList[1] + ""; if (!choices.length) event.finish(); else player .chooseControl(choices, "cancel2") .set("prompt", get.prompt("dczuojian")) .set("choiceList", choiceList) .set("ai", () => { var controls = _status.event.controls, choice = _status.event.choice; if (!controls.includes("选项一") || (controls.includes("选项二") && choice == 1)) return "选项二"; return "选项一"; }) .set("choice", eff <= 0 && eff2 <= 0 ? "cancel2" : eff > -eff2 ? 0 : 1); "step 1"; if (result.control == "选项一") { player.logSkill("dczuojian", targets); game.asyncDraw(targets, 1); } else if (result.control == "选项二") { player.logSkill("dczuojian", event.targets2); for (var target of event.targets2) { player.discardPlayerCard("h", target, true); } } }, }, //胡金定 dcdeshi: { audio: 2, trigger: { player: "damageBegin4" }, forced: true, filter: function (event, player) { return player.isDamaged() && event.card && event.card.name == "sha"; }, content: function () { "step 0"; trigger.cancel(); for (var func of ["discardPile", "cardPile2"]) { var card = get[func](card => card.name == "sha"); if (card) { player.gain(card, "gain2"); break; } } "step 1"; player.loseMaxHp(); }, ai: { halfneg: true, filterDamage: true, skillTagFilter: function (player, tag, arg) { if (arg && arg.card && arg.card.name == "sha") return true; return false; }, }, }, dcwuyuan: { audio: 2, enable: "phaseUse", usable: 1, filter: function (event, player) { return player.countCards("h", "sha") > 0; }, filterCard: { name: "sha" }, filterTarget: lib.filter.notMe, check: function (card) { var player = _status.event.player; if ( get.color(card) == "red" && game.hasPlayer(function (current) { return current != player && current.isDamaged() && get.attitude(player, current) > 2; }) ) return 2; if (get.natureList(card).length) return 1.5; return 1; }, discard: false, lose: false, delay: false, content: function () { "step 0"; player.give(cards, target, "give"); player.recover(); "step 1"; var num = 1; if (get.natureList(cards[0]).length) num++; player.draw("nodelay"); target.draw(num); if (get.color(cards[0]) == "red") target.recover(); }, ai: { order: 1, result: { player: function (player, target) { if (player.isDamaged()) return 1; return 0; }, target: function (player, target) { if (ui.selected.cards.length) { var num = 1; if (get.natureList(ui.selected.cards[0]).length) num++; if (target.hasSkillTag("nogain")) num = 0; if (get.color(ui.selected.cards[0]) == "red") return num + 2; else return num + 1; } return 1; }, }, }, }, //李异谢旌 dcdouzhen: { audio: 2, trigger: { player: ["useCard", "respond"], }, forced: true, zhuanhuanji: "number", mark: true, marktext: "☯", intro: { content: function (storage, player) { var str = "
  • 已转换过" + get.cnNumber(storage || 0) + "次。
  • 你的回合内,"; str += player.countMark("dcdouzhen") % 2 ? "你的红色基本牌均视为普【杀】且无次数限制。" : "你的黑色基本牌均视为【决斗】且使用时获得目标的一张牌。"; return str; }, }, filter: function (event, player) { if (player != _status.currentPhase || !event.card.isCard || !event.cards || event.cards.length != 1 || get.type(event.cards[0]) != "basic") return false; if (player.countMark("dcdouzhen") % 2) return get.color(event.cards[0]) == "red" && event.card.name == "sha"; return event.name != "respond" && get.color(event.cards[0]) == "black" && event.card.name == "juedou"; }, content: function () { if (player.countMark("dcdouzhen") % 2) { // if(trigger.addCount!==false){ // trigger.addCount=false; // if(player.stat[player.stat.length-1].card.sha>0){ // player.stat[player.stat.length-1].card.sha--; // } // } } else { if (trigger.targets.length && trigger.targets.filter(i => i.countGainableCards(player, "he") > 0).length) player.gainMultiple(trigger.targets.sortBySeat(), "he"); } player.changeZhuanhuanji("dcdouzhen"); }, ai: { effect: { player: function (card, player, target) { if (card.name != "juedou") return; if ( player.hasSkillTag( "directHit_ai", true, { target: target, card: card, }, true ) ) { return [1, 1]; } var hs1 = target.getCards("h", "sha"); var hs2 = player.getCards("h", card => (get.color(card) == "red" && get.type(card) == "basic") || get.name(card) == "sha"); var hsx = target.getCards("h"); if (hs1.length > hs2.length + 1 || (hsx.length > 2 && hs2.length == 0 && hsx[0].number < 6) || (hsx.length > 3 && hs2.length == 0) || (hs1.length > hs2.length && (!hs2.length || hs1[0].number > hs2[0].number))) { return [1, -2]; } return [1, -0.5]; }, }, }, mod: { cardname: function (card, player) { if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; if (player.countMark("dcdouzhen") % 2) { if (get.color(card) == "red") return "sha"; } else { if (get.color(card) == "black") return "juedou"; } }, cardnature: function (card, player) { if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; if (player.countMark("dcdouzhen") % 2) { if (get.color(card) == "red") return false; } }, cardUsable: function (card, player) { if (_status.currentPhase == player && card.name == "sha" && player.countMark("dcdouzhen") % 2 && get.color(card) == "red" && card.isCard) return Infinity; }, }, }, //穆顺 dcjinjian: { audio: 2, trigger: { player: "damageEnd", source: "damageSource", }, forced: true, locked: false, filter: function (event, player, name) { return name == "damageSource" || (event.source && event.source != player && event.source.isIn()); }, content: function () { "step 0"; player.addMark("dcjinjian", 1); game.delayx(); "step 1"; var source = trigger.source; if (source && source != player && source.isIn() && player.canCompare(source)) { player .chooseBool("是否和" + get.translation(source) + "拼点?", "若你赢,则你恢复1点体力") .set( "goon", (player.countCards("h") == 1 || player.hasCard(function (card) { return get.value(card) <= 5 || get.number(card) > 10; })) && (get.attitude(player, source) <= 0 || source.countCards("h") >= 4) ) .set("ai", function () { return _status.event.goon; }); } else event.finish(); "step 2"; if (result.bool) { player.line(trigger.source, "green"); player.chooseToCompare(trigger.source); } else event.finish(); "step 3"; if (result.bool) player.recover(); }, intro: { name2: "劲", content: "mark", }, mod: { attackRange: function (player, num) { return num + player.countMark("dcjinjian"); }, }, }, dcshizhao: { audio: 2, usable: 1, trigger: { player: ["loseAfter"], global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], }, forced: true, filter: function (event, player) { return player != _status.currentPhase && player.countCards("h") == 0 && event.getl(player).hs.length > 0; }, content: function () { if (player.hasMark("dcjinjian")) { player.removeMark("dcjinjian", 1); player.draw(2); } else { player.addTempSkill("dcshizhao_effect"); player.addMark("dcshizhao_effect", 1, false); game.delayx(); } }, subSkill: { effect: { charlotte: true, onremove: true, trigger: { player: "damageBegin1" }, forced: true, content: function () { trigger.num += player.countMark(event.name); player.removeSkill(event.name); }, }, }, ai: { combo: "dcjinjian", }, }, //赵俨 dcfuning: { audio: 2, trigger: { player: "useCard" }, prompt2: function (event, player) { return ( "摸两张牌,然后弃置" + get.cnNumber( 1 + player.getHistory("useSkill", function (evt) { return evt.skill == "dcfuning"; }).length ) + "张牌" ); }, check: function (event, player) { return ( player.getHistory("useSkill", function (evt) { return evt.skill == "dcfuning"; }).length < 2 ); }, content: function () { player.draw(2); player.chooseToDiscard( "he", true, +player.getHistory("useSkill", function (evt) { return evt.skill == "dcfuning"; }).length ); }, }, dcbingji: { audio: 2, enable: "phaseUse", usable: 4, filter: function (event, player) { var hs = player.getCards("h"), suits = player.getStorage("dcbingji_mark"); if (!hs.length) return false; var suit = get.suit(hs[0], player); if (suit == "none" || suits.includes(suit)) return false; for (var i = 1; i < hs.length; i++) { if (get.suit(hs[i], player) != suit) return false; } return true; }, ai: { order: 10, result: { player: 1 }, }, chooseButton: { dialog: function (event, player) { return ui.create.dialog("秉纪", [["sha", "tao"], "vcard"], "hidden"); }, filter: function (button, player) { return lib.filter.cardEnabled( { name: button.link[2], isCard: true, storage: { dcbingji: true }, }, player, "forceEnable" ); }, check: function (button) { var card = { name: button.link[2], isCard: true, storage: { dcbingji: true }, }, player = _status.event.player; return Math.max.apply( Math, game .filterPlayer(function (target) { if (player == target) return false; return lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); }) .map(function (target) { return get.effect(target, card, player, player); }) ); }, backup: function (links, player) { return { viewAs: { name: links[0][2], isCard: true, storage: { dcbingji: true }, }, filterCard: () => false, selectCard: -1, filterTarget: function (card, player, target) { if (!card) card = get.card(); if (player == target) return false; return lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); }, selectTarget: 1, ignoreMod: true, filterOk: () => true, precontent: function () { player.logSkill("dcbingji"); delete event.result.skill; var hs = player.getCards("h"); player.showCards(hs, get.translation(player) + "发动了【秉纪】"); player.markAuto("dcbingji_mark", [get.suit(hs[0], player)]); player.addTempSkill("dcbingji_mark"); }, }; }, prompt: function (links, player) { return "请选择【" + get.translation(links[0][2]) + "】的目标"; }, }, subSkill: { mark: { charlotte: true, onremove: true, trigger: { player: "useCard1" }, forced: true, popup: false, firstDo: true, filter: function (event, player) { return event.addCount !== false && event.card.name == "sha" && event.card.storage && event.card.storage.dcbingji; }, content: function () { trigger.addCount = false; player.getStat("card").sha--; }, }, }, }, //王威 dcruizhan: { audio: 2, trigger: { global: "phaseZhunbeiBegin" }, filter: function (event, player) { return player != event.player && event.player.countCards("h") >= Math.max(1, event.player.hp) && player.canCompare(event.player); }, logTarget: "player", check: function (event, player) { var goon = player.hasCard(function (card) { return card.name == "sha" || get.value(card) <= 5; }); var target = event.player; if (goon && get.attitude(player, target) < 0) { return get.effect(target, { name: "sha" }, player, player) > 0; } return 0; }, content: function () { "step 0"; event.target = trigger.player; player.chooseToCompare(event.target).set("ai", function (card) { if (typeof card == "string" && lib.skill[card]) { var ais = lib.skill[card].check || function () { return 0; }; return ais(); } var player = get.owner(card); var getn = function (card) { if (player.hasSkill("tianbian") && get.suit(card) == "heart") return 13; return get.number(card); }; var event = _status.event.getParent(); var to = player == event.player ? event.target : event.player; var addi = get.value(card) >= 8 && get.type(card) != "equip" ? -6 : 0; if (card.name == "du") addi -= 5; if (player == event.player) { if (get.name(card, player) == "sha") { return 10 + getn(card); } return getn(card) - get.value(card) / 2 + addi; } else { if (get.name(card, player) == "sha") { return -10 - getn(card) - get.value(card) / 2 + addi; } return getn(card) - get.value(card) / 2 + addi; } }); "step 1"; var bool1 = result.bool; var bool2 = get.name(result.player, player) == "sha" || get.name(result.target, target) == "sha"; if (bool1 || bool2) { if (player.canUse("sha", target, false)) { player.useCard({ name: "sha", isCard: true }, target, false); if (!bool1 || !bool2) event.finish(); } else event.finish(); } else event.finish(); "step 2"; if ( target.hasCard(function (card) { return lib.filter.canBeGained(card, target, player); }, "he") && player.hasHistory("sourceDamage", function (evt) { var evtx = evt.getParent("useCard"); return evtx && evtx.card == evt.card && evtx.getParent() == event; }) ) player.gainPlayerCard(target, true, "he"); }, }, dcshilie: { audio: 2, enable: "phaseUse", usable: 1, chooseButton: { dialog: function (event, player) { return ui.create.dialog( "示烈:请选择一项", [ [ ["recover", "回复1点体力,将两张牌置于武将牌上作为“示烈”"], ["losehp", "失去1点体力,获得两张“示烈”牌"], ], "textbutton", ], "hidden" ); }, check: function (button) { return button.link == "recover" ? 1 : 0; }, backup: function (links, player) { return get.copy(lib.skill["dcshilie_" + links[0]]); }, prompt: () => "点击“确定”以执行选项", }, intro: { markcount: "expansion", content: "expansion", }, onremove: function (player, skill) { var cards = player.getExpansions(skill); if (cards.length) player.loseToDiscardpile(cards); }, group: "dcshilie_die", ai: { order: 0.5, result: { player: function (player) { if (player.isDamaged() && !player.countCards("h", "tao")) return 1; return 0; }, }, }, subSkill: { backup: {}, recover: { audio: "dcshilie", selectCard: -1, selectTarget: -1, filterCard: () => false, filterTarget: () => false, multitarget: true, content: function () { "step 0"; player.recover(); "step 1"; var hs = player.getCards("he"); if (!hs.length) event.finish(); else if (hs.length <= 2) event._result = { bool: true, cards: hs }; else player.chooseCard("he", 2, true, "选择两张牌作为“示烈”牌"); "step 2"; if (result.bool) { player.addToExpansion(result.cards, player, "give").gaintag.add("dcshilie"); } else event.finish(); "step 3"; var cards = player.getExpansions("dcshilie"); if (cards.length > game.countPlayer()) { player.loseToDiscardpile(cards.slice(game.countPlayer())); } }, }, losehp: { audio: "dcshilie", selectCard: -1, selectTarget: -1, filterCard: () => false, filterTarget: () => false, multitarget: true, content: function () { "step 0"; player.loseHp(); "step 1"; var hs = player.getExpansions("dcshilie"); if (!hs.length) event.finish(); else if (hs.length <= 2) event._result = { bool: true, links: hs }; else player.chooseButton(["选择获得两张“示烈”牌", hs], 2, true); "step 2"; if (result.bool) { player.gain(result.links, "gain2"); } }, }, die: { audio: "dcshilie", forceDie: true, trigger: { player: "die" }, filter: function (event, player) { return player.getExpansions("dcshilie").length > 0; }, direct: true, skillAnimation: true, animationColor: "metal", content: function () { "step 0"; player.chooseTarget(get.prompt("dcshilie"), "令一名角色获得你的“示烈”牌", function (card, player, target) { return target != player && target != _status.event.getTrigger().source; }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("dcshilie_die", target); player.give(player.getExpansions("dcshilie"), target, "give"); } }, }, }, }, //胡班 dcchongyi: { audio: 2, init: () => { game.addGlobalSkill("dcchongyi_ai"); }, onremove: () => { if (!game.hasPlayer(i => i.hasSkill("dcchongyi"), true)) game.removeGlobalSkill("dcchongyi_ai"); }, trigger: { global: "useCard" }, logTarget: "player", filter: function (event, player) { if (event.card.name != "sha" || !event.player.isIn()) return false; var evt = event.getParent("phaseUse"); if (!evt || evt.player != event.player) return false; var goon = false; var history = event.player.getHistory("useCard", function (evtx) { if (goon || evtx.getParent("phaseUse") != evt) return false; goon = true; return true; }); return history[0] == event; }, prompt2: event => "令其摸两张牌,且使用【杀】的次数上限+1", check: function (event, player) { return get.attitude(player, event.player) > 0; }, content: function () { var target = trigger.player; target.draw(2); target.addMark("dcchongyi_sha", 1, false); target.addTempSkill("dcchongyi_sha"); }, group: "dcchongyi_end", subSkill: { ai: { mod: { aiOrder: function (player, card, num) { if (card.name != "sha") return; var evt = _status.event.getParent("phaseUse"); if (!evt || evt.player != player) return; if ( player.hasHistory("useCard", function (evtx) { return evtx.getParent("phaseUse") == evt; }) ) return; if ( game.hasPlayer(function (current) { return current.hasSkill("dcchongyi") && get.attitude(player, current) >= 0; }) ) return num + 10; }, }, trigger: { player: "dieAfter" }, filter: () => { return !game.hasPlayer(i => i.hasSkill("dcchongyi"), true); }, silent: true, forceDie: true, content: () => { game.removeGlobalSkill("dcchongyi_ai"); }, }, end: { audio: "dcchongyi", trigger: { global: "phaseUseEnd" }, logTarget: "player", filter: function (event, player) { if (!event.player.isIn()) return false; var history = event.player.getHistory("useCard", function (evt) { return evt.getParent("phaseUse") == event; }); return history.length && history[history.length - 1].card.name == "sha"; }, prompt2(event, player) { const target = event.player; const history = target.getHistory("useCard", evt => { return evt.getParent("phaseUse") === event; }); const evt = history.lastItem, cards = evt.cards.filterInD("d"); let str = "令" + get.translation(target) + "本回合的手牌上限+1"; if (cards.length) str += `,然后你获得${get.translation(cards)}`; str += "。"; return str; }, check: function (event, player) { return get.attitude(player, event.player) > 0; }, async content(event, trigger, player) { const target = trigger.player; target.addMark("dcchongyi_keep", 1, false); target.addTempSkill("dcchongyi_keep"); const history = target.getHistory("useCard", evt => { return evt.getParent("phaseUse") === trigger; }); const evt = history.lastItem, cards = evt.cards.filterInD("d"); if (cards.length) await player.gain(cards, "gain2"); else await game.asyncDelayx(); }, }, sha: { charlotte: true, mod: { cardUsable: function (card, player, num) { if (card.name == "sha") return num + player.countMark("dcchongyi_sha"); }, }, onremove: true, intro: { content: "使用【杀】的次数上限+#" }, }, keep: { charlotte: true, mod: { maxHandcard: function (player, num) { return num + player.countMark("dcchongyi_keep"); }, }, onremove: true, intro: { content: "手牌上限+#" }, }, }, }, //牛辅 dcxiaoxi: { auto: 2, trigger: { player: "phaseUseBegin" }, forced: true, filter: function (event, player) { return player.maxHp > 1; }, content: function () { "step 0"; if (player.maxHp <= 2) event._result = { index: 0 }; else player .chooseControl("1点", "2点") .set("prompt", "宵袭:减少1或2点体力上限") .set("ai", function () { var player = _status.event.player; if ( !game.hasPlayer(function (current) { if (!player.inRange(current) || get.attitude(player, current) >= 0) return false; if ( get.effect(current, { name: "shunshou_copy2" }, player, player) > 0 && current.countCards("h") + current.countCards("e", function (card) { return get.value(card, current) > 0; }) > 1 ) return true; if (get.effect(current, { name: "sha" }, player, player) > 0 && current.countCards("hs", "shan") + current.hp > 1) return true; }) ) return 0; return 1; }); "step 1"; player.loseMaxHp(1 + result.index); event.num = 1 + result.index; "step 2"; if (!game.hasPlayer(current => player.inRange(current))) event.finish(); else player .chooseTarget( "请选择【宵袭】的目标", "然后你选择一项:⒈获得该角色的" + get.cnNumber(num) + "张牌。⒉视为对其使用" + get.cnNumber(num) + "张【杀】。", function (card, player, target) { return player.inRange(target); }, true ) .set("ai", function (target) { var player = _status.event.player; if (get.attitude(player, target) >= 0) return 0; var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); if ( eff1 > 0 && target.countCards("h") + target.countCards("e", function (card) { return get.value(card, target) > 0; }) > 1 ) eff1 *= 1.6; var eff2 = player.canUse("sha", target) ? get.effect(target, { name: "sha" }, player, player) : 0; if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; return Math.max(eff1, eff2); }); "step 3"; var target = result.targets[0]; player.line(target, "green"); event.target = target; var bool1 = target.countGainableCards(player, "he") > 0; var bool2 = player.canUse("sha", target); if (!bool1 && !bool2) event.finish(); else if (bool1 && bool2) { var str = get.translation(target), numx = get.cnNumber(num); player .chooseControl() .set("choiceList", ["获得" + str + "的" + numx + "张牌", "视为对" + str + "使用" + numx + "张【杀】"]) .set("ai", function () { var player = _status.event.player, target = _status.event.getParent().target; var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); if ( eff1 > 0 && target.countCards("h") + target.countCards("e", function (card) { return get.value(card, target) > 0; }) > 1 ) eff1 *= 1.6; var eff2 = player.canUse("sha", target) ? get.effect(target, { name: "sha" }, player, player) : 0; if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; return eff1 > eff2 ? 0 : 1; }); } else event._result = { index: bool1 ? 0 : 1 }; "step 4"; if (result.index == 0) { player.gainPlayerCard(target, true, num, "he"); event.finish(); } "step 5"; event.num--; if (player.canUse("sha", target, false)) { player.useCard({ name: "sha", isCard: true }, target, false); if (event.num > 0) event.redo(); } }, ai: { halfneg: true }, }, xiongrao: { audio: 2, trigger: { player: "phaseZhunbeiBegin" }, limited: true, skillAnimation: true, animationColor: "soil", prompt: function (event, player) { var str = "是否发动【熊扰】?"; str += "(可摸" + get.cnNumber(Math.max(0, 7 - player.maxHp)) + "张牌)"; return str; }, logTarget: (event, player) => game.filterPlayer(current => current != player), check: function (event, player) { return player.maxHp <= 3; }, content: function () { player.awakenSkill("xiongrao"); game.countPlayer(function (current) { if (current != player) current.addTempSkill("xiongrao_blocker"); }); var num = 7 - player.maxHp; if (num > 0) { player.gainMaxHp(num); player.draw(num); } }, subSkill: { blocker: { init: function (player, skill) { player.addSkillBlocker(skill); }, onremove: function (player, skill) { player.removeSkillBlocker(skill); }, charlotte: true, locked: true, skillBlocker: function (skill, player) { var info = get.info(skill); return info && !info.charlotte && !get.is.locked(skill) && !info.limited && !info.juexingji; }, mark: true, marktext: "扰", intro: { content: function (list, player, skill) { var storage = player.getSkills(null, false, false).filter(function (i) { return lib.skill.xiongrao_blocker.skillBlocker(i, player); }); if (storage.length) return "失效技能:" + get.translation(storage); return "无失效技能"; }, }, }, }, }, //卞喜 dunxi: { audio: 2, trigger: { player: "useCard" }, direct: true, filter: function (event, player) { if (!get.tag(event.card, "damage")) return false; return event.targets.some(target => target != player && target.isIn()); }, content: function () { "step 0"; var targets = trigger.targets.filter(function (current) { return current != player && current.isIn(); }); if (targets.length == 1) { event.target = targets[0]; player .chooseBool(get.prompt("dunxi", event.target), "令" + get.translation(event.target) + "获得一枚“钝”标记") .set("goon", get.attitude(player, event.target) < 0) .set("ai", () => _status.event.goon); } else { player .chooseTarget(get.prompt("dunxi"), "选择一名目标角色获得一枚“钝”标记", function (card, player, target) { return target != player && _status.event.getTrigger().targets.includes(target); }) .set("ai", function (target) { var att = get.attitude(_status.event.player, target); if (att >= 0) return 0; return -att / (1 + target.hasMark("dunxi")); }); } "step 1"; if (result.bool) { var target = event.target || result.targets[0]; player.logSkill("dunxi", target); target.addMark("dunxi", 1); game.delayx(); } }, intro: { content: "mark", name2: "钝" }, group: "dunxi_random", subSkill: { random: { audio: "dunxi", trigger: { global: "useCard" }, forced: true, locked: false, filter: function (event, player) { if (!event.player.hasMark("dunxi") || event.targets.length != 1 || event._dunxi || _status.dying.length) return false; var type = get.type2(event.card, false); return type == "basic" || type == "trick"; }, logTarget: "player", line: "fire", content: function () { "step 0"; trigger._dunxi = true; trigger.player.removeMark("dunxi", 1); var target = trigger.targets[0]; event.target = target; trigger.targets.remove(target); //trigger.triggeredTargets1.remove(target); trigger.untrigger(); game.delayx(); "step 1"; var list; if (get.type(event.card) != "delay") list = game.filterPlayer(function (current) { return lib.filter.targetEnabled2(trigger.card, trigger.player, current); }); else list = game.filterPlayer(function (current) { return current.canAddJudge(event.card); }); if (list.length) target = list.randomGet(); trigger.targets.push(target); trigger.player.line(target, "fire"); game.log(trigger.card, "的目标被改为", target); if (target == event.target) { trigger.player.loseHp(); var evt = trigger.getParent("phaseUse"); if (evt && evt.player == trigger.player) evt.skipped = true; } }, }, }, }, //冯方 dcditing: { audio: 2, trigger: { global: "phaseUseBegin" }, logTarget: "player", filter: function (event, player) { return player.hp > 0 && event.player.countCards("h") > 0 && event.player.inRange(player); }, prompt2: (event, player) => "观看其" + get.cnNumber(Math.min(player.hp, event.player.countCards("h"))) + "张手牌并选择其中一张", check: function (event, player) { var target = event.player; if (get.attitude(player, target) > 0) return true; if (Math.min(player.hp, target.countCards("h")) > 2) return true; return false; }, content: function () { "step 0"; var target = trigger.player; var cards = target.getCards("h"); var num = Math.min(cards.length, player.hp), cards2 = cards.randomGets(num); player.chooseButton([get.translation(target) + "的手牌(" + num + "/" + cards.length + ")", cards2], true).set("ai", function (button) { var player = _status.event.player, target = _status.event.getTrigger().player, card = button.link; var att = get.attitude(player, target); var val = target.getUseValue(card, null, true); if (val <= 0) return (-get.value(card, target) / 2) * get.sgn(att - 0.05); if (target.canUse(card, player) && get.effect(player, card, target, target) > 0) { var eff = get.effect(player, card, target, player); if (eff < 0) val -= eff; } return val; }); "step 1"; if (result.bool) { player.addTempSkill("dcditing_effect", "phaseUseAfter"); player.storage.dcditing_effect = [trigger.player, result.links[0]]; } }, subSkill: { effect: { audio: "dcditing", charlotte: true, trigger: { target: "useCardToTargeted" }, forced: true, filter: function (event, player) { var list = player.storage.dcditing_effect; return list && event.player == list[0] && event.cards.includes(list[1]); }, content: function () { trigger.excluded.add(player); game.delayx(); }, group: ["dcditing_draw", "dcditing_gain"], }, draw: { audio: "dcditing", charlotte: true, trigger: { global: "useCardAfter" }, forced: true, filter: function (event, player) { var list = player.storage.dcditing_effect; return list && event.player == list[0] && event.cards.includes(list[1]) && !event.targets.includes(player); }, content: function () { player.draw(2); }, }, gain: { audio: "dcditing", charlotte: true, trigger: { global: "phaseUseEnd" }, forced: true, filter: function (event, player) { var list = player.storage.dcditing_effect; return list && event.player == list[0] && event.player.getCards("h").includes(list[1]); }, content: function () { var list = player.storage.dcditing_effect; player.gain(list[0], list[1], "giveAuto", "bySelf"); }, }, }, }, dcbihuo: { audio: 2, trigger: { player: "damageEnd", source: "damageSource", }, direct: true, filter: function (event, player) { return event.source && event.player != event.source; }, content: function () { "step 0"; event.num = event.triggername == "damageEnd" ? 1 : -1; player.chooseTarget(get.prompt("dcbihuo"), "令一名角色下回合的额定摸牌数" + (event.num > 0 ? "+1" : "-1")).set("ai", function (target) { var player = _status.event.player, num = _status.event.getParent().num; var att = get.attitude(player, target); if (num > 0) { if (att <= 0) return 0; if (target.hasJudge("lebu")) return att / 10; return (att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * Math.sqrt(1 + target.hp); } if (num < 0) { if (att >= 0) return 0; if ((target.storage.dcbihuo_effect || 0) <= -2) return -att / 10; return (-att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * Math.sqrt(1 + target.hp); } }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("dcbihuo", target); if (typeof target.storage.dcbihuo_effect != "number") target.storage.dcbihuo_effect = 0; target.storage.dcbihuo_effect += event.num; target.addTempSkill("dcbihuo_effect", { player: "phaseAfter" }); game.delayx(); } }, subSkill: { effect: { charlotte: true, trigger: { player: "phaseDrawBegin" }, forced: true, onremove: true, content: function () { var num = player.storage.dcbihuo_effect; trigger.num += num; game.log(player, "的额定摸牌数", "#g" + (num >= 0 ? "+" : "") + num); }, mark: true, intro: { content: num => "额定摸牌数" + (num >= 0 ? "+" : "") + num, }, }, }, }, //秦宜禄 piaoping: { audio: 2, trigger: { player: "useCard" }, forced: true, zhuanhuanji: true, filter: function (event, player) { return !player.hasSkill("piaoping_blocker", null, null, false); }, content: function () { player.changeZhuanhuanji("piaoping"); var num = Math.min( player.hp, player.getHistory("useSkill", function (evt) { return evt.skill == "piaoping"; }).length ); if (num <= 0) return; if (player.storage.piaoping == true) player.draw(num); else if ( player.hasCard(function (card) { return lib.filter.cardDiscardable(card, player, "piaoping"); }, "he") ) { game.delayx(); player.chooseToDiscard(true, "he", num); } }, mark: true, marktext: "☯", intro: { content: function (storage) { if (storage) return "转换技,锁定技。当你使用一张牌时,你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; return "转换技,锁定技。当你使用一张牌时,你摸X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; }, }, subSkill: { blocker: { charlotte: true } }, }, tuoxian: { audio: 2, ai: { combo: "piaoping" }, trigger: { player: "loseAfter" }, marktext: "栗", filter: function (event, player) { return event.type == "discard" && event.getParent(3).name == "piaoping" && player.countMark("tuoxian") > 0 && event.cards.filterInD("d").length > 0; }, direct: true, content: function () { "step 0"; event.cards = trigger.cards.filterInD("d"); player.chooseTarget(lib.filter.notMe, get.prompt("tuoxian"), "令一名其他角色获得" + get.translation(event.cards)).set("ai", function (target) { var player = _status.event.player, att = get.attitude(player, target); if (att < 0) return 0; if (target.hasSkillTag("nogain")) att /= 10; return att * Math.pow(1 + target.countCards("he"), 0.25); }); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("tuoxian", target); player.removeMark("tuoxian", 1); target.gain(cards, "gain2"); } else event.finish(); "step 2"; target .chooseControl() .set("choiceList", ["弃置区域内的" + get.cnNumber(cards.length) + "张牌", "令" + get.translation(player) + "的〖漂萍〗于本回合内失效"]) .set("ai", function () { var player = _status.event.player, target = _status.event.getParent().player; if ( player.hasCard(function (card) { return get.effect(player, { name: card.viewAs || card.name }, player, player) < 0; }, "j") || player.hasCard(function (card) { return get.value(card, player) <= 0; }) ) return 0; if (get.attitude(player, target) <= 0 || !target.isPhaseUsing()) return 1; if ( !target.needsToDiscard() && !target.hasCard(function (card) { return !target.hasValueTarget(card, null, true); }, "hs") ) return 1; return 0; }); "step 3"; if (result.index == 0) { if (target.countCards("j") > 0) target.discardPlayerCard(target, cards.length, true, "hej"); else target.chooseToDiscard("he", true, cards.length); } else player.addTempSkill("piaoping_blocker"); }, init(player) { player.addMark("tuoxian", 1, false); }, intro: { name2: "栗", content: "剩余可用#次" }, }, chuaili: { audio: 2, trigger: { target: "useCardToTargeted" }, forced: true, filter: function (event, player) { if (player == event.player || get.color(event.card) != "black") return false; if (!player.hasSkill("piaoping", null, null, false)) return false; return player.storage.piaoping == true || !player.hasSkill("chuaili_blocker", null, null, false); }, content: function () { if (player.storage.piaoping == true) { player.changeZhuanhuanji("piaoping"); } else { player.addMark("tuoxian", 1, false); if (player.countCards("tuoxian") > 3) player.addTempSkill("chuaili_blocker"); } game.delayx(); }, ai: { combo: "piaoping" }, subSkill: { blocker: { charlotte: true } }, }, //闫柔 choutao: { audio: 2, trigger: { player: "useCard", target: "useCardToTargeted", }, filter: function (event, player) { if (event.card.name != "sha" || !event.player.isIn()) return false; if (player == event.player) return player.hasCard(function (card) { return lib.filter.cardDiscardable(card, player, "choutao"); }, "he"); return event.player.hasCard(function (card) { return lib.filter.canBeDiscarded(card, player, event.player); }, "he"); }, check: function (event, player) { if (player == event.player) { if ( !player.hasCard(function (card) { return get.value(card) <= 5; }, "he") ) return false; for (var i of event.targets) { var eff1 = get.damageEffect(i, player, player); if (eff1 < 0) return false; if (i.hasShan() && eff1 > 0) return true; } var sha = false; return ( player.getCardUsable({ name: "sha" }) <= 0 && player.hasCard(function (card) { if (!sha && get.name(card) == "sha" && player.getUseValue(card) > 0) { sha = true; return false; } return sha && get.value(card) <= 5; }, "hs") ); } else { var eff1 = get.effect(event.player, { name: "guohe_copy2" }, player, player); var eff2 = get.damageEffect(player, event.player, player); if (!player.hasShan()) return eff1 > 0; if (eff2 > 0) return eff1 > 0; return player.hp > 2 && eff2 < eff1; } }, logTarget: "player", shaRelated: true, content: function () { "step 0"; if (player != game.me && !player.isOnline() && !player.isUnderControl()) game.delayx(); if (player == trigger.player) player.chooseToDiscard("he", true).set("ai", function (card) { var player = _status.event.player; var val = player.getUseValue(card); if (get.name(card) == "sha" && player.getUseValue(card) > 0) val += 5; return 20 - val; }); else player.discardPlayerCard(trigger.player, true, "he"); "step 1"; trigger.directHit.addArray(game.players); if (player == trigger.player && trigger.addCount !== false) { trigger.addCount = false; player.getStat().card.sha--; } }, }, xiangshu: { audio: 2, trigger: { player: "phaseJieshuBegin" }, direct: true, limited: true, skillAnimation: true, animationColor: "gray", filter: function (event, player) { return (player.getStat("damage") || 0) > 0 && game.hasPlayer(current => current.isDamaged()); }, content: function () { "step 0"; event.num = Math.min(5, player.getStat("damage")); player .chooseTarget("是否发动限定技【襄戍】?", "令一名角色回复" + event.num + "点体力并摸" + get.cnNumber(event.num) + "张牌", function (card, player, target) { return target.isDamaged(); }) .set("ai", function (target) { var num = _status.event.getParent().num, player = _status.event.player; var att = get.attitude(player, target); if (att > 0 && num >= Math.min(player.hp, 2)) return att * Math.sqrt(target.getDamagedHp()); return 0; }); "step 1"; if (result.bool) { var target = result.targets[0]; player.awakenSkill("xiangshu"); player.logSkill("xiangshu", target); target.recover(num); target.draw(num); if (player != target) player.addExpose(0.2); } }, }, //朱灵 dczhanyi: { audio: 2, trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { var list = ["basic", "trick", "equip"]; var list2 = []; var hs = player.getCards("he"); for (var card of hs) { var type = get.type2(card, player); if (list.includes(type)) { var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); if (bool) list2.add(type); else { list.remove(type); list2.remove(type); } } } return list2.length > 0; }, content: function () { "step 0"; var list = ["basic", "trick", "equip"]; var list2 = []; var hs = player.getCards("he"); for (var card of hs) { var type = get.type2(card, player); if (list.includes(type)) { var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); if (bool) list2.add(type); else { list.remove(type); list2.remove(type); } } } player .chooseControl(list2, "cancel2") .set("prompt", get.prompt("dczhanyi")) .set("prompt2", "弃置一种类型的所有牌") .set("ai", function () { var player = _status.event.player; var getval = function (control) { if (control == "cancel2") return 0; var hs = player.getCards("h"), eff = 0; var es = player.getCards("e"); var ss = player.getCards("s"); var sha = player.getCardUsable({ name: "sha" }); for (var i of hs) { var type = get.type2(i); if (type == control) { eff -= get.value(i, player); } else { switch (type) { case "basic": if (sha > 0 && get.name(i) == "sha") { sha--; var add = 3; if (!player.hasValueTarget(i) && player.hasValueTarget(i, false)) add += player.getUseValue(i, false); eff += add; } break; case "trick": if (player.hasValueTarget(i)) eff += 6; break; case "equip": if (player.hasValueTarget({ name: "guohe_copy2" })) eff += player.getUseValue({ name: "guohe_copy2" }); break; } } } if (control == "equip") { for (var i of es) eff -= get.value(i, player); } else { for (var i of ss) { var type = get.type2(i); if (type == control) continue; switch (type) { case "basic": if (sha > 0 && get.name(i) == "sha") { sha--; var add = 3; if (!player.hasValueTarget(i) && player.hasValueTarget(i, false)) add += player.getUseValue(i, false); eff += add; } break; case "trick": if (player.hasValueTarget(i)) eff += 6; break; case "equip": if (player.hasValueTarget({ name: "guohe_copy2" })) eff += player.getUseValue({ name: "guohe_copy2" }); break; } } } return eff; }; var controls = _status.event.controls.slice(0); var eff = 0, current = "cancel2"; for (var i of controls) { var effx = getval(i); if (effx > eff) { eff = effx; current = i; } } return current; }); "step 1"; var type = result.control; if (type != "cancel2") { event.type = type; var cards = player.getCards("he", function (card) { return get.type2(card, player) == type; }); if (cards.length) { player.logSkill("dczhanyi"); player.discard(cards); } else event.finish(); } else event.finish(); "step 2"; var list = ["basic", "trick", "equip"]; for (var i of list) { if (i != event.type) player.addTempSkill("dczhanyi_" + i, { player: "phaseBegin" }); } }, subSkill: { basic: { charlotte: true, marktext: "基", mark: true, intro: { content: "使用基本牌无距离限制,且伤害值和回复值基数+1", }, trigger: { source: ["damageBegin1", "recoverBegin"] }, filter: function (event, player) { var evt = event.getParent(); return evt.type == "card" && get.type(evt.card, false) == "basic"; }, forced: true, logTarget: "player", content: function () { trigger.num++; }, mod: { targetInRange: function (card) { if (get.type(card) == "basic") return true; }, }, ai: { damageBonus: true, }, }, trick: { charlotte: true, marktext: "锦", mark: true, intro: { content: "使用锦囊牌时摸一张牌,且锦囊牌不计入本回合的手牌上限", }, trigger: { player: "useCard" }, filter: function (event, player) { return get.type2(event.card) == "trick"; }, forced: true, content: function () { player.draw(); }, mod: { ignoredHandcard: function (card, player) { if (get.type2(card, player) == "trick") return true; }, cardDiscardable: function (card, player, name) { if (name == "phaseDiscard" && get.type2(card, player) == "trick") return false; }, }, }, equip: { charlotte: true, marktext: "装", mark: true, intro: { content: "有装备牌进入你的装备区时,可弃置一名其他角色的一张牌", }, trigger: { player: "equipAfter" }, filter: function (event, player) { return game.hasPlayer(target => target != player && target.countDiscardableCards(player, "he") > 0); }, direct: true, content: function () { "step 0"; player .chooseTarget("战意:是否弃置一名其他角色的一张牌?", function (card, player, target) { return target != player && target.countDiscardableCards(player, "he") > 0; }) .set("ai", function (target) { var player = _status.event.player; return get.effect(target, { name: "guohe_copy2" }, player, player); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("dczhanyi_equip", target); player.discardPlayerCard(target, "he", true); } }, }, }, }, //李采薇 yijiao: { audio: 2, enable: "phaseUse", usable: 1, filter: function (event, player) { return game.hasPlayer(function (current) { return current != player && !current.hasMark("yijiao"); }); }, filterTarget: function (card, player, target) { return target != player && !target.hasMark("yijiao"); }, content: function () { "step 0"; player .chooseControl("10个", "20个", "30个", "40个") .set("prompt", "要令" + get.translation(target) + "获得多少标记?") .set("ai", function () { var player = _status.event.player, target = _status.event.getParent().target; /*if(get.attitude(player,target)<0&&game.hasPlayer(function(current){ return current!=player&¤t!=target&&!current.hasMark('yijiao')&&get.attitude(player,current)<0; })) return 3;*/ return 0; }); "step 1"; target.addMark("yijiao", 10 * (1 + result.index)); }, ai: { order: 1.1, result: { player: 1, target: -0.5, }, }, group: "yijiao_effect", subSkill: { effect: { trigger: { global: "phaseJieshuBegin" }, forced: true, filter: function (event, player) { return event.player.isIn() && event.player != player && event.player.hasMark("yijiao"); }, logTarget: "player", content: function () { var target = trigger.player, num = target.countMark("yijiao"); var num2 = 0; target.getHistory("useCard", function (evt) { var numz = get.number(evt.card); if (typeof numz == "number") num2 += numz; }); if (num > num2) { var hs = target.getCards("he", function (card) { return lib.filter.cardDiscardable(card, target, "yijiao_effect"); }); if (hs.length) target.discard(hs.randomGets(get.rand(1, 3))); } else if (num == num2) { target.insertPhase(); player.draw(2); } else { player.draw(3); } target.removeMark("yijiao", num); }, }, }, intro: { onunmark: true, name2: "异", content: "mark", }, }, qibie: { audio: 2, trigger: { global: "die" }, filter: function (event, player) { return ( player.countCards("h") > 0 && !player.hasCard(function (card) { return !lib.filter.cardDiscardable(card, player, "qibie"); }, "h") ); }, check: function (event, player) { return player.isDamaged() && player.countCards("h", "tao") < Math.max(2, player.hp); }, content: function () { var hs = player.getCards("h"); player.discard(hs); player.recover(); player.draw(hs.length + 2); }, }, //严夫人 channi: { audio: 2, enable: "phaseUse", usable: 1, filter: function (event, player) { return player.countCards("h") > 0; }, filterTarget: lib.filter.notMe, filterCard: true, selectCard: [1, Infinity], check: function (card) { let player = _status.event.player, num = player.hasSkill("nifu") ? 15 : 8; if (ui.selected.cards.length <= Math.max(1, player.needsToDiscard(), player.countCards("h") - 4)) return num - get.value(card); return num / 2 - get.value(card); }, position: "h", discard: false, lose: false, delay: false, content: function () { "step 0"; player.give(cards, target); "step 1"; if (target.countCards("h") > 0) { game.broadcastAll(function (num) { lib.skill.channi_backup.selectCard = [1, num]; }, cards.length); var next = target.chooseToUse(); next.set("openskilldialog", "将至多" + get.cnNumber(cards.length) + "张手牌当做【决斗】使用"); next.set("norestore", true); next.set("addCount", false); next.set("_backupevent", "channi_backup"); next.set("custom", { add: {}, replace: { window: function () {} }, }); next.backup("channi_backup"); } else event.finish(); "step 2"; if (result.bool) { var evts = target.getHistory("useCard", function (evt) { return evt.card.name == "juedou" && evt.getParent(2) == event; }); if (!evts.length) { event.finish(); return; } var num = evts[0].cards.length; if ( target.hasHistory("sourceDamage", function (evt) { return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; }) ) target.draw(num); } else event.finish(); "step 3"; if ( player.countCards("h") > 0 && target.hasHistory("damage", function (evt) { return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; }) ) player.chooseToDiscard("h", true, player.countCards("h")); }, subSkill: { backup: { filterCard: function (card) { return get.itemtype(card) == "card"; }, viewAs: { name: "juedou" }, position: "h", filterTarget: lib.filter.targetEnabled, ai1: card => { if (get.name(card) === "sha") return 0; return 5.5 - get.value(card); }, log: false, precontent: function () { delete event.result.skill; }, }, }, ai: { order: 0.3, result: { target: function (player, target) { if (target == game.me || target.isOnline() || target.hasValueTarget({ name: "juedou" })) return 2; if (player.needsToDiscard()) return 0.5; return 0; }, }, }, }, nifu: { audio: 2, trigger: { global: "phaseEnd" }, forced: true, filter: function (event, player) { return player.countCards("h") != 3; }, content: function () { var num = player.countCards("h") - 3; if (num > 0) player.chooseToDiscard("h", num, true); else player.draw(-num); }, }, //郝萌 xiongmang: { audio: 2, enable: "chooseToUse", viewAs: { name: "sha" }, viewAsFilter: function (player) { return player.countCards("hs") > 0; }, selectCard: function () { return [1, 4]; }, selectTarget: function () { var card = get.card(), player = get.player(); if (card == undefined) return; var range = [1, Math.max(1, ui.selected.cards.length)]; game.checkMod(card, player, range, "selectTarget", player); return range; }, complexCard: true, filterCard: function (card) { if (!ui.selected.cards.length) return true; var suit = get.suit(card); for (var i of ui.selected.cards) { if (get.suit(i) == suit) return false; } return true; }, filterOk: function () { if (!ui.selected.targets.length) return false; var card = get.card(), player = get.player(); if (card == undefined) return; var range = [1, Math.max(1, ui.selected.cards.length)]; game.checkMod(card, player, range, "selectTarget", player); if ((range[0] <= ui.selected.targets.length && range[1] >= ui.selected.targets.length) || range[0] == -1) return true; return false; }, check: function (card) { var player = _status.event.player, card = get.autoViewAs({ name: "sha" }, ui.selected.cards.concat(card)); if ( game.countPlayer(function (current) { return (_status.event.filterTarget || lib.filter.filterTarget)(card, player, current) && get.effect_use(current, card, player, player) > 0; }) <= ui.selected.cards.length ) return 0; return 5 - get.value(card); }, position: "hs", onuse: function (links, player) { player.addTempSkill("xiongmang_effect"); }, ai: { order: () => get.order({ name: "sha" }) + 0.2, respondSha: true, skillTagFilter: function (player, tag, arg) { return player.countCards("hs") > 0; }, }, subSkill: { effect: { trigger: { player: "useCardAfter" }, forced: true, charlotte: true, filter: function (event, player) { return ( player.maxHp > 1 && event.skill == "xiongmang" && !player.hasHistory("sourceDamage", function (evt) { return evt.card == event.card; }) ); }, content: function () { player.loseMaxHp(); }, }, }, }, //庞德公 heqia: { audio: 2, trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { return game.hasPlayer(current => current.countCards(current == player ? "he" : "h") > 0); }, content: function () { "step 0"; player.chooseCardTarget({ prompt: get.prompt("heqia"), prompt2: "操作提示:选择要给出的牌和目标角色,或直接选择一名目标角色,令其将牌交给自己", filterCard: true, position: "he", selectCard: function () { if (ui.selected.targets.length && !ui.selected.targets[0].countCards("h")) return [1, Infinity]; return [0, Infinity]; }, filterTarget: function (card, player, target) { if (player == target) return false; if (!ui.selected.cards.length) return target.countCards("h") > 0; return true; }, ai1: function (card) { if (!_status.event.nogive || ui.selected.cards.length) return 0 - get.value(card); return 1 / Math.max(1, get.value(card)); }, ai2: function (target) { return (get.attitude(player, target) - 0.1) * (ui.selected.cards.length ? 1 : -1); }, nogive: !game.hasPlayer(function (current) { return current != player && get.attitude(player, current) <= 0 && current.countCards("h") > 0; }), }); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("heqia", target); if (result.cards.length) { player.give(result.cards, target); event.source = target; event.num = result.cards.length; event.goto(4); } } else event.finish(); "step 2"; var he = target.getCards("he"); if (he.length > 0) { if (he.length > 1) target.chooseCard("he", true, [1, Infinity], "选择交给" + get.translation(player) + "任意张牌").set("ai", card => -get.value(card)); else event._result = { bool: true, cards: he }; } else event.finish(); "step 3"; if (result.bool) { event.source = player; target.give(result.cards, player); event.num = result.cards.length; } else event.finish(); "step 4"; if (source && source.isIn() && source.countCards("h") > 0) { var list = []; for (var name of lib.inpile) { if (get.type(name) != "basic") continue; if (source.hasUseTarget({ name: name }, false)) list.push(["基本", "", name]); if (name == "sha") { for (var nature of lib.inpile_nature) { if (source.hasUseTarget({ name: name, nature: nature }, false)) list.push(["基本", "", name, nature]); } } } if (list.length) { source.chooseButton(["是否将一张手牌当做一种基本牌使用?", [list, "vcard"]]).set("ai", button => _status.event.player.getUseValue({ name: button.link[2], nature: button.link[3] }, false)); } else event.finish(); } else event.finish(); "step 5"; if (result.bool) { var card = { name: result.links[0][2], nature: result.links[0][3] }; game.broadcastAll(function (card) { lib.skill.heqia_backup.viewAs = card; }, card); var next = source.chooseToUse(); next.set("openskilldialog", "将一张手牌当做" + get.translation(card) + "使用"); next.set("norestore", true); next.set("addCount", false); next.set("_backupevent", "heqia_backup"); next.set("custom", { add: {}, replace: { window: function () {} }, }); next.backup("heqia_backup"); } }, group: "heqia_add", subSkill: { backup: { filterCard: function (card) { return get.itemtype(card) == "card"; }, position: "h", filterTarget: lib.filter.targetEnabled, selectCard: 1, check: card => 6 - get.value(card), log: false, precontent: function () { delete event.result.skill; }, }, add: { trigger: { global: "useCard2" }, charlotte: true, direct: true, filter: function (event, player) { var evt = event.getParent(2); if (evt.name != "heqia" || evt.player != player || !event.targets || evt.num <= event.targets.length) return false; var card = event.card, info = get.info(card); if (info.allowMultiple == false) return false; if (event.targets && !info.multitarget) { if ( game.hasPlayer(function (current) { return !event.targets.includes(current) && lib.filter.targetEnabled2(card, event.player, current); }) ) { return true; } } return false; }, content: function () { "step 0"; var num = trigger.getParent(2).num - trigger.targets.length; var prompt2 = "是否为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个目标?"; trigger.player .chooseTarget(prompt2, [1, num], function (card, player, target) { var player = _status.event.player; return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); }) .set("ai", function (target) { var trigger = _status.event.getTrigger(); var player = _status.event.player; return get.effect(target, trigger.card, player, player); }) .set("card", trigger.card) .set("targets", trigger.targets); "step 1"; if (result.bool) { trigger.player.line(result.targets); game.log(result.targets, "也成为了", trigger.card, "的目标"); trigger.targets.addArray(result.targets); } }, }, }, }, yinyi: { audio: 2, trigger: { player: "damageBegin1" }, forced: true, usable: 1, filter: function (event, player) { return event.source && event.source.hp != player.hp && !event.hasNature("linked") && event.source.countCards("h") != player.countCards("h"); }, content: function () { trigger.cancel(); }, ai: { effect: { target: function (card, player, target, current) { if (get.tag(card, "damage")) { if (player.hp == target.hp || lib.linked.includes(get.nature(card))) return; var cards = [card]; if (card.cards && card.cards.length) cards.addArray(card.cards); if (ui.selected.cards.length) cards.addArray(ui.selected.cards); if ( player.countCards("h", function (card) { return !cards.includes(card); }) == target.countCards("h") ) return; return "zeroplayertarget"; } }, }, }, }, //韩猛 jieliang: { trigger: { global: "phaseDrawBegin2" }, direct: true, filter: function (event, player) { return event.player != player && !event.numFixed && event.num > 1 && player.countCards("he") > 0; }, content: function () { "step 0"; event.target = trigger.player; player .chooseToDiscard(get.prompt2("jieliang", event.target), "he") .set("goon", get.attitude(player, trigger.player) < -2) .set("ai", function (card) { if (!_status.event.goon) return 0; return 7 - get.value(card); }).logSkill = ["jieliang", event.target]; "step 1"; if (result.bool) { trigger.num--; if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.15); target.addMark("jieliang_less", 1, false); target.addTempSkill("jieliang_less"); player.addTempSkill("jieliang_gain"); } }, subSkill: { less: { charlotte: true, mod: { maxHandcard: function (player, num) { return num - player.countMark("jieliang_less"); }, }, onremove: true, intro: { content: "手牌上限-#" }, }, gain: { trigger: { global: "loseAfter" }, charlotte: true, direct: true, filter: function (event, player) { return event.type == "discard" && event.player == _status.currentPhase && event.getParent(3).name == "phaseDiscard" && event.cards2.filterInD("d").length > 0; }, content: function () { "step 0"; player.chooseButton(["截粮:是否获得一张牌?", trigger.cards2.filterInD("d")]).set("ai", function (button) { return get.value(button.link, _status.event.player); }); "step 1"; if (result.bool) { player.logSkill("jieliang", trigger.player); player.gain(result.links, "gain2"); } }, }, }, }, quanjiu: { audio: 2, mod: { aiOrder: function (player, card, num) { if ((card.name == "jiu" || card.name == "xujiu") && get.name(card) == "sha") return num + 0.5; }, cardname: function (card, player, name) { if (card.name == "jiu" || card.name == "xujiu") return "sha"; }, }, trigger: { player: "useCard1" }, forced: true, filter: function (event, player) { return event.addCount !== false && event.card.isCard && event.card.name == "sha" && event.cards.length == 1 && (event.cards[0].name == "jiu" || event.cards[0].name == "xujiu"); }, content: function () { trigger.addCount = false; player.getStat().card.sha--; }, }, //辛评 fuyuan: { audio: 2, trigger: { player: ["useCard", "respond"] }, filter: function (event, player) { var target = _status.currentPhase; return target && target != player && target.isIn(); }, logTarget: function (event, player) { var target = _status.currentPhase; return target.countCards("h") < player.countCards("h") ? target : player; }, check: function (event, player) { var target = lib.skill.fuyuan.logTarget(event, player); return get.attitude(player, target) > 0; }, prompt: "是否发动【辅袁】?", prompt2: function (event, player) { var target = lib.skill.fuyuan.logTarget(event, player); return "令" + get.translation(target) + (target == player ? "(你)" : "") + "摸一张牌"; }, content: function () { lib.skill.fuyuan.logTarget(trigger, player).draw(); }, }, zhongjie: { trigger: { player: "die" }, direct: true, forceDie: true, skillAnimation: true, animationColor: "gray", content: function () { "step 0"; player.chooseTarget(get.prompt2("zhongjie"), lib.filter.notMe).set("ai", function (target) { return get.attitude(_status.event.player, target); }); "step 1"; if (result.bool) { //player.awakenSkill('zhongjie'); var target = result.targets[0]; player.logSkill("zhongjie", target); target.gainMaxHp(); target.recover(); target.draw(); } }, }, //张宁 tianze: { audio: 2, trigger: { global: "useCardAfter" }, direct: true, filter: function (event, player) { return ( player != event.player && event.player.isIn() && get.color(event.card) == "black" && event.player.hasHistory("lose", function (evt) { return evt && evt.hs.length && evt.getParent() == event; }) && event.player.isPhaseUsing() && !player.hasSkill("tianze_block") ); }, content: function () { "step 0"; player.addTempSkill("tianze_block"); if ( !player.hasCard(function (card) { if (_status.connectMode && get.position(card) == "h") return true; return get.color(card, player) == "black"; }, "he") ) event.finish(); else player .chooseToDiscard( "he", function (card, player) { return get.color(card, player) == "black"; }, get.prompt("tianze", trigger.player), "弃置一张黑色牌并对其造成1点伤害" ) .set("ai", function (card) { if (!_status.event.goon) return 0; return 8 - get.value(card); }) .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = ["tianze", trigger.player]; "step 1"; if (result.bool) { if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); trigger.player.damage(); } else event.finish(); "step 2"; game.delayx(); }, group: "tianze_draw", subSkill: { block: { charlotte: true }, draw: { trigger: { global: "judgeEnd" }, forced: true, locked: false, filter: function (event, player) { return event.player != player && event.result && event.result.color == "black"; }, content: function () { player.draw(); }, }, }, }, difa: { trigger: { player: "gainAfter" }, filter: function (event, player) { if (player != _status.currentPhase || event.getParent().name != "draw") return false; var hs = player.getCards("h"); if (!hs.length) return false; for (var i of event.cards) { if (hs.includes(i) && get.color(i, player) == "red" && lib.filter.cardDiscardable(i, player, "difa")) return true; } return false; }, usable: 1, check: function (event, player) { var hs = player.getCards("h"), cards = event.cards.filter(function (i) { return hs.includes(i) && get.color(i, player) == "red" && lib.filter.cardDiscardable(i, player, "difa"); }); var value = get.value(hs, player); return Array.from(ui.cardPile.childNodes).some(function (card) { return get.type2(card, false) == "trick" && get.value(card, player) > value; }); }, content: function () { "step 0"; var hs = player.getCards("h"), cards = trigger.cards.filter(function (i) { return hs.includes(i) && get.color(i, player) == "red" && lib.filter.cardDiscardable(i, player, "difa"); }); if (!cards.length) event.finish(); else { event.cards = cards; player.discard(cards); } "step 1"; var list = lib.inpile.filter(function (i) { return get.type2(i, false) == "trick"; }); if (!list.length) event.finish(); else player .chooseButton(["选择获得一种锦囊牌", [list.map(i => ["锦囊", "", i]), "vcard"]], true) .set("ai", function (button) { var card = { name: button.link[2] }; if (!_status.event.list.includes(card.name)) return 0; return _status.event.player.getUseValue(card); }) .set( "list", Array.from(ui.cardPile.childNodes) .filter(function (card) { return get.type2(card, false) == "trick"; }) .map(function (card) { return card.name; }) .reduce(function (list, name) { if (!list.includes(name)) list.add(name); return list; }, []) ); "step 2"; var card = get.cardPile(function (i) { return i.name == result.links[0][2] && !event.cards.includes(i); }); if (card) player.gain(card, "gain2"); }, }, //童渊 chaofeng: { audio: 2, trigger: { source: "damageBegin1" }, direct: true, filter: function (event, player) { return player.countCards("h") > 0 && player.isPhaseUsing() && !player.hasSkill("chaofeng2"); }, content: function () { "step 0"; var str = "弃置一张手牌并摸一张牌", color, type; if (trigger.card) { type = get.type2(trigger.card, false); color = get.color(trigger.card, false); if (color != "none") str += ";若弃置" + get.translation(color) + "牌则改为摸两张牌"; if (type) str += ";若弃置类型为" + get.translation(type) + "的牌则伤害+1"; } var next = player.chooseToDiscard("h", get.prompt("chaofeng", trigger.player), str); next.set("ai", function (card) { var player = _status.event.player, att = _status.event.att; var val = 4.2 - get.value(card); if (get.color(card) == _status.event.color) val += 3; if (get.type2(card) == _status.event.type) { if (att < 0) val += 4; else if (att === 0) val += 2; else val = 0; } return val; }); next.set("att", get.attitude(player, trigger.player)); next.logSkill = ["chaofeng", trigger.player]; if (color != "none") { event.color = color; next.set("color", color); } if (type) { event.type = type; next.set("type", type); } "step 1"; if (result.bool) { player.addTempSkill("chaofeng2", "phaseUseEnd"); var card = result.cards[0]; player.draw(event.color && get.color(card, card.original == "h" ? player : false) == event.color ? 2 : 1); if (event.type && get.type2(card, card.original == "h" ? player : false) == event.type) trigger.num++; } }, }, chaofeng2: {}, chuanshu: { audio: 2, trigger: { player: ["phaseZhunbeiBegin", "die"] }, direct: true, limited: true, forceDie: true, filter: function (event, player) { return player.isDamaged() && (event.name == "die" || player.isIn()); }, skillAnimation: true, animationColor: "gray", content: function () { "step 0"; player .chooseTarget(lib.filter.notMe, get.prompt("chuanshu"), "令一名其他角色获得〖朝凤〗") .set("ai", function (target) { return get.attitude(_status.event.player, target); }) .set("forceDie", true); "step 1"; if (result.bool) { var target = result.targets[0]; player.awakenSkill("chuanshu"); player.logSkill("chuanshu", target); target.addSkills("chaofeng"); if (player.isDead()) event.finish(); } else event.finish(); "step 2"; player.addSkills(lib.skill.chuanshu.derivation); }, derivation: ["ollongdan", "drlt_congjian", "chuanyun"], }, longdan_tongyuan: { audio: true }, ocongjian_tongyuan: { audio: true }, chuanyun: { audio: true, trigger: { player: "useCardToPlayered" }, shaRelated: true, filter: function (event, player) { return event.card.name == "sha" && event.target.countCards("e") > 0; }, logTarget: "target", content: function () { var target = trigger.target; card = target.getCards("e").randomGet(); if (card) target.discard(card); }, }, //南华老仙 jinghe: { enable: "phaseUse", filter: function (event, player) { return !player.hasSkill("jinghe_clear"); }, selectCard: function () { if (ui.selected.targets.length) return [ui.selected.targets.length, 4]; return [1, 4]; }, selectTarget: function () { return ui.selected.cards.length; }, filterTarget: true, filterCard: function (card) { if (ui.selected.cards.length) { var name = get.name(card); for (var i of ui.selected.cards) { if (get.name(i) == name) return false; } } return true; }, check: function (card) { var player = _status.event.player; if ( game.countPlayer(function (current) { return get.attitude(player, current) > 0; }) > ui.selected.cards.length ) return 1; return 0; }, position: "h", complexCard: true, discard: false, lose: false, delay: false, multitarget: true, multiline: true, content: function () { "step 0"; player.showCards(cards, get.translation(player) + "发动了【经合】"); event.skills = lib.skill.jinghe.derivation.randomGets(4); player.addTempSkill("jinghe_clear", { player: "phaseBegin" }); event.targets.sortBySeat(); event.num = 0; "step 1"; event.target = targets[num]; event.num++; event.target .chooseControl(event.skills, "cancel2") .set( "choiceList", event.skills.map(function (i) { return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; }) ) .set("displayIndex", false) .set("prompt", "选择获得一个技能"); "step 2"; var skill = result.control; if (skill != "cancel2") { event.skills.remove(skill); target.addAdditionalSkills("jinghe_" + player.playerid, skill); target.popup(skill); } if (event.num < event.targets.length) event.goto(1); if (target != game.me && !target.isOnline2()) game.delayx(); }, ai: { threaten: 3, order: 10, result: { target: 1, }, }, derivation: ["releiji", "rebiyue", "new_retuxi", "remingce", "xinzhiyan", "nhyinbing", "nhhuoqi", "nhguizhu", "nhxianshou", "nhlundao", "nhguanyue", "nhyanzheng"], subSkill: { clear: { onremove: function (player) { game.countPlayer(function (current) { current.removeAdditionalSkills("jinghe_" + player.playerid); }); }, }, }, }, gongxiu: { trigger: { player: "phaseJieshuBegin" }, direct: true, filter: function (event, player) { return player.hasSkill("jinghe_clear"); }, content: function () { "step 0"; event.list1 = []; event.list2 = []; event.addIndex = 0; var choices = []; game.countPlayer(function (current) { if (current.additionalSkills["jinghe_" + player.playerid]) event.list1.push(current); else event.list2.push(current); }); event.list1.sortBySeat(); if (event.list1.length) choices.push("令" + get.translation(event.list1) + (event.list1.length > 1 ? "各" : "") + "摸一张牌"); else event.addIndex++; event.list2.sortBySeat(); if (event.list2.length) choices.push("令" + get.translation(event.list2) + (event.list2.length > 1 ? "各" : "") + "弃置一张手牌"); player .chooseControl("cancel2") .set("choiceList", choices) .set("prompt", get.prompt("gongxiu")) .set("", function () { var evt = _status.event.getParent(); if ( evt.list2.filter(function (current) { return get.attitude(player, current) <= 0 && !current.hasSkillTag("noh"); }).length - evt.list1.length > 1 ) return 1 - evt.addIndex; return 0; }); "step 1"; if (result.control != "cancel2") { if (result.index + event.addIndex == 0) { player.logSkill("gongxiu", event.list1); game.asyncDraw(event.list1); } else { player.logSkill("gongxiu", event.list2); for (var i of event.list2) i.chooseToDiscard("h", true); event.finish(); } } else event.finish(); "step 2"; game.delayx(); }, ai: { combo: "jinghe", }, }, nhyinbing: { trigger: { source: "damageBefore" }, forced: true, filter: function (event, player) { return event.card && event.card.name == "sha"; }, content: function () { trigger.cancel(); trigger.player.loseHp(trigger.num); }, group: "nhyinbing_draw", subSkill: { draw: { trigger: { global: "loseHpAfter" }, forced: true, filter: function (event, player) { return player != event.player; }, content: function () { player.draw(); }, }, }, ai: { jueqing: true, }, }, nhhuoqi: { enable: "phaseUse", usable: 1, filter: function (event, player) { return player.countCards("he") > 0; }, position: "he", filterCard: true, filterTarget: function (card, player, target) { return target.isMinHp(); }, check: function (card) { return 7 - get.value(card); }, content: function () { target.recover(); target.draw(); }, ai: { order: 1, tag: { draw: 1, recover: 1, }, result: { target: function (player, target) { if (target.isDamaged()) return 3; if (ui.selected.cards.length) return 0; return 1; }, }, }, }, nhguizhu: { trigger: { global: "dying" }, usable: 1, logTarget: "player", frequent: true, content: function () { player.draw(2); }, }, nhxianshou: { enable: "phaseUse", usable: 1, filterTarget: true, content: function () { target.draw(target.isHealthy() ? 2 : 1); }, ai: { order: 1, tag: { draw: 1, }, result: { target: function (player, target) { return target.isHealthy() ? 2 : 0.5; }, }, }, }, nhlundao: { trigger: { player: "damageEnd" }, filter: function (event, player) { return event.source && player != event.source && player.countCards("h") != event.source.countCards("h"); }, logTarget: "source", check: function (event, player) { return player.countCards("h") < event.source.countCards("h") || get.effect(event.source, { name: "guohe_copy2" }, player, player) > 0; }, content: function () { if (player.countCards("h") > trigger.source.countCards("h")) player.draw(); else player.discardPlayerCard(trigger.source, "he", true); }, }, nhguanyue: { trigger: { player: "phaseJieshuBegin" }, frequent: true, content: function () { "step 0"; var cards = get.cards(2); player.chooseButton(["观月:选择获得一张牌", cards.slice(0)], true).set("ai", function (button) { return get.value(button.link, _status.event.player); }); while (cards.length) { ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); } "step 1"; if (result.bool) { player.gain(result.links, "gain2"); } }, }, nhyanzheng: { trigger: { player: "phaseZhunbeiBegin" }, direct: true, filter: function (event, player) { return player.countCards("h") > 0; }, content: function () { "step 0"; player .chooseCard("h", get.prompt("nhyanzheng")) .set( "goon", (function () { var num = player.countCards("h") - 1; return ( game.countPlayer(function (current) { return get.damageEffect(current, player, player) > 0; }) >= Math.min(3, num) ); })() ) .set("ai", function (card) { if (_status.event.goon) return Math.max(1, get.value(card)); return 0; }); "step 1"; if (result.bool) { player.logSkill("nhyanzheng"); var cards = player.getCards("h", function (card) { return card != result.cards[0] && lib.filter.cardDiscardable(card, player, "nhyanzheng"); }); if (cards.length) { player.discard(cards); event.num = cards.length; } else event.finish(); } else event.finish(); "step 2"; num = Math.min(num, game.countPlayer()); player.chooseTarget([1, num], true, "对" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "名角色造成1点伤害").set("ai", function (target) { var player = _status.event.player; return get.damageEffect(target, player, player); }); "step 3"; if (result.bool) { var targets = result.targets.sortBySeat(); player.line(targets, "green"); for (var i of targets) i.damage(); } }, }, //樊稠 xinxingluan: { audio: "xinfu_xingluan", usable: 1, trigger: { player: "useCardAfter" }, filter: function (event, player) { return player.isPhaseUsing(); }, async cost(event, trigger, player) { const choiceList = ["观看牌堆中两张点数为6的牌并获得其中一张", "令一名其他角色弃置一张点数为6的牌或交给你一张牌", "获得场上一张点数为6的牌"], choices = ["选项一"]; if (game.hasPlayer(current => current != player && current.countCards("he") > 0)) { choices.push("选项二"); } else { choiceList[1] = `${choiceList[1]}`; } if ( game.hasPlayer(current => { return current.hasCard(function (card) { return get.number(card) == 6 && lib.filter.canBeGained(card, current, player); }, "ej"); }) ) { choices.push("选项三"); } else { choiceList[2] = `${choiceList[2]}`; } const result = await player .chooseControl(choices, "cancel2") .set("choiceList", choiceList) .set("prompt", get.prompt("xinxingluan")) .set("ai", function () { var player = _status.event.player; if ( game.hasPlayer(function (current) { if (current == player) return false; var att = -get.sgn(get.attitude(player, current) - 0.1); return current.hasCard(function (card) { return get.number(card) == 6 && lib.filter.canBeGained(card, current, player) && get.sgn(get.useful(card, current)) == att; }, "ej"); }) ) return "选项三"; if ( game.hasPlayer(function (target) { if (target == player) return false; var att = get.attitude(player, target); return ( att < 0 && target.countCards("he") > 0 && !target.hasCard(function (card) { return get.value(card, target) <= 0; }, "he") ); }) ) return "选项二"; return "选项一"; }) .forResult(); if (result.control !== "cancel2") { const results = { bool: true, cost_data: { index: choices.indexOf(result.control) } }; if (results.cost_data.index === 1) { const { targets } = await player .chooseTarget("令一名其他角色弃置一张点数为6的牌,否则交给你一张牌", true, function (card, player, current) { return current != player && current.countCards("he") > 0; }) .set("ai", function (target) { var player = _status.event.player, att = get.attitude(player, target); if (att >= 0) return 0; if ( !target.hasCard(function (card) { return get.value(card, target) <= 0; }, "he") ) return -att / Math.sqrt(target.countCards("he")); return 0; }) .forResult(); results.targets = targets; } else if (results.cost_data.index === 2) { const { targets } = await player .chooseTarget("获得一名角色装备区或判定区内点数为6的牌", true, function (card, player, current) { return current.hasCard(function (card) { return get.number(card) == 6 && lib.filter.canBeGained(card, current, player); }, "ej"); }) .set("ai", function (target) { var player = _status.event.player, att = -get.sgn(get.attitude(player, target) - 0.1), max = 0, ej = target.getCards("ej", function (card) { return get.number(card) == 6 && lib.filter.canBeGained(card, target, player); }); for (var i of ej) { var num = get.useful(i, target) * att; if (num > max) max = num; return max; } }) .forResult(); results.targets = targets; } event.result = results; } }, content: function () { "step 0"; var result = event.cost_data; if (result.index === 1) event.goto(4); else if (result.index === 2) event.goto(3); "step 1"; var cards = []; while (cards.length < 2) { var card = get.cardPile2(function (card) { return !cards.includes(card) && get.number(card) == 6; }); if (!card) break; cards.push(card); } if (!cards.length) { player.draw(6); event.finish(); } else if (cards.length == 1) { event._result = { bool: true, links: cards }; } else player.chooseButton(["兴乱:选择获得其中一张", cards], true).set("ai", function (button) { return get.value(button.link, _status.event.player); }); "step 2"; if (result.bool) { player.gain(result.links, "gain2"); } event.finish(); "step 3"; var target = targets[0]; player.gainPlayerCard(target, "ej", true).set("filterButton", function (button) { return get.number(button.link) == 6; }); event.finish(); "step 4"; var target = targets[0]; event.target = target; target.chooseToDiscard("he", "弃置一张点数为6的牌,否则交给" + get.translation(player) + "一张牌", function (card) { return get.number(card) == 6; }).ai = card => 8 - get.value(card); "step 5"; if (!result.bool) { target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); } else event.finish(); "step 6"; if (result.bool) target.give(result.cards, player, "giveAuto"); }, }, rexingluan: { audio: "xinfu_xingluan", usable: 1, trigger: { player: "useCardAfter" }, filter: function (event, player) { return event.targets && event.targets.length == 1 && typeof get.number(event.card, false) == "number" && player.isPhaseUsing(); }, direct: true, content: function () { "step 0"; var str = "", num = get.number(trigger.card, false), nums = get.strNumber(num); var list = game.filterPlayer(function (current) { return current.hasCard(function (card) { return get.number(card) == num && lib.filter.canBeGained(card, current, player); }, "ej"); }); if (list.length) { str += "获得一名角色装备区或判定区内的一张点数为" + nums + "的牌,或直接从牌堆中获得一张点数为" + nums + "的牌"; player .chooseTarget(get.prompt("rexingluan"), str, [0, 1], function (card, player, target) { return _status.event.targets.includes(target); }) .set("targets", list) .set("ai", function (target) { if (!target) return 1; var player = _status.event.player, num = get.number(_status.event.getTrigger().card, false), att = -get.sgn(get.attitude(player, target)); if ( target.hasCard(function (card) { return get.number(card) == num && get.effect(target, card, target, player) < 0; }, "j") ) return 1.2 * Math.abs(get.attitude(player, target)); if ( target.hasCard(function (card) { return get.number(card) == num && get.sgn(get.value(card, target) + 0.1) == att; }, "e") ) return Math.abs(get.attitude(player, target)); return 0; }); } else { player.chooseBool(get.prompt("rexingluan"), "从牌堆中获得一张点数为" + nums + "的牌").ai = () => true; } "step 1"; if (result.bool) { if (result.targets && result.targets.length) { var target = result.targets[0]; player.logSkill("rexingluan", target); player .gainPlayerCard(target, "ej", true) .set("num", get.number(trigger.card, false)) .set("filterButton", function (button) { return get.number(button.link) == _status.event.num; }); } else { player.logSkill("rexingluan"); var num = get.number(trigger.card, false), card = get.cardPile2(function (i) { return get.number(i, false) == num; }); if (card) player.gain(card, "gain2"); } } }, }, //杜夫人 yise: { audio: 2, trigger: { global: "gainAfter", player: "loseAsyncAfter", }, filter: function (event, player) { if (event.name == "loseAsync") { if (event.type != "gain") return false; } var cards = event.getl(player).cards2; return game.hasPlayer(function (current) { if (current == player) return false; var cardsx = event.getg(current); for (var i of cardsx) { if (cards.includes(i)) { if (current.isDamaged()) return true; return get.color(i, player) == "black"; } } return false; }); }, direct: true, content: function () { "step 0"; var cards = trigger.getl(player).cards2; event.cards = cards; event.targets = game .filterPlayer(function (current) { if (current == player) return false; var cardsx = trigger.getg(current); for (var i of cardsx) { if (cards.includes(i)) return true; } return false; }) .sortBySeat(); if (!event.targets.length) event.finish(); "step 1"; var target = targets.shift(); var cardsx = trigger.getg(target); var goon = false; for (var i of cardsx) { if (cards.includes(i)) { if (target.isDamaged() || get.color(i, player) == "black") { goon = true; break; } } } if (goon) { var next = game.createEvent("yise_insert"); next.player = player; next.target = target; next.cards = cardsx; next.setContent(lib.skill.yise.contentx); } if (targets.length > 0) event.redo(); }, contentx: function () { "step 0"; for (var i of cards) { event[get.color(i, player)] = true; if (event.red && event.black) break; } if (event.red && target.isDamaged()) { player.chooseBool(get.prompt("yise", target), "令" + get.translation(target) + "回复1点体力").set("ai", () => get.recoverEffect(_status.event.getParent().target, _status.event.player, _status.event.player) > 0); } "step 1"; if (event.black || (event.red && result.bool)) player.logSkill("yise", target); if (event.red && result.bool) target.recover(); if (event.black) { target.addMark("yise_damage", 1, false); target.addSkill("yise_damage"); } }, subSkill: { damage: { trigger: { player: "damageBegin1" }, forced: true, charlotte: true, onremove: true, filter: function (event, player) { return event.card && event.card.name == "sha" && event.getParent().name == "sha"; }, content: function () { trigger.num += player.countMark("yise_damage"); player.removeSkill("yise_damage"); }, intro: { content: "下一次受到杀的伤害+#", }, }, }, }, shunshi: { trigger: { player: ["damageEnd", "phaseZhunbeiBegin"] }, direct: true, filter: function (event, player) { return ( (event.name != "damage" || player != _status.currentPhase) && player.countCards("he") > 0 && game.hasPlayer(function (current) { return current != player && current != event.source; }) ); }, content: function () { "step 0"; player.chooseCardTarget({ prompt: get.prompt("shunshi"), prompt2: "将一张牌交给一名其他角色,并获得+1效果", filterCard: true, filterTarget: function (card, player, target) { return target != player && target != _status.event.source; }, position: "he", source: trigger.source, ai1: function (card) { var player = _status.event.player; if (player.hasSkill("yise")) { if ( get.color(card, player) == "red" && game.hasPlayer(function (current) { return current != player && current != _status.event.source && current.isDamaged() && get.recoverEffect(current, player, player) > 0; }) ) return 10 - get.value(card); if (get.color(card, player) == "black") return 4 - get.value(card); } return 8 - get.value(card); }, ai2: function (target) { var player = _status.event.player, card = ui.selected.cards[0]; if (player.hasSkill("yise")) { if (get.color(card) == "red" && target.isDamaged()) return 2 * get.recoverEffect(target, player, player); if (get.color(card) == "black") return -get.attitude(player, target); } if (get.value(card, target) < 0) return -get.attitude(player, target); if (get.value(card, target) < 1) return 0.01 * -get.attitude(player, target); return Math.max(1, get.value(card, target) - get.value(card, player)) * get.attitude(player, target); }, }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("shunshi", target); player.give(result.cards, target); player.addMark("shunshi_mark", 1, false); player.addTempSkill("shunshi_mark", { player: "phaseEnd" }); } }, subSkill: { mark: { onremove: true, trigger: { player: "phaseDrawBegin2" }, forced: true, charlotte: true, popup: false, filter: function (event, player) { return !event.numFixed; }, content: function () { trigger.num += player.countMark("shunshi_mark"); }, mod: { maxHandcard: function (player, num) { return num + player.countMark("shunshi_mark"); }, cardUsable: function (card, player, num) { if (card.name == "sha") return num + player.countMark("shunshi_mark"); }, }, intro: { content: "拥有#层效果", }, }, }, }, xianwei: { audio: 2, trigger: { player: "phaseZhunbeiBegin" }, forced: true, filter: function (event, player) { return player.hasEnabledSlot(); }, content: function () { "step 0"; player.chooseToDisable().ai = function (event, player, list) { var getVal = function (num) { var card = player.getEquip(num); if (card) { var val = get.value(card); if (val > 0) return 0; return 5 - val; } switch (num) { case "equip3": return 4.5; case "equip4": return 4.4; case "equip5": return 4.3; case "equip2": return (3 - player.hp) * 1.5; case "equip1": { if ( game.hasPlayer(function (current) { return (get.realAttitude || get.attitude)(player, current) < 0 && get.distance(player, current) > 1; }) ) return 0; return 3.2; } } }; list.sort(function (a, b) { return getVal(b) - getVal(a); }); return list[0]; }; "step 1"; var cardType = result.control; event.cardType = cardType; var num = player.countDisabledSlot(); if (num < 5) player.draw(5 - num); player .chooseTarget(lib.filter.notMe, "是否令一名其他角色从牌堆中使用一张" + get.translation(cardType) + "牌?") .set("ai", function (target) { var player = _status.event.player, type = _status.event.cardType; var card = get.cardPile2(function (card) { return get.subtype(card) == type && target.canUse(card, target); }); if (!card) return 0; return get.effect(target, card, target, player); }) .set("cardType", event.cardType); "step 2"; if (!result.bool) return; var target = result.targets[0]; player.line(target, "green"); var card = get.cardPile2(function (card) { return get.subtype(card) == event.cardType && target.canUse(card, target); }); if (card) target.chooseUseTarget(card, "nopopup", true); else target.draw(); }, group: "xianwei_all", subSkill: { all: { trigger: { player: "disableEquipAfter" }, forced: true, filter: function (event, player) { return !player.hasEnabledSlot(); }, content: function () { player.gainMaxHp(2); player.addSkill("xianwei_effect"); }, }, effect: { charlotte: true, mark: true, intro: { content: "和其他角色视为在彼此的攻击范围内" }, mod: { inRange: () => true, inRangeOf: () => true, }, }, }, }, rehuoshui: { audio: 2, trigger: { player: "phaseZhunbeiBegin" }, direct: true, content: function () { "step 0"; var num = Math.min(game.countPlayer() - 1, Math.max(1, player.getDamagedHp())); var str; if (num > 1) { str = "选择至多" + get.cnNumber(num) + "名其他角色。"; var list = ["第一名角色的非锁定技失效直到回合结束", ";第二名角色交给你一张手牌", ";第三名及之后角色弃置装备区内的所有牌"]; for (var i = 0; i < Math.min(3, num); i++) { str += list[i]; } str += "。"; } else str = "令一名其他角色的非锁定技本回合内失效"; player.chooseTarget([1, num], get.prompt("rehuoshui"), str, lib.filter.notMe).set("ai", function (target) { var att = -get.attitude(_status.event.player, target); if (att <= 0) return 0; if (target.hasSkillTag("maixie") || target.hasSkill("maixie_hp") || target.hasSkill("maixie_defed")) att *= 3; return att / get.threaten(target); }); "step 1"; if (result.bool) { var targets = result.targets; player.logSkill("rehuoshui", targets); event.targets = targets; targets[0].addTempSkill("fengyin"); if (targets.length < 2) event.goto(5); } else event.finish(); "step 2"; if (targets[1].countCards("h") == 0) event.goto(targets.length > 2 ? 4 : 5); else targets[1].chooseCard("h", true, "交给" + get.translation(player) + "一张手牌"); "step 3"; if (result.bool) { targets[1].give(result.cards, player); } if (targets.length < 3) { event.goto(5); } else { targets.splice(0, 2); } "step 4"; var target = targets.shift(); var num = target.countCards("e"); if (num > 0) target.chooseToDiscard("e", true, num); if (targets.length > 0) event.redo(); "step 5"; game.delayx(); }, }, reqingcheng: { audio: 2, enable: "phaseUse", usable: 1, filter: function (event, player) { return game.hasPlayer(current => lib.skill.reqingcheng.filterTarget(null, player, current)); }, filterTarget: function (card, player, target) { return target != player && target.hasSex("male") && target.countCards("h") <= player.countCards("h"); }, content: function () { player.swapHandcards(target); }, ai: { order: 1, result: { player: function (player, target) { if (target.countCards("h") > 0) return -Math.max(get.value(target.getCards("h"), player) - get.value(player.getCards("h"), player), 0); return 0; }, }, }, }, //丘力居 koulve: { audio: 2, trigger: { source: "damageSource" }, logTarget: "player", filter: function (event, player) { return event.player.isDamaged() && event.player.countCards("h") > 0 && player.isPhaseUsing(); }, check: function (event, player) { if (player.hp == 1 && player.isHealthy()) return false; return get.attitude(player, event.player) <= 0; }, content: function () { "step 0"; player.choosePlayerCard(trigger.player, "h", true, trigger.player.getDamagedHp()); "step 1"; var card = result.cards; event.cards = card; player.showCards(card, get.translation(player) + "发动了【宼略】"); "step 2"; var gains = [], red = false; var target = trigger.player; for (var card of cards) { var type = get.type2(card, target); if ((type == "basic" || type == "trick") && get.tag(card, "damage") > 0) gains.push(card); if (!red && get.color(card, target) == "red") red = true; } if (gains.length) player.gain(gains, "gain2"); if (!red) event.finish(); "step 3"; player[player.isDamaged() ? "loseMaxHp" : "loseHp"](); player.draw(2); }, }, qljsuiren: { audio: 2, trigger: { player: "die" }, direct: true, forceDie: true, skillAnimation: true, animationColor: "gray", filter: function (event, player) { return player.countCards("h", function (card) { var type = get.type(card, player); return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; }); }, content: function () { "step 0"; player .chooseTarget(lib.filter.notMe, get.prompt("qljsuiren"), "将所有伤害性基本牌和锦囊牌交给一名其他角色") .set("forceDie", true) .set("ai", function (target) { var player = _status.event.player, cards = _status.event.aiCards; var att = get.attitude(player, target); if (att <= 0) return 0; if (target.hasSkillTag("nogain")) att /= 100; var num = 0.1; for (var i of cards) num += Math.max(0, target.getUseValue(card)); return num * att; }) .set( "aiCards", player.getCards("h", function (card) { var type = get.type(card, player); return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; }) ); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("qljsuiren", target); player.give( player.getCards("h", function (card) { var type = get.type(card, player); return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; }), target, "give" ); } }, }, //胡车儿 redaoji: { audio: 2, trigger: { global: "useCard" }, direct: true, filter: function (event, player) { if (player == event.player || get.subtype(event.card, false) != "equip1" || (event.player.isDead() && !event.cards.filterInD().length)) return false; var all = event.player.getAllHistory("useCard"); for (var i of all) { if (get.subtype(i.card, false) == "equip1") return i == event; } return false; }, content: function () { "step 0"; var list = []; event.addIndex = 0; if (trigger.cards.filterInD().length > 0) list.push("获得" + get.translation(trigger.cards.filterInD())); else event.addIndex++; if (trigger.player.isIn()) list.push("令" + get.translation(trigger.player) + "本回合不能使用或打出【杀】"); player .chooseControl("cancel2") .set("choiceList", list) .set("prompt", get.prompt("redaoji", trigger.player)) .set("ai", function () { var evt = _status.event.getParent(), player = evt.player, evt2 = evt._trigger; if (evt.addIndex == 0) { var noob = get.attitude(player, evt2.player) < 0 ? 1 : "cancel2"; if (player.countMark("fuzhong") == 3) return noob; if (get.effect(evt2.targets[0], evt2.card, evt2.player, player) <= 0) return 0; return noob; } return get.attitude(player, evt2.player) < 0 ? 0 : "cancel2"; }); "step 1"; if (result.control != "cancel2") { player.logSkill("redaoji", trigger.player); game.delayx(); if (result.index + event.addIndex == 0) { player.gain(trigger.cards.filterInD(), "gain2"); } else trigger.player.addTempSkill("redaoji2"); } }, }, redaoji2: { charlotte: true, mark: true, mod: { cardEnabled: function (card) { if (card.name == "sha") return false; }, cardRespondable: function (card) { if (card.name == "sha") return false; }, }, intro: { content: "本回合不能使用或打出杀", }, }, fuzhong: { audio: 2, trigger: { player: "phaseJieshuBegin" }, forced: true, filter: function (event, player) { return player.countMark("fuzhong") > 3; }, content: function () { "step 0"; player.chooseTarget(lib.filter.notMe, "对一名其他角色造成1点伤害", true).set("ai", function (target) { var player = _status.event.player; return get.damageEffect(target, player, player); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.line(target); target.damage("nocard"); } player.removeMark("fuzhong", 4); }, marktext: "重", intro: { content: "mark" }, group: ["fuzhong_gain", "fuzhong_yingzi"], mod: { maxHandcard: function (player, num) { if (player.countMark("fuzhong") > 2) return num + 3; }, globalFrom: function (player, target, num) { if (player.countMark("fuzhong") > 1) return num - 2; }, }, subSkill: { gain: { audio: "fuzhong", trigger: { player: "gainAfter", global: "loseAsyncAfter", }, forced: true, filter: function (event, player) { return player != _status.currentPhase && event.getg(player).length > 0; }, content: function () { player.addMark("fuzhong", 1); }, }, yingzi: { audio: "fuzhong", trigger: { player: "phaseDrawBegin2" }, forced: true, filter: function (event, player) { return !event.numFixed && player.countMark("fuzhong") > 0; }, content: function () { trigger.num++; }, }, }, }, //董承 xuezhao: { enable: "phaseUse", usable: 1, filter: function (event, player) { return player.maxHp > 0 && player.countCards("h") > 0; }, filterCard: true, position: "h", filterTarget: lib.filter.notMe, selectTarget: function () { return [1, _status.event.player.maxHp]; }, check: function (card) { return 2 * (_status.event.player.maxHp + 2) - get.value(card); }, content: function () { "step 0"; if (!target.countCards("he")) event._result = { bool: false }; else target.chooseCard("he", "交给" + get.translation(player) + "一张牌并摸一张牌,或不能响应其使用的牌直到回合结束").set("ai", function (card) { var player = _status.event.player, target = _status.event.getParent().player, val = get.value(card); if (get.attitude(player, target) > 0) { if (get.name(card, target) == "sha" && target.hasValueTarget(card)) return 30 - val; return 20 - val; } return -val; }); "step 1"; if (result.bool) { player.addTempSkill("xuezhao_sha"); player.addMark("xuezhao_sha", 1, false); target.give(result.cards, player); target.draw(); } else { player.addTempSkill("xuezhao_hit"); player.markAuto("xuezhao_hit", [target]); } }, ai: { threaten: 2.4, order: 3.6, result: { player: function (player, target) { if (get.attitude(target, player) > 0) { if ( target.countCards("e", function (card) { return get.value(card, target) < 0; }) ) return 3; return Math.sqrt(target.countCards("he")); } if ( target.mayHaveShan( player, "use", target.getCards("h", i => { return i.hasGaintag("sha_notshan"); }) ) && player.countCards("hs", function (card) { return !ui.selected.cards.includes(card) && get.name(card) == "sha" && player.canUse(card, target) && get.effect(target, card, player, player) != 0; }) ) return -Math.sqrt(Math.abs(get.attitude(player, target))) / 2; return 0.1; }, }, }, subSkill: { sha: { charlotte: true, onremove: true, marktext: "血", intro: { content: "多杀#刀,誓诛曹贼!" }, mod: { cardUsable: function (card, player, num) { if (card.name == "sha") return num + player.countMark("xuezhao_sha"); }, }, }, hit: { charlotte: true, onremove: true, marktext: "诏", intro: { content: "$篡汉,其心可诛!" }, trigger: { player: "useCard1" }, forced: true, popup: false, content: function () { trigger.directHit.addArray(player.getStorage("xuezhao_hit")); }, ai: { directHit_ai: true, skillTagFilter: function (player, tag, arg) { return player.getStorage("xuezhao_hit").includes(arg.target); }, }, }, }, }, //唐姬 kangge: { audio: 2, trigger: { player: "phaseBegin" }, direct: true, filter: function (event, player) { return player.phaseNumber == 1 && !player.storage.kangge && game.hasPlayer(current => current != player); }, content: function () { "step 0"; player.chooseTarget("请选择【抗歌】的目标", "其于回合外摸牌后,你摸等量的牌;其进入濒死状态时,你可令其回复体力至1点;其死亡后,你弃置所有牌并失去1点体力", lib.filter.notMe, true).set("ai", function (target) { return get.attitude(_status.event.player, target); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("kangge", target); player.addSkill("kangge_clear"); player.storage.kangge = target; player.markSkill("kangge"); game.delayx(); } }, intro: { content: "已指定$为目标" }, group: ["kangge_draw", "kangge_dying", "kangge_die"], subSkill: { draw: { audio: "kangge", trigger: { global: ["gainAfter", "loseAsyncAfter"], }, forced: true, filter: function (event, player) { if (player.countMark("kangge_draw") >= 3) return false; var target = player.storage.kangge; return target && target != _status.currentPhase && event.getg(target).length > 0; }, logTarget: "player", content: function () { var num = Math.min(3 - player.countMark("kangge_draw"), trigger.getg(player.storage.kangge).length); player.addMark("kangge_draw", num, false); player.draw(num); }, }, clear: { trigger: { global: "phaseBeginStart" }, forced: true, firstDo: true, popup: false, charlotte: true, filter: function (event, player) { return player.countMark("kangge_draw") > 0; }, content: function () { player.removeMark("kangge_draw", player.countMark("kangge_draw"), false); }, }, dying: { audio: "kangge", trigger: { global: "dying" }, logTarget: "player", filter: function (event, player) { return event.player == player.storage.kangge && event.player.hp < 1 && !player.hasSkill("kangge_temp"); }, check: function (event, player) { return get.attitude(player, event.player) > 0; }, prompt2: "令其将体力值回复至1点", content: function () { trigger.player.recover(1 - trigger.player.hp); player.addTempSkill("kangge_temp", "roundStart"); }, }, temp: {}, die: { audio: "kangge", trigger: { global: "dieAfter" }, filter: function (event, player) { return event.player == player.storage.kangge; }, forced: true, content: function () { var cards = player.getCards("he"); if (cards.length) player.discard(cards); player.loseHp(); }, }, }, ai: { threaten: 2, }, }, jielie: { audio: 2, trigger: { player: "damageBegin4" }, direct: true, filter: function (event, player) { return (!event.source || (event.source != player && event.source != player.storage.kangge)) && player.storage.kangge && player.storage.kangge.isIn(); }, content: function () { "step 0"; player .chooseControl(lib.suit.slice(0), "cancel2") .set("prompt", get.prompt("jielie")) .set("prompt2", "防止伤害并改为失去等量体力,且令" + get.translation(player.storage.kangge) + "从弃牌堆中获得等量的花色牌") .set("ai", function () { var player = _status.event.player; if (get.attitude(player, player.storage.kangge) <= 0) return "cancel2"; return lib.suit.randomGet(); }); "step 1"; if (result.control != "cancel2") { event.suit = result.control; player.logSkill("jielie", player.storage.kangge); trigger.cancel(); player.loseHp(trigger.num); } else event.finish(); "step 2"; var cards = []; while (cards.length < trigger.num) { var card = get.discardPile(function (card) { return get.suit(card, false) == event.suit && !cards.includes(card); }); if (card) cards.push(card); else break; } if (cards.length) player.storage.kangge.gain(cards, "gain2"); }, }, //张横 dangzai: { trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { return ( !player.isDisabledJudge() && game.hasPlayer(function (current) { return ( current != player && current.countCards("j", function (card) { return player.canAddJudge(card); }) > 0 ); }) ); }, content: function () { "step 0"; player.chooseTarget( function (card, player, target) { return ( target != player && target.countCards("j", function (card) { return player.canAddJudge(card); }) > 0 ); }, get.prompt("dangzai"), "将一名其他角色判定区内的一张牌移动到你的判定区内" ); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("dangzai", target); player.choosePlayerCard(target, "j", true).set("filterButton", function (button) { return _status.event.player.canAddJudge(button.link); }); } else event.finish(); "step 2"; if (result.bool && result.cards && result.cards.length) { var card = result.cards[0]; target.$give(card, player); game.delayx(); var name = card.viewAs || card.name; if (card.name != name) { player.addJudge(name, card); } else { player.addJudge(card); } } }, }, liangjue: { trigger: { player: "loseAfter", global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], }, forced: true, filter: function (event, player) { if (player.hp <= 1) return false; if (event.player == player) { if (event.name == "equip" && get.color(event.card, player) == "black") return true; if (event.name == "addJudge" && get.color(event.cards[0], player) == "black") return true; } var evt = event.getl(player); if (!evt || !evt.es || !evt.js || (!evt.es.length && !evt.js.length)) return false; for (var i of evt.es) { if (get.color(i, player) == "black") return true; } for (var i of evt.js) { if (get.color(i, player) == "black") return true; } return false; }, content: function () { player.loseHp(); player.draw(2); }, }, //狼灭 langmie: { trigger: { global: "phaseUseEnd" }, //forced:true, filter: function (event, player) { if (player == event.player || !player.countCards("he")) return false; var map = {}; var list = event.player.getHistory("useCard", function (evt) { var evt2 = evt.getParent("phaseUse"); return evt2 == event; }); for (var i of list) { var name = get.type2(i.card, false); if (!map[name]) map[name] = true; else return true; } }, frequent: true, content: function () { player.draw(); }, group: "langmie_damage", }, langmie_damage: { audio: "langmie", trigger: { global: "phaseEnd" }, direct: true, filter: function (event, player) { return event.player != player && (event.player.getStat("damage") || 0) > 1 && player.countCards("he") > 0; }, content: function () { "step 0"; player .chooseToDiscard("he", get.prompt("langmie", trigger.player), "弃置一张牌并对其造成1点伤害") .set("goon", get.damageEffect(trigger.player, player, player) > 0) .set("ai", function (card) { if (!_status.event.goon) return 0; return 7 - get.value(card); }).logSkill = ["langmie_damage", trigger.player]; "step 1"; if (result.bool) trigger.player.damage(); }, ai: { expose: 0.2 }, }, //牛金 recuorui: { audio: "cuorui", enable: "phaseUse", limited: true, skillAnimation: true, animationColor: "thunder", filter: function (event, player) { return ( player.hp > 0 && game.hasPlayer(function (current) { return current != player && current.countGainableCards(player, "h") > 0; }) ); }, filterTarget: function (card, player, target) { return target != player && target.countGainableCards(player, "h") > 0; }, selectTarget: function () { return [1, _status.event.player.hp]; }, content: function () { if (num == 0) player.awakenSkill("recuorui"); player.gainPlayerCard(target, true, "h"); }, ai: { order: 10, result: { player: 1, target: function (player, target) { if (target.hasSkillTag("noh")) return 0; return -1; }, }, }, }, reliewei: { audio: "liewei", trigger: { global: "dying" }, filter: function (event, player) { return player == _status.currentPhase || player.getHistory("useSkill", evt => evt.skill == "reliewei").length < player.getHp(); }, frequent: true, content: function () { player.draw(); }, }, //张邈 mouni: { trigger: { player: "phaseZhunbeiBegin" }, direct: true, filter: function (event, player) { return player.countCards("h", "sha") > 0; }, content: function () { "step 0"; player.addSkill("mouni2"); player.chooseTarget(get.prompt2("mouni"), lib.filter.notMe).set("ai", function (target) { var player = _status.event.player, cards = player.getCards("h", "sha"); if ( get.attitude(player, target) >= 0 || !player.canUse(cards[0], target, false) || (!player.hasJudge("lebu") && target.mayHaveShan( player, "use", target.getCards("h", i => { return i.hasGaintag("sha_notshan"); }) ) && !player.hasSkillTag( "directHit_ai", true, { target: target, card: cards[0], }, true )) ) return 0; return get.effect(target, cards[0], player, player); }); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("mouni", target); event.cards = player.getCards("h", "sha"); } else event.finish(); "step 2"; if (event.mouni_dying) return; var hs = player.getCards("h"); cards = cards.filter(function (card) { return ( hs.includes(card) && get.name(card, player) == "sha" && player.canUse( { name: "sha", nature: get.nature(card, player), isCard: true, cards: [card], }, target, false ) ); }); if (cards.length) { var card = cards.randomRemove(1)[0]; player.useCard(target, false, card); event.redo(); } "step 3"; if ( player.getHistory("useCard", function (evt) { return ( evt.getParent() == event && !player.getHistory("sourceDamage", function (evt2) { return evt.card == evt2.card; }).length ); }).length ) { player.skip("phaseUse"); player.skip("phaseDiscard"); } player.removeSkill("mouni2"); }, }, mouni2: { charlotte: true, trigger: { global: "dying" }, forced: true, firstDo: true, popup: false, filter: function (event, player) { var evt = event.getParent("mouni"); return evt && evt.player == player && evt.target == event.player; }, content: function () { trigger.getParent("mouni").mouni_dying = true; }, }, zongfan: { derivation: "zhangu", trigger: { player: "phaseJieshuBegin" }, juexingji: true, forced: true, skillAnimation: true, animationColor: "gray", filter: function (event, player) { return ( !player.getHistory("skipped").includes("phaseUse") && player.getHistory("useCard", function (evt) { return evt.getParent().name == "mouni"; }).length > 0 ); }, content: function () { "step 0"; player.awakenSkill("zongfan"); var num = player.countCards("he"); if (num > 0) { player.chooseCardTarget({ prompt: "是否将任意张牌交给一名其他角色?", selectCard: [1, num], filterCard: true, filterTarget: lib.filter.notMe, position: "he", ai1: function (card) { if (card.name == "du") return 10; else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; var player = _status.event.player; if ( ui.selected.cards.length > 4 || !game.hasPlayer(function (current) { return get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); }) ) return 0; return 1 / Math.max(0.1, get.value(card)); }, ai2: function (target) { var player = _status.event.player, att = get.attitude(player, target); if (ui.selected.cards[0].name == "du") return -att; if (target.hasSkillTag("nogain")) att /= 6; return att; }, }); } else event.goto(2); "step 1"; if (result.bool) { var cards = result.cards, target = result.targets[0], num = Math.min(5, cards.length); player.give(cards, target); player.gainMaxHp(num); player.recover(num); } "step 2"; //player.removeSkill('mouni'); player.changeSkills(["zhangu"], ["mouni"]); }, ai: { combo: "mouni", }, }, zhangu: { trigger: { player: "phaseZhunbeiBegin" }, forced: true, filter: function (event, player) { return player.maxHp > 1 && (player.countCards("h") == 0 || player.countCards("e") == 0); }, content: function () { var cards = [], types = []; for (var i = 0; i < 3; i++) { var card = get.cardPile2(function (card) { return !cards.includes(card) && !types.includes(get.type2(card, false)); }); if (card) { cards.push(card); types.push(get.type2(card, false)); } else break; } if (cards.length) player.gain(cards, "gain2"); player.loseMaxHp(); }, }, //梁兴 lulve: { audio: 2, trigger: { player: "phaseUseBegin" }, filter: function (event, player) { var hs = player.countCards("h"); return ( hs > 1 && game.hasPlayer(function (target) { var ts = target.countCards("h"); return target != player && ts > 0 && hs > ts; }) ); }, direct: true, content: function () { "step 0"; player .chooseTarget(get.prompt2("lulve"), function (card, player, target) { var hs = player.countCards("h"), ts = target.countCards("h"); return target != player && ts > 0 && hs > ts; }) .set("ai", function (target) { var player = _status.event.player, att = get.attitude(player, target); if (target.isTurnedOver()) return att / 10; if (!player.hasShan() && target.canUse({ name: "sha", isCard: true }, player, false) && get.effect(player, { name: "sha", isCard: true }, target, player) < 0 && player.hp < 4) return 0; return -att * Math.sqrt(target.countCards("h")); }); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("lulve", target); var str = get.translation(player); target .chooseControl() .set("choiceList", ["将所有手牌交给" + str + ",然后其将武将牌翻面", "将武将牌翻面,然后视为对" + str + "使用【杀】"]) .set("ai", function () { var player = _status.event.player, target = _status.event.getParent().player; if (player.isTurnedOver()) return 1; if (!target.hasShan() && player.canUse({ name: "sha", isCard: true }, target, false) && get.effect(target, { name: "sha", isCard: true }, player, player) < 0) return 0; return Math.random() < 0.5 ? 0 : 1; }); } else event.finish(); "step 2"; if (result.index == 0) { target.give(target.getCards("h"), player); player.turnOver(); event.finish(); } else target.turnOver(); "step 3"; if (target.canUse({ name: "sha", isCard: true }, player, false)) target.useCard({ name: "sha", isCard: true }, player, false); }, }, lxzhuixi: { audio: 2, trigger: { player: "damageBegin3", source: "damageBegin1", }, forced: true, logTarget: "player", filter: function (event, player) { return event.source && event.player.isTurnedOver() != event.source.isTurnedOver(); }, content: function () { trigger.num++; }, }, //陶谦和曹嵩 reyirang: { audio: "yirang", audioname: ["re_taoqian"], trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { if ( !player.countCards("he", function (card) { return get.type(card) != "basic"; }) ) { return false; } return game.hasPlayer(function (current) { return current != player; }); }, content: function () { "step 0"; player .chooseTarget(get.prompt2("reyirang"), function (card, player, target) { return target != player; }) .set("ai", function (target) { return (get.attitude(_status.event.player, target) - 2) * target.maxHp; }); "step 1"; if (result.bool) { var cards = player.getCards("he", function (card) { return get.type(card) != "basic"; }); var target = result.targets[0]; player.logSkill("reyirang", target); player.give(cards, target, "give"); if (target.maxHp > player.maxHp) player.gainMaxHp(target.maxHp - player.maxHp, true); player.recover(cards.length); } }, }, cslilu: { audio: 2, trigger: { player: "phaseDrawBegin1" }, filter: function (event, player) { return !event.numFixed; }, check: function (event, player) { return ( Math.min(player.maxHp, 5) - player.countCards("h") > 3 || game.hasPlayer(function (current) { return current != player && get.attitude(player, current) > 0; }) ); }, content: function () { "step 0"; trigger.changeToZero(); "step 1"; player.drawTo(Math.min(player.maxHp, 5)); "step 2"; if (player.countCards("h") > 0) { var str = "将至少一张手牌交给一名其他角色"; var num = player.countMark("cslilu"); if (num < player.countCards("h")) { if (num > 0) str += "。若给出的牌数大于" + get.cnNumber(num) + "张,则你"; else str += ",并"; str += "加1点体力上限并回复1点体力"; } player.chooseCardTarget({ prompt: str, filterCard: true, filterTarget: lib.filter.notMe, selectCard: [1, Infinity], forced: true, ai1: function (card) { if (ui.selected.cards.length < _status.event.goon) { if ( get.tag(card, "damage") && game.hasPlayer(function (current) { current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain") && !current.hasJudge("lebu") && current.hasValueTarget(card); }) ) return 1; return 1 / Math.max(0.1, get.value(card)); } return 0; }, ai2: function (target) { return Math.sqrt(5 - Math.min(4, target.countCards("h"))) * get.attitude(_status.event.player, target); }, goon: (function () { if ( !game.hasPlayer(function (current) { return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain") && !current.hasJudge("lebu"); }) ) return 1; if (num < player.countCards("h")) return num + 1; return 1; })(), }); } else event.finish(); "step 3"; if (result.bool) { var num = player.countMark("cslilu"); player.give(result.cards, result.targets[0]); if (result.cards.length > num) { player.gainMaxHp(); player.recover(); } player.storage.cslilu = result.cards.length; player.markSkill("cslilu"); } }, }, csyizheng: { audio: 2, trigger: { player: "phaseJieshuBegin" }, direct: true, content: function () { "step 0"; player.chooseTarget(get.prompt2("csyizheng"), lib.filter.notMe).set("ai", function (target) { if (target.isTurnedOver() || target.hasJudge("lebu")) return 0; return get.attitude(_status.event.player, target) * Math.max(0, target.countCards("h") - 2); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("csyizheng", target); player.storage.csyizheng2 = target; player.addTempSkill("csyizheng2", { player: "phaseBegin" }); } }, }, csyizheng2: { audio: "csyizheng", trigger: { global: ["recoverBegin", "damageBegin1"], }, forced: true, charlotte: true, logTarget: function (event) { return event.name == "damage" ? event.source : event.player; }, filter: function (event, player) { var target = lib.skill.csyizheng2.logTarget(event); if (target != player.storage.csyizheng2) return false; return player.maxHp > target.maxHp; }, content: function () { player.loseMaxHp(); trigger.num++; }, mark: "character", intro: { content: "$造成伤害或回复体力时,若你的体力上限大于其,则你减1点体力上限,然后此伤害/回复量+1", }, }, reyixiang: { audio: "yixiang", audioname: ["re_taoqian"], trigger: { player: "damageBegin1" }, forced: true, filter: function (event, player) { var evt = event.getParent(2); if (evt.name != "useCard" || evt.card != event.card) return false; var source = evt.player; var phsu = evt.getParent("phaseUse"); if (!source || source == player || source != phsu.player) return false; return ( source.getHistory("useCard", function (evt2) { return evt2.getParent("phaseUse") == phsu; })[0] == evt ); }, content: function () { trigger.num--; }, group: "reyixiang_card", subSkill: { card: { audio: "yixiang", audioname: ["re_taoqian"], trigger: { target: "useCardToTargeted" }, forced: true, filter: function (event, player) { if (get.color(event.card) != "black") return false; var evt = event.getParent(); var source = evt.player; var phsu = evt.getParent("phaseUse"); if (!source || source == player || source != phsu.player) return false; return ( source .getHistory("useCard", function (evt2) { return evt2.getParent("phaseUse") == phsu; }) .indexOf(evt) == 1 ); }, content: function () { trigger.excluded.add(player); }, }, }, ai: { effect: { target: function (card, player, target, current, isLink) { if (isLink || typeof card !== "object" || !player.isPhaseUsing()) return; var num; var evt = _status.event.getParent("useCard"), evt2 = _status.event.getParent("phaseUse"); if (evt.card == card) { num = player .getHistory("useCard", function (evt) { return evt.getParent("phaseUse") == evt2; }) .indexOf(evt); } else num = player.getHistory("useCard", function (evt) { return evt.getParent("phaseUse") == evt2; }).length; if (num < 0 || num > 1) return; if (num === 0 && get.tag(card, "damage")) { if ( target.hasSkillTag("filterDamage", null, { player: player, card: card, }) || !player.hasSkillTag("damageBonus", true, { target: target, card: card, }) ) return "zerotarget"; return [0.5, 0, 0.5, 0]; } if (num === 1 && get.color(card) == "black") return "zeroplayertarget"; }, }, }, }, //赵忠 yangzhong: { audio: 2, trigger: { source: "damageSource", player: "damageEnd", }, direct: true, filter: function (event, player) { var target = event.player, source = event.source; if (player != source && !player.hasSkill("yangzhong")) return false; if (!target || !source || !target.isIn() || !source.isIn()) return false; return source.countCards("he") > 1; }, content: function () { "step 0"; trigger.source.chooseToDiscard("是否对" + get.translation(trigger.player) + "发动【殃众】?", "弃置两张牌,并令其失去1点体力", "he", 2).set("ai", function (card) { var evt = _status.event; if (get.attitude(evt.player, evt.getTrigger().player) >= 0) return 0; return 7 - get.value(card); }).logSkill = ["yangzhong", trigger.player]; "step 1"; if (result.bool) trigger.player.loseHp(); }, }, huangkong: { audio: 2, trigger: { target: "useCardToTargeted" }, forced: true, filter: function (event, player) { if (player == _status.currentPhase || player.countCards("h")) return false; return event.card.name == "sha" || get.type(event.card, false) == "trick"; }, content: function () { player.draw(2); }, }, hfjieying: { audio: 2, trigger: { player: "phaseJieshuBegin" }, direct: true, content: function () { "step 0"; player.chooseTarget(get.prompt2("hfjieying"), lib.filter.notMe).set("ai", function (target) { var player = _status.event.player; return ( (get.attitude(player, target) * (1 + target.countCards("h", function (card) { return !get.tag(card, "damage") && target.hasValueTarget(card); }))) / (1 + target.countCards("h")) ); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("hfjieying", target); target.addTempSkill("hfjieying2", { player: "phaseJieshuBegin" }); } }, ai: { expose: 0.05, }, }, hfjieying2: { mod: { cardEnabled: function (card, player) { if (player.storage.hfjieying2) return false; }, cardSavable: function (card, player) { if (player.storage.hfjieying2) return false; }, targetInRange: function (card, player) { if (player == _status.currentPhase && (card.name == "sha" || get.type(card) == "trick")) return true; }, aiOrder: function (player, card, num) { var info = get.info(card); if (!get.tag(card, "damage") && (!info || !info.toself)) return num + 8; }, }, onremove: true, trigger: { player: "useCard2" }, direct: true, charlotte: true, filter: function (event, player) { if (player != _status.currentPhase || event.targets.length != 1) return false; var card = event.card; if (card.name != "sha" && get.type(card) != "trick") return false; var info = get.info(card); if (info.allowMultiple == false) return false; if (event.targets && !info.multitarget) { if ( game.hasPlayer(function (current) { return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); }) ) { return true; } } return false; }, content: function () { "step 0"; var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; player .chooseTarget(get.prompt("hfjieying2"), function (card, player, target) { var player = _status.event.player; return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); }) .set("prompt2", prompt2) .set("ai", function (target) { var trigger = _status.event.getTrigger(); var player = _status.event.player; return get.effect(target, trigger.card, player, player); }) .set("card", trigger.card) .set("targets", trigger.targets); "step 1"; if (result.bool) { if (!event.isMine() && !event.isOnline()) game.delayx(); event.targets = result.targets; } else { event.finish(); } "step 2"; if (event.targets) { player.logSkill("hfjieying2", event.targets); trigger.targets.addArray(event.targets); } }, group: "hfjieying3", mark: true, intro: { content: function (player) { if (player) return "不能使用牌直到回合结束"; return "使用【杀】或普通锦囊牌时无距离限制且可以多指定一个目标"; }, }, }, hfjieying3: { trigger: { source: "damageSource" }, forced: true, popup: false, filter: function (event, player) { return !player.storage.hfjieying2 && player == _status.currentPhase; }, content: function () { player.storage.hfjieying2 = true; }, }, weipo: { audio: 2, trigger: { target: "useCardToTargeted" }, forced: true, filter: function (event, player) { return player != event.player && !player.hasSkill("weipo3") && player.countCards("h") < Math.min(5, player.maxHp) && (event.card.name == "sha" || get.type(event.card) == "trick"); }, content: function () { "step 0"; player.addTempSkill("weipo2"); player.drawTo(Math.min(5, player.maxHp)); "step 1"; var evt = trigger.getParent(); if (!evt.weipo) evt.weipo = {}; evt.weipo[player.playerid] = player.countCards("h"); }, }, weipo2: { charlotte: true, trigger: { global: "useCardAfter" }, forced: true, popup: false, filter: function (event, player) { return event.weipo && event.weipo[player.playerid] != undefined && event.weipo[player.playerid] > player.countCards("h"); }, content: function () { "step 0"; player.addTempSkill("weipo3", { player: "phaseBegin" }); if (player.countCards("h") && trigger.player.isIn()) { player.chooseCard("h", true, "将一张手牌交给" + get.translation(trigger.player)); } else event.finish(); "step 1"; if (result.bool) { player.give(result.cards, trigger.player); } }, }, weipo3: { charlotte: true }, refuqi: { audio: "fuqi", forced: true, trigger: { player: "useCard", }, filter: function (event, player) { return ( event.card && (get.type(event.card) == "trick" || (get.type(event.card) == "basic" && !["shan", "tao", "jiu", "du"].includes(event.card.name))) && game.hasPlayer(function (current) { return current != player && get.distance(player, current) <= 1; }) ); }, content: function () { trigger.directHit.addArray( game.filterPlayer(function (current) { return current != player && get.distance(player, current) <= 1; }) ); }, ai: { directHit_ai: true, skillTagFilter: function (player, tag, arg) { return get.distance(player, arg.target) <= 1; }, }, }, zhuide: { audio: 2, trigger: { player: "die" }, forceDie: true, skillAnimation: true, animationColor: "thunder", direct: true, content: function () { "step 0"; player.chooseTarget(get.prompt2("zhuide"), lib.filter.notMe).set("ai", function (target) { return get.attitude(_status.event.player, target); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("zhuide", target); var names = []; var cards = []; while (cards.length < 4) { var card = get.cardPile2(function (card) { return !cards.includes(card) && !names.includes(card.name) && get.type(card) == "basic"; }); if (card) { cards.push(card); names.push(card.name); } else break; } if (cards.length) target.gain(cards, "gain2"); } }, }, juntun: { audio: 2, trigger: { player: "phaseZhunbeiBegin" }, forced: true, filter: function (event, player) { return player.maxHp > 1; }, content: function () { player.loseMaxHp(); player.draw(player.maxHp); }, }, jiaojie: { audio: 2, mod: { ignoredHandcard: function (card, player) { if (get.color(card) == "red") { return true; } }, cardDiscardable: function (card, player, name) { if (name == "phaseDiscard" && get.color(card) == "red") { return false; } }, targetInRange: function (card) { const color = get.color(card); if (color === "black" || color === "unsure") return true; }, cardUsable: function (card) { const color = get.color(card); if (color === "black" || color === "unsure") return Infinity; }, }, }, decadewuniang: { trigger: { player: ["useCard", "respond"], }, audio: "xinfu_wuniang", direct: true, filter: function (event, player) { return event.card.name == "sha"; }, content: function () { "step 0"; player .chooseTarget(get.prompt2("decadewuniang"), function (card, player, target) { if (player == target) return false; return target.countGainableCards(player, "he") > 0; }) .set("ai", function (target) { return 10 - get.attitude(_status.event.player, target); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("decadewuniang", target); player.line(target, "fire"); player.gainPlayerCard(target, "he", true); target.draw(); if (!player.storage.decadexushen) event.finish(); } else event.finish(); "step 2"; var list = game.filterPlayer(function (current) { return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; }); if (list.length) game.asyncDraw(list); else event.finish(); "step 3"; game.delayx(); }, }, minsi: { audio: 2, enable: "phaseUse", getResult: function (cards) { var l = cards.length; var all = Math.pow(l, 2); var list = []; for (var i = 1; i < all; i++) { var array = []; for (var j = 0; j < l; j++) { if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) array.push(cards[j]); } var num = 0; for (var k of array) { num += get.number(k); } if (num == 13) list.push(array); } if (list.length) { list.sort(function (a, b) { if (a.length != b.length) return b.length - a.length; return get.value(a) - get.value(b); }); return list[0]; } return list; }, usable: 1, filterCard: function (card) { var num = 0; for (var i = 0; i < ui.selected.cards.length; i++) { num += get.number(ui.selected.cards[i]); } return get.number(card) + num <= 13; }, complexCard: true, selectCard: function () { var num = 0; for (var i = 0; i < ui.selected.cards.length; i++) { num += get.number(ui.selected.cards[i]); } if (num == 13) return ui.selected.cards.length; return ui.selected.cards.length + 2; }, check: function (card) { var evt = _status.event; if (!evt.minsi_choice) evt.minsi_choice = lib.skill.minsi.getResult(evt.player.getCards("he")); if (!evt.minsi_choice.includes(card)) return 0; return 1; }, position: "he", content: function () { player.draw(cards.length * 2).gaintag = ["minsi2"]; player.addTempSkill("minsi2"); }, ai: { order: 5, result: { player: 1 }, }, }, minsi2: { onremove: function (player) { player.removeGaintag("minsi2"); }, mod: { targetInRange: function (card, player, target) { if (!card.cards || !card.cards.length) return; for (var i of card.cards) { if (!i.hasGaintag("minsi2") || get.color(i) != "black") return; } return true; }, ignoredHandcard: function (card, player) { if (card.hasGaintag("minsi2") && get.color(card) == "red") { return true; } }, cardDiscardable: function (card, player, name) { if (name == "phaseDiscard" && card.hasGaintag("minsi2") && get.color(card) == "red") { return false; } }, aiOrder: function (player, card, num) { if (get.itemtype(card) == "card" && card.hasGaintag("minsi2") && get.color(card) == "black") return num - 0.1; }, }, }, jijing: { audio: 2, trigger: { player: "damageEnd" }, frequent: true, content: function () { "step 0"; player.judge(); "step 1"; var num = result.number; var next = player.chooseToDiscard( "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", function (card) { var num = 0; for (var i = 0; i < ui.selected.cards.length; i++) { num += get.number(ui.selected.cards[i]); } return get.number(card) + num <= _status.event.num; }, "he" ); next.set("num", num); next.set("complexCard", true); next.set("selectCard", function () { var num = 0; for (var i = 0; i < ui.selected.cards.length; i++) { num += get.number(ui.selected.cards[i]); } if (num == _status.event.num) return ui.selected.cards.length; return ui.selected.cards.length + 2; }); next.set( "cardResult", (function () { var cards = player.getCards("he"); var l = cards.length; var all = Math.pow(l, 2); var list = []; for (var i = 1; i < all; i++) { var array = []; for (var j = 0; j < l; j++) { if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) array.push(cards[j]); } var numx = 0; for (var k of array) { numx += get.number(k); } if (numx == num) list.push(array); } if (list.length) { list.sort(function (a, b) { return get.value(a) - get.value(b); }); return list[0]; } return list; })() ); next.set("ai", function (card) { if (!_status.event.cardResult.includes(card)) return 0; return 6 - get.value(card); }); "step 2"; if (result.bool) player.recover(); }, }, cixiao: { audio: 2, trigger: { player: "phaseZhunbeiBegin" }, direct: true, filter: function (event, player) { if ( !game.hasPlayer(function (current) { return current.hasSkill("panshi"); }) ) return true; return ( player.countCards("he") >= 1 && game.hasPlayer(function (current) { return current != player && !current.hasSkill("panshi"); }) ); }, content: function () { "step 0"; if ( game.hasPlayer(function (current) { return current.hasSkill("panshi"); }) ) event.goto(2); else player.chooseTarget(lib.filter.notMe, get.prompt("cixiao"), "令一名其他角色获得「义子」标记").set("ai", function (target) { var player = _status.event.player; var att = -get.attitude(player, target); return att * target.countCards("h"); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("cixiao", target); target.addSkills("panshi"); } event.finish(); "step 2"; var list = game.filterPlayer(function (current) { return current.hasSkill("panshi"); }); player.chooseCardTarget({ prompt: get.prompt("cixiao"), prompt2: "弃置一张牌并将" + get.translation(list) + "的「义子」标记转移给其他角色", position: "he", filterTarget: function (card, player, target) { return player != target && !target.hasSkill("panshi"); }, filterCard: lib.filter.cardDiscardable, ai1: function (card) { if (_status.event.goon) return 5 - get.value(card); return 0; }, ai2: function (target) { var player = _status.event.player; var att = -get.attitude(player, target); return att * target.countCards("h"); }, goon: (function (target) { var att = -get.attitude(player, target); return att * target.countCards("h") <= 0; })(list[0]), }); "step 3"; if (result.bool) { var target = result.targets[0]; player.logSkill("cixiao"); player.discard(result.cards).delay = false; player.line2( game .filterPlayer(function (current) { if (current.hasSkill("panshi")) { current.removeSkills("panshi"); return true; } }) .concat(result.targets), "green" ); target.addSkills("panshi"); } else event.finish(); "step 4"; game.delayx(); }, derivation: "panshi", ai: { threaten: 8 }, }, panshi: { trigger: { player: "phaseZhunbeiBegin" }, forced: true, filter: function (event, player) { return ( player.countCards("h") > 0 && game.hasPlayer(function (current) { return current != player && current.hasSkill("cixiao"); }) ); }, content: function () { "step 0"; var targets = game.filterPlayer(function (current) { return current != player && current.hasSkill("cixiao"); }); if (targets.length == 1) { event.target = targets[0]; player.chooseCard("h", true, "叛弑:将一张手牌交给" + get.translation(targets)); } else player.chooseCardTarget({ prompt: "叛弑:将一张手牌交给" + get.translation(targets) + "中的一名角色", filterCard: true, position: "h", targets: targets, forced: true, filterTarget: function (card, player, target) { return _status.event.targets.includes(target); }, }); "step 1"; if (result.bool) { if (!target) target = result.targets[0]; player.line(target); player.give(result.cards, target); } }, mark: true, marktext: "子", intro: { name: "义子", //content:'我是儿子', //R·I·P——永远怀念:被棘手砍掉的“我是儿子” content(_, player) { const targets = game.filterPlayer2(target => target.hasSkill("cixiao", null, null, false)).sortBySeat(player); if (!targets.length) return "我义父呢?!"; if ( ["name", "name1", "name2"].some(name => { if (!player[name] || !get.character(player[name]) || typeof get.translation(player[name]) != "string") return false; return player[name].includes("lvbu") && get.translation(player[name]).includes("吕布"); }) ) return "公若不弃,布愿拜为义父"; return ( "我是" + get.translation(targets) + "的" + (player => { switch (player.sex) { case "female": return "义女"; case "double": return "义子义女"; default: return "义子"; } })(player) ); }, }, group: "panshi_damage", ai: { halfneg: true, }, }, panshi_damage: { trigger: { source: "damageBegin1" }, forced: true, logTarget: "player", filter: function (event, player) { return player.isPhaseUsing() && event.card && event.card.name == "sha" && event.player.hasSkill("cixiao"); }, content: function () { trigger.num++; if ( ["name", "name1", "name2"].some(name => { if (!player[name] || !get.character(player[name]) || typeof get.translation(player[name]) != "string") return false; return player[name].includes("lvbu") && get.translation(player[name]).includes("吕布"); }) ) player.chat("吾堂堂丈夫,安肯为汝子乎!"); var evt = event.getParent("phaseUse"); if (evt && evt.player == player) evt.skipped = true; }, }, xianshuai: { audio: 2, trigger: { global: "damageSource" }, forced: true, filter: function (event, player) { return event.source && event.source.isIn() && !player.hasSkill("xianshuai2"); }, content: function () { player.addTempSkill("xianshuai2", "roundStart"); player.draw(); if (player == trigger.source && trigger.player.isIn()) { player.line(trigger.player, "green"); trigger.player.damage(); } }, }, xianshuai2: { charlotte: true }, decadexushen: { derivation: "decadezhennan", audio: "xinfu_xushen", trigger: { player: "dying" }, limited: true, skillAnimation: true, animationColor: "orange", filter: function (event, player) { return player.hp < 1; }, content: function () { player.awakenSkill("decadexushen"); player.addSkills("decadezhennan"); player.addTempSkill("decadexushen2"); trigger.decadexushen = true; player.recover(); }, }, decadexushen2: { trigger: { player: "dyingAfter" }, forced: true, popup: false, charlotte: true, filter: function (event, player) { return ( event.decadexushen == true && !game.hasPlayer(function (current) { return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; }) ); }, content: function () { "step 0"; player.chooseTarget(lib.filter.notMe, "许身:是否令一名其他角色选择是否将其武将牌替换为“关索”并令其摸三张牌?").set("ai", function (target) { return get.attitude(_status.event.player, target); }); "step 1"; if (!result.bool) { event.finish(); return; } var target = result.targets[0]; event.target = target; player.line(target, "fire"); target.chooseBool("许身:是否将自己的一张武将牌替换为“关索”并令" + get.translation(player) + "摸三张牌?"); "step 2"; if (result.bool) { if (target.name2 != undefined) { target.chooseControl(target.name1, target.name2).set("prompt", "请选择要更换的武将牌"); } else event._result = { control: target.name1 }; } else event.goto(4); "step 3"; target.reinitCharacter(result.control, "dc_guansuo"); "step 4"; target.draw(3); }, }, decadezhennan: { audio: "xinfu_zhennan", trigger: { global: "useCardToPlayered", }, filter: function (event, player) { return event.isFirstTarget && event.targets && event.targets.length > 1 && get.type2(event.card) == "trick"; }, direct: true, content: function () { "step 0"; player .chooseTarget(get.prompt("decadezhennan"), "对一名其他角色造成1点伤害", function (card, player, target) { return target != player; }) .set("ai", function (target) { var player = _status.event.player; return get.damageEffect(target, player, player); }); "step 1"; if (result.bool && result.targets && result.targets.length) { player.logSkill("decadezhennan", result.targets); result.targets[0].damage(); } }, ai: { expose: 0.25, }, }, yujue: { audio: 2, derivation: "zhihu", enable: "phaseUse", usable: 1, filter: function (event, player) { return player.hasEnabledSlot(); }, chooseButton: { dialog: function (event, player) { return ui.create.dialog("###鬻爵###" + lib.translate.yujue_info); }, chooseControl: function (event, player) { var list = []; for (var i = 1; i < 6; i++) { if (player.hasEnabledSlot(i)) list.push("equip" + i); } list.push("cancel2"); return list; }, check: function (event, player) { for (var i = 5; i > 0; i--) { if (player.hasEmptySlot(i)) return "equip" + i; } return "cancel2"; }, backup: function (result) { var next = get.copy(lib.skill.yujuex); next.position = result.control; return next; }, }, ai: { order: 1, result: { player: function (player) { if ( game.hasPlayer(function (target) { if (player == target) return false; var hs = target.countCards("h"); return hs > 2 && get.attitude(player, target) > 0; }) ) return 1; return 0; }, }, }, }, yujuex: { audio: "yujue", async content(event, trigger, player) { await player.disableEquip(lib.skill.yujue_backup.position); if ( player.isIn() && game.hasPlayer(function (current) { return current != player && current.countCards("h"); }) ) { const result = await player .chooseTarget(true, "选择一名角色交给你一张牌并获得技能〖执笏〗", function (card, player, target) { if (player == target) return false; return target.countCards("h") > 0; }) .set("ai", function (target) { return get.attitude(_status.event.player, target) * target.countCards("h"); }) .forResult(); if (result.bool) { var target = result.targets[0]; event.target = target; player.line(target); const result2 = await target.chooseCard("h", true, "交给" + get.translation(player) + "一张手牌").forResult(); if (result2.bool && result2.cards && result2.cards.length) { await target.give(result2.cards, player); target.storage.zhihu_mark = player; await target.addSkills("zhihu"); target.addSkill("zhihu_mark"); } } } }, }, zhihu: { usable: 2, trigger: { source: "damageSource" }, forced: true, filter: function (event, player) { return player != event.player; }, content: function () { player.draw(2); }, }, zhihu_mark: { mark: "character", intro: { content: "以$之名,授予汝技能〖执笏〗,直至$的下回合开始为止!", }, onremove: function (player) { delete player.storage.zhihu_mark; player.removeSkills("zhihu"); }, trigger: { global: "phaseBeginStart" }, firstDo: true, charlotte: true, silent: true, filter: function (event, player) { return event.player == player.storage.zhihu_mark; }, content: function () { player.removeSkill("zhihu_mark"); }, }, tuxing: { audio: 2, trigger: { player: "disableEquipAfter" }, forced: true, content: function () { "step 0"; player.gainMaxHp(); player.recover(); "step 1"; if (!player.hasEnabledSlot()) { player.loseMaxHp(4); player.addSkill("tuxing2"); } }, }, tuxing2: { audio: "tuxing", trigger: { source: "damageBegin1" }, forced: true, charlotte: true, content: function () { trigger.num++; }, mark: true, intro: { content: "造成伤害时,此伤害+1", }, }, gongjian: { audio: 2, trigger: { global: "useCardToPlayered" }, usable: 1, logTarget: function (event) { return event.parent.gongjian_targets.filter(function (target) { return event.targets.includes(target) && target.countCards("he") > 0; }); }, filter: function (event, player) { if (event.card.name != "sha" || !event.isFirstTarget) return false; if ( event.parent.gongjian_targets && event.parent.gongjian_targets.filter(function (target) { return event.targets.includes(target) && target.countCards("he") > 0; }).length > 0 ) return true; return false; }, check: function (event, player) { var targets = event.parent.gongjian_targets.filter(function (target) { return event.targets.includes(target) && target.countCards("he") > 0; }), att = 0; for (var i of targets) { att += get.attitude(player, i); } return att < 0; }, content: function () { "step 0"; event.targets = trigger.parent.gongjian_targets.filter(function (target) { return trigger.targets.includes(target); }); event.num = 0; "step 1"; var target = targets[num]; player.discardPlayerCard(target, true, "he", [1, 2]).set("forceAuto", true); "step 2"; event.num++; if (event.num < targets.length) event.goto(1); else { var cards = []; game.getGlobalHistory("cardMove", function (evt) { if (evt.player && evt.hs && evt.type == "discard" && evt.getParent(3) == event) { for (var i of evt.hs) { if (get.name(i, evt.player) == "sha" && get.position(i, true) == "d") cards.add(i); } } }); if (cards.length) player.gain(cards, "gain2"); } }, group: "gongjian_count", subSkill: { count: { trigger: { global: "useCard1" }, silent: true, firstDo: true, filter: function (event, player) { return event.card && event.card.name == "sha"; }, content: function () { if (player.storage.gongjian) trigger.gongjian_targets = player.storage.gongjian; player.storage.gongjian = trigger.targets; }, }, }, }, kuimang: { audio: 2, trigger: { global: "dieAfter" }, forced: true, filter: function (event, player) { return ( player.getAllHistory("sourceDamage", function (target) { return target.player == event.player; }).length > 0 ); }, content: function () { player.draw(2); }, }, rexiemu: { audio: 2, trigger: { player: "phaseJieshuBegin" }, direct: true, filter: function (event, player) { return !game.hasPlayer(function (current) { return current.hasMark("rexiemu"); }); }, content: function () { "step 0"; player.chooseTarget(get.prompt2("rexiemu"), lib.filter.notMe).set("ai", function (target) { var player = _status.event.player; return get.attitude(player, target) * Math.sqrt(Math.max(1 + player.countCards("h"), 1 + target.countCards("h"))); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("rexiemu", target); target.addMark("rexiemu", 1); player.addSkill("rexiemu2"); } }, intro: { content: "mark" }, ai: { expose: 0.1, }, }, rexiemu2: { audio: "rexiemu", trigger: { global: ["loseAfter"] }, forced: true, charlotte: true, usable: 1, filter: function (event, player) { return ( (event.player == player || event.player.hasMark("rexiemu")) && ["useCard", "respond"].includes(event.getParent().name) && event.hs && event.hs.length && event.player != _status.currentPhase && game.hasPlayer(function (current) { return current.hasMark("rexiemu"); }) ); }, content: function () { "step 0"; game.asyncDraw( game.filterPlayer(function (current) { return current == player || current == trigger.player || current.hasMark("rexiemu"); }) ); "step 1"; game.delayx(); }, group: "rexiemu3", }, rexiemu3: { trigger: { player: "phaseBegin" }, forced: true, charlotte: true, silent: true, firstDo: true, content: function () { player.removeSkill("rexiemu2"); game.countPlayer(function (current) { var num = current.countMark("rexiemu"); if (num) current.removeMark("rexiemu", num); }); }, }, heli: { audio: 2, enable: "phaseUse", usable: 1, filter: function (event, player) { return game.hasPlayer(function (current) { return lib.skill.heli.filterTarget(null, player, current); }); }, filterTarget: function (card, player, target) { return target.countCards("h") < player.countCards("h"); }, content: function () { "step 0"; if (target.countCards("h")) target.showHandcards(); "step 1"; var list = []; var cards = []; for (var i of lib.inpile) list.add(get.type2(i)); for (var i of list) { if ( !target.countCards("h", function (card) { return get.type2(card, target) == i; }) ) { var card = get.cardPile2(function (card) { return get.type2(card, false) == i; }); if (card) cards.push(card); } } if (cards.length) target.gain(cards, "gain2", "log"); }, ai: { order: 10, result: { target: function (player, target) { return 1 / Math.sqrt(1 + target.countCards("h")); }, }, }, }, moying: { audio: 2, trigger: { player: "loseAfter", global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], }, direct: true, filter: function (event, player) { if (player == _status.currentPhase || event.getParent().name == "useCard") return false; if (event.name == "gain" && event.player == player) return false; var evt = event.getl(player); return evt && evt.cards2 && evt.cards2.length == 1 && ["equip", "trick"].includes(get.type2(evt.cards2[0], evt.type == "discard" && evt.hs.includes(evt.cards2[0]) ? player : false)) && !player.hasSkill("moying2"); }, content: function () { "step 0"; var number = trigger.getl(player).cards2[0].number; var numbers = [number - 2, number - 1, number, number + 1, number + 2].filter(function (number) { return number >= 1 && number <= 13; }); if (player.isUnderControl()) { game.swapPlayerAuto(player); } var switchToAuto = function () { _status.imchoosing = false; event._result = { bool: true, suit: lib.suit.randomGet(), number: numbers.randomGet(), }; if (event.dialog) event.dialog.close(); if (event.control) event.control.close(); }; var chooseButton = function (player, numbers) { var event = _status.event; player = player || event.player; if (!event._result) event._result = {}; var dialog = ui.create.dialog("是否发动【墨影】?", "forcebutton", "hidden"); event.dialog = dialog; dialog.addText("花色"); var table = document.createElement("div"); table.classList.add("add-setting"); table.style.margin = "0"; table.style.width = "100%"; table.style.position = "relative"; var listi = ["spade", "heart", "club", "diamond"]; for (var i = 0; i < listi.length; i++) { var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); td.link = listi[i]; table.appendChild(td); td.innerHTML = "" + get.translation(listi[i]) + ""; td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { if (_status.dragged) return; if (_status.justdragged) return; _status.tempNoButton = true; setTimeout(function () { _status.tempNoButton = false; }, 500); var link = this.link; var current = this.parentNode.querySelector(".bluebg"); if (current) { current.classList.remove("bluebg"); } this.classList.add("bluebg"); event._result.suit = link; }); } dialog.content.appendChild(table); dialog.addText("点数"); var table2 = document.createElement("div"); table2.classList.add("add-setting"); table2.style.margin = "0"; table2.style.width = "100%"; table2.style.position = "relative"; for (var i = 0; i < numbers.length; i++) { var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); td.link = numbers[i]; table2.appendChild(td); var num = numbers[i]; switch (num) { case 1: num = "A"; break; case 11: num = "J"; break; case 12: num = "Q"; break; case 13: num = "K"; break; } td.innerHTML = "" + num + ""; td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { if (_status.dragged) return; if (_status.justdragged) return; _status.tempNoButton = true; setTimeout(function () { _status.tempNoButton = false; }, 500); var link = this.link; var current = this.parentNode.querySelector(".bluebg"); if (current) { current.classList.remove("bluebg"); } this.classList.add("bluebg"); event._result.number = link; }); } dialog.content.appendChild(table2); dialog.add("  "); event.dialog.open(); event.switchToAuto = function () { event._result = { bool: true, number: numbers.randomGet(), suit: lib.suit.randomGet(), }; event.dialog.close(); event.control.close(); game.resume(); _status.imchoosing = false; }; event.control = ui.create.control("ok", "cancel2", function (link) { var result = event._result; if (link == "cancel2") result.bool = false; else { if (!result.number || !result.suit) return; result.bool = true; } event.dialog.close(); event.control.close(); game.resume(); _status.imchoosing = false; }); for (var i = 0; i < event.dialog.buttons.length; i++) { event.dialog.buttons[i].classList.add("selectable"); } game.pause(); game.countChoose(); }; if (event.isMine()) { chooseButton(player, numbers); } else if (event.isOnline()) { event.player.send(chooseButton, event.player, numbers); event.player.wait(); game.pause(); } else { switchToAuto(); } "step 1"; var map = event.result || result; if (map.bool) { player.logSkill("moying"); player.addTempSkill("moying2"); var cards = []; for (var i = 0; i < ui.cardPile.childNodes.length; i++) { var card = ui.cardPile.childNodes[i]; if (get.suit(card) == map.suit && get.number(card) == map.number) cards.push(card); } if (cards.length) player.gain(cards, "gain2", "log"); } }, }, moying2: {}, juanhui: { audio: 2, trigger: { player: "phaseJieshuBegin" }, direct: true, content: function () { "step 0"; player.chooseTarget(get.prompt("juanhui"), lib.filter.notMe, "选择记录一名其他角色使用过的牌").set("ai", function (target) { if (target.isTurnedOver() || target.hasJudge("lebu")) return Math.random(); return (1 + target.countCards("h")) * 2 + Math.random(); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("juanhui", target); player.storage.juanhui2 = target; player.storage.juanhui3 = []; player.addSkill("juanhui2"); } }, }, juanhui2: { charlotte: true, mark: true, mod: { cardUsable: function (card) { if (card.name == "sha" && _status.event.skill == "juanhui2_backup") return Infinity; }, }, intro: { markcount: function (storage, player) { return player.getStorage("juanhui3").length; }, mark: function (dialog, storage, player) { dialog.addText("记录目标"); dialog.addSmall([storage]); var vcard = player.getStorage("juanhui3"); if (vcard.length) { dialog.addText("记录卡牌"); dialog.addSmall([vcard, "vcard"]); } }, content: function (storage, player) { var str = "记录目标:" + get.translation(storage); var vcard = player.getStorage("juanhui3"); if (vcard.length) { str += "
    记录卡牌:"; for (var i of vcard) { if (i[2] == "sha" && i[3]) str += get.translation(i[3]); str += get.translation(i[2]); str += "、"; } str = str.slice(0, str.length - 1); } return str; }, }, onremove: function (player) { delete player.storage.juanhui2; delete player.storage.juanhui3; }, group: "juanhui3", enable: "phaseUse", filter: function (event, player) { return player.getStorage("juanhui3").length > 0 && player.countCards("hs") > 0; }, chooseButton: { dialog: function (event, player) { return ui.create.dialog("绢绘", [player.getStorage("juanhui3"), "vcard"], "hidden"); }, filter: function (button, player) { return lib.filter.cardEnabled( { name: button.link[2], nature: button.link[3], }, player, _status.event.getParent() ); }, check: function (button) { var player = _status.event.player; var card = { name: button.link[2], nature: button.link[3], }; if (player.getUseValue(card) > 0) return get.order(card); return -1; }, backup: function (links, player) { return { audio: "juanhui", popname: true, filterCard: true, position: "hs", viewAs: { name: links[0][2], nature: links[0][3], }, check: function (card) { return 6 - get.value(card); }, precontent: function () { var card = event.result.card; if (card.name == "sha") event.getParent().addCount = false; var vcard = player.storage.juanhui3; for (var i = 0; i < vcard.length; i++) { if (vcard[i][2] == card.name) vcard.splice(i--, 1); } if (vcard.length) player.markSkill("juanhui2"); else { player.unmarkSkill("juanhui2"); event.getParent().juanhui = true; } }, }; }, prompt: function (links, player) { return "将一张手牌当做" + (links[0][2] == "sha" && links[0][3] ? get.translation(links[0][3]) : "") + get.translation(links[0][2]) + "使用"; }, }, ai: { order: function (item, player) { var muniu = player.getStorage("juanhui3"); var order = 0; for (var i = 0; i < muniu.length; i++) { var card = { name: muniu[i][2], nature: muniu[i][3] }; if (player.getUseValue(card) > 0) { var order2 = get.order(card); if (order2 > order) order = order2; } } return order + 0.1; }, result: { player: 1, }, }, }, juanhui3: { charlotte: true, firstDo: true, trigger: { global: "useCard2", player: ["phaseUseEnd", "phaseUseSkipped", "useCardAfter"], }, silent: true, filter: function (event, player, name) { if (event.name == "phaseUse") return true; else if (name == "useCardAfter") return event.getParent().juanhui; return ( event.player == player.storage.juanhui2 && event.player.isPhaseUsing() && ["basic", "trick"].includes(get.type(event.card)) && player.getStorage("juanhui3").filter(function (vcard) { return vcard[2] == event.card.name; }).length == 0 ); }, content: function () { if (trigger.name == "phaseUse") player.removeSkill("juanhui2"); else if (event.triggername == "useCardAfter") { player.recover(); player.drawTo(3); } else { var vcard = [get.type(trigger.card), "", trigger.card.name]; if (game.hasNature(trigger.card)) vcard.push(get.nature(trigger.card)); player.storage.juanhui3.push(vcard); player.markSkill("juanhui2"); } }, }, mubing: { audio: 2, audioname: ["sp_key_yuri"], trigger: { player: "phaseUseBegin" }, //direct:true, frequent: true, filter: function (event, player) { return player.countCards("he") > 0; }, content: function () { "step 0"; var num = player.storage.mubing2 ? 4 : 3; event.num = num; event.cards = game.cardsGotoOrdering(get.cards(num)).cards; game.log(player, "展示了", event.cards); event.videoId = lib.status.videoId++; game.broadcastAll( function (player, id, cards) { var str = get.translation(player) + "发动了【募兵】"; var dialog = ui.create.dialog(str, cards); dialog.videoId = id; }, player, event.videoId, event.cards ); game.addVideo("showCards", player, [get.translation(player) + "发动了【募兵】", get.cardsInfo(event.cards)]); game.delay(2); "step 1"; var numa = 0; cards.sort(function (a, b) { return a.number - b.number; }); for (var i of cards) { if (get.value(i, player) > 0) numa += get.number(i); } player .chooseToDiscard([1, Infinity], "h") .set("ai", function (card) { var player = _status.event.player; var numa = _status.event.numa; //if(card.name!='tengjia'&&get.position(card)=='e'&&get.equipValue(card,player)<=0) return 14; var num = 0; for (var i of ui.selected.cards) { num += i.number; } if (num >= numa) return 0; if (card.number + num >= numa) return 15 - get.value(card); if (!ui.selected.cards.length) { var min = _status.event.min; if ( card.number < min && !player.countCards("h", function (xcard) { return xcard != card && card.number + xcard.number > min; }) ) return 0; return card.number; } return Math.max(5 - get.value(card), card.number); }) .set("prompt", false) .set("numa", numa) .set("min", cards[0].number); var func = function (id) { var dialog = get.idDialog(id); if (dialog) dialog.content.firstChild.innerHTML = "请选择要弃置的牌"; }; if (player == game.me) func(event.videoId); else if (player.isOnline()) player.send(func, event.videoId); "step 2"; if (!result.bool) { return; } var numx = 0; for (var i of result.cards) { numx += get.number(i); } event.numx = numx; var next = player.chooseButton([0, num]); next.set("dialog", event.videoId); next.set("filterButton", function (button) { var num = 0; for (var i = 0; i < ui.selected.buttons.length; i++) { num += get.number(ui.selected.buttons[i].link); } return num + get.number(button.link) <= _status.event.maxNum; }); next.set("maxNum", event.numx); next.set("ai", function (button) { return get.value(button.link, _status.event.player); }); var func = function (id) { var dialog = get.idDialog(id); if (dialog) dialog.content.firstChild.innerHTML = "请选择要获得的牌"; }; if (player == game.me) func(event.videoId); else if (player.isOnline()) player.send(func, event.videoId); "step 3"; if (!result.bool) event.cards = []; else event.cards = result.links; "step 4"; game.broadcastAll("closeDialog", event.videoId); game.addVideo("cardDialog", null, event.videoId); if (!cards.length) { event.finish(); return; } player.gain(cards, "log", "gain2"); if (!player.storage.mubing2) { event.finish(); return; } event.given = []; "step 5"; var hs = player.getCards("h"); cards = cards.filter(function (card) { return hs.includes(card); }); if ( cards.length && game.hasPlayer(function (current) { return current != player && !event.given.includes(current); }) ) player.chooseCardTarget({ prompt: "是否将得到的牌中的任意张交给其他角色?", selectCard: [1, cards.length], filterCard: function (card) { return _status.event.cards.includes(card); }, filterTarget: function (card, player, target) { return target != player && !_status.event.given.includes(target); }, cards: cards, given: event.given, ai1: function (card) { return -1; }, }); else event.finish(); "step 6"; if (result.bool) { var target = result.targets[0]; var cards = result.cards; event.given.push(target); event.cards.removeArray(cards); player.line(target, "green"); player.give(cards, target); event.goto(5); } }, }, ziqu: { audio: 2, audioname: ["sp_key_yuri"], trigger: { source: "damageBegin2" }, filter: function (event, player) { return event.player != player && !player.getStorage("ziqu").includes(event.player) && event.player.countCards("he") > 0; }, check: function (event, player) { var target = event.player; var eff = get.damageEffect(target, player, player); 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) return false; var cards = target.getCards("he"); for (var i = 0; i < cards.length; i++) { if (get.number(cards[i]) > 10) return true; } return false; }, logTarget: "player", content: function () { "step 0"; trigger.cancel(); if (!player.storage.ziqu) player.storage.ziqu = []; player.storage.ziqu.push(trigger.player); player.markSkill("ziqu"); trigger.player.chooseCard(true, "he", function (card, player) { return !player.countCards("he", function (cardx) { return cardx.number > card.number; }); }); "step 1"; if (result.bool && result.cards && result.cards.length) trigger.player.give(result.cards, player); }, intro: { content: "已对$发动过" }, }, mubing_rewrite: { mark: true, intro: { content: "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。", }, ai: { combo: "mubing", }, }, diaoling: { audio: 2, audioname: ["sp_key_yuri"], trigger: { player: "phaseZhunbeiBegin" }, forced: true, juexingji: true, skillAnimation: true, animationColor: "metal", filter: function (event, player) { var num = 0; player.getAllHistory("gain", function (evt) { var evt2 = evt.getParent(); if (evt2.name == "mubing" && evt2.player == player) num += evt.cards.filter(function (card) { return card.name == "sha" || get.subtype(card, false) == "equip1" || (get.type2(card, false) == "trick" && get.tag({ name: card.name }, "damage")); }).length; }); return num >= 6; }, content: function () { player.awakenSkill("diaoling"); player.storage.mubing2 = true; player.markSkill("mubing_rewrite"); player.chooseDrawRecover(2, true); }, ai: { combo: "mubing", }, derivation: "mubing_rewrite", }, refenyin_wufan: { audio: 2 }, //官渡之战 xiying: { trigger: { player: "phaseUseBegin" }, audio: 2, direct: true, filter: function (event, player) { return ( player.countCards("h", function (card) { return _status.connectMode || get.type(card) != "basic"; }) > 0 ); }, content: function () { "step 0"; var list = game.filterPlayer(function (current) { return current != player; }); list.sortBySeat(); event.targets = list; player .chooseToDiscard(get.prompt2("xiying"), "h", function (card) { return get.type(card) != "basic"; }) .set("logSkill", ["xiying", list]) .set("ai", function (card) { return _status.event.val - get.value(card); }) .set( "val", (function () { return ( 4 * Math.sqrt( game.countPlayer(function (current) { return get.attitude(player, current) < 0 && current.countCards("he") > 0; }) ) ); })() ); "step 1"; if (!result.bool) event.finish(); else player.addTempSkill("xiying_gain"); "step 2"; var target = targets.shift(); event.target = target; if (target.isIn()) target.chooseToDiscard("he", "弃置一张牌,或本回合内不能使用或打出牌").set("ai", function (card) { var player = _status.event.player; var source = _status.event.getTrigger().player; if (get.attitude(source, player) > 0) return -1; if (_status.event.getRand() > 0.5) return 5 - get.value(card); return -1; }); "step 3"; if (target.isIn() && !result.bool) target.addTempSkill("xiying2"); if (targets.length) event.goto(2); }, ai: { directHit_ai: true, skillTagFilter: function (player, tag, arg) { return arg.target.hasSkill("xiying2"); }, }, subSkill: { gain: { trigger: { player: "phaseJieshuBegin" }, forced: true, charlotte: true, filter: function (event, player) { return ( player.getHistory("sourceDamage", function (evt) { return evt.isPhaseUsing(player); }).length > 0 ); }, content: function () { var card = get.cardPile2(function (card) { var type = get.type(card, false); if (type != "basic" && type != "trick") return false; return get.tag(card, "damage") > 0; }); if (card) player.gain(card, "gain2"); }, }, }, }, xiying2: { mark: true, intro: { content: "本回合内不能使用或打出牌" }, mod: { cardEnabled2: function (card) { return false; }, }, }, gangzhi: { audio: 2, trigger: { player: "damageBefore", source: "damageBefore", }, forced: true, filter: function (event, player) { if (event.source == event.player) return false; if (event.player == player) { return event.source && event.source.isIn(); } return true; }, content: function () { trigger.cancel(); trigger.player.loseHp(trigger.num); }, ai: { jueqing: true, }, }, beizhan: { trigger: { player: "phaseJieshuBegin" }, direct: true, audio: 2, content: function () { "step 0"; player.chooseTarget(get.prompt2("beizhan")).set("ai", function (target) { var player = _status.event.player; var att = get.attitude(player, target); var hs = target.countCards("h"); var ht = target.maxHp; if (hs >= ht && target.isMaxHandcard()) return -att * hs; if ( hs < ht && game.hasPlayer(function (current) { return current.countCards("h") > ht; }) ) return att * 2 * (ht - hs); return 0; }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("beizhan", target); target.drawTo(Math.min(5, target.maxHp)); target.addSkill("beizhan2"); } }, ai: { expose: 0.25, }, }, beizhan2: { trigger: { player: "phaseBegin" }, silent: true, firstDo: true, content: function () { player.removeSkill("beizhan2"); if (player.isMaxHandcard()) player.addTempSkill("zishou2"); }, mark: true, intro: { content: "回合开始时,若手牌数为全场最多,则回合内不能使用牌指定其他角色为目标" }, }, fenglve: { audio: 2, trigger: { player: "phaseUseBegin", }, direct: true, content: function () { "step 0"; var goon = player.hasCard(function (card) { if (get.position(card) != "h") return false; var val = get.value(card); if (val < 0) return true; if (val <= 5) { return card.number >= 12; } if (val <= 6) { return card.number >= 13; } return false; }); player .chooseTarget(get.prompt2("fenglve"), function (card, player, target) { return player.canCompare(target); }) .set("ai", function (target) { if (!_status.event.goon) return 0; return (-get.attitude(player, target) * (1 + target.countCards("e"))) / (1 + target.countCards("j")); }) .set("goon", goon); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("fenglve", target); player.chooseToCompare(target); } else { event.finish(); } "step 2"; if (result.bool) { var num = 0; if (target.countCards("h")) num++; if (target.countCards("e")) num++; if (target.countCards("j")) num++; if (num) { event.gainner = player; event.giver = target; target .choosePlayerCard(target, num, "hej", true) .set("filterButton", function (button) { for (var i = 0; i < ui.selected.buttons.length; i++) { if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; } return true; }) .set("prompt", "选择交给" + get.translation(event.gainner) + "的牌"); } else event.finish(); } else { if (player.countCards("he")) { event.gainner = target; event.giver = player; player.choosePlayerCard(player, true, "he").set("prompt", "选择交给" + get.translation(event.gainner) + "的牌"); } else event.finish(); } "step 3"; event.giver.give(result.links, event.gainner); }, group: "fenglve2", ai: { expose: 0.25, }, }, fenglve2: { trigger: { player: "chooseToCompareAfter", target: "chooseToCompareAfter", }, check: function (event, player) { var card, target; if (player == event.player) { card = event.card1; target = event.target; } else { card = event.card2; target = event.player; } return get.attitude(player, target) * get.value(card, target, "raw") > 0; }, filter: function (event, player) { if (event.targets) return false; var card, target; if (player == event.player) { card = event.card1; target = event.target; } else { card = event.card2; target = event.player; } return get.position(card, true) == "o"; }, prompt: function (event, player) { var card, target; if (player == event.player) { card = event.card1; target = event.target; } else { card = event.card2; target = event.player; } return "是否发动【锋略】,令" + get.translation(target) + "获得" + get.translation(card) + "?"; }, logTarget: function (event, player) { var target; if (player == event.player) { target = event.target; } else { target = event.player; } return target; }, content: function () { var card, target; if (player == trigger.player) { card = trigger.card1; target = trigger.target; } else { card = trigger.card2; target = trigger.player; } target.gain(card, "gain2", "log"); }, }, mouzhi: { audio: 2, enable: "phaseUse", usable: 1, filter: function (event, player) { return player.countCards("h") > 0; }, filterCard: true, filterTarget: function (card, player, target) { if (target.storage.mouzhi2 && target.storage.mouzhi2.includes(player)) return false; return target != player; }, delay: 0, lose: false, discard: false, check: function (card) { if (card.name == "du") return 20; var player = _status.event.player; var useval = player.getUseValue(card); var maxval = 0; game.countPlayer(function (current) { if (current != player && !current.hasSkillTag("nogain") && get.attitude(player, current) > 0) { var temp = current.getUseValue(card); if (temp > maxval) maxval = temp; } }); if (maxval > 0 && get.tag(card, "damage")) return 15; if (maxval > useval) return 10; if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); return -1; }, content: function () { player.give(cards, target); target.addTempSkill("mouzhi2", { player: "phaseEnd" }); target.storage.mouzhi2.add(player); target.storage.mouzhi2.sortBySeat(target); target.markSkill("mouzhi2"); }, ai: { order: 10, result: { target: function (player, target) { if (ui.selected.cards.length) { var card = ui.selected.cards[0]; if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; var t = target.getUseValue(card); var p = player.getUseValue(card); if (t > p) return 2; if (t > 0) return 1.5; if (player.needsToDiscard()) return 1; return 0; } return 0; }, }, }, }, mouzhi2: { init: function (player, skill) { if (!player.storage[skill]) player.storage[skill] = []; }, onremove: true, trigger: { source: "damageSource" }, forced: true, intro: { content: "出牌阶段内第一次对一名其他角色造成伤害时,$摸一张牌", }, filter: function (event, player) { var evt2 = event.getParent("phaseUse"); if (!evt2 || evt2.player != player) return false; var history = event.player.getHistory("damage", function (evt) { return evt.source == player && evt.getParent("phaseUse") == evt2; }); return history[0] == event; }, content: function () { "step 0"; game.asyncDraw(player.storage.mouzhi2); "step 1"; game.delay(); }, }, yuanlve: { enable: "phaseUse", usable: 1, audio: 2, filter: function (event, player) { return player.countCards("h", function (card) { return get.type(card) != "equip"; }); }, filterCard: function (card) { return get.type(card) != "equip"; }, filterTarget: lib.filter.notMe, delay: false, discard: false, lose: false, check: function (card) { if (card.name == "du") return 20; var player = _status.event.player; var useval = player.getUseValue(card); var maxval = 0; game.countPlayer(function (current) { if (current != player && !current.hasSkillTag("nogain") && get.attitude(player, current) > 0) { var temp = current.getUseValue(card); if (temp > maxval) maxval = temp; } }); if (maxval > useval) return 15; if (maxval > 0) return 10; if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); return -1; }, content: function () { "step 0"; player.give(cards, target); "step 1"; target.chooseUseTarget(cards[0]); "step 2"; if (result.bool) player.draw(); }, ai: { order: 10, result: { target: function (player, target) { if (ui.selected.cards.length) { var card = ui.selected.cards[0]; if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; var t = target.getUseValue(card); var p = player.getUseValue(card); if (t > p) return 2; if (t > 0) return 1.5; if (player.needsToDiscard()) return 1; return 0; } return 0; }, }, }, }, //吕旷吕翔和淳于琼和官渡哔哔机 spshicai: { audio: 2, enable: "phaseUse", position: "he", filter: function (event, player) { return !player.storage.spshicai2 || !player.getCards("h").includes(player.storage.spshicai2); }, filterCard: true, prompt: function () { var str = "弃置一张牌,然后获得"; if (get.itemtype(_status.pileTop) == "card") str += get.translation(_status.pileTop); else str += "牌堆顶的一张牌"; return str; }, check: function (card) { var player = _status.event.player; var cardx = _status.pileTop; if (get.itemtype(cardx) != "card") return 0; var val = player.getUseValue(cardx, null, true); if (!val) return 0; var val2 = player.getUseValue(card, null, true); return (val - val2) / Math.max(0.1, get.value(card)); }, content: function () { var card = get.cards()[0]; player.storage.spshicai2 = card; player.gain(card, "draw"); game.log(player, "获得了牌堆顶的一张牌"); }, group: "spshicai_mark", ai: { order: 1, result: { player: 1 }, }, }, spshicai_mark: { trigger: { player: "phaseUseBegin" }, silent: true, firstDo: true, content: function () { player.addTempSkill("spshicai2", "phaseUseEnd"); }, }, spshicai2: { onremove: true, mark: true, intro: { mark: function (dialog, content, player) { if (player != game.me) return get.translation(player) + "观看牌堆中..."; if (get.itemtype(_status.pileTop) != "card") return "牌堆顶无牌"; dialog.add([_status.pileTop]); }, }, }, spfushi: { group: ["zezhu", "chenggong"], derivation: ["zezhu", "chenggong"], locked: true, }, zezhu: { audio: 2, enable: "phaseUse", usable: 1, filter: function (event, player) { var enemy = 0; var friend = 0; var zhu = 0; for (var i of game.players) { if (i.isEnemyOf(player)) enemy++; else friend++; if (i != player && i.isZhu) zhu++; } return zhu > 0 && enemy < friend; }, filterTarget: function (card, player, target) { return target != player && target.isZhu; }, selectTarget: -1, multiline: true, multitarget: true, content: function () { "step 0"; event.targets.sortBySeat(); event.targets2 = event.targets.slice(0); "step 1"; var target = event.targets2.shift(); if (target.countGainableCards(player, "he") > 0) player.gainPlayerCard(target, "he", true); else player.draw(); if (event.targets2.length) event.redo(); "step 2"; if (player.countCards("he") >= targets.length) { player.chooseCard("he", true, "依次选择" + get.cnNumber(targets.length) + "张牌,分别交给" + get.translation(targets), targets.length).set("ai", function (card) { var target = _status.event.getParent().targets[ui.selected.cards.length]; var player = _status.event.player; return get.attitude(player, target) * get.value(card, target); }); } else event.finish(); "step 3"; var list = []; for (var i = 0; i < targets.length; i++) { list.push([targets[i], result.cards[i]]); } game.loseAsync({ gain_list: list, giver: player, player: player, cards: result.cards, animate: "giveAuto", }).setContent("gaincardMultiple"); }, ai: { order: 6, result: { player: 1 }, }, }, chenggong: { audio: 2, trigger: { global: "useCardToPlayered" }, filter: function (event, player) { if (!(event.isFirstTarget && event.targets && event.targets.length > 1 && event.player.isIn())) return false; var enemy = 0; var friend = 0; for (var i of game.players) { if (i.isEnemyOf(player)) enemy++; else friend++; } return enemy > friend; }, check: function (event, player) { return get.attitude(player, event.player) > 0; }, logTarget: "player", content: function () { trigger.player.draw(); }, }, cangchu: { trigger: { global: "phaseBefore", player: ["damageEnd", "enterGame"], }, audio: 2, forced: true, filter: function (event, player) { if (event.name != "damage") return event.name != "phase" || game.phaseNumber == 0; return event.hasNature("fire") && player.countMark("cangchu") > 0; }, content: function () { if (trigger.name != "damage") player.addMark("cangchu", 3); else { player.removeMark("cangchu", Math.min(trigger.num, player.countMark("cangchu"))); if (!player.hasMark("cangchu")) event.trigger("cangchuAwaken"); } }, marktext: "粮", intro: { name2: "粮", content: "mark", }, ai: { threaten: function (player, target) { return 1 + target.countMark("cangchu") / 2; }, effect: { target: function (card, player, target, current) { if (target.hasMark("cangchu")) { if (card.name == "sha") { if (lib.skill.global.includes("huoshaowuchao") || game.hasNature(card, "fire") || player.hasSkill("zhuque_skill")) return 2; } if (get.tag(card, "fireDamage") && current < 0) return 2; } }, }, combo: "liangying", }, }, sushou: { audio: 2, trigger: { player: "phaseDiscardBegin" }, frequent: true, async content(event, trigger, player) { await player.draw(1 + player.countMark("cangchu")); const num = Math.min( player.countCards("h"), player.countCards("he"), game.countPlayer(target => target != player && target.isFriendOf(player)) ); if (num) { let list = []; if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); while (num - list.length > 0) { const { result: { bool, targets, cards }, } = await player .chooseCardTarget({ prompt: "宿守:你可以交给友方角色各一张牌", position: "he", animate: false, filterCard(card, player) { return !get.event("list").some(list => list[1] == card); }, filterTarget(card, player, target) { return target != player && target.isFriendOf(player) && !get.event("list").some(list => list[0] == target); }, ai1(card) { if (card.name == "shan") return 1; return Math.random(); }, ai2(target) { return get.attitude(get.event("player"), target); }, }) .set("list", list); if (bool) { list.push([targets[0], cards[0]]); player.addGaintag(cards, "olsujian_given"); } else break; } if (_status.connectMode) { game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose(); }); } if (list.length) { await game .loseAsync({ gain_list: list, player: player, cards: list.slice().map(list => list[1]), giver: player, animate: "giveAuto", }) .setContent("gaincardMultiple"); } } }, }, liangying: { trigger: { global: "phaseDrawBegin2", player: "cangchuAwaken", }, forced: true, audio: 1, logTarget: function (event, player) { if (event.name == "phaseDraw") return event.player; return game.filterPlayer(function (current) { return current.isEnemyOf(player); }); }, filter: function (event, player) { if (event.name == "cangchu") return true; return player.hasMark("cangchu") && !event.numFixed && event.player.isFriendOf(player); }, content: function () { "step 0"; if (trigger.name == "cangchu") { player.loseMaxHp(); var list = game.filterPlayer(function (current) { return current.isEnemyOf(player); }); if (list.length) { game.asyncDraw(list, 2); } } else { trigger.num++; event.finish(); } "step 1"; game.delay(); }, ai: { combo: "cangchu", }, }, liehou: { enable: "phaseUse", usable: 1, audio: 2, filterTarget: function (card, player, target) { return player.inRange(target) && target.countCards("h"); }, content: function () { "step 0"; target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌"); "step 1"; if (result.bool) { target.give(result.cards, player); } else event.finish(); "step 2"; if ( player.countCards("h") && game.hasPlayer(function (current) { return current != target && player.inRange(current); }) ) { player.chooseCardTarget({ position: "h", filterCard: true, filterTarget: function (card, player, target) { return target != _status.event.getParent().target && player.inRange(target); }, forced: true, prompt: "将一张手牌交给一名攻击范围内的其他角色", ai1: function (card) { var player = _status.event.player; if (get.name(card) == "du") return 20; if ( game.hasPlayer(function (current) { return current != _status.event.getParent().target && player.inRange(current) && get.attitude(player, current) > 0 && current.getUseValue(card) > player.getUseValue(card) && current.getUseValue(card) > player.getUseValue(card); }) ) return 12; if ( game.hasPlayer(function (current) { return current != player && get.attitude(player, current) > 0; }) ) { if (card.name == "wuxie") return 11; if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; } return 6 / Math.max(1, get.value(card)); }, ai2: function (target) { var player = _status.event.player; var card = ui.selected.cards[0]; var att = get.attitude(player, target); if (card.name == "du") return -6 * att; if (att > 0) { if (get.position(card) == "h" && target.getUseValue(card) > player.getUseValue(card)) return 4 * att; if (get.value(card, target) > get.value(card, player)) return 2 * att; return 1.2 * att; } return (-att * Math.min(4, target.countCards("he"))) / 6; }, }); } else event.finish(); "step 3"; if (result.bool) player.give(result.cards, result.targets[0]); }, ai: { order: 6, result: { target: -1, }, }, }, qigong: { trigger: { player: "shaMiss" }, direct: true, audio: 2, filter: function (event, player) { return ( event.target.isIn() && game.hasPlayer(function (current) { return current != event.target && current.canUse("sha", event.target, false); }) ); }, content: function () { "step 0"; player .chooseTarget(get.prompt("qigong"), "令一名角色可再对" + get.translation(trigger.target) + "使用一张【杀】", function (card, player, target) { var source = _status.event.getTrigger().target; return target != source && target.canUse("sha", source, false); }) .set("ai", function (target) { var player = _status.event.player, card = { name: "sha" }, source = _status.event.getTrigger().target; if (target.hasSha()) { var eff1 = get.effect(source, card, target, target); if (eff1 > 0) return get.effect(source, card, target, player); } return target != player ? Math.random() * get.attitude(player, target) : 0; }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("qigong", target); target.addTempSkill("qigong_ai", "chooseToUseEnd"); target .chooseToUse( "是否再对" + get.translation(trigger.target) + "使用一张【杀】?", function (card, player, event) { if (get.name(card) != "sha") return false; return lib.filter.filterCard.apply(this, arguments); }, trigger.target, -1 ) .set("addCount", false) .set("oncard", function () { _status.event.directHit.addArray(game.players); }); } }, subSkill: { ai: { ai: { directHit_ai: true, skillTagFilter: function (player, tag, arg) { return arg.card && arg.card.name == "sha"; }, }, }, }, }, //和沙摩柯一起上线的新服三将 spjiedao: { audio: 2, trigger: { source: "damageBegin1", }, filter: function (event, player) { return player.isDamaged() && !player.getHistory("sourceDamage").length; }, logTarget: "player", direct: true, check: function (trigger, player) { if (get.attitude(player, trigger.player) >= -1) return false; return !trigger.player.hasSkillTag("filterDamage", null, { player: player, card: trigger.card, }); }, content: function () { "step 0"; var num = player.getDamagedHp(); var map = {}; var list = []; for (var i = 1; i <= num; i++) { var cn = get.cnNumber(i, true); map[cn] = i; list.push(cn); } event.map = map; player .chooseControl(list, "cancel2", function () { if (!lib.skill.spjiedao.check(_status.event.getTrigger(), player)) return "cancel2"; return get.cnNumber(_status.event.goon, true); }) .set("prompt", get.prompt2("spjiedao", trigger.player)) .set("goon", num); "step 1"; if (result.control == "cancel2") return; player.logSkill("spjiedao", trigger.player); var num = event.map[result.control] || 1; trigger.num += num; var next = game.createEvent("spjiedao_after", null, trigger.getParent()); next.player = player; next.target = trigger.player; next.num = num; next.setContent(function () { if (target.isIn()) player.chooseToDiscard(num, true, "he"); }); }, }, biaozhao: { audio: 2, intro: { content: "expansion", markcount: "expansion", }, onremove: function (player, skill) { var cards = player.getExpansions(skill); if (cards.length) player.loseToDiscardpile(cards); }, trigger: { player: "phaseJieshuBegin", }, direct: true, filter: function (event, player) { return player.countCards("he") > 0 && !player.getExpansions("biaozhao").length; }, content: function () { "step 0"; player.chooseCard("he", get.prompt("biaozhao"), "将一张牌置于武将牌上作为“表”").ai = function (card) { return 6 - get.value(card); }; "step 1"; if (result.bool) { player.logSkill("biaozhao"); player.addToExpansion(result.cards, player, "give").gaintag.add("biaozhao"); } }, ai: { notemp: true, }, group: ["biaozhao2", "biaozhao3"], }, biaozhao2: { trigger: { global: ["loseAsyncAfter", "loseAfter", "cardsDiscardAfter"], }, forced: true, audio: "biaozhao", filter: function (event, player) { if (event.name == "loseAsyncAfter" && event.type != "discard") return false; if (event.name == "lose" && (event.getlx === false || event.position != ui.discardPile)) return false; var cards = player.getExpansions("biaozhao"); if (!cards.length) return false; var suit = get.suit(cards[0]); var num = get.number(cards[0]); var cards = event.getd(); for (var card of cards) { if (get.suit(card) == suit && get.number(card) == num) return true; } return false; }, content: function () { "step 0"; var card = player.getExpansions("biaozhao")[0]; if (trigger.getParent().name == "discard") { trigger.player.gain(card, player, "give", "bySelf"); } else { player.loseToDiscardpile(card); } "step 1"; player.loseHp(); }, }, biaozhao3: { trigger: { player: "phaseZhunbeiBegin", }, forced: true, charlotte: true, audio: "biaozhao", filter: function (event, player) { return player.getExpansions("biaozhao").length > 0; }, content: function () { "step 0"; var card = player.getExpansions("biaozhao")[0]; player.loseToDiscardpile(card); "step 1"; event.num = 0; game.countPlayer(function (current) { if (current.countCards("h") > event.num) event.num = current.countCards("h"); }); player.chooseTarget("是否令一名角色将手牌摸至" + event.num + "张并回复1点体力?").ai = function (target) { var num = Math.min(event.num - target.countCards("h"), 5); if (target.isDamaged()) num++; return num * get.attitude(_status.event.player, target); }; "step 2"; if (result.bool) { var target = result.targets[0]; player.line(target, "green"); var draw = Math.min(num - target.countCards("h"), 5); if (draw) target.draw(draw); target.recover(); } }, }, yechou: { audio: 2, trigger: { player: "die", }, direct: true, forceDie: true, skillAnimation: true, animationColor: "wood", content: function () { "step 0"; player .chooseTarget(get.prompt2("yechou"), function (card, player, target) { return player != target && target.getDamagedHp() > 1; }) .set("forceDie", true) .set("ai", function (target) { let att = get.attitude(_status.event.player, target); if (att > 0) return 0; att = Math.sqrt(0.01 - att); return att * (get.distance(_status.currentPhase, target, "absolute") || game.players.length); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("yechou", target); player.line(target, "green"); target.addTempSkill("yechou2", { player: "phaseZhunbeiBegin" }); } }, ai: { expose: 0.5, maixie_defend: true, }, }, yechou2: { mark: true, marktext: "仇", intro: { content: "每个回合结束时失去1点体力直到回合开始", }, trigger: { global: "phaseAfter", }, forced: true, content: function () { player.loseHp(); }, }, yanjiao: { audio: 2, ai: { order: 10, result: { player: 1, target: 1.1, }, }, enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return target != player; }, content: function () { "step 0"; var num = 4; if (player.storage.xingshen) { num += player.storage.xingshen; player.storage.xingshen = 0; player.unmarkSkill("xingshen"); } if (player.storage.olxingshen) { num += player.storage.olxingshen; player.storage.olxingshen = 0; player.unmarkSkill("olxingshen"); } num = Math.min(10, num); event.cards = get.cards(num); game.cardsGotoOrdering(event.cards); player.showCards(event.cards); "step 1"; event.getedResult = lib.skill.yanjiao.getResult(cards); if (!event.getedResult.length) { player.addTempSkill("yanjiao2"); event.finish(); } "step 2"; target.chooseControl("自动分配", "手动分配").set("prompt", "【严教】:是否让系统自动分配方案?").ai = function () { return 0; }; "step 3"; if (result.control == "手动分配") { event.goto(8); } "step 4"; event.index = 0; event.togain = event.getedResult[event.index]; target.showCards(event.togain[0], get.translation(target) + "分出的第一份牌"); "step 5"; target.showCards(event.togain[1], get.translation(target) + "分出的第二份牌"); "step 6"; target.chooseControl().set("choiceList", ["获得" + get.translation(event.togain[0]), "获得" + get.translation(event.togain[1])]).ai = function () { return Math.random() < 0.5 ? 1 : 0; }; "step 7"; var list = [ [target, event.togain[result.index]], [player, event.togain[1 - result.index]], ]; game.loseAsync({ gain_list: list, giver: target, animate: "gain2", }).setContent("gaincardMultiple"); if (event.togain[2].length > 1) player.addTempSkill("yanjiao2"); event.finish(); "step 8"; var next = target.chooseToMove("严教:分出点数相等的两组牌"); next.set("chooseTime", (cards.length * 4).toString()); next.set("list", [ [ "未分配", cards, function (list) { var num = 0; for (var i of list) num += i.number; return "未分配(点数和" + num + ")"; }, ], [ "第一组", [], function (list) { var num = 0; for (var i of list) num += i.number; return "第一组(点数和" + num + ")"; }, ], [ "第二组", [], function (list) { var num = 0; for (var i of list) num += i.number; return "第二组(点数和" + num + ")"; }, ], ]); next.set("filterOk", function (moved) { var num1 = 0; for (var i of moved[1]) num1 += i.number; if (num1 == 0) return false; var num2 = 0; for (var i of moved[2]) num2 += i.number; return num1 == num2; }); next.set("processAI", () => false); "step 9"; if (result.bool) { var moved = result.moved; event.getedResult = [[moved[1], moved[2], moved[0]]]; event.goto(4); } else { player.addTempSkill("yanjiao2"); } }, getResult: function (cards) { var cl = cards.length; var maxmium = Math.pow(3, cl); var filter = function (list) { if (!list[1].length || !list[0].length) return false; var num1 = 0; for (var i = 0; i < list[1].length; i++) { num1 += list[1][i].number; } var num2 = 0; for (var j = 0; j < list[0].length; j++) { num2 += list[0][j].number; } return num1 == num2; }; var results = []; for (var i = 0; i < maxmium; i++) { var result = [[], [], []]; for (var j = 0; j < cl; j++) { result[Math.floor((i % Math.pow(3, j + 1)) / Math.pow(3, j))].push(cards[j]); } if (filter(result)) results.push(result); } var filterSame = function (list1, list2) { if (list1[1].length == list2[0].length && list1[0].length == list2[1].length) { for (var i = 0; i < list1[0].length; i++) { if (!list2[1].includes(list1[0][i])) return false; } for (var i = 0; i < list1[1].length; i++) { if (!list2[0].includes(list1[1][i])) return false; } return true; } return false; }; for (var i = 0; i < results.length; i++) { for (var j = i + 1; j < results.length; j++) { if (filterSame(results[i], results[j])) results.splice(j--, 1); } } results.sort(function (a, b) { return a[2].length - b[2].length; }); return results.slice(0, 50); }, }, yanjiao2: { marktext: "教", mark: true, intro: { content: "本回合手牌上限-1", }, mod: { maxHandcard: function (player, num) { return num - 1; }, }, }, xingshen: { audio: 2, intro: { content: "下一次发动【严教】时多展示#张牌", }, trigger: { player: "damageEnd", }, frequent: true, content: function () { player.draw(player.isMinHandcard() ? 2 : 1); if (!player.storage.xingshen) player.storage.xingshen = 0; player.storage.xingshen += player.isMinHp() ? 2 : 1; if (player.storage.xingshen > 4) player.storage.xingshen = 4; player.markSkill("xingshen"); }, }, pingjian: { initList: function () { var list = []; if (_status.connectMode) list = get.charactersOL(); else { var list = []; for (var i in lib.character) { if (!lib.filter.characterDisabled2(i) && !lib.filter.characterDisabled(i)) list.push(i); } } game.countPlayer2(function (current) { list.remove(current.name); list.remove(current.name1); list.remove(current.name2); }); _status.characterlist = list; }, init: function (player) { player.addSkill("pingjian_check"); if (!player.storage.pingjian_check) player.storage.pingjian_check = {}; }, audio: 2, trigger: { player: ["damageEnd", "phaseJieshuBegin"] }, frequent: true, content: function () { "step 0"; if (!_status.characterlist) { lib.skill.pingjian.initList(); } var allList = _status.characterlist.slice(0); game.countPlayer(function (current) { if (current.name && lib.character[current.name] && current.name.indexOf("gz_shibing") != 0 && current.name.indexOf("gz_jun_") != 0) allList.add(current.name); if (current.name1 && lib.character[current.name1] && current.name1.indexOf("gz_shibing") != 0 && current.name1.indexOf("gz_jun_") != 0) allList.add(current.name1); if (current.name2 && lib.character[current.name2] && current.name2.indexOf("gz_shibing") != 0 && current.name2.indexOf("gz_jun_") != 0) allList.add(current.name2); }); var list = []; var skills = []; var map = []; allList.randomSort(); var name2 = event.triggername; for (var i = 0; i < allList.length; i++) { var name = allList[i]; if (name.indexOf("zuoci") != -1 || name.indexOf("xushao") != -1) continue; var skills2 = lib.character[name][3]; for (var j = 0; j < skills2.length; j++) { if (player.getStorage("pingjian").includes(skills2[j])) continue; if (skills.includes(skills2[j])) { list.add(name); if (!map[name]) map[name] = []; map[name].push(skills2[j]); skills.add(skills2[j]); continue; } var list2 = [skills2[j]]; game.expandSkills(list2); for (var k = 0; k < list2.length; k++) { var info = lib.skill[list2[k]]; if (get.is.zhuanhuanji(list2[k], player)) continue; if (!info || !info.trigger || !info.trigger.player || info.silent || info.limited || info.juexingji || info.hiddenSkill || info.dutySkill || (info.zhuSkill && !player.isZhu2())) continue; if (info.trigger.player == name2 || (Array.isArray(info.trigger.player) && info.trigger.player.includes(name2))) { if (info.ai && (info.ai.combo || info.ai.notemp || info.ai.neg)) continue; if (info.init) continue; if (info.filter) { try { var bool = info.filter(trigger, player, name2); if (!bool) continue; } catch (e) { continue; } } list.add(name); if (!map[name]) map[name] = []; map[name].push(skills2[j]); skills.add(skills2[j]); break; } } } if (list.length > 2) break; } if (skills.length) { event.list = list; player.chooseControl(skills).set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); } else event.finish(); "step 1"; player.markAuto("pingjian", [result.control]); player.addTempSkill(result.control); player.storage.pingjian_check[result.control] = trigger.name == "damage" ? trigger : "phaseJieshu"; var name = event.list.find(name => lib.character[name][3].includes(result.control)); // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); }, group: "pingjian_use", phaseUse_special: [], ai: { threaten: 5 }, }, pingjian_use: { audio: "pingjian", enable: "phaseUse", usable: 1, prompt: () => lib.translate.pingjian_info, content: function () { "step 0"; var list = []; var skills = []; var map = []; var evt = event.getParent(2); if (!_status.characterlist) { lib.skill.pingjian.initList(); } var allList = _status.characterlist.slice(0); game.countPlayer(function (current) { if (current.name && lib.character[current.name] && current.name.indexOf("gz_shibing") != 0 && current.name.indexOf("gz_jun_") != 0) allList.add(current.name); if (current.name1 && lib.character[current.name1] && current.name1.indexOf("gz_shibing") != 0 && current.name1.indexOf("gz_jun_") != 0) allList.add(current.name1); if (current.name2 && lib.character[current.name2] && current.name2.indexOf("gz_shibing") != 0 && current.name2.indexOf("gz_jun_") != 0) allList.add(current.name2); }); allList.randomSort(); for (var i = 0; i < allList.length; i++) { var name = allList[i]; if (name.indexOf("zuoci") != -1 || name.indexOf("xushao") != -1) continue; var skills2 = lib.character[name][3]; for (var j = 0; j < skills2.length; j++) { if (player.getStorage("pingjian").includes(skills2[j])) continue; if (get.is.locked(skills2[j], player)) continue; var info = lib.translate[skills2[j] + "_info"]; if (skills.includes(skills2[j]) || (info && info.indexOf("当你于出牌阶段") != -1 && info.indexOf("当你于出牌阶段外") == -1)) { list.add(name); if (!map[name]) map[name] = []; map[name].push(skills2[j]); skills.add(skills2[j]); continue; } var list2 = [skills2[j]]; game.expandSkills(list2); for (var k = 0; k < list2.length; k++) { var info = lib.skill[list2[k]]; if (get.is.zhuanhuanji(list2[k], player)) continue; if (!info || !info.enable || info.charlotte || info.limited || info.juexingji || info.hiddenSkill || info.dutySkill || (info.zhuSkill && !player.isZhu2())) continue; if (info.enable == "phaseUse" || (Array.isArray(info.enable) && info.enable.includes("phaseUse")) || info.enable == "chooseToUse" || (Array.isArray(info.enable) && info.enable.includes("chooseToUse"))) { if (info.ai && (info.ai.combo || info.ai.notemp || info.ai.neg)) continue; if (info.init || info.onChooseToUse) continue; if (info.filter) { try { var bool = info.filter(evt, player); if (!bool) continue; } catch (e) { continue; } } else if (info.viewAs && typeof info.viewAs != "function") { try { if (evt.filterCard && !evt.filterCard(info.viewAs, player, evt)) continue; if (info.viewAsFilter && info.viewAsFilter(player) == false) continue; } catch (e) { continue; } } list.add(name); if (!map[name]) map[name] = []; map[name].push(skills2[j]); skills.add(skills2[j]); break; } } } if (list.length > 2) break; } if (skills.length) { event.list = list; player.chooseControl(skills).set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); } else event.finish(); "step 1"; player.markAuto("pingjian", [result.control]); player.addTempSkill(result.control); player.storage.pingjian_check[result.control] = "phaseUse"; var name = event.list.find(name => lib.character[name][3].includes(result.control)); // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); }, ai: { order: 12, result: { player: 1 } }, }, pingjian_check: { charlotte: true, trigger: { player: ["useSkill", "logSkillBegin"] }, filter: function (event, player) { var info = get.info(event.skill); if (info && info.charlotte) return false; var skill = event.sourceSkill || event.skill; return player.storage.pingjian_check[skill]; }, direct: true, firstDo: true, priority: Infinity, content: function () { var skill = trigger.sourceSkill || trigger.skill; player.removeSkill(skill); const names = player.tempname && player.tempname.filter(i => lib.character[i][3].includes(skill)); if (names) game.broadcastAll((player, names) => player.tempname.removeArray(names), player, names); delete player.storage.pingjian_check[skill]; }, group: "pingjian_check2", }, pingjian_check2: { charlotte: true, trigger: { player: ["phaseUseEnd", "damageEnd", "phaseJieshuBegin"] }, filter: function (event, player) { return Object.keys(player.storage.pingjian_check).find(function (skill) { if (event.name != "damage") return player.storage.pingjian_check[skill] == event.name; return player.storage.pingjian_check[skill] == event; }); }, direct: true, lastDo: true, priority: -Infinity, content: function () { var skills = Object.keys(player.storage.pingjian_check).filter(function (skill) { if (trigger.name != "damage") return player.storage.pingjian_check[skill] == trigger.name; return player.storage.pingjian_check[skill] == trigger; }); player.removeSkill(skills); const names = player.tempname && player.tempname.filter(i => skills.some(skill => lib.character[i][3].includes(skill))); if (names) game.broadcastAll((player, names) => player.tempname.removeArray(names), player, names); for (var skill of skills) delete player.storage.pingjian_check[skill]; }, }, //上兵伐谋 //伊籍在标包 不会移动 songshu: { audio: 2, enable: "phaseUse", filter: function (event, player) { return !player.hasSkill("songshu_reflectionblue", null, null, false) && player.countCards("h") > 0; }, filterTarget: function (card, player, target) { return target != player && player.canCompare(target); }, content: function () { "step 0"; player.chooseToCompare(target).set("small", get.attitude(player, target) > 0); "step 1"; if (!result.bool) { player.draw(2, "nodelay"); target.draw(2); player.addTempSkill("songshu_reflectionblue", "phaseUseAfter"); } else { target.addTempSkill("songshu_ai"); } }, ai: { basic: { order: 1, }, expose: 0.2, result: { target: function (player, target) { if (target.hasSkill("songshu_ai", null, null, false)) return 0; var maxnum = 0; var cards2 = target.getCards("h"); for (var i = 0; i < cards2.length; i++) { if (get.number(cards2[i]) > maxnum) { maxnum = get.number(cards2[i]); } } if (maxnum > 10) maxnum = 10; if (maxnum < 5 && cards2.length > 1) maxnum = 5; var cards = player.getCards("h"); for (var i = 0; i < cards.length; i++) { if (get.number(cards[i]) < maxnum) return 1; } return 0; }, }, }, }, songshu_ai: { charlotte: true }, songshu_reflectionblue: { charlotte: true }, sibian: { audio: 2, trigger: { player: "phaseDrawBegin1" }, filter: function (event, player) { return !event.numFixed; }, content: function () { "step 0"; trigger.changeToZero(); event.cards = get.cards(4); game.cardsGotoOrdering(event.cards); player.showCards(event.cards); "step 1"; cards.sort(function (a, b) { return b.number - a.number; }); var gains = []; var mx = [cards[0].number, cards[3].number]; for (var i = 0; i < cards.length; i++) { if (mx.includes(cards[i].number)) gains.addArray(cards.splice(i--, 1)); } player.gain(gains, "gain2"); if (cards.length > 0) player .chooseTarget("是否令一名手牌数最少的角色获得" + get.translation(cards), function (card, player, target) { return target.isMinHandcard(); }) .set("ai", function (target) { return get.attitude(_status.event.player, target); }); else event.finish(); "step 2"; if (result.bool) { var target = result.targets[0]; player.line(target); player.addExpose(0.2); target.gain(cards, "gain2"); } }, }, lslixun: { audio: 2, forced: true, trigger: { player: "damageBegin4" }, marktext: "珠", intro: { name2: "珠", content: "共有#个“珠”", }, content: function () { trigger.cancel(); player.addMark("lslixun", trigger.num); }, group: "lslixun_fate", }, lslixun_fate: { audio: "lslixun", trigger: { player: "phaseUseBegin" }, forced: true, filter: function (event, player) { return player.countMark("lslixun") > 0; }, content: function () { "step 0"; event.forceDie = true; _status.lslixun = player.countMark("lslixun"); player.judge(function (card) { if (get.number(card) < _status.lslixun) return -_status.lslixun; return 1; }).judge2 = function (result) { return result.bool ? true : false; }; "step 1"; delete _status.lslixun; if (!result.bool) { player.chooseToDiscard([1, player.countMark("lslixun")], "h").ai = lib.skill.qiangxi.check; } else event.finish(); "step 2"; var num = player.countMark("lslixun"); if (result.cards && result.cards.length) num -= result.cards.length; if (num) player.loseHp(num); }, }, lskuizhu: { audio: 2, trigger: { player: "phaseUseEnd" }, direct: true, filter: function (event, player) { return player.isMaxHp(true) == false; }, content: function () { "step 0"; player.chooseTarget(get.prompt2("lskuizhu"), function (card, player, target) { return target != player && target.isMaxHp(); }).ai = function (target) { var player = _status.event.player; var ts = Math.min(5, target.countCards("h")); var delta = ts - player.countCards("h"); if (delta <= 0) return 0; if (get.attitude(player, target) < 1) return false; return target.countCards("he", function (card) { return lib.skill.zhiheng.check(card) > 0; }) > 1 ? delta : 0; }; "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("lskuizhu", target); player.drawTo(Math.min(5, target.countCards("h"))); } else event.finish(); "step 2"; if (!player.countCards("h")) { event.finish(); return; } target.viewHandcards(player); "step 3"; if (!target.countCards("h")) { event.finish(); return; } target.chooseToDiscard(true, "h", [1, player.countCards("h")], "弃置至多" + get.cnNumber(player.countCards("h")) + "张手牌,并获得" + get.translation(player) + "等量的手牌").ai = function (card) { if (ui.selected.cards.length > 1) return -1; return lib.skill.zhiheng.check.apply(this, arguments); }; "step 4"; if (result.bool && result.cards && result.cards.length && player.countGainableCards(target, "h") > 0) { target.gainPlayerCard(player, "h", true, result.cards.length).visible = true; } "step 5"; if (result.bool && result.cards && result.cards.length > 1) { var bool = player.storage.lslixun > 0 !== true; player .chooseTarget(bool, "令" + get.translation(target) + "对其攻击范围内的一名角色造成1点伤害" + (bool ? "" : ",或点「取消」移去一个“珠”"), function (card, player, target) { var source = _status.event.source; return target != source && source.inRange(target); }) .set("source", target) .set("ai", function (target) { return get.damageEffect(target, _status.event.source, _status.event.player); }); } else event.finish(); "step 6"; if (result.bool && result.targets && result.targets.length) { player.line(result.targets[0]); result.targets[0].damage(target); } else { player.removeMark("lslixun", 1); } }, ai: { expose: 0.25, }, }, xpchijie: { audio: 2, trigger: { target: "useCardToAfter", }, filter: function (event, player) { var evt = event.getParent(); var targets = evt.targets.slice(evt.num + 1); return event.player != player && targets.length > 0; }, usable: 1, prompt2: function (event, player) { var evt = event.getParent(); var targets = evt.targets.slice(evt.num + 1); return "令" + get.translation(event.card) + "对" + get.translation(targets) + "无效"; }, check: function (event, player) { var evt = event.getParent(); var targets = evt.targets.slice(evt.num + 1); var num = 0; for (var i = 0; i < targets.length; i++) { num += get.effect(targets[i], evt.card, evt.player, player); } return num < -1; }, content: function () { var evt = trigger.getParent(); evt.excluded.addArray(evt.targets); }, group: "xpchijie2", }, xpchijie2: { trigger: { global: "useCardAfter" }, audio: "xpchijie", filter: function (event, player) { return ( event.player != player && event.targets.includes(player) && event.cards.filterInD().length > 0 && !game.hasPlayer2(function (current) { return ( current.getHistory("damage", function (evt) { return evt.card == event.card; }).length > 0 ); }) ); }, usable: 1, check: function (event, player) { return get.value(event.cards.filterInD(), player, "raw") > 0; }, prompt2: function (event, player) { return "获得" + get.translation(event.cards.filterInD()) + "。"; }, content: function () { player.gain(trigger.cards.filterInD(), "log", "gain2"); }, }, xpchijie4: {}, yinju: { audio: 2, enable: "phaseUse", limited: true, filterTarget: lib.filter.notMe, skillAnimation: true, animationColor: "water", content: function () { player.awakenSkill("yinju"); player.storage.yinju2 = target; player.addTempSkill("yinju2"); }, ai: { result: { order: 10, player: function (player, target) { if ( player.countCards("hs", function (card) { return get.tag(card, "damage") && player.canUse(card, target); }) >= 1 && target.hp <= 2 ) return 0.1; if ( player.countCards("hes", function (card) { return player.canUse(card, target); }) <= 2 ) return -100; return 1; }, target: function (player, target) { return target.isDamaged() ? 5 : 3; }, }, }, }, yinju2: { trigger: { player: "useCardToPlayered", source: "damageBefore", }, forced: true, onremove: true, filter: function (event, player, name) { if (name == "useCardToPlayered") return event.target == player.storage.yinju2; return event.player == player.storage.yinju2; }, logTarget: function (event) { return event[event.name == "damage" ? "player" : "target"]; }, content: function () { "step 0"; if (trigger.name == "damage") { trigger.cancel(); trigger.player.recover(trigger.num); event.finish(); } else { game.asyncDraw([player, trigger.target]); } "step 1"; game.delayx(); }, ai: { effect: { player: function (card, player, target) { if (target != player.storage.yinju2) return; if (card.name == "lebu") return; if (card.name !== "huogong" && get.tag(card, "damage") && target.isDamaged()) [1, 0.6, 0, 2.4]; return [1, 0.6, 1, 0.6]; }, }, }, }, rewenji: { audio: "spwenji", trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { return game.hasPlayer(function (current) { return current != player && current.countCards("he"); }); }, content: function () { "step 0"; player .chooseTarget(get.prompt2("rewenji"), function (card, player, target) { return target != player && target.countCards("he") > 0; }) .set("ai", function (target) { var att = get.attitude(_status.event.player, target); if (att > 0) return Math.sqrt(att) / 10; return 5 - att; }); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("rewenji", target); target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); } else { event.finish(); } "step 2"; if (result.bool) { player.addTempSkill("rewenji_respond"); player.storage.rewenji_respond = get.type2(result.cards[0], target); event.target.give(result.cards, player, true); } }, subSkill: { respond: { onremove: true, trigger: { player: "useCard" }, forced: true, charlotte: true, audio: "spwenji", filter: function (event, player) { return get.type2(event.card) == player.storage.rewenji_respond; }, content: function () { trigger.directHit.addArray( game.filterPlayer(function (current) { return current != player; }) ); }, ai: { directHit_ai: true, skillTagFilter: function (player, tag, arg) { return get.type2(arg.card) == player.storage.rewenji_respond; }, }, }, }, }, spwenji: { audio: 2, trigger: { player: "phaseUseBegin" }, direct: true, filter: function (event, player) { return game.hasPlayer(function (current) { return current != player && current.countCards("he"); }); }, content: function () { "step 0"; player .chooseTarget(get.prompt2("spwenji"), function (card, player, target) { return target != player && target.countCards("he") > 0; }) .set("ai", function (target) { var att = get.attitude(_status.event.player, target); if (att > 0) return Math.sqrt(att) / 10; return 5 - att; }); "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; player.logSkill("spwenji", target); target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); } else { event.finish(); } "step 2"; if (result.bool) { player.addTempSkill("spwenji_respond"); player.storage.spwenji_respond = result.cards[0].name; event.target.give(result.cards, player, true); } }, subSkill: { respond: { onremove: true, trigger: { player: "useCard" }, forced: true, charlotte: true, audio: "spwenji", filter: function (event, player) { return event.card.name == player.storage.spwenji_respond; }, content: function () { trigger.directHit.addArray( game.filterPlayer(function (current) { return current != player; }) ); }, ai: { directHit_ai: true, skillTagFilter: function (player, tag, arg) { return arg.card.name == player.storage.spwenji_respond; }, }, }, }, }, sptunjiang: { audio: 2, trigger: { player: "phaseJieshuBegin" }, frequent: true, filter: function (event, player) { //if(player.getHistory('skipped').includes('phaseUse')) return false; return ( player.getHistory("useCard", function (evt) { if (evt.targets && evt.targets.length && evt.isPhaseUsing()) { var targets = evt.targets.slice(0); while (targets.includes(player)) targets.remove(player); return targets.length > 0; } return false; }).length == 0 ); }, content: function () { player.draw(game.countGroup()); }, }, bingzhao: { audio: 2, unique: true, zhuSkill: true, forced: true, locked: false, intro: { content: function (group) { return "已选择了" + get.translation(group) + "势力"; }, }, trigger: { global: ["phaseBefore", "zhuUpdate"] }, filter: function (event, player) { if ( !lib.group.some(function (group) { if (group == player.group) return false; return ( lib.group.includes(group) || game.hasPlayer(function (current) { return current.group == group; }) ); }) ) return false; return !player.storage.bingzhao && player.hasZhuSkill("bingzhao") && (event.name != "phase" || game.phaseNumber == 0); }, content: function () { "step 0"; var list = lib.group.filter(function (group) { if (group == player.group) return false; return ( lib.group.includes(group) || game.hasPlayer(function (current) { return current.group == group; }) ); }); player .chooseControl(list) .set("prompt", "秉诏:请选择一个其他势力") .set("ai", function () { var listx = list.slice(0); listx.sort(function (a, b) { return ( game.countPlayer(function (current) { return current != player && current.group == b; }) - game.countPlayer(function (current) { return current != player && current.group == a; }) ); }); return listx[0]; }); "step 1"; var group = result.control; player.popup(get.translation(group) + "势力", get.groupnature(group, "raw")); game.log(player, "选择了", "#y" + get.translation(group) + "势力"); player.storage.bingzhao = group; player.markSkill("bingzhao"); }, ai: { combo: "guju", }, }, baijia: { audio: 2, audioname: ["tw_beimihu"], unique: true, derivation: "bmcanshi", juexingji: true, ai: { combo: "guju", }, trigger: { player: "phaseZhunbeiBegin" }, forced: true, skillAnimation: true, animationColor: "thunder", filter: function (event, player) { return player.hasSkill("guju") && player.storage.guju >= 7; }, content: function () { player.awakenSkill("baijia"); player.gainMaxHp(); player.recover(); var list = game.filterPlayer(); for (var i = 0; i < list.length; i++) { if (list[i] != player && !list[i].hasMark("zongkui_mark")) { list[i].addMark("zongkui_mark", 1); player.line(list[i], "green"); } } //player.removeSkill('guju'); player.changeSkills(["bmcanshi"], ["guju"]); }, }, bmcanshi: { audio: 2, audioname: ["tw_beimihu"], group: ["bmcanshi_add", "bmcanshi_remove"], ai: { combo: "zongkui", }, subSkill: { add: { audio: "bmcanshi", trigger: { player: "useCard2" }, filter: function (event, player) { if (!event.targets || event.targets.length != 1) return false; var info = get.info(event.card); if (info.multitarget) return false; if (info.allowMultiple == false) return false; if (info.type == "equip") return false; if (info.type == "delay") return false; return game.hasPlayer(function (current) { if (!current.hasMark("zongkui_mark")) return false; return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); }); }, direct: true, content: function () { "step 0"; player .chooseTarget(get.prompt2("bmcanshi"), [1, Infinity], function (card, player, target) { if (!target.hasMark("zongkui_mark")) return false; var trigger = _status.event.getTrigger(); return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); }) .set("ai", function (target) { var player = _status.event.player; return get.effect(target, _status.event.getTrigger().card, player, player); }); "step 1"; if (result.bool) { if (!event.isMine() && !event.isOnline()) game.delayx(); event.targets = result.targets.sortBySeat(); } else { event.finish(); } "step 2"; player.logSkill("bmcanshi", event.targets); for (var i = 0; i < event.targets.length; i++) { event.targets[i].removeMark("zongkui_mark", 1); } trigger.targets.addArray(event.targets); }, }, remove: { audio: "bmcanshi", trigger: { target: "useCardToTarget", }, check: function (event, player) { return get.attitude(event.player, player) < 0 && get.effect(player, event.card, event.player, player) < 0; }, logTarget: "player", filter: function (event, player) { if (!["basic", "trick"].includes(get.type(event.card))) return false; if (!event.targets || event.targets.length != 1) return false; return event.player.hasMark("zongkui_mark"); }, content: function () { trigger.targets.remove(player); trigger.getParent().triggeredTargets2.remove(player); game.delay(); trigger.player.removeMark("zongkui_mark"); }, }, }, }, guju: { audio: 2, audioname: ["tw_beimihu"], init: function (player) { if (!player.storage.guju) player.storage.guju = 0; }, intro: { content: "已因此技能得到#张牌", }, trigger: { global: "damageEnd" }, forced: true, filter: function (event, player) { return event.player != player && event.player.isIn() && event.player.hasMark("zongkui_mark"); }, content: function () { "step 0"; player.draw(); player.storage.guju++; player.markSkill("guju"); "step 1"; if (player.hasZhuSkill("bingzhao", trigger.player) && trigger.player.group == player.storage.bingzhao && trigger.player.isIn()) { trigger.player.chooseBool("是否对" + get.translation(player) + "发动【秉诏】?").ai = function () { return get.attitude(trigger.player, player) > 1; }; } else event.finish(); "step 2"; if (result.bool) { trigger.player.logSkill("bingzhao", player); player.draw(); player.storage.guju++; player.markSkill("guju"); } }, ai: { combo: "zongkui", }, }, zongkui: { trigger: { player: "phaseBeforeEnd", global: "roundStart", }, direct: true, audio: 2, audioname: ["tw_beimihu"], filter: function (event, player, name) { return game.hasPlayer(function (current) { if (name == "roundStart" && !current.isMinHp()) return false; return current != player && !current.hasMark("zongkui_mark"); }); }, content: function () { "step 0"; var targets = game.filterPlayer(function (current) { if (event.triggername == "roundStart" && !current.isMinHp()) return false; return current != player && !current.hasMark("zongkui_mark"); }); if (event.triggername == "roundStart" && targets.length == 1) { event._result = { bool: true, targets: targets }; } else { var next = player .chooseTarget(get.prompt("zongkui"), "令一名" + (event.triggername == "roundStart" ? "体力值最小的" : "") + "其他角色获得“傀”标记", function (card, player, target) { if (_status.event.round && !target.isMinHp()) return false; return target != player && !target.hasMark("zongkui_mark"); }) .set("ai", function (target) { var num = target.isMinHp() ? 0.5 : 1; return num * get.threaten(target); }) .set("round", event.triggername == "roundStart"); if (event.triggername == "roundStart") next.set("forced", true); } "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("zongkui", target); target.addMark("zongkui_mark", 1); game.delayx(); } }, subSkill: { mark: { marktext: "傀", intro: { name2: "傀", content: "mark", }, }, }, ai: { combo: "guju", threaten: 1.4, }, }, xinfu_langxi: { audio: 2, trigger: { player: "phaseZhunbeiBegin", }, direct: true, filter: function (event, player) { return game.hasPlayer(function (current) { return current != player && current.hp <= player.hp; }); }, content: function () { "step 0"; player .chooseTarget(get.prompt("xinfu_langxi"), "对一名体力值不大于你的其他角色造成0-2点随机伤害", function (card, player, target) { return target.hp <= player.hp && target != player; }) .set("ai", function (target) { var player = _status.event.player; return get.damageEffect(target, player, player); }); "step 1"; if (result.bool && result.targets && result.targets.length) { player.logSkill("xinfu_langxi", result.targets); var num = [1, 2, 0].randomGet(); if (get.isLuckyStar(player)) num = 2; player.line(result.targets[0], "green"); result.targets[0].damage(num); } }, ai: { expose: 0.25, threaten: 1.7, }, }, xinfu_yisuan: { usable: 1, audio: 2, trigger: { player: "useCardEnd", }, check: function (event, player) { return get.value(event.cards) + player.maxHp * 2 - 18 > 0; }, prompt2: function (event, player) { return "你可以减1点体力上限,然后获得" + get.translation(event.cards.filterInD()) + "。"; }, filter: function (event, player) { return player.isPhaseUsing() && get.type(event.card) == "trick" && event.cards.filterInD().length > 0; }, content: function () { player.loseMaxHp(); player.gain(trigger.cards.filterInD(), "gain2", "log"); }, }, xinfu_xingluan: { usable: 1, audio: 2, trigger: { player: "useCardAfter", }, filter: function (event, player) { if (!player.isPhaseUsing()) return false; if (get.type(event.card) == undefined) return false; return event.targets && event.targets.length == 1; }, content: function () { var card = get.cardPile2(function (card) { return card.number == 6; }); if (!card) { player.chat("无牌可得了吗"); game.log("但是牌堆里面已经没有点数为6的牌了!"); event.finish(); return; } player.gain(card, "gain2"); }, }, xinfu_lveming: { init: function (player) { player.storage.xinfu_lveming = 0; }, mark: true, intro: { content: "已发动过#次", }, audio: 2, enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return player != target && target.countCards("e") < player.countCards("e"); }, content: function () { "step 0"; var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].map(i => get.strNumber(i)); target .chooseControl(list) .set("ai", function () { return get.rand(0, 12); }) .set("prompt", "请选择一个点数"); "step 1"; if (result.control) { target.$damagepop(result.control, "thunder"); var num = result.index + 1; event.num = num; } else { target.$damagepop("K", "thunder"); event.num = 13; } game.log(target, "选择的点数是", "#y" + get.strNumber(event.num)); player.storage.xinfu_lveming++; player.judge(function (card) { if (card.number == _status.event.getParent("xinfu_lveming").num) return 4; return 0; }); "step 2"; if (result.bool == true) { target.damage(2); } else { var card = target.getCards("hej").randomGet(); player.gain(card, target, "giveAuto", "bySelf"); } }, ai: { order: 9, result: { target: function (player, target) { var numj = target.countCards("j"); var numhe = target.countCards("he"); if (numhe == 0) return numj > 0 ? 6 : -6; return -6 - (numj + 1) / numhe; }, }, threaten: 1.1, }, }, xinfu_tunjun: { skillAnimation: true, animationColor: "metal", limited: true, unique: true, enable: "phaseUse", audio: 2, filter: function (event, player) { if (player.storage.xinfu_tunjun) return false; return player.storage.xinfu_lveming && player.storage.xinfu_lveming > 0; }, filterTarget: true, selectTarget: 1, content: function () { "step 0"; player.awakenSkill("xinfu_tunjun"); event.num = player.storage.xinfu_lveming; event.toequip = []; "step 1"; var equip = get.cardPile(function (card) { var bool1 = true; for (var i = 0; i < event.toequip.length; i++) { if (get.type(card) == "equip" && get.subtype(card) == get.subtype(event.toequip[i])) bool1 = false; } return get.type(card) == "equip" && !event.toequip.includes(card) && target.hasEmptySlot(card) && bool1; }); if (equip) event.toequip.push(equip); else event.num = 0; event.num--; "step 2"; if (event.num > 0) event.goto(1); "step 3"; for (var i = 0; i < event.toequip.length; i++) { target.chooseUseTarget(event.toequip[i], true).set("animate", false).set("nopopup", true); } }, ai: { combo: "xinfu_lveming", order: function () { var player = _status.event.player, num = 0; for (var i = 1; i < 6; i++) { num += player.countEquipableSlot(i); } if (num <= 2) return 6; if ( player.hp <= 2 || !game.hasPlayer(current => { if (player == current || get.attitude(player, current) < 0 || current.hp <= 1) return false; return current.hp > 2 || current.countCards("hs") > 2; }) ) return 1; return 0; }, result: { target: function (player, target) { var num = 0; for (var i = 1; i < 6; i++) { num += target.countEquipableSlot(i); } return num; }, }, }, mark: true, intro: { content: "limited", }, init: function (player) { player.storage.xinfu_tunjun = false; }, }, xinfu_tanbei: { audio: 2, enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return player != target; }, content: function () { "step 0"; if (target.countCards("hej") == 0) { event._result = { index: 1 }; } else { target .chooseControl() .set("choiceList", ["令" + get.translation(player) + "随机获得你区域内的一张牌,然后其本回合内不能再对你使用牌。", "令" + get.translation(player) + "本回合内对你使用牌没有次数与距离限制。"]) .set("ai", function () { var list = [0, 1]; return list.randomGet(); }); } "step 1"; player.addTempSkill("tanbei_effect3"); if (result.index == 0) { var card = target.getCards("hej").randomGet(); player.gain(card, target, "giveAuto", "bySelf"); target.addTempSkill("tanbei_effect2"); } else { target.addTempSkill("tanbei_effect1"); } }, ai: { order: function () { return [2, 4, 6, 8, 10].randomGet(); }, result: { target: function (player, target) { return -2 - target.countCards("h"); }, }, threaten: 1.1, }, }, tanbei_effect3: { charlotte: true, mod: { targetInRange: function (card, player, target) { if (target.hasSkill("tanbei_effect1")) { return true; } }, cardUsableTarget: function (card, player, target) { if (target.hasSkill("tanbei_effect1")) return true; }, playerEnabled: function (card, player, target) { if (target.hasSkill("tanbei_effect2")) return false; }, }, }, xinfu_sidao: { audio: 2, trigger: { player: "useCardAfter", }, filter: function (event, player) { if (player.hasSkill("xinfu_sidaoy") || !player.countCards("hs")) return false; if (!event.targets || !event.targets.length || !event.isPhaseUsing(player)) return false; var history = player.getHistory("useCard"); var index = history.indexOf(event) - 1; if (index < 0) return false; var evt = history[index]; if (!evt || !evt.targets || !evt.targets.length || !evt.isPhaseUsing(player)) return false; for (var i = 0; i < event.targets.length; i++) { if (evt.targets.includes(event.targets[i]) && lib.filter.filterTarget({ name: "shunshou" }, player, event.targets[i])) return true; } return false; }, direct: true, content: function () { var targets = player.getLastUsed(1).targets; var next = player.chooseToUse(); next.set( "targets", game.filterPlayer(function (current) { return targets.includes(current) && trigger.targets.includes(current); }) ); next.set("openskilldialog", get.prompt2("xinfu_sidao")); next.set("norestore", true); next.set("_backupevent", "xinfu_sidaox"); next.set("custom", { add: {}, replace: { window: function () {} }, }); next.backup("xinfu_sidaox"); }, }, xinfu_sidaox: { audio: "xinfu_sidao", filterCard: function (card) { return get.itemtype(card) == "card"; }, position: "hs", viewAs: { name: "shunshou", }, filterTarget: function (card, player, target) { return _status.event.targets && _status.event.targets.includes(target) && lib.filter.filterTarget.apply(this, arguments); }, prompt: "将一张手牌当顺手牵羊使用", check: function (card) { return 7 - get.value(card); }, onuse: function (links, player) { player.addTempSkill("xinfu_sidaoy"); }, }, xinfu_sidaoy: {}, tanbei_effect1: { charlotte: true, }, tanbei_effect2: { charlotte: true, }, xinfu_tunan: { audio: 2, enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return target != player; }, content: function () { "step 0"; event.cards = get.cards(1); player.showCards(get.translation(player) + "对" + get.translation(target) + "发动了【图南】", event.cards); "step 1"; var card = cards[0]; var bool1 = game.hasPlayer(function (current) { return target.canUse(card, current, false); }); var bool2 = game.hasPlayer(function (current) { return target.canUse({ name: "sha" }, current); }); if (bool1 && bool2) { target .chooseControl(function () { return 0; }) .set("choiceList", ["使用" + get.translation(cards) + "。(没有距离限制)", "将" + get.translation(cards) + "当做【杀】使用。"]) .set("ai", function () { return _status.event.choice; }) .set("choice", target.getUseValue(card, false) > target.getUseValue({ name: "sha", cards: cards }) ? 0 : 1); } else if (bool1) { event.directindex = 0; } else if (bool2) { event.directindex = 1; } else { ui.cardPile.insertBefore(card, ui.cardPile.firstChild); event.finish(); } "step 2"; var card = cards[0]; if (result && typeof event.directindex != "number") { event.directindex = result.index; } if (event.directindex == 1) { target.chooseUseTarget({ name: "sha" }, cards, true, false).viewAs = false; } else { target.chooseUseTarget(card, true, false, "nodistance"); } }, ai: { order: 7, result: { target: 1, }, }, }, xinfu_bijing: { audio: 2, subSkill: { lose: { trigger: { global: "phaseDiscardBegin", }, audio: "xinfu_bijing", charlotte: true, filter: function (event, player) { if (event.player == player) return false; return ( player.getHistory("lose", function (evt) { for (var i in evt.gaintag_map) { if (evt.gaintag_map[i].includes("xinfu_bijing")) return true; } }).length > 0 && event.player.countCards("he") > 0 ); }, forced: true, logTarget: "player", content: function () { trigger.player.chooseToDiscard(2, true, "he"); }, sub: true, }, discard: { trigger: { player: "phaseZhunbeiBegin", }, forced: true, charlotte: true, filter: function (event, player) { return player.hasCard(card => card.hasGaintag("xinfu_bijing") && player.canRecast(card), "h"); }, content: function () { player.recast(player.getCards("h", card => card.hasGaintag("xinfu_bijing") && player.canRecast(card))); }, sub: true, }, }, trigger: { player: "phaseJieshuBegin", }, direct: true, filter: function (player, event) { return event.countCards("h") > 0; }, content: function () { "step 0"; player.chooseCard(get.prompt2("xinfu_bijing"), "h", [1, 2]).set("ai", function (card) { if (card.name == "shan") return 6; return 6 - get.value(card); }); "step 1"; if (result.bool) { player.logSkill("xinfu_bijing"); player.addGaintag(result.cards, "xinfu_bijing"); player.addSkill("xinfu_bijing_lose"); player.addSkill("xinfu_bijing_discard"); } }, }, xinfu_zhenxing: { audio: 2, trigger: { player: ["damageEnd", "phaseJieshuBegin"], }, direct: true, content: function () { "step 0"; player .chooseControl("一张", "两张", "三张", "cancel2") .set("prompt", get.prompt2("xinfu_zhenxing")) .set("", function () { return 0; }); "step 1"; if (result.control == "cancel2") event.finish(); else { player.logSkill("xinfu_zhenxing"); event.num = { 一张: 1, 两张: 2, 三张: 3 }[result.control]; } "step 2"; event.cards = get.cards(num); player .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) .set("filterButton", function (button) { var cards = _status.event.cards; for (var i = 0; i < cards.length; i++) { if (button.link != cards[i] && get.suit(cards[i]) == get.suit(button.link)) return false; } return true; }) .set("ai", function (button) { return get.value(button.link); }) .set("cards", event.cards); "step 3"; var tothrow = []; for (var i = event.cards.length - 1; i >= 0; i--) { if (result.bool && result.links.includes(event.cards[i])) { player.gain(event.cards[i], "gain2"); } else { event.cards[i].fix(); ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); } } game.updateRoundNumber(); }, }, xinfu_qianxin: { audio: 2, group: ["xinfu_qianxin2"], enable: "phaseUse", usable: 1, onChooseToUse: function (event) { if (!game.online) { var num1 = game.players.length - 1; var player = event.player; var num2 = ui.cardPile.childElementCount; var num3 = num2; if (num1 > num2) num3 = 0; else if (player.storage.xinfu_qianxin) { for (var i = 0; i < num2; i++) { if (player.storage.xinfu_qianxin.includes(ui.cardPile.childNodes[i])) { num3 = 0; break; } } } event.set("qianxinNum", num3); } }, filter: function (event, player) { return event.qianxinNum && event.qianxinNum > 0; }, filterTarget: function (card, player, target) { return target != player; }, filterCard: true, selectCard: function () { var num1 = game.players.length - 1; var num2 = _status.event.qianxinNum; return [1, Math.floor(num2 / num1)]; }, discard: false, check: function () { return -1; }, delay: false, lose: false, prompt: function () { return "选择一名角色并将任意张手牌放置于牌堆中" + get.cnNumber(game.players.length) + "倍数的位置(先选择的牌在上)"; }, content: function () { "step 0"; player.$throw(cards.length); player.storage.xinfu_qianxin = cards.slice(0); player.storage.xinfu_qianxin2 = target; //cards.reverse(); player.lose(cards, ui.cardPile).insert_index = function (event, card) { var num1 = game.players.length, i = event.cards.indexOf(card); var num3 = num1 * (i + 1) - 1; return ui.cardPile.childNodes[num3]; }; "step 1"; game.updateRoundNumber(); game.log(player, "把", get.cnNumber(cards.length), "张牌放在了牌堆里"); game.delayx(); }, ai: { order: 1, result: { target: -1, }, }, }, xinfu_qianxin2: { subSkill: { dis: { mod: { maxHandcard: function (player, num) { return num - 2; }, }, sub: true, }, }, forced: true, locked: false, audio: "xinfu_qianxin", logTarget: "player", trigger: { global: "phaseDiscardBegin", }, filter: function (event, player) { if (player.storage.xinfu_qianxin2 != event.player) return false; if (!player.storage.xinfu_qianxin) return false; var hs = event.player.getCards("h"); var cs = player.storage.xinfu_qianxin; var bool = false; var history = event.player.getHistory("gain"); for (var i = 0; i < history.length; i++) { for (var j = 0; j < history[i].cards.length; j++) { var card = history[i].cards[j]; if (hs.includes(card) && cs.includes(card)) return true; } } return false; }, content: function () { "step 0"; delete player.storage.xinfu_qianxin2; if (player.countCards("h") >= 4) { event._result = { index: 1 }; } else { trigger.player .chooseControl() .set("choiceList", ["令" + get.translation(player) + "将手牌摸至四张", "令自己本回合的手牌上限-2"]) .set("ai", function () { var player = _status.event.player; var source = _status.event.getParent().player; if (get.attitude(player, source) > 0) return 0; if (player.hp - player.countCards("h") > 1) return 1; return [0, 1].randomGet(); }); } "step 1"; if (result.index == 0) { player.drawTo(4); } else { trigger.player.addTempSkill("xinfu_qianxin2_dis"); } }, }, xinfu_fuhai: { subSkill: { next: {}, previous: {}, }, audio: 2, group: ["fuhai_clear"], intro: { content: "已指定过#个目标", }, enable: "phaseUse", filter: function (event, player) { if (player.hasSkill("xinfu_fuhai_next") && player.hasSkill("xinfu_fuhai_previous")) return false; return player.countCards("h") > 0; }, filterTarget: function (card, player, target) { if (![player.next, player.previous].includes(target) || target.countCards("h") == 0) return false; if (player.hasSkill("xinfu_fuhai_next")) return target == player.previous; if (player.hasSkill("xinfu_fuhai_previous")) return target == player.next; return true; }, line: false, content: function () { "step 0"; event.side = target == player.next ? "next" : "previous"; event.current = target; if (!player.storage.xinfu_fuhai) player.storage.xinfu_fuhai = 1; player.addTempSkill("xinfu_fuhai_" + event.side, "phaseUseAfter"); "step 1"; if (player.countCards("h") == 0 || event.current.countCards("h") == 0 || event.current == player) { event.finish(); return; } var next = event.current[event.side]; if (get.attitude(event.current, player) > 0) { if (get.attitude(next, target) <= 0 || next.countCards("h") == 0 || player.countCards("h") == 1) { event.stopm = true; event.stopt = true; } else { event.stopm = false; event.stopt = false; } } else { if (get.attitude(next, target) >= 0) { event.stopt = true; event.stopm = false; } else { event.stopt = false; event.stopm = false; } } player.markSkill("xinfu_fuhai"); player.line(event.current, "green"); player .chooseCard("请选择要展示的牌", true) .set("ai", function (card) { if (_status.event.stop) return 14 - get.number(card); return get.number(card); }) .set("stop", event.stopm); "step 2"; event.mes = result.cards[0]; player.showCards(event.mes); "step 3"; event.current .chooseCard("请选择要展示的牌", true) .set("ai", function (card) { if (_status.event.stop) return get.number(card); return 14 - get.number(card); }) .set("stop", event.stopt); "step 4"; event.tes = result.cards[0]; event.current.showCards(event.tes); "step 5"; var num1 = get.number(event.mes); var num2 = get.number(event.tes); if (num1 < num2) { event.current.discard(event.tes); game.asyncDraw([player, event.current], player.storage.xinfu_fuhai); player.addTempSkill("xinfu_fuhai_next", "phaseUseAfter"); player.addTempSkill("xinfu_fuhai_previous", "phaseUseAfter"); player.unmarkSkill("xinfu_fuhai"); } else { player.discard(event.mes); player.storage.xinfu_fuhai++; event.current = event.current[event.side]; if (player.countCards("h") > 0 && event.current.countCards("h") > 0 && event.current != player) event.goto(1); } }, ai: { order: 1, result: { player: function (player, target) { var hs = player.countCards("h"); var side = target == player.next ? "next" : "previous"; var current = player; for (var i = 0; i < hs; i++) { current = current[side]; if (current == player || !current.countCards("h")) return 0; if (get.attitude(current, player) > 0) return 1; } return 0; }, }, }, }, fuhai_clear: { trigger: { player: "phaseAfter", }, forced: true, silent: true, popup: false, filter: function (event, player) { return player.storage.xinfu_fuhai != undefined; }, content: function () { player.unmarkSkill("xinfu_fuhai"); delete player.storage.xinfu_fuhai; }, }, xz_xunxun: { filter: function (event, player) { var num = game.countPlayer(function (current) { return current.isDamaged(); }); return num >= 1 && !player.hasSkill("xunxun"); }, audio: 2, trigger: { player: "phaseDrawBegin1", }, //priority:10, content: function () { "step 0"; var cards = get.cards(4); game.cardsGotoOrdering(cards); var next = player.chooseToMove("恂恂:将两张牌置于牌堆顶", true); next.set("list", [["牌堆顶", cards], ["牌堆底"]]); next.set("filterMove", function (from, to, moved) { if (to == 1 && moved[1].length >= 2) return false; return true; }); next.set("filterOk", function (moved) { return moved[1].length == 2; }); next.set("processAI", function (list) { var cards = list[0][1].slice(0).sort(function (a, b) { return get.value(b) - get.value(a); }); return [cards, cards.splice(2)]; }); "step 1"; var top = result.moved[0]; var bottom = result.moved[1]; top.reverse(); for (var i = 0; i < top.length; i++) { ui.cardPile.insertBefore(top[i], ui.cardPile.firstChild); } for (i = 0; i < bottom.length; i++) { ui.cardPile.appendChild(bottom[i]); } game.updateRoundNumber(); game.delayx(); }, }, xinfu_xingzhao: { audio: true, group: ["xz_xunxun", "xinfu_xingzhao2", "xinfu_xingzhao3"], mark: true, intro: { content: function (storage, player) { var num = game.countPlayer(function (current) { return current.isDamaged(); }); var str = "暂无任何效果"; if (num >= 1) { str = "
  • 视为拥有技能“恂恂”"; } if (num >= 2) { str += ";使用装备牌时摸一张牌"; } if (num >= 3) { str += ";始终跳过弃牌阶段"; } if (num == 0 || num >= 4) { str += ";造成的伤害+1"; } return str; }, }, trigger: { player: "useCard", }, forced: true, filter: function (event, player) { if (get.type(event.card) != "equip") return false; var num = game.countPlayer(function (current) { return current.isDamaged(); }); return num >= 2; }, content: function () { player.draw(); }, }, xinfu_xingzhao2: { audio: true, trigger: { player: ["phaseJudgeBefore", "phaseDiscardBefore"], }, forced: true, filter: function (event, player) { var num = game.countPlayer(function (current) { return current.isDamaged(); }); return num >= 3; }, content: function () { trigger.cancel(); game.log(player, "跳过了" + (trigger.name == "phaseJudge" ? "判定" : "弃牌") + "阶段"); }, }, xinfu_xingzhao3: { audio: "xinfu_xingzhao", trigger: { source: "damageBegin1", }, forced: true, filter: function (event, player) { var num = game.countPlayer(function (current) { return current.isDamaged(); }); return num == 0 || num >= 4; }, content: function () { trigger.num++; }, }, xinfu_dianhu: { audio: 2, trigger: { global: "phaseBefore", player: "enterGame", }, forced: true, filter: function (event, player) { return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); }, content: function () { "step 0"; player .chooseTarget("选择【点虎】的目标", lib.translate.xinfu_dianhu_info, true, function (card, player, target) { return target != player && !target.hasSkill("xinfu_dianhu2"); }) .set("ai", function (target) { var att = get.attitude(_status.event.player, target); if (att < 0) return -att + 3; return Math.random(); }); "step 1"; if (result.bool) { var target = result.targets[0]; player.line(target, "green"); game.log(target, "成为了", "【点虎】", "的目标"); target.storage.xinfu_dianhu2 = player; target.addTempSkill("xinfu_dianhu2", { player: "die" }); } }, }, xinfu_dianhu2: { mark: "character", intro: { content: "当你受到来自$的伤害或回复体力后,$摸一张牌", }, nopop: true, trigger: { player: ["damageEnd", "recoverEnd"], }, forced: true, popup: false, charlotte: true, filter: function (event, player) { if (player.storage.xinfu_dianhu2 && player.storage.xinfu_dianhu2.isIn()) { if (event.name == "damage") return event.source == player.storage.xinfu_dianhu2; return true; } }, content: function () { "step 0"; var target = player.storage.xinfu_dianhu2; target.logSkill("xinfu_dianhu"); target.draw(); }, onremove: true, }, xinfu_jianji: { audio: 2, enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return target != player; }, content: function () { "step 0"; target.draw(); "step 1"; var card = result[0]; if ( card && game.hasPlayer(function (current) { return target.canUse(card, current); }) && get.owner(card) == target ) { target.chooseToUse({ prompt: "是否使用" + get.translation(card) + "?", filterCard: function (cardx, player, target) { return cardx == _status.event.cardx; }, cardx: card, }); } }, ai: { order: 7.5, result: { target: 1, }, }, }, xinfu_lianpian: { audio: 2, usable: 3, trigger: { player: "useCardToPlayered", }, frequent: true, filter: function (event, player) { if (!event.targets || !event.targets.length || event.getParent().triggeredTargets3.length > 1 || !event.isPhaseUsing(player)) return false; var evt = player.getLastUsed(1); if (!evt || !evt.targets || !evt.targets.length || !evt.isPhaseUsing(player)) return false; for (var i = 0; i < event.targets.length; i++) { if (evt.targets.includes(event.targets[i])) return true; } return false; }, content: function () { "step 0"; player.draw(); "step 1"; event.card = result[0]; var ablers = player.getLastUsed(1).targets.slice(0); for (var i = 0; i < ablers.length; i++) { if (ablers[i] == player || !trigger.targets.includes(ablers[i])) ablers.splice(i--, 1); } if (event.card && get.owner(event.card) == player && ablers.length) { player .chooseTarget("是否将" + get.translation(event.card) + "交给其他角色?", function (card, player, target) { return _status.event.ablers.includes(target) && target != player; }) .set("ablers", ablers).ai = function () { return false; }; } else event.finish(); "step 2"; if (result.bool) { player.give(event.card, result.targets[0], true); } }, locked: false, mod: { aiOrder: function (player, card, num) { if (player.isPhaseUsing() && (!player.storage.counttrigger || !player.storage.counttrigger.xinfu_lianpian || !player.storage.counttrigger.xinfu_lianpian < 3)) { var evt = player.getLastUsed(); if ( evt && evt.targets && evt.targets.length && evt.isPhaseUsing(player) && game.hasPlayer(function (current) { return evt.targets.includes(current) && player.canUse(card, current) && get.effect(current, card, player, player) > 0; }) ) { return num + 10; } } }, }, ai: { effect: { player: function (card, player, target) { var evt = player.getLastUsed(); if (evt && evt.targets.includes(target) && (!player.storage.counttrigger || !player.storage.counttrigger.xinfu_lianpian || !player.storage.counttrigger.xinfu_lianpian < 3) && player.isPhaseUsing(player)) return [1.5, 0]; }, }, }, }, //糜芳傅士仁 fengshi: { audio: "mffengshi", audioname: ["sp_mifangfushiren"], trigger: { player: "useCardToPlayered" }, filter(event, player) { if (!event.isFirstTarget) return false; return event.targets.some(target => { return ( player.countCards("h") > target.countCards("h") && target.countCards("he") > 0 && player.hasCard(card => { return lib.filter.cardDiscardable(card, player, "fengshi"); }, "he") ); }); }, direct: true, async content(event, trigger, player) { const { result: { bool, targets }, } = await player .chooseTarget(get.prompt("fengshi"), "弃置你与一名目标角色的各一张牌,然后令" + get.translation(event.card) + "对其造成的伤害+1", (card, player, target) => { const targets = get.event().getTrigger().targets; if (!targets.includes(target)) return false; return ( player.countCards("h") > target.countCards("h") && target.countCards("he") > 0 && player.hasCard(card => { return lib.filter.cardDiscardable(card, player, "fengshi"); }, "he") ); }) .set("ai", target => { const player = get.event("player"); const card = get.event().getTrigger().card; if (!get.info("dcmffengshi").check({ card: card, target: target })) return 0; return get.effect(target, { name: "guohe_copy2" }, player, player); }); if (bool) { const target = targets[0]; player.logSkill("fengshi", target); await player.chooseToDiscard("he", true); await player.discardPlayerCard(target, "he", true); if (get.tag(trigger.card, "damage")) { var id = target.playerid; var map = trigger.getParent().customArgs; if (!map[id]) map[id] = {}; if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; map[id].extraDamage++; } } }, group: "fengshi_target", subSkill: { target: { inherit: "dcmffengshi", trigger: { target: "useCardToTargeted" }, filter(event, player) { if (event.player == event.target) return false; return ( event.player.countCards("h") > player.countCards("h") && event.player.countCards("he") > 0 && player.hasCard(card => { return lib.filter.cardDiscardable(card, player, "fengshi"); }, "he") ); }, async content(event, trigger, player) { const target = trigger.player; await player.chooseToDiscard("he", true); await player.discardPlayerCard(target, "he", true); if (get.tag(trigger.card, "damage")) { var id = player.playerid; var map = trigger.getParent().customArgs; if (!map[id]) map[id] = {}; if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; map[id].extraDamage++; } }, }, }, }, dcmffengshi: { audio: "mffengshi", audioname: ["sp_mifangfushiren"], trigger: { player: "useCardToPlayered", target: "useCardToTargeted", }, filter: function (event, player, name) { if (event.player == event.target || event.targets.length != 1) return false; return ( event.player.countCards("h") > event.target.countCards("h") && event.target.countCards("he") > 0 && player.hasCard(function (card) { return lib.filter.cardDiscardable(card, player, "dcmffengshi"); }, "he") ); }, logTarget: function (event, player) { return player == event.player ? event.target : event.player; }, prompt2: function (event, player) { var target = lib.skill.dcmffengshi.logTarget(event, player); return "弃置你与" + get.translation(target) + "的各一张牌,然后令" + get.translation(event.card) + "的伤害+1"; }, check: function (event, player) { var viewer = player, player = event.player, target = event.target; if (viewer == player) { if (get.attitude(viewer, target) >= 0) return false; if (player.countCards("he", card => get.value(card, player) < 5)) return true; var card = get.event().getTrigger().card; if ((get.tag(card, "damage") || target.countCards("he", card => get.value(card, target) > 6)) && player.countCards("he", card => get.value(card, player) < 7)) return true; return false; } else { if (get.attitude(viewer, player) >= 0) return false; if (!get.tag(card, "damage")) return false; if (viewer.countCards("he") > player.countCards("he")) return true; if (viewer.countCards("he", card => get.value(card, target) > 6)) return false; return true; } }, content: function () { if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; var target = lib.skill.dcmffengshi.logTarget(trigger, player); player.chooseToDiscard("he", true); player.discardPlayerCard(target, "he", true); }, }, mffengshi: { audio: 2, audioname: ["sp_mifangfushiren"], trigger: { player: "useCardToPlayered", target: "useCardToTargeted", }, direct: true, preHidden: true, filter: function (event, player) { if (event.player == event.target || event.targets.length != 1) return false; if (player != event.player && !player.hasSkill("mffengshi")) return false; return event.player.countCards("h") > event.target.countCards("h") && event.target.countCards("he") > 0; }, content: function () { "step 0"; event.source = trigger.player; event.target = player == trigger.target ? trigger.player : trigger.target; var str; if (player == trigger.player) str = "弃置自己的和该角色"; else str = "令其弃置其与你的"; var next = trigger.player.chooseBool("是否对" + get.translation(trigger.target) + "发动【锋势】?", str + "的各一张牌,然后令" + get.translation(trigger.card) + "的伤害+1").set("ai", function () { var player = _status.event.getParent().player; var target = _status.event.getParent().target; var viewer = _status.event.player; if (viewer == player) { if (get.attitude(viewer, target) >= 0) return false; if (player.countCards("he", card => get.value(card, player) < 5)) return true; var card = _status.event.getTrigger().card; if ((get.tag(card, "damage") || target.countCards("he", card => get.value(card, target) > 6)) && player.countCards("he", card => get.value(card, player) < 7)) return true; return false; } else { if (get.attitude(viewer, player) >= 0) return false; if (!get.tag(card, "damage")) return false; if (viewer.countCards("he") > player.countCards("he")) return true; if (viewer.countCards("he", card => get.value(card, target) > 6)) return false; return true; } }); if (player == next.player) next.setHiddenSkill("mffengshi"); "step 1"; if (result.bool) { if (player == source) player.logSkill("mffengshi", target); else { player.logSkill("mffengshi"); source.line(player, "green"); } if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; player.chooseToDiscard("he", true); } else event.finish(); "step 2"; if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, "he", true); }, }, }; export default skills;