From 61edbb76eb07bedaaada3775738deddba53eb21b Mon Sep 17 00:00:00 2001 From: copcap Date: Sun, 10 Mar 2024 17:53:53 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=B0=8B=E5=A4=8F=E4=BE=AF=E6=83=87?= =?UTF-8?q?=E3=80=81=E8=B0=8B=E9=AB=98=E9=A1=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/sb.js | 339 ++++++++++++++++++++++++++++++++++++++++++ character/standard.js | 2 +- character/yijiang.js | 2 +- 3 files changed, 341 insertions(+), 2 deletions(-) diff --git a/character/sb.js b/character/sb.js index 9d0f998b4..53f972656 100644 --- a/character/sb.js +++ b/character/sb.js @@ -5,6 +5,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sb', connect:true, character:{ + sb_gaoshun:['male','qun',4,['sbxianzhen','sbjinjiu']], + sb_xiahoudun:['male','wei',4,['sbganglie','sbqingjian']], sb_xunyu:['male','wei',3,['sbquhu','sbjieming']], sb_caopi:['male','wei',3,['sbxingshang','sbfangzhu','sbsongwei'],['zhu']], sb_guanyu:['male','shu',4,['sbwusheng','sbyijue']], @@ -58,6 +60,331 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, skill:{ + //高顺 + sbxianzhen:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget(card,player,target){ + return target!==player; + }, + async content(event,trigger,player){ + const target = event.targets[0]; + player.addTempSkill('sbxianzhen_attack', 'phaseUseAfter'); + player.markAuto('sbxianzhen_attack',target); + }, + ai:{ + expose: 0.2, + order(item,player){ + return get.order({ name: 'sha' }) + 1; + }, + result:{ + target(player,target){ + if (!player.countCards('hs', card => { + return get.name(card) === 'sha' && player.canUse(card, target, false); + })) return -0.1; + if (target.countCards('h') === 1 && player.canCompare(target)) return -2; + return -1.5; + }, + } + }, + subSkill:{ + attack:{ + audio:'sbxianzhen', + trigger:{player:'useCardToPlayered'}, + filter(event,player){ + if (event.card.name !== 'sha') return false; + return player.getStorage('sbxianzhen_attack').includes(event.target) && event.target.isIn() && player.canCompare(event.target); + }, + charlotte:true, + onremove:true, + logTarget:'target', + check(event,player){ + return get.attitude(player, event.target) < 0; + }, + prompt(event,player){ + return `陷阵:是否与${get.translation(event.target)}拼点?` + }, + prompt2(event,player){ + const target = event.target, card = event.card; + return `若你赢,${get.translation(card)}无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;
若其拼点牌为【杀】,则你获得之;
若其拼点牌为其最后的手牌,则${get.translation(card)}对其造成伤害时,此伤害+1。` + }, + group:'sbxianzhen_record', + async content(event,trigger,player){ + const target = trigger.target, card = trigger.card; + const next = player.chooseToCompare(target); + let result = await next.forResult(); + if (result.bool) { + target.addTempSkill('qinggang2'); + target.storage.qinggang2.add(card); + if (trigger.addCount !== false) { + trigger.addCount = false; + const stat = player.getStat('card'); + if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; + } + game.log(card, '无视防具且不计入次数限制'); + if (!player.storage.sbxianzhen_damaged) { + player.storage.sbxianzhen_damaged = true; + player.when('phaseAfter').then(() => { + delete player.storage.sbxianzhen_damaged; + }) + await target.damage(); + await game.asyncDelayx(); + } + } + const toGain = []; + for (const lose_list of next.lose_list) { + let [comparer, cards] = lose_list; + if (!Array.isArray(cards)) cards = [cards]; + if (comparer === player) continue; + for (const card of cards) { + if (get.name(card, comparer) == 'sha' && get.position(card, true) == 'd') { + toGain.push(card); + } + } + } + if (toGain.length) await player.gain(toGain, 'gain2'); + if (player.getStorage('sbxianzhen_recorded').includes(target)) { + const id = target.playerid; + const map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != 'number') { + map[id].extraDamage = 0; + } + map[id].extraDamage++; + game.log(card, '对', target, '造成的伤害+1'); + } + }, + intro:{ + content:'本阶段对$使用牌无距离限制,且使用杀指定其为目标后可以与其拼点', + }, + mod:{ + targetInRange(card,player,target){ + if(player.getStorage('sbxianzhen_attack').includes(target)) return true; + }, + } + }, + record:{ + trigger:{ + global:'loseAsyncEnd', + }, + charlotte:true, + silent:true, + filter(event,player){ + if(event.getParent(2).name !== 'sbxianzhen_attack') return false; + return game.hasPlayer(current => { + if (current.countCards('h')) return false; + const evt = event.getl(current); + return evt && evt.hs && evt.hs.length; + }); + }, + async content(event,trigger,player){ + const targets = []; + game.countPlayer(current => { + if (current.countCards('h')) return false; + const evt = trigger.getl(current); + if(evt && evt.hs && evt.hs.length) targets.add(current); + }); + if (!player.storage.sbxianzhen_recorded) { + player.when('sbxianzhen_attackAfter').then(() => { + delete player.storage.sbxianzhen_recorded; + }) + } + player.markAuto('sbxianzhen_recorded', targets); + }, + }, + } + }, + sbjinjiu:{ + audio:2, + inherit:'rejinjiu', + group:['sbjinjiu_decrease','sbjinjiu_compare'], + global:'sbjinjiu_global', + subSkill:{ + decrease:{ + audio:'sbjinjiu', + forced:true, + trigger:{player:'damageBegin4'}, + filter(event,player){ + return event.getParent(2).jiu; + }, + async content(event,trigger){ + trigger.num = 1; + }, + ai:{ + filterDamage:true, + skillTagFilter(player,tag,arg){ + return arg&&arg.jiu; + }, + }, + }, + global:{ + mod:{ + cardEnabled(card,player){ + if(card.name=='jiu'&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('sbjinjiu')) return false; + }, + cardSavable(card,player){ + if(card.name=='jiu'&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('sbjinjiu')) return false; + }, + }, + }, + compare:{ + trigger:{ + global:'compare', + }, + filter(event,player){ + const participant = [event.player]; + if(event.targets) participant.addArray(event.targets); + else participant.add(event.target); + if (!participant.includes(player)) return false; + if (event.player !== player && event.card1 && event.card1.name === 'jiu') return true; + if (event.target !== player && event.card2 && event.card2.name === 'jiu') return true; + return false; + }, + forced:true, + direct:true, + async content(event,trigger,player){ + for (const [role, ind] of [['player',1], ['target',2]]){ + const current = trigger[role], card = trigger[`card${ind}`]; + if (current !== player && card && card.name === 'jiu') { + await player.logSkill('sbjinjiu_compare', current); + game.log(current, '拼点牌点数视为','#yA'); + trigger[`num${ind}`] = 1; + } + } + } + }, + }, + }, + //夏侯惇 + sbganglie:{ + audio:2, + enable:'phaseUse', + filter(event,player){ + if (!event.sbganglie_enabledTargets) return false; + return game.hasPlayer(current=>{ + return lib.skill.sbganglie.filterTarget(null,player,current); + }); + }, + onChooseToUse(event){ + if (game.online || event.type !== 'phase') return; + const player = event.player; + const chosen = player.getAllHistory('useSkill', evt => evt.skill === 'sbganglie').map(evt => { + return evt.targets; + }).flat(); + const targets = player.getAllHistory('damage', evt => evt.source && evt.source.isIn()).map(evt => evt.source).unique(); + targets.removeArray(chosen); + event.set('sbganglie_enabledTargets',targets); + }, + filterTarget(card,player,target){ + return get.event('sbganglie_enabledTargets').includes(target); + }, + async content(event,trigger,player){ + event.targets[0].damage(2); + }, + ai:{ + order:6, + result:{ + target:-2, + } + }, + }, + sbqingjian:{ + audio:2, + trigger:{ + global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter'], + }, + forced:true, + locked:false, + filter(event,player){ + if (player.getExpansions('sbqingjian').length >= Math.max(1, player.getHp() - 1)) return false; + if (event.name !== 'cardsDiscard') { + if (event.position !== ui.discardPile) return false; + if (!game.hasPlayer(current => { + const evt = event.getl(current); + return evt.cards && evt.cards.length > 0; + })) return false; + } + else{ + const evt = event.getParent(); + if (evt.relatedEvent && evt.relatedEvent.name === 'useCard') return false; + } + return true; + }, + group:'sbqingjian_give', + async content(event,trigger,player){ + let cards = trigger.cards.slice(); + const maxNum = Math.max(1, player.getHp() - 1); + const myLen = player.getExpansions('sbqingjian').length, cardsLen = trigger.cards.length; + const overflow = myLen + cardsLen - maxNum; + if (overflow > 0) cards.randomRemove(overflow); + const next = player.addToExpansion(cards, 'gain2'); + next.gaintag.add('sbqingjian'); + await next; + }, + marktext:'俭', + intro:{ + content:'expansion', + markcount:'expansion', + }, + subSkill:{ + give:{ + audio:'sbqingjian', + trigger:{player:'phaseUseEnd'}, + filter(event,player){ + return player.getExpansions('sbqingjian').length > 0; + }, + forced:true, + locked:false, + async content(event,trigger,player){ + if (_status.connectMode) game.broadcastAll(() => { _status.noclearcountdown = true }); + const given_map = {}; + const expansions = player.getExpansions('sbqingjian'); + let result; + while (true) { + if (expansions.length > 1) { + result = await player.chooseCardButton('清俭:请选择要分配的牌', true, expansions, [1, expansions.length]).set('ai', button => { + if (ui.selected.buttons.length) return 0; + return get.value(button.link, get.player()); + }).forResult(); + } + else if (expansions.length === 1) result = { bool: true, links: expansions.slice(0) }; + else return; + if (!result.bool) return; + const toGive = result.links; + result = await player.chooseTarget(`选择一名角色获得${get.translation(toGive)}`, expansions.length === 1).set('ai', target => { + const att = get.attitude(get.player(), target); + if (get.event('toEnemy')) return Math.max(0.01, 100 - att); + else if (att > 0) return Math.max(0.1, att / (1 + target.countCards('h') + (get.event().getParent().given_map[target.playerid] || 0))); + else return Math.max(0.01, (100 + att) / 100); + }).set('toEnemy', get.value(toGive[0], player, 'raw') < 0).forResult(); + if (result.bool) { + expansions.removeArray(toGive); + if (result.targets.length) { + const id = result.targets[0].playerid; + if (!given_map[id]) given_map[id] = []; + given_map[id].addArray(toGive); + } + if (!expansions.length) break; + } + } + if (_status.connectMode) game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose() }); + const gain_list = []; + for (const i in given_map) { + const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, 'green'); + gain_list.push([source, given_map[i]]); + game.log(source, '获得了', given_map[i]); + } + await game.loseAsync({ + gain_list, + giver: player, + animate: 'gain2', + }).setContent('gaincardMultiple'); + } + }, + }, + }, //荀彧 sbquhu:{ audio:2, @@ -6720,6 +7047,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbquhu_info:'出牌阶段限一次。你可以选择两名有牌的其他角色,你与这些角色同时将任意张牌扣置于武将牌上。若你以此法扣置的牌唯一最少,则扣置牌最多的其他角色获得你扣置的牌,且这些角色获得各自扣置的牌;否则这两名角色中扣置牌较多的角色对较少的角色造成1点伤害,获得你扣置的牌,然后这些角色将各自扣置的牌置入弃牌堆(若这两名角色扣置的牌数相同,视为与你逆时针最近座次的角色扣置牌较多)。', sbjieming:'节命', sbjieming_info:'当你受到伤害后,你可以令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于X,你失去1点体力(X为你已损失的体力值,至少为1)。', + sb_xiahoudun:'谋夏侯惇', + sb_xiahoudun_prefix:'谋', + sbganglie:'刚烈', + sbganglie_info:'出牌阶段,你可以选择一名本局游戏对你造成过伤害且未以此法选择过的角色,你对其造成2点伤害。', + sbqingjian:'清俭', + sbqingjian_info:'①当有一张牌不因使用而进入弃牌堆后,若你的“清俭”数小于X,你将此牌置于你的武将牌上,称为“清俭”(X为你的体力值-1,且至少为1)。②出牌阶段结束时,你将所有“清俭”分配给任意角色。', + sb_gaoshun:'谋高顺', + sb_gaoshun_prefix:'谋', + sbxianzhen:'陷阵', + sbxianzhen_info:'出牌阶段限一次。你可以选择一名其他角色,你于本阶段获得如下效果:⒈你对其使用牌无距离限制;⒉当你使用【杀】指定其为目标后,你可以与其拼点:若你赢,此【杀】无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;若其拼点牌为【杀】,则你获得之;若其拼点牌为其最后的手牌,则此【杀】对其造成伤害时,此伤害+1。', + sbjinjiu:'禁酒', + sbjinjiu_info:'锁定技。①你的【酒】均视为【杀】。②当你受到酒【杀】的伤害时,你令此伤害减至1。③其他角色不能于你的回合内使用【酒】。④当一名其他角色的拼点牌亮出后,若你为发起者或参与者且此牌为【酒】,则此牌的点数视为A。', sb_zhi:'谋攻篇·知', sb_shi:'谋攻篇·识', diff --git a/character/standard.js b/character/standard.js index 86106d945..fc91939dc 100755 --- a/character/standard.js +++ b/character/standard.js @@ -2337,7 +2337,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xuzhu:['xuzhu','re_xuzhu'], zhangliao:['zhangliao','re_zhangliao'], sp_zhangliao:['sp_zhangliao','yj_zhangliao','jsrg_zhangliao'], - xiahoudun:['xiahoudun','re_xiahoudun','xin_xiahoudun'], + xiahoudun:['xiahoudun','re_xiahoudun','xin_xiahoudun','sb_xiahoudun'], liubei:['liubei','re_liubei','sb_liubei','dc_liubei','junk_liubei'], guanyu:['guanyu','re_guanyu','ol_sb_guanyu','sb_guanyu','ps_guanyu','old_guanyu','junk_guanyu'], zhangfei:['zhangfei','re_zhangfei','old_zhangfei','xin_zhangfei','sb_zhangfei','tw_zhangfei','jsrg_zhangfei','yj_zhangfei'], diff --git a/character/yijiang.js b/character/yijiang.js index 83c9ca693..5a0d64b22 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -13912,7 +13912,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xusheng:['xusheng','xin_xusheng','re_xusheng','old_xusheng'], wuguotai:['wuguotai','xin_wuguotai','re_wuguotai'], lingtong:['lingtong','xin_lingtong','ol_lingtong','re_lingtong','old_lingtong'], - gaoshun:['gaoshun','xin_gaoshun','ol_gaoshun','re_gaoshun','old_gaoshun'], + gaoshun:['gaoshun','xin_gaoshun','ol_gaoshun','re_gaoshun','sb_gaoshun','old_gaoshun'], zhonghui:['zhonghui','xin_zhonghui','re_zhonghui','old_zhonghui','pe_zhonghui'], wangyi:['wangyi','re_wangyi','old_wangyi'], caozhang:['caozhang','ol_caozhang','re_caozhang','xin_caozhang'], From 54cd98468e73b68240bb5d984b03656623f68757 Mon Sep 17 00:00:00 2001 From: copcap Date: Sun, 10 Mar 2024 17:55:04 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0get.is.zhuanhuanji?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/sp2.js | 6 ++++-- character/tw.js | 12 ++++-------- character/xianding.js | 4 ++-- noname/get/index.js | 2 +- noname/get/is.js | 14 ++++++++++++++ 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/character/sp2.js b/character/sp2.js index 8af224d1a..7aa16d73b 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -8896,7 +8896,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.expandSkills(list2); for(var k=0;k0; }); }, filterTarget:function(card,player,target){ return target.getSkills(null,false,false).filter(function(i){ - var info=get.info(i); - return info&&info.zhuanhuanji; + return get.is.zhuanhuanji(i,current); }).length>0; }, content:function(){ 'step 0' var list=target.getSkills(null,false,false).filter(function(i){ - var info=get.info(i); - return info&&info.zhuanhuanji; + return get.is.zhuanhuanji(i,current); }); if(list.length==1){ event._result={control:list[0]}; @@ -11584,8 +11581,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ return game.hasPlayer(function(current){ return current.getSkills(null,false,false).filter(function(i){ - var info=get.info(i); - return info&&info.zhuanhuanji; + return get.is.zhuanhuanji(i,current); }).length>0; }); }, diff --git a/character/xianding.js b/character/xianding.js index 904c79a7c..61185e435 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -7936,8 +7936,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, getZhuanhuanji:function(player,bool){ var skills=player.getSkills(null,false,false).filter(function(i){ - var info=get.info(i); - return info&&!info.charlotte&&info.zhuanhuanji; + const list=get.skillCategoriesOf(i); + return !list.includes('Charlotte')&&list.includes('转换技'); }); if(!bool) return skills; if(!skills.length) return 'none'; diff --git a/noname/get/index.js b/noname/get/index.js index 5ebe6b942..cd7a089b3 100644 --- a/noname/get/index.js +++ b/noname/get/index.js @@ -281,7 +281,7 @@ export class Get extends Uninstantable { if (info.zhuSkill) list.add('主公技'); if (info.limited) list.add('限定技'); if (info.juexingji) list.add('觉醒技'); - if (info.zhuanhuanji) list.add('转换技'); + if (get.is.zhuanhuanji(skill, player)) list.add('转换技'); if (info.hiddenSkill) list.add('隐匿技'); if (info.clanSkill) list.add('宗族技'); if (info.groupSkill) list.add('势力技'); diff --git a/noname/get/is.js b/noname/get/is.js index 143bde0f1..f94ba5539 100644 --- a/noname/get/is.js +++ b/noname/get/is.js @@ -443,4 +443,18 @@ export class Is extends Uninstantable { if (info.locked) return true; return false; } + /** + * @param { string } skill + * @param { Player } player + * @returns + */ + static zhuanhuanji(skill, player) { + const info = lib.skill[skill], { zhuanhuanji } = info; + if ('zhuanhuanji2' in info) { + const { zhuanhuanji2 } = info; + if (typeof zhuanhuanji2 === 'function') return Boolean(zhuanhuanji2(skill, player)); + return Boolean(zhuanhuanji2); + } + return Boolean(zhuanhuanji); + } } From f32cff0652e1bdfa05a0dbb244c6807e912dbe2a Mon Sep 17 00:00:00 2001 From: copcap Date: Sun, 10 Mar 2024 17:55:19 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=9D=A8=E5=A5=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/mobile.js | 231 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 230 insertions(+), 1 deletion(-) diff --git a/character/mobile.js b/character/mobile.js index d9b5283ae..c9d18ac0c 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -6,7 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, characterSort:{ mobile:{ - mobile_default:['xin_huojun','muludawang','mb_chengui','mb_huban','mb_xianglang','yanxiang','xin_wuban','laimin','baoxin','jiangji','liwei','xin_guozhao',"miheng","taoqian","lingcao","sunru","lifeng","zhuling","liuye","zhaotongzhaoguang","majun","simazhao","wangyuanji","pangdegong","shenpei","hujinding","zhangyì","jiakui","yangbiao","chendeng","dongcheng","yangyi","dengzhi","zhengxuan","sp_sufei","furong","dingyuan","simashi","yanghuiyu","hucheer","gongsunkang","nanhualaoxian","zhouqun","qiaozhou","fuqian","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi'], + mobile_default:['xin_huojun','muludawang','mb_chengui','mb_huban','mb_xianglang','yanxiang','xin_wuban','laimin','baoxin','jiangji','liwei','xin_guozhao',"miheng","taoqian","lingcao","sunru","lifeng","zhuling","liuye","zhaotongzhaoguang","majun","simazhao","wangyuanji","pangdegong","shenpei","hujinding","zhangyì","jiakui","yangbiao","chendeng","dongcheng","yangyi","dengzhi","zhengxuan","sp_sufei","furong","dingyuan","simashi","yanghuiyu","hucheer","gongsunkang","nanhualaoxian","zhouqun","qiaozhou","fuqian","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi','yangfeng'], mobile_yijiang:["yj_zhanghe","yj_zhangliao","yj_xuhuang","yj_ganning",'yj_huangzhong','yj_weiyan','yj_zhoubuyi'], mobile_standard:["xin_xiahoudun","xin_zhangfei"], mobile_shenhua_feng:['re_xiaoqiao',"xin_zhoutai"], @@ -26,6 +26,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + yangfeng:['male','shu',4,['mbxuetu','mbweiming']], xin_huojun:['male','shu',4,['sidai','jieyu'],['character:tw_huojun','die_audio:tw_huojun']], muludawang:['male','qun','3/3/1',['shoufa','zhoulin','yuxiang']], mb_chengui:['male','qun',3,['guimou','zhouxian']], @@ -178,6 +179,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scs_gaowang:['male','qun','',['scsmiaoyu'],['unseen','sex:male_castrated']], }, characterIntro:{ + yangfeng:'杨奉(?-197年/198年),东汉末年将领。杨奉早年参加白波军起义,曾经帮助李傕对抗郭汜,后来背叛李傕。兴平二年,加号兴义将军,护送汉献帝刘协东归雒阳,颇有功勋,加号车骑将军,屯兵于梁县。建安元年,随着汉献帝迁都许县,失去权力,先后依附于袁术、吕布,劫掠徐州和扬州地区。建安二年(一说三年),带兵进犯刘备领地,被刘备诱杀。', muludawang:'古典小说《三国演义》中的虚构人物,八纳洞主,孟获盟友。擅驱兽法,能行风雨,控制猛兽并指挥它们作战。在法术帮助下最初对蜀军取得一些胜利,但在诸葛亮的喷火木兽将他的动物吓跑后战败,最后死于乱军之中。', laimin:'来敏(165年—261年),字敬达,义阳新野人,东汉太中大夫来歙之后,司空来艳之子,三国时期蜀汉官员。东汉末年,逢董卓之乱,来敏跟随姐夫黄琬到荆州避难,黄琬是刘璋祖母的侄子,来敏又与姐姐来氏入蜀,被刘璋引为宾客。来敏喜欢读书,尤其喜欢《左氏春秋》。刘备平定益州后,以来敏为典学校尉,后立太子,来敏为家令。刘禅继位后,任命来敏为虎贲中郎将,诸葛亮驻汉中,请来敏为军祭酒、辅军将军。却因其口出狂言而被罢官,诸葛亮死后,来敏历任大长秋、光禄大夫、执慎将军等职,期间多次因说错话而被免官,蜀汉景耀年间,来敏去世,时年九十七岁。', shichangshi:'十常侍,指中国东汉(公元25年—220年)灵帝时期(168年-189年)操纵政权的十二个宦官:张让、赵忠、夏恽、郭胜、孙璋、毕岚、栗嵩、段珪、高望、张恭、韩悝、宋典(在小说《三国演义》里,十常侍指的是指张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人),他们都任职中常侍。玩弄小皇帝于股掌之中,以至灵帝称“张常侍是我父,赵常侍是我母”。十常侍自己横征暴敛,卖官鬻爵,他们的父兄子弟遍布天下,横行乡里,祸害百姓,无官敢管。人民不堪剥削、压迫,纷纷起来反抗。当时一些比较清醒的官吏,已看出宦官集团的黑暗腐败,导致大规模农民起义的形势。郎中张钧在给皇帝的奏章中明确指出,黄巾起义是外戚宦官专权逼出来的,他说:“张角所以能兴兵作乱,万人所以乐附之者,其源皆由十常侍多放父兄、子弟、婚宗、宾客典据州郡,辜确财利,侵略百姓,百姓之怨无所告诉,故谋议不轨,聚为‘盗贼’。”后被曹操、袁绍所歼。', @@ -394,6 +396,210 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //杨奉 + mbxuetu:{ + audio:2, + enable:'phaseUse', + usable:2, + filter(event,player){ + if (player.countMark('mbxuetu_status') !== 1 && player.getStat('skill').mbxuetu) return false; + if (!player.storage.mbxuetu) return player.countCards('he'); + return true; + }, + zhuanhuanji2(skill, player){ + return player.countMark('mbxuetu_status') !== 1; + }, + filterCard(card,player){ + if (player.countMark('mbxuetu_status') > 1) return false; + if (player.countMark('mbxuetu_status') === 1) { + if (player.getStorage('mbxuetu_used').includes(false)) return false; + return true; + } + return !player.storage.mbxuetu; + }, + selectCard(){ + const player = get.player(); + if (player.countMark('mbxuetu_status') > 1) return -1; + if (player.countMark('mbxuetu_status') === 1) { + if (player.getStorage('mbxuetu_used').includes(false)) return -1; + if (player.getStorage('mbxuetu_used').includes(true)) return 1; + return [0,1]; + } + return !player.storage.mbxuetu ? 1 : -1; + }, + check(card){ + return 6-get.value(card); + }, + prompt(){ + const player = get.player(), storage = player.storage.mbxuetu, status = player.countMark('mbxuetu_status'); + if (status === 0) { + if (storage) return '转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。'; + return '转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。'; + } + else if (status === 1) { + return '出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。'; + } + else { + if (storage) return '转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。'; + return '转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。'; + } + }, + position:'he', + filterTarget:true, + onremove:['mbxuetu','mbxuetu_status'], + derivation:['mbxuetu_achieve','mbxuetu_fail'], + async content(event,trigger,player){ + const target = event.targets[0], storage = Boolean(player.storage.mbxuetu); + const status = player.countMark('mbxuetu_status'); + player.changeZhuanhuanji('mbxuetu'); + if (status < 2) { + if (!player.storage.mbxuetu_used) { + player.when(['phaseUseAfter', 'mbweiming_achieveAfter']).then(() => { + delete player.storage.mbxuetu_used; + }); + } + player.markAuto('mbxuetu_used', storage); + if (status === 0 && !storage || status === 1 && event.cards.length) { + await target.recover(); + } + else { + await player.loseHp(); + await target.draw(2); + } + } + else { + if (!storage) { + await player.recover(); + await target.chooseToDiscard(2,true,'he'); + } + else { + await player.draw(); + await target.damage(); + } + } + }, + mark:true, + marktext:'☯', + intro:{ + content:(storage,player)=>{ + if (!player.countMark('mbxuetu_status')) { + if (storage) return '转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。'; + return '转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。'; + } + else { + if (storage) return '转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。'; + return '转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。'; + } + } + }, + ai:{ + order(item,player){ + const status = player.countMark('mbxuetu_status'); + if (status > 1) return Math.max(get.order({ name: 'guohe' }), get.order({ name: 'chuqibuyi' })); + if (status === 1 || player.storage.mbxuetu) return 9; + return 2; + }, + result:{ + target(player,target){ + const status = player.countMark('mbxuetu_status'); + if (status > 1) { + if (player.storage.mbxuetu) return -get.damageEffect(target, player, player) / 10; + return -2; + } + if (status === 0 && player.storage.mbxuetu || status === 1 && !ui.selected.cards.length) return 2; + const eff = get.recoverEffect(target, player, player); + return eff > 0 ? 2 : (eff < 0 ? -get.sgnAttitude(player, target) : 0); + }, + player(player,target){ + const status = player.countMark('mbxuetu_status'); + if (status > 1) { + if (player.storage.mbxuetu) return 1; + return get.recoverEffect(player, player) / 6; + } + if (status === 1 || !player.storage.mbxuetu) return -0.5; + const eff = get.effect(player, {name: 'losehp'}, player, player); + if (eff >= 0) return Math.min(1, eff / 2); + const hp = player.getHp() + player.countCards('hes', card => { + return player.canSaveCard(card, player); + }); + return -1.5 * Math.max(0, 3 - hp); + }, + }, + }, + }, + mbweiming:{ + audio:2, + trigger:{ + player:'phaseUseBegin', + }, + filter(event,player){ + return game.hasPlayer(current => { + return !player.getStorage('mbweiming').includes(current); + }); + }, + dutySkill:true, + forced:true, + direct:true, + group:['mbweiming_achieve', 'mbweiming_fail'], + async content(event, trigger, player){ + const targets = await player.chooseTarget('威命:记录一名未记录过的角色','当你杀死没有被记录过的角色后,则〖威命〗使命成功;如果在你杀死这些角色中的一名之前,有被记录过的角色死亡,则你〖威命〗使命失败。',true) + .set('filterTarget', (card, player, target) => { + return !player.getStorage('mbweiming').includes(target); + }) + .set('ai', target => { + if (target === player) return 1; + return 1 + Math.sqrt(Math.abs(get.attitude(player, target))) * Math.abs(get.threaten(target)) / Math.sqrt(target.getHp() + 1) / Math.sqrt(target.countCards('hes') + 1); + }) + .forResultTargets(); + if (targets && targets.length > 0) { + const target = targets[0]; + player.logSkill('mbweiming', target); + player.markAuto('mbweiming', target); + } + }, + intro:{ + content: '已记录$', + }, + subSkill: { + achieve: { + audio:'mbweiming', + trigger:{ + source:'dieAfter', + }, + filter(event,player){ + return !player.getStorage('mbweiming').includes(event.player); + }, + dutySkill:true, + forced:true, + skillAnimation:true, + animationColor:'fire', + async content(event, trigger, player){ + game.log(player,'成功完成使命'); + player.awakenSkill('mbweiming'); + player.storage.mbxuetu_status = 1; + player.unmarkSkill('mbxuetu'); + await game.asyncDelayx(); + } + }, + fail: { + audio:'mbweiming', + trigger:{ + global:'dieAfter', + }, + filter(event,player){ + return player.getStorage('mbweiming').includes(event.player); + }, + dutySkill:true, + forced:true, + async content(event, trigger, player){ + game.log(player,'使命失败'); + player.awakenSkill('mbweiming'); + player.storage.mbxuetu_status = 2; + await game.asyncDelayx(); + } + }, + }, + }, //霍骏 sidai:{ audio:'twsidai', @@ -15644,6 +15850,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ][['豹','鹰','熊','兔'].indexOf(zhoufa)]; return str+'。'; }, + mbxuetu(player){ + const xuetu=player.storage.mbxuetu, status = player.countMark('mbxuetu_status'); + if (status === 0) { + if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; + return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; + } + else if (status === 1) { + return lib.translate.mbxuetu_achieve_info; + } + else { + if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; + return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; + } + }, }, perfectPair:{ simazhao:['simayi','jin_simayi','jin_wangyuanji'], @@ -16526,6 +16746,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sidai_info:'限定技,出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限。', jieyu:'竭御', jieyu_info:'结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为3-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。', + yangfeng:'杨奉', + mbxuetu:'血途', + mbxuetu_info:'转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。', + mbxuetu_achieve:'血途·成功', + mbxuetu_achieve_info:'出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。', + mbxuetu_fail:'血途·失败', + mbxuetu_fail_info:'转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。', + mbweiming:'威命', + mbweiming_info:'使命技,锁定技。①出牌阶段开始时,你记录一名未以此法记录过的角色。②成功:当你杀死一名未被〖威命①〗记录过的角色后,修改〖血途〗为成功版本。③失败:当一名被〖威命①〗记录过的角色死亡后,你修改〖血途〗为失败版本。', mobile_standard:'手杀异构·标准包', mobile_shenhua_feng:'手杀异构·其疾如风', From d132a01117cd3a13d224024f58601558319a4948 Mon Sep 17 00:00:00 2001 From: copcap Date: Sun, 10 Mar 2024 17:55:31 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=8B=BC=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/pinyinjs.js | 1 + 1 file changed, 1 insertion(+) diff --git a/game/pinyinjs.js b/game/pinyinjs.js index 208209ad1..136cae071 100644 --- a/game/pinyinjs.js +++ b/game/pinyinjs.js @@ -76,6 +76,7 @@ var pinyin_dict_polyphone = { "血诏": "xuè ", "血偿": "xuè ", "血拼": "xuè ", + "血途": "xuè ", "行殇": "xíng ", "节行": "jié xíng", "天行": " xíng", From 723e529afa0311ac9f6a9a0e264c6e316623f8a9 Mon Sep 17 00:00:00 2001 From: copcap Date: Sun, 10 Mar 2024 17:55:40 +0800 Subject: [PATCH 5/6] rank --- character/rank.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/character/rank.js b/character/rank.js index 42662b99f..7a36ac7eb 100644 --- a/character/rank.js +++ b/character/rank.js @@ -1068,6 +1068,9 @@ window.noname_character_rank={ 'shen_xuzhu', 'dc_jiangji', 'dc_wangling', + 'yangfeng', + 'sb_xiahoudun', + 'sb_gaoshun', ], b:[ 'junk_guanyu', From 5376db5e253996a205e1df512f70063d86f742d1 Mon Sep 17 00:00:00 2001 From: copcap Date: Sun, 10 Mar 2024 21:42:27 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=96=B0=E6=9D=80=E6=9B=B9=E7=88=BD?= =?UTF-8?q?=E6=B8=90=E4=B8=93=E6=A6=82=E7=8E=87=E8=B0=83=E6=95=B4=E4=B8=BA?= =?UTF-8?q?=E5=B0=8F=E9=81=93=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index 8d2425486..0b8c2f5d8 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -136,6 +136,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).length<4-player.getStorage('dcjianzhuan').length; }, forced:true, + derivation:'dcjianzhuan_faq', async content(event,trigger,player){ const evtx=event.getParent('phaseUse'),num=player.getHistory('useSkill',evt=>{ return evt.skill=='dcjianzhuan'&&evt.event.getParent('phaseUse')==evtx; @@ -163,6 +164,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ discard_target:{ intro:'拆牌', introx:(num)=>'令一名角色弃置'+num+'张牌', + weight:1, ai_effect(player,num){ return game.hasPlayer(target=>{ return get.effect(target,{name:'guohe_copy2'},player,player)>0; @@ -182,6 +184,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ draw_self:{ intro:'摸牌', introx:(num)=>'摸'+num+'张牌', + weight:1, ai_effect(player,num){ return 3; }, @@ -192,6 +195,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ recast_self:{ intro:'重铸', introx:(num)=>'重铸'+num+'张牌', + weight:1, ai_effect(player,num){ return 1; }, @@ -203,6 +207,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ discard_self:{ intro:'弃牌', introx:(num)=>'弃置'+num+'张牌', + weight:'90%', ai_effect(player,num){ let cards=player.getCards('hs'); cards.sort((a,b)=>get.value(b)-get.value(a)); @@ -226,13 +231,36 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, async content(event,trigger,player){ const info=get.info('dcjianzhuan').choices; - let choices=[],map={}; + let map={}; + let unfixedWeightTotal=0,remainedWeight=100; + let entries=[]; for(const i in info){ - map[info[i].intro]=i; + const infox=info[i]; + map[infox.intro]=i; if(player.getStorage('dcjianzhuan').includes(i)) continue; - choices.push(info[i].intro); + let weight=(infox.weight||1).toString(); + if(weight.endsWith('%')){ + weight=Math.min(remainedWeight,parseInt(weight.slice(0,-1))); + entries.push([infox.intro,weight]); + remainedWeight-=weight; + } + else{ + weight=parseInt(weight); + unfixedWeightTotal+=weight; + entries.push([infox.intro,-weight]); + } } - const removeChoice=choices.randomGet(); + entries=entries.map(entry=>{ + let weight=entry[1]; + if(weight<0) weight=-remainedWeight/unfixedWeightTotal*weight; + return [entry[0],weight]; + }); + let rand=Math.random()*100; + let removeChoice=entries.find(entry=>{ + rand-=entry[1]; + return rand<0; + })[0]; + if(get.isLuckyStar(player)&&Object.keys(entries).includes('弃牌')) removeChoice='弃牌'; player.markAuto('dcjianzhuan',[map[removeChoice]]); player.popup(removeChoice); game.log(player,'移去了','#g'+removeChoice,'项'); @@ -13002,6 +13030,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dc_caoshuang_prefix:'新杀', dcjianzhuan:'渐专', dcjianzhuan_info:'锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:⒈令一名角色弃置X张牌;⒉摸X张牌;⒊重铸X张牌;⒋弃置X张牌(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。', + dcjianzhuan_faq:'渐专概率', + dcjianzhuan_faq_info:'
当系统随机选择要删除的选项时,“弃置X张牌”的选项概率固定为90%;剩余选项平分剩余的的10%概率。
如第一次删除时,删除弃牌选项概率为90%,其余三个选项被删除的概率均为3.33%,若删除了非弃牌选项,第二次删除时,删除弃牌选项的概率依旧是90%,其余两个选项被删除的概率均为5%。', dcfanshi:'返势', dcfanshi_info:'觉醒技,结束阶段,若〖渐专①〗剩余选项数小于2,则你执行三次X视为1的剩余选项,然后增加2点体力上限并回复2点体力,失去技能〖渐专〗并获得技能〖覆斗〗。', dcfudou:'覆斗',