diff --git a/character/jsrg/character.js b/character/jsrg/character.js index dd41bdf03..fa4ee26c4 100644 --- a/character/jsrg/character.js +++ b/character/jsrg/character.js @@ -118,6 +118,12 @@ const characters = { hp: 3, skills: ["jsrggangfen", "jsrgdangren"], }, + jsrg_zhangju: { + sex: "male", + group: "qun", + hp: 4, + skills: ["jsrgqiluan", "jsrgxiangjia"], + }, }; export default characters; diff --git a/character/jsrg/intro.js b/character/jsrg/intro.js index 0102e1020..d05ebd8c5 100644 --- a/character/jsrg/intro.js +++ b/character/jsrg/intro.js @@ -14,6 +14,7 @@ const characterIntro = { yangqiu: "阳球(?-179年),字方正,渔阳泉州(今天津市武清县)人。阳球出身世代豪门,能击剑,习弓马,好申不害、韩非之学。以杀人复仇知名。初举孝谦,补尚书侍郎。后出任高唐令,辟于司徙刘宠府中,举高第。当时九江郡(治阴陵,今安徽定远西北)贼起,三府推举阳球有理奸之才,遂出任九江太守。阳球上任后,设下方略,将凶贼全部歼灭,又收捕郡中奸吏尽杀之。升任平原相,因治事严苦,征诣廷尉,罪当免官。但灵帝以其在九江时有功,任命其为议郎,升任将作大匠,坐事论。不久,任尚书令,奏请罢鸿都文学,书奏不省。光和二年(179年),升任司隶校尉,遂奏收中常侍王甫等人,阳球亲自拷问,五毒备极,王甫父子皆死于杖下。既杀王甫,阳球还欲诛杀曹节等人,使权门屏气,京师震畏。不久,曹节谮毁阳球,使其转任卫尉。其冬,阳球与司徙刘郃等欲诛宦官,反为所诬,遂被收缚洛阳狱,诛死。", zhanghuan: "张奂(104-181年),字然明,又名张焕。敦煌渊泉今甘肃省瓜州县)人,后以功移籍弘农郡(今河南灵宝),书法家张芝的父亲。中国东汉经学家、军事家、文学家,“凉州三明”之一。早年师从太尉朱宠,研习《欧阳尚书》,自行删减《牟氏章句》。汉桓帝时,举贤良出身,对策第一,授议郎,历任安定都尉、武威太守、度辽将军、护匈奴中郎将等职。多次赢得对外战争,招抚外族,促进边境和平,功勋卓著。汉灵帝即位,迁大司农,受到宦官集团利用,讨伐大将军窦武。事后,上疏为窦武等人申冤。累迁太常卿,辞官归乡,授课著书,不再出仕。光和四年(181年),张奂去世,时年七十八。", chenfan: "陈蕃(?-168年),字仲举。汝南平舆(今河南省平舆北)人。东汉时期名臣,与窦武、刘淑合称“三君”。陈蕃年少时有大志,举孝廉,授郎中。因母去世,辞官居丧。后由太尉李固荐举为乐安太守。因得罪大将军梁冀,由太守降为县令。为了零陵桂阳的流民山匪得罪皇帝身边的人,被外放为豫章太守。后升任大鸿胪。延熹六年(163年),陈蕃被征为尚书仆射,转太中大夫。延熹八年(165年),陈藩代杨秉为太尉,次年,被免官。永康元年(167年),汉桓帝去世,窦皇后临朝,以陈蕃为太傅,管理尚书事宜。次年,汉灵帝即位,陈藩与大将军窦武谋诛宦官,事泄,宦官曹节劫持汉灵帝与窦太后,诛杀窦武,又率宫中卫士包围了陈蕃,陈蕃率学士80人抵抗,被害,年七十余。", + zhangju: "张举(生卒年不详),渔阳人,与张纯同郡,是东汉末年起义军将领,曾在汉朝担任泰山太守。中平四年(187年),张举受张纯挑唆,联合乌桓起兵攻打郡县,部众到达了十多万;张举自称天子,张纯自称弥天将军安定王,声称自己将取代汉朝。刘虞担任幽州牧后,用怀柔之策说服乌桓罢兵,并悬赏求购张举、张纯;两人逃出塞外,后来张纯被门客王政所杀,张举则下落不明。", }; export default characterIntro; diff --git a/character/jsrg/skill.js b/character/jsrg/skill.js index 969dcf66f..1f2c3687d 100644 --- a/character/jsrg/skill.js +++ b/character/jsrg/skill.js @@ -3,6 +3,148 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { //江山如故·衰 + //张举 + jsrgqiluan: { + usable: 2, + enable: "chooseToUse", + hiddenCard(player, name) { + return (name === "sha" || name === "shan") && (player.getStat("skill").jsrgqiluan || 0) < 2 && player.countCards("he") > 0; + }, + filter(event, player) { + return (event.filterCard({ name: "sha", isCard: true }, player, event) || event.filterCard({ name: "shan", isCard: true }, player, event)) && player.hasCard(card => lib.filter.cardDiscardable(card, player, "jsrgqiluan")); + }, + chooseButton: { + dialog(event, player) { + const vcards = []; + if (event.filterCard({ name: "sha", isCard: true }, player, event)) vcards.push("sha"); + if (event.filterCard({ name: "shan", isCard: true }, player, event)) vcards.push("shan"); + return ui.create.dialog("起乱", [vcards, "vcard"], "hidden"); + }, + backup(links, player) { + return { + viewAs: { name: links[0][2], isCard: true }, + filterCard: () => false, + selectCard: -1, + popname: true, + async precontent(event, trigger, player) { + delete event.result.skill; + const stat = player.getStat("skill"); + if (!stat.jsrgqiluan) stat.jsrgqiluan = 0; + stat.jsrgqiluan++; + const evt = event.getParent(); + player.logSkill("jsrgqiluan"); + const { cards, targets } = await player + .chooseCardTarget({ + prompt: "弃置任意张牌并选择等量角色", + position: "he", + filterCard: card => lib.filter.cardDiscardable(card, player, "jsrgqiluan"), + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + selectTarget: [1, Infinity], + filterOk() { + return ui.selected.cards.length === ui.selected.targets.length; + }, + forced: true, + }) + .forResult(); + player.line(targets); + targets.sortBySeat(); + const cardsNum = cards.length; + await player.discard(cards); + let hasSomeoneUsed = false; + for (const target of targets) { + const cardName = event.result.card.name; + const chooseToRespondEvent = target.chooseToRespond("是否替" + get.translation(player) + "打出一张" + get.translation(cardName) + "?", {name: cardName}); + chooseToRespondEvent.set("ai", () => { + const event = _status.event; + return get.attitude(event.player, event.source) - 2; + }); + chooseToRespondEvent.set("source", player); + chooseToRespondEvent.set("skillwarn", "替" + get.translation(player) + "打出一张" + get.translation(cardName)); + chooseToRespondEvent.noOrdering = true; + chooseToRespondEvent.autochoose = (cardName === "sha" ? lib.filter.autoRespondSha : lib.filter.autoRespondShan); + const { bool, card, cards } = (await chooseToRespondEvent).result; + if(bool){ + hasSomeoneUsed = true; + event.result.card = card; + event.result.cards = cards; + event.result._apply_args = { throw: false }; + target.addExpose(0.2) + await player.draw(cardsNum) + break; + } + } + if(!hasSomeoneUsed){ + evt.goto(0); + } + }, + }; + }, + prompt(links, player) { + return `请选择【${get.translation(links[0][2])}】的目标`; + }, + }, + //技能收益太低,不写AI了 + }, + jsrgxiangjia: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.getEquips(1).length > 0; + }, + viewAs: { + name: "jiedao", + isCard: true, + }, + filterCard: () => false, + selectCard: -1, + onuse(result, player) { + player.addTempSkill("jsrgxiangjia_effect"); + }, + //技能收益太低,先不写AI了 + subSkill: { + effect: { + charlotte: true, + filter(event, player) { + const card = get.autoViewAs({ name: "jiedao", isCard: true }); + return ( + event.skill === "jsrgxiangjia" && + event.targets.some(current => { + return current.isIn() && current.canUse(card, player); + }) + ); + }, + popup: false, + async content(event, trigger, player) { + const card = get.autoViewAs({ name: "jiedao", isCard: true }); + for (const target of trigger.targets) { + if (target.isIn() && target.canUse(card, player)) { + const result = await target + .chooseTarget(`是否对${get.translation(player)}使用【借刀杀人】?`, `操作提示:直接选择${get.translation(player)}使用【杀】的目标角色`, (card, player, target) => { + const source = get.event("source"); + return lib.card.jiedao.filterAddedTarget(card, player, target, source); + }) + .set("source", player) + .set("ai", target => { + const player = get.player(), + card = get.autoViewAs({ name: "jiedao", isCard: true }); + const source = get.event("source"); + let eff = get.effect(source, card, player, player); + _status.event.preTarget = source; + eff += get.effect(target, card, player, player); + delete _status.event.preTarget; + return eff; + }) + .forResult(); + if (result.bool) { + await target.useCard(get.autoViewAs({ name: "jiedao", isCard: true }), [player, result.targets[0]]); + } + } + } + }, + }, + }, + }, //陈蕃 jsrggangfen: { trigger: { global: "useCardToPlayer" }, @@ -84,14 +226,17 @@ const skills = { return false; }, selectCard: -1, - check(){ + check() { const player = get.player(); if (player.isDying()) return true; - return game.countPlayer(current => { - return current.hp <= 2 && get.attitude(player, current) > 0; - }) > game.countPlayer(current => { - return current.hp <= 2 && get.attitude(player, current) <= 0; - }) + return ( + game.countPlayer(current => { + return current.hp <= 2 && get.attitude(player, current) > 0; + }) > + game.countPlayer(current => { + return current.hp <= 2 && get.attitude(player, current) <= 0; + }) + ); }, prompt: "视为对自己使用【桃】", async precontent(event, trigger, player) { @@ -105,10 +250,10 @@ const skills = { mark: true, marktext: "☯", intro: { - content(storage){ - if (storage) return '当你可以对其他角色使用【桃】时,你须视为使用之。'; - return '当你需要对自己使用【桃】时,你可以视为使用之'; - } + content(storage) { + if (storage) return "当你可以对其他角色使用【桃】时,你须视为使用之。"; + return "当你需要对自己使用【桃】时,你可以视为使用之"; + }, }, group: "jsrgdangren_save", subSkill: { @@ -153,7 +298,7 @@ const skills = { }; trigger.untrigger(); trigger.set("responded", true); - player.changeZhuanhuanji("jsrgdangren") + player.changeZhuanhuanji("jsrgdangren"); }, }, }, diff --git a/character/jsrg/sort.js b/character/jsrg/sort.js index a318345d4..dd3c55c6c 100644 --- a/character/jsrg/sort.js +++ b/character/jsrg/sort.js @@ -3,7 +3,7 @@ const characterSort = { jiangshanrugu_cheng: ["jsrg_sunce", "jsrg_xuyou", "jsrg_lvbu", "jsrg_zhanghe", "jsrg_zoushi", "jsrg_guanyu", "jsrg_chendeng", "jsrg_zhenji", "jsrg_zhangliao", "jsrg_xugong", "jsrg_chunyuqiong"], jiangshanrugu_zhuan: ["jsrg_guojia", "jsrg_zhangfei", "jsrg_machao", "jsrg_lougui", "jsrg_zhangren", "jsrg_huangzhong", "jsrg_xiahourong", "jsrg_sunshangxiang", "jsrg_pangtong", "jsrg_hansui", "jsrg_zhangchu", "jsrg_xiahouen", "jsrg_fanjiangzhangda"], jiangshanrugu_he: ["jsrg_zhugeliang", "jsrg_jiangwei", "jsrg_luxun", "jsrg_zhaoyun", "jsrg_simayi", "jsrg_guoxun", "jsrg_sunlubansunluyu", "jsrg_caofang", "jsrg_sunjun", "jsrg_liuyong", "jsrg_weiwenzhugezhi", "jsrg_zhangxuan", "jsrg_gaoxiang", "jsrg_guozhao"], - jiangshanrugu_shuai: ["jsrg_yuanshao", "jsrg_caojiewangfu", "jsrg_songhuanghou", "jsrg_zhangjiao", "jsrg_dongzhuo", "jsrg_yangqiu", "jsrg_zhanghuan", "jsrg_liubiao", "jsrg_yl_luzhi"], + jiangshanrugu_shuai: ["jsrg_yuanshao", "jsrg_caojiewangfu", "jsrg_songhuanghou", "jsrg_zhangjiao", "jsrg_dongzhuo", "jsrg_yangqiu", "jsrg_zhanghuan", "jsrg_liubiao", "jsrg_yl_luzhi", "jsrg_chenfan", "jsrg_zhangju"], }; const characterSortTranslate = { diff --git a/character/jsrg/translate.js b/character/jsrg/translate.js index 11da7425a..f1d8be26f 100644 --- a/character/jsrg/translate.js +++ b/character/jsrg/translate.js @@ -427,6 +427,12 @@ const translates = { jsrggangfen_info: "当手牌数大于你的角色使用【杀】指定其他角色为目标时,你可以成为此【杀】的额外目标,并令所有其他角色也选择是否如此做。然后使用者展示其手牌,若其黑色手牌数小于目标数,则取消此【杀】的所有目标。", jsrgdangren: "当仁", jsrgdangren_info: "转换技。阴:当你需要对自己使用【桃】时,你可以视为使用之。阳:当你可以对其他角色使用【桃】时,你须视为使用之。", + jsrg_zhangju: "衰张举", + jsrg_zhangju_prefix: "衰", + jsrgqiluan: "起乱", + jsrgqiluan_info: "每回合限两次。当你需要使用【杀】或【闪】时,你可以弃置任意张牌,并令至多等两名其他角色选择是否代替你使用之。若有角色响应,则你摸等同与你弃置牌数的牌。", + jsrgxiangjia: "相假", + jsrgxiangjia_info: "出牌阶段限一次。若你的装备区内有武器牌,则你可以视为使用一张【借刀杀人】。然后此牌的目标角色可以视为对你使用一张【借刀杀人】。", }; export default translates; diff --git a/character/rank.js b/character/rank.js index 9891cec2b..58bfee215 100644 --- a/character/rank.js +++ b/character/rank.js @@ -1633,6 +1633,7 @@ window.noname_character_rank = { "dc_kongrong", "jsrg_zhangjiao", "jsrg_chenfan", + "jsrg_zhangju", ], c: [ "xiahoudun", diff --git a/image/character/jsrg_zhangju.jpg b/image/character/jsrg_zhangju.jpg new file mode 100644 index 000000000..ecacc628e Binary files /dev/null and b/image/character/jsrg_zhangju.jpg differ diff --git a/noname/library/element/content.js b/noname/library/element/content.js index bbafdc06d..71c3af8a7 100644 --- a/noname/library/element/content.js +++ b/noname/library/element/content.js @@ -3538,6 +3538,9 @@ export const Content = { } } } + else{ + delete event.openskilldialog; + } } else if (event.isOnline()) { event.send(); } else { @@ -3755,6 +3758,9 @@ export const Content = { if (event.prompt2) event.dialog.addText(event.prompt2); } } + else{ + delete event.openskilldialog; + } } else if (event.isOnline()) { event.send(); } else {