'use strict'; game.import('mode',function(lib,game,ui,get,ai,_status){ return { name:'doudizhu', start:function(){ "step 0" var playback=localStorage.getItem(lib.configprefix+'playback'); if(playback){ ui.create.me(); ui.arena.style.display='none'; ui.system.style.display='none'; _status.playback=playback; localStorage.removeItem(lib.configprefix+'playback'); var store=lib.db.transaction(['video'],'readwrite').objectStore('video'); store.get(parseInt(playback)).onsuccess=function(e){ if(e.target.result){ game.playVideoContent(e.target.result.video); } else{ alert('播放失败:找不到录像'); game.reload(); } } event.finish(); } else if(!_status.connectMode){ game.prepareArena(3); } "step 1" event.replacePile=function(){ var map={ shuiyanqijunx:'shuiyanqijuny', bingliang:'binglinchengxia', fangtian:'toushiche', wutiesuolian:'toushiche', }; for(var i=0;i<lib.card.list.length;i++){ var name=lib.card.list[i][2]; if(map[name]){ lib.card.list[i][2]=map[name]; lib.card.list[i][4]=null; lib.card.list[i]._replaced=true; } else if(name=='lebu'){ switch(lib.card.list[i][0]){ case 'spade': lib.card.list[i][2]='shuiyanqijuny';break; case 'club': lib.card.list[i][2]='luojingxiashi';break; default: lib.card.list[i][2]='baiyidujiang';break; } lib.card.list[i]._replaced=true; } } } _status.mode=get.config('doudizhu_mode'); if(_status.connectMode){ _status.mode=lib.configOL.doudizhu_mode; game.waitForPlayer(function(){ lib.configOL.number=3; }); } else if(_status.mode=='binglin'){ event.replacePile(); } else if(_status.mode=='online'){ lib.card.list=lib.online_cardPile.slice(0); lib.inpile.addArray(['nanman','wanjian','taoyuan','wugu']); game.fixedPile=true; } "step 2" if(_status.connectMode){ if(_status.mode=='online'){ lib.card.list=lib.online_cardPile.slice(0); lib.inpile.addArray(['nanman','wanjian','taoyuan','wugu']); game.fixedPile=true; } else if(_status.mode=='binglin') event.replacePile(); if(lib.configOL.number<3){ lib.configOL.number=3; } game.randomMapOL(); } else{ for(var i=0;i<game.players.length;i++){ game.players[i].getId(); } game.chooseCharacter(); } "step 3" if(ui.coin){ _status.coinCoeff=get.coinCoeff([game.me.name]); } game.showIdentity(true); var map={}; for(var i in lib.playerOL){ map[i]=lib.playerOL[i].identity; } game.broadcast(function(map){ for(var i in map){ lib.playerOL[i].identity=map[i]; lib.playerOL[i].setIdentity(); lib.playerOL[i].ai.shown=1; } },map); switch(_status.mode){ case 'online': game.addGlobalSkill('online_juzhong'); game.addGlobalSkill('online_zhadan_button'); game.addGlobalSkill('online_zhadan'); game.addGlobalSkill('online_aozhan'); game.addGlobalSkill('online_gongshoujintui'); break; case 'binglin': game.addGlobalSkill('binglin_bingjin'); break; default: game.zhu.addSkill('feiyang'); game.zhu.addSkill('bahu'); } game.syncState(); event.trigger('gameStart'); var players=get.players(lib.sort.position); var info=[]; for(var i=0;i<players.length;i++){ info.push({ name:players[i].name1, name2:players[i].name2, identity:players[i].identity }); } _status.videoInited=true; game.addVideo('init',null,info); if(_status.mode=='kaihei') game.addGlobalSkill('kaihei'); var next=game.gameDraw(game.zhu||_status.firstAct||game.me); if(_status.mode=='online'){ game.zhu.$equip(game.createCard('diqi','club',13)); next.num=function(player){ var num=4; if(player==game.zhu){ if(lib.character[player.name1]&&get.infoHp(lib.character[player.name1][2])>3) num++; if(lib.character[player.name2]&&get.infoHp(lib.character[player.name2][2])>3) num++; } return num; }; } else if(_status.mode=='binglin'){ next.num=function(player){ return (player==game.zhu?5:4); }; } if(_status.mode!='online'&&_status.connectMode&&lib.configOL.change_card) game.replaceHandcards(game.players.slice(0)); game.phaseLoop(game.zhu||_status.firstAct||game.me); game.zhu.showGiveup(); }, game:{ recommendDizhu:[ 're_guojia','re_huanggai','re_lvbu','re_guanyu','re_sunquan','re_xusheng','re_wuyi','re_sunben', 'xuyou','zhangchunhua','caochong','zhangsong','zhongyao','wangyi', 'caochun','maliang','sp_diaochan','quyi','sp_zhaoyun','shamoke', 'lijue','liuzan','wenyang','shen_lvmeng','shen_ganning', 'jiakui','wangyuanji','lingcao','miheng', 'sp_key_yuri','key_hinata','key_rin','key_kyousuke', 'ns_chendao','jiakui','haozhao', ], addRecord:function(bool){ if(typeof bool=='boolean'){ var data=lib.config.gameRecord.doudizhu.data; var identity=game.me.identity; if(!data[identity]){ data[identity]=[0,0]; } if(bool){ data[identity][0]++; } else{ data[identity][1]++; } var list=['zhu','fan']; var str=''; for(var i=0;i<list.length;i++){ if(data[list[i]]){ str+=lib.translate[list[i]+'2']+':'+data[list[i]][0]+'胜'+' '+data[list[i]][1]+'负<br>'; } } lib.config.gameRecord.doudizhu.str=str; game.saveConfig('gameRecord',lib.config.gameRecord); } }, getState:function(){ var state={}; for(var i in lib.playerOL){ var player=lib.playerOL[i]; state[i]={identity:player.identity}; } return state; }, updateState:function(state){ for(var i in state){ var player=lib.playerOL[i]; if(player){ player.identity=state[i].identity; } } }, updateRoundNumber:function(){ if(_status.mode=='online'){ game.broadcastAll(function(num1,num2,top,bonusNum){ if(ui.cardPileNumber){ var str=num1+'轮 公共牌堆: '+num2; if(game.me&&game.me.storage.doudizhu_cardPile&&game.me.storage.doudizhu_cardPile.length) str+=(' 个人牌堆: '+game.me.storage.doudizhu_cardPile.length); if(bonusNum) str+=('<br>本场叫价: '+bonusNum*100); ui.cardPileNumber.innerHTML=str; } _status.pileTop=top; },game.roundNumber,ui.cardPile.childNodes.length,ui.cardPile.firstChild,game.bonusNum); return; } game.broadcastAll(function(num1,num2,top){ if(ui.cardPileNumber) ui.cardPileNumber.innerHTML=num1+'轮 剩余牌: '+num2; _status.pileTop=top; },game.roundNumber,ui.cardPile.childNodes.length,ui.cardPile.firstChild); }, getRoomInfo:function(uiintro){ uiintro.add('<div class="text chat">双将模式:'+(lib.configOL.double_character?'开启':'关闭')); // uiintro.add('<div class="text chat">屏蔽弱将:'+(lib.configOL.ban_weak?'开启':'关闭')); // var last=uiintro.add('<div class="text chat">屏蔽强将:'+(lib.configOL.ban_strong?'开启':'关闭')); if(lib.configOL.banned.length){ uiintro.add('<div class="text chat">禁用武将:'+get.translation(lib.configOL.banned)); } if(lib.configOL.bannedcards.length){ uiintro.add('<div class="text chat">禁用卡牌:'+get.translation(lib.configOL.bannedcards)); } uiintro.style.paddingBottom='8px'; }, getVideoName:function(){ var str=get.translation(game.me.name); if(game.me.name2){ str+='/'+get.translation(game.me.name2); } var namex; switch(_status.mode){ case 'normal':namex='休闲斗地主';break; case 'kaihei':namex='开黑斗地主';break; case 'huanle':namex='欢乐斗地主';break; case 'binglin':namex='兵临城下';break; case 'online':namex='智斗三国';break; } var name=[ str, namex+' - '+lib.translate[game.me.identity+'2'] ]; return name; }, showIdentity:function(me){ for(var i=0;i<game.players.length;i++){ // if(me===false&&game.players[i]==game.me) continue; game.players[i].node.identity.classList.remove('guessing'); 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; } } if(_status.clickingidentity){ for(var i=0;i<_status.clickingidentity[1].length;i++){ _status.clickingidentity[1][i].delete(); _status.clickingidentity[1][i].style.transform=''; } delete _status.clickingidentity; } }, checkResult:function(){ var me=game.me._trueMe||game.me; if(game.zhu.isAlive()){ if(_status.mode!='online'&&(_status.mode!='binglin'||game.roundNumber<3)&&game.players.length>1) return; if(me==game.zhu){ game.over(true); } else{ game.over(false); } } else { if(me==game.zhu){ game.over(false); } else{ game.over(true); } } }, checkOnlineResult:function(player){ if(game.zhu.isAlive()){ return player.identity=='zhu'; } else return player.identity=='fan'; }, chooseCharacterZhidou:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" game.no_continue_game=true; lib.init.onfree(); "step 1" ui.arena.classList.add('choose-character'); var i; var groups=[]; event.list=[]; event.map={}; var chara=(get.config('character_online')||lib.characterOnline); for(i in chara){ var list=chara[i]; for(var j=0;j<list.length;j++){ if(!lib.character[list[j]]||(i=='key'&&lib.filter.characterDisabled(list[j]))) list.splice(j--,1); } if(list.length>=3){ groups.push(i); event.list.addArray(list); } } event.list.randomSort(); _status.characterlist=event.list.slice(0); event.controls=['不叫地主','一倍','两倍','三倍']; for(var player of game.players){ var id=player.playerid; player._group=groups.randomRemove(1)[0]; event.map[id]=chara[player._group].randomGets(4); player.storage.doudizhu_cardPile=get.cards(20).sort(function(a,b){ if(a.name!=b.name) return lib.sort.card(a.name,b.name); else if(a.suit!=b.suit) return lib.suit.indexOf(a)-lib.suit.indexOf(b); else return a.number-b.number; }); } event.dialog=ui.create.dialog('你的选将框与底牌',[event.map[game.me.playerid],'character'],game.me.storage.doudizhu_cardPile); event.start=game.players.randomGet(); event.current=event.start; game.delay(7); "step 2" event.current.classList.add('glow_phase'); if(event.current==game.me) event.dialog.content.firstChild.innerHTML='是否叫地主?'; else{ event.dialog.content.firstChild.innerHTML='请等待其他玩家叫地主'; game.delay(2); } event.current.chooseControl(event.controls).set('ai',function(){ return _status.event.getParent().controls.randomGet(); }); "step 3" event.current.classList.remove('glow_phase'); event.current._control=result.control; event.current.chat(result.control); if(result.control=='三倍'){ game.bonusNum=3; game.zhu=event.current; return; } else if(result.control!='不叫地主'){ event.controls.splice(1,event.controls.indexOf(result.control)); event.tempDizhu=event.current; if(result.control=='二倍') game.bonusNum=2; } event.current=event.current.next; if(event.current==event.start&&(event.start==event.tempDizhu||event.start._control=='不叫地主')){ game.zhu=event.tempDizhu||event.start.previous; } else if(event.current==event.start.next&&event.current._control){ game.zhu=event.tempDizhu; } else event.goto(2); if(event.current==event.start.previous&&!event.tempDizhu) event.controls.remove('不叫地主'); "step 4" game.updateRoundNumber(); for(var player of game.players){ player.identity=player==game.zhu?'zhu':'fan'; player.showIdentity(); } event.dialog.content.firstChild.innerHTML='请选择'+get.cnNumber(game.me==game.zhu?2:1)+'张武将牌'; game.me.chooseButton(event.dialog,true,game.me==game.zhu?2:1).set('filterButton',function(button){ return typeof button.link=='string'; }); "step 5" game.me.init(result.links[0],result.links[1]); for(var player of game.players){ if(player!=game.me){ if(player==game.zhu){ var list=event.map[player.playerid].randomGets(2); player.init(list[0],list[1]); } else player.init(event.map[player.playerid].randomGet()); } player.markSkill('doudizhu_cardPile'); } game.zhu.hp=4; game.zhu.maxHp=4; game.zhu.update(); for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterBinglin:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" game.no_continue_game=true; lib.init.onfree(); "step 1" ui.arena.classList.add('choose-character'); game.zhuSkill='zhuSkill_'+['xiangyang','jiangling','fancheng'].randomGet(); var i; event.list=[]; event.map={}; for(i in lib.character){ if(lib.filter.characterDisabled(i)) continue; event.list.push(i); } event.list.randomSort(); _status.characterlist=event.list.slice(0); for(var player of game.players){ event.map[player.playerid]=event.list.randomRemove(4); } event.controls=['不叫地主','一倍','两倍','三倍']; event.dialog=ui.create.dialog('本局城池:'+get.translation(game.zhuSkill),[event.map[game.me.playerid],'character']); event.start=game.players.randomGet(); event.current=event.start; game.delay(8); "step 2" event.current.classList.add('glow_phase'); if(event.current==game.me) event.dialog.content.firstChild.innerHTML='是否叫地主?'; else{ event.dialog.content.firstChild.innerHTML='请等待其他玩家叫地主'; game.delay(2); } event.current.chooseControl(event.controls).set('ai',function(){ return _status.event.getParent().controls.randomGet(); }); "step 3" event.current.classList.remove('glow_phase'); event.current._control=result.control; event.current.chat(result.control); if(result.control=='三倍'){ game.bonusNum=3; game.zhu=event.current; return; } else if(result.control!='不叫地主'){ event.controls.splice(1,event.controls.indexOf(result.control)); event.tempDizhu=event.current; if(result.control=='二倍') game.bonusNum=2; } event.current=event.current.next; if(event.current==event.start){ game.zhu=event.tempDizhu||event.start.previous; } else event.goto(2); if(event.current==event.start.previous&&!event.tempDizhu) event.controls.remove('不叫地主'); "step 4" for(var player of game.players){ player.identity=player==game.zhu?'zhu':'fan'; player.showIdentity(); } event.dialog.close(); event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); "step 5" var list=['请选择你的武将',[event.map[game.me.playerid],'character']]; if(game.me.identity=='fan'){ var friend=game.findPlayer(function(current){ return current!=game.me&¤t.identity=='fan'; }); list.push('<div class="text center">队友的选将框</div>'); list.push([event.map[friend.playerid],'character']); } game.me.chooseButton(list,true).set('list',event.map[game.me.playerid]).set('filterButton',function(button){ return _status.event.list.contains(button.link); }); "step 6" game.me.init(result.links[0]); for(var player of game.players){ if(player!=game.me) player.init(event.map[player.playerid].randomGet()); if(player==game.zhu){ player.addSkill(game.zhuSkill); } else player.addSkill('binglin_neihong'); } game.zhu.hp++; game.zhu.maxHp++; game.zhu.update(); for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterHuanle:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); game.no_continue_game=true; var i; event.list=[]; event.list2=[]; var list4=[]; if(!event.map) event.map={}; for(i in lib.characterReplace){ var ix=lib.characterReplace[i]; for(var j=0;j<ix.length;j++){ if(lib.filter.characterDisabled(ix[j])) ix.splice(j--,1); } if(ix.length){ var name=ix.randomGet(); event.list.push(name); if(game.recommendDizhu.contains(name)) event.list2.push(name); list4.addArray(ix); } } for(i in lib.character){ if(list4.contains(i)||lib.filter.characterDisabled(i)) continue; event.list.push(i); if(game.recommendDizhu.contains(i)) event.list2.push(i); } event.list.randomSort(); _status.characterlist=event.list.slice(0); event.controls=['不叫','叫地主']; for(var player of game.players){ var id=player.playerid; if(!event.map[id]) event.map[id]=[]; event.map[id].addArray(event.list2.randomRemove(1)); event.list.removeArray(event.map[id]); event.map[id].addArray(event.list.randomRemove(4-event.map[id].length)); event.list2.removeArray(event.map[id]); } event.dialog=ui.create.dialog('你的选将框',[event.map[game.me.playerid],'character']); event.start=game.players.randomGet(); event.current=event.start; lib.init.onfree(); game.delay(2.5); "step 1" event.current.chooseControl(event.controls).set('ai',function(){ return Math.random()>0.5?'不叫':'叫地主'; }); if(event.current==game.me){ event.dialog.content.childNodes[0].innerHTML='是否抢地主?'; } "step 2" event.current.chat(result.control); if(result.control=='叫地主'||event.current==event.start.next){ game.zhu=result.control=='叫地主'?event.current:event.current.next; for(var player of game.players){ player.identity=player==game.zhu?'zhu':'fan'; player.showIdentity(); } event.dialog.close(); event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); } else{ event.current=event.current.next; event.goto(1); game.delay(1.5); } "step 3" game.me.chooseButton(['请选择你的武将',[event.map[game.me.playerid],'character']],true); "step 4" game.me.init(result.links[0]); for(var player of game.players){ if(player!=game.me) player.init(event.map[player.playerid].randomGet()); } game.zhu.hp++; game.zhu.maxHp++; game.zhu.update(); for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterKaihei:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); game.no_continue_game=true; var i; var identityList=['zhu','fan','fan']; game.saveConfig('continue_name'); event.list=[]; var list4=[]; identityList.randomSort(); for(i=0;i<game.players.length;i++){ game.players[i].identity=identityList[i]; game.players[i].showIdentity(); if(identityList[i]=='zhu'){ game.zhu=game.players[i]; } } if(!game.zhu) game.zhu=game.me; else{ game.zhu.setIdentity(); game.zhu.identityShown=true; game.zhu.isZhu=(game.zhu.identity=='zhu'); game.zhu.node.identity.classList.remove('guessing'); game.me.setIdentity(); game.me.node.identity.classList.remove('guessing'); } for(i in lib.characterReplace){ var ix=lib.characterReplace[i]; for(var j=0;j<ix.length;j++){ if(lib.filter.characterDisabled(ix[j])) ix.splice(j--,1); } if(ix.length){ event.list.push(ix.randomGet()); list4.addArray(ix); } } for(i in lib.character){ if(list4.contains(i)||lib.filter.characterDisabled(i)) continue; event.list.push(i); } event.list.randomSort(); _status.characterlist=event.list.slice(0); for(var player of game.players){ player._characterChoice=event.list.randomRemove(player.identity=='zhu'?5:3); if(player.identity=='fan') player._friend=(player.next.identity=='fan'?player.next:player.previous); } var createDialog=['选择武将']; createDialog.push([game.me._characterChoice,'character']); if(game.me._friend){ createDialog.push('队友的武将'); createDialog.push([game.me._friend._characterChoice,'character']); } game.me.chooseButton(createDialog,true).set('onfree',true).set('filterButton',function(button){ return _status.event.player._characterChoice.contains(button.link); }); "step 1" game.me.init(result.links[0]); for(var i=0;i<game.players.length;i++){ if(game.players[i]!=game.me) game.players[i].init(game.players[i]._characterChoice.randomGet()); _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); if(game.players[i]==game.zhu){ game.players[i].hp++; game.players[i].maxHp++; game.players[i].update(); } } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacter:function(){ if(_status.mode=='kaihei'){ game.chooseCharacterKaihei(); return; } if(_status.mode=='huanle'){ game.chooseCharacterHuanle(); return; } if(_status.mode=='online'){ game.chooseCharacterZhidou(); return; } if(_status.mode=='binglin'){ game.chooseCharacterBinglin(); return; } var next=game.createEvent('chooseCharacter',false); next.showConfig=true; next.addPlayer=function(player){ var list=lib.config.mode_config.identity.identity[game.players.length-3].slice(0); var list2=lib.config.mode_config.identity.identity[game.players.length-2].slice(0); for(var i=0;i<list.length;i++) list2.remove(list[i]); player.identity=list2[0]; player.setIdentity('cai'); }; next.removePlayer=function(){ return game.players.randomGet(game.me,game.zhu); }; next.ai=function(player,list,list2,back){ var listc=list.slice(0,2); for(var i=0;i<listc.length;i++){ var listx=lib.characterReplace[listc[i]]; if(listx&&listx.length) listc[i]=listx.randomGet(); } if(get.config('double_character')){ player.init(listc[0],listc[1]); } else{ player.init(listc[0]); } if(player==game.zhu){ player.hp++; player.maxHp++; player.update(); } if(back){ list.remove(get.sourceCharacter(player.name1)); list.remove(get.sourceCharacter(player.name2)); for(var i=0;i<list.length;i++){ back.push(list[i]); } } if(typeof lib.config.test_game=='string'&&player==game.me.next){ player.init(lib.config.test_game); } player.node.name.dataset.nature=get.groupnature(player.group); } next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); var i; var list; var list4=[]; var identityList=['zhu','fan','fan']; var chosen=lib.config.continue_name||[]; game.saveConfig('continue_name'); event.chosen=chosen; var addSetting=function(dialog){ dialog.add('选择身份').classList.add('add-setting'); var table=document.createElement('div'); table.classList.add('add-setting'); table.style.margin='0'; table.style.width='100%'; table.style.position='relative'; var listi=['random','zhu','fan']; for(var i=0;i<listi.length;i++){ var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); td.link=listi[i]; if(td.link===game.me.identity){ td.classList.add('bluebg'); } table.appendChild(td); td.innerHTML='<span>'+get.translation(listi[i]+'2')+'</span>'; td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ if(_status.dragged) return; if(_status.justdragged) return; _status.tempNoButton=true; setTimeout(function(){ _status.tempNoButton=false; },500); var link=this.link; if(game.zhu.name){ if(link!='random'){ _status.event.parent.fixedseat=get.distance(game.me,game.zhu,'absolute'); } game.zhu.uninit(); delete game.zhu.isZhu; delete game.zhu.identityShown; } var current=this.parentNode.querySelector('.bluebg'); if(current){ current.classList.remove('bluebg'); } current=seats.querySelector('.bluebg'); if(current){ current.classList.remove('bluebg'); } if(link=='random'){ link=['zhu','fan'].randomGet(); for(var i=0;i<this.parentNode.childElementCount;i++){ if(this.parentNode.childNodes[i].link==link){ this.parentNode.childNodes[i].classList.add('bluebg'); } } } else{ this.classList.add('bluebg'); } num=get.config('choice_'+link); _status.event.parent.swapnodialog=function(dialog,list){ var buttons=ui.create.div('.buttons'); var node=dialog.buttons[0].parentNode; dialog.buttons=ui.create.buttons(list,'characterx',buttons); dialog.content.insertBefore(buttons,node); buttons.animate('start'); node.remove(); game.uncheck(); game.check(); for(var i=0;i<seats.childElementCount;i++){ if(get.distance(game.zhu,game.me,'absolute')===seats.childNodes[i].link){ seats.childNodes[i].classList.add('bluebg'); } } } _status.event=_status.event.parent; _status.event.step=0; _status.event.identity=link; if(link!=(event.zhongmode?'mingzhong':'zhu')){ seats.previousSibling.style.display=''; seats.style.display=''; } else{ seats.previousSibling.style.display='none'; seats.style.display='none'; } game.resume(); }); } dialog.content.appendChild(table); dialog.add('选择座位').classList.add('add-setting'); var seats=document.createElement('div'); seats.classList.add('add-setting'); seats.style.margin='0'; seats.style.width='100%'; seats.style.position='relative'; for(var i=2;i<=game.players.length;i++){ var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); td.innerHTML=get.cnNumber(i,true); td.link=i-1; seats.appendChild(td); if(get.distance(game.zhu,game.me,'absolute')===i-1){ td.classList.add('bluebg'); } td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ if(_status.dragged) return; if(_status.justdragged) return; if(get.distance(game.zhu,game.me,'absolute')==this.link) return; var current=this.parentNode.querySelector('.bluebg'); if(current){ current.classList.remove('bluebg'); } this.classList.add('bluebg'); for(var i=0;i<game.players.length;i++){ if(get.distance(game.players[i],game.me,'absolute')==this.link){ game.swapSeat(game.zhu,game.players[i],false);return; } } }); } dialog.content.appendChild(seats); if(game.me==game.zhu){ seats.previousSibling.style.display='none'; seats.style.display='none'; } dialog.add(ui.create.div('.placeholder.add-setting')); dialog.add(ui.create.div('.placeholder.add-setting')); if(get.is.phoneLayout()) dialog.add(ui.create.div('.placeholder.add-setting')); }; var removeSetting=function(){ var dialog=_status.event.dialog; if(dialog){ dialog.style.height=''; delete dialog._scrollset; var list=Array.from(dialog.querySelectorAll('.add-setting')); while(list.length){ list.shift().remove(); } ui.update(); } }; event.addSetting=addSetting; event.removeSetting=removeSetting; event.list=[]; identityList.randomSort(); if(event.identity){ identityList.remove(event.identity); identityList.unshift(event.identity); if(event.fixedseat){ var zhuIdentity='zhu'; if(zhuIdentity!=event.identity){ identityList.remove(zhuIdentity); identityList.splice(event.fixedseat,0,zhuIdentity); } delete event.fixedseat; } delete event.identity; } for(i=0;i<game.players.length;i++){ game.players[i].identity=identityList[i]; game.players[i].showIdentity(); if(identityList[i]=='zhu'){ game.zhu=game.players[i]; } } if(!game.zhu) game.zhu=game.me; else{ game.zhu.setIdentity(); game.zhu.identityShown=true; game.zhu.isZhu=(game.zhu.identity=='zhu'); game.zhu.node.identity.classList.remove('guessing'); game.me.setIdentity(); game.me.node.identity.classList.remove('guessing'); } //选将框分配 for(i in lib.characterReplace){ var ix=lib.characterReplace[i]; for(var j=0;j<ix.length;j++){ if(chosen.contains(ix[j])||lib.filter.characterDisabled(ix[j])) ix.splice(j--,1); } if(ix.length){ event.list.push(i); list4.addArray(ix); } } for(i in lib.character){ if(chosen.contains(i)||list4.contains(i)) continue; if(lib.filter.characterDisabled(i)) continue; event.list.push(i); list4.push(i); } event.list.randomSort(); _status.characterlist=list4.slice(0); var num=get.config('choice_'+game.me.identity); list=event.list.slice(0,num); delete event.swapnochoose; var dialog; if(event.swapnodialog){ dialog=ui.dialog; event.swapnodialog(dialog,list); delete event.swapnodialog; } else{ var str='选择角色'; if(_status.brawl&&_status.brawl.chooseCharacterStr){ str=_status.brawl.chooseCharacterStr; } dialog=ui.create.dialog(str,'hidden',[list,'characterx']); if(!_status.brawl||!_status.brawl.noAddSetting){ if(get.config('change_identity')){ addSetting(dialog); } } } dialog.setCaption('选择角色'); game.me.setIdentity(); if(!event.chosen.length){ game.me.chooseButton(dialog,true).set('onfree',true).selectButton=function(){ return get.config('double_character')?2:1 }; } else{ lib.init.onfree(); } ui.create.cheat=function(){ _status.createControl=ui.cheat2; ui.cheat=ui.create.control('更换',function(){ if(ui.cheat2&&ui.cheat2.dialog==_status.event.dialog){ return; } if(game.changeCoin){ game.changeCoin(-3); } event.list.randomSort(); list=event.list.slice(0,num); var buttons=ui.create.div('.buttons'); var node=_status.event.dialog.buttons[0].parentNode; _status.event.dialog.buttons=ui.create.buttons(list,'characterx',buttons); _status.event.dialog.content.insertBefore(buttons,node); buttons.animate('start'); node.remove(); game.uncheck(); game.check(); }); delete _status.createControl; }; if(lib.onfree){ lib.onfree.push(function(){ event.dialogxx=ui.create.characterDialog('heightset'); if(ui.cheat2){ ui.cheat2.animate('controlpressdownx',500); ui.cheat2.classList.remove('disabled'); } }); } else{ event.dialogxx=ui.create.characterDialog('heightset'); } ui.create.cheat2=function(){ ui.cheat2=ui.create.control('自由选将',function(){ if(this.dialog==_status.event.dialog){ if(game.changeCoin){ game.changeCoin(50); } this.dialog.close(); _status.event.dialog=this.backup; this.backup.open(); delete this.backup; game.uncheck(); game.check(); if(ui.cheat){ ui.cheat.animate('controlpressdownx',500); ui.cheat.classList.remove('disabled'); } } else{ if(game.changeCoin){ game.changeCoin(-10); } this.backup=_status.event.dialog; _status.event.dialog.close(); _status.event.dialog=_status.event.parent.dialogxx; this.dialog=_status.event.dialog; this.dialog.open(); game.uncheck(); game.check(); if(ui.cheat){ ui.cheat.classList.add('disabled'); } } }); if(lib.onfree){ ui.cheat2.classList.add('disabled'); } } if(!_status.brawl||!_status.brawl.chooseCharacterFixed){ if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); } "step 1" if(ui.cheat){ ui.cheat.close(); delete ui.cheat; } if(ui.cheat2){ ui.cheat2.close(); delete ui.cheat2; } var chooseGroup=false; if(event.chosen.length){ if(lib.character[event.chosen[0]][1]=='shen'){ chooseGroup=true; } } else if(event.modchosen){ if(event.modchosen[0]=='random') event.modchosen[0]=result.buttons[0].link; else event.modchosen[1]=result.buttons[0].link; } else if(result.buttons.length==2){ event.choosed=[result.buttons[0].link,result.buttons[1].link]; game.addRecentCharacter(result.buttons[0].link,result.buttons[1].link); if(lib.character[event.choosed[0]][1]=='shen'){ chooseGroup=true; } } else{ event.choosed=[result.buttons[0].link]; if(lib.character[event.choosed[0]][1]=='shen'){ chooseGroup=true; } game.addRecentCharacter(result.buttons[0].link); } "step 2" if(event.chosen.length){ game.me.init(event.chosen[0],event.chosen[1]); } else if(event.modchosen){ game.me.init(event.modchosen[0],event.modchosen[1]); } else if(event.choosed.length==2){ game.me.init(event.choosed[0],event.choosed[1]); } else{ game.me.init(event.choosed[0]); } event.list.remove(get.sourceCharacter(game.me.name1)); event.list.remove(get.sourceCharacter(game.me.name2)); if(game.me==game.zhu){ game.me.hp++; game.me.maxHp++; game.me.update(); } for(var i=0;i<game.players.length;i++){ if(game.players[i]!=game.me){ event.list.randomSort(); event.ai(game.players[i],event.list.splice(0,get.config('choice_'+game.players[i].identity)),null,event.list) } } "step 3" for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterKaiheiOL:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); var i; var identityList=['fan','fan','fan']; var aiList=game.filterPlayer(function(current){ return current!=game.me&&!current.isOnline(); }); if(aiList.length==1){ identityList[game.players.indexOf(aiList[0])]='zhu'; } else{ identityList[0]='zhu'; identityList.randomSort(); } for(i=0;i<game.players.length;i++){ game.players[i].identity=identityList[i]; game.players[i].showIdentity(); game.players[i].identityShown=true; if(identityList[i]=='zhu') game.zhu=game.players[i]; } event.list=[]; var list4=[]; var libCharacter={}; for(var i=0;i<lib.configOL.characterPack.length;i++){ var pack=lib.characterPack[lib.configOL.characterPack[i]]; for(var j in pack){ if(j=='zuoci') continue; if(lib.character[j]) libCharacter[j]=pack[j]; } } for(i in lib.characterReplace){ var ix=lib.characterReplace[i]; for(var j=0;j<ix.length;j++){ if(!libCharacter[ix[j]]||lib.filter.characterDisabled(ix[j],libCharacter)) ix.splice(j--,1); } if(ix.length){ event.list.push(ix.randomGet()); list4.addArray(ix); } } for(i in libCharacter){ if(list4.contains(i)||lib.filter.characterDisabled(i,libCharacter)) continue; event.list.push(i); } _status.characterlist=event.list.slice(0); var map={}; for(var player of game.players){ player._characterChoice=event.list.randomRemove(player.identity=='zhu'?5:3); if(player.identity=='fan') player._friend=(player.next.identity=='fan'?player.next:player.previous); map[player.playerid]=player._characterChoice; } game.broadcastAll(function(map){ for(var i in map){ lib.playerOL[i]._characterChoice=map[i]; } },map); "step 1" var list=[]; for(var i=0;i<game.players.length;i++){ var dialog=['请选择武将',[game.players[i]._characterChoice,'character']]; if(game.players[i]._friend){ dialog.push('队友的武将'); dialog.push([game.players[i]._friend._characterChoice,'character']); } list.push([game.players[i],dialog,true,function(){return Math.random()},function(button){ return _status.event.player._characterChoice.contains(button.link); }]); } game.me.chooseButtonOL(list,function(player,result){ if(game.online||player==game.me) player.init(result.links[0]); }); "step 2" for(var i in lib.playerOL){ if(!result[i]||result[i]=='ai'||!result[i].links||!result[i].links.length){ result[i]=lib.playerOL[i]._characterChoice.randomGet(); } else{ result[i]=result[i].links[0]; } if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i]); } } game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); game.broadcast(function(result,zhu){ for(var i in result){ if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i]); } } game.zhu=zhu; zhu.maxHp++; zhu.hp++; zhu.update(); setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); },result,game.zhu); for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterHuanleOL:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); var i; event.list=[]; event.list2=[]; var list4=[]; event.controls=['不叫','叫地主']; if(!event.map) event.map={}; var libCharacter={}; for(var i=0;i<lib.configOL.characterPack.length;i++){ var pack=lib.characterPack[lib.configOL.characterPack[i]]; for(var j in pack){ if(j=='zuoci') continue; if(lib.character[j]) libCharacter[j]=pack[j]; } } for(i in lib.characterReplace){ var ix=lib.characterReplace[i]; for(var j=0;j<ix.length;j++){ if(!libCharacter[ix[j]]||lib.filter.characterDisabled(ix[j],libCharacter)) ix.splice(j--,1); } if(ix.length){ var name=ix.randomGet(); event.list.push(name); if(game.recommendDizhu.contains(name)) event.list2.push(name); list4.addArray(ix); } } for(i in libCharacter){ if(list4.contains(i)||lib.filter.characterDisabled(i,libCharacter)) continue; event.list.push(i); if(game.recommendDizhu.contains(i)) event.list2.push(i); } for(var player of game.players){ var id=player.playerid; if(!event.map[id]) event.map[id]=[]; event.map[id].addArray(event.list2.randomRemove(1)); event.list.removeArray(event.map[id]); event.map[id].addArray(event.list.randomRemove(4-event.map[id].length)); event.list2.removeArray(event.map[id]); } _status.characterlist=event.list.slice(0); event.videoId=lib.status.videoId++; game.broadcastAll(function(map,id){ ui.create.dialog('你的选将框',[map[game.me.playerid],'character']).videoId=id; },event.map,event.videoId); event.start=game.players.randomGet(); event.current=event.start; if(event.current!=game.me||!event.current.isOnline()) game.delay(3); "step 1" event.current.chooseControl(event.controls).set('ai',function(){ return Math.random()>0.5?'不叫':'叫地主'; }); "step 2" event.current.chat(result.control); if(result.control=='叫地主'||event.current==event.start.next){ game.zhu=result.control=='叫地主'?event.current:event.current.next; for(var player of game.players){ player.identity=player==game.zhu?'zhu':'fan'; player.showIdentity(); player.identityShown=true; } game.broadcastAll('closeDialog',event.videoId) event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); } else{ event.current=event.current.next; event.goto(1); } "step 3" var list=[]; var str='选择角色'; for(var i=0;i<game.players.length;i++){ list.push([game.players[i],[str,[event.map[game.players[i].playerid],'character']],true]); } game.me.chooseButtonOL(list,function(player,result){ if(game.online||player==game.me) player.init(result.links[0],result.links[1]); }); "step 4" for(var i in result){ if(result[i]&&result[i].links){ for(var j=0;j<result[i].links.length;j++){ event.list2.remove(result[i].links[j]); } } } for(var i in result){ if(result[i]=='ai'){ result[i]=event.list2.randomRemove(lib.configOL.double_character?2:1); } else{ result[i]=result[i].links } if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i][0],result[i][1]); } } game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); game.broadcast(function(result,zhu){ for(var i in result){ if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i][0],result[i][1]); } } game.zhu=zhu; zhu.maxHp++; zhu.hp++; zhu.update(); setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); },result,game.zhu); for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterBinglinOL:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); var i; var libCharacter={}; for(var i=0;i<lib.configOL.characterPack.length;i++){ var pack=lib.characterPack[lib.configOL.characterPack[i]]; for(var j in pack){ if(j=='zuoci') continue; if(lib.character[j]) libCharacter[j]=pack[j]; } } event.list=[]; event.map={}; for(i in libCharacter){ if(lib.filter.characterDisabled(i,libCharacter)) continue; event.list.push(i); } event.list.randomSort(); _status.characterlist=event.list.slice(0); event.controls=['不叫地主','一倍','两倍','三倍']; for(var player of game.players){ var id=player.playerid; event.map[id]=event.list.randomRemove(4); } event.start=game.players.randomGet(); event.current=event.start; event.videoId=lib.status.videoId++; game.zhuSkill='zhuSkill_'+['xiangyang','jiangling','fancheng'].randomGet(); game.broadcastAll(function(map,id,skill){ ui.create.dialog('本局城池:'+get.translation(skill),[map[game.me.playerid],'character']).videoId=id; },event.map,event.videoId,game.zhuSkill); game.delay(6); "step 1" game.broadcastAll(function(id,current){ var dialog=get.idDialog(id); if(dialog){ if(game.me==current) dialog.content.firstChild.innerHTML='是否叫地主?'; else dialog.content.firstChild.innerHTML='请等待其他玩家叫地主'; } },event.videoId,event.current); if(event.current!=game.me&&!event.current.isOnline()) game.delay(2); event.current.chooseControl(event.controls).set('ai',function(){ return _status.event.getParent().controls.randomGet(); }); "step 2" event.current._control=result.control; event.current.chat(result.control); if(result.control=='三倍'){ game.bonusNum=3; game.zhu=event.current; return; } else if(result.control!='不叫地主'){ event.controls.splice(1,event.controls.indexOf(result.control)); event.tempDizhu=event.current; if(result.control=='二倍') game.bonusNum=2; } event.current=event.current.next; if(event.current==event.start){ game.zhu=event.tempDizhu||event.start; } else event.goto(1); if(event.current==event.start.previous&&!event.tempDizhu) event.controls.remove('不叫地主'); "step 3" for(var player of game.players){ player.identity=player==game.zhu?'zhu':'fan'; player.showIdentity(); player.identityShown=true; player._characterChoice=event.map[player.playerid]; } event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); game.broadcastAll(function(id,map){ var dialog=get.idDialog(id); if(dialog) dialog.close(); game.me._characterChoice=map[game.me.playerid]; },event.videoId,event.map); var list=[]; for(var i=0;i<game.players.length;i++){ var dialog=['请选择武将',[event.map[game.players[i].playerid],'character']]; if(game.players[i].identity=='fan'){ var friend=game.findPlayer(function(current){ return current!=game.players[i]&¤t.identity=='fan'; }); dialog.push('<div class="text center">队友的选将框</div>'); dialog.push([event.map[friend.playerid],'character']); } list.push([game.players[i],dialog,true,function(){return Math.random()},function(button){ return _status.event.player._characterChoice.contains(button.link); }]); } game.me.chooseButtonOL(list,function(player,result){ if(game.online||player==game.me) player.init(result.links[0]); }); "step 4" for(var i in lib.playerOL){ if(!result[i]||result[i]=='ai'||!result[i].links||!result[i].links.length){ result[i]=event.map[i].randomGet(); } else{ result[i]=result[i].links[0]; } if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i]); } } game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); game.broadcast(function(result,zhu){ for(var i in result){ if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i]); } } game.zhu=zhu; zhu.maxHp++; zhu.hp++; zhu.update(); setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); },result,game.zhu); for(var player of game.players){ if(player==game.zhu){ player.addSkill(game.zhuSkill); } else player.addSkill(['binglin_shaxue','binglin_neihong']); } for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterZhidouOL:function(){ var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); var i; var libCharacter={}; for(var i=0;i<lib.configOL.characterPack.length;i++){ var pack=lib.characterPack[lib.configOL.characterPack[i]]; for(var j in pack){ if(j=='zuoci') continue; if(lib.character[j]) libCharacter[j]=pack[j]; } } var groups=[]; event.list=[]; event.map={}; var chara=(get.config('character_online')||lib.characterOnline); for(i in chara){ var list=chara[i]; for(var j=0;j<list.length;j++){ if(!lib.character[list[j]]||lib.connectBanned.contains(list[j])||(i=='key'&&lib.filter.characterDisabled(list[j],libCharacter))) list.splice(j--,1); } if(list.length>=3){ groups.push(i); event.list.addArray(list); } } event.list.randomSort(); _status.characterlist=event.list.slice(0); event.controls=['不叫地主','一倍','两倍','三倍']; for(var player of game.players){ var id=player.playerid; player._group=groups.randomRemove(1)[0]; event.map[id]=chara[player._group].randomGets(3); player.storage.doudizhu_cardPile=get.cards(20).sort(function(a,b){ if(a.name!=b.name) return lib.sort.card(a.name,b.name); else if(a.suit!=b.suit) return lib.suit.indexOf(a)-lib.suit.indexOf(b); else return a.number-b.number; }); player.markSkill('doudizhu_cardPile'); } event.start=game.players.randomGet(); event.current=event.start; event.videoId=lib.status.videoId++; game.broadcastAll(function(map,id){ ui.create.dialog('你的选将框和底牌',[map[game.me.playerid],'character'],game.me.storage.doudizhu_cardPile).videoId=id; },event.map,event.videoId); game.delay(4); "step 1" game.broadcastAll(function(id,current){ var dialog=get.idDialog(id); if(dialog){ if(game.me==current) dialog.content.firstChild.innerHTML='是否叫地主?'; else dialog.content.firstChild.innerHTML='请等待其他玩家叫地主'; } },event.videoId,event.current); if(event.current!=game.me&&!event.current.isOnline()) game.delay(2); event.current.chooseControl(event.controls).set('ai',function(){ return _status.event.getParent().controls.randomGet(); }); "step 2" event.current._control=result.control; event.current.chat(result.control); if(result.control=='三倍'){ game.bonusNum=3; game.zhu=event.current; return; } else if(result.control!='不叫地主'){ event.controls.splice(1,event.controls.indexOf(result.control)); event.tempDizhu=event.current; if(result.control=='二倍') game.bonusNum=2; } event.current=event.current.next; if(event.current==event.start&&(event.start==event.tempDizhu||event.start._control=='不叫地主')){ game.zhu=event.tempDizhu||event.start.previous; } else if(event.current==event.start.next&&event.current._control){ game.zhu=event.tempDizhu; } else event.goto(1); if(event.current==event.start.previous&&!event.tempDizhu) event.controls.remove('不叫地主'); "step 3" for(var player of game.players){ player.identity=player==game.zhu?'zhu':'fan'; player.showIdentity(); player.identityShown=true; } game.broadcastAll('closeDialog',event.videoId); var list=[]; for(var i=0;i<game.players.length;i++){ list.push([game.players[i],['选择'+(game.players[i]==game.zhu?'两':'一')+'张武将牌',[event.map[game.players[i].playerid],'character']],true,game.players[i]==game.zhu?2:1]); } game.me.chooseButtonOL(list,function(player,result){ if(game.online||player==game.me) player.init(result.links[0],result.links[1]); }); "step 4" for(var i in result){ if(result[i]=='ai'){ result[i]=event.map[i].randomRemove(lib.playerOL[i]==game.zhu?2:1); } else{ result[i]=result[i].links; } if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i][0],result[i][1]); } } game.zhu.hp=4; game.zhu.maxHp=4; game.zhu.update(); game.broadcast(function(result,zhu){ for(var i in result){ if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i][0],result[i][1]); } } game.zhu=zhu; game.zhu.hp=4; game.zhu.maxHp=4; game.zhu.update(); setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); },result,game.zhu); for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, chooseCharacterOL:function(){ if(_status.mode=='kaihei'){ game.chooseCharacterKaiheiOL(); return; } else if(_status.mode=='huanle'){ game.chooseCharacterHuanleOL(); return; } else if(_status.mode=='online'){ game.chooseCharacterZhidouOL(); return; } else if(_status.mode=='binglin'){ game.chooseCharacterBinglinOL(); return; } var next=game.createEvent('chooseCharacter',false); next.setContent(function(){ "step 0" ui.arena.classList.add('choose-character'); var i; var identityList=['zhu','fan','fan']; identityList.randomSort(); for(i=0;i<game.players.length;i++){ game.players[i].identity=identityList[i]; game.players[i].showIdentity(); game.players[i].identityShown=true; if(identityList[i]=='zhu') game.zhu=game.players[i]; } var list; var list4=[]; event.list=[]; var libCharacter={}; for(var i=0;i<lib.configOL.characterPack.length;i++){ var pack=lib.characterPack[lib.configOL.characterPack[i]]; for(var j in pack){ if(j=='zuoci') continue; if(lib.character[j]) libCharacter[j]=pack[j]; } } for(i in lib.characterReplace){ var ix=lib.characterReplace[i]; for(var j=0;j<ix.length;j++){ if(!libCharacter[ix[j]]||lib.filter.characterDisabled(ix[j],libCharacter)) ix.splice(j--,1); } if(ix.length){ event.list.push(i); list4.addArray(ix); } } game.broadcast(function(list){ for(var i in lib.characterReplace){ var ix=lib.characterReplace[i]; for(var j=0;j<ix.length;j++){ if(!list.contains(ix[j])) ix.splice(j--,1); } } },list4); for(i in libCharacter){ if(list4.contains(i)||lib.filter.characterDisabled(i,libCharacter)) continue; event.list.push(i); list4.push(i) } _status.characterlist=list4; "step 1" var list=[]; var selectButton=(lib.configOL.double_character?2:1); var num,num2=0; num=Math.floor(event.list.length/game.players.length); num2=event.list.length-num*game.players.length; if(num>5){ num=5; } if(num2>2){ num2=2; } for(var i=0;i<game.players.length;i++){ var num3=0; if(game.players[i]==game.zhu) num3=3; var str='选择角色'; list.push([game.players[i],[str,[event.list.randomRemove(num+num3),'characterx']],selectButton,true]); } game.me.chooseButtonOL(list,function(player,result){ if(game.online||player==game.me) player.init(result.links[0],result.links[1]); }); "step 2" for(var i in result){ if(result[i]&&result[i].links){ for(var j=0;j<result[i].links.length;j++){ event.list.remove(get.sourceCharacter(result[i].links[j])); } } } for(var i in result){ if(result[i]=='ai'){ var listc=event.list.randomRemove(lib.configOL.double_character?2:1); for(var i=0;i<listc.length;i++){ var listx=lib.characterReplace[listc[i]]; if(listx&&listx.length) listc[i]=listx.randomGet(); } result[i]=listc; } else{ result[i]=result[i].links } if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i][0],result[i][1]); } } game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); game.broadcast(function(result,zhu){ for(var i in result){ if(!lib.playerOL[i].name){ lib.playerOL[i].init(result[i][0],result[i][1]); } } game.zhu=zhu; zhu.maxHp++; zhu.hp++; zhu.update(); setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); },result,game.zhu); for(var i=0;i<game.players.length;i++){ _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); }); }, }, translate:{ zhu:"主", fan:"反", zhu2:"地主", fan2:"农民", random2:"随机", feiyang:"飞扬", bahu:"跋扈", feiyang_info:"判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。", bahu_info:"锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。", kaihei:'强易', kaihei_info:'出牌阶段,你可以获得一名其他角色的至多两张牌,然后交给其等量的牌。每名角色每局游戏限一次。', doudizhu_cardPile:'底牌', online_gongshoujintui:'攻守进退', gongshoujianbei:'攻守兼备', gongshoujianbei_info:'出牌阶段,你可选择:①将此牌当做【万箭齐发】使用。②将此牌当做【桃园结义】使用。', jintuiziru:'进退自如', jintuiziru_info:'出牌阶段,你可选择:①将此牌当做【南蛮入侵】使用。②将此牌当做【五谷丰登】使用。', diqi:'地契', diqi_skill:'地契', diqi_info:'当你受到伤害时,你可以弃置此牌,防止此伤害。当此牌离开你的装备区后,销毁之。', _juzhong:'聚众', juzhong_jiu:'聚众', zhadan:'炸弹', zhadan_info:'当一张牌被使用时,对此牌使用。取消此牌的所有目标,且本局游戏的底价翻倍。', jiwangkailai:'继往开来', jiwangkailai_info:'出牌阶段,对包含你自己在内的一名角色使用。目标角色选择一项:①弃置所有手牌,然后摸等量的牌。②将所有手牌当做一张不为【继往开来】的普通锦囊牌使用。', zhuSkill_xiangyang:'襄阳', zhuSkill_xiangyang_info:'回合结束时,你可获得一个额外的出牌阶段或摸牌阶段。', zhuSkill_jiangling:'江陵', zhuSkill_jiangling0:'江陵', zhuSkill_jiangling1:'江陵', zhuSkill_jiangling_info:'出牌阶段开始时,你可选择一项:①本阶段内使用【杀】或普通锦囊牌选择唯一目标时可增加一个目标。②本阶段内使用【杀】或普通锦囊牌无次数限制。', zhuSkill_fancheng:'樊城', zhuSkill_fancheng0:'樊城', zhuSkill_fancheng1:'樊城', zhuSkill_fancheng_info:'限定技,出牌阶段,你可选择获得一项效果直到游戏结束:①因执行【杀】的效果而对其他角色造成的伤害+1。②对其他角色造成的渠道不为【杀】的伤害+1。', binglin_shaxue:'歃血', binglin_shaxue_info:'锁定技,每局游戏限三次,当你受到队友造成的伤害时,你防止此伤害。', binglin_neihong:'内讧', binglin_neihong_info:'锁定技,当你杀死队友后,你所在的阵营视为游戏失败。', baiyidujiang:'白衣渡江', baiyidujiang_info:'出牌阶段,对地主使用。你选择一项:①令其将手牌数摸至全场最多。②令其将手牌数弃置至全场最少。', shuiyanqijuny:'水淹七军', shuiyanqijuny_info:'出牌阶段,对至多两名角色使用。目标角色受到1点雷属性伤害,然后若其:是此牌的使用者选择的第一个目标,其弃置一张牌;不是第一个目标,其摸一张牌。', luojingxiashi:'落井下石', luojingxiashi_info:'出牌阶段,对所有其他的已受伤角色使用。目标角色受到1点伤害。', binglinchengxia:'兵临城下', binglinchengxia_info:'出牌阶段,对一名其他角色使用。将此牌横置于目标角色的判定区内。目标角色于判定阶段进行判定,若判定结果不为♦,则其弃置装备区内的所有牌或受到1点伤害。', toushiche:'投石车', toushiche_skill:'投石车', toushiche_info:'锁定技,结束阶段开始时,你令所有手牌数大于你的角色依次弃置一张手牌。', binglin_bingjin:'兵尽', }, element:{ player:{ getTopCards:function(num){ if(typeof num!='number') num=1; if(num<=0) num=1; var cards; var player=this; if(player.storage.doudizhu_cardPile&&player.storage.doudizhu_cardPile.length){ cards=player.storage.doudizhu_cardPile.randomRemove(num); if(player.storage.doudizhu_cardPile.length) player.markSkill('doudizhu_cardPile'); else player.unmarkSkill('doudizhu_cardPile'); } else cards=[]; if(cards.length<num) cards.addArray(get.cards(num-cards.length)); else game.updateRoundNumber(); return cards; }, hasZhuSkill:function(skill,player){ if(!this.hasSkill(skill)) return false; for(var i in this.storage){ if(i.indexOf('zhuSkill_')==0&&this.storage[i].contains(skill)) return true; } return false; }, $dieAfter:function(){ if(_status.video) return; if(!this.node.dieidentity){ var str={zhu:'地主',fan:'农民'}[this.identity]; var node=ui.create.div('.damage.dieidentity',str,this); ui.refresh(node); node.style.opacity=1; this.node.dieidentity=node; } var trans=this.style.transform; if(trans){ if(trans.indexOf('rotateY')!=-1){ this.node.dieidentity.style.transform='rotateY(180deg)'; } else if(trans.indexOf('rotateX')!=-1){ this.node.dieidentity.style.transform='rotateX(180deg)'; } else{ this.node.dieidentity.style.transform=''; } } else{ this.node.dieidentity.style.transform=''; } }, dieAfter:function(source){ if(_status.mode=='binglin'&&source&&this!=source&&this.identity==source.identity&&source.hasSkill('binglin_neihong')){ if(game.me==game.zhu){ game.over(true); } else{ game.over(false); } } else game.checkResult(); }, dieAfter2:function(){ if(_status.mode=='binglin'||_status.mode=='online'||this.identity!='fan') return; var player=this,target=game.findPlayer(function(current){ return current!=player&¤t.identity=='fan'; },true); if(target){ target.showGiveup(); target.chooseDrawRecover(2); } }, logAi:function(targets,card){}, showIdentity:function(){ game.broadcastAll(function(player,identity){ player.identity=identity; player.node.identity.classList.remove('guessing'); player.identityShown=true; player.ai.shown=1; player.setIdentity(); if(player.identity=='zhu'){ player.isZhu=true; } if(_status.clickingidentity){ for(var i=0;i<_status.clickingidentity[1].length;i++){ _status.clickingidentity[1][i].delete(); _status.clickingidentity[1][i].style.transform=''; } delete _status.clickingidentity; } },this,this.identity); } } }, get:{ rawAttitude:function(from,to){ if(from.identity==to.identity) return 10; return -10; }, }, skill:{ binglin_bingjin:{ trigger:{player:'phaseEnd'}, forced:true, ruleSkill:true, filter:function(event,player){ return _status.mode=='binglin'&&game.roundNumber>14; }, content:function(){ player.loseHp(); }, }, zhuSkill_xiangyang:{ trigger:{player:'phaseEnd'}, charlotte:true, direct:true, content:function(){ 'step 0' player.chooseControl('摸牌阶段','出牌阶段','cancel2').set('prompt','襄阳:是否执行一个额外的阶段?'); 'step 1' if(result.control!='cancel2'){ player.logSkill(event.name); var next=player[result.index?'phaseUse':'phaseDraw'](); event.next.remove(next); trigger.next.push(next); } }, }, zhuSkill_jiangling:{ trigger:{player:'phaseUseBegin'}, direct:true, charlotte:true, content:function(){ 'step 0' player.chooseControl('加目标','多刀','取消').set('prompt',get.prompt2('zhuSkill_jiangling')).set('ai',()=>(3-game.countPlayer())); 'step 1' if(result.index<2){ player.logSkill('zhuSkill_jiangling'); player.addTempSkill('zhuSkill_jiangling'+result.index,'phaseUseAfter'); game.log(player,'选择了','#y'+result.control,'的效果'); } }, }, zhuSkill_jiangling0:{ trigger:{player:'useCard2'}, direct:true, charlotte:true, filter:function(event,player){ if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; if(!event.targets||event.targets.length!=1) return false; var info=get.info(event.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(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); })){ return true; } } return false; }, content:function(){ 'step 0' var prompt2='为'+get.translation(trigger.card)+'增加一个目标' player.chooseTarget(get.prompt('zhuSkill_jiangling'),function(card,player,target){ var player=_status.event.player; if(_status.event.targets.contains(target)) return false; return lib.filter.targetEnabled2(_status.event.card,player,target)&&lib.filter.targetInRange(_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)*(_status.event.targets.contains(target)?-1:1); }).set('targets',trigger.targets).set('card',trigger.card); 'step 1' if(result.bool){ if(!event.isMine()&&!event.isOnline()) game.delayx(); event.targets=result.targets; } else{ event.finish(); } 'step 2' if(event.targets){ player.logSkill('zhuSkill_jiangling',event.targets); if(trigger.targets.contains(event.targets[0])) trigger.targets.removeArray(event.targets); else{ //trigger.directHit.addArray(event.targets); trigger.targets.addArray(event.targets); } } }, }, zhuSkill_jiangling1:{ charlotte:true, mod:{ cardUsable:function(card,player){ if(card.name=='sha'||get.type(card)=='trick') return Infinity; }, }, }, zhuSkill_fancheng:{ enable:'phaseUse', limited:true, charlotte:true, skillAnimation:true, animationColor:'gray', content:function(){ 'step 0' player.awakenSkill('zhuSkill_fancheng'); player.chooseControl('杀','其他').set('prompt','选择要强化的伤害').set('ai',()=>get.rand(0,1)); 'step 1' player.addSkill('zhuSkill_fancheng'+result.index); game.log(player,'本局游戏内',result.index?'#g杀以外':'#y杀','的伤害+1'); }, ai:{ order:100, result:{player:100}, }, }, zhuSkill_fancheng0:{ trigger:{source:'damageBegin2'}, forced:true, charlotte:true, filter:function(event,player){ return event.player!=player&&event.card&&event.card.name=='sha'&&event.getParent().name=='sha'; }, logTarget:'player', content:function(){ trigger.num++; }, mark:true, marktext:'殺', intro:{content:'因执行【杀】的效果对其他角色造成的伤害+1'}, }, zhuSkill_fancheng1:{ trigger:{source:'damageBegin2'}, forced:true, charlotte:true, filter:function(event,player){ return event.player!=player&&(!event.card||event.card.name!='sha'); }, logTarget:'player', content:function(){ trigger.num++; }, mark:true, marktext:'谋', intro:{content:'不因【杀】对其他角色造成的伤害+1'}, }, binglin_shaxue:{ init:function(player,skill){ player.addMark(skill,3,false); }, trigger:{player:'damageBegin3'}, forced:true, charlotte:true, filter:function(event,player){ return event.source&&player!=event.source&&player.identity==event.source.identity&&player.countMark('binglin_shaxue')>0; }, content:function(){ trigger.cancel(); player.removeMark('binglin_shaxue',1,false); trigger.source.removeMark('binglin_shaxue',1,false); }, intro:{content:'剩余次数:#'}, ai:{ viewHandcard:true, skillTagFilter:function(player,tag,arg){ return player!=arg&&arg.hasSkill('binglin_shaxue'); }, }, }, binglin_neihong:{charlotte:true}, toushiche_skill:{ trigger:{player:'phaseJieshuBegin'}, forced:true, equipSkill:true, filter:function(event,player){ return lib.skill.toushiche_skill.logTarget(null,player).length>0; }, logTarget:function(event,player){ var hs=player.countCards('h'); return game.filterPlayer(function(current){ return current!=player&¤t.countCards('h')>hs; }); }, content:function(){ 'step 0' event.targets=lib.skill.toushiche_skill.logTarget(null,player).sortBySeat(); 'step 1' var target=targets.shift(); if(target.countCards('h')>0) target.chooseToDiscard('h',true); if(targets.length) event.redo(); }, }, online_gongshoujintui:{ enable:'chooseToUse', filter:function(event,player){ var cards=player.getCards('hs'); for(var i of cards){ var name=get.name(i,player); if(name=='gongshoujianbei'){ if(event.filterCard({ name:'wanjian', isCard:true, cards:[i], },player,event)||event.filterCard({ name:'taoyuan', isCard:true, cards:[i], },player,event)) return true; } if(name=='jintuiziru'){ if(event.filterCard({ name:'nanman', isCard:true, cards:[i], },player,event)||event.filterCard({ name:'wugu', isCard:true, cards:[i], },player,event)) return true; } } return false; }, chooseButton:{ dialog:function(event,player){ var list=[]; if(player.countCards('hs','gongshoujianbei')){ list.push(['锦囊','','wanjian']); list.push(['锦囊','','taoyuan']); } if(player.countCards('hs','jintuiziru')){ list.push(['锦囊','','nanman']); list.push(['锦囊','','wugu']); } return ui.create.dialog('攻守兼备/进退自如',[list,'vcard'],'hidden'); }, filter:function(button,player){ var name=button.link[2]; var rawname=((name=='wanjian'||name=='taoyuan')?'gongshoujianbei':'jintuiziru'); var cards=player.getCards('hs'); var evt=_status.event.getParent(); for(var i of cards){ if(get.name(i,player)==rawname&&evt.filterCard({ name:name, isCard:true, cards:[i], },player,evt)) return true; } return false; }, check:function(button){ return _status.event.player.getUseValue({name:button.link[2],isCard:true}); }, backup:function(links){ var name=links[0][2]; var rawname=((name=='wanjian'||name=='taoyuan')?'gongshoujianbei':'jintuiziru'); return { popname:true, viewAs:{name:name,isCard:true}, filterCard:{name:rawname}, ai1:()=>1, } }, prompt:function(links){ var name=links[0][2]; var rawname=((name=='wanjian'||name=='taoyuan')?'gongshoujianbei':'jintuiziru'); return '将一张'+get.translation(rawname)+'当做'+get.translation(name)+'使用'; } }, ai:{ order:10, result:{ player:1, }, }, }, doudizhu_cardPile:{ intro:{ content:'cardCount', }, }, kaihei:{ enable:'phaseUse', filter:function(event,player){ return player==game.zhu&&game.hasPlayer(function(current){ return lib.skill.kaihei.filterTarget(null,player,current); }); }, filterTarget:function(card,player,target){ return player!=target&&!target.storage.kaihei&&target.countGainableCards(player,'he')>0; }, content:function(){ 'step 0' player.gainPlayerCard(target,[1,2],'he',true); target.storage.kaihei=true; 'step 1' if(!result.bool||!result.cards.length){ event.finish();return; } var num=result.cards.length; var hs=player.getCards('he'); if(hs.length){ if(hs.length<=num) event._result={bool:true,cards:hs}; else player.chooseCard('he',true,num,'选择交给'+get.translation(target)+get.cnNumber(num)+'张牌'); } else event.finish(); 'step 2' if(result.bool&&result.cards&&result.cards.length) player.give(result.cards,target); }, ai:{ viewHandcard:true, skillTagFilter:function(player,tag,target){ if(player==target||player.identity!='fan'||target.identity!='fan') return false; }, }, }, feiyang:{ trigger:{player:'phaseJudgeBegin'}, charlotte:true, direct:true, filter:function(event,player){ return _status.mode!='online'&&_status.mode!='binglin'&&player==game.zhu&&player.countCards('j')&&player.countCards('h')>1; }, content:function(){ "step 0" player.chooseToDiscard('h',2,get.prompt('feiyang'),'弃置两张手牌,然后弃置判定区里的一张牌').set('logSkill','feiyang').set('ai',function(card){ if(_status.event.goon) return 6-get.value(card); return 0; }).set('goon',player.hasCard(function(card){ return get.effect(player,{ name:card.viewAs||card.name, cards:[card], },player,player)<0; },'j')); "step 1" if(result.bool){ player.discardPlayerCard(player,'j',true); } }, }, bahu:{ trigger:{player:'phaseZhunbeiBegin'}, charlotte:true, forced:true, filter:function(event,player){ return _status.mode!='online'&&_status.mode!='binglin'&&player==game.zhu; }, content:function(){ player.draw(); }, mod:{ cardUsable:function(card,player,num){ if(_status.mode!='online'&&_status.mode!='binglin'&&player==game.zhu&&card.name=='sha') return num+1; }, }, }, diqi_skill:{ trigger:{player:'damageBegin2'}, filter:function(event,player){ var card=player.getEquip('diqi'); return get.itemtype(card)=='card'&&lib.filter.cardDiscardable(card,player,'diqi_skill'); }, check:function(event,player){ return event.num>=Math.min(player.hp,2); }, prompt2:function(event,player){ return '弃置'+get.translation(player.getEquip('diqi'))+'并防止即将受到的'+get.cnNumber(event.num)+'点伤害'; }, content:function(){ player.discard(player.getEquip('diqi')); trigger.cancel(); }, ai:{ filterDamage:true, skillTagFilter:function(player,tag,arg){ if(arg&&arg.player){ if(arg.player.hasSkillTag('jueqing',false,player)) return false; } }, }, }, online_aozhan:{ trigger:{player:'phaseBefore'}, forced:true, popup:false, firstDo:true, filter:function(event,player){ return !_status._aozhan&&game.roundNumber>10; }, content:function(){ var color=get.groupnature(player.group,"raw"); if(player.isUnseen()) color='fire'; player.$fullscreenpop('鏖战模式',color); game.broadcastAll(function(){ _status._aozhan=true; ui.aozhan=ui.create.div('.touchinfo.left',ui.window); ui.aozhan.innerHTML='鏖战模式'; if(ui.time3) ui.time3.style.display='none'; ui.aozhanInfo=ui.create.system('鏖战模式',null,true); lib.setPopped(ui.aozhanInfo,function(){ var uiintro=ui.create.dialog('hidden'); uiintro.add('鏖战模式'); var list=[ '从第11轮开始,游戏将进入〔鏖战模式〕。', '在鏖战模式下,任何角色均不是非转化的【桃】的合法目标。【桃】可以被当做【杀】或【闪】使用或打出。', ]; var intro='<ul style="text-align:left;margin-top:0;width:450px">'; for(var i=0;i<list.length;i++){ intro+='<li>'+list[i]; } intro+='</ul>' uiintro.add('<div class="text center">'+intro+'</div>'); var ul=uiintro.querySelector('ul'); if(ul){ ul.style.width='180px'; } uiintro.add(ui.create.div('.placeholder')); return uiintro; },250); game.playBackgroundMusic(); }); game.removeGlobalSkill('online_aozhan'); game.countPlayer(function(current){current.addSkill('aozhan')}); }, }, online_juzhong:{ trigger:{global:'useCard'}, direct:true, ruleSkill:true, filter:function(event,player){ return _status.mode=='online'&&!event.all_excluded&&event.player.isFriendOf(player)&&event.player!=player&&lib.skill.online_juzhong.infos[event.card.name]&&player.hasCard(function(card){ if(_status.connectMode) return true; return get.name(card,player)==event.card.name; },'h'); }, content:function(){ 'step 0' player.chooseToDiscard('是否响应【聚众】?',get.translation(trigger.player)+'使用了'+get.translation(trigger.card)+'。你可弃置一张名称相同的牌,令'+lib.skill.online_juzhong.infos[trigger.card.name][0],function(card,player){ return get.name(card,player)==_status.event.getTrigger().card.name; }).set('ai',lib.skill.online_juzhong.infos[trigger.card.name][2]).logSkill=['_juzhong',trigger.player]; 'step 1' if(result.bool){ lib.skill.online_juzhong.infos[trigger.card.name][1](); if(!event.goon) event.finish(); } else event.finish(); 'step 2' trigger.player.chooseTarget('你可选择一名角色,弃置其的一张牌',function(card,player,target){ return target.countDiscardableCards(player,'he')>0; }).set('ai',function(target){ var player=_status.event.player; return get.effect(target,{name:'guohe_copy2'},player,player); }); 'step 3' if(result.bool){ var target=result.targets[0]; trigger.player.line(target,'green'); trigger.player.discardPlayerCard(target,true,'he'); } }, infos:{ sha:['此【杀】的伤害值基数+1。',function(){ var evt=_status.event._trigger; if(!evt.baseDamage) evt.baseDamage=1; evt.baseDamage++; },function(card){ var evt=_status.event.getTrigger(); if(!evt.targets.length) return 0; if(evt.targets[0].hasShan()||evt.targets[0].hasSkillTag('filterDamage',null,{ player:evt.targets[0], card:evt.card, })) return 0; return 1; }], shan:['其可弃置一名角色的一张牌。',function(){ _status.event.goon=true; },function(card){ if(game.zhu.countCards('he',function(card){ return get.value(card,game.zhu)>=6; })) return 7-get.value(card); if(game.zhu.countCards('he',function(card){ return get.value(card,game.zhu)>0 })) return 5-get.value(card); return 0; }], tao:['其摸两张牌。',function(){ _status.event._trigger.player.draw(2); },function(card){ return 6-get.value(card); }], jiu:['其本回合的伤害值或回复值+1。',function(){ var player=_status.event._trigger.player; player.addTempSkill('juzhong_jiu'); player.addMark('juzhong_jiu',1,false); },function(card){ return 6-get.value(card); }], }, ai:{ viewHandcard:true, skillTagFilter:function(player,tag,target){ if(_status.mode!='online'||player==target||player.identity!=target.identity) return false; }, }, }, juzhong_jiu:{ trigger:{ player:'recoverBegin', source:'damageBegin1', }, forced:true, popup:false, content:function(){ trigger.num+=player.countMark('juzhong_jiu'); }, onremove:true, intro:{content:'本回合的伤害值和回复值+#'}, }, online_zhadan_button:{ trigger:{ global:'gameDrawAfter', player:['gainEnd','loseEnd'], }, firstDo:true, forced:true, charlotte:true, popup:false, silent:true, filter:function(event,player){ if(_status.mode!='online'||(player!=game.me&&!player.isOnline())) return; if(event.name!='lose') return !player.hasZhadan&&player.countCards('hs','zhadan')>0; return player.hasZhadan&&!player.countCards('hs','zhadan'); }, content:function(){ if(!player.hasZhadan){ player.hasZhadan=true; if(player==game.me) lib.skill.online_zhadan_button.initZhadan(); else player.send(function(){lib.skill.online_zhadan_button.initZhadan()}); } else{ delete player.hasZhadan; if(player==game.me) lib.skill.online_zhadan_button.removeZhadan(); else player.send(function(){lib.skill.online_zhadan_button.removeZhadan()}); } }, initZhadan:function(){ ui.zhadan_button=ui.create.control('激活炸弹','stayleft',function(){ if(this.classList.contains('hidden')) return; this.classList.toggle('glow'); if(this.classList.contains('glow')&&_status.event.type=='zhadan'&& _status.event.isMine()&&ui.confirm&&_status.imchoosing){ ui.click.cancel(ui.confirm.lastChild); } }); }, removeZhadan:function(){ if(ui.zhadan_button){ ui.zhadan_button.remove(); delete ui.zhadan_button; } }, }, online_zhadan:{ trigger:{player:'useCard'}, priority:5, popup:false, forced:true, filter:function(event,player){ return game.hasPlayer(function(current){ return current.hasCard(function(card){ if(get.name(card)!='zhadan') return false; return lib.filter.cardEnabled(card,player,'forceEnable'); },'hs'); }); }, forceLoad:true, content:function(){ 'step 0' event.source=trigger.player; event.card=trigger.card; event.targets=trigger.targets; event._global_waiting=true; event.filterCard=function(card,player){ if(get.name(card)!='zhadan'||get.itemtype(card)!='card') return false; return lib.filter.cardEnabled(card,player,'forceEnable'); }; event.send=function(player,card,source,targets,id,id2,skillState){ if(skillState){ player.applySkills(skillState); } if(player==game.me&&ui.zhadan_button&&!ui.zhadan_button.classList.contains('glow')){ _status.event._result={bool:false}; if(game.online){ _status.event._resultid=id; game.resume(); } return; } var str=get.translation(source); if(targets&&targets.length){ str+='对'+get.translation(targets); } str+='使用了'; str+=get.translation(card); str+=',是否对其使用【炸弹】?'; var next=player.chooseToUse({ filterCard:function(card,player){ if(get.name(card)!='zhadan'||get.itemtype(card)!='card') return false; return lib.filter.cardEnabled(card,player,'forceEnable'); }, prompt:str, _global_waiting:true, ai1:function(card){ var evt=_status.event.getParent('_zhadan')._trigger,player=_status.event.player; if(!evt) return 0; if(get.attitude(player,evt.player)>0) return 0; var eff=0; if(!targets.length) return Math.random()-0.5; for(var i of targets) eff-=get.effect(i,evt.card,evt.player,player); return eff-8; }, source:source, source2:targets, id:id, id2:id2, type:'zhadan', }); next.set('respondTo',[source,card]); if(game.online){ _status.event._resultid=id; game.resume(); } else{ next.nouse=true; } }; 'step 1' var list=game.filterPlayer(function(current){ return current.hasCard(function(card){ if(get.name(card)!='zhadan') return false; return lib.filter.cardEnabled(card,player,'forceEnable'); },'hs'); }); event.list=list; event.id=get.id(); list.sort(function(a,b){ return get.distance(event.source,a,'absolute')-get.distance(event.source,b,'absolute'); }); 'step 2' if(event.list.length==0){ event.finish(); } else if(_status.connectMode&&(event.list[0].isOnline()||event.list[0]==game.me)){ event.goto(4); } else{ event.current=event.list.shift(); event.send(event.current,event.card,event.source,event.targets,event.id,trigger.parent.id); } 'step 3' if(result.bool){ event.zhadanresult=event.current; event.zhadanresult2=result; if(event.current!=game.me&&!event.current.isOnline()) game.delayx(); event.goto(8); } else{ event.goto(2); } 'step 4' var id=event.id; var sendback=function(result,player){ if(result&&result.id==id&&!event.zhadanresult&&result.bool){ event.zhadanresult=player; event.zhadanresult2=result; game.broadcast('cancel',id); if(_status.event.id==id&&_status.event.name=='chooseToUse'&&_status.paused){ return (function(){ event.resultOL=_status.event.resultOL; ui.click.cancel(); if(ui.confirm) ui.confirm.close(); }); } } else{ if(_status.event.id==id&&_status.event.name=='chooseToUse'&&_status.paused){ return (function(){ event.resultOL=_status.event.resultOL; }); } } }; var withme=false; var withol=false; var list=event.list; for(var i=0;i<list.length;i++){ if(list[i].isOnline()){ withol=true; list[i].wait(sendback); list[i].send(event.send,list[i],event.card,event.source,event.targets,event.id,trigger.parent.id,get.skillState(list[i])); list.splice(i--,1); } else if(list[i]==game.me){ withme=true; event.send(list[i],event.card,event.source,event.targets,event.id,trigger.parent.id); list.splice(i--,1); } } if(!withme){ event.goto(6); } if(_status.connectMode){ if(withme||withol){ for(var i=0;i<game.players.length;i++){ game.players[i].showTimer(); } } } event.withol=withol; 'step 5' if(result&&result.bool&&!event.zhadanresult){ game.broadcast('cancel',event.id); event.zhadanresult=game.me; event.zhadanresult2=result; } 'step 6' if(event.withol&&!event.resultOL){ game.pause(); } 'step 7' for(var i=0;i<game.players.length;i++){ game.players[i].hideTimer(); } 'step 8' if(event.zhadanresult){ event.zhadanresult.$fullscreenpop('炸弹',get.groupnature(event.zhadanresult)); var next=event.zhadanresult.useResult(event.zhadanresult2); next.respondTo=[trigger.player,trigger.card]; game.bonusNum*=2; game.updateRoundNumber(); } } }, }, card:{ baiyidujiang:{ fullskin:true, enable:true, filterTarget:function(card,player,target){ return target==game.zhu; }, selectTarget:-1, type:'trick', content:function(){ 'step 0' if(!player.isIn()||!target.isIn()){ event.finish(); return; } var num1=0,num2=Infinity,str=get.translation(target); game.countPlayer(function(current){ var num=current.countCards('h'); if(num>num1) num1=num; if(num<num2) num2=num; }); var num=target.countCards('h'),choices=[]; event.addIndex=0; if(num<num1){ choices.push('令'+str+'将手牌摸至'+get.cnNumber(num1)+'张'); event.num1=num1; } else event.addIndex++; if(num>num2){ choices.push('令'+str+'将手牌弃置至'+get.cnNumber(num2)+'张'); event.num2=num2; } if(!choices.length) event.finish(); else if(choices.length==1) event._result={index:0}; else player.chooseControl().set('choiceList',choices).set('ai',function(){ var evt=_status.event.getParent(); return get.attitude(evt.player,evt.target)>0?0:1; }); 'step 1' if(result.index+event.addIndex==0){ target.drawTo(event.num1); } else target.chooseToDiscard(true,'h',target.countCards('h')-event.num2); }, ai:{ order:6, value:4, useful:2, tag:{ draw:1, loseCard:1, }, result:{ target:function(player,target,card,isLink){ var num1=0,num2=Infinity,str=get.translation(target); game.countPlayer(function(current){ var num=current.countCards('h',function(cardx){ if(ui.selected.cards.contains(cardx)) return false; if(card.cards&&card.cards.contains(cardx)) return false; return true; }); if(num>num1) num1=num; if(num<num2) num2=num; }); var num=target.countCards('h',function(cardx){ if(ui.selected.cards.contains(cardx)) return false; if(card.cards&&card.cards.contains(cardx)) return false; return true; }); if(num1>num){ if(get.attitude(player,target)>0) return (num1-num)/1.2; } if(num2<num){ if(get.attitude(player,target)>0) return (num2-num)/1.2; } return 0; } } } }, shuiyanqijuny:{ fullskin:true, cardimage:'shuiyanqijunx', enable:true, filterTarget:true, type:'trick', selectTarget:[1,2], targetprompt:['受伤弃牌','受伤摸牌'], contentBefore:function(){ var evt=event.getParent(),target=evt.stocktargets[0]; evt.shuiyanqijun_target=target; }, content:function(){ target.damage('thunder'); if(target!=event.getParent().shuiyanqijun_target) target.draw(); else target.chooseToDiscard('he',true); }, ai:{ order:6, value:4, useful:2, tag:{ damage:1, thunderDamage:1, natureDamage:1, loseCard:1, }, result:{ target:function(player,target){ if(!ui.selected.targets.length) return -1.5; return -0.5 } } } }, luojingxiashi:{ fullskin:true, enable:true, type:'trick', selectTarget:-1, filterTarget:function(card,player,target){ return target!=player&&target.isDamaged(); }, content:function(){ target.damage(); }, ai:{ order:3, value:4, useful:2, tag:{ loseCard:1, }, result:{ target:-1.5, } } }, binglinchengxia:{ fullskin:true, type:'delay', filterTarget:function(card,player,target){ return (lib.filter.judge(card,player,target)&&player!=target); }, judge:function(card){ if(get.suit(card)=='diamond') return 0; return -3; }, effect:function(){ 'step 0' if(result.bool==false){ if(!player.countCards('e',function(card){ return lib.filter.cardDiscardable(card,player,'shuiyanqijuny'); })){ player.damage('nosource'); event.finish(); return; } else player.chooseControl('discard_card','take_damage',function(event,player){ if(get.damageEffect(player,event.player,player)>=0){ return 'take_damage'; } if(player.hp>=3&&player.countCards('e')>=2){ return 'take_damage'; } return 'discard_card'; }); } else event.finish(); 'step 1' if(result.control=='discard_card'){ player.discard(player.getCards('e',function(card){ return lib.filter.cardDiscardable(card,player,'shuiyanqijuny'); })); } else player.damage('nosource'); }, ai:{ order:1, value:3, useful:2, tag:{ damage:1, loseCard:1, }, result:{ target:function(player,target,card,isLink){ var es=target.getCards('e'); if(!es.length) return -1.5; var val=0; for(var i of es) val+=get.value(i,target); return -Math.min(1.5,val/5); } } } }, toushiche:{ fullskin:true, type:'equip', subtype:'equip1', distance:{attackFrom:-3}, ai:{ basic:{ equipValue:2.5 } }, skills:['toushiche_skill'] }, gongshoujianbei:{ fullskin:true, type:'trick', }, jintuiziru:{ fullskin:true, type:'trick', }, diqi:{ fullskin:true, type:"equip", subtype:"equip2", skills:['diqi_skill'], destroy:'diqi_skill', ai:{ basic:{ equipValue:6 }, }, }, zhadan:{ audio:true, fullskin:true, type:'trick', ai:{ basic:{ useful:[6,4], value:[6,4], }, result:{player:1}, }, notarget:true, content:function(){ var evt=event.getParent(2)._trigger; evt.targets.length=0; evt.all_excluded=true; game.log(evt.card,'的效果被炸弹抵消了'); }, }, jiwangkailai:{ audio:true, fullskin:true, type:'trick', enable:function(card,player){ var hs=player.getCards('h',function(cardx){ return cardx!=card&&(!card.cards||!card.cards.contains(cardx)); }); if(!hs.length) return false; var use=true,discard=true; for(var i of hs){ if(use&&!game.checkMod(i,player,'unchanged','cardEnabled2',player)) use=false; if(discard&&!lib.filter.cardDiscardable(i,player,'jiwangkailai')) discard=false; if(!use&&!discard) return false; } return true; }, selectTarget:-1, toself:true, filterTarget:function(card,player,target){ return target==player; }, modTarget:true, content:function(){ 'step 0' var hs=player.getCards('h'); if(hs.length){ var use=true,discard=true; for(var i of hs){ if(use&&!game.checkMod(i,player,'unchanged','cardEnabled2',player)) use=false; if(discard&&!lib.filter.cardDiscardable(i,player,'jiwangkailai')) discard=false; if(!use&&!discard) break; } if(use&&discard) player.chooseControl().set('prompt','继往开来:请选择一项').set('choiceList',[ '弃置所有手牌,然后摸等量的牌', '将所有手牌当做一张普通锦囊牌使用', ]).set('ai',function(){ if(_status.event.player.countCards('h')>2) return 0; return 1; }); else if(use) event._result={index:1}; else if(discard) event._result={index:0}; else event.finish(); } else event.finish(); 'step 1' var cards=player.getCards('h'); if(result.index==0){ player.discard(cards); player.draw(cards.length); event.finish(); } else{ var list=[]; for(var i of lib.inpile){ if(i!='jiwangkailai'&&get.type(i)=='trick'&&lib.filter.filterCard({name:i,cards:cards},player)) list.push(['锦囊','',i]); } if(list.length){ player.chooseButton(['继往开来:选择要使用的牌',[list,'vcard']],true).set('ai',function(button){ var player=_status.event.player; return player.getUseValue({name:button.link[2],cards:player.getCards('h')}); }); } else event.finish(); } 'step 2' if(result.bool) player.chooseUseTarget({name:result.links[0][2]},player.getCards('h'),true); }, ai:{ basic:{ order:0.5, useful:3, value:5 }, result:{ target:function(player,target){ if(target.needsToDiscard(1)||!target.countCards('h',function(card){ return get.value(card,player)>=5.5; })) return 1; return 0; }, }, tag:{ draw:2 } } }, }, characterOnline:{ wei:[ 're_caocao','re_guojia','re_simayi','re_xiahoudun','xuzhu','re_zhangliao','re_zhenji','ol_xiahouyuan','dianwei','re_xunyu','zhanghe', 'yujin_yujin','re_caozhang','wangyi','guohuai','hanhaoshihuan','chenqun','re_caoxiu','guohuanghou','sunziliufang','xunyou','xinxianying', 'sp_caiwenji','caoang','caochun','caohong','sp_caoren','chenlin','sp_jiaxu','litong','sp_pangde','simalang','wanglang', 'kuailiangkuaiyue','wangji','sp_simazhao','sp_wangyuanji','yuejin','zangba','xinpi','liuye','simashi','zhuling','duji','caoanmin', ], shu:[ 're_guanyu','re_huangyueying','re_liubei','re_machao','re_zhangfei','zhaoyun','re_huangzhong','re_weiyan','re_pangtong','ol_sp_zhugeliang', 're_menghuo','re_zhurong','re_fazheng','re_masu','guanxingzhangbao','xin_liaohua','old_madai','re_jianyong','wuyi','zhangsong','zhoucang', 'liuchen','xiahoushi','re_zhangyi','liyan','guanyinping','guansuo','mayunlu','mazhong','mizhu','sunqian','xiahouba','zhangxingcai', 'wangping','yanyan','chendao','ganfuren','re_maliang','dengzhi','lifeng','zhangyì', ], wu:[ 're_ganning','re_huanggai','re_sunquan','re_sunshangxiang','re_zhouyu','old_zhoutai','re_xiaoqiao','re_taishici','sunjian','re_zhangzhang', 're_lingtong','re_wuguotai','xin_xusheng','re_bulianshi','re_chengpu','handang','xin_panzhangmazhong','xin_zhuran','guyong','zhuhuan','cenhun','sundeng','xuezong', 'daxiaoqiao','heqi','kanze','sunhao','re_sunluyu','sunshao','zhugejin','zumao','dingfeng','sunliang','zhoufei', 'weiwenzhugezhi','xf_sufei','xugong','lingcao','sunru','lvdai','panjun','yanjun','zhoufang', ], qun:[ 're_diaochan','re_gongsunzan','re_huatuo','re_huaxiong','re_lvbu','ol_pangde','re_yanwen','jiaxu','gaoshun','xin_liubiao','chengong', 're_gongsunyuan','guotufengji','dongbai','fuwan','liuxie','sp_machao','tadun','yanbaihu','yuanshu','zhangbao','yl_luzhi','huangfusong','sp_ganning','huangjinleishi', 're_panfeng','guosi','sp_liuqi','mangyachang','gaolan','lvkuanglvxiang','xunchen','sp_zhanghe','re_hansui','re_hejin','zhujun','ol_dingyuan','hanfu','wangrong', 'dongcheng','gongsunkang','hucheer','sp_sufei','yj_xuhuang','yj_zhanghe','yj_zhangliao','liuyao','wangcan','sp_taishici','caimao','jiling', ], key:[ 'sp_key_yuri','key_akane','key_akiko','key_ao','key_harukakanata','key_haruko','key_hinata','key_kengo','key_komari','key_kotori','key_kyoko','key_nagisa','key_noda','key_rei','key_rin','key_rumi','key_ryoichi','key_sasami','key_shiorimiyuki','key_shiroha','key_shizuku','key_tomoya','key_tsumugi','key_umi','key_yoshino','key_youta','key_yukine','key_nao','key_misuzu', ], }, online_cardPile:[ ['spade',1,'guding'], ['spade',1,'zhadan'], ['spade',2,'tengjia'], ['spade',2,'cixiong'], ['spade',3,'jiu'], ['spade',3,'guohe'], ['spade',4,'sha','thunder'], ['spade',4,'guohe'], ['spade',5,'sha','thunder'], ['spade',5,'qinglong'], ['spade',6,'sha','thunder'], ['spade',6,'jiwangkailai'], ['spade',7,'sha','thunder'], ['spade',7,'jintuiziru'], ['spade',8,'sha','thunder'], ['spade',8,'sha'], ['spade',9,'jiu'], ['spade',9,'sha'], ['spade',10,'gongshoujianbei'], ['spade',10,'sha'], ['spade',11,'tiesuo'], ['spade',11,'shunshou'], ['spade',12,'tiesuo'], ['spade',12,'zhangba'], ['spade',13,'wuxie'], ['spade',13,'dawanma'], ['club',1,'baiyin'], ['club',1,'zhuge'], ['club',2,'tengjia'], ['club',2,'bagua'], ['club',3,'jiu'], ['club',3,'sha'], ['club',4,'jintuiziru'], ['club',4,'sha'], ['club',5,'sha','thunder'], ['club',5,'dilu'], ['club',6,'sha','thunder'], ['club',6,'sha'], ['club',7,'sha','thunder'], ['club',7,'sha'], ['club',8,'sha','thunder'], ['club',8,'sha'], ['club',9,'jiu'], ['club',9,'sha'], ['club',10,'tiesuo'], ['club',10,'sha'], ['club',11,'tiesuo'], ['club',11,'sha'], ['club',12,'tiesuo'], ['club',12,'wuxie'], ['club',13,'tiesuo'], ['club',13,'jiedao'], ['club',13,'wuxie'], ['heart',1,'wuxie'], ['heart',1,'gongshoujianbei'], ['heart',1,'zhadan'], ['heart',2,'huogong'], ['heart',2,'shan'], ['heart',3,'huogong'], ['heart',3,'wuzhong'], ['heart',4,'sha','fire'], ['heart',4,'tao'], ['heart',5,'tao'], ['heart',5,'chitu'], ['heart',6,'tao'], ['heart',6,'jiwangkailai'], ['heart',7,'sha','fire'], ['heart',7,'tao'], ['heart',8,'shan'], ['heart',8,'wuzhong'], ['heart',9,'shan'], ['heart',9,'tao'], ['heart',10,'sha','fire'], ['heart',10,'sha'], ['heart',11,'shan'], ['heart',11,'wuzhong'], ['heart',12,'shan'], ['heart',12,'guohe'], ['heart',13,'wuxie'], ['heart',13,'zhuahuang'], ['diamond',1,'zhuque'], ['diamond',1,'juedou'], ['diamond',2,'tao'], ['diamond',2,'shan'], ['diamond',3,'tao'], ['diamond',3,'shan'], ['diamond',4,'sha','fire'], ['diamond',4,'shunshou'], ['diamond',5,'sha','fire'], ['diamond',5,'guanshi'], ['diamond',6,'shan'], ['diamond',6,'sha'], ['diamond',7,'shan'], ['diamond',7,'shan'], ['diamond',8,'shan'], ['diamond',8,'shan'], ['diamond',9,'jiu'], ['diamond',9,'shan'], ['diamond',10,'shan'], ['diamond',10,'sha'], ['diamond',11,'shan'], ['diamond',11,'shan'], ['diamond',12,'huogong'], ['diamond',12,'tao'], ['diamond',13,'xiliu'], ['diamond',13,'sha'], ['diamond',13,'wuxie'] ], help:{ '斗地主':'<div style="margin:10px">游戏规则</div><ul style="margin-top:0"><li>游戏人数<br>游戏人数为3人(地主x1 + 农民x2)。<li>胜利条件<br>农民:地主死亡。<br>地主:所有农民死亡且自己存活。'+ '<li>死亡奖惩<br>当有农民死亡时,若另一名农民存活,则其可以选择摸两张牌或回复一点体力。<li>地主专属技能<br>地主可以使用专属技能【飞扬】和【跋扈】。<br>【飞扬】判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。<br>【跋扈】锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。</ul>', } }; });