noname/mode/tafang.js

1476 lines
41 KiB
JavaScript
Raw Normal View History

2016-08-15 14:19:58 +00:00
'use strict';
mode.tafang={
canvasUpdates2:[],
2016-08-15 15:00:52 +00:00
importChess:{
element:{
card:['moveTo'],
player:['createRangeShadow','move']
}
},
2016-08-15 14:19:58 +00:00
start:function(){
"step 0"
2016-08-15 15:00:52 +00:00
game.loadMode('chess');
2016-08-15 14:19:58 +00:00
"step 1"
2016-08-15 15:00:52 +00:00
for(var i in result.element){
for(var j in result.element[i]){
if(j!='dieAfter'){
lib.element[i][j]=result.element[i][j];
}
}
}
2016-08-15 14:19:58 +00:00
for(var i in lib.skill){
if(lib.skill[i].changeSeat){
lib.skill[i]={};
if(lib.translate[i+'_info']){
lib.translate[i+'_info']='此模式下不可用';
}
}
}
lib.init.css(lib.assetURL+'layout/mode','chess');
ui.chesssheet=document.createElement('style');
document.head.appendChild(ui.chesssheet);
var playback=localStorage.getItem(lib.configprefix+'playback');
lib.mechlist=[];
for(var i in lib.characterPack.mode_tafang){
if(i.indexOf('chess_mech_')==0){
lib.mechlist.push(i);
}
lib.character[i]=lib.characterPack.mode_tafang[i];
if(!lib.character[i][4]){
lib.character[i][4]=[];
}
}
ui.create.cards();
game.finishCards();
ui.chessContainer=ui.create.div('#chess-container',ui.arena);
lib.setScroll(ui.chessContainer);
ui.chess=ui.create.div('#chess',ui.chessContainer);
ui.canvas2=document.createElement('canvas');
ui.canvas2.id='canvas2';
ui.chess.appendChild(ui.canvas2);
ui.ctx2=ui.canvas2.getContext('2d');
game.me=ui.create.player();
if(playback){
for(var i in lib.characterPack){
for(var j in lib.characterPack[i]){
lib.character[j]=lib.character[j]||lib.characterPack[i][j];
}
}
game.pause();
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){
event.video=e.target.result.video;
game.resume();
}
else{
alert('播放失败:找不到录像');
game.reload();
}
}
}
_status.mylist=[];
_status.enemylist=[];
"step 2"
ui.arena.classList.add('chess');
var mylistmap,enemylistmap;
if(event.video){
var videocontent;
for(var ii=0;ii<event.video.length;ii++){
if(event.video[ii].type=='init'){
videocontent=event.video[ii].content;
break;
}
}
mylistmap=[];
enemylistmap=[];
for(var i=0;i<videocontent.length;i++){
if(videocontent[i].lord){
_status.lord=videocontent[i].name;
}
if(videocontent[i].identity=='friend'){
_status.mylist.push(videocontent[i].name);
mylistmap.push(videocontent[i].position);
}
else{
_status.enemylist.push(videocontent[i].name);
enemylistmap.push(videocontent[i].position);
}
}
game.playerMap=lib.posmap;
}
ui.chesswidth=parseInt(get.config('tafang_size'));
ui.chessheight=11;
ui.chess.style.height=148*ui.chessheight+'px';
ui.chess.style.width=148*ui.chesswidth+'px';
if(!lib.config.touchscreen){
ui.chess.addEventListener('mousedown',function(e){
if(Array.isArray(e.path)){
for(var i=0;i<e.path.length;i++){
var itemtype=get.itemtype(e.path[i]);
if(itemtype=='button'||itemtype=='card'||itemtype=='player'){
return;
}
}
}
this._chessdrag=[e,this.parentNode.scrollLeft,this.parentNode.scrollTop];
});
ui.chess.addEventListener('mouseleave',function(){
this._chessdrag=null;
});
ui.chess.addEventListener('mouseup',function(){
if(this._chessdrag){
this._chessdrag=null;
}
});
ui.chess.addEventListener('mousemove',function(e){
if(this._chessdrag){
this.parentNode.scrollLeft=this._chessdrag[1]-e.x+this._chessdrag[0].x;
this.parentNode.scrollTop=this._chessdrag[2]-e.y+this._chessdrag[0].y;
_status.clicked=true;
}
e.preventDefault();
});
ui.chessContainer.addEventListener('mousewheel',function(){
if(_status.currentChessFocus){
clearInterval(_status.currentChessFocus);
delete _status.currentChessFocus;
}
});
}
ui.chessscroll1=ui.create.div('.chessscroll.left',ui.chessContainer);
ui.chessscroll2=ui.create.div('.chessscroll.right',ui.chessContainer);
var chessscroll=function(){
if(lib.config.touchscreen) return;
var direction=this.direction;
var speed=parseInt(get.config('chessscroll_speed'));
if(!speed) return;
var interval=setInterval(function(){
ui.chessContainer.scrollLeft+=speed*direction;
},16);
_status.chessscrolling=interval;
};
var leavescroll=function(){
if(_status.chessscrolling){
clearInterval(_status.chessscrolling);
delete _status.chessscrolling;
}
};
ui.chessscroll1.direction=-1;
ui.chessscroll1.addEventListener('mouseenter',chessscroll);
ui.chessscroll1.addEventListener('mouseleave',leavescroll);
ui.chessscroll2.direction=1;
ui.chessscroll2.addEventListener('mouseenter',chessscroll);
ui.chessscroll2.addEventListener('mouseleave',leavescroll);
for(var i=0;i<ui.chesswidth;i++){
for(var j=0;j<ui.chessheight;j++){
var pos='[data-position="'+(i+j*ui.chesswidth)+'"]';
ui.chesssheet.sheet.insertRule('#arena.chess #chess>.player'+pos+
'{left:'+(14+i*148)+'px;top:'+(14+j*148)+'px}',0);
ui.chesssheet.sheet.insertRule('#arena.chess #chess>.card'+pos+
'{left:'+(22+i*148)+'px;top:'+(22+j*148)+'px}',0);
ui.chesssheet.sheet.insertRule('#arena.chess #chess>.popup'+pos+
'{left:'+(19+i*148)+'px;top:'+(142+j*148)+'px}',0);
}
}
var grids=[];
var gridnum=ui.chessheight*ui.chesswidth;
for(var i=0;i<gridnum;i++){
grids.push(i);
}
event.obs=[];
if(!event.video){
var tafanglist=[0,2,3,5,6,8,9,11,12];
for(var i=0;i<ui.chessheight-1;i++){
for(var j=0;j<ui.chesswidth;j++){
if(i>=8&&j!=0&&j!=ui.chesswidth-1) continue;
if(tafanglist.contains(j)){
var cg=i*ui.chesswidth+j;
grids.remove(cg);
game.addObstacle(cg.toString(),false);
event.obs.push(cg.toString());
}
}
}
for(var i=0;i<ui.chesswidth;i++){
switch(ui.chesswidth){
case 6:if(i==2||i==3) continue;break;
case 9:if(i==3||i==4||i==5) continue;break;
case 12:if(i==4||i==5||i==6||i==7) continue;break;
}
var cg=(ui.chessheight-1)*ui.chesswidth+i;
grids.remove(cg);
game.addObstacle(cg.toString(),false);
event.obs.push(cg.toString());
}
}
_status.enemyCount=0;
_status.friendCount=0;
lib.setPopped(ui.create.system('手牌',null,true),function(){
var uiintro=ui.create.dialog('hidden');
var added=false;
for(var i=0;i<game.players.length;i++){
if(game.players[i].side==game.me.side&&game.players[i]!=game.me){
added=true;
uiintro.add(get.translation(game.players[i]));
var cards=game.players[i].get('h');
if(cards.length){
uiintro.addSmall(cards,true);
}
else{
uiintro.add('(无)');
}
}
}
if(!added){
uiintro.add('无队友');
}
return uiintro;
},220);
ui.create.me();
ui.create.fakeme();
ui.chessinfo=ui.create.div('.fakeme.player',ui.me,function(e){
e.stopPropagation();
});
lib.setScroll(ui.chessinfo);
game.arrangePlayers();
"step 3"
ui.control.style.display='';
if(event.video){
game.playVideoContent(event.video);
game.setChessInfo();
return;
}
_status.videoInited=true;
game.addVideo('init',null,[]);
if(game.friendZhu){
game.addVideo('identityText',game.friendZhu,'将');
game.addVideo('identityText',game.enemyZhu,'帅');
if(game.friendViceZhu){
game.addVideo('identityText',game.friendViceZhu,'仕');
game.addVideo('identityText',game.enemyViceZhu,'士');
}
}
if(event.obs){
game.addVideo('initobs',null,event.obs);
}
ui.me.querySelector('.fakeme.player').hide();
ui.me.querySelector('.fakeme.avatar').hide();
var list=[];
for(i in lib.character){
if(i.indexOf('treasure_')==0) continue;
if(i.indexOf('chess_mech_')==0) continue;
if(lib.character[i][4].contains('minskin')) continue;
if(lib.config.forbidchess.contains(i)) continue;
if(lib.character[i][4].contains('boss')) continue;
if(lib.filter.characterDisabled(i)) continue;
list.push(i);
}
list.randomSort();
_status.characterList=list;
_status.friends=[];
_status.enemies=[];
_status.turnCount=0;
_status.turnTotal=parseInt(get.config('tafang_turn'));
ui.turnCount=ui.create.system('',null,true);
_status.remainingCount=0;
_status.tafangend=[];
for(var i=0;i<ui.chesswidth;i++){
var tafangdes=ui.chesswidth*(ui.chessheight-1)+i;
if(!lib.posmap[tafangdes]){
_status.tafangend.push(tafangdes.toString());
}
}
_status.gameStarted=true;
game.phaseLoopTafang();
},
element:{
player:{
dieAfter:function(source){
var player=this;
if(_status.friends){
_status.friends.remove(this);
}
if(_status.enemies){
_status.enemies.remove(this);
}
delete lib.posmap[player.dataset.position];
setTimeout(function(){
player.delete();
},500);
for(var i=0;i<ui.phasequeue.length;i++){
if(ui.phasequeue[i].link==player){
ui.phasequeue[i].remove();
ui.phasequeue.splice(i,1);
break;
}
}
if(player==game.me){
for(var i=0;i<game.players.length;i++){
if(game.players[i].side==player.side){
game.modeSwapPlayer(game.players[i]);
}
}
}
2016-08-15 15:00:52 +00:00
if(_status.friends.length==0&&ui.fakeme){
ui.fakeme.hide();
this.node.handcards1.delete();
this.node.handcards2.delete();
game.me=ui.create.player();
game.me.side=false;
game.addVideo('removeTafangPlayer');
2016-08-15 14:19:58 +00:00
}
},
2016-08-15 15:00:52 +00:00
},
},
game:{
minskin:true,
singleHandcard:true,
chess:true,
treasures:[],
obstacles:[],
getVideoName:function(){
return [get.translation(game.me.name),'塔防'];
},
addChessPlayer:function(name,enemy,num,pos){
if(typeof num!='number'){
num=4;
}
var player=ui.create.player();
player.getId();
if(enemy=='treasure'){
player.animate('judgestart');
player.side=null;
player.identity='neutral';
player.setIdentity();
player.node.identity.dataset.color='zhong';
player.classList.add('treasure');
player.life=6+Math.floor(Math.random()*6);
game.treasures.add(player);
}
else{
player.animate('start');
if(enemy){
player.side=true;
player.setIdentity('enemy');
player.identity='enemy';
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
else{
player.side=false;
player.setIdentity('friend');
player.identity='friend';
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
player.node.identity.dataset.color=get.translation(player.side+'Color');
game.players.push(player);
// if(lib.config.animation){
// setTimeout(function(){
// player.$rare2();
// },300);
// }
}
ui.chess.appendChild(player);
if(_status.video||(pos&&!lib.posmap[pos])){
player.dataset.position=pos;
}
else{
var grids=[];
var gridnum=ui.chessheight*ui.chesswidth;
for(var i=0;i<gridnum;i++){
grids.push(i);
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
for(var i=0;i<game.players.length;i++){
grids.remove(parseInt(game.players[i].dataset.position));
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
for(var i=0;i<game.obstacles.length;i++){
grids.remove(parseInt(game.obstacles[i].dataset.position));
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
for(var i=0;i<game.treasures.length;i++){
grids.remove(parseInt(game.treasures[i].dataset.position));
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
player.dataset.position=grids.randomGet();
}
lib.posmap[player.dataset.position]=player;
game.addVideo('addChessPlayer',null,[name,enemy,num,player.dataset.position]);
player.init(name);
if(num&&!_status.video){
player.directgain(get.cards(num));
}
game.arrangePlayers();
player.chessFocus();
if(game.me&&game.me.name){
game.setChessInfo();
}
else if(game.players.length){
game.setChessInfo(game.players[0]);
}
return player;
},
addObstacle:function(x,y){
if(y!==false){
game.addVideo('addObstacle',null,[x,y]);
}
var pos;
if(typeof x=='string'){
pos=x;
}
else{
if(x>=ui.chesswidth){
x=ui.chesswidth-1;
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(y>=ui.chessheight){
y=ui.chessheight-1;
2016-08-15 14:19:58 +00:00
}
pos=y*ui.chesswidth+x;
}
if(!lib.posmap[pos]){
var grid=ui.create.div('.player.minskin.obstacle',ui.chess).animate('start');
grid.dataset.position=pos;
grid.listen(ui.click.obstacle);
lib.posmap[pos]=grid;
game.obstacles.push(grid);
}
},
removeObstacle:function(pos){
var node=lib.posmap[pos];
if(node&&game.obstacles.contains(node)){
game.addVideo('removeObstacle',null,pos);
game.obstacles.remove(node);
delete lib.posmap[pos];
node.delete();
}
},
2016-08-15 15:00:52 +00:00
addOverDialog:function(dialog){
2016-08-15 14:19:58 +00:00
dialog.classList.add('center');
},
phaseLoopTafang:function(){
var next=game.createEvent('phaseLoop');
next.setContent(function(){
'step 0'
_status.turnCount++;
ui.turnCount.innerHTML='回合'+get.cnNumber(_status.turnCount,true);
var dialog=ui.create.dialog('剩余行动点:'+(10+_status.remainingCount),'hidden');
dialog.style.height='260px';
dialog.style.top='calc(50% - 140px)';
dialog.classList.add('center');
dialog.classList.add('noupdate');
event.dialog=dialog;
var list=_status.characterList.splice(0,6);
var map={};
map.bufang=ui.create.buttons(lib.mechlist,'character',dialog.content);
var difficulty=parseInt(get.config('tafang_difficulty'));
for(var i=0;i<map.bufang.length;i++){
var button=map.bufang[i];
button.node.name.style.top='8px';
button.node.intro.classList.add('showintro');
button.node.intro.classList.add('tafang');
if(button.link=='chess_mech_nengliangqiu'||
button.link=='chess_mech_guangmingquan'||
button.link=='chess_mech_jiguanren'){
button.count=difficulty+1;
button.node.intro.innerHTML=get.cnNumber(button.count,true);
}
else{
button.count=difficulty+2;
button.node.intro.innerHTML=get.cnNumber(button.count,true);
}
button._link='布防';
}
map.zhaomu=ui.create.buttons(list,'character',dialog.content);
for(var i=0;i<map.zhaomu.length;i++){
var button=map.zhaomu[i];
button.node.intro.classList.add('showintro');
button.node.intro.classList.add('tafang');
button.count=difficulty+4;
button.node.intro.innerHTML=get.cnNumber(button.count,true);
button._link='招募';
}
if(_status.friends.length){
map.xingdong=ui.create.buttons(_status.friends,'player',dialog.content);
for(var i=0;i<map.xingdong.length;i++){
var button=map.xingdong[i];
button.node.intro.classList.add('showintro');
button.node.intro.classList.add('tafang');
if(difficulty<2){
button.count=1;
}
else{
button.count=2;
}
button.node.intro.innerHTML=get.cnNumber(button.count,true);
button._link='行动';
}
}
else{
map.xingdong=[];
}
var updateSelected=function(){
var count=10+_status.remainingCount;
var selected=dialog.querySelectorAll('.button.selected');
var selectedZhaomu=0;
for(var i=0;i<selected.length;i++){
count-=selected[i].count;
if(selected[i]._link=='招募'){
selectedZhaomu++;
}
}
for(var i in map){
for(var j=0;j<map[i].length;j++){
map[i][j].classList.remove('unselectable');
if(map[i][j].count>count){
map[i][j].classList.add('unselectable');
}
else if(i=='zhaomu'&&_status.friends.length+selectedZhaomu>=ui.chesswidth){
map[i][j].classList.add('unselectable');
}
else if(i=='bufang'){
var numbufang=0;
for(var k=0;k<game.treasures.length;k++){
if(game.treasures[k].name==map[i][j].link){
numbufang++;
}
if(numbufang>=3){
map[i][j].classList.add('unselectable');
break;
}
}
}
}
}
ui.dialog.content.firstChild.innerHTML='剩余行动点:'+count;
}
var clickOrder=0;
event.custom.replace.button=function(button){
if(!button.classList.contains('unselectable')||
button.classList.contains('selected')){
button.classList.toggle('selected');
button._clickOrder=clickOrder++;
}
updateSelected();
}
event.custom.add.window=function(clicked){
if(clicked) return;
if(event.step>1) return;
for(var i in map){
for(var j=0;j<map[i].length;j++){
map[i][j].classList.remove('selected');
map[i][j].classList.remove('unselectable');
}
}
updateSelected();
}
var update=function(link){
for(var i in map){
for(var j=0;j<map[i].length;j++){
if(map[i][j]._link!=link){
map[i][j].style.display='none';
}
else{
map[i][j].style.display='';
}
}
}
for(var i=0;i<event.control.childNodes.length;i++){
if(event.control.childNodes[i].innerHTML==link){
event.control.childNodes[i].classList.add('thundertext');
}
}
_status.lastTafangCommand=link;
}
event.control=ui.create.control('布防','招募','行动',function(link,node){
if(link=='行动'&&_status.friends.length==0) return;
if(link=='招募'&&_status.friends.length>=ui.chesswidth) return;
var current=node.parentNode.querySelector('.thundertext');
if(current==node) return;
if(current){
current.classList.remove('thundertext');
}
update(link);
});
if(!_status.friends.length){
event.control.lastChild.style.opacity=0.5;
if(_status.lastTafangCommand=='行动'){
_status.lastTafangCommand='招募';
}
}
if(_status.friends.length>=ui.chesswidth){
event.control.childNodes[1].style.opacity=0.5;
if(_status.lastTafangCommand=='招募'){
_status.lastTafangCommand='行动';
}
}
_status.imchoosing=true;
ui.auto.hide();
var eventdong=function(){
var selected=dialog.querySelectorAll('.button.selected');
event.bufang=[];
event.zhaomu=[];
event.xingdong=[];
var xingdongs=[];
_status.remainingCount+=10;
for(var i=0;i<selected.length;i++){
switch(selected[i]._link){
case '布防':event.bufang.push(selected[i].link);break;
case '招募':event.zhaomu.push(selected[i].link);break;
case '行动':xingdongs.push(selected[i]);break;
}
_status.remainingCount-=selected[i].count;
}
_status.remainingCount=Math.ceil(_status.remainingCount/2);
xingdongs.sort(function(a,b){
return a._clickOrder-b._clickOrder;
});
for(var i=0;i<xingdongs.length;i++){
event.xingdong.push(xingdongs[i].link);
}
game.resume();
};
event.done=ui.create.control('完成',eventdong);
if(_status.lastTafangCommand){
update(_status.lastTafangCommand);
}
else{
update('招募');
}
if(_status.characterList.length<6){
game.over(true);
event.done.close();
event.control.close();
return;
}
setTimeout(function(){
dialog.open();
updateSelected();
},50);
event.switchToAuto=eventdong;
if(!_status.auto){
game.pause();
}
else{
eventdong();
}
'step 1'
event.dialog.close();
event.control.close();
event.done.close();
delete event.dialog;
delete event.control;
delete event.done;
'step 2'
event.chooseObstacle=false;
if(event.bufang.length){
event.obstacles=game.obstacles.slice(0);
for(var i=0;i<event.obstacles.length;i++){
event.obstacles[i].classList.add('glow');
}
event.chooseObstacle=true;
event.currentBufang=event.bufang.shift();
event.dialog=ui.create.dialog('选择一个位置放置【'+get.translation(event.currentBufang)+'】');
if(!_status.auto){
game.pause();
}
else{
event.obstacle=event.obstacles.randomGet();
}
event.switchToAuto=function(){
event.obstacle=event.obstacles.randomGet();
game.resume();
};
}
else{
delete event.bufang;
}
'step 3'
if(event.dialog){
event.dialog.close();
delete event.dialog;
}
if(event.chooseObstacle){
game.removeObstacle(event.obstacle.dataset.position);
game.addChessPlayer(event.currentBufang,'treasure',0,event.obstacle.dataset.position).life=3;
event.chooseObstacle=false;
event.goto(2);
}
else{
if(event.obstacles){
for(var i=0;i<event.obstacles.length;i++){
event.obstacles[i].classList.remove('glow');
}
delete event.obstacles;
}
delete event.obstacle;
delete event.currentBufang;
}
'step 4'
if(event.dialog){
event.dialog.close();
delete event.dialog;
}
if(event.zhaomu.length){
event.currentZhaomu=event.zhaomu.shift();
event.dialog=ui.create.dialog('选择一个位置安排【'+get.translation(event.currentZhaomu)+'】');
var size=ui.chesswidth*(ui.chessheight-1);
var clickGrid=function(){
var player=game.addChessPlayer(event.currentZhaomu,false,4,this.dataset.position);
_status.friends.push(player);
if(!game.me.name){
game.me=player;
game.me.classList.add('current_action');
ui.me.querySelector('.fakeme.avatar').show();
ui.me.querySelector('.fakeme.player').show();
ui.create.fakeme();
ui.handcards1=player.node.handcards1.animate('start').fix();
ui.handcards2=player.node.handcards2.animate('start').fix();
ui.handcards1Container.appendChild(ui.handcards1);
ui.handcards2Container.appendChild(ui.handcards2);
ui.updatehl();
game.setChessInfo();
game.addVideo('tafangMe',player);
}
this.delete();
event.redo();
game.resume();
}
if(!event.playergrids){
event.playergrids=[]
for(var i=ui.chesswidth;i<size;i++){
if(!lib.posmap[i.toString()]){
var grid=ui.create.div('.player.minskin.playerblank.glow',clickGrid,ui.chess);
grid.animate('start');
grid.dataset.position=i;
event.playergrids.push(grid);
}
}
}
game.pause();
if(_status.auto){
setTimeout(function(){
clickGrid.call(event.playergrids.randomGet());
},50);
}
event.switchToAuto=function(){
clickGrid.call(event.playergrids.randomGet());
}
}
else{
delete event.zhaomu;
}
'step 5'
_status.imchoosing=false;
ui.auto.show();
game.delay();
if(event.dialog){
event.dialog.close();
delete event.dialog;
}
if(event.playergrids){
for(var i=0;i<event.playergrids.length;i++){
event.playergrids[i].delete();
}
delete event.playergrids;
}
delete event.currentZhaomu;
'step 6'
var shalldelay=false;
for(var i=0;i<ui.chesswidth;i++){
if(lib.posmap[i]&&game.players.contains(lib.posmap[i])){
for(var j=0;j<ui.chessheight;j++){
var pos=i+j*ui.chesswidth;
if(lib.posmap[pos]&&lib.posmap[pos].movable(0,1)){
break;
}
}
if(j<ui.chessheight){
shalldelay=true;
for(var k=j;k>=0;k--){
var pos=i+k*ui.chesswidth;
if(lib.posmap[pos]){
lib.posmap[pos].moveDown();
}
}
}
}
}
if(shalldelay) game.delay();
'step 7'
event.justadded=[];
if(_status.characterList.length){
if(_status.enemies.length<ui.chesswidth*2){
var list1=[];
for(var i=0;i<ui.chesswidth;i++){
if(!lib.posmap[i]){
list1.push(i);
}
}
if(list1.length){
var enemy=game.addChessPlayer(_status.characterList.shift(),true,4,list1.randomRemove());
_status.enemies.push(enemy);
event.justadded.push(enemy.name);
if(game.players.length==1){
ui.me.querySelector('.fakeme.player').show();
game.setChessInfo(game.players[0]);
}
game.delay();
}
// var difficulty=get.config('tafang_difficulty');
// if(_status.turnCount>=10&&list1.length&&difficulty>1){
// var enemy=game.addChessPlayer(_status.characterList.shift(),true,4,list1.randomRemove());
// _status.enemies.push(enemy);
// event.justadded.push(enemy.name);
// }
// if(_status.turnCount>=20&&list1.length&&difficulty>1){
// var enemy=game.addChessPlayer(_status.characterList.shift(),true,4,list1.randomRemove());
// _status.enemies.push(enemy);
// event.justadded.push(enemy.name);
// }
// if(list1.length&&difficulty>2){
// var enemy=game.addChessPlayer(_status.characterList.shift(),true,4,list1.randomRemove());
// _status.enemies.push(enemy);
// event.justadded.push(enemy.name);
// }
}
}
else{
game.over(true);
}
'step 8'
if(event.xingdong.length){
var toact=event.xingdong.shift();
if(game.players.contains(toact)){
toact.phase();
}
event.redo();
}
else{
event.xingdong=_status.enemies.slice(0);
}
'step 9'
if(event.xingdong.length){
var enemy=event.xingdong.shift();
if(!event.justadded.contains(enemy.name)&&game.players.contains(enemy)){
enemy.phase();
}
event.redo();
}
else{
event.mechlist=game.treasures.slice(0);
}
'step 10'
if(event.mechlist.length){
var mech=event.mechlist.shift();
var info=lib.skill[mech.name+'_skill'];
if(!info.filter||info.filter(mech)){
var next=game.createEvent('chessMech');
next.player=mech;
next.setContent(info.content);
mech.chessFocus();
if(lib.config.animation&&!lib.config.low_performance){
mech.$epic2();
}
game.delay();
}
if(mech.life--<=0){
game.treasures.remove(mech);
setTimeout(function(){
mech.delete();
},500);
delete lib.posmap[mech.dataset.position];
game.addVideo('deleteChessPlayer',mech);
game.addObstacle(mech.dataset.position);
game.log(get.translation(mech)+'使用期限已到');
}
event.redo();
}
'step 11'
delete event.xingdong;
delete event.mechlist;
if(_status.turnCount>=_status.turnTotal){
game.over(true);
}
else{
event.goto(0);
game.delay();
}
});
},
isChessNeighbour:function(a,b){
if(a&&a.dataset){
a=a.dataset.position;
}
if(b&&b.dataset){
b=b.dataset.position;
}
var ax=a%ui.chesswidth;
var ay=Math.floor(a/ui.chesswidth);
var bx=b%ui.chesswidth;
var by=Math.floor(b/ui.chesswidth);
if(ax==bx&&Math.abs(ay-by)==1) return true;
if(ay==by&&Math.abs(ax-bx)==1) return true;
return false;
},
draw2:function(func){
lib.canvasUpdates2.push(func);
if(!lib.status.canvas2){
lib.status.canvas2=true;
game.update(game.updateCanvas2);
}
},
updateCanvas2:function(time){
if(lib.canvasUpdates2.length===0){
lib.status.canvas2=false;
return false;
}
ui.canvas2.width=ui.chess.offsetWidth;
ui.canvas2.height=ui.chess.offsetHeight;
ui.canvas2.style.left=0;
ui.canvas2.style.top=0;
var ctx=ui.ctx2;
ctx.shadowBlur=5;
ctx.shadowColor='rgba(0,0,0,0.3)';
ctx.fillStyle='white';
ctx.strokeStyle='white';
ctx.lineWidth=3;
ctx.save();
for(var i=0;i<lib.canvasUpdates2.length;i++){
ctx.restore();
ctx.save();
var update=lib.canvasUpdates2[i];
if(!update.starttime){
update.starttime=time;
}
if(update(time-update.starttime,ctx)===false){
lib.canvasUpdates2.splice(i--,1);
}
}
},
setChessInfo:function(p){
if(!p){
if(ui.phasequeue&&ui.phasequeue.length){
p=ui.phasequeue[0].link;
}
else{
p=game.me;
}
}
ui.chessinfo.innerHTML='';
ui.phasequeue=[];
for(var i=0;i<game.players.length;i++){
var node=ui.create.div('.avatar',ui.chessinfo);
node.style.backgroundImage=p.node.avatar.style.backgroundImage;
node.link=p;
node.listen(ui.click.chessInfo);
p.instance=node;
if(_status.currentPhase==p){
node.classList.add('glow2');
}
ui.phasequeue.push(node);
p=p.next;
}
},
2016-08-15 15:00:52 +00:00
modeSwapPlayer:function(player){
var content=[game.me.dataset.position,player.dataset.position];
game.me.classList.remove('current_action');
player.classList.add('current_action');
game.addVideo('chessSwap',null,content);
game.swapControl(player);
player.chessFocus();
ui.create.fakeme();
}
},
skill:{
chess_mech_weixingxianjing_skill:{
filter:function(player){
for(var i=0;i<_status.enemies.length;i++){
if(!_status.enemies[i].isTurnedOver()&&
get.chessDistance(player,_status.enemies[i])<=2){
return true;
}
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
return false;
},
content:function(){
var list=[];
for(var i=0;i<_status.enemies.length;i++){
if(!_status.enemies[i].isTurnedOver()&&
get.chessDistance(player,_status.enemies[i])<=2){
list.push(_status.enemies[i]);
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
if(list.length){
game.log('小型陷阱发动');
var target=list.randomGet();
target.turnOver();
player.line(target,'green');
}
}
},
chess_mech_nengliangqiu_skill:{
filter:function(player){
for(var i=0;i<_status.friends.length;i++){
if(get.chessDistance(player,_status.friends[i])<=3){
return true;
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
return false;
},
content:function(){
var list1=[],list2=[];
for(var i=0;i<_status.friends.length;i++){
if(get.chessDistance(player,_status.friends[i])<=1){
list2.push(_status.friends[i]);
}
else if(get.chessDistance(player,_status.friends[i])<=3){
list1.push(_status.friends[i]);
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
// else if(get.chessDistance(player,_status.friends[i])<=4){
// list2.push(_status.friends[i]);
// }
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(list2.length){
game.asyncDraw(list2,2);
player.line(list2,'green');
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(list1.length){
game.asyncDraw(list1);
player.line(list1,'green');
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(list1.length||list2.length){
game.log('能量球发动');
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
}
},
chess_mech_mutong_skill:{
filter:function(player){
for(var i=0;i<_status.enemies.length;i++){
if(get.chessDistance(player,_status.enemies[i])<=3){
return true;
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
return false;
},
content:function(){
var list=[];
for(var i=0;i<_status.enemies.length;i++){
if(get.chessDistance(player,_status.enemies[i])<=3){
list.push(_status.enemies[i]);
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
if(list.length){
game.log('木桶发动');
var targets=list.randomGets(1);
player.line(targets,'green');
for(var i=0;i<targets.length;i++){
targets[i].damage('nosource');
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
}
},
chess_mech_guangmingquan_skill:{
filter:function(player){
for(var i=0;i<_status.friends.length;i++){
if(_status.friends[i].hp<_status.friends[i].maxHp&&
get.chessDistance(player,_status.friends[i])<=2){
return true;
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
return false;
},
content:function(){
var list=[];
for(var i=0;i<_status.friends.length;i++){
if(_status.friends[i].hp<_status.friends[i].maxHp&&
get.chessDistance(player,_status.friends[i])<=2){
list.push(_status.friends[i]);
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
}
if(list.length){
game.log('光明泉发动');
player.line(list,'green');
while(list.length){
list.shift().recover();
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
}
},
chess_mech_jiguanren_skill:{
filter:function(player){
for(var i=0;i<_status.enemies.length;i++){
if(get.chessDistance(player,_status.enemies[i])<=3){
return true;
}
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
return false;
},
content:function(){
'step 0'
var list=[];
for(var i=0;i<_status.enemies.length;i++){
if(get.chessDistance(player,_status.enemies[i])<=3){
list.push(_status.enemies[i]);
}
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(list.length){
game.log('机关人发动');
player.line(list,'green');
event.list=list;
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
else{
event.finish();
2016-08-15 14:19:58 +00:00
}
'step 1'
2016-08-15 15:00:52 +00:00
if(event.list.length){
var target=event.list.shift();
var he=target.get('he');
if(he.length){
target.discard(he.randomGets(Math.ceil(Math.random()*2)));
}
event.redo();
}
2016-08-15 14:19:58 +00:00
}
},
2016-08-15 15:00:52 +00:00
chess_mech_gongchengche_skill:{
filter:function(player){
for(var i=0;i<_status.enemies.length;i++){
if(get.chessDistance(player,_status.enemies[i])<=2){
return true;
2016-08-15 14:19:58 +00:00
}
}
2016-08-15 15:00:52 +00:00
return false;
2016-08-15 14:19:58 +00:00
},
content:function(){
2016-08-15 15:00:52 +00:00
'step 0'
var list=[];
for(var i=0;i<_status.enemies.length;i++){
if(get.chessDistance(player,_status.enemies[i])<=2){
list.push(_status.enemies[i]);
}
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(list.length){
game.log('攻城车发动');
event.target=list.randomGet();
player.playerfocus(1000);
player.line(event.target,'fire');
game.delay(2);
}
else{
event.finish();
}
'step 1'
if(event.target){
event.target.damage('fire','nosource');
event.target.moveUp();
2016-08-15 14:19:58 +00:00
}
}
},
2016-08-15 15:00:52 +00:00
_attackmove:{
trigger:{player:'damageEnd'},
2016-08-15 14:19:58 +00:00
forced:true,
popup:false,
2016-08-15 15:00:52 +00:00
priority:50,
2016-08-15 14:19:58 +00:00
filter:function(event,player){
2016-08-15 15:00:52 +00:00
if(!get.config('attack_move')) return false;
if(!event.source) return false;
if(get.distance(event.source,player,'pure')>2) return false;
var xy1=event.source.getXY();
var xy2=player.getXY();
var dx=xy2[0]-xy1[0];
var dy=xy2[1]-xy1[1];
// if(dx*dy!=0) return false;
if(dx==0&&Math.abs(dy)==2){
dy/=2;
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(dy==0&&Math.abs(dx)==2){
dx/=2;
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
return player.movable(dx,dy);
},
content:function(){
var xy1=trigger.source.getXY();
var xy2=player.getXY();
var dx=xy2[0]-xy1[0];
var dy=xy2[1]-xy1[1];
if(dx==0&&Math.abs(dy)==2){
dy/=2;
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(dy==0&&Math.abs(dx)==2){
dx/=2;
2016-08-15 14:19:58 +00:00
}
2016-08-15 15:00:52 +00:00
if(player.movable(dx,dy)){
player.move(dx,dy);
2016-08-15 14:19:58 +00:00
}
}
},
_phasequeue:{
trigger:{player:'phaseBegin'},
forced:true,
popup:false,
content:function(){
var current=ui.chessinfo.querySelector('.glow2');
if(current){
current.classList.remove('glow2');
}
if(player.instance){
player.instance.classList.add('glow2');
ui.chessinfo.scrollTop=player.instance.offsetTop-8;
}
}
},
_chessmove:{
enable:'phaseUse',
usable:1,
direct:true,
delay:false,
preservecancel:true,
filter:function(event,player){
if(!player.movable(0,1)&&!player.movable(0,-1)&&
!player.movable(1,0)&&!player.movable(-1,0)){
return false;
}
var move=2;
move=game.checkMod(player,move,'chessMove',player.get('s'));
return move>0;
},
content:function(){
"step 0"
var move=2;
move=game.checkMod(player,move,'chessMove',player.get('s'));
player.chooseToMove(move).phasing=true;
"step 1"
if(!result.bool){
var skill=player.getStat().skill;
skill._chessmove--;
if(typeof skill._chessmovetried=='number'){
skill._chessmovetried++;
}
else{
skill._chessmovetried=1;
}
}
},
ai:{
order:5,
result:{
playerx:function(player){
if(_status.mode=='tafang'&&_status.enemies.contains(player)){
return 1;
}
var nh=player.num('h');
if(!player.num('h','sha')&&
!player.num('h','shunshou')&&
!player.num('h','bingliang')){
if(nh<=Math.min(3,player.hp)) return Math.random()-0.3;
else if(nh<=Math.min(2,player.hp)) return Math.random()-0.4;
return Math.random()-0.5;
}
var neighbour;
neighbour=player.getNeighbour(0,1);
if(neighbour&&game.players.contains(neighbour)&&neighbour.side!=player.side){
if(get.distance(player,neighbour,'attack')<1) return 1;
return 0;
}
neighbour=player.getNeighbour(0,-1);
if(neighbour&&game.players.contains(neighbour)&&neighbour.side!=player.side){
if(get.distance(player,neighbour,'attack')<1) return 1;
return 0;
}
neighbour=player.getNeighbour(1,0);
if(neighbour&&game.players.contains(neighbour)&&neighbour.side!=player.side){
if(get.distance(player,neighbour,'attack')<1) return 1;
return 0;
}
neighbour=player.getNeighbour(-1,0);
if(neighbour&&game.players.contains(neighbour)&&neighbour.side!=player.side){
if(get.distance(player,neighbour,'attack')<1) return 1;
return 0;
}
return 1;
},
player:function(player){
if(player.getStat().skill._chessmovetried>=10){
return 0;
}
var x=lib.skill._chessmove.ai.result.playerx(player);
if(player.isMad()) return -x;
return x;
}
}
}
},
_chessswap:{
trigger:{player:['phaseBegin','chooseToUseBegin','chooseToRespondBegin','chooseToDiscardBegin','chooseToCompareBegin',
'chooseButtonBegin','chooseCardBegin','chooseTargetBegin','chooseCardTargetBegin','chooseControlBegin',
'chooseBoolBegin','choosePlayerCardBegin','discardPlayerCardBegin','gainPlayerCardBegin']},
forced:true,
priority:100,
popup:false,
filter:function(event,player){
if(event.autochoose&&event.autochoose()) return false;
if(lib.config.mode=='chess'&&_status.mode=='combat'&&!get.config('single_control')) return false;
return player.isUnderControl();
},
content:function(){
game.modeSwapPlayer(player);
},
},
_chesscenter:{
trigger:{player:['phaseBegin','useCardBegin','useSkillBegin','respondBegin','damageBegin','loseHpBegin'],
target:'useCardToBegin'},
forced:true,
priority:100,
popup:false,
content:function(){
player.chessFocus();
},
},
},
translate:{
friend:'友',
enemy:'敌',
neutral:'中',
trueColor:"zhu",
falseColor:"wei",
_chessmove:'移动',
2016-08-15 15:00:52 +00:00
mode_tafang_character_config:'塔防模式',
mode_tafang_card_config:'塔防模式',
2016-08-15 14:19:58 +00:00
chess_mech_weixingxianjing:'小型陷阱',
chess_mech_weixingxianjing_skill:'捕猎',
chess_mech_weixingxianjing_skill_info:'每一轮令距离你2格以内的一名随机敌人翻面',
chess_mech_mutong:'木桶',
chess_mech_mutong_skill:'飞滚',
chess_mech_mutong_skill_info:'每一轮对距离3格以内的一名随机敌人造成一点伤害',
chess_mech_nengliangqiu:'能量球',
chess_mech_nengliangqiu_skill:'充能',
chess_mech_nengliangqiu_skill_info:'每一轮令距离3格以内的所有友方角色摸1张牌距离1以内改为摸2张',
chess_mech_jiguanren:'机关人',
chess_mech_jiguanren_skill:'掠夺',
chess_mech_jiguanren_skill_info:'每一轮弃置3格以内的所有敌方角色各1~2张牌',
chess_mech_gongchengche:'攻城车',
chess_mech_gongchengche_skill:'攻坚',
chess_mech_gongchengche_skill_info:'每一轮对距离2格以内的一名随机敌方角色造成1点火焰伤害并将目标击退1格',
chess_mech_guangmingquan:'光明泉',
chess_mech_guangmingquan_skill:'圣疗',
chess_mech_guangmingquan_skill_info:'每一轮令距离2格以内的所有友方角色各回复一点体力',
},
ui:{
create:{
playergrid:function(player,x,y){
var pos=player.getDataPos(x,y);
if(_status.mode=='tafang'){
if(pos<ui.chesswidth) return false;
if(pos/ui.chesswidth>=ui.chessheight-1) return false;
}
var node=ui.create.div('.player.minskin.playergrid',player.parentNode);
node.link=player;
node.dataset.position=pos;
return node;
},
fakeme:function(){
if(ui.fakeme){
ui.fakeme.delete();
}
ui.fakeme=ui.create.div('.fakeme.avatar',ui.me);
ui.fakeme.style.backgroundImage=game.me.node.avatar.style.backgroundImage;
}
},
click:{
chessInfo:function(e){
if(this.link.isAlive()){
this.link.chessFocus();
if(this.link.classList.contains('selectable')||
this.link.classList.contains('selected')){
ui.click.target.call(this.link,e);
ui.click.window.call(ui.window,e);
}
e.stopPropagation();
}
},
playergrid:function(){
if(!_status.paused) return;
var pos=parseInt(this.dataset.position);
this.link.moveTo(pos%ui.chesswidth,Math.floor(pos/ui.chesswidth));
if(ui.movegrids){
while(ui.movegrids.length){
ui.movegrids.shift().delete();
}
}
_status.event.result={
bool:true,
move:this.link.dataset.position
};
game.resume();
},
obstacle:function(){
if(_status.event.chooseObstacle&&_status.paused&&
_status.event.obstacles&&_status.event.obstacles.contains(this)){
_status.event.obstacle=this;
game.resume();
}
}
}
},
get:{
chessDistance:function(from,to){
var fxy=from.getXY();
var txy=to.getXY();
return Math.abs(fxy[0]-txy[0])+Math.abs(fxy[1]-txy[1]);
},
},
ai:{
get:{
attitude:function(from,to){
if(!from||!to) return 0;
var t=(from.side===to.side?1:-1);
if(from.isMad()){
t=-t;
}
else if(to.isMad()){
t=0;
}
return 6*t;
}
}
},
characterPack:{
mode_tafang:{
chess_mech_guangmingquan:['','',0,['chess_mech_guangmingquan_skill'],['boss']],
chess_mech_nengliangqiu:['','',0,['chess_mech_nengliangqiu_skill'],['boss']],
chess_mech_jiguanren:['','',0,['chess_mech_jiguanren_skill'],['boss']],
chess_mech_weixingxianjing:['','',0,['chess_mech_weixingxianjing_skill'],['boss']],
chess_mech_mutong:['','',0,['chess_mech_mutong_skill'],['boss']],
chess_mech_gongchengche:['','',0,['chess_mech_gongchengche_skill'],['boss']],
}
},
cardPack:{
mode_tafang:[]
},
posmap:{},
help:{
'塔防模式':
'<ul><li>阻上敌人到达最下方的出口,坚持到给定的回合数即获得胜利<li>'+
'每轮可获得10个行动点用来布置机关、招募武将或令武将行动。游戏难度将影响不同操作消耗的行动点数。未用完的行动点将减半并累积到下一轮<li>'+
'每一轮在最上方的一个随机位置增加一名敌人,若最上方已有角色,则将其下移一格<li>'+
'战场上最多出现3个相同的机关每个机关在置入战场3轮后消失。战场上最多招募10名友方角色。<li>'+
'敌方角色到达底部出口时游戏失败,已方角色到达底部出口,将被移出游戏',
},
}