diff --git a/audio/die/dc_caiyang.mp3 b/audio/die/dc_caiyang.mp3 new file mode 100644 index 000000000..5e5634b70 Binary files /dev/null and b/audio/die/dc_caiyang.mp3 differ diff --git a/audio/die/dc_lvkuanglvxiang.mp3 b/audio/die/dc_lvkuanglvxiang.mp3 new file mode 100644 index 000000000..1d54e107a Binary files /dev/null and b/audio/die/dc_lvkuanglvxiang.mp3 differ diff --git a/audio/die/dengzhong.mp3 b/audio/die/dengzhong.mp3 new file mode 100644 index 000000000..ff99b32bf Binary files /dev/null and b/audio/die/dengzhong.mp3 differ diff --git a/audio/die/dukui.mp3 b/audio/die/dukui.mp3 new file mode 100644 index 000000000..c541665e4 Binary files /dev/null and b/audio/die/dukui.mp3 differ diff --git a/audio/die/liuhui.mp3 b/audio/die/liuhui.mp3 new file mode 100644 index 000000000..8e29e1328 Binary files /dev/null and b/audio/die/liuhui.mp3 differ diff --git a/audio/die/ol_dianwei.mp3 b/audio/die/ol_dianwei.mp3 new file mode 100644 index 000000000..7287402f0 Binary files /dev/null and b/audio/die/ol_dianwei.mp3 differ diff --git a/audio/die/wangyan.mp3 b/audio/die/wangyan.mp3 new file mode 100644 index 000000000..6c9242e3a Binary files /dev/null and b/audio/die/wangyan.mp3 differ diff --git a/audio/die/xiahouxuan.mp3 b/audio/die/xiahouxuan.mp3 new file mode 100644 index 000000000..4c3e09da2 Binary files /dev/null and b/audio/die/xiahouxuan.mp3 differ diff --git a/audio/die/zhangfen.mp3 b/audio/die/zhangfen.mp3 new file mode 100644 index 000000000..2987a02e6 Binary files /dev/null and b/audio/die/zhangfen.mp3 differ diff --git a/audio/skill/cihuang1.mp3 b/audio/skill/cihuang1.mp3 new file mode 100644 index 000000000..07cc59d07 Binary files /dev/null and b/audio/skill/cihuang1.mp3 differ diff --git a/audio/skill/cihuang2.mp3 b/audio/skill/cihuang2.mp3 new file mode 100644 index 000000000..a32019e96 Binary files /dev/null and b/audio/skill/cihuang2.mp3 differ diff --git a/audio/skill/dcchaixie1.mp3 b/audio/skill/dcchaixie1.mp3 new file mode 100644 index 000000000..b73402102 Binary files /dev/null and b/audio/skill/dcchaixie1.mp3 differ diff --git a/audio/skill/dcchaixie2.mp3 b/audio/skill/dcchaixie2.mp3 new file mode 100644 index 000000000..70546bcc4 Binary files /dev/null and b/audio/skill/dcchaixie2.mp3 differ diff --git a/audio/skill/dcfanyin1.mp3 b/audio/skill/dcfanyin1.mp3 new file mode 100644 index 000000000..a91b6acde Binary files /dev/null and b/audio/skill/dcfanyin1.mp3 differ diff --git a/audio/skill/dcfanyin2.mp3 b/audio/skill/dcfanyin2.mp3 new file mode 100644 index 000000000..e5fe33db7 Binary files /dev/null and b/audio/skill/dcfanyin2.mp3 differ diff --git a/audio/skill/dcgeyuan1.mp3 b/audio/skill/dcgeyuan1.mp3 new file mode 100644 index 000000000..55c771a19 Binary files /dev/null and b/audio/skill/dcgeyuan1.mp3 differ diff --git a/audio/skill/dcgeyuan2.mp3 b/audio/skill/dcgeyuan2.mp3 new file mode 100644 index 000000000..addfa9bc0 Binary files /dev/null and b/audio/skill/dcgeyuan2.mp3 differ diff --git a/audio/skill/dcgusuan1.mp3 b/audio/skill/dcgusuan1.mp3 new file mode 100644 index 000000000..d85296e5b Binary files /dev/null and b/audio/skill/dcgusuan1.mp3 differ diff --git a/audio/skill/dcgusuan2.mp3 b/audio/skill/dcgusuan2.mp3 new file mode 100644 index 000000000..578fb0276 Binary files /dev/null and b/audio/skill/dcgusuan2.mp3 differ diff --git a/audio/skill/dcjiaofeng1.mp3 b/audio/skill/dcjiaofeng1.mp3 new file mode 100644 index 000000000..7e5516683 Binary files /dev/null and b/audio/skill/dcjiaofeng1.mp3 differ diff --git a/audio/skill/dcjiaofeng2.mp3 b/audio/skill/dcjiaofeng2.mp3 new file mode 100644 index 000000000..dcd2c7c36 Binary files /dev/null and b/audio/skill/dcjiaofeng2.mp3 differ diff --git a/audio/skill/dcjieshu1.mp3 b/audio/skill/dcjieshu1.mp3 new file mode 100644 index 000000000..f59189f6a Binary files /dev/null and b/audio/skill/dcjieshu1.mp3 differ diff --git a/audio/skill/dcjieshu2.mp3 b/audio/skill/dcjieshu2.mp3 new file mode 100644 index 000000000..c509ed168 Binary files /dev/null and b/audio/skill/dcjieshu2.mp3 differ diff --git a/audio/skill/dcliehou1.mp3 b/audio/skill/dcliehou1.mp3 new file mode 100644 index 000000000..b28ea1cb5 Binary files /dev/null and b/audio/skill/dcliehou1.mp3 differ diff --git a/audio/skill/dcliehou2.mp3 b/audio/skill/dcliehou2.mp3 new file mode 100644 index 000000000..c79de4d70 Binary files /dev/null and b/audio/skill/dcliehou2.mp3 differ diff --git a/audio/skill/dcpeiqi1.mp3 b/audio/skill/dcpeiqi1.mp3 new file mode 100644 index 000000000..93718d73e Binary files /dev/null and b/audio/skill/dcpeiqi1.mp3 differ diff --git a/audio/skill/dcpeiqi2.mp3 b/audio/skill/dcpeiqi2.mp3 new file mode 100644 index 000000000..eb328e0fe Binary files /dev/null and b/audio/skill/dcpeiqi2.mp3 differ diff --git a/audio/skill/dcshuhe1.mp3 b/audio/skill/dcshuhe1.mp3 new file mode 100644 index 000000000..610541adf Binary files /dev/null and b/audio/skill/dcshuhe1.mp3 differ diff --git a/audio/skill/dcshuhe2.mp3 b/audio/skill/dcshuhe2.mp3 new file mode 100644 index 000000000..5b9554249 Binary files /dev/null and b/audio/skill/dcshuhe2.mp3 differ diff --git a/audio/skill/dcwanglu1.mp3 b/audio/skill/dcwanglu1.mp3 new file mode 100644 index 000000000..7e0ea95f9 Binary files /dev/null and b/audio/skill/dcwanglu1.mp3 differ diff --git a/audio/skill/dcwanglu2.mp3 b/audio/skill/dcwanglu2.mp3 new file mode 100644 index 000000000..341a40954 Binary files /dev/null and b/audio/skill/dcwanglu2.mp3 differ diff --git a/audio/skill/dcxianzhu1.mp3 b/audio/skill/dcxianzhu1.mp3 new file mode 100644 index 000000000..0b91b02d0 Binary files /dev/null and b/audio/skill/dcxianzhu1.mp3 differ diff --git a/audio/skill/dcxianzhu2.mp3 b/audio/skill/dcxianzhu2.mp3 new file mode 100644 index 000000000..6505ec545 Binary files /dev/null and b/audio/skill/dcxianzhu2.mp3 differ diff --git a/audio/skill/dcxunji1.mp3 b/audio/skill/dcxunji1.mp3 new file mode 100644 index 000000000..3ea7dfa63 Binary files /dev/null and b/audio/skill/dcxunji1.mp3 differ diff --git a/audio/skill/dcxunji2.mp3 b/audio/skill/dcxunji2.mp3 new file mode 100644 index 000000000..1c1b825fe Binary files /dev/null and b/audio/skill/dcxunji2.mp3 differ diff --git a/audio/skill/dzgengzhan1.mp3 b/audio/skill/dzgengzhan1.mp3 new file mode 100644 index 000000000..26bd0bb65 Binary files /dev/null and b/audio/skill/dzgengzhan1.mp3 differ diff --git a/audio/skill/dzgengzhan2.mp3 b/audio/skill/dzgengzhan2.mp3 new file mode 100644 index 000000000..10e66b48c Binary files /dev/null and b/audio/skill/dzgengzhan2.mp3 differ diff --git a/audio/skill/dzkanpo1.mp3 b/audio/skill/dzkanpo1.mp3 new file mode 100644 index 000000000..ff652cdd0 Binary files /dev/null and b/audio/skill/dzkanpo1.mp3 differ diff --git a/audio/skill/dzkanpo2.mp3 b/audio/skill/dzkanpo2.mp3 new file mode 100644 index 000000000..e62fb6381 Binary files /dev/null and b/audio/skill/dzkanpo2.mp3 differ diff --git a/audio/skill/olhuanfu1.mp3 b/audio/skill/olhuanfu1.mp3 new file mode 100644 index 000000000..275ddb46b Binary files /dev/null and b/audio/skill/olhuanfu1.mp3 differ diff --git a/audio/skill/olhuanfu2.mp3 b/audio/skill/olhuanfu2.mp3 new file mode 100644 index 000000000..d7005f900 Binary files /dev/null and b/audio/skill/olhuanfu2.mp3 differ diff --git a/audio/skill/olningwu1.mp3 b/audio/skill/olningwu1.mp3 new file mode 100644 index 000000000..e07afc68d Binary files /dev/null and b/audio/skill/olningwu1.mp3 differ diff --git a/audio/skill/olningwu2.mp3 b/audio/skill/olningwu2.mp3 new file mode 100644 index 000000000..b01d0dff3 Binary files /dev/null and b/audio/skill/olningwu2.mp3 differ diff --git a/audio/skill/olqingyi1.mp3 b/audio/skill/olqingyi1.mp3 new file mode 100644 index 000000000..46386599b Binary files /dev/null and b/audio/skill/olqingyi1.mp3 differ diff --git a/audio/skill/olqingyi2.mp3 b/audio/skill/olqingyi2.mp3 new file mode 100644 index 000000000..0f3b8f45b Binary files /dev/null and b/audio/skill/olqingyi2.mp3 differ diff --git a/audio/skill/olzeyue1.mp3 b/audio/skill/olzeyue1.mp3 new file mode 100644 index 000000000..b95740896 Binary files /dev/null and b/audio/skill/olzeyue1.mp3 differ diff --git a/audio/skill/olzeyue2.mp3 b/audio/skill/olzeyue2.mp3 new file mode 100644 index 000000000..0f27ee39b Binary files /dev/null and b/audio/skill/olzeyue2.mp3 differ diff --git a/audio/skill/qiangxi_ol_dianwei1.mp3 b/audio/skill/qiangxi_ol_dianwei1.mp3 new file mode 100644 index 000000000..633801848 Binary files /dev/null and b/audio/skill/qiangxi_ol_dianwei1.mp3 differ diff --git a/audio/skill/qiangxi_ol_dianwei2.mp3 b/audio/skill/qiangxi_ol_dianwei2.mp3 new file mode 100644 index 000000000..f27322487 Binary files /dev/null and b/audio/skill/qiangxi_ol_dianwei2.mp3 differ diff --git a/audio/skill/sanku1.mp3 b/audio/skill/sanku1.mp3 new file mode 100644 index 000000000..dde3c429a Binary files /dev/null and b/audio/skill/sanku1.mp3 differ diff --git a/audio/skill/sanku2.mp3 b/audio/skill/sanku2.mp3 new file mode 100644 index 000000000..0e6494f12 Binary files /dev/null and b/audio/skill/sanku2.mp3 differ diff --git a/audio/skill/yangkuang1.mp3 b/audio/skill/yangkuang1.mp3 new file mode 100644 index 000000000..10b9d8ea2 Binary files /dev/null and b/audio/skill/yangkuang1.mp3 differ diff --git a/audio/skill/yangkuang2.mp3 b/audio/skill/yangkuang2.mp3 new file mode 100644 index 000000000..8d69f8cad Binary files /dev/null and b/audio/skill/yangkuang2.mp3 differ diff --git a/card/sp.js b/card/sp.js index be32bb5d4..896006861 100644 --- a/card/sp.js +++ b/card/sp.js @@ -16,7 +16,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(evt.jinchan){ var type=get.type(evt.card,'trick'); if(type=='basic'||type=='trick'){ - evt.cancel(); + evt.neutralize(); } } player.draw(2); @@ -544,18 +544,25 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } }, g_jinchan2:{ - trigger:{player:'discardAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, forced:true, + cardSkill:true, filter:function(event,player){ - for(var i=0;i=2&&event.target.isAlive(); @@ -2194,10 +2200,15 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }); "step 1" if(result.bool){ - trigger.untrigger(); - trigger.trigger('shaHit'); - trigger._result.bool=false; - trigger._result.result=null; + if(event.triggername=='shaMiss'){ + trigger.untrigger(); + trigger.trigger('shaHit'); + trigger._result.bool=false; + trigger._result.result=null; + } + else{ + trigger.unneutralize(); + } } }, ai:{ @@ -2570,7 +2581,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ trigger.cancelled=true; } else{ - trigger.cancel(); + trigger.neutralize(); if(event.guowuxie==true){ if(trigger.target.identity!='ye'&&trigger.target.identity!='unknown'){ trigger.getParent().excluded.addArray(game.filterPlayer(function(current){ diff --git a/card/zhulu.js b/card/zhulu.js index 43b062f3d..0cf6e95f3 100644 --- a/card/zhulu.js +++ b/card/zhulu.js @@ -299,7 +299,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ notarget:true, content:function(){ var evt2=event.getParent(3)._trigger; - evt2.cancel(); + evt2.neutralize(); var evt=evt2.getParent(); var next=game.createEvent('caochuan_gain'); _status.event.next.remove(next); diff --git a/character/diy.js b/character/diy.js index 0215f6057..1baf96d73 100755 --- a/character/diy.js +++ b/character/diy.js @@ -86,6 +86,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_kyouko:['female','key',3,['kyouko_rongzhu','kyouko_gongmian']], key_kyou:['female','key',3,['kyou_zhidian','kyou_duanfa']], key_seira:['female','key',3,['seira_xinghui','seira_yuanying']], + key_kiyu:['female','key',3,['kiyu_yuling','kiyu_xianyu']], ns_huangchengyan:['male','shu',3,['nslongyue','nszhenyin']], ns_sunchensunjun:['male','wu',5,['nsxianhai','nsxingchu']], @@ -202,7 +203,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "ns_huangchengyan","ns_sunchensunjun","ns_yuanxi","ns_caoshuang"], diy_yijiang2:["key_yuuki","key_tenzen","key_kyouko","key_kotarou","key_kyou", "ns_chentai","ns_huangwudie","ns_sunyi","ns_zhangning","ns_yanghu"], - diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu','prp_zhugeliang','key_seira'], + diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu','prp_zhugeliang','key_seira','key_kiyu'], diy_tieba:["ns_zuoci","ns_lvzhi","ns_wangyun","ns_nanhua","ns_nanhua_left","ns_nanhua_right","ns_huamulan","ns_huangzu","ns_jinke","ns_yanliang","ns_wenchou","ns_caocao","ns_caocaosp","ns_zhugeliang","ns_wangyue","ns_yuji","ns_xinxianying","ns_guanlu","ns_simazhao","ns_sunjian","ns_duangui","ns_zhangbao","ns_masu","ns_zhangxiu","ns_lvmeng","ns_shenpei","ns_yujisp","ns_yangyi","ns_liuzhang","ns_xinnanhua","ns_luyusheng"], diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu"], diy_xushi:["diy_feishi","diy_hanlong","diy_liufu","diy_liuyan","diy_liuzan","diy_tianyu","diy_xizhenxihong","diy_yangyi","diy_zaozhirenjun"], @@ -305,6 +306,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_tenzen:'#b皋耳击', key_kotarou:'#bb1154486224', key_seira:'#b阿开木木W🍀', + key_kiyu:'#b无面◎隐者', ns_huangchengyan:'#g竹邀月', ns_sunchensunjun:'#gVenusjeu', @@ -527,6 +529,117 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_lucia:['key_shizuru'], }, skill:{ + //天宫希优 + kiyu_yuling:{ + mod:{ + targetEnabled:function(card){ + var info=get.info(card); + if(!info||(info.type!='trick'&&info.type!='delay')) return; + if(info.range) return false; + }, + }, + trigger:{target:'useCardToTargeted'}, + forced:true, + charlotte:true, + filter:function(event,player){ + return event.card.name=='sha'&&event.player.countCards('he')>0; + }, + logTarget:'player', + content:function(){ + trigger.player.chooseToDiscard('he',true,get.distance(trigger.player,player)); + }, + ai:{ + threaten:0.7, + effect:{ + target:function(card,player,target,current){ + if(card.name=='sha') return 0.7; + }, + }, + }, + }, + kiyu_xianyu:{ + trigger:{global:'phaseUseBegin'}, + charlotte:true, + round:1, + filter:function(event,player){ + return event.player.countCards('h')>0; + }, + logTarget:'player', + check:function(event,player){ + var target=event.player; + var next=target.next; + if(target.getSeatNum()>next.getSeatNum()) return true; + if(target.countCards('h')<4&&target.countCards('h',function(card){ + return target.hasUseTarget(card,null,true); + })<2) return false; + return true; + }, + content:function(){ + 'step 0' + var target=trigger.player,cards=target.getCards('h'); + var next=player.chooseToMove('先预:预测'+get.translation(target)+'使用牌的顺序',true); + next.set('list',[ + [get.translation(target)+'的手牌',cards] + ]); + next.set('processAI',function(list){ + var cards=list[0][1].slice(0); + var target=_status.event.getTrigger().player; + cards.sort(function(a,b){ + return get.order(b,target)-get.order(a,target); + }); + return [cards]; + }); + 'step 1' + if(result.bool){ + var list=result.moved[0]; + player.storage.kiyu_xianyu_lastrun=list; + player.addTempSkill('kiyu_xianyu_lastrun',list); + } + }, + subSkill:{ + lastrun:{ + trigger:{global:'phaseUseAfter'}, + forced:true, + charlotte:true, + onremove:true, + content:function(){ + var num=0,index=-1,target=trigger.player; + var cards=player.getStorage('kiyu_xianyu_lastrun'); + var history=target.getHistory('useCard',function(event){ + return event.getParent('phaseUse')==trigger; + }); + for(var evt of history){ + var goon=false; + for(var card of evt.cards){ + var index2=cards.indexOf(card); + if(index2>index){ + goon=true; + index=index2; + } + } + if(goon) num++; + } + if(num>0){ + num=Math.min(3,num); + player.draw(num); + if(target.isIn()){ + target.addTempSkill('kiyu_xianyu_effect'); + target.addMark('kiyu_xianyu_effect',num,false); + } + } + }, + }, + effect:{ + charlotte:true, + onremove:true, + mod:{ + maxHandcard:function(player,num){ + return num+player.countMark('kiyu_xianyu_effect'); + }, + }, + }, + }, + }, //樱庭星罗 seira_xinghui:{ trigger:{player:'phaseZhunbeiBegin'}, @@ -6255,9 +6368,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, kyoko_juwu:{ - trigger:{global:['loseAfter','cardsDiscardAfter']}, + trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter']}, direct:true, filter:function(event,player){ + if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; return player!=event.player&&player!=_status.currentPhase&&event.cards&&event.cards.filter(function(card){ return get.position(card,true)=='d'&&get.type(card,false)=='equip'; }).length>0; @@ -7120,6 +7234,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tomoya_shangxian:{ trigger:{player:'phaseUseBegin'}, mark:true, + locked:true, intro:{ content:function(s){ return '计算与其他角色的距离时始终从'+(s?'逆':'顺')+'时针计算' @@ -8835,14 +8950,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, filter:function(event,player){ if(player!=_status.currentPhase) return false; - if(event.name=='lose'&&event.position!=ui.discardPile) return false; + if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; var list=[]; for(var i=0;i0&&!player.hasSkill('noname_duocai2'); + if(event.type!='discard'||event.getlx===false) return false; + var evt=event.getl(player); + var cards=event.cards.slice(0); + if(evt&&evt.cards) cards.removeArray(evt.cards); + return cards.filterInD('d').length>0&&!player.hasSkill('noname_duocai2'); }, direct:true, charlotte:true, content:function(){ "step 0" if(trigger.delay==false&&player!=game.me&&!player.isOnline()) game.delay(); - var cards=trigger.cards.filterInD('d'); + var evt=trigger.getl(player); + var cards=trigger.cards.slice(0); + cards.removeArray(evt.cards); player.chooseButton([get.prompt('noname_duocai'),cards],[1,cards.length]); "step 1" if(result.bool){ @@ -16665,6 +16785,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ seira_yuanying_info:'出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。', seira_yinyuan:'姻缘', seira_yinyuan_info:'你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。', + key_kiyu:'露娜Q', + kiyu_yuling:'玉灵', + kiyu_yuling_info:'锁定技。你不是有距离限制的锦囊牌的合法目标;你成为【杀】的目标后,使用者需弃置X张牌(X为其至你的距离)。', + kiyu_xianyu:'先预', + kiyu_xianyu_info:'每轮限一次。一名角色的出牌阶段开始时,你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时,你摸X张牌,且其本回合的手牌上限+X(X为你的预测与其实际使用顺序的吻合数且至多为3)。', noname:"小无", noname_zhuyuan:"祝愿", diff --git a/character/extra.js b/character/extra.js index bc8d8b04a..4d576aa6c 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1028,11 +1028,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, tianren:{ audio:2, - trigger:{global:['loseAfter','cardsDiscardAfter']}, + trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter']}, forced:true, filter:function(event,player){ - if(event.name=='lose'){ - if(event.position!=ui.discardPile) return false; + if(event.name.indexOf('lose')==0){ + if(event.getlx===false||event.position!=ui.discardPile) return false; } else{ var evt=event.getParent(); @@ -1643,17 +1643,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dinghan:{ audio:2, - trigger:{target:'useCardToTarget'}, + trigger:{ + target:'useCardToTarget', + player:'addJudgeBefore', + }, forced:true, locked:false, filter:function(event,player){ - return get.type2(event.card)=='trick'&&!player.getStorage('dinghan').contains(event.card.name); + if(event.name=='useCardToTarget'&&get.type(event.card,null,false)!='trick') return false; + return !player.getStorage('dinghan').contains(event.card.name); }, content:function(){ - player.markAuto('dinghan',[trigger.card.name]); - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); + player.markAuto('dinghan',[trigger.card.name]);if(trigger.name=='addJudge'){ + trigger.cancel(); + var owner=get.owner(trigger.card); + if(owner&&owner.getCards('hej').contains(trigger.card)) owner.lose(trigger.card,ui.discardPile); + else game.cardsDiscard(trigger.card); + game.log(trigger.card,'进入了弃牌堆'); + } + else{ + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + } }, onremove:true, intro:{content:'已记录牌名:$'}, @@ -3584,15 +3596,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, renjie2:{ audio:2, - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, forced:true, filter:function(event,player){ - if(event.type!='discard'||!event.cards2) return false; - var evt=event.getParent('phaseDiscard'); - return evt&&evt.name=='phaseDiscard'&&evt.player==player; + if(event.type!='discard'||event.getlx===false) return false; + var evt=event.getParent('phaseDiscard'),evt2=event.getl(player); + return evt&&evt2&&evt.name=='phaseDiscard'&&evt.player==player&&evt2.cards2&&evt2.cards2.length>0; }, content:function(){ - player.addMark('renjie',trigger.cards2.length); + player.addMark('renjie',trigger.getl(player).cards2.length); } }, sbaiyin:{ @@ -5520,8 +5535,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }; }; if(event.list1.length&&event.list2.length){ - target.discard(event.list2).delay=false; - player.discard(event.list1); + game.loseAsync({ + lose_list:[ + [player,event.list1], + [target,event.list2] + ], + }).setContent('discardMultiple'); } else if(event.list2.length){ target.discard(event.list2); @@ -6164,7 +6183,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lingce:'灵策', lingce_info:'锁定技。当有【奇正相生】或智囊或〖定汉①〗记录过的锦囊牌被使用时,若此牌不为转化牌且对应实体牌数量为1,则你摸一张牌。', dinghan:'定汉', - dinghan_info:'①当你成为未记录过的锦囊牌的目标时,你记录此牌名并取消之。②准备阶段,你可在〖定汉①〗的记录中添加或减少一种锦囊牌的牌名。', + dinghan_info:'①当你成为未记录过的普通锦囊牌的目标时,或有未记录过的延时锦囊牌进入你的判定区时,你记录此牌名并取消之。②准备阶段,你可在〖定汉①〗的记录中添加或减少一种锦囊牌的牌名。', shen_sunce:'神孙策', yingba:'英霸', yingba_info:'①出牌阶段限一次,你可令一名体力上限大于1的其他角色减少1点体力上限并获得“平定”标记,然后你减少1点体力上限。②你对拥有“平定”标记的角色使用牌没有距离限制。', diff --git a/character/mobile.js b/character/mobile.js index bc8fb1196..4f5ad6ccd 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -15,7 +15,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mobile_shijiyan:['sp_cuiyan','sp_zhangchangpu','sp_jiangwan','sp_jiangqing','sp_lvfan','sp_huangfusong','sp_zhujun','liuba'], mobile_sunben:["re_sunben"], mobile_standard:["xin_xiahoudun","xin_zhangfei"], - mobile_shenhua:["re_pangtong","re_guanqiujian","xin_yuanshao","re_liushan","re_dongzhuo","re_sp_zhugeliang","re_sunjian","re_dengai","re_jiangwei","re_zhurong","re_caiwenji","re_xunyu"], + mobile_shenhua:["re_pangtong","re_guanqiujian","xin_yuanshao","re_liushan","re_dongzhuo","re_sp_zhugeliang","re_sunjian","re_dengai","re_jiangwei","re_zhurong","re_caiwenji","re_xunyu","re_dianwei"], mobile_yijiang1:["re_xusheng","re_lingtong","ol_yujin","re_wuguotai","re_gaoshun"], mobile_yijiang2:["xin_liaohua","xin_caozhang","re_liubiao","re_handang","xin_chengpu","xin_gongsunzan","re_zhonghui","re_bulianshi"], mobile_yijiang3:["xin_jianyong","xin_zhuran","xin_guohuai","xin_panzhangmazhong","xin_fuhuanghou","re_yufan"], @@ -26,6 +26,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + re_dianwei:["male","wei",4,["reqiangxi"]], xin_mamidi:['male','qun',3,['chengye','buxu']], ruanhui:['female','wei',3,['mingcha','jingzhong']], xin_quancong:['male','wu',4,['sbyaoming']], @@ -642,7 +643,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return false; }, - trigger:{global:['useCardAfter','loseAfter','cardsDiscardAfter']}, + trigger:{global:['useCardAfter','loseAfter','cardsDiscardAfter','loseAsyncAfter']}, forced:true, filter:function(event,player){ if(player==event.player) return false; @@ -651,13 +652,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=event.cards.filterInD(); if(!cards.length) return false; } - else if(event.name=='lose'){ - if(event.position!=ui.discardPile) return false; - var cards=event.cards2.filter(function(card){ - if(get.position(card,true)!='d') return false; + else if(event.name.indexOf('lose')==0){ + if(event.getlx===false||event.position!=ui.discardPile) return false; + var cards=(event.cards2||event.cards).filter(function(card){ + if(card.original=='j'||get.position(card,true)!='d') return false; var type=get.type(card,false); return type=='delay'||type=='equip'; }); + cards.removeArray(event.getl(player).cards); if(!cards.length) return false; } else{ @@ -685,12 +687,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(trigger.name=='useCard'){ cards=trigger.cards.filterInD(); } - else if(trigger.name=='lose'){ - cards=trigger.cards2.filter(function(card){ + else if(trigger.name.indexOf('lose')==0){ + cards=(trigger.cards2|trigger.cards).filter(function(card){ if(get.position(card,true)!='d') return false; var type=get.type(card,false); return type=='delay'||type=='equip'; }); + cards.removeArray(trigger.getl(player).cards); } else{ cards=trigger.cards.filter(function(card){ @@ -3479,7 +3482,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:['chooseToUse','chooseToRespond'], filter:function(event,player){ - return player.getStorage('jibing').length>0&&(event.filterCard({name:'sha'},player,event)||event.filterCard({name:'shan'},player,event)); + return player.getExpansions('jibing').length>0&&(event.filterCard({name:'sha'},player,event)||event.filterCard({name:'shan'},player,event)); }, chooseButton:{ dialog:function(event,player){ @@ -3507,7 +3510,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dialog.content.appendChild(table); } else dialog._cardName=event.filterCard({name:'sha'},player,event)?'sha':'shan'; - dialog.add(player.storage.jibing); + dialog.add(player.getExpansions('jibing')); return dialog; }, filter:function(button){ @@ -3540,17 +3543,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return { audio:'jibing', - filterCard:function(){return false}, - selectCard:-1, - card:card, - viewAs:get.autoViewAs({name:name},card), - card:card, - precontent:function(){ - var card=lib.skill.jibing_backup.card; - player.unmarkAuto('jibing',[card]); - event.result.card={name:event.result.card.name}; - event.result.cards=[card]; + filterCard:function(card){ + return card==lib.skill.jibing_backup.card; }, + selectCard:-1, + position:'s', + viewAs:{name:name}, + card:card, } }, prompt:function(links,player){ @@ -3561,7 +3560,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ respondSha:true, respondShan:true, skillTagFilter:function(player,tag,arg){ - return player.getStorage('jibing').length>0; + return player.getExpansions('jibing').length>0; }, order:function(item,player){ if(player.hasSkill('binghuo')) return 6; @@ -3583,16 +3582,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ trigger.changeToZero(); var cards=get.cards(2); - game.cardsGotoOrdering(cards); - player.markAuto('jibing',cards); - player.$gain2(cards,false); - game.log(player,'将',cards,'置于了武将牌上'); - game.delayx(); + player.addToExpansion(cards,'gain2').gaintag.add('jibing'); }, }, backup:{audio:'jibing'}, }, - intro:{content:'cards',onunmark:'throw'}, + intro:{content:'expansion',markcount:'expansion'}, + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + }, }, wangjing:{ audio:2, @@ -5968,12 +5967,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, discard:{ trigger:{ - global:['loseAfter','cardsDiscardAfter'], + global:['loseAfter','cardsDiscardAfter','loseAsyncAfter'], }, forced:true, locked:false, filter:function(event,player){ - return player.storage.yizhu&&player.storage.yizhu.length&&(event.name!='lose'||event.position==ui.discardPile)&&event.cards.filter(function(i){ + return player.storage.yizhu&&player.storage.yizhu.length&&(event.name=='cardsDiscard'||(event.position==ui.discardPile&&event.getlx!==false))&&event.cards.filter(function(i){ return player.storage.yizhu.contains(i); }).length>0; }, @@ -6591,7 +6590,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ card=game.createCard2('binglinchengxiax',info[0],info[1]); } } - if(!card) card=get.cardPile(name); + if(!card) card=get.cardPile2(name); if(card) player.gain(card,'gain2'); player.removeSkill('mjweipo_effect'); }, @@ -6844,14 +6843,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mjkuanji:{ audio:'fyjianyu', usable:1, - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, direct:true, filter:function(event,player){ - return event.type=='discard'&&event.cards2.filterInD('d').length>0; + if(event.type!='discard') return false; + var evt=event.getl(player); + return evt.cards2.filterInD('d').length>0; }, content:function(){ 'step 0' - player.chooseButton(['宽济:是否将一张牌交给一名其他角色?',trigger.cards2.filterInD('d')]).set('ai',function(button){ + var cards=trigger.getl(player).cards2; + player.chooseButton(['宽济:是否将一张牌交给一名其他角色?',cards.filterInD('d')]).set('ai',function(button){ var player=_status.event.player; if(game.hasPlayer(function(current){ return current!=player&&get.attitude(player,current)>0; @@ -7496,7 +7501,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, guying:{ audio:2, - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, forced:true, usable:1, filter:function(event,player){ @@ -7504,9 +7512,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getParent(); if(evt.name!='useCard'&&evt.name!='respond') return false; } - var target=_status.currentPhase; - if(!event.cards2||event.cards2.length!=1||!target||target==player||!target.isIn()) return false; - return get.position(event.cards2[0])=='d'||target.countCards('he')<0; + var target=_status.currentPhase,evt=event.getl(player); + if(!evt.cards2||evt.cards2.length!=1||!target||target==player||!target.isIn()) return false; + return get.position(evt.cards2[0])=='d'||target.countCards('he')<0; }, logTarget:function(){ return _status.currentPhase; @@ -7515,7 +7523,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' if(trigger.delay===false) game.delayx(); event.target=_status.currentPhase; - event.card=trigger.cards2[0]; + event.card=trigger.getl(player).cards2[0]; 'step 1' player.addMark('guying',1,false); event.addIndex=0; @@ -10649,11 +10657,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jinglve3:{ audio:'jinglve', - trigger:{global:['loseAfter','useCard','phaseAfter','cardsDiscardAfter']}, + trigger:{global:['loseAfter','useCard','phaseAfter','cardsDiscardAfter','loseAsyncAfter']}, filter:function(event,player){ if(event.player&&event.player!=player.storage.jinglve2) return false; if(event.name=='phase') return event.player.getCards('hej').contains(player.storage.jinglve3); if(!event.cards.contains(player.storage.jinglve3)) return false; + if(event.name=='lose'&&event.getlx===false) return false; + else if(event.name=='loseAsync'&&event.position==ui.discardPile){ + var evt=event.getl(player.storage.jinglve2); + if(!evt.cards.contains(player.storage.jinglve3)) return false; + } return event.name=='useCard'||get.position(player.storage.jinglve3,true)=='d'||event.position==ui.discardPile; }, forced:true, @@ -11302,7 +11315,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damage'}, forced:true, popup:false, - locked:false, + //locked:false, audio:'jiuchi', filter:function(event,player){ return event.card&&event.card.name=='sha'&&event.getParent(2).jiu==true&&!player.hasSkill('rejiuchi_air'); @@ -13562,12 +13575,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, rebiaozhao2:{ trigger:{ - global:["loseAfter","cardsDiscardAfter"], + global:["loseAfter","cardsDiscardAfter","loseAsyncAfter"], }, forced:true, audio:"biaozhao", filter:function(event,player){ - if(event.name=='lose'&&(event.position!=ui.discardPile||event.getParent(2).name=='rebiaozhao3')) return false; + if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile||event.getParent(2).name=='rebiaozhao3')) return false; var cards=player.getExpansions('rebiaozhao'); if(!cards.length) return false; var num=get.number(cards[0]); @@ -14503,6 +14516,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:"xinfu_qianchong", trigger:{ player:["useCard","respond","loseAfter"], + global:'loseAsyncAfter', }, frequent:true, filter:function(event,player){ @@ -14513,11 +14527,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i=0;i0; } else{ var evt=event.getParent(); if(evt.name!='orderingDiscard'||!evt.relatedEvent||evt.relatedEvent.player!=player||!['useCard','respond'].contains(evt.relatedEvent.name)) return false; + return event.cards.filterInD('d').length>0; } - return (event.cards2||event.cards).filterInD('d').length>0; }, forced:true, content:function(){ @@ -671,12 +673,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=trigger.getParent().relatedEvent; if((trigger.name=='discard'&&!trigger.delay)||evt&&evt.name=='respond') game.delayx(); 'step 1' - var cards=(trigger.cards2||trigger.cards).filterInD('d'); - player.$gain2(cards); + var cards; + if(trigger.getl) cards=trigger.getl(player).cards2.filterInD('d'); + else cards=trigger.cards.filterInD('d'); if(cards.length==1) event._result={bool:true,links:cards}; else{ var dialog=['遗策:选择要放置的卡牌','
(从左到右为从旧到新,后选择的后置入)
',cards]; - var cards2=player.getStorage('nsyice'); + var cards2=player.getExpansions('nsyice'); + cards2.reverse(); if(cards2.length){ dialog.push('
原有“策”
'); dialog.push(cards2); @@ -686,11 +690,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('cards',cards); } 'step 2' - game.cardsGotoSpecial(result.links); - player.markAuto('nsyice',result.links); - game.delayx(); + player.addToExpansion(result.links,'gain2').gaintag.add('nsyice'); 'step 3' - var storage=player.storage.nsyice; + var storage=player.getExpansions('nsyice'); var bool=false; for(var i=0;ii;j--){ @@ -702,9 +704,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(bool) break; } if(bool){ - event.cards=storage.slice(0); event.cards=storage.splice(i,j-i+1); - player.unmarkAuto('nsyice',event.cards); } else event.finish(); 'step 4' @@ -716,10 +716,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 5' player.chooseButton(['将一张牌置于牌堆顶,将另一张牌置于牌堆底',cards],true); 'step 6' - ui.cardPile.insertBefore(result.links[0].fix(),ui.cardPile.firstChild); - cards.remove(result.links[0]); - ui.cardPile.appendChild(cards[0].fix()); - game.updateRoundNumber(); + player.lose(event.cards,ui.cardPile).set('topper',result.links[0]).insert_index=function(event,card){ + if(card==event.topper) return ui.cardPile.firstChild; + return null; + }; if(_status.dying.length) event.finish(); 'step 7' player.chooseTarget('对一名角色造成1点伤害',true).set('ai',function(target){ @@ -733,8 +733,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.damage('nocard'); } }, + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + }, marktext:'策', - intro:{content:'cards'}, + intro:{ + content:'expansion', + markcount:'expansion', + }, }, //用间篇 yjxuepin:{ @@ -891,10 +898,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.player.skip('phaseJudge'); } else{ - player.lose(card,ui.special,'toStorage'); + trigger.player.addToExpansion(card,player,'giveAuto').gaintag.add('spmingjian_charlotte'); trigger.player.addSkill('spmingjian_charlotte'); - trigger.player.storage.spmingjian_charlotte.add(card); - trigger.player.markSkill('spmingjian_charlotte'); } }, ai:{ @@ -912,14 +917,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(trigger.name=='phase') player.removeSkill(event.name); else trigger.noJudgeTrigger=true; }, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); }, marktext:'鉴', intro:{ name:'明鉴', - content:'cards', - onunmark:'throw', + content:'expansion', + markcount:'expansion', }, }, spshude:{ @@ -1051,7 +1057,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, sphantong:{ - trigger:{player:'loseEnd'}, + trigger:{ + player:'loseEnd', + }, frequent:true, filter:function(event,player){ return event.type=='discard'&&event.getParent(3).name=='phaseDiscard'&&event.cards.filterInD('d').length>0; @@ -1157,36 +1165,39 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(result.bool){ player.logSkill('spyicong'); - if(!player.storage.spyicong) player.storage.spyicong=[]; - player.storage.spyicong.addArray(result.cards); - player.$giveAuto(result.cards.length,player,false); - game.log(player,'扣置了'+get.cnNumber(player.lose(result.cards,'toStorage',ui.special).cards.length)+'张【扈】'); - player.markSkill('spyicong'); + player.addToExpansion(result.cards,player,'give').gaintag.add('spyicong'); } }, mod:{ globalTo:function(from,to,num){ - if(to.storage.spyicong&&to.storage.spyicong.length) return num+to.storage.spyicong.length; + return num+to.getExpansions('spyicong').length; }, }, marktext:'扈', + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + }, intro:{ name:'义从', - content:'cardCount', - onunmark:'throw', + content:function(storage,player){ + return '共有'+get.cnNumber(player.getExpansions('spyicong').length)+'张“扈”'; + }, + markcount:'expansion', }, }, sptuji:{ trigger:{player:'phaseZhunbeiBegin'}, forced:true, filter:function(event,player){ - return player.storage.spyicong&&player.storage.spyicong.length>0; + return player.getExpansions('spyicong').length>0; }, content:function(){ - var num=player.storage.spyicong.length; + var cards=player.getExpansions('spyicong'); + var num=cards.length; player.addMark('sptuji2',num,false); player.addTempSkill('sptuji2'); - player.unmarkSkill('spyicong'); + player.loseToDiscardpile(cards); if(num<=1) player.draw(); }, }, @@ -1285,13 +1296,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ delete player.storage.xinfu_yanyu2; }, trigger:{ - global:["loseAfter","cardsDiscardAfter"], + global:["loseAfter","cardsDiscardAfter","loseAsyncAfter"], }, direct:true, filter:function (event,player){ if(player.storage.xinfu_yanyu2>=3) return false; - //var evt=event.getParent(); - //if(evt&&(evt.name=='useCard'||evt.name=='respond')) return false; + if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; var type=player.storage.xinfu_yanyu; var cards=event.cards; for(var i=0;i=3; + return player.getExpansions('yinling').length>=3; }, content:function(){ 'step 0' - if(player.storage.yinling.length>3){ - player.chooseButton(3,[get.prompt('junwei'),'hidden',player.storage.yinling]).set('ai',function(button){ + var cards=player.getExpansions('yinling'); + if(cards.length>3){ + player.chooseButton(3,[get.prompt('junwei'),'hidden',cards]).set('ai',function(button){ return 1; }); } else{ - player.chooseBool().set('createDialog',[get.prompt('junwei'),'hidden',player.storage.yinling]).set('dialogselectx',true).set('choice',true); - event.cards=player.storage.yinling.slice(0); + player.chooseBool().set('createDialog',[get.prompt('junwei'),'hidden',cards]).set('dialogselectx',true).set('choice',true); + event.cards=cards.slice(0); } 'step 1' if(result.bool){ player.logSkill('junwei'); var cards=event.cards||result.links; - for(var i=0;i0&&player.storage.yinling.length<4; + return player.countCards('he',{color:'black'})>0&&player.getExpansions('yinling').length<4; }, filterTarget:function(card,player,target){ return target.countCards('he')>0&&target!=player; }, - init:function(player){ - player.storage.yinling=[]; - }, check:function(card){ return 6-get.value(card); }, @@ -1947,11 +1937,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.choosePlayerCard('hej',target,true); 'step 1' if(result.bool&&result.links&&result.links.length){ - target.$give(result.links,player,false); - target.lose(result.links,ui.special,'toStorage'); - player.storage.yinling.push(result.links[0]); - player.markSkill('yinling'); - player.syncStorage('yinling'); + player.addToExpansion(result.links,target,'give').gaintag.add('yinling'); } }, ai:{ diff --git a/character/rank.js b/character/rank.js index 096aac82b..32fd2a7ad 100644 --- a/character/rank.js +++ b/character/rank.js @@ -101,6 +101,7 @@ window.noname_character_rank={ 'shen_xunyu', 'shen_guojia', 'yangyan', + 'liuhui', 'key_kamome', 'key_yukine', 'key_inari', @@ -109,6 +110,7 @@ window.noname_character_rank={ 'key_yukito', 'key_yuuki', 'db_key_liyingxia', + 'key_kiyu', ], a:[ 'diy_zaozhirenjun', @@ -273,6 +275,7 @@ window.noname_character_rank={ 'ns_limi', 'jin_zhouchu', 'huojun', + 'xiahouxuan', 'key_misuzu', 'key_sunohara', 'key_umi', @@ -528,6 +531,7 @@ window.noname_character_rank={ 'dc_wangchang', 'fengfang', 'prp_zhugeliang', + 'dukui', ], bp:[ 'chess_diaochan', @@ -812,6 +816,9 @@ window.noname_character_rank={ 're_liufeng', 'huzhao', 'guanhai', + 'zhangfen', + 'ol_dianwei', + 'wangyan', ], b:[ 'diy_feishi', @@ -1051,6 +1058,8 @@ window.noname_character_rank={ 'zhangxun', 'xiahoulingnv', 're_sp_taishici', + 'dc_lvkuanglvxiang', + 'dengzhong', ], bm:[ 'diy_xizhenxihong', @@ -1214,6 +1223,7 @@ window.noname_character_rank={ 'ruanhui', 'xin_mamidi', 'xin_quancong', + 'dc_caiyang', ], c:[ 'xiahoudun', @@ -1430,6 +1440,7 @@ window.noname_character_rank={ 'key_erika', 'key_satomi', 'key_seira', + 'key_kiyu', 'noname', ], epic:[ @@ -1612,6 +1623,8 @@ window.noname_character_rank={ 'ol_xunyu', 'ns_zhonglimu', 'dc_sunru', + 'zhangfen', + 'xiahouxuan', 'prp_zhugeliang', 'key_kano', 'key_haruko', @@ -2027,6 +2040,8 @@ window.noname_character_rank={ 'huzhao', 're_liufeng', 'guanhai', + 'dukui', + 'ol_dianwei', ], junk:[ 'sunshao', diff --git a/character/refresh.js b/character/refresh.js index 5bd9e9b7c..d231a060a 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -6,7 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refresh:{ refresh_standard:["re_caocao","re_simayi","re_guojia","re_zhangliao","re_xuzhu","re_xiahoudun","re_zhangfei","re_zhaoyun","re_guanyu","re_machao","re_zhouyu","re_lvmeng","re_ganning","re_luxun","re_daqiao","re_huanggai","re_lvbu","re_huatuo","re_liubei","re_diaochan","re_huangyueying","re_sunquan","re_sunshangxiang","re_zhenji","re_zhugeliang","re_huaxiong",'re_gongsunzan'], refresh_feng:['caoren','ol_xiahouyuan','re_huangzhong','ol_weiyan','ol_xiaoqiao','zhoutai','re_zhangjiao','xin_yuji'], - refresh_huo:["ol_sp_zhugeliang","ol_xunyu","re_dianwei","re_yanwen","ol_pangtong","ol_yuanshao","ol_pangde","re_taishici"], + refresh_huo:["ol_sp_zhugeliang","ol_xunyu","ol_dianwei","re_yanwen","ol_pangtong","ol_yuanshao","ol_pangde","re_taishici"], refresh_lin:['re_menghuo','ol_sunjian','re_caopi','ol_xuhuang','ol_dongzhuo','ol_zhurong','re_jiaxu','ol_lusu'], refresh_shan:['ol_jiangwei','ol_caiwenji','ol_liushan','re_zhangzhang','re_zuoci','re_sunce','ol_dengai','re_zhanghe'], refresh_yijiang1:['xin_wuguotai','xin_gaoshun','re_caozhi','yujin_yujin','re_masu','xin_xusheng','re_fazheng','xin_lingtong','re_zhangchunhua','dc_xushu'], @@ -20,6 +20,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, connect:true, character:{ + ol_dianwei:['male','wei',4,['olqiangxi','olningwu']], re_sp_taishici:['male','qun',4,['rejixu']], re_liufeng:['male','shu',4,['rexiansi']], ol_xunyu:['male','wei',3,['quhu','oljieming']], @@ -33,7 +34,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_guohuanghou:['female','wei',3,['rejiaozhao','redanxin']], re_xiahoushi:['female','shu',3,['reqiaoshi','reyanyu']], ol_lusu:['male','wu',3,['olhaoshi','oldimeng']], - re_jiaxu:['male','qun',3,['rewansha','luanwu','reweimu']], + re_jiaxu:['male','qun',3,['rewansha','reluanwu','reweimu']], re_guyong:['male','wu',3,['reshenxing','rebingyi']], xin_zhonghui:['male','wei',4,['xinquanji','xinzili']], re_caifuren:['female','qun',3,['reqieting','rexianzhou']], @@ -119,7 +120,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_pangde:['male','qun',4,['mashu','rejianchu']], ol_xuhuang:['male','wei',4,['olduanliang','oljiezi']], ol_sp_zhugeliang:["male","shu",3,["bazhen","rehuoji","rekanpo","cangzhuo"],[]], - re_dianwei:["male","wei",4,["reqiangxi"],[]], re_yanwen:["male","qun",4,["reshuangxiong"],[]], ol_yuanshao:['male','qun',4,['olluanji','olxueyi'],['zhu']], re_menghuo:['male','shu',4,['huoshou','rezaiqi']], @@ -149,6 +149,72 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_xushu:['zhaoyun','sp_zhugeliang'], }, skill:{ + //典韦 + olqiangxi:{ + audio:'qiangxi', + audioname:['ol_dianwei','boss_lvbu3'], + enable:'phaseUse', + usable:2, + filter:function(event,player){ + if(player.hp<1&&!player.hasCard((card)=>lib.skill.olqiangxi.filterCard(card),'he')) return false; + return game.hasPlayer((current)=>lib.skill.olqiangxi.filterTarget(null,player,current)); + }, + filterCard:function(card){ + return get.subtype(card)=='equip1'; + }, + position:'he', + filterTarget:function(card,player,target){ + if(target==player) return false; + var stat=player.getStat()._olqiangxi; + return !stat||!stat.contains(target); + }, + selectCard:function(){ + if(_status.event.player.hp<1) return 1; + return [0,1]; + }, + content:function(){ + var stat=player.getStat(); + if(!stat._olqiangxi) stat._olqiangxi=[]; + stat._olqiangxi.push(target); + if(!cards.length) player.damage('nosource','nocard'); + target.damage('nocard'); + }, + ai:{ + damage:true, + order:8, + result:{ + player:function(player,target){ + if(ui.selected.cards.length) return 0; + if(player.hp>=target.hp) return -0.9; + if(player.hp<=2) return -10; + return get.damageEffect(player,player,player); + }, + target:function(player,target){ + if(!ui.selected.cards.length){ + if(player.hp<2) return 0; + if(player.hp==2&&target.hp>=2) return 0; + if(target.hp>player.hp) return 0; + } + return get.damageEffect(target,player,target); + } + }, + threaten:1.5, + }, + }, + olningwu:{ + audio:2, + trigger:{global:'damageEnd'}, + filter:function(event,player){ + if(player!=event.player&&player!=event.source) return false; + return event.player.getHistory('damage').indexOf(event)==1; + }, + logTarget:'player', + forced:true, + content:function(){ + player.draw(); + player.discardPlayerCard(trigger.player,true,'ej'); + }, + }, //群太史慈 rejixu:{ audio:2, @@ -2271,11 +2337,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //虞翻 xinzongxuan:{ audio:2, - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, filter:function(event,player){ if(event.type!='discard') return false; - for(var i=0;i0&&!current.hasSkillTag('nogain'); })) return false; - for(var i=0;i0; }, @@ -4121,7 +4185,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.loseToDiscardpile(card); "step 1" var num=player.getExpansions('gzquanji').length; - if(num>0) target.draw(num); + if(num>0) target.draw(Math.min(7,num)); "step 2" if(target.countCards('h')>player.countCards('h')){ target.damage(); @@ -5176,8 +5240,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ inherit:'tuntian', filter:function(event,player){ if(player==_status.currentPhase){ - return event.name=='lose'&&event.type=='discard'&&event.cards2.filter(function(card){ - return get.name(card,event.hs.contains(card)?player:false)=='sha'; + if(event.type!='discard') return false; + var evt=event.getl(player); + return evt&&evt.cards2&&evt.cards2.filter(function(i){ + return get.name(i,evt.hs.contains(i)?player:false)==true; }).length>0; }; if(event.name=='gain'&&event.player==player) return false; @@ -6623,12 +6689,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ discard:{ audio:'reluoying', - trigger:{global:'loseAfter'}, + trigger:{global:['loseAfter','loseAsyncAfter']}, filter:function(event,player){ - if(event.type!='discard') return false; - if(event.player==player) return false; - for(var i=0;i0) return 3*att; + return att; + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('olliangyin',target); + game.asyncDraw([player,target].sortBySeat()); + } + else event.finish(); + 'step 2' + game.delayx(); + var num=player.getExpansions('olkongsheng').length; + var check=function(player){ + if(!player.isIn()||player.isHealthy()) return false; + return player.countCards('h')==num; + } + if(check(player)||check(target)){ + var choiceList=[ + '令自己回复1点体力', + '令'+get.translation(target)+'回复1点体力', + ]; + var choices=[]; + if(check(player)) choices.push('选项一'); + else choiceList[0]=''+choiceList[0]+''; + if(check(target)) choices.push('选项二'); + else choiceList[1]=''+choiceList[1]+''; + choices.push('cancel2'); + player.chooseControl(choices).set('choiceList',choiceList).set('prompt','良姻:是否令一名角色回复体力?').set('ai',function(){ + var player=_status.event.player,target=_status.event.getParent().target; + var list=_status.event.controls.slice(0),eff1=0,eff2=0; + if(list.contains('选项一')) eff1=get.recoverEffect(player,player,player); + if(list.contains('选项二')) eff2=get.recoverEffect(target,player,player); + if(eff1>Math.max(0,eff2)) return '选项一'; + if(eff2>0) return '选项二'; + return 'cancel2'; + }); + } + else event.finish(); + 'step 3' + if(result.control=='选项一') player.recover(); + else if(result.control=='选项二') target.recover(); + }, + group:'olliangyin_gain', + subSkill:{ + gain:{ + audio:'liangyin', + trigger:{ + global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + direct:true, + filter:function(event,player){ + var evt=event.getl(player); + return evt&&(evt.xs.length>0||evt.ss.length>0); + }, + usable:1, + content:function(){ + 'step 0' + if(!player.countCards('he')||!game.hasPlayer(function(current){ + return current!=player&¤t.countCards('he')>0; + })) event.finish(); + else player.chooseCardTarget({ + prompt:get.prompt('olliangyin'), + prompt2:'弃置一张牌,并令一名其他角色也弃置一张牌', + position:'he', + filterCard:lib.filter.cardDiscardable, + filterTarget:function(card,player,target){ + return target!=player&&target.countCards('he')>0; + }, + ai1:function(card){ + var player=_status.event.player; + var num=player.getExpansions('olkongsheng').length,hs=player.countCards('h'); + if(get.position(card)!='e') hs--; + if(hs==num&&player.isDamaged()&&get.recoverEffect(player,player,player)>0) return 9-get.value(card); + return 5-get.value(card); + }, + ai2:function(target){ + var player=_status.event.player; + var has=target.hasCard(function(card){ + return get.value(card,target)<=0; + },'e'),att=get.attitude(player,target); + if(!has) att=-att; + return att*has?2:1; + }, + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('olliangyin_gain',target); + player.discard(result.cards); + target.chooseToDiscard('he',true); + } + else event.finish(); + 'step 2' + game.delayx(); + var num=player.getExpansions('olkongsheng').length; + var check=function(player){ + if(!player.isIn()||player.isHealthy()) return false; + return player.countCards('h')==num; + } + if(check(player)||check(target)){ + var choiceList=[ + '令自己回复1点体力', + '令'+get.translation(target)+'回复1点体力', + ]; + var choices=[]; + if(check(player)) choices.push('选项一'); + else choiceList[0]=''+choiceList[0]+''; + if(check(target)) choices.push('选项二'); + else choiceList[1]=''+choiceList[1]+''; + choices.push('cancel2'); + player.chooseControl(choices).set('choiceList',choiceList).set('prompt','良姻:是否令一名角色回复体力?').set('ai',function(){ + var player=_status.event.player,target=_status.event.getParent().target; + var list=_status.event.controls.slice(0),eff1=0,eff2=0; + if(list.contains('选项一')) eff1=get.recoverEffect(player,player,player); + if(list.contains('选项二')) eff2=get.recoverEffect(target,player,player); + if(eff1>Math.max(0,eff2)) return '选项一'; + if(eff2>0) return '选项二'; + return 'cancel2'; + }); + } + else event.finish(); + 'step 3' + if(result.control=='选项一') player.recover(); + else if(result.control=='选项二') target.recover(); + }, + }, + }, + }, + olkongsheng:{ + audio:'kongsheng', + trigger:{player:'phaseZhunbeiBegin'}, + direct:true, + filter:function(event,player){ + return player.countCards('he')>0; + }, + content:function(){ + 'step 0' + player.chooseCard('he',[1,player.countCards('he')],get.prompt('olkongsheng'),'将任意张牌作为“箜”置于武将牌上').set('ai',function(card){ + var player=_status.event.player,num=player.getExpansions('olkongsheng')+ui.selected.cards.length; + if(ui.selected.cards.length>0&&game.hasPlayer(function(current){ + if(current.isHealthy()||get.recoverEffect(current,player,player)<=0) return false; + var num2=current.countCards('h',function(card){ + if(current!=player) return true; + return !ui.selected.cards.contains(card); + })+1; + return num==num2; + })) return 0; + if(get.type(card,null,false)=='equip'){ + for(var i of ui.selected.cards){ + if(get.type(i,null,false)=='equip') return 0; + } + return 5-get.value(card); + } + if(!player.hasValueTarget(card)) return 1; + return 0; + }); + 'step 1' + if(result.bool){ + player.logSkill('olkongsheng'); + player.addToExpansion(result.cards,player,'give').gaintag.add('olkongsheng'); + } + }, + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + }, + intro:{ + content:'expansion', + markcount:'expansion', + }, + group:'olkongsheng_kessoku', + subSkill:{ + kessoku:{ + trigger:{player:'phaseJieshuBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + return player.getExpansions('olkongsheng').filter(function(card){ + return get.type(card,false)!='equip'; + }).length>0; + }, + content:function(){ + 'step 0' + var cards=player.getExpansions('olkongsheng').filter(function(card){ + return get.type(card,false)!='equip'; + }); + if(cards.length) player.gain(cards,'gain2'); + 'step 1' + var cards=player.getExpansions('olkongsheng'); + if(cards.length>0){ + player.chooseTarget(true,'令一名角色使用以下装备牌',get.translation(cards)).set('ai',function(target){ + var player=_status.event.player; + return get.effect(target,{name:'losehp'},player,player); + }); + } + else event.finish(); + 'step 2' + var target=result.targets[0]; + event.target=target; + player.line(target,'green'); + 'step 3' + var cards=player.getExpansions('olkongsheng').filter(function(i){ + return target.hasUseTarget(i); + }); + if(cards.length==1){ + event._result={bool:true,links:cards} + } + else if(cards.length) target.chooseButton(true,['选择要使用的装备牌',cards]).set('ai',function(button){ + return get.order(button.link); + }); + else event.goto(5); + 'step 4' + if(result.bool){ + target.chooseUseTarget(result.links[0],true); + event.goto(3); + } + 'step 5' + target.loseHp(); + }, + }, + }, + }, //新毌丘俭 zhengrong:{ trigger:{player:'useCardToPlayered'}, @@ -1275,7 +1519,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, prompt2:'当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌', filter:function(event,player){ - return event.card.name=='sha'&&event.player.countGainableCards(player,'he')>0&&player.storage.nzry_juzhan==true; + return event.card.name=='sha'&&player.storage.nzry_juzhan==true&&event.target.countGainableCards(player,'he')>0; }, check:function(event,player){ return event.player.countCards('he')>0&&event.targets&&event.targets.length==1; @@ -5473,9 +5717,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return get.damageEffect(target,player); } - } + }, + threaten:1.3, }, - threaten:1.3 }, xinqiangxi:{ audio:'qiangxi', @@ -7300,7 +7544,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xiaoqiao:['ol_xiaoqiao','re_xiaoqiao','xiaoqiao'], yuji:['xin_yuji','re_yuji','yuji'], zhangjiao:['re_zhangjiao','sp_zhangjiao','zhangjiao'], - dianwei:['dianwei','re_dianwei'], + dianwei:['ol_dianwei','re_dianwei','dianwei'], xunyu:['ol_xunyu','re_xunyu','xunyu'], sp_zhugeliang:['ol_sp_zhugeliang','re_sp_zhugeliang','sp_zhugeliang'], pangtong:['ol_pangtong','re_pangtong','pangtong'], @@ -7721,6 +7965,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "guhuo_phase_info":"", xinhongyan:'红颜', xinhongyan_info:'锁定技,你的♠牌和♠判定牌的花色视为♥。一名角色的判定结果生效前,若判定结果为♥,则你将其改为一种花色。', + olliangyin:'良姻', + olliangyin_info:'当有牌发生移动后,若此移动事件是本回合内你拥有〖良姻〗期间的首个有牌移出游戏/移入游戏的事件,则你可以选择一名其他角色。你与其各摸一张牌/弃置一张牌,然后你可以选择你或其中的一名手牌数为X的角色,该角色回复1点体力(X为你的“箜”数)', + olkongsheng:'箜声', + olkongsheng_info:'①准备阶段开始时,你可以将任意张牌置于你的武将牌上,称为“箜”。②结束阶段开始时,若你有不为装备牌的“箜”,则你获得“箜”中的非装备牌,然后令一名角色依次使用“箜”中的装备牌并失去1点体力。', shenhua_feng:'神话再临·风', shenhua_huo:'神话再临·火', diff --git a/character/sp.js b/character/sp.js index 4bfc99fd8..be2c51b5b 100755 --- a/character/sp.js +++ b/character/sp.js @@ -6,11 +6,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterSort:{ sp:{ sp_tianji:["sunhao","liuxie","caoang","hetaihou","sunluyu",'ol_wangrong',"zuofen","ganfuren","ol_bianfuren","qinghegongzhu","tengfanglan","ruiji",'caoxiancaohua'], - sp_sibi:["yangxiu","chenlin","chengyu","shixie","fuwan","wangyun","zhugejin","simalang","maliang","buzhi","dongyun","kanze","sunqian","xizhicai","sunshao",'duxi',"jianggan",'ol_dengzhi','ol_yangyi','ol_dongzhao','ol_chendeng','jin_yanghu','zhaoyǎn'], - sp_tianzhu:["wutugu","yanbaihu","shamoke","panfeng","zhugedan",'huangzu','gaogan',"tadun"], - sp_nvshi:["lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu','ol_xinxianying',"daxiaoqiao"], + sp_sibi:["yangxiu","chenlin","chengyu","shixie","fuwan","wangyun","zhugejin","simalang","maliang","buzhi","dongyun","kanze","sunqian","xizhicai","sunshao",'duxi',"jianggan",'ol_dengzhi','ol_yangyi','ol_dongzhao','ol_chendeng','jin_yanghu','wangyan','xiahouxuan'], + sp_tianzhu:["wutugu","yanbaihu","shamoke","panfeng","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda"], + sp_nvshi:["lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu','ol_xinxianying',"daxiaoqiao","jin_guohuai"], sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','ol_puyuan'], - sp_huben:["caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","fanjiangzhangda","huojun"], + sp_huben:["caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","huojun",'zhaoyǎn','dengzhong'], sp_liesi:['mizhu','weizi'], sp_default:["sp_diaochan","sp_zhaoyun","sp_sunshangxiang","sp_caoren","sp_jiangwei","sp_machao","sp_caiwenji","jsp_guanyu","jsp_huangyueying","sp_pangde","sp_jiaxu","yuanshu",'sp_zhangliao','sp_ol_zhanghe','sp_menghuo'], sp_qifu:["caoying",'panshu',"caochun","yuantanyuanshang",'caoshuang','wolongfengchu','guansuo','baosanniang','fengfangnv','jin_zhouchu'], @@ -28,6 +28,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + jin_guohuai:['female','jin',3,['zhefu','yidu']], + xiahouxuan:['male','wei',3,['olhuanfu','olqingyi','olzeyue']], + dengzhong:['male','wei',4,['dzkanpo','dzgengzhan']], + wangyan:['male','jin',3,['yangkuang','cihuang','sanku']], huojun:['male','shu',4,['qiongshou','fenrui']], caoxiancaohua:['female','qun',3,['huamu','qianmeng','liangyuan','jisi']], jin_zhouchu:['male','jin',4,['shanduan','yilie']], @@ -174,6 +178,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //kaisa:["male","western",4,["zhengfu"]], }, characterIntro:{ + xiahouxuan:'夏侯玄(209年~254年),字泰初(《三国志》等作太初),沛国谯县(今安徽省亳州市)人。三国时期曹魏大臣、思想家、文学家,征南大将军夏侯尚之子,大将军曹爽的表弟。夏侯玄少年有名望,仪表出众,时人称为“朗朗如日月之入怀”。魏文帝黄初六年(225年),袭封昌陵乡侯。魏明帝时,历任散骑黄门侍郎、羽林监。少帝曹芳继位后,拜散骑常侍、中护军,保卫皇宫。后任征西将军,任内与曹爽策划骆谷之役,大失人心。高平陵政变后,被夺去兵权,改任大鸿胪、太常卿。嘉平六年(254年),中书令李丰与外戚张缉密谋杀死大将军司马师,改以夏侯玄执政。事泄被杀,夷灭三族,夏侯玄死时年仅四十六岁。著有文集三卷,如今已佚。政治上,提出了“审官择人”、“除重官”、“改服制”等制度,被太傅司马懿评价“皆大善”。博学多识,才华出众,精通玄学,成为“四聪”之一,与何晏等人开创了魏晋玄学的先河,是早期的玄学领袖人物。', + dengzhong:'邓忠(不详-264年),三国时期曹魏名将邓艾之子。景元五年(264年),钟会谋反事败,士兵哗变,钟会被杀,邓艾部将想追还邓艾父子,但卫瓘却派田续追邓艾,于绵竹西相遇,将邓艾和邓忠等人杀死。直至泰始九年(273年)才恢复名节。', + wangyan:'王衍(256年~311年),字夷甫,琅邪郡临沂县(今山东省临沂市)人。西晋末年重臣,玄学清谈领袖,曹魏幽州刺史王雄之孙、平北将军王乂之子、司徒王戎堂弟。王衍出身琅琊王氏。外表清明俊秀,风姿安详文雅,笃好老庄学说,颇有时名。步入仕途后,历任黄门侍郎、中领军、尚书令、尚书仆射等职。光熙元年(307年),升任司空。次年,又任司徒。王衍位高权重,却不思为国,为保全自己,还让弟弟王澄、族弟王敦分任荆州、青州刺史,遭时人鄙夷。王弥进攻洛阳时,王衍率军抵抗。其后转任太尉兼尚书令,又兼领太傅军司。永嘉五年(311年),东海王司马越去世,王衍奉其灵柩返回东海,途中为羯人石勒所俘获。王衍在与石勒交谈时,仍推脱责任,并劝其称帝,石勒大怒,将其与西晋旧臣一同活埋,时年五十六岁。王衍工书法,尤擅行书,《宣和书谱》有其作品《尊夫人帖》。', caoxiancaohua:'此处为「曹宪」的相关介绍。关于「曹华」的部分请参考原本的介绍。
曹宪(生卒年不详),女,沛国谯县(今安徽省亳州市)人。东汉末年历史人物,汉献帝刘协嫔妃,魏武帝曹操女儿。建安十八年,嫁给汉献帝刘协,受封为贵人。黄初元年(220年),兄弟曹丕称帝后,汉献帝成为山阳公,不知所终。', zhaoyǎn:'赵俨(171~245年),字伯然,颍川阳翟(今河南禹州市)。东汉末年颍川“四大名士”之一,三国时期魏国名臣。熟读经史,精明强干。建安二年,投靠大将军曹操之后,起家朗陵县令,历任司空府掾、司空主薄、都督护军、扶风太守等职。魏文帝曹丕继位后,历任魏国侍中、驸马都尉、河东太守、典农中郎将、度支尚书,封宜土亭侯。魏明帝曹睿时期,历任大司农、骠骑将军、大司空等职。正始六年,去世,时年七十五,谥号为穆。', ruiji:'芮姬,芮玄之女,太子孙登妃,黄武五年卒。', @@ -650,6 +657,556 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //夏侯玄 + olhuanfu:{ + audio:2, + trigger:{ + player:'useCardToPlayered', + target:'useCardToTargeted', + }, + filter:function(event,player){ + if(event.card.name!='sha') return false; + if(player==event.player&&!event.isFirstTarget) return false; + if(event.olhuanfu_map&&event.olhuanfu_map[player.playerid]) return false; + return player.maxHp>0&&player.countCards('he')>0; + }, + shaRelated:true, + direct:true, + content:function(){ + 'step 0' + player.chooseToDiscard('he',[1,player.maxHp],get.prompt('olhuanfu'),'通过弃牌,预测'+(player==trigger.player?'你':get.translation(trigger.player))+'使用的'+get.translation(trigger.card)+'能造成多少伤害。如果弃置的牌数等于总伤害,则你摸两倍的牌。').set('predict',function(){ + var target=trigger.target; + if(player==target){ + if(trigger.targets.length>1||player.hasShan()||get.effect(player,trigger.card,trigger.player,player)==0) return 0; + } + else{ + var target=trigger.target; + if(trigger.targets.length>1||target.mayHaveShan()) return 0; + } + var num=trigger.getParent().baseDamage; + var map=trigger.getParent().customArgs,id=target.playerid; + if(map[id]){ + if(typeof map[id].baseDamage=='number') num=map[id].baseDamage; + if(typeof map[id].extraDamage=='number') num+=map[id].extraDamage; + } + if(target.hasSkillTag('filterDamage',null,{ + player:trigger.player, + card:trigger.card, + })) num=1; + return num; + }()).set('ai',function(card){ + var num=_status.event.predict,player=_status.event.player; + if(ui.selected.cards.length>=num) return 0; + if(player.countCards('he',function(card){ + return get.value(card)<6+num; + })0&¤t<0&&target.countCards('he')>0) return 0.7; + }, + }, + }, + subSkill:{ + lottery:{ + trigger:{global:'useCardAfter'}, + forced:true, + charlotte:true, + filter:function(event,player){ + var map=event.olhuanfu_map; + if(!map||!map[player.playerid]) return false; + var num=0; + event.player.getHistory('sourceDamage',function(evt){ + if(evt.card==event.card&&evt.getParent().type=='card') num+=evt.num; + }); + return num==map[player.playerid]; + }, + content:function(){ + player.draw(2*trigger.olhuanfu_map[player.playerid]); + }, + }, + }, + }, + olqingyi:{ + audio:2, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return player.hasCard(function(card){ + return lib.filter.cardDiscardable(card,player,'olqingyi'); + },'he')&&game.hasPlayer(current=>lib.skill.olqingyi.filterTarget(null,player,current)); + }, + selectTarget:[1,2], + filterTarget:function(card,player,target){ + return target!=player&&target.countCards('he')>0; + }, + multitarget:true, + multiline:true, + content:function(){ + 'step 0' + var list=[player]; + list.addArray(targets); + list.sortBySeat(); + event.list=list; + for(var target of event.list){ + if(!target.hasCard(function(card){ + return lib.filter.cardDiscardable(card,target,'olqingyi'); + },'he')){ + event.finish(); + break; + } + } + 'step 1' + player.chooseCardOL(event.list,'he',true,'清议:选择弃置一张牌',function(card,player){ + return lib.filter.cardDiscardable(card,player,'olqingyi'); + }).set('ai',get.unuseful); + 'step 2' + var lose_list=[],cards=[]; + for(var i=0;ievt.skill=='olqingyi'); + if(!history.length) return false; + var color=false; + for(var evt of history){ + var list=[player]; + list.addArray(evt.targets); + for(var target of list){ + target.getHistory('lose',function(evtx){ + if(color===true||evtx.getParent(2).name!='olqingyi') return false; + for(var card of evtx.cards){ + if(color===true||get.position(card,true)!='d') continue; + var color2=get.color(card,false); + if(!color) color=color2; + else if(color!=color2) color=true; + } + }); + if(color===true) return true; + } + } + return false; + }, + content:function(){ + 'step 0' + var history=player.getHistory('useSkill',(evt)=>evt.skill=='olqingyi'),cards=[]; + for(var evt of history){ + var list=[player]; + list.addArray(evt.targets); + for(var target of list){ + target.getHistory('lose',function(evtx){ + if(evtx.getParent(2).name!='olqingyi') return false; + for(var card of evtx.cards){ + if(get.position(card,true)=='d') cards.add(card); + } + }); + } + } + player.chooseButton(['清议:选择获得两张异色牌',cards],2).set('filterButton',function(button){ + if(!ui.selected.buttons.length) return true; + return get.color(button.link,false)!=get.color(ui.selected.buttons[0].link,false); + }).set('ai',function(button){ + return get.value(button.link,_status.event.player); + }); + 'step 1' + if(result.bool){ + player.logSkill('olqingyi_gain'); + player.gain(result.links,'gain2'); + } + }, + }, + }, + }, + olzeyue:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + limited:true, + skillAnimation:true, + animationColor:'water', + direct:true, + filter:function(event,player){ + var sources=[],history=player.actionHistory; + for(var i=history.length-1;i>=0;i--){ + if(i=0;i--){ + if(i=0) return 0; + return get.threaten(target,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('olzeyue',target); + player.awakenSkill('olzeyue'); + event.target=target; + var skills=target.getStockSkills('一!','五!'); + skills=skills.filter(function(skill){ + var info=get.info(skill); + if(info&&!info.charlotte&&!get.is.locked(skill,target)&&target.hasSkill(skill,null,null,false)) return true; + }); + if(skills.length==1) event._result={control:skills[0]}; + else player.chooseControl(skills).set('prompt','令'+get.translation(target)+'的一个技能失效'); + } + else event.finish(); + 'step 2' + var skill=result.control; + target.disableSkill('olzeyue_'+player.playerid,skill); + target.storage['olzeyue_'+player.playerid]=true; + player.addSkill('olzeyue_round'); + player.markAuto('olzeyue_round',[target]); + if(!player.storage.olzeyue_map) player.storage.olzeyue_map={}; + player.storage.olzeyue_map[target.playerid]=0; + game.log(target,'的技能','#g【'+get.translation(skill)+'】','被失效了'); + }, + ai:{threaten:3}, + subSkill:{ + round:{ + trigger:{global:'roundStart'}, + forced:true, + charlotte:true, + popup:false, + filter:function(event,player){ + var storage=player.getStorage('olzeyue_round'); + for(var source of storage){ + if(source.isIn()&&source.canUse('sha',player,false)) return true; + } + return false; + }, + content:function(){ + 'step 0' + event.targets=player.storage.olzeyue_round.slice(0).sortBySeat(); + event.target=event.targets.shift(); + 'step 1' + var map=player.storage.olzeyue_map; + if(target.storage['olzeyue_'+player.playerid]) map[target.playerid]++; + event.num=map[target.playerid]-1; + if(event.num<=0) event.finish(); + 'step 2' + event.num--; + target.useCard(player,{name:'sha',isCard:true},false,'olzeyue_round'); + 'step 3' + var key='olzeyue_'+player.playerid; + if(target.storage[key]&&player.hasHistory('damage',function(evt){ + return evt.card.name=='sha'&&evt.getParent().type=='card'&&evt.getParent(3)==event; + })){ + for(var skill in target.disabledSkills){ + if(target.disabledSkills[skill].contains(key)) game.log(target,'恢复了技能','#g【'+get.translation(skill)+'】'); + } + delete target.storage[key]; + target.enableSkill(key); + } + if(event.num>0&&player.isIn()&&target.isIn()&&target.canUse('sha',player,false)){ + event.goto(2); + } + else if(event.targets.length>0){ + event.target=event.targets.shift(); + event.goto(1); + } + }, + }, + }, + }, + //邓忠 + dzkanpo:{ + audio:2, + trigger:{source:'damageSource'}, + filter:function(event,player){ + return event.getParent().type=='card'&&event.card&&event.card.name=='sha'&&event.player.countCards('he')>0; + }, + logTarget:'player', + content:function(){ + var suit=get.suit(trigger.card); + var next=player.gainPlayerCard(trigger.player,'h','visible'); + next.set('suit',suit); + next.set('filterButton',function(button){ + var evt=_status.event; + return get.suit(button.link,evt.target)==evt.suit; + }); + }, + group:'dzkanpo_sha', + subSkill:{ + sha:{ + enable:'chooseToUse', + usable:1, + viewAs:{name:'sha'}, + viewAsFilter:function(player){ + return player.countCards('hs')>0; + }, + filterCard:true, + position:'hs', + prompt:'将一张手牌当做【杀】使用', + check:function(card){ + return 6-get.value(card); + }, + ai:{ + respondSha:true, + skillTagFilter:function(player){ + if(player.getStat('skill').dzkanpo_sha) return false; + if(!player.countCards('hs')) return false; + }, + }, + }, + }, + }, + dzgengzhan:{ + audio:2, + trigger:{ + global:['loseAfter','loseAsyncAfter'], + }, + usable:1, + filter:function(event,player){ + if(event.type!='discard'||event.getlx===false||player==_status.currentPhase||!event.isPhaseUsing()) return false; + for(var card of event.cards){ + if(get.position(card,true)=='d'&&get.name(card,event.hs&&event.hs.contains(card)?event.player:false)=='sha') return true; + } + }, + direct:true, + content:function(){ + 'step 0' + var cards=trigger.cards.filter(function(card){ + return (get.position(card,true)=='d'&&get.name(card,trigger.hs&&trigger.hs.contains(card)?trigger.player:false)=='sha') + }); + player.chooseButton(['是否发动【更战】获得一张杀?',cards]).set('ai',function(button){ + return get.value(button.link,_status.event.player); + }); + 'step 1' + if(result.bool){ + player.logSkill('dzgengzhan'); + player.gain(result.links,'gain2'); + } + else player.storage.counttrigger.dzgengzhan--; + }, + group:'dzgengzhan_add', + subSkill:{ + add:{ + audio:'dzgengzhan', + trigger:{global:'phaseJieshuBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + return player!=event.player&&!event.player.hasHistory('useCard',function(evt){ + return evt.card.name=='sha'; + }); + }, + logTarget:'player', + content:function(){ + player.addTempSkill('dzgengzhan_effect',{player:'phaseUseAfter'}); + player.addMark('dzgengzhan_effect',1,false); + game.delayx(); + }, + }, + effect:{ + onremove:true, + charlotte:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('dzgengzhan_effect'); + }, + }, + intro:{content:'使用杀的次数上限+#'}, + }, + }, + }, + //王衍 + yangkuang:{ + audio:2, + trigger:{player:'recoverEnd'}, + filter:function(event,player){ + return player.isHealthy(); + }, + logTarget:function(event,player){ + return _status.currentPhase||player; + }, + check:function(event,player){ + var target=(_status.currentPhase||player); + if(get.attitude(player,target)>0) return true; + if(player.countCards('h')>target.countCards('h')) return true; + if(!target.getCardUsable('sha')) return true; + return false; + }, + content:function(){ + 'step 0' + player.chooseUseTarget('jiu',true); + 'step 1' + var target=_status.currentPhase; + if(target) target.draw('nodelay'); + player.draw(); + }, + }, + cihuang:{ + audio:2, + trigger:{ + global:['eventNeutralized','shaMiss'], + }, + direct:true, + filter:function(event,player){ + if(event.player!=_status.currentPhase||event.targets.length!=1||event.type!='card') return false; + return lib.skill.cihuang.getList(player,event.player,true); + }, + getList:function(player,target,bool){ + var natures=lib.inpile_nature.slice(0); + var tricks=[]; + for(var name of lib.inpile){ + var info=lib.card[name]; + if(!info||info.type!='trick'||info.notarget||((info.selectTarget&&info.selectTarget!=1)&&(info.selectTarget!=-1||!info.toself))) continue; + tricks.push(name); + } + var history=player.actionHistory; + for(var i=history.length-1;i>=0;i--){ + var info=history[i]; + for(var evt of info.useCard){ + var name=evt.card.name; + if(name=='sha'){ + if(evt.card.nature) natures.remove(evt.card.nature); + } + else tricks.remove(name); + }; + if(info.isRound) break; + } + var vcards=[]; + for(var i of natures){ + if(player.canUse({ + name:'sha', + nature:i, + isCard:true, + },target)){ + if(bool) return true; + else vcards.push(['基本','','sha',i]); + } + } + for(var i of tricks){ + if(player.canUse({ + name:i, + isCard:true, + },target)){ + if(bool) return true; + else vcards.push(['锦囊','',i]); + } + } + if(bool) return false; + return vcards; + }, + content:function(){ + 'step 0' + var target=trigger.player; + var list=lib.skill.cihuang.getList(player,target); + player.chooseButton([get.prompt('cihuang',target),'
视为对'+get.translation(target)+'使用以下的一张牌
',[list,'vcard']]).set('ai',function(button){ + var card={ + name:button.link[2], + nature:button.link[3], + isCard:true, + storage:{cihuang:true}, + },player=_status.event.player,target=_status.event.getTrigger().player; + return get.effect(target,card,player,player); + }); + 'step 1' + if(result.bool){ + player.useCard({ + name:result.links[0][2], + nature:result.links[0][3], + isCard:true, + storage:{cihuang:true}, + },false,trigger.player,'cihuang').oncard=function(card,player){ + _status.event.directHit.addArray(game.filterPlayer()); + }; + } + }, + ai:{ + directHit_ai:true, + skillTagFilter:function(player,tag,arg){ + return arg&&arg.card&&arg.card.storage&&arg.card.storage.cihuang; + }, + }, + }, + sanku:{ + audio:2, + trigger:{player:'dying'}, + forced:true, + content:function(){ + 'step 0' + player.loseMaxHp(); + 'step 1' + var num=player.maxHp-player.hp; + if(num>0) player.recover(num); + }, + ai:{halfneg:true}, + }, //霍峻 qiongshou:{ audio:2, @@ -734,7 +1291,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player!=target&&player.countCards('e')>target.countCards('e'); }).set('ai',function(target){ var player=_status.event.player; - var num=player.countCards('h')-target.countCards('h'); + var num=player.countCards('e')-target.countCards('e'); if(get.attitude(player,target)>=0) return 0; if(num>=Math.min(2,player.hp,target.hp)) return get.damageEffect(target,player,player); return 0; @@ -1455,7 +2012,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseTarget(get.prompt('tongxie'),'选择至多两名其他角色作为“同协角色”',lib.filter.notMe,[1,2]).set('ai',function(target){ + player.chooseTarget(get.prompt('tongxie'),'选择至多两名其他角色作为“同协角色”',lib.filter.notMe,[0,2]).set('ai',function(target){ return get.attitude(_status.event.player,target); }); 'step 1' @@ -1803,15 +2360,36 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var subtype=get.subtype(cards[0]); if(subtype!='equip1'&&subtype!='equip2') subtype='others'; var card_map={ - equip1:['wushuangfangtianji','guilongzhanyuedao','chixueqingfeng','bintieshuangji','wutiesuolian','wuxinghelingshan'], - equip2:['linglongshimandai','hongmianbaihuapao','qimenbagua','guofengyupao','huxinjing','heiguangkai'], - others:['shufazijinguan','xuwangzhimian','tianjitu','taigongyinfu','sanlve','zhaogujing'], + equip1:[ + ['diamond',13,'bintieshuangji'], + ['diamond',1,'wuxinghelingshan'], + ['spade',13,'wutiesuolian'], + ['diamond',12,'wushuangfangtianji'], + ['spade',6,'chixueqingfeng'], + ['spade',5,'guilongzhanyuedao'], + ], + equip2:[ + ['club',1,'huxinjing'], + ['club',2,'heiguangkai'], + ['spade',2,'linglongshimandai'], + ['club',1,'hongmianbaihuapao'], + ['spade',2,'qimenbagua'], + ['spade',9,'guofengyupao'], + ], + others:[ + ['diamond',1,'zhaogujing'], + ['spade',5,'sanlve'], + ['club',12,'tianjitu'], + ['spade',2,'taigongyinfu'], + ['diamond',1,'shufazijinguan'], + ['club',4,'xuwangzhimian'], + ], }; if(!_status.olshengong_map) _status.olshengong_map={}; if(!_status.olshengong_maken) _status.olshengong_maken={}; var list=card_map[subtype]; for(var i=0;i0; + if(event.type!='discard'||event.getlx===false||event.getParent('phaseDiscard').player!=player) return false; + var evt=event.getl(player); + return evt&&evt.hs&&evt.hs.length>0; }, content:function(){ - var cards=[]; - for(var i of trigger.hs) cards.add(get.suit(i,player)); + var cards=[],hs=trigger.getl(player).hs; + for(var i of hs) cards.add(get.suit(i,player)); player.addTempSkill('bixiong2',{player:'phaseBegin'}); player.markAuto('bixiong2',cards); }, @@ -5785,10 +6385,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ var suit=get.suit(trigger.card); var number=get.number(trigger.card); - var card=get.cardPile2(function(card){ - return card.suit==suit&&card.number==number; - }); - if(card) player.gain(card,'gain2'); + var cards=[]; + for(var i=0;i0; + }, + filterCard:true, + position:'h', + discard:false, + lose:false, + delay:false, + check:function(cardx){ + var player=_status.event.player; + var num1=get.number(cardx),players=game.filterPlayer(); + var goon=false,effect=0; + for(var current of players){ + var cards=current.getCards('ej',function(card){ + var num=get.number(card); + return num==num1; + }); + if(cards.length){ + goon=true; + var att=get.attitude(player,current); + for(var card of cards){ + if(get.position(card)=='e'){ + var val=get.value(card,current); + if(att<=0) effect+=val; + else effect-=val/2; + } + else{ + var eff=get.effect(current,{name:card.viewAs||card.name},player,player); + effect-=get.sgn(att)*eff; + } + } + } + } + if(goon){ + if(effect>0) return 6+effect-get.value(cardx); + return 0; + } + return game.hasPlayer(function(current){ + return current!=player&&get.attitude(player,current)>0; + })?(6-get.value(cardx)):0; + }, + content:function(){ + 'step 0' + player.showCards(cards,get.translation(player)+'发动了【数合】'); + 'step 1' + event.cards2=[]; + var num1=get.number(cards[0],player); + var lose_list=[],players=game.filterPlayer(); + for(var current of players){ + var cards=current.getCards('ej',function(card){ + var num=get.number(card); + return num==num1; + }); + if(cards.length>0){ + player.line(current,'thunder'); + current.$throw(cards); + lose_list.push([current,cards]); + event.cards2.addArray(cards); + } + } + if(lose_list.length){ + event.lose_list=lose_list; + game.loseAsync({ + lose_list:lose_list, + }).setContent('chooseToCompareLose'); + } + else{ + event.goto(3); + player.chooseTarget(true,lib.filter.notMe,'令一名其他角色获得'+get.translation(event.cards[0])).set('ai',function(target){ + return get.attitude(_status.event.player,target); + }); + } + 'step 2' + var cards=event.cards2; + if(cards.length>0){ + if(event.lose_list) game.delayx(); + player.gain(cards,'gain2'); + } + event.finish(); + 'step 3' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'green'); + target.gain(cards,player,'giveAuto'); + player.addMark('dcliehou',1); + } + }, + ai:{ + order:2, + result:{ + player:1, + }, + }, + }, + dcliehou:{ + audio:2, + trigger:{player:'phaseDrawBegin2'}, + forced:true, + filter:function(event,player){ + return !event.numFixed; + }, + content:function(){ + var num=Math.min(5,1+player.countMark('dcliehou')); + trigger.num+=num; + trigger._dcliehou=num; + }, + group:'dcliehou_discard', + subSkill:{ + discard:{ + trigger:{player:'phaseDrawEnd'}, + forced:true, + filter:function(event,player){ + return typeof event._dcliehou=='number'; + }, + content:function(){ + 'step 0' + var num=trigger._dcliehou; + player.chooseToDiscard(num,'he','弃置'+get.cnNumber(num)+'张牌,或失去1点体力').set('ai',function(card){ + if(_status.event.goon) return 6-get.value(card); + return 26-get.value(card); + }).set('goon',player.hp>Math.max(1,4-num)||get.effect(player,{name:'losehp'},player,player)>0); + 'step 1' + if(!result.bool) player.loseHp(); + }, + }, + }, + marktext:'爵', + intro:{ + name:'列侯(爵)', + name2:'爵', + content:'〖列侯〗的摸牌数+#', + }, + }, + //杜夔 + dcfanyin:{ + audio:2, + trigger:{player:'phaseUseBegin'}, + filter:function(event,player){ + return ui.cardPile.childNodes.length>0; + }, + frequent:true, + content:function(){ + 'step 0' + var card=false; + if(typeof event.num!='number'){ + var num=false; + for(var i=0;i0&&player.canUse('juedou',target)){ + player.useCard({name:'juedou',isCard:true},target,'dcxunji_effect'); + } + 'step 1' + player.unmarkAuto('dcxunji_effect',[target]); + if(!player.storage.dcxunji_effect.length) player.removeSkill('dcxunji_effect'); + }, + group:'dcxunji_loseHp', + }, + loseHp:{ + trigger:{source:'damageSource'}, + forced:true, + popup:false, + filter:function(event,player){ + return event.card&&event.card.name=='juedou'&&event.getParent().skill=='dcxunji_effect'; + }, + content:function(){ + player.loseHp(trigger.num); + }, + }, + }, + }, + dcjiaofeng:{ + audio:2, + trigger:{source:'damageBegin1'}, + forced:true, + usable:1, + filter:function(event,player){ + return player.isDamaged()&&!player.getHistory('sourceDamage').length; + }, + content:function(){ + var num=player.getDamagedHp(); + if(num>0) player.draw(); + if(num>1) trigger.num++; + if(num>2) player.recover(); + }, + }, + //张奋和大风车 + dcwanglu:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + content:function(){ + if(player.isDisabled(5)||player.getEquip('dagongche')){ + var next=player.phaseUse(); + event.next.remove(next); + trigger.getParent().next.push(next); + } + else{ + var card=game.createCard('dagongche','spade',9); + player.$gain2(card); + game.delayx(); + player.equip(card); + } + }, + broadcast:function(player){ + var card=player.getEquip('dagongche'); + if(card) game.broadcast(function(card,storage){ + card.storage=storage; + },card,card.storage); + }, + }, + dcxianzhu:{ + audio:2, + trigger:{source:'damageSource'}, + direct:true, + filter:function(event,player){ + if(!event.card||event.card.name!='sha') return false; + var card=player.getEquip('dagongche'); + if(!card) return false; + var num=0; + for(var i=1;i<=3;i++){ + var key='大攻车选项'+get.cnNumber(i,true); + if(card.storage[key]) num+=card.storage[key]; + } + return num<5; + }, + content:function(){ + 'step 0' + var choiceList=[ + '令【杀】无距离限制且无视防具', + '令【杀】的可选目标数+1', + '令后续的弃牌数量+1', + ]; + var list=[]; + var card=player.getEquip('dagongche'); + for(var i=1;i<=3;i++){ + var key='大攻车选项'+get.cnNumber(i,true); + var num=card.storage[key]; + if(i==1){ + if(!num) list.push('选项一'); + else choiceList[0]=(''+choiceList[0]+'(已强化)'); + } + else{ + list.push('选项'+get.cnNumber(i,true)); + if(num) choiceList[i-1]+=('(已强化'+num+'次)'); + } + } + player.chooseControl(list,'cancel2').set('prompt','是否发动【陷筑】强化【大攻车】?').set('choiceList',choiceList).set('ai',function(){ + var player=_status.event.player,controls=_status.event.controls.slice(0); + var getval=function(choice){ + var card=player.getEquip('dagongche'); + if(choice=='选项一'){ + card.storage.大攻车选项一=1; + var goon=false; + if(game.hasPlayer(function(current){ + var eff1=0,eff2=0; + var cardx={name:'sha',isCard:true}; + if(player.canUse(cardx,current)) eff1=get.effect(current,cardx,player,player); + cardx.storage={dagongche:true}; + if(player.canUse(cardx,current)) eff2=get.effect(current,cardx,player,player); + return (eff2>eff1); + })) goon=true; + delete card.storage.大攻车选项一; + if(goon) return 5; + return 0; + } + else if(choice=='选项二'){ + var num=1; + if(card.storage.大攻车选项二) num+=card.storage.大攻车选项二; + var cardx={name:'sha',isCard:true}; + if(game.countPlayer(function(current){ + return player.canUse(cardx,current)&&get.effect(current,cardx,player,player)>0; + })>num) return 2; + } + else if(choice=='选项三') return 1; + return 0; + }; + var eff=0,current='cancel2'; + for(var i of controls){ + var effx=getval(i); + if(effx>eff){ + eff=effx; + current=i; + } + } + return current; + }); + 'step 1' + if(result.control!='cancel2'){ + player.logSkill('dcxianzhu'); + var card=player.getEquip('dagongche'),key='大攻车'+result.control; + if(!card.storage[key]) card.storage[key]=0; + card.storage[key]++; + lib.skill.dcwanglu.broadcast(player); + } + }, + }, + dcchaixie:{ + audio:2, + trigger:{ + player:['loseAfter'], + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + forced:true, + filter:function(event,player){ + var evt=event.getl(player); + if(!evt||!evt.es||!evt.es.length) return false; + for(var card of evt.es){ + if(card.name=='dagongche'){ + for(var i=1;i<=3;i++){ + if(card.storage['大攻车选项'+get.cnNumber(i,true)]) return true; + } + } + } + return false; + }, + content:function(){ + var num=0; + var evt=trigger.getl(player); + for(var card of evt.es){ + if(card.name=='dagongche'){ + for(var i=1;i<=3;i++){ + var key='大攻车选项'+get.cnNumber(i,true); + if(card.storage[key]) num+=card.storage[key]; + } + } + } + player.draw(num); + }, + }, + dagongche_skill:{ + trigger:{player:'phaseUseBegin'}, + direct:true, + filter:function(event,player){ + var cardx={ + name:'sha', + isCard:true, + storage:{dagongche:true}, + }; + return player.hasUseTarget(cardx); + }, + equipSkill:true, + content:function(){ + var card={ + name:'sha', + isCard:true, + storage:{dagongche:true}, + }; + lib.skill.dcwanglu.broadcast(player); + player.chooseUseTarget(card,'大攻车:是否视为使用【杀】?',false).logSkill='dagongche_skill'; + }, + mod:{ + targetInRange:function(card,player,target){ + if(card.storage&&card.storage.dagongche){ + var cardx=player.getEquip('dagongche'); + if(cardx&&cardx.storage.大攻车选项一) return true; + } + }, + selectTarget:function(card,player,range){ + if(card.storage&&card.storage.dagongche&&range[1]!=-1){ + var cardx=player.getEquip('dagongche'); + if(cardx&&cardx.storage.大攻车选项二) range[1]+=cardx.storage.大攻车选项二; + } + }, + canBeDiscarded:function(card){ + if(card.name=='dagongche'&&get.position(card)=='e'){ + for(var i=1;i<=3;i++){ + if(card.storage['大攻车选项'+get.cnNumber(i,true)]) return; + } + return false; + } + }, + }, + ai:{ + unequip:true, + skillTagFilter:function(player,tag,arg){ + if(!arg||!arg.card||!arg.card.storage||!arg.card.storage.dagongche) return false; + var card=player.getEquip('dagongche'); + if(!card||!card.storage.大攻车选项一) return false; + }, + }, + group:'dagongche_skill_discard', + subSkill:{ + discard:{ + trigger:{source:'damageSource'}, + equipSkill:true, + forced:true, + filter:function(event,player){ + if(!event.card||!event.card.storage||!event.card.storage.dagongche) return false; + if(event.getParent().type!='card') return false; + return event.player.hasCard(function(card){ + return lib.filter.canBeDiscarded(card,event.player,player); + },'he'); + }, + logTarget:'player', + content:function(){ + var num=1; + var cardx=player.getEquip('dagongche'); + if(cardx&&cardx.storage.大攻车选项三) num+=cardx.storage.大攻车选项三; + player.discardPlayerCard(trigger.player,true,num,'he'); + }, + }, + }, + }, + //刘徽 + dcgeyuan:{ + audio:2, + trigger:{ + global:['loseAfter','loseAsyncAfter','cardsDiscardAfter'], + }, + forced:true, + filter:function(event,player){ + if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; + for(var i of event.cards){ + if(lib.skill.dcgeyuan.filterNumber(player,get.number(i,false))) return true; + } + return false; + }, + content:function(){ + 'step 0' + event.cards=trigger.cards.slice(0); + 'step 1' + var card=false; + for(var i of cards){ + if(lib.skill.dcgeyuan.filterNumber(player,get.number(i,false))){ + card=i; + cards.remove(card); + break; + } + } + if(card){ + var number=get.number(card,false); + game.log(player,'将','#y'+get.strNumber(number),'记录为','#g“圆环之弧”'); + player.markAuto('dcgeyuan_homura',[number]); + if(player.getStorage('dcgeyuan').length>player.getStorage('dcgeyuan_homura').length){ + if(cards.length>0) event.redo(); + else event.finish() + } + else if(player.storage.dcgusuan) event.goto(5); + } + else event.finish(); + 'step 2' + var list=player.getStorage('dcgeyuan_homura'); + var num1=list[0],num2=list[list.length-1]; + event.cards2=[]; + var lose_list=[],players=game.filterPlayer(); + for(var current of players){ + var cards=current.getCards('ej',function(card){ + var num=get.number(card); + return num==num1||num==num2; + }); + if(cards.length>0){ + current.$throw(cards); + lose_list.push([current,cards]); + event.cards2.addArray(cards); + } + } + if(lose_list.length){ + event.lose_list=lose_list; + game.loseAsync({ + lose_list:lose_list, + }).setContent('chooseToCompareLose'); + } + 'step 3' + var list=player.getStorage('dcgeyuan_homura'); + var num1=list[0],num2=list[list.length-1]; + var cards=event.cards2; + for(var i=0;i0){ + if(event.lose_list) game.delayx(); + player.gain(cards,'gain2'); + } + 'step 4' + var list=player.getStorage('dcgeyuan_homura'); + var num1=list[0],num2=list[list.length-1]; + player.storage.dcgeyuan_homura=[]; + game.log(player,'清空了','#g“圆环之弧”'); + if(player.getStorage('dcgeyuan').length>3){ + player.unmarkAuto('dcgeyuan',[num1,num2]); + game.log(player,'从','#g“圆环之理”','中移除了','#y'+get.strNumber(num1),'和','#y'+get.strNumber(num2)); + } + event.finish(); + 'step 5' + player.chooseTarget('割圆:选择至多三名角色','第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将所有手牌与牌堆底的牌交换',true,[1,3]); + 'step 6' + if(result.bool){ + var targets=result.targets; + event.targets=targets; + player.line(targets); + targets[0].draw(3); + if(targets.length<2) event.goto(4); + } + else event.goto(4); + 'step 7' + if(targets[1].countCards('he')>0) targets[1].chooseToDiscard('he',true,4); + if(targets.length<3) event.goto(4); + 'step 8' + var target=targets[2]; + var cards=get.bottomCards(5); + game.cardsGotoOrdering(cards); + var hs=target.getCards('h'); + if(hs.length>0) target.lose(hs,ui.cardPile); + target.gain(cards,'draw'); + event.goto(4); + }, + group:'dcgeyuan_qyubee', + filterNumber:function(player,num){ + var list1=player.getStorage('dcgeyuan'); + var list2=player.getStorage('dcgeyuan_homura'); + if(!list1.contains(num)) return false; + if(!list2.length) return true; + if(list2.contains(num)) return false; + var madoka=list1.indexOf(num); + for(var i of list2){ + var homura=list1.indexOf(i); + var dist=Math.abs(madoka-homura); + if(dist==1||dist==list1.length-1) return true; + } + return false; + }, + subSkill:{ + qyubee:{ + audio:'dcgeyuan', + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0)&&!player.storage.dcgusuan; + }, + content:function(){ + var list=[]; + for(var i=1;i<=13;i++){ + list.push(i); + } + list.randomSort(); + player.storage.dcgeyuan=list; + player.markSkill('dcgeyuan'); + var str='#y'; + for(var i=0;i<13;i++){ + str+=get.strNumber(list[i]); + if(i!=12) str+=','; + } + game.log(player,'将','#y“圆环之理”','赋值为',str); + }, + }, + }, + intro:{ + name:'圆环之理', + mark:function(dialog,storage,player){ + var list=storage; + if(!storage||!storage.length) return '(圆环之理尚不存在)'; + var list2=player.getStorage('dcgeyuan_homura'); + var core=document.createElement('div'); + var centerX=-10,centerY=80,radius=80; + var radian=Math.PI*2/list.length; + var fulllist=['A','2','3','4','5','6','7','8','9','10','J','Q','K']; + for(var i=0;i['+fulllist[list[i]-1]+']'; + td.style.position='absolute'; + core.appendChild(td); + td.style.left=(centerX+radius*Math.sin(radian*i))+'px'; + td.style.top=(centerY-radius*Math.cos(radian*i))+'px'; + } + dialog.content.appendChild(core); + }, + }, + }, + dcjieshu:{ + audio:2, + trigger:{player:['useCard','respond']}, + forced:true, + filter:function(event,player){ + var num=get.number(event.card,false); + if(typeof num!='number') return false; + return lib.skill.dcgeyuan.filterNumber(player,num) + }, + content:function(){ + player.draw(); + }, + mod:{ + ignoredHandcard:function(card,player){ + if(!player.getStorage('dcgeyuan').contains(get.number(card))) return true; + }, + cardDiscardable:function(card,player,name){ + if(name=='phaseDiscard'&&!player.getStorage('dcgeyuan').contains(get.number(card))) return false; + }, + }, + }, + dcgusuan:{ + audio:2, + trigger:{global:'phaseEnd'}, + forced:true, + juexingji:true, + skillAnimation:true, + animationColor:'soil', + filter:function(event,player){ + return player.getStorage('dcgeyuan').length==3; + }, + content:function(){ + player.awakenSkill('dcgusuan'); + player.storage.dcgusuan=true; + player.loseMaxHp(); + }, + ai:{combo:'dcgeyuan'}, + derivation:'dcgeyuan_magica', + }, //管亥 suoliang:{ audio:2, @@ -732,9 +1531,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //刘巴 dczhubi:{ audio:2, - trigger:{global:'loseAfter'}, + trigger:{ + global:['loseAfter','loseAsyncAfter'], + }, filter:function(event,player){ - if(event.type!='discard'||event.position!=ui.discardPile) return false; + if(event.type!='discard'||event.getlx===false) return false; for(var i of event.cards){ if(get.suit(i,event.player)=='diamond') return true; } @@ -3586,7 +4387,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(list.length==0) event.goto(3); else{ event.videoId=lib.status.videoId++; - var func=function(skills,id){ + var func=function(skills,id,target){ var dialog=ui.create.dialog('forcebutton'); dialog.videoId=id; dialog.add('令'+get.translation(target)+'获得一个技能'); @@ -3595,8 +4396,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } dialog.addText('
'); } - if(player.isOnline()) player.send(func,list,event.videoId); - else if(player==game.me) func(list,event.videoId); + if(player.isOnline()) player.send(func,list,event.videoId,target); + else if(player==game.me) func(list,event.videoId,target); player.chooseControl(list).set('ai',function(){ var controls=_status.event.controls; if(controls.contains('cslilu')) return 'cslilu'; @@ -4094,12 +4895,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //吉本 xunli:{ audio:2, - trigger:{global:'loseAfter'}, + trigger:{ + global:['loseAfter','loseAsyncAfter'], + }, forced:true, filter:function(event,player){ - if(event.type!='discard'||player.getExpansions('xunli').length>=9) return false; + if(event.type!='discard'||event.getlx===false||player.getExpansions('xunli').length>=9) return false; for(var i of event.cards){ - if(get.color(i,event.cards2.contains(i)?event.player:false)=='black') return true; + if(get.color(i,event.cards2&&event.cards2.contains(i)?event.player:false)=='black') return true; } return false; }, @@ -4108,7 +4911,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=9-player.getExpansions('xunli').length; var cards=[]; for(var i of trigger.cards){ - if(get.color(i,trigger.cards2.contains(i)?trigger.player:false)=='black') cards.push(i); + if(get.color(i,trigger.cards2&&trigger.cards2.contains(i)?trigger.player:false)=='black') cards.push(i); } if(cards.length<=num) event._result={ bool:true, @@ -4796,7 +5599,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ viewAsFilter:function(player){ return player.countCards('hs')>0; }, - selectCard:[1,4], + selectCard:function(){ + return [Math.max(1,ui.selected.targets.length),4]; + }, selectTarget:function(){ var card=get.card(),player=get.player(); if(card==undefined) return; @@ -5558,7 +6363,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.player.chooseTarget(prompt2,[1,num],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){ + }).set('ai',function(target){ var trigger=_status.event.getTrigger(); var player=_status.event.player; return get.effect(target,trigger.card,player,player); @@ -8160,17 +8965,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, gain:{ audio:'zhiwei', - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, forced:true, filter:function(event,player){ - return event.type=='discard'&&event.getParent('phaseDiscard').player==player&&player.storage.zhiwei2&&player.storage.zhiwei2.isIn()&&event.cards2.filterInD('d').length>0; + if(event.type!='discard'||event.getlx===false||event.getParent('phaseDiscard').player!=player||!player.storage.zhiwei2||!player.storage.zhiwei2.isIn()) return false; + var evt=event.getl(player); + return evt&&evt.cards2.filterInD('d').length>0; }, logTarget:function(event,player){ return player.storage.zhiwei2; }, content:function(){ if(trigger.delay===false) game.delay(); - player.storage.zhiwei2.gain(trigger.cards2.filterInD('d'),'gain2'); + player.storage.zhiwei2.gain(trigger.getl(player).cards2.filterInD('d'),'gain2'); }, }, clear:{ @@ -8950,12 +9760,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //杨婉 youyan:{ audio:2, - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, //usable:1, filter:function(event,player){ - if(event.type!='discard'||!event.cards2||!event.cards2.length||player!=_status.currentPhase) return false; + if(event.type!='discard'||event.getlx===false||player!=_status.currentPhase) return false; + var evt=event.getl(player); + if(!evt||!evt.cards2||!evt.card2.length) return false; var list=[]; - for(var i of event.cards2){ + for(var i of evt.cards2){ list.add(get.suit(i,player)); if(list.length>=lib.suit.length) return false; } @@ -8973,7 +9788,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(evt) evt.youyaned=true; } var list=[],cards=[]; - for(var i of trigger.cards2){ + var cards2=trigger.getl(player).cards2; + for(var i of cards2){ list.add(get.suit(i,player)); } for(var i of lib.suit){ @@ -12578,11 +13394,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refenyin:{ audio:2, audioname:['wufan'], - trigger:{global:['loseAfter','cardsDiscardAfter']}, + trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter']}, forced:true, filter:function(event,player){ if(player!=_status.currentPhase) return false; - if(event.name=='lose'&&event.position!=ui.discardPile) return false; + if(event.name.indexOf('lose')==0&&(event.getlx===false||event.position!=ui.discardPile)) return false; var list=[]; var num=event.cards.length; for(var i=0;icurrent!=player)) return false; - for(var i of event.cards2){ + if(player==_status.currentPhase||event.type!='discard'||event.getlx===false||!game.hasPlayer((current)=>current!=player)) return false; + var evt=event.getl(player); + for(var i of evt.cards2){ if(get.color(i,player)=='red'&&get.position(i,true)=='d') return true; } return false; }, content:function(){ 'step 0' - var cards=[]; - for(var i of trigger.cards2){ + var cards=[],cards2=trigger.getl(player); + for(var i of cards2){ if(get.color(i,player)=='red'&&get.position(i,true)=='d') cards.push(i); } player.chooseButton(['从击:选择任意张牌交给其他角色',cards],[1,cards.length]).set('goon',game.hasPlayer(function(current){ diff --git a/character/yijiang.js b/character/yijiang.js index bbbe2f798..ae3aceba5 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -378,9 +378,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //顾雍 olbingyi:{ audio:'bingyi', - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:'loseAsyncAfter', + }, filter:function(event,player){ - return event.type=='discard'&&event.cards2.length>0&&player.countCards('h')>0&&!player.hasSkill('olbingyi_blocker',null,null,false); + return event.type=='discard'&&event.getl(player).cards2.length>0&&player.countCards('h')>0&&!player.hasSkill('olbingyi_blocker',null,null,false); }, prompt2:function(event,player){ var str='展示所有手牌,然后',hs=player.getCards('h'); @@ -3342,6 +3345,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.translation(name); }(target),capt); if(event.togain.length) event.goto(5); + else{ + for(var i=0;i0; })) - for(var i=0;i0&&game.hasPlayer((target)=>(target!=player&&target.countDiscardableCards(player,'he')>0)); + return event.type=='discard'&&event.getParent(3).name!='weishu_discard'&&event.getParent('phaseDiscard').player!=player&&event.getl(player).cards2.length>0&&game.hasPlayer((target)=>(target!=player&&target.countDiscardableCards(player,'he')>0)); }, content:function(){ 'step 0' @@ -871,6 +873,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).setHiddenSkill('ybzhuiji'); 'step 1' if(result.control!='cancel2'){ + player.logSkill('ybzhuiji'); if(result.index==0) player.draw(2); else player.recover(); player.addTempSkill('ybzhuiji_'+result.index,'phaseUseAfter'); @@ -2682,17 +2685,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jyishi:{ audio:2, - trigger:{global:'loseAfter'}, + trigger:{ + global:['loseAfter','loseAsyncAfter'], + }, + usable:1, direct:true, preHidden:true, filter:function(event,player){ - return (event.type=='discard'&&event.hs&&event.hs.filterInD('d').length&&event.player.isAlive()&& - event.player!=player&&event.player.isPhaseUsing()&&!player.hasSkill('jyishi2')); + var target=_status.currentPhase; + if(!target||!target.isIn()||event.type!='discard'||event.getlx===false||!target.isPhaseUsing()) return false; + var evt=event.getl(player); + for(var i of evt.hs){ + if(get.position(i,true)=='d') return true; + } + return false; }, content:function(){ 'step 0' - event.cards=trigger.hs.filterInD('d'); - var str='是否发动【宜室】令'+get.translation(trigger.player)+'获得一张牌'; + event.target=_status.currentPhase; + event.cards=trigger.getl(event.target).hs.filterInD('d'); + var str='是否发动【宜室】令'+get.translation(event.target)+'获得一张牌'; if(event.cards.length>1) str+=',然后获得其余的牌'; str+='?'; player.chooseButton([str,event.cards]).set('ai',function(button){ @@ -2703,22 +2715,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(cards.length==1) return -get.value(card); cards.remove(card); return (get.value(cards)-get.value(card)-2); - }).set('source',trigger.player).setHiddenSkill(event.name); + }).set('source',event.target).setHiddenSkill(event.name); 'step 1' if(result.bool){ - player.addTempSkill('jyishi2'); - player.logSkill('jyishi',trigger.player); + player.logSkill('jyishi',target); if(cards.length>1){ - trigger.player.$gain2(result.links[0]); - trigger.player.gain(result.links[0],'log'); + target.$gain2(result.links[0]); + target.gain(result.links[0],'log'); } else trigger.player.gain(result.links[0],'gain2'); cards.remove(result.links[0]); if(cards.length) player.gain(cards,'gain2'); } + else player.storage.counttrigger.jyishi--; }, }, - jyishi2:{}, + jyishi2:{charlotte:true}, shiduo:{ audio:2, enable:'phaseUse', diff --git a/game/asset.js b/game/asset.js index f96246a25..496796bac 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.116.3', + 'v1.9.117', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -185,6 +185,15 @@ window.noname_asset_list=[ 'audio/die/re_liufeng.mp3', 'audio/die/re_sp_taishici.mp3', 'audio/die/xiahoulingnv.mp3', + 'audio/die/dc_caiyang.mp3', + 'audio/die/dc_lvkuanglvxiang.mp3', + 'audio/die/dengzhong.mp3', + 'audio/die/dukui.mp3', + 'audio/die/liuhui.mp3', + 'audio/die/ol_dianwei.mp3', + 'audio/die/wangyan.mp3', + 'audio/die/xiahouxuan.mp3', + 'audio/die/zhangfen.mp3', 'audio/die/baosanniang.mp3', 'audio/die/beimihu.mp3', @@ -1005,7 +1014,6 @@ window.noname_asset_list=[ 'audio/effect/tie.mp3', 'audio/effect/tori_no_uta.mp3', 'audio/effect/win.mp3', - 'audio/skill/dcliuzhuan1.mp3', 'audio/skill/dcliuzhuan2.mp3', @@ -1041,6 +1049,50 @@ window.noname_asset_list=[ 'audio/skill/xianwang2.mp3', 'audio/skill/xiongrao1.mp3', 'audio/skill/xiongrao2.mp3', + 'audio/skill/cihuang1.mp3', + 'audio/skill/cihuang2.mp3', + 'audio/skill/dcchaixie1.mp3', + 'audio/skill/dcchaixie2.mp3', + 'audio/skill/dcfanyin1.mp3', + 'audio/skill/dcfanyin2.mp3', + 'audio/skill/dcgeyuan1.mp3', + 'audio/skill/dcgeyuan2.mp3', + 'audio/skill/dcgusuan1.mp3', + 'audio/skill/dcgusuan2.mp3', + 'audio/skill/dcjiaofeng1.mp3', + 'audio/skill/dcjiaofeng2.mp3', + 'audio/skill/dcjieshu1.mp3', + 'audio/skill/dcjieshu2.mp3', + 'audio/skill/dcliehou1.mp3', + 'audio/skill/dcliehou2.mp3', + 'audio/skill/dcpeiqi1.mp3', + 'audio/skill/dcpeiqi2.mp3', + 'audio/skill/dcshuhe1.mp3', + 'audio/skill/dcshuhe2.mp3', + 'audio/skill/dcwanglu1.mp3', + 'audio/skill/dcwanglu2.mp3', + 'audio/skill/dcxianzhu1.mp3', + 'audio/skill/dcxianzhu2.mp3', + 'audio/skill/dcxunji1.mp3', + 'audio/skill/dcxunji2.mp3', + 'audio/skill/dzgengzhan1.mp3', + 'audio/skill/dzgengzhan2.mp3', + 'audio/skill/dzkanpo1.mp3', + 'audio/skill/dzkanpo2.mp3', + 'audio/skill/olhuanfu1.mp3', + 'audio/skill/olhuanfu2.mp3', + 'audio/skill/olningwu1.mp3', + 'audio/skill/olningwu2.mp3', + 'audio/skill/olqingyi1.mp3', + 'audio/skill/olqingyi2.mp3', + 'audio/skill/olzeyue1.mp3', + 'audio/skill/olzeyue2.mp3', + 'audio/skill/qiangxi_ol_dianwei1.mp3', + 'audio/skill/qiangxi_ol_dianwei2.mp3', + 'audio/skill/sanku1.mp3', + 'audio/skill/sanku2.mp3', + 'audio/skill/yangkuang1.mp3', + 'audio/skill/yangkuang2.mp3', 'audio/skill/aichen1.mp3', 'audio/skill/aichen2.mp3', @@ -4680,6 +4732,7 @@ window.noname_asset_list=[ 'image/card/lukai_diamond.png', 'image/card/lukai_heart.png', 'image/card/lukai_spade.png', + 'image/card/dagongche.png', 'image/card/bagua.png', 'image/card/baihupifeng.png', @@ -5708,6 +5761,16 @@ window.noname_asset_list=[ 'image/character/lukai.jpg', 'image/character/prp_zhugeliang.jpg', 'image/character/xiahoulingnv.jpg', + 'audio/skill/dc_caiyang.jpg', + 'audio/skill/dc_lvkuanglvxiang.jpg', + 'audio/skill/dengzhong.jpg', + 'audio/skill/dukui.jpg', + 'audio/skill/key_kiyu.jpg', + 'audio/skill/liuhui.jpg', + 'audio/skill/ol_dianwei.jpg', + 'audio/skill/wangyan.jpg', + 'audio/skill/xiahouxuan.jpg', + 'audio/skill/zhangfen.jpg', 'image/character/baiwuchang.jpg', 'image/character/baosanniang.jpg', diff --git a/game/game.js b/game/game.js index 56e110e98..c149a9d08 100644 --- a/game/game.js +++ b/game/game.js @@ -10653,7 +10653,6 @@ },event.chooseTime); } if(event.isMine()){ - ui.arena.classList.add('choose-to-move'); delete ui.selected.guanxing_button; var list=event.list,filterMove=event.filterMove,filterOk=event.filterOk; _status.imchoosing=true; @@ -10682,7 +10681,10 @@ event.dialog.classList.add('scroll1'); event.dialog.classList.add('scroll2'); event.dialog.classList.add('fullwidth'); - event.dialog.classList.add('fullheight'); + if(list.length>1){ + ui.arena.classList.add('choose-to-move'); + event.dialog.classList.add('fullheight'); + } event.moved=[]; var buttonss=[]; @@ -13072,6 +13074,73 @@ } if(event.dialog&&event.dialog.close) event.dialog.close(); }, + discardMultiple:function(){ + 'step 0' + event.type='discard'; + if(!event.position) event.position=ui.discardPile; + var cards=[]; + event.cards=cards; + for(var i=0;i1){ - return -getn(card)-get.value(card)/2+addi; + if(source&&source!=player){ + if((get.attitude(player,source)>1)==Boolean(event.small)) return -getn(card)-get.value(card)/2+addi; + return getn(card)-get.value(card)/2+addi; + } + else{ + if(Boolean(event.small)) return -getn(card)-get.value(card)/2+addi; + return getn(card)-get.value(card)/2+addi; } - return getn(card)-get.value(card)/2+addi; } next.setContent('chooseToCompareMultiple'); } @@ -19619,21 +19692,21 @@ } var player=get.owner(card); var getn=function(card){ - if(player.hasSkill('tianbian')&&get.suit(card)=='heart') return 13*(event.small?-1:1); - return get.number(card)*(event.small?-1:1); + if(player.hasSkill('tianbian')&&get.suit(card)=='heart') return 13; + return get.number(card); } var event=_status.event.getParent(); var to=(player==event.player?event.target:event.player); var addi=(get.value(card)>=8&&get.type(card)!='equip')?-6:0; if(card.name=='du') addi-=5; if(player==event.player){ - if(get.attitude(player,to)>0&&event.small){ + if(Boolean(event.small)){ return -getn(card)-get.value(card)/2+addi; } return getn(card)-get.value(card)/2+addi; } else{ - if(get.attitude(player,to)>0){ + if((get.attitude(player,to)<=0)==Boolean(event.small)){ return -getn(card)-get.value(card)/2+addi; } return getn(card)-get.value(card)/2+addi; @@ -20873,7 +20946,7 @@ map.cards2.addArray(evt.cards2); } }); - if(map.cards.length>0||map.ss.length>0||map.xs.length>0) return map; + return map; }; next.gaintag=[]; return next; @@ -20940,7 +21013,7 @@ map.cards2.addArray(evt.cards2); } }); - if(map.cards.length>0||map.ss.length>0||map.xs.length>0) return map; + return map; }; next.gaintag=[]; return next; @@ -20999,6 +21072,16 @@ next.setContent('lose'); next.getl=function(player){ if(this.getlx!==false&&this.player==player) return this; + return { + player:player, + hs:[], + es:[], + js:[], + ss:[], + xs:[], + cards:[], + cards2:[], + }; }; return next; }, @@ -21389,16 +21472,24 @@ map.cards2.addArray(evt.cards2); } }); - if(map.cards.length>0||map.ss.length>0||map.xs.length>0) return map; + return map; }; return next; }, addJudge:function(card,cards){ var next=game.createEvent('addJudge'); - next.card=card; - next.cards=cards; - if(next.cards==undefined) next.cards=[card]; - if(get.itemtype(next.cards)=='card') next.cards=[next.cards]; + if(get.itemtype(card)=='card'){ + next.card=card; + next.cards=[card]; + } + else{ + next.cards=cards; + if(get.itemtype(next.cards)=='card') next.cards=[next.cards]; + if(typeof card=='string'){ + card={name:card}; + } + next.card=get.autoViewAs(card,next.cards) + } next.player=this; next.setContent('addJudge'); next.getl=function(player){ @@ -21424,7 +21515,7 @@ map.cards2.addArray(evt.cards2); } }); - if(map.cards.length>0||map.ss.length>0||map.xs.length>0) return map; + return map; }; return next; }, @@ -22552,7 +22643,37 @@ this.disabledSkills[skills]=[]; var info=get.info(skills); if(info.ondisable&&info.onremove){ - info.onremove(this); + if(typeof info.onremove=='function'){ + info.onremove(this,skill); + } + else if(typeof info.onremove=='string'){ + if(info.onremove=='storage'){ + delete this.storage[skill]; + } + else{ + var cards=this.storage[skill]; + if(get.itemtype(cards)=='card'){ + cards=[cards]; + } + if(get.itemtype(cards)=='cards'){ + if(this.onremove=='discard'){ + this.$throw(cards); + } + if(this.onremove=='discard'||this.onremove=='lose'){ + game.cardsDiscard(cards); + delete this.storage[skill]; + } + } + } + } + else if(Array.isArray(info.onremove)){ + for(var i=0;i0||map.ss.length>0||map.xs.length>0) return map; + return map; }; if(arg&&get.is.object(arg)){ for(var i in arg) next[i]=arg[i]; @@ -51045,8 +51178,8 @@ isCard:true, cardid:card.cardid, wunature:card.wunature, - storage:card.storage, - cards:card.cards, + storage:get.copy(card.storage), + cards:get.copy(card.cards), }; if(get.itemtype(cards)=='cards'&&!card.cards) next.cards=cards.slice(0); else if(get.itemtype(card)=='card') next.cards=[card]; @@ -53490,7 +53623,9 @@ if(!simple||get.is.phoneLayout()){ var es=node.getCards('e'); for(var i=0;i
'+es[i].outerHTML+'
'+lib.translate[es[i].name+'_info']+'
'); + var cardinfo=lib.card[es[i].name]; + if(cardinfo&&cardinfo.cardPrompt) uiintro.add('
'+es[i].outerHTML+'
'+cardinfo.cardPrompt(es[i])+'
'); + else uiintro.add('
'+es[i].outerHTML+'
'+lib.translate[es[i].name+'_info']+'
'); uiintro.content.lastChild.querySelector('.skill>.card').style.transform=''; } var js=node.getCards('j'); diff --git a/game/update.js b/game/update.js index 555440621..470cd94be 100644 --- a/game/update.js +++ b/game/update.js @@ -1,45 +1,46 @@ window.noname_update={ - version:'1.9.116.3', - update:'1.9.116.2', + version:'1.9.117', + update:'1.9.116.3', changeLog:[ - 'OL霍峻,十周年管亥', - '国战模式晋武将更新与技能调整', - '其他技能调整和bug修复', + '露娜Q', + 'OL界典韦、邓忠、王衍、夏侯玄', + '十周年刘徽、蔡阳、吕旷吕翔、杜夔、张奋', + '其他技能调整和bug修复', 'players://["dc_caiyang","dc_lvkuanglvxiang","dengzhong","dukui","key_kiyu","liuhui","ol_dianwei","wangyan","xiahouxuan","zhangfen"]', ], files:[ - 'card/extra.js', + //'card/extra.js', //'card/gujian.js', - 'card/guozhan.js', + //'card/guozhan.js', //'card/gwent.js', //'card/huanlekapai.js', //'card/mtg.js', - //'card/sp.js', - //'card/standard.js', + 'card/sp.js', + 'card/standard.js', //'card/swd.js', //'card/yunchou.js', //'card/yingbian.js', //'card/yongjian.js', //'card/zhenfa.js', - //'card/zhulu.js', - //'character/diy.js', - //'character/extra.js', + 'card/zhulu.js', + 'character/diy.js', + 'character/extra.js', //'character/hearth.js', //'character/gujian.js', //'character/gwent.js', //'character/hearth.js', 'character/mobile.js', //'character/mtg.js', - //'character/offline.js', + 'character/offline.js', //'character/old.js', //'character/ow.js', 'character/rank.js', 'character/refresh.js', //'character/sb.js', - //'character/shenhua.js', + 'character/shenhua.js', 'character/sp.js', 'character/sp2.js', //'character/standard.js', - //'character/tw.js', + 'character/tw.js', //'character/swd.js', //'character/xianjian.js', //'character/xinghuoliaoyuan.js', @@ -55,7 +56,7 @@ window.noname_update={ //'layout/mobile/layout.css', //'layout/newlayout/global.css', //'layout/nova/layout.css', - //'mode/boss.js', + 'mode/boss.js', //'mode/brawl.js', //'mode/chess.js', //'mode/connect.js', diff --git a/image/card/dagongche.png b/image/card/dagongche.png new file mode 100644 index 000000000..13d7ee2b5 Binary files /dev/null and b/image/card/dagongche.png differ diff --git a/image/character/dc_caiyang.jpg b/image/character/dc_caiyang.jpg new file mode 100644 index 000000000..f16803db1 Binary files /dev/null and b/image/character/dc_caiyang.jpg differ diff --git a/image/character/dc_lvkuanglvxiang.jpg b/image/character/dc_lvkuanglvxiang.jpg new file mode 100644 index 000000000..03b2dce65 Binary files /dev/null and b/image/character/dc_lvkuanglvxiang.jpg differ diff --git a/image/character/dengzhong.jpg b/image/character/dengzhong.jpg new file mode 100644 index 000000000..e01af5fb2 Binary files /dev/null and b/image/character/dengzhong.jpg differ diff --git a/image/character/dukui.jpg b/image/character/dukui.jpg new file mode 100644 index 000000000..084a705c4 Binary files /dev/null and b/image/character/dukui.jpg differ diff --git a/image/character/key_kiyu.jpg b/image/character/key_kiyu.jpg new file mode 100644 index 000000000..69d5f49d1 Binary files /dev/null and b/image/character/key_kiyu.jpg differ diff --git a/image/character/liuhui.jpg b/image/character/liuhui.jpg new file mode 100644 index 000000000..6f6c0494d Binary files /dev/null and b/image/character/liuhui.jpg differ diff --git a/image/character/ol_dianwei.jpg b/image/character/ol_dianwei.jpg new file mode 100644 index 000000000..7e7b4d36e Binary files /dev/null and b/image/character/ol_dianwei.jpg differ diff --git a/image/character/wangyan.jpg b/image/character/wangyan.jpg new file mode 100644 index 000000000..5d89eb81c Binary files /dev/null and b/image/character/wangyan.jpg differ diff --git a/image/character/xiahouxuan.jpg b/image/character/xiahouxuan.jpg new file mode 100644 index 000000000..b2d67dc39 Binary files /dev/null and b/image/character/xiahouxuan.jpg differ diff --git a/image/character/zhangfen.jpg b/image/character/zhangfen.jpg new file mode 100644 index 000000000..1ad9ac1ed Binary files /dev/null and b/image/character/zhangfen.jpg differ diff --git a/mode/boss.js b/mode/boss.js index 9b5573581..5e426e716 100644 --- a/mode/boss.js +++ b/mode/boss.js @@ -2169,14 +2169,19 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, iwasawa_crowbow:{ equipSkill:true, - trigger:{player:'loseAfter'}, + trigger:{ + player:'loseAfter', + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, direct:true, filter:function(event,player){ - return event.hs&&event.hs.length>1&&player.isPhaseUsing(); + var evt=event.getl(player); + return evt&&evt.hs&&evt.hs.length>1&&player.isPhaseUsing(); }, content:function(){ 'step 0' - event.num=trigger.hs.length; + var evt=trigger.getl(player); + event.num=evt.hs.length; player.chooseTarget(get.prompt('iwasawa_crowbow'),'弃置一名其他角色的'+get.cnNumber(event.num)+'张牌',function(card,player,target){ return player!=target&&target.countDiscardableCards(player,'he')>0; }).set('ai',function(target){ @@ -2778,7 +2783,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ //孟婆: "boss_shiyou":{ audio:true, - trigger:{global:'loseEnd'}, + trigger:{global:'loseAfter'}, filter:function(event,player){ var evt=event.getParent(3); return event.type=='discard'&&evt.name=='phaseDiscard'&&evt.player==event.player&&evt.player!=player&&event.cards2&&event.cards2.filterInD('d').length>0; diff --git a/mode/guozhan.js b/mode/guozhan.js index ee00534c2..98c42b5eb 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -532,7 +532,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gz_wuguotai:['female','wu',3,['gzbuyi','ganlu'],['gzskin']], gz_lukang:['male','wu',3,['keshou','zhuwei'],['gzskin']], gz_yuanshu:['male','qun',4,['gzweidi','gzyongsi'],['gzskin']], - gz_zhangxiu:['male','qun',4,['gzfudi','congjian'],['gzskin']], + gz_zhangxiu:['male','qun',4,['gzfudi','gzcongjian'],['gzskin']], gz_jun_caocao:['male','wei',4,['jianan','huibian','gzzongyu','wuziliangjiangdao'],[]], gz_jin_zhangchunhua:['female','jin',3,['gzhuishi','gzqingleng']], @@ -5379,7 +5379,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ 'step 0' var target=trigger.player; event.target=target; - if(player.countDiscardableCards(target,'e')){ + if(!player.countDiscardableCards(target,'e')){ player.draw(); event.finish(); return; @@ -6270,7 +6270,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } }, - congjian:{ + gzcongjian:{ trigger:{ player:'damageBegin3', source:'damageBegin1', @@ -8824,6 +8824,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } }, + gzsanyao:{ + audio:'sanyao', + inherit:'sanyao', + filterTarget:function(card,player,target){ + return target.hp>player.hp||target.countCards('h')>player.countCards('h'); + }, + }, gzzhiman:{ audio:'zhiman', inherit:'zhiman', @@ -10185,6 +10192,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ target.chooseBool(get.prompt('gzyicheng'),'摸一张牌,然后弃置一张牌').set('frequentSkill','gzyicheng'); 'step 1' if(result.bool){ + player.logSkill('gzyicheng',target); target.draw(); target.chooseToDiscard('he',true); } @@ -10257,7 +10265,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(get.type(card)!='equip') return true; return target.isEmpty(get.subtype(card)); }, - prompt:get.prompt2('huyuan'), + prompt:get.prompt2('gzhuyuan'), ai1:function(card){ var player=_status.event.player; if(get.type(card)!='equip') return 0; @@ -10267,11 +10275,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ var player=_status.event.player,card=ui.selected.cards[0]; return get.effect(target,card,player,player); }, - }).setHiddenSkill('huyuan'); + }).setHiddenSkill('gzhuyuan'); 'step 1' if(result.bool){ var target=result.targets[0],card=result.cards[0]; - player.logSkill('huyuan',target); + player.logSkill('gzhuyuan',target); if(get.type(card)=='equip'){ player.$give(card,target,false); game.delayx(); @@ -10809,7 +10817,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return event.name=='addJudge'||(event.card.name!='chiling'&&get.effect(event.target,event.card,event.player,player)<0); }, filter:function(event,player){ - return get.type(event.card,'trick')=='trick'&&get.color(event.card)=='black'; + if(event.name=='addJudge') return get.color(event.card)=='black'; + return get.type(event.card,null,false)=='trick'&&get.color(event.card)=='black'; }, content:function(){ if(trigger.name=='addJudge'){ @@ -10842,7 +10851,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return event.name=='addJudge'||get.effect(event.target,event.card,event.player,player)<0; }, filter:function(event,player){ - return event.card.name=='shunshou'||event.card.name=='lebu'; + return event.card.name==(event.name=='addJudge'?'lebu':'shunshou'); }, content:function(){ if(trigger.name=='addJudge'){ @@ -12543,8 +12552,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gz_zhangxiu:'张绣', gzfudi:'附敌', gzfudi_info:'当你受到伤害后,你可以交给伤害来源一张手牌。若如此做,你对其势力中体力值最大且不小于你的一名角色造成一点伤害。', - congjian:'从谏', - congjian_info:'锁定技,当你于回合外造成伤害,或于回合内受到伤害时,此伤害+1。', + gzcongjian:'从谏', + gzcongjian_info:'锁定技,当你于回合外造成伤害,或于回合内受到伤害时,此伤害+1。', gz_jun_caocao:'君曹操', jianan:'建安', jianan_info:'君主技,只要此武将处于明置状态,你便拥有“五子良将纛”。', @@ -12655,6 +12664,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ qianhuan:'千幻', qianhuan_bg:'幻', qianhuan_info:'当与你势力相同的一名角色受到伤害后,你可以将一张与你武将牌上花色均不同的牌置于你的武将牌上。当一名与你势力相同的角色成为基本牌或锦囊牌的唯一目标时,你可以移去一张“千幻”牌,取消之。', + gzsanyao_info:'出牌阶段限一次。你可以弃置一张牌,对一名手牌数或体力值大于你的角色造成1点伤害。', gzzhiman:'制蛮', gzzhiman_info:'当你对其他角色造成伤害时,你可以防止此伤害。若如此做,你获得其装备区或判定区里的一张牌。然后若该角色与你势力相同,该角色可以变更副将。', @@ -12774,9 +12784,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzduanchang:'断肠', gzduanchang_info:'锁定技,当你死亡时,你令杀死你的角色失去一张武将牌上的所有技能。', gzweimu:'帷幕', - gzweimu_info:'锁定技,当你成为黑色锦囊牌的目标时,取消之。', + gzweimu_info:'锁定技,当你成为黑色普通锦囊牌的目标时,或有黑色延时锦囊牌进入你的判定区时,取消之。', gzqianxun:'谦逊', - gzqianxun_info:'锁定技,当你成为【顺手牵羊】或【乐不思蜀】的目标时,取消之。', + gzqianxun_info:'锁定技,当你成为【顺手牵羊】的目标时,或有【乐不思蜀】进入你的判定区时,取消之。', gzkongcheng:'空城', gzkongcheng_info:'锁定技,当你成为【杀】或【决斗】的目标时,若你没有手牌,则取消之', gzxiaoji:'枭姬', @@ -12823,7 +12833,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzzhaosong:'诏颂', gzzhaosong_info:'每局游戏每项限一次。①一名角色进入濒死状态时,你可以令其回复至2点体力并摸一张牌。②出牌阶段,你可观看一名其他角色的所有暗置武将牌和手牌,然后可以获得其区域内的一张牌。③一名角色使用【杀】选择唯一目标后,你可以为此【杀】增加两个目标。', gzlisi:'离思', - gzlisi:'一名己方角色死亡后,你可以选择〖诏颂〗中的一个已发动过的选项,令其视为未发动过。', + gzlisi_info:'一名己方角色死亡后,你可以选择〖诏颂〗中的一个已发动过的选项,令其视为未发动过。', gzcaiyuan:'才媛', gzcaiyuan_info:'锁定技。结束阶段开始时,若你的手牌数大于本回合开始时的手牌数,则你摸两张牌或回复1点体力。', gzwanyi:'婉嫕',