Merge pull request #1320 from PZ157/PR-Branch

修复一系列未考虑一回合多个出牌阶段的技能
This commit is contained in:
Spmario233 2024-05-06 19:20:01 +08:00 committed by GitHub
commit b69f2716eb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 128 additions and 78 deletions

View File

@ -743,7 +743,7 @@ const skills = {
player.addMark("dcbianzhuang", 1, false);
if (player.countMark("dcbianzhuang") > 2) {
player.storage.dcbianzhuang_inited = true;
player.reinitCharacter("zhutiexiong", "wu_zhutiexiong");
player.reinitCharacter(get.character(player.name2, 3).includes("dcbianzhuang") ? player.name2 : player.name1, "wu_zhutiexiong");
}
}
},

View File

@ -5279,7 +5279,7 @@ const skills = {
.set("logSkill", "nsduijue");
"step 1";
if (result.bool) {
player.addTempSkill("nsduijue_use");
player.addTempSkill("nsduijue_use", "phaseUseAfter");
player.storage.nsduijue_use = get.color(result.cards[0]);
}
},

View File

@ -6851,7 +6851,7 @@ game.import("character", function () {
guozai2: {
mark: true,
intro: {
content: "结束阶段需弃置&张牌",
content: "当前阶段结束时需弃置&张牌",
},
trigger: { player: "phaseUseEnd" },
forced: true,
@ -6887,7 +6887,7 @@ game.import("character", function () {
guozaix2: {
mark: true,
intro: {
content: "结束阶段需弃置&张牌",
content: "当前阶段结束时需弃置&张牌",
},
trigger: { player: "phaseUseEnd" },
forced: true,

View File

@ -12422,19 +12422,14 @@ const skills = {
audio: 2,
trigger: { global: "useCardToPlayered" },
filter: function (event, player) {
if (player == event.player || event.targets.length != 1 || event.player.countCards("h") >= event.player.hp) return false;
if (player == event.player || event.targets.length != 1) return false;
var bool = function (card) {
return (card.name == "sha" || get.type(card, false) == "trick") && get.color(card, false) == "black";
};
if (!bool(event.card)) return false;
var evt = event.getParent("phaseUse");
if (evt.player != event.player) return false;
return (
get.mode() != "guozhan" ||
event.player.getHistory("useCard", function (evtx) {
return bool(evtx.card) && evtx.getParent("phaseUse") == evt;
})[0] == event.getParent()
);
return true;
},
logTarget: "player",
check: function (event, player) {
@ -12452,42 +12447,24 @@ const skills = {
content: function () {
"step 0";
var num = Math.min(5, trigger.player.hp) - trigger.player.countCards("h");
if (num > 0) trigger.player.draw(num);
"step 1";
trigger.player.addTempSkill("xibing2");
player._xibing = true;
if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2)) event.finish();
"step 2";
var target = trigger.player;
var players1 = [player.name1, player.name2];
var players2 = [target.name1, target.name2];
player
.chooseButton(2, ["是否暗置自己和" + get.translation(target) + "的各一张武将牌?", '<div class="text center">你的武将牌</div>', [players1, "character"], '<div class="text center">' + get.translation(target) + "的武将牌</div>", [players2, "character"]])
.set("players", players1)
.set("complexSelect", true)
.set("filterButton", function (button) {
return !get.is.jun(button.link) && (ui.selected.buttons.length == 0) == _status.event.players.includes(button.link);
});
"step 3";
if (result.bool) {
var target = trigger.player;
player.hideCharacter(player.name1 == result.links[0] ? 0 : 1);
target.hideCharacter(target.name1 == result.links[1] ? 0 : 1);
player.addTempSkill("xibing3");
target.addTempSkill("xibing3");
if (num > 0) {
trigger.player.draw(num);
trigger.player.addTempSkill("xibing_banned");
}
},
},
xibing2: {
mod: {
cardEnabled2: function (card) {
if (get.position(card) == "h") return false;
subSkill:{
banned: {
mod: {
cardEnabled(card) {
return false;
},
cardSavable(card) {
return false;
},
},
},
},
},
xibing3: {
ai: { nomingzhi: true },
},
//小虎
remeibu: {
audio: "meibu",

View File

@ -100,8 +100,7 @@ const translates = {
spwanggui: "望归",
spwanggui_info: "①当你受到伤害后你可以摸一张牌或和一名势力相同的其他角色各摸一张牌②每回合限一次当你造成伤害后你可以对一名与你势力不同的角色造成1点伤害。",
xibing: "息兵",
xibing_info: "当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)且本回合不能再使用手牌。",
xibing_info_guozhan: "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸至五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。",
xibing_info: "每回合限一次,当其他角色于其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)。若其因此摸牌,其本回合不能再使用牌。",
luyusheng: "陆郁生",
zhente: "贞特",
zhente2: "贞特",
@ -167,7 +166,7 @@ const translates = {
weimeng_info: "出牌阶段限一次你可以获得一名其他角色的至多X张手牌然后交给其等量的牌X为你的体力值。若你给出的牌点数之和大于得到的牌则你摸一张牌小于得到的牌弃置该角色区域内的一张牌。",
mamidi: "马日磾",
bingjie: "秉节",
bingjie_info: "出牌阶段开始时你可减1点体力上限然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。",
bingjie_info: "出牌阶段开始时你可减1点体力上限然后当你本回合使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。",
zhengding: "正订",
zhengding_info: "锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时若这两张牌颜色相同则你加1点体力上限并回复1点体力。",
dc_jiben: "吉本",

View File

@ -619,7 +619,7 @@ const skills = {
},
async content(event, trigger, player) {
player.line(trigger.player);
trigger.player.addTempSkill("jsrglonglin_forbid");
trigger.player.addTempSkill("jsrglonglin_forbid", "phaseUseAfter");
},
},
forbid: {
@ -3647,7 +3647,7 @@ const skills = {
},
content: function () {
"step 0";
event.num = 0;
target.addTempSkill("jsrgyangming_lose", "phaseUseAfter");
"step 1";
player.chooseToCompare(target).set(
"small",
@ -3667,9 +3667,11 @@ const skills = {
.chooseBool("是否与其重复此拼点流程?")
.set("ai", () => get.event("bool"))
.set("bool", get.effect(target, "jsrgyangming", player, player) > 0);
event.num++;
game.broadcastAll((target)=>{
target.storage.jsrgyangming_lose++;
}, target);
} else {
if (event.num) target.draw(event.num);
if (target.storage.jsrgyangming_lose) target.draw(target.storage.jsrgyangming_lose);
player.recover();
event.finish();
}
@ -3700,6 +3702,15 @@ const skills = {
},
},
},
subSkill: {
lose: {
init(player, skill) {
player.storage[skill] = 0;
},
onremove: true,
charlotte: true
}
}
},
//韩遂
jsrgniluan: {
@ -6014,6 +6025,9 @@ const skills = {
lib.skill.sbyingmen.addVisitors(characters, player);
game.delayx();
},
ai: {
combo: "sbpingjian"
},
group: "sbyingmen_reload",
subSkill: {
reload: {
@ -6654,7 +6668,12 @@ const skills = {
group: "jsrgguanhuo_viewas",
content: function () {
"step 0";
var count = player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length;
var count = player.getHistory("useSkill", evt => {
return (
evt.skill == "jsrgguanhuo_viewas" &&
evt.getParent("phaseUse") === trigger.getParent("phaseUse")
);
}).length;
if (count == 1) {
player.addTempSkill("jsrgguanhuo_ex", "phaseUseAfter");
player.addMark("jsrgguanhuo_ex", 1, false);
@ -6666,8 +6685,18 @@ const skills = {
ai: {
effect: {
player: function (card, player) {
if (_status.event.getParent().skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length == 1) return "zeroplayertarget";
if (_status.event.type == "phase" && _status.event.skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length > 1 && player.countCards("h") <= 3) return [0, 0];
if (_status.event.getParent().skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => {
return (
evt.skill == "jsrgguanhuo_viewas" &&
evt.getParent("phaseUse") === _status.event.getParent("phaseUse")
);
}).length == 1) return "zeroplayertarget";
if (_status.event.type == "phase" && _status.event.skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => {
return (
evt.skill == "jsrgguanhuo_viewas" &&
evt.getParent("phaseUse") === _status.event.getParent("phaseUse")
);
}).length > 1 && player.countCards("h") <= 3) return [0, 0];
},
},
},

View File

@ -7074,7 +7074,7 @@ const skills = {
let num = 1 + event.cost_data;
await player.draw(num).set("gaintag", ["shiorimiyuki_tingxian"]);
await player.recover();
player.addTempSkill("shiorimiyuki_tingxian2");
player.addTempSkill("shiorimiyuki_tingxian2", "phaseUseAfter");
},
group: "shiorimiyuki_tingxian1",
},
@ -8694,7 +8694,7 @@ const skills = {
});
}
} else {
player.addTempSkill("zishou2", "phaseEnd");
player.addTempSkill("zishou2", "phaseUseAfter");
}
},
ai: { expose: 0.2 },

View File

@ -1869,9 +1869,6 @@ const skills = {
cardUsable: function (card, player) {
if (player.countMark("mbzhixi") >= player.hp) return false;
},
cardRespondable: function (card, player) {
if (player.countMark("mbzhixi") >= player.hp) return false;
},
cardSavable: function (card, player) {
if (player.countMark("mbzhixi") >= player.hp) return false;
},

View File

@ -11913,7 +11913,7 @@ const skills = {
player.loseHp();
}
"step 1";
target.addTempSkill("reqiangxi_off");
target.addTempSkill("reqiangxi_off", "phaseUseAfter");
target.damage("nocard");
},
check: function (card) {

View File

@ -14611,7 +14611,7 @@ const skills = {
if (!phsu || phsu.player != player) return false;
if (
player.getHistory("gain", function (evt) {
return evt.getParent().name == "chengshang";
return evt.getParent().name == "chengshang" && phsu === evt.getParent("phaseUse");
}).length
)
return false;
@ -17173,9 +17173,6 @@ const skills = {
cardUsable: function (card, player) {
if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false;
},
cardRespondable: function (card, player) {
if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false;
},
cardSavable: function (card, player) {
if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false;
},

View File

@ -3338,6 +3338,9 @@ const skills = {
if (event.num > 0) event.redo();
}
},
ai: {
halfneg: true
},
},
xiongrao: {
audio: 2,

View File

@ -110,7 +110,7 @@ const translates = {
xpchijie_info: "每回合每项各限一次。1.当其他角色使用的牌对你结算结束后你可以令此牌对所有后续目标无效。2.其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。",
xpchijie2: "持节",
yinju: "引裾",
yinju_info: "限定技,出牌阶段,你可以选择一名其他角色。若如此做,当你于此阶段内使用牌指定其为目标后,你与其各摸一张牌;当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。",
yinju_info: "限定技,出牌阶段,你可以选择一名其他角色。若如此做,直到回合结束1.当你使用牌指定其为目标后,你与其各摸一张牌;2.当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。",
yinju2: "引裾",
spjiedao: "截刀",

View File

@ -6257,7 +6257,7 @@ const skills = {
var history = current.getHistory("useCard");
if (!history.length) return false;
for (var evt of history) {
if (evt.card && evt.card.name == "shunshou") {
if (evt.card && evt.card.name == "shunshou" && evt.getParent("phaseUse") === event.getParent("phaseUse")) {
targets.addArray(evt.targets);
}
}

View File

@ -308,9 +308,9 @@ game.import("character", function () {
},
content: function () {
player.storage.yuexing2 = target;
player.addTempSkill("yuexing2");
player.addTempSkill("yuexing2", "phaseUseAfter");
target.storage.yuexing2 = player;
target.addTempSkill("yuexing2");
target.addTempSkill("yuexing2", "phaseUseAfter");
},
ai: {
order: function () {

View File

@ -1238,7 +1238,10 @@ const skills = {
aiOrder: function (player, card, num) {
if (typeof card.number != "number") return;
var history = player.getHistory("useCard", function (evt) {
return evt.isPhaseUsing();
return (
evt.isPhaseUsing() &&
evt.getParent("phaseUse") === _status.event.getParent("phaseUse")
);
});
if (history.length == 0) return num + 10 * (14 - card.number);
var num = get.number(history[0].card);
@ -1253,7 +1256,10 @@ const skills = {
},
filter: function (event, player) {
var history = player.getHistory("useCard", function (evt) {
return evt.isPhaseUsing();
return (
evt.isPhaseUsing() &&
evt.getParent("phaseUse") === event.getParent("phaseUse")
);
});
if (history.length < 2) return false;
var num = get.number(history[0].card);
@ -1291,7 +1297,10 @@ const skills = {
aiOrder: function (player, card, num) {
if (typeof card.number != "number") return;
var history = player.getHistory("useCard", function (evt) {
return evt.isPhaseUsing();
return (
evt.isPhaseUsing() &&
evt.getParent("phaseUse") === _status.event.getParent("phaseUse")
);
});
if (history.length == 0) return num + 10 * card.number;
var num = get.number(history[0].card);
@ -1306,7 +1315,10 @@ const skills = {
},
filter: function (event, player) {
var history = player.getHistory("useCard", function (evt) {
return evt.isPhaseUsing();
return (
evt.isPhaseUsing() &&
evt.getParent("phaseUse") === event.getParent("phaseUse")
);
});
if (history.length < 2) return false;
var num = get.number(history[0].card);

View File

@ -14447,7 +14447,8 @@ const skills = {
aiOrder: function (player, card, num) {
if (typeof card == "object" && player.isPhaseUsing()) {
var evt = player.getLastUsed();
if (evt && evt.card && ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card)))) {
if (!evt || !evt.card || evt.getParent("phaseUse") !== _status.event.getParent("phaseUse")) return num;
if ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card))) {
return num + 10;
}
}
@ -14460,7 +14461,7 @@ const skills = {
if (!evt || !evt.card) return false;
if (!player.isPhaseUsing()) return false;
var evt2 = evt.getParent("phaseUse");
if (!evt2 || evt2.name != "phaseUse" || evt2.player != player) return false;
if (!evt2 || evt2.name != "phaseUse" || evt2 !== event.getParent("phaseUse")) return false;
return (get.suit(evt.card) != "none" && get.suit(evt.card) == get.suit(event.card)) || (typeof get.number(evt.card, false) == "number" && get.number(evt.card, false) == get.number(event.card));
},
content: function () {

View File

@ -2501,14 +2501,37 @@ game.import("mode", function (lib, game, ui, get, ai, _status) {
},
fakexibing: {
audio: "xibing",
inherit: "xibing",
filter: function (event, player) {
if (player == event.player || event.targets.length != 1 || event.player.countCards("h") >= event.player.hp) return false;
var bool = function (card) {
return (card.name == "sha" || get.type(card, false) == "trick") && get.color(card, false) == "black";
};
if (!bool(event.card)) return false;
var evt = event.getParent("phaseUse");
if (evt.player != event.player) return false;
return event.player.getHistory("useCard", function (evtx) {
return bool(evtx.card) && evtx.getParent("phaseUse") == evt;
})[0] == event.getParent();
},
logTarget: "player",
check: function (event, player) {
var target = event.player;
var att = get.attitude(player, target);
var num2 = Math.min(5, target.hp) - target.countCards("h");
if (num2 <= 0) return att <= 0;
var num = target.countCards("h", function (card) {
return target.hasValueTarget(card, null, true);
});
if (!num) return att > 0;
return (num - num2) * att < 0;
},
preHidden: true,
content() {
"step 0";
var num = trigger.player.hp - trigger.player.countCards("h");
if (num > 0) trigger.player.draw(num);
"step 1";
trigger.player.addTempSkill("xibing2");
player._xibing = true;
trigger.player.addTempSkill("fakexibing_banned");
if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2))
event.finish();
"step 2";
@ -2537,10 +2560,22 @@ game.import("mode", function (lib, game, ui, get, ai, _status) {
var target = trigger.player;
player.hideCharacter(player.name1 == result.links[0] ? 0 : 1);
target.hideCharacter(target.name1 == result.links[1] ? 0 : 1);
player.addTempSkill("xibing3");
target.addTempSkill("xibing3");
player.addTempSkill("fakexibing_nomingzhi");
target.addTempSkill("fakexibing_nomingzhi");
}
},
subSkill: {
banned: {
mod: {
cardEnabled2: function (card) {
if (get.position(card) == "h") return false;
},
},
},
nomingzhi: {
ai: { nomingzhi: true },
},
},
},
fakechengshang: {
audio: "chengshang",
@ -23796,7 +23831,7 @@ game.import("mode", function (lib, game, ui, get, ai, _status) {
"副将技。①此武将牌计算体力上限时减少半个阴阳鱼。②结束阶段你可以弃置一张非基本牌并选择一名友方角色令其选择摸两张牌或回复1点体力然后其可以变更副将。",
fakexibing: "息兵",
fakexibing_info:
"当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至体力值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。",
"手牌数小于体力值的其他角色于其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至体力值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。",
fakechengshang: "承赏",
fakechengshang_info:
"出牌阶段限一次,当你使用存在花色和点数且指定了其他势力角色为目标的牌结算完毕后,若你未因此牌造成过伤害,则你可以摸一张牌,然后本阶段你可以将一张手牌当作初始游戏牌堆中与此牌花色和点数相同的另一张基本牌或普通锦囊牌使用一次。",