noname/mode/tafang.js

1189 lines
36 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
game.import('mode',function(lib,game,ui,get,ai,_status){
return {
name:'tafang',
canvasUpdates2:[],
start:function(){
"step 0"
_status.gameDrawed=true;
lib.init.css(lib.assetURL+'layout/mode','chess');
lib.init.css(lib.assetURL+'layout/mode','tafang');
game.loadMode('chess');
"step 1"
if(get.is.phoneLayout()&&lib.config.touchscreen&&
!lib.config.show_round_menu&&
!['system','menu'].contains(lib.config.swipe_left)&&
!['system','menu'].contains(lib.config.swipe_right)&&
!['system','menu'].contains(lib.config.swipe_up)){
ui.roundmenu.style.display='';
}
if(lib.config.player_border=='normal'&&(lib.config.layout=='long'||lib.config.layout=='long2')){
ui.arena.classList.add('lslim_player');
}
for(var i in result.element){
for(var j in result.element[i]){
if(j!='dieAfter'){
lib.element[i][j]=result.element[i][j];
}
}
}
for(var i in result.ui){
for(var j in result.ui[i]){
ui[i][j]=result.ui[i][j];
}
}
get.chessDistance=result.get.chessDistance;
get.rawAttitude=result.get.rawAttitude;
var toLoad=['addChessPlayer','addObstacle','removeObstacle','isChessNeighbour',
'draw2','updateCanvas2','setChessInfo','modeSwapPlayer','initChess'];
for(var i=0;i<toLoad.length;i++){
game[toLoad[i]]=result.game[toLoad[i]];
}
toLoad=['_attackmove','_phasequeue','_chessmove','_chesscenter','_tempobstacle'];
for(var i=0;i<toLoad.length;i++){
lib.skill[toLoad[i]]=result.skill[toLoad[i]];
}
ui.placeChess=result.ui.placeChess;
ui.click.moveContainer=result.ui.click.moveContainer;
for(var i in lib.skill){
if(lib.skill[i].changeSeat){
lib.skill[i]={};
if(lib.translate[i+'_info']){
lib.translate[i+'_info']='此模式下不可用';
}
}
}
// if(!localStorage.getItem(lib.configprefix+'playback')){
// game.loadMap();
// }
"step 2"
var result='basic_medium';
_status.map=lib.tafang.map[result];
_status.mapname=result;
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('tafang_mech_')==0){
lib.characterPack.mode_tafang[i][3].push(i+'_skill');
lib.mechlist.push(i);
}
lib.character[i]=lib.characterPack.mode_tafang[i];
if(!lib.character[i][4]){
lib.character[i][4]=[];
}
}
ui.create.cardsAsync();
game.finishCards();
game.addGlobalSkill('autoswap');
ui.chessContainer=ui.create.div('#chess-container',ui.arena);
ui.chessContainer.move=ui.click.moveContainer;
ui.chessContainer.chessLeft=0;
ui.chessContainer.chessTop=0;
// 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 3"
ui.arena.classList.add('chess');
if(event.video){
for(var ii=0;ii<event.video.length;ii++){
if(event.video[ii].type=='init'){
_status.mapname=event.video[ii].content;
break;
}
}
_status.map=lib.tafang.map[_status.mapname];
game.playerMap=lib.posmap;
}
ui.chesswidth=_status.map.size[0];
ui.chessheight=_status.map.size[1];
game.initChess();
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());
}
}
if(lib.config.show_handcardbutton){
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].getCards('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();
});
ui.create.div(ui.chessinfo);
lib.setScroll(ui.chessinfo.firstChild);
game.arrangePlayers();
"step 4"
ui.control.style.display='';
if(event.video){
game.playVideoContent(event.video);
game.setChessInfo();
return;
}
_status.videoInited=true;
game.addVideo('init',null,_status.mapname);
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('tafang_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());
}
}
lib.init.onfree();
event.trigger('gameStart');
game.phaseLoopTafang();
},
element:{
content:{
chessMechRemove:function(){
game.treasures.remove(player);
setTimeout(function(){
player.delete();
},500);
delete lib.posmap[player.dataset.position];
game.addVideo('deleteChessPlayer',player);
game.addObstacle(player.dataset.position);
game.log(get.translation(player)+'使用期限已到');
}
},
player:{
dieAfter2:function(){
var player=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;
}
}
},
dieAfter:function(source){
var player=this;
if(_status.friends){
_status.friends.remove(this);
}
if(_status.enemies){
_status.enemies.remove(this);
}
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]);
}
}
}
if(_status.friends.length==0){
ui.fakeme.hide();
this.node.handcards1.delete();
this.node.handcards2.delete();
game.me=ui.create.player();
game.me.side=false;
game.addVideo('removeTafangPlayer');
}
},
},
},
tafang:{
map:{
basic_small:{
name:'小型战场',
size:[6,11],
obstacle:[]
},
basic_medium:{
name:'中型战场',
size:[9,11],
},
basic_large:{
name:'大型战场',
size:[12,11],
},
}
},
game:{
minskin:true,
singleHandcard:true,
chess:true,
treasures:[],
obstacles:[],
getVideoName:function(){
return [get.translation(game.me.name),'塔防模式'];
},
addOverDialog:function(dialog){
dialog.classList.add('center');
},
phaseLoopTafang:function(){
var next=game.createEvent('phaseLoop');
next.setContent(function(){
'step 0'
delete _status.roundStart;
_status.turnCount++;
_status.remainingCount-=_status.friends.length;
ui.turnCount.innerHTML='回合'+get.cnNumber(_status.turnCount,true);
var dialog=ui.create.dialog('剩余行动点:'+(10+_status.remainingCount),'hidden');
dialog.style.height='260px';
dialog.style.maxHeight='260px';
dialog.style.top='calc(50% - 160px)';
dialog.classList.add('center');
dialog.classList.add('noupdate');
dialog.classList.add('fixed');
event.dialog=dialog;
var list=_status.characterList.splice(0,6);
list.sort(function(a,b){
return get.rank(a,true)-get.rank(b,true);
});
var map={};
var mechlist=lib.mechlist.randomGets(6);
mechlist.sort(function(a,b){
return lib.character[a][5]-lib.character[b][5];
});
map.bufang=ui.create.buttons(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');
button.count=difficulty+lib.character[button.link][5]-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];
if(lib.config.buttoncharacter_style=='default'){
button.node.group.style.display='none';
}
button.node.intro.classList.add('showintro');
button.node.intro.classList.add('tafang');
button.count=difficulty+get.rank(button.link,3.9)+3;
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');
map[i][j].classList.add('pointerdiv');
if(map[i][j].count>count){
map[i][j].classList.add('unselectable');
map[i][j].classList.remove('pointerdiv');
}
else if(i=='zhaomu'&&_status.friends.length+selectedZhaomu>=5){
map[i][j].classList.add('unselectable');
map[i][j].classList.remove('pointerdiv');
}
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(node.disabled) 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>=5){
event.control.childNodes[1].style.opacity=0.5;
event.control.childNodes[1].disabled=true;
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=_status.friends.slice(0);
// 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.floor(_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&&10+_status.remainingCount>0){
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);
var mech=game.addChessPlayer(event.currentBufang,'treasure',0,event.obstacle.dataset.position);
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');
ui.placeChess(grid,i);
event.playergrids.push(grid);
}
}
}
game.pause();
if(_status.auto){
setTimeout(function(){
clickGrid.call(event.playergrids.randomGet());
},50);
}
}
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.hp<=0){
var next=game.createEvent('chessMechRemove');
next.player=mech;
next.setContent('chessMechRemove');
}
else{
mech.update();
}
event.redo();
}
'step 11'
delete event.xingdong;
delete event.mechlist;
if(_status.turnCount>=_status.turnTotal){
game.over(true);
}
else{
event.goto(0);
game.delay();
}
});
},
loadMap:function(){
var next=game.createEvent('loadMap');
next.setContent(function(){
if(!lib.storage.map){
lib.storage.map=['basic_small','basic_medium','basic_large'];
}
if(!lib.storage.newmap){
lib.storage.newmap=[];
}
var sceneview=ui.create.div('.storyscene');
if(!lib.config.touchscreen&&lib.config.mousewheel){
sceneview._scrollspeed=30;
sceneview._scrollnum=10;
sceneview.onmousewheel=function(){
if(!this.classList.contains('lockscroll')){
ui.click.mousewheel.apply(this,arguments);
}
};
}
lib.setScroll(sceneview);
var switchScene=function(){
event.result=this.link;
sceneview.delete();
setTimeout(game.resume,300);
}
var clickScene=function(e){
if(this.classList.contains('unselectable')) return;
if(this._clicking) return;
if(e&&e.stopPropagation) e.stopPropagation();
if(this.classList.contains('flipped')){
return;
}
if(this.classList.contains('glow3')){
this.classList.remove('glow3');
lib.storage.newmap.remove(this.name);
game.save('newmap',lib.storage.newmap);
}
var sceneNode=this.parentNode;
var current=document.querySelector('.flipped.scene');
if(current){
restoreScene(current,true);
}
this.content.innerHTML='';
ui.create.div('.menubutton.large.enter','进入',this.content,switchScene).link=this.name;
sceneNode.classList.add('lockscroll');
var node=this;
node._clicking=true;
setTimeout(function(){
node._clicking=false;
},700);
sceneNode.dx=ui.window.offsetWidth/2-(-sceneNode.scrollLeft+this.offsetLeft+this.offsetWidth/2);
if(Math.abs(sceneNode.dx)<20){
sceneNode.dx=0;
}
if(!sceneNode.sceneInterval&&sceneNode.dx){
sceneNode.sceneInterval=setInterval(function(){
var dx=sceneNode.dx;
if(Math.abs(dx)<=2){
sceneNode.scrollLeft-=dx;
clearInterval(sceneNode.sceneInterval);
delete sceneNode.sceneInterval;
}
else{
var ddx=dx/Math.sqrt(Math.abs(dx))*1.5;
sceneNode.scrollLeft-=ddx;
sceneNode.dx-=ddx;
}
},16);
}
node.style.transition='all ease-in 0.2s';
node.style.transform='perspective(1600px) rotateY(90deg) scale(0.75)';
var onEnd=function(){
node.removeEventListener('webkitTransitionEnd',onEnd);
node.classList.add('flipped');
sceneNode.classList.add('lockscroll');
node.style.transition='all ease-out 0.4s';
node.style.transform='perspective(1600px) rotateY(180deg) scale(1)'
};
node.listenTransition(onEnd);
}
ui.click.scene=clickScene;
var restoreScene=function(node,forced){
if(node._clicking&&!forced) return;
if(node.transformInterval){
clearInterval(node.transformInterval);
delete node.transformInterval;
}
var sceneNode=node.parentNode;
node._clicking=true;
setTimeout(function(){
node._clicking=false;
},700);
node.style.transition='all ease-in 0.2s';
node.style.transform='perspective(1600px) rotateY(90deg) scale(0.75)';
var onEnd=function(){
node.removeEventListener('webkitTransitionEnd',onEnd);
node.classList.remove('flipped');
if(!sceneNode.querySelector('.flipped')){
sceneNode.classList.remove('lockscroll');
}
node.style.transition='all ease-out 0.4s';
node.style.transform='perspective(1600px) rotateY(0deg) scale(0.7)'
};
node.listenTransition(onEnd);
}
ui.click.scene2=restoreScene;
var createScene=function(name){
var scene=lib.tafang.map[name];
var node=ui.create.div('.scene',clickScene);
node.style.transform='perspective(1600px) rotateY(0deg) scale(0.7)';
node.name=name;
node.bgnode=ui.create.div('.background.player',node);
node.info=scene;
ui.create.div('.avatar.menu',node.bgnode);
node.namenode=ui.create.div('.name',node,(scene.name));
if(lib.storage.map.contains(name)){
if(lib.storage.newmap.contains(name)){
node.classList.add('glow3');
}
node.namenode.dataset.nature='soilm';
}
else{
node.classList.add('unselectable');
node.namenode.innerHTML=('未开启');
}
var content=ui.create.div('.menu',node);
lib.setScroll(content);
node.content=content;
sceneview.appendChild(node);
return node;
}
event.custom.add.window=function(){
var current=document.querySelector('.flipped.scene');
if(current){
restoreScene(current);
}
}
for(var i in lib.tafang.map){
createScene(i);
}
ui.window.appendChild(sceneview.animate('start'));
game.pause();
});
},
},
skill:{
tafang_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;
}
}
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]);
}
}
if(list.length){
game.log('小型陷阱发动');
var target=list.randomGet();
target.turnOver();
game.logv(player,'tafang_mech_weixingxianjing_skill',[target]).node.text.style.display='none';
player.line(target,'green');
}
}
},
tafang_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;
}
}
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]);
}
// else if(get.chessDistance(player,_status.friends[i])<=4){
// list2.push(_status.friends[i]);
// }
}
if(list2.length){
game.asyncDraw(list2,2);
player.line(list2,'green');
}
if(list1.length){
game.asyncDraw(list1);
player.line(list1,'green');
}
if(list1.length||list2.length){
game.log('能量球发动');
game.logv(player,'tafang_mech_nengliangqiu_skill',list1.concat(list2)).node.text.style.display='none';
}
}
},
tafang_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;
}
}
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]);
}
}
if(list.length){
game.log('木桶发动');
var targets=list.randomGets(1);
game.logv(player,'tafang_mech_mutong_skill',targets).node.text.style.display='none';
player.line(targets,'green');
for(var i=0;i<targets.length;i++){
targets[i].damage('nosource');
}
}
}
},
tafang_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;
}
}
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]);
}
}
if(list.length){
game.log('光明泉发动');
player.line(list,'green');
game.logv(player,'tafang_mech_guangmingquan_skill',list.slice(0)).node.text.style.display='none';
while(list.length){
list.shift().recover();
}
}
}
},
tafang_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;
}
}
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]);
}
}
if(list.length){
game.log('机关人发动');
player.line(list,'green');
game.logv(player,'tafang_mech_jiguanren_skill',list.slice(0)).node.text.style.display='none';
event.list=list;
}
else{
event.finish();
}
'step 1'
if(event.list.length){
var target=event.list.shift();
var he=target.getCards('he');
if(he.length){
target.discard(he.randomGets(Math.ceil(Math.random()*2)));
}
event.redo();
}
}
},
tafang_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;
}
}
return false;
},
content:function(){
var list=[];
for(var i=0;i<_status.enemies.length;i++){
if(get.chessDistance(player,_status.enemies[i])<=2){
list.push(_status.enemies[i]);
}
}
if(list.length){
game.log('攻城车发动');
var target=list.randomGet();
player.line(target,'fire');
target.damage('fire','nosource');
var he=target.getCards('he');
if(he.length){
target.discard(he.randomGet());
}
game.logv(player,'tafang_mech_gongchengche_skill',[target]).node.text.style.display='none';
}
}
},
},
translate:{
friend:'友',
enemy:'敌',
neutral:'中',
trueColor:"zhu",
falseColor:"wei",
_chessmove:'移动',
mode_tafang_character_config:'塔防模式',
mode_tafang_card_config:'塔防模式',
tafang_mech_weixingxianjing:'小型陷阱',
tafang_mech_weixingxianjing_skill:'捕猎',
tafang_mech_weixingxianjing_skill_info:'每一轮令距离你2格以内的一名随机敌人翻面。',
tafang_mech_mutong:'木桶',
tafang_mech_mutong_skill:'飞滚',
tafang_mech_mutong_skill_info:'每一轮对距离3格以内的一名随机敌人造成一点伤害。',
tafang_mech_nengliangqiu:'能量球',
tafang_mech_nengliangqiu_skill:'充能',
tafang_mech_nengliangqiu_skill_info:'每一轮令距离3格以内的所有友方角色摸1张牌距离1以内改为摸2张。',
tafang_mech_jiguanren:'机关人',
tafang_mech_jiguanren_skill:'掠夺',
tafang_mech_jiguanren_skill_info:'每一轮弃置3格以内的所有敌方角色各1~2张牌。',
tafang_mech_gongchengche:'攻城车',
tafang_mech_gongchengche_skill:'攻坚',
tafang_mech_gongchengche_skill_info:'每一轮对距离2格以内的一名随机敌方角色造成1点火焰伤害并随机弃置其一张牌。',
tafang_mech_guangmingquan:'光明泉',
tafang_mech_guangmingquan_skill:'圣疗',
tafang_mech_guangmingquan_skill_info:'每一轮令距离2格以内的所有友方角色各回复一点体力。',
tafang_mech_dubiaoxianjing:'毒镖陷阱',
tafang_mech_dubiaoxianjing_skill:'毒镖',
tafang_mech_dubiaoxianjing_skill_info:'每当距离2格以内的一名敌方角色。',
tafang_mech_jiqishi:'集合石',
tafang_mech_shenmidiaoxiang:'神秘雕像',
tafang_mech_shenpanxianjing:'审判之刃',
tafang_mech_shiyuansu:'石元素',
tafang_mech_wuyashenxiang:'乌鸦神像',
},
characterPack:{
mode_tafang:{
// tafang_mech_dubiaoxianjing:['','',4,[],['boss'],2],
// tafang_mech_wuyashenxiang:['','',4,[],['boss'],2],
// tafang_mech_shenpanxianjing:['','',4,[],['boss'],2],
// tafang_mech_shenmidiaoxiang:['','',4,[],['boss'],5],
// tafang_mech_shiyuansu:['','',4,[],['boss'],5],
// tafang_mech_jiqishi:['','',4,[],['boss'],5],
tafang_mech_guangmingquan:['','',3,[],['boss'],3],
tafang_mech_nengliangqiu:['','',3,[],['boss'],3],
tafang_mech_jiguanren:['','',3,[],['boss'],3],
tafang_mech_weixingxianjing:['','',3,[],['boss'],4],
tafang_mech_mutong:['','',3,[],['boss'],4],
tafang_mech_gongchengche:['','',3,[],['boss'],4],
}
},
cardPack:{
mode_tafang:[]
},
posmap:{},
help:{
'塔防模式':
'<ul><li>阻上敌人到达最下方的出口,坚持到给定的回合数即获得胜利<li>'+
'每轮可获得10个行动点用来布置机关、招募武将。场上每有一个友方武将行动点数-1。游戏难度将影响不同操作消耗的行动点数。未用完的行动点将减半向下取整并累积到下一轮<li>'+
'每一轮在最上方的一个随机位置增加一名敌人,若最上方已有角色,则将其下移一格<li>'+
'战场上最多出现3个相同的机关每个机关在置入战场3轮后消失。战场上最多招募5名友方角色。<li>'+
'敌方角色到达底部出口时游戏失败,已方角色到达底部出口,将被移出游戏',
},
};
});