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