diff --git a/character/clan.js b/character/clan.js index 951856a9e..96d402563 100644 --- a/character/clan.js +++ b/character/clan.js @@ -59,6 +59,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterTarget:function(card,player,target){ return target.hasSkill('clanlianzhu')&&!target.hasSkill('clanlianzhu_targeted')&&(!target.storage.clanlianzhu||target.storage.clanlianzhu&&game.hasPlayer(current=>{ + if(current==player||current==target) return false; return current.inRangeOf(player)||current.inRangeOf(target); })); }, @@ -73,7 +74,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!target.storage.clanlianzhu){ return ui.selected.cards.length==1; } - return true; + return ui.selected.cards.length==0; }, position:'he', discard:false, @@ -86,6 +87,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.hasSkill('clanlianzhu')&&!target.hasSkill('clanlianzhu_targeted')){ if(target.storage.clanlianzhu){ if(game.hasPlayer(current=>{ + if(current==player||current==target) return false; return current.inRangeOf(player)||current.inRangeOf(target); })) kita.add(target); } @@ -1408,8 +1410,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dynamicTranslate:{ clanlianzhu:function(player){ - if(player.storage.clanlianzhu) return '转换技。每名其他角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; - return '转换技。每名其他角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; + if(player.storage.clanlianzhu) return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; + return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; }, }, translate:{ @@ -1464,7 +1466,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clanhuanjia_info:'出牌阶段结束时,你可以与一名角色拼点。赢的角色可以使用一张拼点牌。然后若此牌:未造成过伤害,你获得另一张拼点牌;造成过伤害,你失去一个技能。', clan_wukuang:'族吴匡', clanlianzhu:'联诛', - clanlianzhu_info:'转换技。每名其他角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。', + clanlianzhu_info:'转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。', clan_wu:'陈留·吴氏', clan_xun:'颍川·荀氏', diff --git a/character/diy.js b/character/diy.js index 78f6a007f..b079808d7 100755 --- a/character/diy.js +++ b/character/diy.js @@ -10043,6 +10043,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'die'}, forced:true, skillAnimation:true, + chargingSkill:true, filter:function(event,player){ return player.hp>0; }, diff --git a/character/extra.js b/character/extra.js index 82e0495b3..e59893b73 100755 --- a/character/extra.js +++ b/character/extra.js @@ -929,7 +929,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ delete evt.result.used; evt.result.card=get.autoViewAs({ name:name, - cards:[result], + cards:[result.links[0]], storage:{shouli:true}, },result.links); evt.result.cards=[result.links[0]]; @@ -2170,9 +2170,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.cancel(); }, ai:{ - target:function(card,player,target){ - if(card&&card.name=='qizhengxiangsheng') return 'zerotarget'; - }, + effect:{ + target:function(card,player,target){ + if(card&&card.name=='qizhengxiangsheng') return 'zerotarget'; + }, + } }, }, global:{ @@ -2597,61 +2599,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.targets.addArray(targets); }, }, - // reshuishi:{ - // audio:'shuishi', - // enable:'phaseUse', - // usable:1, - // filter:function(event,player){ - // return player.maxHp<10; - // }, - // content:function(){ - // 'step 0' - // event.cards=[]; - // event.suits=[]; - // 'step 1' - // player.judge(function(result){ - // var evt=_status.event.getParent('reshuishi'); - // if(evt&&evt.suits&&evt.suits.contains(get.suit(result))) return 0; - // return 1; - // }).set('callback',function(){ - // event.getParent().orderingCards.remove(event.judgeResult.card); - // }).judge2=function(result){ - // return result.bool?true:false; - // }; - // 'step 2' - // event.cards.push(result.card); - // if(result.bool&&player.maxHp<10){ - // event.suits.push(result.suit); - // player.gainMaxHp(); - // event.goto(1); - // } - // else{ - // cards=cards.filterInD(); - // if(cards.length) player.chooseTarget('将'+get.translation(cards)+'交给一名角色',true).set('ai',function(target){ - // var player=_status.event.player; - // var att=get.attitude(player,target)/Math.sqrt(1+target.countCards('h')); - // if(target.hasSkillTag('nogain')) att/=10; - // return att; - // }); - // else event.finish(); - // } - // 'step 3' - // if(result.bool){ - // var target=result.targets[0]; - // event.target=target; - // player.line(target,'green'); - // target.gain(cards,'gain2').giver=player; - // } - // 'step 4' - // if(target.isMaxHandcard()) player.loseMaxHp(); - // }, - // ai:{ - // order:1.2, - // result:{ - // player:1, - // }, - // }, - // }, reshuishi:{ audio:'shuishi', enable:'phaseUse', @@ -6280,7 +6227,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '1':{ audio:'drlt_jieying', trigger:{ - player:'phaseZhunbeiBegin' + player:'phaseBegin' }, forced:true, filter:function(event,player){ @@ -6908,7 +6855,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twwuhun_info:'锁定技。①当你受到其他角色造成的1点伤害后,你令伤害来源获得1枚“梦魇”标记。②当你对有“梦魇”标记的其他角色造成伤害后,你令其获得一枚“梦魇”标记。③当你死亡时,你可进行判定。若结果不为【桃】或【桃园结义】,则你选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)。', shen_zhangfei:'神张飞', shencai:'神裁', - shencai_info:'①出牌阶段限一次,你可以令一名其他角色进行判定。你获得此判定牌,然后若此判定牌:包含以下要素中的任意一个,则其失去已有的下列效果,并获得对应的效果:{⒈体力:当其受到伤害后,其失去等量的体力、⒉武器:其不能使用牌响应杀、⒊打出:当其失去手牌后,其再随机弃置一张手牌(不嵌套触发)、⒋距离:其的结束阶段开始时,其翻面};若均不包含,你获得其区域里的一张牌,其获得一枚“死”并获得如下效果:其的角色手牌上限-X、其的回合结束时,若X大于场上存活人数,则其死亡(X为其“死”标记数)。', + shencai_info:'出牌阶段限一次,你可以令一名其他角色进行判定。你获得此判定牌,然后若此判定牌:包含以下要素中的任意一个,则其失去已有的下列效果,并获得对应的效果:{⒈体力:当其受到伤害后,其失去等量的体力、⒉武器:其不能使用牌响应杀、⒊打出:当其失去手牌后,其再随机弃置一张手牌(不嵌套触发)、⒋距离:其的结束阶段开始时,其翻面};若均不包含,你获得其区域里的一张牌,其获得一枚“死”并获得如下效果:其的角色手牌上限-X、其的回合结束时,若X大于场上存活人数,则其死亡(X为其“死”标记数)。', xunshi:'巡使', xunshi_info:'锁定技。①你手牌区内所有的多目标锦囊牌均视为花色为none的普【杀】。②你使用颜色为none的牌无距离和次数限制。③当你使用无颜色的牌选择目标后,你令你的〖神裁〗的发动次数上限+1(至多为5),然后可以为此牌增加任意个目标。', shen_zhangjiao:'神张角', diff --git a/character/mobile.js b/character/mobile.js index 9ba8fcfed..b03e39542 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -1547,6 +1547,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'yijin', trigger:{player:'phaseBegin'}, forced:true, + check:()=>false, filter:function(event,player){ return !lib.skill.yijin.getKane(player).length; }, @@ -3152,7 +3153,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseButton([get.prompt('spyanji'),[['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'],'vcard']]).set('ai',()=>Math.random()); + player.chooseButton([get.prompt('spzhengjun'),[['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'],'vcard']]).set('ai',()=>Math.random()); 'step 1' if(result.bool){ player.logSkill('spzhengjun',player); @@ -5041,6 +5042,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'yinlang', trigger:{player:'phaseBegin'}, direct:true, + forced:true, + locked:false, filter:function(event,player){ return !player.hasSkill('yaohu_round')&&game.hasPlayer(function(current){ return current.group&¤t.group!='unknown'; @@ -6568,11 +6571,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ game.log(player,'移去了所有','#g【备】'); player.unmarkSkill('xingqi'); + player.addTempSkill('xinzifu_limit'); + player.addMark('xinzifu_limit',1,false); }, ai:{ neg:true, combo:'xingqi', }, + subSkill:{ + limit:{ + charlotte:true, + markimage:'image/card/handcard.png', + intro:{ + content:function(storage,player){ + var num=-player.countMark('xinzifu_limit'); + return '手牌上限'+num; + } + }, + mod:{ + maxHandcard:function(player,num){ + return num-player.countMark('xinzifu_limit'); + } + }, + } + } }, mibei:{ audio:2, @@ -17200,7 +17222,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ly_piliche:{ trigger:{source:'damageSource'}, check:function(event,player){ - return get.attitude(player,event.player)*get.value(event.player.getDiscardableCards(player,'e'),event.player)>0; + return get.attitude(player,event.player)*get.value(event.player.getDiscardableCards(player,'e'),event.player)<=0; }, filter:function(event,player){ return player!=event.player&&event.player.countDiscardableCards(player,'e')>0; @@ -17821,11 +17843,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_chendong:['tw_chendong','sp_chendong','chendong'], sp_jiangqing:['tw_jiangqing','sp_jiangqing','jiangqing'], zhaotongzhaoguang:['dc_zhaotongzhaoguang','zhaotongzhaoguang'], - yangbiao:['yangbiao','dc_yangbiao'], + yangbiao:['yangbiao','dc_yangbiao','jsrg_yangbiao'], qiaozhou:['yj_qiaozhou','qiaozhou'], sunhanhua:['dc_qiaozhou','sunhanhua'], sp_duyu:['sp_duyu','pk_sp_duyu'], - kongrong:['sp_kongrong','kongrong'], + kongrong:['sp_kongrong','jsrg_kongrong','kongrong'], }, translate:{ liuzan:'手杀留赞', diff --git a/character/offline.js b/character/offline.js index 88aad77ff..382b04365 100644 --- a/character/offline.js +++ b/character/offline.js @@ -9,6 +9,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ offline_sticker:['sp_gongsunzan','sp_simazhao','sp_wangyuanji','sp_xinxianying','sp_liuxie'], offline_luanwu:["ns_lijue","ns_zhangji","ns_fanchou"], offline_yongjian:["ns_chendao","yj_caoang","yj_caocao",'yj_liru','yj_caohong','yj_zhangfei','yongjian_ganning','yj_dongzhuo','yj_xuyou','yj_jiaxu','yj_zhenji'], + offline_jiangshanruguqi:['jsrg_liuhong','jsrg_hejin','jsrg_sunjian','jsrg_huangfusong','jsrg_xushao','jsrg_dongbai','jsrg_qiaoxuan','jsrg_yangbiao','jsrg_kongrong','jsrg_zhujun','jsrg_liubei','jsrg_wangyun','jsrg_liuyan','jsrg_caocao','jsrg_nanhualaoxian'], offline_piracyE:['shen_jiaxu','pe_wangyun','pe_zhonghui','pe_sunchen','pe_mengda','pe_wenqin','ns_caoanmin','jiangfei','chendong','jiangqing','kongrong','jiling','tianfeng','mateng'], offline_piracyS:['ns_jiaxu','longyufei','ps_guanyu','ps1059_guojia','ps2070_guojia','ps2063_zhaoyun','ps2067_zhaoyun','ps1062_zhouyu','ps2080_zhouyu','ps_caozhi','ps_jin_simayi','ps_caopi','ps_simayi','ps2068_simayi','ps_machao','ps_zhugeliang','ps2066_zhugeliang','ps_jiaxu','ps_lvbu','ps_shen_machao','jsp_liubei'], offline_piracyK:['pk_sp_duyu'], @@ -16,6 +17,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + jsrg_liuhong:['male','qun',4,['jsrgchaozheng','jsrgshenchong','jsrgjulian'],['zhu']], + jsrg_hejin:['male','qun',4,['jsrgzhaobing','jsrgzhuhuan','jsrgyanhuo']], + jsrg_sunjian:['male','qun',4,['jsrgpingtao','jsrgjuelie']], + jsrg_huangfusong:['male','qun',4,['jsrgguanhuo','jsrgjuxia']], + jsrg_xushao:['male','qun',3,['jsrgyingmen','jsrgpingjian'],['unseen']], + jsrg_dongbai:['female','qun',3,['jsrgshichong','jsrglianzhu']], + jsrg_qiaoxuan:['male','qun',3,['jsrgjuezhi','jsrgjizhao']], + jsrg_yangbiao:['male','qun','3/4',['jsrgzhaohan','jsrgrangjie','jsrgyizheng']], + jsrg_kongrong:['male','qun',3,['jsrglirang','jsrgzhengyi']], + jsrg_zhujun:['male','qun',4,['jsrgfendi','jsrgjuxiang']], + jsrg_liubei:['male','qun',4,['jsrgjishan','jsrgzhenqiao']], + jsrg_wangyun:['male','qun',3,['jsrgshelun','jsrgfayi']], + jsrg_liuyan:['male','qun',3,['xinfu_limu','jsrgtushe','jsrgtongjue'],['zhu']], + jsrg_caocao:['male','qun',4,['jsrgzhenglve','jsrghuilie']], + jsrg_nanhualaoxian:['male','qun',3,['jsrgshoushu','jsrgxundao','jsrglinghua']], ps_shen_machao:['male','shen',4,['psshouli','pshengwu'],['qun']], mateng:['male','qun',4,['mashu','xiongyi']], tianfeng:['male','qun',3,['sijian','gzsuishi']], @@ -87,6 +103,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ longyufei:'《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。', pk_sp_duyu:'杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。', ps_shen_machao:'字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。', + qiaoxuan:'桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。', }, characterTitle:{ jsp_liubei:'S1019', @@ -133,6 +150,2023 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //江山如故·起 + jsrgchaozheng:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + logTarget:function(event,player){ + return game.filterPlayer(i=>i!=player); + }, + prompt:'是否发动【朝争】?', + content:function(){ + player.chooseToDebate(game.filterPlayer(i=>i!=player)).set('callback',lib.skill.jsrgchaozheng.callback); + }, + callback:function(){ + var result=event.debateResult; + if(result.bool&&result.opinion){ + var opinion=result.opinion,targets=result.red.map(i=>i[0]); + targets.sortBySeat(); + targets.forEach(i=>i[opinion=='red'?'recover':'loseHp']()); + if(targets.length==0||result.black.length==0) player.draw(result.targets.length); + } + } + }, + jsrgshenchong:{ + audio:2, + enable:'phaseUse', + limited:true, + filterTarget:lib.filter.notMe, + skillAnimation:true, + animationColor:'soil', + content:function(){ + 'step 0' + player.awakenSkill('jsrgshenchong'); + target.addSkillLog('jsrgfeiyang'); + target.addSkillLog('jsrgbahu'); + 'step 1' + player.addSkill('jsrgshenchong_die'); + player.markAuto('jsrgshenchong_die',[target]); + }, + ai:{ + order:1, + result:{target:1} + }, + subSkill:{ + die:{ + audio:'jsrgshenchong', + trigger:{player:'die'}, + charlotte:true, + forced:true, + forceDie:true, + filter:function(event,player){ + return player.getStorage('jsrgshenchong_die').length; + }, + content:function(){ + var targets=player.getStorage('jsrgshenchong_die'); + player.line(targets); + targets.sortBySeat().forEach(current=>{ + current.clearSkills(true); + current.chooseToDiscard(current.countCards('h'),'h',true); + }); + } + } + } + }, + jsrgfeiyang:{ + trigger:{player:'phaseJudgeBegin'}, + direct:true, + filter:function(event,player){ + return player.countCards('j')&&player.countCards('h')>1; + }, + content:function(){ + 'step 0' + player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ + return 6-get.value(card); + }); + 'step 1' + if(result.bool){ + player.discardPlayerCard(player,'j',true); + } + }, + }, + jsrgbahu:{ + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + content:function(){ + player.draw(); + }, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+1; + }, + }, + }, + jsrgjulian:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.hasZhuSkill('jsrgjulian')&&lib.skill.jsrgjulian.logTarget(null,player).length; + }, + prompt:'是否发动【聚敛】?', + prompt2:'你可以获得其他所有群势力角色的各一张牌', + logTarget:function(event,player){ + return game.filterPlayer(current=>{ + return current.group=='qun'&¤t.countGainableCards(player,'h')>0&¤t!=player; + }) + }, + content:function(){ + game.filterPlayer(current=>{ + return current.group=='qun'&¤t!=player; + }).sortBySeat().forEach(i=>{ + player.gainPlayerCard(i,'h',true); + }); + }, + group:'jsrgjulian_draw', + zhuSkill:true, + subSkill:{ + draw:{ + audio:'jsrgjulian', + trigger:{global:'gainAfter'}, + filter:function(event,player){ + var source=event.player; + if(source==player||source.group!='qun') return false; + var evt=event.getParent('phaseDraw'); + return (!evt||evt.player!=source)&&event.getParent().name=='draw'&&event.getParent(2).name!='jsrgjulian_draw'&&player.hasZhuSkill('jsrgjulian',event.player); + }, + direct:true, + usable:2, + content:function(){ + 'step 0' + var source=trigger.player; + event.source=source; + source.chooseBool('是否响应'+get.translation(player)+'的【聚敛】摸一张牌?'); + 'step 1' + if(result.bool){ + source.logSkill('jsrgjulian_draw',player); + source.draw(); + } + else player.storage.counttrigger.jsrgjulian_draw--; + } + }, + give:{ + charlotte:true, + onremove:true + } + } + }, + //何进 + jsrgzhaobing:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + filter:function(event,player){ + var hs=player.getCards('h'); + if(!hs.length) return false; + for(var i of hs){ + if(!lib.filter.cardDiscardable(i,player,'jsrgzhaobing')) return false; + } + return true; + }, + content:function(){ + 'step 0' + var cards=player.getCards('h'); + var num=cards.length; + var prompt2='弃置所有手牌,令至多'+get.cnNumber(num)+'名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力'; + player.chooseTarget(get.prompt('jsrgzhaobing'),prompt2,[1,num],lib.filter.notMe).set('ai',target=>{ + if(!_status.event.goon) return 0; + return 2-get.attitude(_status.event.player,target); + }).set('goon',num/2{ + return 2-get.attitude(player,current)>0; + })); + 'step 1' + if(result.bool){ + player.logSkill('jsrgzhaobing',result.targets); + event.targets=result.targets; + event.targets.sortBySeat(); + player.chooseToDiscard(true,'h',player.countCards('h')); + } + else event.finish(); + 'step 2' + var target=targets.shift(); + event.target=target; + target.chooseCard('诏兵:交给'+get.translation(player)+'一张【杀】,或失去1点体力',(card)=>{ + return get.name(card)=='sha'; + }).set('ai',card=>{ + if(_status.event.goon) return 0; + return 6-get.value(card); + }).set('goon',get.effect(target,{name:'losehp'},target,target)>=0); + 'step 3' + if(result.bool) target.give(result.cards,player,true); + else target.loseHp(); + if(targets.length) event.goto(2); + }, + ai:{ + expose:0.2 + } + }, + jsrgzhuhuan:{ + audio:'mouzhu', + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + var hs=player.getCards('h','sha'); + if(!hs.length) return false; + for(var i of hs){ + if(!lib.filter.cardDiscardable(i,player,'jsrgzhuhuan')) return false; + } + return true; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgzhuhuan'),lib.filter.notMe).set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgzhuhuan',target); + var hs=player.getCards('h','sha'); + event.num=hs.length; + player.discard(hs); + } + else event.finish(); + 'step 2' + target.chooseToDiscard(get.translation(player)+'对你发动了【诛宦】','弃置'+get.cnNumber(num)+'张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸'+get.cnNumber(num)+'张牌').set('ai',card=>{ + if(_status.event.goon) return 0; + return 5.5-get.value(card); + }).set('goon',target.hp<=2||get.attitude(target,player)>=0||player.isHealthy()); + 'step 3' + if(result.bool){ + target.loseHp(); + } + else{ + player.draw(num); + player.recover(); + } + }, + ai:{ + expose:0.2 + } + }, + jsrgyanhuo:{ + inherit:'spyanhuo', + forced:true, + }, + //孙坚 + jsrgpingtao:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:lib.filter.notMe, + content:function(){ + 'step 0' + var att=get.attitude(target,player); + target.chooseCard(get.translation(player)+'对你发动了【平讨】','交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】','he').set('ai',card=>{ + if(_status.event.give){ + if(card.name=='sha'||card.name=='tao'||card.name=='jiu') return 0; + return 8-get.value(card); + } + if(_status.event.att<0&&card.name=='sha') return -1; + return 4-get.value(card); + }).set('give',(att>=0||target.hp==1&&target.countCards('hs','shan')<=1)&&get.effect(target,{name:'sha'},player,target)<0).set('att',att); + 'step 1' + if(result.bool){ + target.give(result.cards,player); + player.addTempSkill('jsrgpingtao_sha'); + player.addMark('jsrgpingtao_sha',1,false); + } + else if(player.canUse('sha',target,false)){ + player.useCard({name:'sha',isCard:true},target,false); + } + }, + ai:{ + expose:0.15, + order:5, + result:{target:-1} + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + marktext:'讨', + intro:{ + content:'本回合使用【杀】的次数上限+#', + }, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('jsrgpingtao_sha'); + }, + } + } + } + }, + jsrgjuelie:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.card&&event.card.name=='sha'&&event.getParent().type=='card'&&(player.isMinHandcard()||player.isMinHp()); + }, + forced:true, + locked:false, + group:'jsrgjuelie_discard', + content:function(){ + trigger.num++; + }, + shaRelated:true, + ai:{ + unequip_ai:true, + skillTagFilter:function(player,tag,arg){ + if(!arg||!arg.name||arg.name!='sha') return false; + if(!arg.target) return false; + var card=arg.target.getEquip(2); + return card&&get.value(card)>0&&player.hasCard(cardx=>{ + return lib.filter.cardDiscardable(cardx,player,'jsrgjuelie_discard')&&get.value(cardx)<5; + }); + }, + }, + subSkill:{ + discard:{ + audio:'jsrgjuelie', + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + return player.countCards('he')&&event.card.name=='sha'; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌',[1,Infinity],'he').set('ai',card=>{ + if(ui.selected.cards.length>=_status.event.max) return 0; + if(_status.event.goon) return 4.5-get.value(card); + return 0; + }).set('max',trigger.target.countDiscardableCards(player,'he')).set('goon',get.attitude(player,trigger.target)<0).set('logSkill',['jsrgjuelie_discard',trigger.target]); + 'step 1' + if(result.bool){ + var num=result.cards.length; + if(trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard('平讨:弃置'+get.translation(trigger.target)+get.cnNumber(num)+'张牌',num,'he',trigger.target,true); + } + } + } + } + }, + //皇甫嵩 + jsrgguanhuo:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + return event.card.storage&&event.card.storage.jsrgguanhuo&&!game.hasPlayer2(current=>{ + return current.hasHistory('damage',evt=>evt.card==event.card); + }); + }, + forced:true, + locked:false, + group:'jsrgguanhuo_viewas', + content:function(){ + 'step 0' + var count=player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length; + if(count==1){ + player.addTempSkill('jsrgguanhuo_ex','phaseUseAfter'); + player.addMark('jsrgguanhuo_ex',1,false); + trigger.targets.forEach(i=>i.removeSkill('huogong2')); + } + else{ + player.removeSkill('jsrgguanhuo'); + game.log(player,'失去了技能','#g【观火】'); + } + }, + ai:{ + effect:{ + player:function(card,player){ + if(_status.event.getParent().skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length==1) return 'zeroplayertarget'; + if(_status.event.type=='phase'&&_status.event.skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length>1&&player.countCards('h')<=3) return [0,0]; + } + } + }, + subSkill:{ + viewas:{ + audio:'jsrgguanhuo', + enable:'phaseUse', + viewAs:{ + name:'huogong', + isCard:true, + storage:{ + jsrgguanhuo:true + } + }, + filterCard:()=>false, + selectCard:-1, + prompt:'视为使用一张【火攻】', + ai:{ + order:function(item,player){ + return get.order({name:'huogong'})+0.01; + }, + } + }, + ex:{ + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.card&&event.card.name=='huogong'&&event.getParent().type=='card'; + }, + forced:true, + charlotte:true, + onremove:true, + intro:{content:'当你造成渠道为【火攻】的伤害时,此伤害+#'}, + content:function(){ + trigger.num+=player.countMark('jsrgguanhuo_ex'); + } + } + } + }, + jsrgjuxia:{ + audio:2, + trigger:{target:'useCardToTargeted'}, + usable:1, + countSkill:function(player){ + return player.getSkills(null,false,false).filter(function(skill){ + var info=get.info(skill); + if(!info||info.charlotte) return false; + if(info.zhuSkill) return player.hasZhuSkill(skill); + return true; + }).length; + }, + filter:function(event,player){ + return event.player!=player&&lib.skill.jsrgjuxia.countSkill(event.player)>lib.skill.jsrgjuxia.countSkill(player); + }, + direct:true, + content:function(){ + 'step 0' + var goon=get.effect(player,trigger.card,trigger.player,trigger.player)<1; + if(goon&&!event.isMine()&&!event.isOnline()) game.delayx(); + trigger.player.chooseBool('是否对'+get.translation(player)+'发动【居下】?','令'+get.translation(trigger.card)+'对其无效,然后其摸两张牌').set('ai',()=>{ + return _status.event.goon; + }).set('goon',goon); + 'step 1' + if(result.bool){ + trigger.player.logSkill('jsrgjuxia',player); + trigger.excluded.add(player); + player.draw(2); + } + else player.storage.counttrigger.jsrgjuxia--; + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(lib.skill.jsrgjuxia.countSkill(target)>=lib.skill.jsrgjuxia.countSkill(player)) return; + if(card&&(card.cards||card.isCard)&&get.attitude(target,player)>0&&(!target.storage.counttrigger||!target.storage.counttrigger.jsrgjuxia)) return [0,0.5,0,0.5]; + }, + }, + } + }, + //许劭 + jsrgyingmen:{ + audio:2, + trigger:{ + global:'phaseBefore', + player:['enterGame','phaseBegin'], + }, + forced:true, + filter:function(event,player,name){ + if(player.getStorage('jsrgyingmen').length>=4) return false; + if(name=='phaseBefore') return game.phaseNumber==0; + return event.name!='phase'||event.player==player; + }, + update:function(player){ + var id=player.playerid; + var characters=player.getStorage('jsrgyingmen'); + var skillName='jsrgpingjian_'+id; + var skillsx=[],skillsx2=[]; + var map={}; + var skillsy=lib.skill[skillName]?lib.skill[skillName].group:[]; + for(var name of characters){ + var skills=lib.character[name][3].slice(); + skills=skills.filter(skill=>{ + var list=get.skillCategoriesOf(skill,player); + list.removeArray(['锁定技','Charlotte']); + if(list.length) return false; + var info=get.info(skill); + return info&&(!info.unique||info.gainable); + }); + game.expandSkills(skills); + for(var i=0;i{ + return lib.skill.jsrgyingmen.bannedList.contains(skill); + })) continue; + list.push(name); + _status.characterlist.remove(name); + if(list.length>=4-num) break; + } + if(list.length){ + player.markAuto('jsrgyingmen',list); + if(player.hasSkill('jsrgpingjian',null,false,false)) lib.skill.jsrgyingmen.update(player); + game.log(player,'将','#g'+get.translation(list),'置为','#y访客'); + game.broadcastAll(function(player,list){ + var cards=[]; + for(var i=0;i{ + return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; + })) return true; + } + return false; + }, + content:function(){ + 'step 0' + var current; + var skill=trigger.skill,name=trigger.event?trigger.event.name:''; + var visitors=player.getStorage('jsrgyingmen'); + for(var visitor of visitors){ + var skills=lib.character[visitor][3].slice(); + game.expandSkills(skills); + var info=get.info(skill); + if(info&&info.charlotte) continue; + if(skills.some(skillx=>{ + return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; + })){ + current=visitor; + break; + } + } + event.current=current; + player.chooseButton(['###评鉴:移去一名访客###
若移去的访客为'+get.translation(current)+',则你摸一张牌
',[player.getStorage('jsrgyingmen'),'character']],true).set('ai',button=>{ + if(button.link==_status.event.toremove) return 1; + return Math.random(); + }).set('toremove',function(){ + var list=player.getStorage('jsrgyingmen'); + var rand=Math.random(); + if(rand<0.33) return list[0]; + if(rand<0.66) return current; + return list.randomGet(); + }()); + 'step 1' + if(result.bool){ + var visitor=result.links[0]; + game.log(player,'从','#y访客','中移去了','#g'+get.translation(visitor)); + player.popup(visitor); + player.unmarkAuto('jsrgyingmen',[visitor]); + _status.characterlist.add(visitor); + if(visitor==event.current) player.draw(); + lib.skill.jsrgyingmen.update(player); + } + }, + subSkill:{ + blocker:{ + init:function(player,skill){ + player.addSkillBlocker(skill); + }, + onremove:function(player,skill){ + player.removeSkillBlocker(skill); + }, + charlotte:true, + locked:true, + skillBlocker:function(skill,player){ + if(skill!='jsrgpingjian_'+player.playerid) return false; + if(player._jsrgpingjian_blockerChecking) return; + player._jsrgpingjian_blockerChecking=true; + var own=player.hasSkill('jsrgpingjian'); + delete player._jsrgpingjian_blockerChecking; + return !own; + } + }, + } + }, + //董白 + jsrgshichong:{ + audio:2, + zhuanhuanji:true, + trigger:{player:'useCardToPlayered'}, + direct:true, + filter:function(event,player){ + return event.target!=player&&event.targets.length==1&&event.target.isIn()&&event.target.countCards('h'); + }, + mark:true, + marktext:'☯', + intro:{ + content:function(storage,player){ + var str='转换技。当你使用牌指定其他角色为唯一目标后,'; + if(storage) return str+'目标角色可以交给你一张手牌。'; + return str+'你可以获得目标角色一张手牌。'; + }, + }, + content:function(){ + 'step 0' + if(!player.storage.jsrgshichong){ + player.chooseBool(get.prompt('jsrgshichong',trigger.target),'你可以获得该角色的一张手牌').set('ai',()=>{ + return _status.event.bool; + }).set('bool',get.attitude(player,trigger.target)<=0); + } + else{ + trigger.target.chooseCard('是否发动'+get.translation(player)+'的【恃宠】?','你可以选择一张手牌,并交给该角色').set('ai',card=>{ + if(_status.event.goon) return 5-get.value(card); + return 0-get.value(card); + }).set('goon',get.attitude(trigger.target,player)>2); + } + 'step 1' + if(result.bool){ + if(!player.storage.jsrgshichong){ + player.logSkill('jsrgshichong',trigger.target); + player.gainPlayerCard(trigger.target,'h',true); + } + else{ + trigger.target.logSkill('jsrgshichong',player); + trigger.target.give(result.cards,player); + } + player.changeZhuanhuanji('jsrgshichong'); + } + } + }, + jsrglianzhu:{ + audio:2, + enable:'phaseUse', + usable:1, + filterCard:{color:'black'}, + position:'h', + filterTarget:lib.filter.notMe, + lose:false, + discard:false, + delay:false, + content:function(){ + 'step 0' + player.showCards(cards,get.translation(player)+'发动了【连诛】'); + 'step 1' + player.give(cards,target); + 'step 2' + event.targets=game.filterPlayer(current=>{ + return current.group==target.group&¤t!=player; + }).sortBySeat(); + game.delayx(); + 'step 3' + var target=targets.shift(); + if(player.canUse('guohe',target)){ + player.useCard({name:'guohe',isCard:true},target); + } + if(targets.length) event.redo(); + }, + ai:{ + order:4, + result:{ + target:function(player,target){ + var targets=game.filterPlayer(current=>{ + return current.group==target.group&¤t!=player; + }); + return targets.reduce((p,c)=>{ + return p+get.effect(c,{name:'guohe'},player,player); + })+get.value(ui.selected.cards[0],target); + } + } + } + }, + //桥玄 + jsrgjuezhi:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + if(_status.currentPhase!=player||player.hasSkill('jsrgjuezhi_used',null,null,false)) return false; + return event.card&&event.getParent().type=='card'&&lib.skill.jsrgjuezhi.getNum(event.player,player)>0; + }, + forced:true, + locked:false, + getNum:function(target,player){ + return target.countCards('e',card=>{ + var subtype=get.subtype(card); + return player.isDisabled(subtype); + }) + }, + group:'jsrgjuezhi_disable', + content:function(){ + player.addTempSkill('jsrgjuezhi_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); + trigger.num+=lib.skill.jsrgjuezhi.getNum(trigger.player,player); + }, + subSkill:{ + disable:{ + audio:'jsrgjuezhi', + trigger:{ + player:'loseAfter', + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + direct:true, + filter:function(event,player){ + var evt=event.getl(player); + return evt&&evt.es&&evt.es.length>0; + }, + content:function(){ + 'step 0' + event.cards=trigger.getl(player).es; + 'step 1' + var card=cards.shift(),subtype=get.subtype(card); + event.subtype=subtype; + if(!player.isDisabled(subtype)){ + player.chooseBool(get.prompt('jsrgjuezhi_disable'),'废除你的'+get.translation(subtype)+'栏').set('ai',()=>1); + } + else event._result={bool:false}; + 'step 2' + if(result.bool){ + player.logSkill('jsrgjuezhi_disable'); + var list=[]; + if(event.subtype=='equip6') list.addArray(['3','4']); + else list.add(event.subtype); + for(var i of list) player.disableEquip(i); + } + if(cards.length>0) event.goto(1); + }, + }, + used:{charlotte:true} + } + }, + jsrgjizhao:{ + audio:2, + trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgjizhao')).set('ai',target=>{ + var player=_status.event.player; + if(player.countCards('j')) return player==target?10:0.1; + return 6-get.attitude(player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgjizhao',target); + target.chooseToUse({ + filterCard:function(card,player,event){ + if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; + return lib.filter.filterCard.apply(this,arguments); + }, + prompt:'急召:使用一张手牌,否则'+get.translation(player)+'可以移动你区域里的一张牌', + addCount:false, + goon:target!=player||!player.countCards('j'), + ai1:function(card){ + if(_status.event.goon) return get.order(card); + return 0; + } + }); + } + 'step 2' + if(result.bool){event.finish();return;} + var targets=game.filterPlayer(current=>{ + if(current==target) return false; + var hs=target.getCards('h'); + if(hs.length) return true; + var js=target.getCards('j'); + for(var i=0;i0) return att; + return 0; + } + return -att*att2; + }); + next.set('targetprompt','移动目标'); + next.set('prompt','急召:是否移动'+get.translation(target)+'的一张牌?'); + } + else event.finish(); + 'step 3' + if(result.bool){ + var target2=result.targets[0]; + event.targets=[target,target2]; + player.line2(event.targets,'green'); + } + else{ + event.finish(); + } + 'step 4' + game.delay(); + 'step 5' + if(targets.length==2){ + player.choosePlayerCard('hej',true,function(button){ + var player=_status.event.player; + var targets0=_status.event.targets0; + var targets1=_status.event.targets1; + if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ + if(get.position(button.link)=='j') return 12; + if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; + return 0; + } + else{ + if(get.position(button.link)=='j') return -10; + if(get.position(button.link)=='h') return 10; + return get.value(button.link)*get.effect(targets1,button.link,player,targets1); + } + },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ + var targets1=_status.event.targets1; + if(get.position(button.link)=='h'){ + return true; + } + else if(get.position(button.link)=='j'){ + return targets1.canAddJudge(button.link); + } + else{ + return targets1.isEmpty(get.subtype(button.link)); + } + }); + } + else{ + event.finish(); + } + 'step 6' + if(result.bool&&result.links.length){ + var link=result.links[0]; + if(get.position(link)=='h'){ + event.targets[1].gain(link); + } + else if(get.position(link)=='e'){ + event.targets[1].equip(link); + } + else if(link.viewAs){ + event.targets[1].addJudge({name:link.viewAs},[link]); + } + else{ + event.targets[1].addJudge(link); + } + event.targets[0].$give(link,event.targets[1],false); + game.log(event.targets[0],'的',get.position(link)=='h'?'一张手牌':link,'被移动给了',event.targets[1]); + game.delay(); + } + }, + ai:{ + effect:{ + target:function(card,player,target,current){ + if(get.type(card)=='delay'&¤t<0){ + if(target.countCards('j')) return; + return 'zerotarget'; + } + }, + }, + } + }, + //杨彪 + jsrgzhaohan:{ + audio:'zhaohan', + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + if(game.shuffleNumber==0) return player.isDamaged(); + return true; + }, + content:function(){ + player[game.shuffleNumber>0?'loseHp':'recover'](); + } + }, + jsrgrangjie:{ + audio:'rangjie', + trigger:{player:'damageEnd'}, + forced:true, + locked:false, + direct:true, + filter:function(event,player){ + return player.canMoveCard(); + }, + content:function(){ + 'step 0' + event.num=trigger.num; + 'step 1' + player.logSkill('jsrgrangjie'); + event.num--; + if(player.canMoveCard()) player.moveCard(true); + 'step 2' + if(result.bool){ + var card=result.card; + var suit=get.suit(card,false); + var cards=Array.from(ui.discardPile.childNodes); + var gains=[]; + var history=game.getGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose') return evt.position==ui.discardPile; + return evt.name=='cardsDiscard'; + }); + for(var i=history.length-1;i>=0;i--){ + var evt=history[i]; + var cards2=evt.cards.filter(card=>{ + return cards.contains(card)&&get.suit(card,false)==suit; + }); + if(cards2.length){ + gains.addArray(cards2); + cards.removeArray(cards2); + } + if(!cards.length) break; + } + if(gains.length){ + player.chooseButton(['让节:是否获得一张'+get.translation(suit)+'牌?',gains]).set('ai',get.buttonValue); + } + else event._result={bool:false}; + } + 'step 3' + if(result.bool){ + player.gain(result.links,'gain2'); + } + if(event.num>0) event.goto(1); + }, + ai:{ + maixie:true, + maixie_hp:true, + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + if(!target.canMoveCard(true)||!target.hasFriend()) return; + var num=1; + if(get.attitude(player,target)>0){ + if(player.needsToDiscard()){ + num=0.5; + } + else{ + num=0.3; + } + } + if(target.hp>=4) return [1,num*2]; + if(target.hp==3) return [1,num*1.5]; + if(target.hp==2) return [1,num*0.5]; + } + }, + }, + }, + }, + jsrgyizheng:{ + audio:'yizheng', + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(function(current){ + return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + }); + }, + filterTarget:function(card,player,current){ + return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + }, + content:function(){ + 'step 0' + player.chooseToCompare(target); + 'step 1' + if(result.bool){ + target.skip('phaseDraw'); + target.addTempSkill('yizheng2',{player:'phaseDrawSkipped'}); + event.finish(); + } + else{ + target.chooseControl('1','2','cancel').set('prompt','是否对'+get.translation(player)+'造成至多2点伤害?').set('ai',()=>{ + return _status.event.choice; + }).set('choice',get.damageEffect(player,target,target)>0?(get.attitude(target,player)>0?0:1):'cancel2'); + } + 'step 2' + if(result.control!='cancel2'){ + var num=result.index+1; + target.line(player); + player.damage(target,num); + } + }, + ai:{ + order:1, + result:{ + target:function(player,target){ + if(target.skipList.contains('phaseDraw')||target.hasSkill('pingkou')) return 0; + var hs=player.getCards('h').sort(function(a,b){ + return b.number-a.number; + }); + var ts=target.getCards('h').sort(function(a,b){ + return b.number-a.number; + }); + if(!hs.length||!ts.length) return 0; + if(hs[0].number>ts[0].number) return -1; + return 0; + }, + }, + }, + }, + //孔融 + jsrglirang:{ + audio:'splirang', + trigger:{global:'phaseDrawBegin'}, + direct:true, + filter:function(event,player){ + return event.player!=player&&!player.hasSkill('jsrglirang_used')&&player.countCards('he')>1; + }, + content:function(){ + 'step 0' + player.chooseCard(get.prompt('jsrglirang',trigger.player),'你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。',2,'he').set('ai',card=>{ + if(!_status.event.give) return 0; + var player=_status.event.player,target=_status.event.target; + return target.getUseValue(card)-player.getUseValue(card)+0.5; + }).set('give',get.attitude(player,trigger.player)>0).set('target',trigger.player); + 'step 1' + if(result.bool){ + player.logSkill('jsrglirang',trigger.player); + var cards=result.cards; + player.give(cards,trigger.player); + player.addTempSkill('jsrglirang_used','roundStart'); + player.addTempSkill('jsrglirang_given'); + player.markAuto('jsrglirang_used',[trigger.player]); + } + }, + subSkill:{ + used:{ + charlotte:true, + onremove:true, + intro:{content:'本轮〖礼让〗目标:$'}, + }, + given:{ + audio:'splirang', + trigger:{global:'phaseDiscardEnd'}, + filter:function(event,player){ + return event.player.hasHistory('lose',evt=>{ + return evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.cards2.filterInD('d').length>0; + }); + }, + charlotte:true, + prompt2:function(event,player){ + var cards=[]; + event.player.getHistory('lose',evt=>{ + if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2.filterInD('d')); + }); + return '获得'+get.translation(cards); + }, + content:function(){ + var cards=[]; + trigger.player.getHistory('lose',evt=>{ + if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2.filterInD('d')); + }); + player.gain(cards,'gain2'); + } + } + } + }, + jsrgzhengyi:{ + audio:2, + trigger:{player:'damageBegin4'}, + filter:function(event,player){ + var list=player.getStorage('jsrglirang_used'); + if(!list.length) return false; + return !player.getHistory('damage').length&&list[0].isIn(); + }, + direct:true, + content:function(){ + 'step 0' + var target=player.getStorage('jsrglirang_used')[0]; + event.target=target; + target.chooseBool('是否对'+get.translation(player)+'发动【争义】?','将此'+(trigger.source?'来源为'+get.translation(trigger.source):'无来源')+'的'+trigger.num+'点伤害转移给你').set('ai',()=>{ + return _status.event.bool; + }).set('bool',get.damageEffect(player,trigger.source,target)>get.damageEffect(target,trigger.source,target)); + 'step 1' + if(result.bool){ + target.logSkill('jsrgzhengyi',player); + trigger.cancel(); + target.damage(trigger.source,trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); + } + } + }, + //朱儁 + jsrgfendi:{ + audio:2, + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + return event.targets.length==1&&event.card.name=='sha'&&event.targets[0].countCards('h')>0; + }, + usable:1, + logTarget:'target', + content:function(){ + 'step 0' + var target=trigger.target; + event.target=target; + player.choosePlayerCard(target,'h',true,[1,Infinity],'分敌:展示'+get.translation(target)+'的任意张手牌').set('ai',button=>{ + if(_status.event.all) return 1; + if(ui.selected.buttons.length) return 0; + return Math.random(); + }).set('all',!target.mayHaveShan()&&Math.random()<0.75).set('forceAuto',true); + 'step 1' + if(result.bool){ + var cards=result.cards; + target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【分敌】'); + target.addGaintag(cards,'jsrgfendi_tag'); + target.addTempSkill('jsrgfendi_blocker'); + player.addTempSkill('jsrgfendi_gain'); + if(!trigger.card.storage) trigger.card.storage={}; + trigger.card.storage.jsrgfendi=true; + player.storage.jsrgfendi_gain=target; + } + else player.storage.counttrigger.jsrgfendi--; + }, + subSkill:{ + blocker:{ + trigger:{ + player:['damageBefore','damageCancelled','damageZero'], + target:['shaMiss','useCardToExcluded','useCardToEnd'], + global:['useCardEnd'], + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + player.removeSkill('jsrgfendi_blocker'); + }, + mod:{ + cardEnabled:function(card,player){ + if(card.cards){ + for(var i of card.cards){ + if(!i.hasGaintag('jsrgfendi_tag')) return false; + } + } + else if(get.itemtype(card)=='card'){ + if(!card.hasGaintag('jsrgfendi_tag')) return false; + } + }, + cardRespondable:function(card,player){ + return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + }, + cardSavable:function(card,player){ + return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + }, + }, + }, + gain:{ + trigger:{global:'damageSource'}, + charlotte:true, + forced:true, + direct:true, + onremove:true, + filter:function(event,player){ + var target=player.storage.jsrgfendi_gain; + return event.card&&event.card.storage&&event.card.storage.jsrgfendi&&target&&target.isIn()&&target.hasCard(card=>{ + return card.hasGaintag('jsrgfendi_tag'); + },'h'); + }, + content:function(){ + player.logSkill('jsrgfendi_gain',player.storage.jsrgfendi_gain); + player.gain(player.storage.jsrgfendi_gain.getCards('h',card=>{ + return card.hasGaintag('jsrgfendi_tag'); + }),'give'); + } + } + } + }, + jsrgjuxiang:{ + audio:2, + trigger:{ + player:'gainAfter', + global:'loseAsyncAfter', + }, + filter:function(event,player){ + var evt=event.getParent('phaseDraw'); + if(evt&&evt.name=='phaseDraw') return false; + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + if(!cards.length) return false; + for(var card of cards){ + if(!lib.filter.cardDiscardable(card,player,'jsrgjuxiang')) return false; + } + return true; + }, + check:function(event,player){ + var target=_status.currentPhase; + if(!target||get.attitude(player,target)<=0) return false; + var evt=event.getParent('phaseDiscard'),evt2=event.getParent('phaseJieshu'); + if(evt&&evt.name=='phaseDiscard'||evt2&&evt.name=='phaseJieshu') return false; + if(target.getCardUsable({name:'sha'})>=target.countCards('hs','sha')) return false; + if(!target.hasValueTarget({name:'sha'})) return false; + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + var val=0; + for(var i of cards) val+=get.value(i); + if(val<10) return true; + return false; + }, + prompt2:function(event,player){ + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + var target=_status.currentPhase; + var str='弃置'+get.translation(cards); + if(target&&target.isIn()){ + var list=[]; + for(var card of cards){ + list.add(get.suit(card,player)); + } + var num=list.length; + str+=',然后令'+get.translation(target)+'于此回合额定的出牌阶段内使用【杀】的次数上限+'+num; + } + return str; + }, + content:function(){ + 'step 0' + var hs=player.getCards('h'); + var cards=trigger.getg(player).filter(i=>hs.contains(i)); + var list=[]; + for(var card of cards){ + list.add(get.suit(card,player)); + } + event.num=list.length; + player.discard(cards); + 'step 1' + var target=_status.currentPhase; + if(target&&target.isIn()){ + target.addTempSkill('jsrgjuxiang_sha'); + target.addMark('jsrgjuxiang_sha',num,false); + var evt=trigger.getParent('phaseUse'); + if(evt&&evt.name=='phaseUse'&&!evt.skill){ + evt.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); + evt.player.addMark('jsrgjuxiang_buff',num,false); + } + } + }, + subSkill:{ + sha:{ + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + return !event.skill; + }, + silent:true, + charlotte:true, + forced:true, + onremove:true, + content:function(){ + trigger.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); + trigger.player.addMark('jsrgjuxiang_buff',player.countMark('jsrgjuxiang_sha'),false); + } + }, + buff:{ + charlotte:true, + intro:{content:'使用【杀】的次数上限+#'}, + onremove:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('jsrgjuxiang_buff'); + }, + } + } + } + }, + //刘备 + jsrgjishan:{ + audio:2, + trigger:{global:'damageBegin4'}, + usable:1, + filter:function(event,player){ + return player.hp>0; + }, + logTarget:'player', + onremove:true, + prompt2:'失去1点体力并防止此伤害,然后你与其各摸一张牌', + check:function(event,player){ + return get.damageEffect(event.player,event.source,player,event.nature)*Math.sqrt(event.num)<=get.effect(player,{name:'losehp'},player,player); + }, + group:'jsrgjishan_recover', + content:function(){ + 'step 0' + trigger.cancel(); + player.loseHp(); + player.markAuto('jsrgjishan',[trigger.player]); + 'step 1' + if(player.isIn()&&trigger.player.isIn()){ + var targets=[player,trigger.player]; + targets.sortBySeat(_status.currentPhase); + targets[0].draw('nodelay'); + targets[1].draw(); + } + }, + intro:{content:'已帮助$抵挡过伤害'}, + ai:{expose:0.2}, + subSkill:{ + recover:{ + audio:'jsrgjishan', + trigger:{source:'damageSource'}, + filter:function(event,player){ + return game.hasPlayer(current=>{ + return current.isMinHp()&&player.getStorage('jsrgjishan').contains(current); + }); + }, + usable:1, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgjishan_recover'),'令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力',(card,player,target)=>{ + return target.isMinHp()&&player.getStorage('jsrgjishan').contains(target); + }).set('ai',target=>{ + return get.recoverEffect(target,_status.event.player,_status.event.player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgjishan_recover',target); + target.recover(); + } + else player.storage.counttrigger.jsrgjishan_recover--; + } + } + } + }, + jsrgzhenqiao:{ + audio:2, + trigger:{player:'useCardToTargeted'}, + forced:true, + shaRelated:true, + filter:function(event,player){ + return event.isFirstTarget&&event.card.name=='sha'&&!player.getEquip(1)&&!player.isDisabled(1); + }, + content:function(){ + trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); + trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(player._jsrgzhenqiao_aiChecking) return; + if(target==player&&get.subtype(card)=='equip1'&&!player.getEquip(1)){ + player._jsrgzhenqiao_aiChecking=true; + var eff=get.effect(target,card,player,player); + delete player._jsrgzhenqiao_aiChecking; + if(eff<3) return 'zerotarget'; + } + } + } + }, + mod:{ + attackRange:function(player,num){ + return num+1; + }, + } + }, + //王允 + jsrgshelun:{ + audio:2, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(current=>player.inRange(current)); + }, + filterTarget:function(card,player,target){ + return player.inRange(target); + }, + content:function(){ + var num=player.countCards('h'); + var targets=game.filterPlayer(current=>{ + return current.countCards('h')<=num&¤t!=target; + }); + player.chooseToDebate(targets).set('callback',function(){ + var result=event.debateResult; + if(result.bool&&result.opinion){ + var opinion=result.opinion; + var target=event.getParent(2).target; + if(opinion=='red') player.discardPlayerCard(target,'he',true); + else target.damage(); + } + }).set('ai',card=>{ + var player=_status.event.player; + var color=(player==_status.event.source||get.damageEffect(_status.event.getParent(2).target,player,player)>0)?'black':'red'; + var val=5-get.value(card); + if(get.color(card)==color) val+=10; + return val; + }).set('aiCard',target=>{ + var color=(target==_status.event.source||get.damageEffect(_status.event.getParent(2).target,target,target)>0)?'black':'red'; + var hs=target.getCards('h',{color:color}); + if(!hs.length) hs=target.getCards('h'); + return {bool:true,cards:[hs.randomGet()]}; + }).set('target',target); + }, + ai:{ + order:8, + expose:0.2, + result:{target:-1}, + } + }, + jsrgfayi:{ + audio:2, + trigger:{global:'chooseToDebateAfter'}, + filter:function(event,player){ + if(!event.targets.contains(player)) return false; + if(event.red.map(i=>i[0]).contains(player)) return event.black.length; + if(event.black.map(i=>i[0]).contains(player)) return event.red.length; + return false; + }, + direct:true, + content:function(){ + 'step 0' + var targets=[]; + if(trigger.red.map(i=>i[0]).contains(player)) targets=trigger.black; + if(trigger.black.map(i=>i[0]).contains(player)) targets=trigger.red; + player.chooseTarget(get.prompt('jsrgfayi'),'对一名与你意见不同的角色造成1点伤害',(card,player,target)=>{ + return _status.event.targets.contains(target); + }).set('targets',targets.map(i=>i[0])).set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgfayi',target); + target.damage(); + } + } + }, + jsrgtushe:{ + audio:'xinfu_tushe', + trigger:{ + player:'useCardToPlayered', + }, + filter:function (event,player){ + if(get.type(event.card)=='equip') return false; + if(event.getParent().triggeredTargets3.length>1) return false; + return event.targets.length>0; + }, + check:function(event,player){ + return !player.countCards('h',{type:'basic'}); + }, + content:function (){ + 'step 0' + player.showHandcards(); + 'step 1' + if(player.countCards('h',{type:'basic'})) event.finish(); + else player.chooseBool('图射:是否摸'+get.cnNumber(trigger.targets.length)+'张牌?').set('ai',()=>1); + 'step 2' + if(result.bool){ + player.draw(trigger.targets.length); + } + }, + ai:{ + presha:true, + pretao:true, + threaten:1.8, + }, + }, + jsrgtongjue:{ + audio:2, + enable:'phaseUse', + usable:1, + zhuSkill:true, + filter:function(event,player){ + return player.hasZhuSkill('jsrgtongjue')&&game.hasPlayer(current=>current!=player&¤t.group=='qun'); + }, + filterCard:true, + selectCard:[1,Infinity], + filterTarget:function(card,player,target){ + return target!=player&&target.group=='qun'; + }, + selectTarget:[1,Infinity], + filterOk:function(){ + return ui.selected.cards.length==ui.selected.targets.length; + }, + check:function(card){ + var player=_status.event.player; + if(player.hasCard(card=>{ + return player.hasValueTarget(card); + },'hs')){ + return 3-player.getUseValue(card); + } + return 3-get.value(card); + }, + multiline:true, + multitarget:true, + delay:false, + discard:false, + lose:false, + content:function(){ + 'step 0' + var list=[]; + for(var i=0;icurrent.getSeatNum()==1); + return event.player==zhu; + }, + locked:false, + group:'jsrgzhenglve_damage', + prompt2:function(event,player){ + var num=Math.min(event.player.getHistory('sourceDamage').length>0?1:2,game.countPlayer(current=>{ + return !current.hasMark('jsrgzhenglve_mark'); + })); + if(num==0) return '你可以摸一张牌'; + return '你可以摸一张牌并令'+get.cnNumber(num)+'名角色获得“猎”标记'; + }, + content:function(){ + 'step 0' + player.draw(); + 'step 1' + var damaged=trigger.player.getHistory('sourceDamage').length>0; + var num=damaged?1:2; + var targets=game.filterPlayer(current=>{ + return !current.hasMark('jsrgzhenglve_mark'); + }); + if(!targets.length) event._result={bool:true}; + else if(targets.length<=num) event._result={bool:true,targets:targets}; + else player.chooseTarget('令'+get.cnNumber(num)+'名角色获得“猎”标记',true,num,(card,player,target)=>{ + return !target.hasMark('jsrgzhenglve_mark'); + }).set('ai',target=>{ + var att=get.attitude(_status.event.player,target); + return 100-att; + }); + 'step 2' + if(result.bool){ + var targets=result.targets; + player.line(targets); + targets.forEach(i=>i.addMark('jsrgzhenglve_mark',1)); + } + }, + mod:{ + cardUsableTarget:function(card,player,target){ + if(target.hasMark('jsrgzhenglve_mark')) return true; + }, + targetInRange:function(card,player,target){ + if(target.hasMark('jsrgzhenglve_mark')) return true; + }, + }, + subSkill:{ + damage:{ + audio:'jsrgzhenglve', + trigger:{source:'damageSource'}, + usable:1, + filter:function(event,player){ + return event.player.hasMark('jsrgzhenglve_mark'); + }, + prompt2:function(event,player){ + var cards=event.cards||[]; + return '摸一张牌'+(cards.filterInD().length?'并获得'+get.translation(event.cards.filterInD()):''); + }, + content:function(){ + 'step 0' + player.draw(); + var cards=trigger.cards; + if(cards&&cards.filterInD().length){ + player.gain(cards.filterInD(),'gain2'); + } + } + }, + mark:{ + marktext:'猎', + intro:{ + name:'猎(政略)', + name2:'猎', + markcount:()=>0, + content:'已拥有“猎”标记', + } + } + } + }, + jsrghuilie:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + juexingji:true, + forced:true, + skillAnimation:true, + animationColor:'thunder', + derivation:['jsrgpingrong','feiying'], + filter:function(event,player){ + return game.countPlayer(current=>current.hasMark('jsrgzhenglve_mark'))>2; + }, + content:function(){ + 'step 0' + player.awakenSkill('jsrghuilie'); + player.loseMaxHp(); + 'step 1' + player.addSkillLog('jsrgpingrong'); + player.addSkillLog('feiying'); + } + }, + jsrgpingrong:{ + audio:2, + trigger:{global:'phaseEnd'}, + filter:function(event,player){ + return !player.hasSkill('jsrgpingrong_used')&&game.hasPlayer(current=>current.hasMark('jsrgzhenglve_mark')); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrghuilie'),'移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。',(card,player,target)=>{ + return target.hasMark('jsrgzhenglve_mark'); + }).set('ai',target=>{ + return get.attitude(_status.event.player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgpingrong',target); + player.addTempSkill('jsrgpingrong_used','roundStart'); + target.removeMark('jsrgzhenglve_mark',target.countMark('jsrgzhenglve_mark')); + player.insertPhase(); + player.addSkill('jsrgpingrong_check'); + } + }, + subSkill:{ + used:{charlotte:true}, + check:{ + audio:'jsrgpingrong', + trigger:{player:'phaseAfter'}, + charlotte:true, + forced:true, + filter:function(event,player){ + return event.skill=='jsrgpingrong'&&!player.getHistory('sourceDamage').length; + }, + content:function(){ + player.loseHp(); + } + } + } + }, + //南华老仙 + jsrgshoushu:{ + audio:2, + forced:true, + trigger:{global:'roundStart'}, + filter:function(event,player){ + return !game.hasPlayer(function(current){ + return current.countCards('hejsx','taipingyaoshu'); + })&&!Array.from(ui.cardPile.childNodes).concat(Array.from(ui.discardPile.childNodes)) + .concat(Array.from(ui.ordering.childNodes)).map(i=>i.name).contains('taipingyaoshu'); + }, + direct:true, + group:'jsrgshoushu_destroy', + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgshoushu'),'将【太平要术】置入一名角色的装备区',(card,player,target)=>{ + var card={name:'taipingyaoshu'}; + return target.canEquip(card,true); + }).set('ai',target=>{ + return target.getUseValue({name:'taipingyaoshu'})*get.attitude(_status.event.player,target); + }) + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgshoushu',target); + if(!lib.inpile.contains('taipingyaoshu')){ + lib.inpile.push('taipingyaoshu'); + } + event.card=game.createCard2('taipingyaoshu','heart',3); + } + else event.finish(); + 'step 2' + if(card) target.equip(card); + }, + subSkill:{ + destroy:{ + audio:'jsrgshoushu', + trigger:{ + global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + }, + forced:true, + filter:function(event,player){ + return game.hasPlayer(current=>{ + var evt=event.getl(current); + if(evt&&evt.es) return evt.es.some(i=>i.name=='taipingyaoshu'); + return false; + }); + }, + content:function(){ + var cards=[]; + game.countPlayer(current=>{ + var evt=trigger.getl(current); + if(evt&&evt.es) return cards.addArray(evt.es.filter(i=>i.name=='taipingyaoshu')); + }); + game.cardsGotoSpecial(cards); + game.log(cards,'被销毁了'); + } + } + } + }, + jsrgxundao:{ + audio:2, + trigger:{player:'judge'}, + filter:function(event,player){ + return game.hasPlayer(current=>current.countCards('he')); + }, + direct:true, + content:function(){ + 'step 0' + var prompt2=get.translation(player)+'(你)的'+(trigger.judgestr||'')+'判定为'+ + get.translation(player.judging[0])+','+'是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?'; + player.chooseTarget(get.prompt('jsrgxundao'),prompt2,[1,2],(card,player,target)=>{ + return target.countCards('he'); + }).set('ai',target=>{ + var player=_status.event.player; + if(!_status.event.todiscard) return 0; + if(_status.event.todiscard!='all'){ + if(target==_status.event.todiscard) return 100; + } + return get.effect(target,{name:'guohe_copy2'},player,player)/2; + }).set('todiscard',function(){ + if(trigger.judgestr=='闪电'&&get.damageEffect(player,null,player,'thunder')>=0) return 'all'; + var friends=game.filterPlayer(i=>get.attitude(i,player)>0); + for(var friend of friends){ + var cardsx=friend.getCards('he',card=>trigger.judge(card)>0); + cardsx.sort((a,b)=>{ + return get.value(a)-get.value(b); + }); + if(cardsx.length){ + var card=cardsx[0]; + if(trigger.judge(player.judging[0])>=0){ + if(get.value(card)>4) return false; + } + return get.owner(card); + } + } + return 'all'; + }()) + 'step 1' + if(result.bool){ + var targets=result.targets; + targets.sortBySeat(_status.currentPhase); + event.targets=targets; + player.logSkill('jsrgxundao',targets); + event.cards=[]; + } + else event.finish(); + 'step 2' + var target=targets.shift(); + target.chooseToDiscard('寻道:请弃置一张牌'+(target==player?'':',可能被作为新判定牌'),'he',true).set('ai',target=>{ + var trigger=_status.event.getTrigger(); + var player=_status.event.player; + var judging=_status.event.judging; + var result=trigger.judge(card)-trigger.judge(judging); + var attitude=get.attitude(player,trigger.player); + if(attitude==0||result==0) return 0.1; + if(attitude>0){ + return result+0.01; + } + else{ + return 0.01-result; + } + }); + 'step 3' + if(result.bool){ + event.cards.addArray(result.cards); + } + if(targets.length) event.goto(2); + 'step 4' + var cards=event.cards.filterInD('d'); + if(cards.length){ + player.chooseButton(['寻道:选择一张作为新判定牌',cards],true).set('ai',button=>{ + return trigger.judge(button.link); + }); + } + else event.finish(); + 'step 5' + if(result.bool){ + var card=result.links[0]; + event.card=card; + game.cardsGotoOrdering(card).relatedEvent=trigger; + } + else event.finish(); + 'step 6' + if(player.judging[0].clone){ + game.broadcastAll(function(card,card2,player){ + if(card.clone){ + card.clone.classList.remove('thrownhighlight'); + } + var node=player.$throwordered(card2.copy(),true); + node.classList.add('thrownhighlight'); + ui.arena.classList.add('thrownhighlight'); + },player.judging[0],card,player); + game.addVideo('deletenode',player,get.cardsInfo([player.judging[0].clone])); + } + game.cardsDiscard(player.judging[0]); + player.judging[0]=card; + trigger.orderingCards.add(card); + game.log(player,'的判定牌改为',card); + game.delay(2); + }, + ai:{ + rejudge:true, + tag:{ + rejudge:1, + } + } + }, + jsrglinghua:{ + audio:2, + trigger:{ + player:['phaseZhunbeiBegin','phaseJieshuBegin'], + }, + prompt2:function(event,player){ + var zhunbei=event.name=='phaseZhunbei'; + return '进行目标为你'+(zhunbei?'':'且效果反转')+'的【闪电】判定。若你未因此受到伤害,你可以'+(zhunbei?'令一名角色回复1点体力':'对一名角色造成1点雷电伤害'); + }, + check:function(event,player){ + var e2=player.getEquip(2); + if(e2&&e2.name=='taipingyaoshu') return true; + if(event.name=='phaseZhunbei'&&game.hasPlayer(current=>{ + return get.recoverEffect(current,player,player)>=0; + })) return true; + if(event.name=='phaseJieshu'&&game.hasPlayer(current=>{ + return get.damageEffect(current,player,player,'thunder')>=0; + })&&player.hasSkillTag('rejudge')&&player.hasCard(card=>{ + return lib.card.shandian.judge(card)<0; + },'he')) return true; + return false; + }, + content:function(){ + 'step 0' + var judge=trigger.name=='phaseZhunbei'?lib.card.shandian.judge:function(card){ + if(get.suit(card)!='spade'||get.number(card)<=1||get.number(card)>=10) return -5; + return 1; + } + player.judge(judge,get.translation('shandian')).set('judge2',lib.card.shandian.judge2); + game.delayx(1.5); + 'step 1' + var name='shandian'; + if(event.cancelled&&!event.direct){ + if(lib.card[name].cancel){ + var next=game.createEvent(name+'Cancel'); + next.setContent(lib.card[name].cancel); + next.cards=[]; + next.card=get.autoViewAs({name:name}); + next.player=player; + } + } + else{ + var next=game.createEvent(name); + next.setContent(function(){ + if(result.bool==false){ + player.damage(3,'thunder','nosource'); + } + }); + next._result=result; + next.cards=[]; + next.card=get.autoViewAs({name:name}); + next.player=player; + } + 'step 2' + if(!player.hasHistory('damage',evt=>{ + return evt.card&&evt.card.name=='shandian'&&evt.getParent(2)==event; + })){ + if(trigger.name=='phaseZhunbei'){ + player.chooseTarget('灵化:是否令一名角色回复1点体力?').set('ai',target=>{ + var player=_status.event.player; + return get.recoverEffect(target,player,player); + }); + } + else{ + player.chooseTarget('灵化:是否对一名角色造成1点雷电伤害?').set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player,'thunder'); + }); + } + } + else event.finish(); + 'step 3' + if(result.bool){ + var target=result.targets[0]; + player.line(target); + if(trigger.name=='phaseZhunbei') target.recover(); + else target.damage('thunder'); + } + }, + ai:{ + threaten:2.8 + } + }, //官盗S特015神马超 psshouli:{ audio:'shouli', @@ -243,7 +2277,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ delete evt.result.used; evt.result.card=get.autoViewAs({ name:name, - cards:[result], + cards:[result.links[0]], storage:{psshouli:true}, },result.links); evt.result.cards=[result.links[0]]; @@ -2163,7 +4197,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.name1&&!target.isUnseen(0)&&target.name1.indexOf('gz_shibing')!=0&&_status.characterlist.contains(target.name1)) list.push(target.name1); if(target.name2&&!target.isUnseen(1)&&target.name2.indexOf('gz_shibing')!=0&&_status.characterlist.contains(target.name1)) list.push(target.name2); _status.characterlist.removeArray(list); - if(player==trigger.source) list.addArray(_status.characterlist.randomRemove()); + if(player==trigger.source) list.addArray(_status.characterlist.randomRemove(1)); if(list.length){ player.markAuto('zyshilu',list); game.log(player,'将','#g'+get.translation(list),'置于武将牌上作为','#y“戮”'); @@ -2557,7 +4591,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //战役篇改王允 zylianji:{ - audio:'lianji', + audio:'wylianji', trigger:{player:'phaseUseEnd'}, filter:function(event,player){ return player.hasHistory('useCard',evt=>evt.getParent('phaseUse')==event); @@ -5823,6 +7857,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterReplace:{}, + dynamicTranslate:{ + jsrgshichong:function(player){ + if(player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + }, + }, translate:{ sp_gongsunzan:'SP公孙瓒', sp_simazhao:'SP司马昭', @@ -6038,7 +8078,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pe_sunchen:'战役篇孙綝', pe_sunchen_ab:'孙綝', zyshilu:'嗜戮', - zyshilu_info:'一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。', + zyshilu_info:'①一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。', zyxiongnve:'凶虐', zyxiongnve_info:'①出牌阶段开始时,你可以将一张“戮”置入武将牌堆并选择一项直到回合结束:1.当你造成伤害时,此伤害+1;2.当你对其他角色造成伤害时,获得其一张牌;3.你使用牌无次数限制。②出牌阶段结束时,你可以将两张“戮”置入武将牌堆,然后当你于下回合开始前受到其他角色造成的伤害时,此伤害-1。', pe_wenqin:'文钦', @@ -6140,11 +8180,118 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pkmiewu:'灭吴', pkmiewu2:'灭吴', pkmiewu_info:'每回合限一次。你可移去1枚“武库”,视为使用或打出任意一张基本牌或普通锦囊牌,然后摸一张牌。', + //江山如故·起 + jsrg_liuhong:'起刘宏', + jsrg_liuhong_ab:'刘宏', + jsrgchaozheng:'朝争', + jsrgchaozheng_info:'准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。', + jsrgshenchong:'甚宠', + jsrgshenchong_info:'限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。', + jsrgjulian:'聚敛', + jsrgjulian_info:'主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。', + jsrgfeiyang:'飞扬', + jsrgfeiyang_info:'判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。', + jsrgbahu:'跋扈', + jsrgbahu_info:'锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。', + jsrg_hejin:'起何进', + jsrg_hejin_ab:'何进', + jsrgzhaobing:'诏兵', + jsrgzhaobing_info:'结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。', + jsrgzhuhuan:'诛宦', + jsrgzhuhuan_info:'准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。', + jsrgyanhuo:'延祸', + jsrgyanhuo_info:'锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。', + jsrg_sunjian:'起孙坚', + jsrg_sunjian_ab:'孙坚', + jsrgpingtao:'平讨', + jsrgpingtao_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。', + jsrgjuelie:'绝烈', + jsrgjuelie_info:'①当你造成渠道为【杀】的伤害时,若你的手牌数或体力值最小,此伤害+1。②当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌。', + jsrg_huangfusong:'起皇甫嵩', + jsrg_huangfusong_ab:'皇甫嵩', + jsrgguanhuo:'观火', + jsrgguanhuo_info:'①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。', + jsrgjuxia:'居下', + jsrgjuxia_info:'每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。', + jsrg_xushao:'起许劭', + jsrg_xushao_ab:'许劭', + jsrgyingmen:'盈门', + jsrgyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', + jsrgpingjian:'评鉴', + jsrgpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。', + jsrg_dongbai:'起董白', + jsrg_dongbai_ab:'董白', + jsrgshichong:'恃宠', + jsrgshichong_info:'转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。', + jsrglianzhu:'连诛', + jsrglianzhu_info:'出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。', + jsrg_qiaoxuan:'起桥玄', + jsrg_qiaoxuan_ab:'桥玄', + jsrgjuezhi:'绝质', + jsrgjuezhi_info:'①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。', + jsrgjizhao:'急召', + jsrgjizhao_info:'准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。', + jsrg_yangbiao:'起杨彪', + jsrg_yangbiao_ab:'杨彪', + jsrgzhaohan:'昭汉', + jsrgzhaohan_info:'准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。', + jsrgrangjie:'让节', + jsrgrangjie_info:'当你受到1点伤害后,你移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。', + jsrgyizheng:'义争', + jsrgyizheng_info:'出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。', + jsrg_kongrong:'起孔融', + jsrg_kongrong_ab:'孔融', + jsrglirang:'礼让', + jsrglirang_info:'每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。', + jsrgzhengyi:'争义', + jsrgzhengyi_info:'当你每回合首次受到伤害时,本轮因〖礼让〗获得过牌的其他角色可以将此伤害转移给其。', + jsrg_zhujun:'起朱儁', + jsrg_zhujun_ab:'朱儁', + jsrgfendi:'分敌', + jsrgfendi_tag:'分敌', + jsrgfendi_info:'每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你获得这些牌。', + jsrgjuxiang:'拒降', + jsrgjuxiang_info:'当你不于摸牌阶段获得牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。', + jsrg_liubei:'起刘备', + jsrg_liubei_ab:'刘备', + jsrgjishan:'积善', + jsrgjishan_info:'①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。', + jsrgzhenqiao:'振鞘', + jsrgzhenqiao_info:'锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。', + jsrg_wangyun:'起王允', + jsrg_wangyun_ab:'王允', + jsrgshelun:'赦论', + jsrgshelun_info:'出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。', + jsrgfayi:'伐异', + jsrgfayi_info:'当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。', + jsrg_liuyan:'起刘焉', + jsrg_liuyan_ab:'刘焉', + jsrgtushe:'图射', + jsrgtushe_info:'当你使用非装备牌指定目标后,你可以展示所有手牌。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。', + jsrgtongjue:'通绝', + jsrgtongjue_info:'主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。', + jsrg_caocao:'起曹操', + jsrg_caocao_ab:'曹操', + jsrgzhenglve:'政略', + jsrgzhenglve_info:'①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。', + jsrghuilie:'会猎', + jsrghuilie_info:'觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。', + jsrgpingrong:'平戎', + jsrgpingrong_info:'每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。', + jsrg_nanhualaoxian:'起南华老仙', + jsrg_nanhualaoxian_ab:'南华老仙', + jsrgshoushu:'授术', + jsrgshoushu_info:'锁定技。①每轮开始时,若游戏内没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', + jsrgxundao:'寻道', + jsrgxundao_info:'当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。', + jsrglinghua:'灵化', + jsrglinghua_info:'①准备阶段,你可以进行目标角色为你的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以进行目标角色为你且判定效果反转的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。', offline_star:'桌游志·SP', offline_sticker:'桌游志·贴纸', offline_luanwu:'文和乱武', offline_yongjian:'用间篇', + offline_jiangshanruguqi:'江山如故·起', offline_piracyE:'官盗E系列·战役篇', offline_piracyS:'官盗S系列', offline_piracyK:'官盗K系列', diff --git a/character/rank.js b/character/rank.js index 1c991c20a..c02419813 100644 --- a/character/rank.js +++ b/character/rank.js @@ -438,6 +438,7 @@ window.noname_character_rank={ 'lvdai', 'zhoufang', 'zhuzhi', + 're_zhuzhi', 'guohuai', 'caorui', 'liuyu', @@ -576,6 +577,7 @@ window.noname_character_rank={ 'yj_sufei', 'dc_ruiji', 'yuantanyuanxiyuanshang', + 'yanghong', ], bp:[ 'chess_diaochan', @@ -905,6 +907,7 @@ window.noname_character_rank={ 'xia_dianwei', 'xia_zhaoe', 'zhangkai', + 'sunhong', ], b:[ 'diy_feishi', @@ -1433,6 +1436,8 @@ window.noname_character_rank={ 'old_gaoshun', 'old_huanghao', 'old_liubiao', + 'luoxian', + 'ol_huban', ], d:[ 'lvmeng', @@ -1472,6 +1477,7 @@ window.noname_character_rank={ 'tengfanglan', 'junk_lidian', 'junk_duanwei', + 'std_panfeng', ], rarity:{ legend:[ @@ -2309,6 +2315,8 @@ window.noname_character_rank={ 'zhangkai', 'wangguan', 'ol_yanwen', + 'yanghong', + 're_zhuzhi', ], junk:[ 'sunshao', @@ -2352,6 +2360,7 @@ window.noname_character_rank={ 'junk_lidian', 'junk_duanwei', 'zerong', + 'std_panfeng', ], } }; diff --git a/character/refresh.js b/character/refresh.js index b20c8e0f8..7865cfd7c 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -13,13 +13,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refresh_yijiang2:['re_madai','re_wangyi','xin_handang','xin_zhonghui','re_liaohua','re_chengpu','re_caozhang','dc_bulianshi','xin_liubiao','re_xunyou','re_guanzhang'], refresh_yijiang3:['re_jianyong','re_guohuai','re_zhuran','re_panzhangmazhong','xin_yufan','dc_liru','re_manchong','re_fuhuanghou','re_guanping','re_liufeng'], refresh_yijiang4:['re_sunluban','re_wuyi','re_hanhaoshihuan','re_caozhen','re_zhoucang','dc_chenqun','re_caifuren','re_guyong','re_jushou','re_zhuhuan'], - refresh_yijiang5:['re_zhangyi','re_quancong','re_caoxiu','re_sunxiu','re_gongsunyuan','re_guotufengji','re_xiahoushi','re_liuchen'], + refresh_yijiang5:['re_zhangyi','re_quancong','re_caoxiu','re_sunxiu','re_gongsunyuan','re_guotufengji','re_xiahoushi','re_liuchen','re_zhuzhi'], refresh_yijiang6:['re_guohuanghou','re_sundeng'], refresh_xinghuo:['re_duji','dc_gongsunzan','re_sp_taishici','re_caiyong','re_mazhong','re_wenpin'], }, }, connect:true, character:{ + re_zhuzhi:['male','wu',4,['reanguo']], dc_caozhi:['male','wei',3,['reluoying','dcjiushi']], ol_huangzhong:['male','shu',4,['xinliegong','remoshi']], re_wenpin:['male','wei',5,['rezhenwei'],['unseen']], @@ -157,6 +158,86 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_guohuai:['xiahouyuan','zhanghe'], }, skill:{ + //朱治 + reanguo:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:lib.filter.notMe, + content:function(){ + 'step 0' + if(target.isMinHandcard()){ + target.draw(); + event.h=true; + } + 'step 1' + if(target.isMinHp()&&target.isDamaged()){ + target.recover(); + event.hp=true; + } + 'step 2' + var equip=get.cardPile(function(card){ + return get.type(card)=='equip'&&target.hasUseTarget(card); + }); + if(target.isMinEquip()&&equip){ + target.chooseUseTarget(equip,'nothrow','nopopup',true); + event.e=true; + } + 'step 3' + game.updateRoundNumber(); + if(!event.h&&player.isMinHandcard()){ + player.draw(); + event.h=true; + } + 'step 4' + if(!event.hp&&player.isMinHp()&&player.isDamaged()){ + player.recover(); + event.hp=true; + } + 'step 5' + if(!event.e&&player.isMinEquip()){ + var equip=get.cardPile(function(card){ + return get.type(card)=='equip'&&player.hasUseTarget(card); + }); + if(equip){ + player.chooseUseTarget(equip,'nothrow','nopopup',true); + event.e=true; + } + } + 'step 6' + if(event.h&&event.hp&&event.e){ + player.chooseCard('安国:是否重铸任意张牌?',[1,Infinity],(card,player)=>{ + var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); + if(mod!='unchanged') return mod; + return true; + },'he').set('ai',card=>{ + return 6-get.value(card); + }); + } + else event.finish(); + 'step 7' + if(result.bool){ + player.loseToDiscardpile(result.cards); + player.draw(result.cards.length); + } + }, + ai:{ + threaten:1.65, + order:9, + result:{ + player:function(player,target){ + if(get.attitude(player,target)<=0){ + if(target.isMinHandcard()||target.isMinEquip()||target.isMinHp()) return -1; + } + var num=0; + if(player.isMinHandcard()||target.isMinHandcard()) num++; + if(player.isMinEquip()||target.isMinEquip()) num++; + if((player.isMinHp()&&player.isDamaged())||(target.isMinHp()&&target.isDamaged())) num+=2.1; + return num; + } + } + } + }, //颜良文丑 olshuangxiong:{ audio:2, @@ -1044,7 +1125,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ var hs=player.getCards('h'); if(!hs.length) return false; - if((player.getStat('skill').reqice||0) >= player.countMark('reqice_mark')+1) return false; + if((player.getStat('skill').reqice||0)>=player.countMark('reqice_mark')+1) return false; for(var i=0; i=0) return history[index]; return false; }, @@ -14195,6 +14276,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_yanwen:'界颜良文丑', olshuangxiong:'双雄', olshuangxiong_info:'①摸牌阶段结束时,你可以弃置一张牌。若如此做,你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用。②结束阶段,你从弃牌堆中获得本回合内对你造成伤害的所有牌。', + re_zhuzhi:'界朱治', + reanguo:'安国', + reanguo_info:'出牌阶段限一次。你可以选择一名其他角色,若其:手牌数为全场最少,其摸一张牌;体力值为全场最低,其回复1点体力;装备区内牌数为全场最少,其随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。若你与其执行了全部分支,你可以重铸任意张牌。', refresh_standard:'界限突破·标', refresh_feng:'界限突破·风', diff --git a/character/sb.js b/character/sb.js index f510f87c1..3aa3c3148 100644 --- a/character/sb.js +++ b/character/sb.js @@ -28,21 +28,365 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sb_liubei:['male','shu',4,['sbrende','sbzhangwu','sbjijiang'],['zhu']], sb_jiangwei:['male','shu','4/4/1',['sbtiaoxin','sbzhiji']], sb_fazheng:['male','shu',3,['sbxuanhuo','sbenyuan']], - sb_chengong:['male','qun',3,['sbmingce','sbzhichi'],['unseen']], - sb_diaochan:['female','qun',3,['sblijian','sbbiyue'],['unseen']], - sb_yuanshao:['male','qun',4,['sbluanji','sbxueyi'],['zhu','unseen']], - sb_pangtong:['male','shu',3,['sblianhuan','sbniepan'],['unseen']], + sb_chengong:['male','qun',3,['sbmingce','sbzhichi']], + sb_diaochan:['female','qun',3,['sblijian','sbbiyue']], + sb_yuanshao:['male','qun',4,['sbluanji','sbxueyi'],['zhu']], + sb_pangtong:['male','shu',3,['sblianhuan','sbniepan']], + sb_sunce:['male','wu','2/4',['sbjiang','sbhunzi','sbzhiba'],['zhu','unseen']], + sb_daqiao:['female','wu',3,['sbguose','sbliuli'],['unseen']], + sb_liubiao:['male','qun',3,['sbzishou','sbzongshi'],['unseen']], }, characterSort:{ sb:{ - sb_zhi:['sb_sunquan','sb_zhouyu','sb_zhangjiao','sb_caocao','sb_zhenji','sb_liubei'], + sb_zhi:['sb_sunquan','sb_zhouyu','sb_zhangjiao','sb_caocao','sb_zhenji','sb_liubei','sb_daqiao','sb_liubiao'], sb_shi:['sb_xuhuang','sb_machao','sb_fazheng','sb_chengong','sb_pangtong'], - sb_tong:['liucheng','sp_yangwan','sb_xiahoushi','sb_zhangfei','sb_zhaoyun'], + sb_tong:['liucheng','sp_yangwan','sb_xiahoushi','sb_zhangfei','sb_zhaoyun','sb_sunce'], sb_yu:['sb_yujin','sb_lvmeng','sb_huangzhong','sb_huanggai','sb_zhouyu','sb_caoren','sb_ganning'], sb_neng:['sb_huaxiong','sb_sunshangxiang','sb_jiangwei','sb_diaochan','sb_yuanshao'], } }, skill:{ + //阿笨 + sbjiang:{ + audio:2, + trigger:{ + player:'useCardToPlayered', + target:'useCardToTargeted', + }, + shaRelated:true, + filter:function(event,player){ + if(!(event.card.name=='juedou'||(event.card.name=='sha'&&get.color(event.card)=='red'))) return false; + return true; + }, + frequent:true, + onremove:true, + group:['sbjiang_add','sbjiang_qiben'], + content:function(){ + player.draw(); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(card.name=='sha'&&get.color(card)=='red') return [1,0.6]; + }, + player:function(card,player,target){ + if(card.name=='sha'&&get.color(card)=='red') return [1,1]; + } + } + }, + subSkill:{ + add:{ + audio:'sbjiang', + trigger:{player:'useCard2'}, + direct:true, + filter:function(event,player){ + if(event.card.name!='juedou') return false; + var info=get.info(event.card); + if(info.allowMultiple==false) return false; + if(event.targets&&!info.multitarget){ + if(game.hasPlayer(function(current){ + return !event.targets.contains(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); + })){ + return true; + } + } + return false; + }, + content:function(){ + 'step 0' + var prompt2='为'+get.translation(trigger.card)+'额外指定一个目标,然后失去1点体力'; + player.chooseTarget(get.prompt('sbjiang_add'),function(card,player,target){ + var player=_status.event.player; + if(_status.event.targets.contains(target)) return false; + return lib.filter.targetEnabled2(_status.event.card,player,target); + }).set('prompt2',prompt2).set('ai',function(target){ + var trigger=_status.event.getTrigger(); + var player=_status.event.player; + var eff=get.effect(target,trigger.card,player,player); + if(player.hasZhuSkill('sbzhiba')&&!player.hasMark('sbjiang')) return eff; + if(eff+get.effect(player,{name:'losehp'},player)/8>0) return eff; + return 0; + }).set('targets',trigger.targets).set('card',trigger.card); + 'step 1' + if(result.bool){ + if(!event.isMine()&&!event.isOnline()) game.delayx(); + event.targets=result.targets; + } + else{ + event.finish(); + } + 'step 2' + if(event.targets){ + player.logSkill('sbjiang_add',event.targets); + trigger.targets.addArray(event.targets); + player.loseHp(); + } + } + }, + qiben:{ + audio:'sbjiang', + enable:'phaseUse', + viewAs:{name:'juedou'}, + filterCard:true, + position:'h', + selectCard:-1, + prompt:function(){ + var player=_status.event.player; + var limit=(player.hasMark('sbjiang')?(game.countPlayer(current=>{ + return current.group=='wu'&¤t!=player; + })+1):1); + return '出牌阶段限'+get.cnNumber(limit)+'次。你可以将所有手牌当【决斗】使用'; + }, + filter:function(event,player){ + var limit=player.hasMark('sbjiang')?(game.countPlayer(current=>{ + return current.group=='wu'&¤t!=player; + })+1):1; + if((player.getStat('skill').sbjiang_qiben||0)>=limit) return false; + var hs=player.getCards('h'); + if(!hs.length) return false; + for(var i=0;i1) return; + if(get.tag(card,'damage')==1&&(target.hasZhuSkill('sbzhiba')||player.countCards('hs','tao')+target.countCards('hs',['tao','jiu'])>0)&& + !target.isTurnedOver()&&_status.currentPhase!=target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [0.5,1]; + } + } + } + }, + sbzhiba:{ + audio:2, + trigger:{player:'dying'}, + filter:function(event,player){ + if(!player.hasZhuSkill('sbzhiba')) return false; + return player.hp<=0; + }, + zhuSkill:true, + limited:true, + skillAnimation:true, + animationColor:'wood', + content:function(){ + 'step 0' + player.awakenSkill('sbzhiba'); + var num=game.countPlayer(current=>current.group=='wu'); + if(num>0) player.recover(num); + player.addMark('sbjiang',1,false); + event.targets=game.filterPlayer(current=>{ + return current.group=='wu'&¤t!=player; + }).sortBySeat(_status.currentPhase); + player.addTempSkill('sbzhiba_draw'); + 'step 1' + var target=targets.shift(); + target.damage('nosource'); + if(targets.length) event.redo(); + }, + subSkill:{ + draw:{ + trigger:{global:'dieAfter'}, + filter:function(event,player){ + return event.getParent(4).name=='sbzhiba'; + }, + forced:true, + charlotte:true, + content:function(){ + player.draw(3); + } + } + } + }, + //大乔 + sbguose:{ + audio:2, + enable:'phaseUse', + usable:4, + discard:false, + lose:false, + delay:false, + filter:function(event,player){ + return player.countCards('hes',{suit:'diamond'})>0; + }, + position:'hes', + filterCard:{suit:'diamond'}, + selectCard:[0,1], + filterTarget:function(card,player,target){ + if(!ui.selected.cards.length){ + if(target.hasJudge('lebu')) return true; + return false; + } + if(player==target) return false; + var mod=game.checkMod(ui.selected.cards[0],player,'unchanged','cardEnabled2',player); + if(!mod) return false; + return player.canUse({name:'lebu',cards:ui.selected.cards},target); + }, + check:function(card){ + return 7-get.value(card); + }, + content:function(){ + 'step 0' + if(target.hasJudge('lebu')){ + target.discard(target.getJudge('lebu')); + } + else{ + player.useCard({name:'lebu'},target,cards).audio=false; + } + 'step 1' + player.draw(); + player.chooseToDiscard(true,'he','国色:请弃置一张牌'); + }, + ai:{ + result:{ + target:function(player,target){ + if(target.hasJudge('lebu')) return -get.effect(target,{name:'lebu'},player,target); + return get.effect(target,{name:'lebu'},player,target); + } + }, + order:9, + } + }, + sbliuli:{ + audio:2, + inherit:'liuli', + group:'sbliuli_heart', + subSkill:{ + heart:{ + trigger:{player:'logSkill'}, + filter:function(event,player){ + if(event.skill!='sbliuli') return false; + if(player.hasSkill('sbliuli_used')) return false; + var evt=event.log_event; + return player.hasHistory('lose',evtx=>{ + return evtx.getParent(2)==evt&&get.suit(evtx.cards[0])=='heart'; + }); + }, + content:function(){ + 'step 0' + var sourcex=trigger.log_event.getTrigger().player; + player.chooseTarget('流离:是否令一名不为'+get.translation(sourcex)+'的其他角色获得“流离”标记?',(card,player,target)=>{ + return target!=player&&target!=_status.event.sourcex; + }).set('ai',target=>{ + return get.attitude(_status.event.player,target); + }).set('sourcex',sourcex); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'green'); + game.player.forEach(i=>i.removeSkill('sbliuli_dangxian')); + target.addSkill('sbliuli_dangxian'); + player.addTempSkill('sbliuli_used'); + } + } + }, + used:{charlotte:true}, + dangxian:{ + trigger:{player:'phaseBegin'}, + forced:true, + charlotte:true, + mark:true, + marktext:'流', + intro:{content:'回合开始时,执行一个额外的出牌阶段'}, + content:function(){ + var next=player.phaseUse(); + event.next.remove(next); + trigger.next.push(next); + player.removeSkill('sbliuli_dangxian'); + } + } + } + }, + //刘表 + sbzishou:{ + audio:2, + trigger:{global:'phaseJieshuBegin'}, + filter:function(event,player){ + if(player==event.player) return false; + if(!event.player.countCards('he')) return false; + return !event.player.hasAllHistory('sourceDamage',evt=>{ + return evt.player==player; + })&&!event.player.hasAllHistory('damage',evt=>{ + return evt.source==player; + }); + }, + forced:true, + logTarget:'player', + content:function(){ + 'step 0' + trigger.player.chooseCard(true,get.translation(player)+'对你发动了【自守】','交给其一张牌','he'); + 'step 1' + if(result.bool){ + trigger.player.give(result.cards,player); + } + }, + ai:{ + threaten:3, + } + }, + sbzongshi:{ + audio:2, + trigger:{player:'damageEnd'}, + filter:function(event,player){ + if(!event.source||!event.source.isIn()) return false; + return !player.getStorage('sbzongshi').contains(event.source); + }, + forced:true, + onremove:true, + logTarget:'source', + content:function(){ + trigger.source.chooseToDiscard(true,trigger.source.countCards('h')); + player.markAuto('sbzongshi',[trigger.source]); + }, + intro:{ + content:'已扒过目标:$' + }, + ai:{ + threaten:0.5, + effect:{ + target:function(card,player,target,current){ + if(!get.tag(card,'damage')) return; + var cards=player.getCards('h'); + if(!target.hasFriend()) return; + var value=cards.reduce((p,c)=>{ + return p+get.value(c); + }); + if(cards.length>5||value>5*cards.length) return [1,0,0,-cards.length/2]; + return [1,0,0,-0.5]; + } + } + } + }, //貂蝉 sblijian:{ audio:2, @@ -66,6 +410,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.canUse(card,targetx)) target.useCard(card,targetx); }, ai:{ + threaten:3, order:7, result:{target:-1} } @@ -246,10 +591,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(!player.needsToDiscard(-1)){ if(targets.length>=7){ - if(num<2) return 0; + if(num<1) return 0; } else if(targets.length>=5){ - if(num<1.5) return 0; + if(num<0.5) return 0; } } return 6-get.value(card); @@ -364,6 +709,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(!trigger.card.storage) trigger.card.storage={}; trigger.card.storage.sblianhuan=true; + trigger._sblianhuan=true; player.addTempSkill('sblianhuan_discard','phaseUseAfter'); } }, @@ -402,7 +748,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseTarget(get.prompt('sblianhuan_add'),'为'+get.translation(trigger.card)+'额外指定任意个目标',function(card,player,target){ + player.chooseTarget(get.prompt('sblianhuan_add'),'为'+get.translation(trigger.card)+'额外指定任意个目标',[1,Infinity],function(card,player,target){ return !_status.event.sourcex.contains(target)&&player.canUse(_status.event.card,target); }).set('sourcex',trigger.targets).set('ai',function(target){ var player=_status.event.player; @@ -427,7 +773,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ locked:false, popup:false, filter:function(event,player){ - return event.isFirstTarget&&event.card.name=='tiesuo'&&player.storage.sblianhuan; + return event.isFirstTarget&&event.card.name=='tiesuo'&&player.storage.sblianhuan&&!event.getParent()._sblianhuan; }, content:function(){ 'step 0' @@ -1868,7 +2214,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var card=result.cards[0]; target.showCards(card,get.translation(target)+'【洛神】展示'); if(get.color(card)=='black'){ - player.gain(card,target,'giveAuto','bySelf').gaintag.add('sbluoshen'); + player.gain(card,target,'give','bySelf').gaintag.add('sbluoshen'); } else if(get.color(card)=='red'){ target.discard(card); @@ -2478,7 +2824,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //周瑜 sbyingzi:{ audio:2, - audioname:['heqi','sunce','gexuan','re_sunben','re_sunce','re_heqi'], + audioname:['sb_sunce'], trigger:{player:'phaseDrawBegin2'}, forced:true, getNum:function(player){ @@ -3780,6 +4126,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!player.storage.sblianhuan) str+='③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。'; else str+='③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。'; return str; + }, + sbjiang:function(player){ + var str='①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限'; + if(player.countMark('sbjiang')) str+='X次。你可以将所有手牌当【决斗】使用(X为场上其他吴势力角色数+1)。'; + else str+='一次。你可以将所有手牌当【决斗】使用。'; + return str; } }, translate:{ @@ -3926,6 +4278,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sblianhuan_lv2_info:'①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。', sbniepan:'涅槃', sbniepan_info:'限定技。当你处于濒死状态时,你可以弃置区域里的所有牌,摸三张牌,将体力回复至3点,复原武将牌,然后修改〖连环〗。', + sb_sunce:'谋孙策', + sbjiang:'激昂', + sbjiang_info:'①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限一次。你可以将所有手牌当【决斗】使用。', + sbhunzi:'魂姿', + sbhunzi_info:'觉醒技。当你脱离濒死状态后,你减1点体力上限,获得2点护甲,摸三张牌。然后你获得〖英姿〗和〖英魂〗。', + sbzhiba:'制霸', + sbzhiba_info:'主公技,限定技。当你进入濒死状态时,你可以回复X点体力并修改〖激昂③〗为“出牌阶段限X次”(X为场上其他吴势力角色数+1)。然后其他吴势力角色依次受到1点无来源伤害,且当有角色因此死亡后,你摸三张牌。', + sb_daqiao:'谋大乔', + sbguose:'国色', + sbguose_info:'出牌阶段限四次。你可以选择一项:1.将一张♦牌当【乐不思蜀】使用;2.弃置场上一张【乐不思蜀】。然后你摸一张牌并弃置一张牌。', + sbliuli:'流离', + sbliuli_info:'当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内的一名不为此【杀】使用者的角色,将此【杀】转移给该角色。若你以此法弃置了♥牌,则你可以令一命不为此【杀】使用者的其他角色获得“流离”标记,且移去场上所有其他的“流离”(每回合限一次)。有“流离”的角色回合开始时,其移去其“流离”并执行一个额外的出牌阶段。', + sb_liubiao:'谋刘表', + sbzishou:'自守', + sbzishou_info:'锁定技。其他角色的结束阶段,若其与你于本局游戏内均未对对方造成过伤害,其须交给你一张牌。', + sbzongshi:'宗室', + sbzongshi_info:'锁定技。每名角色限一次。当你受到伤害后,你令伤害来源弃置所有手牌。', sb_zhi:'谋攻篇·知', sb_shi:'谋攻篇·识', diff --git a/character/shenhua.js b/character/shenhua.js index c31f9b700..6bd6f20ea 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -5082,7 +5082,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, gzyinghun:{ audio:'yinghun', - audioname:['re_sunjian','sunce','re_sunben','re_sunce','ol_sunjian'], + audioname:['re_sunjian','sunce','re_sunben','re_sunce','ol_sunjian','sb_sunce'], trigger:{player:'phaseZhunbeiBegin'}, filter:function(event,player){ return player.getDamagedHp()>0; diff --git a/character/sp.js b/character/sp.js index 2f396e969..953b0f59f 100755 --- a/character/sp.js +++ b/character/sp.js @@ -28,6 +28,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + sunhong:['male','wu',3,['olxianbi','olzenrun']], + luoxian:['male','shu',4,['oldaili']], + ol_huban:['male','wei',4,['olhuiyun']], wangguan:['male','wei',3,['olmiuyan','olshilu']], ol_zhangyì:['male','shu',4,['oldianjun','olkangrui']], ol_zhujun:['male','qun',4,['olcuipo']], @@ -184,6 +187,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //kaisa:["male","western",4,["zhengfu"]], }, characterIntro:{ + luoxian:'罗宪(218年—270年),字令则,荆州襄阳(今湖北襄阳)人。西晋开国将领,巴东太守(郡府在永安白帝城)。于蜀汉灭亡后降魏,成功抵御孙吴的入侵,守住入魏国的要冲永安。后仕晋官至冠军将军、假节,封西鄂县侯。泰始六年(270年)去世,谥烈侯。', + sunhong:'孙弘(?—252年),三国时期吴国大臣,扬州会稽(今浙江省绍兴市)人。官至吴国中书令、少傅。鲁王孙霸与太子孙和各植党羽,孙弘即依附孙霸。孙权病笃,而太子年少,于是以孙弘领少傅。孙权临终,召他与诸葛恪、孙峻等嘱以后事,孙弘与诸葛恪同为顾命大臣。孙权死后,孙弘因素来与诸葛恪不和,怕为所治,故而隐瞒了孙权的死讯,欲矫诏除掉诸葛恪,被孙峻告发。后诸葛恪请孙弘议事,于座中将其诛杀。', wangguan:'《三国演义》中虚构人物,历史上不曾记载。在114回出场,曾为邓艾手下参谋,献反间计与邓艾,被姜维识破,兵败自投江而死。', maxiumatie:'马休(?-212年),马铁(?-212年)。两人均为扶风茂陵(今陕西兴平)人,马腾之子,马超之弟。马腾遭韩遂进攻,乃携马休、马铁等入京受职。马休被封为奉车都尉,马铁被封为骑都尉。后在邺城居住。因兄马超反,两人被曹操夷灭。', dongtuna:'董荼那,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第二洞元帅;与阿会喃等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同阿会喃共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。', @@ -671,6 +676,324 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //孙弘 + olxianbi:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + return !player.getStorage('olzenrun').contains(target)&&target.countCards('e')!=player.countCards('h'); + }, + content:function(){ + 'step 0' + var del=target.countCards('e')-player.countCards('h'); + if(del==0) event.finish(); + else if(del>0){ + player.draw(Math.min(5,del)); + } + else{ + player.chooseToDiscard('险诐:弃置'+get.cnNumber(-del)+'张手牌',-del,'h',true); + player.addTempSkill('olxianbi_gain'); + } + }, + ai:{ + order:5, + result:{ + player:function(player,target){ + return player.countCards('h',card=>{ + return get.value(card)>6; + })>=target.countCards('e')?0:1; + } + } + }, + subSkill:{ + gain:{ + trigger:{ + player:'loseAfter', + }, + filter:function(event,player){ + return event.getParent(3).name=='olxianbi'; + }, + forced:true, + charlotte:true, + popup:false, + content:function(){ + var cards=[],cards2=trigger.cards; + for(var cardx of cards2){ + var type=get.type2(cardx,player); + var card=get.discardPile(function(card){ + return get.type(card,false)==type&&!cards2.contains(card)&&!cards.contains(card); + }); + if(card) cards.push(card); + } + if(cards.length) player.gain(cards,'gain2'); + } + } + } + }, + olzenrun:{ + audio:2, + trigger:{player:'drawBefore'}, + filter:function(event,player){ + return !player.hasSkill('olzenrun_used')&&game.hasPlayer(current=>{ + return !player.getStorage('olzenrun').contains(current)&¤t!=player&¤t.hasCard(function(card){ + return lib.filter.canBeGained(card,player,current); + },'he') + }); + }, + direct:true, + check:function(event,player){ + return true; + }, + content:function(){ + 'step 0' + var num=trigger.num; + player.chooseTarget(get.prompt('olzenrun'),'改为获得一名其他角色'+get.cnNumber(num)+'张牌',(card,player,target)=>{ + return !player.getStorage('olzenrun').contains(target)&&target!=player&&target.hasCard(function(card){ + return lib.filter.canBeGained(card,player,target); + },'he') + }).set('ai',target=>{ + return get.attitude(_status.event.player,target)/5+Math.random()+2.5; + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('olzenrun',target); + player.addTempSkill('olzenrun_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); + trigger.cancel(); + player.gainPlayerCard(target,trigger.num,'he',true); + } + 'step 2' + if(result.bool){ + var cards=result.cards; + var num=cards.length; + event.num=num; + target.chooseControl().set('choiceList',[ + '摸'+get.cnNumber(num)+'张牌', + '令其不能再对你发动〖险诐〗和〖谮润〗' + ]).set('prompt',get.translation(player)+'对你发动了【谮润】,请选择一项').set('ai',()=>{ + if(_status.event.bool) return 0; + return 1; + }).set('bool',get.attitude(target,player)>0||num==1&&Math.random()<0.5||num>=2); + } + else event.finish(); + 'step 3' + game.log(target,'选择了','#y'+result.control); + if(result.index==0){ + target.draw(num); + } + else{ + player.markAuto('olzenrun',[target]); + } + }, + subSkill:{ + used:{ + charlotte:true, + } + } + }, + //罗宪 + oldaili:{ + audio:2, + trigger:{global:'phaseEnd'}, + filter:function(event,player){ + return player.countCards('h',card=>{ + return card.hasGaintag('oldaili_tag'); + })%2==0; + }, + group:'oldaili_record', + content:function(){ + player.turnOver(); + player.draw(3,'visible').gaintag=['oldaili_tag']; + }, + mod:{ + aiValue:function(player,card,num){ + if(get.itemtype(card)!='card'||!card.hasGaintag('oldaili_tag')) return; + if(get.distance(_status.currentPhase,player,'absolute')==1&&!player.isTurnedOver()) return; + if(player.countCards('h',card=>{ + return card.hasGaintag('oldaili_tag'); + })%2==0&&!ui.selected.cards.some(card=>{ + return card.hasGaintag('oldaili_tag'); + })){ + return num/10; + } + }, + aiUseful:function(){ + return lib.skill.oldaili.mod.aiValue.apply(this,arguments); + }, + }, + subSkill:{ + record:{ + trigger:{player:'showCardsEnd'}, + forced:true, + charlotte:true, + popup:false, + firstDo:true, + content:function(){ + game.broadcastAll(function(cards){ + cards.forEach(card=>card.addGaintag('oldaili_tag')); + },trigger.cards); + } + } + } + }, + //胡班 + olhuiyun:{ + audio:2, + enable:'phaseUse', + viewAs:{ + name:'huogong', + storage:{olhuiyun:true}, + }, + filterCard:true, + position:'hes', + onuse:function(links,player){ + player.addTempSkill('olhuiyun_after'); + player.addTempSkill('olhuiyun_record'); + }, + ai:{ + effect:{ + player:function(card,player,target){ + if(get.attitude(player,target)>0&&card&&card.name=='huogong'&&card.storage&&card.storage.olhuiyun&&!player.hasSkill('olhuiyun_3')) return [0,0.5,0,0.5]; + } + } + }, + subSkill:{ + after:{ + audio:'olhuiyun', + trigger:{global:'useCardAfter'}, + charlotte:true, + forced:true, + direct:true, + filter:function(event,player){ + return event.card.name=='huogong'&&event.card.storage&&event.card.storage.olhuiyun&&event.targets.some(i=>i.isIn()); + }, + content:function(){ + 'step 0' + var choices=[]; + var choiceList=[ + '使用展示牌,然后重铸所有手牌', + '使用一张手牌,然后重铸展示牌', + '摸一张牌' + ]; + for(var i=1;i<=3;i++){ + if(!player.hasSkill('olhuiyun_'+i)) choices.push('选项'+get.cnNumber(i,true)); + else choiceList[i-1]=''+choiceList[i-1]+''; + } + if(!choices.length) event.finish(); + else{ + player.logSkill('olhuiyun_after'); + player.chooseControl(choices).set('choiceList',choiceList).set('prompt','晖云:选择一项,令'+get.translation(trigger.targets)+'可以选择执行').set('ai',()=>{ + return _status.event.choice; + }).set('choice',function(){ + if(choices.length==1) return choices[0]; + var choicesx=choices.slice(); + if(get.attitude(player,trigger.targets[0])>0&&choices.contains('选项三')) return '选项三'; + choicesx.remove('选项三'); + return choicesx.randomGet(); + }()); + } + 'step 1' + if(result.control!='cancel2'){ + var index=['选项一','选项二','选项三'].indexOf(result.control)+1; + event.index=index; + game.log(player,'选择了','#y'+result.control); + player.addTempSkill('olhuiyun_'+index,'roundStart'); + event.targets=trigger.targets.slice(0); + } + else event.finish(); + 'step 2' + var target=targets.shift(); + event.target=target; + if(target.isIn()){ + var cards=target.getCards('h',card=>card.hasGaintag('olhuiyun_tag')); + if(event.index==3){ + target.chooseBool('是否摸一张牌?').set('ai',()=>true); + event.goto(5); + } + else if(cards.length){ + if(event.index==1){ + target.chooseToUse({ + filterCard:function(card){ + if(get.itemtype(card)!='card'||!card.hasGaintag('olhuiyun_tag')) return false; + return lib.filter.filterCard.apply(this,arguments); + }, + prompt:'是否使用一张展示牌,然后重铸所有手牌?' + }); + } + else{ + target.chooseToUse({ + filterCard:function(card){ + if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; + return lib.filter.filterCard.apply(this,arguments); + }, + prompt:'是否使用一张手牌,然后重铸展示牌?' + }); + event.goto(4); + } + } + else event.goto(6); + } + else event.goto(6); + 'step 3' + if(result.bool){ + var hs=target.getCards('h',card=>{ + var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); + if(mod!='unchanged') return mod; + return true; + }); + if(hs.length){ + target.loseToDiscardpile(hs); + target.draw(hs.length); + } + } + event.goto(6); + 'step 4' + if(result.bool){ + var hs=target.getCards('h',card=>{ + if(!card.hasGaintag('olhuiyun_tag')) return false; + var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); + if(mod!='unchanged') return mod; + return true; + }); + if(hs.length){ + target.loseToDiscardpile(hs); + target.draw(hs.length); + } + } + event.goto(6); + 'step 5' + if(result.bool){ + target.draw(); + } + 'step 6' + if(targets.length) event.goto(2); + } + }, + record:{ + trigger:{global:'showCardsEnd'}, + forced:true, + charlotte:true, + popup:false, + firstDo:true, + filter:function(event,player){ + if(event.getParent().name!='huogong') return false; + var card=event.getParent(2).card; + if(card&&card.storage&&card.storage.olhuiyun) return true; + return false; + }, + content:function(){ + game.broadcastAll(function(cards){ + cards.forEach(card=>card.addGaintag('olhuiyun_tag')); + },trigger.cards); + } + }, + 1:{charlotte:true}, + 2:{charlotte:true}, + 3:{charlotte:true}, + } + }, //王瓘 olmiuyan:{ audio:2, @@ -10472,22 +10795,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, }, - subSkill:{ - count:{ - forced:true, - silent:true, - popup:false, - trigger:{ - player:"loseEnd", - }, - filter:function(event,player){ - return event.cards2&&event.cards2.length>0; - }, - content:function (){ - lib.skill.xinshanjia.sync(player); - }, - }, - }, audio:"shanjia", trigger:{ player:"phaseUseBegin", @@ -10520,16 +10827,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseToDiscard('he',true,num).ai=get.disvalue; } 'step 2' - var bool=true; + var bool1=true,bool2=true; if(result.cards){ + var cards=result.cards; for(var i=0;i0; + }, + content:function (){ + lib.skill.xinshanjia.sync(player); + }, + }, + sha:{ + mark:true, + charlotte:true, + intro:{content:'使用【杀】的次数上限+1'}, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+1; + } + } + }, + nodis:{ + mark:true, + charlotte:true, + intro:{content:'使用牌无距离限制'}, + mod:{ + targetInRange:()=>true + } + } + } }, //OL马超 ol_shichou:{ @@ -16635,30 +16979,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filter:function(event,player){ if(event.targets.length!=1||!['sha','juedou'].contains(event.card.name)) return false; - var evt2=event.getParent('phaseUse'); - if(evt2.player!=player) return false; return player.getHistory('useCard',function(evt){ - return evt.card.name==event.card.name&&evt.getParent('phaseUse')==evt2; + return evt.card.name==event.card.name; }).indexOf(event.getParent())==0; }, direct:true, content:function(){ 'step 0' - player.chooseControl('draw_card','加伤害','cancel2').set('prompt',get.prompt2('fengpo')); + var str1=get.translation(trigger.card),str2=get.translation(trigger.target); + player.chooseControl('摸X加1伤','摸1加X伤','cancel2').set('prompt',get.prompt('fengpo',trigger.target)).set('prompt2','你可以选择一项:1.摸X张牌,令'+str1+'的伤害+1;2.摸一张牌,令'+str1+'的伤害+X(X为'+str2+'的♦牌的数量)。'); 'step 1' if(result.control&&result.control!='cancel2'){ player.logSkill('fengpo',trigger.target); - var nd=trigger.target.countCards('h',{suit:'diamond'}); - if(result.control=='draw_card'){ - player.draw(nd); - } - else{ - var trigger2=trigger.getParent(); - if(typeof trigger2.baseDamage!='number'){ + var nd=trigger.target.countCards('he',{suit:'diamond'}); + var draw=1,damage=1; + if(result.control=='摸X加1伤') draw=nd; + else damage=nd; + player.draw(draw); + var trigger2=trigger.getParent(); + if(typeof trigger2.baseDamage!='number'){ trigger2.baseDamage=1; } - trigger2.baseDamage+=nd; - } + trigger2.baseDamage+=damage; } } }, @@ -17545,6 +17887,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ if(!target.storage.rezhoufu2_markcount) target.storage.rezhoufu2_markcount=0; target.addToExpansion(cards,player,'give').gaintag.add('rezhoufu2'); + target.addSkill('rezhoufu_judge'); }, ai:{ order:1, @@ -17552,18 +17895,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target:-1, }, }, - group:['rezhoufu_judge','rezhoufu_losehp'], + group:['rezhoufu_losehp'], subSkill:{ judge:{ audio:'zhoufu', - trigger:{global:'judgeBefore'}, + trigger:{player:'judgeBefore'}, forced:true, + charlotte:true, filter:function(event,player){ - return !event.directresult&&event.player.getExpansions('rezhoufu2').length; + return !event.directresult&&player.getExpansions('rezhoufu2').length; }, - logTarget:'player', content:function(){ - var cards=[trigger.player.getExpansions('rezhoufu2')[0]]; + var cards=[player.getExpansions('rezhoufu2')[0]]; trigger.directresult=cards[0]; }, }, @@ -21395,11 +21738,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dingfeng:['dingfeng','tw_dingfeng','old_dingfeng'], zumao:['zumao','tw_zumao'], beimihu:['tw_beimihu','beimihu'], - panfeng:['re_panfeng','panfeng'], + panfeng:['re_panfeng','panfeng','std_panfeng'], sunluyu:['sunluyu','re_sunluyu'], jin_simazhao:['jin_simazhao','simazhao','sp_simazhao'], jin_wangyuanji:['jin_wangyuanji','wangyuanji','sp_wangyuanji'], - wangyun:['re_wangyun','wangyun','dc_wangyun','old_wangyun','pe_wangyun'], + wangyun:['re_wangyun','wangyun','dc_wangyun','jsrg_wangyun','old_wangyun','pe_wangyun'], zhangliang:['re_zhangliang','zhangliang'], lingju:['lingju','old_lingju'], guansuo:['guansuo','ol_guansuo'], @@ -21634,7 +21977,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ daoshu_info:'出牌阶段限一次。你可以选择一个花色并获得一名其他角色的一张手牌。若此牌花色与你选择的相同,则你对其造成1点伤害且你〖盗书〗于此阶段内可使用的次数上限+1。否则你须交给其一张与此牌花色不同的手牌(没有则展示手牌)。', xinshanjia:"缮甲", - xinshanjia_info:"出牌阶段开始时,你可以摸三张牌,然后弃置3-X张牌(X为你本局游戏内不因使用而失去过的装备牌的数目且至多为3)。若你没有以此法弃置基本牌或锦囊牌,则你可以视为使用了一张无距离限制且不计入出牌阶段使用次数的【杀】。", + xinshanjia_info:"出牌阶段开始时,你可以摸三张牌,然后弃置3-X张牌(X为你本局游戏内不因使用而失去过的装备牌的数目且至多为3)。若你没有以此法弃置:基本牌,此阶段你使用【杀】的次数上限+1;锦囊牌,此阶段你使用牌无距离限制;基本牌或锦囊牌,你可以视为使用一张【杀】。", "new_meibu":"魅步", "new_meibu_info":"其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得技能〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", "new_mumu":"穆穆", @@ -21795,7 +22138,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinyongsi_info:'锁定技,摸牌阶段,你令额定摸牌数改为X(X为势力数);弃牌阶段开始时,你选择一项:1.弃置一张牌;2.失去1点体力。', xiehui:'黠慧', xiehui2:'黠慧', - xiehui_info:'锁定技,你的黑色牌不计入手牌上限;其他角色获得你的黑色牌时,其不能使用、打出、弃置这些牌直到其体力值减少为止。', + xiehui_info:'锁定技,你的黑色牌不计入手牌上限;其他角色获得你的黑色牌时,其不能使用、打出、弃置这些牌直到其体力值扣减为止。', lianzhu:'连诛', lianzhu_info:'出牌阶段限一次,你可以展示并交给一名其他角色一张牌,若此牌为黑色,其选择一项:1.你摸两张牌;2.弃置两张牌', shanjia:'缮甲', @@ -21932,7 +22275,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bushi_info:'当你受到1点伤害后,或其他角色受到你造成的1点伤害后,受到伤害的角色可以获得你的一张「米」', midao_info:'一名角色的判定牌生效前,你可以打出一张「米」代替之。', fengpo:'凤魄', - fengpo_info:'每种牌名各限一次。当你于出牌阶段内使用的第一张【杀】或【决斗】指定目标后,若目标角色数为1,你可以选择一项:1.摸X张牌;2.令此牌的伤害值基数+X。(X为其手牌中♦牌的数量)', + fengpo_info:'每种牌名各限一次。当你每回合使用的第一张【杀】或【决斗】指定目标后,若目标角色数为1,你可以选择一项:1.摸X张牌,令此牌的伤害值基数+1;2.摸一张牌,令此牌的伤害值基数+X(X为其♦牌的数量)。', chenqing:'陈情', chenqing_info:'每轮限一次,当一名角色处于濒死状态时,你可以令另一名其他角色摸四张牌,然后其弃置四张牌。若其以此法弃置的四张牌花色各不相同,则视为该角色对濒死的角色使用一张【桃】。', mozhi:'默识', @@ -22072,7 +22415,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ oldxiemu_info:'当你成为其他角色使用的黑色牌的目标后,你可以弃置一张【杀】,然后摸两张牌。', spmengjin_info:'当你使用【杀】指定目标后,你可以弃置目标角色的一张牌。', fenxun_info:'出牌阶段限一次,你可以弃置一张牌并选择一名其他角色,你于本回合内至其的距离视为1。', - rezhoufu_info:'出牌阶段限一次,你可以用一张牌对一名其他角色施“咒”。当有“咒”的角色判定时,将“咒”作为判定牌;一名角色的回合结束时,你令本回合移除过“咒”的角色各失去1点体力', + rezhoufu_info:'①出牌阶段限一次。你可以用一张牌对一名其他角色施“咒”,且当其判定时,将“咒”作为判定牌。②一名角色的回合结束时,你令本回合移除过“咒”的角色各失去1点体力。', reyingbing_info:'锁定技,有“咒”的角色使用与“咒”颜色相同的牌时,你摸一张牌;若这是你第二次因该“咒”摸牌,则你获得该"咒"。', yingbin_info:'锁定技,有“咒”的角色使用与“咒”花色相同的牌时,你摸一张牌;当你因同一名角色的同一张“咒”的效果摸第二张牌时,移去该“咒”。', zhoufu_info:'出牌阶段限一次,你可以将一张手牌置于一名没有“咒”的其他角色的武将牌旁,称为“咒”。当有“咒”的角色判定时,其改为将“咒”作为判定牌;一名角色的回合结束时,若有角色于此回合因判定而移除过“咒”,则你令这些角色各失去1点体力。', @@ -22497,7 +22840,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olmiuyan_info:'转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的手牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。', olshilu:'失路', olshilu_info:'锁定技。当你受到伤害后,你摸X张牌(X为你的体力值且至多为5)。然后你展示攻击范围内一名角色的一张手牌,令此牌的牌名视为【杀】。', - + ol_huban:'OL胡班', + olhuiyun:'晖云', + olhuiyun_tag:'invisible', + olhuiyun_info:'每轮每项各限一次。你可以将一张牌当【火攻】使用。此牌结算结束后,你选择一项,令目标角色选择是否执行:1.使用展示的牌,然后重铸所有手牌;2.使用一张手牌,然后重铸展示牌;3.摸一张牌。', + sunhong:'孙弘', + olxianbi:'险诐', + olxianbi_info:'出牌阶段限一次。你可以选择一名角色,然后将手牌摸至或弃置至等同于其装备区里的牌数(至多摸五张),且当你因此弃置一张牌后,你随机获得弃牌堆中的另一张类型相同的牌。', + olzenrun:'谮润', + olzenrun_info:'每阶段限一次。当你摸牌时,你可以改为获得一名其他角色等量的牌,然后其选择一项:1.摸等量的牌;2.令你本局游戏不能再对其发动〖险诐〗和〖谮润〗。', + luoxian:'罗宪', + oldaili:'带砺', + oldaili_tag:'带砺', + oldaili_info:'一名角色的回合结束时,若你被展示过的手牌数为偶数,则你可以翻面,摸三张牌并展示之。', + sp_tianji:'天极·皇室宗亲', sp_sibi:'四弼·辅国文曲', sp_tianzhu:'天柱·势冠一方', diff --git a/character/sp2.js b/character/sp2.js index 65c106c93..aa56f4b95 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,6 +4,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ + huanfan:['male','wei',3,['dcjianzheng','dcfumou'],['unseen']], + mengyou:['male','qun',5,['hmmanyi','dcmanzhi'],['unseen']], + chentai:['male','wei',4,['dcjiuxian','dcchenyong'],['unseen']], + dc_sunchen:['male','wu',4,['dczigu','dczuowei'],['unseen']], + sunyu:['male','wu',3,['dcquanshou','dcshexue'],['unseen']], + xizheng:['male','shu',3,['dcdanyi','dcwencan'],['unseen']], + liuchongluojun:['male','qun',3,['dcminze','dcjini'],['unseen']], + yuechen:['male','wei',4,['dcporui','dcgonghu'],['unseen']], zhangkai:['male','qun',4,['dcxiangshu']], dc_ruiji:['female','wu',4,['dcwangyuan','dclingyin','dcliying']], zhoushan:['male','wu',4,['dcmiyun','dcdanying'],['unseen']], @@ -25,7 +33,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuantanyuanxiyuanshang:['male','qun',4,['dcneifa']], sunhuan:['male','wu',4,['dcniji'],['unseen']], qiaorui:['male','qun',4,['dcaishou','dcsaowei']], - yanghong:['male','qun',3,['dcjianji','dcyuanmo'],['unseen']], + yanghong:['male','qun',3,['dcjianji','dcyuanmo']], xianglang:['male','shu',3,['dckanji','dcqianzheng'],['unseen']], qinlang:['male','wei',4,['dchaochong','dcjinjin']], furongfuqian:['male','shu','4/6',['dcxuewei','dcyuguan']], @@ -226,34 +234,1124 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_fenghuo:['re_nanhualaoxian','tongyuan','zhangning','re_pangdegong'], sp_baigei:['re_panfeng','xingdaorong','caoxing','re_chunyuqiong','xiahoujie','dc_caiyang','zhoushan'], sp_caizijiaren:['re_dongbai','re_sunluyu','heyan','zhaoyan','wangtao','wangyue','zhangxuan','tengyin','zhangyao','xiahoulingnv','dc_sunru'], - sp_zhilan:['liuyong','wanniangongzhu','zhanghu','lvlingqi','tenggongzhu','panghui','dc_zhaotongzhaoguang','yuantanyuanxiyuanshang'], + sp_zhilan:['liuyong','wanniangongzhu','zhanghu','lvlingqi','tenggongzhu','panghui','dc_zhaotongzhaoguang','yuantanyuanxiyuanshang','yuechen'], sp_guixin:['re_kanze','re_chendeng','caimaozhangyun','dc_lvkuanglvxiang','dc_gaolan','yinfuren','chengui','chenjiao','dc_sp_jiaxu','qinlang'], sp_daihan:['mamidi','dc_jiling','zhangxun','dc_yuejiu','wanglie','leibo','qiaorui','dongwan','yuanyin'], sp_jianghu:['guanning','huzhao','dc_huangchengyan','mengjie'], sp_zongheng:['huaxin','luyusheng','re_xunchen','re_miheng','fengxi','re_dengzhi','dc_yanghu','zongyu'], sp_taiping:['guanhai','liupi','peiyuanshao','zhangchu','zhangkai'], sp_yanhan:['dc_liuba','dc_huangquan','furongfuqian','xianglang','dc_huojun','gaoxiang'], - sp_jishi:['dc_jiben','zhenghun','dc_sunhanhua'], - sp_raoting:['dc_huanghao','dc_sunziliufang'], + sp_jishi:['dc_jiben','zhenghun','dc_sunhanhua','liuchongluojun'], + sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen'], + sp_yijun:['gongsundu','mengyou'], sp_huangjin:['liuhong','zhujun','re_hansui',"xushao"], sp_fadong:['ol_dingyuan','wangrong','re_quyi','hanfu'], sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'], sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'], sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'], - sp2_huben:['wangshuang','wenyang','re_liuzan','dc_huangzu','wulan','leitong'], + sp2_huben:['wangshuang','wenyang','re_liuzan','dc_huangzu','wulan','leitong','chentai'], sp2_shengun:["puyuan","guanlu","gexuan",'wufan','re_zhangbao','dukui','zhaozhi','zhujianping','dc_zhouxuān','zerong'], sp2_bizhe:['dc_luotong','dc_wangchang','chengbing','dc_yangbiao'], - sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu'], + sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu','sunyu'], sp2_zhangtai:['guozhao','fanyufeng','ruanyu','yangwan','re_panshu'], sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen'], sp2_yinyu:['zhouyi','luyi'], sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji'], - sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong'], + sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'], sp2_yuxiu:['dongguiren','dc_tengfanglan'], - sp_decade:['caobuxing','re_maliang','xin_baosanniang','dongxie','liuhui','gongsundu'], + sp_decade:['caobuxing','re_maliang','xin_baosanniang','dongxie','liuhui'], } }, skill:{ + //桓范 + dcjianzheng:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + return target.countCards('h')&&target!=player; + }, + content:function(){ + 'step 0' + var forced=target.hasCard(i=>player.hasUseTarget(i),'h'); + player.choosePlayerCard(target,'h','visible',forced,'获得并使用其中一张牌').set('filterButton',button=>{ + return _status.event.player.hasUseTarget(button.link); + }).set('ai',button=>{ + return _status.event.player.getUseValue(button.link); + }); + 'step 1' + if(result.bool){ + var card=result.links[0]; + event.card=card; + player.gain(card,'giveAuto'); + } + else event.goto(3); + 'step 2' + if(get.position(card)=='h'&&get.owner(card)==player&&player.hasUseTarget(card)){ + player.chooseUseTarget(card,true); + event.finish(); + } + 'step 3' + player.link(true); + target.link(true); + 'step 4' + target.viewHandcards(player); + }, + ai:{ + order:10, + expose:0.2, + result:{ + target:function(player,target){ + return -Math.sqrt(target.countCards('h')); + } + } + } + }, + //fumo! + dcfumou:{ + audio:2, + trigger:{player:'damageEnd'}, + direct:true, + filter:function(event,player){ + return player.getDamagedHp()>0; + }, + content:function(){ + 'step 0' + event.num=trigger.num; + 'step 1' + player.chooseTarget(get.prompt2('dcfumou'),[1,player.getDamagedHp()]).set('ai',target=>{ + var att=get.attitude(_status.event.player,target); + if(target.countCards('h')>=3||target.countCards('e')&&!target.isDamaged()){ + if(!target.canMoveCard()) return -att; + else if(!target.canMoveCard(true)) return -att/5; + } + return att; + }); + 'step 2' + if(result.bool){ + var targets=result.targets; + targets.sortBySeat(_status.currentPhase); + event.targets=targets; + player.logSkill('dcfumou',targets); + event.num--; + } + else event.finish(); + 'step 3' + var target=targets.shift(); + event.target=target; + var choices=[]; + var choiceList=[ + '移动场上的一张牌', + '弃置所有手牌并摸两张牌', + '弃置装备区里的所有牌并回复1点体力' + ]; + if(target.canMoveCard()) choices.push('选项一'); + else choiceList[0]=''+choiceList[0]+''; + if(target.countCards('h')&&!target.hasCard(card=>{ + return !lib.filter.cardDiscardable(card,target,'dcfumou'); + },'h')) choices.push('选项二'); + else choiceList[1]=''+choiceList[1]+''; + if(target.countCards('e')&&!target.hasCard(card=>{ + return !lib.filter.cardDiscardable(card,target,'dcfumou'); + },'h')) choices.push('选项三'); + else choiceList[2]=''+choiceList[2]+''; + if(choices.length){ + target.chooseControl(choices).set('prompt','腹谋:请选择一项').set('choiceList',choiceList).set('ai',()=>{ + return _status.event.choice; + }).set('choice',function(){ + if(choices.length==1) return choices[0]; + var func=(choice,target)=>{ + switch(choice){ + case '选项一': + if(target.canMoveCard(true)) return 5; + return 3; + case '选项二': + if(target.countCards('h')<2&&get.value(target.getCards('h')[0])<6) return 4.5; + return 4.5-target.countCards('h'); + case '选项三': + var e2=target.getEquip(2); + if(target.hp+target.countCards('hs',['tao','jiu'])<2&&!e2) return 5.5; + if(get.recoverEffect(target,target,target)<=0) return 3; + if(!e2) return 4.4; + return 5-1.5*target.countCards('e'); + } + } + var choicesx=choices.map(i=>[i,func(i,target)]).sort((a,b)=>b[1]-a[1]); + return choicesx[0][0]; + }()); + } + else event.goto(5); + 'step 4' + game.log(target,'选择了','#y'+result.control); + if(result.control=='选项一'){ + target.moveCard(true); + } + else if(result.control=='选项二'){ + target.chooseToDiscard(true,'h',target.countCards('h')); + target.draw(2); + } + else{ + target.chooseToDiscard(true,'e',target.countCards('e')); + target.recover(); + } + 'step 5' + if(event.targets.length) event.goto(3); + else if(event.num) event.goto(1); + }, + ai:{ + maixie:true, + maixie_hp:true, + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + if(!target.hasFriend()) return; + var num=1; + if(get.attitude(player,target)>0){ + if(player.needsToDiscard()){ + num=0.7; + } + else{ + num=0.5; + } + } + if(target.hp==2&&target.hasFriend()) return [1,num*1.5]; + if(target.hp>=2) return [1,num]; + } + }, + }, + } + }, + //孟优 + dcmanzhi:{ + audio:2, + trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, + filter:function(event,player){ + if(event.name=='phaseJieshu'){ + var del=0; + game.getGlobalHistory('changeHp',evt=>{ + if(evt.player!=player) return; + for(var phase of lib.phaseName){ + var evtx=evt.getParent(phase); + if(evtx&&evtx.name==phase) del+=evt.num; + } + }); + if(del!=0) return false; + } + return game.hasPlayer(current=>{ + if(current==player) return false; + return !player.hasSkill('dcmanzhi_1')&¤t.countCards('he')||!player.hasSkill('dcmanzhi_2')&¤t.countCards('hej'); + }) + }, + direct:true, + content:function(){ + 'step 0' + if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); + player.chooseTarget(get.prompt2('dcmanzhi'),(card,player,target)=>{ + if(player==target) return false; + return !player.hasSkill('dcmanzhi_1')&&target.countCards('he')||!player.hasSkill('dcmanzhi_2')&&target.countCards('hej'); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + var choices=[]; + var choiceList=[ + '令其交给你两张牌,然后其视为使用一张无距离限制的【杀】', + '你获得其区域内的至多两张牌,然后交给其等量的牌并摸一张牌' + ]; + var chosen=[player.hasSkill('dcmanzhi_1'),player.hasSkill('dcmanzhi_2')]; + if(target.countCards('he')&&(!chosen[0]||trigger.name=='phaseZhunbei')) choices.push('选项一'); + else choiceList[0]=''+choiceList[0]+(chosen[0]?'(已被选择过)':'')+''; + if(target.countCards('hej')&&(!chosen[1]||trigger.name=='phaseZhunbei')) choices.push('选项二'); + else choiceList[1]=''+choiceList[1]+(chosen[1]?'(已被选择过)':'')+''; + if(trigger.name=='phaseJieshu') choices.push('cancel2'); + player.chooseControl(choices).set('choiceList',choiceList).set('ai',()=>{ + return _status.event.choice; + }).set('choice',function(){ + if(target.getUseValue({name:'sha'},false)>5&&!player.hasShan()&&trigger.name=='phaseZhunbei') return 1; + return 0; + }()).set('prompt','蛮智:请选择一项'); + } + else{ + if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} + event.finish(); + } + 'step 2' + if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} + if(result.control=='cancel2'){event.finish();return;} + player.logSkill('dcmanzhi',target); + if(result.control=='选项一'){ + player.addTempSkill('dcmanzhi_1'); + target.chooseCard(2,'he','蛮智:请交给'+get.translation(player)+'两张牌'); + } + else{ + player.addTempSkill('dcmanzhi_2'); + player.gainPlayerCard(target,'hej',[1,2],true); + event.goto(5); + } + 'step 3' + if(result.bool){ + target.give(result.cards,player); + } + else event.finish(); + 'step 4' + target.chooseUseTarget('sha',true,'nodistance'); + event.finish(); + 'step 5' + if(result.bool&&target.isIn()){ + var num=result.cards.length,hs=player.getCards('he'); + if(!hs.length) event.finish(); + else if(hs.length{ + return current!=player&&event.player.inRange(current)&¤t.isDamaged(); + }); + }, + direct:true, + forced:true, + charlotte:true, + content:function(){ + 'step 0' + player.chooseTarget('救陷:是否令其攻击范围内的一名其他角色回复1点体力?',(card,player,target)=>{ + if(_status.event.player==target) return false; + return target.isDamaged()&&_status.event.targetx.inRange(target); + }).set('targetx',trigger.player).set('ai',target=>get.recoverEffect(target,_status.event.player,_status.event.player)); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('dcjiuxian_help',target); + target.recover(player); + } + } + } + } + }, + dcchenyong:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + frequent:true, + filter:function(event,player){ + return player.getHistory('useCard').length; + }, + content:function(){ + var types=[]; + var history=player.getHistory('useCard'); + for(var evt of history){ + types.add(get.type2(evt.card)); + } + var num=types.length; + player.draw(num); + }, + ai:{threaten:2.2} + }, + //孙綝 + dczigu:{ + audio:2, + enable:'phaseUse', + usable:1, + filterCard:true, + position:'he', + selectCard:1, + check:function(card){ + var player=_status.event.player; + if(!player.hasSkill('dczuowei')) return 6-get.value(card); + if(player.countCards('h')==player.countCards('e')+1&&!player.hasCard(card=>player.hasValueTarget(card),'h')){ + if(get.position(card)=='e') return 0; + return 8-get.value(card); + } + return 6-get.value(card); + }, + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>{ + return current.countGainableCards(player,'e'); + }); + if(targets.length==0) event._result={bool:false}; + else if(targets.length==1) event._result={bool:true,targets:targets}; + else player.chooseTarget('自固:获得一名角色装备区里的一张牌',true,(card,player,target)=>{ + return target.countGainableCards(player,'e'); + }).set('ai',target=>{ + if(target==_status.event.player) return 10; + if(get.attitude(_status.event.player,target)<0){ + if(target.hasCard(card=>{ + return get.value(card,player)>=6; + })) return 12; + return 8; + } + return 0; + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.gainPlayerCard('e',target,true); + } + 'step 2' + if(!result.bool||target==player||!result.cards||!result.cards.some(i=>get.owner(i)==player)) player.draw(); + }, + ai:{ + order:function(item,player){ + if(!player.hasSkill('dczuowei')) return 9; + if(player.countCards('h')==player.countCards('e')+1&&!player.hasCard(card=>player.hasValueTarget(card),'h')) return 9; + return 1; + }, + result:{ + player:1 + } + } + }, + dczuowei:{ + audio:2, + trigger:{player:'useCard'}, + filter:function(event,player){ + return !player.hasSkill('dczuowei_ban')&&_status.currentPhase==player; + }, + direct:true, + locked:false, + content:function(){ + 'step 0' + var hs=player.countCards('h'); + var es=Math.max(1,player.countCards('e')); + var sign=Math.sign(hs-es); + event.sign=sign; + if(sign>0) player.chooseBool(get.prompt('dczuowei'),'令'+get.translation(trigger.card)+'不可被响应').set('ai',()=>1); + else if(sign==0) player.chooseTarget(get.prompt('dczuowei'),'对一名其他角色造成1点伤害',lib.filter.notMe).set('ai',target=>{ + return get.damageEffect(target,_status.event.player,_status.event.player); + }); + else player.chooseBool(get.prompt('dczuowei'),'摸两张牌,然后此技能于本回合失效').set('ai',()=>1); + 'step 1' + if(!result.bool) event.finish() + else if(event.sign<=0&&!event.isMine()&&!event.isOnline()) game.delayx(); + 'step 2' + var sign=event.sign; + if(sign>0){ + player.logSkill('dczuowei'); + trigger.directHit.addArray(game.players); + event.finish(); + } + else if(sign==0){ + var target=result.targets[0]; + player.logSkill('dczuowei',target); + target.damage(); + } + else{ + player.logSkill('dczuowei'); + player.draw(2); + player.addTempSkill('dczuowei_ban'); + } + }, + subSkill:{ + ban:{charlotte:true} + }, + mod:{ + aiOrder:function(player,card,num){ + if(player.hasSkill('dczuowei_ban')||_status.currentPhase!=player) return; + var cardsh=[],cardse=[]; + if(Array.isArray(card.cards)){ + cardsh.addArray(card.cards.filter(i=>get.position(i)=='h')); + cardse.addArray(card.cards.filter(i=>get.position(i)=='e')); + } + if(_status.currentPhase==player){ + if(get.tag(card,'draw')||get.tag(card,'gain')){ + if(player.countCards('h')-cardsh.length<=Math.max(1,player.countCards('e'))-cardse.length+(get.type(card)=='equip')) return num+10; + return num/5; + } + } + }, + }, + ai:{ + threaten:3, + reverseEquip:true, + effect:{ + player_use:function(card,player,target,current){ + if(player.hasSkill('dczuowei_ban')||_status.currentPhase!=player) return; + if(get.type(card)=='equip'&&get.cardtag(card,'gifts')) return; + if(player.countCards('h')>Math.max(1,player.countCards('e'))) return [1,3]; + } + } + } + }, + //孙瑜 + dcquanshou:{ + audio:2, + trigger:{global:'phaseBegin'}, + filter:function(event,player){ + return event.player.countCards('h')0||event.player.maxHp-event.player.countCards('h')<=2; + }, + content:function(){ + 'step 0' + var draw=Math.min(5,trigger.player.maxHp-trigger.player.countCards('h')); + trigger.player.chooseControl().set('choiceList',[ + (draw>0?'摸'+get.cnNumber(draw)+'张牌,然后':'令')+'你本回合使用【杀】的次数上限-1', + '当你本回合使用牌被抵消后,'+get.translation(player)+'摸一张牌' + ]).set('ai',()=>_status.event.choice).set('choice',function(){ + var draw=Math.min(5,Math.max(0,trigger.player.maxHp-trigger.player.countCards('h'))); + if(get.attitude(trigger.player,player)>0){ + if(draw>=3||trigger.player.getCardUsable('sha')>1) return '选项一'; + if(draw<=1&&trigger.player.countCards('hs',card=>{ + return get.name(card)=='sha'&&trigger.player.hasValueTarget(card); + })) return '选项二'; + return '选项一'; + } + else{ + if(draw>=4) return '选项一'; + if(draw<2&&trigger.player.countCards('hs',card=>{ + return trigger.player.hasValueTarget(card); + })) return '选项二'; + return '选项一'; + } + }()).set('prompt','劝守:请选择一项'); + 'step 1' + game.log(trigger.player,'选择了','#y'+result.control); + if(result.control=='选项一'){ + var draw=Math.min(5,trigger.player.maxHp-trigger.player.countCards('h')); + if(draw>0) trigger.player.draw(draw); + trigger.player.addTempSkill('dcquanshou_sha'); + trigger.player.addMark('dcquanshou_sha',1,false); + } + else{ + trigger.player.addTempSkill('dcquanshou_respond'); + trigger.player.markAuto('dcquanshou_respond',[player]); + } + }, + ai:{ + expose:0.1 + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + marktext:'守', + intro:{content:'使用【杀】的次数上限-#'}, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num-player.countMark('dcquanshou_sha'); + }, + } + }, + respond:{ + trigger:{player:['shaMiss','eventNeutralized']}, + filter:function(event,player){ + if(event.type!='card'&&event.name!='_wuxie') return false; + return player.getStorage('dcquanshou_respond').some(i=>i.isIn()); + }, + forced:true, + popup:false, + charlotte:true, + onremove:true, + marktext:'守', + intro:{content:'本回合使用的牌被抵消后,$摸一张牌'}, + content:function(){ + var targets=player.getStorage('dcquanshou_respond'); + targets.sortBySeat(); + for(var target of targets){ + if(target.isIn()){ + target.logSkill('dcquanshou_respond',player); + target.draw(); + } + } + } + } + } + }, + dcshexue:{ + audio:2, + trigger:{player:'phaseUseBegin'}, + filter:function(event,player){ + var card=lib.skill.dcshexue.getLast(); + return card&&player.hasUseTarget(card); + }, + getLast:function(){ + for(var current of game.filterPlayer()){ + var history=current.actionHistory; + if(history.length<2) continue; + if(history[history.length-2].isMe){ + var evts=history[history.length-2].useCard; + for(var i=evts.length-1;i>=0;i--){ + var evt=evts[i]; + if(get.type(evt.card)!='basic'&&get.type(evt.card)!='trick') continue; + var evtx=evt.getParent('phaseUse'); + if(evtx&&evtx.player==current){ + return {name:evt.card.name,nature:evt.card.nature}; + } + } + } + } + return null; + }, + direct:true, + group:'dcshexue_end', + content:function(){ + var card=lib.skill.dcshexue.getLast(); + game.broadcastAll(function(card){ + lib.skill.dcshexue_backup.viewAs=card; + lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?'; + },card); + var next=player.chooseToUse(); + next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('norestore',true); + next.set('addCount',false); + next.set('_backupevent','dcshexue_backup'); + next.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + next.backup('dcshexue_backup'); + }, + subSkill:{ + backup:{ + audio:'dcshexue', + filterCard:function(card){ + return get.itemtype(card)=='card'; + }, + position:'hes', + selectCard:1, + check:(card)=>6-get.value(card), + popname:true, + }, + end:{ + audio:'dcshexue', + trigger:{player:'phaseUseEnd'}, + filter:function(event,player){ + return player.getHistory('useCard',evt=>{ + return evt.getParent('phaseUse')==event&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick'); + }).length; + }, + prompt2:function(event,player){ + var history=player.getHistory('useCard',evt=>{ + return evt.getParent('phaseUse')==event&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick'); + }); + var card=history[history.length-1].card; + return '令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做'+(get.translation(card.nature)||'')+'【'+get.translation(card.name)+'】使用'; + }, + content:function(){ + var history=player.getHistory('useCard',evt=>{ + return evt.getParent('phaseUse')==trigger&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick'); + }); + var card=history[history.length-1].card; + card={name:card.name,nature:card.nature}; + player.addSkill('dcshexue_studyclear'); + if(!player.storage.dcshexue_studyclear) player.storage.dcshexue_studyclear=[]; + player.storage.dcshexue_studyclear.push(card); + } + }, + study:{ + trigger:{player:'phaseUseBegin'}, + filter:function(event,player){ + return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i)); + }, + onremove:true, + charlotte:true, + direct:true, + content:function(){ + 'step 0' + event.cards=player.getStorage('dcshexue_study'); + 'step 1' + var card=cards.pop(); + if(trigger.player.hasUseTarget(card)){ + game.broadcastAll(function(card){ + lib.skill.dcshexue_backup.viewAs=card; + lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?'; + },card); + var next=trigger.player.chooseToUse(); + next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('norestore',true); + next.set('addCount',false); + next.set('_backupevent','dcshexue_backup'); + next.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + next.backup('dcshexue_backup'); + } + if(cards.length) event.redo(); + } + }, + studyclear:{ + trigger:{global:'phaseBegin'}, + charlotte:true, + forceDie:true, + silent:true, + onremove:true, + lastDo:true, + content:function(){ + trigger.player.addTempSkill('dcshexue_study'); + if(!trigger.player.storage.dcshexue_study) trigger.player.storage.dcshexue_study=[]; + trigger.player.storage.dcshexue_study=trigger.player.storage.dcshexue_study.concat(player.getStorage('dcshexue_studyclear')); + player.removeSkill('dcshexue_studyclear'); + } + } + } + }, + //郤正 + dcdanyi:{ + audio:2, + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + if(!event.isFirstTarget) return false; + if(!event.targets||!event.targets.length) return false; + var evt=lib.skill.dcjianying.getLastUsed(player,event.getParent()); + if(!evt||!evt.targets||!evt.targets.length||evt.targets.length!=event.targets.length) return false; + var targetsx=event.targets.slice().sort((a,b)=>a.seayNum-b.seayNum); + var targetsy=evt.targets.slice().sort((a,b)=>a.seayNum-b.seayNum); + for(var i=0;iplayer.canUse(card,current)); + if(targetsx.length!=targets.length) return; + } + else if(targets.length>=select[0]&&targets.length<=select[1]){ + var eff=0; + for(var i of targets){ + eff+=get.effect(i,card,player,player); + } + if(eff<0) return; + } + return num+10; + }, + }, + ai:{ + threaten:2.5, + effect:{ + player:function(card,player,target){ + if(player._dcdanyi_aiChecking) return; + player._dcdanyi_aiChecking=true; + var evt=lib.skill.dcjianying.getLastUsed(player),targets; + if(evt){ + targets=evt.targets; + var select=get.select(_status.event.selectTarget); + if(select[0]==-1){ + var targetsx=game.filterPlayer(current=>player.canUse(card,current)); + if(targetsx.length!=targets.length){ + delete player._dcdanyi_aiChecking; + return; + } + } + else if(targets.length>=select[0]&&targets.length<=select[1]){ + var eff=0; + for(var i of targets){ + eff+=get.effect(i,card,player,player); + } + if(eff<0){ + delete player._dcdanyi_aiChecking; + return; + } + } + } + delete player._dcdanyi_aiChecking; + if((targets||[]).contains(target)) return [1,1]; + } + }, + }, + }, + dcwencan:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + if(ui.selected.targets.length){ + if(ui.selected.targets[0].hp==target.hp) return false; + } + return target.hp!=player.hp; + }, + selectTarget:[1,2], + complexTarget:true, + multiline:true, + content:function(){ + 'step 0' + target.chooseToDiscard(get.translation(player)+'对你发动了【文灿】','是否弃置两张花色不同的牌?或者点击“取消”,令其本回合对你使用牌无次数限制','he',2,(card,player)=>{ + if(!ui.selected.cards.length) return true; + var suit=get.suit(card,player); + for(var i of ui.selected.cards){ + if(get.suit(i,player)==suit) return false; + } + return true; + }).set('complexCard',true).set('ai',card=>{ + if(_status.event.nofear) return 0; + return 5-get.value(card); + }).set('nofear',player.countCards('hs',card=>{ + return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,target)<=0; + })get.name(i,player))); + 'step 1' + if(target.countCards('h')>player.countCards('h')){ + player.addTempSkill('dcminze_ban','phaseUseAfter'); + } + }, + ai:{ + order:6.5, + expose:0.2, + }, + subSkill:{ + targeted:{onremove:true,charlotte:true}, + ban:{charlotte:true}, + given:{ + charlotte:true, + onremove:true, + intro:{ + content:'本回合以此法交出的牌名:$', + }, + }, + draw:{ + trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.getStorage('dcminze_given').length; + }, + forced:true, + locked:false, + content:function(){ + var num=Math.min(5,player.getStorage('dcminze_given').length)-player.countCards('h'); + if(num>0) player.draw(num); + } + } + } + }, + dcjini:{ + audio:2, + trigger:{player:'damageEnd'}, + direct:true, + filter:function(event,player){ + return player.maxHp-player.countMark('dcjini_counted')>0; + }, + content:function(){ + 'step 0' + player.chooseCard(get.prompt2('dcjini'),[1,player.maxHp-player.countMark('dcjini_counted')],(card,player,target)=>{ + var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); + return mod=='unchanged'; + }).set('ai',card=>{ + return 6-get.value(card); + }); + 'step 1' + if(result.bool){ + var cards=result.cards; + player.logSkill('dcjini'); + player.addTempSkill('dcjini_counted'); + player.addMark('dcjini_counted',cards.length,false); + player.loseToDiscardpile(cards); + player.draw(cards.length); + } + else event.finish(); + 'step 2' + if(trigger.source&&trigger.source.isIn()&&Array.isArray(result)){ + for(var i of result){ + if(get.name(i,player)=='sha'&&get.owner(i)==player&&get.position(i)=='h'){ + player.chooseToUse(function(card,player,event){ + if(get.name(card)!='sha') return false; + return lib.filter.filterCard.apply(this,arguments); + },'击逆:是否对'+get.translation(trigger.source)+'使用一张不可被响应的杀?').set('logSkill','twxiawang').set('complexSelect',true).set('filterTarget',function(card,player,target){ + if(target!=_status.event.sourcex&&!ui.selected.targets.contains(_status.event.sourcex)) return false; + return lib.filter.targetEnabled.apply(this,arguments); + }).set('sourcex',trigger.source).set('oncard',()=>{ + _status.event.directHit.addArray(game.players); + }); + break; + } + } + } + }, + subSkill:{ + counted:{ + onremove:true, + charlotte:true + } + } + }, + //乐綝 + dcporui:{ + audio:2, + trigger:{global:'phaseJieshuBegin'}, + filter:function(event,player){ + if(player==event.player) return false; + if(player.hasSkill('dcporui_round')) return false; + return game.hasPlayer(current=>{ + if(current==player||current==event.player) return false; + return current.getHistory('lose').length>0; + })&&(_status.connectMode||player.hasCard({type:'basic'},'h')); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseCardTarget({ + prompt:get.prompt('dcporui'), + //prompt2:'弃置一张基本牌并选择一名本回合失去过牌的非当前回合的其他角色,你视为对其依次使用'+get.cnNumber(Math.max(0,player.hp)+1)+'张【杀】', + prompt2:get.skillInfoTranslation('dcporui',player), + filterCard:function(card,player){ + if(get.type(card)!='basic') return false; + return lib.filter.cardDiscardable.apply(this,arguments); + }, + selectCard:1, + targets:game.filterPlayer(current=>{ + if(current==player||current==trigger.player) return false; + return current.getHistory('lose').length>0; + }), + filterTarget:function(card,player,target){ + return _status.event.targets.contains(target); + }, + ai1:function(card){ + return 7-get.value(card); + }, + ai2:function(target){ + return get.effect(target,{name:'sha'},_status.event.player,_status.event.player); + } + }); + 'step 1' + if(result.bool){ + var target=result.targets[0],cards=result.cards; + event.target=target; + player.logSkill('dcporui',target); + player.discard(cards); + event.num2=Math.max(0,player.hp); + event.num=event.num2+1; + player.addTempSkill('dcporui_round','roundStart'); + } + else event.finish(); + 'step 2' + var card={name:'sha',isCard:true,storage:{dcporui:true}}; + if(player.canUse(card,target,false)&&target.isIn()){ + player.useCard(card,target); + event.num--; + } + else event.goto(4); + 'step 3' + if(event.num>0) event.goto(2); + 'step 4' + if(!player.hasMark('dcgonghu_damage')){ + var cards=player.getCards('h'); + if(cards.length==0) event._result={bool:false}; + else if(cards.length<=event.num2) event._result={bool:true,cards:cards}; + else player.chooseCard('破锐:交给'+get.translation(target)+get.cnNumber(event.num2)+'张手牌',true,event.num2); + } + else event.goto(6) + 'step 5' + if(result.bool){ + player.give(result.cards,target); + } + 'step 6' + if(player.hasMark('dcgonghu_basic')){ + if(!target.hasHistory('damage',evt=>{ + return evt.card&&evt.card.storage&&evt.card.storage.dcporui&&evt.getParent('dcporui')==event; + })){ + player.recover(); + } + } + }, + subSkill:{ + round:{charlotte:true} + }, + ai:{ + expose:0.4, + threaten:4.8 + } + }, + dcgonghu:{ + audio:2, + trigger:{ + player:['loseAfter','damageEnd'], + source:'damageSource', + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + forced:true, + filter:function(event,player){ + if(event.name=='damage'){ + if(player.hasMark('dcgonghu_damage')) return false; + return _status.currentPhase&&_status.currentPhase!=player; + } + if(player.hasMark('dcgonghu_basic')) return false; + var evt=event.getl(player); + return evt&&evt.cards2&&evt.cards2.some(i=>get.type2(i,player)=='basic'); + }, + group:['dcgonghu_basic','dcgonghu_trick'], + content:function(){ + player.addMark('dcgonghu_'+(trigger.name=='damage'?'damage':'basic'),1,false); + game.log(player,'修改了技能','#g【破锐】'); + }, + subSkill:{ + trick:{ + audio:'dcgonghu', + trigger:{player:'useCard2'}, + direct:true, + locked:true, + filter:function(event,player){ + if(!player.hasMark('dcgonghu_basic')||!player.hasMark('dcgonghu_damage')) return false; + var card=event.card; + if(get.color(card,false)!='red'||get.type(card,null,true)!='trick') return false; + var info=get.info(card); + if(info.allowMultiple==false) return false; + if(event.targets&&!info.multitarget){ + if(game.hasPlayer(function(current){ + return !event.targets.contains(current)&&lib.filter.targetEnabled2(card,player,current); + })){ + return true; + } + } + return false; + }, + content:function(){ + 'step 0' + var prompt2='为'+get.translation(trigger.card)+'增加一个目标' + player.chooseTarget(get.prompt('dcgonghu_trick'),function(card,player,target){ + var player=_status.event.player; + return !_status.event.targets.contains(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); + }).set('prompt2',prompt2).set('ai',function(target){ + var trigger=_status.event.getTrigger(); + var player=_status.event.player; + return get.effect(target,trigger.card,player,player); + }).set('card',trigger.card).set('targets',trigger.targets); + 'step 1' + if(result.bool){ + if(!event.isMine()&&!event.isOnline()) game.delayx(); + event.targets=result.targets; + } + else{ + event.finish(); + } + 'step 2' + if(event.targets){ + player.logSkill('dcgonghu_trick',event.targets); + trigger.targets.addArray(event.targets); + } + }, + }, + basic:{ + audio:'dcgonghu', + trigger:{player:'useCard'}, + forced:true, + filter:function(event,player){ + if(!player.hasMark('dcgonghu_basic')||!player.hasMark('dcgonghu_damage')) return false; + var card=event.card; + return (get.color(card,false)=='red'&&get.type(card,null,false)=='basic'); + }, + content:function(){ + trigger.directHit.addArray(game.filterPlayer()); + game.log(trigger.card,'不可被响应'); + }, + }, + } + }, //张闿 dcxiangshu:{ audio:2, @@ -375,7 +1473,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 0; }).set('color',function(){ var cardsR=cards.filter(i=>get.color(i)=='red'); - if(cardsR.length==cards.length||cardsR.length==0) return 1; + if(cardsR.length==cards.length||cardsR.length==0||cards.length<=game.roundNumber) return 1; if(cardsR.length<=game.roundNumber) return 'red'; if(cards.length-cardsR.length<=game.roundNumber) return 'black'; return 1; @@ -410,7 +1508,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, position:'hes', filter:function(event,player){ - if(event.name=='chooseToUse') return player.countCards('hes',{subtype:['equip1','equip2']})>0||_status.connectMode; + if(event.name=='chooseToUse') return player.countCards('hes',{subtype:['equip1','equip2']})>0; return event.player!=player; }, content:function(){ @@ -1110,15 +2208,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.line(target); var cards=player.getExpansions('dcfozong'); if(!cards.length) event._result={bool:false}; - else target.chooseButton(['###佛宗###获得一张牌并令'+get.translation(player)+'回复1点体力,或点击“取消”令其失去1点体力',cards]).set('ai',button=>{ - if(_status.event.refuse) return get.value(button.link)-6; + else target.chooseButton(['###佛宗###
获得一张牌并令'+get.translation(player)+'回复1点体力,或点击“取消”令其失去1点体力
',cards]).set('ai',button=>{ + if(_status.event.refuse) return get.value(button.link)-7.5; return get.value(button.link); }).set('refuse',get.attitude(target,player)<1&&get.effect(player,{name:'losehp'},player,target)>0); 'step 4' if(result.bool){ var card=result.links[0]; target.gain(card,'give',player); - target.recover(); + player.recover(target); } else player.loseHp(); 'step 5' @@ -1329,8 +2427,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return name=='sha'||name=='shan'; }, filter:function(event,player){ - if(event.dcgue||event.type=='wuxie'||player==_status.currentPhase||player.getStorage('dcgue').contains(_status.currentPhase)) return false; - if(!player.countCards('h')) return false; + //if(event.dcgue||event.type=='wuxie'||player==_status.currentPhase||player.getStorage('dcgue').contains(_status.currentPhase)) return false; + if(event.dcgue||event.type=='wuxie'||player==_status.currentPhase) return false; + if(!player.countCards('h')||player.hasSkill('dcgue_blocker',null,null,false)) return false; for(var name of ['sha','shan']){ if(event.filterCard({name:name,isCard:true},player,event)) return true; } @@ -1361,15 +2460,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ precontent:function(){ 'step 0' player.logSkill('dcgue'); + player.addTempSkill('dcgue_blocker'); player.showHandcards(); + delete event.result.skill; 'step 1' if(player.countCards('h',{name:['sha','shan']})>1){ var evt=event.getParent(); evt.set('dcgue',true); evt.goto(0); + delete evt.openskilldialog; return; } - else player.markAuto('dcgue',[_status.currentPhase]); + //else player.markAuto('dcgue',[_status.currentPhase]); game.delayx(); }, } @@ -1378,13 +2480,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '展示所有手牌'+(player.countCards('h',{name:['sha','shan']})<=1?',然后视为使用【'+get.translation(links[0][2])+'】':''); } }, - intro:{content:'已于$的回合发动过技能'}, + subSkill:{blocker:{charlotte:true}}, + //intro:{content:'已于$的回合发动过技能'}, ai:{ order:1, respondSha:true, respondShan:true, skillTagFilter:function(player,tag,arg){ - if(player.getStorage('dcgue').contains(_status.currentPhase)) return false; + //if(player.getStorage('dcgue').contains(_status.currentPhase)) return false; if(player.countCards('h',{name:['sha','shan']})>1) return false; }, result:{ @@ -2805,7 +3908,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{global:'useCardAfter'}, filter:function(event,player){ - return event.player!=player&&event.card.name=='sha'&&!event.targets.contains(player)&&event.targets.every(current=>player.inRange(current))&&player.hasCard(card=>card.hasGaintag('dcaishou_tag'),'h'); + return event.player!=player&&event.card.name=='sha'&&event.targets.length&&!event.targets.contains(player)&& + event.targets.every(current=>player.inRange(current)&¤t.isIn())&&player.hasCard(card=>card.hasGaintag('dcaishou_tag'),'h'); }, direct:true, content:function(){ @@ -2826,13 +3930,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, selectTarget:-1, ai1:function(card){ - var player=_status.event.player,target=_status.event.getParent().player; + var player=_status.event.player; if(player.isHealthy()&&player.hasSkill('dcaishou')&&player.countCards('h',card=>card.hasGaintag('dcaishou_tag')==1)) return 0; var eff=0; for(var target of _status.event.targets){ eff+=get.effect(target,get.autoViewAs({name:'sha'},[card]),player,player); } - if(eff>0) return 7-get.value(card); + if(eff>0) return 6.5+eff/10-get.value(card); + return 0; }, ai2:()=>1, }); @@ -2889,11 +3994,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.list=list; event.current=event.list.shift(); event.getParent()._dcjianji_discarded.remove(player); + event.targets=event.getParent()._dcjianji_discarded; } else event.finish(); 'step 1' - event.current.chooseTarget('间计:是否视为对除'+get.translation(player)+'外的弃置过牌的一名角色使用一张杀?',function(card,player,event){ - return player.canUse('sha',target,false); + var targets=event.targets.slice(); + targets.remove(event.current); + if(!targets.length) event._result={bool:false}; + else event.current.chooseTarget('间计:是否视为对除'+get.translation(player)+'外的弃置过牌的一名角色使用一张杀?',(card,player,target)=>{ + return _status.event.targets.contains(target)&&player.canUse('sha',target,false); + }).set('targets',event.targets).set('ai',target=>{ + var player=_status.event.player; + return get.effect(target,{name:'sha'},player,player); }); 'step 2' if(result.bool){ @@ -2906,25 +4018,36 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, ai:{ - order:6, + order:7, result:{ target:function(player,target){ - return ui.selected.targets.reduce((p,c)=>p+get.effect(c,{name:'guohe_copy2'},player,c)/2,0)+get.effect(target,{name:'guohe_copy2'},player,target)/2; + var eff=get.effect(target,{name:'guohe_copy2'},player,target)/2; + if(ui.selected.targets.length&&eff<0){ + var len=target.countCards('h'); + if(ui.selected.targets.every(i=>{ + return i.countCards('h'){ + return get.effect(i,{name:'sha'},target,player)>0; + })) return 0.1; + } + return ui.selected.targets.reduce((p,c)=>p+get.effect(c,{name:'guohe_copy2'},player,c)/2,0)+eff; } } }, }, dcyuanmo:{ audio:2, - trigger:{player:'damageEnd'}, + trigger:{player:['damageEnd','phaseZhunbeiBegin']}, direct:true, group:'dcyuanmo_add', - init:function(player){player.storage.dcyuanmo=0}, + init:function(player){player.storage.dcyuanmo_range=0}, change:function(player,num){ - if(typeof player.storage.dcyuanmo!=='number') player.storage.dcyuanmo=0; + player.addSkill('dcyuanmo_range'); + if(typeof player.storage.dcyuanmo_range!=='number') player.storage.dcyuanmo_range=0; if(!num) return; - player.storage.dcyuanmo+=num; - player.markSkill('dcyuanmo'); + player.storage.dcyuanmo_range+=num; + if(player.storage.dcyuanmo_range!=0) player.markSkill('dcyuanmo_range'); + else player.unmarkSkill('dcyuanmo_range'); game.log(player,'的攻击范围',(num>0?'+':'')+num); }, content:function(){ @@ -2934,18 +4057,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseControl('cancel2').set('prompt',get.prompt('dcyuanmo')).set('choiceList',choiceList).set('ai',()=>{ return _status.event.choice; }).set('choice',function(){ + if(trigger.name=='phaseZhunbei'&&player.getAttackRange()==1&&!player.hasCard(card=>{ + if(get.subtype(card)!='equip1'&&!player.hasUseTarget(card)) return false; + var num=1; + var info=get.info(card,false); + if(info&&info.distance&&typeof info.distance.attackFrom=='number') num-=info.distance.attackFrom; + return num>1; + },'hs')) return '选项一'; var targets=event.targets.slice(),targetsx=[]; - var _tmp=player.storage.dcyuanmo; - player.storage.dcyuanmo++; + var _tmp=player.storage.dcyuanmo_range; + player.storage.dcyuanmo_range++; try{ targetsx=game.filterPlayer(current=>player.inRange(current)); } - catch(e){player.storage.dcyuanmo=_tmp}; - player.storage.dcyuanmo=_tmp; + catch(e){player.storage.dcyuanmo_range=_tmp}; + player.storage.dcyuanmo_range=_tmp; targetsx.removeArray(targets); return targetsx.reduce((p,c)=>{ return p+Math.max(0,get.effect(c,{name:'shunshou_copy2'},player,player)); - },0)>get.effect(player,{name:'wuzhong'},player,player)?'选项一':'选项二'; + },0)>get.effect(player,{name:'wuzhong'},player,player)/1.5?'选项一':'选项二'; }()); 'step 1' if(result.control=='cancel2'){ @@ -2981,21 +4111,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, - intro:{ - content:function(storage,player){ - var num=player.storage.dcyuanmo; - return '攻击范围'+(num>=0?'+':'')+num; - } - }, - mod:{ - attackRange:function(player,num){ - return num+player.countMark('dcyuanmo'); - }, - }, subSkill:{ add:{ audio:'dcyuanmo', - trigger:{player:'phaseZhunbeiBegin'}, + trigger:{player:'phaseJieshuBegin'}, filter:function(event,player){ return !game.hasPlayer(current=>player.inRange(current)); }, @@ -3004,7 +4123,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ lib.skill.dcyuanmo.change(player,1); }, - } + }, + range:{ + charlotte:true, + intro:{ + content:function(storage,player){ + var num=player.storage.dcyuanmo_range; + return '攻击范围'+(num>=0?'+':'')+num; + } + }, + mod:{ + attackRange:function(player,num){ + return num+player.countMark('dcyuanmo_range'); + }, + }, + } }, }, //向朗 @@ -4752,7 +5885,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ popup:false, content:function(){ player.storage.dcfengying=[]; - for(var card of ui.discardPile.childNodes){ + for(var i=0;iget.skillInfoTranslation(i)).join(''); var choices=[]; if(controls.contains('dctongguan_wuyong')&&/你对\S{1,15}造成\S{1,10}伤害/.test(str)) choices.push('dctongguan_wuyong'); - if(controls.contains('dctongguan_gangying')&&/回复\S{1,5}体力/.test(str)) choices.push('dctongguan_gangying'); + if(controls.contains('dctongguan_gangying')&&/回复\S{1,5}体力/.test(str)&&_status.event.player.getFriends().length) choices.push('dctongguan_gangying'); if(controls.contains('dctongguan_duomou')&&/你(可|可以)?摸\S{1,3}张牌/.test(str)) choices.push('dctongguan_duomou'); if(controls.contains('dctongguan_guojue')&&/(当【过河拆桥】使用|((弃置|获得)\S{1,5}其他角色\S{1,7}牌|))/.test(str)) choices.push('dctongguan_guojue'); if(controls.contains('dctongguan_renzhi')&&/交给\S{0,5}其他角色/.test(str)&&_status.event.player.getFriends().length) choices.push('dctongguan_renzhi'); @@ -5495,7 +6629,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; })) guojue=true; if(!renzhi&¤t.hasHistory('gain',evt=>{ - debugger if(evt.giver!=target||evt.getParent().name=='_yongjian_zengyu') return false; return evt.cards.length; })) renzhi=true; @@ -6121,6 +7254,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.loseToDiscardpile(result.links); target.draw(); } + }, + ai:{ + expose:0.1, + result:{ + target:function(player,target){ + if(target.hasCard(card=>get.value(card)>=6,'e')&&get.attitude(player,target)<0) return -1; + return 1; + } + } } }, //王烈 @@ -6173,7 +7315,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ player.logSkill('dcchongwang',trigger.player); if(result.links[0]=='gain'){ - trigger.player.gain(trigger.cards.filterInD(),'gain2'); + player.addTempSkill('dcchongwang_gain'); + trigger._dcchongwang=true; } else{ trigger.targets.length=0; @@ -6186,6 +7329,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ threaten:3.5, directHit_ai:true, }, + subSkill:{ + gain:{ + trigger:{global:'useCardAfter'}, + charlotte:true, + filter:function(event,player){ + return event._dcchongwang; + }, + content:function(){ + trigger.player.gain(trigger.cards.filterInD(),'gain2'); + } + } + } }, dchuagui:{ audio:2, @@ -6268,7 +7423,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var att=get.attitude(target,player),hs=target.getCards('he'); hs.sort((b,a)=>get.value(b,target)-get.value(a,target)); var choice='仅展示牌',card=hs[0]; - if(att<-2&&get.value(card,target)<=5) choice='交出牌'; + if(att<-2&&Math.random()>((get.value(card,target)-3)/5)) choice='交出牌'; sendback([choice,card],target); if(!event.ai_targets.length){ clearInterval(event.interval); @@ -6347,12 +7502,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i of list){ cards.push(i[1][1]); targets.push(i[0]); - i[0].$give(i[1][1],player); + //i[0].$give(i[1][1],player); } player.line(targets); player.gain(cards,'give'); - 'step 8' - game.delayx(); + //step 8 + //game.delayx(); }, contentx:function(){ 'step 0' @@ -7905,26 +9060,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' var list=lib.skill.dchuishu.getList(player); - var min=list[0]; - for(var i of list){ - if(i>min) min=i; - } - var exps=['摸牌数[','弃牌数[','目标牌数[']; - var choices=[]; - for(var i=0;i0 }); if(player==target&&bool) player.draw(2); @@ -25508,9 +26671,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).length>0; }, content:function(){ - player.discard(player.getCards('h',function(card){ + var cards=player.getCards('h',function(card){ return card.hasGaintag('xinfu_bijing'); - })); + }); + player.loseToDiscardpile(cards); + player.draw(cards.length); }, sub:true, }, @@ -25524,7 +26689,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseCard(get.prompt2('xinfu_bijing'),'h').set('ai',function(card){ + player.chooseCard(get.prompt2('xinfu_bijing'),'h',[1,2]).set('ai',function(card){ if(card.name=='shan') return 6; return 6-get.value(card); }); @@ -25872,7 +27037,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, "xinfu_xingzhao":{ audio:true, - group:["xz_xunxun","xinfu_xingzhao2"], + group:["xz_xunxun","xinfu_xingzhao2","xinfu_xingzhao3"], mark:true, intro:{ content:function(storage,player){ @@ -25889,6 +27054,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(num>=3){ str+=';始终跳过弃牌阶段'; } + if(num>=4){ + str+=';造成的伤害+1'; + } return str; }, }, @@ -25924,6 +27092,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.log(player,'跳过了弃牌阶段'); }, }, + xinfu_xingzhao3:{ + audio:'xinfu_xingzhao', + trigger:{ + source:'damageBegin1', + }, + forced:true, + filter:function(event,player){ + var num=game.countPlayer(function(current){ + return current.isDamaged(); + }); + return num>=4; + }, + content:function(){ + trigger.num++; + }, + }, "xinfu_dianhu":{ audio:2, trigger:{ @@ -26553,6 +27737,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcluochong:function(player){ return '一轮游戏开始时,你可以弃置任意名角色区域里的共计至多['+(4-player.countMark('dcluochong'))+']张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。'; }, + dcporui:function(player){ + return '每轮限一次。其他角色的结束阶段,你可以弃置一张基本牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】'+(player.hasMark('dcgonghu_damage')?'':',然后你交给其X张手牌')+'(X为你的体力值)。'+(player.hasMark('dcgonghu_basic')?'若其没有因此受到伤害,你回复1点体力。':''); + } }, perfectPair:{}, characterReplace:{ @@ -26560,7 +27747,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ fanchou:['fanchou','tw_fanchou','ns_fanchou'], zhangji:['zhangji','ns_zhangji'], zhangchangpu:['zhangchangpu','sp_zhangchangpu','ol_zhangchangpu'], - huangfusong:['huangfusong','sp_huangfusong','old_huangfusong'], + huangfusong:['huangfusong','sp_huangfusong','jsrg_huangfusong','old_huangfusong'], wenyang:['wenyang','db_wenyang','diy_wenyang'], dingyuan:['ol_dingyuan','dingyuan'], quyi:['quyi','re_quyi'], @@ -26569,22 +27756,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jin_yanghuiyu:['jin_yanghuiyu','yanghuiyu'], chunyuqiong:['chunyuqiong','re_chunyuqiong'], taoqian:['taoqian','re_taoqian'], - sp_liubei:['sp_liubei','jsp_liubei'], + sp_liubei:['sp_liubei','jsrg_liubei','jsp_liubei'], dongcheng:['re_dongcheng','dongcheng'], hucheer:['tw_hucheer','re_hucheer','hucheer'], - dongbai:['re_dongbai','dongbai'], + dongbai:['re_dongbai','dongbai','jsrg_dongbai'], gexuan:['gexuan','tw_gexuan'], panshu:['panshu','re_panshu'], - nanhualaoxian:['re_nanhualaoxian','nanhualaoxian'], + nanhualaoxian:['re_nanhualaoxian','nanhualaoxian','jsrg_nanhualaoxian'], kanze:['re_kanze','kanze'], yangwan:['yangwan','sp_yangwan'], chendeng:['ol_chendeng','re_chendeng','chendeng'], pangdegong:['re_pangdegong','pangdegong'], - zhujun:['sp_zhujun','ol_zhujun','zhujun'], + zhujun:['sp_zhujun','ol_zhujun','zhujun','jsrg_zhujun'], sunyi:['re_sunyi','tw_sunyi','sunyi'], - tw_liuhong:['tw_liuhong','liuhong'], + tw_liuhong:['tw_liuhong','liuhong','jsrg_liuhong'], miheng:['miheng','re_miheng'], - re_hejin:['re_hejin','tw_hejin'], + re_hejin:['re_hejin','tw_hejin','jsrg_hejin'], fengfangnv:['re_fengfangnv','fengfangnv'], luotong:['luotong','dc_luotong'], mamidi:['mamidi','xin_mamidi'], @@ -26604,6 +27791,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiling:['dc_jiling','jiling'], qiaorui:['qiaorui','tw_qiaorui'], duanwei:['duanwei','junk_duanwei'], + xushao:['xushao','jsrg_xushao'], + huban:['dc_huban','ol_huban'], }, translate:{ lijue:"李傕", @@ -26642,7 +27831,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xinfu_tunan":"图南", "xinfu_tunan_info":"出牌阶段限一次,你可以展示牌堆顶的一张牌并选择一名其他角色,然后该角色选择一项:使用此牌(无距离限制);或将此牌当普通【杀】使用。", "xinfu_bijing":"闭境", - "xinfu_bijing_info":"结束阶段,你可以选择一张手牌并标记为“闭境”。若你于回合外失去“闭境”牌,则当前回合角色的弃牌阶段开始时,其需弃置两张牌。你的准备阶段,弃置手牌中的“闭境”牌。", + "xinfu_bijing_info":"①结束阶段,你可以选择至多两张手牌并标记为“闭境”。②其他角色的弃牌阶段开始时,若你于本回合内失去过“闭境”,其弃置两张牌。③准备阶段,你重铸所有“闭境”牌。", "xinfu_zhenxing":"镇行", "xinfu_zhenxing_info":"结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的至多三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", "xinfu_qianxin":"遣信", @@ -26660,9 +27849,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xz_xunxun":"恂恂", "xz_xunxun_info":"摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", "xinfu_xingzhao":"兴棹", - "xinfu_xingzhao_info":"锁定技,若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,弃牌阶段开始时,你跳过此阶段。(X为场上已受伤的角色数)", + "xinfu_xingzhao_info":"锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,弃牌阶段开始时,你跳过此阶段。若X≥4,当你造成伤害时,此伤害+1。(X为场上已受伤的角色数)", "xinfu_xingzhao2":"兴棹", "xinfu_xingzhao2_info":"", + xinfu_xingzhao3:'兴棹', "xinfu_dianhu":"点虎", "xinfu_dianhu_info":"锁定技,游戏开始时,你选择一名其他角色。当其受到来自你的伤害后或回复体力后,你摸一张牌。", "xinfu_dianhu2":"点虎", @@ -27127,7 +28317,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhtongyuan_info:'锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。', dufuren:'杜夫人', yise:'异色', - yise_info:'其他角色得到你的牌后,若这些牌中:有红色牌,你可令其回复1点体力;有黑色牌,其下次受到【杀】造成的伤害时,此伤害+1。', + yise_info:'其他角色得到你的牌后,若这些牌中:有红色牌,你可令其回复1点体力;有黑色牌,其下次受到因执行【杀】的效果造成的伤害时,此伤害+1。', shunshi:'顺世', shunshi_info:'准备阶段开始时,或当你受到伤害后,你可将一张牌交给一名不为伤害来源的其他角色并获得如下效果直到你的回合结束:摸牌阶段的额定摸牌数+1,使用【杀】的次数上限+1,手牌上限+1。', lvlingqi:'吕玲绮', @@ -27254,7 +28444,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_zhangbao:'张宝', xinzhoufu:'咒缚', xinzhoufu2:'咒缚', - xinzhoufu_info:'①出牌阶段限一次,你可以将一张手牌置于一名其他角色的武将牌上并称为“咒”。②一名有“咒”的角色判定时,你令其以“咒”作为判定牌。', + xinzhoufu_info:'出牌阶段限一次。你可以将一张手牌置于一名其他角色的武将牌上并称为“咒”,且当其判定时,将其“咒”作为判定牌。', xinyingbing:'影兵', xinyingbing_info:'锁定技。每回合每名角色限一次,当你使用牌指定有“咒”的角色为目标后,你摸两张牌。', re_miheng:'祢衡', @@ -27497,7 +28687,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dchuishu:'慧淑', dchuishu_info:'摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中随机获得等量的锦囊牌。', dcyishu:'易数', - dcyishu_info:'锁定技。当你不因出牌阶段而失去牌后,你令〖慧淑〗的中括号内最大的一个数字-1,然后令〖慧淑〗的中括号内最小的一个数字+2。', + dcyishu_info:'锁定技。当你不因出牌阶段而失去牌后,你令A={〖慧淑〗的中括号内最小的数字},B={〖慧淑〗的中括号内最大的数字}。然后你令A中的一个数字+2,且B中的一个数字-1。', dcligong:'离宫', dcligong_info:'觉醒技。准备阶段,若〖慧淑〗的中括号内有不小于5的数字,则你加1点体力上限,回复1点体力并失去〖易数〗。系统随机检索四张吴势力的女性武将牌,然后你选择一项:⒈摸三张牌。⒉失去〖慧淑〗,然后获得这些武将牌上的任意两个非Charlotte技能。', yinfuren:'尹夫人', @@ -27554,7 +28744,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcshizhao_info:'锁定技。每回合限一次,当你于回合外失去手牌后,若你没有手牌,且你:有“劲”,则你移去一枚“劲”并摸两张牌;没有“劲”,则你本回合下一次受到的伤害+1。', wanglie:'王烈', dcchongwang:'崇望', - dcchongwang_info:'其他角色使用基本牌或普通锦囊牌时,若你是本局游戏内上一张被使用的牌的使用者,则你可以选择一项:⒈令其收回此牌对应的所有实体牌;⒉取消此牌的所有目标。', + dcchongwang_info:'其他角色使用基本牌或普通锦囊牌时,若你是本局游戏内上一张被使用的牌的使用者,则你可以选择一项:⒈令其于此牌结算结束后收回此牌对应的所有实体牌;⒉取消此牌的所有目标。', dchuagui:'化归', dchuagui_info:'出牌阶段开始时,你可以选择至多X名有牌的其他角色(X为场上每个阵营中最大阵营的人数,且你的选择结果不展示)。这些角色同时选择一项:⒈交给你一张牌,⒉展示一张牌。若这些角色均选择选项二,则你获得所有展示牌。', gongsundu:'公孙度', @@ -27700,7 +28890,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcjianji:'间计', dcjianji_info:'出牌阶段限一次。你可以令至多X名座位连续的角色依次弃置一张牌。然后其中手牌数最多的角色可以视为对一名其他以此法弃置过牌的角色使用一张【杀】(X为你的攻击范围)。', dcyuanmo:'远谟', - dcyuanmo_info:'①当你受到伤害后,你可以选择一项:1.攻击范围+1,然后若你攻击范围内的角色数因此增加,你可以获得任意名本次进入你攻击范围的角色各一张牌;2.攻击范围-1,然后摸两张牌。②准备阶段,若你的攻击范围内没有角色,你可以令你的攻击范围+1。', + dcyuanmo_info:'①准备阶段或当你受到伤害后,你可以选择一项:1.攻击范围+1,然后若你攻击范围内的角色数因此增加,你可以获得任意名本次进入你攻击范围的角色各一张牌;2.攻击范围-1,然后摸两张牌。②结束阶段,若你的攻击范围内没有角色,你可以令你的攻击范围+1。', qiaorui:'桥蕤', dcaishou:'隘守', dcaishou_tag:'隘', @@ -27818,6 +29008,45 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangkai:'张闿', dcxiangshu:'相鼠', dcxiangshu_info:'其他角色的出牌阶段开始时,若其手牌数不小于其体力值,你可以选择一个不大于5的非负整数,然后你弃置一张牌或声明此数字。若如此做,此阶段结束时,若其手牌数与你选择的数字:差值不大于1,你获得其一张牌;相等,你对其造成1点伤害。', + huanfan:'桓范', + dcjianzheng:'谏诤', + dcjianzheng_info:'出牌阶段限一次。你可以观看一名其他角色的手牌,然后若其中有你可以使用的手牌,你获得并使用其中一张。若你未以此法使用牌,你令你与其横置,然后其观看你的手牌。', + dcfumou:'腹谋', + dcfumou_info:'当你受到1点伤害后,你可以令至多X名角色依次选择一项:1.移动场上的一张牌;2.弃置所有手牌并摸两张牌;3.弃置装备区里的所有牌并回复1点体力(X为你已损失的体力值)。', + mengyou:'孟优', + dcmanzhi:'蛮智', + dcmanzhi_info:'①准备阶段,你可以选择一名其他角色并选择一项:1.令其交给你两张牌,然后其视为使用一张无距离限制的【杀】;2.获得其区域内至多两张牌,然后交给其等量的牌并摸一张牌。②结束阶段,若你的体力值与本回合准备阶段时的体力值相等,你可以执行你未于本回合执行过的〖蛮智①〗的分支。', + chentai:'陈泰', + dcjiuxian:'救陷', + dcjiuxian_info:'出牌阶段限一次。你可以重铸一半数量的手牌(向上取整),然后视为使用一张【决斗】。当此牌对目标角色造成伤害后,你可以令其攻击范围内的一名其他角色回复1点体力。', + dcchenyong:'沉勇', + dcchenyong_info:'结束阶段,你可以摸X张牌(X为本回合你使用过的牌的类型数)。', + dc_sunchen:'孙綝', + dczigu:'自固', + dczigu_info:'出牌阶段限一次。你可以弃置一张牌,然后获得场上的一张装备牌。若你没有因此获得其他角色的牌,你摸一张牌。', + dczuowei:'作威', + dczuowei_info:'当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌并令此技能于本回合失效(X为你装备区里牌的数量且至少为1)。', + sunyu:'孙瑜', + dcquanshou:'劝守', + dcquanshou_info:'一名角色的回合开始时,若其手牌数小于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。', + dcshexue:'设学', + dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做于上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用。', + xizheng:'郤正', + dcdanyi:'耽意', + dcdanyi_info:'当你使用牌指定第一个目标后,若此牌的目标与你使用的上一张牌目标相同,你可以摸X张牌(X为此牌目标数)。', + dcwencan:'文灿', + dcwencan_info:'出牌阶段限一次。你可以选择至多两名体力值不同且均与你的体力值不同的角色,这些角色依次选择一项:1.弃置两张花色不同的牌;2.本回合你对其使用牌无次数限制。', + liuchongluojun:'刘宠骆俊', + dcminze:'悯泽', + dcminze_info:'①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色,若其因此手牌数大于你,〖悯泽①〗于此阶段失效。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)', + dcjini:'击逆', + dcjini_info:'当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。', + yuechen:'乐綝', + dcporui:'破锐', + dcporui_info:'每轮限一次。其他角色的结束阶段,你可以弃置一张基本牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为你的体力值)。', + dcgonghu:'共护', + dcgonghu_info:'锁定技。①当你于回合外失去基本牌后,你于〖破锐〗后增加“若其没有因此受到伤害,你回复1点体力”。②当你于回合外造成或受到伤害后,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。', + sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", @@ -27855,6 +29084,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_yanhan:'荟萃·匡鼎炎汉', sp_jishi:'荟萃·悬壶济世', sp_raoting:'荟萃·绕庭之鸦', + sp_yijun:'荟萃·异军突起', sp2_yuxiu:'限定·钟灵毓秀', sp_decade:'其他新服武将', }, diff --git a/character/standard.js b/character/standard.js index 3f4306833..9aded0138 100755 --- a/character/standard.js +++ b/character/standard.js @@ -8,9 +8,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ standard_2008:["caocao","simayi","xiahoudun","zhangliao","xuzhu","guojia","zhenji","liubei","guanyu","zhangfei","zhugeliang","zhaoyun","machao","huangyueying","sunquan","ganning","lvmeng","huanggai","zhouyu","daqiao","luxun","sunshangxiang","huatuo","lvbu","diaochan","re_lidian"], standard_2013:["huaxiong","re_yuanshu","re_xushu"], standard_2019:["gongsunzan","xf_yiji"], + standard_2023:["std_panfeng"], }, }, character:{ + std_panfeng:['male','qun',4,['stdkuangfu']], re_lidian:['male','wei',3,['xunxun','xinwangxi']], re_xushu:['male','shu',4,['zhuhai','qianxin']], caocao:['male','wei',4,['jianxiong','hujia'],['zhu']], @@ -92,6 +94,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ guanyu:['zhangfei','liaohua'], }, skill:{ + stdkuangfu:{ + audio:'xinkuangfu', + trigger:{source:'damageSource'}, + forced:true, + usable:1, + filter:function(event,player){ + return player.isPhaseUsing()&&event.card&&event.card.name=='sha'&&event.player!=player&&event.player.isIn(); + }, + content:function(){ + if(trigger.player.hp0) return [1,0.5-1.5*num]; + if(num>0) return [1,0,0,0.5-1.5*num]; } } } @@ -697,7 +702,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twkaizeng:{ audio:2, global:'twkaizeng_want', - askInfo:['好哥哥给点XXX','有XXX吗','想要XXX','能给些XXX吗','手头正缺XXX'], refuseInfo:['不给','拒绝'], subSkill:{ want:{ @@ -6793,12 +6797,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var card=lib.skill.twmuyue_backup.card; event.card=card; player.removeSkill('twmuyue_effect'); - var card=get.cardPile2(function(cardx){ + var cardx=get.cardPile2(function(cardx){ return cardx.name==card[2]; }); player.line(target,'green'); - if(card) target.gain(card,'gain2'); - else { + if(cardx) target.gain(cardx,'gain2'); + else{ player.chat('无牌可得了吗?!'); game.log('但是牌堆中已经没有','#g【'+get.translation(card[2])+'】','了!'); } @@ -7632,7 +7636,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=player.countMark('twchuanshu_mark'); trigger.baseDamage+=num; trigger._twchuanshu=num; - player.removeMark('twchuanshu_mark',num); + player.removeMark('twchuanshu_mark',num,false); } else{ var num1=trigger._twchuanshu; @@ -7658,6 +7662,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('twchuanshu_clear',targets.filter(i=>i.isIn())); for(var target of targets){ target.unmarkAuto('twchuanshu_effect',[player]); + if(target.getStorage('twchuanshu_effect').length==0) target.removeSkill('twchuanshu_effect'); } } } @@ -10444,7 +10449,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var attitude=get.attitude(player,trigger.player); if(attitude==0||result==0){ if(trigger.player!=player) return 0; - var checkx=get.color(card,true)==get.color(judging); + var checkx=get.color(card,player)==get.color(judging); if(checkx>0) return checkx; return 0; }; @@ -10462,7 +10467,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.$gain2(trigger.player.judging[0]); player.gain(trigger.player.judging[0]); var card=result.cards[0]; - if(get.color(card)==get.color(trigger.player.judging[0])) player.draw('nodelay'); + if(get.color(card,player)==get.color(trigger.player.judging[0])) player.draw('nodelay'); trigger.player.judging[0]=result.cards[0]; trigger.orderingCards.addArray(result.cards); game.log(trigger.player,'的判定牌改为',result.cards[0]); @@ -13125,7 +13130,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tw_xiahoushang:['caopi'], }, characterReplace:{ - tw_caocao:['tw_caocao','yj_caocao'], + tw_caocao:['tw_caocao','jsrg_caocao','yj_caocao'], mateng:['tw_mateng','mateng'], }, dynamicTranslate:{ diff --git a/character/xinghuoliaoyuan.js b/character/xinghuoliaoyuan.js index 6099653c6..c78b8a349 100755 --- a/character/xinghuoliaoyuan.js +++ b/character/xinghuoliaoyuan.js @@ -1257,7 +1257,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:["useCardAfter","respond"], }, filter:function (event,player){ - if(get.itemtype(event.cards)!='cards'||player==_status.currentPhase) return false; + if(get.itemtype(event.cards)!='cards') return false; for(var i=0;iplayer.countCards('h'); + if(target==player) return false; + return target.countCards('h')>player.countCards('h')||Math.max(0,target.hp)>Math.max(0,player.hp); }).set('ai',function(target){ var att=get.attitude(_status.event.player,target); if(att<3) return 0; @@ -1483,6 +1484,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_taishici:['re_sp_taishici','sp_taishici'], mazhong:['mazhong','re_mazhong'], wenpin:['re_wenpin','wenpin'], + liuyan:['jsrg_liuyan','liuyan'], }, translate:{ xinghuoliaoyuan:'星火燎原', @@ -1553,7 +1555,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xinfu_guanchao":"观潮", "xinfu_guanchao_info":"出牌阶段开始时,你可以选择获得一项效果直到回合结束:1.当你使用牌时,若你此阶段使用过的所有牌的点数为递增,你摸一张牌;2.当你使用牌时,若你此阶段使用过的所有牌的点数为递减,你摸一张牌。", "xinfu_xunxian":"逊贤", - "xinfu_xunxian_info":"每名其他角色的回合限一次,当你使用或打出的牌结算完成后,你可以将其对应的所有实体牌交给一名手牌数大于你的角色。", + "xinfu_xunxian_info":"每回合限一次。当你使用或打出的牌结算完成后,你可以将其对应的所有实体牌交给一名手牌数或体力值大于你的角色。", "xinfu_kannan":"戡难", "xinfu_kannan_info":"出牌阶段限X次,你可以与一名本回合内未成为过〖戡难〗目标的角色拼点。若你赢,你使用的下一张【杀】的伤害值基数+1,且你本回合内不能再发动〖戡难〗。若你没赢,其使用的下一张【杀】的伤害值基数+1。(X为你的体力值)。", "kannan_eff":"戡难", diff --git a/character/yijiang.js b/character/yijiang.js index c530d133a..0a6eac2b8 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -4595,10 +4595,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ popup:false, onremove:true, filter:function(event,player){ - return typeof player.storage.fumian_draw=='number'; - }, - filter:function(event,player){ - return !event.numFixed; + return !event.numFixed&&typeof player.storage.fumian_draw=='number'; }, content:function(){ trigger.num+=player.storage.fumian_draw; @@ -13027,7 +13024,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xiansix:{}, xiansi2:{ enable:'chooseToUse', - audio:true, + audio:2, audioname:['re_liufeng'], viewAs:{name:'sha',isCard:true}, filter:function(event,player){ @@ -13095,7 +13092,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } "step 3" if(event.directresult||result.bool){ - player.logSkill('xiansi2',event.target); + player.logSkill('xiansi2_log',event.target); + game.trySkillAudio('xiansi2',event.target,true); var links=event.directresult||result.links; target.loseToDiscardpile(links); } @@ -13104,7 +13102,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ order:function(){ return get.order({name:'sha'})+0.05; }, - } + }, + subSkill:{log:{}} }, shibei:{ trigger:{player:'damageEnd'}, @@ -13532,7 +13531,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangyi:['re_zhangyi','zhangyi'], quancong:['old_quancong','re_quancong','xin_quancong','quancong'], sunxiu:['re_sunxiu','xin_sunxiu','sunxiu'], - zhuzhi:['zhuzhi','xin_zhuzhi','old_zhuzhi'], + zhuzhi:['re_zhuzhi','zhuzhi','xin_zhuzhi','old_zhuzhi'], liuyu:['dc_liuyu','liuyu','ol_liuyu'], zhangrang:['zhangrang','ol_zhangrang','junk_zhangrang'], jikang:['re_jikang','jikang'], @@ -13814,9 +13813,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinsidi2:'司敌', xinsidi_info:'其他角色出牌阶段开始时,你可以弃置一张与你装备区里的牌颜色相同的非基本牌,然后该角色于此阶段内不能使用和打出与此牌颜色相同的牌。此阶段结束时,若其此阶段没有使用【杀】,视为你对其使用了【杀】。', dangxian:'当先', - dangxian_info:'锁定技,准备阶段,你执行一个额外的出牌阶段。', + dangxian_info:'锁定技,回合开始时,你执行一个额外的出牌阶段。', xindangxian:'当先', - xindangxian_info:'锁定技,准备阶段,你执行一个额外的出牌阶段。此阶段开始时,你失去1点体力并从牌堆/弃牌堆中获得一张【杀】(若你已发动过〖伏枥〗,则可以不发动此效果)。', + xindangxian_info:'锁定技,回合开始时,你执行一个额外的出牌阶段。此阶段开始时,你失去1点体力并从牌堆/弃牌堆中获得一张【杀】(若你已发动过〖伏枥〗,则可以不发动此效果)。', longyin:'龙吟', longyin_info:'当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数,若此【杀】为红色,你摸一张牌。', zhongyong:'忠勇', @@ -14059,7 +14058,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zili_info:'觉醒技,准备阶段开始时,若“权”的数量不小于3,你减1点体力上限,然后选择一项:1、回复1点体力;2、摸两张牌。然后你获得技能“排异”。', quanji_info:'当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。', xianzhou_info:'限定技。出牌阶段,你可以将装备区内的所有牌交给一名其他角色,然后该角色选择一项:令你回复X点体力;或对其攻击范围内的X名角色各造成1点伤害(X为你以此法交给该角色的牌的数量)。', - qieting_info:'其他角色的结束阶段,若其未于此回合内使用过指定其他角色为目标的牌,你可以选择一项:将其装备区里的一张牌移动至你装备区里的相应位置;或摸一张牌。', + qieting_info:'其他角色的回合结束时,若其未于此回合内使用过指定其他角色为目标的牌,你可以选择一项:将其装备区里的一张牌移动至你装备区里的相应位置;或摸一张牌。', zhuikong_info:'其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色本回合使用的牌不能指定除该角色外的角色为目标。若你没赢,其本回合至你的距离视为1。', oldzhuikong_info:'其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色跳过本回合的出牌阶段。若你没赢,其本回合至你的距离视为1。', qiuyuan_info:'当你成为【杀】的目标时,你可以令一名其他角色选择一项:①、交给你一张【闪】;②、成为此【杀】的额外目标。', diff --git a/game/asset.js b/game/asset.js index 10f5c1788..90a47be14 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.121', + 'v1.9.122', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -7605,6 +7605,31 @@ window.noname_asset_list=[ 'image/character/zumao.jpg', 'image/character/zuoci.jpg', 'image/character/zuofen.jpg', + 'image/character/jsrg_caocao.jpg', + 'image/character/jsrg_dongbai.jpg', + 'image/character/jsrg_hejin.jpg', + 'image/character/jsrg_huangfusong.jpg', + 'image/character/jsrg_kongrong.jpg', + 'image/character/jsrg_liubei.jpg', + 'image/character/jsrg_liuhong.jpg', + 'image/character/jsrg_liuyan.jpg', + 'image/character/jsrg_nanhualaoxian.jpg', + 'image/character/jsrg_qiaoxuan.jpg', + 'image/character/jsrg_sunjian.jpg', + 'image/character/jsrg_wangyun.jpg', + 'image/character/jsrg_xushao.jpg', + 'image/character/jsrg_yangbiao.jpg', + 'image/character/jsrg_zhujun.jpg', + 'image/character/luoxian.jpg', + 'image/character/ol_huban.jpg', + 'image/character/re_zhuzhi.jpg', + 'image/character/sb_chengong.jpg', + 'image/character/sb_diaochan.jpg', + 'image/character/sb_pangtong.jpg', + 'image/character/sb_yuanshao.jpg', + 'image/character/std_panfeng.jpg', + 'image/character/sunhong.jpg', + 'image/character/yanghong.jpg', 'image/emotion/shibing_emotion/1.gif', 'image/emotion/shibing_emotion/2.gif', diff --git a/game/game.js b/game/game.js index f58e20a24..7b7071de9 100644 --- a/game/game.js +++ b/game/game.js @@ -2,7 +2,7 @@ (function(){ if(!localStorage.getItem('noname_alerted')){ localStorage.setItem('noname_alerted',true); - alert('无名杀官方发布地址仅有GitHub仓库!\n其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为粉丝自发组织,与无名杀官方无关!'); + alert('无名杀官方发布地址仅有GitHub仓库!\n其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为玩家自发组织,与无名杀官方无关!'); } var _status={ paused:false, @@ -536,6 +536,10 @@ }, unfrequent:true, }, + fuck_sojson:{ + name:'检测加密扩展', + init:false, + }, errstop:{ name:'出错时停止游戏', init:false, @@ -6692,7 +6696,7 @@ globalId:0, }, help:{ - '关于游戏':'
关于无名杀
  • 无名杀官方发布地址仅有GitHub仓库!
    点击前往Github仓库
  • 其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为粉丝自发组织,与无名杀官方无关!', + '关于游戏':'
    关于无名杀
    • 无名杀官方发布地址仅有GitHub仓库!
      点击前往Github仓库
    • 无名杀基于GPLv3开源协议。
      点击查看GPLv3协议
    • 其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为粉丝自发组织,与无名杀官方无关!', '游戏操作':'
      • 长按/鼠标悬停/右键单击显示信息。
      • 触屏模式中,双指点击切换暂停;下划显示菜单,上划切换托管。
      • 键盘快捷键
        '+ '
        A切换托管
        W切换不询问无懈
        空格暂停
      • 编辑牌堆
        在卡牌包中修改牌堆后,将自动创建一个临时牌堆,在所有模式中共用,当保存当前牌堆后,临时牌堆被清除。每个模式可设置不同的已保存牌堆,设置的牌堆优先级大于临时牌堆。
      ', '游戏命令':'
      变量名
      • 场上角色
        game.players
      • 阵亡角色
        game.dead'+ @@ -7986,9 +7990,22 @@ },onerror); },onerror); }; + game.readFileAsText=function(filename,callback,onerror){ + window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ + entry.getFile(filename,{},function(fileEntry){ + fileEntry.file(function(fileToLoad){ + var fileReader = new FileReader(); + fileReader.onload = function(e){ + callback(e.target.result); + }; + fileReader.readAsText(fileToLoad, "UTF-8"); + },onerror); + },onerror); + },onerror); + }; game.writeFile=function(data,path,name,callback){ - game.ensureDirectory(path,function(){}); - if(Object.prototype.toString.call(data)=='[object File]'){ + game.ensureDirectory(path,function(){ + if(Object.prototype.toString.call(data)=='[object File]'){ var fileReader = new FileReader(); fileReader.onload = function(e){ game.writeFile(e.target.result,path,name,callback); @@ -8005,6 +8022,7 @@ }); }); } + }); }; game.removeFile=function(dir,callback){ window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ @@ -8174,8 +8192,18 @@ } }); }; + game.readFileAsText=function(filename,callback,onerror){ + lib.node.fs.readFile(__dirname+'/'+filename,'utf-8',function(err,data){ + if(err){ + onerror(err); + } + else{ + callback(data); + } + }); + }; game.writeFile=function(data,path,name,callback){ - game.ensureDirectory(path,function(){}); + game.ensureDirectory(path,function(){ if(Object.prototype.toString.call(data)=='[object File]'){ var fileReader = new FileReader(); fileReader.onload = function(e){ @@ -8189,6 +8217,7 @@ lib.node.fs.writeFile(__dirname+'/'+path+'/'+name,zip.files.i.asNodeBuffer(),null,callback); }); } + }); }; game.removeFile=function(filename,callback){ lib.node.fs.unlink(__dirname+'/'+filename,callback||function(){}); @@ -9270,15 +9299,29 @@ } } else{ - var script=document.createElement('script'); + var script_src; if(!file){ - script.src = path; + script_src = path; } else{ - script.src = path+'/'+file+".js"; + script_src = path+'/'+file+".js"; } if(path.indexOf('http')==0){ - script.src+='?rand='+get.id(); + script_src+='?rand='+get.id(); + } + else{ + if(game.readFile&&lib.config.fuck_sojson&&script_src.includes('extension')!=-1&&script_src.indexOf(lib.assetURL)==0){ + var path_to_read=script_src.slice(lib.assetURL.length); + game.readFileAsText(path_to_read,function(result){ + if(result.includes('sojson')||result.includes('jsjiami')||result.includes('var _0x')) alert('检测到您安装了使用免费版sojson进行加密的扩展。请谨慎使用这些扩展,避免游戏数据遭到破坏。\n扩展文件:'+path_to_read); + },function(){ + + }); + } + } + var script=document.createElement('script'); + script.src=script_src; + if(path.indexOf('http')==0){ script.addEventListener('load',function(){ script.remove(); }); @@ -10440,6 +10483,103 @@ emptyEvent:function(){ event.trigger(event.name); }, + chooseToDebate:function(){ + 'step 0' + event.targets=event.list.filter(function(i){ + return i.countCards('h')>0; + }); + if(!event.targets.length) event.result={bool:false}; + else{ + var next=player.chooseCardOL(event.targets,get.translation(player)+'发起了议事,请选择展示的手牌',true).set('type','debate').set('source',player).set('ai',event.ai||function(card){ + return Math.random(); + }).set('aiCard',event.aiCard||function(target){ + var hs=target.getCards('h'); + return {bool:true,cards:[hs.randomGet()]}; + }); + next._args.remove('glow_result'); + } + 'step 1' + var red=[],black=[]; + event.videoId=lib.status.videoId++; + for(var i=0;i红色,展示了',red.map(function(i){ + return i[1]; + })); + } + else game.log('#b无人','意见为红色'); + if(black.length){ + game.log(black.map(function(i){ + return i[0]; + }),'意见为','#g黑色',',展示了',black.map(function(i){ + return i[1]; + })); + } + else game.log('#b无人','意见为','#g黑色'); + game.broadcastAll(function(name,id,redArgs,blackArgs){ + var dialog=ui.create.dialog(name+'发起了议事','hidden','forcebutton'); + dialog.videoId=id; + dialog.classList.add('scroll1'); + dialog.classList.add('scroll2'); + dialog.classList.add('fullwidth'); + dialog.buttonss=[]; + + var list=['意见为红色的角色','意见为黑色的角色'] + for(var i=0;i'+list[i]+''); + var buttons=ui.create.div('.buttons',dialog.content); + dialog.buttonss.push(buttons); + buttons.classList.add('popup'); + buttons.classList.add('guanxing'); + } + var func=function(target){ + if(target._tempTranslate) return target._tempTranslate; + var name=target.name; + if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; + return get.translation(name); + }; + for(var i=0;ievent.black.length) opinion='red'; + else if(event.red.length红色':'#g黑色'); + else game.log(player,'本次发起的议事无结果'); + event.result={ + bool:true, + opinion:opinion, + red:event.red, + black:event.black, + targets:event.targets + } + 'step 3' + if(event.callback){ + var next=game.createEvent('debateCallback',false); + next.player=player; + next.debateResult=get.copy(event.result); + next.setContent(event.callback); + } + }, delay:function(){ game[event.name].apply(game,event._args) }, @@ -13182,6 +13322,7 @@ if(shown.length>0) player.$give(shown,i[0]); if(hidden.length>0) player.$giveAuto(hidden,i[0]); } + break; default: event.finish(); } @@ -14284,7 +14425,7 @@ else if(event.prompt){ event.dialog=ui.create.dialog(event.prompt); if(event.prompt2){ - event.dialog.addText(event.prompt2,event.prompt2.length<=20||event.centerprompt2); + event.dialog.addText(event.prompt2,Boolean(event.prompt2.length<=20||event.centerprompt2)); } } } @@ -17450,6 +17591,21 @@ }, player:{ //新函数 + chooseToDebate:function(){ + var next=game.createEvent('chooseToDebate'); + next.player=this; + next._args=[]; + for(var i=0;i',importExtension); + ui.create.div('.config','修改下载地址',page,function(){ + alert('您可以在“设置→通用→获取扩展地址”中,修改下载扩展时所采用的地址。') + }) var extensionURL; var source=lib.config.extension_sources,index=lib.config.extension_source; @@ -46644,6 +46811,14 @@ node.removeEventListener('click',ui.click.resume); },500); } + if(!localStorage.getItem('gplv3_alerted')){ + if(confirm('无名杀是一款基于GPLv3协议的开源软件!\n你可以在遵守GPLv3协议的基础上任意使用,修改并转发《无名杀》,以及所有基于《无名杀》开发的拓展。\n点击“确定”即代表您认可并接受GPLv3协议↓️\nhttps://www.gnu.org/licenses/gpl-3.0.html')){ + localStorage.setItem('gplv3_alerted',true); + } + else{ + game.exit(); + } + } }, system:function(str,func,right,before){ var parent=right?ui.system2:ui.system1; @@ -50717,7 +50892,7 @@ } }, auto:function(){ - if(ui.auto.classList.contains('hidden')&&arguments[0]!=='forced') return; + if(!ui||!ui.auto||ui.auto.classList.contains('hidden')&&arguments[0]!=='forced') return; if(_status.paused2) return; ui.click.shortcut(false); if(!_status.auto){ @@ -51563,6 +51738,29 @@ }, }; var get={ + skillCategoriesOf:function(skill,player){ + var list=[],info=get.info(skill); + if(!info) return list; + if(get.is.locked(skill,player)) list.add('锁定技'); + if(info.zhuSkill) list.add('主公技'); + if(info.limited) list.add('限定技'); + if(info.juexingji||info.limited) list.add('觉醒技'); + if(info.limited) list.add('限定技'); + if(info.zhuanhuanji) list.add('转换技'); + if(info.hiddenSkill) list.add('隐匿技'); + if(info.clanSkill) list.add('宗族技'); + if(info.groupSkill) list.add('势力技'); + if(info.dutySkill) list.add('使命技'); + if(info.chargeSkill) list.add('蓄力技'); + if(info.zhenfa) list.add('阵法技'); + if(info.mainSkill) list.add('主将技'); + if(info.viceSkill) list.add('副将技'); + if(info.lordSkill) list.add('君主技'); + if(info.chargingSkill) list.add('蓄能技'); + if(info.charlotte) list.add('Charlotte'); + if(info.categories) list.addArray(info.categories(skill,player)); + return list; + }, numOf:function(obj,item){ var num=0; for(var i=0;i0&&target.hujia>0) return 0; + if(eff>0&&target.hujia>0) return eff/1.3; return eff; }, recoverEffect:function(target,player,viewer){ diff --git a/game/source.js b/game/source.js index e78e78db9..44783112a 100644 --- a/game/source.js +++ b/game/source.js @@ -1,4 +1,5 @@ window.noname_source_list=[ + 'LICENSE', 'card/extra.js', 'card/gujian.js', 'card/guozhan.js', diff --git a/game/update.js b/game/update.js index 41f9cab8d..7e533c0ad 100644 --- a/game/update.js +++ b/game/update.js @@ -1,14 +1,17 @@ window.noname_update={ - version:'1.9.121', - update:'1.9.120.3.1', + version:'1.9.122', + update:'1.9.121', changeLog:[ - '族吴匡、界颜良文丑、王匡', - '谢灵毓、笮融、张闿', - '削弱版段煨、李典', + '增大GPL协议的醒目性', + '整合@copcap 编写的代码', + '线下武将包《江山如故·起》(暂时不含许劭)', + 'OL罗宪、胡班、孙弘;十周年界朱治、杨弘', + '谋陈宫、貂蝉、庞统、袁绍;线下标潘凤', '其他技能调整和bug修复', ], files:[ - 'card/extra.js', + 'LICENSE', + //'card/extra.js', //'card/gujian.js', //'card/guozhan.js', //'card/gwent.js', @@ -24,7 +27,7 @@ window.noname_update={ //'card/zhulu.js', 'character/clan.js', 'character/diy.js', - //'character/extra.js', + 'character/extra.js', //'character/hearth.js', //'character/gujian.js', //'character/gwent.js', @@ -44,9 +47,9 @@ window.noname_update={ 'character/tw.js', //'character/swd.js', //'character/xianjian.js', - //'character/xinghuoliaoyuan.js', + 'character/xinghuoliaoyuan.js', 'character/yijiang.js', - 'character/yingbian.js', + //'character/yingbian.js', //'character/yxs.js', //'extension/boss/extension.js', //'font/suits.ttf', @@ -62,7 +65,7 @@ window.noname_update={ //'mode/chess.js', //'mode/connect.js', //'mode/doudizhu.js', - //'mode/guozhan.js', + 'mode/guozhan.js', //'mode/identity.js', //'mode/single.js', //'mode/stone.js', diff --git a/image/character/jsrg_caocao.jpg b/image/character/jsrg_caocao.jpg new file mode 100644 index 000000000..f4159c400 Binary files /dev/null and b/image/character/jsrg_caocao.jpg differ diff --git a/image/character/jsrg_dongbai.jpg b/image/character/jsrg_dongbai.jpg new file mode 100644 index 000000000..944d99895 Binary files /dev/null and b/image/character/jsrg_dongbai.jpg differ diff --git a/image/character/jsrg_hejin.jpg b/image/character/jsrg_hejin.jpg new file mode 100644 index 000000000..c4c947c05 Binary files /dev/null and b/image/character/jsrg_hejin.jpg differ diff --git a/image/character/jsrg_huangfusong.jpg b/image/character/jsrg_huangfusong.jpg new file mode 100644 index 000000000..4510678e7 Binary files /dev/null and b/image/character/jsrg_huangfusong.jpg differ diff --git a/image/character/jsrg_kongrong.jpg b/image/character/jsrg_kongrong.jpg new file mode 100644 index 000000000..f770f1473 Binary files /dev/null and b/image/character/jsrg_kongrong.jpg differ diff --git a/image/character/jsrg_liubei.jpg b/image/character/jsrg_liubei.jpg new file mode 100644 index 000000000..b51bfd049 Binary files /dev/null and b/image/character/jsrg_liubei.jpg differ diff --git a/image/character/jsrg_liuhong.jpg b/image/character/jsrg_liuhong.jpg new file mode 100644 index 000000000..7d479a79a Binary files /dev/null and b/image/character/jsrg_liuhong.jpg differ diff --git a/image/character/jsrg_liuyan.jpg b/image/character/jsrg_liuyan.jpg new file mode 100644 index 000000000..f6438a7b2 Binary files /dev/null and b/image/character/jsrg_liuyan.jpg differ diff --git a/image/character/jsrg_nanhualaoxian.jpg b/image/character/jsrg_nanhualaoxian.jpg new file mode 100644 index 000000000..6d0065663 Binary files /dev/null and b/image/character/jsrg_nanhualaoxian.jpg differ diff --git a/image/character/jsrg_qiaoxuan.jpg b/image/character/jsrg_qiaoxuan.jpg new file mode 100644 index 000000000..ba6f81084 Binary files /dev/null and b/image/character/jsrg_qiaoxuan.jpg differ diff --git a/image/character/jsrg_sunjian.jpg b/image/character/jsrg_sunjian.jpg new file mode 100644 index 000000000..7df76c833 Binary files /dev/null and b/image/character/jsrg_sunjian.jpg differ diff --git a/image/character/jsrg_wangyun.jpg b/image/character/jsrg_wangyun.jpg new file mode 100644 index 000000000..8c4cc2881 Binary files /dev/null and b/image/character/jsrg_wangyun.jpg differ diff --git a/image/character/jsrg_xushao.jpg b/image/character/jsrg_xushao.jpg new file mode 100644 index 000000000..193aeec15 Binary files /dev/null and b/image/character/jsrg_xushao.jpg differ diff --git a/image/character/jsrg_yangbiao.jpg b/image/character/jsrg_yangbiao.jpg new file mode 100644 index 000000000..08ece597d Binary files /dev/null and b/image/character/jsrg_yangbiao.jpg differ diff --git a/image/character/jsrg_zhujun.jpg b/image/character/jsrg_zhujun.jpg new file mode 100644 index 000000000..3db4a336f Binary files /dev/null and b/image/character/jsrg_zhujun.jpg differ diff --git a/image/character/luoxian.jpg b/image/character/luoxian.jpg new file mode 100644 index 000000000..21f83c887 Binary files /dev/null and b/image/character/luoxian.jpg differ diff --git a/image/character/ol_huban.jpg b/image/character/ol_huban.jpg new file mode 100644 index 000000000..c99a249b7 Binary files /dev/null and b/image/character/ol_huban.jpg differ diff --git a/image/character/re_zhuzhi.jpg b/image/character/re_zhuzhi.jpg new file mode 100644 index 000000000..feebc82c1 Binary files /dev/null and b/image/character/re_zhuzhi.jpg differ diff --git a/image/character/sb_chengong.jpg b/image/character/sb_chengong.jpg new file mode 100644 index 000000000..d2f2d3842 Binary files /dev/null and b/image/character/sb_chengong.jpg differ diff --git a/image/character/sb_diaochan.jpg b/image/character/sb_diaochan.jpg new file mode 100644 index 000000000..0649c6ba0 Binary files /dev/null and b/image/character/sb_diaochan.jpg differ diff --git a/image/character/sb_pangtong.jpg b/image/character/sb_pangtong.jpg new file mode 100644 index 000000000..8857b54db Binary files /dev/null and b/image/character/sb_pangtong.jpg differ diff --git a/image/character/sb_yuanshao.jpg b/image/character/sb_yuanshao.jpg new file mode 100644 index 000000000..1f8dc1e3b Binary files /dev/null and b/image/character/sb_yuanshao.jpg differ diff --git a/image/character/std_panfeng.jpg b/image/character/std_panfeng.jpg new file mode 100644 index 000000000..5c70f8904 Binary files /dev/null and b/image/character/std_panfeng.jpg differ diff --git a/image/character/sunhong.jpg b/image/character/sunhong.jpg new file mode 100644 index 000000000..bb1decb27 Binary files /dev/null and b/image/character/sunhong.jpg differ diff --git a/image/character/yanghong.jpg b/image/character/yanghong.jpg new file mode 100644 index 000000000..cbbe0f6aa Binary files /dev/null and b/image/character/yanghong.jpg differ diff --git a/mode/guozhan.js b/mode/guozhan.js index bde4521f0..d541135b7 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -1250,7 +1250,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzzhenxi:{ audio:'twzhenxi', trigger:{player:'useCardToPlayered'}, - logTarget:'target', filter:function(event,player){ if(event.card.name!='sha') return false; if(event.target.countCards('he')||player.hasCard(function(card){ @@ -1266,49 +1265,55 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' + var target=trigger.target; + event.target=target; var list=[],choiceList=[ - '弃置'+get.translation(trigger.target)+'一张牌', - '将一张♦非锦囊牌当做【乐不思蜀】或♣非锦囊牌当做【兵粮寸断】对'+get.translation(trigger.target)+'使用', + '弃置'+get.translation(target)+'一张牌', + '将一张♦非锦囊牌当做【乐不思蜀】或♣非锦囊牌当做【兵粮寸断】对'+get.translation(target)+'使用', '背水!若其有暗置的武将牌且你的武将牌均明置,你依次执行上述两项' ]; - if(trigger.target.countDiscardableCards(player,'he')) list.push('选项一'); + if(target.countDiscardableCards(player,'he')) list.push('选项一'); else choiceList[0]=''+choiceList[0]+''; if(player.countCards('he',function(card){ - return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),trigger.target); + return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),target); })||(player.countCards('he',function(card){ - return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),trigger.target); + return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),target); }))) list.push('选项二'); else choiceList[1]=''+choiceList[1]+''; - if(trigger.target.isUnseen(2)&&!player.isUnseen(2)) list.push('背水!'); + if(target.isUnseen(2)&&!player.isUnseen(2)) list.push('背水!'); else choiceList[2]=''+choiceList[2]+''; - player.chooseControl(list,'cancel2').set('prompt',get.prompt('gzzhenxi',trigger.target)).set('choiceList',choiceList).set('ai',function(){ + player.chooseControl(list,'cancel2').set('prompt',get.prompt('gzzhenxi',target)).set('choiceList',choiceList).set('ai',function(){ var player=_status.event.player,trigger=_status.event.getTrigger(),list=_status.event.list; if(get.attitude(player,trigger.target)>0) return 'cancel2'; if(list.contains('背水!')) return '背水!'; if(list.contains('选项二')) return '选项二'; return '选项一'; - }).set('list',list); + }).set('list',list).set('hiddenSkill','gzzhenxi'); 'step 1' if(result.control=='cancel2'){ event.finish(); return; } - if(result.control!='选项二'&&trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard(trigger.target,'he',true); - if(result.control!='选项一'&&player.countCards('he',function(card){ - return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),trigger.target); - })||(player.countCards('he',function(card){ - return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),trigger.target,false); - }))){ + player.logSkill('gzzhenxi',target); + event.choice=result.control; + if(event.choice!='选项二'&&target.countDiscardableCards(player,'he')) player.discardPlayerCard(target,'he',true); + 'step 2' + if(event.choice!='选项一'&&!player.isUnseen(2)&&target.isUnseen(2)&& + player.hasCard(function(card){ + return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),target); + },'he')||(player.hasCard(function(card){ + return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),target,false); + },'he'))){ var next=game.createEvent('gzzhenxi_use'); next.player=player; - next.target=trigger.target; + next.target=target; next.setContent(lib.skill.gzzhenxi.contentx); } }, ai:{unequip_ai:true}, contentx:function(){ 'step 0' - player.chooseCardTarget({ + player.chooseCard({ position:'hes', forced:true, prompt:'震袭', @@ -1316,15 +1321,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ filterCard:function(card,player){ if(get.itemtype(card)!='card'||get.type2(card)=='trick'||!['diamond','club'].contains(get.suit(card))) return false; var cardx={name:get.suit(card)=='diamond'?'lebu':'bingliang'}; - if(!player.canUse(get.autoViewAs(cardx,[card]),_status.event.getParent().player,false)) return false; - return lib.filter.filterCard.apply(this,arguments); - }, - filterTarget:function(card,player,target){ - var source=_status.event.target; - if(target!=source&&!ui.selected.targets.contains(source)) return false; - var cardx={name:get.suit(card)=='diamond'?'lebu':'bingliang'}; - card=get.autoViewAs(cardx,[card]); - return lib.filter.filterTarget.apply(this,arguments); + return player.canUse(get.autoViewAs(cardx,[card]),_status.event.getParent().target,false); }, }); 'step 1' @@ -1428,9 +1425,12 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return get.attitude(player,event.player)<0; }, usable:1, + logTarget:'player', content:function(){ 'step 0' - if(trigger.player.hasSex('female')&&trigger.player.countCards('e')) player.chooseToDiscard('he','追妒:是否弃置一张牌并令其执行两项?').set('ai',function(card){ + var target=trigger.player; + event.target=target; + if(target.hasSex('female')&&target.countCards('e')>0) player.chooseToDiscard('he','追妒:是否弃置一张牌并令其执行两项?').set('ai',function(card){ return 8-get.value(card); }); else event.goto(2); @@ -1440,8 +1440,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ event.goto(3); } 'step 2' - if(trigger.player.countCards('e')>0){ - trigger.player.chooseControl().set('prompt','追妒:请选择一项').set('choiceList',[ + if(target.countCards('e')>0){ + target.chooseControl().set('prompt','追妒:请选择一项').set('choiceList',[ '令'+get.translation(trigger.player)+'此次对你造成的伤害+1', '弃置装备区里的所有牌', ]).set('ai',function(){ @@ -1449,13 +1449,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(player.hp<=2) return 1; if(get.value(cards)<=7) return 1; return 0; - }).set('list',list); + }); } else event._result={control:'选项一'}; 'step 3' - player.line(trigger.player); + player.line(target); if(result.control!='选项二') trigger.num++; - if(result.control!='选项一') trigger.player.chooseToDiscard(trigger.player.countCards('e'),true,'e'); + if(result.control!='选项一') target.chooseToDiscard(target.countCards('e'),true,'e'); }, }, gzshigong:{ @@ -7309,6 +7309,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ forceunique:true, group:'wuziliangjiangdao', derivation:'wuziliangjiangdao', + lordSkill:true, global:'g_jianan', }, g_jianan:{ @@ -10042,6 +10043,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ jiahe:{ unique:true, forceunique:true, + lordSkill:true, audio:2, derivation:'yuanjiangfenghuotu', mark:true, @@ -10848,6 +10850,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ derivation:'huangjintianbingfu', unique:true, forceunique:true, + lordSkill:true, trigger:{player:'phaseZhunbeiBegin'}, forced:true, filter:function(event,player){ @@ -11097,6 +11100,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ group:'wuhujiangdaqi', derivation:'wuhujiangdaqi', mark:true, + lordSkill:true, }, wuhujiangdaqi:{ unique:true,