Skip to content
17 changes: 13 additions & 4 deletions character/jsrg/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -12327,13 +12327,22 @@ const skills = {
await target.showCards(result.cards);
target.addGaintag(result.cards, "jsrgqiantun_tag");
const next = player.chooseToCompare(target);
next.set("filterCard", (card, player) => {
const bool = cardx => cardx.hasGaintag("jsrgqiantun_tag");
return !player?.countCards("h", bool) || bool(card);
});
next.set("skill", event.name);
if (target.countCards("h") + 1 > result.cards.length * 2) {
next.set("small", true);
}
target
.when({ player: "chooseToCompareEnd" })
.filter(evt => evt == next)
.assign({
mod: {
canBeCompared(card, player, event, bool) {
if (!card.hasGaintag("jsrgqiantun_tag")) {
return false;
}
},
},
});
const result3 = await next.forResult();
target.removeGaintag("jsrgqiantun_tag");
if (result3.winner == player) {
Expand Down
83 changes: 39 additions & 44 deletions character/mobile/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -1686,6 +1686,13 @@ const skills = {
trigger: {
global: "phaseUseEnd",
},
mod: {
canBeCompared(card, player, event, bool) {
if (event == "mbjiebian" && get.position(card) == "s") {
return card.hasGaintag("mbjiebian");
}
},
},
filter(event, player) {
if (
game.hasPlayer2(
Expand All @@ -1702,7 +1709,7 @@ const skills = {
if (current != _status.currentPhase && !current.isMinHp()) {
return false;
}
return player.canCompare(current, player.hasExpansions("mbfutu"));
return player.canCompare(current, false, false, "hs", "mbjiebian");
});
},
async cost(event, trigger, player) {
Expand All @@ -1712,7 +1719,7 @@ const skills = {
if (target != _status.currentPhase && !target.isMinHp()) {
return false;
}
return player.canCompare(target, player.hasExpansions("mbfutu"));
return player.canCompare(target, false, false, "hs", "mbjiebian");
})
.set("ai", target => {
const player = get.player(),
Expand All @@ -1732,7 +1739,7 @@ const skills = {
player.addTempSkill("mbjiebian_fake");
const cards = game.createFakeCards(player.getExpansions("mbfutu"));
player.directgains(cards, null, "mbjiebian");
const result = await player.chooseToCompare(target).set("mbjiebian", true).set("position", "hs").forResult();
const result = await player.chooseToCompare(target).set("skill", event.name).set("position", "hs").forResult();
if (result.tie || result.winner != player) {
return;
}
Expand Down Expand Up @@ -1773,41 +1780,23 @@ const skills = {
fake: {
charlotte: true,
trigger: {
global: ["chooseCardOLBegin", "chooseCardOLEnd"],
global: ["chooseCardOLEnd"],
},
filter(event, player) {
return event.type == "compare" && !event.directresult && event.getParent().mbjiebian;
return event.type == "compare" && !event.directresult && event.getParent().skill == "mbjiebian";
},
forced: true,
popup: false,
firstDo: true,
async content(event, trigger, player) {
if (event.triggername == "chooseCardOLBegin") {
//牌的检测也得重写,毕竟都选到s区域去了
trigger._set.push(["position", "hs"]);
const originalFilter = trigger.filterCard;
trigger._set.push([
"filterCard",
function (card) {
if (typeof originalFilter === "function" && !originalFilter(card)) {
return false;
}
if (get.position(card) == "s") {
return card.hasGaintag("mbjiebian");
}
return true;
},
]);
} else {
const cards = player.getCards("s", card => card.hasGaintag("mbjiebian"));
if (cards?.length) {
game.deleteFakeCards(cards);
}
const card = trigger.result[trigger.targets.indexOf(player)].cards[0],
precard = player.getExpansions("mbfutu").find(cardx => cardx.cardid == card._cardid);
if (precard && !trigger.result[trigger.targets.indexOf(player)].skill) {
trigger.result[trigger.targets.indexOf(player)].cards = [precard];
}
const cards = player.getCards("s", card => card.hasGaintag("mbjiebian"));
if (cards?.length) {
game.deleteFakeCards(cards);
}
const card = trigger.result[trigger.targets.indexOf(player)].cards[0],
precard = player.getExpansions("mbfutu").find(cardx => cardx.cardid == card._cardid);
if (precard && !trigger.result[trigger.targets.indexOf(player)].skill) {
trigger.result[trigger.targets.indexOf(player)].cards = [precard];
}
},
},
Expand Down Expand Up @@ -4789,15 +4778,6 @@ const skills = {
.set("mbjianji", true)
.set("mbjianji_card", card)
.set("position", "hs")
.set("filterCard", function (card) {
/*if (typeof originalFilter === "function" && !originalFilter(card)) {
return false;
}*/
if (get.position(card) == "s") {
return card.hasGaintag("mbjianji");
}
return true;
})
.forResult();
const sha = async function sha(target, victim) {
if (!target.canUse({ name: "sha", isCard: true }, victim, false, false)) {
Expand Down Expand Up @@ -4841,6 +4821,13 @@ const skills = {
trigger: {
global: ["chooseCardOLBegin", "chooseCardOLEnd"],
},
mod: {
canBeCompared(card, player, event, bool) {
if (event == "mbjianji" && get.position(card) == "s") {
return card.hasGaintag("mbjianji");
}
},
},
filter(event, player) {
return event.type == "compare" && event.getParent().mbjianji;
},
Expand Down Expand Up @@ -5435,13 +5422,21 @@ const skills = {
await target.showCards(result.cards);
target.addGaintag(result.cards, "mbqiantun_tag");
const next = player.chooseToCompare(target);
next.set("filterCard", (card, player) => {
const bool = cardx => cardx.hasGaintag("mbqiantun_tag");
return !player?.countCards("h", bool) || bool(card);
});
if (target.countCards("h") + 1 > result.cards.length * 2) {
next.set("small", true);
}
target
.when({ player: "chooseToCompareEnd" })
.filter(evt => evt == next)
.assign({
mod: {
canBeCompared(card, player, event, bool) {
if (!card.hasGaintag("mbqiantun_tag")) {
return false;
}
},
},
});
const result3 = await next.forResult();
target.removeGaintag("mbqiantun_tag");
const mode = get.mode();
Expand Down
6 changes: 2 additions & 4 deletions character/refresh/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -9969,12 +9969,10 @@ const skills = {
},
content() {
var targets = player == trigger.player ? (trigger.targets ? trigger.targets.slice(0) : [trigger.target]) : [trigger.player];
if (!trigger.fixedResult) {
trigger.fixedResult = {};
}
trigger.fixedResult ??= {};
while (targets.length) {
var target = targets.shift();
var hs = target.getCards("h");
var hs = target.getCards("h").filter(card => trigger.filterCard(card, player, trigger));
if (hs.length) {
trigger.fixedResult[target.playerid] = hs.randomGet();
}
Expand Down
6 changes: 4 additions & 2 deletions character/tw/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -862,9 +862,11 @@ const skills = {
if (event.twfushu) {
return false;
}
return event.filterCard({ name: "tao", isCard: true }, player, event) && player.countCards("h") && !player.hasSkillTag("noCompareSource");
return event.filterCard({ name: "tao", isCard: true }, player, event) && player.canCompare("cardPile", false, true);
},
filterCard(card) {
return lib.filter.canBeCompared(card, get.event().player, "twfushu");
},
filterCard: () => true,
selectCard: 1,
lose: false,
discard: false,
Expand Down
47 changes: 15 additions & 32 deletions noname/library/element/content.js
Original file line number Diff line number Diff line change
Expand Up @@ -6365,24 +6365,16 @@ player.removeVirtualEquip(card);
chooseToCompareMeanwhile: [
async (event, trigger, player) => {
const targets = event.targets;
if (player.countCards("h") == 0 && (!event.fixedResult || !event.fixedResult[player.playerid])) {
if (!player.canCompare(targets, false, false, event.position, event)) {
event.result = { cancelled: true, bool: false };
event.finish();
return;
}
for (var i = 0; i < targets.length; i++) {
if (targets[i].countCards("h") == 0 && (!event.fixedResult || !event.fixedResult[targets[i].playerid])) {
event.result = { cancelled: true, bool: false };
event.finish();
return;
}
}
if (!event.multitarget) {
targets.sort(lib.sort.seat);
}
game.log(player, "对", targets, "发起了共同拼点");
event.compareMeanwhile = true;
event.filterCard ??= lib.filter.all;
},
async (event, trigger, player) => {
const targets = event.targets;
Expand All @@ -6392,9 +6384,10 @@ player.removeVirtualEquip(card);
if (!event.fixedResult || !event.fixedResult[player.playerid]) {
event.list.unshift(player);
}
player.chooseCardOL(event.list, "请选择拼点牌", true).set("filterCard", event.filterCard).set("type", "compare").set("ai", event.ai).set("source", player).aiCard = function (target) {
var hs = target.getCards("h");
var event = _status.event;
player.chooseCardOL(event.list, "请选择拼点牌", true, event.position).set("filterCard", event.filterCard).set("type", "compare").set("ai", event.ai).set("source", player).aiCard = function (target) {
const evt = get.event().getParent("chooseToComapre");
let hs = target.getCards(evt.position).filter(card => evt.filterCard(card, player, evt)),
event = _status.event;
event.player = target;
hs.sort(function (a, b) {
return event.ai(b) - event.ai(a);
Expand Down Expand Up @@ -6584,23 +6577,15 @@ player.removeVirtualEquip(card);
chooseToCompareMultiple: [
async (event, trigger, player) => {
const targets = event.targets;
if (!event.fixedResult?.[player.playerid] && player.countCards("h") == 0) {
if (!player.canCompare(targets, false, false, event.position, event)) {
event.result = { cancelled: true, bool: false };
event.finish();
return;
}
for (var i = 0; i < targets.length; i++) {
if ((!event.fixedResult || !event.fixedResult[targets[i].playerid]) && targets[i].countCards("h") == 0) {
event.result = { cancelled: true, bool: false };
event.finish();
return;
}
}
if (!event.multitarget) {
targets.sort(lib.sort.seat);
}
game.log(player, "对", targets, "发起拼点");
event.filterCard ??= lib.filter.all;
},
async (event, trigger, player) => {
const targets = event.targets;
Expand All @@ -6610,9 +6595,10 @@ player.removeVirtualEquip(card);
if (!event.fixedResult?.[player.playerid]) {
event.list.unshift(player);
}
player.chooseCardOL(event.list, "请选择拼点牌", true).set("filterCard", event.filterCard).set("type", "compare").set("ai", event.ai).set("source", player).aiCard = function (target) {
var hs = target.getCards("h");
var event = _status.event;
player.chooseCardOL(event.list, "请选择拼点牌", true, event.position).set("filterCard", event.filterCard).set("type", "compare").set("ai", event.ai).set("source", player).aiCard = function (target) {
const evt = get.event().getParent("chooseToComapre");
let hs = target.getCards(evt.position).filter(card => evt.filterCard(card, player, evt)),
event = _status.event;
event.player = target;
hs.sort(function (a, b) {
return event.ai(b) - event.ai(a);
Expand Down Expand Up @@ -6784,24 +6770,21 @@ player.removeVirtualEquip(card);
event.compareWithCardPile = true;
event.compareType ??= "top";
}
if (!event.position || typeof event.position != "string") {
event.position = "h";
}
if ((!event.fixedResult?.[player.playerid] && player.countCards(event.position) == 0) || (!event.compareWithCardPile && !event.fixedResult?.[target.playerid] && target.countCards(event.position) == 0)) {
if (!player.canCompare(target, false, false, event.position, event)) {
event.result = { cancelled: true, bool: false };
event.finish();
return;
}
game.log(player, "对", event.compareWithCardPile ? "牌堆" : target, "发起", event.isDelay ? "延时" : "", "拼点");
event.filterCard ??= lib.filter.all;
},
async (event, trigger, player) => {
const target = event.target;
event.list = [player, target].filter(current => get.itemtype(current) == "player" && !event.fixedResult?.[current.playerid]);
if (event.list.length) {
player.chooseCardOL(event.list, "请选择拼点牌", true, event.position).set("small", event.small).set("filterCard", event.filterCard).set("type", "compare").set("ai", event.ai).set("source", player).aiCard = function (target) {
var hs = target.getCards("h");
var event = _status.event;
const evt = get.event().getParent("chooseToComapre");
let hs = target.getCards(evt.position).filter(card => evt.filterCard(card, player, evt)),
event = _status.event;
event.player = target;
hs.sort((a, b) => event.ai(b) - event.ai(a));
delete event.player;
Expand Down Expand Up @@ -6848,7 +6831,7 @@ player.removeVirtualEquip(card);
async (event, trigger, player) => {
const target = event.target;
if (get.itemtype(target) == "player" && (event.card2.number >= 10 || event.card2.number <= 4)) {
if (target.countCards("h") > 2) {
if (target.getCards("h").filter(card => event.filterCard(card)).length > 2) {
event.addToAI = true;
}
}
Expand Down
52 changes: 44 additions & 8 deletions noname/library/element/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -2977,18 +2977,52 @@ export class Player extends HTMLDivElement {
}
/**
* 返回玩家是否可以与target拼点
* @param { Player } target
* @param { boolean } [goon] 忽略玩家的手牌不足以拼点
* @param { boolean} [bool] 忽略target的手牌不足以拼点
* @param { Player|string|Array } target或targets或"cardPile"
* @param { boolean } [goon] 忽略玩家的手牌不足以拼点以及mod导致的不能拼点
* @param { boolean} [bool] 忽略target的手牌不足以拼点以及mod导致的不能拼点
* @param { string } [position = "h"] 可用于拼点的区域
* @param { string|GameEvent } [event = "everything"] 拼点事件(名)
* @returns { boolean }
*/
canCompare(target, goon, bool) {
if (this == target) {
return false;
canCompare(target, goon, bool, position = "h", event = "everything") {
if (get.itemtype(target) == "player") {
if (this == target) {
return false;
}
target = [target];
}
if ((!this.countCards("h") && goon !== true) || (!target.countCards("h") && bool !== true)) {
if (this.hasSkillTag("noCompareSource") || (target !== "cardPile" && target.some(current => current.hasSkillTag("noCompareTarget")))) {
return false;
}
if (this.hasSkillTag("noCompareSource") || target.hasSkillTag("noCompareTarget")) {
const check = current => {
//Goon or Bool = gb
const gb = current == this ? goon : bool;
if (gb) {
return true;
}
if (get.itemtype(event) == "event" && event.name == "chooseToCompare") {
if (event.fixedResult?.[current.playerid]) {
return true;
}
}
if (!current.countCards(position)) {
return false;
}
const skills = current
.getSkills()
.filter(sk => !current.isTempBanned(sk))
.concat(lib.skill.global);
game.expandSkills(skills);
if (skills.some(skill => get.info(skill)?.onCompare)) {
return true;
}
return Boolean(current.countCards(position, card => lib.filter.canBeCompared(card, current, event)) || gb);
};
if (target == "cardPile") {
return check(this);
}
const list = target.map(current => check(current));
if (list.some(item => !item)) {
return false;
}
return true;
Expand Down Expand Up @@ -5711,6 +5745,8 @@ export class Player extends HTMLDivElement {
chooseToCompare(target, check) {
var next = game.createEvent("chooseToCompare");
next.player = this;
next.filterCard = lib.filter.canBeCompared;
next.position = "h";
if (Array.isArray(target)) {
next.targets = target;
if (check) {
Expand Down
Loading