diff --git a/audio/die/fanjiangzhangda.mp3 b/audio/die/fanjiangzhangda.mp3 new file mode 100644 index 000000000..7793cc399 Binary files /dev/null and b/audio/die/fanjiangzhangda.mp3 differ diff --git a/audio/die/ol_chendeng.mp3 b/audio/die/ol_chendeng.mp3 new file mode 100644 index 000000000..77b86773f Binary files /dev/null and b/audio/die/ol_chendeng.mp3 differ diff --git a/audio/die/re_sunyi.mp3 b/audio/die/re_sunyi.mp3 new file mode 100644 index 000000000..9252cdf0c Binary files /dev/null and b/audio/die/re_sunyi.mp3 differ diff --git a/audio/die/tianyu.mp3 b/audio/die/tianyu.mp3 new file mode 100644 index 000000000..5944fa00b Binary files /dev/null and b/audio/die/tianyu.mp3 differ diff --git a/audio/skill/juesheng1.mp3 b/audio/skill/juesheng1.mp3 new file mode 100644 index 000000000..64a340d46 Binary files /dev/null and b/audio/skill/juesheng1.mp3 differ diff --git a/audio/skill/juesheng2.mp3 b/audio/skill/juesheng2.mp3 new file mode 100644 index 000000000..912cdc546 Binary files /dev/null and b/audio/skill/juesheng2.mp3 differ diff --git a/audio/skill/olfengji1.mp3 b/audio/skill/olfengji1.mp3 new file mode 100644 index 000000000..865708037 Binary files /dev/null and b/audio/skill/olfengji1.mp3 differ diff --git a/audio/skill/olfengji2.mp3 b/audio/skill/olfengji2.mp3 new file mode 100644 index 000000000..5eded07ae Binary files /dev/null and b/audio/skill/olfengji2.mp3 differ diff --git a/audio/skill/olhunzi_re_sunyi1.mp3 b/audio/skill/olhunzi_re_sunyi1.mp3 new file mode 100644 index 000000000..cfa72a668 Binary files /dev/null and b/audio/skill/olhunzi_re_sunyi1.mp3 differ diff --git a/audio/skill/olhunzi_re_sunyi2.mp3 b/audio/skill/olhunzi_re_sunyi2.mp3 new file mode 100644 index 000000000..9ab22c6cf Binary files /dev/null and b/audio/skill/olhunzi_re_sunyi2.mp3 differ diff --git a/audio/skill/saodi1.mp3 b/audio/skill/saodi1.mp3 new file mode 100644 index 000000000..d2b86d98f Binary files /dev/null and b/audio/skill/saodi1.mp3 differ diff --git a/audio/skill/saodi2.mp3 b/audio/skill/saodi2.mp3 new file mode 100644 index 000000000..e28a18071 Binary files /dev/null and b/audio/skill/saodi2.mp3 differ diff --git a/audio/skill/syjiqiao1.mp3 b/audio/skill/syjiqiao1.mp3 new file mode 100644 index 000000000..b65d9fb45 Binary files /dev/null and b/audio/skill/syjiqiao1.mp3 differ diff --git a/audio/skill/syjiqiao2.mp3 b/audio/skill/syjiqiao2.mp3 new file mode 100644 index 000000000..af11312b2 Binary files /dev/null and b/audio/skill/syjiqiao2.mp3 differ diff --git a/audio/skill/syxiongyi1.mp3 b/audio/skill/syxiongyi1.mp3 new file mode 100644 index 000000000..d19c3b6f1 Binary files /dev/null and b/audio/skill/syxiongyi1.mp3 differ diff --git a/audio/skill/syxiongyi2.mp3 b/audio/skill/syxiongyi2.mp3 new file mode 100644 index 000000000..faabcc54b Binary files /dev/null and b/audio/skill/syxiongyi2.mp3 differ diff --git a/audio/skill/yuanchou1.mp3 b/audio/skill/yuanchou1.mp3 new file mode 100644 index 000000000..3d449439f Binary files /dev/null and b/audio/skill/yuanchou1.mp3 differ diff --git a/audio/skill/yuanchou2.mp3 b/audio/skill/yuanchou2.mp3 new file mode 100644 index 000000000..2ab2a52bf Binary files /dev/null and b/audio/skill/yuanchou2.mp3 differ diff --git a/audio/skill/zhuitao1.mp3 b/audio/skill/zhuitao1.mp3 new file mode 100644 index 000000000..15dad1e08 Binary files /dev/null and b/audio/skill/zhuitao1.mp3 differ diff --git a/audio/skill/zhuitao2.mp3 b/audio/skill/zhuitao2.mp3 new file mode 100644 index 000000000..4402e13ef Binary files /dev/null and b/audio/skill/zhuitao2.mp3 differ diff --git a/card/guozhan.js b/card/guozhan.js index a3f9716ab..3cf034c4b 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -1149,6 +1149,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ intro:{ name:'诏书', mark:function(dialog,content,player){ + var content=player.getExpansions('zhaoshu_skill'); dialog.add(content); dialog.addText('
  • 与你势力相同的角色的出牌阶段限一次,其可以将一张手牌(小势力角色改为至多两张)置于【诏书】上,称为“应”。
  • 出牌阶段限一次,若你的“应”中包含至少四种花色,则你可以发动“锦囊召唤”,将所有“应”置入弃牌堆,然后随机获得一张未加入游戏的势力锦囊牌。',false); var cards=player.getExpansions('zhaoshu_cards'); diff --git a/card/standard.js b/card/standard.js index e6680e06d..42c673bdc 100644 --- a/card/standard.js +++ b/card/standard.js @@ -2109,6 +2109,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ player.storage.qinggang2.remove(trigger.card); if(!player.storage.qinggang2.length) player.removeSkill('qinggang2'); }, + mark:true, + marktext:'※', + intro:{content:'当前防具技能已失效'}, }, qinglong_skill:{ equipSkill:true, @@ -2845,6 +2848,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ shandian_info:'出牌阶段,对自己使用。若判定结果为黑桃2~9,则目标角色受到3点雷电伤害。若判定不为黑桃2~9,将之移动到下家的判定区里。', icesha_skill:'冰杀', icesha_skill_info:'防止即将造成的伤害,改为依次弃置其两张牌。', + qinggang2:'破防', }, list:[ ["spade",7,"sha"], diff --git a/character/extra.js b/character/extra.js index 3b840a525..233aa94a1 100755 --- a/character/extra.js +++ b/character/extra.js @@ -3945,6 +3945,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "nzry_longnu":{ mark:true, locked:true, + zhuanhuanji:true, marktext:'龙', intro:{ content:function(storage,player,skill){ diff --git a/character/hearth.js b/character/hearth.js index 1851e7e12..aa2ef6bd6 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -2763,9 +2763,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, moxie:{ - trigger:{player:'duBegin'}, + trigger:{player:'loseHpBegin'}, forced:true, + filter:(event)=>event.type=='du', content:function(){ + trigger.cancel(); player.draw(2); }, ai:{ @@ -9789,7 +9791,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ fuhua2:'腐化', fuhua_info:'出牌阶段,你可以将一张毒交给一名没有魔血技能的其他角色,该角色选择一项:1. 获得技能魔血,此后每个结束阶段需交给你一张手牌;2. 视为你对其使用一张决斗', moxie:'魔血', - moxie_info:'锁定技,你失去毒时不流失体力;你使用毒时摸两张牌;结束阶段,你将一张随机手牌转化为毒', + moxie_info:'锁定技,当你因【毒】失去体力时,你改为摸两张牌;结束阶段,你将一张随机手牌转化为毒。', gfuhun:'附魂', gfuhun_info:'结束阶段,若你未翻面,你可以和一名其他角色拼点,若你赢,你将武将牌翻至背面,该角色进入混乱状态直到下一回合结束', hlongyi:'龙裔', diff --git a/character/mobile.js b/character/mobile.js index a9d0ce566..16a195bdd 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -6781,12 +6781,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, muzhen1:{}, muzhen2:{}, + sheyi2:{charlotte:true}, sheyi:{ audio:2, trigger:{global:'damageBegin4'}, direct:true, filter:function(event,player){ - return player!=event.player&&event.player.hp=Math.max(1,player.hp); + return !player.hasSkill('sheyi2')&&player!=event.player&&event.player.hp=Math.max(1,player.hp); }, content:function(){ 'step 0' @@ -6806,6 +6807,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ var target=trigger.player; player.logSkill('sheyi',target); + player.addTempSkill('sheyi2','roundStart'); target.gain(result.cards,player,'giveAuto'); trigger.cancel(); } @@ -16013,7 +16015,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rejieyue_info:'结束阶段开始时,你可以将一张牌交给一名其他角色。然后其选择一项:令你摸三张牌:或其保留一张手牌和装备区的牌,然后弃置其余的牌。', caizhenji:'蔡贞姬', sheyi:'舍裔', - sheyi_info:'当有体力值小于你的其他角色受到伤害时,你可以交给其至少X张牌并防止此伤害(X为你的体力值)。', + sheyi_info:'每轮限一次。当有体力值小于你的其他角色受到伤害时,你可以交给其至少X张牌并防止此伤害(X为你的体力值)。', tianyin:'天音', tianyin_info:'锁定技,结束阶段开始时,你从牌堆中获得每种本回合未使用过的类型的牌各一张。', xiangchong:'向宠', @@ -16205,7 +16207,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yiyong_info:'当你受到其他角色造成的渠道为【杀】的伤害后,若你的装备区内有武器牌,则你可以获得此【杀】对应的所有实体牌,然后将这些牌当做【杀】对伤害来源使用(无距离限制)。若其装备区内没有武器牌,则此伤害+1。', shanxie:'擅械', shanxie_info:'①出牌阶段限一次,你可选择一项:⒈从牌堆中获得一张武器牌。⒉获得其装备区内的一张武器牌并使用,然后其将一张手牌当做【杀】对你使用。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。', - sunyi:'孙翊', + sunyi:'手杀孙翊', zaoli:'躁厉', zaoli_info:'锁定技。①你不能于回合内使用你手牌中不为本回合获得的牌。②当你使用或打出手牌时,你获得一个“厉”(至多4个)。③回合开始时,若你有“厉”,则你移去所有“厉”并弃置任意张牌,然后摸X+Y张牌。若X大于2,你失去1点体力(X为你移去的标记数,Y为你弃置的牌数)。', sp_gaolan:'手杀高览', diff --git a/character/old.js b/character/old.js index 7742b030e..581546ce2 100755 --- a/character/old.js +++ b/character/old.js @@ -5,7 +5,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterSort:{ old:{ old_standard:['ol_yuanshu'], - old_shenhua:["yuji","zhangjiao","old_zhugezhan","old_guanqiujian","xiahouyuan","weiyan","xiaoqiao","pangde"], + old_shenhua:["yuji","zhangjiao","old_zhugezhan","old_guanqiujian","xiahouyuan","weiyan","xiaoqiao","pangde","xuhuang"], old_refresh:["old_zhangfei","old_huatuo","old_zhaoyun","ol_huaxiong"], old_yijiang1:["masu","xushu","xin_yujin","old_xusheng","old_lingtong","fazheng"], old_yijiang2:["old_zhonghui"], @@ -19,6 +19,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + xuhuang:['male','wei',4,['gzduanliang']], junk_simayi:['male','jin',3,['buchen','smyyingshi','xiongzhi','quanbian'],['hiddenSkill']], fazheng:['male','shu',3,['enyuan','xuanhuo']], ol_yuanshu:['male','qun',4,['wangzun','tongji']], diff --git a/character/rank.js b/character/rank.js index 08a11557b..bb8850cc9 100644 --- a/character/rank.js +++ b/character/rank.js @@ -96,6 +96,7 @@ window.noname_character_rank={ 'guansuo', 'yuantanyuanshang', 'dongyun', + 're_sunyi', 'shen_xunyu', 'shen_guojia', 'key_kamome', @@ -741,6 +742,8 @@ window.noname_character_rank={ 'wangyue', 'xin_sunxiu', 'sp_maojie', + 'ol_xuhuang', + 'ol_zhuling', ], b:[ 'diy_feishi', @@ -954,6 +957,8 @@ window.noname_character_rank={ 're_xiahoushi', 'sp_yangwan', 'wangtao', + 'tianyu', + 'fanjiangzhangda', ], bm:[ 'diy_xizhenxihong', @@ -1283,6 +1288,7 @@ window.noname_character_rank={ 'ol_dingyuan', 'wujing', 'yangwan', + 're_sunyi', 'shen_guojia', 'shen_taishici', 'shen_xunyu', @@ -1844,6 +1850,8 @@ window.noname_character_rank={ 'wuyan', 'sp_maojie', 'sp_zhujun', + 'ol_chendeng', + 'ol_xuhuang', ], junk:[ 'sunshao', @@ -1863,6 +1871,8 @@ window.noname_character_rank={ 're_chenqun', 'sp_ol_zhanghe', 'key_youta', + 'sp_xujing', + 'fanjiangzhangda', ], } }; diff --git a/character/refresh.js b/character/refresh.js index bd7e435c0..0b6f44dce 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -7,7 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refresh_standard:["re_caocao","re_simayi","re_guojia","re_lidian","re_zhangliao","re_xuzhu","re_xiahoudun","re_zhangfei","re_zhaoyun","re_guanyu","re_machao","re_xushu","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","re_xunyu","re_dianwei","re_yanwen","ol_pangtong","ol_yuanshao","ol_pangde","re_taishici"], - refresh_lin:['re_menghuo','ol_sunjian','re_caopi','re_xuhuang','ol_dongzhuo','ol_zhurong','re_jiaxu','ol_lusu'], + refresh_lin:['re_menghuo','ol_sunjian','re_caopi','ol_xuhuang','ol_dongzhuo','ol_zhurong','re_jiaxu','ol_lusu'], refresh_shan:['ol_jiangwei','re_caiwenji','ol_liushan','re_zhangzhang','re_zuoci','re_sunce','ol_dengai'], refresh_yijiang1:['re_wuguotai','re_gaoshun','re_caozhi','yujin_yujin','re_masu','xin_xusheng','re_fazheng','xin_lingtong','re_zhangchunhua'], refresh_yijiang2:['old_madai','re_wangyi','guanzhang','xin_handang','xin_zhonghui','re_liaohua','re_chengpu','re_caozhang','re_bulianshi','xin_liubiao'], @@ -68,7 +68,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_zhangyi:['male','shu',5,['rewurong','reshizhi']], re_wuguotai:['female','wu',3,['reganlu','buyi']], re_gaoshun:['male','qun',4,['rexianzhen','rejinjiu']], - re_caocao:['male','wei',4,['new_rejianxiong','hujia'],['zhu']], + re_caocao:['male','wei',4,['new_rejianxiong','rehujia'],['zhu']], re_simayi:['male','wei',3,['refankui','reguicai']], re_guojia:['male','wei',3,['tiandu','new_reyiji']], re_lidian:['male','wei',3,['xunxun','wangxi']], @@ -108,7 +108,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_xiaoqiao:['female','wu',3,['oltianxiang','olhongyan','piaoling']], zhoutai:['male','wu',4,['buqu','fenji']], ol_pangde:['male','qun',4,['mashu','rejianchu']], - re_xuhuang:['male','wei',4,['duanliang','jiezi']], + ol_xuhuang:['male','wei',4,['olduanliang','oljiezi']], ol_sp_zhugeliang:["male","shu",3,["bazhen","rehuoji","rekanpo","cangzhuo"],[]], re_xunyu:["male","wei",3,["quhu","rejieming"],[]], re_dianwei:["male","wei",4,["reqiangxi"],[]], @@ -141,6 +141,123 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_xushu:['zhaoyun','sp_zhugeliang'], }, skill:{ + //徐晃 + olduanliang:{ + audio:2, + enable:'chooseToUse', + filterCard:function(card){ + return (get.type2(card)!='trick'&&get.color(card)=='black'); + }, + filter:function(event,player){ + return player.hasCard((card)=>(get.type2(card)!='trick'&&get.color(card)=='black'),'hes'); + }, + position:'hes', + viewAs:{name:'bingliang'}, + prompt:'将一张黑色非锦囊牌当做兵粮寸断使用', + check:function(card){return 6-get.value(card)}, + ai:{ + order:9 + }, + mod:{ + targetInRange:function(card,player,target){ + if(card.name=='bingliang'&&!player.getStat('damage')) return true; + }, + }, + }, + oljiezi:{ + audio:2, + trigger:{global:['phaseDrawSkipped','phaseDrawCancelled']}, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('oljiezi'),'你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。').set('ai',function(target){ + var att=get.attitude(_status.event.player,target); + if(!target.hasMark('oljiezi')&&target.isMinHandcard()) att*=2; + return att; + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('oljiezi',target); + if(!target.hasMark('oljiezi')&&target.isMinHandcard()) target.addMark('oljiezi',1); + else target.draw(); + } + }, + marktext:'辎', + intro:{ + name2:'辎', + content:'mark', + onunmark:true, + }, + group:'oljiezi_extra', + subSkill:{ + extra:{ + audio:'oljiezi', + trigger:{global:'phaseDrawAfter'}, + forced:true, + filter:function(event,player){ + return event.player.hasMark('oljiezi'); + }, + logTarget:'player', + content:function(){ + var next=trigger.player.phaseDraw(); + event.next.remove(next); + trigger.getParent().next.add(next); + trigger.player.removeMark('oljiezi',trigger.player.countMark('oljiezi')); + }, + }, + }, + }, + //界护驾 + rehujia:{ + audio:'hujia', + inherit:'hujia', + filter:function(event,player){ + if(event.responded) return false; + if(player.storage.hujiaing) return false; + if(!player.hasZhuSkill('rehujia')) return false; + if(!event.filterCard({name:'shan'},player,event)) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wei'; + }); + }, + ai:{ + respondShan:true, + skillTagFilter:function(player){ + if(player.storage.hujiaing) return false; + if(!player.hasZhuSkill('rehujia')) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wei'; + }); + }, + }, + group:'rehujia_draw', + subSkill:{ + draw:{ + trigger:{global:['useCard','respond']}, + usable:1, + direct:true, + filter:function(event,player){ + return event.card.name=='shan'&&event.player!=player&&event.player.group=='wei'&&event.player.isIn()&& + event.player!=_status.currentPhase&&player.hasZhuSkill('rehujia'); + }, + content:function(){ + 'step 0' + trigger.player.chooseBool('护驾:是否令'+get.translation(player)+'摸一张牌?').set('ai',function(){ + var evt=_status.event; + return get.attitude(evt.player,evt.getParent().player)>0; + }); + 'step 1' + if(result.bool){ + player.logSkill('rehujia'); + trigger.player.line(player,'fire'); + player.draw(); + } + else player.storage.counttrigger.rehujia_draw--; + }, + }, + }, + }, //夏侯氏 reqiaoshi:{ audio:2, @@ -2158,16 +2275,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ order:10, result:{ target:function(player,target){ - var num=player.getExpansions('gzquanji').length-1; - if(num==0){ - if(target.countCards('h')>player.countCards('h')) return get.damageEffect(target,player,target); - return 0; - } - if(target!=player) return 0; - if(player.needsToDiscard()&&!player.getEquip('zhuge')&&!player.hasSkill('new_paoxiao')) return 0; - return 1; - } - }, + var num=player.getExpansions('gzquanji').length-1; + if(num==0){ + if(target.countCards('h')>player.countCards('h')) return get.damageEffect(target,player,target); + return 0; + } + if(target!=player) return 0; + if(player.needsToDiscard()&&!player.getEquip('zhuge')&&!player.hasSkill('new_paoxiao')) return 0; + return 1; + } + }, }, } }, @@ -2667,7 +2784,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'reenyuan', trigger:{player:'gainEnd'}, filter:function(event,player){ - if(!event.source||event.source==player||!event.source.isIn()) return false; + if(!event.source||event.source==player||!event.source.isIn()||event.cards.length<2) return false; var evt=event.getl(event.source); return evt&&evt.cards2&&evt.cards2.length>1; }, @@ -3757,11 +3874,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.count=trigger.num; 'step 1' event.count--; - trigger.source.chooseBool('是否对'+get.translation(player)+'发动【暴虐】?').set('choice',get.attitude(trigger.source,player)>0); + player.chooseBool('是否发动【暴虐】?').set('choice',get.attitude(player,player)>0); 'step 2' if(result.bool){ - player.logSkill('olbaonue'); - trigger.source.line(player,'green') + player.logSkill('olbaonue',trigger.source); player.judge(function(card){ if(get.suit(card)=='spade') return 4; return 0; @@ -5848,6 +5964,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, olhunzi:{ audio:2, + audioname:['re_sunyi'], inherit:'hunzi', content:function(){ player.loseMaxHp(); @@ -10607,7 +10724,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rezongshi_info:'锁定技,你的手牌上限+X(X为势力数)。准备阶段,若你的手牌数大于体力值,则你本回合内使用【杀】无次数限制。', ol_dongzhuo:'界董卓', olbaonue:'暴虐', - olbaonue_info:'主公技,其他群雄角色造成1点伤害后,其可进行判定,若为♠,你回复1点体力并获得判定牌。', + olbaonue_info:'主公技,其他群雄角色造成1点伤害后,你可进行判定,若为♠,你回复1点体力并获得判定牌。', re_panzhangmazhong:'界潘璋马忠', re_hanhaoshihuan:'界韩浩史涣', re_bulianshi:'界步练师', @@ -10778,6 +10895,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reyanyu:'燕语', reyanyu2:'燕语', reyanyu_info:'①出牌阶段,你可以重铸【杀】。②出牌阶段结束时,你可以令一名男性角色摸X张牌(X为你本阶段内发动过〖燕语①〗的次数且至多为3)。', + rehujia:'护驾', + rehujia_info:'主公技。①当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。②每回合限一次。当有魏势力角色于回合外使用或打出【闪】时,其可以令你摸一张牌。', + ol_xuhuang:'界徐晃', + olduanliang:'断粮', + olduanliang_info:'你可以将一张黑色非锦囊牌当做【兵粮寸断】使用。若你于当前回合内未造成过伤害,则你使用【兵粮寸断】无距离限制。', + oljiezi:'截辎', + oljiezi_info:'①当有角色跳过摸牌阶段后,你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。②一名角色的摸牌阶段结束时,若其有“辎”,则你移去其“辎”,然后令其获得一个额外的摸牌阶段。', refresh_standard:'界限突破·标', refresh_feng:'界限突破·风', diff --git a/character/shenhua.js b/character/shenhua.js index d443efc47..dbb86834a 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -8,7 +8,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shenhua:{ shenhua_feng:["sp_zhangjiao","re_yuji","old_zhoutai","old_caoren","re_xiahouyuan","re_xiaoqiao","huangzhong","re_weiyan"], shenhua_huo:['dianwei','xunyu','pangtong','sp_zhugeliang','taishici','yanwen','re_yuanshao','re_pangde'], - shenhua_lin:['caopi','xuhuang','menghuo','zhurong','re_lusu','sunjian','dongzhuo','jiaxu'], + shenhua_lin:['caopi','re_xuhuang','menghuo','zhurong','re_lusu','sunjian','dongzhuo','jiaxu'], shenhua_shan:['dengai','zhanghe','liushan','jiangwei','zhangzhang','sunce','caiwenji','zuoci'], shenhua_yin:['wangji','kuailiangkuaiyue','yanyan','wangping','sunliang','luji','xuyou','yl_luzhi'], shenhua_lei:['haozhao','guanqiujian','chendao','zhugezhan','lukang','zhoufei','zhangxiu','yl_yuanshu'], @@ -17,7 +17,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ character:{ old_zhoutai:['male','wu',4,['buqu','new_fenji']], old_caoren:['male','wei',4,['moon_jushou','jiewei']], - xuhuang:['male','wei',4,['gzduanliang']], + re_xuhuang:['male','wei',4,['duanliang','jiezi']], re_pangde:['male','qun',4,['mashu','jianchu']], re_xiahouyuan:['male','wei',4,['xinshensu']], huangzhong:['male','shu',4,['liegong']], @@ -3300,11 +3300,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ locked:false, mod:{ globalFrom:function(from,to,distance){ - if(from.storage.tuntian){ - var num=distance-from.getExpansions('tuntian').length; - if(_status.event.skill=='jixi_backup'||_status.event.skill=='gzjixi_backup') num++; - return num; - } + var num=distance-from.getExpansions('tuntian').length; + if(_status.event.skill=='jixi_backup'||_status.event.skill=='gzjixi_backup') num++; + return num; } } } @@ -3375,14 +3373,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return ui.create.dialog('急袭',player.getExpansions('tuntian'),'hidden'); }, backup:function(links,player){ + var skill=_status.event.buttoned; return { audio:'jixi', audioname:['re_dengai','gz_dengai','ol_dengai'], selectCard:-1, position:'x', - filterCard:function(card){ - return card==lib.skill.jixi_backup.card; - }, + filterCard:skill=='jixi'?(card)=>card==lib.skill.jixi_backup.card:(card)=>card==lib.skill.gzjixi_backup.card, viewAs:{name:'shunshou'}, card:links[0], } @@ -6638,7 +6635,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mod:{ maxHandcardBase:function(player,num){ - if(get.mode()!='guozhan'&&player.storage.buqu&&player.storage.buqu.length) return player.storage.buqu.length; + if(get.mode()!='guozhan'&&player.getExpansions('buqu').length) return player.getExpansions('buqu').length; }, }, ai:{ @@ -7306,7 +7303,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pangde:['ol_pangde','re_pangde','pangde'], yanwen:['re_yanwen','yanwen'], caopi:['caopi','re_caopi'], - xuhuang:['re_xuhuang','xuhuang'], + xuhuang:['ol_xuhuang','re_xuhuang','xuhuang'], menghuo:['re_menghuo','menghuo'], zhurong:['re_zhurong','ol_zhurong','zhurong'], sunjian:['ol_sunjian','re_sunjian','sunjian'], @@ -7522,7 +7519,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhurong:'祝融', menghuo:'孟获', caopi:'曹丕', - re_xuhuang:'界徐晃', + re_xuhuang:'徐晃', lusu:'旧鲁肃', sunjian:'孙坚', dongzhuo:'董卓', @@ -7641,7 +7638,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_zhoutai:'周泰', old_caoren:'曹仁', - xuhuang:'徐晃', + xuhuang:'旧徐晃', pangde:'旧庞德', xiahouyuan:'旧夏侯渊', caoren:'界曹仁', diff --git a/character/sp.js b/character/sp.js index 7e97e2621..d10db16a6 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"], - 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'], + 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'], sp_tianzhu:["wutugu","yanbaihu","shamoke","panfeng","zhugedan",'huangzu','gaogan',"tadun"], sp_nvshi:["lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu','ol_xinxianying',"daxiaoqiao"], sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan'], - sp_huben:["caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan"], + sp_huben:["caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","fanjiangzhangda"], sp_liesi:['mizhu'], 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_qifu:["caoying",'panshu',"caochun","yuantanyuanshang",'caoshuang','wolongfengchu','guansuo','baosanniang','fengfangnv'], @@ -22,8 +22,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_others:["hanba","caiyang"], }, }, - characterFilter:{}, + characterFilter:{ + tianyu:function(mode){ + return mode!='chess'&&mode!='tafang'&&mode!='stone'; + }, + }, character:{ + fanjiangzhangda:['male','wu',4,['yuanchou','juesheng']], + tianyu:['male','wei',4,['saodi','zhuitao']], + ol_chendeng:['male','qun',4,['olfengji']], + ol_zhuling:['male','wei',4,['jixian']], wuyan:['male','wu',4,['lanjiang']], sp_ol_zhanghe:['male','qun',4,['spolzhouxuan']], ol_dongzhao:['male','wei',3,['olxianlve','olzaowang']], @@ -156,6 +164,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //kaisa:["male","western",4,["zhengfu"]], }, characterIntro:{ + fanjiangzhangda:'范强,在明朝小说《三国演义》里叫做范疆。二人均为张飞手下部将。蜀汉章武元年,刘备伐吴,张飞率军从阆中前往江州,出发前,范强和张达杀死张飞,带着张飞的首级投奔了东吴。', + tianyu:'田豫(171年~252年),字国让,渔阳雍奴(今天津市武清区)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。后来田豫常年镇守曹魏北疆,从征代郡乌桓、斩骨进、破轲比能,多有功勋;也曾参与对孙吴的作战,在成山斩杀周贺,于新城击败孙权。官至太中大夫,封长乐亭侯。有一子田彭祖。', wuyan:'吴国及西晋初年将领。初任通江县吏,后得到大司马陆抗的提拔重用,逐渐升至建平太守。', fengfangnv:'冯方之女,司隶人,袁术妻妾。在史书中被记载为天姿国色的美人。钱大昭在《三国志辨疑》中认为冯方当为冯芳误字,冯方女实为是西园八校尉之一的冯芳的女儿。然而,在曹丕《典论》、《九州春秋》等书籍都有提及她,皆作冯方女字样,并无一书写作冯芳女或是明提是冯芳之女。最关键的一点是,冯芳是荆州西陵县人,她女儿不可能是司隶籍,冯芳也没担任过任何与司隶有关的官职。同时期名字为“○女”的并不少见,如施绩女儿施淑女,曹植女儿曹行女,夏侯令女等。', zuofen:'左芬(约253年-300年4月23日),出土墓志作左棻,字兰芝,齐国临淄(今山东临淄)人,西晋诗人。少好学,善属文。为晋武帝贵人。今存诗、赋、颂、赞、诔等20余篇,大都为应诏而作,《离思赋》最著名。原有集,已失传。', @@ -468,6 +478,426 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //范强张达 + yuanchou:{ + audio:2, + trigger:{ + player:'useCardToPlayered', + target:'useCardToTargeted', + }, + filter:function(event){ + return event.card.name=='sha'&&get.color(event.card)=='black'; + }, + forced:true, + logTarget:'target', + content:function(){ + trigger.target.addTempSkill('qinggang2'); + trigger.target.storage.qinggang2.add(trigger.card); + }, + ai:{ + unequip_ai:true, + skillTagFilter:function(player,tag,arg){ + if(arg&&arg.name=='sha'&&get.color(arg.card)=='black') return true; + return false; + } + }, + global:'yuanchou_ai', + subSkill:{ + ai:{ + unequip_ai:true, + skillTagFilter:function(player,tag,arg){ + if(arg&&arg.name=='sha'&&get.color(arg.card)=='black'&&arg.target&&arg.target.hasSkill('yuanchou')) return true; + return false; + } + }, + }, + }, + juesheng:{ + audio:2, + enable:'phaseUse', + limited:true, + skillAnimation:true, + animationColor:'orange', + viewAs:{name:'juedou',isCard:true}, + filterCard:()=>false, + selectCard:-1, + precontent:function(){ + player.awakenSkill('juesheng'); + player.addTempSkill('juesheng_counter'); + }, + ai:{ + result:{ + player:function(player,target){ + return target.getAllHistory('useCard',(evt)=>evt.card.name=='sha').length*lib.card.juedou.ai.result.player.apply(this,arguments); + }, + target:function(player,target){ + var num=target.getAllHistory('useCard',(evt)=>evt.card.name=='sha').length; + if(numevt.card.name=='sha').length; + target.addTempSkill('juesheng',{player:'phaseAfter'}); + }, + }, + }, + }, + //田之间 + saodi:{ + audio:2, + trigger:{ + player:'useCardToPlayer', + }, + direct:true, + filter:function(event,player){ + if(event.targets.length!=1||event.target==player||event.target.hasSkill('nodis')) return false; + if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; + var target=event.target; + var left=[],right=[],left2=player,right2=player; + while(left2!=target&&right2!=target){ + left2=left2.getPrevious(); + right2=right2.getNext(); + if(left2!=target) left.push(left2); + if(right2!=target) right.push(right2); + } + if(target==left2){ + for(var i of left){ + if(lib.filter.targetEnabled2(event.card,player,i)) return true; + } + } + if(target==right2){ + for(var i of right){ + if(lib.filter.targetEnabled2(event.card,player,i)) return true; + } + } + return false; + }, + aiJudge:function(card,player,target,bool){ + var left=[],right=[],left2=player,right2=player,left3=false,right3=false; + var eff_left=0,eff_right=0; + while(left2!=target&&right2!=target){ + left2=left2.getPrevious(); + right2=right2.getNext(); + if(left2!=target) left.push(left2); + if(right2!=target) right.push(right2); + } + if(target==left2){ + for(var i of left){ + if(lib.filter.targetEnabled2(card,player,i)){ + left3=true; + eff_left+=get.effect(i,card,player,player); + } + } + } + if(target==right2){ + for(var i of right){ + if(lib.filter.targetEnabled2(card,player,i)){ + right3=true; + eff_right+=get.effect(i,card,player,player); + } + } + } + if(left3&&right3){ + if(!bool) return Math.max(eff_left,eff_right); + if(eff_left>Math.max(0,eff_right)) return '↖顺时针'; + if(eff_right>Math.max(0,eff_left)) return '逆时针↗'; + return 'cancel2'; + } + else if(left3){ + if(bool) return eff_left>0?'↖顺时针':'cancel2'; + return eff_left; + } + else if(right3){ + if(bool) return eff_right>0?'↖顺时针':'cancel2'; + return eff_right; + } + else return bool?'cancel2':0; + }, + content:function(){ + 'step 0' + var choices=[]; + var target=trigger.target; + var left=[],right=[],left2=player,right2=player; + while(left2!=target&&right2!=target){ + left2=left2.getPrevious(); + right2=right2.getNext(); + if(left2!=target) left.push(left2); + if(right2!=target) right.push(right2); + } + if(target==left2){ + for(var i of left){ + if(lib.filter.targetEnabled2(trigger.card,player,i)){ + choices.push('↖顺时针'); + break; + } + } + } + if(target==right2){ + for(var i of right){ + if(lib.filter.targetEnabled2(trigger.card,player,i)){ + choices.push('逆时针↗'); + break; + } + } + } + choices.push('cancel2'); + player.chooseControl(choices).set('prompt',get.prompt('saodi')).set('prompt2','令自己和'+get.translation(trigger.target)+'某个方向之间的所有角色均成为'+get.translation(trigger.card)+'的目标').set('choices',choices).set('ai',function(){ + var evt=_status.event.getTrigger(); + return lib.skill.saodi.aiJudge(evt.card,evt.player,evt.target,true); + }); + 'step 1' + if(result.control!='cancel2'){ + var targets=[]; + if(result.control=='↖顺时针'){ + var current=player.getPrevious(); + while(current!=trigger.target){ + if(lib.filter.targetEnabled2(trigger.card,player,current)) targets.push(current); + current=current.getPrevious(); + } + } + else{ + var current=player.getNext(); + while(current!=trigger.target){ + if(lib.filter.targetEnabled2(trigger.card,player,current)) targets.push(current); + current=current.getNext(); + } + } + event.targets=targets; + if(!event.isMine()&&!event.isOnline()) game.delayx(); + } + else event.finish(); + 'step 2' + player.logSkill('saodi',targets); + trigger.targets.addArray(targets); + }, + ai:{ + effect:{ + player_use:function(card,player,target){ + if(!target||player._saodi_judging||ui.selected.targets.length||player==target||target.hasSkill('nodis')) return; + if(typeof card!='object'||card.name!='sha'&&get.type(card)!='trick') return false; + player._saodi_judging=true; + var effect=lib.skill.saodi.aiJudge(card,player,target); + delete player._saodi_judging; + if(effect>0) return [1,effect/Math.max(0.01,get.attitude(player,player))]; + }, + }, + }, + }, + zhuitao:{ + audio:2, + direct:true, + locked:false, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + var storage=player.getStorage('zhuitao'); + return game.hasPlayer(function(current){ + return current!=player&&!storage.contains(current); + }); + }, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('zhuitao'),'令自己至一名其他角色的距离-1',function(card,player,target){ + return target!=player&&!player.getStorage('zhuitao').contains(target); + }).set('ai',function(target){ + var player=_status.event.player; + var att=get.attitude(player,target); + if(att<0&&get.distance(player,target)==2) return 100; + return get.distance(player,target)*(1-get.sgn(att)/3); + }); + 'step 1' + if(result.bool){ + player.logSkill('zhuitao',result.targets[0]); + player.markAuto('zhuitao',result.targets); + game.delayx(); + } + }, + intro:{ + content:'至$的距离-1', + onunmark:true, + }, + onremove:true, + mod:{ + globalFrom:function(player,target,distance){ + if(player.getStorage('zhuitao').contains(target)) return distance-1; + }, + }, + group:'zhuitao_remove', + subSkill:{ + remove:{ + audio:'zhuitao', + trigger:{ + source:'damageSource', + }, + forced:true, + filter:function(event,player){ + return player.getStorage('zhuitao').contains(event.player); + }, + logTarget:'player', + content:function(){ + player.unmarkAuto('zhuitao',[trigger.player]); + }, + }, + }, + }, + //生鱼片 + olfengji:{ + audio:2, + trigger:{player:'phaseDrawBegin2'}, + forced:true, + locked:false, + filter:function(event,player){ + return !player.numFixed; + }, + content:function(){ + 'step 0' + player.chooseTarget('丰积:请选择增加摸牌的目标','令自己本回合的额定摸牌数-1,且目标下回合的额定摸牌数+2。或者点击「取消」,令自己的额定摸牌数+1',lib.filter.notMe).set('ai',function(target){ + var player=_status.event.player; + if(target.hasJudge('lebu')||target.hasJudge('bingliang')) return 0; + var att=get.attitude(player,target),dist=get.distance(player,target,'absolute'); + if(_status.event.goon){ + return att/dist; + } + if(game.countPlayer(function(current){ + return current!=player&¤t!=target&&get.attitude(player,current)<0&&get.distance(player,current,'absolute')=target.hp) return 0; + return att/dist; + }).set('goon',player.skipList.contains('lebu')); + 'step 1' + if(!player.storage.olfengji_draw) player.storage.olfengji_draw=0; + if(result.bool){ + var target=result.targets[0]; + player.line(target,'thunder'); + player.storage.olfengji_draw--; + if(!target.storage.olfengji_draw) target.storage.olfengji_draw=0; + target.storage.olfengji_draw+=2; + target.addTempSkill('olfengji_draw',{player:'phaseAfter'}); + target.markSkill('olfengji_draw'); + } + else{ + player.storage.olfengji_draw++; + } + player.addTempSkill('olfengji_draw'); + player.markSkill('olfengji_draw'); + 'step 2' + player.chooseTarget('丰积:请选择增加使用杀次数的目标','令自己本回合使用杀的次数上限-1,且目标下回合使用杀的次数上限+2。或者点击「取消」,令自己使用杀的次数上限+1',lib.filter.notMe).set('ai',function(target){ + var player=_status.event.player; + if(target.countMark('olfengji_draw')>0&&target.getCardUsable('sha')<2) return get.attitude(player,target); + return 0; + }); + 'step 3' + if(!player.storage.olfengji_sha) player.storage.olfengji_sha=0; + if(result.bool){ + var target=result.targets[0]; + player.line(target,'fire'); + player.storage.olfengji_sha--; + if(!target.storage.olfengji_sha) target.storage.olfengji_sha=0; + target.storage.olfengji_sha+=2; + target.addTempSkill('olfengji_sha',{player:'phaseAfter'}); + target.markSkill('olfengji_sha'); + } + else{ + player.storage.olfengji_sha++; + } + player.addTempSkill('olfengji_sha'); + player.markSkill('olfengji_sha'); + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + intro:{ + content:function(storage){ + return '使用【杀】的次数上限'+(storage>=0?'+':'')+storage; + }, + }, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.storage.olfengji_sha; + }, + }, + }, + draw:{ + charlotte:true, + onremove:true, + intro:{ + content:function(storage){ + return '额定摸牌数'+(storage>=0?'+':'')+storage; + }, + }, + trigger:{player:'phaseDrawBegin2'}, + forced:true, + filter:function(event,player){ + return !event.numFixed; + }, + content:function(){ + trigger.num+=player.storage.olfengji_draw; + }, + }, + }, + }, + //朱灵 + jixian:{ + audio:2, + trigger:{player:'phaseDrawAfter'}, + direct:true, + filter:function(event,player){ + return game.hasPlayer(function(current){ + return current!=player&&lib.skill.jixian.getNum(player,current)>0&&player.canUse('sha',current,false); + }) + }, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jixian'),'视为对一名满足条件的角色使用一张【杀】',function(card,player,target){ + return target!=player&&lib.skill.jixian.getNum(player,target)>0&&player.canUse('sha',target,false); + }).set('ai',function(target){ + var player=_status.event.player; + return get.effect(target,{name:'sha'},player,player)*Math.sqrt(lib.skill.jixian.getNum(player,target)); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jixian',target); + var num=lib.skill.jixian.getNum(player,target); + player.useCard({name:'sha',isCard:true},target,false); + if(num>0) player.draw(num); + } + else event.finish(); + 'step 2' + if(!player.hasHistory('sourceDamage',function(evt){ + var card=evt.card; + if(!card||card.name!='sha') return false; + var evtx=evt.getParent('useCard'); + return evtx.card==card&&evtx.getParent()==event; + })) player.loseHp(); + }, + getNum:function(player,target){ + var num=0; + if(target.isHealthy()) num++; + if(target.getEquip(2)) num++; + var countSkill=function(player){ + return player.getSkills(null,null,false).filter(function(skill){ + var info=get.info(skill); + if(!info||info.charlotte) return false; + if(info.zhuSkill) return player.hasZhuSkill(skill); + return true; + }).length; + } + if(countSkill(player)=2){ var cards=trigger.player.getExpansions('rezhoufu2'); - trigger.player.loseToDiscardpile(cards); + player.gain(cards,trigger.player); } else trigger.player.markSkill('rezhoufu2'); }, @@ -11763,6 +12193,34 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yingbin:{ audio:2, }, + kuiwei:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + check:function(event,player){ + if(player.isTurnedOver()) return true; + var num=game.countPlayer(function(current){ + return current.getEquip(1); + }); + return num>1; + }, + content:function(){ + "step 0" + player.turnOver(); + "step 1" + var num=game.countPlayer(function(current){ + return current.getEquip(1); + }); + player.draw(2+num); + player.addSkill('kuiwei2'); + }, + ai:{ + effect:{ + target:function(card){ + if(card.name=='guiyoujie') return [0,2]; + } + } + } + }, kuiwei2:{ trigger:{player:'phaseDrawBegin'}, forced:true, @@ -15425,6 +15883,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zongyu:['sp_zongyu','zongyu'], ol_dongzhao:['ol_dongzhao','tw_dongzhao'], mayunlu:['tw_mayunlu','mayunlu'], + zhuling:['ol_zhuling','zhuling'], }, translate:{ "xinfu_lingren":"凌人", @@ -16067,7 +16526,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spmengjin_info:'当你使用【杀】指定目标后,你可以弃置目标角色的一张牌。', fenxun_info:'出牌阶段限一次,你可以弃置一张牌并选择一名其他角色,你于本回合内至其的距离视为1。', rezhoufu_info:'出牌阶段限一次,你可以用一张牌对一名其他角色施“咒”。当有“咒”的角色判定时,将“咒”作为判定牌;一名角色的回合结束时,你令本回合移除过“咒”的角色各失去1点体力', - reyingbing_info:'锁定技,有“咒”的角色使用与“咒”颜色相同的牌时,你摸一张牌;若这是你第二次因该“咒”摸牌,你获得该"咒"。', + reyingbing_info:'锁定技,有“咒”的角色使用与“咒”颜色相同的牌时,你摸一张牌;若这是你第二次因该“咒”摸牌,则你获得该"咒"。', yingbin_info:'锁定技,有“咒”的角色使用与“咒”花色相同的牌时,你摸一张牌;当你因同一名角色的同一张“咒”的效果摸第二张牌时,移去该“咒”。', zhoufu_info:'出牌阶段限一次,你可以将一张手牌置于一名没有“咒”的其他角色的武将牌旁,称为“咒”。当有“咒”的角色判定时,其改为将“咒”作为判定牌;一名角色的回合结束时,若有角色于此回合因判定而移除过“咒”,则你令这些角色各失去1点体力。', yanzheng_info:'若你的手牌数大于你的体力值,则你可以将你装备区内的牌当作【无懈可击】使用。', @@ -16296,6 +16755,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wuyan:'吾彦', lanjiang:'澜疆', lanjiang_info:'结束阶段,你可以选择令所有手牌数不小于你的角色。这些角色依次选择是否令你摸一张牌。然后你可以对其中一名手牌数等于你的角色造成1点伤害,随后可以对其中一名手牌数小于你的角色摸一张牌。', + ol_zhuling:'朱灵', + jixian:'急陷', + jixian_info:'摸牌阶段结束时,你可以选择一名满足以下至少一项条件的角色:⒈装备区内有防具牌;⒉拥有的普通技能数大于你;⒊体力值等于体力上限。你视为对其使用一张【杀】,然后摸X张牌(X为其于此【杀】结算前满足的条件数);若此【杀】未造成伤害,则你失去1点体力。', + ol_chendeng:'OL陈登', + olfengji:'丰积', + olfengji_info:'摸牌阶段开始时,你选择:⒈本回合摸牌阶段的额定摸牌数-1,且令一名其他角色下回合摸牌阶段的额定摸牌数+2;⒉本回合摸牌阶段的额定摸牌数+1。然后你选择:⒈本回合使用【杀】的次数上限-1,且令一名其他角色下回合使用【杀】的次数上限+2;⒉本回合使用【杀】的次数上限+1。', + tianyu:'田豫', + saodi:'扫狄', + saodi_info:'当你使用【杀】或普通锦囊牌指定唯一其他角色为目标时,你可从逆时针方向和顺时针方向中选择一个你与其之间角色最少的方向。你令该方向下你与其之间的所有能成为此牌额外目标的角色均成为此牌的目标。', + zhuitao:'追讨', + zhuitao_info:'①准备阶段,你可选择一名未被〖追讨〗记录过的其他角色。②你至所有〖追讨〗记录过的角色的距离-1。③当你对一名被〖追讨〗记录过的角色造成伤害时,你从〖追讨〗记录里移除该角色。', + fanjiangzhangda_ab:'范疆张达', + fanjiangzhangda:'范强张达', + yuanchou:'怨仇', + yuanchou_info:'锁定技。当你使用黑色【杀】指定目标角色后或成为黑色【杀】的目标角色后,你令目标角色的防具技能无效直到此【杀】被抵消或造成伤害。', + juesheng:'决生', + juesheng_info:'限定技。出牌阶段,你可视为使用一张【决斗】。当你因此【决斗】造成伤害时,你将伤害值改为X(X为目标角色本局游戏内使用过【杀】的数量)且令目标角色获得此技能直到其下回合结束。', sp_tianji:'天极·皇室宗亲', sp_sibi:'四弼·辅国文曲', diff --git a/character/sp2.js b/character/sp2.js index e32124f05..880edee41 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,7 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ - re_sunyi:['male','wu',4,['syjiqiao','syxiongyi'],['unseen']], + re_sunyi:['male','wu',5,['syjiqiao','syxiongyi']], re_pangdegong:['male','qun',3,['heqia','yinyi']], wangtao:['female','shu',3,['huguan','yaopei']], wangyue:['female','shu',3,['huguan','mingluan']], @@ -158,7 +158,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' var cards=player.getExpansions('syjiqiao') - player.chooseButton(['激峭:选择获得一张牌',cards],true); + player.chooseButton(['激峭:选择获得一张牌',cards],true).set('ai',function(button){ + var player=_status.event.player; + var color=get.color(button.link),cards=player.getExpansions('syjiqiao'); + var num1=cards.filter((card)=>get.color(card)==color),num2=cards.length-num1; + if(num1>=num2) return get.value(button.link); + return 0; + }); 'step 1' if(result.bool){ player.gain(result.links,'gain2'); @@ -209,6 +215,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(hp>0) player.recover(hp); }, ai:{ + order:1, save:true, skillTagFilter:function(player,arg,target){ return player==target; @@ -4063,7 +4070,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'phaseUseEnd'}, forced:true, filter:function(event,player){ - if(player==event.player) return false; + if(player==event.player||!player.countCards('he')) return false; var map={}; var list=event.player.getHistory('useCard',function(evt){ var evt2=evt.getParent('phaseUse'); @@ -4075,10 +4082,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else return true; } }, - frequent:true, - logTarget:'player', + direct:true, content:function(){ - player.draw(); + 'step 0' + player.chooseToDiscard('he',get.prompt('langmie'),'弃置一张牌并摸两张牌').set('ai',(card)=>8-get.value(card)).logSkill='langmie'; + 'step 1' + if(result.bool) player.draw(2); }, group:'langmie_damage', }, @@ -4842,6 +4851,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', usable:1, + zhuanhuanji:true, filter:function(event,player){ if(player.storage.bazhan){ return game.hasPlayer(function(current){ @@ -12554,7 +12564,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ duanwei:'段煨', langmie:'狼灭', langmie_damage:'狼灭', - langmie_info:'其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。', + langmie_info:'其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以弃置一张牌并摸两张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。', zhangheng:'张横', dangzai:'挡灾', dangzai_info:'出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。', diff --git a/character/tw.js b/character/tw.js index 8b9b74238..1a1b977ea 100644 --- a/character/tw.js +++ b/character/tw.js @@ -59,9 +59,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var evtx=event.getParent(); event.targets=targets.filter(function(target){ - return target.getHistory('lose',function(evt){ - return evt.getParent(3).name==''&&evt.getParent(4)==evtx; - }) + return target.hasHistory('lose',function(evt){ + return evt.getParent(3).name=='dz_mantianguohai'&&evt.getParent(4)==evtx; + }); }); if(!event.targets.length||!player.countCards('he')) event.finish(); 'step 1' diff --git a/character/yijiang.js b/character/yijiang.js index db28a0bf1..58587d7f8 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -2847,7 +2847,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cards.sort(function(a,b){ return get.useful(a)-get.useful(b); }); - cards2=cards.splice(0,player.storage.bizhuan.length); + cards2=cards.splice(0,player.getExpansions('bizhuan').length); } return [cards2,cards]; }); @@ -5558,7 +5558,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, audioname:['xin_chengpu'], filter:function(event,player){ - return player.countCards('h')>0&&(_status.connectMode||player.countCards('h','sha')>0)&&!player.getExpansion('chunlao').length; + return player.countCards('h')>0&&(_status.connectMode||player.countCards('h','sha')>0)&&!player.getExpansions('chunlao').length; }, intro:{ content:'expansion', @@ -9128,8 +9128,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } "step 2" player.logSkill('rechanhui',event.target); - event.target.chooseCard('交给'+get.translation(player)+'一张手牌,或成为'+ - get.translation(trigger.card)+'的额外目标').set('ai',function(card){ + event.target.chooseCard('交给'+get.translation(player)+'一张牌,或成为'+ + get.translation(trigger.card)+'的额外目标','he').set('ai',function(card){ return 5-get.value(card); }); "step 3" diff --git a/character/yxs.js b/character/yxs.js index 542727d6b..c237c38f7 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -393,6 +393,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 8-get.value(card); }, discard:false, + lose:false, filter:function(event,player){ if(player.countCards('h',{suit:'heart'})){ return true; diff --git a/game/asset.js b/game/asset.js index 271497901..88aea4675 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.112.2', + 'v1.9.113.2', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -847,6 +847,10 @@ window.noname_asset_list=[ 'audio/die/wangyue.mp3', 'audio/die/wuyan.mp3', 'audio/die/xin_sunxiu.mp3', + 'audio/die/fanjiangzhangda.mp3', + 'audio/die/ol_chendeng.mp3', + 'audio/die/re_sunyi.mp3', + 'audio/die/tianyu.mp3', 'audio/skill/decadezishou1.mp3', 'audio/skill/decadezishou2.mp3', @@ -3858,6 +3862,22 @@ window.noname_asset_list=[ 'audio/skill/yingfeng2.mp3', 'audio/skill/zjjuxiang1.mp3', 'audio/skill/zjjuxiang2.mp3', + 'audio/skill/juesheng1.mp3', + 'audio/skill/juesheng2.mp3', + 'audio/skill/olfengji1.mp3', + 'audio/skill/olfengji2.mp3', + 'audio/skill/olhunzi_re_sunyi1.mp3', + 'audio/skill/olhunzi_re_sunyi2.mp3', + 'audio/skill/saodi1.mp3', + 'audio/skill/saodi2.mp3', + 'audio/skill/syjiqiao1.mp3', + 'audio/skill/syjiqiao2.mp3', + 'audio/skill/syxiongyi1.mp3', + 'audio/skill/syxiongyi2.mp3', + 'audio/skill/yuanchou1.mp3', + 'audio/skill/yuanchou2.mp3', + 'audio/skill/zhuitao1.mp3', + 'audio/skill/zhuitao2.mp3', 'audio/voice/male/0.mp3', 'audio/voice/male/1.mp3', @@ -4890,6 +4910,11 @@ window.noname_asset_list=[ 'image/character/wangyue.jpg', 'image/character/wuyan.jpg', 'image/character/xin_sunxiu.jpg', + 'image/character/ol_chendeng.jpg', + 'image/character/ol_xuhuang.jpg', + 'image/character/ol_zhuling.jpg', + 'image/character/re_sunyi.jpg', + 'image/character/tianyu.jpg', 'image/character/baiwuchang.jpg', 'image/character/baosanniang.jpg', diff --git a/game/game.js b/game/game.js index dea11fa0f..9ce25a2f7 100644 --- a/game/game.js +++ b/game/game.js @@ -11044,13 +11044,13 @@ } var evt=event.relatedEvent||event.getParent(); if(!evt.orderingCards) evt.orderingCards=[]; - if(!event.noOrdering&&!event.cardsOrdered){ - event.cardsOrdered=true; + if(!evt.noOrdering&&!evt.cardsOrdered){ + evt.cardsOrdered=true; var next=game.createEvent('orderingDiscard',false,evt.getParent()); next.relatedEvent=evt; next.setContent('orderingDiscard'); } - if(!event.noOrdering) evt.orderingCards.addArray(cards); + if(!evt.noOrdering) evt.orderingCards.addArray(cards); }, cardsGotoSpecial:function(){ game.getGlobalHistory().cardMove.push(event); @@ -16029,15 +16029,14 @@ if(event.position==ui.ordering){ var evt=event.relatedEvent||event.getParent(); if(!evt.orderingCards) evt.orderingCards=[]; - if(!event.noOrdering&&!event.cardsOrdered){ - event.cardsOrdered=true; + if(!evt.noOrdering&&!evt.cardsOrdered){ + evt.cardsOrdered=true; var next=game.createEvent('orderingDiscard',false,evt.getParent()); next.relatedEvent=evt; next.setContent('orderingDiscard'); } - if(!event.noOrdering){ + if(!evt.noOrdering){ evt.orderingCards.addArray(cards); - evt.orderingCards.addArray(ss); } } else if(event.position==ui.cardPile){ @@ -16760,8 +16759,14 @@ if(player.getTopCards) cardj=player.getTopCards()[0]; else cardj=get.cards()[0]; } - var nextj=game.cardsGotoOrdering(cardj); - if(event.position!=ui.discardPile) nextj.noOrdering=true; + var owner=get.owner(cardj); + if(owner){ + owner.lose(cardj,'visible',ui.ordering); + } + else{ + var nextj=game.cardsGotoOrdering(cardj); + if(event.position!=ui.discardPile) nextj.noOrdering=true; + } player.judging.unshift(cardj); game.addVideo('judge1',player,[get.cardInfo(player.judging[0]),judgestr,event.videoId]); game.broadcastAll(function(player,card,str,id,cardid){ diff --git a/game/update.js b/game/update.js index 6d112895e..c91811c41 100644 --- a/game/update.js +++ b/game/update.js @@ -1,19 +1,19 @@ window.noname_update={ - version:'1.9.113.1', - update:'1.9.113', + version:'1.9.113.2', + update:'1.9.113.1', changeLog:[ - '功能性更新:E(x)pansion区域独立化(武将牌上的牌所在区域)', + '孙翊、OL陈登、OL朱灵、OL界徐晃、范强张达', 'bug修复', ], files:[ //'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/standard.js', //'card/swd.js', //'card/yunchou.js', //'card/yingbian.js', @@ -21,29 +21,29 @@ window.noname_update={ //'card/zhenfa.js', //'card/zhulu.js', //'character/diy.js', - //'character/extra.js', - //'character/hearth.js', + 'character/extra.js', + 'character/hearth.js', //'character/gujian.js', //'character/gwent.js', //'character/hearth.js', - //'character/mobile.js', + 'character/mobile.js', //'character/mtg.js', //'character/offline.js', - //'character/old.js', + 'character/old.js', //'character/ow.js', - //'character/rank.js', - //'character/refresh.js', - //'character/shenhua.js', - //'character/sp.js', - //'character/sp2.js', - //'character/tw.js', + 'character/rank.js', + 'character/refresh.js', + 'character/shenhua.js', + 'character/sp.js', + 'character/sp2.js', + 'character/tw.js', //'character/standard.js', //'character/swd.js', //'character/xianjian.js', //'character/xinghuoliaoyuan.js', //'character/yingbian.js', - //'character/yijiang.js', - //'character/yxs.js', + 'character/yijiang.js', + 'character/yxs.js', //'extension/boss/extension.js', //'layout/default/layout.css', //'layout/newlayout/global.css', @@ -51,13 +51,13 @@ window.noname_update={ //'layout/nova/layout.css', //'layout/mobile/equip.css', //'mode/boss.js', - //'mode/brawl.js', + 'mode/brawl.js', //'mode/chess.js', //'mode/connect.js', //'mode/doudizhu.js', - //'mode/guozhan.js', + 'mode/guozhan.js', //'mode/identity.js', - //'mode/single.js', + 'mode/single.js', //'mode/stone.js', //'mode/tafang.js', //'mode/versus.js', diff --git a/image/character/ol_chendeng.jpg b/image/character/ol_chendeng.jpg new file mode 100644 index 000000000..aecc6f270 Binary files /dev/null and b/image/character/ol_chendeng.jpg differ diff --git a/image/character/ol_xuhuang.jpg b/image/character/ol_xuhuang.jpg new file mode 100644 index 000000000..ffc59c8d0 Binary files /dev/null and b/image/character/ol_xuhuang.jpg differ diff --git a/image/character/ol_zhuling.jpg b/image/character/ol_zhuling.jpg new file mode 100644 index 000000000..e87894daa Binary files /dev/null and b/image/character/ol_zhuling.jpg differ diff --git a/image/character/re_sunyi.jpg b/image/character/re_sunyi.jpg new file mode 100644 index 000000000..2e72d13f9 Binary files /dev/null and b/image/character/re_sunyi.jpg differ diff --git a/image/character/tianyu.jpg b/image/character/tianyu.jpg new file mode 100644 index 000000000..6e1c5c280 Binary files /dev/null and b/image/character/tianyu.jpg differ diff --git a/mode/brawl.js b/mode/brawl.js index d7fa9265e..3a923accc 100644 --- a/mode/brawl.js +++ b/mode/brawl.js @@ -1155,7 +1155,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ var list=[ ['re_yuanshao','re_lidian'], ['zhangliao','sunquan'], - ['xin_fazheng','lvfan'], + ['xin_fazheng','sp_lvfan'], ['sunjian','lvbu'], ['jin_simashi','re_weiyan'], ['guanyu','sunce'], diff --git a/mode/guozhan.js b/mode/guozhan.js index 7c21ceb85..b89cb944a 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -8217,7 +8217,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } if(list.length==1){ target.storage.gzxiongsuan_restore=list[0]; - target.addTempSkill('gzxiongsuan_restore','phaseZhunbeiBegin'); + target.addTempSkill('gzxiongsuan_restore'); event.finish(); } else if(list.length>1){ @@ -8232,9 +8232,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, subSkill:{ restore:{ - trigger:{global:'phaseAfter'}, - silent:true, + trigger:{global:'phaseEnd'}, + forced:true, + popup:false, charlotte:true, + onremove:true, content:function(){ player.restoreSkill(player.storage.gzxiongsuan_restore); } diff --git a/mode/single.js b/mode/single.js index c32e8e732..b1672b510 100644 --- a/mode/single.js +++ b/mode/single.js @@ -355,12 +355,14 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }).set('dialog',event.videoId); "step 4" game.me.init(result.links[0]); + _status.characterlist.remove(result.links[0]); game.addRecentCharacter(result.links[0]); game.me.chooseButton(true).set('ai',function(button){ return Math.random(); }).set('dialog',event.videoId); "step 5" game.me.next.init(result.links[0]); + _status.characterlist.remove(result.links[0]); game.addRecentCharacter(result.links[0]); setTimeout(function(){ ui.arena.classList.remove('choose-character'); @@ -583,6 +585,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ "step 2" game.broadcastAll(function(player,character,id){ player.init(character); + _status.characterlist.remove(character); if(player==game.me) game.addRecentCharacter(character); },game.zhu,result.links[0]); game.fan.chooseButton(true).set('ai',function(button){ @@ -596,6 +599,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ dialog.close(); } player.init(character); + _status.characterlist.remove(character); if(player==game.me) game.addRecentCharacter(character); setTimeout(function(){ ui.arena.classList.remove('choose-character');