719 lines
19 KiB
JavaScript
719 lines
19 KiB
JavaScript
import { lib, game, ui, get, ai, _status } from "../noname.js";
|
||
game.import("card", function () {
|
||
return {
|
||
name: "sp",
|
||
connect: true,
|
||
card: {
|
||
jinchan: {
|
||
audio: true,
|
||
fullskin: true,
|
||
wuxieable: true,
|
||
type: "trick",
|
||
notarget: true,
|
||
global: ["g_jinchan", "g_jinchan2"],
|
||
content: function () {
|
||
var evt = event.getParent(3)._trigger;
|
||
if (evt.jinchan) {
|
||
var type = get.type(evt.card, "trick");
|
||
if (type == "basic" || type == "trick") {
|
||
evt.neutralize();
|
||
}
|
||
}
|
||
player.draw(2);
|
||
},
|
||
ai: {
|
||
useful: function () {
|
||
var player = _status.event.player;
|
||
var nj = player.countCards("h", "jinchan");
|
||
var num = player.getHandcardLimit();
|
||
if (nj >= num) {
|
||
return 10;
|
||
}
|
||
if (nj == num - 1) {
|
||
return 6;
|
||
}
|
||
return 1;
|
||
},
|
||
result: {
|
||
player: 1,
|
||
},
|
||
value: 5,
|
||
},
|
||
},
|
||
qijia: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "trick",
|
||
enable: true,
|
||
filterTarget: function (card, player, target) {
|
||
if (target == player) return false;
|
||
if (target.getEquips(5).length) {
|
||
return target.countCards("e") > 1;
|
||
} else {
|
||
return target.countCards("e") > 0;
|
||
}
|
||
},
|
||
content: function () {
|
||
"step 0";
|
||
var e1 = [],
|
||
e2 = [];
|
||
var he = target.getCards("he");
|
||
for (var i = 0; i < he.length; i++) {
|
||
if (get.type(he[i]) == "equip") {
|
||
var subtype = get.subtype(he[i]);
|
||
if (subtype == "equip1" || subtype == "equip4") {
|
||
e1.push(he[i]);
|
||
} else if (subtype == "equip2" || subtype == "equip3") {
|
||
e2.push(he[i]);
|
||
}
|
||
}
|
||
}
|
||
if (e1.length && e2.length) {
|
||
var choice = 0;
|
||
if (e1.length > e2.length || (target.hp >= 3 && Math.random() < 0.3)) {
|
||
choice = 1;
|
||
}
|
||
event.e1 = e1;
|
||
event.e2 = e2;
|
||
target
|
||
.chooseControl(choice)
|
||
.set("choiceList", ["弃置" + get.translation(e1), "弃置" + get.translation(e2)]);
|
||
} else {
|
||
if (e1.length) {
|
||
target.discard(e1);
|
||
} else if (e2.length) {
|
||
target.discard(e2);
|
||
}
|
||
event.finish();
|
||
}
|
||
"step 1";
|
||
if (result.index == 0) {
|
||
target.discard(event.e1);
|
||
} else {
|
||
target.discard(event.e2);
|
||
}
|
||
},
|
||
ai: {
|
||
order: 9.01,
|
||
useful: 1,
|
||
value: 5,
|
||
result: {
|
||
target: function (player, target) {
|
||
var num1 = 0,
|
||
num2 = 0;
|
||
for (var i = 1; i <= 4; i++) {
|
||
var card = target.getEquip(i);
|
||
if (card) {
|
||
if (i == 1 || i == 4) {
|
||
num1 += get.equipValue(card);
|
||
} else {
|
||
num2 += get.equipValue(card);
|
||
}
|
||
}
|
||
}
|
||
var num;
|
||
if (num1 == 0) {
|
||
num = num2;
|
||
} else if (num2 == 0) {
|
||
num = num1;
|
||
} else {
|
||
num = Math.min(num1, num2);
|
||
}
|
||
if (num > 0) {
|
||
return -0.8 - num / 10;
|
||
} else {
|
||
return 0;
|
||
}
|
||
},
|
||
},
|
||
tag: {
|
||
loseCard: 1,
|
||
discard: 1,
|
||
},
|
||
},
|
||
},
|
||
fulei: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "delay",
|
||
cardnature: "thunder",
|
||
modTarget: function (card, player, target) {
|
||
return lib.filter.judge(card, player, target);
|
||
},
|
||
enable: function (card, player) {
|
||
return player.canAddJudge(card);
|
||
},
|
||
filterTarget: function (card, player, target) {
|
||
return lib.filter.judge(card, player, target) && player == target;
|
||
},
|
||
selectTarget: [-1, -1],
|
||
toself: true,
|
||
judge: function (card) {
|
||
if (get.suit(card) == "spade") return -6;
|
||
return 6;
|
||
},
|
||
judge2: function (result) {
|
||
if (result.bool == false) return true;
|
||
return false;
|
||
},
|
||
cardPrompt: function (card) {
|
||
var str =
|
||
"出牌阶段,对你使用。你将【浮雷】置入判定区。若判定结果为♠,则目标角色受到X点雷电伤害(X为此牌判定结果为♠的次数)。判定完成后,将此牌移动到下家的判定区里。";
|
||
if (card.storage && card.storage.fulei)
|
||
str +=
|
||
'<br><span style="font-family:yuanli">此牌已判定命中过:' +
|
||
card.storage.fulei +
|
||
"次</span>";
|
||
return str;
|
||
},
|
||
effect: function () {
|
||
"step 0";
|
||
if (result.bool == false) {
|
||
var card = cards[0];
|
||
if (card) {
|
||
if (!card.storage.fulei) {
|
||
card.storage.fulei = 1;
|
||
} else {
|
||
card.storage.fulei++;
|
||
}
|
||
player.damage(card.storage.fulei, "thunder", "nosource");
|
||
}
|
||
}
|
||
"step 1";
|
||
player.addJudgeNext(card);
|
||
},
|
||
cancel: function () {
|
||
player.addJudgeNext(card);
|
||
},
|
||
ai: {
|
||
basic: {
|
||
order: 1,
|
||
useful: 0,
|
||
value: 0,
|
||
},
|
||
result: {
|
||
target: function (player, target) {
|
||
return lib.card.shandian.ai.result.target(player, target);
|
||
},
|
||
},
|
||
tag: {
|
||
damage: 0.25,
|
||
natureDamage: 0.25,
|
||
thunderDamage: 0.25,
|
||
},
|
||
},
|
||
},
|
||
qibaodao: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip1",
|
||
skills: ["qibaodao", "qibaodao2"],
|
||
distance: { attackFrom: -1 },
|
||
ai: {
|
||
equipValue: function (card, player) {
|
||
if (
|
||
game.hasPlayer(function (current) {
|
||
return (
|
||
player.canUse("sha", current) &&
|
||
current.isHealthy() &&
|
||
get.attitude(player, current) < 0
|
||
);
|
||
})
|
||
) {
|
||
return 5;
|
||
}
|
||
return 3;
|
||
},
|
||
basic: {
|
||
equipValue: 5,
|
||
},
|
||
},
|
||
},
|
||
zhungangshuo: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip1",
|
||
skills: ["zhungangshuo"],
|
||
distance: { attackFrom: -2 },
|
||
ai: {
|
||
equipValue: 4,
|
||
},
|
||
},
|
||
lanyinjia: {
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip2",
|
||
skills: ["lanyinjia", "lanyinjia2"],
|
||
ai: {
|
||
equipValue: 6,
|
||
},
|
||
},
|
||
yinyueqiang: {
|
||
audio: true,
|
||
fullskin: true,
|
||
type: "equip",
|
||
subtype: "equip1",
|
||
distance: { attackFrom: -2 },
|
||
ai: {
|
||
basic: {
|
||
equipValue: 4,
|
||
},
|
||
},
|
||
skills: ["yinyueqiang"],
|
||
},
|
||
shengdong: {
|
||
audio: true,
|
||
fullskin: true,
|
||
enable: function () {
|
||
return game.countPlayer() > 2;
|
||
},
|
||
recastable: function () {
|
||
return game.countPlayer() <= 2;
|
||
},
|
||
singleCard: true,
|
||
type: "trick",
|
||
complexTarget: true,
|
||
multitarget: true,
|
||
targetprompt: ["给一张牌", "得两张牌"],
|
||
filterTarget: function (card, player, target) {
|
||
return target !== player;
|
||
},
|
||
filterAddedTarget: function (card, player, target, preTarget) {
|
||
return target !== preTarget && target !== player;
|
||
},
|
||
content: function () {
|
||
"step 0";
|
||
if (!player.countCards("h")) {
|
||
event.finish();
|
||
} else {
|
||
event.target1 = target;
|
||
event.target2 = event.addedTarget;
|
||
player.chooseCard("h", "将一张手牌交给" + get.translation(event.target1), true);
|
||
}
|
||
"step 1";
|
||
player.give(result.cards, event.target1);
|
||
"step 2";
|
||
if (!event.target1.countCards("h")) {
|
||
event.finish();
|
||
} else {
|
||
var he = event.target1.getCards("he");
|
||
if (he.length <= 2) {
|
||
event.directresult = he;
|
||
} else {
|
||
event.target1.chooseCard(
|
||
"he",
|
||
"将两张牌交给" + get.translation(event.target2),
|
||
2,
|
||
true
|
||
);
|
||
}
|
||
}
|
||
"step 3";
|
||
if (!event.directresult) {
|
||
event.directresult = result.cards;
|
||
}
|
||
event.target1.give(event.directresult, event.target2);
|
||
},
|
||
ai: {
|
||
order: 2.5,
|
||
value: [4, 1],
|
||
useful: 1,
|
||
wuxie: function () {
|
||
return 0;
|
||
},
|
||
result: {
|
||
target: function (player, target) {
|
||
let hs = player.getCards("h");
|
||
if (
|
||
hs.length <= 1 ||
|
||
!hs.some((i) => {
|
||
return get.value(i) < 5.5;
|
||
})
|
||
)
|
||
return 0;
|
||
let targets = get.copy(ui.selected.targets);
|
||
if (_status.event.preTarget) targets.add(_status.event.preTarget);
|
||
if (targets.length) {
|
||
if (target.hasSkillTag("nogain")) return 0.01;
|
||
return 2;
|
||
}
|
||
if (!target.countCards("he")) return 0;
|
||
if (player.hasFriend()) return -1;
|
||
return 0;
|
||
},
|
||
},
|
||
},
|
||
},
|
||
zengbin: {
|
||
audio: true,
|
||
fullskin: true,
|
||
enable: true,
|
||
type: "trick",
|
||
filterTarget: true,
|
||
content: function () {
|
||
"step 0";
|
||
target.draw(3);
|
||
"step 1";
|
||
if (target.countCards("he", { type: "basic" }) < target.countCards("he")) {
|
||
target
|
||
.chooseToDiscard("增兵减灶", "he", function (card) {
|
||
return get.type(card) != "basic";
|
||
})
|
||
.set("ai", function (card) {
|
||
if (_status.event.goon) return 8 - get.value(card);
|
||
return 11 - get.value(card);
|
||
})
|
||
.set(
|
||
"goon",
|
||
target.countCards("h", function (card) {
|
||
return get.value(card, target, "raw") < 8;
|
||
}) > 1
|
||
)
|
||
.set("prompt2", "弃置一张非基本牌,或取消并弃置两张牌");
|
||
event.more = true;
|
||
} else {
|
||
target.chooseToDiscard("he", 2, true).set("ai", get.disvalue2);
|
||
}
|
||
"step 2";
|
||
if (event.more && !result.bool) {
|
||
target.chooseToDiscard("he", 2, true).set("ai", get.disvalue2);
|
||
}
|
||
},
|
||
ai: {
|
||
order: 7,
|
||
useful: 4,
|
||
value: 10,
|
||
tag: {
|
||
draw: 3,
|
||
discard: 1,
|
||
},
|
||
result: {
|
||
target: function (player, target) {
|
||
if (target.hasJudge("lebu")) return 0;
|
||
return Math.max(1, 2 - target.countCards("h") / 10);
|
||
},
|
||
},
|
||
},
|
||
},
|
||
caomu: {
|
||
audio: true,
|
||
fullskin: true,
|
||
enable: true,
|
||
type: "delay",
|
||
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 -3;
|
||
},
|
||
judge2: function (result) {
|
||
if (result.bool == false) return true;
|
||
return false;
|
||
},
|
||
effect: function () {
|
||
if (result.bool == false) {
|
||
player.addTempSkill("caomu_skill");
|
||
}
|
||
},
|
||
ai: {
|
||
basic: {
|
||
order: 1,
|
||
useful: 1,
|
||
value: 4.5,
|
||
},
|
||
result: {
|
||
player: function (player, target) {
|
||
return game.countPlayer(function (current) {
|
||
if (get.distance(target, current) <= 1 && current != target) {
|
||
var att = get.attitude(player, current);
|
||
if (att > 3) {
|
||
return 1.1;
|
||
} else if (att > 0) {
|
||
return 1;
|
||
} else if (att < -3) {
|
||
return -1.1;
|
||
} else if (att < 0) {
|
||
return -1;
|
||
}
|
||
}
|
||
});
|
||
},
|
||
target: function (player, target) {
|
||
if (target.hasJudge("bingliang")) return 0;
|
||
return -1.5 / Math.sqrt(target.countCards("h") + 1);
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
skill: {
|
||
lanyinjia: {
|
||
equipSkill: true,
|
||
enable: ["chooseToUse", "chooseToRespond"],
|
||
filterCard: true,
|
||
viewAs: { name: "shan" },
|
||
viewAsFilter: function (player) {
|
||
if (!player.countCards("hs")) return false;
|
||
},
|
||
position: "hs",
|
||
prompt: "将一张手牌当闪使用或打出",
|
||
check: function (card) {
|
||
return 6 - get.value(card);
|
||
},
|
||
ai: {
|
||
respondShan: true,
|
||
skillTagFilter: function (player) {
|
||
if (!player.countCards("hs")) return false;
|
||
},
|
||
effect: {
|
||
target: function (card, player, target, current) {
|
||
if (get.tag(card, "respondShan") && current < 0 && target.countCards("hs"))
|
||
return 0.59;
|
||
},
|
||
},
|
||
order: 4,
|
||
useful: -0.5,
|
||
value: -0.5,
|
||
},
|
||
},
|
||
lanyinjia2: {
|
||
equipSkill: true,
|
||
trigger: { player: "damageBegin4" },
|
||
forced: true,
|
||
filter: function (event, player) {
|
||
return event.card && event.card.name == "sha" && player.getEquips("lanyinjia").length > 0;
|
||
},
|
||
content: function () {
|
||
var card = player.getEquips("lanyinjia");
|
||
if (card.length) {
|
||
player.discard(card);
|
||
}
|
||
},
|
||
},
|
||
zhungangshuo: {
|
||
equipSkill: true,
|
||
trigger: { player: "useCardToPlayered" },
|
||
logTarget: "target",
|
||
filter: function (event, player) {
|
||
return (
|
||
event.card.name == "sha" && (event.player.countCards("h") || player.countCards("h"))
|
||
);
|
||
},
|
||
check: function (event, player) {
|
||
var target = event.target;
|
||
if (get.attitude(player, target) >= 0) return false;
|
||
if (
|
||
player.hasCard(function (card) {
|
||
return get.value(card) >= 8;
|
||
})
|
||
) {
|
||
return false;
|
||
}
|
||
var n1 = event.target.countCards("h");
|
||
return n1 > 0 && n1 <= player.countCards("h");
|
||
},
|
||
content: function () {
|
||
"step 0";
|
||
game.delayx();
|
||
"step 1";
|
||
trigger.target.discardPlayerCard("h", player, true);
|
||
"step 2";
|
||
player.discardPlayerCard("h", trigger.target, true);
|
||
},
|
||
},
|
||
qibaodao: {
|
||
equipSkill: true,
|
||
trigger: { source: "damageBegin1" },
|
||
forced: true,
|
||
filter: function (event) {
|
||
return event.card && event.card.name == "sha" && event.player.isHealthy();
|
||
},
|
||
content: function () {
|
||
trigger.num++;
|
||
},
|
||
ai: {
|
||
effect: {
|
||
player: function (card, player, target) {
|
||
if (
|
||
card.name == "sha" &&
|
||
target.isHealthy() &&
|
||
get.attitude(player, target) > 0
|
||
) {
|
||
return [1, -2];
|
||
}
|
||
},
|
||
},
|
||
},
|
||
},
|
||
qibaodao2: {
|
||
inherit: "qinggang_skill",
|
||
audio: true,
|
||
},
|
||
g_jinchan: {
|
||
cardSkill: true,
|
||
trigger: { target: "useCardToBefore" },
|
||
forced: true,
|
||
popup: false,
|
||
filter: function (event, player) {
|
||
if (event.player == player) return false;
|
||
if (event.getParent().directHit.includes(player)) return false;
|
||
var num = player.countCards("h", "jinchan");
|
||
return num && num == player.countCards("h");
|
||
},
|
||
content: function () {
|
||
"step 0";
|
||
player
|
||
.chooseToUse("是否对" + get.translation(trigger.card) + "使用【金蝉脱壳】?")
|
||
.set("ai1", function (card) {
|
||
return _status.event.bool;
|
||
})
|
||
.set("bool", -get.effect(player, trigger.card, trigger.player, player))
|
||
.set("respondTo", [trigger.player, trigger.card])
|
||
.set("filterCard", function (card, player) {
|
||
if (get.name(card) != "jinchan") return false;
|
||
return lib.filter.cardEnabled(card, player, "forceEnable");
|
||
});
|
||
trigger.jinchan = true;
|
||
"step 1";
|
||
delete trigger.jinchan;
|
||
},
|
||
},
|
||
g_jinchan2: {
|
||
trigger: {
|
||
player: "loseAfter",
|
||
global: "loseAsyncAfter",
|
||
},
|
||
forced: true,
|
||
cardSkill: true,
|
||
filter: function (event, player) {
|
||
if (event.type != "discard") return false;
|
||
var evt = event.getl(player);
|
||
if (!evt || !evt.cards2 || !evt.cards2.length) return false;
|
||
for (var i of evt.cards2) {
|
||
if (i.name == "jinchan") return true;
|
||
}
|
||
return false;
|
||
},
|
||
content: function () {
|
||
var num = 0,
|
||
cards = trigger.getl(player).cards2;
|
||
for (var i = 0; i < cards.length; i++) {
|
||
if (cards[i].name == "jinchan") num++;
|
||
}
|
||
if (num) {
|
||
player.draw(num);
|
||
}
|
||
},
|
||
},
|
||
yinyueqiang: {
|
||
equipSkill: true,
|
||
trigger: { player: ["useCard", "respondAfter"] },
|
||
direct: true,
|
||
filter: function (event, player) {
|
||
if (_status.currentPhase == player) return false;
|
||
if (!event.cards) return false;
|
||
if (event.cards.length != 1) return false;
|
||
if (lib.filter.autoRespondSha.call({ player: player })) return false;
|
||
return get.color(event.cards[0]) == "black";
|
||
},
|
||
content: function () {
|
||
"step 0";
|
||
var next = player.chooseToUse(get.prompt("yinyueqiang"), { name: "sha" });
|
||
next.aidelay = true;
|
||
next.logSkill = "yinyueqiang";
|
||
next.noButton = true;
|
||
"step 1";
|
||
if (result.bool) {
|
||
game.delay();
|
||
}
|
||
},
|
||
},
|
||
caomu_skill: {
|
||
cardSkill: true,
|
||
unique: true,
|
||
trigger: { player: "phaseDrawBegin" },
|
||
popup: false,
|
||
charlotte: true,
|
||
forced: true,
|
||
content: function () {
|
||
trigger.num--;
|
||
},
|
||
group: "caomu_skill2",
|
||
},
|
||
caomu_skill2: {
|
||
cardSkill: true,
|
||
popup: false,
|
||
forced: true,
|
||
trigger: { player: "phaseDrawAfter" },
|
||
content: function () {
|
||
var targets = game.filterPlayer(function (current) {
|
||
return get.distance(player, current) <= 1 && player != current;
|
||
});
|
||
if (targets.length) {
|
||
game.asyncDraw(targets);
|
||
}
|
||
},
|
||
},
|
||
},
|
||
translate: {
|
||
qijia: "弃甲曳兵",
|
||
qijia_info:
|
||
"出牌阶段,对一名装备区里有牌的其他角色使用。该角色选择一项:1.弃置手牌区和装备区里所有的武器和-1坐骑;2.弃置手牌区和装备区里所有的防具和+1坐骑。",
|
||
jinchan: "金蝉脱壳",
|
||
g_jinchan2: "金蝉脱壳",
|
||
g_jinchan2_info: "当你因弃置而失去【金蝉脱壳】时,你摸一张牌。",
|
||
jinchan_info:
|
||
"其他角色使用的基本牌或普通牌对你生效时,若你的所有手牌均为【金蝉脱壳】,则你可以使用此牌。你令此牌对你无效并摸两张牌。当你因弃置而失去【金蝉脱壳】时,你摸一张牌。",
|
||
fulei: "浮雷",
|
||
fulei_info:
|
||
"出牌阶段,对你使用。你将【浮雷】置入判定区。若判定结果为♠,则目标角色受到X点雷电伤害(X为此牌判定结果为♠的次数)。判定完成后,将此牌移动到下家的判定区里。",
|
||
qibaodao: "七宝刀",
|
||
qibaodao_info:
|
||
"攻击范围2;锁定技,你使用【杀】无视目标防具,若目标角色未损失体力值,此【杀】伤害+1。",
|
||
qibaodao2: "七宝刀",
|
||
zhungangshuo: "衠钢槊",
|
||
zhungangshuo_info:
|
||
"当你使用【杀】指定一名角色为目标后,你可令该角色弃置你的一张手牌,然后你弃置其一张手牌。",
|
||
lanyinjia: "烂银甲",
|
||
lanyinjia_info:
|
||
"你可以将一张手牌当做【闪】使用或打出。锁定技,【烂银甲】不会无效化;当你受到【杀】造成的伤害时,弃置【烂银甲】。",
|
||
yinyueqiang: "银月枪",
|
||
yinyueqiang_info:
|
||
"你的回合外,每当你使用或打出了一张黑色手牌(若为使用则在它结算之前),你可以立即对你攻击范围内的任意一名角色使用一张【杀】。",
|
||
shengdong: "声东击西",
|
||
shengdong_info:
|
||
"出牌阶段,对一名其他角色使用。你交给目标角色一张手牌,若如此做,其将两张牌交给另一名由你选择的其他角色(不足则全给,存活角色不超过2时可重铸)。",
|
||
zengbin: "增兵减灶",
|
||
zengbin_info:
|
||
"出牌阶段,对一名角色使用。目标角色摸三张牌,然后选择一项:1.弃置一张非基本牌;2.弃置两张牌。",
|
||
caomu: "草木皆兵",
|
||
caomu_info:
|
||
"出牌阶段,对一名其他角色使用。将【草木皆兵】放置于该角色的判定区里,若判定结果不为梅花:摸牌阶段,目标角色少摸一张牌;摸牌阶段结束时,与其距离为1的角色各摸一张牌。",
|
||
},
|
||
list: [
|
||
["spade", 1, "caomu"],
|
||
["club", 3, "caomu"],
|
||
["heart", 12, "shengdong"],
|
||
["club", 9, "shengdong"],
|
||
["spade", 9, "shengdong"],
|
||
["diamond", 4, "zengbin"],
|
||
["heart", 6, "zengbin"],
|
||
["spade", 7, "zengbin"],
|
||
["diamond", 12, "yinyueqiang"],
|
||
["spade", 11, "jinchan"],
|
||
["club", 12, "jinchan"],
|
||
["club", 13, "jinchan"],
|
||
["club", 12, "qijia"],
|
||
["club", 13, "qijia"],
|
||
["spade", 1, "fulei"],
|
||
["spade", 6, "qibaodao"],
|
||
["spade", 5, "zhungangshuo"],
|
||
["spade", 2, "lanyinjia"],
|
||
["club", 2, "lanyinjia"],
|
||
],
|
||
};
|
||
});
|