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

This commit is contained in:
nonameShijian 2024-05-21 11:15:57 +08:00 committed by GitHub
commit bd5dd9db34
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
55 changed files with 1741 additions and 679 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/skill/tianjie3.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2413,7 +2413,7 @@ const skills = {
},
},
tianjie: {
audio: 2,
audio: 3,
trigger: { global: "phaseEnd" },
direct: true,
filter(event, player) {
@ -3751,7 +3751,7 @@ const skills = {
var str = "";
if (unfinished.length) str += "<li>未获得:" + get.translation(unfinished) + "<br>";
if (finished.length) str += "<li>已获得过:" + get.translation(finished) + "<br>";
str += "<li>锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜〗,则当你成为自己使用的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。";
str += "<li>锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜〗,则当你成为自己使用的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。";
return str;
},
},
@ -6394,7 +6394,7 @@ const skills = {
player.loseMaxHp();
player.addSkills("jilue");
},
derivation: ["jilue", "reguicai", "fangzhu", "rejizhi", "rezhiheng", "rewansha"],
derivation: ["jilue", "jilue_guicai", "jilue_fangzhu", "jilue_jizhi", "jilue_zhiheng", "jilue_wansha"],
ai: {
combo: "renjie",
},
@ -6505,8 +6505,7 @@ const skills = {
},
},
jilue_wansha: {
audio: "wansha",
audioname: ["shen_simayi"],
audio: 1,
enable: "phaseUse",
usable: 1,
filter(event, player) {

View File

@ -81,6 +81,11 @@ const translates = {
jilue_wansha: "完杀",
jilue_zhiheng: "制衡",
jilue_jizhi: "集智",
jilue_guicai_info: "在任意角色的判定牌生效前,你可以打出一张牌代替之。",
jilue_fangzhu_info: "当你受到伤害后你可令一名其他角色摸X张牌X为你已损失的体力值然后该角色将武将牌翻面。",
jilue_wansha_info: "锁定技。①你的回合内,不处于濒死状态的其他角色不能使用【桃】。②当有角色于你的回合内进入濒死状态时,你令其以外的所有其他角色的非锁定技失效直到此濒死状态结算结束。",
jilue_zhiheng_info: "出牌阶段限一次,你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。",
jilue_jizhi_info: "当你使用锦囊牌时,你可以摸一张牌。若此牌为基本牌,则你可以弃置之,然后令本回合手牌上限+1。",
lianpo: "连破",
lianpo_info: "一名角色的回合结束时,若你本回合内杀死过角色,则你可以进行一个额外的回合。",
guixin: "归心",
@ -235,7 +240,7 @@ const translates = {
dili_jiaohui: "交辉",
dili_jiaohui_info: "锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗且你的手牌数为1则此牌的牌名视为【远交近攻】。",
dili_yuanlv: "渊虑",
dili_yuanlv_info: "锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜〗,则当你成为自己使用的不为【长安大舰】的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。",
dili_yuanlv_info: "锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜〗,则当你成为自己使用的不为【长安大舰】的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。",
changandajian_equip1: "长安大舰",
changandajian_equip2: "长安大舰",
changandajian_equip3: "长安大舰",

View File

@ -48,8 +48,9 @@ export default {
"#sijun2": "吾以此身为药,欲医天下之疾。",
"#sanshou1": "三公既现,领大道而立黄天。",
"#sanshou2": "天地三才,载厚德以驱魍魉。",
"#tianjie1": "苍天既死,贫道当替天行道。",
"#tianjie2": "贫道张角,请大汉赴死!",
"#tianjie1": "苍天既死,贫道当替天行道!",
"#tianjie2": "朱紫庸,肉食鄙,吾当代天伐之!",
"#tianjie3": "贫道张角,请大汉赴死!",
"#shen_zhangjiao:die": "诸君唤我为贼,然我所窃何物?",
"#shencai1": "我有三千炼狱,待汝万世轮回!",
"#shencai2": "纵汝王侯将相,亦须俯首待裁!",
@ -207,8 +208,7 @@ export default {
"#shenzhu2": "箭既已在弦上,吾又岂能不发!",
"#jilue_guicai1": "老夫,即是天命!",
"#jilue_fangzhu1": "赦你死罪,你去吧!",
"#wansha_shen_simayi1": "天要亡你,谁人能救?",
"#wansha_shen_simayi2": "天要亡你,谁人能救?",
"#jilue_wansha1": "天要亡你,谁人能救?",
"#jilue_zhiheng1": "天之道,轮回也。",
"#jilue_jizhi1": "顺应天意,得道多助。",
"#wushuang_shen_lvbu1": "燎原千里,凶名远扬!",

View File

@ -584,12 +584,6 @@ export default {
"#jixi_re_dengai2": "奇兵正攻,敌何能为?",
"#drlt_qingce1": "感明帝之恩,清君侧之贼。",
"#drlt_qingce2": "得太后手诏,清奸佞乱臣。",
"#reyingzi_re_heqi1": "人靠衣装马靠鞍!",
"#reyingzi_re_heqi2": "人靠衣装马靠鞍!",
"#qixi_re_heqi1": "可真是一把好刀啊!",
"#qixi_re_heqi2": "可真是一把好刀啊!",
"#xuanfeng_re_heqi1": "我的船队,要让全建业城的人都看见!",
"#xuanfeng_re_heqi2": "我的船队,要让全建业城的人都看见!",
"#jingong1": "若无老夫之谋,尔等皆化为腐土也。",
"#jingong2": "董贼旧部,可尽诛之!",
"#jijiang1_re_liushan1": "还望诸卿勠力同心,以保国祚。",

View File

@ -1102,8 +1102,24 @@ window.noname_character_rank = {
"ol_wangyi",
"chengji",
"mb_sp_guanqiujian",
"std_sunhao",
"std_chengpu",
"std_mayunlu",
"std_jianggan",
"std_zhouchu",
"std_lvlingqi",
"std_dc_luotong",
"std_db_wenyang",
"std_zhangyì",
"std_chengyu",
"std_fanyufeng",
"std_feiyi",
],
b: [
"std_dc_yanghu",
"std_re_dengzhi",
"std_mateng",
"std_lijue",
"junk_guanyu",
"liyi",
"diy_feishi",
@ -2223,6 +2239,18 @@ window.noname_character_rank = {
"star_sunjian",
],
rare: [
"std_sunhao",
"std_chengpu",
"std_mayunlu",
"std_jianggan",
"std_zhouchu",
"std_lvlingqi",
"std_dc_luotong",
"std_db_wenyang",
"std_zhangyì",
"std_chengyu",
"std_fanyufeng",
"std_feiyi",
"linghuyu",
"yj_simafu",
"yj_xuangongzhu",

View File

@ -5359,7 +5359,8 @@ const skills = {
//贾诩
rewansha: {
audio: "wansha",
audioname: ["re_jiaxu", "shen_simayi", "boss_lvbu3"],
audioname: ["re_jiaxu", "boss_lvbu3"],
audioname2: { shen_simayi: "jilue_wansha" },
global: "rewansha_global",
trigger: { global: "dyingBegin" },
forced: true,
@ -9406,7 +9407,8 @@ const skills = {
},
rexuanfeng: {
audio: "xuanfeng",
audioname: ["boss_lvbu3", "re_heqi", "re_lingtong"],
audioname: ["boss_lvbu3", "re_lingtong"],
audioname2: { re_heqi: "fenwei_heqi" },
trigger: {
player: ["loseAfter", "phaseDiscardEnd"],
global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
@ -13833,8 +13835,12 @@ const skills = {
},
reyingzi: {
audio: 2,
audioname: ["heqi", "sunce", "gexuan", "re_sunben", "re_sunce", "re_heqi"],
audioname2: { re_sunyi: "reyingzi_re_sunyi" },
audioname: ["sunce", "gexuan", "re_sunben", "re_sunce"],
audioname2: {
re_sunyi: "reyingzi_re_sunyi",
heqi: "reyingzi_heqi",
re_heqi: "reyingzi_heqi"
},
trigger: { player: "phaseDrawBegin2" },
forced: true,
preHidden: true,
@ -14788,7 +14794,7 @@ const skills = {
skillAnimation: true,
animationColor: "wood",
audio: 2,
audioname: ["heqi"],
audioname2: { heqi: "fenwei_heqi" },
unique: true,
mark: true,
limited: true,

File diff suppressed because it is too large Load Diff

View File

@ -11,10 +11,10 @@ const characterReplaces = {
gaolan: ["gaolan", "dc_gaolan", "sp_gaolan"],
cuiyan: ["cuiyan", "sp_cuiyan"],
wujing: ["wujing", "tw_wujing"],
zhouchu: ["jin_zhouchu", "zhouchu", "tw_zhouchu"],
zhouchu: ["jin_zhouchu", "zhouchu", "tw_zhouchu", "std_zhouchu"],
liuzhang: ["liuzhang", "tw_liuzhang"],
chenzhen: ["sp_chenzhen", "tw_chenzhen"],
feiyi: ["ol_feiyi", "feiyi", "tw_feiyi"],
feiyi: ["ol_feiyi", "feiyi", "tw_feiyi", "std_feiyi"],
wangling: ["dc_wangling", "wangling", "tw_wangling", "clan_wangling"],
qiaogong: ["qiaogong", "tw_qiaogong"],
sp_chendong: ["sp_chendong", "tw_chendong", "chendong"],

View File

@ -23,15 +23,15 @@ const characterReplaces = {
huaxin: ["ol_huaxin", "huaxin", "sp_huaxin"],
xujing: ["xujing", "dc_xujing", "sp_xujing", "tw_xujing"],
zhaoxiang: ["zhaoxiang", "dc_zhaoxiang", "tw_zhaoxiang"],
dengzhi: ["ol_dengzhi", "re_dengzhi", "dengzhi", "tw_dengzhi"],
dengzhi: ["ol_dengzhi", "re_dengzhi", "dengzhi", "tw_dengzhi", "std_re_dengzhi"],
wangrong: ["ol_wangrong", "wangrong"],
zongyu: ["zongyu", "sp_zongyu", "tw_zongyu"],
ol_dongzhao: ["ol_dongzhao", "dc_dongzhao", "tw_dongzhao"],
mayunlu: ["mayunlu", "tw_mayunlu"],
mayunlu: ["mayunlu", "tw_mayunlu", "std_mayunlu"],
zhuling: ["ol_zhuling", "dc_zhuling", "zhuling"],
zangba: ["zangba", "tw_zangba"],
zhangbao: ["zhangbao", "re_zhangbao"],
jianggan: ["jianggan", "sp_jianggan"],
jianggan: ["jianggan", "sp_jianggan", "std_jianggan"],
dc_jiben: ["dc_jiben", "sp_jiben"],
yangyi: ["ol_yangyi", "yangyi", "tw_yangyi"],
tianyu: ["tianyu", "tw_tianyu"],
@ -45,7 +45,7 @@ const characterReplaces = {
zhugeguo: ["zhugeguo", "tw_zhugeguo"],
wanglang: ["ol_wanglang", "wanglang", "old_wanglang"],
tengfanglan: ["tengfanglan", "dc_tengfanglan"],
zhangyì: ["ol_zhangyì", "zhangyì"],
zhangyì: ["ol_zhangyì", "zhangyì", "std_zhangyì"],
yuantanyuanshang: ["yuantanyuanshang", "yuantanyuanxiyuanshang"],
ruiji: ["ruiji", "dc_ruiji"],
jsp_huangyueying: ["jsp_huangyueying", "re_jsp_huangyueying"],

View File

@ -7440,6 +7440,10 @@ const skills = {
},
derivation: ["reduanbing", "reyingzi", "fenwei", "lanjiang"],
},
duanbing_heqi: { audio: 1 },
reyingzi_heqi: { audio: 1 },
fenwei_heqi: { audio: 1 },
lanjiang_heqi: { audio: 1 },
olshanxi: {
audio: "shanxi",
enable: "phaseUse",
@ -12270,8 +12274,8 @@ const skills = {
//吾彦
lanjiang: {
audio: 2,
audioname2: { heqi: "lanjiang_heqi" },
trigger: { player: "phaseJieshuBegin" },
audioname: ["heqi"],
content: function () {
"step 0";
var ph = player.countCards("h");
@ -14640,8 +14644,8 @@ const skills = {
},
//新丁奉
reduanbing: {
audio: 2,
audioname: ["heqi"],
audio: "duanbing",
audioname2: { heqi: "duanbing_heqi" },
trigger: { player: "useCard2" },
filter: function (event, player) {
if (event.card.name != "sha") return false;
@ -19262,7 +19266,7 @@ const skills = {
},
duanbing: {
audio: 2,
audioname: ["heqi"],
audioname2: { heqi: "duanbing_heqi" },
trigger: { player: "useCard2" },
filter: function (event, player) {
if (event.card.name != "sha") return false;

View File

@ -1015,7 +1015,7 @@ const translates = {
olfeibai: "飞白",
olfeibai_info: "转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1当你因执行你使用的非红色牌的效果而回复体力时此回复值+1。",
olqizhou: "绮冑",
olqizhou_info: "锁定技。每个回合开始前,或当你装备区内的牌发生变化后,你失去所有因此技能获得过的额外技能,然后根据你装备区内的花色数获得对应的技能。至少一种:〖短兵〗、至少两种:〖英姿〗、至少三种:〖奋威〗、至少四种:〖澜〗。",
olqizhou_info: "锁定技。每个回合开始前,或当你装备区内的牌发生变化后,你失去所有因此技能获得过的额外技能,然后根据你装备区内的花色数获得对应的技能。至少一种:〖短兵〗、至少两种:〖英姿〗、至少三种:〖奋威〗、至少四种:〖澜〗。",
olshanxi: "闪袭",
olshanxi_info: "出牌阶段限一次。你可以选择一名攻击范围内不包含你的其他角色展示你与其的至多X张手牌X为你的空装备栏数。若这些牌中有【闪】则你弃置这些【闪】然后获得对方的一张未展示的牌。",
macheng: "马承",

View File

@ -744,12 +744,10 @@ export default {
"#dangxian_guansuo2": "各位将军,且让小辈先行出战!",
"#zhiman_guansuo1": "蛮夷可抚,不可剿!",
"#zhiman_guansuo2": "蛮夷可抚,不可剿!",
"#duanbing_heqi1": "可真是一把好刀啊!",
"#duanbing_heqi2": "可真是一把好刀啊!",
"#duanbing_heqi1": "可真是把好刀啊!",
"#reyingzi_heqi1": "人靠衣装马靠鞍!",
"#reyingzi_heqi2": "人靠衣装马靠鞍!",
"#fenwei_heqi1": "我的船队,要让全建业城的人都看见!",
"#fenwei_heqi2": "我的船队,要让全建业城的人都看见!",
"#fenwei_heqi1": "我的船队,要让全建业城都看见!",
"#lanjiang_heqi1": "大江惊澜,浪涌四极之疆!",
"#duanbing1": "众将官,短刀出鞘。",
"#duanbing2": "短兵轻甲也可取汝性命!",
"#jingong1": "若无老夫之谋,尔等皆化为腐土也。",
@ -760,11 +758,11 @@ export default {
"#oltuishi2": "老革荒悖,可复道邪?",
"#nzry_cunmu_ol_pengyang1": "腹有锦绣千里,奈何偏居一隅。",
"#nzry_cunmu_ol_pengyang2": "心大志广之人,必难以保安。",
"#ol_pengyang:die": "羕酒后失言,主公勿怪",
"#ol_pengyang:die": "羕酒后失言,主公勿怪……",
"#olyicheng1": "改帜易土,当奉玄德公为汝南之主。",
"#olyicheng2": "地无常主,人有恒志,其择木而栖。",
"#ol_liupi:die": "玄德公速行,曹军某自当之",
"#ol_liupi:die": "玄德公速行,曹军某自当之……",
"#olpijing1": "今青锋在手,必破敌军于域外。",
"#olpijing2": "荆楚多锦绣,安能丧于小儿之手!",
"#liupan:die": "今袍泽离散,无以为战",
"#liupan:die": "今袍泽离散,无以为战……",
};

View File

@ -1,5 +1,5 @@
const characterReplaces = {
lijue: ["lijue", "ns_lijue"],
lijue: ["lijue", "ns_lijue", "std_lijue"],
fanchou: ["fanchou", "tw_fanchou", "ns_fanchou"],
zhangji: ["zhangji", "ns_zhangji"],
zhangchangpu: ["ol_zhangchangpu", "zhangchangpu", "sp_zhangchangpu"],

View File

@ -409,5 +409,5 @@ export default {
"#starruijun2": "士如钢锋,可破三属之甲。",
"#stargangyi1": "不见狼居胥,何妨马革裹尸。",
"#stargangyi2": "既无功,不受禄。",
"#star_sunjian:die": "身怀宝器,必受群狼觊觎",
"#star_sunjian:die": "身怀宝器,必受群狼觊觎……",
};

View File

@ -32,6 +32,23 @@ const characters = {
xf_yiji: ["male", "shu", 3, ["xinfu_jijie", "xinfu_jiyuan"], []],
re_yuanshu: ["male", "qun", 4, ["rewangzun", "retongji"]],
std_sunhao: ["male", "wu", 5, ["stdcanshi", "chouhai", "guiming"], ["zhu"]],
std_mateng: ["male", "qun", 4, ["stdxiongyi", "mashu", "stdyouji"], ["zhu"]],
std_mayunlu: ["female", "shu", 4, ["stdfengpo", "mashu"]],
std_jianggan: ["male", "wei", 3, ["stddaoshu", "stddaizui"]],
std_zhouchu: ["male", "wu", 4, ["stdxiongxia"]],
std_lvlingqi: ["female", "qun", 4, ["stdhuizhan"]],
std_dc_yanghu: ["male", "wei", 4, ["stdmingfa"]],
std_dc_luotong: ["male", "wu", 3, ["stdjinjian", "stdrenzheng"]],
std_lijue: ["male", "qun", 5, ["stdxiongsuan"]],
std_chengpu: ["male", "wu", 4, ["stdchunlao"]],
std_db_wenyang: ["male", "wei", 4, ["stdquedi"]],
std_re_dengzhi: ["male", "shu", 3, ["stdzhiyinmeng", "stdhehe"]],
std_zhangyì: ["male", "shu", 4, ["stdzhiyi"]],
std_chengyu: ["male", "wei", 3, ["stdshefu", "stdyibing"]],
std_fanyufeng: ["female", "qun", 3, ["stdbazhan", "stdzhanying"]],
std_feiyi: ["male", "shu", 3, ["stdtiaohe", "stdqiansu"]],
};
export default characters;

View File

@ -33,6 +33,10 @@ const characterReplaces = {
yuanshu: ["yuanshu", "re_yuanshu", "yl_yuanshu", "old_yuanshu", "ol_yuanshu", "star_yuanshu"],
gongsunzan: ["gongsunzan", "re_gongsunzan", "dc_gongsunzan", "xin_gongsunzan"],
re_lidian: ["re_lidian", "old_re_lidian", "junk_lidian"],
sunhao: ["sunhao", "std_sunhao"],
lvlingqi: ["lvlingqi", "std_lvlingqi"],
chengyu: ["chengyu", "std_chengyu"],
fanyufeng: ["fanyufeng", "std_fanyufeng"],
};
export default characterReplaces;

View File

@ -2,6 +2,974 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
//2024标包武将
//孙皓
stdcanshi: {
audio: "canshi",
inherit: "canshi",
forced: true,
async content(event, trigger, player) {
trigger.changeToZero();
await player.draw(
Math.max(
1,
game.countPlayer(target => {
if (player.hasSkill("guiming") && target != player && target.group == "wu") return true;
return target.isDamaged();
})
)
);
player.addTempSkill("stdcanshi_effect");
},
subSkill: {
effect: {
charlotte: true,
trigger: { player: "useCardToPlayered" },
filter(event, player) {
if (event.card.name != "sha" && get.type(event.card) != "trick") return false;
return event.target.isDamaged();
},
forced: true,
autodelay: true,
content() {
player.chooseToDiscard("he", true);
},
},
},
},
//马腾
stdxiongyi: {
unique: true,
limited: true,
audio: "xiongyi",
filterTarget: true,
selectTarget: [1, Infinity],
skillAnimation: true,
animationColor: "thunder",
async content(event, trigger, player) {
player.awakenSkill("stdxiongyi");
const targets = event.targets.sortBySeat();
let keep = true;
while (true) {
for (const target of targets) {
let next = target
.chooseToUse(function (card) {
const event = get.event();
if (!lib.filter.cardEnabled(card, event.player, event)) return false;
return get.name(card) == "sha";
}, "雄异:是否使用一张不可被响应的【杀】?")
.set("oncard", card => {
_status.event.directHit.addArray(game.players);
});
if (!keep) next.set("prompt2", "若你不使用,则结束此流程");
const result = await next.forResult();
if (!result.bool && !keep) break;
if (targets[targets.length - 1] == target && !keep) keep = true;
}
}
},
ai: {
order: 10,
result: {
target(player, target) {
if (player.hasUnknown()) return 0;
return target.countCards("hs");
},
},
},
},
stdyouji: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
filter(event, player) {
return player.canMoveCard(
null,
true,
game.filterPlayer(i => {
return i.group == "qun";
}),
card => {
return [3, 4, 6].includes(parseInt(get.subtype(card).slice("equip".length)));
},
"nojudge"
);
},
direct: true,
zhuSkill: true,
content() {
player
.moveCard(
true,
game.filterPlayer(i => {
return i.group == "qun";
}),
card => {
return [3, 4, 6].includes(parseInt(get.subtype(card).slice("equip".length)));
}
)
.set("prompt", get.prompt2("stdyouji"))
.set("nojudge", true)
.set("logSkill", "stdyouji");
},
},
//马云禄
stdfengpo: {
audio: "fengpo",
trigger: { source: "damageBegin1" },
filter(event, player) {
return (
event.card.name == "sha" &&
[player, event.player].some(target => {
return target.isIn() && target.countCards("he");
})
);
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(get.prompt2("stdfengpo"), (card, player, target) => {
const event = get.event().getTrigger();
return [player, event.player]
.filter(targetx => {
return targetx.isIn() && targetx.countCards("he");
})
.includes(target);
})
.set("ai", target => {
const player = get.event("player"),
aim = get.event().getTrigger().player;
if (get.attitude(player, aim) > 0 || get.damageEffect(aim, player, player) < 0) return 0;
if (aim.countCards("he")) return -5;
if (player.getDiscardableCards(player, "he").some(card => get.suit(card) == "diamond")) return 1;
return 0;
})
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
const result = await player
.discardPlayerCard(target, "he", true)
.set("ai", button => {
const suit = get.suit(button.link);
return (suit == "diamond" ? 5 : 1) * get.value(button.link);
})
.set("prompt", "凤魄:弃置" + (target != player ? get.translation(target) : "") + "一张牌")
.set("prompt2", "若弃置了方片牌,则此伤害+1")
.forResult();
if (result.bool) {
if (result.cards && result.cards.some(i => get.suit(i, target) == "diamond")) {
player.popup("洗具");
trigger.increase("num");
}
}
},
},
//蒋干
stddaoshu: {
audio: "daoshu",
trigger: { global: "phaseZhunbeiBegin" },
filter(event, player) {
return game.hasPlayer(target => {
return target != event.player && target.countCards("h");
});
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(get.prompt2("stddaoshu"), (card, player, target) => {
const event = get.event().getTrigger();
return target != event.player && target.countCards("h");
})
.set("ai", target => {
const player = get.event("player");
return -1 / target.countCards("h");
})
.forResult();
},
async content(event, trigger, player) {
player.tempBanSkill("stddaoshu", "roundStart", false);
const target = event.targets[0];
const result = await player.choosePlayerCard(target, "h", true).forResult();
if (result.bool) {
const cards = result.cards || [];
if (cards.length) {
await player.showCards(cards, get.translation(player) + "发动了【盗书】");
await trigger.player.gain(cards, target, "give");
const suits = cards.reduce((list, card) => {
return list.add(get.suit(card, target));
}, []);
if (suits.length) {
for (const i of [player, trigger.player]) {
i.addTempSkill("stddaoshu_effect");
i.markAuto("stddaoshu_effect", suits);
}
}
}
}
},
subSkill: {
effect: {
charlotte: true,
mod: {
cardEnabled(card, player) {
if (player.getStorage("stddaoshu_effect").includes(get.suit(card))) return false;
},
cardSavable(card, player) {
if (player.getStorage("stddaoshu_effect").includes(get.suit(card))) return false;
},
},
intro: { content: "不能使用$花色的牌" },
},
},
},
stddaizui: {
audio: "spdaizui",
trigger: { player: "damageEnd" },
filter(event, player) {
return player.isTempBanned("stddaoshu");
},
forced: true,
content() {
delete player.storage.temp_ban_stddaoshu;
player.popup("盗书");
game.log(player, "重置了技能", "#g【盗书】");
},
},
//周处
stdxiongxia: {
audio: "xianghai",
enable: "chooseToUse",
filterCard: true,
selectCard: 2,
position: "hes",
viewAs: { name: "juedou" },
viewAsFilter(player) {
if (player.countCards("hes") < 2) return false;
},
check(card) {
if (get.name(card) == "sha") return 4 - get.value(card);
return 7.5 - get.value(card);
},
onuse(links, player) {
player.addTempSkill("stdxiongxia_effect");
},
subSkill: {
effect: {
charlotte: true,
trigger: { player: "useCardAfter" },
filter(event, player) {
return (
event.skill == "stdxiongxia" &&
(event.targets || []).every(target => {
return target.getHistory("damage", evt => {
return evt.card && evt.card == event.card;
}).length;
})
);
},
forced: true,
popup: false,
content() {
player.tempBanSkill("stdxiongxia");
},
},
},
},
//吕玲绮
stdhuizhan: {
audio: "guowu",
trigger: { player: "useCard2" },
filter(event, player) {
if (event.card.name != "sha") return false;
return game.hasPlayer(target => {
return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target) && lib.filter.targetInRange(event.card, player, target);
});
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt2("stdhuizhan"),
(card, player, target) => {
const event = get.event().getTrigger();
return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target) && lib.filter.targetInRange(event.card, player, target);
},
[1, 2]
)
.set("ai", target => {
const player = get.event("player"),
event = get.event().getTrigger();
return get.effect(target, event.card, player);
})
.forResult();
},
async content(event, trigger, player) {
trigger.targets.addArray(event.targets);
player.addTempSkill("stdhuizhan_effect");
trigger.card.stdhuizhan = true;
},
subSkill: {
effect: {
charlotte: true,
trigger: { global: "chooseToUseBegin" },
filter(event, player) {
if (event._stdhuizhan_effect) return false;
const evt = event.getParent(2);
return evt.card && evt.card.stdhuizhan;
},
forced: true,
popup: false,
forceDie: true,
async content(event, trigger, player) {
trigger._stdhuizhan_effect = true;
const targets = trigger
.getParent(2)
.targets.filter(i => {
return i != trigger.player;
})
.sortBySeat();
if (targets.length) {
for (const target of targets) {
const next = target.chooseToUse("挥战:是否替" + get.translation(trigger.player) + "使用一张【闪】?", { name: "shan" });
next.set("ai", () => {
const event = _status.event;
return get.attitude(event.player, event.source) - 2;
});
next.set("skillwarn", "替" + get.translation(player) + "打出一张闪");
next.autochoose = lib.filter.autoRespondShan;
next.set("source", player);
const result = await next.forResult();
if (result.bool) {
trigger.result = { bool: true, card: { name: "shan", isCard: true, cards: result.cards.slice() }, cards: result.cards.slice() };
trigger.responded = true;
trigger.animate = false;
break;
}
}
}
},
},
},
},
//羊祜
stdmingfa: {
audio: "dcmingfa",
enable: "phaseUse",
filter(event, player) {
if (player.hasSkill("stdmingfa_used")) return false;
return game.hasPlayer(target => target.getHp() > 1);
},
filterTarget(card, player, target) {
return target.getHp() > 1;
},
async content(event, trigger, player) {
const target = event.target;
await target.damage();
if (target.isIn()) {
player.addSkill("stdmingfa_used");
player.markAuto("stdmingfa_used", [target]);
}
},
subSkill: {
used: {
charlotte: true,
onremove: true,
trigger: { global: ["dieAfter", "recoverAfter"] },
filter(event, player) {
return player.getStorage("stdmingfa_used").includes(event.player);
},
forced: true,
popup: false,
content() {
player.popup("明伐");
game.log(player, "恢复了技能", "#g【明伐】");
player.removeSkill("stdmingfa_used");
},
},
},
ai: {
order: 10,
result: {
target(player, target) {
return get.sgn(get.attitude(player, target)) * get.damageEffect(target, player, player);
},
},
},
},
//骆统
stdrenzheng: {
audio: "renzheng",
trigger: { global: ["damageCancelled", "damageZero"] },
filter(event, player, name) {
if (!_status.currentPhase || !_status.currentPhase.isIn()) return false;
if (name == "damageCancelled") return true;
return event.change_history.some(i => i < 0);
},
forced: true,
logTarget: () => _status.currentPhase,
content() {
_status.currentPhase.draw();
},
},
stdjinjian: {
audio: "jinjian",
trigger: { source: "damageBegin1" },
logTarget: "player",
filter: function (event, player) {
return !event.stdjinjian_source2 && !player.hasSkill("stdjinjian_source2");
},
prompt2: "令即将对其造成的伤害+1",
check: function (event, player) {
return (
get.attitude(player, event.player) < 0 &&
!event.player.hasSkillTag("filterDamage", null, {
player: player,
card: event.card,
})
);
},
usable: 1,
content: function () {
trigger.stdjinjian_source = true;
trigger.num++;
player.addTempSkill("stdjinjian_source2");
},
group: "stdjinjian_player",
subSkill: {
player: {
audio: "jinjian",
trigger: { player: "damageBegin4" },
filter: function (event, player) {
return !event.stdjinjian_player2 && !player.hasSkill("stdjinjian_player2");
},
prompt2: "令即将受到的伤害-1",
usable: 1,
content: function () {
trigger.stdjinjian_player = true;
trigger.num--;
player.addTempSkill("stdjinjian_player2");
},
},
source2: {
trigger: { source: "damageBegin1" },
forced: true,
charlotte: true,
filter: function (event, player) {
return !event.stdjinjian_source;
},
content: function () {
trigger.num--;
trigger.stdjinjian_source2 = true;
player.removeSkill("stdjinjian_source2");
},
marktext: " -1 ",
intro: {
content: "下次造成的伤害-1",
},
},
player2: {
trigger: { player: "damageBegin3" },
forced: true,
charlotte: true,
filter: function (event, player) {
return !event.stdjinjian_player;
},
content: function () {
trigger.num++;
trigger.stdjinjian_player2 = true;
player.removeSkill("stdjinjian_player2");
},
marktext: " +1 ",
intro: {
content: "下次受到的伤害+1",
},
},
},
ai: {
maixie_defend: true,
threaten: 0.9,
effect: {
target: function (card, player, target) {
if (player.hasSkillTag("jueqing")) return;
if (player._stdjinjian_tmp) return;
const count = player.storage.counttrigger;
if (count && count.stdjinjian_player && count.stdjinjian_player > 0) return;
if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return;
if (get.tag(card, "damage")) {
if (target.hasSkill("stdjinjian_player2")) {
return [1, -2];
} else {
if (get.attitude(player, target) > 0) {
return [0, 0.2];
}
if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) {
var sha = player.getCardUsable({ name: "sha" });
player._stdjinjian_tmp = true;
var num = player.countCards("h", function (card) {
if (card.name == "sha") {
if (sha == 0) {
return false;
} else {
sha--;
}
}
return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0;
});
delete player._stdjinjian_tmp;
if (player.hasSkillTag("damage")) {
num++;
}
if (num < 2) {
return [0, 0.8];
}
}
}
}
},
},
},
},
//李傕
stdxiongsuan: {
audio: "xinfu_langxi",
trigger: { player: "phaseZhunbeiBegin" },
filter(event, player) {
return player.isMaxHp();
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
"请选择【凶算】的目标",
lib.translate.stdxiongsuan_info,
(card, player, target) => {
return target.getHp() == player.getHp();
},
[1, Infinity]
)
.set("ai", target => {
const player = get.event("player");
return get.damageEffect(target, player, player);
})
.forResult();
},
locked: true,
async content(event, trigger, player) {
for (const i of event.targets) {
await i.damage();
}
},
},
//程普
stdchunlao: {
audio: "chunlao",
trigger: { player: "phaseDiscardEnd" },
filter(event, player) {
return (
(event.cards || []).length >= 2 &&
game.hasPlayer(target => {
return target != player && target.countCards("h");
})
);
},
async cost(event, trigger, player) {
const cards = trigger.cards;
event.result = await player
.chooseTarget(get.prompt("stdchunlao"), "用" + get.translation(cards) + "交换一名其他角色的手牌", (card, player, target) => {
return target != player && target.countCards("h");
})
.set("ai", target => {
return get.event("cards").length - target.countCards("h") - 0.5;
})
.set("cards", cards)
.forResult();
},
async content(event, trigger, player) {
const cards = trigger.cards,
target = event.targets[0];
await target.loseToDiscardpile(target.getCards("h"));
await target.gain(cards, "gain2").set("giver", player);
if (player.isDamaged()) {
const bool = await target.chooseBool("是否令" + get.translation(player) + "回复1点体力").forResult("bool");
if (bool) {
target.line(player);
await player.recover();
}
}
},
},
//文鸯
stdquedi: {
audio: "dbquedi",
enable: "chooseToUse",
filterCard: { name: "sha" },
position: "hes",
viewAs: { name: "juedou" },
viewAsFilter(player) {
if (!player.countCards("hes", { name: "sha" })) return false;
},
check(card) {
return 6 - get.value(card);
},
},
//邓芝
//只因盟
stdzhiyinmeng: {
audio: "weimeng",
trigger: { player: "phaseZhunbeiBegin" },
filter(event, player) {
return player.countCards("he");
},
async cost(event, trigger, player) {
event.result = await player
.chooseCardTarget({
prompt: get.prompt2("stdzhiyinmeng"),
filterCard: true,
position: "he",
selectCard: [1, Infinity],
complexCard: true,
complexTarget: true,
complexSelect: true,
ai1(card) {
if (ui.selected.cards.length && card.name != "du") return 0;
if (card.name == "du") return 114514;
return 5 - get.value(card);
},
ai2(target) {
if (!ui.selected.cards.length) return 0;
const player = get.event("player"),
att = get.attitude(player, target);
if (ui.selected.cards[0].name == "du") {
if (!target.hasSkillTag("nodu")) return -att;
return -0.00001 * att;
}
return att;
},
})
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
await player.give(event.cards, target);
await target.chooseToGive("he", [1, Infinity], player);
},
},
stdhehe: {
audio: "jianliang",
trigger: { player: "phaseDrawEnd" },
filter(event, player) {
return game.hasPlayer(target => {
return target != player && target.countCards("h") == player.countCards("h");
});
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt2("stdhehe"),
(card, player, target) => {
return target != player && target.countCards("h") == player.countCards("h");
},
[1, Infinity]
)
.set("ai", target => {
const player = get.event("player");
return get.effect(target, { name: "draw" }, player, player);
});
},
locked: true,
async content(event, trigger, player) {
await game.asyncDraw(event.targets);
await game.asyncDelayx();
},
},
//张翼
stdzhiyi: {
audio: "zhiyi",
trigger: { global: "phaseEnd" },
filter(event, player) {
return player.getHistory("useCard", evt => {
return evt.card.name == "sha";
}).length;
},
forced: true,
async content(event, trigger, player) {
const result = await player.chooseUseTarget("执义:视为使用【杀】,或摸一张牌", { name: "sha" }, false).forResult();
if (!result.bool) await player.draw();
},
},
//大魏汉尼拔
stdshefu: {
audio: "shefu",
trigger: { player: "phaseJieshuBegin" },
filter(event, player) {
return player.countCards("h");
},
async cost(event, trigger, player) {
event.result = await player
.chooseCard(get.prompt("stdshefu"), "将一张手牌置于武将牌上", "h")
.set("ai", card => {
return (
(lib.card.list
.slice()
.map(list => list[2])
.filter(name => {
return card.name == name;
}).length -
1) /
(get.value(card) || 0.5)
);
})
.forResult();
},
content() {
player.addToExpansion(event.cards, player, "giveAuto").gaintag.add("stdshefu");
},
marktext: "伏",
intro: {
markcount: "expansion",
mark(dialog, _, player) {
const cards = player.getExpansions("stdshefu");
if (player.isUnderControl(true) && cards.length) dialog.addAuto(cards);
else return "共有" + get.cnNumber(cards.length) + "张“伏兵”";
},
},
onremove(player, skill) {
const cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
group: "stdshefu_effect",
subSkill: {
effect: {
audio: "shefu",
trigger: { global: "useCard" },
filter(event, player) {
return player.getExpansions("stdshefu").some(card => card.name == event.card.name);
},
async cost(event, trigger, player) {
let result = await player
.chooseButton(["###" + get.prompt("stdshefu") + "###弃置一张同名牌,令此牌无效", player.getExpansions("stdshefu")])
.set("filterButton", button => {
return button.link.name == get.event().getTrigger().card.name;
})
.set("ai", button => {
return get.event("goon") ? 1 : 0;
})
.set("goon", lib.skill.sbkanpo.subSkill.kanpo.check(trigger, player))
.forResult();
if (result.bool && result.links) {
result.cards = result.links.slice();
delete result.links;
}
event.result = result;
},
async content(event, trigger, player) {
await player.loseToDiscardpile(event.cards);
trigger.targets.length = 0;
trigger.all_excluded = true;
},
},
},
},
stdyibing: {
audio: "benyu",
trigger: { global: "dying" },
filter(event, player) {
return event.player != player && event.player.countCards("h");
},
direct: true,
content() {
const target = trigger.player;
player.gainPlayerCard(target, "h", true).set("prompt", get.prompt("stdyibing", target)).logSkill = ["stdyibing", target];
},
},
//樊玉凤
stdbazhan: {
audio: "bazhan",
enable: "phaseUse",
filter(event, player) {
return player.countCards("h") > 0;
},
filterCard: true,
position: "h",
filterTarget(card, player, target) {
return target != player && target.hasSex("male");
},
discard: false,
lose: false,
delay: false,
usable: 1,
check(card) {
if (card.name == "du") return 114514;
return 5 - get.value(card);
},
async content(event, trigger, player) {
const target = event.target;
await player.give(event.cards, target, "visible");
await target
.chooseToGive(
player,
(card, player) => {
return get.type2(card) != get.type2(get.event("cards")[0]);
},
"he"
)
.set("cards", event.cards);
},
ai: {
order: 10,
result: {
target(player, target) {
if (!ui.selected.cards.length) return 0;
const cardxx = ui.selected.cards[0];
if (cardxx.name == "du") return -100;
if (!player.hasSkill("stdzhanying")) return 1;
if (target.countMark("stdzhanying_count") == target.countCards("h") + 1) {
const cards = player.getCards("hs", card => {
return card != cardxx && get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0;
});
if (!cards.length) return 1;
let cardx = cards.filter(card => get.name(card) == "sha");
cardx.sort((a, b) => get.effect(target, b, player, player) - get.effect(target, a, player, player));
cardx = cardx.slice(Math.min(cardx.length, player.getCardUsable("sha")), cardx.length);
cards.removeArray(cardx);
return -cards.reduce((sum, card) => sum + get.effect(target, card, player, player), 0);
}
return 1;
},
},
},
},
stdzhanying: {
audio: "zhanying",
trigger: { global: "damageBegin2" },
filter(event, player) {
if (_status.currentPhase !== player) return false;
return event.player.countCards("h") > event.player.countMark("stdzhanying_count");
},
forced: true,
logTarget: "player",
content() {
trigger.increase("num");
},
global: "stdzhanying_mark",
subSkill: {
count: {
charlotte: true,
onremove: true,
intro: {
markcount: storage => (storage || 0).toString(),
content: "本回合开始时手牌数为#张",
},
},
mark: {
charlotte: true,
trigger: { global: "phaseBegin" },
filter(event, player) {
return event.player.hasSkill("stdzhanying", null, null, false);
},
forced: true,
popup: false,
firstDo: true,
content() {
player.addTempSkill("stdzhanying_count");
player.addMark("stdzhanying_count", player.countCards("h"), false);
},
mod: {
cardEnabled(card, player) {
if (!_status.currentPhase || !_status.currentPhase.hasSkill("stdzhanying")) return;
if (get.color(card) == "red" && player.countMark("stdzhanying_count") < player.countCards("h")) return false;
},
cardSavable(card, player) {
if (!_status.currentPhase || !_status.currentPhase.hasSkill("stdzhanying")) return;
if (get.color(card) == "red" && player.countMark("stdzhanying_count") < player.countCards("h")) return false;
},
},
},
},
},
//F1
stdtiaohe: {
audio: "fyjianyu",
enable: "phaseUse",
filter(event, player) {
return game.hasPlayer(target => {
return target.getDiscardableCards(player, "e").some(card => parseInt(get.subtype(card).slice("equip".length)) <= 2);
});
},
filterTarget(card, player, target) {
if (!ui.selected.targets.length) {
return target.getDiscardableCards(player, "e").some(card => parseInt(get.subtype(card).slice("equip".length)) <= 2);
}
const cards = ui.selected.targets[0]
.getDiscardableCards(player, "e")
.filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2)
.map(card => get.subtype(card));
if (cards.length == 2) {
return target.getDiscardableCards(player, "e").some(card => parseInt(get.subtype(card).slice("equip".length)) <= 2);
}
let Tcards = target
.getDiscardableCards(player, "e")
.filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2)
.map(card => get.subtype(card));
Tcards.removeArray(cards);
return Tcards.length;
},
selectTarget: [1, 2],
complexTarget: true,
multitarget: true,
multiline: true,
async content(event, trigger, player) {
let discardedType = [];
for (let i = 0; i < 2; i++) {
const target = event.targets[i],
other = event.targets[1 - i];
let cards = target
.getDiscardableCards(player, "e")
.filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2)
.map(card => get.subtype(card));
const Tcards = other
.getDiscardableCards(player, "e")
.filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2)
.map(card => get.subtype(card));
cards.removeArray(i == 0 ? (Tcards.length == 2 ? [] : Tcards) : discardedType);
if (!cards.length) continue;
const result = await player
.discardPlayerCard("e", target, true)
.set("filterButton", button => {
return get.event("cards").includes(get.subtype(button.link));
})
.set("cards", cards)
.forResult();
if (result.bool) {
discardedType.addArray(
result.cards.reduce((list, card) => {
return list.add(get.subtype(card));
}, [])
);
}
}
},
ai: {
order: 10,
result: { target: -1 },
},
},
stdqiansu: {
audio: "shengxi_feiyi",
trigger: { target: "useCardToTargeted" },
filter(event, player) {
return get.type2(event.card) == "trick" && !player.countCards("e");
},
frequent: true,
content() {
player.draw();
},
ai: {
effect: {
target(card, player, target) {
if (target.countCards("e")) return;
if (target == player && get.type(card) == "equip" && get.equipValue(card) < 5) return 0;
if (get.type2(card) == "trick") return [1, 2];
},
},
},
},
//标准版甘夫人
stdshushen: {
audio: "shushen",
@ -505,7 +1473,7 @@ const skills = {
: await player.chooseCardButton("遗计:请选择要分配的牌", true, cards, [1, cards.length]).set("ai", () => {
if (ui.selected.buttons.length == 0) return 1;
return 0;
});
});
if (!bool) return;
cards.removeArray(links);
event.togive = links.slice(0);
@ -1449,7 +2417,8 @@ const skills = {
},
qixi: {
audio: 2,
audioname: ["re_ganning", "re_heqi"],
audioname: ["re_ganning"],
audioname2: { re_heqi: "duanbing_heqi" },
enable: "chooseToUse",
filterCard(card) {
return get.color(card) == "black";

View File

@ -3,6 +3,7 @@ const characterSort = {
standard_2013: ["old_re_lidian", "huaxiong", "re_yuanshu"],
standard_2019: ["gongsunzan", "xf_yiji"],
standard_2023: ["std_panfeng", "ganfuren"],
standard_2024: ["std_sunhao", "std_mateng", "std_mayunlu", "std_jianggan", "std_zhouchu", "std_lvlingqi", "std_dc_yanghu", "std_dc_luotong", "std_lijue", "std_chengpu", "std_db_wenyang", "std_re_dengzhi", "std_zhangyì", "std_chengyu", "std_fanyufeng", "std_feiyi"],
};
const characterSortTranslate = {
@ -10,6 +11,7 @@ const characterSortTranslate = {
standard_2013: "2013版标准包",
standard_2019: "2019版标准包",
standard_2023: "2023版标准包",
standard_2024: "2024版标准包",
};
export { characterSort, characterSortTranslate };

View File

@ -179,6 +179,68 @@ const translates = {
stdshushen: "淑慎",
stdshushen_info: "当你回复1点体力时你可以令一名其他角色摸一张牌若其没有手牌则改为摸两张牌。",
old_re_lidian: "李典",
std_sunhao: "孙皓",
std_mateng: "马腾",
std_mayunlu: "马云騄",
std_jianggan: "蒋干",
std_zhouchu: "周处",
std_lvlingqi: "吕玲绮",
std_dc_yanghu: "羊祜",
std_dc_luotong: "骆统",
std_lijue: "李傕",
std_chengpu: "程普",
std_db_wenyang: "文鸯",
std_re_dengzhi: "邓芝",
std_zhangyì: "张翼",
std_chengyu: "程昱",
std_fanyufeng: "樊玉凤",
std_feiyi: "费祎",
stdcanshi: "残蚀",
stdcanshi_info: "锁定技摸牌阶段你改为摸X张牌X为场上的已受伤角色且X至少为1。然后本回合你使用【杀】或普通锦囊牌指定目标后你弃置一张牌。",
stdxiongyi: "雄异",
stdxiongyi_info: "限定技,出牌阶段,你可以选择任意名角色,这些角色依次选择是否使用一张不可被响应的【杀】,然后这些角色重复此流程直至有角色不使用【杀】。",
stdyouji: "游骑",
stdyouji_info: "主公技,准备阶段,你可以移动一名群势力角色的一张坐骑牌。",
stdfengpo: "凤魄",
stdfengpo_info: "当你使用【杀】造成伤害时,你可以弃置你或其的一张牌,若以此法弃置了方片牌,则此伤害+1。",
stddaoshu: "盗书",
stddaoshu_info: "每轮限一次,一名角色的准备阶段,你可以展示除其外一名角色的一张牌,然后令其获得此牌,且你与其本回合不能使用与此牌花色相同的牌。",
stddaizui: "戴罪",
stddaizui_info: "锁定技,当你受到伤害后,你视为本轮未发动过〖盗书〗。",
stdxiongxia: "凶侠",
stdxiongxia_info: "你可以将两张牌当作【决斗】使用。你以此法使用的【决斗】结算完毕后,若所有目标角色都受到了此牌造成的伤害,则〖凶侠〗于本回合失效。",
stdhuizhan: "挥战",
stdhuizhan_info: "你使用【杀】可以额外指定至多两个目标。若如此做,目标角色响应此【杀】时,其他目标角色可以代替其使用【闪】。",
stdmingfa: "明伐",
stdmingfa_info: "出牌阶段你可以对一名体力值大于1的角色造成1点伤害然后此技能失效直至其死亡或回复体力。",
stdjinjian: "进谏",
stdjinjian_info: "每回合每项各限一次,当你造成/受到伤害时,你可令此伤害+1/-1然后你本回合内下一次造成的伤害-1/+1且不能触发〖进谏〗。",
stdrenzheng: "仁政",
stdrenzheng_info: "锁定技,当有伤害被防止时,你令当前回合角色摸一张牌。",
stdxiongsuan: "凶算",
stdxiongsuan_info: "锁定技准备阶段若你的体力值为全场最多则你须对至少一名体力值等于你的角色各造成1点伤害。",
stdchunlao: "醇醪",
stdchunlao_info: "弃牌阶段结束时若你本阶段弃置了不少于两张牌则你可以用这些牌交换一名其他角色的手牌然后其可以令你回复1点体力。",
stdquedi: "却敌",
stdquedi_info: "你可以将【杀】当作【决斗】使用。",
stdzhiyinmeng: "急盟",
stdzhiyinmeng_info: "准备阶段,你可以交给一名其他角色任意张牌,然后其可以交给你任意张牌。",
stdhehe: "和合",
stdhehe_info: "摸牌阶段结束时,你可以令至多两名手牌数与你相同的其他角色各摸一张牌。",
stdzhiyi: "执义",
stdzhiyi_info: "锁定技,一名角色的回合结束时,若你本回合使用过【杀】,则你视为使用【杀】或摸一张牌。",
stdshefu: "设伏",
stdshefu_info: "①结束阶段,你可以将一张手牌称为“伏兵”扣置于武将牌上。②一名角色使用牌时,你可以移去武将牌上的一张与此牌同名的“伏兵”并令此牌无效。",
stdyibing: "益兵",
stdyibing_info: "一名角色进入濒死状态时,你可以获得其一张牌。",
stdbazhan: "把盏",
stdbazhan_info: "出牌阶段限一次,你可以交给一名男性角色一张手牌,然后其可以交给你一张与此牌类别不同的牌。",
stdzhanying: "蘸影",
stdzhanying_info: "锁定技,你的回合内,手牌数比回合开始时多的角色不能使用红色牌且受到的伤害+1。",
stdtiaohe: "调和",
stdtiaohe_info: "出牌阶段限一次,你可以弃置场上的一张装备牌和一张防具牌(不能为同一名角色装备区的牌)。",
stdqiansu: "谦素",
stdqiansu_info: "当你成为锦囊牌的目标后,若你的装备区没有牌,则你可以摸一张牌。",
};
export default translates;

View File

@ -1,6 +1,6 @@
const characterReplaces = {
tw_caocao: ["tw_caocao", "jsrg_caocao", "yj_caocao"],
mateng: ["tw_mateng", "mateng"],
mateng: ["tw_mateng", "mateng", "std_mateng"],
xiahouen: ["tw_xiahouen", "jsrg_xiahouen"],
jiangji: ["dc_jiangji", "tw_jiangji", "jiangji"],
baoxin: ["tw_baoxin", "baoxin"],

View File

@ -1,11 +1,11 @@
const characterReplaces = {
wenyang: ["wenyang", "db_wenyang", "diy_wenyang"],
wenyang: ["wenyang", "db_wenyang", "diy_wenyang", "std_db_wenyang"],
gexuan: ["gexuan", "tw_gexuan"],
panshu: ["panshu", "re_panshu"],
yangwan: ["yangwan", "sp_yangwan"],
sunyi: ["re_sunyi", "sunyi", "tw_sunyi"],
fengfangnv: ["fengfangnv", "re_fengfangnv"],
luotong: ["dc_luotong", "luotong"],
luotong: ["dc_luotong", "luotong", "std_dc_luotong"],
dc_wangchang: ["dc_wangchang", "tw_wangchang"],
guozhao: ["guozhao", "xin_guozhao", "jsrg_guozhao"],
dingshangwan: ["dingshangwan", "ol_dingshangwan"],

View File

@ -18,7 +18,7 @@ const characterReplaces = {
liaohua: ["liaohua", "re_liaohua", "xin_liaohua"],
bulianshi: ["bulianshi", "dc_bulianshi", "re_bulianshi", "old_bulianshi"],
handang: ["handang", "xin_handang", "re_handang", "tw_handang", "old_handang"],
chengpu: ["chengpu", "ol_chengpu", "re_chengpu", "xin_chengpu", "tw_chengpu", "ns_chengpu"],
chengpu: ["chengpu", "ol_chengpu", "re_chengpu", "xin_chengpu", "tw_chengpu", "ns_chengpu", "std_chengpu"],
liubiao: ["liubiao", "xin_liubiao", "re_liubiao", "sb_liubiao", "oldre_liubiao", "old_liubiao"],
manchong: ["manchong", "re_manchong"],
caochong: ["caochong", "re_caochong", "old_caochong"],

View File

@ -13505,7 +13505,8 @@ const skills = {
},
xuanfeng: {
audio: 2,
audioname: ["boss_lvbu3", "re_heqi"],
audioname: ["boss_lvbu3"],
audioname2: { re_heqi: "fenwei_heqi" },
trigger: {
player: ["loseAfter", "phaseDiscardEnd"],
global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],

View File

@ -1,5 +1,5 @@
const characterReplaces = {
yanghu: ["jin_yanghu", "dc_yanghu", "sp_yanghu"],
yanghu: ["jin_yanghu", "dc_yanghu", "sp_yanghu", "std_dc_yanghu"],
jiachong: ["dc_jiachong", "jin_jiachong", "jiachong"],
yangyan: ["yangyan", "old_yangyan"],
yangzhi: ["yangzhi", "old_yangzhi"],

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -3366,6 +3366,21 @@ export class Click {
const voiceMap = game.parseSkillText(skill, name, null, true);
if(voiceMap.length) skillAudioMap.set(skill, voiceMap);
});
const derivationSkillAudioMap = new Map();
nameinfo.skills.forEach(skill => {
var info = get.info(skill);
if(info.derivation) {
var derivation = info.derivation;
if(typeof derivation == 'string') {
derivation = [derivation];
}
for(var i=0; i<derivation.length; i++) {
if (derivation[i].indexOf('_faq') != -1) continue;
const derivationVoiceMap = game.parseSkillText(derivation[i], name, null, true);
if(derivationVoiceMap.length) derivationSkillAudioMap.set(derivation[i], derivationVoiceMap);
}
}
});
if (dieAudios.length || skillAudioMap.size > 0) {
const eleHr = document.createElement("hr");
eleHr.style.marginTop = "11px";
@ -3391,6 +3406,27 @@ export class Click {
});
});
}
if (derivationSkillAudioMap.size > 0) {
const derivationSkillNameSpan = document.createElement("span");
derivationSkillNameSpan.style.lineHeight = "1.7";
derivationSkillNameSpan.innerHTML = `• 衍生技能台词<br>`;
intro.appendChild(derivationSkillNameSpan);
derivationSkillAudioMap.forEach((texts, skill) => {
const derivationSkillNameSpan1 = document.createElement("span"),
derivationSkillNameSpanStyle1 = derivationSkillNameSpan1.style;
derivationSkillNameSpanStyle1.fontWeight = "bold";
derivationSkillNameSpanStyle1.fontSize = "15.7px";
derivationSkillNameSpanStyle1.lineHeight = "1.4";
derivationSkillNameSpan1.innerHTML = `${get.translation(skill)}<br>`;
intro.appendChild(derivationSkillNameSpan1);
texts.forEach((text, index) => {
const derivationSkillTextSpan = document.createElement("span");
derivationSkillTextSpan.style.fontSize = "15.2px";
derivationSkillTextSpan.innerHTML = `${texts.length > 1 ? `${index + 1}. ` : ""}${text}<br>`;
intro.appendChild(derivationSkillTextSpan);
});
});
}
if (dieAudios.length > 0) {
const skillNameSpan2 = document.createElement("span"),
skillNameSpanStyle2 = skillNameSpan2.style;
@ -3683,6 +3719,21 @@ export class Click {
const voiceMap = game.parseSkillText(skill, name, null, true);
if(voiceMap.length) skillAudioMap.set(skill, voiceMap);
});
const derivationSkillAudioMap = new Map();
nameInfo.skills.forEach(skill => {
var info = get.info(skill);
if(info.derivation) {
var derivation = info.derivation;
if(typeof derivation == 'string') {
derivation = [derivation];
}
for(var i=0; i<derivation.length; i++) {
if (derivation[i].indexOf('_faq') != -1) continue;
const derivationVoiceMap = game.parseSkillText(derivation[i], name, null, true);
if(derivationVoiceMap.length) derivationSkillAudioMap.set(derivation[i], derivationVoiceMap);
}
}
});
if (dieAudios.length || skillAudioMap.size > 0) {
introduction.appendChild(document.createElement("hr"));
@ -3705,6 +3756,24 @@ export class Click {
});
}
if (derivationSkillAudioMap.size > 0) {
const derivationSkillNameSpan = document.createElement("span");
derivationSkillNameSpan.innerHTML = `<br>衍生技能台词<br>`;
introduction.appendChild(derivationSkillNameSpan);
derivationSkillAudioMap.forEach((texts, skill) => {
const derivationSkillNameSpan1 = document.createElement("span"),
derivationSkillNameSpanStyle1 = derivationSkillNameSpan1.style;
derivationSkillNameSpanStyle1.fontWeight = "bold";
derivationSkillNameSpan1.innerHTML = `<br>${get.translation(skill)}<br>`;
introduction.appendChild(derivationSkillNameSpan1);
texts.forEach((text, index) => {
const derivationSkillTextSpan = document.createElement("span");
derivationSkillTextSpan.innerHTML = `${texts.length > 1 ? `${index + 1}. ` : ""}${text}<br>`;
introduction.appendChild(derivationSkillTextSpan);
});
});
}
if (dieAudios.length > 0) {
const skillNameSpan = document.createElement("span"),
skillNameSpanStyle = skillNameSpan.style;