Merge pull request #1384 from mengxinzxz/PR-Branch

线下E系列周姬;bugfix
This commit is contained in:
Spmario233 2024-05-22 22:46:56 +08:00 committed by GitHub
commit a9cfe2c836
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 201 additions and 26 deletions

View File

@ -1,4 +1,5 @@
const characters = {
yj_zhouji: ["female", "wu", 3, ["psyanmou", "pszhanyan", "psyuhuo"]],
drag_guanyu: ["male", "shu", 4, ["dragchaojue", "dragjunshen"]],
drag_caoren: ["male", "wei", 4, ["draglizhong", "dragjuesui"]],
drag_lvchang: ["male", "wei", 3, ["dragjuwu", "dragshouxiang"]],

View File

@ -1,4 +1,5 @@
const characterIntro = {
zhouji: "三国杀集换式卡牌游戏《阵面对决》中的权倾系列卡牌。游卡桌游官方的三国时期女性角色,原型是周妃(又名周彻)。周瑜之女。",
lvchang: "吕常161—221年荆州南阳博望今河南省南阳市方城县博望镇汉末至三国时期曹魏将领。吕常曾担任曹魏横海将军、章陵太守为武猛都尉厉节中郎将裨将军封关内侯。常以中勇显名州司试守雉长执戈秉戎慎守易兵不顿于敌国坠不侵于四邻拜武猛都尉厉节中郎将裨将军封关内侯。王师南征与充军从奄有江汉舍爵册勋封阴德亭侯领郡。鸠集荒散为民统纪三考有成转拜平狄将军改封卢亭侯莅国赋政十有三年。会蜀将关羽猖獗为寇常御之羽不能克。文帝加其庸转拜横海将军徙封西鄂都乡侯食邑并七百户。年六十一黄初二年正月卒。",
huangjinleishi: "黄巾军中负责施法的女祭司二人组。",
longyufei: "《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。",

View File

@ -2,6 +2,175 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
//线下E系列肘击
psyanmou: {
getCards(event, player) {
let cards = [];
if (event.name == "cardsDiscard") {
const evt = event.getParent().relatedEvent;
if (evt && evt.name == "judge" && evt.player == player) {
cards.addArray(event.cards.filter(i => get.position(i, true) == "d"));
}
} else {
if (event.type == "discard" && event.getlx !== false) {
for (const target of game.filterPlayer2()) {
if (target == player) continue;
const evt = event.getl(target);
if (evt && (evt.cards2 || []).length) {
cards.addArray((evt.cards2 || []).filter(i => i.original != "j" && get.position(i, true) == "d"));
}
}
}
}
return cards.filter(card => {
return card.name == "huogong" || (card.name == "sha" && game.hasNature(card, "fire"));
});
},
trigger: { global: ["cardsDiscardAfter", "loseAfter", "loseAsyncAfter"] },
filter(event, player) {
return lib.skill.psyanmou.getCards(event, player).length;
},
prompt2(event, player) {
return "获得" + get.translation(lib.skill.psyanmou.getCards(event, player));
},
frequent: true,
content() {
player.gain(lib.skill.psyanmou.getCards(trigger, player), "gain2");
},
group: "psyanmou_chooseToUse",
subSkill: {
chooseToUse: {
trigger: {
player: "gainAfter",
global: "loseAsyncAfter",
},
filter(event, player) {
return event.getg && event.getg(player).length;
},
forced: true,
locked: false,
async content(event, trigger, player) {
let cards = trigger.getg(player);
await player.showCards(cards, get.translation(player) + "发动了【炎谋】");
cards = cards.filter(card => {
if (!player.hasUseTarget(card)) return false;
return get.name(card) == "huogong" || (get.name(card) == "sha" && game.hasNature(card, "fire"));
});
if (cards.length) {
await player
.chooseToUse(function (card, player, event) {
if (!get.event("cards").includes(card)) return false;
return lib.filter.filterCard.apply(this, arguments);
}, "炎谋:选择使用其中的一张【火攻】或火【杀】")
.set("cards", cards)
.set("filterTarget", function (card, player, target) {
return lib.filter.filterTarget.apply(this, arguments);
})
.set("targetRequired", true)
.set("complexSelect", true)
.set("forced", true)
.set("addCount", false);
}
},
},
},
},
pszhanyan: {
enable: "phaseUse",
filter(event, player) {
return game.hasPlayer(target => player.inRange(target));
},
usable: 1,
delay: 0,
async content(event, trigger, player) {
const targets = game
.filterPlayer(target => {
return player.inRange(target);
})
.sortBySeat();
let damages = 0,
puts = 0;
player.line(targets);
await game.asyncDelay();
for (const target of targets) {
let dialog = ["绽焰将手牌中或弃牌堆中的一张【火攻】或火【杀】置于牌堆顶或受到1点火焰伤害"];
const Tcards = target.getCards("h", card => {
return get.name(card) == "huogong" || (get.name(card) == "sha" && game.hasNature(card, "fire"));
});
const Pcards = Array.from(ui.discardPile.childNodes).filter(card => {
return card.name == "huogong" || (card.name == "sha" && game.hasNature(card, "fire"));
});
if (Tcards.length) {
dialog.push('<div class="text center">手牌区</div>');
dialog.push(Tcards);
}
if (Pcards.length) {
dialog.push('<div class="text center">弃牌堆</div>');
dialog.push(Pcards);
}
let result;
if (Tcards.length + Pcards.length == 0) {
result = { bool: false };
} else {
result = await target
.chooseButton(dialog)
.set("ai", button => {
const player = get.event("player"),
source = get.event().getParent().player;
if (get.damageEffect(source, player, player) <= 0 && get.attitude(player, source) <= 0) return 0;
if (!get.owner(button.link)) return 114514;
return 20 - get.value(button.link);
})
.forResult();
}
if (result.bool) {
puts++;
const card = result.links[0];
target.$throw([card], 1000);
if (get.owner(card)) await get.owner(card).lose([card], ui.special);
else ui.discardPile.removeChild(card);
ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
game.updateRoundNumber();
} else {
damages++;
await target.damage(1, "fire");
}
await game.asyncDelay(0.5);
}
const num = Math.min(damages, puts);
if (num) await player.draw(num);
},
ai: {
order: 9,
result: { player: 1 },
},
},
psyuhuo: {
trigger: { player: "damageBegin4" },
filter(event) {
return event.hasNature("fire");
},
forced: true,
content() {
trigger.cancel();
},
ai: {
nofire: true,
effect: {
target(card, player, target, current) {
if (get.tag(card, "fireDamage")) return "zerotarget";
},
},
},
mod: {
cardDiscardable(card, player, name) {
if (name == "phaseDiscard" && (get.name(card) == "huogong" || (get.name(card) == "sha" && game.hasNature(card, "fire")))) return false;
},
ignoredHandcard(card, player) {
if (get.name(card) == "huogong" || (get.name(card) == "sha" && game.hasNature(card, "fire"))) return true;
},
},
},
//龙起襄樊
//关羽
//界界关羽

View File

@ -4,7 +4,8 @@ const characterSort = {
offline_yijiang: ["ol_xinxianying"],
offline_luanwu: ["ns_lijue", "ns_zhangji", "ns_fanchou"],
offline_yongjian: ["ns_chendao", "yj_caoang", "yj_caocao", "yj_liru", "yj_caohong", "yj_zhangfei", "yongjian_ganning", "yj_dongzhuo", "yj_xuyou", "yj_jiaxu", "yj_zhenji"],
offline_piracyE: ["shen_jiaxu", "pe_wangyun", "pe_zhonghui", "pe_sunchen", "pe_mengda", "pe_wenqin", "ns_caoanmin", "jiangqing", "kongrong", "jiling", "tianfeng", "mateng"],
offline_piracyE_zy: ["shen_jiaxu", "pe_wangyun", "pe_zhonghui", "pe_sunchen", "pe_mengda", "pe_wenqin", "ns_caoanmin", "jiangqing", "kongrong", "jiling", "tianfeng", "mateng"],
offline_piracyE: ["yj_zhouji"],
offline_piracyS: ["ns_jiaxu", "longyufei", "ps_guanyu", "ps1059_guojia", "ps2070_guojia", "ps2063_zhaoyun", "ps2067_zhaoyun", "ps1062_zhouyu", "ps2080_zhouyu", "ps_caozhi", "ps_jin_simayi", "ps_caopi", "ps_simayi", "ps2068_simayi", "ps_machao", "ps_zhugeliang", "ps2066_zhugeliang", "ps_jiaxu", "ps_lvbu", "ps_shen_machao", "jsp_liubei"],
offline_piracyK: ["pk_sp_duyu"],
offline_vtuber: ["vtb_xiaosha", "vtb_xiaoshan", "vtb_xiaotao", "vtb_xiaole", "vtb_xiaojiu"],
@ -20,7 +21,8 @@ const characterSortTranslate = {
offline_yongjian: "用间篇",
offline_yongjian_prefix: "用间",
offline_feihongyingxue: "飞鸿映雪",
offline_piracyE: "官盗E系列·战役篇",
offline_piracyE_zy: "官盗E系列·战役篇",
offline_piracyE: "官盗E系列",
offline_piracyS: "官盗S系列",
offline_vtuber: "天书乱斗·虚拟偶像",
offline_piracyK: "官盗K系列",

View File

@ -418,6 +418,13 @@ const translates = {
dragjuwu_info: "锁定技,攻击范围内至少包含三名角色的角色使用的无属性【杀】对你无效。",
dragshouxiang: "守襄",
dragshouxiang_info: "摸牌阶段你可以额外摸X张牌。若如此做你跳过出牌阶段且本回合的弃牌阶段开始时你可以交给至多X名角色各一张手牌。X为攻击范围内包含你的角色",
yj_zhouji: "周姬", //肘击bushi
psyanmou: "炎谋",
psyanmou_info: "①其他角色的【火攻】或火【杀】因弃置或判定进入弃牌堆后,你可以获得之。②当你得到牌后,你展示得到的牌,然后你使用其中的一张【火攻】或火【杀】。",
pszhanyan: "绽焰",
pszhanyan_info: "出牌阶段限一次你可以令你攻击范围内的所有角色依次选择一项①受到你对其造成的1点火属性伤害②将手牌或弃牌堆中的一张【火攻】或火【杀】置于牌堆顶。然后你摸X张牌X为本次选择次数较小的选项的被选择次数。",
psyuhuo: "驭火",
psyuhuo_info: "锁定技。①防止你受到的火属性伤害。②你的【火攻】和火【杀】不计入手牌上限。",
};
export default translates;

View File

@ -204,7 +204,7 @@ const skills = {
return num + player.countMark("olsbhongtu_limit");
},
},
}
},
},
},
olsbqiwu: {
@ -308,28 +308,21 @@ const skills = {
.forResult();
if (result2.bool) {
const target2 = result2.targets[0];
const sha = new lib.element.VCard({ name: "sha" });
player.line(target2);
if (target.canUse(sha, target2, false)) {
const index = await target
.chooseControl()
.set("choiceList", ["视为对" + get.translation(target2) + "使用一张【杀】", "令" + get.translation(player) + "观看你的手牌并获得你的两张牌"])
.set("ai", () => {
const player = get.event("player"),
target = get.event("target"),
source = get.event("source");
const sha = new lib.element.VCard({ name: "sha" }),
shunshou = new lib.element.VCard({ name: "shunshou_copy2" });
return get.effect(target, sha, player, player) > get.effect(player, shunshou, source, player) * Math.min(2, player.countGainableCards(source, "he")) ? 0 : 1;
})
.set("source", player)
.set("target", target2)
.forResult("index");
if (index == 0) {
await target.useCard(sha, false, target2);
return;
}
}
const result = await target
.chooseToUse(function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
}, "眩惑:对" + get.translation(player) + "使用一张【杀】,或令" + get.translation(player) + "你的手牌并获得你的两张牌")
.set("filterTarget", function (card, player, target) {
if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false;
return lib.filter.targetEnabled.apply(this, arguments);
})
.set("targetRequired", true)
.set("complexSelect", true)
.set("sourcex", target2)
.forResult();
if (result.bool) return;
}
}
await player.gainPlayerCard(target, 2, "he", true, "visible");

View File

@ -81,7 +81,7 @@ const translates = {
ol_fazheng:'OL界法正',
ol_fazheng_prefix:'OL界',
olxuanhuo:'眩惑',
olxuanhuo_info:'摸牌阶段结束时你可以交给一名其他角色两张牌然后其选择一项1.视为对你选择的另一名其他角色使用一张【杀】2.令你观看并获得其两张牌。',
olxuanhuo_info:'摸牌阶段结束时你可以交给一名其他角色两张牌然后其选择一项1.对你选择的另一名其他角色使用一张【杀】2.令你观看并获得其两张牌。',
olenyuan:'恩怨',
olenyuan1:'恩怨',
olenyuan2:'恩怨',

View File

@ -812,6 +812,7 @@ window.noname_character_rank = {
"liubei",
"xf_yiji",
"zhoufei",
"yj_zhouji",
"xunyu",
"kuailiangkuaiyue",
"dianwei",
@ -2458,6 +2459,7 @@ window.noname_character_rank = {
"haozhao",
"zhugezhan",
"zhoufei",
"yj_zhouji",
"lukang",
"guanqiujian",
"re_caocao",

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -7329,7 +7329,7 @@ export class Player extends HTMLDivElement {
subplayer: true,
},
};
lib.character[skill] = [cfg.sex, cfg.group, parseFloat(cfg.hp) + "/" + parseFloat(cfg.maxHp) + "/" + parseFloat(cfg.hujia), cfg.skills, lib.character[cfg.name].trashBin || []];
lib.character[skill] = [cfg.sex, cfg.group, parseFloat(cfg.hp) + "/" + parseFloat(cfg.maxHp) + "/" + parseFloat(cfg.hujia), cfg.skills, ["tempname:" + cfg.name].concat(lib.character[cfg.name].trashBin || [])];
if (Array.isArray(cfg.image)) {
cfg.image.forEach(image => lib.character[skill][4].push(image));
} else if (typeof cfg.image == "string") {