diff --git a/audio/die/liubian.mp3 b/audio/die/liubian.mp3 new file mode 100644 index 000000000..cf199abc9 Binary files /dev/null and b/audio/die/liubian.mp3 differ diff --git a/audio/die/ol_dingyuan.mp3 b/audio/die/ol_dingyuan.mp3 new file mode 100644 index 000000000..b998c896b Binary files /dev/null and b/audio/die/ol_dingyuan.mp3 differ diff --git a/audio/die/zhujun.mp3 b/audio/die/zhujun.mp3 new file mode 100644 index 000000000..138e2c93c Binary files /dev/null and b/audio/die/zhujun.mp3 differ diff --git a/audio/skill/cixiao1.mp3 b/audio/skill/cixiao1.mp3 new file mode 100644 index 000000000..6709019a7 Binary files /dev/null and b/audio/skill/cixiao1.mp3 differ diff --git a/audio/skill/cixiao2.mp3 b/audio/skill/cixiao2.mp3 new file mode 100644 index 000000000..b91b1b6ed Binary files /dev/null and b/audio/skill/cixiao2.mp3 differ diff --git a/audio/skill/dushi1.mp3 b/audio/skill/dushi1.mp3 new file mode 100644 index 000000000..2b9c45680 Binary files /dev/null and b/audio/skill/dushi1.mp3 differ diff --git a/audio/skill/dushi2.mp3 b/audio/skill/dushi2.mp3 new file mode 100644 index 000000000..859973eab Binary files /dev/null and b/audio/skill/dushi2.mp3 differ diff --git a/audio/skill/gongjian1.mp3 b/audio/skill/gongjian1.mp3 new file mode 100644 index 000000000..606339333 Binary files /dev/null and b/audio/skill/gongjian1.mp3 differ diff --git a/audio/skill/gongjian2.mp3 b/audio/skill/gongjian2.mp3 new file mode 100644 index 000000000..4902bbc97 Binary files /dev/null and b/audio/skill/gongjian2.mp3 differ diff --git a/audio/skill/kuimang1.mp3 b/audio/skill/kuimang1.mp3 new file mode 100644 index 000000000..ef45978f2 Binary files /dev/null and b/audio/skill/kuimang1.mp3 differ diff --git a/audio/skill/kuimang2.mp3 b/audio/skill/kuimang2.mp3 new file mode 100644 index 000000000..019a7f5b3 Binary files /dev/null and b/audio/skill/kuimang2.mp3 differ diff --git a/audio/skill/shiyuan1.mp3 b/audio/skill/shiyuan1.mp3 new file mode 100644 index 000000000..55eb8738a Binary files /dev/null and b/audio/skill/shiyuan1.mp3 differ diff --git a/audio/skill/shiyuan2.mp3 b/audio/skill/shiyuan2.mp3 new file mode 100644 index 000000000..d30ae26ce Binary files /dev/null and b/audio/skill/shiyuan2.mp3 differ diff --git a/audio/skill/spweiwu1.mp3 b/audio/skill/spweiwu1.mp3 new file mode 100644 index 000000000..d69f9e364 Binary files /dev/null and b/audio/skill/spweiwu1.mp3 differ diff --git a/audio/skill/spweiwu2.mp3 b/audio/skill/spweiwu2.mp3 new file mode 100644 index 000000000..6b06c8800 Binary files /dev/null and b/audio/skill/spweiwu2.mp3 differ diff --git a/audio/skill/xianshuai1.mp3 b/audio/skill/xianshuai1.mp3 new file mode 100644 index 000000000..b65d15594 Binary files /dev/null and b/audio/skill/xianshuai1.mp3 differ diff --git a/audio/skill/xianshuai2.mp3 b/audio/skill/xianshuai2.mp3 new file mode 100644 index 000000000..f22bdcf17 Binary files /dev/null and b/audio/skill/xianshuai2.mp3 differ diff --git a/card/standard.js b/card/standard.js index 2c04eb244..9983185c6 100644 --- a/card/standard.js +++ b/card/standard.js @@ -1382,8 +1382,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } } if(event.card.yingbian){ - var cardx=event.getParent().respondTo[1]; - if(cardx&&cardx.cards&&cardx.cards.filterInD().length) player.gain(cardx.cards.filterInD(),'gain2','log'); + var cardx=event.getParent().respondTo; + if(cardx&&cardx[1]&&cardx[1].cards&&cardx[1].cards.filterInD().length) player.gain(cardx[1].cards.filterInD(),'gain2','log'); } }, }, diff --git a/card/yingbian.js b/card/yingbian.js index 7558d2260..17be1f09d 100644 --- a/card/yingbian.js +++ b/card/yingbian.js @@ -251,6 +251,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } }); }, + ai:{ + basic:{ + equipValue:0.5 + } + }, }, taigongyinfu:{ audio:true, @@ -398,23 +403,28 @@ game.import('card',function(lib,game,ui,get,ai,_status){ 'step 0' player.chooseTarget(function(card,player,target){ return !target.isLinked(); - },'是否发动【太公阴符】横置一名角色?').set('',function(target){ + },'是否发动【太公阴符】横置一名角色?').set('ai',function(target){ return get.effect(target,{name:'tiesuo'},_status.event.player,_status.event.player); }); 'step 1' if(result.bool){ var target=result.targets[0]; - player.logSkill('taigongyinfu_skill',target); + player.logSkill('taigongyinfu_link',target); target.link(); } }, + ai:{ + expose:0.2, + }, }, _yingbian:{ trigger:{player:'useCard1'}, forced:true, popup:false, firstDo:true, + ruleSkill:true, filter:function(event,player){ + if(event.card.yingbian) return false; var bool=player.hasSkillTag('forceYingbian'); var card=event.card; if(get.cardtag(card,'yingbian_kongchao')&&(!player.countCards('h')||bool)) return true; @@ -440,7 +450,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ player.popup('富甲','orange'); bool=true; } - else if(player.hasSkillTag('forceYingbian')) bool=true; + else if(player.hasSkillTag('forceYingbian')){ + player.popup('应变','metal'); + bool=true; + } if(bool){ game.log(player,'触发了',card,'的应变条件'); event.goto(10); @@ -591,6 +604,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ target.discard(event.zhuzhanresult2.cards); target.popup('助战','wood'); game.log(target,'响应了',player,'发起的助战'); + target.addExpose(0.2); } else event.finish(); 'step 10' diff --git a/character/extra.js b/character/extra.js index 33b9aa33c..93afe1d94 100755 --- a/character/extra.js +++ b/character/extra.js @@ -12,7 +12,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ extra_shan:['shen_zhaoyun','shen_simayi'], extra_yin:['shen_liubei','shen_luxun'], extra_lei:['shen_ganning','shen_zhangliao'], - extra_key:['key_kagari','key_shiki'], + extra_key:['key_kagari','key_shiki','key_hina'], extra_ol:['ol_zhangliao','shen_caopi','shen_zhenji'], extra_offline:['shen_diaochan'], extra_mini:['mini_zhugeliang','mini_lvbu'], @@ -21,7 +21,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ character:{ key_kagari:['female','shen',3,['kagari_zongsi'],['key']], key_shiki:['female','shen','3/5',['shiki_omusubi'],['key']], - //key_hina:['female','shen',3,[],['key']], + key_hina:['female','shen',3,['hina_shenxian','hina_mashu','hina_tieji'],['key','hiddenSkill']], shen_diaochan:['female','shen',3,['meihun','huoxin'],['qun']], shen_guanyu:['male','shen',5,['new_wuhun','wushen'],['shu']], @@ -64,8 +64,168 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + hina_shenxian:{ + hiddenSkill:true, + trigger:{player:'showCharacterAfter'}, + forced:true, + filter:function(event,player){ + return event.toShow.contains('key_hina'); + }, + content:function(){ + player.equip(game.createCard('hina_shenji','diamond',13)); + }, + }, + hina_mashu:{ + mod:{ + globalFrom:function(from,to,distance){ + return distance-1; + } + }, + }, + hina_tieji:{ + shaRelated:true, + trigger:{player:'useCardToPlayered'}, + check:function(event,player){ + return get.attitude(player,event.target)<0; + }, + filter:function(event,player){ + return event.card.name=='sha'; + }, + logTarget:'target', + content:function(){ + "step 0" + player.judge(function(){return 0}); + if(!trigger.target.hasSkill('fengyin')){ + trigger.target.addTempSkill('fengyin'); + } + "step 1" + var suit=result.suit; + if(result.suit=='spade'){ + var id=trigger.target.playerid; + var map=trigger.customArgs; + if(!map[id]) map[id]={}; + if(!map[id].extraDamage) map[id].extraDamage=0; + map[id].extraDamage++; + } + var target=trigger.target; + var num=target.countCards('h','shan'); + target.chooseToDiscard('请弃置一张'+get.translation(suit)+'牌,否则不能使用闪抵消此杀','he',function(card){ + return get.suit(card)==_status.event.suit; + }).set('ai',function(card){ + var num=_status.event.num; + if(num==0) return 0; + if(card.name=='shan') return num>1?2:0; + return 8-get.value(card); + }).set('num',num).set('suit',suit); + "step 2" + if(!result.bool){ + trigger.directHit.add(trigger.target); + } + }, + ai:{ + ignoreSkill:true, + skillTagFilter:function(player,tag,arg){ + if(!arg||arg.isLink||!arg.card||arg.card.name!='sha') return false; + if(!arg.target||get.attitude(player,arg.target)>=0) return false; + if(!arg.skill||!lib.skill[arg.skill]||lib.skill[arg.skill].charlotte||get.is.locked(arg.skill)||!arg.target.getSkills(true,false).contains(arg.skill)) return false; + }, + }, + }, + hina_guixin:{ + trigger:{ + player:"phaseZhunbeiBegin", + }, + filter:function(event,player){ + return player.hasSkill('hina_shenxian'); + }, + content:function(){ + "step 0" + var targets=game.filterPlayer(); + targets.remove(player); + targets.sort(lib.sort.seat); + event.targets=targets; + "step 1" + event.num=0; + player.line(targets,'green'); + player.chooseControl('手牌区','装备区','判定区').set('ai',function(){ + if(game.hasPlayer(function(current){ + return current.countCards('j')&¤t!=player&&get.attitude(player,current)>0; + })) return 2; + return Math.floor(Math.random()*3); + }).set('prompt','请选择优先获得的区域'); + "step 2" + event.range={ + 手牌区:['h','e','j'], + 装备区:['e','h','j'], + 判定区:['j','h','e'], + }[result.control||'手牌区']; + "step 3" + if(num阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本回合你的锦囊牌均视为雷【杀】且无使用次数限制。'; @@ -3815,7 +3993,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shiki_omusubi:'御结', shiki_omusubi_info:'一轮游戏开始时,你可以减1点体力上限,然后将一名其他角色武将牌上的技能加入到你的武将牌上。', shiki_omusubi_append:'来吧,羽依里。用你的手,让我变成那只真正的鬼吧!', - //key_hina:'佐藤雏', + key_hina:'佐藤雏', + hina_shenxian:'神现', + hina_shenxian_info:'隐匿技,锁定技,当你明置此武将牌时,你将一张【神机】置入装备区。', + hina_mashu:'马术', + hina_mashu_info:'锁定技,你计算于其他角色的距离时始终-1。', + hina_tieji:'铁骑', + hina_tieji_info:'当你使用【杀】指定目标后,你可进行判定。你令目标角色的所有非锁定技失效直到回合结束。除非其弃置一张与判定结果花色相同的牌,则其不能响应此【杀】。若判定结果为♠,则此【杀】对其的伤害+1。', + + hina_shenji:'神机', + hina_shenji_info:'若你拥有技能〖神现〗,则你可以于准备阶段发动〖归心〗,并可于结束阶段发动〖神愤〗。', + hina_guixin:'归心', + hina_shenfen:'神愤', extra_feng:'神话再临·风', extra_huo:'神话再临·火', diff --git a/character/rank.js b/character/rank.js index cabd5d222..9f919d8e5 100644 --- a/character/rank.js +++ b/character/rank.js @@ -32,6 +32,7 @@ window.noname_character_rank={ 'key_yuri', 'key_yui', 'key_lucia', + 'key_hina', 'sp_key_kanade', 'key_shizuru', ], @@ -610,6 +611,8 @@ window.noname_character_rank={ 'sp_wangyuanji', 'sp_xinxianying', 'sp_liuxie', + 'hanfu', + 're_quyi', 'key_kengo', 'key_riki', 'key_hinata', @@ -1082,6 +1085,7 @@ window.noname_character_rank={ 'key_godan', 're_machao', 're_sunben', + 'ol_dingyuan', 'key_tomoya', 'key_masato', 'key_shiorimiyuki', @@ -1093,6 +1097,7 @@ window.noname_character_rank={ 'key_noda', 'key_shiina', 'key_shiroha', + 'key_hina', ], epic:[ 'pal_yueqi', @@ -1508,8 +1513,9 @@ window.noname_character_rank={ 'xin_lingtong', 'xin_liubiao', 're_xinxianying', - 'ol_dingyuan', 'wangrong', + 're_quyi', + 'hanfu', ], junk:[ 'sunshao', diff --git a/character/refresh.js b/character/refresh.js index e30db7200..5cc0fab40 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -6852,7 +6852,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.target.addTempSkill('fengyin'); } "step 1" - var suit=get.suit(result.card); + var suit=result.suit; var target=trigger.target; var num=target.countCards('h','shan'); target.chooseToDiscard('请弃置一张'+get.translation(suit)+'牌,否则不能使用闪抵消此杀','he',function(card){ diff --git a/character/shenhua.js b/character/shenhua.js index 7b87a7198..24857f1d6 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -7188,7 +7188,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhurong:['re_zhurong','zhurong'], sunjian:['ol_sunjian','re_sunjian','sunjian'], jiaxu:['jiaxu','sp_jiaxu','ns_jiaxu'], - dongzhuo:['ol_dongzhuo','re_dongzhuo','dongzhuo'], + dongzhuo:['ol_dongzhuo','sp_dongzhuo','re_dongzhuo','dongzhuo'], dengai:['re_dengai','ol_dengai','dengai'], zhanghe:['zhanghe','sp_zhanghe','yj_zhanghe'], jiangwei:['re_jiangwei','sp_jiangwei','mini_jiangwei','jiangwei'], diff --git a/character/sp.js b/character/sp.js index 8f5d90cdf..a65c49655 100755 --- a/character/sp.js +++ b/character/sp.js @@ -143,6 +143,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wangyun:['male','qun',4,['xinlianji','xinmoucheng']], sunqian:['male','shu',3,['qianya','shuimeng']], xizhicai:['male','wei',3,['tiandu','xianfu','chouce']], + quyi:['male','qun',4,['fuqi','jiaozi']], luzhi:['male','wei',3,['qingzhongx','weijing']], @@ -540,12 +541,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, spweiwu:{ + audio:2, enable:'phaseUse', usable:1, viewAs:{name:'shunshou'}, filterCard:{color:'red'}, position:'he', - audio:'xiaoxi', check:function(card){ return 7-get.value(card); }, @@ -14689,7 +14690,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ caoang:['caoang','yj_caoang','tw_caoang'], caohong:['caohong','tw_caohong'], xiahouba:['re_xiahouba','xiahouba'], - maliang:['maliang','re_maliang','ol_maliang','old_maliang'], + maliang:['maliang','re_maliang','tw_maliang','ol_maliang','old_maliang'], dingfeng:['dingfeng','tw_dingfeng'], zumao:['zumao','tw_zumao'], beimihu:['tw_beimihu','beimihu'], @@ -14701,7 +14702,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangliang:['re_zhangliang','zhangliang'], lingju:['lingju','old_lingju'], guansuo:['guansuo','ol_guansuo'], - zhangxingcai:['old_zhangxingcai'], + zhangxingcai:['zhangxingcai','old_zhangxingcai'], }, translate:{ "xinfu_lingren":"凌人", @@ -15538,6 +15539,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spmouzhu_info:'出牌阶段限一次,你可以从“距离为1”或“体力值等于你”中选择一个条件,然后令此时所有满足条件的角色依次进行以下结算:交给你一张手牌,然后若其手牌数小于你,则其视为对你使用一张【杀】或【决斗】。', xiaoxi:'骁袭', xiaoxi_info:'当你登场时,你可以视为使用一张【杀】。', + quyi:'OL麴义', sp_default:"常规", sp_zhongdan:"忠胆英杰", diff --git a/character/sp2.js b/character/sp2.js index 6f393bdb2..68b47943e 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -6,7 +6,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ character:{ jin_zhangchunhua:['female','jin',3,['huishi','qingleng','xuanmu'],['hiddenSkill']], jin_simayi:['male','jin',3,['buchen','smyyingshi','xiongzhi','quanbian'],['hiddenSkill']], - quyi:['male','qun',4,['fuqi','jiaozi']], + hanfu:['male','qun',4,['hfjieying','weipo']], + re_quyi:['male','qun',4,['refuqi','jiaozi']], dongxie:['female','qun','3/4',['juntun','jiaojie']], re_xinxianying:['female','wei',3,['rezhongjian','recaishi']], wangrong:['female','qun',3,['minsi','jijing','zhuide']], @@ -85,7 +86,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_baigei:['re_panfeng','xingdaorong','caoxing'], sp_guandu:["sp_zhanghe","xunchen","sp_shenpei","gaolan","lvkuanglvxiang","chunyuqiong","sp_xuyou"], sp_huangjin:['liuhong','zhujun','re_hejin','re_hansui','liubian'], - sp_fadong:['ol_dingyuan','wangrong','quyi'], + sp_fadong:['ol_dingyuan','wangrong','re_quyi','hanfu'], sp_decade:['wulan','leitong','huaman','wangshuang','wenyang','re_liuzan','re_sunluyu','caobuxing','ol_yujin','re_maliang','xin_baosanniang','re_xinxianying','dongxie'], sp_mini:["mini_sunquan","mini_zuoci","mini_jiangwei","mini_diaochan","mini_zhangchunhua"], sp_luanwu:["ns_lijue","ns_zhangji","ns_fanchou"], @@ -94,6 +95,159 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, skill:{ + hfjieying:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('hfjieying'),lib.filter.notMe).set('ai',function(target){ + var player=_status.event.player; + return get.attitude(player,target)*(1+target.countCards('h',function(card){ + return !get.tag(card,'damage')&&target.hasValueTarget(card); + }))/(1+target.countCards('h')); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('hfjieying',target); + target.addTempSkill('hfjieying2',{player:'phaseJieshuBegin'}); + } + }, + ai:{ + expose:0.05, + }, + }, + hfjieying2:{ + mod:{ + playerEnabled:function(card,player,target){ + if(player.storage.hfjieying2&&player!=target) return false; + }, + targetInRange:function(card,player){ + if(player==_status.currentPhase&&(card.name=='sha'||get.type(card)=='trick')) return true; + }, + aiOrder:function(player,card,num){ + var info=get.info(card); + if(!get.tag(card,'damage')&&(!info||!info.toself)) return num+8; + }, + }, + onremove:true, + trigger:{player:'useCard2'}, + direct:true, + filter:function(event,player){ + if(player!=_status.currentPhase) return false; + var card=event.card; + if(card.name!='sha'&&get.type(card)!='trick')return false; + var info=get.info(card); + if(info.allowMultiple==false) return false; + if(event.targets&&!info.multitarget){ + if(game.hasPlayer(function(current){ + return !event.targets.contains(current)&&lib.filter.targetEnabled2(card,player,current); + })){ + return true; + } + } + return false; + }, + content:function(){ + 'step 0' + var prompt2='为'+get.translation(trigger.card)+'增加一个目标' + player.chooseTarget(get.prompt('hfjieying2'),function(card,player,target){ + var player=_status.event.player; + return !_status.event.targets.contains(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); + }).set('prompt2',prompt2).set('ai',function(target){ + var trigger=_status.event.getTrigger(); + var player=_status.event.player; + return get.effect(target,trigger.card,player,player); + }).set('card',trigger.card).set('targets',trigger.targets); + 'step 1' + if(result.bool){ + if(!event.isMine()) game.delayx(); + event.targets=result.targets; + } + else{ + event.finish(); + } + 'step 2' + if(event.targets){ + player.logSkill('hfjieying2',event.targets); + trigger.targets.addArray(event.targets); + } + }, + group:'hfjieying3', + mark:true, + intro:{ + content:function(player){ + if(player) return '不能对其他角色使用牌直到回合结束'; + return '使用【杀】或普通锦囊牌时无距离限制且可以多指定一个目标'; + }, + }, + }, + hfjieying3:{ + trigger:{source:'damageSource'}, + forced:true, + popup:false, + filter:function(event,player){ + return !player.storage.hfjieying2&&player==_status.currentPhase; + }, + content:function(){ + player.storage.hfjieying2=true; + }, + }, + weipo:{ + audio:2, + trigger:{target:'useCardToTargeted'}, + forced:true, + filter:function(event,player){ + return player!=event.player&&!player.hasSkill('weipo3')&&player.countCards('h')player.countCards('h'); + }, + content:function(){ + 'step 0' + player.addTempSkill('weipo3',{player:'phaseBegin'}); + if(player.countCards('h')&&trigger.player.isAlive()){ + player.chooseCard('h',true,'将一张手牌交给'+get.translation(trigger.player)); + } + else event.finish(); + 'step 1' + if(result.bool){ + trigger.player.gain(result.cards,player,'giveAuto'); + } + }, + }, + weipo3:{charlotte:true}, + refuqi:{ + audio:'fuqi', + forced:true, + trigger:{ + player:"useCard", + }, + filter:function(event,player){ + return event.card&&(get.type(event.card)=='trick'||get.type(event.card)=='basic'&&!['shan','tao','jiu','du'].contains(event.card.name))&&game.hasPlayer(function(current){ + return current!=player&&get.distance(player,current)<=1; + }); + }, + content:function(){ + trigger.directHit.addArray(game.filterPlayer(function(current){ + return current!=player&&get.distance(player,current)<=1; + })); + }, + }, zhuide:{ audio:2, trigger:{player:'die'}, @@ -140,6 +294,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, smyyingshi:{ + audio:2, enable:'phaseUse', locked:true, onChooseToUse:function(event){ @@ -169,6 +324,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, xiongzhi:{ + audio:2, enable:'phaseUse', limited:true, skillAnimation:true, @@ -211,6 +367,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, quanbian:{ + audio:2, trigger:{player:['useCard','respond']}, hasHand:function(event){ var evts=event.player.getHistory('lose',function(evt){ @@ -283,6 +440,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, juntun:{ + audio:2, trigger:{player:'phaseZhunbeiBegin'}, forced:true, filter:function(event,player){ @@ -294,6 +452,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, jiaojie:{ + audio:2, mod:{ ignoredHandcard:function(card,player){ if(get.color(card)=='red'){ @@ -1280,6 +1439,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, cixiao:{ + audio:2, trigger:{player:'phaseZhunbeiBegin'}, direct:true, filter:function(event,player){ @@ -1392,6 +1552,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, xianshuai:{ + audio:2, trigger:{global:'damageEnd'}, forced:true, filter:function(event,player){ @@ -1399,8 +1560,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ player.addTempSkill('xianshuai2','roundStart'); - if(trigger.source!=player) player.draw(); - else if(trigger.player.isAlive()){ + player.draw(); + if(player==trigger.source&&trigger.player.isAlive()){ player.line(trigger.player,'green'); trigger.player.damage(); } @@ -1408,6 +1569,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, xianshuai2:{}, shiyuan:{ + audio:2, trigger:{target:'useCardToTargeted'}, frequent:true, filter:function(event,player){ @@ -1422,6 +1584,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, dushi:{ + audio:2, global:'dushi2', locked:true, trigger:{player:'die'}, @@ -1542,6 +1705,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, yujue:{ + audio:2, derivation:'zhihu', enable:'phaseUse', usable:1, @@ -1560,6 +1724,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ list.push('cancel2'); return list; }, + check:function(event,player){ + for(var i=5;i>0;i--){ + if(player.isEmpty(i)) return ('equip'+i); + } + return 'cancel2'; + }, backup:function(result){ var next=get.copy(lib.skill.yujuex); next.position=result.control; @@ -1573,9 +1743,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(game.hasPlayer(function(target){ if(player==target) return false; var hs=target.countCards('h'); - return hs>0&&!game.hasPlayer(function(current){ - return current!=player&¤t!=target&¤t.countCards('h')>hs; - })&&get.attitude(player,target)>0; + return hs>2&&get.attitude(player,target)>0; })) return 1; return 0; }, @@ -1593,10 +1761,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })){ player.chooseTarget(true,'选择一名角色交给你一张牌并获得技能〖执笏〗',function(card,player,target){ if(player==target) return false; - var hs=target.countCards('h'); - return hs>0&&!game.hasPlayer(function(current){ - return current!=player&¤t!=target&¤t.countCards('h')>hs; - }); + return target.countCards('h')>0; }).set('ai',function(target){ return get.attitude(_status.event.player,target)*target.countCards('h'); }); @@ -1651,6 +1816,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, tuxing:{ + audio:2, trigger:{player:'disableEquipAfter'}, forced:true, content:function(){ @@ -1669,18 +1835,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damageBegin1'}, forced:true, charlotte:true, - filter:function(event,player){ - return event.getParent().name=='sha'; - }, content:function(){ trigger.num++; }, mark:true, intro:{ - content:'因执行【杀】的效果造成伤害时,此伤害+1', + content:'造成伤害时,此伤害+1', }, }, gongjian:{ + audio:2, trigger:{player:'useCardToPlayered'}, usable:1, logTarget:'target', @@ -1710,6 +1874,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, kuimang:{ + audio:2, trigger:{global:'dieAfter'}, forced:true, filter:function(event,player){ @@ -7072,6 +7237,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liubian:'刘辩(176年-190年3月6日),是汉灵帝刘宏与何皇后的嫡长子。刘辩在灵帝驾崩后继位为帝,史称少帝,由于年幼,实权掌握在临朝称制的母亲何太后和母舅大将军何进手中。少帝在位时期,东汉政权已经名存实亡,他即位后不久即遭遇以何进为首的外戚集团和以十常侍为首的内廷宦官集团这两大敌对政治集团的火并,被迫出宫,回宫后又受制于以“勤王”为名进京的凉州军阀董卓,终于被废为弘农王,成为东汉唯一被废黜的皇帝,其同父异母弟陈留王刘协继位为帝,是为汉献帝。被废黜一年之后,刘辩在董卓胁迫下自尽,时年仅十五岁(一说十八岁),其弟献帝追谥他为怀王。中国古代的史书中称刘辩为皇子辩、少帝和弘农王等。因为在位不逾年,传统上称东汉共十二帝,刘辩与东汉另一位少帝刘懿都不在其中,亦皆无本纪;不过,现代史学界也有观点承认两位少帝均是汉朝皇帝,则刘辩为东汉第十三位皇帝。', luyusheng:'陆郁生(?年-?),三国时期吴国官员陆绩之女。陆郁生的父亲陆绩是吴郡公认的才子,又是当时吴郡陆氏的领袖。陆绩赴任担任郁林太守,遂取此名。陆郁生年少的时候就定下坚贞的志向。建安二十四年(219年),陆绩早亡,她与两个兄弟陆宏、陆睿当时都只有几岁,一起返回吴县,被他们的从兄陆瑁接回抚养。13周岁的陆郁生嫁给同郡出身的张白为妻。出嫁3个月后,张白因为其兄张温一族的案件遭到连坐,被处以流刑,后死于流放地,陆郁生成为了寡妇,其后公开宣言不再改嫁,困难于生计但拒绝了所有提亲,在艰苦中从未停止服侍、照顾张白的姐妹。事情传到朝廷,皇帝褒奖陆郁生,号其为“义姑”。她的表侄姚信在文集中称赞她的义举。', wangrong:'汉灵怀皇后王荣(?~181年),赵国邯郸(今河北邯郸市)人。五官中郎将王苞孙女,汉灵帝刘宏妃子,汉献帝刘协生母。初以良家子选入掖庭,封为美人,服侍汉灵帝。光和四年(181年),生下陈留王刘协,惨遭灵思皇后毒杀。王荣死后,汉灵帝曾作《追德赋》、《令仪颂》。永汉元年(189年),其子刘协即位,是为汉献帝,追谥灵怀皇后,葬于文昭陵。', + hanfu:'韩馥(?—191年),字文节,颍川郡(今河南禹州)人。东汉末年的诸侯,冀州牧。韩馥担任过东汉的御史中丞,之后被董卓举荐为冀州牧;在各诸侯起兵讨伐董卓时,韩馥也是其中之一的参与者。韩馥与袁绍也曾经有意立刘虞为皇帝。当时冀州民殷人盛,兵粮优足,于是袁绍便用计夺取冀州,韩馥被迫投靠张邈;之后张邈与袁绍的使者见面,韩馥以为是要来杀害自己的,于是在厕所中以刻书用的小刀自杀。', }, characterTitle:{ wulan:'#b对决限定武将', @@ -7126,6 +7292,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huangfusong:['huangfusong','old_huangfusong'], wenyang:['wenyang','diy_wenyang'], dingyuan:['ol_dingyuan','dingyuan'], + quyi:['quyi','re_quyi'], }, translate:{ lijue:"李傕", @@ -7417,13 +7584,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liuhong:'刘宏', yujue:'鬻爵', yujue_backup:'鬻爵', - yujue_info:'出牌阶段限一次,你可以废除一个装备栏,然后令除你之外手牌数最多的一名其他角色交给你一张手牌。其获得〖执笏〗直到你的下回合开始。', + yujue_info:'出牌阶段限一次,你可以废除一个装备栏,然后令一名有手牌的其他角色交给你一张手牌。其获得〖执笏〗直到你的下回合开始。', zhihu:'执笏', zhihu_mark:'执笏', zhihu_info:'锁定技,每回合限两次,当你对其他角色造成伤害后,你摸两张牌。', tuxing:'图兴', tuxing2:'图兴', - tuxing_info:'锁定技,当你废除一个装备栏时,你加1点体力上限并回复1点体力。然后若你所有的装备栏均已被废除,则你减4点体力上限,且本局游戏内使用【杀】造成的伤害+1。', + tuxing_info:'锁定技,当你废除一个装备栏时,你加1点体力上限并回复1点体力。然后若你所有的装备栏均已被废除,则你减4点体力上限,且本局游戏内造成的伤害+1。', re_hejin:'何进', xin_baosanniang:'鲍三娘', decadexushen:"许身", @@ -7444,7 +7611,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ panshi:'叛弑', panshi_info:'锁定技,准备阶段,你交给有“慈孝”技能的角色一张手牌;当你于出牌阶段因使用【杀】对其他角色造成伤害时,若其拥有技能“慈孝”,则此伤害+1,且你结束出牌阶段。', xianshuai:'先率', - xianshuai_info:'锁定技,有角色造成伤害后,若此伤害是本轮第一次造成伤害,且伤害来源是其他角色,则你摸一张牌;若伤害来源是你,则你对受伤角再造成1点伤害。', + xianshuai_info:'锁定技,有角色造成伤害后,若此伤害是本轮第一次造成伤害:你摸一张牌;若伤害来源是你,则你对受伤角再造成1点伤害。', luyusheng:'陆郁生', wangrong:'王荣', minsi:'敏思', @@ -7526,7 +7693,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ quanbian2:'权变', quanbian_info:'当你于出牌阶段内使用/打出手牌时,若此牌有花色且你本回合内未使用/打出过该花色的其他手牌,则你可以选择一项:①摸一张牌。②将牌堆顶X张牌中的一张置于牌堆底(X为你的体力上限)。若你发动此技能,则你本回合内不能再使用与此牌花色相同的手牌。', re_hansui:'韩遂', - quyi:'麴义', + re_quyi:'麴义', + refuqi:'伏骑', + refuqi_info:'锁定技,当你使用牌时,你令所有距离为1的其他角色不能使用或打出牌响应此牌。', + hanfu:'韩馥', + hfjieying:'节应', + hfjieying2:'节应', + hfjieying3:'节应', + hfjieying_info:'结束阶段,你可以选择一名其他角色,该角色下回合使用【杀】或普通锦囊牌无距离限制且可多指定一个目标,且当其造成伤害后,其无法再使用牌直到回合结束。 ', + weipo:'危迫', + weipo_info:'锁定技,其他角色使用【杀】或普通锦囊牌指定你为目标后,若你的手牌数小于X,则你记录自己此时的手牌数为Y并将手牌摸至X张。此牌结算结束后,若你的手牌数小于Y,则你将一张手牌交给此牌的使用者,且此技能失效直到你的下回合开始。(X为你的体力上限且至多为5) ', + sp_yingbian:'应变篇', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", diff --git a/character/yijiang.js b/character/yijiang.js index 6f6858a87..7e8f823b4 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -1102,7 +1102,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, chooseButton:{ dialog:function(event,player){ - var list=[]; + var list=[]; for(var i=0;i=this.maxHp) this.hp=this.maxHp; - if(this.storage.nohp) return; var hp=this.node.hp; hp.style.transition='none'; game.broadcast(function(player,hp,maxHp,hujia){ @@ -17027,74 +17026,76 @@ this.unmarkSkill('ghujia'); } } - if(this.maxHp==Infinity){ - hp.innerHTML='∞'; - } - else if(game.layout=='default'&&this.maxHp>14){ - hp.innerHTML=this.hp+'/'+this.maxHp; - hp.classList.add('text'); - } - else if(get.is.newLayout()&& - ( - this.maxHp>9|| - (this.maxHp>5&&this.classList.contains('minskin'))|| - ((game.layout=='mobile'||game.layout=='long')&&this.dataset.position==0&&this.maxHp>7) - )){ - hp.innerHTML=this.hp+'
/
'+this.maxHp+'
'; - if(this.hp==0){ - hp.lastChild.classList.add('lost'); + if(!this.storage.nohp){ + if(this.maxHp==Infinity){ + hp.innerHTML='∞'; } - hp.classList.add('textstyle'); - // hp.classList.remove('long'); - } - else{ - hp.innerHTML=''; - hp.classList.remove('text'); - hp.classList.remove('textstyle'); - while(this.maxHp>hp.childNodes.length){ - ui.create.div(hp); + else if(game.layout=='default'&&this.maxHp>14){ + hp.innerHTML=this.hp+'/'+this.maxHp; + hp.classList.add('text'); } - while(Math.max(0,this.maxHp)9|| + (this.maxHp>5&&this.classList.contains('minskin'))|| + ((game.layout=='mobile'||game.layout=='long')&&this.dataset.position==0&&this.maxHp>7) + )){ + hp.innerHTML=this.hp+'
/
'+this.maxHp+'
'; + if(this.hp==0){ + hp.lastChild.classList.add('lost'); } + hp.classList.add('textstyle'); + // hp.classList.remove('long'); } - // if(this.maxHp==9){ - // hp.classList.add('long'); - // } - // else{ - // hp.classList.remove('long'); - // } + else{ + hp.innerHTML=''; + hp.classList.remove('text'); + hp.classList.remove('textstyle'); + while(this.maxHp>hp.childNodes.length){ + ui.create.div(hp); + } + while(Math.max(0,this.maxHp)Math.round(this.maxHp/2)||this.hp===this.maxHp){ + hp.dataset.condition='high'; + } + else if(this.hp>Math.floor(this.maxHp/3)){ + hp.dataset.condition='mid'; + } + else{ + hp.dataset.condition='low'; + } + + setTimeout(function(){ + hp.style.transition=''; + }); } - if(hp.classList.contains('room')){ - hp.dataset.condition='high'; - } - else if(this.hp==0){ - hp.dataset.condition=''; - } - else if(this.hp>Math.round(this.maxHp/2)||this.hp===this.maxHp){ - hp.dataset.condition='high'; - } - else if(this.hp>Math.floor(this.maxHp/3)){ - hp.dataset.condition='mid'; - } - else{ - hp.dataset.condition='low'; - } - - setTimeout(function(){ - hp.style.transition=''; - }); var numh=this.countCards('h'); if(_status.video){ numh=arguments[0]; @@ -25270,8 +25271,8 @@ forced:true, popup:false, priority:25, - filter:function(event,player){ - return player.isUnseen(2)&&get.mode()!='guozhan'; + filter:function(event,player,name){ + return player.isUnseen(2)&&get.mode()!='guozhan'&&(name=='phaseBeginStart'||event.num<0); }, content:function(){ if(trigger.name=='loseMaxHp') trigger.cancel(); @@ -26361,7 +26362,7 @@ ui.create.connecting(true); }, roomlist:function(list,events,clients,wsid){ - game.send('server','key',game.onlineKey); + game.send('server','key',[game.onlineKey,lib.version]); game.online=true; game.onlinehall=true; lib.config.recentIP.remove(_status.ip); @@ -26932,7 +26933,12 @@ }, denied:function(reason){ switch(reason){ - case 'version':alert('加入失败:版本不匹配');break; + case 'version': + alert('加入失败:版本不匹配,请将游戏更新至最新版'); + game.saveConfig('tmp_owner_roomId'); + game.saveConfig('tmp_user_roomId'); + game.saveConfig('reconnect_info'); + break; case 'gaming':alert('加入失败:游戏已开始');break; case 'number':alert('加入失败:房间已满');break; case 'banned':alert('加入失败:房间拒绝你加入');break; diff --git a/game/server.js b/game/server.js index dba10710d..4328c58c5 100644 --- a/game/server.js +++ b/game/server.js @@ -3,6 +3,7 @@ var wss=new WebSocketServer({port:8080}); var bannedKeys=[]; var bannedIps=[]; + var version='1.9.108'; var rooms=[{},{},{},{},{},{},{},{}]; var systemEvent={ @@ -80,15 +81,22 @@ } }, key:function(id){ - this.onlineKey=id; - clearTimeout(this.keyCheck); - delete this.keyCheck; - if(typeof id!='string'||bannedKeys.indexOf(id)!=-1){ - bannedIps.push(this._socket.remoteAddress); - console.log(id, this._socket.remoteAddress); + if(!id||typeof id!='object'||version!=id[1]){ + console.log(id, this._socket.remoteAddress, '使用旧版本登录'); + this.sendl('denied','version'); this.close(); + clearTimeout(this.keyCheck); + delete this.keyCheck; return; } + else if(bannedKeys.indexOf(id[0])!=-1){ + bannedIps.push(this._socket.remoteAddress); + console.log(id, this._socket.remoteAddress, '被封禁用户登录'); + this.close(); + } + this.onlineKey=id[0]; + clearTimeout(this.keyCheck); + delete this.keyCheck; }, events:function(cfg,id,type){ if(bannedKeys.indexOf(id)!=-1||typeof id!='string'){ diff --git a/game/update.js b/game/update.js index bbe209136..edd2423ad 100644 --- a/game/update.js +++ b/game/update.js @@ -1,15 +1,15 @@ window.noname_update={ - version:'1.9.107', - update:'1.9.106.4.2', + version:'1.9.108', + update:'1.9.107.1', changeLog:[ - '应变篇卡牌包', - '晋司马懿', + '成神之日:佐藤雏', + '新麹义、韩馥', 'bug修复', ], files:[ - 'card/extra.js', - 'card/gujian.js', - 'card/guozhan.js', + //'card/extra.js', + //'card/gujian.js', + //'card/guozhan.js', //'card/gwent.js', //'card/huanlekapai.js', //'card/mtg.js', @@ -20,15 +20,15 @@ window.noname_update={ 'card/yingbian.js', //'card/zhenfa.js', //'card/zhulu.js', - 'character/diy.js', - //'character/extra.js', + //'character/diy.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/old.js', + //'character/old.js', 'character/rank.js', 'character/refresh.js', 'character/shenhua.js', @@ -42,24 +42,24 @@ window.noname_update={ 'character/yijiang.js', //'character/yxs.js', //'extension/boss/extension.js', - 'layout/default/layout.css', + //'layout/default/layout.css', //'layout/nova/layout.css', 'mode/identity.js', - 'mode/doudizhu.js', - 'mode/guozhan.js', + //'mode/doudizhu.js', + //'mode/guozhan.js', //'mode/chess.js', //'mode/tafang.js', - 'mode/single.js', - 'mode/stone.js', + //'mode/single.js', + //'mode/stone.js', //'mode/brawl.js', - 'mode/versus.js', + //'mode/versus.js', 'mode/boss.js', 'game/game.js', //'game/keyWords.js', - //'game/server.js', + 'game/server.js', //'game/NoSleep.js', - 'game/config.js', - 'game/package.js', + //'game/config.js', + //'game/package.js', //'game/asset.js', //'game/source.js', //'theme/style/hp/xinglass.css', diff --git a/image/card/hina_shenji.png b/image/card/hina_shenji.png new file mode 100644 index 000000000..7d6e235a0 Binary files /dev/null and b/image/card/hina_shenji.png differ diff --git a/image/character/hanfu.jpg b/image/character/hanfu.jpg new file mode 100644 index 000000000..e2a998de8 Binary files /dev/null and b/image/character/hanfu.jpg differ diff --git a/image/character/key_hina.jpg b/image/character/key_hina.jpg new file mode 100644 index 000000000..4ca7a2fe2 Binary files /dev/null and b/image/character/key_hina.jpg differ diff --git a/image/character/re_quyi.jpg b/image/character/re_quyi.jpg new file mode 100644 index 000000000..7a9921e59 Binary files /dev/null and b/image/character/re_quyi.jpg differ diff --git a/mode/boss.js b/mode/boss.js index 0ea7bd204..9283a3018 100644 --- a/mode/boss.js +++ b/mode/boss.js @@ -497,6 +497,12 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, fullskin:true, }, + shenzhixiunvfu:{ + type:'equip', + subtype:'equip2', + modeimage:'boss', + fullskin:true, + }, gubuzifeng:{ type:'trick', fullskin:true, @@ -1604,7 +1610,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return name; } else{ - var arr=['shen_caocao','shen_simayi','shen_guanyu','shen_zhugeliang','shen_zhaoyun','shen_zhouyu','shen_lvmeng','shen_lvbu','shen_liubei','shen_luxun','shen_ganning','ol_zhangliao','shen_zhenji','shen_caopi','key_kagari','key_shiki']; + var arr=['shen_caocao','shen_simayi','shen_guanyu','shen_zhugeliang','shen_zhaoyun','shen_zhouyu','shen_lvmeng','shen_lvbu','shen_liubei','shen_luxun','shen_ganning','ol_zhangliao','shen_zhenji','shen_caopi','key_kagari','key_shiki','key_hina']; arr.removeArray(list); return arr.randomGet(); } @@ -1653,7 +1659,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.check(); }); control.backup1=ui.create.div('.buttons'); - control.backup2=ui.create.buttons(['shen_caocao','shen_simayi','shen_guanyu','shen_zhugeliang','shen_zhaoyun','shen_zhouyu','shen_lvmeng','shen_lvbu','shen_liubei','shen_luxun','shen_ganning','ol_zhangliao','shen_zhenji','shen_caopi','key_kagari','key_shiki'],'character',control.backup1); + control.backup2=ui.create.buttons(['shen_caocao','shen_simayi','shen_guanyu','shen_zhugeliang','shen_zhaoyun','shen_zhouyu','shen_lvmeng','shen_lvbu','shen_liubei','shen_luxun','shen_ganning','ol_zhangliao','shen_zhenji','shen_caopi','key_kagari','key_shiki','key_hina'],'character',control.backup1); return control; } }, @@ -1663,7 +1669,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('thedayibecomeagod'); var list=['lebu','bingliang']; for(var i=0;i4); - if(game.zhu.group=='shen'){ + if(game.zhu.group=='shen'&&!game.zhu.isUnseen(0)){ var list=['wei','shu','wu','qun','jin','key']; for(var i=0;i