Merge branch 'libccy:PR-Branch' into PR-Branch

This commit is contained in:
157 2024-05-05 19:20:17 +08:00 committed by GitHub
commit ecf06fa7ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 294 additions and 340 deletions

View File

@ -2355,72 +2355,60 @@ const skills = {
filter(event, player) {
return game.hasPlayer(current => player.canCompare(current));
},
direct: true,
async cost(event, trigger, player){
event.result = await player.chooseTarget(get.prompt("clanliuju"), "与一名其他角色拼点,输的角色可以使用任意张拼点牌中的非基本牌", (card, player, target) => {
return player.canCompare(target);
}).set("ai", target => {
var player = _status.event.player;
var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b));
if (get.attitude(player, target) < 0) {
var hs = player.getCards("h").sort((a, b) => get.number(a) - get.number(b));
if (!hs.length || !ts.length) return 0;
if (get.type(hs[0], null, false) == "basic" && get.value(hs[0]) > 6) return 0;
if (get.number(hs[0]) < get.number(ts[0]) || get.type(hs[0], null, false) == "basic") return 1;
return Math.random() - 0.7;
}
return get.type(ts[0]) != "basic";
}).forResult();
},
content() {
"step 0";
player
.chooseTarget(get.prompt("clanliuju"), "与一名其他角色拼点,输的角色可以使用任意张拼点牌中的非基本牌", (card, player, target) => {
return player.canCompare(target);
})
.set("ai", target => {
var player = _status.event.player;
var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b));
if (get.attitude(player, target) < 0) {
var hs = player.getCards("h").sort((a, b) => get.number(a) - get.number(b));
if (!hs.length || !ts.length) return 0;
if (get.type(hs[0], null, false) == "basic" && get.value(hs[0]) > 6) return 0;
if (get.number(hs[0]) < get.number(ts[0]) || get.type(hs[0], null, false) == "basic") return 1;
return Math.random() - 0.7;
}
return get.type(ts[0]) != "basic";
});
var target = targets[0];
event.target = target;
player.chooseToCompare(target).set("small", true);
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("clanliuju", target);
player.chooseToCompare(target).set("small", true);
} else event.finish();
"step 2";
if (!result.tie) {
var loser = result.bool ? target : player;
var cards = [];
game.getGlobalHistory("cardMove", evt => {
if (evt.getParent(2) == event)
cards.addArray(
evt.cards.filter(i => {
return get.position(i, true) == "d" && get.type(i, null, false) != "basic";
})
);
if (evt.getParent(2).name === "chooseToCompare" && evt.getParent(3) === event) cards.addArray(evt.cards.filter(i => {
return get.position(i, true) == "d" && get.type(i, null, false) != "basic";
}));
});
event.loser = loser;
event.distance = [get.distance(player, target), get.distance(target, player)];
if (cards.length) event.cards = cards;
else event.finish();
} else event.finish();
"step 3";
"step 2";
var cardsx = cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i));
if (!cardsx.length) event.goto(6);
else
event.loser
.chooseButton(["留驹:是否使用其中的一张牌?", cardsx])
.set("filterButton", button => {
return _status.event.player.hasUseTarget(button.link);
})
.set("ai", button => {
return _status.event.player.getUseValue(button.link) + 0.1;
});
"step 4";
else event.loser.chooseButton(["留驹:是否使用其中的一张牌?", cardsx]).set("filterButton", button => {
return _status.event.player.hasUseTarget(button.link);
}).set("ai", button => {
return _status.event.player.getUseValue(button.link) + 0.1;
});
"step 3";
if (result.bool) {
var card = result.links[0];
event.cards.remove(card);
event.loser.$gain2(card, false);
game.delayx();
event.loser.chooseUseTarget(true, card, false);
} else event.goto(6);
"step 5";
} else event.goto(5);
"step 4";
if (cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)).length) event.goto(3);
"step 6";
"step 5";
if (get.distance(player, target) != event.distance[0] || get.distance(target, player) != event.distance[1]) {
player.restoreSkill("clanxumin");
game.log(player, "重置了", "#g【恤民】");

View File

@ -20,9 +20,7 @@ const skills = {
const map = lib.skill.dcbenxi.getMap(),
list = Object.keys(map);
if (list.length > 0) {
const skill = list.randomGet(),
voiceMap = game.parseSkillTextMap(skill, map[skill]);
console.log(voiceMap);
const skill = list.randomGet(), voiceMap = game.parseSkillTextMap(skill, map[skill]);
player.storage.dcbenxi_pending = skill;
findaudio: for (let data of voiceMap) {
if(!data.text) continue;

View File

@ -743,7 +743,7 @@ const skills = {
const evtx = evt.event;
if (evtx.givenCards) names.addArray(evtx.givenCards.map(card => get.name(card, false)));
});
return names.length >= 5;
return names.length > 5;
},
forced: true,
juexingji: true,
@ -2793,8 +2793,12 @@ const skills = {
trigger: { player: ["gainAfter", "loseAsyncAfter"] },
forced: true,
filter: (event, player) => {
if (event.getParent("phaseDraw", true)) return false;
const evt = player.getHistory("gain", i => !i.getParent("phaseDraw", true))[0];
const phaseDraw = event.getParent("phaseDraw");
if (phaseDraw && phaseDraw.player === player) return false;
const evt = player.getHistory("gain").find(i => {
const phaseDraw = i.getParent("phaseDraw");
return (!phaseDraw || phaseDraw.player !== player);
});
if (!evt) return false;
if (event.name == "gain") {
if (evt != event || event.getlx === false) return false;
@ -6442,7 +6446,8 @@ const skills = {
"step 0";
player.give(cards, targets[0], "give");
"step 1";
targets[0].chooseToCompare(targets[1]);
if (targets[0].canCompare(targets[1])) targets[0].chooseToCompare(targets[1]);
else event.finish();
"step 2";
player.addTempSkill("dcjianshu_check", "phaseUseAfter");
if (result.bool) {

View File

@ -504,7 +504,7 @@ const translates = {
dcjichou: "集筹",
dcjichou_info: "出牌阶段结束时若你于此阶段使用过牌且这些牌的牌名均不同你可以观看位于弃牌堆中的这些牌选择任意张牌并选择等量角色将这些牌交给这些角色各一张然后你摸X张牌X为你本局游戏首次发动〖集筹〗给出的牌数。",
dcmouli: "谋立",
dcmouli_info: "觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数不小于5你加1点体力上限并回复1点体力然后获得〖自缚〗。",
dcmouli_info: "觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数于5你加1点体力上限并回复1点体力然后获得〖自缚〗。",
dczifu: "自缚",
dczifu_info: "锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。",
dc_simashi: "司马师",

View File

@ -3340,29 +3340,16 @@ const skills = {
charlotte: true,
direct: true,
check: function (event, player) {
return (
player
.getCards("h")
.map(i => get.value(i))
.reduce((p, c) => p + c, 0) <
event.player
.getCards("h")
.map(i => get.value(i))
.reduce((p, c) => p + c, 0) +
4 * Math.random()
);
return (player.getCards("h").map(i => get.value(i)).reduce((p, c) => p + c, 0) < event.player.getCards("h").map(i => get.value(i)).reduce((p, c) => p + c, 0) + 4 * Math.random());
},
content: function () {
"step 0";
player.unmarkAuto("jsrgguiji_swapback", [trigger.player]);
if (trigger.name == "phaseUse") {
player
.chooseBool(get.prompt("jsrgguiji_swapback", trigger.player), "与其交换手牌。")
.set("ai", () => {
return get.event("bool");
})
.set("bool", lib.skill.jsrgguiji_swapback.check(trigger, player) > 0);
player.chooseBool(get.prompt("jsrgguiji_swapback", trigger.player), "与其交换手牌。").set("ai", () => {
return get.event("bool");
}).set("bool", lib.skill.jsrgguiji_swapback.check(trigger, player) > 0);
} else {
player.unmarkAuto("jsrgguiji_swapback", [trigger.player]);
event.finish();
}
"step 1";
@ -3370,7 +3357,6 @@ const skills = {
player.logSkill("jsrgguiji_swapback", trigger.player);
player.swapHandcards(trigger.player);
}
player.unmarkAuto("jsrgguiji_swapback", [trigger.player]);
},
intro: {
content: "$的下个出牌阶段结束时,你可以与其交换手牌",

View File

@ -1251,15 +1251,17 @@ const skills = {
}
},
async content(event, trigger, player) {
await player.addToExpansion(event.cards, player, "give").gaintag.add("kud_qiaoshou_equip");
const next = player.addToExpansion(event.cards, player, "give");
next.gaintag.add("kud_qiaoshou_equip");
await next;
if (!player.getExpansions("kud_qiaoshou_equip").length) return;
player.addTempSkill("kud_qiaoshou_equip", {
player: ["phaseUseEnd", "phaseZhunbeiBegin"],
});
var name = event.cost_data.cardname;
const name = event.cost_data.cardname;
player.storage.kud_qiaoshou_equip2 = name;
player.markAuto("kud_qiaoshou_equip", cards);
var info = lib.card[name].skills;
player.markAuto("kud_qiaoshou_equip", event.cards);
const info = lib.card[name].skills;
if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info);
game.log(player, "声明了", "#y" + get.translation(name));
await player.draw();

View File

@ -13939,24 +13939,20 @@ const skills = {
} else event.finish();
"step 2";
player.gain(event.cards, "gain2");
player
.chooseControl()
.set("choiceList", ["将" + get.cnNumber(event.num) + "张牌交给一名其他角色", "弃置" + get.cnNumber(event.num) + "张牌"])
.set("ai", function () {
if (
game.hasPlayer(function (current) {
return current != player && get.attitude(player, current) > 2;
})
)
return 0;
return 1;
});
"step 3";
"step 3"
if (!player.countCards("he")) event.finish();
else player.chooseControl().set("choiceList", ["将" + get.cnNumber(event.num) + "张牌交给一名其他角色", "弃置" + get.cnNumber(event.num) + "张牌"]).set("ai", function () {
if (game.hasPlayer(function (current) {
return current != player && get.attitude(player, current) > 2;
})) return 0;
return 1;
});
"step 4";
if (result.index == 0) {
player.chooseCardTarget({
position: "he",
filterCard: true,
selectCard: event.num,
selectCard: Math.min(event.num, player.countCards("he")),
filterTarget: function (card, player, target) {
return player != target;
},
@ -13976,7 +13972,7 @@ const skills = {
player.chooseToDiscard(event.num, true, "he");
event.finish();
}
"step 4";
"step 5";
if (result.bool) {
var target = result.targets[0];
player.give(result.cards, target);

View File

@ -4064,7 +4064,8 @@ const skills = {
"step 0";
player.give(cards, targets[0], "give");
"step 1";
targets[0].chooseToCompare(targets[1]);
if (targets[0].canCompare(targets[1])) targets[0].chooseToCompare(targets[1]);
else event.finish();
"step 2";
if (result.bool) {
targets[1].loseHp();

View File

@ -7237,25 +7237,34 @@ const skills = {
content: function () {
"step 0";
player.showHandcards();
if (get.color(player.getCards("h")) != "none") {
const hs = player.getCards("h"), color = get.color(hs[0], player);
if (hs.length === 1 || !hs.some((card,index) => {
return index > 0 && get.color(card) !== color;
})) {
player.draw();
player.addTempSkill("rehuaiyi2", "phaseUseEnd");
event.finish();
}
"step 1";
player.chooseControl("红色", "黑色").set("ai", function () {
var player = _status.event.player;
if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return "红色";
return "黑色";
const list = [], bannedList = [], indexs = Object.keys(lib.color);
player.getCards("h").forEach(card => {
const color = get.color(card, player);
list.add(color);
if (!lib.filter.cardDiscardable(card, player, "rehuaiyi")) bannedList.add(color);
});
list.removeArray(bannedList);
list.sort((a, b) => indexs.indexOf(a) - indexs.indexOf(b));
if (!list.length) event.finish();
else if(list.length === 1) event._result = {control: list[0]};
else player.chooseControl(list.map(i => `${i}2`)).set("ai", function () {
var player = _status.event.player;
if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return 1;
return 0;
}).set("prompt", "请选择弃置一种颜色的所有手牌");
"step 2";
event.control = result.control;
var cards;
if (event.control == "红色") {
cards = player.getCards("h", { color: "red" });
} else {
cards = player.getCards("h", { color: "black" });
}
event.control = result.control.slice(0, result.control.length - 1);
var cards = player.getCards("h", {color: event.control});
player.discard(cards);
event.num = cards.length;
"step 3";

View File

@ -677,7 +677,8 @@ const skills = {
content: "expansion",
markcount: "expansion",
mark(dialog, storage, player) {
return "共扣置" + get.cnNumber(player.getExpansions("olqushi_effect").length) + "张“趋”";
if (storage.some(source => source.isUnderControl(true))) dialog.add(player.getExpansions("olqushi_effect"));
else return "共扣置" + get.cnNumber(player.getExpansions("olqushi_effect").length) + "张“趋”";
},
},
trigger: { player: "phaseJieshuBegin" },
@ -687,29 +688,18 @@ const skills = {
const cards = player.getExpansions("olqushi_effect");
if (cards.length) {
await player.loseToDiscardpile(cards);
const targets = player
.getStorage("olqushi_effect")
.filter(i => {
return i.isIn();
})
.sortBySeat();
const num = Math.min(
player
.getHistory("useCard", evt => {
return evt.targets && evt.targets.length;
})
.reduce((sum, evt) => {
return sum + evt.targets.length;
}, 0),
5
);
if (
targets.length &&
player.getHistory("useCard", evt => {
return cards.some(card => get.type2(card) == get.type2(evt.card));
}).length &&
num
) {
const targets = player.getStorage("olqushi_effect").filter(i => {
return i.isIn();
}).sortBySeat();
const num = Math.min(player.getHistory("useCard", evt => {
return evt.targets && evt.targets.length;
}).reduce((targets, evt) => {
targets.addArray(evt.targets);
return targets;
}, []).length, 5);
if (targets.length && num>0 && player.getHistory("useCard", evt => {
return cards.some(card => get.type2(card) == get.type2(evt.card));
}).length) {
for (const target of targets) await target.draw(num);
}
}
@ -3416,30 +3406,28 @@ const skills = {
return player.hasCard(card => lib.filter.cardDiscardable(card, player), "he");
},
check: function (card) {
var player = _status.event.player;
var player = get.player();
return (5 - get.value(card)) / Math.pow(Math.max(0.1, player.getUseValue(card)), 0.33);
},
content: function () {
"step 0";
player
.judge(card => {
var evt = _status.event.getParent();
var cardx = evt.cards[0];
if (get.type2(card) == get.type2(cardx)) return 0.5;
return 0.1;
})
.set("callback", function () {
var card = event.judgeResult.card;
player.addTempSkill("olweifu_clear");
player.addTempSkill("olweifu_add");
if (!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add = {};
var type = get.type2(card, player);
if (typeof player.storage.olweifu_add[type] != "number") player.storage.olweifu_add[type] = 0;
player.storage.olweifu_add[type]++;
player.markSkill("olweifu_add");
if (type == get.type2(event.getParent(2).cards[0], player)) player.draw();
})
.set("judge2", result => result.bool);
player.judge(card => {
var evt = get.event().getParent("olweifu");
if (evt.name !== "olweifu") return 0;
var cardx = evt.cards[0];
if (get.type2(card) == get.type2(cardx)) return 0.5;
return 0.1;
}).set("callback", function () {
var card = event.judgeResult.card;
player.addTempSkill("olweifu_clear");
player.addTempSkill("olweifu_add");
if (!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add = {};
var type = get.type2(card, player);
if (typeof player.storage.olweifu_add[type] != "number") player.storage.olweifu_add[type] = 0;
player.storage.olweifu_add[type]++;
player.markSkill("olweifu_add");
if (type == get.type2(event.getParent(2).cards[0], player)) player.draw();
}).set("judge2", result => result.bool);
},
ai: {
order: 7,
@ -3457,9 +3445,7 @@ const skills = {
1 >
(get.is.object(player.storage.olweifu_add) ? player.storage.olweifu_add[type] || 0 : 0)
);
}, "hs")
? 1
: 0;
}, "hs") ? 1 : 0;
},
},
},
@ -20480,7 +20466,8 @@ const skills = {
player.storage.jianshu = true;
player.give(cards, targets[0], "give");
"step 1";
targets[0].chooseToCompare(targets[1]);
if (targets[0].canCompare(targets[1])) targets[0].chooseToCompare(targets[1]);
else event.finish();
"step 2";
if (result.bool) {
targets[0].chooseToDiscard("he", 2, true);

View File

@ -849,7 +849,7 @@ const translates = {
sp_ol_zhanghe: "SP张郃",
sp_ol_zhanghe_prefix: "SP",
spolzhouxuan: "周旋",
spolzhouxuan_info: "①弃牌阶段开始时,你可将任意张置于武将牌上称为“旋”你至多拥有五张“旋”。②当你使用牌时你随机将一张“旋”置入弃牌堆然后摸一张牌若你的手牌数不为全场唯一最多则额外摸X张牌X为“旋”数。③出牌阶段结束时你将所有“旋”置入弃牌堆。",
spolzhouxuan_info: "①弃牌阶段开始时,你可将任意张手牌置于武将牌上称为“旋”你至多拥有五张“旋”。②当你使用牌时你随机将一张“旋”置入弃牌堆然后摸一张牌若你的手牌数不为全场唯一最多则额外摸X张牌X为“旋”数。③出牌阶段结束时你将所有“旋”置入弃牌堆。",
wuyan: "吾彦",
lanjiang: "澜疆",
lanjiang_info: "结束阶段你可以选择所有手牌数不小于你的角色。这些角色依次选择是否令你摸一张牌。然后你可以对其中一名手牌数等于你的角色造成1点伤害随后令其中一名手牌数小于你的角色摸一张牌。",
@ -1218,7 +1218,7 @@ const translates = {
olchongshen_info: "你可以将本轮得到的红色手牌当作【闪】使用。",
guotu: "郭图",
olqushi: "趋势",
olqushi_info: "出牌阶段限一次你可以摸一张牌然后将一张手牌扣置于一名其他角色的武将牌上称为“趋”。目标角色于其结束阶段移去武将牌上的所有“趋”若其于本回合使用过与“趋”相同类别的牌则你摸X张牌X为其本回合使用牌指定过的目标数之和且至多为5。",
olqushi_info: "出牌阶段限一次你可以摸一张牌然后将一张手牌扣置于一名其他角色的武将牌上称为“趋”。目标角色于其结束阶段移去武将牌上的所有“趋”若其于本回合使用过与“趋”相同类别的牌则你摸X张牌X为其本回合被其使用牌指定过的角色数总和且至多为5。",
olweijie: "诿解",
olweijie_info: "回合外每名角色的回合限一次当你需要使用或打出一张基本牌时你可以弃置距离为1的一名角色的一张手牌若此牌牌名与你需要使用或打出的牌的牌名相同则视为你使用或打出之。",
liupan: "刘磐",

View File

@ -66,7 +66,7 @@ const characters = {
tw_daxiaoqiao: ["female", "wu", 3, ["twxingwu", "twpingting"], ["tempname:daxiaoqiao"]],
tw_furong: ["male", "shu", 4, ["twxuewei", "twliechi"]],
tw_yl_luzhi: ["male", "qun", 3, ["twmingren", "twzhenliang"]],
tw_liuzhang: ["male", "qun", 3, ["jutu", "twyaohu", "rehuaibi"]],
tw_liuzhang: ["male", "qun", 3, ["jutu", "twyaohu", "rehuaibi"], ["zhu"]],
tw_zongyu: ["male", "shu", 3, ["twzhibian", "twyuyan"]],
tw_zhouchu: ["male", "wu", 4, ["twguoyi", "twchuhai"]],
tw_qiaogong: ["male", "wu", 3, ["twyizhu", "twluanchou"]],

View File

@ -458,19 +458,16 @@ const skills = {
trigger: { global: "damageBegin1" },
filter(event, player) {
if (event.getParent().type != "card" || event.card.name != "juedou" || !event.player.isIn()) return false;
const evt = game.getGlobalHistory("useCard", evt => evt.card == event.card)[0];
if (evt && evt.targets && (event.player != player || player.countCards("h"))) {
if (evt.player == player) {
return evt.targets.includes(event.player) && event.player != player;
}
return evt.targets.includes(player) && evt.player != player;
const evt = event.getParent()
if (evt && evt.targets && (event.player != player || player.countCards("h") > 0)) {
return (evt.player === player || evt.targets.includes(player));
}
return false;
},
forced: true,
popup: false,
async content(event, trigger, player) {
await player.logSkill("twxiayong" + (trigger.player === player ? "1" : "2"), trigger.player);
player.logSkill("twxiayong" + (trigger.player === player ? "1" : "2"), trigger.player);
if (trigger.player === player) {
const cards = player.getCards("h", card => {
return lib.filter.cardDiscardable(card, player, "twxiayong");

View File

@ -12693,7 +12693,10 @@ const skills = {
} else event.finish();
} else if (target.isLinked()) target.link();
"step 3";
if (target.isIn()) target.addMark("baoshu", event.num2);
if (target.isIn()){
target.addSkill("baoshu_draw");
target.addMark("baoshu", event.num2);
}
if (num < targets.length - 1) {
event.num++;
event.goto(2);
@ -12703,20 +12706,22 @@ const skills = {
intro: {
name2: "梳",
content: "mark",
onunmark(storage, player){
delete player.storage.baoshu;
player.removeSkill("baoshu_draw");
}
},
group: "baoshu_draw",
//group: "baoshu_draw",
subSkill: {
draw: {
trigger: { global: "phaseDrawBegin2" },
trigger: { player: "phaseDrawBegin2" },
forced: true,
popup: false,
charlotte: true,
filter: function (event, player) {
return !event.numFixed && event.player.hasMark("baoshu");
return !event.numFixed && player.hasMark("baoshu");
},
content: function () {
var target = trigger.player,
num = target.countMark("baoshu");
trigger.player.logSkill("baoshu_draw");
var num = player.countMark("baoshu");
trigger.num += num;
trigger.player.removeMark("baoshu", num);
},
@ -15523,7 +15528,6 @@ const skills = {
wlcuorui: {
audio: 2,
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
if (!["identity", "guozhan"].includes(get.mode())) {
return game.hasPlayer(function (current) {
@ -15534,52 +15538,37 @@ const skills = {
return get.distance(player, current) <= 1 && current.countDiscardableCards(player, "hej") > 0;
});
},
async cost(event, trigger, player){
if (!["identity", "guozhan"].includes(get.mode())) {
event.result = await player.chooseTarget(function (card, player, target) {
return target.isFriendOf(player) && target.countDiscardableCards(player, "hej") > 0;
}, get.prompt2("wlcuorui")).set("ai", function (target) {
if (target.countCards("e", function (card) {
return card.name != "tengjia" && get.value(card, target) <= 0;
})) return 10;
if (target.countCards("j", function (card) {
return get.effect(target, { name: card.viewAs || card.name }, target, target) < 0;
})) return 10;
return Math.random() + 0.2 - 1 / target.countCards("hej");
}).forResult();
} else {
event.result = await player.chooseTarget(function (card, player, target) {
return get.distance(player, target) <= 1 && target.countDiscardableCards(player, "hej") > 0;
}, get.prompt2("wlcuorui")).set("ai", function (target) {
if (game.hasPlayer(current => {
return current != target && get.attitude(_status.event.player, current) < 0;
})) return get.effect(target, { name: "guohe" }, player, player) + 10;
return 0;
}).forResult();
}
},
content: function () {
"step 0";
if (!["identity", "guozhan"].includes(get.mode())) {
player
.chooseTarget(function (card, player, target) {
return target.isFriendOf(player) && target.countDiscardableCards(player, "hej") > 0;
}, get.prompt2("wlcuorui"))
.set("ai", function (target) {
if (
target.countCards("e", function (card) {
return card.name != "tengjia" && get.value(card, target) <= 0;
})
)
return 10;
if (
target.countCards("j", function (card) {
return get.effect(target, { name: card.viewAs || card.name }, target, target) < 0;
})
)
return 10;
return Math.random() + 0.2 - 1 / target.countCards("hej");
});
} else {
player
.chooseTarget(function (card, player, target) {
return get.distance(player, target) <= 1 && target.countDiscardableCards(player, "hej") > 0;
}, get.prompt2("wlcuorui"))
.set("ai", function (target) {
if (
game.hasPlayer(current => {
return current != target && get.attitude(_status.event.player, current) < 0;
})
)
return get.effect(target, { name: "guohe" }, player, player) + 10;
return 0;
});
}
var target = targets[0];
event.target = target;
player.discardPlayerCard(target, "hej", true);
if (["identity", "guozhan"].includes(get.mode())) event.goto(6);
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("wlcuorui", target);
player.discardPlayerCard(target, "hej", true);
if (["identity", "guozhan"].includes(get.mode())) event.goto(7);
} else event.finish();
"step 2";
if (!result.cards || !result.cards.length) {
event.finish();
return;
@ -15587,64 +15576,46 @@ const skills = {
var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target);
event.color = color;
var list = [];
if (
game.hasPlayer(function (current) {
return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("h");
})
)
list.push("展示手牌");
if (
game.hasPlayer(function (current) {
return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("e", { color: color });
})
)
list.push("弃置装备");
if (game.hasPlayer(function (current) {
return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("h");
})) list.push("展示手牌");
if (game.hasPlayer(function (current) {
return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("e", { color: color });
})) list.push("弃置装备");
if (!list.length) {
event.finish();
return;
}
if (list.length == 1) event._result = { control: list[0] };
else
player
.chooseControl(list)
.set("prompt", "挫锐:展示对手的至多两张手牌,或弃置对手装备区内至多两张" + get.translation(color) + "牌")
.set("ai", function () {
var player = _status.event.player;
var color = _status.event.getParent().color;
if (
game.countPlayer(function (current) {
if (!current.isEnemyOf(player)) return false;
return current.countCards("e", function (card) {
return get.color(card) == color && get.value(card) > 0;
});
}) > 1
)
return 1;
return 0;
else player.chooseControl(list).set("prompt", "挫锐:展示对手的至多两张手牌,或弃置对手装备区内至多两张" + get.translation(color) + "牌").set("ai", function () {
var player = _status.event.player;
var color = _status.event.getParent().color;
if (game.countPlayer(function (current) {
if (!current.isEnemyOf(player)) return false;
return current.countCards("e", function (card) {
return get.color(card) == color && get.value(card) > 0;
});
"step 3";
}) > 1) return 1;
return 0;
});
"step 2";
if (result.control == "弃置装备") event.goto(5);
else {
var dialog = ["请选择要展示的牌"];
var list = game
.filterPlayer(function (current) {
return current.isEnemyOf(player) && current.countCards("h");
})
.sortBySeat();
var list = game.filterPlayer(function (current) {
return current.isEnemyOf(player) && current.countCards("h");
}).sortBySeat();
for (var i of list) {
dialog.push('<div class="text center">' + get.translation(i) + "</div>");
if (player.hasSkillTag("viewHandcard", null, i, true)) dialog.push(i.getCards("h"));
else dialog.push([i.getCards("h"), "blank"]);
}
player
.chooseButton([1, 2], true)
.set("createDialog", dialog)
.set("ai", function (button) {
var color = get.color(button.link) == _status.event.getParent().color;
return color ? Math.random() : 0.35;
});
player.chooseButton([1, 2], true).set("createDialog", dialog).set("ai", function (button) {
var color = get.color(button.link) == _status.event.getParent().color;
return color ? Math.random() : 0.35;
});
}
"step 4";
"step 3";
player.showCards(result.links);
var map = {};
var map2 = {};
@ -15666,34 +15637,27 @@ const skills = {
return lib.sort.seat(a.source || a.player, b.source || b.player);
});
event.finish();
"step 5";
"step 4";
var dialog = ["请选择要弃置的牌"];
var list = game
.filterPlayer(function (current) {
return (
current.isEnemyOf(player) &&
current.countCards("e", function (card) {
return get.color(card) == event.color;
})
);
})
.sortBySeat();
for (var i of list) {
dialog.push('<div class="text center">' + get.translation(i) + "</div>");
dialog.push(
i.getCards("e", function (card) {
var list = game.filterPlayer(function (current) {
return (
current.isEnemyOf(player) &&
current.countCards("e", function (card) {
return get.color(card) == event.color;
})
);
}).sortBySeat();
for (var i of list) {
dialog.push('<div class="text center">' + get.translation(i) + "</div>");
dialog.push(i.getCards("e", function (card) {
return get.color(card) == event.color;
}));
}
player
.chooseButton([1, 2], true)
.set("createDialog", dialog)
.set("ai", function (button) {
var owner = get.owner(button.link);
return get.value(button.link, owner);
});
"step 6";
player.chooseButton([1, 2], true).set("createDialog", dialog).set("ai", function (button) {
var owner = get.owner(button.link);
return get.value(button.link, owner);
});
"step 5";
var map = {};
for (var i of result.links) {
if (get.color(i) != event.color) continue;
@ -15708,45 +15672,48 @@ const skills = {
return lib.sort.seat(a.player, b.player);
});
event.finish();
"step 7";
"step 6";
if (!result.cards || !result.cards.length) {
event.finish();
return;
}
if (
game.hasPlayer(current => {
return current.countCards("he") > 0 && current != player && current != target;
})
) {
var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target);
var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target);
if (game.hasPlayer(current => {
return current != player && current != target && current.hasCard(card => {
const position = get.position(card);
if (position === "h") return true;
return position === "e" && get.color(card, current) === color;
}, "he");
})) {
event.color = color;
var next = player.chooseTarget(true, "挫锐:选择另一名其他角色", "弃置该角色装备区里至多两张" + get.translation(event.color) + "牌;或展示该角色的至多两张手牌,然后获得其中的" + get.translation(event.color) + "牌");
next.set("filterTarget", (card, player, target) => {
return target.countCards("he") > 0 && target != player && target != _status.event.getParent().target;
const evt = get.event().getParent(), color = evt.color;
return target != player && target != evt.target && target.hasCard(card => {
const position = get.position(card);
if (position === "h") return true;
return position === "e" && get.color(card, target) === color;
}, "he");
});
next.set("ai", target => {
return -get.attitude(_status.event.player, target) * target.countCards("he") + 0.1;
});
} else event.finish();
"step 8";
"step 7";
if (result.bool) {
var targetx = result.targets[0];
event.targetx = targetx;
player.line(targetx);
player
.choosePlayerCard(targetx, "he", true, [1, 2])
.set("prompt", "展示至多两张手牌,或弃置至多两张" + get.translation(event.color) + "装备")
.set("filterButton", button => {
if (ui.selected.buttons.length) {
var linkx = ui.selected.buttons[0].link;
if (get.position(button.link) != get.position(linkx)) return false;
}
if (get.position(button.link) == "e") return get.color(button.link, _status.event.target) == _status.event.getParent().color;
return true;
})
.set("target", targetx);
player.choosePlayerCard(targetx, "he", true, [1, 2]).set("prompt", "展示至多两张手牌,或弃置至多两张" + get.translation(event.color) + "装备").set("filterButton", button => {
if (ui.selected.buttons.length) {
var linkx = ui.selected.buttons[0].link;
if (get.position(button.link) != get.position(linkx)) return false;
}
if (get.position(button.link) == "e") return get.color(button.link, _status.event.target) == _status.event.getParent().color;
return true;
}).set("target", targetx);
} else event.finish();
"step 9";
"step 8";
if (result.bool) {
var cards = result.links;
if (get.position(cards[0]) == "e") {

View File

@ -212,7 +212,7 @@ const translates = {
dcgeyuan: "割圆",
dcgeyuan_info: "锁定技。①游戏开始时你将从A至K的所有整数排列为一个环形链表称为“圆环之理”。②当有一张牌进入弃牌堆后若此牌的点数在“圆环之理”内且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻则你将此牌的点数记录进“圆环之弧”然后若“圆环之弧”与“圆环之理”长度相同则你从“圆环之理”中移除“圆环之弧”记录的第一个和最后一个数字A和B当“圆环之理”长度不大于3时则不移除清空“圆环之弧”获得场上和牌堆中所有点数为A和B的牌。",
dcjieshu: "解术",
dcjieshu_info: "锁定技。①所有点数不在“圆环之理”中的牌不计入你的手牌上限。②当你使用牌时,若“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你摸一张牌。",
dcjieshu_info: "锁定技。①所有点数不在“圆环之理”中的牌不计入你的手牌上限。②当你使用或打出牌时,若“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你摸一张牌。",
dcgusuan: "股算",
dcgusuan_info: "觉醒技。一名角色的回合结束时若你的“圆环之理”长度为3则你减1点体力上限并修改〖割圆〗。",
dcgeyuan_magica: "割圆·改",

View File

@ -8374,25 +8374,36 @@ const skills = {
usable: 1,
delay: false,
filter: function (event, player) {
return player.countCards("h", { color: "red" }) && player.countCards("h", { color: "black" });
return player.countCards("h") > 0;
},
content: function () {
"step 0";
player.showHandcards();
"step 1";
player.chooseControl("红色", "黑色").set("ai", function () {
var player = _status.event.player;
if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return "红色";
return "黑色";
});
"step 2";
event.control = result.control;
var cards;
if (event.control == "红色") {
cards = player.getCards("h", { color: "red" });
} else {
cards = player.getCards("h", { color: "black" });
const hs = player.getCards("h"), color = get.color(hs[0], player);
if (hs.length === 1 || !hs.some((card,index) => {
return index > 0 && get.color(card) !== color;
})) {
event.finish();
}
"step 1";
const list = [], bannedList = [], indexs = Object.keys(lib.color);
player.getCards("h").forEach(card => {
const color = get.color(card, player);
list.add(color);
if (!lib.filter.cardDiscardable(card, player, "huaiyi")) bannedList.add(color);
});
list.removeArray(bannedList);
list.sort((a, b) => indexs.indexOf(a) - indexs.indexOf(b));
if (!list.length) event.finish();
else if(list.length === 1) event._result = {control: list[0]};
else player.chooseControl(list.map(i => `${i}2`)).set("ai", function () {
var player = _status.event.player;
if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return 1;
return 0;
}).set("prompt", "请选择弃置一种颜色的所有手牌");
"step 2";
event.control = result.control.slice(0, result.control.length - 1);
var cards = player.getCards("h", {color: event.control});
player.discard(cards);
event.num = cards.length;
"step 3";
@ -8431,7 +8442,10 @@ const skills = {
return 1;
},
result: {
player: 1,
player:(player) => {
if (get.color(player.getCards("h")) != "none") return 0;
return 1;
},
},
},
},

View File

@ -2903,7 +2903,7 @@ const skills = {
},
content: function () {
var stat = player.getStat("skill");
if (this.trigger.name === "phaseUse") {
if (trigger.name === "phaseUse") {
delete stat.xinquanbian;
} else {
if (!stat.xinquanbian) stat.xinquanbian = 0;

View File

@ -5056,11 +5056,11 @@ game.import("mode", function (lib, game, ui, get, ai, _status) {
async content(event, trigger, player) {
trigger.targets.length = 0;
trigger.all_excluded = true;
const cards = trigger.cards.filter(i => !get.owner(i));
const cards = trigger.cards.filterInD();
if (cards.length && get.type(trigger.card) == "equip") {
await player.gain(cards, "gain2");
for (let i of cards) {
if (get.owner(i) == player && player.hasUseTarget(i)) {
if (player.getCards("h").includes(i) && player.hasUseTarget(i)) {
await player.chooseUseTarget(i);
}
}
@ -6485,30 +6485,32 @@ game.import("mode", function (lib, game, ui, get, ai, _status) {
delay: false,
content: function () {
"step 0";
var map = {};
player.showHandcards();
for (var i of ["red", "black", "none"]) {
if (player.countCards("h", { color: i })) map[i] = true;
var hs = player.getCards("h"), color = get.color(hs[0], player);
if (hs.length === 1 || !hs.some((card,index) => {
return index > 0 && get.color(card) !== color;
})) {
event.finish();
}
if (Object.keys(map).length < 2) event.finish();
else event.map = map;
"step 1";
var mapx = { red: "红色", black: "黑色", none: "无色" };
player
.chooseControl(Object.keys(event.map).map((color) => mapx[color]))
.set("ai", function () {
var list = _status.event.controls;
var map = { 红色: "red", 黑色: "black", 无色: "none" };
return list.sort(
(a, b) =>
player.countCards("h", { color: map[a] }) -
player.countCards("h", { color: map[b] })
)[0];
})
.set("prompt", "怀异:弃置一种颜色的所有牌");
const list = [], bannedList = [], indexs = Object.keys(lib.color);
player.getCards("h").forEach(card => {
const color = get.color(card, player);
list.add(color);
if (!lib.filter.cardDiscardable(card, player, "gzrehuaiyi")) bannedList.add(color);
});
list.removeArray(bannedList);
list.sort((a, b) => indexs.indexOf(a) - indexs.indexOf(b));
if (!list.length) event.finish();
else if(list.length === 1) event._result = {control: list[0]};
else player.chooseControl(list.map(i => `${i}2`)).set("ai", function () {
var player = _status.event.player;
if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return 1;
return 0;
}).set("prompt", "请选择弃置一种颜色的所有手牌");
"step 2";
var map = { 红色: "red", 黑色: "black", 无色: "none" };
var cards = player.getCards("h", { color: map[result.control] });
event.control = result.control.slice(0, result.control.length - 1);
var cards = player.getCards("h", {color: event.control});
player.discard(cards);
event.num = cards.length;
"step 3";

View File

@ -9318,6 +9318,8 @@ export class Library {
none2: "无色",
red: "红色",
black: "黑色",
red2: "红色",
black2: "黑色",
ok: "确定",
ok2: "确定",
cancel: "取消",