var driverInterval=50;var turnRate=360/4000;var acceleRate=0.00005;var torpDV=0.15;var torpLifetime=5000;var maxTorps=5;var eSpeedLimit=0.08;var eFireDistance=200;var explosionTime=200;var endGameTime=7000;var nExplosions=6;var explosionDV=0.05;var yshipSize=eshipSize=32;var ytorpSize=etorpSize=2;var yexplosionSize=eexplosionSize=64;var nExplosionImages=5;var spaceElement=document.getElementById('space');var spaceWidth,spaceHeight;var yscoreElement=document.getElementById('yscore');var escoreElement=document.getElementById('escore');var yscore,escore;var objects;var yship,eship;var restartTime;var paused;var infoClosedElement=document.getElementById('infoClosed');var infoOpenElement=document.getElementById('infoOpen');var startElement=document.getElementById('start');var logElement=document.getElementById('log');function Setup() {InfoOpen();document.onkeydown=KeyHandler;document.onkeyup=KeyHandler;window.onresize=ResizeHandler;ResizeHandler();yscore=0;escore=0;DisplayScores();InitGame();} function InfoOpen() {paused=true;infoClosedElement.style.display='none';infoOpenElement.style.display='';} function InfoClose() {paused=false;infoOpenElement.style.display='none';startElement.innerHTML=' Resume ';infoClosedElement.style.display='';} function InitGame() {objects=[];yship=MakeObject({type:'ship',image:'yship_%.gif',aimage:'yshipa_%.gif',size:yshipSize,x:spaceWidth/4,y:spaceHeight-spaceHeight/4,angle:0,dx:0,dy:0,expires:0,torpImage:'ytorp2.gif',torpSize:ytorpSize,explosionImage:'yexplosion1.gif',explosionSize:yexplosionSize,nTorps:0,left:false,right:false,thrust:false});eship=MakeObject({type:'ship',image:'eship_%.gif',aimage:'eshipa_%.gif',size:eshipSize,x:spaceWidth-spaceWidth/4,y:spaceHeight/4,angle:180,dx:0,dy:0,expires:0,torpImage:'etorp2.gif',torpSize:etorpSize,explosionImage:'eexplosion1.gif',explosionSize:eexplosionSize,nTorps:0,left:false,right:false,thrust:false});restartTime=0;Driver();} var prevTime=null;function Driver() {var time=ClockMsecs();if(!paused) {if(restartTime!=0&&time>=restartTime) {while(objects.length>0) RemoveObject(objects[0]);InitGame();return;} if(prevTime) {var interval=time-prevTime;CheckCollisions(time);CheckExpirations(time);if(eship) EnemyStrategy();if(yship) Action(yship,interval);if(eship) Action(eship,interval);for(var i=0;io2.x+o2.size/2.5) return false;if(o1.y+o1.size/2.5o2.y+o2.size/2.5) return false;return true;} function Explode(time,ship) {for(i=0;i=0;--i) {var o=objects[i];if(o.expires!=0&&time>=o.expires) {RemoveObject(o);if(o.expireProc) o.expireProc(time,o);}}} function EnemyStrategy() {if(!yship) {eship.left=eship.right=eship.thrust=false;return;} var dx=eship.x-yship.x;var dy=eship.y-yship.y;var desiredAngle=Mod(RadToDeg(Math.atan2(-dx,dy)),360);var deltaAngle=desiredAngle-eship.angle;if(deltaAngle>180)deltaAngle-=360;else if(deltaAngle<-180)deltaAngle+=360;if(deltaAngle<-10||(eship.left&&deltaAngle<5)) {eship.left=true;eship.right=false;eship.thrust=false;} else if(deltaAngle>10||(eship.right&&deltaAngle>-5)) {eship.right=true;eship.left=false;eship.thrust=false;} else {eship.left=eship.right=false;var v=Math.sqrt(eship.dx*eship.dx+eship.dy*eship.dy);var r=DegToRad(eship.angle);var newDX=eship.dx+acceleRate*driverInterval*Math.sin(r);var newDY=eship.dy-acceleRate*driverInterval*Math.cos(r);var newV=Math.sqrt(newDX*newDX+newDY*newDY);if(eship.thrust) {if(newV>=eSpeedLimit||Math.random()<0.15) eship.thrust=false;} else {if((newV';element.innerHTML=html;} var kcSpace=32;var kcLeft=37;var kcRight=39;var kcUp=38;var kcDown=40;var kcEscape=27;function KeyHandler(e) {if(paused||!yship) return;if(!e) e=window.event;var t=e.type;var kc=e.keyCode||e.which;if(t=='keydown') {switch(kc) {case kcSpace:Fire(yship);break;case kcLeft:yship.left=true;break;case kcRight:yship.right=true;break;case kcUp:yship.thrust=true;break;}} else if(t=='keyup') {switch(kc) {case kcLeft:yship.left=false;break;case kcRight:yship.right=false;break;case kcUp:yship.thrust=false;break;}}} function Fire(ship) {if(ship.nTorps';logElement.scrollTop=logElement.scrollHeight;}