diff --git a/CHANGELOG.MD b/CHANGELOG.MD index f3c1558cf..330992d77 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,2 +1,4 @@ 1.3.1 战棋模式改进 +单人控制改进 +新武将 diff --git a/card/hearth.js b/card/hearth.js index cd9789279..f9c7bb31d 100644 --- a/card/hearth.js +++ b/card/hearth.js @@ -445,16 +445,23 @@ card.hearth={ shenenshu:{ fullskin:true, enable:true, - usable:1, filterTarget:function(card,player,target){ return target!=player; }, type:'trick', content:function(){ var num=player.num('h')-target.num('h'); - if(num<1) num=1; + if(num<-3) num=-3; if(num>3) num=3; - target.draw(num); + if(num>0){ + target.draw(num); + } + else if(num<0){ + player.draw(-num); + } + else{ + game.asyncDraw([target,player]); + } }, ai:{ order:10, @@ -466,7 +473,18 @@ card.hearth={ if(!player.skills.contains('jizhi')){ nh--; } - return Math.max(1,nh); + if(nh>0) return nh; + if(nh==0) return 1; + return 0; + }, + player:function(player,target){ + var nh=target.num('h')-player.num('h'); + if(!player.skills.contains('jizhi')){ + nh++; + } + if(nh>0) return nh; + if(nh==0) return 1; + return 0; } }, expose:0.2 @@ -589,7 +607,7 @@ card.hearth={ linghunzhihuo:'灵魂之火', linghunzhihuo_info:'对一名角色造成一点火焰伤害,然后随机弃置一张手牌', shenenshu:'神恩术', - shenenshu_info:'对一名其他角色使用,令其摸X张牌,直到手牌数与你相等(X不小于1且不大于3)', + shenenshu_info:'对一名其他角色使用,令你与目标中手牌数较少的摸若干张牌,直到手牌数相等(X不大于3),若手牌数已相等,改为你与目标各摸一张牌', zhiliaobo:'治疗波', zhiliaobo_info:'对一名受伤角色使用,令其回复一点体力,若其仍处于受伤状态,则进行一次判定,若结果为红色则再回复一点体力', yuansuhuimie:'元素毁灭', diff --git a/character/hearth.js b/character/hearth.js index d234e20cb..6b6e90746 100755 --- a/character/hearth.js +++ b/character/hearth.js @@ -174,7 +174,7 @@ character.hearth={ trigger:{global:'dieAfter'}, forced:true, filter:function(event,player){ - return !event.player.storage.bingshi; + return !event.player.storage.bingshi&&event.player.skills.contains('bingshi'); }, content:function(){ 'step 0' @@ -385,7 +385,11 @@ character.hearth={ }, content:function(){ var card=cards[0]; - player.gain(game.createCard('liuxinghuoyu',get.suit(card),get.number(card)),'gain2'); + var card2=get.cardPile('liuxinghuoyu'); + if(!card2){ + card2=game.createCard('liuxinghuoyu',get.suit(card),get.number(card)); + } + player.gain(card2,'gain2'); }, ai:{ order:9, @@ -1467,6 +1471,9 @@ character.hearth={ player.addSkill('tuteng1'); } else{ + if(rand.length>1){ + rand.remove('tuteng1'); + } player.addSkill(rand.randomGet()); } if(rand2.length>=3){ diff --git a/character/refresh.js b/character/refresh.js index 811b2a256..086447452 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -1105,6 +1105,9 @@ character.refresh={ } return target.num('he')>0; }, + filter:function(event,player){ + return player.num('he')>0; + }, filterCard:true, position:'he', selectTarget:[1,Infinity], diff --git a/character/sp.js b/character/sp.js index ad4edac32..3c30ae917 100755 --- a/character/sp.js +++ b/character/sp.js @@ -1729,7 +1729,7 @@ character.sp={ effect:{ target:function(card,player,target){ if(get.tag(card,'damage')){ - if(target.hp==target.maxHp) return [0,1]; + if(target.hp==target.maxHp&&target.hasFriend()) return [0,1]; } if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0]; } diff --git a/character/swd.js b/character/swd.js index 532c87874..3dd5fbf76 100755 --- a/character/swd.js +++ b/character/swd.js @@ -4370,7 +4370,7 @@ character.swd={ frequent:true, content:function(){ "step 0" - event.cards=get.cards(Math.max(3,get.cardCount(true,player)+1)); + event.cards=get.cards(3); player.showCards(event.cards); "step 1" for(var i=0;i0; + }, + filterCard:true, + prompt:'弃置要重铸的牌并摸一张牌', + discard:false, + delay:0.5, + check:function(card,player){ + var val=ai.get.equipValue(card); + var player=_status.event.player; + var cards=player.get('h',{subtype:get.subtype(card)}); + for(var i=0;i=val){ + return 1; + } + } + return 0; + }, + prepare:function(cards,player){ + player.$throw(cards,1000); + }, + content:function(){ + "step 0" + player.draw(); + "step 1" + for(var i=0;i0; + }, + threaten:1.2 + } + }, + zitong:{ + trigger:{player:'useCard'}, + frequent:true, + filter:function(event,player){ + return _status.currentPhase==player&&get.cardCount(true,player)==2; + }, + content:function(){ + var card=get.cardPile('chuansongmen'); + if(!card){ + card=game.createCard('chuansongmen'); + } + player.gain(card,'gain2'); + }, + ai:{ + threaten:1.2 + } + } + }, + translate:{ + xk_dongfangweiming:'东方未明', + xk_guyuexuan:'谷月轩', + xk_jinji:'荆棘', + xk_shenxiangyun:'沈湘芸', + xk_fujianhan:'傅剑寒', + gzhenji:'震击', + gzhenji_info:'你使用杀造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张杀', + rouquan:'柔拳', + rouquan_info:'你可以重铸装备区内的牌;当你没有武器牌时,你的杀可以指定任意个目标', + zuijian:'醉剑', + zuijian_info:'出牌阶段,你可以将一张手牌或装备牌当酒使用;当你使用酒后,你的攻击范围+1', + zitong:'自通', + zitong_info:'当你于自己的回合内使用第二张牌时,你可以将一张传送门置于你的手牌', + }, +} diff --git a/game/game.js b/game/game.js index d884aaa71..6f44817c3 100755 --- a/game/game.js +++ b/game/game.js @@ -6056,7 +6056,7 @@ if(range[0]!=range[1]||range[0]>1) auto=false; for(i=0;i7){ nochess=false; } diff --git a/game/package.js b/game/package.js index 7f251390f..d5d06b5a2 100755 --- a/game/package.js +++ b/game/package.js @@ -17,7 +17,8 @@ character.pack={ swd:'轩辕剑', xswd:'轩辕剑·二', gujian:'古剑奇谭', - xianjian:'仙剑', + xianjian:'仙剑奇侠传', + xiake:'侠客风云传', }; card.pack={ standard:'标准', diff --git a/image/character/default/xk_dongfangweiming.jpg b/image/character/default/xk_dongfangweiming.jpg new file mode 100644 index 000000000..1d4321d5d Binary files /dev/null and b/image/character/default/xk_dongfangweiming.jpg differ diff --git a/image/character/default/xk_fujianhan.jpg b/image/character/default/xk_fujianhan.jpg new file mode 100644 index 000000000..de504f702 Binary files /dev/null and b/image/character/default/xk_fujianhan.jpg differ diff --git a/image/character/default/xk_guyuexuan.jpg b/image/character/default/xk_guyuexuan.jpg new file mode 100644 index 000000000..cb4e87337 Binary files /dev/null and b/image/character/default/xk_guyuexuan.jpg differ diff --git a/image/character/default/xk_jinji.jpg b/image/character/default/xk_jinji.jpg new file mode 100644 index 000000000..bb195d158 Binary files /dev/null and b/image/character/default/xk_jinji.jpg differ diff --git a/image/character/default/xk_shenxiangyun.jpg b/image/character/default/xk_shenxiangyun.jpg new file mode 100644 index 000000000..1a2817f68 Binary files /dev/null and b/image/character/default/xk_shenxiangyun.jpg differ diff --git a/image/character/fullskin/xk_dongfangweiming.jpg b/image/character/fullskin/xk_dongfangweiming.jpg new file mode 100644 index 000000000..85ff56654 Binary files /dev/null and b/image/character/fullskin/xk_dongfangweiming.jpg differ diff --git a/image/character/fullskin/xk_fujianhan.jpg b/image/character/fullskin/xk_fujianhan.jpg new file mode 100644 index 000000000..525352681 Binary files /dev/null and b/image/character/fullskin/xk_fujianhan.jpg differ diff --git a/image/character/fullskin/xk_guyuexuan.jpg b/image/character/fullskin/xk_guyuexuan.jpg new file mode 100644 index 000000000..bdc48daac Binary files /dev/null and b/image/character/fullskin/xk_guyuexuan.jpg differ diff --git a/image/character/fullskin/xk_jinji.jpg b/image/character/fullskin/xk_jinji.jpg new file mode 100644 index 000000000..4cf3de9ed Binary files /dev/null and b/image/character/fullskin/xk_jinji.jpg differ diff --git a/image/character/fullskin/xk_shenxiangyun.jpg b/image/character/fullskin/xk_shenxiangyun.jpg new file mode 100644 index 000000000..9dea7df08 Binary files /dev/null and b/image/character/fullskin/xk_shenxiangyun.jpg differ diff --git a/image/character/next/xk_fengchuixue.png b/image/character/next/xk_fengchuixue.png new file mode 100644 index 000000000..ca0f90c94 Binary files /dev/null and b/image/character/next/xk_fengchuixue.png differ diff --git a/image/character/next/xk_heqiujuan.png b/image/character/next/xk_heqiujuan.png new file mode 100644 index 000000000..7379cbbc9 Binary files /dev/null and b/image/character/next/xk_heqiujuan.png differ diff --git a/image/character/next/xk_jiwen.png b/image/character/next/xk_jiwen.png new file mode 100644 index 000000000..1d1e7c8f1 Binary files /dev/null and b/image/character/next/xk_jiwen.png differ diff --git a/image/character/next/xk_lanting.png b/image/character/next/xk_lanting.png new file mode 100644 index 000000000..34efc5760 Binary files /dev/null and b/image/character/next/xk_lanting.png differ diff --git a/image/character/next/xk_qili.png b/image/character/next/xk_qili.png new file mode 100644 index 000000000..34414f620 Binary files /dev/null and b/image/character/next/xk_qili.png differ diff --git a/image/character/next/xk_qinhongshang.png b/image/character/next/xk_qinhongshang.png new file mode 100644 index 000000000..5ef4b77c8 Binary files /dev/null and b/image/character/next/xk_qinhongshang.png differ diff --git a/image/character/next/xk_shiyan.png b/image/character/next/xk_shiyan.png new file mode 100644 index 000000000..22ce6e4f4 Binary files /dev/null and b/image/character/next/xk_shiyan.png differ diff --git a/image/character/next/xk_xianyin.png b/image/character/next/xk_xianyin.png new file mode 100644 index 000000000..db9451268 Binary files /dev/null and b/image/character/next/xk_xianyin.png differ diff --git a/image/character/next/xk_yecha.png b/image/character/next/xk_yecha.png new file mode 100644 index 000000000..0c28bd72e Binary files /dev/null and b/image/character/next/xk_yecha.png differ diff --git a/layout/default/layout.css b/layout/default/layout.css index 53bf93b80..417bb561f 100755 --- a/layout/default/layout.css +++ b/layout/default/layout.css @@ -30,6 +30,8 @@ table{table-layout: fixed;} #handcards1,#handcards2{white-space:nowrap;overflow-x: scroll;overflow-y:hidden;display: block;text-align: center;} #handcards1{left: 0;top:calc(100% - 140px);} #handcards2{left: calc(50% + 120px);top:calc(100% - 140px);} +#arena.single-handcard #handcards1{width: 100%;} +#arena.single-handcard #handcards2{display: none;} #system{padding: 6px;width: calc(100% - 12px);white-space: nowrap;z-index: 3;} #system>div{height: 100%;position: relative;margin: 0;padding: 0;} #system>div:last-child{text-align: right;float:right} @@ -203,6 +205,16 @@ margin-bottom: 5px; .control{font-size: 18px;white-space: nowrap;position: relative;overflow: hidden;width: 0;opacity:0} .control>div{position: relative;padding: 3px;} /*--------角色--------*/ +.player>.avatar>.action{ + margin: 5px; + font-family: 'huangcao'; + font-size: 20px; + letter-spacing: -2px; + text-shadow: black 0 0 1px, rgba(10, 155, 67, 1) 0 0 5px, rgba(10, 155, 67, 1) 0 0 10px; +} +.player>.avatar:not(.glow2)>.action{opacity: 0} +.player.fakeme{width:100px;height:120px;top:calc(100% - 140px)} +.player.fakeme>.avatar{width: 100%;height: 100%;box-shadow: none;left: 0;top: 0} .player{z-index: 4;width: 240px;height: 120px;} .player.minskin{width:120px;} .player.replaceme{-webkit-animation:replaceme 0.5s} @@ -734,6 +746,7 @@ div[data-nature='soil']{ box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(0, 133, 255, 0.8) 0 0 15px !important; } .glow2{ + /*-webkit-animation:control_glow 4s infinite;*/ box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px !important; } @@ -757,6 +770,14 @@ div[data-nature='soil']{ } /*--------动画--------*/ +@-webkit-keyframes control_glow{ + 0%{box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.45) 0 3px 10px} + 30%{box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px} + 70%{box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px} + 100%{box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.45) 0 3px 10px} + /*from{box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px !important;} + to{box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.45) 0 3px 10px !important}*/ +} @-webkit-keyframes cardflip{ from {-webkit-transform:perspective(600px) rotateY(-90deg) translateX(52px)} to{-webkit-transform:perspective(600px) rotateY(0deg) translateX(0)} diff --git a/mode/boss.js b/mode/boss.js index a9e7970fe..6733a8670 100755 --- a/mode/boss.js +++ b/mode/boss.js @@ -175,7 +175,9 @@ mode.boss={ } ui.create.me(); if(game.me!==boss){ - ui.fakeme=ui.create.div('.player',ui.arena); + game.singleHandcard=true; + ui.arena.classList.add('single-handcard'); + ui.fakeme=ui.create.div('.player'); ui.fakeme.dataset.position=0; ui.fakeme.line=lib.element.player.line; ui.fakemebg=ui.create.div('.avatar',ui.fakeme).hide(); @@ -247,9 +249,15 @@ mode.boss={ event.bosslist.delete(); game.arrangePlayers(); + for(var i=0;inum1){ + if(next.side==game.me.side){ + next=game.me; + } + var str; + if(num2-num1>1){ + str='选择至多'+get.cnNumber(num2-num1)+'个已方角色各摸一张牌' + } + else{ + str='选择一个已方角色摸一张牌' + } + var nevt=next.chooseTarget(str,function(card,player,target){ + return target.side==next.side; + },[1,num2-num1]); + nevt.ai=function(target){ + return Math.max(1,10-target.num('h')); + }; + nevt.chessForceAll=true; + } + else{ + event.goto(2); + } + } + else{ + event.goto(2); + } + "step 1" + if(result.bool){ + game.asyncDraw(result.targets); + } + "step 2" + var players=[]; + var next=null; + if(player.side==game.me.side){ + player=game.me; + } + for(var i=0;i1){ + var nevt=player.chooseTarget('选择下一个行动的角色',function(card,player,target){ + return target.side==player.side&&!target.classList.contains('acted'); + },true); + nevt.chessForceAll=true; + nevt.ai=function(target){ + var nj=target.num('j'); + if(nj){ + return -nj; + } + return Math.max(0,10-target.hp); + } + } + else{ + event.decided=players[0]; + event.player=next; + } + "step 3" + if(event.decided){ + event.decided.phase(); + event.justacted=event.decided; + delete event.decided; + } + else{ + var current=result.targets[0]; + current.phase(); + event.justacted=current; + for(var i=0;i0; @@ -1425,7 +1544,14 @@ mode.chess={ player.chooseToMove(move).phasing=true; "step 1" if(!result.bool){ - player.getStat().skill._chessmove--; + var skill=player.getStat().skill; + skill._chessmove--; + if(typeof skill._chessmovetried=='number'){ + skill._chessmovetried++; + } + else{ + skill._chessmovetried=1; + } } }, ai:{ @@ -1464,6 +1590,9 @@ mode.chess={ return 1; }, player:function(player){ + if(player.getStat().skill._chessmovetried>=10){ + return 0; + } var x=lib.skill._chessmove.ai.result.playerx(player); if(player.isMad()) return -x; return x; @@ -1629,6 +1758,7 @@ mode.chess={ chessscroll_speed_config:'边缘滚动速度', chess_character_config:'战棋武将', only_chess_character_config:'只用战棋武将', + chess_ordered_config:'指定行动顺序', chess_caocao:'曹操', chess_xunyu:'荀彧', @@ -1797,9 +1927,18 @@ mode.chess={ '战棋模式':'
  • n人对战n人的模式,由单人控制,开始游戏后随机分配位置与出牌顺序
  • '+ '每人在出牌阶段有一次移动的机会,若一名角色在移动之前使用过指定其他角色为目标的牌,该回合可移动的最大距离为2,否则最大距离为1
  • '+ '任何卡牌或技能无法指定位置相隔8个格以上的角色为目标
  • '+ - '杀死对方阵营的角色可摸一张牌,杀死本方阵营无惩罚' + '杀死对方阵营的角色可摸一张牌,杀死本方阵营无惩罚
  • '+ + '开启指定行动顺序后,双方将交替行动,在一方行动完毕进行下一轮行动时,若其人数比另一方少,另一方可指定至多X名角色名摸一张牌,X为人数之差' }, config:['battle_number','ban_weak','free_choose','change_choice', + function(game,lib,get,ui){ + var current=get.config('chess_ordered'); + if(typeof current!=='boolean'){ + game.saveConfig('chess_ordered',true,true); + current=true; + } + return ui.create.switcher('chess_ordered',current,ui.click.sidebar.local2); + }, function(game,lib,get,ui){ var current=get.config('chess_character'); if(typeof current!=='boolean'){ diff --git a/mode/versus.js b/mode/versus.js index fb9d2cf37..0159802b2 100755 --- a/mode/versus.js +++ b/mode/versus.js @@ -324,13 +324,17 @@ mode.versus={ delete _status.list; var num=lib.storage.number; ui.create.players(num*2); + for(var i=0;i=4){ ui.arena.dataset.number=parseInt(ui.arena.dataset.number)+1; for(var i=0;i