1240 lines
35 KiB
JavaScript
1240 lines
35 KiB
JavaScript
import { lib, game, ui, get, ai, _status } from "../noname.js";
|
||
game.import("card", function () {
|
||
return {
|
||
name: "extra",
|
||
connect: true,
|
||
card: {
|
||
muniu: {
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip5",
|
||
nomod: true,
|
||
onEquip: function () {
|
||
if (card && card.cards && card.cards.length) {
|
||
player.directgains(card.cards, null, "muniu");
|
||
}
|
||
player.markSkill("muniu_skill");
|
||
},
|
||
forceDie: true,
|
||
onLose: function () {
|
||
delete player.getStat("skill").muniu_skill;
|
||
player.unmarkSkill("muniu_skill");
|
||
if (!card || !card.cards || !card.cards.length) return;
|
||
if (
|
||
(!event.getParent(2) || event.getParent(2).name != "swapEquip") &&
|
||
(event.getParent().type != "equip" || event.getParent().swapEquip)
|
||
) {
|
||
player.lose(card.cards, ui.discardPile);
|
||
player.$throw(card.cards, 1000);
|
||
player.popup("muniu");
|
||
game.log(card, "掉落了", card.cards);
|
||
card.cards.length = 0;
|
||
} else {
|
||
player.lose(card.cards, ui.special);
|
||
}
|
||
},
|
||
clearLose: true,
|
||
equipDelay: false,
|
||
loseDelay: false,
|
||
skills: ["muniu_skill", "muniu_skill7"],
|
||
ai: {
|
||
equipValue: function (card) {
|
||
if (card.card) return 7 + card.card.length;
|
||
return 7;
|
||
},
|
||
basic: {
|
||
equipValue: 7,
|
||
},
|
||
},
|
||
},
|
||
jiu: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "basic",
|
||
toself: true,
|
||
enable: function (event, player) {
|
||
//return !player.hasSkill('jiu');
|
||
return true;
|
||
},
|
||
lianheng: true,
|
||
logv: false,
|
||
savable: function (card, player, dying) {
|
||
return dying == player || player.hasSkillTag("jiuOther", null, dying, true);
|
||
},
|
||
usable: 1,
|
||
selectTarget: -1,
|
||
modTarget: true,
|
||
filterTarget: function (card, player, target) {
|
||
return target == player;
|
||
},
|
||
content: function () {
|
||
if (typeof event.baseDamage != "number") event.baseDamage = 1;
|
||
if (target.isDying() || event.getParent(2).type == "dying") {
|
||
target.recover();
|
||
if (_status.currentPhase == target) {
|
||
target.getStat().card.jiu--;
|
||
}
|
||
} else {
|
||
game.addVideo("jiuNode", target, true);
|
||
if (cards && cards.length) {
|
||
card = cards[0];
|
||
}
|
||
if (!target.storage.jiu) target.storage.jiu = 0;
|
||
target.storage.jiu += event.baseDamage;
|
||
game.broadcastAll(
|
||
function (target, card, gain2) {
|
||
target.addSkill("jiu");
|
||
if (!target.node.jiu && lib.config.jiu_effect) {
|
||
target.node.jiu = ui.create.div(".playerjiu", target.node.avatar);
|
||
target.node.jiu2 = ui.create.div(".playerjiu", target.node.avatar2);
|
||
}
|
||
if (
|
||
gain2 &&
|
||
card.clone &&
|
||
(card.clone.parentNode == target.parentNode ||
|
||
card.clone.parentNode == ui.arena)
|
||
) {
|
||
card.clone.moveDelete(target);
|
||
}
|
||
},
|
||
target,
|
||
card,
|
||
target == targets[0] && cards.length == 1
|
||
);
|
||
if (target == targets[0] && cards.length == 1) {
|
||
if (
|
||
card.clone &&
|
||
(card.clone.parentNode == target.parentNode ||
|
||
card.clone.parentNode == ui.arena)
|
||
) {
|
||
game.addVideo("gain2", target, get.cardsInfo([card]));
|
||
}
|
||
}
|
||
}
|
||
},
|
||
ai: {
|
||
basic: {
|
||
useful: (card, i) => {
|
||
if (_status.event.player.hp > 1) {
|
||
if (i === 0) return 4;
|
||
return 1;
|
||
}
|
||
if (i === 0) return 7.3;
|
||
return 3;
|
||
},
|
||
value: (card, player, i) => {
|
||
if (player.hp > 1) {
|
||
if (i === 0) return 5;
|
||
return 1;
|
||
}
|
||
if (i === 0) return 7.3;
|
||
return 3;
|
||
},
|
||
},
|
||
order: () => {
|
||
if (_status.event.dying) return 9;
|
||
let sha = get.order({ name: "sha" });
|
||
if (sha > 0) return sha + 0.2;
|
||
return 0;
|
||
},
|
||
result: {
|
||
target: (player, target, card) => {
|
||
if (target && target.isDying()) return 2;
|
||
if (!target || target._jiu_temp || !target.isPhaseUsing()) return 0;
|
||
let usable = target.getCardUsable("sha");
|
||
if (
|
||
!usable ||
|
||
(lib.config.mode === "stone" &&
|
||
!player.isMin() &&
|
||
player.getActCount() + 1 >= player.actcount) ||
|
||
!target.mayHaveSha(player, "use", card)
|
||
)
|
||
return 0;
|
||
let effs = { order: 0 },
|
||
temp;
|
||
target.getCards("hs", (i) => {
|
||
if (get.name(i) !== "sha" || ui.selected.cards.includes(i)) return false;
|
||
temp = get.order(i, target);
|
||
if (temp < effs.order) return false;
|
||
if (temp > effs.order) effs = { order: temp };
|
||
effs[i.cardid] = {
|
||
card: i,
|
||
target: null,
|
||
eff: 0,
|
||
};
|
||
});
|
||
delete effs.order;
|
||
for (let i in effs) {
|
||
if (!lib.filter.filterCard(effs[i].card, target)) continue;
|
||
game.filterPlayer((current) => {
|
||
if (
|
||
get.attitude(target, current) >= 0 ||
|
||
!target.canUse(effs[i].card, current, null, true) ||
|
||
current.hasSkillTag("filterDamage", null, {
|
||
player: target,
|
||
card: effs[i].card,
|
||
jiu: true,
|
||
})
|
||
)
|
||
return false;
|
||
temp = get.effect(current, effs[i].card, target, player);
|
||
if (temp <= effs[i].eff) return false;
|
||
effs[i].target = current;
|
||
effs[i].eff = temp;
|
||
return false;
|
||
});
|
||
if (!effs[i].target) continue;
|
||
if (
|
||
target.hasSkillTag(
|
||
"directHit_ai",
|
||
true,
|
||
{
|
||
target: effs[i].target,
|
||
card: i,
|
||
},
|
||
true
|
||
) ||
|
||
(usable === 1 &&
|
||
(target.needsToDiscard() > Math.max(0, 3 - target.hp) ||
|
||
!effs[i].target.mayHaveShan(
|
||
player,
|
||
"use",
|
||
effs[i].target.getCards((i) => {
|
||
return i.hasGaintag("sha_notshan");
|
||
})
|
||
)))
|
||
) {
|
||
delete target._jiu_temp;
|
||
return 1;
|
||
}
|
||
}
|
||
delete target._jiu_temp;
|
||
return 0;
|
||
},
|
||
},
|
||
tag: {
|
||
save: 1,
|
||
recover: 0.1,
|
||
},
|
||
},
|
||
},
|
||
huogong: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "trick",
|
||
enable: true,
|
||
//cardnature:'fire',
|
||
filterTarget: function (card, player, target) {
|
||
//if(player!=game.me&&player.countCards('h')<2) return false;
|
||
return target.countCards("h") > 0;
|
||
},
|
||
content: function () {
|
||
"step 0";
|
||
if (target.countCards("h") == 0) {
|
||
event.finish();
|
||
return;
|
||
} else if (target.countCards("h") == 1) event._result = { cards: target.getCards("h") };
|
||
else
|
||
target.chooseCard(true).ai = function (card) {
|
||
if (_status.event.getRand() < 0.5) return Math.random();
|
||
return get.value(card);
|
||
};
|
||
"step 1";
|
||
target.showCards(result.cards).setContent(function () {});
|
||
event.dialog = ui.create.dialog(get.translation(target) + "展示的手牌", result.cards);
|
||
event.videoId = lib.status.videoId++;
|
||
|
||
game.broadcast(
|
||
"createDialog",
|
||
event.videoId,
|
||
get.translation(target) + "展示的手牌",
|
||
result.cards
|
||
);
|
||
game.addVideo("cardDialog", null, [
|
||
get.translation(target) + "展示的手牌",
|
||
get.cardsInfo(result.cards),
|
||
event.videoId,
|
||
]);
|
||
event.card2 = result.cards[0];
|
||
game.log(target, "展示了", event.card2);
|
||
game.addCardKnower(result.cards, "everyone");
|
||
event._result = {};
|
||
player
|
||
.chooseToDiscard({ suit: get.suit(event.card2) }, function (card) {
|
||
var evt = _status.event.getParent();
|
||
if (get.damageEffect(evt.target, evt.player, evt.player, "fire") > 0) {
|
||
return 6.2 + Math.min(4, evt.player.hp) - get.value(card, evt.player);
|
||
}
|
||
return -1;
|
||
})
|
||
.set("prompt", false);
|
||
game.delay(2);
|
||
"step 2";
|
||
if (result.bool) {
|
||
target.damage("fire");
|
||
} else {
|
||
target.addTempSkill("huogong2");
|
||
}
|
||
event.dialog.close();
|
||
game.addVideo("cardDialog", null, event.videoId);
|
||
game.broadcast("closeDialog", event.videoId);
|
||
},
|
||
ai: {
|
||
basic: {
|
||
order: 9.2,
|
||
value: [3, 1],
|
||
useful: 0.6,
|
||
},
|
||
wuxie: function (target, card, player, viewer, status) {
|
||
if (get.attitude(viewer, player._trueMe || player) > 0) return 0;
|
||
if (
|
||
status *
|
||
get.attitude(viewer, target) *
|
||
get.effect(target, card, player, target) >=
|
||
0
|
||
)
|
||
return 0;
|
||
if (_status.event.getRand("huogong_wuxie") * 4 > player.countCards("h")) return 0;
|
||
},
|
||
result: {
|
||
player: function (player) {
|
||
var nh = player.countCards("h");
|
||
if (nh <= player.hp && nh <= 4 && _status.event.name == "chooseToUse") {
|
||
if (
|
||
typeof _status.event.filterCard == "function" &&
|
||
_status.event.filterCard(
|
||
new lib.element.VCard({ name: "huogong" }),
|
||
player,
|
||
_status.event
|
||
)
|
||
) {
|
||
return -10;
|
||
}
|
||
if (_status.event.skill) {
|
||
var viewAs = get.info(_status.event.skill).viewAs;
|
||
if (viewAs == "huogong") return -10;
|
||
if (viewAs && viewAs.name == "huogong") return -10;
|
||
}
|
||
}
|
||
return 0;
|
||
},
|
||
target: function (player, target) {
|
||
if (target.hasSkill("huogong2") || target.countCards("h") == 0) return 0;
|
||
if (player.countCards("h") <= 1) return 0;
|
||
if (_status.event.player == player) {
|
||
if (target.isAllCardsKnown(player)) {
|
||
if (
|
||
!target.countCards("h", (card) => {
|
||
return player.countCards("h", (card2) => {
|
||
return get.suit(card2) == get.suit(card);
|
||
});
|
||
})
|
||
) {
|
||
return 0;
|
||
}
|
||
}
|
||
}
|
||
if (target == player) {
|
||
if (
|
||
typeof _status.event.filterCard == "function" &&
|
||
_status.event.filterCard(
|
||
new lib.element.VCard({ name: "huogong" }),
|
||
player,
|
||
_status.event
|
||
)
|
||
) {
|
||
return -1.15;
|
||
}
|
||
if (_status.event.skill) {
|
||
var viewAs = get.info(_status.event.skill).viewAs;
|
||
if (viewAs == "huogong") return -1.15;
|
||
if (viewAs && viewAs.name == "huogong") return -1.15;
|
||
}
|
||
return 0;
|
||
}
|
||
return -1.15;
|
||
},
|
||
},
|
||
tag: {
|
||
damage: 1,
|
||
fireDamage: 1,
|
||
natureDamage: 1,
|
||
norepeat: 1,
|
||
},
|
||
},
|
||
},
|
||
tiesuo: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "trick",
|
||
enable: true,
|
||
filterTarget: true,
|
||
selectTarget: [1, 2],
|
||
complexTarget: true,
|
||
content: function () {
|
||
target.link();
|
||
},
|
||
recastable: true,
|
||
ai: {
|
||
wuxie: (target, card, player, viewer, status) => {
|
||
if (
|
||
status * get.attitude(viewer, player._trueMe || player) > 0 ||
|
||
target.hasSkillTag("nodamage") ||
|
||
target.hasSkillTag("nofire") ||
|
||
target.hasSkillTag("nothunder") ||
|
||
get.attitude(viewer, player) > 0 ||
|
||
(1 + target.countCards("hs")) * _status.event.getRand() > 1.57
|
||
)
|
||
return 0;
|
||
},
|
||
basic: {
|
||
order: 7.3,
|
||
useful: 1.2,
|
||
value: 4,
|
||
},
|
||
result: {
|
||
target: (player, target) => {
|
||
if (target.hasSkillTag("link")) return 0;
|
||
let curs = game.filterPlayer((current) => {
|
||
if (current.hasSkillTag("nodamage")) return false;
|
||
return !current.hasSkillTag("nofire") || !current.hasSkillTag("nothunder");
|
||
});
|
||
if (curs.length < 2) return 0;
|
||
let f = target.hasSkillTag("nofire"),
|
||
t = target.hasSkillTag("nothunder"),
|
||
res = 0.9;
|
||
if ((f && t) || target.hasSkillTag("nodamage")) return 0;
|
||
if (f || t) res = 0.45;
|
||
if (!f && target.getEquip("tengjia")) res *= 2;
|
||
if (!target.isLinked()) res = -res;
|
||
if (ui.selected.targets.length) return res;
|
||
let fs = 0,
|
||
es = 0,
|
||
att = get.attitude(player, target),
|
||
linkf = false,
|
||
alink = true;
|
||
curs.forEach((i) => {
|
||
let atti = get.attitude(player, i);
|
||
if (atti > 0) {
|
||
fs++;
|
||
if (i.isLinked()) linkf = true;
|
||
} else if (atti < 0) {
|
||
es++;
|
||
if (!i.isLinked()) alink = false;
|
||
}
|
||
});
|
||
if (es < 2 && !alink) {
|
||
if (att <= 0 || (att > 0 && linkf && fs < 2)) return 0;
|
||
}
|
||
return res;
|
||
},
|
||
},
|
||
tag: {
|
||
multitarget: 1,
|
||
multineg: 1,
|
||
norepeat: 1,
|
||
},
|
||
},
|
||
},
|
||
bingliang: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "delay",
|
||
range: { global: 1 },
|
||
filterTarget: function (card, player, target) {
|
||
return lib.filter.judge(card, player, target) && player != target;
|
||
},
|
||
judge: function (card) {
|
||
if (get.suit(card) == "club") return 1;
|
||
return -2;
|
||
},
|
||
judge2: function (result) {
|
||
if (result.bool == false) return true;
|
||
return false;
|
||
},
|
||
effect: function () {
|
||
if (result.bool == false) {
|
||
if (get.is.changban()) player.addTempSkill("bingliang_changban");
|
||
else player.skip("phaseDraw");
|
||
}
|
||
},
|
||
ai: {
|
||
basic: {
|
||
order: 1,
|
||
useful: 1,
|
||
value: 4,
|
||
},
|
||
result: {
|
||
target: function (player, target) {
|
||
if (target.hasJudge("caomu")) return 0;
|
||
return -2.7 / Math.sqrt(target.countCards("h") + 1);
|
||
},
|
||
},
|
||
tag: {
|
||
skip: "phaseDraw",
|
||
},
|
||
},
|
||
},
|
||
hualiu: {
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip3",
|
||
distance: { globalTo: 1 },
|
||
},
|
||
zhuque: {
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip1",
|
||
//cardnature:'fire',
|
||
distance: { attackFrom: -3 },
|
||
ai: {
|
||
basic: {
|
||
equipValue: 2,
|
||
},
|
||
},
|
||
skills: ["zhuque_skill"],
|
||
},
|
||
guding: {
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip1",
|
||
distance: { attackFrom: -1 },
|
||
ai: {
|
||
basic: {
|
||
equipValue: 2,
|
||
},
|
||
},
|
||
skills: ["guding_skill"],
|
||
},
|
||
tengjia: {
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip2",
|
||
//cardnature:'fire',
|
||
ai: {
|
||
value: function (card, player, index, method) {
|
||
if (player.isDisabled(2)) return 0.01;
|
||
if (player.getEquips("tengjia").includes(card)) {
|
||
if (player.hasSkillTag("noDirectDamage")) return 10;
|
||
if (
|
||
game.hasPlayer(function (current) {
|
||
return (
|
||
current != player &&
|
||
get.attitude(current, player) < 0 &&
|
||
current.hasSkillTag("fireAttack", null, null, true)
|
||
);
|
||
})
|
||
)
|
||
return 0;
|
||
return 6;
|
||
}
|
||
var value = 0;
|
||
var info = get.info(card);
|
||
var current = player.getEquip(info.subtype);
|
||
if (current && card != current) {
|
||
value = get.value(current, player);
|
||
}
|
||
var equipValue = info.ai.equipValue;
|
||
if (equipValue == undefined) {
|
||
equipValue = info.ai.basic.equipValue;
|
||
}
|
||
if (typeof equipValue == "function") {
|
||
if (method == "raw") return equipValue(card, player);
|
||
if (method == "raw2") return equipValue(card, player) - value;
|
||
return Math.max(0.1, equipValue(card, player) - value);
|
||
}
|
||
if (typeof equipValue != "number") equipValue = 0;
|
||
if (method == "raw") return equipValue;
|
||
if (method == "raw2") return equipValue - value;
|
||
return Math.max(0.1, equipValue - value);
|
||
},
|
||
equipValue: function (card, player) {
|
||
if (player._tengjiaEv_temp) return Math.max(1, 6 - player.hp);
|
||
if (player.hasSkillTag("maixie") && player.hp > 1) return 0;
|
||
if (player.hasSkillTag("noDirectDamage")) return 10;
|
||
player._tengjiaEv_temp = true;
|
||
let eff = get.damageEffect(player, player, player, "fire");
|
||
delete player._tengjiaEv_temp;
|
||
if (eff >= 0) return 10;
|
||
let num =
|
||
4 -
|
||
game.countPlayer(function (current) {
|
||
if (get.attitude(current, player) < 0) {
|
||
if (current.hasSkillTag("fireAttack", null, null, true)) return 3;
|
||
return 1;
|
||
}
|
||
return false;
|
||
});
|
||
if (player.hp == 1) num += 3;
|
||
if (player.hp == 2) num += 1;
|
||
return num;
|
||
},
|
||
basic: {
|
||
equipValue: 3,
|
||
},
|
||
},
|
||
skills: ["tengjia1", "tengjia2", "tengjia3"],
|
||
},
|
||
baiyin: {
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip2",
|
||
loseDelay: false,
|
||
onLose: function () {
|
||
player.addTempSkill("baiyin_skill_lose");
|
||
},
|
||
skills: ["baiyin_skill"],
|
||
tag: {
|
||
recover: 1,
|
||
},
|
||
ai: {
|
||
order: 9.5,
|
||
equipValue: function (card, player) {
|
||
if (player.hp == player.maxHp) return 5;
|
||
if (player.countCards("h", "baiyin")) return 6;
|
||
return 0;
|
||
},
|
||
basic: {
|
||
equipValue: 5,
|
||
},
|
||
},
|
||
},
|
||
},
|
||
skill: {
|
||
bingliang_changban: {
|
||
cardSkill: true,
|
||
unique: true,
|
||
trigger: { player: "phaseDrawBegin" },
|
||
silent: true,
|
||
content: function () {
|
||
trigger.num--;
|
||
},
|
||
group: "bingliang_changban2",
|
||
},
|
||
bingliang_changban2: {
|
||
cardSkill: true,
|
||
trigger: { player: "phaseDrawAfter" },
|
||
silent: true,
|
||
content: function () {
|
||
if (player.enemy) player.enemy.draw();
|
||
},
|
||
},
|
||
muniu_skill: {
|
||
equipSkill: true,
|
||
enable: "phaseUse",
|
||
usable: 1,
|
||
filterCard: true,
|
||
check: function (card) {
|
||
if (card.name == "du") return 20;
|
||
var player = _status.event.player;
|
||
var nh = player.countCards("h");
|
||
if (!player.needsToDiscard()) {
|
||
if (nh < 3) return 0;
|
||
if (nh == 3) return 5 - get.value(card);
|
||
return 7 - get.value(card);
|
||
}
|
||
return 10 - get.useful(card);
|
||
},
|
||
discard: false,
|
||
lose: false,
|
||
delay: false,
|
||
sync: function (muniu) {
|
||
if (game.online) {
|
||
return;
|
||
}
|
||
if (!muniu.cards) {
|
||
muniu.cards = [];
|
||
}
|
||
for (var i = 0; i < muniu.cards.length; i++) {
|
||
if (get.position(muniu.cards[i]) != "s") {
|
||
muniu.cards.splice(i--, 1);
|
||
}
|
||
}
|
||
game.broadcast(
|
||
function (muniu, cards) {
|
||
muniu.cards = cards;
|
||
},
|
||
muniu,
|
||
muniu.cards
|
||
);
|
||
},
|
||
filter: function (event, player) {
|
||
return player.countCards("h") > 0;
|
||
},
|
||
prepare: function (cards, player) {
|
||
player.$give(1, player, false);
|
||
},
|
||
content: function () {
|
||
"step 0";
|
||
player.loseToSpecial(cards, "muniu");
|
||
"step 1";
|
||
for (var i = 0; i < cards.length; i++) {
|
||
if (
|
||
cards[i]._selfDestroyed ||
|
||
!cards[i].hasGaintag("muniu") ||
|
||
get.position(cards[i]) != "s"
|
||
) {
|
||
cards[i].remove();
|
||
cards.splice(i--, 1);
|
||
}
|
||
}
|
||
var muniu = player.getEquip("muniu");
|
||
if (!muniu || !cards.length) {
|
||
for (var i = 0; i < cards.length; i++) {
|
||
cards[i].discard();
|
||
}
|
||
event.finish();
|
||
return;
|
||
}
|
||
if (muniu.cards == undefined) muniu.cards = [];
|
||
muniu.cards.push(cards[0]);
|
||
game.broadcast(
|
||
function (muniu, cards) {
|
||
muniu.cards = cards;
|
||
},
|
||
muniu,
|
||
muniu.cards
|
||
);
|
||
game.delayx();
|
||
"step 2";
|
||
var muniu = player.getEquip("muniu");
|
||
var players = game.filterPlayer(function (current) {
|
||
if (
|
||
current.canEquip(muniu) &&
|
||
current != player &&
|
||
!current.isTurnedOver() &&
|
||
get.attitude(player, current) >= 3 &&
|
||
get.attitude(current, player) >= 3
|
||
) {
|
||
return true;
|
||
}
|
||
});
|
||
players.sort(lib.sort.seat);
|
||
var choice = players[0];
|
||
var next = player
|
||
.chooseTarget("是否移动木牛流马?", function (card, player, target) {
|
||
return (
|
||
!target.isMin() && player != target && target.canEquip(_status.event.muniu)
|
||
);
|
||
})
|
||
.set("muniu", muniu);
|
||
next.set("ai", function (target) {
|
||
return target == _status.event.choice ? 1 : -1;
|
||
});
|
||
next.set("choice", choice);
|
||
"step 3";
|
||
if (result.bool) {
|
||
var card = player.getEquip("muniu");
|
||
result.targets[0].equip(card);
|
||
player.$give(card, result.targets[0]);
|
||
player.line(result.targets, "green");
|
||
game.delay();
|
||
} else {
|
||
player.updateMarks();
|
||
}
|
||
},
|
||
ai: {
|
||
order: 1,
|
||
expose: 0.1,
|
||
result: {
|
||
player: 1,
|
||
},
|
||
},
|
||
mod: {
|
||
cardEnabled2: function (card, player) {
|
||
if (!ui.selected.cards.length) return;
|
||
var muniu = player.getEquip("muniu");
|
||
if (!muniu || !muniu.cards || !muniu.cards.length) return;
|
||
for (var i of ui.selected.cards) {
|
||
if (i == muniu && muniu.cards.includes(card)) return false;
|
||
if (muniu.cards.includes(i) && card == muniu) return false;
|
||
}
|
||
},
|
||
},
|
||
mark: true,
|
||
markimage2: "image/card/muniu_small.png",
|
||
intro: {
|
||
content: function (storage, player) {
|
||
var muniu = player.getEquip("muniu");
|
||
if (!muniu || !muniu.cards || !muniu.cards.length) return "共有零张牌";
|
||
if (player.isUnderControl(true)) {
|
||
return get.translation(muniu.cards);
|
||
} else {
|
||
return "共有" + get.cnNumber(muniu.cards.length) + "张牌";
|
||
}
|
||
},
|
||
mark: function (dialog, storage, player) {
|
||
var muniu = player.getEquip("muniu");
|
||
if (!muniu || !muniu.cards || !muniu.cards.length) return "共有零张牌";
|
||
if (player.isUnderControl(true)) {
|
||
dialog.addAuto(muniu.cards);
|
||
} else {
|
||
return "共有" + get.cnNumber(muniu.cards.length) + "张牌";
|
||
}
|
||
},
|
||
markcount: function (storage, player) {
|
||
var muniu = player.getEquip("muniu");
|
||
if (muniu && muniu.cards) return muniu.cards.length;
|
||
return 0;
|
||
},
|
||
},
|
||
},
|
||
muniu_skill7: {
|
||
trigger: { player: "loseEnd" },
|
||
firstDo: true,
|
||
forced: true,
|
||
//silent:true,
|
||
filter: function (event, player) {
|
||
if (!event.ss || !event.ss.length || event.parent.name == "lose_muniu") return false;
|
||
var muniu = player.getEquip("muniu");
|
||
if (!muniu || !muniu.cards) return false;
|
||
return (
|
||
event.ss.filter(function (card) {
|
||
return muniu.cards.includes(card);
|
||
}).length > 0
|
||
);
|
||
},
|
||
content: function () {
|
||
var muniu = player.getEquip("muniu");
|
||
if (muniu && muniu.cards) {
|
||
muniu.cards.removeArray(trigger.ss);
|
||
lib.skill.muniu_skill.sync(muniu);
|
||
}
|
||
player.updateMarks();
|
||
},
|
||
},
|
||
huogong2: { charlotte: true },
|
||
jiu: {
|
||
trigger: { player: "useCard1" },
|
||
filter: function (event) {
|
||
return event.card && event.card.name == "sha";
|
||
},
|
||
forced: true,
|
||
charlotte: true,
|
||
firstDo: true,
|
||
content: function () {
|
||
if (!trigger.baseDamage) trigger.baseDamage = 1;
|
||
trigger.baseDamage += player.storage.jiu;
|
||
trigger.jiu = true;
|
||
trigger.jiu_add = player.storage.jiu;
|
||
game.addVideo("jiuNode", player, false);
|
||
game.broadcastAll(function (player) {
|
||
player.removeSkill("jiu");
|
||
}, player);
|
||
},
|
||
temp: true,
|
||
vanish: true,
|
||
silent: true,
|
||
popup: false,
|
||
nopop: true,
|
||
onremove: function (player) {
|
||
if (player.node.jiu) {
|
||
player.node.jiu.delete();
|
||
player.node.jiu2.delete();
|
||
delete player.node.jiu;
|
||
delete player.node.jiu2;
|
||
}
|
||
delete player.storage.jiu;
|
||
},
|
||
ai: {
|
||
damageBonus: true,
|
||
skillTagFilter: function (player, tag, arg) {
|
||
if (tag === "damageBonus") return arg && arg.card && arg.card.name === "sha";
|
||
},
|
||
},
|
||
group: "jiu2",
|
||
},
|
||
jiu2: {
|
||
trigger: { player: "useCardAfter", global: "phaseAfter" },
|
||
priority: 2,
|
||
firstDo: true,
|
||
charlotte: true,
|
||
filter: function (event, player) {
|
||
if (player.hasSkillTag("jiuSustain", null, event.name)) return false;
|
||
if (event.name == "useCard") return event.card && event.card.name == "sha";
|
||
return true;
|
||
},
|
||
forced: true,
|
||
popup: false,
|
||
audio: false,
|
||
content: function () {
|
||
game.broadcastAll(function (player) {
|
||
player.removeSkill("jiu");
|
||
}, player);
|
||
game.addVideo("jiuNode", player, false);
|
||
},
|
||
},
|
||
guding_skill: {
|
||
equipSkill: true,
|
||
audio: true,
|
||
trigger: { source: "damageBegin1" },
|
||
filter: function (event) {
|
||
if (event.parent.name == "_lianhuan" || event.parent.name == "_lianhuan2") return false;
|
||
if (event.card && event.card.name == "sha") {
|
||
if (event.player.countCards("h") == 0) return true;
|
||
}
|
||
return false;
|
||
},
|
||
forced: true,
|
||
content: function () {
|
||
trigger.num++;
|
||
},
|
||
ai: {
|
||
effect: {
|
||
player: function (card, player, target, current, isLink) {
|
||
if (
|
||
card.name == "sha" &&
|
||
!isLink &&
|
||
target.countCards("h") == 0 &&
|
||
!target.hasSkillTag("filterDamage", null, {
|
||
player: player,
|
||
card: card,
|
||
})
|
||
)
|
||
return [1, 0, 1, -3];
|
||
},
|
||
},
|
||
},
|
||
},
|
||
tengjia1: {
|
||
equipSkill: true,
|
||
trigger: { target: ["useCardToBefore"] },
|
||
forced: true,
|
||
priority: 6,
|
||
audio: true,
|
||
filter: function (event, player) {
|
||
if (player.hasSkillTag("unequip2")) return false;
|
||
if (
|
||
event.player.hasSkillTag("unequip", false, {
|
||
name: event.card ? event.card.name : null,
|
||
target: player,
|
||
card: event.card,
|
||
})
|
||
)
|
||
return false;
|
||
if (event.card.name == "nanman") return true;
|
||
if (event.card.name == "wanjian") return true;
|
||
//if(event.card.name=='chuqibuyi') return true;
|
||
return false;
|
||
},
|
||
content: function () {
|
||
trigger.cancel();
|
||
},
|
||
ai: {
|
||
effect: {
|
||
target: function (card, player, target, current) {
|
||
if (target.hasSkillTag("unequip2")) return;
|
||
if (
|
||
player.hasSkillTag("unequip", false, {
|
||
name: card ? card.name : null,
|
||
target: target,
|
||
card: card,
|
||
}) ||
|
||
player.hasSkillTag("unequip_ai", false, {
|
||
name: card ? card.name : null,
|
||
target: target,
|
||
card: card,
|
||
})
|
||
)
|
||
return;
|
||
//if(card.name=='nanman'||card.name=='wanjian'||card.name=='chuqibuyi') return 'zerotarget';
|
||
if (card.name == "nanman" || card.name == "wanjian") return "zerotarget";
|
||
if (card.name == "sha") {
|
||
var equip1 = player.getEquip("zhuque");
|
||
if (equip1 && equip1.name == "zhuque") return 1.9;
|
||
if (!game.hasNature(card)) return "zerotarget";
|
||
}
|
||
},
|
||
},
|
||
},
|
||
},
|
||
tengjia2: {
|
||
equipSkill: true,
|
||
trigger: { player: "damageBegin3" },
|
||
filter: function (event, player) {
|
||
if (!event.hasNature("fire")) return false;
|
||
if (player.hasSkillTag("unequip2")) return false;
|
||
if (
|
||
event.source &&
|
||
event.source.hasSkillTag("unequip", false, {
|
||
name: event.card ? event.card.name : null,
|
||
target: player,
|
||
card: event.card,
|
||
})
|
||
)
|
||
return false;
|
||
return true;
|
||
},
|
||
audio: true,
|
||
forced: true,
|
||
content: function () {
|
||
trigger.num++;
|
||
},
|
||
ai: {
|
||
fireAttack: true,
|
||
effect: {
|
||
target: function (card, player, target, current) {
|
||
if (card.name == "sha") {
|
||
if (game.hasNature(card, "fire")) return 2;
|
||
if (player.hasSkill("zhuque_skill")) return 1.9;
|
||
}
|
||
if (get.tag(card, "fireDamage") && current < 0) return 2;
|
||
},
|
||
},
|
||
},
|
||
},
|
||
tengjia3: {
|
||
equipSkill: true,
|
||
audio: "tengjia1",
|
||
trigger: { target: "shaBefore" },
|
||
forced: true,
|
||
filter: function (event, player) {
|
||
if (player.hasSkillTag("unequip2")) return false;
|
||
if (
|
||
event.player.hasSkillTag("unequip", false, {
|
||
name: event.card ? event.card.name : null,
|
||
target: player,
|
||
card: event.card,
|
||
})
|
||
)
|
||
return false;
|
||
if (event.card.name == "sha" && !game.hasNature(event.card)) return true;
|
||
return false;
|
||
},
|
||
content: function () {
|
||
trigger.cancel();
|
||
},
|
||
},
|
||
baiyin_skill: {
|
||
equipSkill: true,
|
||
trigger: { player: "damageBegin4" },
|
||
forced: true,
|
||
audio: true,
|
||
filter: function (event, player) {
|
||
if (event.num <= 1) return false;
|
||
if (player.hasSkillTag("unequip2")) return false;
|
||
if (
|
||
event.source &&
|
||
event.source.hasSkillTag("unequip", false, {
|
||
name: event.card ? event.card.name : null,
|
||
target: player,
|
||
card: event.card,
|
||
})
|
||
)
|
||
return false;
|
||
return true;
|
||
},
|
||
//priority:-10,
|
||
content: function () {
|
||
trigger.num = 1;
|
||
},
|
||
subSkill: {
|
||
lose: {
|
||
audio: "baiyin_skill",
|
||
forced: true,
|
||
charlotte: true,
|
||
equipSkill: true,
|
||
trigger: {
|
||
player: "loseAfter",
|
||
global: [
|
||
"equipAfter",
|
||
"addJudgeAfter",
|
||
"gainAfter",
|
||
"loseAsyncAfter",
|
||
"addToExpansionAfter",
|
||
],
|
||
},
|
||
filter: (event, player) => {
|
||
if (player.isHealthy() || player.hasSkillTag("unequip2")) return false;
|
||
var evt = event.getl(player);
|
||
return evt && evt.es.some((card) => card.name == "baiyin");
|
||
},
|
||
content: function () {
|
||
var evt = trigger.getl(player);
|
||
evt.es.forEach((card) => {
|
||
if (card.name == "baiyin") {
|
||
player.recover();
|
||
}
|
||
});
|
||
},
|
||
},
|
||
},
|
||
ai: {
|
||
filterDamage: true,
|
||
skillTagFilter: function (player, tag, arg) {
|
||
if (player.hasSkillTag("unequip2")) return false;
|
||
if (arg && arg.player) {
|
||
if (
|
||
arg.player.hasSkillTag("unequip", false, {
|
||
name: arg.card ? arg.card.name : null,
|
||
target: player,
|
||
card: arg.card,
|
||
})
|
||
)
|
||
return false;
|
||
if (
|
||
arg.player.hasSkillTag("unequip_ai", false, {
|
||
name: arg.card ? arg.card.name : null,
|
||
target: player,
|
||
card: arg.card,
|
||
})
|
||
)
|
||
return false;
|
||
if (arg.player.hasSkillTag("jueqing", false, player)) return false;
|
||
}
|
||
},
|
||
},
|
||
},
|
||
zhuque_skill: {
|
||
equipSkill: true,
|
||
trigger: { player: "useCard1" },
|
||
//priority:7,
|
||
filter: function (event, player) {
|
||
if (event.card.name == "sha" && !game.hasNature(event.card)) return true;
|
||
},
|
||
audio: true,
|
||
check: function (event, player) {
|
||
var eff = 0;
|
||
for (var i = 0; i < event.targets.length; i++) {
|
||
var target = event.targets[i];
|
||
var eff1 = get.damageEffect(target, player, player);
|
||
var eff2 = get.damageEffect(target, player, player, "fire");
|
||
eff += eff2;
|
||
eff -= eff1;
|
||
}
|
||
return eff >= 0;
|
||
},
|
||
prompt2: function (event, player) {
|
||
return "将" + get.translation(event.card) + "改为火属性";
|
||
},
|
||
content: function () {
|
||
game.setNature(trigger.card, "fire");
|
||
if (get.itemtype(trigger.card) == "card") {
|
||
var next = game.createEvent("zhuque_clear");
|
||
next.card = trigger.card;
|
||
event.next.remove(next);
|
||
trigger.after.push(next);
|
||
next.setContent(function () {
|
||
game.setNature(trigger.card, []);
|
||
});
|
||
}
|
||
},
|
||
},
|
||
zhuque_skill2: {
|
||
trigger: { player: "useCardAfter" },
|
||
forced: true,
|
||
popup: false,
|
||
content: function () {
|
||
delete player.storage.zhuque_skill.nature;
|
||
},
|
||
},
|
||
huogon2: {},
|
||
},
|
||
translate: {
|
||
jiu: "酒",
|
||
jiu_info:
|
||
"①每回合限一次。出牌阶段,对你自己使用。本回合目标角色使用的下一张【杀】的伤害值基数+1。②当你处于濒死状态时,对你自己使用。目标角色回复1点体力。",
|
||
huogong: "火攻",
|
||
tiesuo: "铁索连环",
|
||
tiesuo_info: "此牌可被重铸。出牌阶段,对至多两名角色使用。目标角色横置。",
|
||
huogong_bg: "攻",
|
||
huogong_info:
|
||
"出牌阶段,对一名有手牌的角色使用。目标角色展示一张手牌A,然后你可以弃置一张与A花色相同的手牌,对目标造成1点火属性伤害。",
|
||
tiesuo_bg: "索",
|
||
bingliang: "兵粮寸断",
|
||
hualiu: "骅骝",
|
||
zhuque: "朱雀羽扇",
|
||
bingliang_bg: "粮",
|
||
bingliang_info:
|
||
"出牌阶段,对一名距离为1的其他角色使用。目标角色于其判定阶段进行判定:若判定结果不为梅花,则其跳过下一个摸牌阶段。",
|
||
hualiu_bg: "+马",
|
||
hualiu_info: "锁定技,其他角色计算与你的距离+1。",
|
||
zhuque_bg: "扇",
|
||
zhuque_skill: "朱雀羽扇",
|
||
zhuque_info: "当你声明使用普【杀】后,你可以为此【杀】赋予火属性。",
|
||
guding: "古锭刀",
|
||
guding_info: "锁定技,当你因执行【杀】的效果而对目标角色造成伤害时,若其没有手牌,则此伤害+1。",
|
||
guding_skill: "古锭刀",
|
||
tengjia: "藤甲",
|
||
//tengjia_info:'锁定技,【南蛮入侵】、【万箭齐发】、【出其不意】和普通【杀】对你无效。当你受到火焰伤害时,该伤害+1。',
|
||
tengjia_info:
|
||
"锁定技。①【南蛮入侵】、【万箭齐发】和普【杀】对你无效。②当你受到火属性伤害时,此伤害+1。",
|
||
tengjia1: "藤甲",
|
||
tengjia2: "藤甲",
|
||
tengjia3: "藤甲",
|
||
baiyin: "白银狮子",
|
||
baiyin_info:
|
||
"锁定技。①当你受到伤害时,若此伤害大于1,则你将伤害值扣减至1点。②当你失去装备区内的【白银狮子】后,你回复1点体力。",
|
||
baiyin_skill: "白银狮子",
|
||
|
||
muniu: "木牛流马",
|
||
muniu_bg: "牛",
|
||
muniu_skill: "木牛",
|
||
muniu_skill7: "木牛流马",
|
||
muniu_skill_bg: "辎",
|
||
muniu_info:
|
||
"①出牌阶段限一次,你可以将一张手牌扣置于你装备区里的【木牛流马】下,然后你可以将【木牛流马】移动到一名其他角色的装备区里。②你可以将【木牛流马】下的牌如手牌般使用或打出。③当你失去装备区的【木牛流马】后,你刷新〖木牛流马①〗的使用次数限制。若此牌不是因置入其他角色的装备区而失去的,则你将【木牛流马】下的所有牌置入弃牌堆。",
|
||
muniu_skill_info:
|
||
"将一张手牌扣置于你装备区里的【木牛流马】下,然后可以将此装备移动到一名其他角色的装备区里。",
|
||
},
|
||
list: [
|
||
["heart", 4, "sha", "fire"],
|
||
["heart", 7, "sha", "fire"],
|
||
["heart", 10, "sha", "fire"],
|
||
["diamond", 4, "sha", "fire"],
|
||
["diamond", 5, "sha", "fire"],
|
||
["spade", 4, "sha", "thunder"],
|
||
["spade", 5, "sha", "thunder"],
|
||
["spade", 6, "sha", "thunder"],
|
||
["spade", 7, "sha", "thunder"],
|
||
["spade", 8, "sha", "thunder"],
|
||
["club", 5, "sha", "thunder"],
|
||
["club", 6, "sha", "thunder"],
|
||
["club", 7, "sha", "thunder"],
|
||
["club", 8, "sha", "thunder"],
|
||
["heart", 8, "shan"],
|
||
["heart", 9, "shan"],
|
||
["heart", 11, "shan"],
|
||
["heart", 12, "shan"],
|
||
["diamond", 6, "shan"],
|
||
["diamond", 7, "shan"],
|
||
["diamond", 8, "shan"],
|
||
["diamond", 10, "shan"],
|
||
["diamond", 11, "shan"],
|
||
["heart", 5, "tao"],
|
||
["heart", 6, "tao"],
|
||
["diamond", 2, "tao"],
|
||
["diamond", 3, "tao"],
|
||
["diamond", 9, "jiu"],
|
||
["spade", 3, "jiu"],
|
||
["spade", 9, "jiu"],
|
||
["club", 3, "jiu"],
|
||
["club", 9, "jiu"],
|
||
|
||
["diamond", 13, "hualiu"],
|
||
["club", 1, "baiyin"],
|
||
["spade", 2, "tengjia"],
|
||
["club", 2, "tengjia"],
|
||
["spade", 1, "guding"],
|
||
["diamond", 1, "zhuque"],
|
||
|
||
["heart", 2, "huogong"],
|
||
["heart", 3, "huogong"],
|
||
["diamond", 12, "huogong"],
|
||
["spade", 11, "tiesuo"],
|
||
["spade", 12, "tiesuo"],
|
||
["club", 10, "tiesuo"],
|
||
["club", 11, "tiesuo"],
|
||
["club", 12, "tiesuo"],
|
||
["club", 13, "tiesuo"],
|
||
["heart", 1, "wuxie"],
|
||
["heart", 13, "wuxie"],
|
||
["spade", 13, "wuxie"],
|
||
["spade", 10, "bingliang"],
|
||
["club", 4, "bingliang"],
|
||
|
||
["diamond", 5, "muniu"],
|
||
],
|
||
};
|
||
});
|