diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 870d3be95..5f54c5eb5 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,7 +1,2 @@ -1.5.0 -录像功能 -AI改进 -Bug修复 -触屏设备提示 -出牌样式改进 -界面调整 +1.5.2 +明忠模式 diff --git a/character/fire.js b/character/fire.js index 89a5cc5fb..32317b886 100755 --- a/character/fire.js +++ b/character/fire.js @@ -457,7 +457,7 @@ character.fire={ xueyi:{ mod:{ maxHandcard:function(player,num){ - if(player.identity=='zhu'){ + if(player.isZhu){ for(var i=0;i0&&game.zhu.num('h')>0); }, diff --git a/character/standard.js b/character/standard.js index a6440351e..fe30bc155 100755 --- a/character/standard.js +++ b/character/standard.js @@ -46,7 +46,7 @@ character.standard={ unique:true, trigger:{player:'chooseToRespondBegin'}, filter:function(event,player){ - if(player.identity!='zhu') return false; + if(!player.isZhu) return false; if(event.filterCard({name:'shan'})==false) return false; for(var i=0;i0) return false; if(event.player.group!='wu') return false; return true; diff --git a/character/wind.js b/character/wind.js index 5f70c854c..3d8684fba 100755 --- a/character/wind.js +++ b/character/wind.js @@ -407,6 +407,7 @@ character.wind={ }, filter:function(event,player){ if(!game.zhu) return false; + if(!game.zhu.isZhu) return false; return (player!=game.zhu&&game.zhu.skills.contains('huangtian')&&player.group=='qun') }, filterCard:function(card){ diff --git a/character/woods.js b/character/woods.js index e369649a3..fd5debffc 100755 --- a/character/woods.js +++ b/character/woods.js @@ -250,6 +250,7 @@ character.woods={ trigger:{player:'judgeEnd'}, filter:function(event,player){ if(!game.zhu) return false; + if(!game.zhu.isZhu) return false; return (player!=game.zhu&&game.zhu.skills.contains('songwei')&&player.group=='wei'&&get.color(event.result.card)=='black'); }, check:function(event,player){ @@ -603,6 +604,7 @@ character.woods={ trigger:{source:'damageEnd'}, filter:function(event,player){ if(!game.zhu) return false; + if(!game.zhu.isZhu) return false; return (player!=game.zhu&&game.zhu.skills.contains('baonue')&&player.group=='qun')&&game.zhu.hp回复体力
player.recover(num)
  • 摸牌
    player.draw(num)
  • 获得牌
    player.gain(cards)
  • 弃牌
    player.discard(cards)'+ '
  • 使用卡牌
    player.useCard(card,
    targets)
  • 死亡
    player.die()
  • 复活
    player.revive(hp)'+ '
    游戏操作
    • 在命令输入框中输出结果
      game.print(str)
    • 游戏结束
      game.over(bool)'+ - '
    • 角色资料
      lib.character
    • 卡牌资料
      lib.card' + '
    • 角色资料
      lib.character
    • 卡牌资料
      lib.card', + '身份模式':'
      明忠
      • 本模式需要8名玩家进行游戏,使用的身份牌为:1主公、2忠臣、4反贼和1内奸。游戏开始时,每名玩家随机获得一个身份,由系统随机选择一名忠臣身份的玩家亮出身份(将忠臣牌正面朝上放在面前),其他身份(包括主公)的玩家不亮出身份。
      • '+ + '首先由亮出身份的忠臣玩家随机获得六张武将牌,挑选一名角色,并将选好的武将牌展示给其他玩家。之后其余每名玩家随机获得三张武将牌,各自从其中挑选一张同时亮出
      • '+ + '亮出身份牌的忠臣增加1点体力上限。角色濒死和死亡的结算及胜利条件与普通身份局相同。', + '战棋模式':'
        对阵
        • n人对战n人的模式,由单人控制,开始游戏后随机分配位置与出牌顺序
        • '+ + '每人在出牌阶段有一次移动的机会,若一名角色在移动之前使用过指定其他角色为目标的牌,该回合可移动的最大距离为2,否则最大距离为1
        • '+ + '任何卡牌或技能无法指定位置相隔8个格以上的角色为目标
        • '+ + '杀死对方阵营的角色可摸一张牌,杀死本方阵营无惩罚
        • '+ + '开启交替行动后,在一方所有角色行动完毕进行下一轮行动时,若其人数比另一方少,另一方可指定至多X名角色名摸一张牌,X为人数之差
        '+ + '
        统率
        • 收集武将进行战斗,根据战斗难度及我方出场武将的强度,战斗胜利后将获得数量不等的金钱。没有君主出场时,获得的金钱较多
        • '+ + '金钱可以用来招募随机武将,招到已有武将,或遣返不需要的武将时可得到招募令
        • '+ + '战斗中有君主出场时可招降敌将,成功率取决于敌将的稀有度、剩余体力值以及手牌数。成功后战斗立即结束且没有金钱奖励。每发动一次招降,无论成功还是失败,都会扣除10招募令
        • '+ + '挑战武将会与该武将以及与其强度相近的武将进行战斗,敌方人数与我方出场人数相同,但不少于3。胜利后可通过招募令招募该武将
        • '+ + '竞技场:
          随机选择9名武将,每次派出1〜3名武将参战。战斗中阵亡的武将不能再次上场。

          战斗后武将进入疲劳状态,若立即再次出场则初始体力值-1。

          战斗中本方武将行动时可召唤后援,令一名未出场的已方武将加入战斗。后援武将在战斗结束后无论存活与否均不能再次出场

          当取得12场胜利或所有武将全部阵亡后结束,并根据胜场数获得随机奖励', + '炉石模式':'
          • 游戏流程类似1v1,场上有两名主将进行对抗'+ + '
          • 主将出牌阶段的出牌数量(行动值)有上限,先手为2,后手为3,装备牌不计入出牌上限
          • 游戏每进行一轮,主将的出牌上限+1,超过6时减至2并重新累加'+ + '
          • 牌堆中随机加入总量1/3的随从牌,使用之可召唤一个随从,随从出场时背面朝上。每一方在场的随从数不能超过4
          • 随从于摸牌阶段摸牌基数为1,随从的随从牌均视为闪,装备牌均视为杀
          • '+ + '随从与其他所有角色相互距离基数为1
          • '+ + '主将杀死对方随从后获得一个额外的行动值并摸两张牌,杀死己方随从无惩罚,随从杀死随从无效果'+ + '
          • 牌堆中随机加入总量1/6的法术牌,效果主要与随从有关,法术牌根据强度不同可能会消耗额外的行动值'+ + '
          • 主将可重铸随从牌,但回合内总的重铸次数不能超过3,随从不能重铸任何牌(包括铁索等默认可以重铸的牌)'+ + '
          • 嘲讽:若一方阵营中有嘲讽角色,则同阵营的无嘲讽角色不以能成为杀或决斗的目标'+ + '
          • 行动顺序为先主将后随从。主将或随从死亡后立即移出游戏,主将死亡后替补登场,替补登场时摸2+X张牌,X为对方存活的随从数,无替补时游戏结束' }, setPopped:function(node,func,width,height){ node._poppedfunc=func; @@ -1670,10 +1715,6 @@ db.deleteObjectStore('video'); } db.createObjectStore('video',{keyPath:'time'}); - lib.db=db; - for(var i=0;igame.players.length*num&&game.showIdentity){ - if(!_status.video) player.popup('显示身份'); - _status.identityShown=true; - game.showIdentity(false); + if(get.config('identity_mode')!='zhong'){ + var num; + switch(get.config('auto_identity')){ + case 'one':num=1;break; + case 'two':num=2;break; + case 'three':num=3;break; + case 'always':num=-1;break; + default:num=0;break; + } + if(num&&!_status.identityShown&&game.phaseNumber>game.players.length*num&&game.showIdentity){ + if(!_status.video) player.popup('显示身份'); + _status.identityShown=true; + game.showIdentity(false); + } } player.ai.tempIgnore=[]; player.stat.push({card:{},skill:{}}); @@ -7520,6 +7584,19 @@ console.log(player); } }, + playerfocus:function(player){ + if(player){ + player.classList.add('playerfocus'); + ui.arena.classList.add('playerfocus'); + setTimeout(function(){ + player.classList.remove('playerfocus'); + ui.arena.classList.remove('playerfocus'); + },1000); + } + else{ + console.log(player); + } + }, chessSwap:function(content){ var me=game.playerMap[content[0]]; var player=game.playerMap[content[1]]; diff --git a/layout/default/blur.css b/layout/default/blur.css index a5af81129..0323e2f20 100755 --- a/layout/default/blur.css +++ b/layout/default/blur.css @@ -1,4 +1,7 @@ -#arena.paused,#arena.right{ +#arena.paused,#arena.right,#arena.menupaused{ filter:blur(3px); -webkit-filter:blur(3px); } +#arena.menupaused{ + opacity: 0.6; +} diff --git a/layout/default/layout.css b/layout/default/layout.css index 730aa2c3c..e04703f22 100755 --- a/layout/default/layout.css +++ b/layout/default/layout.css @@ -28,6 +28,9 @@ table{table-layout: fixed;} pointer-events: none; position: absolute; } +#arena.playerfocus>div:not(.playerfocus){ + opacity: 0.3 !important; +} #me,#mebg{width: 100%;height: 140px;top:calc(100% - 140px);left:0;} #mebg{z-index:-1} #handcards1,#handcards2{width: calc(50% - 140px);height: 127px;padding: 10px;} @@ -709,6 +712,7 @@ div[data-nature='firem']{ rgba(232, 53, 53,1) 0 0 5px,black 0 0 1px; } .player .identity[data-color="zhong"], +.player .identity[data-color="mingzhong"], .player .identity[data-color="qun"], div[data-nature='metal']{ text-shadow: black 0 0 1px,rgba(255, 203, 0,1) 0 0 2px,rgba(255, 203, 0,1) 0 0 5px,rgba(255, 203, 0,1) 0 0 10px, diff --git a/mode/chess.js b/mode/chess.js index 2c477cc25..a2845dc80 100755 --- a/mode/chess.js +++ b/mode/chess.js @@ -4127,16 +4127,7 @@ mode.chess={ }, posmap:{}, help:{ - '战棋模式':'
            对阵
            • n人对战n人的模式,由单人控制,开始游戏后随机分配位置与出牌顺序
            • '+ - '每人在出牌阶段有一次移动的机会,若一名角色在移动之前使用过指定其他角色为目标的牌,该回合可移动的最大距离为2,否则最大距离为1
            • '+ - '任何卡牌或技能无法指定位置相隔8个格以上的角色为目标
            • '+ - '杀死对方阵营的角色可摸一张牌,杀死本方阵营无惩罚
            • '+ - '开启交替行动后,在一方所有角色行动完毕进行下一轮行动时,若其人数比另一方少,另一方可指定至多X名角色名摸一张牌,X为人数之差
            '+ - '
            统率
            • 收集武将进行战斗,根据战斗难度及我方出场武将的强度,战斗胜利后将获得数量不等的金钱。没有君主出场时,获得的金钱较多
            • '+ - '金钱可以用来招募随机武将,招到已有武将,或遣返不需要的武将时可得到招募令
            • '+ - '战斗中有君主出场时可招降敌将,成功率取决于敌将的稀有度、剩余体力值以及手牌数。成功后战斗立即结束且没有金钱奖励。每发动一次招降,无论成功还是失败,都会扣除10招募令
            • '+ - '挑战武将会与该武将以及与其强度相近的武将进行战斗,敌方人数与我方出场人数相同,但不少于3。胜利后可通过招募令招募该武将
            • '+ - '竞技场:
              随机选择9名武将,每次派出1〜3名武将参战。战斗中阵亡的武将不能再次上场。

              战斗后武将进入疲劳状态,若立即再次出场则初始体力值-1。

              战斗中本方武将行动时可召唤后援,令一名未出场的已方武将加入战斗。后援武将在战斗结束后无论存活与否均不能再次出场

              当取得12场胜利或所有武将全部阵亡后结束,并根据胜场数获得随机奖励' + }, config:[ function(game,lib,get,ui){ diff --git a/mode/identity.js b/mode/identity.js index 7563b1768..a5eedf216 100755 --- a/mode/identity.js +++ b/mode/identity.js @@ -38,7 +38,12 @@ mode.identity={ event.finish(); } else{ - game.prepareArena(); + if(get.config('identity_mode')=='zhong'){ + game.prepareArena(8); + } + else{ + game.prepareArena(); + } game.delay(); } "step 1" @@ -49,7 +54,7 @@ mode.identity={ } game.chooseCharacter(); "step 2" - if(get.config('ai_identity')||game.players.length==2){ + if(game.players.length==2){ game.showIdentity(true); } else{ @@ -58,7 +63,12 @@ mode.identity={ } } game.zhu.ai.shown=1; - if(get.config('enhance_zhu')&&get.population('fan')>=3){ + if(game.zhu2){ + game.zhong=game.zhu; + game.zhu=game.zhu2; + delete game.zhu2; + } + if(get.config('identity_mode')!='zhong'&&get.config('enhance_zhu')&&get.population('fan')>=3){ var skill; switch(game.zhu.name){ case 'liubei':skill='jizhen';break; @@ -101,8 +111,8 @@ mode.identity={ _status.videoInited=true, game.addVideo('init',null,info); - game.gameDraw(game.zhu); - game.phaseLoop(game.zhu); + game.gameDraw(game.zhong||game.zhu); + game.phaseLoop(game.zhong||game.zhu); } }, showIdentity:function(me){ @@ -111,40 +121,16 @@ mode.identity={ game.players[i].identityShown=true; game.players[i].ai.shown=1; game.players[i].setIdentity(game.players[i].identity); + if(game.players[i].identity=='zhu'){ + game.players[i].isZhu=true; + } } }, checkResult:function(){ - if(get.population('zhong')==0||(get.population('fan')+get.population('nei')==0)){ - for(var i=0;i0) return; + if(game.zhong){ + game.zhong.identity='zhong'; + } if(lib.storage.test){ if(game.zhu.isAlive()){ console.log('主忠胜利'); @@ -198,10 +184,23 @@ mode.identity={ return game.players.randomGet(game.me,game.zhu); }; next.ai=function(player,list,list2){ - if(player.identity=='zhu'){ + if(_status.event.zhongmode){ + if(get.config('double_character')){ + player.init(list[0],list[1]); + } + else{ + player.init(list[0]); + } + if(player.identity=='mingzhong'){ + player.hp++; + player.maxHp++; + player.update(); + } + } + else if(player.identity=='zhu'){ list2.randomSort(); var choice,choice2; - if(Math.random()-0.8<0&&list2.length){ + if(!_status.event.zhongmode&&Math.random()-0.8<0&&list2.length){ choice=list2[0]; choice2=list[0]; if(choice2==choice){ @@ -253,11 +252,19 @@ mode.identity={ var list; var list2=[]; var list3=[]; - var identityList=lib.config.mode_config.identity.identity[game.players.length-2].slice(0); - if(get.config('player_number')=='8'&&get.config('double_nei')){ - identityList.remove('fan'); - identityList.push('nei'); + var identityList; + if(get.config('identity_mode')=='zhong'){ + event.zhongmode=true; + identityList=['zhu','zhong','mingzhong','nei','fan','fan','fan','fan']; } + else{ + identityList=lib.config.mode_config.identity.identity[game.players.length-2].slice(0); + if(get.config('player_number')=='8'&&get.config('double_nei')){ + identityList.remove('fan'); + identityList.push('nei'); + } + } + var addSetting=function(dialog){ dialog.add('选择身份'); var table=document.createElement('table'); @@ -265,8 +272,15 @@ mode.identity={ table.style.maxWidth='500px'; var tr=document.createElement('tr'); table.appendChild(tr); - var list=['random','zhu','zhong','nei','fan']; - for(var i=0;i<5;i++){ + var list; + if(event.zhongmode){ + list=['random','zhu','mingzhong','zhong','nei','fan']; + } + else{ + list=['random','zhu','zhong','nei','fan']; + } + + for(var i=0;i4){ + if(game.me==game.zhu&&game.players.length>4){ game.me.hp++; game.me.maxHp++; game.me.update(); @@ -502,11 +536,13 @@ mode.identity={ translate:{ zhu:"主", zhong:"忠", + mingzhong:"忠", nei:"内", fan:"反", cai:"猜", zhu2:"主公", zhong2:"忠臣", + mingzhong2:"明忠", nei2:"内奸", fan2:"反贼", random2:"随机", @@ -540,13 +576,29 @@ mode.identity={ } game.checkResult(); if(this.identity=='fan'&&source) source.draw(3); - else if(this.identity=='zhong'&&source&&source.identity=='zhu'){ + else if(this.identity=='zhong'&&source&&source.identity=='zhu'&&source.isZhu){ source.discard(source.get('he')); } if(game.zhu.storage.enhance_zhu&&get.population('fan')<3){ game.zhu.removeSkill(game.zhu.storage.enhance_zhu); delete game.zhu.storage.enhance_zhu; } + if(this==game.zhong){ + game.zhu.identityShown=true; + game.zhu.ai.shown=1; + game.zhu.setIdentity(); + game.zhu.isZhu=true; + delete game.zhong; + game.zhu.$legend(); + game.delay(2); + game.zhu.classList.add('playerfocus'); + ui.arena.classList.add('playerfocus'); + setTimeout(function(){ + game.zhu.classList.remove('playerfocus'); + ui.arena.classList.remove('playerfocus'); + },1000); + game.addVideo('playerfocus',game.zhu); + } }, logAi:function(targets,card){ if(this.ai.shown==1) return; @@ -630,14 +682,21 @@ mode.identity={ realAttitude:function(from,to){ // if(_status.currentPhase==from&&from.ai.tempIgnore&&from.ai.tempIgnore.contains(to)) return 0; var situation=ai.get.situation(); - var identity=from.spy||from.identity; + var identity=from.identity; var identity2=to.identity; - if(from==to&&from.spy) identity2=from.spy; + if(identity2=='zhu'&&!to.isZhu){ + identity2='zhong'; + if(from==to) return 10; + } + var zhongmode=false; + if(!game.zhu.isZhu){ + zhongmode=true; + } switch(identity){ case 'zhu': switch(identity2){ case 'zhu': return 10; - case 'zhong': return 6; + case 'zhong':case 'mingzhong': return 6; case 'nei': if(game.players.length==2) return -10; if(get.population('fan')==0) return -0.5; @@ -646,10 +705,10 @@ mode.identity={ case 'fan': return -4; } break; - case 'zhong': + case 'zhong':case 'mingzhong': switch(identity2){ case 'zhu': return 10; - case 'zhong': return 4; + case 'zhong':case 'mingzhong': return 4; case 'nei': if(get.population('fan')==0) return -2; return Math.min(3,-situation); @@ -683,6 +742,18 @@ mode.identity={ else if(game.zhu&&game.zhu.hp==2) num=-1; else if(game.zhu&&game.zhu.hp<=2&&situation>1) num=-1; else num=-2; + if(zhongmode&&situation<2){ + num=4; + } + if(strategy==2) num--; + if(strategy==3) num++; + return num; + case 'mingzhong': + if(strategy==5) return Math.min(0,-situation); + if(strategy==6) return Math.max(-1,-situation); + if(get.population('fan')==0) num=-5; + else if(situation<=0) num=0; + else num=-3; if(strategy==2) num--; if(strategy==3) num++; return num; @@ -695,7 +766,7 @@ mode.identity={ if(strategy==5) return Math.max(-1,situation); if(strategy==6) return Math.min(0,situation); if((game.zhu&&game.zhu.hp<=2&&situation<0)||situation<-1) num=-3; - else if(situation<0||get.population('zhong')==0) num=-2; + else if(situation<0||get.population('zhong')+get.population('mingzhong')==0) num=-2; else if((game.zhu&&game.zhu.hp>=4&&situation>0)||situation>1) num=1; else num=0; if(strategy==2) num++; @@ -712,8 +783,9 @@ mode.identity={ } return -10; case 'zhong': return -7; + case 'mingzhong':return -5; case 'nei': - if(get.population('zhong')==0) return -7; + if(get.population('zhong')+get.population('mingzhong')==0) return -7; if(game.zhu&&game.zhu.hp<=2) return -1; return Math.min(3,situation); case 'fan': return 5; @@ -735,7 +807,7 @@ mode.identity={ total+=j*1.2+5; zhu=j; } - else if(player.identity=='zhong'){ + else if(player.identity=='zhong'||player.identity=='mingzhong'){ zhuzhong+=j*0.8+3; total+=j*0.8+3; } @@ -748,9 +820,11 @@ mode.identity={ if(absolute) return zhuzhong; var result=parseInt(10*Math.abs(zhuzhong/total)); if(zhuzhong<0) result=-result; - if(zhu<12&&fan>30) result--; - if(zhu<6&&fan>15) result--; - if(zhu<4) result--; + if(!game.zhong){ + if(zhu<12&&fan>30) result--; + if(zhu<6&&fan>15) result--; + if(zhu<4) result--; + } return result; }, population:function(identity){ @@ -765,11 +839,22 @@ mode.identity={ _status.clicked=true; if(this.parentNode.identityShown) return; if(this.parentNode==game.me) return; - switch(this.firstChild.innerHTML){ - case '猜':this.firstChild.innerHTML='反';this.dataset.color='fan';break; - case '反':this.firstChild.innerHTML='忠';this.dataset.color='zhong';break; - case '忠':this.firstChild.innerHTML='内';this.dataset.color='nei';break; - case '内':this.firstChild.innerHTML='猜';this.dataset.color='cai';break; + if(get.config('identity_mode')=='zhong'){ + switch(this.firstChild.innerHTML){ + case '猜':this.firstChild.innerHTML='反';this.dataset.color='fan';break; + case '反':this.firstChild.innerHTML='忠';this.dataset.color='zhong';break; + case '忠':this.firstChild.innerHTML='内';this.dataset.color='nei';break; + case '内':this.firstChild.innerHTML='主';this.dataset.color='zhu';break; + case '主':this.firstChild.innerHTML='猜';this.dataset.color='cai';break; + } + } + else{ + switch(this.firstChild.innerHTML){ + case '猜':this.firstChild.innerHTML='反';this.dataset.color='fan';break; + case '反':this.firstChild.innerHTML='忠';this.dataset.color='zhong';break; + case '忠':this.firstChild.innerHTML='内';this.dataset.color='nei';break; + case '内':this.firstChild.innerHTML='猜';this.dataset.color='cai';break; + } } } } diff --git a/mode/stone.js b/mode/stone.js index 3e10f6778..acbf216af 100755 --- a/mode/stone.js +++ b/mode/stone.js @@ -1538,14 +1538,6 @@ mode.stone={ }, config:['battle_number','double_character','double_hp','ban_weak','free_choose','change_choice'], help:{ - '炉石模式':'
              • 游戏流程类似1v1,场上有两名主将进行对抗'+ - '
              • 主将出牌阶段的出牌数量(行动值)有上限,先手为2,后手为3,装备牌不计入出牌上限
              • 游戏每进行一轮,主将的出牌上限+1,超过6时减至2并重新累加'+ - '
              • 牌堆中随机加入总量1/3的随从牌,使用之可召唤一个随从,随从出场时背面朝上。每一方在场的随从数不能超过4
              • 随从于摸牌阶段摸牌基数为1,随从的随从牌均视为闪,装备牌均视为杀
              • '+ - '随从与其他所有角色相互距离基数为1
              • '+ - '主将杀死对方随从后获得一个额外的行动值并摸两张牌,杀死己方随从无惩罚,随从杀死随从无效果'+ - '
              • 牌堆中随机加入总量1/6的法术牌,效果主要与随从有关,法术牌根据强度不同可能会消耗额外的行动值'+ - '
              • 主将可重铸随从牌,但回合内总的重铸次数不能超过3,随从不能重铸任何牌(包括铁索等默认可以重铸的牌)'+ - '
              • 嘲讽:若一方阵营中有嘲讽角色,则同阵营的无嘲讽角色不以能成为杀或决斗的目标'+ - '
              • 行动顺序为先主将后随从。主将或随从死亡后立即移出游戏,主将死亡后替补登场,替补登场时摸2+X张牌,X为对方存活的随从数,无替补时游戏结束' + } }