﻿var easyDrMario = {
	util:{
		o_virus_s:function(){//小病毒类
			this.scolor = this.className.replace(/^v_([^_]*).*$/i,'$1');//颜色
			this.timer = null;
			this.stop = function(){window.clearTimeout(this.timer);};
			this.active = function(){
				this.stop();
				var me = this,tg = 0,scolor = this.scolor;
				var innerfoo = function(){
					tg = tg?0:1;
					me.className = tg?'v_'+scolor+'_act':'v_'+scolor;
					me.timer = window.setTimeout(arguments.callee,300);
				};
				innerfoo();
			};
			this.die = function(){
				this.stop();
				this.scolor = null,this.timer = null,this.stop = null,this.active = null,this.die = null;
			};
			this.active();
		},
		o_virus_b:function(){//大病毒类
			var scolor = this.className.replace(/^virus (.*)$/i,'$1');//颜色
			var t1 = 125,t2 = 25,h = 24;
			switch(scolor){
				case 'yellow':t1=275,t2=175;break;
				case 'blue':t1=425,t2=325;break;
				default:t1=125,t2=25;break;
			}
			this.vlength = 1;
			this.timer = null;
			this.stop = function(){window.clearTimeout(this.timer);};
			this.active = function(){
				this.stop();
				var me = this,n = 0,f = 3;
				var innerfoo = function(){
					n = (n>=f)?0:(n+1);
					me.style.backgroundPosition = '-517px -'+(t1-h*n-n)+'px';
					me.timer = window.setTimeout(arguments.callee,300);
				};
				innerfoo();
			};
			this.die = function(){
				this.stop();
				var me = this,n = 0,f = 1,times = 0;
				var l = --this.vlength;
				var innerfoo = function(){
					if(times>=8){if(l<=0){me.hide();}else{me.active();}return;}
					n = (n>=f)?0:(n+1);
					if(!n){times++;}
					me.style.backgroundPosition = '-517px -'+(t2-h*n-n)+'px';
					me.timer = window.setTimeout(arguments.callee,100);
				};
				innerfoo();
			};
			this.win = function(){
				this.stop();
				var me = this,n = 0,f = 1;
				var innerfoo = function(){
					n = (n>=f)?0:(n+1);
					me.style.backgroundPosition = '-544px -'+(t2-h*n-n)+'px';
					me.timer = window.setTimeout(arguments.callee,100);
				};
				innerfoo();
			};
			this.hide = function(){this.stop();this.style.visibility = 'hidden';}
			this.show = function(){this.style.visibility = 'visible';this.active();};
			this.active();
		},
		o_next_medicine:function(){//下一颗药丸
			this.acolor = [];
			this.ondropdown = undefined;
			this.dropdown = function(){
				var dstyle = this.style,px = 30,py = 7,px1 = -90,py1 = -80,px2 = -141,py2 = 55,t = 0.3,stime = new Date();
				if(this.ondropdown&&this.ondropdown.constructor==Function){this.ondropdown();}
				var moveend = (this.onafterdropdown&&this.onafterdropdown.constructor==Function)?this.onafterdropdown:function(){};
				var bezier2 = function(t,p0,p1,p2){return (1-t) * (1-t) * p0 + 2 * t * (1-t) * p1 + t * t * p2;};
				var move1 = function(){var e = (new Date()-stime)/1000,x = Math.ceil(bezier2(e*3,px,px1,px2)),y = Math.ceil(bezier2(e*3,py,py1,py2));if(e>=t&&(x>=px2||y>=py2)){moveend();return;}dstyle.left=x+'px';dstyle.top=y+'px';window.setTimeout(arguments.callee,0);};
				move1();
			};
			this.next = function(){//初始化盒子
				var acolor = ['red','yellow','blue'],l = acolor.length-1;
				var c1 = acolor[Math.round(Math.random()*l)],c2 = acolor[Math.round(Math.random()*l)];
				this.style.left = '30px';
				this.style.top = '7px';
				this.acolor = [c1,c2];
				this.rows[0].cells[0].className = 'm_'+c1+'_left';
				this.rows[0].cells[1].className = 'm_'+c2+'_right';
				this.style.display = 'block';
			};
		},
		o_box_play:function(){//下落的药丸盒子
			this.shape = [[0,0,1,1],[1,0,1,0],[0,0,1,1],[1,0,1,0]];
			this.acolor = [];
			this.sindex = 0;
			this.startx = 4;
			this.starty = -2;
			this.x = 4;
			this.y = -2;
			this.steplength = 15;
			this.speed = 1000;//升级后更新
			this.timer = null;
			this.pause = false;
			var da = this.rows[0].cells[0],db = this.rows[1].cells[0],dc = this.rows[1].cells[1];
			this.getshape = function(idx){//取形状数据
				idx = isNaN(idx)?this.sindex:idx;
				return this.shape[idx].slice(0);
			};
			this.grouplist = function(){//取grouplist
				var idx = this.sindex,ac = this.acolor[idx],r = this.y,c = this.x,cl,cr,ret = [];
				if(idx%2){
					cl = 'm_'+ac[0]+'_up',cr = 'm_'+ac[1]+'_down';
					ret = [[r,c,cl],[r+1,c,cr]];
				}else{
					cl = 'm_'+ac[0]+'_left',cr = 'm_'+ac[1]+'_right';
					ret = [[r+1,c,cl],[r+1,c+1,cr]];
				}
				return ret.slice(0);
			};
			this.setpause = function(){//设置暂停
				this.pause = this.pause?false:true;
				if(this.pause){window.clearTimeout(this.timer);}else{this.movedown();}
			};
			this.onbeforeroll = undefined;
			this.roll = function(){//药丸变换
				if(this.pause){return;}
				var bnext = true;
				if(this.onbeforeroll&&this.onbeforeroll.constructor==Function){bnext = this.onbeforeroll(this.x,this.y);}
				if(!bnext){return;}
				var l = this.shape.length-1;
				this.sindex = (this.sindex>=l)?0:this.sindex+1;
				var idx = this.sindex;
				var c1 = this.acolor[idx][0],c2 = this.acolor[idx][1];
				if(idx%2){
						da.className = 'm_'+c1+'_up';
						db.className = 'm_'+c2+'_down';
						dc.className = '';
				}else{
						db.className = 'm_'+c1+'_left';
						dc.className = 'm_'+c2+'_right';
						da.className = '';
				}
			};
			this.onbeforedown = undefined;
			this.onafterdown = undefined;
			this.movedown = function(){//下落
				if(this.pause){return;}
				window.clearTimeout(this.timer);
				var me = this,fooobd = this.onbeforedown,foooad = this.onafterdown,sl = this.steplength,speed = this.speed;
				var innerfoo = function(){
					var bnext = true,x = me.x,y = me.y + 1;
					if(fooobd&&fooobd.constructor==Function){bnext = me.onbeforedown(x,y);}
					if(!bnext){
						if(foooad&&foooad.constructor==Function){me.onafterdown();}
						return;
					}
					me.style.top = y*sl+'px';
					me.y = y;
					me.timer = window.setTimeout(arguments.callee,speed);
				}
				innerfoo();
			};
			this.onbeforemovex = undefined;
			this.movex = function(x){//左右移
				if(this.pause){return;}
				var bnext = true,y = this.y;
				if(this.onbeforemovex&&this.onbeforemovex.constructor==Function){bnext = this.onbeforemovex(x,y);}
				if(!bnext){return;}
				this.style.left = x*this.steplength+'px';
				this.x = x;
			};
			this.hide = function(){//隐藏
				if(!this.pause){this.setpause();}
				window.clearTimeout(this.timer);
				this.style.display = 'none';
			};
			this.init = function(clist){//初始化盒子
				if(!clist||!clist.length){return;}
				var c1 = clist[0],c2 = clist[1];
				this.acolor = [[c1,c2],[c2,c1],[c2,c1],[c1,c2]];
				this.sindex = 0;
				da.className = '';
				db.className = 'm_'+c1+'_left';
				dc.className = 'm_'+c2+'_right';
				this.x = this.startx;
				this.y = this.starty;
				this.style.left = this.startx*this.steplength+'px';
				this.style.top = this.starty*this.steplength+'px';
				this.movedown();
				this.style.display = 'block';
				if(this.pause){this.setpause();}
			};
		},
		o_box_container:function(){//容器盒子
			var rl = this.rows.length;
			var cl = this.rows[0].cells.length;
			this.level = 1;
			this.tspeed = ['LOW','LOW','LOW','LOW','LOW','LOW','MED','MED','MED','MED','MED','HIGH','HIGH','HIGH','HIGH','HIGH','TOP','TOP','TOP','TOP','TOP'];
			this.speed = [1000,1000,1000,1000,1000,1000,800,800,800,800,800,500,500,500,500,500,200,200,200,200,200];
			this.avirus = [0,4,8,10,14,18,20,24,28,30,34,38,40,44,48,50,54,58,60,64,68];
			this.rvirus = 0;
			this.score = 0;
			this.topscore = 0;
			this.groups = [];//药丸分组
			this.alldown = 0;
			this.next = undefined;
			this.data = new Array(rl);
			for(var ir=0;ir<rl;ir++){this.data[ir] = new Array(cl);}
			this.setmap = function(list){//设置结果映射[[row,cell,class],[row,cell,class]]
				if(!list||!list.length){return;}
				var r,c,s,color,sv = easyDrMario.util.o_virus_s,dgrid;
				for(var i=0;i<list.length;i++){
					r = list[i][0],c = list[i][1],s = list[i][2]||'',dgrid = this.rows[r].cells[c];
					color = s?s.replace(/^(?:m|v)_([^_]*).*$/i,'$1'):'';
					try{if(dgrid.die){dgrid.die();}}catch(e){}
					dgrid.className = s;
					dgrid.stop = s?true:false;
					this.data[r][c] = color;
					if(s&&(/v/i.test(s))){sv.call(this.rows[r].cells[c]);}
				}
			};
			this.clearmap = function(){//清屏
				var lr = this.data.length,lc = this.data[0].length;
				for(var i=0;i<lr;i++){
					for(var n=0;n<lc;n++){
						this.setmap([[i,n]]);
					}
				}
			};
			this.checkupgroup = function(){//整理group
				var p,pa,pb,pga,pgb,color;
				this.groups.sort(function(a,b){return b[0][0]-a[0][0];});
				for(var i=0;i<this.groups.length;i++){
					if(i<this.groups.length-1){if(this.groups[i].join('')==this.groups[i+1].join('')){this.groups.splice(i,1);i--;continue;}}
					p = this.groups[i],pa = p[0],pb = p[1];
					if(pa){pga = this.rows[pa[0]].cells[pa[1]];}
					if(pb){pgb = this.rows[pb[0]].cells[pb[1]];}
					if((pga&&pgb&&pga.stop&&pgb.stop)||(!pb&&pga&&pga.stop)){continue;}
					if((pga&&pgb&&!pga.stop&&!pgb.stop)||(!pb&&pga&&!pga.stop)){this.groups.splice(i,1);i--;continue;}
					if(pb&&pga&&!pga.stop){color = pb[2].replace(/^m_([^_]*).*$/i,'$1');pb[2] = pgb.className = 'm_'+color+'_single';this.groups[i].splice(0,1);continue;}
					if(pa&&pgb&&!pgb.stop){color = pa[2].replace(/^m_([^_]*).*$/i,'$1');pa[2] = pga.className = 'm_'+color+'_single';this.groups[i].splice(1,1);continue;}
				}
			};
			this.setgroup = function(grouplist){//设置group[[row,cell,class],[row,cell,class]]
				if(!grouplist||!grouplist.length){return;}
				this.groups.push(grouplist);
				this.setmap(grouplist);
				this.checkupgroup();
				//document.getElementById('debug').value = 'setgroup:\n'+this.groups.join('\n');
			};
			this.gmdown = function(groupidx){//失去支点的药丸group掉落
				if(!this.groups[groupidx]){this.alldown--;if(this.alldown<=0){this.actioning = false;this.actiondown();}return;}
				var me = this,l = this.rows.length-1,gl = this.groups.length-1,pd = this.groups[groupidx].sort(function(a,b){return b?b[0]-a[0]:0;});
				var pa = pd[0],pb = pd[1],r = pa[0],c = pa[1],r2 = pb&&pb[0],c2 = pb&&pb[1];
				var scls = this.rows[r].cells[c].className,scls2 = pb&&this.rows[r2].cells[c2].className;
				if(!scls&&!scls2){this.alldown--;if(this.alldown<=0){this.actioning = false;this.actiondown();}return;}
				var innerfoo = function(){
					var bstop = false;
					if(r>=l){bstop = true;}else{
						if(me.rows[r+1].cells[c].stop){bstop = true;}
						if(pb&&r2==r&&me.rows[r2+1].cells[c2].stop){bstop = true;}
					}
					if(bstop){
						me.alldown--;
						if(pa){if(scls){me.rows[r].cells[c].stop = true;}pa[0] = r;}
						if(pb){if(scls2){me.rows[r2].cells[c2].stop = true;}pb[0] = r2;}
						if(me.alldown<=0){me.actioning = false;me.actiondown();}
						return;
					}
					if(pb){me.setmap([[r,c],[r2,c2]]);}else{me.setmap([[r,c]]);}
					r++,r2++;
					if(pa){pa[0] = r;}
					if(pb){pb[0] = r2;}
					if(pb){me.setmap([[r,c,scls],[r2,c2,scls2]]);}else{me.setmap([[r,c,scls]]);}
					window.setTimeout(arguments.callee,200);
				};
				innerfoo();
			};
			this.groupdown = function(){//group掉落
				//document.getElementById('debug').value = 'groupdown:\n'+this.groups.join('\n');
				var i = 0,l = this.groups.length;this.alldown = l;
				if(!l){this.actioning = false;this.next();return;}
				for(i=0;i<l;i++){this.gmdown(i);}
			};
			this.getsamelistfrommartix = function(list,minlength){//取相同的结果
				var d = list.slice(0),r=d.length,c=d[0].length,iflag = new Array(c+1).join(1).split(''),ret = [];
				var pushrow = function(r0,c0,c1){var tmp=[];for(var i=c0;i<=c1;i++){tmp.push([r0,i]);}ret.push(tmp);};
				var pushcell = function(c0,r0,r1){var tmp=[];for(var i=r0;i<=r1;i++){tmp.push([i,c0]);}ret.push(tmp);};
				for(var i=0;i<r;i++){
					var nflag = 1;
					for(var n=0;n<c;n++){
						if(n<(c-1)&&d[i][n]!=''&&d[i][n]==d[i][n+1]){nflag++;}else{if(nflag>=minlength){pushrow(i,(n-nflag+1),n);}nflag = 1;}
						if(i<(r-1)&&d[i][n]!=''&&d[i][n]==d[i+1][n]){iflag[n]++;}else{if(iflag[n]>=minlength){pushcell(n,(i-iflag[n]+1),i);}iflag[n] = 1;}
					}
				}
				return ret.slice(0);
			};
			this.check = function(x,y,chkdata){//网格检测
				if(!chkdata){return true;}
				var cdata = parseInt(chkdata.join(''),2);
				var data = this.data,lr = data.length,lc = data[0].length,dpd = [],pa = null,pb = null;
				pa = (!data[y]||data[y][x]||data[y][x]==undefined)?'1':'0',pb = (!data[y]||data[y][x+1]||data[y][x+1]==undefined)?'1':'0';
				dpd.push(pa+''+pb);
				pa = (!data[y+1]||data[y+1][x]||data[y+1][x]==undefined)?'1':'0',pb = (!data[y+1]||data[y+1][x+1]||data[y+1][x+1]==undefined)?'1':'0';
				dpd.push(pa+''+pb);
				var dpdt = parseInt(dpd.join(''),2),bcheck = !(cdata&dpdt);
				return bcheck;
			};
			this.onboom = undefined;
			this.actioning = false;
			this.actiondown = function(){//掉落结果检测
				if(this.actioning){return;}
				this.actioning = true;
				var data = this.data,ret = this.getsamelistfrommartix(data,4);
				if(!ret.length){this.actioning = false;this.next();return;}
				var me = this,onboom = this.onboom,scls = '',p,pr,pc,pv,pcolor,pgrid;
				var level = this.level,score = this.score,topscore = this.topscore;
				for(var i=0;i<ret.length;i++){
						p = ret[i],pv = 0;
						for(var n=0;n<p.length;n++){
								pr = p[n][0],pc = p[n][1],pcolor = data[pr][pc],pgrid = this.rows[pr].cells[pc];
								if(/v/i.test(pgrid.className)){
									pv++;//病毒数
									pgrid.die();//清除病毒
								}
								scls = 'm_'+pcolor+'_boom';
								pgrid.className = scls;//爆
								pgrid.stop = false;
						}
						if(pv){
								this.rvirus -= pv;//剩余病毒数
								if(this.rvirus<=0){this.level = ++level;}
								score += pv*100;
								this.score = score;//得分
								if(topscore<score){this.topscore = score}//最高分
								if(onboom&&onboom.constructor==Function){this.onboom(pcolor,pv);}//爆事件
						}
				}
				var innerfoo = function(){
					for(var i=0;i<ret.length;i++){me.setmap(ret[i]);}//清除爆的数据
					me.checkupgroup();
					if(me.rvirus<=0){me.actioning = false;me.nextstage();}//Stage Clear下一关
					me.groupdown();//group掉落
					return;
				};
				window.setTimeout(innerfoo,200);
			};
		}
	},
	instance:{
		newgame:function(){
			var instanced = 0;
			return function(dmodule,option){
				if(instanced>0){alert('每个页面只允许一个游戏实例！');return;}
				if(!dmodule){return;}
				instanced++;
				var scls = dmodule.className;
				var alayout = [],scell = new Array(11).join('<td></td>'),srow = new Array(17).join('<tr>'+scell+'</tr>');
				alayout[0] = '<div class="game_cover"><a href="#" class="game_start">start game Dr.Mario</a><div class="game_info"><p class="title"><a href="http://www.v-ec.com/games/drmario/">JavaScript Dr.Mario</a></p><p class="site"><a href="http://www.easyui.org.cn">www.easyui.org.cn</a></p><p class="author"><a href="http://www.w3cgroup.com">by dh20156</a></p></div></div>';
				alayout[1] = '<div class="game_panel">';
				alayout[2] = '<div class="column cell1"><ul class="score_panel"><li><strong>TOP</strong></li><li class="top_score">0</li><li><strong>SCORE</strong></li><li class="score">0</li></ul><div class="microscope"><div class="virus red"></div><div class="virus yellow"></div><div class="virus blue"></div></div></div>';
				alayout[3] = '<div class="column cell2"><div class="playarea"><div class="table"><table cellspacing="2" cellpadding="0" border="0" class="medicine bottle">';
				alayout[4] = srow;
				alayout[5] = '</table><table cellspacing="2" cellpadding="0" border="0" class="medicine playbox"><tr><td></td><td></td></tr><tr><td></td><td></td></tr></table></div><div class="result next_stage"><p><strong>* Stage Clear *</strong><strong>Try Next</strong></p></div><div class="result game_over"><p><strong>GAME</strong><strong>OVER</strong></p></div></div></div>';
				alayout[6] = '<div class="column cell3"><div class="gamename">Dr.Mario</div><div class="mario"><table cellspacing="2" cellpadding="0" border="0" class="medicine nextbox"><tr><td></td><td></td></tr></table></div><ul class="msgbox"><li><strong>LEVEL</strong></li><li class="level">1</li><li><strong>SPEED</strong></li><li class="speed">LOW</li><li><strong>VIRUS</strong></li><li class="remain">0</li></ul></div></div>';
				dmodule.innerHTML = alayout.join('');
				dmodule.className = scls?scls+' drmario':'drmario';
				/*游戏对象*/
				var dgame_cover = easyUI.getElementsBy('class','game_cover','div',dmodule)[0];
				var dgame_start = easyUI.getElementsBy('class','game_start','a',dmodule)[0];
				var dgame_panel = easyUI.getElementsBy('class','game_panel','div',dmodule)[0];
				var dtopscore = easyUI.getElementsBy('class','top_score','li',dmodule)[0];
				var dscore = easyUI.getElementsBy('class','score','li',dmodule)[0];
				var dvirus_red = easyUI.getElementsBy('class','virus red','div',dmodule)[0];
				var dvirus_yellow = easyUI.getElementsBy('class','virus yellow','div',dmodule)[0];
				var dvirus_blue = easyUI.getElementsBy('class','virus blue','div',dmodule)[0];
				var dcontainer = easyUI.getElementsBy('class','medicine bottle','table',dmodule)[0];
				var dplaybox = easyUI.getElementsBy('class','medicine playbox','table',dmodule)[0];
				var dmario = easyUI.getElementsBy('class','mario','div',dmodule)[0];
				var dnextbox = easyUI.getElementsBy('class','medicine nextbox','table',dmodule)[0];
				var dlevel = easyUI.getElementsBy('class','level','li',dmodule)[0];
				var dspeed = easyUI.getElementsBy('class','speed','li',dmodule)[0];
				var dremain = easyUI.getElementsBy('class','remain','li',dmodule)[0];
				var dnextstage = easyUI.getElementsBy('class','result next_stage','div',dmodule)[0];
				var dgameover = easyUI.getElementsBy('class','result game_over','div',dmodule)[0];
				if(!(dgame_cover&&dgame_start&&dgame_panel&&dtopscore&&dscore&&dvirus_red&&dvirus_yellow&&dvirus_blue&&dcontainer&&dplaybox&&dmario&&dnextbox&&dlevel&&dspeed&&dremain&&dnextstage&&dgameover)){alert('部件不全，无法完成游戏！');return;}
				/*初始大病毒*/
				easyDrMario.util.o_virus_b.call(dvirus_red);dvirus_red.hide();
				easyDrMario.util.o_virus_b.call(dvirus_yellow);dvirus_yellow.hide();
				easyDrMario.util.o_virus_b.call(dvirus_blue);dvirus_blue.hide();
				/*初始容器*/
				easyDrMario.util.o_box_container.call(dcontainer);
				/*初始游戏盒子*/
				easyDrMario.util.o_box_play.call(dplaybox);
				/*初始下一个药丸盒子*/
				easyDrMario.util.o_next_medicine.call(dnextbox);
				dnextbox.next();
				/*补充设置*/
				dnextbox.ondropdown = function(){
					dmario.className = 'mario mario_drop1';
					window.setTimeout(function(){dmario.className = 'mario mario_drop2';},10);
				};
				dnextbox.onafterdropdown = function(){
					dnextbox.style.display = 'none';
					dplaybox.init(dnextbox.acolor);
					dmario.className = 'mario';
					dnextbox.next();
				};
				dcontainer.pause = true;
				dcontainer.next = function(){//下一个
					if(dcontainer.pause){return;}
					dcontainer.checkupgroup();
					//document.getElementById('debug').value = 'next:\n'+dcontainer.groups.join('\n');
					dnextbox.dropdown();
					//dplaybox.init(dnextbox.acolor);
					//dnextbox.next();
				};
				dcontainer.nextstage = function(){//下一关
					dcontainer.pause = true;
					var lr = dcontainer.data.length-1,lc = dcontainer.data[0].length-1;
					var level = dcontainer.level,lv = dcontainer.avirus[level];
					if(level>=dcontainer.avirus.length){alert('祝贺你通过全关！^_^');return;}
					dcontainer.groups = [];
					var acls = ['v_red','v_yellow','v_blue'];
					var avb = {v_red:0,v_yellow:0,v_blue:0},newmap = [],tmpn = 0,tmpd = [],color = null;
					for(var i=0;i<lv;i++){//初始化下一关病毒数据
						var r = lr-Math.round(Math.random()*(lr/2));
						var c = Math.round(Math.random()*lc);
						if(tmpd['t'+r+''+c]){i--;continue;}
						tmpd['t'+r+''+c] = 1;
						if(tmpn<3){color = acls[tmpn];}else{color = acls[Math.round(Math.random()*2)];}
						newmap.push([r,c,color]);
						avb[color]++;
						tmpn++;
					}
					tmpd = null;
					dnextstage.style.display = 'block';
					var f = 0;
					var innerfoo = function(){
						dcontainer.clearmap();
						dnextstage.style.display = 'none';
						dcontainer.setmap(newmap);
						dvirus_red.vlength = avb['v_red'];
						dvirus_red.show();
						dvirus_yellow.vlength = avb['v_yellow'];
						dvirus_yellow.show();
						dvirus_blue.vlength = avb['v_blue'];
						dvirus_blue.show();
						dcontainer.rvirus = lv;
						dremain.innerHTML = lv;
						dcontainer.pause = false;
						dcontainer.next();
					};
					window.setTimeout(innerfoo,1000);
				};
				dcontainer.onboom = function(scolor,iv){//爆
					switch(scolor){
						case 'red':for(var i=0;i<iv;i++){dvirus_red.die();}break;
						case 'yellow':for(var i=0;i<iv;i++){dvirus_yellow.die();}break;
						case 'blue':for(var i=0;i<iv;i++){dvirus_blue.die();}break;
						default:break;
					}
					dtopscore.innerHTML = dcontainer.topscore;
					dscore.innerHTML = dcontainer.score;
					dlevel.innerHTML = dcontainer.level;
					dspeed.innerHTML = dcontainer.tspeed[dcontainer.level];
					dremain.innerHTML = dcontainer.rvirus;
					dplaybox.speed = dcontainer.speed[dcontainer.level];
				};
				dplaybox.onbeforedown = function(x,y){//check down
					var shape = dplaybox.getshape();
					var bchk = dcontainer.check(x,y,shape);
					return bchk;
				};
				dplaybox.onafterdown = function(){
					if(dplaybox.y<0){
						gameover();
					}else{
						dcontainer.setgroup(dplaybox.grouplist());
						dplaybox.hide();
						dcontainer.actiondown();
					}
				};
				dplaybox.onbeforemovex = function(x,y){//check move left right
					var shape = dplaybox.getshape();
					var bchk = dcontainer.check(x,y,shape);
					return bchk;
				};
				dplaybox.onbeforeroll = function(x,y){//check roll
					var idx = dplaybox.sindex,l = dplaybox.shape.length-1;
					idx = (idx>=l)?0:idx+1;
					var shape = dplaybox.getshape(idx);
					var bchk = dcontainer.check(x,y,shape);
					return bchk;
				};
				gameover = function(){//game over
					if(!dplaybox.pause){dplaybox.setpause();}
					dplaybox.hide();
					dnextbox.style.display = 'none';
					dgameover.style.display = 'block';
					dmario.className = 'mario game_over';
					dvirus_red.win();
					dvirus_yellow.win();
					dvirus_blue.win();
				};
				var newgame = function(){//new game
					dgameover.style.display = 'none';
					dcontainer.score = 0;
					dcontainer.level = 1;
					dscore.innerHTML = 0;
					dlevel.innerHTML = 1;
					dspeed.innerHTML = dcontainer.tspeed[1];
					dplaybox.speed = dcontainer.speed[1];
					dcontainer.nextstage();
				};
				document.documentElement.onkeydown = function(e){
					var bc = dgame_panel.style.display=='block';
					e = e||window.event;
					var ec = e.which||e.keyCode;
					switch(ec){
					case 37:if(bc){dplaybox.movex(dplaybox.x-1);easyUI.stopEvent(e);}break;
					case 39:if(bc){dplaybox.movex(dplaybox.x+1);easyUI.stopEvent(e);}break;
					case 38:if(bc){dplaybox.roll();easyUI.stopEvent(e);}break;
					case 40:if(bc){dplaybox.movedown();easyUI.stopEvent(e);}break;
					case 80:if(bc){dplaybox.setpause();easyUI.stopEvent(e);}break;
					case 113:if(bc){if(confirm('要开始新的游戏吗？ ^_^')){newgame();}easyUI.stopEvent(e);}break;
					default:break;
					}
				};
				if(option){
					if(option.dLeft){option.dLeft.ontouchstart = function(){dplaybox.movex(dplaybox.x-1);};}
					if(option.dRight){option.dRight.ontouchstart = function(){dplaybox.movex(dplaybox.x+1);};}
					if(option.dPause){option.dPause.ontouchstart = function(){dplaybox.setpause();this.className = (dplaybox.pause)?'button toggle':'button';};}
					if(option.dDown){option.dDown.ontouchstart = function(){dplaybox.movedown();};}
					if(option.dTransform){option.dTransform.ontouchstart = function(){dplaybox.roll();};}
				}
				/*开始*/
				dgame_start.onclick = function(e){dgame_cover.style.display = 'none';dgame_panel.style.display = 'block';newgame();easyUI.stopEvent(e);};
				dgameover.onclick = function(e){newgame();easyUI.stopEvent(e);};
			};
		}()
	}
};
