-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathgame.min.js
1 lines (1 loc) · 23.2 KB
/
game.min.js
1
function Controls(){throw"Controls class is Static."}function Keyboard(){throw"KeyboardCode class is Static."}function ImageMapper(){throw"ImageMapper class is Static."}function ImageCreator(){throw"ImageCreator class is Static."}(function(){for(var t=0,i=["ms","moz","webkit","o"],e=0;i.length>e&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[i[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[i[e]+"CancelAnimationFrame"]||window[i[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(i){var e=(new Date).getTime(),s=Math.max(0,17-(e-t)),n=window.setTimeout(function(){i(e+s)},s);return t=e+s,n}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){window.clearTimeout(t)})})(),window.gameTime={lastTime:Date.now(),frameTime:0,typicalFrameTime:20,minFrameTime:12,time:0},window.gameTime.tick=function(){var t=Date.now(),i=t-this.lastTime;return this.minFrameTime>i?!1:(this.frameTime=i>2*this.typicalFrameTime?this.typicalFrameTime:i,this.time+=this.frameTime,this.lastTime=t,!0)},window.camera=function(){function t(t,i){return Math.floor(Math.random()*i+t)}function i(){return Math.round(Math.random())?1:-1}var e=.1,s=0,n=[0,0];return{pos:function(){return[n[0],n[1]]},shake:function(i){i=i||3,s=e,n=[t(-i,i),t(-i,i)]},update:function(t){t/=1e3,s-=t,0>s?n=[0,0]:(n[0]*=i(),n[1]*=i())}}}(),window.particles=function(){function t(t,i){return Math.floor(Math.random()*i+t)}function i(){return Math.round(Math.random())?1:-1}function e(t){function i(t){return"#"==t.charAt(0)?t.substring(1,7):t}function e(t){return parseInt(i(t).substring(0,2),16)}function s(t){return parseInt(i(t).substring(2,4),16)}function n(t){return parseInt(i(t).substring(4,6),16)}return-1===t.indexOf("#")?t:[e(t),s(t),n(t),1]}var s,n,o=[],h=[2,10];return{init:function(t,i){s=t,n=i,o=[]},create:function(s,n,h){for(var r=e(h),a=0;n>a;a++){var l=[t(10,30)*i(),-1*t(10,30)];o.push({pos:[s[0]+t(1,3)*i(),s[1]+t(1,3)*i()],vel:l,c:r,t:2})}},update:function(t){t/=500;for(var i=0;o.length>i;i++){var e=o[i];e.t-=t,e.vel[0]+=h[0]*t,e.vel[1]+=h[1]*t,e.pos[0]+=e.vel[0]*t,e.pos[1]+=e.vel[1]*t,e.pos[1]>n.h||0>e.t?o.splice(i,1):e.c[3]=e.t.toFixed(2)}},draw:function(){for(var t=0;o.length>t;t++){var i=o[t];s.save(),s.fillStyle="rgba("+i.c[0]+","+i.c[1]+","+i.c[2]+","+i.c[3]+")",s.fillRect(i.pos[0],i.pos[1],3,3),s.restore()}}}}(),function(){var t=!1,i=/xyz/.test(function(){})?/\b_super\b/:/.*/;this.Class=function(){},Class.extend=function(e){function s(){!t&&this.init&&this.init.apply(this,arguments)}var n=this.prototype;t=!0;var o=new this;t=!1;for(var h in e)o[h]="function"==typeof e[h]&&"function"==typeof n[h]&&i.test(e[h])?function(t,i){return function(){var e=this._super;this._super=n[t];var s=i.apply(this,arguments);return this._super=e,s}}(h,e[h]):e[h];return s.prototype=o,s.prototype.constructor=s,s.extend=arguments.callee,s}}(),Controls.Left="Left",Controls.Right="Right",Controls.Shoot="Shoot",Keyboard.Left=37,Keyboard.Right=39,Keyboard.Up=38,Keyboard.Down=40,Keyboard.Space=32,ImageMapper.Ship=function(){return[[0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0],[0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0],[0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0],[0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0],[0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0],[0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0],[0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0],[0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0]]},ImageMapper.ShipShoot=function(){return[[1],[1],[1],[1],[1],[1],[1]]},ImageMapper.Invasion=function(){return[[2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,1,2,1,1,1,2,2,2,1,2],[2,2,1,1,2,1,2,1,2,2,1,1,2],[2,1,2,1,2,1,2,1,2,1,2,1,2],[2,1,1,1,2,1,2,1,2,1,1,1,2],[2,2,2,1,2,1,1,1,2,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2]]},ImageMapper.AlienCrab=function(){return[[0,0,1,0,0,0,0,0,1,0,0],[3,0,0,1,0,0,0,1,0,0,3],[3,0,0,1,0,0,0,1,0,0,3],[3,0,1,1,1,1,1,1,1,0,3],[3,0,1,0,1,1,1,0,1,0,3],[3,1,1,1,1,1,1,1,1,1,3],[2,1,1,1,1,1,1,1,1,1,2],[2,0,1,1,1,1,1,1,1,0,2],[2,0,1,1,1,1,1,1,1,0,2],[2,0,1,0,0,0,0,0,1,0,2],[2,0,1,0,0,0,0,0,1,0,2],[0,3,0,2,2,0,2,2,0,3,0]]},ImageMapper.AlienSquid=function(){return[[0,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,1,1,1,0,0,0,0],[0,0,0,1,1,1,1,1,0,0,0],[0,0,1,1,1,1,1,1,1,0,0],[0,1,1,0,1,1,1,0,1,1,0],[1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1],[0,0,1,0,0,0,0,0,1,0,0],[0,0,1,0,0,0,0,0,1,0,0],[0,1,0,3,0,0,0,3,0,1,0],[3,0,1,0,3,0,3,0,1,0,3]]},ImageMapper.DeadAlien=function(){return[[1,0,0,0,0,0,0,0,0,0,1],[0,1,0,0,0,1,0,0,0,1,0],[0,0,1,0,0,1,0,0,1,0,0],[0,0,0,1,0,1,0,1,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],[1,1,1,1,0,0,0,1,1,1,1],[0,0,0,0,0,0,0,0,0,0,0],[0,0,0,1,0,1,0,1,0,0,0],[0,0,1,0,0,1,0,0,1,0,0],[0,1,0,0,0,1,0,0,0,1,0],[1,0,0,0,0,1,0,0,0,0,1]]},ImageMapper.AlienShoot=function(){return[[0,1,0],[1,0,0],[0,1,0],[0,0,1],[0,1,0],[1,0,0],[0,1,0]]},ImageMapper.Shield=function(){return[[1,0,0,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,1,0,1,0,1,0,1,0,0,1,0,1,1,0],[1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1],[1,1,1,1,0,1,0,1,0,0,1,0,0,0,0,0,1,1,0,0,1,0,1,0,1,0,1,0,1,1,1,1,0,1,0,1],[1,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1],[1,0,0,1,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,1,0,1,1,1,0,1,0,0,1,0,1,1,0]]},ImageMapper.ShieldBrick=function(){return[[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]],[[0,1,1,1,0,1],[1,1,1,0,0,0],[1,1,0,1,1,0],[0,0,1,0,1,1],[1,0,0,1,0,1],[1,1,0,0,1,1]],[[0,0,0,1,0,1],[0,0,0,0,0,0],[1,0,0,1,0,0],[0,0,1,0,1,1],[1,0,0,1,0,1],[1,1,0,0,0,0]]]},ImageCreator.getImages=function(t){function i(){for(var t=o.length,i=0;t>i;i++)for(var e=o[i].length,s=0;e>s;s++){var h=o[i][s];if(h){var r=new Brick({ctx:d,x:s*l,y:i*l,width:l,height:l,color:u,value:h});n.push(r)}}}function e(t){d.clearRect(0,0,h,r);for(var i=n.length,e=0;i>e;e++)(1===n[e].value||n[e].value===t)&&n[e].draw();var o=c.toDataURL("image/png"),a=new Image;a.src=o,s.push(a)}var s=[],n=[],o=t.mapper||[],h=t.width||100,r=t.height||100,a=t.states||[],l=t.brickSize||5,u=t.color||"#000",c=document.createElement("canvas");c.width=h,c.height=r;var d=c.getContext("2d");i();for(var f=0;a.length>f;f++)e(a[f]);var f=n.length-1;do n[f]=null;while(f--);return s};var DrawableElement=Class.extend({init:function(t){this.ctx=t.ctx?t.ctx:null,this.size={width:t.width||0,height:t.height||0},this.position={x:t.x||0,y:t.y||0},this.brickSize=t.brickSize||1,this.color=t.color||"#000",this.bricks=[],this.onDestroy=t.onDestroy||function(){}},build:function(){},update:function(){},draw:function(t){null!=this.ctx&&this.ctx.drawImage(t,this.position.x+window.camera.pos()[0],this.position.y+window.camera.pos()[1])},destroy:function(){this.ctx=null,null!=this.size&&(this.size.width=null,this.size.height=null,this.size=null),null!=this.position&&(this.position.x=null,this.position.y=null,this.position=null),this.brickSize=null,this.color=null;var t=this.bricks;if(null!=t){for(var i=t.length,e=0;i>e;e++)t[e]=null;this.bricks=null}}}),Shoot=DrawableElement.extend({init:function(t){this._super(t),this.MOVE_FACTOR=5,this.dir=t.dir,this.shootImage=t.shootImage,this.collateBricks=t.collateBricks,this.collateAliens=t.collateAliens,this.timer=null},build:function(){},update:function(){var t=this.dir,i=this.MOVE_FACTOR;return this.position.y+=i*t,this.hasCollision()?(this.collided(),void 0):void 0},draw:function(){this._super(this.shootImage)},collided:function(){this.destroy()},destroy:function(){clearInterval(this.timer),this.collateBricks=null,this.collateAliens=null,this.onDestroy(this),this._super()},hasCollision:function(){function t(t){if(!t)return!1;for(var s=t,n=s.length,o=0;n>o;o++){var h=s[o],r=h.position.x,a=h.position.y,l=r+h.size.width,u=a+h.size.height;if(i>=r&&l>=i&&e>=a&&u>=e&&!h.destroyed)return t[o].collided(),!0}return!1}var i=this.position.x,e=this.position.y;return 0>e||e>400?!0:t(this.collateBricks)?!0:this.collateAliens&&t(this.collateAliens)?!0:void 0}}),Ship=DrawableElement.extend({init:function(t){this._super(t),this.maxMove={left:t.maxMoveLeft,right:t.maxMoveRight},this.onShipHit=t.onShipHit||function(){},this.MOVE_FACTOR=.2,this.SHOOT_TIME=200,this.brickSize=2,this.shootImage=null,this.shoots=[],this.lastShoot=0,this.imgs=[];var i=ImageMapper.Ship();this.size={width:this.brickSize*i[0].length,height:this.brickSize*i.length},this.build(),this.shield=t.shield,this.invasion={}},build:function(){this.buildShootImage();var t={width:this.size.width,height:this.size.height,states:[1],brickSize:this.brickSize,mapper:ImageMapper.Ship(),color:this.color};this.imgs=ImageCreator.getImages(t)},update:function(t,i){var e=this.MOVE_FACTOR;t.indexOf(Controls.Left)>-1?this.position.x>this.maxMove.left&&(this.position.x-=e*i):t.indexOf(Controls.Right)>-1&&this.position.x<this.maxMove.right-this.size.width&&(this.position.x+=e*i),this.lastShoot-=i;var s=t.indexOf(Controls.Shoot);s>-1&&0>=this.lastShoot&&(this.lastShoot=this.SHOOT_TIME,t.splice(s,1),this.makeShoot());for(var n=this.shoots,o=n.length,h=0;o>h;h++)n[h]&&n[h].update(i)},draw:function(){this._super(this.imgs[0]);for(var t=this.shoots,i=t.length,e=0;i>e;e++)t[e]&&t[e].draw()},collided:function(){this.onShipHit()},destroy:function(){this.onShipHit=null,this.shootImage=null;for(var t=0;this.shoots.length>t;t++)this.shoots[t].destroy();this.shoots=[],this.imgs=[],this.shield=null,this.invasion=null,this._super()},makeShoot:function(){var t=this,i=new Shoot({ctx:this.ctx,x:this.position.x+this.size.width/2,y:this.position.y,dir:-1,shootImage:this.shootImage,onDestroy:function(i){for(var e=0;t.shoots.length>e;e++)if(t.shoots[e]===i){t.shoots.splice(e,1);break}},collateBricks:this.shield.bricks,collateAliens:this.invasion.aliens});this.shoots.push(i)},buildShootImage:function(){var t=ImageMapper.ShipShoot(),i=2,e=i*t[0].length,s=i*t.length,n={width:e,height:s,states:[1],brickSize:i,mapper:t,color:this.color};this.shootImage=ImageCreator.getImages(n)[0]}}),Invasion=DrawableElement.extend({init:function(t){this._super(t),this.colors={crab:"#FF2727",squid:"#F8FF41"},this.size={width:390,height:210},this.shield=t.shield,this.ship=t.ship,this.MOVE_FACTOR=10,this.DOWN_FACTOR=12,this.CURR_VEL=600,this.VEL_FACTOR=50,this.MOVE_TIME=500,this.lastMove=0,this.dir=1,this.lastDir=1,this.lastPer=100,this.state=0,this.alienSize=30,this.aliens=[],this.crabImages=[],this.squidImages=[],this.deadAlienImgs=[],this.shootImage=null,this.shoots=[],this.build(),this.aliensAmm=this.aliens.length,this.hadAlienCollision=!1,this.onAliensClean=t.onAliensClean||function(){},this.timer=null},build:function(){var t=this;this.buildShootImage(),this.buildAliensImages();for(var i=this.alienSize,e=this.position.x,s=this.position.y,n=this.ctx,o=ImageMapper.Invasion(),h=o.length,r=0;h>r;r++)for(var a=o[r].length,l=0;a>l;l++)if(o[r][l]){var u,c={ctx:n,x:l*i+e,y:r*i+s,width:i,height:i,destroyedImg:this.deadAlienImgs,shield:this.shield,ship:this.ship,onDestroy:function(i){for(var e=0;t.aliens.length>e;e++)if(t.aliens[e]===i){t.aliens.splice(e,1);break}},onWallCollision:function(){t.hadAlienCollision=!0}};switch(o[r][l]){case 1:c.stateImgs=this.crabImages,c.color=this.colors.crab;break;case 2:c.stateImgs=this.squidImages,c.color=this.colors.squid}u=new Alien(c),this.aliens.push(u)}},loop:function(){this.state=!this.state;var t=this.MOVE_FACTOR,i=0,e=0,s=this.aliens,n=s.length;0===n&&this.onAliensClean(),this.hadAlienCollision&&(this.dir*=-1,this.hadAlienCollision=!1,e=this.DOWN_FACTOR,this.lastDir=this.dir),i=t*this.dir,this.position.x+=i,this.position.y+=e;var o=!1;if(this.state&&Math.floor(2*Math.random())){o=!0,shooterIdx=[];for(var h=0;2>h;h++)shooterIdx.push(Math.floor(Math.random()*n))}for(var h=0;n>h;h++)s[h].position.x+=i,s[h].position.y+=e,o&&shooterIdx.indexOf(h)>-1&&this.makeShoot(s[h]);this.vMove>0&&(this.vMove=0);var r=100*n/this.aliensAmm;return this.lastPer-r>9?(this.CURR_VEL-=this.VEL_FACTOR,this.MOVE_TIME-=this.VEL_FACTOR,200>this.MOVE_TIME&&(this.MOVE_TIME=200),this.lastPer=r,void 0):void 0},update:function(t){if(this.lastMove-=t,0>=this.lastMove){this.loop(),this.lastMove=this.MOVE_TIME,this.state;for(var i=this.aliens,e=i.length,s=0;e>s;s++)void 0!==i[s]&&i[s].update(t)}for(var n=this.shoots,o=n.length,s=0;o>s;s++)n[s]&&n[s].update(t)},draw:function(){for(var t=this.state,i=this.aliens,e=i.length,s=0;e>s;s++)void 0!==i[s]&&i[s].draw(t);for(var n=this.shoots,o=n.length,s=0;o>s;s++)n[s].draw()},destroy:function(){clearInterval(this.timer),this.shield=null,this.ship=null;for(var t=0;this.shoots.length>t;t++)this.shoots[t].destroy();this.shoots=[],this._super()},makeShoot:function(t){var i=this.shield,e=this.ship,s=this,n=new Shoot({ctx:this.ctx,x:t.position.x+t.size.width/2,y:t.position.y,dir:1,shootImage:this.shootImage,onDestroy:function(t){for(var i=0;s.shoots.length>i;i++)if(s.shoots[i]===t){s.shoots.splice(i,1);break}},collateBricks:i.bricks,collateAliens:[e]});this.shoots.push(n)},buildShootImage:function(){var t=ImageMapper.AlienShoot(),i=2,e=i*t[0].length,s=i*t.length,n={width:e,height:s,states:[1],brickSize:i,mapper:t,color:"yellow"};this.shootImage=ImageCreator.getImages(n)[0]},buildAliensImages:function(){var t={width:30,height:30,states:[1],brickSize:2};t.mapper=ImageMapper.DeadAlien(),t.color="white",this.deadAlienImgs=ImageCreator.getImages(t),t.states=[2,3],t.mapper=ImageMapper.AlienCrab(),t.color=this.colors.crab,this.crabImages=ImageCreator.getImages(t),t.mapper=ImageMapper.AlienSquid(),t.color=this.colors.squid,this.squidImages=ImageCreator.getImages(t)}}),Alien=DrawableElement.extend({init:function(t){this._super(t),this.images=t.stateImgs||[],this.destroyedImg=t.destroyedImg||[],this.onWallCollision=t.onWallCollision||[],this.shield=t.shield||null,this.ship=t.ship||null,this.destroyed=!1,this.shoots=[]},build:function(){},update:function(){this.hasCollision();var t=this.position.x;(20>t||t>590-this.size.width)&&this.onWallCollision();var i=this.position.y+this.size.height;0>i&&this.ship.collided()},draw:function(t){if(this.destroyed)this._super(this.destroyedImg[0]),this.destroy(),this.onDestroy(this);else{var i=t?0:1;this._super(this.images[i])}},hasCollision:function(){function t(t){if(!t)return!1;for(var s=t,n=s.length,o=0;n>o;o++){var h=s[o],r=h.position.x,a=h.position.y,l=r+h.size.width,u=a+h.size.height;if(i>=r&&l>=i&&e>=a&&u>=e&&!h.destroyed)return t[o].collided(!0),!0}return!1}var i=this.position.x+this.size.width/2,e=this.position.y+.8*this.size.height;return t(this.shield.bricks)?!0:t([this.ship])?!0:void 0},collided:function(){this.destroyed=!0,window.camera.shake(3),window.particles.create([this.position.x+this.size.width/2,this.position.y+this.size.height/2],10,this.color)},destroy:function(){this._super()}}),Brick=DrawableElement.extend({init:function(t){this._super(t),this.destroyed=!1,this.value=t.value||1},build:function(){},update:function(){},draw:function(){this.destroyed||(this.ctx.beginPath(),this.ctx.rect(this.position.x,this.position.y,this.size.width,this.size.height),this.ctx.fillStyle=this.color,this.ctx.fill())},destroy:function(){this.destroyed=!0}}),ShieldBrick=DrawableElement.extend({init:function(t){this._super(t),this.state=0,this.imgsState=t.imgsState,this.destroyed=!1},build:function(){},update:function(){},draw:function(){this.destroyed||this._super(this.imgsState[this.state])},collided:function(t){window.camera.shake(1),window.particles.create([this.position.x+this.size.width/2,this.position.y+this.size.height/2],4,this.color),t?this.state=Math.floor(3*Math.random()+2):this.state++,this.state>1&&(this.destroyed=!0)},destroy:function(){this._super()}}),Shield=DrawableElement.extend({init:function(t){this._super(t),this.imgs=[],this.build()},build:function(){this.createImagesStateBricks();for(var t=this.brickSize,i=this.position.x,e=this.position.y,s=this.ctx,n=this.color,o=ImageMapper.Shield(),h=o.length,r=0;h>r;r++)for(var a=o[r].length,l=0;a>l;l++)if(o[r][l]){var u=new ShieldBrick({ctx:s,x:l*t+i,y:r*t+e,width:t,height:t,color:n,imgsState:this.imgs});this.bricks.push(u)}},update:function(t){for(var i=this.bricks,e=i.length,s=0;e>s;s++)i[s]&&i[s].update(t)},draw:function(){var t=this.bricks;if(t)for(var i=t.length,e=0;i>e;e++)t[e]&&t[e].draw()},destroy:function(){for(var t=this.bricks,i=t.length,e=0;i>e;e++)t[e].destroy();this.bricks=[],this._super()},createImagesStateBricks:function(){for(var t={width:this.brickSize,height:this.brickSize,states:[1],brickSize:2,color:this.color},i=ImageMapper.ShieldBrick(),e=0;i.length>e;e++)t.mapper=i[e],this.imgs.push(ImageCreator.getImages(t)[0])}}),Invaders404=Class.extend({init:function(t){this.canvas=null,this.ctx=null,this.loopInterval=10,this.currentDir=[],this.shield={},this.ship={},this.invasion={},this.initCanvas(t.canvasId),this.onLoose=t.onLoose||function(){},this.onWin=t.onWin||function(){},this.isOnGame=!1,this.boundGameRun=this.gameRun.bind(this),this.fps=0,this.now=null,this.lastUpdate=1*new Date-1,this.fpsFilter=this.loopInterval;var i=this,e=document.getElementById("fps");setInterval(function(){e.innerHTML=i.fps.toFixed(1)+"fps"},1e3)},initCanvas:function(t){this.canvas=document.getElementById(t||"canvas"),this.ctx=this.canvas.getContext("2d"),window.particles.init(this.ctx,{w:this.canvas.width,h:this.canvas.height})},start:function(){this.build(),this.gameRun()},gameRun:function(){window.gameTime.tick()&&this.loop(),this.tLoop=window.requestAnimationFrame(this.boundGameRun)},build:function(){var t=this;this.shield=new Shield({ctx:this.ctx,x:70,y:290,brickSize:12,color:"#ffffff"});var i=this.canvas.width;this.ship=new Ship({ctx:this.ctx,shield:this.shield,maxMoveLeft:5,maxMoveRight:i-10,x:(i-10)/2,y:370,color:"#1be400",onShipHit:function(){t.stop(),t.onLoose()}}),this.invasion=new Invasion({ctx:this.ctx,x:60,y:10,shield:this.shield,ship:this.ship,onAliensClean:function(){t.stop(),t.onWin()}}),this.ship.invasion=this.invasion,this.currentDir=[],this.isOnGame=!0,this.bindControls()},loop:function(){this.isOnGame&&(this.update(window.gameTime.frameTime),this.draw())},update:function(t){window.camera.update(t),this.shield.update(t),this.ship.update(this.currentDir,t),this.invasion.update(t),window.particles.update(t)},draw:function(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.shield.draw(),this.ship.draw(),this.invasion.draw(),window.particles.draw();var t=1e3/((this.now=new Date)-this.lastUpdate);this.fps+=(t-this.fps)/this.fpsFilter,this.lastUpdate=this.now},bindControls:function(){function t(t){switch(t){case Keyboard.Space:return Controls.Shoot;case Keyboard.Left:return Controls.Left;case Keyboard.Right:return Controls.Right}return null}var i=this,e=[Keyboard.Space,Keyboard.Left,Keyboard.Right];document.addEventListener("keydown",function(s){if(i.isOnGame){var n=s.keyCode;if(e.indexOf(n)>-1){var o=t(n);return-1===i.currentDir.indexOf(o)&&i.currentDir.push(o),s.stopPropagation(),s.preventDefault(),!1}}}),document.addEventListener("keyup",function(e){if(i.isOnGame){var s=e.keyCode,n=t(s),o=i.currentDir.indexOf(n);o>-1&&i.currentDir.splice(o,1)}})},unbindControls:function(){document.removeEventListener("keydown",function(){}),document.removeEventListener("keyup",function(){})},destroy:function(){this.shield.destroy(),this.invasion.destroy(),this.ship.destroy()},stop:function(){this.isOnGame=!1;for(var t=0;this.currentDir.length>t;t++)this.currentDir[t]=null;this.currentDir=[],this.destroy()},drawSplash:function(t){function i(t,i){var e=20,o=t*e-e;s.save(),s.fillStyle=i,s.fillRect(o,0,e,n),s.restore()}function e(){for(var s=0;5>s;s++)i(h+s,"rgba(240,219,79,"+(s?s/10:1)+")");h++,o/10>h?setTimeout(e,r):t()}var s=this.ctx,n=this.canvas.height,o=this.canvas.width,h=0,r=2*this.loopInterval;e()}});(function(){function t(){for(var t in l)if(-1!==navigator.platform.indexOf(l[t]))return l[t];return"Unknown"}function i(t,i,e,s,n){return s+(n-s)*((t-i)/(e-i))}function e(t,i,e,s){Object.defineProperty(e,s,{enumerable:!0,get:function(){return t.axes[i.axes[s]]}})}function s(t,i,e,s){Object.defineProperty(e,s,{enumerable:!0,get:function(){return 0}})}function n(t,i,e,s){Object.defineProperty(e,s,{enumerable:!0,get:function(){return t.buttons[i.buttons[s]]}})}function o(t,e,s,n){var o=e.axes[n]instanceof Array;Object.defineProperty(s,n,{enumerable:!0,get:function(){return o?i(t.axes[e.axes[n][0]],e.axes[n][1],e.axes[n][2],0,1):t.axes[e.axes[n]]}})}function h(t,i){Object.defineProperty(t,i,{enumerable:!0,get:function(){return 0}})}var r={"45e":{"28e":{Mac:{axes:{Left_Stick_X:0,Left_Stick_Y:1,Right_Stick_X:2,Right_Stick_Y:3,Left_Trigger_2:[4,-1,1],Right_Trigger_2:[5,-1,1]},buttons:{A_Button:0,B_Button:1,X_Button:2,Y_Button:3,Left_Trigger_1:4,Right_Trigger_1:5,Left_Stick_Button:6,Right_Stick_Button:7,Start_Button:8,Back_Button:9,Home_Button:10,Pad_Up:11,Pad_Down:12,Pad_Left:13,Pad_Right:14}},Win:{axes:{Left_Stick_X:0,Left_Stick_Y:1,Right_Stick_X:3,Right_Stick_Y:4,Pad_Left:[5,0,-1],Pad_Right:[5,0,1],Pad_Up:[6,0,-1],Pad_Down:[6,0,1],Left_Trigger_2:[2,0,1],Right_Trigger_2:[2,0,-1]},buttons:{A_Button:0,B_Button:1,X_Button:2,Y_Button:3,Left_Trigger_1:4,Right_Trigger_1:5,Back_Button:6,Start_Button:7,Left_Stick_Button:8,Right_Stick_Button:9}}}},"54c":{268:{Mac:{axes:{Left_Stick_X:0,Left_Stick_Y:1,Right_Stick_X:2,Right_Stick_Y:3},buttons:{Back_Button:0,Left_Stick_Button:1,Right_Stick_Button:2,Start_Button:3,Pad_Up:4,Pad_Down:6,Pad_Right:5,Pad_Left:7,Left_Trigger_2:8,Right_Trigger_2:9,Left_Trigger_1:10,Right_Trigger_1:11,Y_Button:12,B_Button:13,A_Button:14,X_Button:15,Home_Button:16}}}},"46d":{c242:{Win:{axes:{Left_Stick_X:0,Left_Stick_Y:1,Right_Stick_Y:4,Right_Stick_X:3,Left_Trigger_2:[2,0,1],Right_Trigger_2:[2,-1,0],Pad_Left:[5,-1,0],Pad_Right:[5,0,1],Pad_Up:[6,-1,0],Pad_Down:[6,0,1]},buttons:{A_Button:0,X_Button:2,B_Button:1,Y_Button:3,Left_Trigger_1:4,Right_Trigger_1:5,Back_Button:6,Start_Button:7,Left_Stick_Button:8,Right_Stick_Button:9}}},c216:{Mac:{axes:{Left_Stick_X:1,Left_Stick_Y:2,Right_Stick_X:3,Right_Stick_Y:4,Pad_Left:[1,0,-1],Pad_Right:[1,0,1],Pad_Up:[2,0,-1],Pad_Down:[2,0,1]},buttons:{X_Button:0,A_Button:1,B_Button:2,Y_Button:3,Left_Trigger_1:4,Right_Trigger_1:5,Left_Trigger_2:6,Right_Trigger_2:7,Back_Button:8,Start_Button:9,Left_Stick_Button:10,Right_Stick_Button:11}}}},"40b":{6533:{Mac:{axes:{Pad_Left:[0,0,-1],Pad_Right:[0,0,1],Pad_Up:[1,0,-1],Pad_Down:[1,0,1]},buttons:{A_Button:0,B_Button:1,X_Button:2,Y_Button:3}}}},Firefox:{"Fake Gamepad":{Mac:{axes:{},buttons:{A_Button:0,B_Button:1,X_Button:2,Y_Button:3,Pad_Up:4,Pad_Down:5,Pad_Left:6,Pad_Right:7}}}}},a={axes:["Left_Stick_X","Left_Stick_Y","Right_Stick_X","Right_Stick_Y"],buttons:["A_Button","B_Button","X_Button","Y_Button","Left_Stick_Button","Right_Stick_Button","Start_Button","Back_Button","Home_Button","Pad_Up","Pad_Down","Pad_Left","Pad_Right","Left_Trigger_1","Right_Trigger_1","Left_Trigger_2","Right_Trigger_2"]},l=["Win","Mac","Linux"],u=window.Input={};u.Device=function(i){if(!i)throw"You didn't pass a valid gamepad to the constructor";var l=i,u=i.id.split("-")[0],c=i.id.split("-")[1],d=t(),f=r,g=this.axes={},p=this.buttons={};if(!(f&&f[u]&&f[u][c]&&f[u][c][d]))throw"A physical device layout for "+u+"-"+c+"-"+d+" isn't available";f=f[u][c][d];for(var m in a.axes)void 0!==f.axes[a.axes[m]]?e(l,f,g,a.axes[m]):void 0!==f.buttons[a.axes[m]]?s(l,f,g,a.axes[m]):h(g,a.axes[m]);for(var _ in a.buttons)void 0!==f.buttons[a.buttons[_]]?n(l,f,p,a.buttons[_]):void 0!==f.axes[a.buttons[_]]?o(l,f,p,a.buttons[_]):h(p,a.buttons[_]);Object.defineProperty(this,"connected",{enumerable:!0,get:function(){return l.connected}}),Object.defineProperty(this,"id",{enumerable:!0,get:function(){return l.id}}),Object.defineProperty(this,"index",{enumerable:!0,get:function(){return l.index}})}})();