noname/character/key/skill.js

10099 lines
244 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
//伊吹风子
fuuko_xingdiao: {
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
filter: (event) => {
return event.name != "phase" || game.phaseNumber == 0;
},
content() {
"step 0";
player.drawTo(8);
("step 1");
var hs = player.getCards("h");
if (hs.length > 0)
player.addShownCards(hs, "visible_fuuko_xingdiao");
},
mod: {
ignoredHandcard(card) {
if (card.hasGaintag("visible_fuuko_xingdiao")) {
return true;
}
},
cardDiscardable(card, player, name) {
if (
name == "phaseDiscard" &&
card.hasGaintag("visible_fuuko_xingdiao")
) {
return false;
}
},
},
onremove: true,
global: "fuuko_xingdiao_gain",
subSkill: {
gain: {
enable: "phaseUse",
filter: (event, player) => {
return game.hasPlayer((current) =>
lib.skill.fuuko_xingdiao_gain.filterTarget(
null,
player,
current
)
);
},
filterTarget: (card, player, target) => {
return (
target != player &&
target.hasCard(
(card) => card.hasGaintag("visible_fuuko_xingdiao"),
"h"
) &&
!target.getStorage("fuuko_xingdiao").includes(player) &&
target.hasSkill("fuuko_xingdiao")
);
},
selectTarget: () => {
const num = game.countPlayer((current) =>
lib.skill.fuuko_xingdiao_gain.filterTarget(
null,
_status.event.player,
current
)
);
return num > 1 ? 1 : -1;
},
content() {
"step 0";
target.markAuto("fuuko_xingdiao", [player]);
var cards = target.getCards("h", (card) =>
card.hasGaintag("visible_fuuko_xingdiao")
);
if (!cards.length) event.finish();
else if (cards.length == 1)
event._result = { bool: true, links: cards };
else
player.chooseButton(true, [
"选择获得" + get.translation(target) + "的一张“星”",
cards,
]);
("step 1");
if (result.bool) {
player.gain(result.links, target, "give");
target.draw();
}
},
ai: {
order: 6,
result: {
target: 1,
},
},
},
},
},
fuuko_chuanyuan: {
trigger: {
player: "loseAfter",
global: [
"gainAfter",
"equipAfter",
"addJudgeAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
forced: true,
filter(event, player) {
const evt = event.getl(player);
if (!evt.hs.length) return false;
for (let i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("visible_fuuko_xingdiao"))
return true;
}
return false;
},
content() {
var evt = trigger.getl(player),
gains = [],
draws = 0;
var map = evt.gaintag_map;
var cards = evt.hs.filter((card) => {
return (
map[card.cardid] &&
map[card.cardid].includes("visible_fuuko_xingdiao")
);
});
cards.forEach((card) => {
var suit = get.suit(card, player),
num = get.number(card, player);
var card2 = get.cardPile2(function (card) {
if (gains.includes(card)) return false;
return (
get.suit(card, player) == suit &&
get.number(card, player) == num
);
});
if (card2) gains.push(card2);
else draws++;
});
if (gains.length)
player.gain(gains, "gain2").gaintag.add("fuuko_chuanyuan");
if (draws) player.draw(draws).gaintag = ["fuuko_chuanyuan"];
player.addSkill("fuuko_chuanyuan_effect");
},
subSkill: {
effect: {
mod: {
targetInRange(card) {
if (!card.cards || !card.cards.length) return;
for (var i of card.cards) {
if (!i.hasGaintag("fuuko_chuanyuan")) return;
}
return true;
},
cardUsable(card) {
if (!card.cards || !card.cards.length) return;
for (var i of card.cards) {
if (!i.hasGaintag("fuuko_chuanyuan")) return;
}
return Infinity;
},
},
charlotte: true,
trigger: { player: "useCard1" },
forced: true,
popup: false,
firstDo: true,
filter(event, player) {
if (event.addCount === false) return false;
return player.hasHistory("lose", (evt) => {
if (evt.getParent() != event) return false;
for (let i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("fuuko_chuanyuan"))
return true;
}
});
//return false;
},
content() {
trigger.addCount = false;
player.getStat("card")[trigger.card.name]--;
},
},
},
},
//伊莉雅
iriya_yinji: {
trigger: { player: "phaseUseBegin" },
forced: true,
filter(event, player) {
return player.countCards("h") < 17;
},
content() {
player.drawTo(17).gaintag = ["iriya_yinji_tag"];
player.addSkill("iriya_yinji_tag");
},
subSkill: {
tag: {
charlotte: true,
mod: {
cardEnabled(card) {
if (get.itemtype(card) == "card") {
if (card.hasGaintag("iriya_yinji_tag"))
return false;
} else if (card.isCard && card.cards) {
if (
card.cards.some((card) =>
card.hasGaintag("iriya_yinji_tag")
)
)
return false;
}
},
aiValue(player, card, num) {
if (
get.itemtype(card) == "card" &&
card.hasGaintag("iriya_yinji_tag")
)
return num / 10000;
},
aiUseful(player, card, num) {
if (
get.itemtype(card) == "card" &&
card.hasGaintag("iriya_yinji_tag")
)
return num / 10000;
},
},
},
},
},
iriya_haozhi: {
enable: "phaseUse",
filterCard: true,
selectCard: [2, Infinity],
promptfunc: () =>
"出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。",
position: "he",
getType(cards, player) {
var nums = cards
.map((card) => {
var num = get.number(card, player);
if (num <= 2) return num + 13;
return num;
})
.sort((a, b) => a - b),
len = nums.length;
if (len == 1) return ["单张", nums[0], 1];
if (len == 2)
return nums[1] == nums[0] ? ["对子", nums[0], 1] : null;
var map = {};
for (var i = 0; i < len; i++) {
var count = get.numOf(nums, nums[i]);
if (!map[count]) map[count] = [];
map[count].push(nums[i]);
i += count - 1;
}
if (len == 3) {
if (map[3]) return ["三张", nums[0], 1];
return null;
}
if (map[len]) {
return ["炸弹", nums[0], length];
}
if (map[1]) {
if (map[1].length == len && len > 4) {
for (var i = 0; i < map[1].length - 1; i++) {
if (map[1][i + 1] - map[1][i] != 1) return null;
if (map[1][i + 1] == 15) return null;
}
return ["单顺", nums[0], len];
} else if (map[1].length == 2 && map[4] && len == 6) {
return ["四带二", map[4][0], 1];
} else if (
map[3] &&
map[1].length == map[3].length &&
len == map[1].length * 4
) {
if (map[3].length == 1) return ["三带一", map[3][0], 1];
for (var i = 0; i < map[3].length - 1; i++) {
if (map[3][i + 1] - map[3][i] != 1) return null;
}
return ["单带飞机", map[3][0], map[3].length];
}
return null;
}
if (map[2]) {
if (map[2].length * 2 == len && len > 5) {
for (var i = 0; i < map[2].length - 1; i++) {
if (map[2][i + 1] - map[2][i] != 1) return null;
if (map[2][i + 1] == 15) return null;
}
return ["双顺", nums[0], len];
} else if (map[4] && len == 6) {
return ["四带二", map[4][0], 1];
} else if (
map[3] &&
map[2].length == map[3].length &&
len == map[2].length * 5
) {
if (map[3].length == 1) return ["三带二", map[3][0], 1];
for (var i = 0; i < map[3].length - 1; i++) {
if (map[3][i + 1] - map[3][i] != 1) return null;
if (map[3][i + 1] == 15) return null;
}
return ["双带飞机", map[3][0], map[3].length];
}
return null;
}
if (map[3]) {
if (map[3].length * 3 == len && len > 5) {
for (var i = 0; i < map[3].length - 1; i++) {
if (map[3][i + 1] - map[3][i] != 1) return null;
if (map[3][i + 1] == 15) return null;
}
return ["三顺", nums[0], len];
}
return null;
}
return null;
},
filterOk() {
return Array.isArray(
lib.skill.iriya_haozhi.getType(
ui.selected.cards,
_status.event.player
)
);
},
check(card) {
var player = _status.event.player;
//收益都一样 多一牌不如少一牌
var types = ["炸弹", "三顺", "单顺", "双顺", "三张", "对子"];
var getNum = function (card, player) {
var num = get.number(card, player);
if (num <= 2) return num + 13;
return num;
},
hasEnemy = game.hasPlayer(
(current) => get.attitude(player, current) < 0
);
//所有手牌
var nums = player
.getCards("he", function (card) {
return lib.filter.cardDiscardable(card, player);
})
.map((card) => getNum(card, player));
var numu = ui.selected.cards.map((card) => getNum(card, player));
var num = getNum(card, player);
if (!_status.event._iriya_haozhi_type) {
for (var type of types) {
switch (type) {
case "炸弹":
if (!hasEnemy) break;
for (var i of nums) {
if (get.numOf(nums, i) >= 4) {
_status.event._iriya_haozhi_type = "炸弹";
break;
}
}
break;
case "三顺":
if (!hasEnemy) break;
for (var i of nums) {
if (
i < 14 &&
get.numOf(nums, i) >= 3 &&
get.numOf(nums, i + 1) >= 3
) {
_status.event._iriya_haozhi_type = "三顺";
break;
}
}
break;
case "双顺":
if (!hasEnemy) break;
for (var i of nums) {
if (i < 13 && get.numOf(nums, i) >= 2) {
for (var j = 1; j < 3; j++) {
if (get.numOf(nums, i + j) < 2) break;
if (j == 2)
_status.event._iriya_haozhi_type =
"双顺";
}
}
}
break;
case "单顺":
if (!hasEnemy) break;
for (var i of nums) {
if (i < 11) {
for (var j = 1; j < 5; j++) {
if (!nums.includes(i + j)) break;
if (j == 4)
_status.event._iriya_haozhi_type =
"单顺";
}
}
}
break;
case "三张":
if (!hasEnemy) break;
for (var i of nums) {
if (get.numOf(nums, i) >= 3) {
_status.event._iriya_haozhi_type = "三张";
break;
}
}
break;
case "对子":
for (var i of nums) {
if (get.numOf(nums, i) >= 2) {
_status.event._iriya_haozhi_type = "对子";
break;
}
}
break;
}
if (_status.event._iriya_haozhi_type) break;
}
if (!_status.event._iriya_haozhi_type)
_status.event._iriya_haozhi_type = "要不起";
}
if (_status.event._iriya_haozhi_type == "要不起") return 0;
//复用响应AI
if (!ui.selected.cards.length) {
var count = get.numOf(nums, num);
switch (_status.event._iriya_haozhi_type) {
case "炸弹":
if (count >= 4) return 15;
break;
case "对子":
if (
count > 1 &&
player.hasCard(function (cardx) {
return (
cardx != card &&
getNum(cardx, player) == num &&
cardx.hasGaintag("iriya_yinji_tag")
);
}, "he")
)
return 4 - get.value(card);
break;
case "三张":
if (count > 2) return 8 - get.value(card);
break;
case "单顺":
if (num > 10) return 0;
for (var i = 1; i < 5; i++) {
if (get.numOf(nums, num + i) < 1) return 0;
}
return 9 - get.value(card);
case "双顺":
if (count < 2 || num > 12) return 0;
for (var i = 1; i < 3; i++) {
if (get.numOf(nums, num + i) < 2) return 0;
}
return 9 - get.value(card);
case "三顺":
if (count < 3 || num > 13) return 0;
for (var i = 1; i < 2; i++) {
if (get.numOf(nums, num + i) < 2) return 0;
}
return 12 - get.value(card);
}
return 0;
} else {
switch (_status.event._iriya_haozhi_type) {
case "炸弹":
if (numu.length >= 4) return 0;
if (num == numu[0]) return 15;
return 0;
case "对子":
if (numu.length >= 2) return 0;
if (num == numu[0]) return 3 - get.value(card);
return 0;
case "三张":
if (numu.length >= 3) return 0;
if (num == numu[0]) return 9 - get.value(card);
return 0;
case "单顺":
case "双顺":
case "三顺":
var map = {
单顺: [5, 0],
双顺: [3, 1],
三顺: [2, 2],
},
len = map[_status.event._iriya_haozhi_type][0],
addNum = map[_status.event._iriya_haozhi_type][1];
if (numu.length >= len) return 0;
var numt =
numu[numu.length - 1] +
(numu.length % (1 + addNum) == 0 ? 1 : 0);
if (num == numt) return 10 + addNum - get.value(card);
return 0;
}
}
},
//响应AI
respondAI(card) {
if (!_status.event.goon) return 0;
var type = _status.event.type,
player = _status.event.player;
var getNum = function (card, player) {
var num = get.number(card, player);
if (num <= 2) return num + 13;
return num;
},
nums = player
.getCards("he", function (card) {
return lib.filter.cardDiscardable(
card,
player,
"iriya_haozhi"
);
})
.map((card) => getNum(card, player));
var num = getNum(card, player);
if (!ui.selected.cards.length) {
var count = get.numOf(nums, num);
if (
count >= 4 &&
(type[0] != "炸弹" || num > type[1] || count > type[2])
)
return 15;
switch (type[0]) {
case "对子":
if (count > 1 && num > type[1])
return 8 - get.value(card);
break;
case "三张":
case "三带一":
case "三带二":
if (count > 2 && num > type[1])
return 9 - get.value(card);
break;
case "单顺":
if (num <= type[1] || num > 15 - type[2]) return 0;
for (var i = 1; i < type[2]; i++) {
if (get.numOf(nums, num + i) < 1) return 0;
}
return 10 - get.value(card);
case "双顺":
if (
num <= type[1] ||
count < 2 ||
num > 15 - type[2] / 2
)
return 0;
for (var i = 1; i < type[2] / 2; i++) {
if (get.numOf(nums, num + i) < 2) return 0;
}
return 11 - get.value(card);
case "三顺":
case "单带飞机":
case "双带飞机":
var size =
3 +
["三顺", "单带飞机", "双带飞机"].indexOf(type[0]);
if (
num <= type[1] ||
count < 3 ||
num > 15 - type[2] / size
)
return 0;
for (var i = 1; i < type[2] / size; i++) {
if (get.numOf(nums, num + i) < 2) return 0;
}
return 12 - get.value(card);
}
return 0;
} else {
var numu = ui.selected.cards.map((card) =>
getNum(card, player)
);
var numx = numu[0];
if (num == numx) {
var count = get.numOf(nums, numx);
if (
count >= 4 &&
(type[0] != "炸弹" ||
num > type[1] ||
count > type[2]) &&
numu.length < (type[0] == "炸弹" ? type2 : 4)
)
return 15;
}
switch (type[0]) {
case "对子":
if (numu.length >= 2) return 0;
if (num == numu[0]) return 8 - get.value(card);
return 0;
case "三张":
if (numu.length >= 3) return 0;
if (num == numu[0]) return 9 - get.value(card);
return 0;
case "三带一":
if (numu.length == 3 || num == numu[0])
return 9 - get.value(card);
return 0;
case "三带二":
if (numu.length >= 5) return false;
if (numu.length == 3) {
if (num == numu[0] || get.numOf(nums, num) < 2)
return 0;
} else if (numu.length == 4) {
return num == numu[3] ? 9 - get.value(card) : 0;
}
if (num == numu[0]) return 9 - get.value(card);
return 0;
case "单顺":
case "双顺":
case "三顺":
if (numu.length >= type[2]) return 0;
var addNum = ["单顺", "双顺", "三顺"].indexOf(type[0]);
var numt =
numu[numu.length - 1] +
(numu.length % (1 + addNum) == 0 ? 1 : 0);
if (num == numt) return 10 + addNum - get.value(card);
return 0;
case "单带飞机":
if (numu.length >= type[2]) return 0;
var len = (type[2] / 4) * 3;
if (numu.length < len) {
var numt =
numu[numu.length - 1] +
(numu.length % 3 == 0 ? 1 : 0);
if (num == numt) return 12 - get.value(card);
} else {
if (num >= numu[0] || num <= numu[len - 1])
return 0;
return 12 - get.value(card);
}
return 0;
case "双带飞机":
if (numu.length >= type[2]) return 0;
var len = (type[2] / 5) * 3;
if (numu.length < len) {
var numt =
numu[numu.length - 1] +
(numu.length % 3 == 0 ? 1 : 0);
if (num == numt) return 12 - get.value(card);
} else {
if ((numu.length - len) % 2 == 0) {
if (
numu.includes(num) ||
get.numOf(nums, num) < 2
)
return 0;
return 12 - get.value(card);
} else {
return num == numu[numu.length - 1]
? 12 - get.value(card)
: 0;
}
}
return 0;
}
}
},
content() {
"step 0";
var players = game.filterPlayer().sortBySeat(player.getNext());
event.players = players;
event.current = player;
event.current_type = lib.skill.iriya_haozhi.getType(cards, player);
event.current_cards = cards.slice(0);
if (!event.current_type) event.finish();
("step 1");
var target = event.players.shift();
if (
(target != player || event.current != player) &&
target.isIn() &&
target.countCards("h") >= Math.min(cards.length, 4)
) {
event.target = target;
target.addTempSkill("iriya_haozhi_temp", {
global: [
"discardBefore",
"chooseToDiscardEnd",
"phaseAfter",
],
});
var trans = get.translation(event.current);
var cardsn = (function (cards, player) {
var getn = (card, player) => {
var num = get.number(card, player);
if (num <= 2) return num + 13;
return num;
};
cards.sort(function (a, b) {
var numa = getn(a, player),
numb = getn(b, player);
if (numa != numb) return numa - numb;
return lib.suit.indexOf(
get.suit(a, player) - get.suit(b, player)
);
});
var str = "";
for (var i of cards) {
str += ",";
str += get.strNumber(get.number(i, player));
str += get.translation(get.suit(i, player));
}
return str.slice(1);
})(event.current_cards, event.current);
var next = target.chooseToDiscard(
"是否响应" +
trans +
"的" +
get.translation(event.current_type[0]) +
"",
trans +
"的牌组为" +
cardsn +
"。您此时可以点击“整理手牌”,将手牌按点数排序。",
[2, Infinity],
"he"
);
next.set("type", event.current_type);
next.set("filterOk", function () {
var type = lib.skill.iriya_haozhi.getType(
ui.selected.cards,
_status.event.player
);
if (!type) return false;
var ptype = _status.event.type;
if (type[0] == "炸弹") {
if (ptype[0] == "炸弹") {
if (type[2] > ptype[2]) return true;
return type[1] > ptype[1] && type[2] == ptype[2];
}
return true;
}
return (
type[0] == ptype[0] &&
type[2] == ptype[2] &&
type[1] > ptype[1]
);
});
next.set("goon", get.attitude(target, event.current) < 0);
next.set("ai", lib.skill.iriya_haozhi.respondAI);
} else if (event.players.length > 0) event.redo();
else event.goto(3);
("step 2");
if (result.bool) {
event.current = target;
event.current_type = lib.skill.iriya_haozhi.getType(
result.cards.slice(0),
target
);
event.current_cards = result.cards.slice(0);
if (!event.current_type) event.finish();
event.current.addExpose(0.5);
}
if (event.players.length > 0) event.goto(1);
("step 3");
var current = event.current,
type = 0;
if (!current.isIn()) return;
switch (event.current_type[0]) {
case "对子":
type = 1;
break;
case "三张":
case "三带一":
case "三带二":
type = 2;
break;
case "单顺":
type = 3;
break;
case "双顺":
type = 4;
break;
case "三顺":
case "单带飞机":
case "双带飞机":
type = 5;
break;
case "炸弹":
case "四带二":
type = 6;
break;
}
/*if(type==2){
current.addSkill('iriya_haozhi_extra');
current.addMark('iriya_haozhi_extra',1,false);
}
else */
if (type > 0) {
var next = game.createEvent("iriya_haozhi_effect", false);
next.player = current;
next.setContent(lib.skill.iriya_haozhi["content" + type]);
}
},
content1() {
"step 0";
player
.chooseTarget([1, 2], "是否令至多两名角色各摸一张牌?")
.set("ai", function (target) {
var player = _status.event.player,
att = get.attitude(player, target);
if (target.hasSkillTag("nogain")) att /= 10;
return att;
});
("step 1");
if (result.bool) {
var targets = result.targets.sortBySeat();
player.line(targets);
game.asyncDraw(targets);
game.delayex();
}
},
content2() {
"step 0";
player
.chooseTarget(
[1, 3],
"是否弃置至多三名角色的各一张牌?",
function (card, player, target) {
return (
target != player &&
target.hasCard(function (card) {
return lib.filter.canBeDiscarded(
card,
player,
target
);
}, "he")
);
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.effect(
target,
{ name: "guohe_copy2" },
player,
player
);
});
("step 1");
if (result.bool) {
var targets = result.targets.sortBySeat();
player.line(targets, "green");
for (var target of targets) {
player.discardPlayerCard(target, true, "he");
}
}
("step 2");
//player.recover();
player.draw();
},
content3() {
"step 0";
event.count = 0;
("step 1");
var next = player
.chooseTarget(
"是否弃置一名其他角色的一张牌?",
function (card, player, target) {
return (
target != player &&
target.hasCard(function (card) {
return lib.filter.canBeDiscarded(
card,
player,
target
);
}, "he")
);
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.effect(
target,
{ name: "guohe_copy2" },
player,
player
);
});
if (event.color)
next.set(
"prompt2",
"若你弃置的牌为" +
get.translation(event.color) +
",则你可以重复此流程"
);
("step 2");
if (result.bool) {
var target = result.targets[0];
player.line(target, "fire");
player.discardPlayerCard(target, true, "he");
} else event.goto(4);
("step 3");
if (result.bool) {
event.count++;
var card = result.cards[0],
color = get.color(card, false);
if (!event.color) {
event.color = color;
event.goto(1);
} else if (color == event.color) event.goto(1);
}
("step 4");
if (event.count > 0) player.draw(event.count);
},
content4() {
"step 0";
event.count = 0;
("step 1");
var next = player
.chooseTarget(
"是否获得一名其他角色的一张牌?",
function (card, player, target) {
return (
target != player &&
target.hasCard(function (card) {
return lib.filter.canBeGained(
card,
player,
target
);
}, "he")
);
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.effect(
target,
{ name: "shunshou_copy2" },
player,
player
);
});
if (event.color)
next.set(
"prompt2",
"若你得到的牌为" +
get.translation(event.color) +
",则你可以重复此流程"
);
("step 2");
if (result.bool) {
var target = result.targets[0];
player.line(target, "fire");
player.gainPlayerCard(target, true, "he");
} else event.goto(4);
("step 3");
if (result.bool) {
event.count++;
var card = result.cards[0],
color = get.color(card, false);
if (!event.color) {
event.color = color;
event.goto(1);
} else if (color == event.color) event.goto(1);
//player.draw();
}
("step 4");
if (event.count > 0) player.recover(event.count);
},
content5() {
"step 0";
player
.chooseTarget(
[1, 3],
"是否令至多三名其他角色翻面?",
lib.filter.notMe
)
.set("ai", function (target) {
var player = _status.event.player,
att = get.attitude(player, target);
if (target.isTurnedOver()) return 10 * att;
return -6 * att;
});
("step 1");
if (result.bool) {
var targets = result.targets.sortBySeat();
player.line(targets, "thunder");
event.targets = targets;
for (var target of targets) target.turnOver();
}
("step 2");
player
.chooseTarget(
"是否对一名目标角色造成1点火属性伤害",
function (card, player, target) {
return _status.event
.getParent()
.targets.includes(target);
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.damageEffect(target, player, player, "fire");
});
("step 3");
if (result.bool) {
var target = result.targets[0];
player.line(target, "fire");
target.damage("fire");
}
},
content6() {
"step 0";
player
.chooseTarget(
"是否对一名其他角色进行核打击?",
"你对该角色造成2点雷属性伤害然后该角色翻面弃置装备区内的所有牌和四张手牌。",
lib.filter.notMe
)
.set("ai", function (target) {
var player = _status.event.player,
att = get.attitude(player, target);
if (target.isTurnedOver())
return (
-6 * att * Math.sqrt(2 + target.countCards("he"))
);
return -att * Math.sqrt(2 + target.countCards("he"));
});
("step 1");
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.line(target, "thunder");
target.damage("thunder", 2);
target.turnOver();
} else event.finish();
("step 2");
var num = target.countCards("e");
if (num > 0) target.chooseToDiscard("e", true, num);
("step 3");
var num = target.countCards("h");
if (num > 0) target.chooseToDiscard("h", true, Math.min(4, num));
},
ai: {
sortCardByNum: true,
order: 13,
result: {
player: 1,
},
},
subSkill: {
extra: {
charlotte: true,
mod: {
targetInRange: () => true,
cardUsable: () => Infinity,
},
trigger: { player: "useCard2" },
forced: true,
onremove: true,
content() {
"step 0";
var num = player.countMark("iriya_haozhi_extra");
player.removeSkill("iriya_haozhi_extra");
var card = trigger.card;
if (trigger.addCount !== false) {
trigger.addCount = false;
var stat = player.getStat().card;
if (stat[card.name] && stat[card.name] > 0)
stat[card.name]--;
}
var info = get.info(card);
if (info.allowMultiple == false) event.finish();
if (trigger.targets && !info.multitarget) {
if (
game.hasPlayer(function (current) {
return (
!trigger.targets.includes(current) &&
lib.filter.targetEnabled2(
card,
player,
current
)
);
})
) {
var prompt2 =
"为" +
get.translation(card) +
"增加" +
(num > 1 ? "至多" : "") +
get.cnNumber(num) +
"个目标";
player
.chooseTarget(
get.prompt("iriya_haozhi_extra"),
[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("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("iriya_haozhi_extra", event.targets);
trigger.targets.addArray(event.targets);
}
},
intro: {
content: "使用下一张牌无距离和次数限制,且可以增加#个目标",
},
},
temp: {
ai: { sortCardByNum: true },
charlotte: true,
},
},
},
//藏里见
satomi_luodao: {
trigger: { player: "useCardToPlayered" },
logTarget: "target",
filter(event, player) {
return event.card.name == "sha" && event.target.countCards("h") > 0;
},
content() {
"step 0";
var target = trigger.target;
event.target = target;
target.showHandcards(
get.translation(player) +
"对" +
get.translation(target) +
"发动了【落刀】"
);
("step 1");
if (
target.hasCard(function (card) {
return get.name(card, target) == "shan";
}, "h")
) {
player
.discardPlayerCard(target, true, "h", "visible")
.set("filterButton", function (button) {
return get.name(button.link) == "shan";
});
} else if (player.countCards("he") > 0)
player.chooseToDiscard("he", true);
},
},
satomi_daohai: {
trigger: { player: "phaseJieshuBegin" },
filter(event, player) {
return (
player.hasHistory("lose", function (evt) {
return evt.type == "discard" && evt.cards2.length > 0;
}) && player.hasUseTarget({ name: "wugu" })
);
},
check(event, player) {
return (
player.getUseValue({ name: "wugu" }) +
player.getUseValue({ name: "lebu" }) >
0
);
},
content() {
"step 0";
player.chooseUseTarget("wugu", true);
("step 1");
if (result.bool) {
var cards = [];
player.getHistory("gain", function (evt) {
if (
evt.getParent().name == "wugu" &&
evt.getParent(4) == event
) {
cards.addArray(evt.cards);
}
});
cards = cards.filter(function (card) {
return (
player.getCards("h").includes(card) &&
game.checkMod(
card,
player,
"unchanged",
"cardEnabled2",
player
)
);
});
if (cards.length) {
player.chooseCardTarget({
prompt: "是否将得到的牌当做【乐不思蜀】使用?",
filterCard(card) {
return _status.event.cards.includes(card);
},
cards: cards,
filterTarget(card, player, target) {
var card = get.autoViewAs(
{ name: "lebu" },
ui.selected.cards
);
return player.canUse(card, target);
},
ai1: () => 1,
ai2(target) {
var player = _status.event.player,
card = get.autoViewAs(
{ name: "lebu" },
ui.selected.cards
);
return get.effect(
target,
{ name: "lebu" },
player,
player
);
},
});
} else event.finish();
} else event.finish();
("step 2");
if (result.bool) {
player.useCard(
{ name: "lebu" },
result.cards,
result.targets[0]
);
}
},
},
//苍井绘梨花
erika_shisong: {
trigger: { player: "useCard" },
forced: true,
charlotte: true,
filter(event, player) {
if (player != _status.currentPhase) return false;
var index = player.getHistory("useCard").indexOf(event),
history = player.actionHistory;
for (var i = history.length - 2; i >= 0; i--) {
if (history[i].isMe) {
var evt = history[i].useCard[index];
return evt && get.type2(evt.card) == get.type(event.card);
}
}
return false;
},
content() {
player.draw();
},
mod: {
maxHandcard(player, num) {
return num + player.hujia;
},
},
},
erika_yousheng: {
init: (player) => {
player.addSkill("erika_yousheng_mamori");
},
dutySkill: true,
group: ["erika_yousheng_achieve", "erika_yousheng_fail"],
trigger: { global: "useCardToTarget" },
filter(event, player) {
return (
player.getStorage("erika_yousheng").includes(event.target) &&
(event.card.name == "sha" ||
(get.type2(event.card, false) == "trick" &&
get.tag(event.card, "damage") > 0)) &&
player.countMark("erika_yousheng_ruka") + 1 <=
player.countCards("he")
);
},
intro: {
content: "已保护$",
},
async cost(event, trigger, player) {
const num = player.countMark("erika_yousheng_ruka") + 1;
event.result = await player
.chooseToDiscard(
"he",
num,
get.prompt("erika_yousheng", trigger.target),
"弃置" +
num +
"张牌,并转移" +
get.translation(trigger.card)
)
.forResult();
},
async content(event, trigger, player) {
player.discard(event.cards);
var ruka = trigger.target,
evt = trigger.getParent();
evt.targets.remove(ruka);
evt.triggeredTargets2.remove(ruka);
evt.targets.push(player);
evt.triggeredTargets2.push(player);
player.addTempSkill("erika_yousheng_ruka");
var str = "erika_yousheng_" + player.playerid;
if (!evt[str]) evt[str] = [];
evt[str].add(ruka);
},
subSkill: {
achieve: {
trigger: { player: "changeHujiaAfter" },
forced: true,
skillAnimation: "legend",
animationColor: "water",
filter(event, player) {
return (
player.storage.erika_yousheng &&
event.num < 0 &&
!player.hujia
);
},
content() {
"step 0";
player.awakenSkill("erika_yousheng");
game.log(player, "成功完成使命");
var list = [player];
list.addArray(player.storage.erika_yousheng);
list.sortBySeat();
list = list.filter(function (current) {
return current.isAlive();
});
player.line(list, "green");
game.asyncDraw(list, 3);
("step 1");
game.delayx();
},
},
fail: {
trigger: { global: "damageEnd" },
forced: true,
filter(event, player) {
return (
player
.getStorage("erika_yousheng")
.includes(event.player) &&
event.card &&
(event.card.name == "sha" ||
(get.type2(event.card, false) == "trick" &&
get.tag(event.card, "damage") > 0))
);
},
content() {
player.awakenSkill("erika_yousheng");
game.log(player, "使命失败");
var num = player.hujia;
if (num > 0) {
player.changeHujia(-num);
player.chooseToDiscard(num, true, "he");
}
},
},
mamori: {
trigger: { global: "roundStart" },
skillAnimation: true,
animationColor: "wood",
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt("erika_yousheng"),
[1, 2],
lib.filter.notMe,
"选择至多两名其他角色。你减2点体力上限并获得3点护甲。"
)
.set("ai", function (ruka) {
return -1;
})
.forResult();
},
async content(event, trigger, player) {
player.awakenSkill("erika_yousheng_mamori");
player.markAuto("erika_yousheng", event.targets);
await player.loseMaxHp(2);
await player.changeHujia(3);
},
},
ruka: {
trigger: { global: "useCardAfter" },
charlotte: true,
filter(event, player) {
return (
event["erika_yousheng_" + player.playerid] &&
event.cards.filterInD().length > 0
);
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
"是否令一名原目标角色获得" +
get.translation(trigger.cards.filterInD()) +
"",
function (card, player, target) {
return _status.event.targets.includes(target);
}
)
.set(
"targets",
trigger["erika_yousheng_" + player.playerid]
)
.forResult();
},
async content(event, trigger, player) {
const ruka = event.targets[0];
player.line(ruka, "green");
ruka.gain(trigger.cards.filterInD(), "gain2");
},
},
},
},
//李映夏
liyingxia_sanli: {
trigger: { target: "useCardToTargeted" },
forced: true,
filter(event, player) {
if (event.player == player || event.player != _status.currentPhase)
return false;
var index = event.player
.getHistory("useCard", function (evt) {
return evt.targets.includes(player);
})
.indexOf(event.getParent());
if (index == 2)
return event.player.isIn() && player.countCards("he") > 0;
return index < 2 && index > -1;
},
logTarget: "player",
content() {
"step 0";
var index = trigger.player
.getHistory("useCard", function (evt) {
return evt.targets.includes(player);
})
.indexOf(trigger.getParent());
if (index == 2) {
player.chooseCard(
"he",
true,
"三礼:交给" + get.translation(trigger.player) + "一张牌"
);
} else {
player.draw();
event.finish();
}
("step 1");
if (result.bool) {
player.give(result.cards, trigger.player);
}
},
},
liyingxia_zhenjun: {
trigger: { player: "phaseJieshuBegin" },
filter(event, player) {
return player.group == "key";
},
async cost(event, trigger, player) {
const num =
player.getHistory("useCard", function (evt) {
return (
evt.card.name == "sha" ||
(get.type(evt.card) == "trick" &&
get.tag(evt.card, "damage") > 0)
);
}).length + 1;
event.result = await player
.chooseTarget(
get.prompt("liyingxia_zhenjun"),
[1, num],
"令至多" + get.cnNumber(num) + "名角色各摸一张牌"
)
.set("ai", (serafu) =>
get.attitude(_status.event.player, serafu)
)
.forResult();
},
content() {
targets.sortBySeat();
game.asyncDraw(targets);
for (var i of targets)
i.addTempSkill("liyingxia_zhenjun_enhance", {
player: player == i ? "phaseJieshuBegin" : "phaseAfter",
});
game.delayx();
},
subSkill: {
enhance: {
trigger: { source: "damageBegin1" },
forced: true,
charlotte: true,
mark: true,
filter: (event, player) => player == _status.currentPhase,
intro: { content: "下回合首次造成的伤害+1" },
content() {
trigger.num++;
player.removeSkill(event.name);
},
},
},
},
liyingxia_wumai: {
trigger: { global: "roundStart" },
filter(event, player) {
return (
player.group == "shu" &&
(player.getStorage("liyingxia_wumai").length < 4 ||
game.hasPlayer((current) => current.isDamaged()))
);
},
async cost(event, trigger, player) {
var list = lib.skill.liyingxia_wumai.derivation.slice(0);
list.removeArray(player.getStorage("liyingxia_wumai"));
if (list.length) {
const { result } = await player
.chooseControl(list, "cancel2")
.set("prompt", get.prompt("liyingxia_wumai"))
.set("prompt2", "获得一个技能直到本轮结束");
if (result.control !== "cancel2") {
event.result = {
bool: true,
cost_data: {
type: "addSkill",
skill: result.control,
},
};
}
} else {
const num = Math.min(
3,
game.countPlayer((current) => current.isDamaged())
);
const { result } = await player.chooseBool(
get.prompt("liyingxia_wumai") +
"(可摸" +
get.cnNumber(num) +
"张牌)"
);
if (result.bool) {
event.result = {
bool: true,
cost_data: {
type: "drawCards",
num,
},
};
}
}
},
async content(event, trigger, player) {
const result = event.cost_data;
if (result.type === "addSkill") {
player.markAuto("liyingxia_wumai", [result.skill]);
player.addTempSkills(result.skill, "roundStart");
} else if (result.type === "drawCards") {
player.draw(result.num);
}
},
derivation: ["bazhen", "rejizhi", "reguanxing", "youlong"],
},
//雾岛佳乃
kano_liezhen: {
trigger: { player: "phaseJieshuBegin" },
filter(event, player) {
return player.getHistory("useCard").length > 0;
},
frequent: true,
async cost(event, trigger, player) {
var history = player.getHistory("useCard");
if (history.length > 1) {
var type = get.type2(history[0].card, false);
for (var i = 1; i < history.length; i++) {
if (get.type2(history[i].card, false) != type) {
const result = await player
.chooseButton([
"列阵:是否视为使用其中一种牌?",
[
["kano_paibingbuzhen"].concat(
get.zhinangs()
),
"vcard",
],
])
.set("filterButton", function (button) {
return _status.event.player.hasUseTarget({
name: button.link[2],
isCard: true,
});
})
.set("ai", function (button) {
return _status.event.player.getUseValue({
name: button.link[2],
isCard: true,
});
})
.forResult();
if (result.bool)
event.result = {
bool: true,
cost_data: {
links: result.links,
},
};
return;
}
}
}
var str = _status.renku.length ? "获得仁库中的所有牌" : "摸两张牌";
event.result = await player
.chooseBool(get.prompt("kano_liezhen"), str)
.set("frequentSkill", "kano_liezhen")
.forResult();
},
async content(event, trigger, player) {
const result = event.cost_data;
if (!result || !result.links.length) {
if (_status.renku.length) {
const cards = _status.renku.slice(0);
_status.renku.length = 0;
game.updateRenku();
await player.gain(cards, "gain2", "fromRenku");
} else player.draw(2);
} else {
player.chooseUseTarget(result.links[0][2], true);
}
},
init(player) {
player.storage.renku = true;
},
},
kano_poyu: {
trigger: { target: "useCardToTargeted" },
charlotte: true,
filter(event, player) {
return (
_status.renku.length > 0 &&
(event.card.name == "sha" ||
(get.type(event.card) == "trick" &&
get.tag(event.card, "damage") > 0))
);
},
check(trigger, player) {
return get.effect(player, trigger.card, trigger.player, player) < 0;
},
content() {
"step 0";
player.judge();
("step 1");
var bool = false,
type = get.type2(result.card.name);
for (var i of _status.renku) {
if (get.suit(i) == result.suit || get.type2(i) == type) {
bool = true;
break;
}
}
if (bool) {
player
.chooseButton([
"是否移去一张牌,令" +
get.translation(trigger.card) +
"对你无效?",
_status.renku,
])
.set("types", [result.suit, type])
.set("filterButton", function (button) {
var types = _status.event.types;
return (
get.suit(button.link, false) == types[0] ||
get.type2(button.link, false) == types[1]
);
})
.set("ai", () => 1);
} else event.finish();
("step 2");
if (result.bool) {
var card = result.links[0];
player.$throw(card, 1000);
_status.renku.remove(card);
game.cardsDiscard(card).fromRenku = true;
game.log(player, "将", card, "置入了弃牌堆");
trigger.excluded.add(player);
game.updateRenku();
}
},
init(player) {
player.storage.renku = true;
},
},
//藤川米亚
mia_shihui: {
trigger: { player: "phaseDrawBegin1" },
forced: true,
filter(event, player) {
return !event.numFixed;
},
content() {
trigger.changeToZero();
var num = 0;
all = player.getAllHistory();
if (all.length > 1) {
for (var i = all.length - 2; i >= 0; i--) {
if (all[i].isMe) {
for (var evt of all[i].lose) {
if (evt.type == "discard") num += evt.cards2.length;
}
break;
}
}
}
player.draw(1 + num);
},
group: "mia_shihui_recover",
subSkill: {
recover: {
trigger: { player: "phaseJieshuBegin" },
forced: true,
filter(event, player) {
return player.isDamaged() || player.countCards("he") > 0;
},
content() {
player.chooseToDiscard("he", true);
player.recover();
},
},
},
},
mia_qianmeng: {
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
dutySkill: true,
filter(event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content() {
"step 0";
player.draw();
("step 1");
if (player.countCards("he") > 0) {
player.chooseCard("he", true, "潜梦:选择一张牌置于牌堆中");
} else event.finish();
("step 2");
if (result.bool) {
var card = result.cards[0];
player.storage.mia_qianmeng = card;
player.$throw(card, 1000);
player.lose(card, ui.cardPile).insert_index = function () {
return ui.cardPile.childNodes[
Math.ceil(ui.cardPile.childNodes.length / 2)
];
};
} else event.finish();
("step 3");
game.delayx();
},
onremove: true,
group: ["mia_qianmeng_achieve", "mia_qianmeng_fail"],
subSkill: {
achieve: {
trigger: {
global: ["gainAfter", "loseAsyncAfter"],
},
forced: true,
filter(event, player) {
var card = player.storage.mia_qianmeng;
if (event.name == "gain") {
var source = event.player,
cards = event.getg(source);
return (
cards.includes(card) &&
source.getCards("hejsx").includes(card)
);
} else {
if (event.type != "gain") return false;
var owner = get.owner(card);
return owner && event.getg(owner).includes(card);
}
},
skillAnimation: true,
animationColor: "key",
content() {
"step 0";
game.log(player, "成功完成使命");
player.awakenSkill("mia_qianmeng");
var card = player.storage.mia_qianmeng,
owner = get.owner(card);
if (owner && owner != player) owner.give(card, player);
("step 1");
if (player.hp < player.maxHp)
player.recover(player.maxHp - player.hp);
player.changeSkills(["mia_fengfa"], ["mia_shihui"]);
},
},
fail: {
trigger: { player: "die" },
forceDie: true,
filter(event, player) {
return get.itemtype(player.storage.mia_qianmeng) == "card";
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt("mia_qianmeng"),
"令一名角色获得牌堆中所有点数为" +
player.storage.mia_qianmeng.number +
"的牌",
lib.filter.notMe
)
.forResult();
},
async content(event, trigger, player) {
game.log(player, "使命失败");
var target = event.targets[0];
var num = player.storage.mia_qianmeng.number,
suit = player.storage.mia_qianmeng.suit,
cards = [];
for (var i = 0; i < ui.cardPile.childNodes.length; i++) {
var card = ui.cardPile.childNodes[i];
if (card.number == num && card.suit == suit)
cards.push(card);
}
if (cards.length) await target.gain(cards, "gain2");
},
},
},
},
mia_fengfa: {
trigger: { player: "phaseDrawBegin2" },
forced: true,
filter(event, player) {
return !event.numFixed;
},
content() {
var num = 0;
all = player.getAllHistory();
if (all.length > 1) {
for (var i = all.length - 2; i >= 0; i--) {
if (all[i].isMe) {
num += all[i].useCard.length;
break;
}
}
}
trigger.num += num;
},
},
//一之濑琴美
kotomi_qinji: {
trigger: { player: "phaseUseBegin" },
filter(event, player) {
return player.hasUseTarget("wanjian");
},
//chooseUseTarget也不好改 先放着
direct: true,
content() {
player.addTempSkill("kotomi_qinji2");
player.chooseUseTarget(
{ name: "wanjian", isCard: true },
get.prompt("kotomi_qinji"),
"视为使用一张【万箭齐发】"
).logSkill = "kotomi_qinji";
},
},
kotomi_qinji2: {
trigger: { source: "damageBefore" },
forced: true,
popup: false,
filter(event, player) {
return event.getParent().skill == "kotomi_qinji";
},
content() {
trigger.cancel();
trigger.player.loseHp(trigger.num);
},
},
kotomi_chuanxiang: {
global: "kotomi_chuanxiang2",
},
kotomi_chuanxiang2: {
enable: "phaseUse",
usable: 1,
filter(event, player) {
return (
!player.hasSkill("kotomi_chuanxiang") &&
player.countCards(
"e",
lib.skill.kotomi_chuanxiang2.filterCard
) > 0
);
},
filterCard(card, player) {
if (!player) player = _status.event.player;
return game.hasPlayer(function (current) {
return current != player && current.canEquip(card);
});
},
position: "e",
filterTarget(card, player, target) {
return target != player && target.canEquip(ui.selected.cards[0]);
},
check(card) {
if (get.value(card) <= 0) return 10;
var player = _status.event.player;
if (
game.hasPlayer(function (current) {
return (
current.hasSkill("kotomi_chuanxiang") &&
get.attitude(player, current) > 0
);
})
) {
var subtype = get.subtype(card, false);
if (
player.countCards("hs", function (cardx) {
return (
get.type(cardx) == "equip" &&
get.subtype(cardx, false) == subtype &&
player.canUse(cardx, player) &&
get.effect(player, cardx, player, player) > 0
);
})
)
return 8;
return 7 / Math.max(1, get.value(card));
}
return 0;
},
promptfunc() {
var players = game.filterPlayer(function (current) {
return current.hasSkill("kotomi_chuanxiang");
});
return (
"将一张装备牌传给其他角色,然后令" +
get.translation(players) +
"摸一张牌。若传给该角色,则其改为摸两张牌。"
);
},
prepare: "give",
discard: false,
lose: false,
content() {
"step 0";
target.equip(cards[0]);
var list = game.filterPlayer(function (current) {
return current.hasSkill("kotomi_chuanxiang");
});
game.asyncDraw(list, function (targetx) {
return targetx == target ? 2 : 1;
});
("step 1");
game.delayx();
},
ai: {
order: 8,
result: {
target(player, target) {
var card = ui.selected.cards[0];
if (!card) return 0;
var eff = get.effect(target, card, player, target);
if (target.hasSkill("kotomi_chuanxiang")) eff++;
return eff;
},
},
},
},
//井上晶
asara_shelu: {
enable: "phaseUse",
usable: 1,
filter(event, player) {
return (
player.countCards("he") > 0 &&
game.hasPlayer(function (current) {
return current != player && current.countCards("h") > 0;
})
);
},
filterCard: true,
position: "he",
filterTarget(card, player, target) {
return target != player && target.countCards("h") > 0;
},
check(card) {
return 6 - get.value(card);
},
content() {
"step 0";
if (!target.countCards("h")) event.finish();
else player.choosePlayerCard(target, "h", true);
("step 1");
player.showCards(result.cards);
event.cards2 = result.cards;
("step 2");
target.$give(event.cards2, player, false);
target.loseToSpecial(
event.cards2,
"asara_yingwei",
player
).visible = true;
var card1 = cards[0],
card2 = event.cards2[0];
if (card1.suit == card2.suit) player.draw(2);
if (card1.number == card2.number) player.recover();
},
ai: {
order: 6,
result: {
target: -1,
},
},
},
asara_yingwei: {
trigger: { player: "yingbian" },
forced: true,
filter: (event, player) =>
event.card.isCard &&
player.hasHistory(
"lose",
(evt) =>
evt.getParent() == event &&
Object.values(evt.gaintag_map).some((value) =>
value.includes("asara_yingwei")
)
),
content: () => {
trigger.forceYingbian = true;
},
ai: {
combo: "asara_shelu",
},
},
//国崎往人
yukito_kongwu: {
enable: "phaseUse",
usable: 1,
content() {
"step 0";
if (_status.connectMode) event.time = lib.configOL.choose_timeout;
event.videoId = lib.status.videoId++;
if (player.isUnderControl()) {
game.swapPlayerAuto(player);
}
var switchToAuto = function () {
game.pause();
game.countChoose();
setTimeout(function () {
_status.imchoosing = false;
event._result = {
bool: true,
score: get.rand(1, 5),
};
if (event.dialog) event.dialog.close();
if (event.control) event.control.close();
game.resume();
}, 5000);
};
var createDialog = function (player, id) {
if (_status.connectMode) lib.configOL.choose_timeout = "30";
if (player == game.me) return;
var str =
get.translation(player) + "正在表演《小空飞天》...<br>";
ui.create.dialog(str).videoId = id;
};
var chooseButton = function () {
lib.skill.yufeng.$playFlappyBird(5, "小空飞天");
};
//event.switchToAuto=switchToAuto;
game.broadcastAll(createDialog, player, event.videoId);
if (event.isMine()) {
chooseButton();
} else if (event.isOnline()) {
event.player.send(chooseButton);
event.player.wait();
game.pause();
} else {
switchToAuto();
}
("step 1");
game.broadcastAll(
function (id, time) {
if (_status.connectMode) lib.configOL.choose_timeout = time;
var dialog = get.idDialog(id);
if (dialog) {
dialog.close();
}
},
event.videoId,
event.time
);
var result = event.result || result;
game.log(player, "获得了", "#g" + result.score + "分");
if (!result.score) {
player.chooseToDiscard(2, true, "he");
event.finish();
return;
}
var list = [];
var list2 = [];
for (var i = 0; i < 5; i++) {
if (lib.skill.yukito_kongwu.moves[i].filter(player, true))
list.push(i);
else list2.push(i);
}
if (list.length >= result.score)
list = list.randomGets(result.score);
else list.addArray(list2.randomGets(result.score - list.length));
list.sort();
var next = player.chooseButton([
"控物:请选择一项",
[
list.map((i) => {
return [i, lib.skill.yukito_kongwu.moves[i].prompt];
}),
"textbutton",
],
]);
next.set("forced", true);
next.set("filterButton", function (button) {
return lib.skill.yukito_kongwu.moves[button.link].filter(
_status.event.player
);
});
next.set("ai", function (button) {
if (
lib.skill.yukito_kongwu.moves[button.link].filter(
_status.event.player,
true
)
)
return 1 + Math.random();
return Math.random();
});
("step 2");
var num = result.links[0];
switch (num) {
case 0:
event.goto(3);
break;
case 1:
event.goto(5);
break;
case 2:
event.goto(7);
break;
case 3:
event.goto(9);
break;
case 4:
player.moveCard(true);
event.finish();
break;
}
("step 3");
player
.chooseTarget(true, "令一名角色摸两张牌")
.set("ai", function (target) {
var player = _status.event.player;
var att =
get.attitude(player, target) /
Math.sqrt(1 + target.countCards("h"));
if (target.hasSkillTag("nogain")) att /= 10;
return att;
});
("step 4");
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
target.draw(2);
}
event.finish();
("step 5");
player
.chooseTarget(true, "对一名角色造成1点伤害")
.set("ai", function (target) {
var player = _status.event.player;
return get.damageEffect(target, player, player);
});
("step 6");
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
target.damage();
}
event.finish();
("step 7");
player
.chooseTarget(
true,
"令一名已受伤的角色回复1点体力",
function (card, player, target) {
return target.isDamaged();
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.recoverEffect(target, player, player);
});
("step 8");
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
target.recover();
}
event.finish();
("step 9");
player
.chooseTarget(
true,
"弃置一名角色区域内的两张牌",
function (card, player, target) {
return target.countDiscardableCards(player, "hej") > 0;
}
)
.set("ai", function (target) {
return -get.attitude(_status.event.player, target);
});
("step 10");
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
player.discardPlayerCard(target, "hej", true, 2);
}
event.finish();
},
moves: [
{
prompt: "令一名角色摸两张牌",
filter: () => true,
},
{
prompt: "对一名角色造成1点伤害",
filter(player, ai) {
if (!ai) return true;
return game.hasPlayer(function (current) {
return get.damageEffect(current, player, player) > 0;
});
},
},
{
prompt: "令一名已受伤的角色回复1点体力",
filter(player, ai) {
return game.hasPlayer(function (current) {
if (current.isDamaged())
return (
!ai ||
get.recoverEffect(current, player, player) > 0
);
});
},
},
{
prompt: "弃置一名角色区域内的两张牌",
filter(player, ai) {
return game.hasPlayer(function (current) {
return (
current.countDiscardableCards(
player,
"hej",
function (card) {
if (!ai) return true;
return (
get.buttonValue({
link: card,
}) *
get.attitude(player, current) >
0
);
}
) >=
(ai
? 1
: Math.min(
2,
current.countDiscardableCards(
player,
"hej"
)
))
);
});
},
},
{
prompt: "移动场上的一张牌",
filter(player, ai) {
return player.canMoveCard(ai);
},
},
],
ai: {
order: 10,
result: { player: 1 },
threaten: 3.2,
},
},
yukito_yaxiang: {
enable: "chooseToUse",
limited: true,
filter(event, player) {
return (
event.type == "dying" &&
(player.name1 == "key_yukito" || player.name2 == "key_yukito")
);
},
filterTarget(card, player, target) {
return target == _status.event.dying;
},
selectTarget: -1,
skillAnimation: true,
animationColor: "key",
content() {
"step 0";
player.awakenSkill("yukito_yaxiang");
player.reinitCharacter("key_yukito", "key_crow", false);
("step 1");
if (target.hp < 3) target.recover(3 - target.hp);
("step 2");
var cards = target.getCards("j");
if (cards.length) target.discard(cards);
("step 3");
target.addSkills("misuzu_zhongyuan");
},
derivation: "misuzu_zhongyuan",
ai: {
save: true,
order: 4,
result: {
target(player, target) {
if (get.attitude(player, target) < 4) return false;
if (
player.countCards("h", function (card) {
var mod2 = game.checkMod(
card,
player,
"unchanged",
"cardEnabled2",
player
);
if (mod2 != "unchanged") return mod2;
var mod = game.checkMod(
card,
player,
target,
"unchanged",
"cardSavable",
player
);
if (mod != "unchanged") return mod;
var savable = get.info(card).savable;
if (typeof savable == "function")
savable = savable(card, player, target);
return savable;
}) >=
1 - target.hp
)
return false;
if (target == player || target == get.zhu(player))
return true;
return !player.hasUnknown();
},
},
},
},
misuzu_zhongyuan: {
trigger: { player: "judge" },
skillAnimation: true,
animationColor: "key",
logTarget: "player",
cost() {
"step 0";
var str =
"你的" +
(trigger.judgestr || "") +
"判定为" +
get.translation(trigger.player.judging[0]) +
",是否发动【终愿】修改判定结果?";
if (player.isUnderControl()) {
game.swapPlayerAuto(player);
}
var switchToAuto = function () {
_status.imchoosing = false;
event._result = {
bool: false,
};
if (event.dialog) event.dialog.close();
if (event.control) event.control.close();
};
var chooseButton = function (player, str) {
var event = _status.event;
player = player || event.player;
if (!event._result) event._result = {};
var dialog = ui.create.dialog(str, "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 =
"<span>" + get.translation(listi[i]) + "</span>";
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 = 1; i < 14; i++) {
var td = ui.create.div(
".shadowed.reduce_radius.pointerdiv.tdnode"
);
td.link = i;
table2.appendChild(td);
var num = i;
td.innerHTML = "<span>" + get.strNumber(num) + "</span>";
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: false,
};
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, str);
} else if (event.isOnline()) {
event.player.send(chooseButton, event.player, str);
event.player.wait();
game.pause();
} else {
switchToAuto();
}
("step 1");
var map = event.result || result;
if (map.bool) {
event.result = {
bool: true,
cost_data: map,
};
}
},
async content(event, trigger, player) {
var map = event.cost_data;
player.awakenSkill("misuzu_zhongyuan");
game.log(
player,
"将判定结果修改为了",
"#g" + get.translation(map.suit + 2) + get.strNumber(map.number)
);
trigger.fixedResult = {
suit: map.suit,
color: get.color({ suit: map.suit }),
number: map.number,
};
player.popup(
get.translation(map.suit + 2) + get.strNumber(map.number),
"thunder"
);
event.getParent("arrangeTrigger").finish();
},
},
//凤千早
chihaya_liewu: {
derivation: "chihaya_huairou",
mod: {
cardUsable(card) {
if (card.name == "sha") return Infinity;
},
targetInRange(card) {
if (card.name == "sha") return true;
},
},
trigger: { player: "useCard2" },
filter(event, player) {
var card = event.card;
var info = get.info(card);
if (info.type != "trick" || 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;
},
async cost(event, trigger, player) {
var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
event.result = await player
.chooseTarget(
get.prompt("chihaya_liewu"),
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)
.forResult();
},
autodelay: true,
async content(event, trigger, player) {
trigger.targets.addArray(event.targets);
game.log(event.targets, "也成为了", trigger.card, "的目标");
},
group: "chihaya_liewu2",
},
chihaya_liewu2: {
trigger: { player: "disableEquipAfter" },
forced: true,
filter(event, player) {
return !player.hasEnabledSlot() && !player._chihaya_liewu;
},
skillAnimation: true,
animationColor: "orange",
content() {
player._chihaya_liewu = true;
player.loseMaxHp(4);
player.addSkills("chihaya_huairou");
},
},
chihaya_huairou: {
audio: 2,
enable: "phaseUse",
position: "he",
filter: (event, player) =>
player.hasCard(
(card) => lib.skill.chihaya_huairou.filterCard(card, player),
lib.skill.chihaya_huairou.position
),
filterCard: (card, player) =>
get.type(card) == "equip" && player.canRecast(card),
check(card) {
if (!_status.event.player.hasEquipableSlot(get.subtype(card)))
return 5;
return 3 - get.value(card);
},
content() {
player.recast(cards);
},
discard: false,
lose: false,
delay: false,
prompt: "将一张装备牌置入弃牌堆并摸一张牌",
ai: {
order: 10,
result: {
player: 1,
},
},
},
chihaya_youfeng: {
enable: "chooseToUse",
zhuanhuanji: true,
mark: true,
intro: {
content(storage, player) {
return storage
? "每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。"
: "每轮限一次你可以加1点体力上限视为使用一张普通锦囊牌。";
},
},
marktext: "☯",
init(player) {
player.storage.chihaya_youfeng = false;
},
hiddenCard(player, name) {
if (player.storage.chihaya_youfeng && !player.hasEnabledSlot())
return false;
if (
player.hasSkill(
"chihaya_youfeng_" +
(player.storage.chihaya_youfeng || false)
)
)
return false;
var type = get.type(name);
if (player.storage.chihaya_youfeng) return type == "basic";
return type == "trick";
},
filter(event, player) {
if (player.storage.chihaya_youfeng && !player.hasEnabledSlot())
return false;
if (
player.hasSkill(
"chihaya_youfeng_" +
(player.storage.chihaya_youfeng || false)
)
)
return false;
var type = player.storage.chihaya_youfeng ? "basic" : "trick";
for (var name of lib.inpile) {
if (get.type(name) != type) continue;
if (
event.filterCard(
{ name: name, isCard: true },
player,
event
)
)
return true;
}
return false;
},
chooseButton: {
dialog(event, player) {
const dialog = ui.create.dialog("游凤", "hidden");
const equips = [];
if (player.storage.chihaya_youfeng) {
for (let i = 1; i < 6; i++) {
if (!player.hasEnabledSlot(i)) continue;
equips.push([i, get.translation("equip" + i)]);
}
if (equips.length > 0) dialog.add([equips, "tdnodes"]);
}
const type = player.storage.chihaya_youfeng ? "basic" : "trick";
const list = [];
for (const name of lib.inpile) {
if (get.type(name) != type) continue;
if (
event.filterCard(
{ name: name, isCard: true },
player,
event
)
) {
list.push([type, "", name]);
if (name == "sha") {
for (let j of lib.inpile_nature)
list.push([type, "", name, j]);
}
}
}
dialog.add([list, "vcard"]);
return dialog;
},
filter(button) {
if (
ui.selected.buttons.length &&
typeof button.link == typeof ui.selected.buttons[0].link
)
return false;
return true;
},
select() {
if (_status.event.player.storage.chihaya_youfeng) return 2;
return 1;
},
check(button) {
var player = _status.event.player;
if (typeof button.link == "number") {
if (!player.hasEmptySlot(button.link)) {
var card = player.getEquip(button.link);
if (card) {
var val = get.value(card);
if (val > 0) return 0;
return 5 - val;
}
}
switch (button.link) {
case 3:
return 4.5;
case 4:
return 4.4;
case 5:
return 4.3;
case 2:
return (3 - player.hp) * 1.5;
case 1: {
if (
game.hasPlayer(function (current) {
return (
(get.realAttitude || get.attitude)(
player,
current
) < 0 &&
get.distance(player, current) > 1
);
})
)
return 0;
return 3.2;
}
}
}
var name = button.link[2];
var evt = _status.event.getParent();
if (get.type(name) == "basic") {
if (name == "shan") return 2;
if (evt.type == "dying") {
if (get.attitude(player, evt.dying) < 2) return false;
if (name == "jiu") return 2.1;
return 1.9;
}
if (evt.type == "phase")
return player.getUseValue({
name: name,
nature: button.link[3],
isCard: true,
});
return 1;
}
if (
![
"chuqibuyi",
"shuiyanqijunx",
"juedou",
"nanman",
"wanjian",
"shunshou",
"zhujinqiyuan",
].includes(name)
)
return 0;
var card = { name: name, isCard: true };
if (["shunshou", "zhujinqiyuan"].includes(card.name)) {
if (
!game.hasPlayer(function (current) {
return (
get.attitude(player, current) != 0 &&
get.distance(player, current) <= 1 &&
player.canUse(card, current) &&
get.effect(current, card, player, player) > 0
);
})
)
return 0;
return player.getUseValue(card) - 7;
}
return player.getUseValue(card) - 4;
},
backup(links, player) {
if (links.length == 1)
return {
filterCard() {
return false;
},
selectCard: -1,
viewAs: {
name: links[0][2],
nature: links[0][3],
isCard: true,
},
popname: true,
precontent() {
player.logSkill("chihaya_youfeng");
player.gainMaxHp();
delete event.result.skill;
player.addTempSkill(
"chihaya_youfeng_" +
(player.storage.chihaya_youfeng || false),
"roundStart"
);
player.changeZhuanhuanji("chihaya_youfeng");
},
};
if (typeof links[1] == "number") links.reverse();
var equip = links[0];
var name = links[1][2];
var nature = links[1][3];
return {
filterCard() {
return false;
},
selectCard: -1,
equip: equip,
viewAs: {
name: name,
nature: nature,
isCard: true,
},
popname: true,
precontent() {
player.logSkill("chihaya_youfeng");
player.disableEquip(
lib.skill.chihaya_youfeng_backup.equip
);
delete event.result.skill;
player.addTempSkill(
"chihaya_youfeng_" +
(player.storage.chihaya_youfeng || false),
"roundStart"
);
player.changeZhuanhuanji("chihaya_youfeng");
},
};
},
prompt(links, player) {
if (links.length == 1)
return (
"增加1点体力上限视为使用" +
(get.translation(links[0][3]) || "") +
get.translation(links[0][2])
);
if (typeof links[1] == "number") links.reverse();
var equip = "equip" + links[0];
var name = links[1][2];
var nature = links[1][3];
return (
"废除自己的" +
get.translation(equip) +
"栏,视为使用" +
(get.translation(nature) || "") +
get.translation(name)
);
},
},
ai: {
respondSha: true,
respondShan: true,
skillTagFilter(player, tag, arg) {
if (arg == "respond") return false;
if (
!player.storage.chihaya_youfeng ||
player.hasSkill("chihaya_youfeng_true")
)
return false;
},
order: 1,
result: {
player: 1,
},
},
},
chihaya_youfeng_true: { charlotte: true },
chihaya_youfeng_false: { charlotte: true },
//七濑留美
rumi_shuwu: {
mod: {
cardUsable(card) {
if (card.name == "sha") return Infinity;
},
targetInRange(card) {
if (card.name == "sha") return true;
},
},
trigger: { player: "useCard2" },
filter(event, player) {
var card = event.card;
var info = get.info(card);
if (info.type != "trick" || 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;
},
autodelay: true,
async cost(event, trigger, player) {
var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
const { result } = await player
.chooseTarget(
get.prompt("rumi_shuwu"),
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);
event.result = result;
},
content() {
trigger.targets.addArray(event.targets);
game.log(event.targets, "也成为了", trigger.card, "的目标");
},
group: "rumi_shuwu2",
},
rumi_shuwu2: {
trigger: { player: "phaseUseEnd" },
forced: true,
filter(event, player) {
if (player.hp <= 3) return true;
if (
player.getHistory("useCard", function (evt) {
return (
evt.card.name == "sha" &&
evt.addCount !== false &&
evt.getParent("phaseUse") == event
);
}).length <= 1
)
return true;
if (
player.getHistory("sourceDamage", function (evt) {
return (
get.type(evt.card, false) == "trick" &&
evt.getParent("phaseUse") == event
);
}).length == 0
)
return true;
return false;
},
content() {
var num = 0;
if (player.hp <= 3) num++;
if (
player.getHistory("useCard", function (evt) {
return (
evt.card.name == "sha" &&
evt.addCount !== false &&
evt.getParent("phaseUse") == trigger
);
}).length <= 1
)
num++;
if (
player.getHistory("sourceDamage", function (evt) {
return (
get.type(evt.card, false) == "trick" &&
evt.getParent("phaseUse") == trigger
);
}).length == 0
)
num++;
player.draw(num);
player.addTempSkill("rumi_shuwu3");
player.addMark("rumi_shuwu3", num, false);
},
},
rumi_shuwu3: {
mod: {
maxHandcard(player, num) {
return num + player.countMark("rumi_shuwu3");
},
},
onremove: true,
},
//凤咲夜
sakuya_junbu: {
mod: {
targetInRange(card, player) {
if (player.countDisabledSlot() >= 1) return true;
},
cardUsable(card, player) {
if (player.countDisabledSlot() >= 2) return Infinity;
},
},
trigger: { player: "useCard2" },
filter(event, player) {
if (player.countDisabledSlot() >= 4) return true;
return lib.skill.sakuya_junbu.filter2.apply(this, arguments);
},
filter2(event, player) {
if (player.countDisabledSlot() < 3) return false;
var card = event.card;
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;
},
async cost(event, trigger, player) {
const result = { bool: false };
event.result = result;
if (player.countDisabledSlot() >= 4) {
result.bool = true;
if (!lib.skill.sakuya_junbu.filter2(trigger, player)) {
return;
}
}
var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
const { result: result2 } = await player
.chooseTarget(
get.prompt("sakuya_junbu"),
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);
if (result2.bool) {
result.bool = true;
result.targets = result2.targets;
}
},
async content(event, trigger, player) {
if (player.countDisabledSlot() >= 4) {
trigger.directHit.addArray(game.players);
game.log(trigger.card, "不可被响应");
}
if (event.targets && event.targets.length > 0) {
trigger.targets.addArray(event.targets);
game.log(event.targets, "也成为了", trigger.card, "的目标");
}
},
group: "sakuya_junbu_damage",
subSkill: {
damage: {
trigger: { source: "damageBegin1" },
forced: true,
sub: true,
filter(event, player) {
return (
!player.hasEnabledSlot() &&
event.getParent().type == "card"
);
},
logTarget: "player",
content() {
player.loseHp();
trigger.num++;
},
},
},
},
//铃木央人
hiroto_huyu: {
trigger: { global: "phaseUseEnd" },
noHidden: true,
filter(event, player) {
return (
player != event.player &&
player.hasSkill("hiroto_huyu") &&
!player.hasSkill("hiroto_zonglve") &&
event.player.countCards("h") > 0
);
},
async cost(event, trigger, player) {
event.result = await trigger.player
.chooseCard(
2,
"h",
"是否对" + get.translation(player) + "发动【虎驭】?",
"将两张手牌交给该角色,然后令其获得〖纵略〗并于下回合获得该角色得到的所有牌"
)
.set(
"goon",
(function () {
var source = trigger.player;
if (get.attitude(source, player) > 0) return 7;
if (source.hp > 2) return 4;
return 0;
})()
)
.set("ai", function (card) {
return _status.event.goon - get.value(card);
})
.forResult();
},
content() {
var target = trigger.player;
target.give(cards, player);
player.storage.hiroto_huyu2 = target;
player.addSkills("hiroto_zonglve");
player.addSkill("hiroto_huyu2");
},
derivation: "hiroto_zonglve",
},
hiroto_huyu2: {
trigger: { player: "phaseEnd" },
forced: true,
popup: false,
charlotte: true,
async content(event, trigger, player) {
player.removeSkill("hiroto_huyu2");
await player.removeSkills("hiroto_zonglve");
player.removeGaintag("hiroto_huyu2");
var target = player.storage.hiroto_huyu2;
if (target && target.isIn()) {
var cards = [];
player.getHistory("gain", function (evt) {
cards.addArray(evt.cards);
});
var he = player.getCards("he");
cards = cards.filter(function (card) {
return he.includes(card);
});
if (cards.length)
target.gain(cards, player, "giveAuto", "bySelf");
}
},
mark: "character",
intro: { content: "已成为$的工具人" },
group: "hiroto_huyu_gain",
},
hiroto_huyu_gain: {
trigger: { player: "gainBegin" },
silent: true,
filter(event, player) {
if (player == _status.currentPhase)
event.gaintag.add("hiroto_huyu2");
return false;
},
},
hiroto_zonglve: {
enable: "phaseUse",
usable: 1,
filter(event, player) {
return (
player.countCards("h") > 0 &&
game.hasPlayer(function (current) {
return current != player && current.countCards("h") > 0;
})
);
},
filterTarget(card, player, target) {
return target != player && target.countCards("h") > 0;
},
filterCard: true,
delay: false,
charlotte: true,
position: "h",
discard: false,
lose: false,
content() {
"step 0";
player.choosePlayerCard(true, target, "h");
("step 1");
event.card = result.cards[0];
player.$compare(cards[0], target, event.card);
game.log(player, "展示了", cards[0]);
game.log(target, "展示了", event.card);
game.delay(3.5);
("step 2");
game.broadcastAll(ui.clear);
if (get.color(cards[0], player) == get.color(card, target)) {
target.damage("nocard");
target.discard(card).animate = false;
} else player.gainPlayerCard(target, true, 2, "hej");
},
mod: {
maxHandcard(player, num) {
return num + 3;
},
},
ai: {
order: 7,
result: {
target: -1,
},
},
},
hiroto_tuolao: {
trigger: { player: "phaseAfter" },
forced: true,
juexingji: true,
skillAnimation: true,
animationColor: "water",
filter(event, player) {
return (
player.phaseNumber > 1 &&
!player.getHistory("lose", function (evt) {
return evt.getParent(2).name == "hiroto_huyu2";
}).length
);
},
content() {
player.awakenSkill("hiroto_tuolao");
player.draw(3);
player.changeSkills(["hiroto_zonglve"], ["hiroto_huyu"]);
},
},
//水织静久
shizuku_sizhi: {
audio: 2,
enable: "phaseUse",
getResult(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(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() {
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(card) {
var evt = _status.event;
if (!evt.shizuku_sizhi_choice)
evt.shizuku_sizhi_choice = lib.skill.shizuku_sizhi.getResult(
evt.player.getCards("he")
);
if (!evt.shizuku_sizhi_choice.includes(card)) return 0;
return 1;
},
position: "he",
content() {
player.draw(cards.length * 2).gaintag = ["shizuku_sizhi2"];
player.addTempSkill("shizuku_sizhi2");
},
ai: {
order: 5,
result: { player: 1 },
},
},
shizuku_sizhi2: {
onremove(player) {
player.removeGaintag("shizuku_sizhi2");
},
mod: {
targetInRange(card) {
if (!card.cards || !card.cards.length) return;
for (var i of card.cards) {
if (
!i.hasGaintag("shizuku_sizhi2") ||
get.color(i) != "black"
)
return;
}
return true;
},
cardUsable(card) {
if (!card.cards || !card.cards.length) return;
for (var i of card.cards) {
if (
!i.hasGaintag("shizuku_sizhi2") ||
get.color(i) != "black"
)
return;
}
return Infinity;
},
ignoredHandcard(card, player) {
if (
card.hasGaintag("shizuku_sizhi2") &&
get.color(card) == "red"
) {
return true;
}
},
cardDiscardable(card, player, name) {
if (
name == "phaseDiscard" &&
card.hasGaintag("shizuku_sizhi2") &&
get.color(card) == "red"
) {
return false;
}
},
aiOrder(player, card, num) {
if (
get.itemtype(card) == "card" &&
card.hasGaintag("shizuku_sizhi2") &&
get.color(card) == "black"
)
return num - 0.1;
},
},
},
shizuku_biyi: {
trigger: { player: "damageEnd" },
frequent: true,
content() {
"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();
},
},
shizuku_sanhua: {
trigger: { player: "die" },
forceDie: true,
skillAnimation: true,
animationColor: "thunder",
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(get.prompt2("shizuku_sanhua"), lib.filter.notMe)
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
})
.forResult();
},
async content(event, trigger, player) {
var target = event.targets[0];
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) await target.gain(cards, "gain2");
},
},
//鸣濑白羽
shiroha_yuzhao: {
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
charlotte: true,
filter(event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content() {
player
.addToExpansion(get.cards(game.countGroup()), "draw")
.gaintag.add("shiroha_yuzhao");
},
marktext: "兆",
intro: {
markcount: "expansion",
mark(dialog, content, player) {
var content = player.getExpansions("shiroha_yuzhao");
if (content && content.length) {
if (player == game.me || player.isUnderControl()) {
dialog.addAuto(content);
} else {
return "共有" + get.cnNumber(content.length) + "张牌";
}
}
},
content(content, player) {
var content = player.getExpansions("shiroha_yuzhao");
if (content && content.length) {
if (player == game.me || player.isUnderControl()) {
return get.translation(content);
}
return "共有" + get.cnNumber(content.length) + "张牌";
}
},
},
group: "shiroha_yuzhao_umi",
},
shiroha_yuzhao_umi: {
trigger: { global: "phaseBegin" },
forced: true,
filter(event, player) {
return (
player.getExpansions("shiroha_yuzhao").length > 0 &&
get.distance(event.player, player) <= 1
);
},
content() {
"step 0";
event.num = game.countGroup();
player
.addToExpansion(get.cards(event.num))
.gaintag.add("shiroha_yuzhao");
("step 1");
var next = player.chooseToMove(),
num = game.countGroup();
next.set(
"prompt",
"预兆:将" + get.cnNumber(num) + "张牌置于牌堆顶"
);
next.set("num", num);
next.set("forced", true);
next.set("filterOk", function (moved) {
return moved[1].length == _status.event.num;
});
next.set("filterMove", function (from, to, moved) {
if (to != 1) return true;
return moved[1].length < _status.event.num;
});
next.set("list", [
[
get.translation(player) + "(你)的“兆”",
player.getExpansions("shiroha_yuzhao"),
],
["牌堆顶"],
]);
next.set("processAI", function (list) {
var cards = list[0][1],
cards2 = cards.randomRemove(_status.event.num);
return [cards, cards2];
});
("step 2");
if (result && result.bool) {
var cards = result.moved[1];
player.lose(cards, ui.cardPile, "insert");
}
game.updateRoundNumber();
},
},
shiroha_guying: {
derivation: "shiroha_guying_rewrite",
trigger: {
player: "damageBegin3",
source: "damageBegin1",
},
filter(event, player, name) {
if (
!player.storage.shiroha_jiezhao &&
player.hasSkill("shiroha_guying_temp")
)
return false;
if (name == "damageBegin3") return true;
return player != event.player;
},
locked(skill, player) {
if (!player || !player.storage.shiroha_jiezhao) return true;
return false;
},
cost() {
"step 0";
var num = event.triggername == "damageBegin3" ? -1 : 1;
if (
player.storage.shiroha_jiezhao ||
!player.hasSkill("shiroha_guying")
) {
if (num > 0)
player.chooseBool(
get.prompt("shiroha_guying", trigger.player),
"进行判定。若判定结果为黑色,则即将对其造成的伤害+1"
);
else
player.chooseBool(
get.prompt("shiroha_guying"),
"进行判定。若判定结果为红色,则即将受到的伤害-1"
);
} else event._result = { bool: true };
("step 1");
event.result = result;
},
content() {
"step 0";
var num = event.triggername == "damageBegin3" ? -1 : 1;
event.num = num;
player.addTempSkill("shiroha_guying_temp");
player.judge(function (card) {
return get.color(card) ==
(_status.event.getParent("shiroha_guying").num > 0
? "black"
: "red")
? 2
: 0;
}).judge2 = function (result) {
return result.bool ? true : false;
};
("step 1");
if (result.bool) trigger.num += num;
},
},
shiroha_guying_temp: { charlotte: true },
shiroha_jiezhao: {
trigger: { global: "judge" },
filter(event, player) {
return (
player.getExpansions("shiroha_yuzhao").length &&
event.player.isIn()
);
},
async cost(event, trigger, player) {
const list = player.getExpansions("shiroha_yuzhao");
const { result } = await player
.chooseButton(
[
get.translation(trigger.player) +
"的" +
(trigger.judgestr || "") +
"判定为" +
get.translation(trigger.player.judging[0]) +
"" +
get.prompt("shiroha_jiezhao"),
list,
"hidden",
],
function (button) {
var card = button.link;
var trigger = _status.event.getTrigger();
var player = _status.event.player;
var judging = _status.event.judging;
var result =
trigger.judge(card) - trigger.judge(judging);
var attitude = get.attitude(player, trigger.player);
return result * attitude;
}
)
.set("judging", trigger.player.judging[0])
.set("filterButton", function (button) {
var player = _status.event.player;
var card = button.link;
var mod2 = game.checkMod(
card,
player,
"unchanged",
"cardEnabled2",
player
);
if (mod2 != "unchanged") return mod2;
var mod = game.checkMod(
card,
player,
"unchanged",
"cardRespondable",
player
);
if (mod != "unchanged") return mod;
return true;
});
if (result.bool) {
event.result = { bool: true, cards: result.links };
}
},
//logSkill留给respond
popup: false,
async content(event, trigger, player) {
const cards = event.cards;
await player.respond(
cards,
"shiroha_jiezhao",
"highlight",
"noOrdering"
);
if (trigger.player.judging[0].clone) {
trigger.player.judging[0].clone.classList.remove(
"thrownhighlight"
);
game.broadcast(function (card) {
if (card.clone) {
card.clone.classList.remove("thrownhighlight");
}
}, trigger.player.judging[0]);
game.addVideo(
"deletenode",
player,
get.cardsInfo([trigger.player.judging[0].clone])
);
}
const oldJudgeCard = trigger.player.judging[0];
trigger.player.judging[0] = cards[0];
trigger.orderingCards.addArray(cards);
game.log(trigger.player, "的判定牌改为", cards[0]);
await game.cardsDiscard(oldJudgeCard);
await game.asyncDelay(2);
if (!player.getExpansions("shiroha_yuzhao").length) {
player.storage.shiroha_jiezhao = true;
player.gainMaxHp();
player.recover();
var list = [
"umi_chaofan",
"ao_xishi",
"tsumugi_mugyu",
"kamome_jieban",
];
var skill = list.randomGet();
player.flashAvatar(
"shiroha_jiezhao",
"key_" + skill.split("_")[0]
);
await player.addSkills(skill);
}
},
ai: {
rejudge: true,
tag: {
rejudge: 0.6,
},
combo: "shiroha_yuzhao",
},
derivation: [
"umi_chaofan",
"ao_xishi",
"tsumugi_mugyu",
"kamome_jieban",
],
},
//高城丈士朗
jojiro_shensu: {
group: ["jojiro_shensu1", "jojiro_shensu2", "jojiro_shensu4"],
charlotte: true,
},
jojiro_shensu1: {
trigger: { player: "phaseJudgeBefore" },
async cost(event, trigger, player) {
const check = player.countCards("h") > 2;
event.result = await player
.chooseTarget(
get.prompt("jojiro_shensu"),
"跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】",
function (card, player, target) {
if (player == target) return false;
return player.canUse({ name: "sha" }, target, false);
}
)
.set("check", check)
.set("ai", function (target) {
if (!_status.event.check) return 0;
return get.effect(
target,
{ name: "sha" },
_status.event.player
);
})
.forResult();
},
async content(event, trigger, player) {
await trigger.cancel();
player.skip("phaseDraw");
await player.useCard(
{ name: "sha", isCard: true },
event.targets[0],
false
);
},
},
jojiro_shensu2: {
trigger: { player: "phaseUseBefore" },
filter(event, player) {
return player.countCards("he", { type: "equip" }) > 0;
},
async cost(event, trigger, player) {
const check = player.needsToDiscard();
event.result = await player
.chooseCardTarget({
prompt: get.prompt("jojiro_shensu"),
prompt2:
"弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】",
filterCard(card, player) {
return (
get.type(card) == "equip" &&
lib.filter.cardDiscardable(card, player)
);
},
position: "he",
filterTarget(card, player, target) {
if (player == target) return false;
return player.canUse({ name: "sha" }, target, false);
},
ai1(card) {
if (_status.event.check) return 0;
return 6 - get.value(card);
},
ai2(target) {
if (_status.event.check) return 0;
return get.effect(
target,
{ name: "sha" },
_status.event.player
);
},
check: check,
})
.forResult();
},
async content(event, trigger, player) {
await trigger.cancel();
await player.discard(event.cards[0]);
await player.useCard(
{ name: "sha", isCard: true },
event.targets[0]
);
},
},
jojiro_shensu4: {
trigger: { player: "phaseDiscardBefore" },
async cost(event, trigger, player) {
var check =
player.needsToDiscard() ||
player.isTurnedOver() ||
(player.hasSkill("shebian") && player.canMoveCard(true, true));
event.result = await player
.chooseTarget(
get.prompt("jojiro_shensu"),
"跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】",
function (card, player, target) {
if (player == target) return false;
return player.canUse({ name: "sha" }, target, false);
}
)
.set("check", check)
.set("ai", function (target) {
if (!_status.event.check) return 0;
return get.effect(
target,
{ name: "sha" },
_status.event.player,
_status.event.player
);
})
.forResult();
},
async content(event, trigger, player) {
await trigger.cancel();
await player.turnOver();
await player.useCard(
{ name: "sha", isCard: true },
event.targets[0],
false
);
},
},
jojiro_shunying: {
trigger: { player: "phaseEnd" },
forced: true,
charlotte: true,
filter(event, player) {
return player.getHistory("skipped").length > 0;
},
content() {
"step 0";
var num = player.getHistory("skipped").length;
event.num = num;
player.chooseToMoveChess(
num,
"瞬影:移动至多" + get.cnNumber(num) + "格或失去1点体力"
);
("step 1");
if (!result.bool) player.loseHp();
else player.draw(num);
},
},
//神户小鸟
kotori_yumo: {
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
charlotte: true,
filter(event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content() {
var list = ["wei", "shu", "wu", "qun", "jin"];
for (var i of list) {
if (!player.hasMark("kotori_yumo_" + i)) {
player.addMark("kotori_yumo_" + i, 1, false);
game.log(
player,
"获得了一个",
lib.translate["kotori_yumo_" + i].replace(
/魔物/g,
"【魔物】"
)
);
}
}
},
group: ["kotori_yumo_damage", "kotori_yumo_gain"],
},
kotori_yumo_damage: {
trigger: { global: "damageEnd" },
forced: true,
filter(event, player) {
var name = "kotori_yumo_" + event.player.group;
return lib.skill[name] && !player.hasMark(name);
},
popup: false,
content() {
game.log(player, "对", trigger.player, "发动了", "#g【驭魔】");
var group = trigger.player.group;
player.popup("驭魔", get.groupnature(group));
player.addMark("kotori_yumo_" + group, 1, false);
game.log(
player,
"获得了一个",
lib.translate["kotori_yumo_" + group].replace(
/魔物/g,
"【魔物】"
)
);
},
},
kotori_yumo_gain: {
trigger: { player: "phaseBegin" },
filter(event, player) {
var list = ["wei", "shu", "wu", "qun", "key", "jin"];
for (var i in list) {
if (player.hasMark("kotori_yumo_" + list[i])) return true;
}
return false;
},
async cost(event, trigger, player) {
const list = ["wei", "shu", "wu", "qun", "key", "jin"];
const list2 = [];
for (const i of list) {
if (player.hasMark("kotori_yumo_" + i))
list2.push("kotori_skill_" + i);
}
list2.push("cancel2");
const { control } = await player
.chooseControl(list2)
.set(
"prompt",
"###是否发动【驭魔】?###弃置对应的标记并获得下列技能中的一个,或点取消,不获得技能"
)
.set(
"choice",
(function () {
if (
list2.includes("kotori_skill_shu") &&
player.countCards("h", function (card) {
return (
get.name(card, player) == "sha" &&
player.getUseValue(card) > 0
);
}) > 1
)
return "kotori_skill_shu";
if (list2.includes("kotori_skill_key") && player.hp > 1)
return "kotori_skill_key";
if (
list2.includes("kotori_skill_qun") &&
player.isDamaged() &&
player.needsToDiscard() > 1
)
return "kotori_skill_qun";
return "cancel2";
})()
)
.set("ai", function () {
return _status.event.choice;
})
.forResult();
event.result = {
bool: control !== "cancel2",
cost_data: { control },
};
},
content() {
const result = event.cost_data;
if (result.control != "cancel2") {
var name = "kotori_yumo_" + result.control.slice(13);
player.removeMark(name, 1, false);
game.log(
player,
"移去了一个",
lib.translate[name].replace(/魔物/g, "【魔物】")
);
player.addTempSkills(result.control);
game.log(
player,
"获得了技能",
lib.translate[name].replace(
/魔物/g,
"【" + get.translation(result.control) + "】"
)
);
}
},
},
kotori_skill_wei: {
trigger: { player: "phaseBegin" },
filter(event, player) {
return player.countCards("he") > 0;
},
async cost(event, trigger, player) {
event.result = await player
.chooseCardTarget({
prompt: get.prompt2(event.skill),
filterCard: lib.filter.cardDiscardable,
filterTarget(card, player, target) {
return player != target;
},
position: "he",
ai1(card) {
return 6 - get.value(card);
},
ai2(target) {
return (
(1 / (1 + target.countCards("he"))) *
-get.attitude(_status.event.player, target)
);
},
})
.forResult();
},
content() {
"step 0";
player.discard(cards);
targets[0].chooseToDiscard(
"弃置一张牌,或令" + get.translation(player) + "摸一张牌",
"he"
).ai = lib.skill.zhiheng.check;
("step 1");
if (!result.bool) player.draw();
},
},
kotori_skill_shu: {
mod: {
cardUsable(card, player, num) {
if (card.name == "sha") return num + 1;
},
},
trigger: { player: "phaseUseEnd" },
forced: true,
filter(event, player) {
return (
player.getHistory("useCard", function (evt) {
return (
evt.card &&
evt.card.name == "sha" &&
evt.getParent("phaseUse") == event
);
}).length > 1
);
},
content() {
player.draw();
},
},
kotori_skill_wu: {
trigger: { player: "phaseEnd" },
forced: true,
filter(event, player) {
return player.countCards("h") != player.hp;
},
content() {
player.draw();
},
},
kotori_skill_qun: {
trigger: { player: "phaseDiscardBegin" },
forced: true,
filter(event, player) {
return (
player.getDamagedHp() > 1 ||
player.countCards("h") - player.getHp() > 1
);
},
content() {
var num = 0;
if (player.getDamagedHp() > 1) num++;
if (player.countCards("h") - player.getHp() > 1) num++;
player.addMark("kotori_qunxin_temp", num, false);
player.addTempSkill("kotori_qunxin_temp", "phaseDiscardEnd");
},
},
kotori_skill_key: {
enable: "phaseUse",
usable: 1,
content() {
"step 0";
player.draw();
("step 1");
player.changeHujia(1);
("step 2");
var evt = event.getParent("phase");
if (evt && evt.after) {
var next = player.loseHp();
event.next.remove(next);
evt.after.push(next);
}
},
ai: {
order: 10,
result: {
player(player) {
return player.hp - 1;
},
},
},
},
kotori_skill_jin: {
trigger: { player: "phaseDrawEnd" },
filter(event, player) {
var hs = player.getCards("h");
return (
hs.length > 0 &&
player.getHistory("gain", function (evt) {
if (
evt.getParent().name != "draw" ||
evt.getParent("phaseDraw") != event
)
return false;
for (var i of evt.cards) {
if (hs.includes(i)) return true;
}
return false;
}).length > 0
);
},
check(event, player) {
var hs = player.getCards("h"),
cards = [],
suits = [];
player.getHistory("gain", function (evt) {
if (
evt.getParent().name != "draw" ||
evt.getParent("phaseDraw") != event
)
return false;
for (var i of evt.cards) {
if (hs.includes(i)) {
cards.add(i);
suits.add(get.suit(i, player));
}
}
});
return cards.length == suits.length;
},
content() {
var hs = player.getCards("h"),
cards = [],
suits = [];
player.getHistory("gain", function (evt) {
if (
evt.getParent().name != "draw" ||
evt.getParent("phaseDraw") != trigger
)
return false;
for (var i of evt.cards) {
if (hs.includes(i)) {
cards.add(i);
suits.add(get.suit(i, player));
}
}
});
player.showCards(cards, get.translation(player) + "发动了【晋势】");
if (cards.length == suits.length) player.draw();
},
},
kotori_qunxin_temp: {
onremove: true,
mod: {
maxHandcard(player, num) {
return num + player.countMark("kotori_qunxin_temp");
},
},
},
kotori_yumo_wei: {
marktext: '<span class="thundertext">魔</span>',
intro: {
name: '<span class="thundertext">魔物</span>',
content: "mark",
},
},
kotori_yumo_shu: {
marktext: '<span class="firetext">魔</span>',
intro: {
name: '<span class="firetext">魔物</span>',
content: "mark",
},
},
kotori_yumo_wu: {
marktext: '<span class="greentext">魔</span>',
intro: {
name: '<span class="greentext">魔物</span>',
content: "mark",
},
},
kotori_yumo_qun: {
marktext: '<span class="yellowtext">魔</span>',
intro: {
name: '<span class="yellowtext">魔物</span>',
content: "mark",
},
},
kotori_yumo_key: {
marktext: '<span class="legendtext">魔</span>',
intro: {
name: '<span class="legendtext">魔物</span>',
content: "mark",
},
},
kotori_yumo_jin: {
marktext: '<span class="icetext">魔</span>',
intro: {
name: '<span class="icetext">魔物</span>',
content: "mark",
},
},
kotori_huazhan: {
charlotte: true,
enable: "chooseToUse",
filter(event, player) {
var bool = false;
var list = ["wei", "shu", "wu", "qun", "key", "jin"];
for (var i of list) {
if (
player.hasMark("kotori_yumo_" + i) &&
!player
.getStorage("kotori_huazhan2")
.includes("kotori_yumo_" + i)
) {
bool = true;
break;
}
}
return (
bool &&
event.filterCard(
{ name: "kaihua", isCard: true },
player,
event
)
);
},
chooseButton: {
dialog(event, player) {
return ui.create.dialog(
"###花绽###" + lib.translate.kotori_huazhan_info
);
},
chooseControl(event, player) {
var list = ["wei", "shu", "wu", "qun", "key", "jin"];
var list2 = [];
for (var i of list) {
if (
player.hasMark("kotori_yumo_" + i) &&
!player
.getStorage("kotori_huazhan2")
.includes("kotori_yumo_" + i)
)
list2.push("kotori_yumo_" + i);
}
list2.push("cancel2");
return list2;
},
check() {
var player = _status.event.player;
var list = ["wei", "shu", "wu", "qun", "key", "jin"];
var list2 = [];
for (var i of list) {
if (
player.hasMark("kotori_yumo_" + i) &&
!player
.getStorage("kotori_huazhan2")
.includes("kotori_yumo_" + i)
)
list2.push("kotori_yumo_" + i);
}
if (list2.includes("kotori_yumo_wei")) return "kotori_yumo_wei";
if (list2.includes("kotori_yumo_wu")) return "kotori_yumo_wu";
if (list2.includes("kotori_yumo_qun")) return "kotori_yumo_qun";
if (list2.includes("kotori_yumo_key")) return "kotori_yumo_key";
if (
list2.includes("kotori_yumo_shu") &&
game.hasPlayer(function (current) {
return current.group == "shu";
})
)
return "kotori_yumo_shu";
return "cancel2";
},
backup(result, player) {
return {
markname: result.control,
viewAs: { name: "kaihua", isCard: true },
filterCard() {
return false;
},
selectCard: -1,
precontent() {
delete event.result.skill;
var name = lib.skill.kotori_huazhan_backup.markname;
if (!player.storage.kotori_huazhan2)
player.storage.kotori_huazhan2 = [];
player.storage.kotori_huazhan2.push(name);
player.addTempSkill("kotori_huazhan2");
player.popup("花绽", get.groupnature(name.slice(12)));
game.log(
player,
"发动了技能",
lib.translate[name].replace(/魔物/g, "【花绽】")
);
player.removeMark(name, 1, false);
game.log(
player,
"移去了一个",
lib.translate[name].replace(/魔物/g, "【魔物】")
);
},
};
},
},
ai: {
order: 1,
result: {
player(player) {
if (
player.countCards("he", function (card) {
if (get.type(card, player) == "equip")
return get.value(card) < 6;
return get.value(card) < 5;
}) < 2
)
return 0;
return player.getUseValue({ name: "kaihua" });
},
},
},
},
kotori_huazhan2: { onremove: true, charlotte: true },
//三谷良一
ryoichi_baoyi: {
trigger: {
player: "loseAfter",
global: [
"gainAfter",
"equipAfter",
"addJudgeAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
filterTarget(card, player, target) {
return (
target != player &&
(target.hasSex("female") || target.countCards("hej") > 0)
);
},
filter(event, player) {
var evt = event.getl(player);
return (
evt &&
evt.es &&
evt.es.length > 0 &&
game.hasPlayer(function (target) {
return lib.skill.ryoichi_baoyi.filterTarget;
})
);
},
forced: true,
content() {
"step 0";
event.count = trigger.getl(player).es.length;
player.draw(event.count);
("step 1");
event.count--;
if (
game.hasPlayer(function (target) {
return lib.skill.ryoichi_baoyi.filterTarget(
null,
player,
target
);
})
) {
player
.chooseTarget(
true,
lib.skill.ryoichi_baoyi.filterTarget,
"请选择【爆衣】的目标"
)
.set("ai", function (target) {
return -get.attitude(_status.event.player, target);
});
} else event.finish();
("step 2");
if (result.bool && result.targets && result.targets.length) {
var target = result.targets[0];
player.line(target, "green");
if (target.hasSex("female")) target.loseHp();
else player.discardPlayerCard(target, 2, "hej", true);
} else event.finish();
("step 3");
if (
event.count &&
game.hasPlayer(function (target) {
return lib.skill.ryoichi_baoyi.filterTarget(
null,
player,
target
);
})
)
event.goto(1);
},
},
ryoichi_tuipi: {
mod: {
targetEnabled(card) {
if (card.name == "shunshou" || card.name == "guohe")
return false;
},
},
trigger: { player: "phaseDiscardBegin" },
forced: true,
content() {
trigger.setContent(lib.skill.ryoichi_tuipi.phaseDiscardContent);
},
phaseDiscardContent() {
"step 0";
event.num = Math.max(
0,
player.countCards(
"he",
(card) => !player.canIgnoreHandcard(card)
) - player.getHandcardLimit()
);
if (event.num <= 0) event.finish();
else {
if (lib.config.show_phase_prompt) {
player.popup("弃牌阶段");
}
}
event.trigger("phaseDiscard");
("step 1");
player.chooseToDiscard(num, true, "he");
("step 2");
event.cards = result.cards;
},
},
//乙坂有宇
yuu_lveduo: {
mod: {
cardEnabled(card, player) {
if (player.isTurnedOver()) return false;
},
cardRespondable(card, player) {
if (player.isTurnedOver()) return false;
},
cardSavable(card, player) {
if (player.isTurnedOver()) return false;
},
},
trigger: { global: "phaseBeginStart" },
filter(event, player) {
return (
player != event.player &&
!event.player._trueMe &&
!player.getStorage("yuu_lveduo").includes(event.player) &&
!player.isTurnedOver() &&
!player.hasSkill("yuu_lveduo4")
);
},
charlotte: true,
check(event, player) {
if (get.attitude(player, event.player) > 0) return false;
if (event.player.hasJudge("lebu") || !event.player.needsToDiscard())
return false;
return true;
},
logTarget: "player",
content() {
"step 0";
player.turnOver();
("step 1");
if (player.isTurnedOver()) {
player.addTempSkill("yuu_lveduo4", "roundStart");
if (!player.storage.yuu_lveduo) player.storage.yuu_lveduo = [];
player.storage.yuu_lveduo.push(trigger.player);
trigger.player._trueMe = player;
game.addGlobalSkill("autoswap");
if (trigger.player == game.me) {
game.notMe = true;
if (!_status.auto) ui.click.auto();
}
player.addSkill("yuu_lveduo2");
trigger.player.addSkill("yuu_lveduo3");
}
},
},
yuu_lveduo2: {
trigger: {
player: "turnOverEnd",
},
lastDo: true,
charlotte: true,
forceDie: true,
forced: true,
silent: true,
filter(event, player) {
return !player.isTurnedOver();
},
content() {
var target = game.findPlayer(function (current) {
return current._trueMe == player;
});
if (target) {
if (target == game.me) {
if (!game.notMe) game.swapPlayerAuto(target._trueMe);
else delete game.notMe;
if (_status.auto) ui.click.auto();
}
delete target._trueMe;
target.removeSkill("yuu_lveduo3");
var skills = target
.getStockSkills(true, true)
.filter(function (skill) {
var info = get.info(skill);
return info && info.charlotte == true;
});
if (skills.length) {
target.removeSkills(skills);
player.addSkills(skills);
lib.translate.yuu_lveduo_info =
lib.translate.yuu_lveduo_full_info;
}
if (target.name == "key_yusa") {
delete target.storage.dualside;
target.storage.dualside_over = true;
target.unmarkSkill("dualside");
target.removeSkill("dualside");
} else if (target.name == "key_misa") {
delete target.storage.dualside;
target.storage.dualside_over = true;
target.unmarkSkill("dualside");
target.reinit("key_misa", "key_yusa");
target.removeSkill("yusa_misa");
target.removeSkill("dualside");
target.turnOver(false);
}
}
player.removeSkill("yuu_lveduo2");
},
},
yuu_lveduo3: {
trigger: {
player: ["phaseAfter", "dieAfter"],
global: "phaseBefore",
},
lastDo: true,
charlotte: true,
forceDie: true,
forced: true,
silent: true,
content() {
player.removeSkill("yuu_lveduo3");
},
onremove(player) {
if (player._trueMe && player._trueMe.isTurnedOver())
player._trueMe.turnOver();
},
},
yuu_lveduo4: { charlotte: true },
//松下五段
godan_yuanyi: {
trigger: { player: "phaseBegin" },
forced: true,
content() {
"step 0";
var num = game.roundNumber;
if (num && typeof num == "number") player.draw(Math.min(3, num));
("step 1");
trigger.phaseList.splice(trigger.num, 0, "phaseUse|godan_yuanyi");
},
},
godan_feiqu: {
inherit: "doruji_feiqu",
},
godan_xiaoyuan: {
trigger: { player: "changeHp" },
forced: true,
juexingji: true,
skillAnimation: true,
animationColor: "soil",
filter(event, player) {
return event.num < 0 && player.hp < 4;
},
content() {
player.awakenSkill("godan_xiaoyuan");
player.loseMaxHp(3);
player.draw(3);
player.removeSkills("godan_feiqu");
},
},
//游佐
abyusa_jueqing: {
audio: 2,
trigger: { source: "damageBegin2" },
skillAnimation: true,
animationColor: "water",
filter(event, player) {
return (
player != event.player && !player.storage.abyusa_jueqing_rewrite
);
},
prompt2(event, player) {
var num = get.cnNumber(2 * event.num, true);
return (
"令即将对其造成的伤害翻倍至" +
num +
"点,并令自己失去" +
get.cnNumber(event.num) +
"点体力"
);
},
check(event, player) {
return (
player.hp > event.num &&
event.player.hp > event.num &&
!event.player.hasSkillTag("filterDamage", null, {
player: player,
card: event.card,
}) &&
get.attitude(player, event.player) < 0
);
},
locked(skill, player) {
return player && player.storage.abyusa_jueqing_rewrite;
},
logTarget: "player",
content() {
player.loseHp(trigger.num);
trigger.num *= 2;
player.storage.abyusa_jueqing_rewrite = true;
},
derivation: "abyusa_jueqing_rewrite",
group: "abyusa_jueqing_rewrite",
subSkill: {
rewrite: {
audio: "abyusa_jueqing",
trigger: { source: "damageBefore" },
forced: true,
charlotte: true,
filter(event, player) {
return player.storage.abyusa_jueqing_rewrite == true;
},
check() {
return false;
},
content() {
trigger.cancel();
trigger.player.loseHp(trigger.num);
},
ai: {
jueqing: true,
skillTagFilter(player) {
return player.storage.abyusa_jueqing_rewrite == true;
},
},
},
},
},
abyusa_dunying: {
audio: 2,
trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] },
forced: true,
filter(event, player) {
return player.isDamaged();
},
content() {
player.draw(player.getDamagedHp());
},
mod: {
globalTo(from, to, num) {
return num + to.getDamagedHp();
},
},
},
//水濑秋子
akiko_dongcha: {
trigger: { global: "phaseBefore" },
forced: true,
filter(event, player) {
return get.mode() == "identity" && game.phaseNumber == 0;
},
content() {
var func = function () {
game.countPlayer(function (current) {
current.setIdentity();
});
};
if (player == game.me) func();
else if (player.isOnline()) player.send(func);
if (!player.storage.zhibi) player.storage.zhibi = [];
player.storage.zhibi.addArray(game.players);
},
ai: {
viewHandcard: true,
skillTagFilter(player, tag, arg) {
if (player == arg) return false;
},
},
},
//美坂香里
kaori_siyuan: {
enable: "phaseUse",
filter(event, player) {
return player.countCards("he", lib.skill.kaori_siyuan.filterCard);
},
filterCard(card) {
return ["equip", "delay"].includes(get.type(card, false));
},
filterTarget(card, player, target) {
if (player == target) return false;
var card = ui.selected.cards[0];
if (get.type(card, false) == "delay")
return target.canAddJudge({ name: card.name });
return target.canEquip(card);
},
discard: false,
lose: false,
prepare: "give",
content() {
"step 0";
var card = cards[0];
if (get.type(card, false) == "equip") target.equip(card);
else target.addJudge(card);
("step 1");
var list = [];
for (var i of lib.inpile) {
var type = get.type(i);
if (type == "basic" || type == "trick")
list.push([type, "", i]);
if (i == "sha") {
for (var j of lib.inpile_nature)
list.push([type, "", i, j]);
}
}
player
.chooseButton([
"是否视为使用一张基本牌或普通锦囊牌?",
[list, "vcard"],
])
.set("filterButton", function (button) {
return player.hasUseTarget({
name: button.link[2],
nature: button.link[3],
isCard: true,
});
})
.set("ai", function (button) {
return player.getUseValue({
name: button.link[2],
nature: button.link[3],
isCard: true,
});
});
("step 2");
if (result.bool) {
player.chooseUseTarget(true, {
name: result.links[0][2],
nature: result.links[0][3],
isCard: true,
});
}
},
ai: {
basic: {
order: 10,
},
result: {
target(player, target) {
var card = ui.selected.cards[0];
if (card) return get.effect(target, card, target, target);
return 0;
},
},
},
},
//美坂栞
shiori_huijuan: {
trigger: { global: "phaseJieshuBegin" },
locked: true,
filter(event, player) {
return (
event.player != player &&
event.player.getHistory("useCard", function (evt) {
return (
evt.isPhaseUsing() &&
["basic", "trick"].includes(get.type(evt.card)) &&
player.hasUseTarget({
name: evt.card.name,
nature: evt.card.nature,
isCard: true,
})
);
}).length > 0
);
},
async cost(event, trigger, player) {
const list = [];
trigger.player.getHistory("useCard", function (evt) {
if (
!evt.isPhaseUsing() ||
!["basic", "trick"].includes(get.type(evt.card))
)
return;
if (evt.card.name == "sha" && evt.card.nature)
list.add("sha:" + evt.card.nature);
else list.add(evt.card.name);
});
for (var i = 0; i < list.length; i++) {
if (list[i].indexOf("sha:") == 0)
list[i] = ["基本", "", "sha", list[i].slice(4)];
else list[i] = [get.type(list[i]), "", list[i]];
}
const { result } = await player
.chooseButton([get.prompt("shiori_huijuan"), [list, "vcard"]])
.set("filterButton", function (button) {
return player.hasUseTarget({
name: button.link[2],
nature: button.link[3],
isCard: true,
});
})
.set("ai", function (button) {
return player.getUseValue({
name: button.link[2],
nature: button.link[3],
isCard: true,
});
});
if (result.bool) {
event.result = {
bool: true,
cost_data: {
card: {
name: result.links[0][2],
nature: result.links[0][3],
isCard: true,
},
},
};
}
},
async content(event, trigger, player) {
player.chooseUseTarget(true, event.cost_data.card);
player.getStat("skill").shiori_huijuan = 1;
},
group: "shiori_huijuan_discard",
},
shiori_huijuan_discard: {
trigger: { player: "phaseZhunbeiBegin" },
filter(event, player) {
var num = 0;
var stat = player.stat;
for (var i = stat.length - 2; i--; i >= 0) {
if (stat[i].isMe) break;
if (stat[i].skill && stat[i].skill.shiori_huijuan) num++;
}
return num >= Math.max(2, game.countPlayer() / 2);
},
forced: true,
content() {
"step 0";
if (!player.countDiscardableCards(player, "ej"))
event._result = { bool: false };
else
player
.discardPlayerCard(player, "ej")
.set("ai", function (button) {
var card = button.link;
var player = _status.event.player;
if (get.position(card) == "j") return 7 + Math.random();
return 4 + player.needsToDiscard() - get.value(card);
});
("step 1");
if (!result.bool) player.skip("phaseUse");
},
},
//野村美希
miki_shenqiang: {
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
filter(event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content() {
player.equip(game.createCard2("miki_hydrogladiator", "club", 6));
player.equip(game.createCard2("miki_binoculars", "diamond", 6));
},
mod: {
canBeDiscarded(card) {
if (
get.position(card) == "e" &&
["equip1", "equip5"].includes(get.subtype(card))
)
return false;
},
},
},
miki_huanmeng: {
inherit: "kamome_huanmeng",
},
miki_zhiluo: {
trigger: { global: "phaseEnd" },
filter(event, player) {
return (
!event.player.countCards("e") && player.inRange(event.player)
);
},
locked: true,
async cost(event, trigger, player) {
event.result = { bool: true, cost_data: { index: 0 } };
if (player.canUse("sha", trigger.player, false)) {
const { index } = await player
.chooseControl()
.set("prompt", "制裸:请选择一项")
.set("choiceList", [
"摸一张牌",
"视为对" +
get.translation(trigger.player) +
"使用一张【杀】",
])
.set("ai", function () {
if (
get.effect(
_status.event.getTrigger().player,
{ name: "sha" },
_status.event.player
) > 0
)
return 1;
return 0;
})
.forResult();
event.result.cost_data.index = index;
}
},
async content(event, trigger, player) {
const result = event.cost_data;
if (result.index == 0) {
player.logSkill("miki_zhiluo");
player.draw();
} else
player.useCard(
{ name: "sha", isCard: true },
trigger.player,
"miki_zhiluo"
);
},
},
miki_hydrogladiator_skill: {
trigger: {
source: "damageSource",
},
locked: true,
popup: "海德洛",
filter(event, player) {
return (
event.getParent().name == "sha" &&
game.hasPlayer(function (current) {
return (
(current == event.player ||
(current != player &&
get.distance(current, event.player) <= 1)) &&
current.countDiscardableCards(player, "he") > 0
);
})
);
},
cost() {
"step 0";
var list = [];
var choiceList = [];
if (trigger.player.countDiscardableCards(player, "he") > 0) {
list.push(true);
choiceList.push(
"弃置" + get.translation(trigger.player) + "的两张牌"
);
}
if (
game.hasPlayer(function (current) {
return (
current != player &&
get.distance(current, trigger.player) <= 1
);
})
) {
list.push(false);
choiceList.push(
"弃置所有至" +
get.translation(trigger.player) +
"距离为1的角色的各一张牌"
);
}
event.list = list;
if (list.length == 1) event._result = { index: 0 };
else {
player
.chooseControl()
.set("choiceList", choiceList)
.set("prompt", "海德洛格拉迪尔特·改")
.set("ai", function () {
var player = _status.event.player;
var source = _status.event.getTrigger().player;
var num = game.countPlayer(function (current) {
if (
current != player &&
get.distance(current, source) <= 1 &&
current.countDiscardableCards(player, "he") > 0
)
return -get.sgn(get.attitude(player, current));
});
if (
num >
Math.min(
2,
source.countDiscardableCards(player, "he")
)
)
return 1;
return 0;
});
}
("step 1");
if (event.list[result.index]) {
event.result = {
bool: true,
cost_data: { type: "single" },
targets: [trigger.player],
};
} else {
event.result = {
bool: true,
cost_data: { type: "multiple" },
targets: game
.filterPlayer(function (current) {
return (
current != player &&
get.distance(current, trigger.player) <= 1
);
})
.sortBySeat(),
};
}
},
content() {
"step 0";
if (event.cost_data.type == "single") {
player.discardPlayerCard(targets[0], "he", 2, true);
event.finish();
}
("step 1");
var target = targets.shift();
if (target.countDiscardableCards(player, "he") > 0)
player.discardPlayerCard(target, "he", true);
if (targets.length) event.redo();
},
},
miki_binoculars: {
locked: true,
ai: {
viewHandcard: true,
skillTagFilter(player, tag, arg) {
if (player == arg) return false;
},
},
},
//关根诗织&入江美雪
shiorimiyuki_banyin: {
audio: 2,
trigger: { player: ["damageEnd", "recoverEnd"] },
filter(event, player) {
return game.hasPlayer(function (current) {
return current != player && current.isDamaged();
});
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt("shiorimiyuki_banyin"),
"令一名其他角色回复1点体力",
lib.filter.notMe
)
.set("ai", function (target) {
var player = _status.event.player;
return get.recoverEffect(target, player, player);
})
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
target.recover();
},
},
shiorimiyuki_tingxian: {
audio: 2,
trigger: { player: "phaseUseBegin" },
async cost(event, trigger, player) {
const { control, index } = await player
.chooseControl("一张", "两张", "三张", "cancel2")
.set("prompt", get.prompt2("shiorimiyuki_tingxian"))
.set("ai", function () {
var player = _status.event.player;
var max = Math.min(player.hp + 1, player.maxHp);
var min = Math.min(Math.max(max - 2, max - player.hp), 3);
if (min) return min - 1;
return 3;
})
.forResult();
if (control != "cancel2")
event.result = { bool: true, cost_data: index };
},
async content(event, trigger, player) {
let num = 1 + event.cost_data;
await player.draw(num).set("gaintag", ["shiorimiyuki_tingxian"]);
await player.recover();
player.addTempSkill("shiorimiyuki_tingxian2");
},
group: "shiorimiyuki_tingxian1",
},
shiorimiyuki_tingxian1: { audio: true },
shiorimiyuki_tingxian2: {
audio: true,
trigger: { player: "phaseUseEnd" },
forced: true,
charlotte: true,
mod: {
aiOrder(player, card, num) {
if (
get.itemtype(card) == "card" &&
card.hasGaintag("shiorimiyuki_tingxian")
)
return num + 2;
},
aiValue(player, card, num) {
if (
get.itemtype(card) == "card" &&
card.hasGaintag("shiorimiyuki_tingxian")
)
return 0;
},
},
filter(event, player) {
return (
player.countCards("h", function (card) {
return card.hasGaintag("shiorimiyuki_tingxian");
}) > 0
);
},
content() {
player.loseHp(
player.countCards("h", function (card) {
return card.hasGaintag("shiorimiyuki_tingxian");
})
);
player.removeGaintag("shiorimiyuki_tingxian");
},
},
//中津静流
shizuru_nianli: {
enable: "chooseToUse",
charlotte: true,
prompt: "展示一张♦/♣/♥/♠手牌,然后视为使用一张雷杀/闪/桃/无懈可击",
viewAs(cards, player) {
var name = false;
var nature = null;
switch (get.suit(cards[0], player)) {
case "club":
name = "shan";
break;
case "diamond":
name = "sha";
nature = "thunder";
break;
case "spade":
name = "wuxie";
break;
case "heart":
name = "tao";
break;
}
if (name) return { name: name, nature: nature, isCard: true };
return null;
},
check(card) {
var player = _status.event.player;
if (_status.event.type == "phase") {
var max = 0;
var name2;
var list = ["sha", "tao"];
var map = { sha: "diamond", tao: "heart" };
for (var i = 0; i < list.length; i++) {
var name = list[i];
if (
player.countCards("h", function (card) {
return get.suit(card, player) == map[name];
}) > 0 &&
player.getUseValue({
name: name,
nature: name == "sha" ? "fire" : null,
}) > 0
) {
var temp = get.order({
name: name,
nature: name == "sha" ? "fire" : null,
});
if (temp > max) {
max = temp;
name2 = map[name];
}
}
}
if (name2 == get.suit(card, player)) return 1;
return 0;
}
return 1;
},
ignoreMod: true,
filterCard(card, player, event) {
event = event || _status.event;
var filter = event._backup.filterCard;
var name = get.suit(card, player);
if (name == "club" && filter({ name: "shan" }, player, event))
return true;
if (
name == "diamond" &&
filter({ name: "sha", nature: "thunder" }, player, event)
)
return true;
if (name == "spade" && filter({ name: "wuxie" }, player, event))
return true;
if (name == "heart" && filter({ name: "tao" }, player, event))
return true;
return false;
},
filter(event, player) {
if (player.hasSkill("shizuru_nianli_round")) return false;
var filter = event.filterCard;
if (
filter({ name: "sha", nature: "thunder" }, player, event) &&
player.countCards("h", { suit: "diamond" })
)
return true;
if (
filter({ name: "shan" }, player, event) &&
player.countCards("h", { suit: "club" })
)
return true;
if (
filter({ name: "tao" }, player, event) &&
player.countCards("h", { suit: "heart" })
)
return true;
if (
filter({ name: "wuxie" }, player, event) &&
player.countCards("h", { suit: "spade" })
)
return true;
return false;
},
precontent() {
player.logSkill("shizuru_nianli");
player.addTempSkill("shizuru_nianli_round", "roundStart");
player.showCards(
get.translation(player) + "发动了【念力】",
event.result.cards.slice(0)
);
event.result.card.cards = [];
event.result.cards = [];
delete event.result.skill;
delete event.result.card.suit;
delete event.result.card.number;
event.getParent().addCount = false;
event.getParent().shizuru_nianli = true;
},
ai: {
respondSha: true,
respondShan: true,
skillTagFilter(player, tag) {
if (player.hasSkill("shizuru_nianli_round")) return false;
var name;
switch (tag) {
case "respondSha":
name = "diamond";
break;
case "respondShan":
name = "club";
break;
case "save":
name = "heart";
break;
}
if (!player.countCards("h", { suit: name })) return false;
},
order(item, player) {
if (player && _status.event.type == "phase") {
var max = 0;
var list = ["sha", "tao"];
var map = { sha: "diamond", tao: "heart" };
for (var i = 0; i < list.length; i++) {
var name = list[i];
if (
player.countCards("h", function (card) {
return get.suit(card, player) == map[name];
}) > 0 &&
player.getUseValue({
name: name,
nature: name == "sha" ? "thunder" : null,
}) > 0
) {
var temp = get.order({
name: name,
nature: name == "sha" ? "thunder" : null,
});
if (temp > max) max = temp;
}
}
max /= 1.1;
return max;
}
return 2;
},
},
hiddenCard(player, name) {
if (name == "wuxie")
return (
player.countCards("h", function (card) {
return _status.connectMode || get.suit(card) == "spade";
}) > 0 && !player.hasSkill("shizuru_nianli_round")
);
if (name == "tao")
return (
player.countCards("h", { suit: "heart" }) > 0 &&
!player.hasSkill("shizuru_nianli_round")
);
return false;
},
group: "shizuru_nianli_clear",
subSkill: {
round: {
mark: true,
intro: { content: "本轮已发动" },
},
clear: {
trigger: { player: "useCardAfter" },
lastDo: true,
silent: true,
filter(event, player) {
return event.getParent().shizuru_nianli == true;
},
content() {
player.getHistory("useCard").remove(trigger);
},
},
},
},
shizuru_benzhan: {
trigger: { global: ["useCard", "respond"] },
usable: 1,
filter(event, player) {
return (
Array.isArray(event.respondTo) &&
event.respondTo[0] != event.player &&
[event.respondTo[0], event.player].includes(player)
);
},
async cost(event, trigger, player) {
event.type = get.type(trigger.card) == "basic";
var prompt = event.type
? "令一名角色摸两张牌或弃置两张牌"
: "令一名角色回复1点体力或对其造成1点伤害";
event.result = await player
.chooseTarget(get.prompt("shizuru_benzhan"), prompt)
.set("ai", function (target) {
var player = _status.event.player;
if (_status.event.getParent().type) {
var att = get.attitude(player, target);
if (target.hasSkillTag("nogain")) return -att;
if (target.countCards("he") == 1 && att < 0) att /= 2;
return (
Math.abs(att) *
(1 + 0.1 * Math.min(0, 5 - target.countCards("h")))
);
}
return Math.max(
get.recoverEffect(target, player, player),
get.damageEffect(target, player, player)
);
})
.forResult();
},
content() {
"step 0";
event.type = get.type(trigger.card) == "basic";
var target = event.targets[0];
event.target = target;
var trans = get.translation(target);
var list;
if (event.type) {
if (!target.countCards("he")) event._result = { index: 0 };
else
list = [
"令" + trans + "摸两张牌",
"令" + trans + "弃置两张牌",
];
} else {
if (target.isHealthy()) event._result = { index: 1 };
else
list = [
"令" + trans + "回复1点体力",
"对" + trans + "造成1点伤害",
];
}
player
.chooseControl()
.set("choiceList", list)
.set(
"choice",
(function () {
if (event.type)
return get.attitude(player, target) > 0 ? 0 : 1;
return get.recoverEffect(target, player, player) >
get.damageEffect(target, player, player)
? 0
: 1;
})()
)
.set("ai", function () {
return _status.event.choice;
});
("step 1");
player.addExpose(0.2);
if (event.type) {
if (result.index == 0) target.draw(2);
else target.chooseToDiscard(2, "he", true);
} else {
if (result.index == 0) target.recover();
else target.damage();
}
},
},
//岬镜子
kyoko_juwu: {
trigger: {
global: [
"loseAfter",
"cardsDiscardAfter",
"loseAsyncAfter",
"equipAfter",
],
},
filter(event, player) {
if (player == _status.currentPhase) return false;
var cards = event.getd();
if (!cards.length) return false;
cards.removeArray(event.getd(player));
for (var card of cards) {
if (
get.position(card, true) == "d" &&
get.type(card, null, false) == "equip"
)
return true;
}
return false;
},
autodelay(event, player) {
return event.delay === false;
},
async cost(event, trigger, player) {
var cards = trigger.getd();
cards.removeArray(trigger.getd(player));
cards = cards.filter(function (card) {
if (
get.position(card, true) == "d" &&
get.type(card, null, false) == "equip"
)
return true;
});
const { result } = await player
.chooseButton(
[get.prompt("kyoko_juwu"), cards],
[1, cards.length]
)
.set("ai", function () {
return 1;
});
if (result.bool)
event.result = {
bool: true,
cards: result.links,
};
},
async content(event, trigger, player) {
await player.gain(event.cards, "gain2", "log");
},
},
kyoko_zhengyi: {
group: ["kyoko_jingce", "kyoko_shelie", "kyoko_zhiheng"],
count(player) {
var list = [];
player.countCards("e", function (card) {
list.add(get.suit(card, player));
});
return list.length;
},
},
kyoko_jingce: {
trigger: { player: ["phaseUseEnd", "phaseJieshuBegin"] },
filter(event, player) {
var num = lib.skill.kyoko_zhengyi.count(player);
if (!num || (event.name == "phaseUse") == num > 3) return false;
return (
player.getHistory("useCard", function (evt) {
return (
event.name != "phaseUse" ||
evt.getParent("phaseUse") == event
);
}).length >= player.hp
);
},
frequent: true,
content() {
"step 0";
if (trigger.name == "phaseUse") {
player.draw(2);
event.finish();
return;
}
var list = [],
history = player.getHistory("useCard");
for (var i of history) {
list.add(get.suit(i.card));
if (list.length >= player.hp) break;
}
if (list.length >= player.hp) event.goon = true;
else
player
.chooseControl("摸牌阶段", "出牌阶段")
.set("prompt", "精策:选择要执行的额外阶段");
("step 1");
if (event.goon || result.index == 0) {
var next = player.phaseDraw();
event.next.remove(next);
trigger.getParent().next.push(next);
}
if (event.goon || result.index == 1) {
var next = player.phaseUse();
event.next.remove(next);
trigger.getParent().next.push(next);
}
},
},
kyoko_shelie: {
audio: 2,
trigger: { player: "phaseDrawBegin1" },
filter(event, player) {
return !event.numFixed && lib.skill.kyoko_zhengyi.count(player) > 1;
},
content() {
"step 0";
trigger.changeToZero();
event.cards = get.cards(5);
game.cardsGotoOrdering(event.cards);
event.videoId = lib.status.videoId++;
game.broadcastAll(
function (player, id, cards) {
var str;
if (player == game.me && !_status.auto) {
str = "涉猎:获取花色各不相同的牌";
} else {
str = "涉猎";
}
var dialog = ui.create.dialog(str, cards);
dialog.videoId = id;
},
player,
event.videoId,
event.cards
);
event.time = get.utc();
game.addVideo("showCards", player, [
"涉猎",
get.cardsInfo(event.cards),
]);
game.addVideo("delay", null, 2);
("step 1");
var next = player.chooseButton([0, 5], true);
next.set("dialog", event.videoId);
next.set("filterButton", function (button) {
for (var i = 0; i < ui.selected.buttons.length; i++) {
if (
get.suit(ui.selected.buttons[i].link) ==
get.suit(button.link)
)
return false;
}
return true;
});
next.set("ai", function (button) {
return get.value(button.link, _status.event.player);
});
("step 2");
if (result.bool && result.links) {
event.cards2 = result.links;
} else {
event.finish();
}
var time = 1000 - (get.utc() - event.time);
if (time > 0) {
game.delay(0, time);
}
("step 3");
game.broadcastAll("closeDialog", event.videoId);
var cards2 = event.cards2;
player.gain(cards2, "log", "gain2");
},
},
kyoko_zhiheng: {
enable: "phaseUse",
usable: 1,
position: "he",
filter(event, player) {
return lib.skill.kyoko_zhengyi.count(player) > 2;
},
prompt() {
var str = "弃置任意张牌并摸等量的牌";
if (lib.skill.kyoko_zhengyi.count(_status.event.player) > 3)
str += ",若弃置了所有手牌则多摸一张牌。";
return str;
},
filterCard: lib.filter.cardDiscardable,
discard: false,
lose: false,
delay: false,
selectCard: [1, Infinity],
check(card) {
var player = _status.event.player;
if (get.position(card) == "h") {
return 8 - get.value(card);
}
return 6 - get.value(card);
},
content() {
"step 0";
player.discard(cards);
event.num = 1;
var hs = player.getCards("h");
if (!hs.length || lib.skill.kyoko_zhengyi.count(player) < 4)
event.num = 0;
else
for (var i = 0; i < hs.length; i++) {
if (!cards.includes(hs[i])) {
event.num = 0;
break;
}
}
("step 1");
player.draw(event.num + cards.length);
},
ai: {
order: 1,
result: {
player: 1,
},
},
},
//音无结弦3v3
yuzuru_bujin: {
global: "yuzuru_bujin2",
trigger: { global: "phaseDrawBegin" },
forced: true,
logTarget: "player",
filter(event, player) {
return event.player != player && event.player.isFriendOf(player);
},
content() {
trigger.num++;
},
},
yuzuru_bujin2: {
mod: {
globalFrom(from, to, num) {
return (
num -
game.countPlayer(function (current) {
return (
current != from &&
current.hasSkill("yuzuru_bujin") &&
current.isFriendOf(from)
);
})
);
},
},
},
//西园美鱼
mio_tuifu: {
trigger: { global: "damageBegin1" },
forced: true,
filter(event, player) {
return event.source && event.source.sameSexAs(event.player);
},
content() {
player.draw();
},
},
mio_tishen: {
trigger: { player: "phaseZhunbeiBegin" },
limited: true,
unique: true,
charlotte: true,
skillAnimation: true,
animationColor: "water",
filter(event, player) {
return player.isDamaged();
},
check(event, player) {
return player.hp <= 1 || player.getDamagedHp() > 1;
},
content() {
player.awakenSkill(event.name);
var num = player.maxHp - player.hp;
player.recover(num);
player.draw(num);
if (
_status.characterlist &&
_status.characterlist.includes("key_midori")
) {
player.reinitCharacter("key_mio", "key_midori", false);
}
},
},
//西园美鸟
midori_nonghuan: {
enable: "phaseUse",
charlotte: true,
filter(event, player) {
return (player.getStat("skill").midori_nonghuan || 0) < player.hp;
},
filterTarget(card, player, target) {
var stat = player.getStat("midori_nonghuan");
return (
target != player &&
(!stat || !stat.includes(target)) &&
target.countGainableCards(player, "hej") > 0
);
},
content() {
"step 0";
var stat = player.getStat();
if (!stat.midori_nonghuan) stat.midori_nonghuan = [];
stat.midori_nonghuan.push(target);
player.gainPlayerCard(target, "hej", true);
player.draw();
("step 1");
if (player.countCards("he") > 0)
player.chooseCard(
"he",
true,
"交给" + get.translation(target) + "一张牌"
);
else event.goto(3);
("step 2");
player.give(result.cards, target);
("step 3");
var history = game.getGlobalHistory("cardMove");
for (var i = 0; i < history.length; i++) {
if (history[i].getParent("midori_nonghuan") == event)
history.splice(i--, 1);
}
game.countPlayer2(function (current) {
var history = current.getHistory("lose");
for (var i = 0; i < history.length; i++) {
if (history[i].getParent("midori_nonghuan") == event)
history.splice(i--, 1);
}
var history = current.getHistory("gain");
for (var i = 0; i < history.length; i++) {
if (history[i].getParent("midori_nonghuan") == event)
history.splice(i--, 1);
}
});
},
ai: {
order: 9,
result: {
player() {
return lib.card.shunshou.ai.result.player.apply(
this,
arguments
);
},
target() {
return lib.card.shunshou.ai.result.target.apply(
this,
arguments
);
},
},
},
},
midori_tishen: {
trigger: { player: "phaseZhunbeiBegin" },
limited: true,
charlotte: true,
unique: true,
skillAnimation: true,
animationColor: "water",
filter(event, player) {
return player.isDamaged();
},
check(event, player) {
return player.hp <= 1 || player.getDamagedHp() > 1;
},
content() {
player.awakenSkill(event.name);
var num = player.maxHp - player.hp;
player.recover(num);
player.draw(num);
if (
_status.characterlist &&
_status.characterlist.includes("key_mio")
) {
player.reinitCharacter("key_midori", "key_mio", false);
}
},
},
//立华奏
kanade_mapo: {
audio: 2,
derivation: "mapodoufu",
enable: "chooseToUse",
viewAs: { name: "mapodoufu" },
filterCard: { suit: "heart" },
viewAsFilter(player) {
return player.countCards("hes", { suit: "heart" }) > 0;
},
position: "hes",
mod: {
selectTarget(card, player, range) {
if (card.name == "mapodoufu" && range[1] != -1) range[1]++;
},
},
check(card) {
var player = _status.event.player;
if (
game.countPlayer(function (current) {
return (
player.canUse("mapodoufu", current) &&
get.effect(
current,
{ name: "mapodoufu" },
player,
player
) > 0
);
}) > 1
)
return 6 - get.value(card);
return 4 - get.value(card);
},
},
kanade_benzhan: {
audio: 3,
trigger: { global: ["useCard", "respond"] },
usable: 1,
filter(event, player) {
return (
Array.isArray(event.respondTo) &&
event.respondTo[0] != event.player &&
[event.respondTo[0], event.player].includes(player)
);
},
async cost(event, trigger, player) {
event.type = get.type(trigger.card) == "basic";
var prompt = event.type
? "令一名角色摸两张牌或弃置两张牌"
: "令一名角色回复1点体力或对其造成1点伤害";
event.result = await player
.chooseTarget(get.prompt("kanade_benzhan"), prompt)
.set("ai", function (target) {
var player = _status.event.player;
if (_status.event.getParent().type) {
var att = get.attitude(player, target);
if (target.hasSkillTag("nogain")) return -att;
if (target.countCards("he") == 1 && att < 0) att /= 2;
return (
Math.abs(att) *
(1 + 0.1 * Math.min(0, 5 - target.countCards("h")))
);
}
return Math.max(
get.recoverEffect(target, player, player),
get.damageEffect(target, player, player)
);
})
.forResult();
},
content() {
"step 0";
event.type = get.type(trigger.card) == "basic";
var target = event.targets[0];
event.target = target;
var trans = get.translation(target);
var list;
if (event.type) {
if (!target.countCards("he")) event._result = { index: 0 };
else
list = [
"令" + trans + "摸两张牌",
"令" + trans + "弃置两张牌",
];
} else {
if (target.isHealthy()) event._result = { index: 1 };
else
list = [
"令" + trans + "回复1点体力",
"对" + trans + "造成1点伤害",
];
}
player
.chooseControl()
.set("choiceList", list)
.set(
"choice",
(function () {
if (event.type)
return get.attitude(player, target) > 0 ? 0 : 1;
return get.recoverEffect(target, player, player) >
get.damageEffect(target, player, player)
? 0
: 1;
})()
)
.set("ai", function () {
return _status.event.choice;
});
("step 1");
player.addExpose(0.2);
if (event.type) {
if (result.index == 0) target.draw(2);
else target.chooseToDiscard(2, "he", true);
} else {
if (result.index == 0) target.recover();
else target.damage();
}
},
},
//音无结弦
yuzuru_wuxin: {
trigger: { player: "phaseJieshuBegin" },
async cost(event, trigger, player) {
event.result = await player
.chooseCardTarget({
filterTarget() {
if (ui.selected.cards.length) return false;
return true;
},
filterCard() {
if (ui.selected.targets.length) return false;
return lib.filter.cardDiscardable.apply(
this,
arguments
);
},
selectTarget() {
if (!ui.selected.cards.length) return [1, 1];
return [0, 0];
},
selectCard() {
if (ui.selected.targets.length) return [0, 0];
if (!ui.selected.cards.length) return [0, 2];
return [2, 2];
},
prompt: get.prompt2("yuzuru_wuxin"),
complexCard: true,
complexTarget: true,
ai1(card) {
var player = _status.event.player;
if (player.hp > 3) return 0;
return player.getDamagedHp() * 2 - get.value(card);
},
ai2(target) {
if (player.hp < 4 || target.hasSkillTag("nogain"))
return 0;
return get.attitude(_status.event.player, target);
},
})
.forResult();
},
async content(event, trigger, player) {
if (event.cards && event.cards.length) {
player.discard(event.cards);
player.recover();
} else {
const target = event.targets[0];
player.loseHp();
target.draw(2);
}
},
},
yuzuru_deyi: {
derivation: [
"yuzuru_kunfen",
"yuzuru_quji",
"yuzuru_wangsheng",
"yuzuru_kunfen_rewrite",
"yuzuru_quji_rewrite",
],
trigger: { global: "dieAfter" },
forced: true,
unique: true,
juexingji: true,
skillAnimation: true,
animationColor: "orange",
content() {
player.awakenSkill("yuzuru_deyi");
player.changeSkills(
["yuzuru_kunfen", "yuzuru_quji", "yuzuru_wangsheng"],
["yuzuru_wuxin"]
);
player.loseMaxHp();
player.recover();
},
},
yuzuru_kunfen: {
trigger: { player: "phaseJieshuBegin" },
forced: true,
content() {
"step 0";
if (!player.storage._yuzuru_sss) player.loseHp();
player.draw(2);
("step 1");
if (player.countCards("he") < 2) event.finish();
else {
player.chooseCardTarget({
selectCard: 2,
filterTarget: lib.filter.notMe,
prompt: "是否交给一名其他角色两张牌?",
position: "he",
ai1(card) {
var player = _status.event.player;
if (player.maxHp - player.hp == 1 && card.name == "du")
return 30;
var check = player.countCards("h") - 2;
if (check < 1) return 0;
if (player.hp > 1 && check < 2) return 0;
return get.unuseful(card) + 9;
},
ai2(target) {
var att = get.attitude(_status.event.player, target);
if (
ui.selected.cards.length == 1 &&
ui.selected.cards[0].name == "du"
)
return 1 - att;
return att - 2;
},
});
}
("step 2");
if (result.bool) player.give(result.cards, result.targets[0]);
},
},
yuzuru_quji: {
audio: 2,
enable: "phaseUse",
usable: 1,
position: "he",
filterCard: true,
selectCard() {
var player = _status.event.player;
return player.getDamagedHp();
},
filterTarget(card, player, target) {
return target != player && target.hp < target.maxHp;
},
filter(event, player) {
return player.hp < player.maxHp;
},
selectTarget() {
return [1, ui.selected.cards.length];
},
complexSelect: true,
check(card) {
if (
!_status.event.player.storage._yuzuru_sss &&
get.color(card) == "black"
)
return -1;
return 9 - get.value(card);
},
line: { color: [194, 117, 92] },
content() {
"step 0";
target.recover();
("step 1");
if (
target == targets[targets.length - 1] &&
!player.storage._yuzuru_sss
) {
for (var i = 0; i < cards.length; i++) {
if (get.color(cards[i], player) == "black") {
player.loseHp();
break;
}
}
}
},
ai: {
result: {
target: 1,
},
order: 6,
},
},
yuzuru_wangsheng: {
trigger: { player: "dieBegin" },
forced: true,
juexingji: true,
unique: true,
skillAnimation: true,
animationColor: "soil",
content() {
"step 0";
trigger.cancel();
player.awakenSkill("yuzuru_wangsheng");
player.storage._yuzuru_sss = true;
if (player.countCards("he") > 0) {
player.chooseCardTarget({
selectCard: [1, Infinity],
filterTarget: lib.filter.notMe,
prompt: "将任意张牌交给一名其他角色,或点【取消】。",
position: "he",
ai1(card) {
var player = _status.event.player;
if (
get.suit(card, false) == "heart" &&
game.hasPlayer(function (current) {
return (
current.hasSkill("kanade_mapo") &&
get.attitude(player, current) > 0
);
})
)
return 1;
return 0;
},
ai2(kanade) {
if (
kanade.hasSkill("kanade_mapo") &&
get.attitude(_status.event.player, kanade) > 0
)
return 2;
return 0;
},
});
} else event.goto(2);
("step 1");
if (result.bool) player.give(result.cards, result.targets[0]);
("step 2");
player.loseMaxHp();
("step 3");
if (player.hp < 2) player.recover(2 - player.hp);
},
},
//空门苍
ao_xishi: {
trigger: {
player: ["useCard", "respond"],
target: "useCardToTargeted",
},
forced: true,
filter(event, player, name) {
return (
(name == "useCard" ||
name == "respond" ||
event.player != player) &&
get.suit(event.card) == "diamond"
);
},
content() {
player.draw();
},
},
ao_kuihun: {
trigger: { global: "dying" },
logTarget: "player",
line: "thunder",
filter(event, player) {
return player != event.player;
},
content() {
"step 0";
player.draw();
("step 1");
if (!trigger.player.countCards("h")) event.finish();
else
player
.chooseButton([
"选择一张牌作为「蝶」",
trigger.player.getCards("h"),
])
.set("ai", function (button) {
var val = get.buttonValue(button);
if (
get.attitude(
_status.event.player,
get.owner(button.link)
) <= 0
)
return 10 + val;
if (val <= 0) return 20;
if (
button.link.name == "tao" ||
button.link.name == "jiu"
)
return 0;
return 1 / val;
});
("step 2");
if (result.bool) {
player
.addToExpansion(result.links, trigger.player, "give")
.set("log", false)
.gaintag.add("ao_diegui");
game.log(result.links, "飞向了", player);
}
},
locked: false,
mod: {
targetInRange(card, player) {
const cardSuit = get.suit(card, false);
const list = player.getExpansions("ao_diegui");
for (let i = 0; i < list.length; i++) {
if (
cardSuit === "unsure" ||
get.suit(list[i], false) === cardSuit
)
return true;
}
},
cardUsable(card, player) {
const cardSuit = get.suit(card, false);
const list = player.getExpansions("ao_diegui");
for (let i = 0; i < list.length; i++) {
if (
cardSuit === "unsure" ||
get.suit(list[i], false) === cardSuit
)
return Infinity;
}
},
maxHandcard(player, num) {
return num + player.getExpansions("ao_diegui").length;
},
},
},
ao_shixin: {
derivation: "ao_diegui",
trigger: { player: "phaseZhunbeiBegin" },
juexingji: true,
forced: true,
skillAnimation: true,
animationColor: "key",
unique: true,
filter(event, player) {
var list = player.getExpansions("ao_diegui");
var list2 = [];
for (var i = 0; i < list.length; i++) {
list2.add(get.suit(list[i], false));
}
return list2.length > 2;
},
content() {
player.awakenSkill("ao_shixin");
player.changeSkills(["ao_diegui"], ["ao_kuihun"]);
player.gainMaxHp();
player.recover();
},
ai: {
combo: "ao_kuihun",
},
},
ao_diegui: {
enable: "phaseUse",
usable: 1,
filter(event, player) {
return player.getExpansions("ao_diegui").length > 0;
},
chooseButton: {
dialog(event, player) {
return ui.create.dialog(
"蝶归",
player.getExpansions("ao_diegui"),
"hidden"
);
},
backup(links, player) {
return {
card: links,
filterCard() {
return false;
},
selectCard: -1,
filterTarget: true,
delay: false,
content: lib.skill.ao_diegui.contentx,
line: "thunder",
ai: {
result: {
target(player, target) {
if (
target != player &&
target.hasSkillTag("nogain")
)
return 0;
var num = 1;
if (target.isTurnedOver()) num += 2;
if (target.isLinked()) num += 0.5;
return num;
},
},
},
};
},
prompt(links, player) {
return (
"选择一名角色,令其获得" +
get.translation(links[0]) +
",摸两张牌并将武将牌复原。"
);
},
},
contentx() {
"step 0";
player.give(lib.skill.ao_diegui_backup.card, target, "visible");
target.draw(2);
("step 1");
target.link(false);
("step 2");
target.turnOver(false);
},
intro: {
name: "七影蝶",
content: "expansion",
markcount: "expansion",
},
onremove(player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
ai: { order: 1, result: { player: 1 } },
},
//直井文人
ayato_jianshen: {
mod: {
cardnature(card, player) {
if (get.name(card) == "sha") return "kami";
},
},
ai: { threaten: 3 },
},
ayato_zonghuan: {
enable: "phaseUse",
usable: 1,
filterTarget(card, player, target) {
return target != player && target.countCards("h") > 0;
},
content() {
"step 0";
player
.chooseButton(
[
"请选择" + get.translation(target) + "的一张手牌",
target.getCards("h"),
],
true
)
.set("ai", get.buttonValue);
("step 1");
if (result.bool) {
var card = result.links[0];
event.card = card;
if (!lib.filter.cardEnabled(card, target))
event._result = { bool: false };
else {
var targets = game.players.slice(0);
var info = get.info(card);
var range;
if (!info.notarget) {
var select = get.copy(info.selectTarget);
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,
target,
range,
"selectTarget",
target
);
}
if (info.notarget || range[1] == -1) {
if (range[1] == -1) {
for (var i = 0; i < targets.length; i++) {
if (!target.canUse(card, targets[i])) {
targets.splice(i--, 1);
}
}
if (targets.length) {
event.targets2 = targets;
} else {
event.finish();
return;
}
} else event.targets2 = [];
var next = player.chooseBool();
next.set(
"prompt",
event.prompt ||
"是否令" +
get.translation(target) +
(event.targets2.length ? "对" : "") +
get.translation(event.targets2) +
"使用" +
get.translation(card) +
"?"
);
next.set(
"prompt2",
"或点「取消」,令其将此牌置入弃牌堆"
);
next.ai = function () {
var eff = 0;
for (var i = 0; i < event.targets2.length; i++) {
eff += get.effect(
event.targets2[i],
card,
target,
player
);
}
return eff > 0;
};
} else {
var next = player.chooseTarget();
next.set("_get_card", card);
next.set("source", target);
next.set(
"filterTarget",
function (card, player, target) {
return lib.filter.filterTarget(
_status.event._get_card,
_status.event.source,
target
);
}
);
next.set("ai", function (target) {
var evt = _status.event;
return get.effect(
target,
evt._get_card,
evt.source,
evt.player
);
});
next.set("selectTarget", function () {
var card = get.card(),
player = _status.event.source;
if (card == undefined) return;
var range;
var select = get.copy(get.info(card).selectTarget);
if (select == undefined) {
if (get.info(card).filterTarget == undefined)
return [0, 0];
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;
});
next.set(
"prompt",
event.prompt ||
"选择" +
get.translation(target) +
"使用" +
get.translation(card) +
"的目标"
);
next.set("prompt2", "或点「取消」令其将此牌置入弃牌堆");
}
}
} else event.finish();
("step 2");
if (result.bool) {
target.useCard(
card,
event.targets2 || result.targets,
false,
"noai"
);
player.draw();
} else {
target.lose(card, ui.discardPile);
target.$throw(card);
game.log(target, "将", card, "置入了弃牌堆");
}
},
ai: { order: 10, result: { target: -1 } },
},
//古河渚
nagisa_tiandu: {
trigger: { player: "judgeEnd" },
charlotte: true,
frequent(event) {
if (event.result.card.name == "du") return false;
return true;
},
check(event) {
if (event.result.card.name == "du") return false;
return true;
},
filter(event, player) {
return get.position(event.result.card, true) == "o";
},
content() {
player.gain(trigger.result.card, "gain2");
},
},
nagisa_fuxin: {
trigger: {
global: ["gainAfter", "loseAfter", "loseAsyncAfter", "damageEnd"],
},
filterx(event, player) {
var source = _status.currentPhase;
if (event.name == "damage") {
return event.player.isAlive() && event.player != source;
} else if (event.name == "lose") {
if (
event.type != "discard" ||
event.player == source ||
event.player.isDead()
)
return false;
if (
(event.discarder || event.getParent(2).player) ==
event.player
)
return false;
if (!event.getl(event.player).hs.length) return false;
return true;
} else if (event.name == "gain") {
if (event.giver || event.getParent().name == "gift")
return false;
var cards = event.getg(event.player);
if (!cards.length) return false;
return game.hasPlayer(function (current) {
if (current == event.player || current == source)
return false;
var hs = event.getl(current).hs;
for (var i of hs) {
if (cards.includes(i)) return true;
}
return false;
});
} else if (event.type == "gain") {
if (
event.giver ||
!event.player ||
event.player == source ||
event.player.isDead()
)
return false;
var hs = event.getl(event.player);
return game.hasPlayer(function (current) {
if (current == event.player) return false;
var cards = event.getg(current);
for (var i of cards) {
if (hs.includes(i)) return true;
}
});
} else if (event.type == "discard") {
if (!event.discarder) return false;
return game.hasPlayer(function (current) {
return (
current != source &&
current != event.discarder &&
event.getl(current).hs.length > 0
);
});
}
return false;
},
filter(event, player, triggername, target) {
return target.isIn();
},
getIndex(trigger, player, triggername) {
if (!lib.skill.nagisa_fuxin.filterx(trigger, player)) return false;
const targets = [],
source = _status.currentPhase;
if (trigger.name == "gain") {
const cards = trigger.getg(trigger.player);
targets.addArray(
game.filterPlayer(function (current) {
if (current === trigger.player || current === source)
return false;
const hs = trigger.getl(current).hs;
for (const i of hs) {
if (cards.includes(i)) return true;
}
return false;
})
);
} else if (
trigger.name == "loseAsync" &&
trigger.type == "discard"
) {
targets.addArray(
game.filterPlayer(function (current) {
return (
current != trigger.discarder &&
current != source &&
trigger.getl(current).hs.length > 0
);
})
);
} else targets.push(trigger.player);
targets.sortBySeat();
return targets;
},
logTarget: (event, player, triggername, target) => target,
check(event, player, triggername, target) {
const source = _status.currentPhase;
if (source && source.isIn() && get.attitude(player, source) > 0)
return false;
return get.attitude(player, target) > 0;
},
async content(event, trigger, player) {
const target = event.indexedData;
const { result } = await target.judge();
if (result.color === "red" && target.isIn()) {
await target.draw();
} else {
const source = _status.currentPhase;
if (source && source.isIn() && source.countCards("h") > 0) {
source.chooseToDiscard("he", true);
}
}
},
ai: { expose: 0.2 },
},
//冈崎朋也
tomoya_shangxian: {
trigger: { player: "phaseUseBegin" },
mark: true,
locked: true,
intro: {
content(s) {
return (
"计算与其他角色的距离时始终从" +
(s ? "逆" : "顺") +
"时针计算"
);
},
},
content() {
player.draw();
player.storage.tomoya_shangxian = !player.storage.tomoya_shangxian;
},
ai: {
left_hand: true,
right_hand: true,
skillTagFilter(player, tag) {
return (
(player.storage.tomoya_shangxian == true) ==
(tag == "left_hand")
);
},
},
},
tomoya_wangjin: {
trigger: { global: "phaseJieshuBegin" },
filter(event, player) {
return (
player != event.player &&
!player.hasSkill(
"tomoya_wangjin_" + player.inRange(event.player)
)
);
},
logTarget: "player",
check(event, player) {
var target = event.player;
var bool = player.inRange(target);
if (!bool) {
if (target.hp > player.hp)
return (
get.effect(
target,
{ name: "sha", isCard: true },
player,
player
) > 0
);
var temp = target;
while (true) {
temp = temp.getNext();
if (temp == target || temp == _status.roundStart)
return true;
if (temp == player) continue;
if (
temp.hp > player.hp &&
!player.inRange(temp) &&
get.effect(
temp,
{ name: "sha", isCard: true },
player,
player
) > 0
)
return false;
}
}
if (get.attitude(player, target) < 2) return false;
if (target.hp < player.hp && !target.hasSkillTag("nogain"))
return true;
var temp = target;
while (true) {
temp = temp.getNext();
if (temp == target || temp == _status.roundStart) return true;
if (temp == player) continue;
if (
temp.hp < player.hp &&
player.inRange(temp) &&
get.attitude(player, target) >= 2 &&
!temp.hasSkillTag("nogain")
)
return false;
}
},
content() {
"step 0";
event.bool = player.inRange(trigger.player);
player.addTempSkill("tomoya_wangjin_" + event.bool, "roundStart");
if (event.bool) {
trigger.player.draw();
} else player.draw(2);
("step 1");
if (event.bool) {
if (trigger.player.hp < player.hp) player.draw();
else event.finish();
} else {
if (player.countDiscardableCards(trigger.player, "h") > 0)
trigger.player.discardPlayerCard(player, "h", true);
else event.finish();
}
("step 2");
if (event.bool) {
player.chooseCard(
"h",
"是否交给" + get.translation(trigger.player) + "一张牌?"
);
} else {
event.finish();
if (player.hp >= trigger.player.hp) return;
var card = { name: "sha", isCard: true };
if (player.canUse(card, trigger.player, false))
player.useCard(card, trigger.player, false);
}
("step 3");
if (result.bool) player.give(result.cards, target);
},
subSkill: {
true: { charlotte: true },
false: { charlotte: true },
},
ai: { expose: 0.2 },
},
//野田
noda_fengcheng: {
audio: 2,
trigger: {
player: "gainAfter",
},
forced: true,
filter(event, player) {
return (
get.itemtype(event.source) == "player" && event.bySelf != true
);
},
check(event, player) {
return get.attitude(player, event.source) > 0;
},
logTarget: "source",
content() {
trigger.source.draw();
},
},
noda_xunxin: {
audio: 2,
enable: "phaseUse",
viewAs: { name: "juedou" },
filter(event, player) {
return (player.getStat("skill").noda_xunxin || 0) < player.hp;
},
filterTarget(event, player, target) {
if (target.hp < player.hp) return false;
return lib.filter.filterTarget.apply(this, arguments);
},
selectCard: -1,
filterCard() {
return false;
},
group: "noda_xunxin2",
},
noda_xunxin2: {
trigger: { player: "juedouAfter" },
popup: false,
forced: true,
filter(event, player) {
if (event.target.isDead()) return false;
return event.turn && event.turn.countCards("he") > 0;
},
content() {
"step 0";
event.giver = trigger.turn;
event.gainner = event.giver == player ? trigger.target : player;
event.giver.chooseCard(
"he",
true,
"交给" + get.translation(event.gainner) + "一张牌"
);
("step 1");
event.giver.give(result.cards, event.gainner);
},
},
//日向秀树
hinata_qiulve: {
audio: 2,
enable: ["chooseToUse", "chooseToRespond"],
viewAsFilter(player) {
return (
player.countCards("hes", function (card) {
return get.type(card) != "basic";
}) > 0
);
},
viewAs: { name: "sha" },
filterCard(card, player) {
return get.type(card) != "basic";
},
locked: false,
position: "hes",
check(card) {
var val = get.value(card);
if (val >= 6) return 0;
if (get.color(card) == "black") return 12 - val;
return 6 - val;
},
mod: {
targetInRange(card, player, target) {
if (_status.event.skill == "hinata_qiulve") return true;
},
},
group: "hinata_qiulve_clear",
ai: {
respondSha: true,
skillTagFilter(player) {
return (
player.countCards("hes", function (card) {
return get.type(card) != "basic";
}) > 0
);
},
},
},
hinata_qiulve_clear: {
trigger: { player: "useCard1" },
firstDo: true,
silent: true,
filter(event, player) {
return event.skill == "hinata_qiulve";
},
content() {
if (get.color(trigger.card) == "red")
trigger.directHit.addArray(game.players);
else if (trigger.addCount !== false) {
trigger.addCount = false;
var stat = player.getStat().card;
if (stat.sha) stat.sha--;
}
},
},
hinata_ehou: {
audio: 2,
trigger: { global: "useCardAfter" },
//这个也是chooseToUse 改不了
direct: true,
filter(event, player) {
return (
player != event.player &&
event.targets &&
event.targets.includes(player) &&
(_status.connectMode || player.hasSha())
);
},
content() {
"step 0";
player.chooseToUse({
logSkill: "hinata_ehou",
preTarget: trigger.player,
prompt:
"是否发动【扼喉】,对" +
get.translation(trigger.player) +
"使用一张【杀】?",
filterCard(card, player) {
return (
get.name(card) == "sha" &&
lib.filter.filterCard.apply(this, arguments)
);
},
filterTarget(card, player, target) {
return (
target == _status.event.preTarget &&
lib.filter.filterTarget.apply(this, arguments)
);
},
addCount: false,
});
("step 1");
if (
result.bool &&
player.getHistory("sourceDamage", function (evt) {
return evt.getParent(4) == event;
}).length
)
player.draw();
},
},
//高桥久子
hisako_yinbao: {
audio: 2,
trigger: { player: ["damageEnd", "recoverAfter"] },
content() {
"step 0";
player.judge(function (card) {
return get.suit(card) == "spade" ? 2 : -2;
}).judge2 = function (result) {
return result.bool;
};
("step 1");
if (result.bool && game.hasPlayer((current) => current != player)) {
player
.chooseTarget(
lib.filter.notMe,
true,
"选择一名其他角色对其造成1点雷属性伤害"
)
.set("ai", function (target) {
var player = _status.event.player;
return get.damageEffect(
target,
player,
player,
"thunder"
);
});
} else event.finish();
("step 2");
var target = result.targets[0];
player.addExpose(0.2);
player.line(target, "thunder");
target.damage("thunder");
},
},
hisako_zhuanyun: {
trigger: { player: "judgeBegin" },
forced: true,
charlotte: true,
silent: true,
filter(event, player) {
return !event.directresult;
},
content() {
var tempcard = false,
temp = -Infinity;
for (var i = 0; i < ui.cardPile.childElementCount; i++) {
var card = ui.cardPile.childNodes[i];
var temp2 = trigger.judge(card);
if (temp2 > temp) {
tempcard = card;
temp = temp2;
}
}
if (tempcard) trigger.directresult = tempcard;
},
ai: { luckyStar: true },
},
//直枝理树
riki_spwenji: {
audio: 2,
trigger: { player: "phaseUseBegin" },
filter(event, player) {
return game.hasPlayer(function (current) {
return current != player && current.countCards("he");
});
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt2("riki_spwenji"),
function (card, player, target) {
return target != player && target.countCards("he");
}
)
.set("ai", function (target) {
var att = get.attitude(_status.event.player, target);
if (att > 0) return Math.sqrt(att) / 10;
return 5 - att;
})
.forResult();
},
content() {
"step 0";
target = targets[0];
event.target = target;
target.chooseCard(
"he",
true,
"问计:将一张牌交给" + get.translation(player)
);
("step 1");
if (result.bool) {
player.addTempSkill("riki_spwenji_respond");
player.storage.riki_spwenji_respond = get.type2(
result.cards[0],
target
);
event.target.give(result.cards, player, true);
}
},
ai: { expose: 0.2 },
subSkill: {
respond: {
onremove: true,
trigger: { player: "useCard" },
forced: true,
charlotte: true,
audio: "riki_spwenji",
filter(event, player) {
return (
get.type2(event.card) ==
player.storage.riki_spwenji_respond
);
},
content() {
trigger.directHit.addArray(game.players);
},
ai: {
directHit_ai: true,
skillTagFilter(player, tag, arg) {
return (
get.type2(arg.card) ==
player.storage.riki_spwenji_respond
);
},
},
},
},
},
riki_nvzhuang: {
trigger: { player: "phaseJieshuBegin" },
forced: true,
content() {
player.draw(player.countCards("h") == 0 ? 2 : 1);
},
},
riki_mengzhong: {
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
derivation: "riki_chongzhen",
juexingji: true,
unique: true,
skillAnimation: true,
animationColor: "key",
filter(event, player) {
var num = 0;
player.getAllHistory("gain", function (evt) {
if (evt.getParent().name == "riki_spwenji")
num += evt.cards.length;
});
return num >= 3;
},
content() {
player.awakenSkill("riki_mengzhong");
player.removeSkills("riki_spwenji");
player.gainMaxHp();
player.recover();
player.addSkills("riki_chongzhen");
},
ai: {
combo: "riki_spwenji",
},
},
riki_chongzhen: {
trigger: {
player: "phaseUseBegin",
},
filter(event, player) {
return game.hasPlayer((current) => player.canCompare(current));
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt2("riki_chongzhen"),
function (card, player, target) {
return player.canCompare(target);
}
)
.set("ai", function (target) {
return (
(-get.attitude(player, target) *
(1 + target.countCards("e"))) /
(1 + target.countCards("j"))
);
})
.forResult();
},
content() {
"step 0";
var target = targets[0];
event.target = target;
player.chooseToCompare(target);
("step 1");
if (result.bool) {
var num = 0;
if (target.countCards("h")) num++;
if (target.countCards("e")) num++;
if (target.countCards("j")) num++;
if (num) {
player
.gainPlayerCard(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;
});
}
} else {
player.addTempSkill("zishou2", "phaseEnd");
}
},
ai: { expose: 0.2 },
},
//来谷唯湖
yuiko_fenglun: {
enable: "phaseUse",
usable: 1,
filter(event, player) {
return (
player.countCards("h") > 0 &&
game.hasPlayer(function (current) {
return player.canCompare(current);
})
);
},
filterTarget(card, player, target) {
return player.canCompare(target);
},
content() {
"step 0";
player.chooseToCompare(target);
("step 1");
if (result.bool)
player.addTempSkill("yuiko_fenglun2", "phaseUseEnd");
},
ai: {
order: 10,
result: { target: -1 },
},
},
yuiko_fenglun2: {
mod: {
cardUsable() {
return Infinity;
},
targetInRange() {
return true;
},
},
},
yuiko_dilve: {
enable: "chooseCard",
check() {
return 20;
},
filter(event) {
return event.type == "compare" && !event.directresult;
},
onCompare(player) {
return game.cardsGotoOrdering(get.bottomCards()).cards;
},
group: "yuiko_dilve_gain",
subSkill: {
gain: {
trigger: {
player: ["chooseToCompareAfter", "compareMultipleAfter"],
target: ["chooseToCompareAfter", "compareMultipleAfter"],
},
filter(event, player) {
if (event.preserve) return false;
return (
[event.card1, event.card2].filterInD("od").length > 0
);
},
prompt2(event, player) {
return (
"获得" +
get.translation(
[event.card1, event.card2].filterInD("od")
)
);
},
content() {
player.gain(
[trigger.card1, trigger.card2].filterInD("od"),
"gain2",
"log"
);
},
},
},
},
//多鲁基
doruji_feiqu: {
trigger: {
player: "useCard",
target: "useCardToTargeted",
},
forced: true,
filter(event, player) {
return event.card.name == "sha";
},
content() {
if (trigger.name == "useCard")
trigger.directHit.addArray(game.players);
else trigger.directHit.add(player);
},
ai: {
directHit_ai: true,
skillTagFilter(player, tag, arg) {
return arg.card.name == "sha";
},
},
global: "doruji_feiqu_ai",
},
doruji_feiqu_ai: {
ai: {
directHit_ai: true,
skillTagFilter(player, tag, arg) {
return (
arg.card.name == "sha" &&
(arg.target.hasSkill("doruji_feiqu") ||
arg.target.hasSkill("godan_feiqu"))
);
},
},
},
//千里朱音
akane_jugu: {
audio: 2,
mod: {
maxHandcard(player, num) {
return num + player.maxHp;
},
},
trigger: { global: "phaseBefore", player: "enterGame" },
forced: true,
filter(event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content() {
player.draw(player.maxHp);
},
},
akane_quanqing: {
enable: "phaseUse",
filterCard: true,
filterTarget(card, player, target) {
return target != player && player.inRange(target);
},
position: "he",
check(card) {
var val = get.value(card);
var num = card.number;
if (num > 10) return 8 - val;
var player = _status.event.player;
if (
player.getUseValue(card, null, true) >
player.getUseValue({ name: "guohe" })
)
return 0;
if (num > 6) return 6 - val;
return 3 - val;
},
content() {
"step 0";
var num = cards[0].number;
var trans = get.translation(target);
var list = ["令" + trans + "摸一张牌"];
event.addIndex = 0;
if (num > 6) {
if (target.countDiscardableCards(player, "hej") > 0)
list.push("弃置" + trans + "区域内的一张牌");
else event.addIndex++;
}
if (num > 10) list.push("对" + trans + "造成1点伤害");
if (list.length == 1) event._result = { index: 0 };
else
player
.chooseControl()
.set("choiceList", list)
.set("index", list.length - 1)
.set("ai", function () {
return _status.event.index;
});
("step 1");
if (result.index > 0) result.index += event.addIndex;
switch (result.index) {
case 0:
target.draw();
break;
case 1:
player.discardPlayerCard(target, "hej", true);
break;
case 2:
target.damage("nocard");
break;
}
},
ai: {
order: 4,
result: {
target(player, target) {
var card = ui.selected.cards[0];
if (card) {
if (card.number > 10)
return get.damageEffect(target, player, target);
if (card.number > 6)
return lib.card.guohe.ai.result.target.apply(
this,
arguments
);
return 1;
}
},
},
},
},
akane_yifu: {
unique: true,
global: "akane_yifu2",
zhuSkill: true,
},
akane_yifu2: {
audio: 2,
enable: "phaseUse",
discard: false,
line: true,
log: false,
delay: false,
lose: false,
prepare(cards, player, targets) {
targets[0].logSkill("akane_yifu");
},
prompt() {
var player = _status.event.player;
var list = game.filterPlayer(function (target) {
return (
target != player && target.hasZhuSkill("akane_yifu", player)
);
});
var str = "将一张手牌交给" + get.translation(list);
if (list.length > 1) str += "中的一人";
return str;
},
filter(event, player) {
if (player.group != "key") return false;
if (player.countCards("h") == 0) return 0;
return game.hasPlayer(function (target) {
return (
target != player &&
target.hasZhuSkill("akane_yifu", player) &&
!target.hasSkill("akane_yifu3")
);
});
},
filterCard: true,
filterTarget(card, player, target) {
return (
target != player &&
target.hasZhuSkill("akane_yifu", player) &&
!target.hasSkill("akane_yifu3")
);
},
content() {
"step 0";
player.give(cards, target);
target.addTempSkill("akane_yifu3", "phaseUseEnd");
target.draw();
("step 1");
if (target.countCards("h") > 0)
target
.chooseCard(
"h",
true,
"交给" + get.translation(player) + "一张牌"
)
.set("ai", function (card) {
return 14 - get.value(card);
});
else event.finish();
("step 2");
target.give(result.cards, player);
},
ai: {
expose: 0.3,
order: 10,
result: {
target: 5,
},
},
},
akane_yifu3: { charlotte: true },
//笹濑川佐佐美
sasami_miaobian: {
derivation: ["sasami_gongqing", "sasami_funan", "sasami_baoqiu"],
init2(player) {
if (player.hp <= 3) player.addSkill("sasami_gongqing");
if (player.hp <= 2) player.addSkill("sasami_funan");
if (player.hp <= 1) player.addSkill("sasami_baoqiu");
},
trigger: { player: "changeHp" },
firstDo: true,
silent: true,
content() {
lib.skill.sasami_miaobian.init2(player);
},
},
sasami_baoqiu: {
line: { color: [173, 149, 206] },
inherit: "rin_baoqiu",
},
sasami_gongqing: {
audio: true,
trigger: {
player: ["damageBegin3", "damageBegin4"],
},
forced: true,
filter(event, player, name) {
if (!event.source) return false;
var range = event.source.getAttackRange();
if (name == "damageBegin3") return range > 3;
return event.num > 1 && range < 3;
},
content() {
trigger.num =
event.triggername == "damageBegin4" ? 1 : trigger.num + 1;
},
ai: {
filterDamage: true,
skillTagFilter(player, tag, arg) {
if (arg && arg.player) {
if (arg.player.hasSkillTag("jueqing", false, player))
return false;
if (arg.player.getAttackRange() < 3) return true;
}
return false;
},
},
},
sasami_funan: {
audio: 2,
trigger: { global: ["respond", "useCard"] },
line: { color: [173, 149, 206] },
filter(event, player) {
if (!event.respondTo) return false;
if (event.player == player) return false;
if (player != event.respondTo[0]) return false;
if (!player.hasSkill("sasami_funan_jiexun")) {
var cards = [];
if (get.itemtype(event.respondTo[1]) == "card")
cards.push(event.respondTo[1]);
else if (event.respondTo[1].cards)
cards.addArray(event.respondTo[1].cards);
return cards.filterInD("od").length > 0;
} else return event.cards.filterInD("od").length > 0;
},
logTarget: "player",
content() {
"step 0";
if (!player.hasSkill("sasami_funan_jiexun")) {
var cards = [];
if (get.itemtype(trigger.respondTo[1]) == "card")
cards.push(trigger.respondTo[1]);
else if (trigger.respondTo[1].cards)
cards.addArray(trigger.respondTo[1].cards);
cards = cards.filterInD("od");
trigger.player
.gain(cards, "gain2", "log")
.gaintag.add("sasami_funan");
trigger.player.addTempSkill("sasami_funan_use");
}
("step 1");
var cards = trigger.cards.filterInD("od");
player.gain(cards, "log", "gain2");
},
subSkill: {
use: {
onremove(player) {
player.removeGaintag("sasami_funan");
},
charlotte: true,
mod: {
cardEnabled2(card, player) {
if (
get.itemtype(card) == "card" &&
card.hasGaintag("sasami_funan")
) {
return false;
}
},
},
},
},
},
//枣铃
rin_baoqiu: {
mod: {
attackRange(rin, ball) {
return ball + 2;
},
},
trigger: { player: "useCardToPlayered" },
forced: true,
logTarget: "target",
filter(event, player) {
return event.card.name == "sha";
},
line: { color: [194, 117, 92] },
content() {
"step 0";
player.judge(function () {
return 0;
});
("step 1");
var target = trigger.target;
var map = trigger.customArgs;
var id = target.playerid;
if (!map[id]) map[id] = {};
if (result.color == "red") {
if (!map[id].extraDamage) map[id].extraDamage = 0;
map[id].extraDamage++;
}
if (result.color == "black") {
trigger.directHit.add(target);
}
if (result.suit == "spade" || result.suit == "heart") {
var evt = trigger.getParent();
if (evt.addCount !== false) {
evt.addCount = false;
player.getStat().card.sha--;
}
player.draw();
}
if (result.suit == "diamond" || result.suit == "club") {
target.addTempSkill("fengyin");
if (target.countDiscardableCards(player, "he") > 0)
player.discardPlayerCard(target, "he", true);
}
},
},
//春原阳平&春原芽衣
sunohara_chengshuang: {
trigger: {
global: "phaseBefore",
player: "enterGame",
},
group: "sunohara_chengshuang_phase",
forced: true,
filter(event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content() {
"step 0";
var evt = event.getParent("phase");
if (evt && evt.player == player) evt.sunohara_chengshuang = true;
player
.chooseControl("male", "female")
.set("prompt", "成双:请选择自己的性别");
("step 1");
var sex = result.control;
game.broadcastAll(
function (player, sex) {
player.sex = sex;
if (player.marks && player.marks.sunohara_chengshuang)
player.marks.sunohara_chengshuang.firstChild.innerHTML =
sex == "male" ? "♂" : "♀";
},
player,
sex
);
game.log(
player,
"将性别变更为",
"#g" + get.translation(sex) + "性"
);
},
mark: true,
intro: {
content(storage, player) {
if (player.sex == "unknown" || player.sex == "double")
return "当前性别未确定";
return "当前性别:" + get.translation(player.sex);
},
},
},
sunohara_chengshuang_phase: {
trigger: {
player: "phaseBegin",
},
filter(event, player) {
if (event.sunohara_chengshuang) return false;
return game.phaseNumber > 1;
},
prompt2(event, player) {
if (player.sex == "unknown" || player.sex == "double")
return "选择自己的性别";
return (
"将自己的性别变更为" + (player.sex == "male" ? "女性" : "男性")
);
},
content() {
"step 0";
if (player.sex == "unknown" || player.sex == "double")
player
.chooseControl("male", "female")
.set("prompt", "成双:请选择自己的性别");
else
event._result = {
control: player.sex == "male" ? "female" : "male",
};
("step 1");
var sex = result.control;
game.broadcastAll(
function (player, sex) {
player.sex = sex;
if (player.marks && player.marks.sunohara_chengshuang)
player.marks.sunohara_chengshuang.firstChild.innerHTML =
sex == "male" ? "♂" : "♀";
},
player,
sex
);
game.log(
player,
"将性别变更为",
"#g" + get.translation(sex) + "性"
);
},
},
sunohara_tiaoyin: {
enable: "phaseUse",
usable: 1,
filterTarget(card, player, target) {
return (
target != player && target.countGainableCards(player, "hej") > 0
);
},
selectCard: [1, 4],
filterCard(card) {
for (var i = 0; i < ui.selected.cards.length; i++) {
if (get.suit(ui.selected.cards[i]) == get.suit(card))
return false;
}
return true;
},
complexSelect: true,
complexCard: true,
complexTarget: true,
selectTarget() {
return [ui.selected.cards.length, ui.selected.cards.length];
},
line: { color: [239, 204, 96] },
content() {
if (target.countGainableCards(player, "hej") > 0)
player.gainPlayerCard(target, "hej", "visible");
},
contentAfter() {
var bool = false;
for (var i = 0; i < targets.length; i++) {
if (targets[i].differentSexFrom(player)) {
bool = true;
break;
}
}
if (bool) player.loseHp();
},
ai: {
order: 6,
result: {
target(player, target) {
return lib.card.shunshou.ai.result.target.apply(
this,
arguments
);
},
player(player, target) {
if (target.sameSexAs(player)) return 0;
for (var i = 0; i < ui.selected.targets.length; i++) {
if (ui.selected.targets[i].differentSexFrom(player))
return 0;
}
return get.attitude(player, target) < 0 &&
target.countCards("h", "tao") > 0
? 1
: -2;
},
},
},
},
sunohara_jianren: {
trigger: { player: "damageEnd" },
line: { color: [145, 149, 179] },
async cost(event, trigger, player) {
const num =
!trigger.source ||
trigger.source.isDead() ||
trigger.source.differentSexFrom(player)
? 3
: 1;
event.result = await player
.chooseTarget(
get.prompt("sunohara_jianren"),
"令一名角色摸" + get.cnNumber(num) + "张牌。"
)
.set("ai", function (target) {
var att = get.attitude(player, target);
if (att <= 0) return 0;
if (
target.hasSkillTag("nogain") &&
target != _status.currentPhase
)
return 0.1;
return att / (1 + 0.1 * target.countCards("h"));
})
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
const num =
!trigger.source ||
trigger.source.isDead() ||
trigger.source.differentSexFrom(player)
? 3
: 1;
target.draw(num);
},
},
//椎名
shiina_qingshen: {
audio: 1,
trigger: {
player: "damageEnd",
source: "damageSource",
},
filter(event, player) {
return event.cards && event.cards.filterInD().length > 0;
},
frequent: true,
content() {
"step 0";
var cards = trigger.cards.filterInD("od");
player.gain(cards, "gain2", "log");
event.count = cards.length;
("step 1");
var cards = player.getCards("he");
if (cards.length == 0) {
event.finish();
return;
} else if (cards.length <= event.count) {
event._result = { bool: true, cards: cards };
} else
player.chooseCard(
true,
"he",
event.count,
"请选择要置于武将牌上的牌"
);
("step 2");
if (result.bool && result.cards.length) {
var cards = result.cards;
player
.addToExpansion(cards, player, "give")
.gaintag.add("shiina_qingshen");
}
},
intro: {
content: "expansion",
markcount: "expansion",
},
mod: {
attackRange(from, num) {
return num + from.getExpansions("shiina_qingshen").length;
},
maxHandcard(from, num) {
return num + from.getExpansions("shiina_qingshen").length;
},
},
ai: {
notemp: true,
},
},
shiina_feiyan: {
audio: 1,
animalList: ["key_inari", "key_doruji"],
trigger: { global: "phaseBegin" },
filter(event, player) {
if (lib.skill.shiina_feiyan.animalList.includes(event.player.name))
return false;
return (
player.getExpansions("shiina_qingshen").length > 0 &&
player.inRange(event.player)
);
},
async cost(event, trigger, player) {
const { result } = await player
.chooseButton([
get.prompt("shiina_feiyan", trigger.player),
player.getExpansions("shiina_qingshen"),
])
.set("goon", get.attitude(player, trigger.player) < 0 ? 1 : -1)
.set("ai", function () {
return _status.event.goon;
});
if (result.bool)
event.result = {
bool: true,
cards: result.links,
};
},
logTarget: "player",
async content(event, trigger, player) {
await player.loseToDiscardpile(event.cards);
const cardToUse = { name: "sha", isCard: true };
if (lib.filter.targetEnabled(cardToUse, player, trigger.player)) {
const { card } = await player.useCard(
cardToUse,
trigger.player
);
console.log(card);
if (
!player.hasHistory("sourceDamage", function (evt) {
return evt.card === card;
})
)
await player.draw();
}
},
group: "shiina_retieji",
ai: {
notemp: true,
combo: "shiina_feiyan",
},
},
shiina_retieji: {
audio: 1,
shaRelated: true,
trigger: { player: "useCardToPlayered" },
check(event, player) {
return get.attitude(player, event.target) < 0;
},
filter(event, player) {
return (
event.card.name == "sha" &&
event.getParent(2).name == "shiina_feiyan"
);
},
logTarget: "target",
content() {
"step 0";
player.judge(function () {
return 0;
});
if (!trigger.target.hasSkill("fengyin")) {
trigger.target.addTempSkill("fengyin");
}
("step 1");
var suit = get.suit(result.card);
var target = trigger.target;
var num = target.countCards("h", "shan");
target
.chooseToDiscard(
"请弃置一张" +
get.translation(suit) +
"牌,否则不能使用闪抵消此杀",
"he",
function (card) {
return get.suit(card) == _status.event.suit;
}
)
.set("ai", function (card) {
var num = _status.event.num;
if (num == 0) return 0;
if (card.name == "shan") return num > 1 ? 2 : 0;
return 8 - get.value(card);
})
.set("num", num)
.set("suit", suit);
("step 2");
if (!result.bool) {
trigger.getParent().directHit.add(trigger.target);
}
},
},
//稻荷
inari_baiwei: {
enable: ["chooseToUse", "chooseToRespond"],
hiddenCard(player, name) {
return (
name != "du" &&
get.type(name) == "basic" &&
player.countCards("hes", { suit: "diamond" }) > 0
);
},
filter(event, player) {
if (
event.type == "wuxie" ||
!player.countCards("hse", { suit: "diamond" })
)
return false;
for (var i = 0; i < lib.inpile.length; i++) {
var name = lib.inpile[i];
if (
name != "du" &&
get.type(name) == "basic" &&
event.filterCard(
get.autoViewAs({ name: name }, "unsure"),
player,
event
)
)
return true;
}
return false;
},
chooseButton: {
dialog(event, player) {
var list = [];
for (var i = 0; i < lib.inpile.length; i++) {
var name = lib.inpile[i];
if (name == "du") continue;
if (name == "sha") {
list.push(["基本", "", "sha"]);
for (var j of lib.inpile_nature)
list.push(["基本", "", name, j]);
} else if (get.type(name) == "basic") {
list.push(["基本", "", name]);
}
}
return ui.create.dialog("摆尾", [list, "vcard"], "hidden");
},
filter(button, player) {
return _status.event
.getParent()
.filterCard(
get.autoViewAs({ name: button.link[2] }, "unsure"),
player,
_status.event.getParent()
);
},
check(button) {
if (_status.event.getParent().type == "phase") {
var player = _status.event.player;
var fakecard = {
name: button.link[2],
nature: button.link[3],
};
if (player.getUseValue(fakecard) > 0)
return get.order(fakecard);
return 0;
}
return 1;
},
backup(links, player) {
return {
selectCard: 1,
filterCard: { suit: "diamond" },
popname: true,
check(card) {
if (get.type(card) == "basic") return 6;
return 1 / Math.max(0.1, get.value(card));
},
position: "hse",
viewAs: { name: links[0][2], nature: links[0][3] },
};
},
prompt(links, player) {
return (
"将一张♦牌当做" +
(get.translation(links[0][3]) || "") +
get.translation(links[0][2]) +
"使用或打出"
);
},
},
ai: {
order(item, player) {
if (player && _status.event.type == "phase") {
var max = 0;
for (var i = 0; i < lib.inpile.length; i++) {
var name = lib.inpile[i];
if (
get.type(name) == "basic" &&
player.getUseValue({ name: name }) > 0
) {
var temp = get.order({ name: name });
if (temp > max) max = temp;
}
}
if (max > 0) max += 0.5;
return max;
}
return 4;
},
result: {
player: 1,
},
respondSha: true,
fireAttack: true,
skillTagFilter(player, tag) {
return (
tag == "fireAttack" ||
player.countCards("he", { suit: "diamond" }) > 0
);
},
},
group: ["inari_baiwei_draw"],
},
inari_baiwei_draw: {
trigger: { player: ["useCardAfter", "respondAfter"] },
forced: true,
popup: false,
filter(event, player) {
return event.skill && event.skill.indexOf("inari_baiwei") == 0;
},
content() {
player.draw();
},
},
inari_huhun: {
mod: {
suit(card, suit) {
if (suit == "club") return "diamond";
},
maxHandcard(player, num) {
return num + 1;
},
},
},
//朱鹭户沙耶
saya_powei: {
audio: 2,
trigger: { player: "phaseAfter" },
locked: true,
limited: true,
unique: true,
skillAnimation: true,
animationColor: "metal",
filter(event, player) {
return (
event.type != "saya_powei" &&
game.hasPlayer(function (current) {
return current.hp > player.hp;
})
);
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt2("saya_powei"),
function (card, saya, kyousuke) {
return kyousuke.hp > saya.hp;
}
)
.set("ai", function (target) {
var player = _status.event.player;
var att = get.attitude(player, target);
if (att >= -2) return 0;
if (target != get.zhu(target) && player.hasUnknown())
return 0;
if (target.getEquip(3) && !player.getEquip(4)) att /= 2;
if (player.hp <= 1) att *= 1.5;
return -att;
})
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
player.awakenSkill("saya_powei");
game.asyncDelay(3);
var next = game.createEvent("saya_powei_loop", false, trigger);
next.playertrue = player;
next.playerfalse = target;
next.setContent(lib.skill.saya_powei.content2);
},
content2() {
"step 0";
event.count = 0;
event.stat = true;
event.current = event["player" + event.stat];
game.countPlayer2(function (current) {
if (current != event.playertrue && current != event.playerfalse)
current.addSkill("saya_nodis");
});
event.playertrue.addSkill("saya_judge");
("step 1");
event.count++;
event.current.phase().set("type", "saya_powei");
("step 2");
if (
event.count == 9 ||
event.playertrue.isDead() ||
event.playerfalse.isDead()
) {
game.countPlayer2(function (current) {
current.removeSkill("saya_nodis");
current.removeSkill("saya_judge");
});
} else {
event.stat = !event.stat;
event.current = event["player" + event.stat];
event.goto(1);
}
},
},
saya_nodis: {
group: "undist",
mark: true,
intro: { content: "不计入距离和座次的计算" },
},
saya_judge: {
trigger: { player: "phaseBegin" },
forced: true,
popup: false,
filter(event, player) {
return (
event.type == "saya_powei" &&
player == event.getParent().playertrue
);
},
content() {
"step 0";
player.judge(function (card) {
return get.color(card) == "red" ? 5 : 0;
}).judge2 = function (result) {
return result.bool ? true : false;
};
("step 1");
if (result.bool) {
player.line(trigger.getParent().playerfalse);
trigger.getParent().playerfalse.damage();
}
},
},
saya_shouji: {
audio: 2,
trigger: { player: "useCardAfter" },
filter(event, player) {
return event.cards.filterInD().length > 0;
},
usable: 1,
async cost(event, trigger, player) {
const goon = (function () {
var num = 0;
var cards = trigger.cards.filterInD();
for (var i = 0; i < cards.length; i++) {
num += player.getUseValue(cards[i]);
}
return (
player.countCards("h", function (card) {
return player.getUseValue(card, null, true) > num;
}) == 0
);
})();
event.result = await player
.chooseTarget(get.prompt2("saya_shouji"), lib.filter.notMe)
.set("ai", function (target) {
if (!_status.event.goon) return 0;
var player = _status.event.player;
var cards = _status.event.getTrigger().cards.filterInD();
var att = get.attitude(player, target);
var num = 0;
for (var i = 0; i < cards.length; i++) {
num += target.getUseValue(cards[i]);
}
return Math.max(num, 0.1) * att;
})
.set("goon", goon)
.forResult();
},
content() {
"step 0";
event.cards = trigger.cards.filterInD();
var target = targets[0];
event.target = target;
target.gain(event.cards, "gain2", "log");
("step 2");
target.chooseToUse({
cards: cards,
filterCard(card) {
if (
get.itemtype(card) != "card" ||
!_status.event.cards ||
!_status.event.cards.includes(card)
)
return false;
return lib.filter.filterCard.apply(this, arguments);
},
prompt: "是否使用得到的牌中的一张?",
});
("step 3");
if (result.bool) player.draw();
},
},
//三枝叶留佳&二木佳奈多
haruka_shuangche: {
audio: 2,
enable: "phaseUse",
filter(event, player) {
return !player.hasSkill("haruka_kanata");
},
chooseButton: {
dialog(event, player) {
var list = [];
for (var i = 0; i < lib.inpile.length; i++) {
var name = lib.inpile[i];
if (name == "boss_mengpohuihun") continue;
if (name == "sha") {
list.push(["基本", "", "sha"]);
for (var j of lib.inpile_nature)
list.push(["基本", "", name, j]);
} else if (get.type(name) == "trick")
list.push(["锦囊", "", name]);
else if (get.type(name) == "basic")
list.push(["基本", "", name]);
}
return ui.create.dialog("双掣", [list, "vcard"]);
},
filter(button, player) {
return _status.event
.getParent()
.filterCard(
{ name: button.link[2] },
player,
_status.event.getParent()
);
},
check(button) {
var player = _status.event.player;
if (player.countCards("h", button.link[2]) > 0) return 0;
if (["wugu", "zhulu_card"].includes(button.link[2])) return 0;
var effect = player.getUseValue(button.link[2]);
if (effect > 0) return effect;
return 0;
},
backup(links, player) {
return {
audio: "haruka_shuangche",
filterCard() {
return false;
},
selectCard: -1,
popname: true,
check(card) {
return 6 - get.value(card);
},
position: "he",
viewAs: {
name: links[0][2],
nature: links[0][3],
isCard: true,
},
};
},
prompt(links, player) {
return (
"请选择" +
(get.translation(links[0][3]) || "") +
get.translation(links[0][2]) +
"的目标"
);
},
},
ai: {
order: 1,
result: {
player(player) {
var cards = player.getCards("he").sort(function (a, b) {
return get.value(a) - get.value(b);
});
var num =
(player.getStat("skill").haruka_shuangche || 0) + 1;
if (player.needsToDiscard() >= num) return 1;
if (player.hp > 2) return 1;
if (cards.length >= num) {
var val = 0;
for (var i = 0; i < cards.length; i++) {
val += get.value(cards[i]);
}
return 12 - val;
}
return 0;
},
},
fireAttack: true,
},
group: "kanata_shuangche",
},
kanata_shuangche: {
trigger: { player: "useCardAfter" },
forced: true,
filter(event, player) {
return event.skill == "haruka_shuangche_backup";
},
content() {
"step 0";
var num = player.getStat("skill").haruka_shuangche || 1;
player
.chooseToDiscard(
"###双掣:请选择一项###选择弃置" +
get.cnNumber(num) +
"张牌或失去1点体力且令〖双掣〗失效至回合结束",
num,
"he"
)
.set("ai", function (card) {
var total = 12;
for (var i = 0; i < ui.selected.cards.length; i++) {
total -= get.value(ui.selected.cards[i]);
}
return total - get.value(card);
});
("step 1");
if (!result.bool) {
player.addTempSkill("haruka_kanata");
player.loseHp();
}
},
},
haruka_kanata: { charlotte: true },
//紬文德斯
tsumugi_mugyu: {
audio: 5,
trigger: { target: "useCardToTargeted" },
frequent: true,
filter(event, player) {
return player.countCards("h") < player.maxHp;
},
content() {
player.draw();
},
},
tsumugi_huilang: {
trigger: { player: "phaseEnd" },
charlotte: true,
line: { color: [253, 198, 116] },
filter(event, player) {
return player.countCards("he") > 0;
},
async cost(event, trigger, player) {
event.result = await player
.chooseCard(
"he",
[1, player.countCards("he")],
get.prompt2("tsumugi_huilang")
)
.set("ai", function (card) {
if (get.position(card) != "h") return -1;
if (!["shan", "wuxie", "caochuan"].includes(get.name(card)))
return 9;
return 5 - get.value(card);
})
.forResult();
},
async content(event, trigger, player) {
const cards = event.cards;
player.addSkill("tsumugi_huilang2");
player
.addToExpansion("giveAuto", cards, player)
.gaintag.add("tsumugi_huilang2");
},
},
tsumugi_huilang2: {
charlotte: true,
marktext: "隐",
intro: { content: "隐藏于回廊之牌", markcount: "expansion" },
onremove(player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
trigger: { player: "phaseBegin" },
forced: true,
filter(event, player) {
return player.getExpansions("tsumugi_huilang2").length > 0;
},
content() {
"step 0";
var cards = player.getExpansions("tsumugi_huilang2");
event.num = cards.length;
player.gain(cards, "draw");
("step 1");
player
.chooseTarget(
[1, num],
"是否令至多" + get.cnNumber(num) + "名角色各摸一张牌?"
)
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
});
("step 2");
if (result.bool) {
var targets = result.targets;
player.line(targets, lib.skill.tsumugi_huilang.line);
targets.sortBySeat();
game.asyncDraw(targets);
} else event.finish();
("step 3");
game.delay();
},
},
//由依
yui_jiang: {
shaRelated: true,
audio: 2,
audioname: ["sp_lvmeng", "re_sunben", "re_sunce"],
trigger: {
player: "useCardToPlayered",
target: "useCardToTargeted",
},
filter(event, player) {
if (
!(
event.card.name == "juedou" ||
(event.card.name == "sha" && get.color(event.card) == "red")
)
)
return false;
return (
player == event.target ||
event.getParent().triggeredTargets3.length == 1
);
},
frequent: true,
content() {
player.draw();
},
ai: {
effect: {
target(card, player, target) {
if (card.name == "sha" && get.color(card) == "red")
return [1, 0.6];
},
player(card, player, target) {
if (card.name == "sha" && get.color(card) == "red")
return [1, 1];
},
},
},
},
yui_lieyin: {
trigger: { player: "phaseUseBegin" },
locked: true,
async cost(event, trigger, player) {
const list = [];
if (player.storage._ichiban_no_takaramono) list.push("cancel2");
const { control, index } = await player
.chooseControl(...list)
.set("choiceList", [
"令此阶段内的所有红色牌视为【杀】",
"令此阶段内的所有【杀】视为【决斗】",
])
.set(
"prompt",
player.storage._ichiban_no_takaramono
? get.prompt("yui_lieyin")
: "烈音:请选择一项"
)
.set("ai", function () {
var player = _status.event.player;
var shas = player.countCards("h", "sha");
if (shas > 0) {
if (
game.hasPlayer(function (current) {
return (
get.attitude(player, current) < 0 &&
player.canUse("juedou", current) &&
!current.hasSha() &&
get.effect(
current,
{ name: "juedou" },
player,
player
) > 0
);
})
)
return 1;
if (player.storage._ichiban_no_takaramono)
return "cancel2";
}
if (
player.countCards("h", function (card) {
return (
get.color(card) == "red" &&
card.name != "sha" &&
player.hasValueTarget(card)
);
}) == 0
)
return 0;
if (player.storage._ichiban_no_takaramono) return "cancel2";
return 1;
})
.forResult();
if (control !== "cancel2") {
event.result = {
bool: true,
cost_data: { index },
};
}
},
async content(event, trigger, player) {
player.addTempSkill(
`yui_lieyin${event.cost_data.index}`,
"phaseUseEnd"
);
},
},
yui_lieyin0: {
mod: {
cardname(card) {
if (get.color(card) == "red") return "sha";
},
},
},
yui_lieyin1: {
mod: {
cardname(card) {
if (card.name == "sha") return "juedou";
},
},
},
yui_takaramono: {
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
unique: true,
juexingji: true,
skillAnimation: true,
animationColor: "key",
filter(event, player) {
var num = 0;
if (player.hp <= 1) num++;
if (game.dead.length > 0) num++;
if (num != 1) return num > 1;
var draw = 0;
player.getAllHistory("gain", function (evt) {
if (evt.getParent(2).name == "yui_jiang")
draw += evt.cards.length;
});
return draw >= 3;
},
content() {
player.awakenSkill("yui_takaramono");
player.addSkills("yui_yinhang");
player.storage._ichiban_no_takaramono = true;
player.gainMaxHp();
player.recover();
},
derivation: "yui_yinhang",
},
yui_yinhang: {
trigger: { player: "changeHp" },
locked: true,
getIndex: (event) => Math.abs(event.num),
line: { color: [253, 153, 182] },
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
[1, 2],
get.prompt("yui_yinhang"),
"令至多两名角色各摸一张牌"
)
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
})
.forResult();
},
async content(event, trigger, player) {
const targets = event.targets;
targets.sortBySeat();
game.asyncDraw(targets);
},
},
//吉野晴彦
yoshino_jueyi: {
trigger: { player: "phaseUseBegin" },
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(lib.filter.notMe, get.prompt2("yoshino_jueyi"))
.set("ai", function (target) {
var player = _status.event.player;
if (get.damageEffect(target, player, player) < 0) return 0;
var att = get.attitude(player, target);
if (att > 0) return 0;
if (att == 0) return 0.1;
var eff = 0;
var hs = player.getCards("h");
for (var i = 0; i < hs.length; i++) {
if (player.canUse(hs[i], target)) {
var eff2 = get.effect(
target,
hs[i],
player,
player
);
if (eff2 > 0) eff += eff2;
}
}
return -att / (1 + eff);
})
.forResult();
},
content() {
"step 0";
var target = targets[0];
event.target = target;
player.draw();
("step 1");
player.chooseToPSS(target);
("step 2");
if (result.tie) event.goto(1);
else if (result.bool) target.damage();
else target.addTempSkill("yoshino_fail", "phaseUseEnd");
},
},
yoshino_fail: {
mod: {
targetEnabled(card, player, target) {
if (player == _status.currentPhase) return false;
},
},
},
//宫泽谦吾
kengo_weishang: {
locked: false,
mod: {
cardUsable(card, player, num) {
if (card.name == "sha" && player.hasDisabledSlot(1))
return num + 1;
},
globalFrom(from, to, distance) {
if (from.hasDisabledSlot(4)) return distance - 1;
},
globalTo(from, to, distance) {
if (to.hasDisabledSlot(3)) return distance + 1;
},
},
enable: "phaseUse",
usable: 1,
filter(event, player) {
var list = ["equip1", "equip2", "equip3", "equip4", "equip5"];
for (var i = 0; i < list.length; i++) {
if (
player.hasEnabledSlot(list[i]) &&
(!player.storage.kengo_guidui2 ||
!player.storage.kengo_guidui2.includes(list[i]))
)
return true;
}
return false;
},
content() {
"step 0";
var list = ["equip1", "equip2", "equip3", "equip4", "equip5"];
for (var i = 0; i < list.length; i++) {
if (
!player.hasEnabledSlot(list[i]) ||
(player.storage.kengo_guidui2 &&
player.storage.kengo_guidui2.includes(list[i]))
)
list.splice(i--, 1);
}
player
.chooseControl(list)
.set("prompt", "请选择废除一个装备栏").ai = function () {
if (
list.includes("equip1") &&
player.hasEmptySlot("equip1") &&
player.countCards("h", function (card) {
return (
card.name == "sha" && player.getUseValue(card) > 0
);
})
)
return "equip1";
if (list.includes("equip3") && player.hasEmptySlot("equip3"))
return "equip3";
if (list.includes("equip4") && player.hasEmptySlot("equip4"))
return "equip4";
if (list.includes("equip5") && player.hasEmptySlot("equip5"))
return "equip5";
if (list.includes("equip2") && player.hasEmptySlot("equip2"))
return "equip2";
return list.randomGet();
};
("step 1");
player.disableEquip(result.control);
player.draw(2);
},
group: ["kengo_weishang_sha", "kengo_weishang_shan"],
ai: {
order: 10,
result: { player: 1 },
},
},
kengo_weishang_sha: {
trigger: { player: "useCardToPlayered" },
forced: true,
filter(event, player) {
return (
event.card.name == "sha" &&
player.hasDisabledSlot(1) &&
event.target.countCards("he") > 0
);
},
logTarget: "target",
content() {
trigger.target.chooseToDiscard("he", true);
},
},
kengo_weishang_shan: {
enable: ["chooseToUse", "chooseToRespond"],
viewAs: { name: "shan" },
filterCard: true,
position: "hes",
prompt: "将一张牌当做闪使用或打出",
viewAsFilter(player) {
return player.hasDisabledSlot(2) && player.countCards("hes") > 0;
},
check(card) {
return 1 / Math.max(0.1, get.value(card));
},
ai: {
respondShan: true,
skillTagFilter(player) {
return player.hasDisabledSlot(2) && player.countCards("he") > 0;
},
},
},
kengo_guidui: {
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
filter(event, player) {
return player.countDisabledSlot() > 0;
},
content() {
var list = [];
for (var i = 1; i <= 5; i++) {
for (var j = 0; j < player.countDisabledSlot(i); j++) {
list.push("equip" + i);
}
}
player.enableEquip(list);
if (!player.storage.kengo_guidui2)
player.storage.kengo_guidui2 = [];
player.storage.kengo_guidui2.addArray(list);
},
},
kengo_guidui2: { onremove: true },
//岩泽雅美
iwasawa_yinhang: {
trigger: { player: "changeHp" },
locked: true,
line: { color: [235, 96, 138] },
getIndex: (event) => Math.abs(event.num),
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
[1, 2],
get.prompt("iwasawa_yinhang"),
"令至多两名角色各摸一张牌"
)
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
})
.forResult();
},
async content(event, trigger, player) {
const targets = event.targets;
targets.sortBySeat();
game.asyncDraw(targets);
},
},
iwasawa_mysong: {
trigger: {
player: ["phaseBeginStart", "phaseAfter", "dyingBefore"],
},
forced: true,
filter(event, player) {
return event.name == "dying" || player.hp < 1;
},
content() {
if (trigger.name == "dying") trigger.cancel();
else if (event.triggername == "phaseBeginStart")
player.addTempSkill("iwasawa_fenyin");
else player.die();
},
nobracket: true,
derivation: "iwasawa_fenyin",
},
iwasawa_refenyin: {
audio: 2,
audioname2: {
wufan: "refenyin_wufan",
},
trigger: {
global: ["loseAfter", "cardsDiscardAfter", "equipAfter"],
},
forced: true,
filter(event, player) {
if (player != _status.currentPhase) return false;
var cards = event.getd();
var list = [];
for (var i = 0; i < cards.length; i++) {
var card = cards[i];
list.add(card.suit);
}
game.getGlobalHistory("cardMove", function (evt) {
if (
evt == event ||
evt.getParent() == event ||
(evt.name != "lose" && evt.name != "cardsDiscard")
)
return false;
if (evt.name == "lose" && evt.position != ui.discardPile)
return false;
for (var i = 0; i < evt.cards.length; i++) {
var card = evt.cards[i];
list.remove(card.suit);
}
});
return list.length > 0;
},
content() {
var list = [];
var list2 = [];
var cards = trigger.getd();
for (var i = 0; i < cards.length; i++) {
var card = cards[i];
var suit = card.suit;
list.add(suit);
list2.add(suit);
}
game.getGlobalHistory("cardMove", function (evt) {
if (
evt == trigger ||
evt.getParent() == trigger ||
(evt.name != "lose" && evt.name != "cardsDiscard")
)
return false;
if (evt.name == "lose" && evt.position != ui.discardPile)
return false;
for (var i = 0; i < evt.cards.length; i++) {
var card = evt.cards[i];
var suit = card.suit;
list.remove(suit);
list2.add(suit);
}
});
list2.sort();
player.draw(list.length);
player.storage.iwasawa_refenyin_mark = list2;
player.addTempSkill("iwasawa_refenyin_mark");
player.markSkill("iwasawa_refenyin_mark");
},
subSkill: {
mark: {
onremove: true,
intro: {
content(s) {
var str = "本回合已经进入过弃牌堆的卡牌的花色:";
for (var i = 0; i < s.length; i++) {
str += get.translation(s[i]);
}
return str;
},
},
},
},
},
iwasawa_fenyin: {
mod: {
aiOrder(player, card, num) {
if (typeof card == "object" && player == _status.currentPhase) {
var evt = player.getLastUsed();
if (
evt &&
evt.card &&
get.color(evt.card) != "none" &&
get.color(card) != "none" &&
get.color(evt.card) != get.color(card)
) {
return num + 10;
}
}
},
},
audio: 2,
trigger: { player: "useCard" },
frequent: true,
//usable:3,
filter(event, player) {
if (_status.currentPhase != player) return false;
var evt = player.getLastUsed(1);
if (!evt) return false;
var color1 = get.color(evt.card);
var color2 = get.color(event.card);
return (
color1 &&
color2 &&
color1 != "none" &&
color2 != "none" &&
color1 != color2
);
},
content() {
player.draw();
},
ai: {
threaten(player, target) {
if (target.hp < 1) return 3;
return 1;
},
},
},
//井之原真人
masato_baoquan: {
trigger: { source: "damageBefore" },
forced: true,
content() {
"step 0";
player
.chooseControl("防止伤害", "增加伤害")
.set(
"prompt",
"暴拳:防止即将对" +
get.translation(trigger.player) +
"造成的伤害或失去1点体力上限并令此伤害+2"
)
.set(
"choice",
get.attitude(player, trigger.player) >= 0 ? 0 : 1
)
.set("ai", function () {
return _status.event.choice;
});
("step 1");
if (result.control == "增加伤害") {
player.loseMaxHp();
trigger.num += 2;
} else trigger.cancel();
},
ai: {
effect: {
player(card, player, target) {
if (
target &&
get.attitude(player, target) > 0 &&
get.tag(card, "damage")
)
return "zeroplayertarget";
},
},
},
},
//西森柚咲&黑羽美砂
yusa_yanyi: {
enable: "phaseUse",
usable: 1,
filterTarget(card, player, target) {
return get.distance(player, target) <= player.hp;
},
selectTarget() {
return [1, Math.max(_status.event.player.getAttackRange())];
},
line: "thunder",
content() {
"step 0";
if (target.isHealthy()) {
player.draw();
event.finish();
} else {
var name = get.translation(player);
target
.chooseControl()
.set("choiceList", [
"令" + name + "摸一张牌",
"回复1点体力然后交给" + name + "一张牌",
])
.set("ai", function () {
return 1;
});
}
("step 1");
if (result.index == 0) {
player.draw();
event.finish();
} else {
target.recover();
}
("step 2");
if (target != player && target.countCards("he") > 0) {
target.chooseCard(
"交给" + get.translation(player) + "一张牌",
"he",
true
);
} else event.finish();
("step 3");
target.give(result.cards, player, "giveAuto");
},
ai: {
order: 10,
result: {
player(player, target) {
return target.isHealthy() ? 1 : 0;
},
target(player, target) {
if (target.isHealthy()) return 0;
return get.recoverEffect(target, player, target);
},
},
},
},
yusa_misa: {
charlotte: true,
trigger: { player: "useSkillAfter" },
filter(event, player) {
return (
event.skill == "yusa_yanyi" &&
!player.storage.dualside_over &&
Array.isArray(player.storage.dualside)
);
},
content() {
player.turnOver();
},
},
misa_yusa: {
charlotte: true,
trigger: { player: "misa_yehuoAfter" },
filter(event, player) {
return (
event.bool === true &&
!player.storage.dualside_over &&
Array.isArray(player.storage.dualside)
);
},
content() {
player.turnOver();
},
},
misa_yehuo: {
charlotte: true,
trigger: { global: "phaseDrawBegin1" },
locked: true,
line: { color: [236, 137, 52] },
filter(event, player) {
var target = event.player;
return (
player.inRange(target) &&
player.countCards("he") >= get.distance(player, target)
);
},
async cost(event, trigger, player) {
var next = player.chooseToDiscard(
"he",
get.distance(player, trigger.player) || 1,
get.prompt2("misa_yehuo", trigger.player),
"chooseonly"
);
next.set("ai", function (card) {
var val = _status.event.val;
for (var i = 0; i < ui.selected.cards.length; i++) {
val -= get.value(ui.selected.cards[i]);
}
return val - get.value(card);
});
next.set("val", -2 * get.attitude(player, trigger.player));
event.result = await next.forResult();
},
logTarget: "player",
content() {
"step 0";
player.discard(cards);
("step 1");
event.bool = true;
if (trigger.numFixed) event._result = { index: 0 };
else if (trigger.player.isIn()) {
var name = get.translation(trigger.player);
player
.chooseControl()
.set("choiceList", [
"对" + name + "造成1点火属性伤害",
"令" + name + "此出牌阶段的额定摸牌数改为0",
]);
} else event.finish();
("step 2");
if (result.index == 0) trigger.player.damage("fire");
else trigger.changeToZero();
},
ai: {
fireAttack: true,
},
},
//宫泽有纪宁
yukine_wenzhou: {
trigger: { global: "phaseUseBegin" },
filter(event, player) {
return event.player.countCards("he") > 0;
},
async cost(event, trigger, player) {
event.forceDie = true;
var ask = trigger.player.chooseCard(
"he",
get.prompt("yukine_wenzhou")
);
if (player === trigger.player) {
ask.set(
"prompt2",
"选择一张牌,然后从牌堆中获得一张与此牌类型相同的牌。本回合内使用与此牌类型相同的牌时不可被其他角色响应。"
);
} else
ask.set(
"prompt2",
"将一张牌交给" +
get.translation(player) +
"然后其可以选择:交给你一张牌;或令你从牌堆中获得一张与此牌类型相同的牌,且你本回合内使用与此牌类型相同的牌时不可被响应。"
);
ask.set("ai", function (card) {
if (
get.attitude(
_status.event.player,
_status.event.getParent().player
) > 0
)
return 10 - get.value(card);
return -1;
});
event.result = await ask.forResult();
},
content() {
"step 0";
event.forceDie = true;
event.type = get.type(cards[0], "trick");
if (trigger.player != player)
trigger.player.give(cards, player, "giveAuto");
("step 1");
if (player == trigger.player || player.countCards("he") == 0) {
event._result = { index: 1 };
} else {
player
.chooseControl()
.set("choiceList", [
"将一张牌交给" + get.translation(trigger.player),
"令" +
get.translation(trigger.player) +
"从牌堆中获得一张" +
get.translation(event.type) +
"牌,且其本回合内使用与此牌名称相同的牌时不可被响应",
])
.set("forceDie", true)
.set("ai", function () {
if (
get.attitude(
_status.event.player,
_status.event.getTrigger().player
) > 0
)
return 1;
return 0;
});
}
("step 2");
event.index = result.index;
if (result.index == 1) {
var magic = get.cardPile2(function (card) {
return get.type(card, "trick") == event.type;
});
if (magic) {
trigger.player.addTempSkill("yukine_magic", "phaseUseEnd");
trigger.player.storage.yukine_magic.add(magic.name);
trigger.player.gain(magic, "draw");
} else event.finish();
} else
player
.chooseCard(
"he",
true,
"选择要交给" + get.translation(trigger.player) + "的牌"
)
.set("ai", function (card) {
return -get.value(
card,
_status.event.getTrigger().player
);
});
("step 3");
if (event.index == 1) game.updateRoundNumber();
else if (result.bool)
player.give(result.cards, trigger.player, "giveAuto");
},
},
yukine_magic: {
trigger: { player: "useCard" },
forced: true,
popup: false,
charlotte: true,
filter(event, player) {
return (
player.storage.yukine_magic &&
player.storage.yukine_magic.includes(event.card.name)
);
},
content() {
trigger.directHit.addArray(
game.filterPlayer(function (current) {
if (player != current) return true;
return !player.hasSkill("yukine_wenzhou");
})
);
},
onremove: true,
init(player, skill) {
if (!player.storage[skill]) player.storage[skill] = [];
},
ai: {
directHit_ai: true,
skillTagFilter(player, tag, arg) {
return (
player.storage.yukine_magic &&
player.storage.yukine_magic.includes(arg.card.name)
);
},
},
},
//神北小毬
komari_tiankou: {
trigger: {
player: "useCard2",
target: "useCardToTarget",
},
forced: true,
filter(event, player, name) {
if (name == "useCardToTarget" && player == event.player)
return false;
if (get.color(event.card) != "red") return false;
if (get.tag(event.card, "damage")) return false;
return ["basic", "trick"].includes(get.type(event.card));
},
content() {
"step 0";
var info = get.info(trigger.card);
var bool = true;
if (info.multitarget || info.allowMultiple === false) bool = false;
else {
var list = game.filterPlayer(function (current) {
return (
!trigger.targets.includes(current) &&
lib.filter.targetEnabled2(
trigger.card,
trigger.player,
current
)
);
});
if (!list.length) bool = false;
}
if (bool)
player
.chooseTarget(
"甜口:为" +
get.translation(trigger.card) +
"增加一个额外目标,或点【取消】摸一张牌。",
function (candy, komari, rin) {
return _status.event.rin_chan.includes(rin);
}
)
.set("rin_chan", list)
.set("ai", function (target) {
var evt = _status.event;
return get.effect(
target,
evt.candy,
evt.source,
evt.player
);
})
.set("candy", trigger.card)
.set("", trigger.player);
else event._result = { bool: false };
("step 1");
if (result.bool) {
var rin = result.targets[0];
trigger.targets.push(rin);
player.line(rin, { color: [255, 224, 172] });
} else player.draw();
},
},
komari_xueshang: {
trigger: { global: "die" },
forced: true,
skillAnimation: true,
chargingSkill: true,
filter(event, player) {
return player.hp > 0;
},
animationColor: "metal",
content() {
"step 0";
player.addSkill("riki_xueshang");
var map = {};
var list = [];
for (var i = 1; i <= player.hp; i++) {
var cn = get.cnNumber(i, true);
map[cn] = i;
list.push(cn);
}
event.map = map;
player
.chooseControl(list, function () {
return "一";
})
.set("prompt", "血殇:请选择自己受到的伤害的点数");
("step 1");
var num = event.map[result.control] || 1;
event.num = num > 1 ? 2 : 1;
event.list = game
.filterPlayer(function (current) {
return current != player;
})
.sortBySeat();
player.damage(num);
player.line(event.list, { color: [255, 224, 172] });
("step 2");
if (!player.hasSkill(event.name)) return;
else {
event.list.shift().damage(num);
if (event.list.length) event.redo();
}
},
},
riki_xueshang: {
trigger: { global: "dying" },
forced: true,
popup: false,
charlotte: true,
filter(event, player) {
return (
event.getParent(2).name == "komari_xueshang" &&
event.getParent(2).player == player
);
},
content() {
player.removeSkills("komari_xueshang");
player.gainMaxHp(true);
player.recover();
},
},
//鹰原羽未
umi_chaofan: {
enable: "phaseUse",
usable: 1,
selectCard: 2,
complexCard: true,
filter(summer, umi) {
return umi.countCards("h") > 1;
},
check(ingredient) {
return 7 - get.value(ingredient);
},
filterCard(ingredient) {
if (ui.selected.cards.length)
return get.suit(ingredient) != get.suit(ui.selected.cards[0]);
return true;
},
line: { color: [251, 193, 217] },
filterTarget: lib.filter.notMe,
content() {
"step 0";
player.draw();
("step 1");
if (player.hp > 2) target.recover();
else if (player.hp == 2) target.draw(2);
else target.damage("fire", "nosource");
},
ai: {
order: 2,
result: {
target(umi, takahara) {
if (umi.hp > 2 && takahara.isDamaged()) return 2.2;
if (umi.hp == 2 && !takahara.hasSkillTag("nogain"))
return 2;
if (umi.hp < 2)
return get.damageEffect(takahara, umi, umi, "fire");
},
},
},
},
umi_lunhui: {
trigger: { global: "phaseAfter" },
filter(summer, umi) {
return summer.player != umi && umi.countCards("h") < umi.hp;
},
line: { color: [251, 193, 217] },
logTarget: "player",
charlotte: true,
content() {
"step 0";
player.loseHp();
("step 1");
player.draw(2);
player.insertPhase();
player.storage.umi_shiroha = trigger.player;
player.addTempSkill("umi_shiroha");
},
},
umi_shiroha: {
mark: "character",
intro: {
content: "到$的距离视为1",
},
onremove: true,
charlotte: true,
mod: {
globalFrom(umi, shiroha) {
if (umi.storage.umi_shiroha == shiroha) return -Infinity;
},
},
},
umi_qihuan: {
enable: "chooseToUse",
filter(summer, umi) {
return summer.type == "dying" && umi.isDying();
},
limited: true,
skillAnimation: true,
charlotte: true,
animationColor: "key",
content() {
"step 0";
player.awakenSkill("umi_qihuan");
player.reinitCharacter("key_umi", "key_umi2", false);
player.recover(game.countGroup() || 1);
if (!game.dead.length) event.finish();
("step 1");
var chara = [];
var skills = [];
for (var i = 0; i < game.dead.length; i++) {
var name = game.dead[i].name;
var name2 = game.dead[i].name2;
var skill = [];
if (name && lib.character[name])
skill.addArray(lib.character[name][3]);
if (name2 && lib.character[name2])
skill.addArray(lib.character[name2][3]);
if (skill.length) {
chara.push(game.dead[i]);
skills.push(skill);
}
}
if (!chara.length) event.finish();
event.chara = chara;
event.skills = skills;
event.chosen = [];
("step 2");
var next =
player.chooseTarget("是否获得一名已死亡角色的一个技能?");
next.set("chara", event.chara);
next.set("skills", event.skills);
next.set("chosen", event.chosen);
next.set("filterTarget", function (card, player, target) {
if (target.isAlive()) return false;
var evt = _status.event;
if (!evt.chosen.length) return true;
var skills = evt.skills[evt.chara.indexOf(target)];
if (skills.length == 1 && skills[0] == evt.chosen[0])
return false;
return true;
});
next.set("deadTarget", true);
next.set("ai", function () {
return Math.random();
});
("step 3");
if (!result.bool) event.finish();
else {
event.temp = result.targets[0];
var list = event.skills[event.chara.indexOf(result.targets[0])];
result.targets[0].line(player, {
color: [251, 193, 217],
});
list.removeArray(event.chosen);
player.chooseControl(list).set("prompt", "选择获得一个技能");
}
("step 4");
//player.addSkills(result.control,get.groupnature(event.temp.group)||'key');
player.addSkills(result.control);
var info = get.info(result.control);
if (info.zhuSkill) {
if (!player.storage.zhuSkill_umi_qihuan)
player.storage.zhuSkill_umi_qihuan = [];
player.storage.zhuSkill_umi_qihuan.push(result.control);
}
event.chosen.push(result.control);
if (event.chosen.length < 2) event.goto(2);
},
ai: {
order: 10,
save: true,
skillTagFilter(player, tag, target) {
return player == target;
},
result: {
player: 1,
},
},
},
//神尾晴子
haruko_haofang: {
mod: {
cardname(card, player, name) {
if (lib.card[card.name].type == "delay") return "wuzhong";
},
},
trigger: { player: "drawBefore" },
forced: true,
filter(event, player) {
return event.getParent().name == "wuzhong";
},
content() {
trigger.num += 2;
},
},
haruko_zhuishi: {
trigger: { global: "phaseJudgeBegin" },
filter(misuzu) {
return misuzu.player.countCards("j") > 0;
},
check(event, player) {
return get.attitude(player, event.player) > 1;
},
logTarget: "player",
content() {
"step 0";
player.gain(
trigger.player.getCards("j"),
trigger.player,
"give",
"bySelf"
);
("step 1");
if (player.hp > 1) player.loseHp();
},
},
yuri_xingdong: {
audio: 3,
group: "yuri_xingdong_gain",
subSkill: {
mark: {
mark: true,
marktext: "令",
intro: {
content: "跳过下个回合的判定阶段和摸牌阶段",
},
},
gain: {
audio: 2,
trigger: { player: "phaseUseBegin" },
forced: true,
content() {
"step 0";
var card = get.cardPile(function (card) {
return card.name == "sha" || get.type(card) == "trick";
});
if (card) player.gain(card, "gain2", "log");
("step 1");
game.updateRoundNumber();
},
},
},
enable: "phaseUse",
usable: 1,
locked: true,
filter(event, player) {
return player.countCards("h", lib.skill.yuri_xingdong.filterCard);
},
filterCard(card) {
return card.name == "sha" || get.type(card) == "trick";
},
check(card) {
return 1;
},
filterTarget: lib.filter.notMe,
discard: false,
lose: false,
delay: 0,
content() {
"step 0";
player.give(cards, target);
("step 1");
if (!target.getCards("h").includes(cards[0]))
event._result = { bool: false };
else
target.chooseUseTarget(
cards[0],
game.filterPlayer(function (current) {
return current != player;
}),
"请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段"
);
("step 2");
if (result.bool) game.asyncDraw([player, target]);
else {
target.addTempSkill("yuri_xingdong_mark", "phaseJudgeSkipped");
target.skip("phaseJudge");
target.skip("phaseDraw");
target.addTempSkill("zhengjing3", {
player: "phaseAfter",
});
event.finish();
}
("step 3");
game.delay();
},
ai: {
order: 12,
result: {
target(player, target) {
var card = ui.selected.cards[0];
if (target.hasSkill("pingkou")) return 1;
if (!card) return 0;
var info = get.info(card);
if (info.selectTarget == -1) {
var eff = 0;
game.countPlayer(function (current) {
if (
current != player &&
target.canUse(card, current)
)
eff += get.effect(
current,
card,
target,
target
);
});
if (eff > 0 || get.value(card) < 3) return eff;
return 0;
} else if (
game.hasPlayer(function (current) {
return (
current != player &&
target.canUse(card, current) &&
get.effect(current, card, target, target) > 0
);
})
)
return 1.5;
else if (get.value(card) < 3) return -1;
return 0;
},
},
},
},
yuri_wangxi: {
audio: 2,
trigger: { global: "dieAfter" },
limited: true,
mark: false,
init(player) {
if (player.hasZhuSkill("yuri_wangxi")) {
player.markSkill("yuri_wangxi");
player.storage.yuri_wangxi = false;
}
},
zhuSkill: true,
unique: true,
skillAnimation: true,
animationColor: "thunder",
filter(event, player) {
if (get.mode() != "identity") return false;
if (!player.hasZhuSkill("yuri_wangxi")) return false;
if (event.player.isIn()) return false;
if (event.player.identity == "mingzhong") return false;
var evt = event.getParent("yuri_xingdong");
return evt && evt.name == "yuri_xingdong" && evt.player == player;
},
async cost(event, trigger, player) {
event.result = await trigger.player
.chooseBool(
"是否发动" + get.translation(player) + "的【忘隙】?"
)
.set("forceDie", true)
.forResult();
},
logTarget: "player",
async content(event, trigger, player) {
player.awakenSkill("yuri_wangxi");
var identity = "zhong";
if (_status.mode == "purple") {
if (["rNei", "bNei"].includes(player.identity))
identity = player.identity;
else if (["rZhu", "rZhong", "bNei"].includes(player.identity))
identity = "rZhong";
else identity = "bZhong";
}
game.broadcastAll(
function (source, identity) {
if (source.node.dieidentity) {
source.node.dieidentity.innerHTML = get.translation(
identity + 2
);
}
source.revive(2, false);
source.identity = identity;
source.setIdentity();
},
trigger.player,
identity
);
var evt = trigger.getParent("damage");
if (evt.untrigger) evt.untrigger(false, trigger.player);
game.addVideo("setIdentity", trigger.player, "zhong");
await trigger.player.changeGroup(player.group);
await trigger.player.draw();
},
},
//枣恭介
nk_shekong: {
enable: "phaseUse",
usable: 1,
filter(event, player) {
return player.countCards("h") > 0;
},
filterCard: true,
selectCard() {
if (ui.selected.targets.length)
return [1, ui.selected.targets[0].countCards("he")];
return [1, Infinity];
},
filterTarget(event, player, target) {
return (
target != player &&
target.countCards("he") >= Math.max(1, ui.selected.cards.length)
);
},
check(card) {
if (
!game.hasPlayer(function (current) {
return (
current != _status.event.player &&
get.attitude(_status.event.player, current) < 0 &&
current.countCards("he") > ui.selected.cards.length
);
})
)
return 0;
return 6 - get.value(card);
},
content() {
"step 0";
event.cardsx = cards.slice(0);
var num = get.cnNumber(cards.length);
var trans = get.translation(player);
var prompt = "弃置" + num + "张牌,然后" + trans + "摸一张牌";
if (cards.length > 1)
prompt += ";或弃置一张牌,然后" + trans + "摸" + num + "张牌";
var next = target.chooseToDiscard(prompt, "he", true);
next.numx = cards.length;
next.selectCard = function () {
if (ui.selected.cards.length > 1) return _status.event.numx;
return [1, _status.event.numx];
};
next.complexCard = true;
next.ai = function (card) {
if (
ui.selected.cards.length == 0 ||
_status.event.player.countCards("he", function (cardxq) {
return get.value(cardxq) < 7;
}) >= _status.event.numx
)
return 7 - get.value(card);
return -1;
};
("step 1");
if (result.bool) {
if (result.cards.length == cards.length) player.draw();
else player.draw(cards.length);
event.cardsx.addArray(result.cards);
for (var i = 0; i < event.cardsx.length; i++) {
if (get.position(event.cardsx[i]) != "d")
event.cardsx.splice(i--, 1);
}
} else event.finish();
("step 2");
if (event.cardsx.length) {
player.chooseButton(
["请按顺序将卡牌置于牌堆顶(先选择的在上)", event.cardsx],
true,
event.cardsx.length
);
} else event.finish();
("step 3");
if (result.bool) {
var cardsx = result.links;
while (cardsx.length) {
var card = cardsx.pop();
card.fix();
ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
}
}
},
ai: {
order: 10,
result: {
target: -1,
},
},
},
key_huanjie: {
trigger: { player: ["drawBegin", "judgeBegin"] },
forced: true,
silent: true,
popup: false,
lastDo: true,
filter(event) {
return event.name == "draw" || !event.directresult;
},
content() {
if (trigger.name == "draw") {
if (trigger.bottom) trigger.bottom = false;
else trigger.bottom = true;
} else trigger.directresult = get.bottomCards()[0];
},
},
//此花露西娅
lucia_duqu: {
trigger: {
player: ["damage", "loseHpBefore", "useCardBefore"],
source: "damage",
},
forced: true,
charlotte: true,
filter(event, player, onrewrite) {
if (onrewrite == "loseHpBefore") {
return event.type == "du";
}
return event.source != undefined && event.source != event.player;
},
content() {
var onrewrite = event.triggername;
if (onrewrite == "loseHpBefore") {
trigger.cancel();
player.recover(trigger.num);
} else {
var another =
trigger[trigger.source == player ? "player" : "source"];
player.line(another, { color: [220, 90, 139] });
another.gain(game.createCard2("du"), "gain2");
}
},
ai: {
usedu: true,
},
},
lucia_zhenren: {
trigger: { global: "phaseJieshuBegin" },
forced: true,
charlotte: true,
filter(event, player) {
return player.countCards("e") > 0;
},
content() {
"step 0";
var es = player.getCards("e");
event.count = es.length;
player.discard(es);
("step 1");
event.count--;
if (
game.hasPlayer(function (current) {
return current.countDiscardableCards(player, "ej") > 0;
})
) {
player.chooseTarget(
"请选择一名角色,弃置其装备区或判定区内的一张牌。",
true,
function (card, player, target) {
return target.countDiscardableCards(player, "ej") > 0;
}
).ai = function (target) {
var att = get.attitude(_status.event.player, target);
if (target.countCards("j") && att > 0) return att * 1.5;
return -att;
};
} else event.finish();
("step 2");
if (result.bool && result.targets && result.targets.length) {
var target = result.targets[0];
player.line(target, { color: [220, 90, 139] });
player.discardPlayerCard(target, "ej", true);
if (event.count) event.goto(1);
}
},
},
};
export default skills;