diff --git a/character/jsrg/character.js b/character/jsrg/character.js index 51a746f4f..dd41bdf03 100644 --- a/character/jsrg/character.js +++ b/character/jsrg/character.js @@ -112,6 +112,12 @@ const characters = { hp: 3, skills: ["jsrgruzong", "jsrgdaoren"], }, + jsrg_chenfan: { + sex: "male", + group: "qun", + hp: 3, + skills: ["jsrggangfen", "jsrgdangren"], + }, }; export default characters; diff --git a/character/jsrg/dynamicTranslate.js b/character/jsrg/dynamicTranslate.js index 1bbedf0ff..119751b9d 100644 --- a/character/jsrg/dynamicTranslate.js +++ b/character/jsrg/dynamicTranslate.js @@ -5,6 +5,10 @@ const dynamicTranslates = { if (player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; }, + jsrgdangren(player) { + if (player.storage.jsrgdangren) return '转换技。阴:当你需要对自己使用【桃】时,你可以视为使用之。阳:当你可以对其他角色使用【桃】时,你须视为使用之。'; + return '转换技。阴:当你需要对自己使用【桃】时,你可以视为使用之。阳:当你可以对其他角色使用【桃】时,你须视为使用之。'; + }, }; export default dynamicTranslates; diff --git a/character/jsrg/intro.js b/character/jsrg/intro.js index 41a6c2217..0102e1020 100644 --- a/character/jsrg/intro.js +++ b/character/jsrg/intro.js @@ -11,8 +11,9 @@ const characterIntro = { jsrg_guojia: "初平元年二月,郭嘉拜见袁绍,闻曹操怒斥众诸侯,乃对曰:“董卓于汴水或有埋伏,慎之!”曹操未从,果败于徐荣。三月,曹操与郭嘉论天下事:“使孤成大业者,必此人也。”郭嘉从破袁绍,讨谭、尚,连战数克,计定辽东。时年三十八,征乌桓归途郭嘉因劳染疾,命悬之际竟意外饮下柳皮醋水而愈。建安十三年,曹操屯兵赤壁,郭嘉识破连环之计,议上中下三策,可胜刘备。尚未献策,曹操便决意采纳上策,“奉孝之才,足胜孤百倍,卿言上策,如何不取?”由此,赤壁战后曹操尽得天下。", jsrg_zhugeliang: "建兴六年春,汉丞相诸葛亮使赵云、邓芝为先锋,马谡为副将拒箕谷,牵制曹真主力。自率三十万大军攻祁山,三郡叛魏应亮,关中响震。曹叡命张郃拒亮,亮使定军山降将姜维与郃战于街亭,张郃久攻不下。后曹真强攻赵云军,赵云死战,坚守箕谷,马谡、邓芝当场战死忠勇殉国。……既克张郃,曹真溃逃,曹叡弃守长安,迁都邺城。十月,司马懿击退孙权,回援曹真。而后三年,丞相所到之处,无不望风而降,皆箪食壶浆,以迎汉军。尽收豫、徐、兖、并之地,建兴十年春,司马懿父子三人死于诸葛武侯火计,同年,孙权上表称臣,至此四海清平,大汉一统。而后诸葛亮荐蒋琬为丞相,姜维为大将军,自回隆中归隐,后主挽留再三,皆不受。魏延亦辞官相随,侍奉左右。后主时有不决之事,便往隆中拜访相父,均未得面,童子答曰外出云游,遗数锦囊,拆而视之,皆治国之良策也。", jsrg_yuanshao: "太祖圣武皇帝,汝南汝阳人也,姓袁,讳绍,字本初。太祖于黎阳梦有一神授一宝刀,及觉,果在卧所,铭日思召。解之曰:思召,绍字也。 ……灵帝崩,少帝继位。卓议欲废立,太祖拒之,卓案剑吆曰:“竖子敢然!天下之事,岂不在我/我欲为之,谁敢不从!”绍勃然曰:“天下健者,岂惟董乎!”横剑径出。世人方知太祖贤名非以权势取之。实乃英雄气也。初平元年,太祖于勃海起兵,其从弟后将军术等十余位诸侯同时俱起,兴兵讨董。是时,豪杰既多附招,州郡蜂起,莫不以袁氏为名。……太祖既得冀州,尝出猎白登山,见一白鹿口含宝剑而来,获之,剑名中兴。或曰:汉失其鹿,陈逐而获之。建安五年,太祖与曹操战于官渡,曹操欲夜袭乌巢,恰有流星如火,光长十余丈照于曹营,昼有云如坏山,当营而陨, 不及地尺而散,吏士皆以为不详,太祖并兵俱攻大破之,操自军破后,头风病发,六年夏五月死。", - jsrg_yangqiu: "阳球(?-179年),字方正,渔阳泉州(今天津市武清县)人。阳球出身世代豪门,能击剑,习弓马,好申不害、韩非之学。以杀人复仇知名。初举孝谦,补尚书侍郎。后出任高唐令,辟于司徙刘宠府中,举高第。当时九江郡(治阴陵,今安徽定远西北)贼起,三府推举阳球有理奸之才,遂出任九江太守。阳球上任后,设下方略,将凶贼全部歼灭,又收捕郡中奸吏尽杀之。升任平原相,因治事严苦,征诣廷尉,罪当免官。但灵帝以其在九江时有功,任命其为议郎,升任将作大匠,坐事论。不久,任尚书令,奏请罢鸿都文学,书奏不省。光和二年(179年),升任司隶校尉,遂奏收中常侍王甫等人,阳球亲自拷问,五毒备极,王甫父子皆死于杖下。既杀王甫,阳球还欲诛杀曹节等人,使权门屏气,京师震畏。不久,曹节谮毁阳球,使其转任卫尉。其冬,阳球与司徙刘郃等欲诛宦官,反为所诬,遂被收缚洛阳狱,诛死。", - jsrg_zhanghuan: "张奂(104-181年),字然明,又名张焕。敦煌渊泉今甘肃省瓜州县)人,后以功移籍弘农郡(今河南灵宝),书法家张芝的父亲。中国东汉经学家、军事家、文学家,“凉州三明”之一。早年师从太尉朱宠,研习《欧阳尚书》,自行删减《牟氏章句》。汉桓帝时,举贤良出身,对策第一,授议郎,历任安定都尉、武威太守、度辽将军、护匈奴中郎将等职。多次赢得对外战争,招抚外族,促进边境和平,功勋卓著。汉灵帝即位,迁大司农,受到宦官集团利用,讨伐大将军窦武。事后,上疏为窦武等人申冤。累迁太常卿,辞官归乡,授课著书,不再出仕。光和四年(181年),张奂去世,时年七十八。", + yangqiu: "阳球(?-179年),字方正,渔阳泉州(今天津市武清县)人。阳球出身世代豪门,能击剑,习弓马,好申不害、韩非之学。以杀人复仇知名。初举孝谦,补尚书侍郎。后出任高唐令,辟于司徙刘宠府中,举高第。当时九江郡(治阴陵,今安徽定远西北)贼起,三府推举阳球有理奸之才,遂出任九江太守。阳球上任后,设下方略,将凶贼全部歼灭,又收捕郡中奸吏尽杀之。升任平原相,因治事严苦,征诣廷尉,罪当免官。但灵帝以其在九江时有功,任命其为议郎,升任将作大匠,坐事论。不久,任尚书令,奏请罢鸿都文学,书奏不省。光和二年(179年),升任司隶校尉,遂奏收中常侍王甫等人,阳球亲自拷问,五毒备极,王甫父子皆死于杖下。既杀王甫,阳球还欲诛杀曹节等人,使权门屏气,京师震畏。不久,曹节谮毁阳球,使其转任卫尉。其冬,阳球与司徙刘郃等欲诛宦官,反为所诬,遂被收缚洛阳狱,诛死。", + zhanghuan: "张奂(104-181年),字然明,又名张焕。敦煌渊泉今甘肃省瓜州县)人,后以功移籍弘农郡(今河南灵宝),书法家张芝的父亲。中国东汉经学家、军事家、文学家,“凉州三明”之一。早年师从太尉朱宠,研习《欧阳尚书》,自行删减《牟氏章句》。汉桓帝时,举贤良出身,对策第一,授议郎,历任安定都尉、武威太守、度辽将军、护匈奴中郎将等职。多次赢得对外战争,招抚外族,促进边境和平,功勋卓著。汉灵帝即位,迁大司农,受到宦官集团利用,讨伐大将军窦武。事后,上疏为窦武等人申冤。累迁太常卿,辞官归乡,授课著书,不再出仕。光和四年(181年),张奂去世,时年七十八。", + chenfan: "陈蕃(?-168年),字仲举。汝南平舆(今河南省平舆北)人。东汉时期名臣,与窦武、刘淑合称“三君”。陈蕃年少时有大志,举孝廉,授郎中。因母去世,辞官居丧。后由太尉李固荐举为乐安太守。因得罪大将军梁冀,由太守降为县令。为了零陵桂阳的流民山匪得罪皇帝身边的人,被外放为豫章太守。后升任大鸿胪。延熹六年(163年),陈蕃被征为尚书仆射,转太中大夫。延熹八年(165年),陈藩代杨秉为太尉,次年,被免官。永康元年(167年),汉桓帝去世,窦皇后临朝,以陈蕃为太傅,管理尚书事宜。次年,汉灵帝即位,陈藩与大将军窦武谋诛宦官,事泄,宦官曹节劫持汉灵帝与窦太后,诛杀窦武,又率宫中卫士包围了陈蕃,陈蕃率学士80人抵抗,被害,年七十余。", }; export default characterIntro; diff --git a/character/jsrg/skill.js b/character/jsrg/skill.js index ff9d60ccb..969dcf66f 100644 --- a/character/jsrg/skill.js +++ b/character/jsrg/skill.js @@ -3,6 +3,161 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { //江山如故·衰 + //陈蕃 + jsrggangfen: { + trigger: { global: "useCardToPlayer" }, + filter(event, player) { + if (event.card.name !== "sha") return false; + if (event.player === player || event.player.countCards("h") <= player.countCards("h")) return false; + return !event.targets.includes(player) && lib.filter.targetEnabled(event.card, event.player, player); + }, + logTarget: "player", + prompt2(event, player) { + return `你可以成为该角色使用的${get.translation(event.card)}的额外目标,并令所有其他角色也选择是否成为此牌的目标。然后该角色展示所有手牌,若其中的黑色牌数量小于此牌目标数,则此牌无效。`; + }, + check(event, player) { + if ( + event.targets.reduce((p, c) => { + return p + get.effect_use(c, event.card, event.player, player) > 0; + }, 0) >= 0 + ) + return false; + //绝对保守策略:队友数大于来源牌数才发动技能 + return game.countPlayer(current => event.targets.includes(current) || get.attitude(current, player) > 0) > event.player.countCards("h"); + }, + async content(event, trigger, player) { + trigger.targets.add(player); + const source = trigger.player; + const targets = game + .filterPlayer(current => { + return current !== player && current !== source && !trigger.targets.includes(current) && lib.filter.targetEnabled(trigger.card, source, current); + }) + .sortBySeat(); + for (const target of targets) { + const bool = await target + .chooseBool(`是否也成为${get.translation(trigger.card)}的目标?`, `若最终目标数大于${get.translation(source)}手牌中的黑色牌数,则此牌无效。`) + .set("ai", () => get.event("choice")) + .set( + "choice", + (() => { + if (get.attitude(target, player) < 0) return false; + return game.countPlayer(current => trigger.targets.includes(current) || get.attitude(current, player) > 0) > trigger.player.countCards("h"); + })() + ) + .forResult("bool"); + if (bool) { + target.addExpose(0.15); + target.chat("我也上!"); + target.line(source); + trigger.targets.add(target); + game.log(target, "也成为了", trigger.card, "的目标"); + await game.asyncDelayx(); + } + } + await source.showHandcards(); + const blackNum = source.countCards("h", card => get.color(card, source) === "black"); + if (blackNum < trigger.targets.length) { + trigger.getParent().all_excluded = true; + trigger.targets.length = 0; + trigger.untrigger(); + } + }, + ai: { + expose: 0.2, + threaten: 4.5, + }, + }, + jsrgdangren: { + zhuanhuanji: true, + enable: "chooseToUse", + filter(event, player) { + if (player.storage.jsrgdangren) return false; + const card = get.autoViewAs({ name: "tao", isCard: true }); + return event.filterCard(card, player, event) && event.filterTarget(card, player, player); + }, + viewAs: { name: "tao", isCard: true }, + filterTarget(card, player, target) { + return target === player; + }, + selectTarget: -1, + filterCard() { + return false; + }, + selectCard: -1, + 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; + }) + }, + prompt: "视为对自己使用【桃】", + async precontent(event, trigger, player) { + player.logSkill("jsrgdangren"); + player.changeZhuanhuanji("jsrgdangren"); + delete event.result.skill; + }, + hiddenCard(player, name) { + return name === "tao"; + }, + mark: true, + marktext: "☯", + intro: { + content(storage){ + if (storage) return '当你可以对其他角色使用【桃】时,你须视为使用之。'; + return '当你需要对自己使用【桃】时,你可以视为使用之'; + } + }, + group: "jsrgdangren_save", + subSkill: { + save: { + trigger: { player: "chooseToUseBegin" }, + filter(event, player) { + if (event.responded || !player.storage.jsrgdangren) return false; + const card = get.autoViewAs({ name: "tao", isCard: true }); + if (!event.filterCard(card, player, event)) return false; + const backup = _status.event; + _status.event = event; + const hasTarget = game.hasPlayer(current => { + return current !== player && event.filterTarget(card, player, current); + }); + _status.event = backup; + return hasTarget; + }, + async cost(event, trigger, player) { + const card = get.autoViewAs({ name: "tao", isCard: true }); + const backup = _status.event; + _status.event = trigger; + const targets = game.filterPlayer(current => { + return current !== player && trigger.filterTarget(card, player, current); + }); + _status.event = backup; + if (targets.length === 1) { + event.result = { bool: true, targets }; + } else { + event.result = await player + .chooseTarget(true, "当仁:请选择【桃】的目标", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("targets", targets) + .forResult(); + } + }, + async content(event, trigger, player) { + trigger.result = { + bool: true, + card: { name: "tao", isCard: true }, + targets: event.targets, + }; + trigger.untrigger(); + trigger.set("responded", true); + player.changeZhuanhuanji("jsrgdangren") + }, + }, + }, + }, //卢植 jsrgruzong: { trigger: { player: "phaseEnd" }, @@ -85,19 +240,19 @@ const skills = { ai: { order: 2, result: { - player(player, target){ + player(player, target) { const targets = game.filterPlayer(current => { return player.inRange(current) && target.inRange(current); }); if (targets.length === 0) return false; - return targets.reduce((p, c)=>{ + return targets.reduce((p, c) => { let eff = get.damageEffect(c, player, player); if (eff < 0 && current.hp <= 2) { const att = get.attitude(player, current); if (att > 0) eff *= Math.sqrt(att); } return p + eff; - }, 0) + }, 0); }, }, }, @@ -831,7 +986,7 @@ const skills = { .then(() => { allPlayers.forEach(target => { target.unmarkAuto("jsrgzonghai_blocker", [id]); - if (target.getStorage("jsrgzonghai_blocker").length) target.removeSkill("jsrgzonghai_blocker"); + if (!target.getStorage("jsrgzonghai_blocker").length) target.removeSkill("jsrgzonghai_blocker"); }); if (source.isIn()) { targets.forEach(target => target.damage(source)); diff --git a/character/jsrg/translate.js b/character/jsrg/translate.js index 7b27eb27d..11da7425a 100644 --- a/character/jsrg/translate.js +++ b/character/jsrg/translate.js @@ -421,6 +421,12 @@ const translates = { jsrgruzong_info: "回合结束时,若你本回合使用牌指定过的目标角色仅有一名,则你可以将手牌数摸至与其相同。若该角色为你自己,则你可以改为令任意名其他角色将手牌摸至与你相同(均至多摸五张)。", jsrgdaoren: "蹈刃", jsrgdaoren_info: "出牌阶段限一次,你可以将一张手牌交给一名其他角色,然后对你与其攻击范围内均包含的所有角色各造成1点伤害。", + jsrg_chenfan: "衰陈蕃", + jsrg_chenfan_prefix: "衰", + jsrggangfen: "刚忿", + jsrggangfen_info: "当手牌数大于你的角色使用【杀】指定其他角色为目标时,你可以成为此【杀】的额外目标,并令所有其他角色也选择是否如此做。然后使用者展示其手牌,若其黑色手牌数小于目标数,则取消此【杀】的所有目标。", + jsrgdangren: "当仁", + jsrgdangren_info: "转换技。阴:当你需要对自己使用【桃】时,你可以视为使用之。阳:当你可以对其他角色使用【桃】时,你须视为使用之。", }; export default translates; diff --git a/character/rank.js b/character/rank.js index de5b6479f..9891cec2b 100644 --- a/character/rank.js +++ b/character/rank.js @@ -1632,6 +1632,7 @@ window.noname_character_rank = { "old_guanyu", "dc_kongrong", "jsrg_zhangjiao", + "jsrg_chenfan", ], c: [ "xiahoudun", diff --git a/image/character/jsrg_chenfan.jpg b/image/character/jsrg_chenfan.jpg new file mode 100644 index 000000000..6790c710e Binary files /dev/null and b/image/character/jsrg_chenfan.jpg differ