diff --git a/card/xianxia.js b/card/xianxia.js index 7e3be20013..a1aacffa52 100644 --- a/card/xianxia.js +++ b/card/xianxia.js @@ -422,6 +422,63 @@ game.import("card", function () { }, }, }, + dajunyajing: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + filterTarget: true, + async content(event, trigger, player) { + const target = event.target; + const targets = game + .filterPlayer(current => { + return current != target; + }) + .sortBySeat(_status.currentPhase); + for (const current of targets) { + if (!target.isIn()) { + return; + } + if (!current.isIn() || !current.countCards("hes") || current.hasSkill("diaohulishan")) { + continue; + } + const next = current.chooseToUse(); + next.set("openskilldialog", `大军压境:是否将一张牌当作【杀】对${get.translation(target)}使用?`); + next.set("norestore", true); + next.set("_backupevent", `dajunyajing_backup`); + next.set("custom", { + add: {}, + replace: { window() {} }, + }); + next.backup(`dajunyajing_backup`); + next.set("targetRequired", true); + next.set("complexSelect", true); + next.set("filterTarget", function (card, player, target) { + const { sourcex } = get.event(); + if (target != sourcex && !ui.selected.targets.includes(sourcex)) { + return false; + } + return lib.filter.targetEnabled.apply(this, arguments); + }); + next.set("sourcex", target); + next.set("addCount", false); + await next; + } + }, + ai: { + order: 6, + value: 12, + useful: 10, + tag: { + damage: 1, + }, + result: { + target(player, target) { + return -1 * (game.countPlayer() - 1); + }, + }, + }, + }, }, skill: { tiejili_skill: { @@ -689,6 +746,20 @@ game.import("card", function () { }, }, }, + dajunyajing_backup: { + filterCard(card) { + return get.itemtype(card) == "card"; + }, + viewAs: { + name: "sha", + }, + selectCard: 1, + position: "hes", + ai1(card) { + return 7 - get.value(card); + }, + log: false, + }, }, translate: { tiejili: "铁蒺藜骨朵", @@ -718,6 +789,8 @@ game.import("card", function () { mengchong_skill_info: "锁定技,当你使用牌结算结束后,你选择与其他角色互相计算距离+1或-1直到你的下个回合开始(至多+2/-2)。", yidugongdu: "以毒攻毒", yidugongdu_info: "出牌阶段,对一名已受伤的角色使用。你观看其所有手牌,然后若你与其手牌中均有【毒】,弃置其中一张【毒】并与其各摸两张牌,否则你与其依次受到1点无来源伤害。", + dajunyajing: "大军压境", + dajunyajing_info: "出牌阶段,对一名角色使用。其以外的所有角色依次选择是否将一张牌当无距离限制的【杀】对其使用。", }, list: [ ["diamond", 6, "suibozhuliu"], diff --git a/character/extra/character.js b/character/extra/character.js index 439dd0f44a..ce53f34207 100644 --- a/character/extra/character.js +++ b/character/extra/character.js @@ -1,4 +1,18 @@ const characters = { + wn_shen_machao: { + sex: "male", + group: "shen", + hp: 5, + skills: ["wn_qiangshu", "wn_yuma"], + groupInGuozhan: "shu", + }, + wn_shen_xuzhu: { + sex: "male", + group: "shen", + hp: 5, + skills: ["wn_zhuanzhan", "wn_huwei"], + groupInGuozhan: "wei", + }, ca_shen_wangyun: { sex: "male", group: "shen", diff --git a/character/extra/skill.js b/character/extra/skill.js index aa0b9dba49..7d79fd8fda 100644 --- a/character/extra/skill.js +++ b/character/extra/skill.js @@ -2,6 +2,173 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //渭南神马超 + wn_qiangshu: { + trigger: { + source: "damageBegin1", + }, + filter(event, player) { + if (!event.card || !["sha", "juedou"].includes(event.card.name)) { + return false; + } + const num = player.getAttackRange() - 1; + return num > 0 && player.countCards("he") >= num; + }, + async cost(event, trigger, player) { + const num = player.getAttackRange() - 1; + event.result = await player + .chooseToDiscard("he", get.prompt2(event.skill), num) + .set("chooseonly", true) + .set("ai", card => { + const trigger = get.event().getTrigger(), + player = get.player(); + if (get.damageEffect(trigger.player, trigger.source, player) <= 0) { + return 0; + } + return 7 - get.value(card); + }) + .forResult(); + event.result.targets = [trigger.player]; + }, + async content(event, trigger, player) { + await player.discard(event.cards); + trigger.num += event.cards.length; + }, + }, + wn_yuma: { + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], + }, + usable: 1, + filter(event, player) { + if (!event.getd || !event.getl) { + return false; + } + let cards = event.getd(); + return cards.some(card => { + if (get.position(card) != "d" || get.type(card) != "equip") { + return false; + } + if (card.willBeDestroyed("discardPile", get.owner(card), event)) { + return false; + } + return game.hasPlayer(current => { + return current.canEquip(card, true); + }); + }); + }, + async cost(event, trigger, player) { + const cards = trigger.getd().filter(card => { + if (get.position(card) != "d" || get.type(card) != "equip") { + return false; + } + if (card.willBeDestroyed("discardPile", get.owner(card), trigger)) { + return false; + } + return true; + }); + const { result: { bool, targets, links } } = await player + .chooseButtonTarget({ + createDialog: [get.prompt2(event.skill), cards], + filterTarget(card, player, target) { + const buttons = ui.selected.buttons; + if (!buttons.length) { + return false; + } + return target.canEquip(buttons[0].link, true); + }, + ai1(button) { + return 20 - get.value(button.link); + }, + ai2(target) { + const player = get.player(); + const card = ui.selected.buttons[0]?.link; + if (!target.countCards("h")) { + return get.value(card, target) * get.attitude(player, target); + } + return (get.value(card, target) - target.countCards("h")) * get.attitude(player, target); + }, + }); + event.result = { + bool: bool, + targets: targets, + cards: links, + }; + }, + async content(event, trigger, player) { + const { targets: [target], cards: [card] } = event; + target.$gain2(card); + await game.delay(); + await target.equip(card); + const num = target.countCards("h"); + if (num > 0 && target != player) { + await player.gainPlayerCard(target, true, "h", num); + } + }, + }, + //渭南神许褚 + wn_zhuanzhan: { + trigger: { + global: "phaseZhunbeiBegin", + }, + filter(event, player) { + if (event.player == player || !player.hasEnabledSlot()) { + return false; + } + const card = new lib.element.VCard({ name: "juedou" }); + return player.canUse(card, event.player); + }, + async cost(event, trigger, player) { + let list = []; + for (let i = 1; i <= 5; i++) { + const slot = `equip${i}`; + if (player.hasEnabledSlot(slot)) { + list.push("equip" + i); + } + } + list.push("cancel2"); + let bool = "cancel2"; + const card = new lib.element.VCard({ name: "juedou" }); + if (get.effect(trigger.player, card, player, player) > 0) { + bool = list.filter(i => i != "cancel2").randomGet(); + } + const result = await player + .chooseControl(list) + .set("prompt", get.prompt2(event.skill)) + .set("ai", () => get.event("bool")) + .set("bool", bool) + .forResult(); + event.result = { + bool: result.control != "cancel2", + targets: [trigger.player], + cost_data: result.control, + }; + }, + async content(event, trigger, player) { + const slot = event.cost_data; + await player.disableEquip([slot]); + const card = new lib.element.VCard({ name: "juedou" }); + if (player.canUse(card, trigger.player)) { + await player.useCard(card, trigger.player); + } + }, + }, + wn_huwei: { + trigger: { + player: "phaseDrawBegin2", + }, + forced: true, + filter(event, player) { + let list = Array.from({ length: 13 }).map((_, i) => "equip" + parseFloat(i + 1)); + list = list.filter(i => player.hasDisabledSlot(i)); + return !event.numFixed && list.length; + }, + async content(event, trigger, player) { + let list = Array.from({ length: 13 }).map((_, i) => "equip" + parseFloat(i + 1)); + let num = list.reduce((sum, slot) => sum + player.countDisabledSlot(slot), 0); + trigger.num += num; + }, + }, //汉末神王允 caanchao: { trigger: { diff --git a/character/extra/sort.js b/character/extra/sort.js index 4b8b2e928f..0389614d36 100644 --- a/character/extra/sort.js +++ b/character/extra/sort.js @@ -15,6 +15,7 @@ const characterSort = { extra_offline: ["shen_jiaxu", "shen_diaochan", "boss_zhaoyun", "le_shen_jiaxu", "ps_shen_machao"], extra_hanmo: ["hm_shen_yl_luzhi", "hm_shen_huangfusong", "hm_shen_zhangjiao", "hm_shen_zhangbao", "hm_shen_zhangliang", "hm_shen_zhujun"], extra_changan: ["ca_shen_wangyun", "ca_shen_caocao", "ca_shen_lijueguosi", "zombie_jiaxu", "zombie_zombie"], + extra_weinan: ["wn_shen_machao", "wn_shen_xuzhu"], extra_taoyuan: ["ty_shen_zhangfei", "ty_shen_guanyu", "ty_shen_liubei"], extra_jingxiang: ["jx_shen_caoren", "jx_shen_liubiao"], }; @@ -37,6 +38,7 @@ const characterSortTranslate = { extra_mb: "移动版神将", extra_hanmo: "风云志·汉末风云", extra_changan: "风云志·长安风云", + extra_weinan: "风云志·渭南风云", extra_taoyuan: "山河煮酒·桃园挽歌", extra_jingxiang: "风云志·荆襄风云", }; diff --git a/character/extra/translate.js b/character/extra/translate.js index 8d6d15eac0..99c408c0c0 100644 --- a/character/extra/translate.js +++ b/character/extra/translate.js @@ -441,6 +441,19 @@ const translates = { cayurong_info: "锁定技,你于一轮内首次成为一种伤害牌的目标时,取消之。", cadingxi: "定西", cadingxi_info: "蓄力技(4/∞)。当你连续使用一种类型的牌时,你可以消耗1点蓄力值并展示牌堆顶的一张牌,若类型相同,你使用之,否则你从牌堆底摸一张牌;若连续相同2/3次,你回复全部体力/对所有其他角色各造成1点伤害。", + + wn_shen_machao: "渭南神马超", + wn_shen_machao_prefix: "渭南神", + wn_qiangshu: "枪术", + wn_qiangshu_info: "你使用【杀】或【决斗】造成伤害时,可以弃置X张牌,令此伤害+X(X为你的攻击范围-1)。", + wn_yuma: "御马", + wn_yuma_info: "每回合限一次,一张装备牌进入弃牌堆后,你可以将此牌置入一名角色装备区,然后获得其所有手牌。", + wn_shen_xuzhu: "渭南神许褚", + wn_shen_xuzhu_prefix: "渭南神", + wn_zhuanzhan: "转战", + wn_zhuanzhan_info: "其他角色的准备阶段,你可以废除一个装备栏并视为对其使用一张【决斗】。", + wn_huwei: "虎威", + wn_huwei_info: "锁定技,摸牌阶段你多摸X张牌(X为你已废除的装备栏数)。", }; export default translates; diff --git a/character/offline/character.js b/character/offline/character.js index 326bf603b4..d8c3766c5a 100644 --- a/character/offline/character.js +++ b/character/offline/character.js @@ -1,4 +1,72 @@ const characters = { + wn_caocao: { + sex: "male", + group: "wei", + hp: 4, + isZhugong: true, + skills: ["wn_dingluan", "wn_zhuijiang"], + }, + wn_hansui: { + sex: "male", + group: "qun", + hp: 4, + maxHp: 5, + isZhugong: true, + skills: ["wn_jubing", "wn_xiongju"], + }, + wn_houxuan: { + sex: "male", + group: "qun", + hp: 4, + skills: ["wn_zhongtao", "mashu"], + }, + wn_chengyi: { + sex: "male", + group: "qun", + hp: 4, + skills: ["wn_dutan"], + }, + wn_yangqiú: { + sex: "male", + group: "qun", + hp: 4, + skills: ["wn_qifeng"], + }, + pe_jun_caopi: { + sex: "male", + group: "wei", + hp: 3, + isZhugong: true, + skills: ["jun_cuanzun", "jun_liufang", "songwei"], + }, + pe_jun_liushan: { + sex: "male", + group: "shu", + hp: 3, + isZhugong: true, + skills: ["jun_fuxiang", "jun_leling", "ruoyu"], + }, + pe_jun_sunquan: { + sex: "male", + group: "wu", + hp: 4, + isZhugong: true, + skills: ["jun_henglv", "jiuyuan"], + }, + pe_jun_liuxie: { + sex: "male", + group: "qun", + hp: 3, + isZhugong: true, + skills: ["jun_tianze", "jun_zhaoshou", "twzhuiting"], + }, + pe_jun_liuhong: { + sex: "male", + group: "qun", + hp: 4, + isZhugong: true, + skills: ["jun_gezhi", "jun_julian"], + }, pe_que: { sex: "male", group: "qun", diff --git a/character/offline/intro.js b/character/offline/intro.js index 7836027a40..30ae71789a 100644 --- a/character/offline/intro.js +++ b/character/offline/intro.js @@ -1,4 +1,7 @@ const characterIntro = { + houxuan: "侯选,河东人,东汉末年凉州军阀之一。建安十六年,同韩遂、马超联合,起兵反抗曹操,失败后入汉中依附张鲁,曹操平定汉中后,侯选投降,被封官赐爵。", + chengyi: "成宜(?—211年),东汉末年凉州军阀之一。建安十六年,同韩遂、马超联合,起兵反抗曹操。同年九月,曹操发动渭南大决战,成宜战死。", + yangqiú: "杨秋(生卒年不详),汉末三国时期魏国将领。建安十六年,同韩遂、马超联合,起兵反抗曹操。参加潼关之战,兵败于渭南,投降丞相曹操,成为魏国名将。魏文帝曹丕称帝后,出任冠军将军、畤乡侯。参与征讨郑甘、卢水、平定关中,官至讨寇将军,册封临泾侯,后以寿终。", pe_que: "曲阿小将,《三国演义》虚构人物。太史慈神亭酣战孙策时,独自抵挡程普等十二将。", yj_caocaoyuanshao: "请分别查看「曹操」和「袁绍」的武将介绍。", hs_caohuan: "曹奂(246年~302年),原名曹璜,以名讳难避,改名奂,字景明,三国时期曹魏末代皇帝。魏武帝曹操之孙,燕王曹宇之子,奉魏明帝曹叡之祀。曹奂出生于燕王宫。甘露三年(258年),被封为常道乡公。甘露五年(260年)五月,魏帝曹髦被杀,司马昭与众臣商议,立曹奂为帝,同年六月初二曹奂即皇帝位,改年号为景元。咸熙元年(264年),以曹奂为皇帝的魏国朝廷,宣布废除屯田官,以均政役。次年,司马炎篡夺魏国政权,建立西晋,史称晋武帝,魏国自此灭亡。十一月十七日,晋武帝封曹奂为陈留王。太安元年(302年),曹奂去世,谥号为元。", diff --git a/character/offline/skill.js b/character/offline/skill.js index 077637a3f5..cfc63018f1 100644 --- a/character/offline/skill.js +++ b/character/offline/skill.js @@ -2,6 +2,971 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //渭南风云 + //曹操 + wn_dingluan: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer(current => current != player); + }, + filterTarget: lib.filter.notMe, + async content(event, trigger, player) { + await player.loseHp(); + const card = new lib.element.VCard({ name: "dajunyajing" }), + target = event.target; + const result = player.canUse(card, target) ? await target + .chooseControl() + .set("choiceList", [ + `令${get.translation(player)}视为对你使用一张【大军压境】`, + "令你武将牌上的所有技能失效直到你下个回合结束", + ]) + .set("prompt", "定乱:请选择一项") + .set("ai", () => { + const player = get.player(), + targets = game.countPlayer(current => current != player && get.attitude(player, current) < 0); + if (targets.length >= player.hp) { + return 1; + } + return Math.random() > 0.7 ? 1 : 0; + }) + .forResult() : { + index: 1, + }; + if (result.index == 0) { + await player.useCard(card, target); + } + else { + target.addTempSkill("wn_dingluan_blocker", { player: "phaseAfter" }); + } + }, + ai: { + order: 7, + result: { + target(player, target) { + if (player.hp <= 2) { + return 0; + } + return -4; + }, + }, + }, + subSkill: { + blocker: { + init(player, skill) { + player.addSkillBlocker(skill); + }, + onremove(player, skill) { + player.removeSkillBlocker(skill); + }, + charlotte: true, + locked: true, + skillBlocker(skill, player) { + let skills = player.getStockSkills(true, true); + let info = get.info(skill); + return info && !info.charlotte && !info.persevereSkill && skills.includes(skill); + }, + mark: true, + marktext: "", + intro: { + content(list, player, skill) { + let storage = player.getSkills(null, false, false).filter(function (i) { + return lib.skill.wn_dingluan_blocker.skillBlocker(i, player); + }); + if (storage.length) { + return "失效技能:" + get.translation(storage); + } + return "无失效技能"; + }, + }, + }, + }, + }, + wn_zhuijiang: { + trigger: { + global: "die", + }, + filter(event, player) { + return player.hasZhuSkill("wn_zhuijiang") && game.hasPlayer(current => current.group == "wei"); + }, + zhuSkill: true, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2(event.skill, trigger.player), (card, player, target) => { + return target.group == "wei"; + }) + .set("ai", () => Math.random()) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + game.broadcastAll((target1, target2) => { + game.swapSeat(target1, target2); + }, target, trigger.player); + }, + }, + //韩遂 + wn_jubing: { + trigger: { + global: "damageEnd", + }, + usable: 1, + filter(event, player) { + if (!event.player?.isIn()) { + return false; + } + return game.hasPlayer(current => { + return current.group == "qun" && current.countCards("he") && current.inRange(event.player); + }); + }, + logTarget: "player", + prompt2(event, player) { + const targets = game.filterPlayer(current => { + return current.group == "qun" && current.countCards("he") && current.inRange(event.player); + }); + return `弃置${get.translation(targets)}${targets.length > 1 ? "各" : ""}一张牌,视为对其使用等量张【杀】`; + }, + check(event, player) { + let eff = 0; + game.filterPlayer(current => { + if (current.group != "qun" || !current.countCards("he") || !current.inRange(event.player)) { + return false; + } + eff += get.effect(current, { name: "guohe_copy2" }, player, player); + const card = new lib.element.VCard({ name: "sha" }); + if (player.canUse(card, event.player, false)) { + eff += get.effect(event.player, card, player, player); + } + }); + return eff > 0; + }, + async content(event, trigger, player) { + const targets = game.filterPlayer(current => { + return current.group == "qun" && current.countCards("he") && current.inRange(trigger.player); + }).sortBySeat(_status.currentPhase); + for (let target of targets) { + player.line(target, "green"); + await player.discardPlayerCard(target, "he", true); + } + let num = 0; + for (let target of targets) { + num += target.getHistory("lose", evt => { + return evt.type == "discard" && evt.getParent(3) == event && evt?.cards?.length; + }).reduce((sum, evt) => sum + evt.cards.length, 0); + } + while (num > 0) { + num--; + const card = new lib.element.VCard({ name: "sha" }); + if (player.canUse(card, trigger.player, false)) { + await player.useCard(card, trigger.player); + } + else { + break; + } + } + }, + }, + wn_xiongju: { + trigger: { + global: ["phaseBefore", "changeGroupAfter"], + player: "enterGame", + }, + zhuSkill: true, + filter(event, player) { + return player.hasZhuSkill("wn_xiongju") && lib.skill.wn_xiongju.logTarget(event, player)?.length; + }, + logTarget(event, player) { + if (event.name == "changeGroup") { + if ([event.originGroup, event.group].includes(player.group)) { + return [event.player]; + } + return []; + } + return game.filterPlayer(current => { + return current.group == player.group; + }); + }, + onremove(player, skill) { + let skillName = `${skill}_${player.playerid}`; + for (let target of game.players) { + if (target?.additionalSkills?.[skillName]?.length) { + target.removeAdditionalSkill(skillName); + } + } + }, + firstDo: true, + silent: true, + async content(event, trigger, player) { + let skillName = `${event.name}_${player.playerid}`; + for (let target of event.targets) { + if (target.group == player.group) { + target.addAdditionalSkill(skillName, ["mashu"], true); + } + else { + target.removeAdditionalSkill(skillName); + } + } + }, + derivation: ["mashu"], + }, + wn_zhongtao: { + trigger: { + global: "useCardAfter", + }, + filter(event, player) { + if (!event.player.isIn() || get.distance(player, event.player) > 1) { + return false; + } + return event.card.name == "sha" && event.targets?.some(i => { + const card = new lib.element.VCard({ name: "sha" }); + return i.isIn() && player.canUse(card, i, false); + }) && player.countCards("hes"); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + prompt: get.prompt2(event.skill, trigger.targets), + filterCard(card, player) { + const targets = get.event("targetx"), + cardx = new lib.element.VCard({ name: "sha", cards: [card] }, [card]); + return targets.some(target => player.canUse(cardx, target, false)); + }, + targetx: trigger.targets, + selectTarget: -1, + position: "hes", + filterTarget(card, player, target) { + const cards = ui.selected.cards, + targets = get.event("targetx"), + cardx = new lib.element.VCard({ name: "sha", cards: cards }, cards); + return player.canUse(cardx, target, false) && targets.includes(target); + }, + ai1(card) { + const { targetx: targets, player } = get.event(), + cardx = new lib.element.VCard({ name: "sha", cards: [card] }, [card]); + let num = 0; + targets.filter(target => { + if (!player.canUse(cardx, target, false)) { + return false; + } + num += get.sgn(get.effect(target, cardx, player, player)); + }); + if (num <= 0) { + return 0; + } + return 7 - get.value(card); + }, + }) + .forResult(); + }, + async content(event, trigger, player) { + const { cards, targets } = event; + const card = new lib.element.VCard({ name: "sha", cards: cards }, cards); + await player.useCard(card, cards, targets, false); + }, + }, + wn_dutan: { + enable: "phaseUse", + viewAs: { + name: "juedou", + isCard: true, + }, + usable: 1, + filterCard: () => false, + selectCard: -1, + selectTarget: [1, Infinity], + }, + wn_qifeng: { + trigger: { global: "phaseEnd" }, + filter(event, player) { + if (!player.getHistory("lose").length) { + return false; + } + const card = new lib.element.VCard({ name: "sha" }); + return player.canUse(card, event.player, false); + }, + check(event, player) { + const card = new lib.element.VCard({ name: "sha" }); + return get.effect(event.player, card, player, player) > 0; + }, + logTarget: "player", + async content(event, trigger, player) { + const card = new lib.element.VCard({ name: "sha" }); + const next = player.useCard(card, trigger.player); + next.oncard = () => { + let num = get.player().getHistory("lose", evt => { + return evt?.cards2?.length; + }).reduce((sum, evt) => sum + evt.cards2.length, 0); + get.event().baseDamage = num; + }; + await next; + }, + }, + //君霸天下 + //君曹丕 + jun_cuanzun: { + audio: "sbxingshang", + trigger: { + global: "die", + }, + frequent(event) { + return !event.player.countCards("he", "du"); + }, + logTarget: "player", + filter(event, player) { + if (event.player == player) { + return false; + } + return player.isDamaged() || event.player.countCards("he") > 0; + }, + async content(event, trigger, player) { + const cards = trigger.player.getCards("he"); + if (cards.length) { + await player.gain(cards, trigger.player, "giveAuto", "bySelf"); + } + if (player.isDamaged()) { + await player.recover(); + } + }, + }, + jun_liufang: { + audio: "sbfangzhu", + enable: "phaseUse", + trigger: { + player: "damageEnd", + }, + filter(event, player) { + if (!game.hasPlayer(current => current != player)) { + return false; + } + return event.name == "damage" || !player.hasSkill("jun_liufang_used"); + }, + async cost(event, trigger, player) { + const draw = player.getDamagedHp(); + event.result = await player + .chooseTarget(get.prompt(event.skill), "令一名其他角色翻面" + (draw > 0 ? "并摸" + get.cnNumber(draw) + "张牌" : ""), function (card, player, target) { + return player != target; + }) + .setHiddenSkill(event.skill) + .set("ai", target => { + if (target.hasSkillTag("noturn")) { + return 0; + } + const player = _status.event.player; + const current = _status.currentPhase; + const dis = current ? get.distance(current, target, "absolute") : 1; + const draw = player.getDamagedHp(); + const att = get.attitude(player, target); + if (att == 0) { + return target.hasJudge("lebu") ? Math.random() / 3 : Math.sqrt(get.threaten(target)) / 5 + Math.random() / 2; + } + if (att > 0) { + if (target.isTurnedOver()) { + return att + draw; + } + if (draw < 4) { + return -1; + } + if (current && target.getSeatNum() > current.getSeatNum()) { + return att + draw / 3; + } + return (10 * Math.sqrt(Math.max(0.01, get.threaten(target)))) / (3.5 - draw) + dis / (2 * game.countPlayer()); + } else { + if (target.isTurnedOver()) { + return att - draw; + } + if (draw >= 5) { + return -1; + } + if (current && target.getSeatNum() <= current.getSeatNum()) { + return -att + draw / 3; + } + return (4.25 - draw) * 10 * Math.sqrt(Math.max(0.01, get.threaten(target))) + (2 * game.countPlayer()) / dis; + } + }) + .forResult(); + }, + filterTarget: lib.filter.notMe, + async content(event, trigger, player) { + if (trigger?.name != "damage") { + player.addTempSkill("jun_liufang_used", "phaseChange"); + } + const target = event.targets[0], + num = player.getDamagedHp(); + if (num > 0) { + await target.draw(num); + } + await target.turnOver(); + if (num > 1) { + await target.executeDelayCardEffect("shandian"); + } + }, + ai: { + order: 2, + result: { + target(player, target) { + if (target.isTurnedOver()) { + return 5; + } + return -3; + }, + }, + }, + subSkill: { + used: { + charlotte: true, + }, + }, + }, + //君刘禅 + jun_fuxiang: { + audio: "refangquan", + trigger: { + player: "phaseUseBefore", + }, + filter(event, player) { + return game.hasPlayer(current => current != player); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2(event.skill), lib.filter.notMe) + .set("ai", target => { + const player = get.player(); + if (target.hasJudge("lebu") || get.attitude(player, target) <= 4) { + return 0; + } + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1) > 0; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + trigger.cancel(); + player + .when("phaseDiscardAfter") + .filter(evt => evt.getParent() == trigger.getParent()) + .step(async (event, trigger, player) => { + const cards = []; + game.getGlobalHistory("cardMove", evt => { + if (evt.getParent("phaseDiscard") != trigger) { + return false; + } + if (evt.name == "lose" && (evt.type != "discard" || evt.position != ui.discardPile)) { + return false; + } + cards.addArray( evt.cards.filterInD("d")); + }); + if (cards.length) { + player.logSkill("jun_fuxiang", [target]); + await target.gain(cards, "gain2"); + } + }); + target.insertPhase(); + }, + }, + jun_leling: { + audio: "xiangle_re_liushan", + trigger: { + target: "useCardToTarget", + }, + forced: true, + preHidden: true, + logTarget: "player", + filter(event, player) { + return event.card.name == "sha" || get.type(event.card) == "delay"; + }, + async content(event, trigger, player) { + const eff = get.effect(player, trigger.card, trigger.player, trigger.player), + type = get.type2(trigger.card); + const { result } = trigger.player == player ? { + bool: false, + } : await trigger.player + .chooseToGive(player, `乐陵:交给${get.translation(player)}一张${get.translation(type)}手牌,否则此牌对其无效`, card => { + return get.type2(card) == get.event("cardType"); + }) + .set("ai", card => { + if (get.event("eff") > 0) { + return 10 - get.value(card); + } + return 0; + }) + .set("cardType", type) + .set("eff", eff); + if (!result?.bool) { + trigger.getParent().excluded.add(player); + } + }, + ai: { + effect: { + target(card, player, target, current) { + if ((card.name == "sha" || get.type(card) == "delay") && get.attitude(player, target) < 0) { + if (_status.event.name == "jun_leling") { + return; + } + if (get.attitude(player, target) > 0 && current < 0) { + return "zerotarget"; + } + const bs = player.getCards("h", { type: get.type2(card) }); + bs.remove(card); + if (card.cards) { + bs.removeArray(card.cards); + } else { + bs.removeArray(ui.selected.cards); + } + if (!bs.length) { + return "zerotarget"; + } + if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) { + return; + } + if (bs.length <= 2) { + for (let i = 0; i < bs.length; i++) { + if (get.value(bs[i]) < 7) { + return [1, 0.5, 1, -0.5]; + } + } + return [1, 0, 0.3, 0]; + } + return [1, 0.5, 1, -0.5]; + } + }, + }, + }, + }, + //君孙权 + jun_henglv: { + audio: "rezhiheng", + enable: "phaseUse", + filter(event, player) { + return player.countCards("h"); + }, + filterCard: true, + selectCard: [1, Infinity], + lose: false, + discard: false, + check(card) { + let player = _status.event.player; + if (get.position(card) == "e") { + let subs = get.subtypes(card); + if (subs.includes("equip2") || subs.includes("equip3")) { + return player.getHp() - get.value(card); + } + } + return 6 - get.value(card); + }, + async content(event, trigger, player) { + const num = (player.getStat("skill")[event.name] || 1) - 1; + if (num > 0) { + await player.loseHp(num); + } + await player.discard(event.cards); + let cards = event.cards.filter(card => card.name == "tao"); + while (cards.length) { + const { result } = cards.length > 1 ? await player + .chooseButtonTarget({ + createDialog: [`衡虑:是否分配弃置的【桃】?`, cards], + selectButton: [1, Infinity], + cardsx: cards, + filterTarget: true, + ai1(button) { + return get.value(button.link); + }, + ai2(target) { + const player = get.player(); + const card = ui.selected.buttons[0].link; + if (card) { + let eff = get.value(card, target) * get.attitude(player, target); + if (player.hasSkill("jiuyuan") && target != player) { + eff *= 2; + } + return eff; + } + return 1; + }, + }) : await player + .chooseTarget(`衡虑:是否令一名角色获得${get.translation(cards)}?`) + .set("ai", target => { + const { player, cardx: card } = get.event(); + let eff = get.value(card, target) * get.attitude(player, target); + if (player.hasSkill("jiuyuan") && target != player) { + eff *= 2; + } + return eff; + }) + .set("cardx", cards[0]); + if (result?.bool) { + if (!result?.links?.length) { + result.links = cards.slice(0); + } + cards.removeArray(result.links); + player.line(result.targets, "green"); + const gainEvent = result.targets[0].gain(result.links, "gain2"); + gainEvent.giver = player; + await gainEvent; + } + else { + break; + } + } + await player.draw(event.cards.length + num); + }, + ai: { + order: 1, + result: { + player(player, target) { + const num = player.getStat("jun_henglv") || 0; + if (num >= 1 || player.hp < 2 && !player.countCards("hs", "tao")) { + return 0; + } + return 1; + }, + }, + }, + }, + //君刘协 + jun_tianze: { + audio: "tianming", + trigger: { + target: "useCardToTargeted", + }, + check(event, player) { + let cards = player.getCards("h"); + if (cards.length <= 2) { + for (let i = 0; i < cards.length; i++) { + if (cards[i].name == "shan" || cards[i].name == "tao") { + return false; + } + } + } + return true; + }, + filter(event, player) { + return event.card.name == "sha"; + }, + async cost(event, trigger, player) { + const num = Math.min(2, player.countCards("he")); + let bool = true; + if (num <= 2 && player.getCards("he").some(card => ["shan", "tao"].includes(card.name))) { + bool = false; + } + event.result = num > 0 ? await player + .chooseToDiscard(get.prompt2(event.skill), num, "he") + .set("boolx", bool) + .set("ai", card => { + if (get.event("boolx")) { + return 11 - get.value(card); + } + return 0; + }) + .set("chooseonly", true) + .forResult() : await player + .chooseBool(get.prompt2(event.skill)) + .forResult(); + }, + async content(event, trigger, player) { + if (event?.cards?.length) { + await player.discard(event.cards); + } + const cards = get.cards(4, true); + const result = await player + .chooseButton(["天择:获得其中两张", cards], 2, true) + .set("ai", button => { + return get.buttonValue(button); + }) + .forResult(); + if (result.bool) { + await player.gain(result.links, "draw"); + } + const targets = game.filterPlayer(current => { + if (current == player) { + return false; + } + return current.isMaxHandcard() || current.isMaxHp(); + }); + if (!targets.length) { + return; + } + const result2 = targets.length > 1 ? await player + .chooseTarget("令一名手牌数或体力值最大的其他角色执行【天择】", true, (card, player, target) => { + if (target == player) { + return false; + } + return target.isMaxHandcard() || target.isMaxHp(); + }) + .set("ai", target => { + const player = get.player(); + return get.attitude(player, target); + }) + .forResult() : { + bool: true, + targets: targets, + }; + if (result2.bool) { + const target = result2.targets[0]; + player.line(target, "green"); + if (target.countCards("he")) { + await target.chooseToDiscard(2, "he", true); + } + const cards2 = get.cards(4, true); + const result3 = await target + .chooseButton(["天择:获得其中两张", cards2], 2, true) + .set("ai", button => { + return get.buttonValue(button); + }) + .forResult(); + if (result3.bool) { + await target.gain(result3.links, "draw"); + } + } + }, + ai: { + effect: { + target_use(card, player, target, current) { + if (card.name == "sha") { + return [1, 0.5]; + } + }, + }, + }, + }, + jun_zhaoshou: { + audio: "mizhao", + enable: "phaseUse", + filter(event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + selectCard: -1, + filterTarget(card, player, target) { + return player != target; + }, + discard: false, + lose: false, + delay: false, + ai: { + order: 1, + result: { + player: 0, + target(player, target) { + if (target.hasSkillTag("nogain")) { + return 0; + } + if (player.countCards("h") > 1) { + return 1; + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].countCards("h") && players[i] != target && players[i] != player && get.attitude(player, players[i]) < 0) { + break; + } + } + if (i == players.length) { + return 1; + } + return -2 / (target.countCards("h") + 1); + }, + }, + }, + async content(event, trigger, player) { + const target = event.targets[0], + cards = event.cards; + await player.give(cards, target, false); + if (!target.countCards("h")) { + return; + } + if (!game.hasPlayer(current => target.canCompare(current) && current != player)) { + return; + } + const result = await player + .chooseTarget(true, "选择拼点目标", (card, player, target) => { + return get.event("targetx").canCompare(target) && target != player; + }) + .set("ai", target => { + const { player, targetx } = get.event(); + let eff = get.effect(target, { name: "sha" }, targetx, player), + att = get.attitude(player, target); + if (att > 0) { + return eff - 10; + } + return eff; + }) + .set("targetx", target) + .set("forceDie", true) + .forResult(); + if (!result.bool || !result?.targets?.length) { + return; + } + const targetx = result.targets[0]; + target.line(targetx, "green"); + const { result: result2 } = await target.chooseToCompare(targetx); + if (!result2.tie) { + const user = result2.bool ? target : targetx; + const card = new lib.element.VCard({ name: "sha" }); + if (user.hasUseTarget(card, false)) { + await user.chooseUseTarget(card, "nodistance", false, true); + } + } + }, + }, + jun_gezhi: { + audio: "twgezhi", + trigger: { + player: "useCard", + }, + filter(event, player) { + return player.getCards("he")?.map(card => get.type2(card)).toUniqued().length > 2; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCard(get.prompt2(event.skill), 3, "he") + .set("filterCard", card => { + if (!lib.filter.cardRecastable(card, player)) { + return false; + } + return !ui.selected.cards?.some(cardx => get.type2(cardx) == get.type2(card)); + }) + .set("complexCard", true) + .set("ai", card => { + return 9 - get.value(card); + }) + .forResult(); + }, + async content(event, trigger, player) { + await player.recast(event.cards); + const result = await player + .chooseButtonTarget({ + createDialog: ["革制:请选择一项", [ + [ + ["recover", "回复1点体力"], + ["limit", "使用下一张牌无次数限制"], + ["damage", "对一名其他角色造成1点伤害"], + ], + "textbutton", + ]], + filterButton(button) { + const { player, targetx: targets } = get.event(); + if (button.link == "recover") { + return player.isDamaged(); + } + if (button.link == "damage") { + return game.hasPlayer(current => player != current && !targets.includes(current)); + } + return true; + }, + filterTarget(card, player, target) { + if (ui.selected.buttons[0]?.link != "damage") { + return false; + } + const { targetx: targets } = get.event(); + return target != player && !targets.includes(target); + }, + forced: true, + complexSelect: true, + complexTarget: true, + selectTarget() { + if (ui.selected.buttons[0]?.link != "damage") { + return -1; + } + return 1; + }, + ai1(button) { + const { player, targetx: targets } = get.event(); + if (button.link == "recover") { + return get.recoverEffect(player, player, player); + } + if (button.link == "damage") { + const target = game.filterPlayer(current => { + return player != current && !targets.includes(current); + }).maxBy(current => get.damageEffect(current, player, player)); + return get.damageEffect(target, player, player); + } + return 1; + }, + ai2(target) { + const player = get.player(); + return get.damageEffect(target, player, player); + }, + }) + .set("targetx", player.getStorage("jun_gezhi_used")) + .forResult(); + if (result?.bool) { + if (result.links[0] == "recover") { + await player.recover(); + } + if (result.links[0] == "limit") { + player.addSkill("jun_gezhi_unlimit"); + } + if (result.links[0] == "damage") { + player.addSkill("jun_gezhi_used"); + player.markAuto("jun_gezhi_used", result.targets); + player.line(result.targets, "green"); + await result.targets[0].damage(); + } + } + }, + onremove(player) { + player.removeSkill("jun_gezhi_used"); + }, + subSkill: { + unlimit: { + charlotte: true, + mod: { + cardUsable: () => Infinity, + }, + trigger: { + player: "useCard1", + }, + forced: true, + popup: false, + firstDo: true, + async content(event, trigger, player) { + player.removeSkill(event.name); + const { card } = trigger; + if (trigger.addCount !== false) { + trigger.addCount = false; + player.getStat("card")[card.name]--; + } + }, + mark: true, + intro: { + content: "使用的下一张牌无任何次数限制", + }, + }, + used: { + charlotte: true, + onremove: true, + intro: { + content: "已对$造成过伤害", + }, + }, + }, + }, + jun_julian: { + audio: "jsrgjulian", + trigger: { + player: "phaseJieshuBegin", + }, + zhuSkill: true, + filter(event, player, name, target) { + return player.hasZhuSkill("jun_julian") && target.isIn(); + }, + getIndex(event, player) { + return game.filterPlayer(current => current != player && current.group == "qun"); + }, + async cost(event, trigger, player) { + const target = event.indexedData; + event.result = await target + .chooseBool(get.prompt2(event.skill, target, player)) + .forResult(); + event.result.targets = [target]; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + await target.draw(2); + if (target.countCards("he")) { + await player.gainPlayerCard(target, "he", true); + } + }, + }, //曲阿小将 peyingzhen: { trigger: { diff --git a/character/offline/sort.js b/character/offline/sort.js index dc6e90ddc7..53df41193d 100644 --- a/character/offline/sort.js +++ b/character/offline/sort.js @@ -7,6 +7,7 @@ const characterSort = { 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_zy: ["pe_wangyun", "pe_zhonghui", "pe_sunchen", "pe_mengda", "pe_wenqin", "ns_caoanmin", "jiangqing", "kongrong", "jiling", "tianfeng", "mateng"], offline_piracyE_xk: ["xk_luoli", "xk_cuilian", "xk_penghu", "xk_shanfu", "xk_pengqi", "xk_zulang"], + offline_piracyE_jb: ["pe_jun_caopi", "pe_jun_liushan", "pe_jun_sunquan", "pe_jun_liuxie", "pe_jun_liuhong"], offline_piracyE: ["pe_que", "yj_zhouji", "yj_ehuan", "yj_tianchuan", "yj_zhonghui", "yj_jiling", "yj_yongkai", "yj_chezhou", "yj_caocaoyuanshao"], 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", "jsp_liubei"], offline_piracyK: ["pk_sp_duyu"], @@ -17,6 +18,7 @@ const characterSort = { offline_hanmo: ["hm_bairao", "hm_guigu", "hm_bosi", "hm_nanhualaoxian", "hm_yudu", "hm_taosheng", "hm_fuyun", "hm_tangzhou", "hm_chengyuanzhi", "hm_gaosheng", "hm_heman", "hm_yanzheng", "hm_bocai", "hm_dengmao"], offline_jingxiang: ["jx_zhouyu", "jx_guanyu"], offline_changan: ["ca_wangyun", "ca_lvbu", "ca_lijue", "ca_guosi", "ca_zhangji", "ca_fanchou"], + offline_weinan: ["wn_caocao", "wn_hansui", "wn_houxuan", "wn_chengyi", "wn_yangqiú"], offline_jiudin: ["jd_jin_wangyuanji", "jd_ol_huaxin", "jd_sp_yangwan", "jd_sb_huangyueying", "jd_sb_zhaoyun", "jd_sb_ganning", "jd_sb_pangtong", "jd_hanlong", "jd_jin_xiahouhui", "jd_jin_simazhao", "jd_sb_caocao", "jd_sb_sp_zhugeliang", "jd_simayan", "jd_sb_sunquan", "jd_sb_xiaoqiao", "jd_sb_guanyu", "jd_sb_jiangwei", "jd_sb_daqiao", "jd_sb_menghuo", "jd_sb_yuanshao", "jd_sb_yujin", "jd_sb_sunshangxiang", "jd_sb_liubei", "jd_sb_fazheng", "jd_sb_zhangfei", "jd_jin_simashi", "jd_sb_xuhuang"], offline_yanyou: ["yy_quyi", "yy_gongsunzan", "yy_wenchou", "yy_gongsunyuan", "yy_yuanshao", "yy_simayi", "yy_caorui", "yy_zhaoyun", "yy_quancong"], offline_jingyang: ["jy_caocao", "jy_caoren", "jy_zhugeliang", "jy_pangtong", "jy_lusu", "jy_zhangzhao", "jy_zhouyu", "jy_huanggai"], @@ -38,6 +40,7 @@ const characterSortTranslate = { offline_feihongyingxue: "飞鸿映雪", offline_piracyE_zy: "官盗E系列·战役篇", offline_piracyE_xk: "官盗E系列·侠客行", + offline_piracyE_jb: "官盗E系列·君霸天下", offline_piracyE: "官盗E系列", offline_piracyS: "官盗S系列", offline_vtuber: "天书乱斗·虚拟偶像", @@ -46,6 +49,7 @@ const characterSortTranslate = { offline_longyutao: "山河煮酒·龙起襄樊", offline_jingxiang: "风云志·荆襄风云", offline_changan: "风云志·长安风云", + offline_weinan: "风云志·渭南风云", offline_taoyuan: "山河煮酒·桃园挽歌", offline_guansuo: "山河煮酒·关索传", offline_jiudin: "九鼎系列", diff --git a/character/offline/translate.js b/character/offline/translate.js index aa6c7522e3..79c7f6f6ca 100644 --- a/character/offline/translate.js +++ b/character/offline/translate.js @@ -1385,6 +1385,56 @@ const translates = { peaoyong_info: "持恒技,你不因此技能获得牌时,可以选择一项:1.摸一张牌;2.回复1点体力;3.使用一张牌;背水,减少1点体力上限。", petongkai: "同忾", petongkai_info: "一名角色成为伤害牌的目标时,若你与其的距离不大于1,你可以摸一张牌,然后展示并交给其一张牌;若此牌为装备牌,其可使用之。", + pe_jun_caopi: "君曹丕", + pe_jun_caopi_prefix: "君", + jun_cuanzun: "篡尊", + jun_cuanzun_info: "其他角色死亡后,你可以获得其所有牌并回复1点体力。", + jun_liufang: "流放", + jun_liufang_info: "出牌阶段限一次或你受到伤害后,你可以令一名其他角色翻面并摸X张牌,若X大于1,其进行一次【闪电】判定(X为你的已损失体力值)。", + pe_jun_liushan: "君刘禅", + pe_jun_liushan_prefix: "君", + jun_fuxiang: "付相", + jun_fuxiang_info: "出牌阶段开始时,你可以跳过此阶段并选择一名其他角色,若如此做,你于弃牌阶段结束时将本阶段进入弃牌堆的牌交给其,并令其于此回合结束后执行一个额外回合。", + jun_leling: "乐陵", + jun_leling_info: "锁定技,你成为【杀】或延时锦囊牌的目标时,使用者须交给你一张同类型的手牌,否则此牌无效。", + pe_jun_sunquan: "君孙权", + pe_jun_sunquan_prefix: "君", + jun_henglv: "衡虑", + jun_henglv_info: "出牌阶段,你可以失去X点体力并弃置任意张手牌,然后摸弃牌数+X张牌;你可以将以此法弃置的【桃】交给任意角色(X为此技能发动次数-1)。", + pe_jun_liuxie: "君刘协", + pe_jun_liuxie_prefix: "君", + jun_tianze: "天择", + jun_tianze_info: "你成为【杀】的目标时,可以弃置两张牌并观看牌堆顶四张牌,然后获得其中两张牌。若如此做,你令一名手牌数或体力值最大的其他角色执行相同操作。", + jun_zhaoshou: "诏授", + jun_zhaoshou_info: "出牌阶段,你可以将所有手牌交给一名其他角色,并令其与另一名其他角色拼点,赢的角色视为使用一张无距离限制的【杀】。", + pe_jun_liuhong: "君刘宏", + pe_jun_liuhong_prefix: "君", + jun_gezhi: "革制", + jun_gezhi_info: "你使用牌时,可以重铸三种类型的牌各一张,然后选择一项:1.回复1点体力,2.使用的下一张牌无次数限制;3.对一名其他角色造成1点伤害(每名角色限一次)。", + jun_julian: "聚敛", + jun_julian_info: "主公技,结束阶段,其他群势力角色可依次摸两张牌;若如此做,你获得其一张牌。", + + wn_caocao: "渭南曹操", + wn_caocao_prefix: "渭南", + wn_dingluan: "定乱", + wn_dingluan_info: "出牌阶段限一次,你可以失去1点体力,令一名其他角色选择一项:1.你视为对其使用一张【大军压境】;2.其武将牌上的技能失效直到其回合结束。", + wn_zhuijiang: "追将", + wn_zhuijiang_info: "主公技,一名角色死亡后,你可以令一名魏势力角色与其交换座次。", + wn_hansui: "渭南韩遂", + wn_hansui_prefix: "渭南", + wn_jubing: "举兵", + wn_jubing_info: "每回合限一次,一名角色受到伤害后,你可以弃置攻击范围含有其的群势力角色各一张牌,视为对其使用X张【杀】(X为以此法弃置的牌数)。", + wn_xiongju: "雄踞", + wn_xiongju_info: "主公技,与你势力相同的角色视为拥有〖马术〗。", + wn_houxuan: "候选", + wn_zhongtao: "众讨", + wn_zhongtao_info: "与你距离为1的角色使用【杀】结算完成后,你可以将一张牌当【杀】对相同目标角色使用。", + wn_chengyi: "成宜", + wn_dutan: "独探", + wn_dutan_info: "出牌阶段限一次,你可以视为使用一张指定任意名角色的【决斗】。", + wn_yangqiú: "杨秋", + wn_qifeng: "齐锋", + wn_qifeng_info: "一名角色的回合结束时,若你本回合失去过牌,你可以视为对其使用一张伤害为X的【杀】(X为你本回合失去的牌数)。", }; export default translates; diff --git a/character/rank.js b/character/rank.js index 12352ae759..19e8ce1665 100644 --- a/character/rank.js +++ b/character/rank.js @@ -1,6 +1,7 @@ window.noname_character_rank = { - s: ["pe_que", "hm_shen_huangfusong", "gjqt_bailitusu", "gjqt_beiluo", "gjqt_xieyi", "hs_malorne", "hs_medivh", "hs_sthrall", "pal_yuejinzhao", "swd_cheyun", "swd_duguningke", "swd_guyue", "swd_huanglei", "swd_murongshi", "swd_muyun", "swd_septem", "swd_tuobayuer", "swd_xuanyuanjianxian", "swd_yuxiaoxue", "swd_zhaoyun", "key_shiki", "sp_xiahoushi", "ns_zhangwei", "key_mio", "key_midori", "key_yuri", "key_yui", "key_lucia", "db_key_hina", "sp_key_kanade", "key_shizuru", "key_sakuya", "boss_zhaoyun", "noname", "ns_shijian", "key_iriya", "ol_nanhualaoxian", "huzun", "dc_xujing", "ty_shen_zhangfei", "vtb_xiaole", "yj_zhonghui", "duosidawang", "re_sp_zhugeliang", "re_pangtong", "tw_wujing", "dengzhi", "xin_chengpu", "tw_dongzhao", "sunwukong", "ps_shen_machao", "pk_sp_duyu", "std_pengyang", "diy_liaohua", "drag_xusheng"], + s: ["pe_jun_caopi", "wn_shen_machao", "pe_que", "hm_shen_huangfusong", "gjqt_bailitusu", "gjqt_beiluo", "gjqt_xieyi", "hs_malorne", "hs_medivh", "hs_sthrall", "pal_yuejinzhao", "swd_cheyun", "swd_duguningke", "swd_guyue", "swd_huanglei", "swd_murongshi", "swd_muyun", "swd_septem", "swd_tuobayuer", "swd_xuanyuanjianxian", "swd_yuxiaoxue", "swd_zhaoyun", "key_shiki", "sp_xiahoushi", "ns_zhangwei", "key_mio", "key_midori", "key_yuri", "key_yui", "key_lucia", "db_key_hina", "sp_key_kanade", "key_shizuru", "key_sakuya", "boss_zhaoyun", "noname", "ns_shijian", "key_iriya", "ol_nanhualaoxian", "huzun", "dc_xujing", "ty_shen_zhangfei", "vtb_xiaole", "yj_zhonghui", "duosidawang", "re_sp_zhugeliang", "re_pangtong", "tw_wujing", "dengzhi", "xin_chengpu", "tw_dongzhao", "sunwukong", "ps_shen_machao", "pk_sp_duyu", "std_pengyang", "diy_liaohua", "drag_xusheng"], ap: [ + "wn_shen_xuzhu", "yj_caocaoyuanshao", "strong_caochong", "dm_simayi", @@ -22,6 +23,9 @@ window.noname_character_rank = { "hs_neptulon", "hs_tyrande", "hs_xsylvanas", + "pe_jun_liushan", + "pe_jun_sunquan", + "pe_jun_liuxie", "ow_ana", "ow_dva", "ow_liekong", @@ -1059,6 +1063,8 @@ window.noname_character_rank = { "ns_sundeng", "dc_huojun", "ol_zhangyì", + "wn_caocao", + "wn_hansui", "re_lidian", "zhangkai", "dc_mengda", @@ -1253,6 +1259,10 @@ window.noname_character_rank = { "ol_maliang", ], b: [ + "pe_jun_liuhong", + "wn_houxuan", + "wn_chengyi", + "wn_yangqiú", "ps_caocao", "ps_liubei", "ps_sunquan", @@ -2474,6 +2484,7 @@ window.noname_character_rank = { "shen_xunyu", "fengfangnv", "tw_zhangmancheng", + "pe_jun_caopi", "guanning", "shen_jiangwei", "ol_puyuan", @@ -2695,6 +2706,7 @@ window.noname_character_rank = { "diy_liaohua", "diy_zhangfei", "sxrm_caocao", + "wn_shen_machao", ], epic: [ "v_caopi", @@ -2871,6 +2883,7 @@ window.noname_character_rank = { "wutugu", "ol_sb_zhangrang", "ol_zhaozhong", + "wn_shen_xuzhu", "jikang", "sunce", "re_sunce", @@ -2910,6 +2923,9 @@ window.noname_character_rank = { "ns_zhangning", "ns_yanghu", "ol_huaxin", + "pe_jun_liushan", + "pe_jun_sunquan", + "pe_jun_liuxie", "longyufei", "lvlingqi", "re_pangdegong", @@ -3197,6 +3213,10 @@ window.noname_character_rank = { "sxrm_liubei", ], rare: [ + "wn_houxuan", + "wn_chengyi", + "wn_yangqiú", + "pe_jun_liuhong", "sxrm_caopi", "sxrm_wanghou", "std_baoxin", @@ -3235,6 +3255,8 @@ window.noname_character_rank = { "dc_xiahouhui", "star_zhangrang", "ol_madai", + "wn_caocao", + "wn_hansui", "guoyuan", "mb_huangzu", "mb_luyusheng", diff --git a/character/refresh/skill.js b/character/refresh/skill.js index 3971aecce0..fde3e547b2 100644 --- a/character/refresh/skill.js +++ b/character/refresh/skill.js @@ -5721,6 +5721,9 @@ const skills = { rejijiang: { audio: "jijiang1", audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + audioname2: { + pe_jun_liushan: "jijiang1_liushan", + }, group: ["rejijiang1", "rejijiang3"], zhuSkill: true, filter(event, player) { diff --git a/character/replace.js b/character/replace.js index 9918dc26a7..1768cca8da 100644 --- a/character/replace.js +++ b/character/replace.js @@ -8,9 +8,10 @@ window.noname_character_replace = { shen_jiaxu: ["le_shen_jiaxu", "shen_jiaxu", "zombie_jiaxu"], shen_liubei: ["shen_liubei", "ty_shen_liubei"], shen_lvmeng: ["shen_lvmeng", "tw_shen_lvmeng"], - shen_machao: ["shen_machao", "ps_shen_machao"], + shen_machao: ["shen_machao", "ps_shen_machao", "wn_shen_machao"], shen_simayi: ["shen_simayi", "xin_simayi", "new_simayi"], shen_sunquan: ["shen_sunquan", "junk_sunquan"], + shen_xuzhu: ["shen_xuzhu", "wn_shen_xuzhu"], shen_zhangfei: ["shen_zhangfei", "ty_shen_zhangfei"], shen_zhangliao: ["ol_zhangliao", "shen_zhangliao"], shen_zhangjiao: ["junk_zhangjiao", "shen_zhangjiao", "hm_shen_zhangjiao"], @@ -27,13 +28,13 @@ window.noname_character_replace = { caizhenji: ["caizhenji", "ol_caizhenji"], caoang: ["caoang", "dc_sb_caoang", "tw_caoang", "huan_caoang", "yj_caoang"], caoanmin: ["caoanmin", "ns_caoanmin"], - caocao: ["caocao", "re_caocao", "sp_ol_caocao", "ol_jsrg_caocao", "dc_caocao", "sb_caocao", "tw_caocao", "jsrg_caocao", "jd_sb_caocao", "yj_caocao", "ns_caocao", "ns_caocaosp", "jy_caocao", "ps_caocao", "sxrm_caocao"], + caocao: ["caocao", "re_caocao", "sp_ol_caocao", "ol_jsrg_caocao", "dc_caocao", "sb_caocao", "tw_caocao", "jsrg_caocao", "jd_sb_caocao", "yj_caocao", "ns_caocao", "ns_caocaosp", "jy_caocao", "ps_caocao", "sxrm_caocao", "wn_caocao"], caochong: ["caochong", "ol_caochong", "re_caochong", "huan_caochong", "old_caochong", "strong_caochong"], caochun: ["caochun", "dc_caochun", "old_caochun"], caofang: ["caofang", "jsrg_caofang"], caohong: ["caohong", "dc_sb_caohong", "tw_re_caohong", "tw_caohong", "yj_caohong"], caomao: ["caomao", "mb_caomao", "ddd_caomao"], - caopi: ["caopi", "v_caopi", "re_caopi", "sb_caopi", "tw_sb_caopi", "huan_caopi", "ps_caopi", "sxrm_caopi"], + caopi: ["caopi", "v_caopi", "re_caopi", "sb_caopi", "tw_sb_caopi", "huan_caopi", "ps_caopi", "sxrm_caopi", "pe_jun_caopi"], caoren: ["caoren", "old_caoren", "sp_caoren", "star_caoren", "sb_caoren", "jsp_caoren", "drag_caoren", "new_caoren", "jy_caoren"], caorui: ["caorui", "re_caorui", "std_caorui", "yy_caorui", "old_caorui"], caoshuang: ["caoshuang", "dc_caoshuang", "ns_caoshuang", "ddd_caoshuang"], @@ -109,7 +110,7 @@ window.noname_character_replace = { hanfu: ["hanfu", "ol_hanfu"], hanhaoshihuan: ["hanhaoshihuan", "re_hanhaoshihuan"], hanlong: ["hanlong", "jd_hanlong", "diy_hanlong"], - hansui: ["hansui", "re_hansui", "xin_hansui", "jsrg_hansui"], + hansui: ["hansui", "re_hansui", "xin_hansui", "jsrg_hansui", "wn_hansui"], haomeng: ["haomeng", "tw_haomeng"], hejin: ["hejin", "re_hejin", "tw_hejin", "jsrg_hejin"], heqi: ["re_heqi", "heqi"], @@ -153,10 +154,10 @@ window.noname_character_replace = { liubiao: ["liubiao", "ol_liubiao", "xin_liubiao", "re_liubiao", "sb_liubiao", "jsrg_liubiao", "std_liubiao", "old_liubiao", "oldre_liubiao"], liuchen: ["liuchen", "re_liuchen", "std_liuchen"], liufeng: ["liufeng", "re_liufeng", "huan_liufeng"], - liuhong: ["liuhong", "ol_jsrg_liuhong", "tw_liuhong", "jsrg_liuhong", "ddd_liuhong"], + liuhong: ["liuhong", "ol_jsrg_liuhong", "tw_liuhong", "jsrg_liuhong", "ddd_liuhong", "pe_jun_liuhong"], liupi: ["ol_liupi", "liupi"], - liushan: ["liushan", "ol_liushan", "re_liushan", "huan_liushan"], - liuxie: ["liuxie", "dc_sb_liuxie", "sp_liuxie", "std_liuxie", "hs_liuxie"], + liushan: ["liushan", "ol_liushan", "re_liushan", "huan_liushan", "pe_jun_liushan"], + liuxie: ["liuxie", "dc_sb_liuxie", "sp_liuxie", "std_liuxie", "hs_liuxie", "pe_jun_liuxie"], liuyan: ["liuyan", "jsrg_liuyan", "junk_liuyan", "diy_liuyan"], liuye: ["dc_liuye", "liuye", "std_liuye", "ddd_liuye"], liuyong: ["liuyong", "jsrg_liuyong"], @@ -230,7 +231,7 @@ window.noname_character_replace = { sunliang: ["sunliang", "xin_sunliang", "ddd_sunliang"], sunluban: ["re_sunluban", "xin_sunluban", "tw_sunluban", "std_sunluban", "sunluban"], sunluyu: ["sunluyu", "re_sunluyu", "mb_sunluyu", "std_sunluyu"], - sunquan: ["sunquan", "re_sunquan", "v_sunquan", "dc_sunquan", "xin_sunquan", "sb_sunquan", "jd_sb_sunquan", "ty_sunquan", "ps_sunquan"], + sunquan: ["sunquan", "re_sunquan", "v_sunquan", "dc_sunquan", "xin_sunquan", "sb_sunquan", "jd_sb_sunquan", "ty_sunquan", "ps_sunquan", "pe_jun_sunquan"], sunru: ["dc_sunru", "ol_sunru", "sunru"], sunshangxiang: ["sunshangxiang", "re_sunshangxiang", "sp_sunshangxiang", "star_sunshangxiang", "sb_sunshangxiang", "jsrg_sunshangxiang", "jd_sb_sunshangxiang"], sunshao: ["sunshao", "sp_sunshao", "std_sunshao"], diff --git a/character/sp/skill.js b/character/sp/skill.js index d8141abbd8..612472cb4b 100644 --- a/character/sp/skill.js +++ b/character/sp/skill.js @@ -1713,9 +1713,8 @@ const skills = { if (game.hasPlayer(current => current.hasSkill("spoljinglei") && !current.storage.counttrigger?.spoljinglei && get.attitude(current, player) > 0 && current.getHp() > 1)) { return get.order({ name: "sha" }) + 0.2; } - return 1; + return get.order({ name: "jiu" }) + 0.1; }, - result: { player: 1 }, nokeep: true, skillTagFilter(player, tag, arg) { if (tag === "nokeep") { diff --git a/image/character/clan_luji.jpg b/image/character/clan_luji.jpg new file mode 100644 index 0000000000..671adb3685 Binary files /dev/null and b/image/character/clan_luji.jpg differ diff --git a/image/character/clan_lujing.jpg b/image/character/clan_lujing.jpg new file mode 100644 index 0000000000..79ce81a080 Binary files /dev/null and b/image/character/clan_lujing.jpg differ diff --git a/image/character/clan_yangbiao.jpg b/image/character/clan_yangbiao.jpg new file mode 100644 index 0000000000..83cdea66be Binary files /dev/null and b/image/character/clan_yangbiao.jpg differ diff --git a/image/character/ol_guanzhang.jpg b/image/character/ol_guanzhang.jpg new file mode 100644 index 0000000000..306fabfc51 Binary files /dev/null and b/image/character/ol_guanzhang.jpg differ diff --git a/noname/library/index.js b/noname/library/index.js index efa061394a..26a7ea02ed 100644 --- a/noname/library/index.js +++ b/noname/library/index.js @@ -15351,6 +15351,23 @@ export class Library { getSpan: () => `${get.prefixSpan("长安")}${get.prefixSpan("神")}`, }, ], + [ + "渭南", + { + showName: "渭", + color: "#2a17d5", + nature: "shenmm", + }, + ], + [ + "渭南神", + { + /** + * @returns {string} + */ + getSpan: () => `${get.prefixSpan("渭南")}${get.prefixSpan("神")}`, + }, + ], [ "TW神", {