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