diff --git a/character/mobile.js b/character/mobile.js index 97f0ec514..cb7b15ba2 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -7,7 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterSort:{ mobile:{ mobile_default:['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_yijiang:["yj_zhanghe","yj_zhangliao","yj_xuhuang","yj_ganning",'yj_huangzhong','yj_weiyan'], + 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"], mobile_shenhua_huo:["re_pangtong","re_sp_zhugeliang","re_xunyu","re_dianwei","re_yanwen","xin_yuanshao"], @@ -26,6 +26,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + yj_zhoubuyi:['male','wei',3,['mbhuiyao','mbquesong']], xin_guozhao:['female','wei',3,['yichong','wufei']], xin_zhangyi:['male','shu',4,['xinwurong','shizhi']], xin_sunliang:['male','wu',3,['xinzhizheng','xinkuizhu','xinlijun'],['zhu']], @@ -379,6 +380,95 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //☆周不疑 + mbhuiyao:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:lib.filter.notMe, + content:function(){ + player.damage('nosource'); + target.damage('unreal'); + }, + ai:{ + order:6, + result:{ + target:function(player,target){ + if(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<1) return 0; + var _hp=target.hp,_maxhp=target.maxHp; + target.hp=10; target.maxHp=10; + var att=-get.sgnAttitude(player,target); + var val=get.damageEffect(target,player,target)*att; + target.getSkills(null,false,false).forEach(skill=>{ + var info=get.info(skill); + if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att); + }); + var eff=100/val; + target.hp=_hp; target.maxHp=_maxhp; + if(eff<25) return 0; + return eff/30; + } + } + }, + }, + mbquesong:{ + audio:2, + trigger:{global:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.getHistory('damage').length; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('mbquesong')).set('ai',target=>{ + var player=_status.event.player; + if(get.attitude(player,target)<=0) return 0; + var len=[1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0);hp=target.getHp(); + return len+target.isTurnedOver()*2+1.5*Math.min(4,target.getDamagedHp())/(hp+1); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('mbquesong',target); + var len=[1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0);hp=target.getHp(); + var forced=false; + if(len==0) forced=true; + if(hp==0){ + if(forced) event.finish(); + else event._result={bool:false}; + } + else{ + var str=`${forced?'请':'是否'}弃置${get.cnNumber(hp)}张手牌并回复1点体力${forced?'':'?或点击“取消”摸'+get.cnNumber(len)+'张牌并复原武将牌'}。`; + target.chooseToDiscard(get.translation(player)+'对你发动了【雀颂】',str,forced,'h',hp).set('ai',card=>{ + if(!_status.event.goon) return 0; + return 6-get.value(card); + }).set('goon',function(){ + var _hp=hp+target.isTurnedOver()*1.5; + if(forced||_hp+player.countCards('hs',card=>get.tag(card,'recover'))<=2) return true; + return len>_hp; + }()); + } + } + else event.finish(); + 'step 2' + if(result.bool){ + target.recover(); + } + else{ + target.draw([1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0)); + player.link(false); + player.turnOver(false); + } + }, + ai:{ + expose:0.2, + maixie:true, + skillTagFilter:function(player,tag){ + if(player.getStat().damaged) return false; + }, + } + }, //郭照 yichong:{ init:function(player){ @@ -14009,6 +14099,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yangbiao:['yangbiao','dc_yangbiao','jsrg_yangbiao'], qiaozhou:['yj_qiaozhou','qiaozhou'], sunhanhua:['dc_sunhanhua','sunhanhua'], + zhoubuyi:['zhoubuyi','yj_zhoubuyi'], }, translate:{ liuzan:'手杀留赞', @@ -14671,6 +14762,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yichong_info:'①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到五张牌)。', wufei:'诬诽', wufei_info:'若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于1且A的体力值大于你,则你可以对A造成1点伤害。', + yj_zhoubuyi:'☆周不疑', + mbhuiyao:'慧夭', + mbhuiyao_info:'出牌阶段限一次。你可以受到1点无来源伤害,视为对一名其他角色造成过1点伤害。', + mbquesong:'雀颂', + mbquesong_info:'一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸等同于其装备区中空栏的数量的牌并复原武将牌;2.弃置等同于其体力值的手牌并回复1点体力。', mobile_standard:'手杀异构·标准包', mobile_shenhua_feng:'手杀异构·其疾如风', diff --git a/character/rank.js b/character/rank.js index f92157492..1bc9c5885 100644 --- a/character/rank.js +++ b/character/rank.js @@ -311,6 +311,7 @@ window.noname_character_rank={ 'dc_liubei', 'dc_sunquan', 'yuechen', + 'sunli', 'key_misuzu', 'key_sunohara', 'key_umi', @@ -601,6 +602,8 @@ window.noname_character_rank={ 'ol_zhouqun', 'caoxi', 'zhaoxiang', + 'chenshi', + 'xiahoumao', ], bp:[ 'chess_diaochan', @@ -1254,6 +1257,8 @@ window.noname_character_rank={ 'jsrg_zoushi', 'gaoxiang', 'ol_qianzhao', + 'yj_zhoubuyi', + 'feiyao', ], bm:[ 'diy_xizhenxihong', diff --git a/character/yijiang.js b/character/yijiang.js index ed9417849..9404cb21f 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -14,9 +14,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yijiang_2016:['guohuanghou','sunziliufang','huanghao','liyan','sundeng','cenhun','zhangrang','liuyu'], yijiang_2017:['xinxianying','jikang','wuxian','qinmi','xuezong','xushi','caiyong','caojie'], yijiang_2022:['lukai','kebineng','zhugeshang','liwan','wuanguo','hanlong','yj_sufei','yj_qiaozhou'], + yijiang_2023:['xiahoumao','chenshi','sunli','feiyao'], }, }, character:{ + xiahoumao:['male','wei',4,['tongwei','cuguo']], + chenshi:['male','shu',4,['qingbei']], + sunli:['male','wei',4,['kangli']], + feiyao:['male','wei',4,['zhenfeng']], wuanguo:['male','qun',4,['diezhang','duanwan']], hanlong:['male','wei',4,['duwang','cibei']], yj_qiaozhou:['male','shu',3,['shiming','jiangxi']], @@ -108,6 +113,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yujin:["male","wei",4,["rezhenjun"],[]], }, characterIntro:{ + sunli:'孙礼(?—250年),字德达,涿郡容城县人。三国时期曹魏名将。曹操平定幽州后,孙礼被征召为司空军谋掾。后被任命为河间郡丞,升至荥阳都尉。后孙礼被调为鲁国相。历任山阳、平原、平昌、琅邪郡太守。从大司马曹休在夹石征吴,孙礼谏其不可深入作战,曹休不听遂战败。后孙礼调任阳平郡太守。明帝时入为尚书,受遗诏拜大将军长史,加散骑常侍。曹爽令孙礼出任扬州刺史,加管伏波将军,赐爵关内侯。孙礼率兵御东吴军队,奋不顾身,贼众乃退。朝廷赐绢七百匹,孙礼皆以绢付亡者家,无以入身。后征拜少府,出为荆州刺史,迁冀州牧。爽见礼奏,大怒,劾礼怨望,结刑五岁。在家期年,众人多以为言,除城门校尉。出为并州刺史,加振武将军,使持节,护匈奴中郎将。爽诛后,入为司隶校尉。迁司空,封大利亭侯,邑一百户。嘉平二年(250年),孙礼去世,谥号景侯。其孙孙元继承爵位。《全三国文》录有孙礼文一篇《清河平原争界案图宜属平原疏》。陈寿评曰“孙礼刚断伉厉”。', + xiahoumao:'夏侯楙,字子林,沛国谯县(今安徽省亳州市)人,曹魏名将夏侯惇之子,三国时期魏国官员、将领,其妻为曹操之女清河公主。在魏国历任侍中、尚书、安西将军、镇东将军,假节,封列侯。曾一度驻守曹魏都城长安,但蜀汉北伐后就被调离。', + chenshi:'陈式,生卒年不详,三国时期蜀汉将领。最初为刘备军中重要的基层指挥官,后成长为高级将领。在诸葛亮第三次北伐期间,在诸葛亮的军事指挥下攻克了魏国的武都、阴平二郡。', + feiyao:'费曜(生卒年不详),又作费瑶、费繇,三国时期曹魏将领。魏初,参与平河西之乱。明帝时官任后将军,跟随曹真、司马懿多次对抗蜀汉。《三国演义》中作“费耀”,随曹真和诸葛亮的第二次北伐军作战。怀疑姜维作内应是假,自告奋勇替曹真出征,结果被事先埋伏的姜维包围,自尽而死。', wuanguo:'武安国,历史小说《三国演义》中人物,是北海太守孔融的部将,兵器为一把长柄铁锤,重五十余斤。诸侯伐董时,双方于虎牢关相峙,吕布撰战,一合而斩穆顺,关东军大惊。北海太守孔融部将武安国,使铁锤飞马而出,吕布挥戟拍马来迎,战到十余合,一戟砍断安国手腕,安国弃锤于地而走,八路军兵齐出,这才救了他性命。', hanlong:'韩龙,汉末三国时期刺客。韩龙使得魏国北方边得到数十年的安宁,减少魏国的军政压力,得以休养生息。太和二年,豫遣译夏舍诣比能女婿郁筑鞬部,舍为鞬所杀。其秋,豫将西部鲜卑蒲头、泄归泥出塞讨郁筑鞬,大破之。还至马城,比能自将三万骑围豫七日。上谷太守阎志,阎柔之弟也,素为鲜卑所信。志往解喻,即解围去。后幽州刺史王雄并领校尉,抚以恩信。比能数款塞,诣州奉贡献。至青龙元年,比能诱纳步度根,使叛并州,与结和亲,自勒万骑迎其累重於陉北。并州刺史毕轨遣将军苏尚、董弼等击之,比能遣子将骑与尚等会战於楼烦,临陈害尚、弼。至三年中,雄遣勇士韩龙刺杀比能,更立其弟。', liwan:'李婉(生卒年不详),字淑文,里居不详,贾充之妻,魏晋时期才女,约景元年间(260年前后)在世。著有《典戒》。《隋书·经籍志》载李婉有文集一卷,今失传。', @@ -209,6 +218,288 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhonghui:['jiangwei'], }, skill:{ + //一将2023 + //孙礼 + kangli:{ + audio:2, + trigger:{ + player:'damageEnd', + source:'damageSource', + }, + forced:true, + locked:false, + content:function(){ + 'step 0' + player.draw(2).gaintag=['kangli']; + player.when({source:'damageBegin1'}) + .then(()=>{ + var cards=player.getCards('h',card=>card.hasGaintag('kangli')); + if(cards.length) player.discard(cards); + }) + }, + ai:{ + maixie:true, + } + }, + //夏侯楙 + tongwei:{ + audio:2, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return player.countCards('he',card=>lib.skill.tongwei.filterCard(card,player))>1&&game.hasPlayer(i=>i!=player); + }, + filterTarget:lib.filter.notMe, + filterCard:lib.filter.cardRecastable, + selectCard:2, + position:'he', + discard:false, + lose:false, + delay:false, + check:function(card){ + var num=6.5; + if(ui.selected.cards.length){ + var cardx=ui.selected.cards[0]; + num=get.number(cardx); + } + var del=Math.abs(get.number(card)-num); + return 5+del/5-get.value(card); + }, + content:function(){ + 'step 0' + player.recast(cards); + 'step 1' + var numbers=cards.map(c=>get.number(c,player)).sort((a,b)=>a-b); + target.when('useCard1') + .then(()=>{ + trigger._tongwei_checked=true; + }) + target.when('useCardAfter') + .assign({ + numbers:numbers, + playerx:player, + }) + .filter((event,player)=>{ + return event._tongwei_checked; + }) + .then(()=>{ + var number=get.number(trigger.card); + var numbers=get.info(event.name).numbers; + event.playerx=get.info(event.name).playerx; + if(number<=numbers[0]||number>=numbers[1]) event.finish(); + }) + .then(()=>{ + var playerx=event.playerx; + var names=['sha','guohe'].filter(name=>playerx.canUse({name:name,isCard:true},player,false)); + if(!names.length) event.finish(); + else if(names.length==1) event._result={control:names[0]}; + else playerx.chooseControl(names).set('prompt',`统围:视为对${get.translation(player)}使用一张【杀】或【过河拆桥】`).set('ai',()=>{ + return _status.event.choice; + }).set('choice',function(){ + var list=names.map(name=>{ + return [name,get.effect(player,{name:name,isCard:true},playerx,playerx)]; + }).sort((a,b)=>{ + return b[1]-a[1]; + }); + return list[0][0]; + }()); + }) + .then(()=>{ + var name=result.control; + var card={name:name,isCard:true},playerx=event.playerx; + if(playerx.canUse(card,player,false)) playerx.useCard(card,player); + }) + }, + ai:{ + expose:0.2, + order:7, + threaten:2.2, + result:{ + target:-1, + }, + }, + }, + cuguo:{ + audio:2, + trigger:{player:['shaMiss','eventNeutralized']}, + filter:function(event,player){ + if(event.type!='card'&&event.name!='_wuxie') return false; + if(!event.target||!event.target.isIn()||!player.canUse({ + name:event.card.name, + nature:event.card.nature, + isCard:true, + },event.target,false)) return false; + if(!player.hasCard(card=>lib.filter.cardDiscardable(card,player),'he')) return false; + var history=game.getGlobalHistory('everything'); + for(var evt of history){ + if(evt._neutralized||evt.responded&&(!evt.result||!evt.result.bool)){ + var evtx=evt.getParent(); + return evtx.name=='useCard'&&evtx.player==player&&evt==event; + } + } + return false; + }, + forced:true, + direct:true, + content:function(){ + 'step 0' + var card={ + name:trigger.card.name, + nature:trigger.card.nature, + isCard:true, + storage:{cuguo:true}, + }; + event.card=card; + player.chooseToDiscard('蹙国:请弃置一张牌',`视为你对${get.translation(trigger.target)}使用一张${get.translation(card.nature||'')}【${get.translation(card.name)}】`,'he',true).set('logSkill',['cuguo',trigger.target]); + 'step 1' + if(player.canUse(card,trigger.target,false)){ + player.useCard(card,trigger.target); + player.when('useCardAfter') + .filter(event=>{ + return event.card.storage&&event.card.storage.cuguo; + }) + .then(()=>{ + if(game.hasGlobalHistory('everything',evt=>{ + if(evt._neutralized||evt.responded&&(!evt.result||!evt.result.bool)){ + if(evt.getParent()==trigger) return true; + } + return false; + })){ + player.loseHp(); + } + }) + } + } + }, + //陈式 + qingbei:{ + audio:2, + trigger:{global:'roundStart'}, + direct:true, + content:function(){ + 'step 0' + var next=player.chooseButton(['###擎北:是否选择任意种花色?###