frontend/js/kickass.js
2023-05-23 15:12:38 -04:00

263 lines
61 KiB
JavaScript

/*
Copyright (c) <2011, 2012> Rootof Creations HB, rootof.com, kickassapp.com
*/(function(window) {
var JSONP=(function(){var counter=0,head,query,key,window=this;function load(url){var script=document.createElement('script'),done=false;script.src=url;script.async=true;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){done=true;script.onload=script.onreadystatechange=null;if(script&&script.parentNode){script.parentNode.removeChild(script);}}};if(!head){head=document.getElementsByTagName('head')[0];if(!head)
head=document.body;}
head.appendChild(script);}
function jsonp(url,params,callback){query="?";params=params||{};for(key in params){if(params.hasOwnProperty(key)){query+=encodeURIComponent(key)+"="+encodeURIComponent(params[key])+"&";}}
var jsonp="json"+(++counter);window[jsonp]=function(data){callback(data);try{delete window[jsonp];}catch(e){}
window[jsonp]=null;};load(url+query+"callback="+jsonp);return jsonp;}
return{get:jsonp};}());var CORS={request:function(url,params,callback){if(this.calledByExtension()){this._callbacks[this._callbackId++]=callback;window.postMessage(JSON.stringify({from:"kickassapp-page",url:url,type:"callApi",params:params}),"*");return;}
params=params||{};var query="?";for(key in params){if(params.hasOwnProperty(key)){query+=encodeURIComponent(key)+"="+encodeURIComponent(params[key])+"&";}}
var xhr=new XMLHttpRequest();xhr.onreadystatechange=function(){if(xhr.readyState==4){callback(JSON.parse(xhr.responseText));}}
xhr.open("GET",url+query);xhr.withCredentials=true;xhr.setRequestHeader("Content-Type","application/json");xhr.send();},calledByExtension:function(){return!!document.getElementById("kickass-has-been-initialized-yes-yes-yes");},_callbacks:{},_callbackId:0}
if(CORS.calledByExtension()){window.addEventListener("message",function(e){var messageData;try{messageData=JSON.parse(e.data);}catch(e){return;}
if(messageData.from==="kickassapp-extension"&&messageData.sanityCheck==="kickassapp-extension-version1"){var message=messageData.payload;if(message.type==="response"){CORS._callbacks[message.requestId](message.body);delete CORS._callbacks[message.requestId];}else if(message.type==="destroy"){window.KICKASSGAME.destroy();}}},false);}function getGlobalNamespace(){return window&&window.INSTALL_SCOPE?window.INSTALL_SCOPE:window;}
var Class=function(methods){var ret=function(){if(ret.$prototyping)return this;if(typeof this.initialize=='function')
return this.initialize.apply(this,arguments);};if(methods.Extends){ret.parent=methods.Extends;methods.Extends.$prototyping=true;ret.prototype=new methods.Extends;methods.Extends.$prototyping=false;}
for(var key in methods)if(methods.hasOwnProperty(key))
ret.prototype[key]=methods[key];return ret;};if(typeof exports!='undefined')exports.Class=Class;var Vector=new Class({initialize:function(x,y){if(typeof x=='object'){this.x=x.x;this.y=x.y;}else{this.x=x;this.y=y;}},cp:function(){return new Vector(this.x,this.y);},mul:function(factor){this.x*=factor;this.y*=factor;return this;},mulNew:function(factor){return new Vector(this.x*factor,this.y*factor);},div:function(factor){this.x/=factor;this.y/=factor;return this;},divNew:function(factor){return new Vector(this.x/factor,this.y/factor);},add:function(vec){this.x+=vec.x;this.y+=vec.y;return this;},addNew:function(vec){return new Vector(this.x+vec.x,this.y+vec.y);},sub:function(vec){this.x-=vec.x;this.y-=vec.y;return this;},subNew:function(vec){return new Vector(this.x-vec.x,this.y-vec.y);},rotate:function(angle){var x=this.x,y=this.y;this.x=x*Math.cos(angle)-Math.sin(angle)*y;this.y=x*Math.sin(angle)+Math.cos(angle)*y;return this;},rotateNew:function(angle){return this.cp().rotate(angle);},setAngle:function(angle){var l=this.len();this.x=Math.cos(angle)*l;this.y=Math.sin(angle)*l;return this;},setAngleNew:function(angle){return this.cp().setAngle(angle);},setLength:function(length){var l=this.len();if(l)this.mul(length/l);else this.x=this.y=length;return this;},setLengthNew:function(length){return this.cp().setLength(length);},normalize:function(){var l=this.len();if(l==0)
return this;this.x/=l;this.y/=l;return this;},normalizeNew:function(){return this.cp().normalize();},angle:function(){return Math.atan2(this.y,this.x);},collidesWith:function(rect){return this.x>rect.x&&this.y>rect.y&&this.x<rect.x+rect.width&&this.y<rect.y+rect.height;},len:function(){var l=Math.sqrt(this.x*this.x+this.y*this.y);if(l<0.005&&l>-0.005)return 0;return l;},is:function(test){return typeof test=='object'&&this.x==test.x&&this.y==test.y;},dot:function(v2){return this.x*v2.x+this.y*v2.y;},inTriangle:function(a,b,c){var v0=c.subNew(a);var v1=b.subNew(a);var v2=p.subNew(a);var dot00=v0.dot(v0);var dot01=v0.dot(v1);var dot02=v0.dot(v2);var dot11=v1.dot(v1);var dot12=v1.dot(v2);var invDenom=1/(dot00*dot11-dot01*dot01);var u=(dot11*dot02-dot01*dot12)*invDenom;var v=(dot00*dot12-dot01*dot02)*invDenom;return(u>0)&&(v>0)&&(u+v<1);},distanceFrom:function(vec){return Math.sqrt(Math.pow((this.x-vec.x),2),Math.pow(this.y-vec.y,2));},toString:function(){return'[Vector('+this.x+', '+this.y+') angle: '+this.angle()+', length: '+this.len()+']';}});if(typeof exports!='undefined')exports.Vector=Vector;
var Rect=new Class({initialize:function(x,y,w,h){this.pos=new Vector(x,y);this.size={width:w,height:h};},hasPoint:function(point){return point.x>this.getLeft()&&point.x<this.getRight()&&point.y>this.getTop()&&point.y<this.getBottom();},setLeft:function(left){this.pos.x=left+this.size.width/2;},setTop:function(top){this.pos.y=top+this.size.height/2;},getLeft:function(){return this.pos.x-this.size.width/2;},getTop:function(){return this.pos.y-this.size.height/2;},getRight:function(){return this.pos.x+this.size.width/2;},getBottom:function(){return this.pos.y+this.size.height/2;},cp:function(){return new Rect(this.pos.x,this.pos.y,this.size.width,this.size.height);}});if(typeof exports!='undefined')exports.Rect=Rect;
var Fx=new Class({initialize:function(){this.listeners=[];this.tweens={};this.running={};},addListener:function(listener){this.listeners.push(listener);},add:function(key,props){props=props||{};props.duration=props.duration||500;props.transition=props.transition||Tween.Linear;props.repeats=typeof props.repeats=='undefined'?false:props.repeats;if(!props.tweens){var start=props.start||0;var end=typeof props.end=='undefined'?1:props.end;props.tweens=[[start,end]];}
this.tweens[key]=props;},update:function(time){time=typeof time==='number'?time:now();for(var key in this.tweens)if(this.tweens.hasOwnProperty(key)){if(!this.running[key]){this.tweenStart(key,time);continue;}
var tween=this.tweens[key];var tdelta=time-this.running[key].startTime;if(tdelta>tween.duration){this.tweenFinished(tween,key);continue;}
var delta=tween.transition(tdelta/tween.duration);var changes=[];for(var i=0,t;t=tween.tweens[i];i++){var x=delta*(t[1]-t[0])+t[0];changes.push(x);}
this.fire(key,changes,delta);}},tweenStart:function(key,time){this.running[key]={startTime:time};var values=[];for(var i=0,tween;tween=this.tweens[key].tweens[i];i++)
values.push(tween[0]);this.fire(key,values,0);},tweenFinished:function(tween,key){var values=[];for(var i=0,t;t=tween.tweens[i];i++)
values.push(t[1]);this.fire(key,values,1);if(!tween.repeats){delete this.running[key];delete this.tweens[key];return;}
this.tweenStart(key,now());},fire:function(key,values,delta){for(var i=0,listener;listener=this.listeners[i];i++)
listener.set.call(listener,key,values,delta);}});var Tween={Linear:function(x){return x;},Quadratic:function(x){return x*x;},Quintic:function(x){return x*x*x;},Shake:function(x){return Math.sin(x);}};
var GameGlobals={FPS:60,useAnimationFrame:false,boids:{flockRadius:400,size:100},path:function(){return"https://kickassapp.com/"+Array.prototype.slice.call(arguments).join("");},hasCanvas:(typeof document.createElement('canvas').getContext!=='undefined'),bulletColor:'black'};window.GameGlobals=GameGlobals;
if(!Array.prototype.indexOf){Array.prototype.indexOf=function(searchElement){if(this===void 0||this===null)
throw new TypeError();var t=Object(this);var len=t.length>>>0;if(len===0)
return-1;var n=0;if(arguments.length>0){n=Number(arguments[1]);if(n!==n)
n=0;else if(n!==0&&n!==(1/0)&&n!==-(1/0))
n=(n>0||-1)*Math.floor(Math.abs(n));}
if(n>=len)
return-1;var k=n>=0?n:Math.max(len-Math.abs(n),0);for(;k<len;k++){if(k in t&&t[k]===searchElement)
return k;}
return-1;};}
function now(){return(new Date()).getTime();}
function bind(bound,func){return function(){return func.apply(bound,arguments);};}
function each(arr,func,bindObject){if(typeof arr.forEach=='function'){arr.forEach(func,bindObject);return arr;}
for(var key in arr)if(arr.hasOwnProperty(key))
func.call(bindObject||window,arr[key],key);return arr;}
function addEvent(obj,type,fn){if(obj.addEventListener)
obj.addEventListener(type,fn,false);else if(obj.attachEvent){obj["e"+type+fn]=fn;obj[type+fn]=function(){return obj["e"+type+fn](window.event);};obj.attachEvent("on"+type,obj[type+fn]);}}
function removeEvent(obj,type,fn){if(obj.removeEventListener)
obj.removeEventListener(type,fn,false);else if(obj.detachEvent){obj.detachEvent("on"+type,obj[type+fn]);obj[type+fn]=null;obj["e"+type+fn]=null;}}
function stopEvent(e){if(e.stopPropogation)
e.stopPropogation();if(e.preventDefault)
e.preventDefault();e.returnValue=false;}
function elementIsContainedIn(element1,element2){if(element.contains)
return element1.contains(element2);return!!(element1.compareDocumentPosition(element2)&16);};function code(name){var table={38:'up',40:'down',37:'left',39:'right',27:'esc'};if(table[name])return table[name];return String.fromCharCode(name);};function random(min,max){return Math.floor(Math.random()*(max-min+1)+min);};function getRect(element){if(typeof element.getBoundingClientRect==='function'){var rect=element.getBoundingClientRect();var sx=window.pageXOffset;var sy=window.pageYOffset;return{width:rect.width,height:rect.height,left:rect.left+sx,top:rect.top+sy};}
var rect={width:element.offsetWidth,height:element.offsetHeight,left:0,top:0};var el=element;while(el){rect.left+=el.offsetLeft;rect.top+=el.offsetTop;el=el.offsetParent;}
return rect;}
function getCompatElement(){var doc=document;return(!doc.compatMode||doc.compatMode=='CSS1Compat')?doc.documentElement:doc.body;}
function getScrollSize(){var doc=getCompatElement();var min={x:doc.clientWidth,y:doc.clientHeight};var body=document.body;return{x:Math.max(doc.scrollWidth,body.scrollWidth,min.x),y:Math.max(doc.scrollHeight,body.scrollHeight,min.y)};}
function getStyle(element,prop){if(element.style[prop])
return element.style[prop];if(element.currentStyle)
return element.currentStyle[prop];return document.defaultView.getComputedStyle(element,null).getPropertyValue(prop);}
function setStyles(element,props){for(var key in props)if(props.hasOwnProperty(key)){var val=props[key];if(typeof val==="number"&&key!=="opacity"&&key!=="zIndex")
val=val+'px';element.style[key]=val;}};function hasClass(ele,cls){return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));}
function addClass(ele,cls){if(!hasClass(ele,cls))ele.className+=" "+cls;}
function removeClass(ele,cls){if(hasClass(ele,cls)){var reg=new RegExp('(\\s|^)'+cls+'(\\s|$)');ele.className=ele.className.replace(reg,' ');}}
function cloneElement(element){return element.cloneNode(true);}
function newElement(tag,props){var el=document.createElement(tag);for(var key in props)if(props.hasOwnProperty(key)){if(key==='styles'){setStyles(el,props[key]);}else{el[key]=props[key];}}
return el;}
var requestAnimFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback,element){window.setTimeout(callback,1000/60);};})();function delay(d,func,bound){return setTimeout(bind(bound,func),d);}
var KickAss=new Class({initialize:function(options){if(options&&options.mySite){this.mySite=options.mySite;}
this.players=[];this.elements=[];this.weaponClass=Weapons[1].cannonClass;this.scrollPos=new Vector(0,0);this.scrollSize=new Vector(0,0);this.windowSize={width:0,height:0};this.updateWindowInfo();this.bulletManager=new BulletManager(this);this.bulletManager.updateEnemyIndex();this.explosionManager=new ExplosionManager(this);this.ui=new UIManager(this);this.bombManager=new BombManager(this);this.menuManager=new MenuManager(this);this.menuManager.create();if(typeof StatisticsManager!=="undefined"){this.statisticsManager=new StatisticsManager(this);}
this.sessionManager=new SessionManager(this);this.lastUpdate=now();this.keyMap={};this.keydownEvent=bind(this,this.keydown);this.keyupEvent=bind(this,this.keyup);this.multiplier=10;if(this.isCampaign()){this.audioManager={explosion:new AudioManager(GameGlobals.path("static/sounds/game/explosion"),["mp3","ogg"]),shot:new AudioManager(GameGlobals.path("static/sounds/game/shot"),["mp3","ogg"])}}else{this.audioManager={};}
if(window.KickAssStyle&&window.KickAssStyle==="white"){GameGlobals.bulletColor="white";}
addEvent(document,'keydown',this.keydownEvent);addEvent(document,'keyup',this.keyupEvent);addEvent(document,'keypress',this.keydownEvent);},begin:function(){this.addPlayer();this.sessionManager.isPlaying=true;if(!GameGlobals.useAnimationFrame){this.loopTimer=window.setInterval(bind(this,this.loop),1000/GameGlobals.FPS);}
if(GameGlobals.useAnimationFrame){requestAnimFrame(bind(this,this.loop));}},keydown:function(e){var c=code(e.keyCode);this.keyMap[c]=true;switch(c){case'left':case'right':case'up':case'down':case'esc':case' ':stopEvent(e);break;}
switch(c){case'esc':this.destroy();break;}},keyup:function(e){var c=code(e.keyCode);this.keyMap[c]=false;switch(c){case'left':case'right':case'up':case'down':case'esc':case' ':if(e.stopPropogation){e.stopPropogation();}
if(e.preventDefault){e.preventDefault();}
e.returnValue=false;break;}},loop:function(){var currentTime=now();var tdelta=(currentTime-this.lastUpdate)/1000;this.updateWindowInfo();for(var i=0,player;player=this.players[i];i++){player.update(tdelta);}
this.bulletManager.update(tdelta);this.bombManager.update(tdelta);this.explosionManager.update(tdelta);this.ui.update(tdelta);if(this.statisticsManager){this.statisticsManager.update(tdelta);}
this.sessionManager.update(tdelta);this.lastUpdate=currentTime;if(GameGlobals.useAnimationFrame){requestAnimFrame(bind(this,this.loop));}},addPlayer:function(){var data=false;var ship=Ships.Standard;if(window.KICKASSSHIP&&window.KICKASSSHIP.points){ship=KICKASSSHIP;}
if(this.mySite&&this.mySite.getShipConfig()){ship=this.mySite.getShipConfig();}
var player=new Player(this);player.setShip(ship);this.players.push(player);this.explosionManager.addExplosion(player.pos);},registerElement:function(el){if(!el){throw new Error("Can't register unexisting element.");}
this.elements.push(el);},unregisterElement:function(el){this.elements.splice(this.elements.indexOf(el),1);},isKickAssElement:function(el){for(var i=0,element;element=this.elements[i];i++){if(el===element||elementIsContainedIn(element,el)){return true;}}
return false;},isKeyPressed:function(key){return!!this.keyMap[key];},updateWindowInfo:function(){var isIEQuirks=(!!window.ActiveXObject)&&document.compatMode=="BackCompat";this.windowSize={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight};if(isIEQuirks){this.windowSize.width=document.body.clientWidth;this.windowSize.height=document.body.clientHeight;}
if(this.menuManager&&this.menuManager.isVisible()){this.windowSize.height-=this.menuManager.getHeight();}
this.scrollPos.x=window.pageXOffset||document.documentElement.scrollLeft;this.scrollPos.y=window.pageYOffset||document.documentElement.scrollTop;this.scrollSize=getScrollSize();},hideAll:function(){for(var i=0,el;el=this.elements[i];i++){el.style.visibility='hidden';}},showAll:function(){for(var i=0,el;el=this.elements[i];i++){el.style.visibility='visible';}},updateShips:function(ship,isInitial){if(!isInitial){this.ui.showMessage("You're now flying<br /><em>"+ship.name+"<em>!!");}
for(var i=0,player;player=this.players[i];i++){player.setShip(ship);}},changeWeapon:function(weapon,isInitial){this.weaponClass=weapon.cannonClass;if(!isInitial){this.ui.showMessage("Changed to "+weapon.name.toUpperCase()+"!!!!");}
for(var i=0,player;player=this.players[i];i++){player.setCannons(weapon.cannonClass);}},changeWeaponById:function(id,isInitial){if(Weapons[id]){this.changeWeapon(Weapons[id],isInitial);}},flyOutPlayers:function(x,y){for(var i=0,player;player=this.players[i];i++){player.flyTo(x,-player.size.height);player.isBound=false;}},flyInPlayers:function(){for(var i=0,player;player=this.players[i];i++){player.flyTo(player.pos.x,100,function(){this.isBound=true;});}},newRank:function(rank){this.ui.showMessage("OMG. You leveled up to: <strong>"+rank+'</strong>!<br /><small>Be sure to check what cool new stuff you get in the menu.</small>');},fireBomb:function(){this.bombManager.blow();},destroy:function(){removeEvent(document,'keydown',this.keydownEvent);removeEvent(document,'keypress',this.keydownEvent);removeEvent(document,'keyup',this.keyupEvent);for(var i=0,player;player=this.players[i];i++){player.destroy();}
this.bulletManager.destroy();this.explosionManager.destroy();this.menuManager.destroy();if(!GameGlobals.useAnimationFrame){clearInterval(this.loopTimer);}
getGlobalNamespace().KICKASSGAME=false;if(this.isCampaign()){document.location.reload();}},isCampaign:function(){return getGlobalNamespace().IS_CLOUDFLARE_GAME;},isMySite:function(){return!!getGlobalNamespace().KICKASS_SITE_KEY;},shouldShowAd:function(){return!this.mySite&&!this.isCampaign();},shouldShowMenu:function(){return!this.mySite&&!this.isCampaign();},shouldShowHowToImage:function(){return this.mySite||this.isCampaign();}});window.KickAss=KickAss;
var StatisticsManager=new Class({initialize:function(game){this.game=game;this.data={};this.data.startedPlaying=now();this.data.elementsDestroyed=0;this.data.shotsFired=0;this.data.distanceFlownInPixels=0;this.data.totalPointsThisSession=0;this.data.usedThrusters=0;this.lastUpdate=0;},usedThrusters:function(){this.data.usedThrusters=1;},increaseDistanceWithPixels:function(px){this.data.distanceFlownInPixels+=px;},increasePointsGainedWithPoints:function(points){this.data.totalPointsThisSession+=points;},addShotFired:function(){this.data.shotsFired++;if(this.game.audioManager.shot){this.game.audioManager.shot.play();}},addElementsDestroyed:function(){this.data.elementsDestroyed++;},update:function(tdelta){this.lastUpdate+=tdelta;if(this.lastUpdate>0.25){this.syncWithServer();this.lastUpdate=0;}},syncWithServer:function(){var fragment=[];for(var key in this.data)if(this.data.hasOwnProperty(key)){fragment.push(key+':'+this.data[key]);}
this.game.menuManager.sendMessageToMenu("stats:!"+fragment.join('|'));}});
var MySite=new Class({initialize:function(key){this.key=key;},load:function(callback){CORS.request(GameGlobals.path('mysite/api.json'),{site_key:this.key,url:document.location.toString()},bind(this,function(data){if(data&&data.embed){this.mySiteData=data.embed;callback(true);}else{callback(false);}}));},install:function(){},getShipId:function(){return this.mySiteData&&this.mySiteData.settings.ship;},getShipConfig:function(){return this.mySiteData&&this.mySiteData.settings.ship_config;},getShareURL:function(){return this.mySiteData&&this.mySiteData.settings.share_url;}});
var Menu=new Class({initialize:function(game){this.game=game;this.size={height:300};},generate:function(parent){this.container=document.createElement('div');this.container.className='KICKASSELEMENT';this.container.id='kickass-profile-menu';parent.appendChild(this.container);var shipId=getGlobalNamespace().KICKASSSHIPID||"";this.url=GameGlobals.path('intermediate_postmessage.html?url='+
encodeURIComponent(getGlobalNamespace().KICKASSURL||document.location.href)+"&origin="+encodeURIComponent(document.location.href)+"&preship="+(shipId)+"&is_campaign="+(this.game.isCampaign()?"true":"")+"&is_mysite="+(this.game.isMySite()?"true":""));this.isSocketReady=false;this.socketIframe=document.createElement("iframe");this.socketIframe.frameborder='0';this.socketIframe.className='KICKASSELEMENT';this.socketIframe.width='100%';this.socketIframe.height=this.size.height+'px';this.container.appendChild(this.socketIframe);this.menuOrigin="https://kickassapp.com/".replace(/\/$/,"");this.socketIframe.src=this.url;this.onMessage=bind(this,function(event){if(event.origin!==this.menuOrigin&&event.origin!==this.menuOrigin.replace("http://","https://")){console.log("ignoring event from",event.origin);return;}
var message=event.data;if(message==="ready"){this.onGameReady();return;}
var t=message.split(':!');if(t.length!==2){return;}
var type=t.shift().replace(/^./g,function(match){return match.charAt(0).toUpperCase();});if(typeof this['messageType'+type]==="function"){this['messageType'+type](t.join(":!"));}});window.addEventListener("message",this.onMessage,false);this.game.registerElement(this.container);},socketPostMessage:function(message){this.socketIframe.contentWindow.postMessage(message,this.menuOrigin);},onGameReady:function(){this.isSocketReady=true;this.game.registerElement(this.container.getElementsByTagName('iframe')[0]);this.socketPostMessage("url:!"+(getGlobalNamespace().KICKASSURL||document.location.href));if(this.game.statisticsManager){this.game.statisticsManager.syncWithServer();}
this.game.menuManager.onGameReady();},sendMessage:function(message){if(!this.isSocketReady){return;}
if(message!=this.lastMessage){try{this.socketPostMessage(message);}catch(e){}
this.lastMessage=message;}},messageTypeChangeShip:function(pieces){pieces=pieces.split(",");var shipId=pieces[0];var weaponId=pieces[1];var isInitial=pieces[2]==='initial';if(this.shipId===shipId){return;}
if(isInitial&&getGlobalNamespace().KICKASSSHIP){return;}
this.shipId=shipId;CORS.request(GameGlobals.path('designer/ship/'+shipId+'/construction.json'),{ship_id:shipId,is_initial:isInitial?'1':'0'},bind(this,function(data){this.game.updateShips(data.data,isInitial);try{window.focus();}catch(e){}}));if(!isInitial){this.parent.hideMenu();}},messageTypeChangeWeapon:function(weaponId,isInitial){this.game.changeWeaponById(weaponId,isInitial);},messageTypeSetMultiplier:function(mod){mod=parseInt(mod,10);if(isNaN(mod)||!mod){return;}
this.game.multiplier=mod;},messageTypeNewRank:function(rank){this.game.newRank(rank);},messageTypePlayerMessage:function(message){this.game.ui.showMessage(message);},destroy:function(){this.game.unregisterElement(this.container);this.game.unregisterElement(this.iframe);window.removeEventListener("message",this.onMessage,false);this.container.parentNode.removeChild(this.container);}});
var MenuManager=new Class({initialize:function(game){this.game=game;this.numPoints=0;if(!getGlobalNamespace().KICKASS_INLINE_CSS){this.includeCSS(GameGlobals.path('css/menustyles.css'));}},generateDefaults:function(){for(var id in Weapons)if(Weapons.hasOwnProperty(id)){this.addWeapon(Weapons[id],id);}
this.hideBombMenu();},create:function(){this.container=document.createElement('div');this.container.className='KICKASSELEMENT KICKASShidden '+(this.game.shouldShowMenu()?"":"KICKASSNOMENU");this.container.id='kickass-menu';if(this.game.shouldShowMenu()){this.container.style.bottom='-250px';this.container.style.display='none';}else{removeClass(this.container,"KICKASShidden");}
getAppContainerElement().appendChild(this.container);var adHTML=this.game.shouldShowAd()?'<iframe style="background: transparent" src="'+GameGlobals.path('hello.html')+'" class="KICKASSELEMENT" id="kickass-hello-sunshine"></iframe>':"";this.container.innerHTML='<div id="kickass-howto-image" class="KICKASSELEMENT kickass-howto-invisible"></div>'+'<div id="kickass-pointstab" class="KICKASSELEMENT">'+
adHTML+'<div id="kickass-bomb-menu" class="KICKASSELEMENT KICKASShidden">'+'<ul id="kickass-bomb-list" class="KICKASSELEMENT">'+'</ul>'+'</div>'+'<div id="kickass-weapons-menu" class="KICKASSELEMENT KICKASShidden" style="display:none">'+'<ul id="kickass-weapons-list" class="KICKASSELEMENT">'+'</ul>'+'</div>'+'<div id="kickass-pointstab-wrapper" class="KICKASSELEMENT">'+'<div id="kickass-points" class="KICKASSELEMENT">'+
this.numPoints+'</div>'+'<div id="kickass-esctoquit" class="KICKASSELEMENT">Press esc to quit</div>'+
this.getShareHTML()+'</div>'+'<ul id="kickass-pointstab-menu" class="KICKASSELEMENT" '+(this.game.shouldShowMenu()?'':'style="display:none"')+'>'+'<li class="KICKASSELEMENT"><a class="KICKASSELEMENT" id="kickass-link-highscores" href="#">Submit score</a></li>'+'<li class="KICKASSELEMENT"><a class="KICKASSELEMENT" id="kickass-link-menu" href="#">Menu</a></li>'+'<li class="last-li KICKASSELEMENT"><a class="KICKASSELEMENT" id="kickass-link-ships" href="#">Switch ship</a></li>'+'</ul>'+'</div>';this.pointsTab=document.getElementById('kickass-pointstab');this.pointsTabWrapper=document.getElementById('kickass-pointstab-wrapper');this.points=document.getElementById('kickass-points');this.escToQuit=document.getElementById('kickass-esctoquit');this.howToImage=document.getElementById('kickass-howto-image');this.weaponsMenu=document.getElementById('kickass-weapons-menu');this.weaponsList=document.getElementById('kickass-weapons-list');this.bombLink=document.getElementById('kickass-bomb-menu');this.submitScoreLink=document.getElementById('kickass-link-highscores');this.menuLink=document.getElementById('kickass-link-menu');this.switchShipLink=document.getElementById('kickass-link-ships');var all=this.container.getElementsByTagName('*');for(var i=0;i<all.length;i++){this.game.registerElement(all[i]);}
this.game.registerElement(this.container);if(this.game.shouldShowMenu()){this.menu=new Menu(this.game);this.menu.parent=this;this.menu.generate(this.container);}else{setTimeout(function(){this.onGameReady();}.bind(this),100);}
addEvent(this.submitScoreLink,'click',bind(this,function(e){stopEvent(e);this.navigateTo('highscores');}));addEvent(this.menuLink,'click',bind(this,function(e){stopEvent(e);this.toggleMenu();this.navigateTo('main',true);}));addEvent(this.switchShipLink,'click',bind(this,function(e){stopEvent(e);this.navigateTo('ships');}));addEvent(this.bombLink,'click',bind(this,function(e){stopEvent(e);this.game.fireBomb();}));addEvent(this.pointsTabWrapper,'click',bind(this,this.toggleMenu));addEvent(this.weaponsMenu,'click',bind(this,this.toggleWeaponsMenu));this.generateDefaults();},getShareHTML:function(){if(typeof getGlobalNamespace().KICKASS_SHARE_URL!=="undefined"){if(getGlobalNamespace().KICKASS_SHARE_URL){var url=encodeURIComponent(getGlobalNamespace().KICKASS_SHARE_URL);return'<iframe class="KICKASSELEMENT kickass-like" src="//www.facebook.com/plugins/share_button.php?href='+url+'&amp;send=false&amp;layout=button&amp;width=47&amp;show_faces=false&amp;action=like&amp;colorscheme=dark&amp;font=arial&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:80px; height:21px;" allowTransparency="true"></iframe>';}else{return'';}}else{var url='https://www.facebook.com/kickassapp';if(this.game.mySite){if(this.game.mySite.getShareURL()){url=this.game.mySite.getShareURL();}else{return"";}}
return'<iframe class="KICKASSELEMENT kickass-like" src="//www.facebook.com/plugins/like.php?href='+encodeURIComponent(url)+'&amp;send=false&amp;layout=button_count&amp;width=47&amp;show_faces=false&amp;action=like&amp;colorscheme=dark&amp;font=arial&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:80px; height:21px;" allowTransparency="true"></iframe>';}},onGameReady:function(){this.container.style.display='block';if(this.game.shouldShowHowToImage()){setTimeout(bind(this,function(){removeClass(this.howToImage,"kickass-howto-invisible");}),10);setTimeout(bind(this,function(){addClass(this.howToImage,"kickass-howto-invisible");}),4000);}},navigateTo:function(page,dontShowMenu){if(!dontShowMenu){this.showMenu();}
if(this.menu){this.menu.socketPostMessage('navigate:!'+page);}},toggleMenu:function(){if(this.game.shouldShowMenu()){if(hasClass(this.container,'KICKASShidden')){this.showMenu();}else{this.hideMenu();}}else{this.showMenu();}},toggleWeaponsMenu:function(){if(hasClass(this.weaponsMenu,'KICKASShidden')){this.showWeaponsMenu();}else{this.hideWeaponsMenu();}},hideWeaponsMenu:function(){this.weaponsMenu.style.width='';addClass(this.weaponsMenu,'KICKASShidden');},showWeaponsMenu:function(){var last=this.weaponsMenu.getElementsByTagName('li');last=last[last.length-1];this.weaponsMenu.style.width=(last.offsetLeft+last.offsetWidth-47)+'px';removeClass(this.weaponsMenu,'KICKASShidden');},showMenu:function(){if(this.game.shouldShowMenu()){this.container.style.bottom='';removeClass(this.container,'KICKASShidden');}},hideMenu:function(){this.container.style.bottom='';addClass(this.container,'KICKASShidden');},showBombMenu:function(){this.bombLink.style.width="";},hideBombMenu:function(){this.bombLink.style.width="0px";},getHeight:function(){return this.container.clientHeight;},isVisible:function(){return!hasClass(this.container,'KICKASShidden');},addPoints:function(killed,pos){var points=killed*this.game.multiplier;this.numPoints+=points;this.points.innerHTML=this.numPoints;if(this.game.statisticsManager){this.game.statisticsManager.increasePointsGainedWithPoints(points);}
this.game.ui.addPointsBubbleAt(pos,points);},includeCSS:function(file){var link=document.createElement('link');link.rel='stylesheet';link.type='text/css';link.href=file;(document.head||document.body).appendChild(link);},sendMessageToMenu:function(fragment){if(this.menu){this.menu.sendMessage(fragment);}},addWeapon:function(weapon,id){var li=document.createElement('li');li.className='KICKASSELEMENT kickass-weapon-item';li.weapon=weapon;li.style.backgroundImage='url('+GameGlobals.path('css/gfx/kickass/weap-'+weapon.id+'.png')+')';li.innerHTML='<span class="KICKASSELEMENT">'+weapon.name+'</span>';this.weaponsList.appendChild(li);addEvent(li,'click',bind(this,function(e){stopEvent(e);this.changeWeapon(weapon);this.sendMessageToMenu("changeWeapon:!"+id);}));},changeWeapon:function(weapon){this.game.changeWeapon(weapon);},destroy:function(){var all=this.container.getElementsByTagName('*');for(var i=0;i<all.length;i++){this.game.unregisterElement(all[i]);}
this.game.unregisterElement(this.container);if(this.menu){this.menu.destroy();}
this.container.parentNode.removeChild(this.container);}});
var UIManager=new Class({initialize:function(game){this.UNIQID=0;this.game=game;this.pointBubbles={};this.messages={};this.fx=new Fx();this.fx.addListener(this);},update:function(tdelta){this.fx.update();},set:function(key,value,delta){var type=key.split('-')[0];var id=key.split('-')[1];if(this.pointBubbles[id]){var bubble=this.pointBubbles[id];bubble.style.top=value[0]+'px';bubble.style.opacity=value[1];if(delta==1&&bubble.parentNode){bubble.parentNode.removeChild(bubble);delete this.pointBubbles[id];}}else if(this.messages[id]&&type=='messagedown'){var message=this.messages[id];message.style.top=value[0]+'px';if(delta==1){setTimeout(bind(this,function(){this.fx.add('messageup-'+id,{tweens:[[value[0],-100]],transition:Tween.Quadratic,duration:300});}),message.staytime||4000);}}else if(this.messages[id]&&type=='messageup'){var message=this.messages[id];message.style.top=value[0]+'px';if(delta==1){message.parentNode.removeChild(message);delete this.messages[id];}}},addPointsBubbleAt:function(pos,points){var id='bubble'+(this.UNIQID++);var y=this.game.scrollPos.y+pos.y;var bubble=newElement('span',{innerHTML:points,className:'KICKASSELEMENT',styles:{position:'absolute',font:"20px Arial",fontWeight:"bold",opacity:"1",color:"black",textShadow:"#fff 1px 1px 3px",top:y,zIndex:"10000000"}});bubble.style.left=pos.x-bubble.offsetWidth/2+'px';getAppContainerElement().appendChild(bubble);this.pointBubbles[id]=bubble;this.fx.add('bubble-'+id,{tweens:[[y,y-15],[1,0]]});},showMessage:function(html,staytime){staytime=staytime||false;var width=300;var id=this.UNIQID++;var message=newElement('div',{innerHTML:html,className:'KICKASSELEMENT',id:'kickass-message-'+id,styles:{position:'fixed',top:-100,left:'50%',marginLeft:-width/2,width:width,background:'#222',opacity:0.8,padding:'10px',color:'#fff',textAlign:'center',borderRadius:15,font:'20px Arial',fontWeight:'bold',zIndex:"10000000"}});message.staytime=staytime;getAppContainerElement().appendChild(message);var to=this.getLowestBubbleY();message.kickassto=to;this.fx.add('messagedown-'+id,{duration:300,tweens:[[-100,to]],transition:Tween.Quadratic});this.messages[id]=message;return message;},getLowestBubbleY:function(){var top=100;for(var id in this.messages)if(this.messages.hasOwnProperty(id))
top=Math.max(this.messages[id].kickassto+this.messages[id].offsetHeight+10,top);return top;}});var AudioManager=new Class({initialize:function(src,formats){this.src=src;this.formats=formats;channels=8;this.supportsAudio=(typeof document.createElement('audio').play)!='undefined';if(this.supportsAudio){this.numChannels=channels;this.channels=[];for(var i=0;i<this.numChannels;i++){this.channels.push({isPlaying:false,element:this.prepareElement(this.buildAudioElement())});}}},buildAudioElement:function(){var TYPES={"ogg":"audio/ogg","mp3":"audio/mpeg"}
var audio=document.createElement("audio");for(var i=0,format;format=this.formats[i];i++){var source=document.createElement("source");source.src=this.src+"."+format;source.type=TYPES[format];audio.appendChild(source);}
return audio;},prepareElement:function(el){if(typeof el.addEventListener=='undefined')
return el;var self=this;el.addEventListener('ended',function(e){self.audioEnded(el);},false);return el;},audioEnded:function(target){for(var i=0,channel;channel=this.channels[i];i++){if(channel.element===target){channel.isPlaying=false;}}},play:function(){if(!this.supportsAudio)return;for(var i=0,channel;channel=this.channels[i];i++){if(!channel.isPlaying){channel.isPlaying=true;if(typeof channel.element.play=='function')
channel.element.play();return;}}}});var Ships={Standard:{points:[[-10,10],[0,-15],[10,10]],thrusters:[{s:{w:20,h:7},p:{x:0,y:14},a:0}],cannons:[{p:{x:0,y:-15},a:0}]}};
var PLAYERIDS=0;var Player=new Class({initialize:function(game){this.id=PLAYERIDS++;this.game=game;this.tween=false;this.isBound=true;this.pos=new Vector(200,200);this.vel=new Vector(0,0);this.acc=new Vector(0,0);this.dir=new Vector(0,1);this.currentRotation=0;this.isBroken=false;this.lineOffsets=[];this.deadTime=0;this.friction=0.8;this.terminalVelocity=2000;this.lastPos=new Vector(0,0);},setShip:function(ship){this.ship=ship;this.verts=[];for(var i=0,vert;vert=this.ship.points[i];i++)
this.verts.push(new Vector(vert[0],vert[1]));this.verts.push(this.verts[0]);this.thrusters=[];this.cannons=[];this.addThrusters(this.ship.thrusters);this.addCannons(this.ship.cannons);this.size=this.getSizeFromVertsAndObjects();this.bounds=this.calculateBounds();if(this.sheet){this.sheet.destroy();}
this.sheet=new Sheet(new Rect(100,100,this.bounds.x,this.bounds.y));this.forceRedraw=true;},setCannons:function(cannonClass){var newCannons=[];for(var i=0,cannon;cannon=this.cannons[i];i++){var newCannon=new cannonClass(this,this.game,cannon.pos.x,cannon.pos.y,cannon.angle);newCannons.push(newCannon);cannon.destroy();}
this.cannons=newCannons;},addThrusters:function(thrusters){for(var i=0,data;data=thrusters[i];i++){var thruster=new Thruster(data);this.thrusters.push(thruster);}},addCannons:function(cannons){for(var i=0,data;data=cannons[i];i++){var weaponClass=WeaponMap[data.m]||WeaponMap.cannon;var cannon=new weaponClass.cannonClass(this,this.game,data.p.x,data.p.y,data.a);cannon.player=this;cannon.game=this.game;this.cannons.push(cannon);}},update:function(tdelta){if(this.isBroken){if(!this.lineOffsets.length){for(var i=0;i<(this.verts.length-1);i++)
this.lineOffsets[i]={pos:new Vector(0,0),dir:(new Vector(1,1)).setAngle(Math.PI*2*Math.random())};}
for(var i=0;i<this.lineOffsets.length;i++){this.lineOffsets[i].pos.add(this.lineOffsets[i].dir.cp().setLength(50).mul(tdelta));}
this.sheet.clear();this.sheet.setAngle(this.dir.angle());this.sheet.setPosition(this.pos);this.sheet.drawBrokenPlayer(this.verts,this.lineOffsets);if(now()-this.deadTime>1000.0){this.isBroken=false;this.lineOffsets=[];this.randomPos();}
return;}
if(!this.tween){if(this.game.isKeyPressed('left')||this.game.isKeyPressed('right')){if(this.game.isKeyPressed('left'))
this.rotateLeft(tdelta);if(this.game.isKeyPressed('right'))
this.rotateRight(tdelta);}else{this.stopRotate();}
if(this.game.isKeyPressed('up'))
this.activateThrusters();else
this.stopThrusters();}
if(this.game.isKeyPressed(' ')){this.isShooting=true;if(!this.isBroken)
this.shootPressed();}else if(this.isShooting){this.isShooting=false;this.shootReleased();}
if(this.currentRotation)
this.dir.setAngle(this.dir.angle()+this.currentRotation*tdelta);var frictionedAcc=this.acc.mulNew(tdelta).sub(this.vel.mulNew(tdelta*this.friction));this.vel.add(frictionedAcc);if(this.vel.len()>this.terminalVelocity)
this.vel.setLength(this.terminalVelocity);var posDelta=this.vel.mulNew(tdelta);this.pos.add(posDelta);if(this.game.statisticsManager){this.game.statisticsManager.increaseDistanceWithPixels(posDelta.len());}
var showFlames=!this.acc.is({x:0,y:0});for(var i=0,thruster;thruster=this.thrusters[i];i++){thruster.setIsShown(showFlames);thruster.update(tdelta);}
if(this.isBound)
this.checkBounds();if(!this.lastPos.is(this.pos)||this.currentRotation||this.forceRedraw){this.forceRedraw=false;this.sheet.clear();this.sheet.setAngle(this.dir.angle()+Math.PI/2);this.sheet.setPosition(this.pos);if(showFlames){for(var i=0,thruster;thruster=this.thrusters[i];i++)
thruster.drawTo(this.sheet);}
this.sheet.drawPlayer(this.verts);this.lastPos=this.pos.cp();}
for(var i=0,cannon;cannon=this.cannons[i];i++){cannon.update(tdelta);}},randomPos:function(){var w=this.game.windowSize.width;var h=this.game.windowSize.height;this.pos=new Vector(random(0,w),random(0,h));},checkBounds:function(){if(this.tween)
return;var w=this.game.windowSize.width;var h=this.game.windowSize.height;var rightBound=this.pos.x+this.sheet.rect.size.width/2;var bottomBound=this.pos.y+this.sheet.rect.size.height/2;if(rightBound>w){window.scrollTo(this.game.scrollPos.x+50,this.game.scrollPos.y);this.pos.x=0;}else if(this.pos.x<0){window.scrollTo(this.game.scrollPos.x-50,this.game.scrollPos.y);this.pos.x=w-this.sheet.rect.size.width/2;}
if(bottomBound>h){window.scrollTo(this.game.scrollPos.x,this.game.scrollPos.y+h*0.75);this.pos.y=0;}else if(this.pos.y<0){window.scrollTo(this.game.scrollPos.x,this.game.scrollPos.y-h*0.75);this.pos.y=h-this.sheet.rect.size.height/2;}},inRect:function(rect){var ret=false;for(var i=0,vert;vert=this.verts[i];i++){if(rect.hasPoint(new Vector(vert.x+this.pos.x,vert.y+this.pos.y)))
ret=true;}
return ret;},hit:function(by){if(this.isBroken)return;this.isBroken=true;this.deadTime=now();},activateThrusters:function(){if(this.game.statisticsManager){this.game.statisticsManager.usedThrusters();}
this.acc=(new Vector(500,0)).setAngle(this.dir.angle());},stopThrusters:function(){this.acc=new Vector(0,0);},rotateLeft:function(tdelta){this.currentRotation=Math.max(-Math.PI*2,this.currentRotation-Math.PI*10*tdelta);},rotateRight:function(tdelta){this.currentRotation=Math.min(Math.PI*2,this.currentRotation+Math.PI*10*tdelta);},stopRotate:function(){this.currentRotation=0;},getSizeFromVertsAndObjects:function(){var largestDistance=0;for(var i=0,vert;vert=this.verts[i];i++)
largestDistance=Math.max(largestDistance,(new Vector(vert)).len());for(var i=0,obj;obj=this.thrusters[i];i++){var p1=(new Vector(obj.pos.x-obj.size.width/2,obj.pos.y-obj.size.height/2)).rotate(obj.angle);var p2=(new Vector(obj.pos.x+obj.size.width/2,obj.pos.y-obj.size.height/2)).rotate(obj.angle);var p3=(new Vector(obj.pos.x-obj.size.width/2,obj.pos.y+obj.size.height/2)).rotate(obj.angle);var p4=(new Vector(obj.pos.x+obj.size.width/2,obj.pos.y+obj.size.height/2)).rotate(obj.angle);largestDistance=Math.max(largestDistance,p1.len(),p2.len(),p3.len(),p4.len());}
return{width:largestDistance*2,height:largestDistance*2};},calculateBounds:function(){return{x:Math.max(this.size.width,this.size.height)*1,y:Math.max(this.size.height,this.size.width)*1};},shootPressed:function(){for(var i=0,cannon;cannon=this.cannons[i];i++)
cannon.shootPressed();},shootReleased:function(){for(var i=0,cannon;cannon=this.cannons[i];i++)
cannon.shootReleased();},flyTo:function(x,y,callback){this.tween={start:{pos:this.pos.cp(),dir:this.dir.cp()},to:new Vector(x,y),callback:callback||function(){}};this.tween.time=this.getTimeforTween();},destroy:function(){this.sheet.destroy();}});var Thruster=new Class({initialize:function(data,ship){this.pos=new Vector(data.p);this.size={width:data.s.w,height:data.s.h};this.angle=data.a||0;this.ship=ship;this.isShown=false;this.flameY=1;this.fx=new Fx();this.fx.addListener(this);this.flames={r:[],y:[]};this.lastFrameUpdate=0;this.generateFlames();},update:function(tdelta){this.fx.update();if(now()-this.lastFrameUpdate>1000/60)
this.generateFlames();},set:function(key,value){switch(key){case'flames':this.flameY=value;break;}},setIsShown:function(isShown){if(!this.isShown&&isShown){this.flameY=0.0;this.generateFlames();this.fx.add('flames',{start:this.flameY,end:1,duration:250,transition:Tween.Quintic});}
this.isShown=isShown;},drawTo:function(sheet){sheet.drawFlames(this.flames,this.angle);},generateFlames:function(){var redWidth=this.size.width,redIncrease=this.size.width*0.05,yellowWidth=this.size.width*0.8,yellowIncrease=yellowWidth*0.1,halfRed=redWidth/2,halfYellow=yellowWidth/2,offsetY=-this.size.height/2,metaY=0;var px=this.pos.x;var py=this.pos.y-this.size.height/2;function vec(x,y){return new Vector(x,y);}
this.flames.r=[vec(-halfRed+px,py)];this.flames.y=[vec(-halfYellow+px,py)];this.flames.self=this;for(var x=0;x<redWidth;x+=redIncrease)
this.flames.r.push(vec(x-halfRed+px,this.flameY*random(this.size.height*0.7,this.size.height)+py));this.flames.r.push(vec(halfRed+px,py));for(var x=0;x<yellowWidth;x+=yellowIncrease)
this.flames.y.push(vec(x-halfYellow+px,this.flameY*random(this.size.height*0.4,this.size.height*0.7)+py));this.flames.y.push(vec(halfYellow+px,py));this.lastFrameUpdate=now();var pos=vec(px,py);for(var i=0,p;p=this.flames.r[i];i++)
p.sub(pos).rotate(this.angle).add(pos);for(var i=0,p;p=this.flames.y[i];i++)
p.sub(pos).rotate(this.angle).add(pos);}});var BombManager=new Class({initialize:function(game){this.game=game;this.bombShowDelay=30;this.nextBomb=this.bombShowDelay;},update:function(tdelta){if(this.game.isKeyPressed('F')&&this.isReady()){this.blow();}
if(this.nextBomb===-1||!this.game.sessionManager.isPlaying){return;}
this.nextBomb-=tdelta;if(this.nextBomb<0){this.game.menuManager.showBombMenu();this.nextBomb=-1;this.game.ui.showMessage("BOMB IS READY<br />(lower right corner or F)");}},blow:function(){var message=this.game.ui.showMessage("3...",5000);delay(1000,function(){message.innerHTML="2...";},this);delay(2000,function(){message.innerHTML="1...";},this);delay(3000,function(){message.innerHTML="boom";},this);delay(3000,this.blowStuffUp,this);this.nextBomb=this.bombShowDelay;},blowStuffUp:function(){this.game.bulletManager.updateEnemyIndex();var index=this.game.bulletManager.enemyIndex;for(var i=0,el;(el=index[i])&&i<10;i++){var rect=getRect(el);var center=new Vector(rect.left+rect.width/2,rect.top+rect.height/2);this.game.explosionManager.addExplosion(center,el,MegaParticleExplosion);el.parentNode.removeChild(el);}
this.game.menuManager.hideBombMenu();this.nextBomb=this.bombShowDelay;},isReady:function(){return this.nextBomb===-1;}});var ELEMENTSTHATARENOTTOBEINCLUDED=['BR','SCRIPT','STYLE','TITLE','META','HEAD','OPTION','OPTGROUP','LINK'];var ELEMENTSIZETHRESHOLD=5;var BulletManager=new Class({initialize:function(game){this.game=game;this.lastBlink=0;this.blinkActive=false;this.enemyIndex=[];this.updateDelay=2.5;this.nextUpdate=this.updateDelay;},update:function(tdelta){if(this.game.isKeyPressed('B')){this.blink();}else if(this.blinkActive){this.endBlink();}
this.nextUpdate-=tdelta;if(this.nextUpdate<0){this.updateEnemyIndex();}},blink:function(){if(now()-this.lastBlink>250){for(var i=0,el;el=this.enemyIndex[i];i++){if(!this.blinkActive)
el.style.outline='1px solid red';else
el.style.outline=el.KICKASSOLDBORDER;}
this.blinkActive=!this.blinkActive;this.lastBlink=now();if(!this.blinkActive){this.updateEnemyIndex();}}},endBlink:function(){for(var i=0,el;el=this.enemyIndex[i];i++)
el.style.outline=el.KICKASSOLDBORDER;this.lastBlink=0;this.blinkActive=false;},updateEnemyIndex:function(){var all=document.getElementsByTagName('*');this.enemyIndex=[];for(var i=0,el;el=all[i];i++){if(this.isDestroyable(el)){this.enemyIndex.push(el);el.KICKASSOLDBORDER=el.style.outline||(document.defaultView.getComputedStyle(el,null).outline);}}
this.nextUpdate=this.updateDelay;},isDestroyable:function(element,ignoreSize){if(this.shouldIgnoreElement(element,ignoreSize))
return false;for(var i=0,child;child=element.childNodes[i];i++){if(child.nodeType===1&&ELEMENTSTHATARENOTTOBEINCLUDED.indexOf(child.tagName)===-1&&(child.offsetWidth>=ELEMENTSIZETHRESHOLD&&child.offsetHeight>=ELEMENTSIZETHRESHOLD)&&document.defaultView.getComputedStyle(child,null).visibility!=='hidden'){return false;}}
return true;},isDestroyableFromCollision:function(element){return this.isDestroyable(element,true);},shouldIgnoreElement:function(element,ignoreSize){if(element.nodeType!==1)
return true;if(element==document.documentElement||element==document.body)
return true;if(ELEMENTSTHATARENOTTOBEINCLUDED.indexOf(element.tagName)!==-1)
return true;if(element.style.visibility=='hidden'||element.style.display=='none')
return true;if(typeof element.className=="string"&&element.className.indexOf('KICKASSELEMENT')!=-1)
return true;if(!ignoreSize){if(element.offsetWidth<ELEMENTSIZETHRESHOLD||element.offsetHeight<ELEMENTSIZETHRESHOLD)
return true;}
var rect;if(element.offsetLeft<0||element.offsetTop<0){rect=getRect(element);if(rect.left+rect.width<0||rect.top+rect.height<0)
return true;}
if(!rect)
rect=getRect(element);if(rect.top>=this.game.scrollSize.y)
return true;return false;},destroy:function(){for(var key in this.bullets)if(this.bullets.hasOwnProperty(key))
for(var i=0,bullet;bullet=this.bullets[key][i];i++)
bullet.destroy();this.bullets={};}});var SessionManager=new Class({initialize:function(game){this.game=game;this.isPlaying=false;},update:function(tdelta){if(this.isPlaying&&this.game.bulletManager.enemyIndex.length==0){this.weHaveWon();}},weHaveWon:function(){this.isPlaying=false;this.game.ui.showMessage("You're done!");if(this.game.isCampaign()){this.game.menuManager.showMenu();this.game.menuManager.navigateTo('highscores');}else{this.game.menuManager.showMenu();}
this.game.menuManager.sendMessageToMenu("gameFinished:!");}});
var ExplosionManager=new Class({initialize:function(game){this.game=game;this.explosions=[];},update:function(tdelta){var time=now();for(var i=0,explosion;explosion=this.explosions[i];i++){if(time-explosion.bornAt>(explosion.ttl||500)){explosion.destroy();this.explosions.splice(i,1);continue;}
explosion.update(tdelta);}},addExplosion:function(pos,forElement,explosionClass){explosionClass=explosionClass||ParticleExplosion;var explosion=new explosionClass(pos,forElement);explosion.game=this.game;explosion.checkBounds();this.explosions.push(explosion);if(this.game.audioManager.explosion){this.game.audioManager.explosion.play();}},destroy:function(){for(var i=0,explosion;explosion=this.explosions[i];i++)
explosion.destroy();this.explosions=[];}});var Cannon=new Class({initialize:function(player,game,x,y,angle){this.player=player;this.game=game;this.pos=new Vector(x,y);this.angle=angle||0;},shootPressed:function(){},shootReleased:function(){},checkCollisions:function(){},getExplosionClass:function(){return ParticleExplosion;},update:function(tdelta){this.game.hideAll();this.checkCollisions(tdelta);this.game.showAll();},checkCollision:function(bullet){var hit=bullet.checkCollision();if(!hit)
return false;this.game.explosionManager.addExplosion(bullet.pos,hit,this.getExplosionClass());this.game.menuManager.addPoints(Math.min(hit.getElementsByTagName('*').length+1,100),bullet.pos);if(!hit.isShot){hit.parentNode.removeChild(hit);}
if(this.game.statisticsManager){this.game.statisticsManager.addElementsDestroyed();}
return true;},createBullet:function(bulletClass){var pos=this.getABulletPos();var dir=this.getABulletDir();var bullet=new bulletClass(pos,dir);bullet.game=this.game;bullet.manager=this;bullet.initCanvas();bullet.vel.add(bullet.vel.cp().setLength(this.player.vel.len()));return bullet;},getABulletPos:function(){return this.player.pos.cp().add(this.pos.cp().rotate(this.player.dir.angle()+Math.PI/2));},getABulletDir:function(){return this.player.dir.cp().rotate(this.angle);},destroy:function(){}});var LaserCannon=new Class({Extends:Cannon,initialize:function(player,game,x,y,angle){Cannon.prototype.initialize.apply(this,arguments);this.lasers=[];},getExplosionClass:function(){return SplitExplosion;},update:function(tdelta){if(!this.lasers.length)
return;this.removeOld();Cannon.prototype.update.call(this,tdelta);},checkCollisions:function(tdelta){for(var i=0,laser;laser=this.lasers[i];i++){laser.update(tdelta);if(this.checkCollision(laser)){}}},removeOld:function(){for(var i=0,laser;laser=this.lasers[i];i++){if(laser.outOfBounds){laser.destroy();this.lasers.splice(i,1);}}},shootPressed:function(){if(this.lasers.length>5){return;}
if(now()-this.lastFired<500){return;}
this.lastFired=now();if(this.game.statisticsManager){this.game.statisticsManager.addShotFired();}
this.lasers.push(this.createBullet(LaserBullet));},destroy:function(){if(this.lasers.length){for(var i=0,laser;laser=this.lasers[i];i++){laser.destroy();}
this.lasers=[];}}});var BallCannon=new Class({Extends:Cannon,initialize:function(){Cannon.prototype.initialize.apply(this,arguments);this.lastFired=0;this.bullets=[];},getExplosionClass:function(){return ParticleExplosion;},update:function(tdelta){if(!this.bullets.length){return;}
this.removeOld();Cannon.prototype.update.call(this,tdelta);},removeOld:function(){var time=now();for(var i=0,bullet;bullet=this.bullets[i];i++){if(time-bullet.bornAt>2000){bullet.destroy();this.bullets.splice(i,1);}}},checkCollisions:function(tdelta){for(var i=0,bullet;bullet=this.bullets[i];i++){bullet.update(tdelta);if(this.checkCollision(bullet)){bullet.destroy();this.bullets.splice(i,1);}}},shootPressed:function(){if(now()-this.lastFired<200){return;}
this.lastFired=now();this.addBullet();if(this.game.statisticsManager){this.game.statisticsManager.addShotFired();}},addBullet:function(){if(this.bullets.length>7){this.bullets[0].destroy();this.bullets.shift();}
var bullet=this.createBullet(Bullet);this.bullets.push(bullet);},destroy:function(){for(var i=0,bullet;bullet=this.bullets[i];i++){bullet.destroy();}
this.bullets=[];}});
var Bullet=new Class({initialize:function(pos,dir){this.pos=pos.cp();this.dir=dir;this.vel=new Vector(500,500);this.bornAt=now();},initCanvas:function(){this.sheet=new Sheet(new Rect(this.pos.x,this.pos.y,5,5));this.sheet.drawBullet();},draw:function(){this.sheet.setPosition(this.pos);},update:function(tdelta){this.pos.add(this.vel.setAngle(this.dir.angle()).mulNew(tdelta));this.checkBounds();this.draw();},checkCollision:function(){var element=document.elementFromPoint(this.pos.x,this.pos.y);if(element&&element.nodeType==3)
element=element.parentNode;var didFind=element&&this.game.bulletManager.isDestroyableFromCollision(element)?element:false;return didFind;},checkBounds:function(){var w=this.game.windowSize.width;var h=this.game.windowSize.height;var rightBound=this.pos.x+this.sheet.rect.size.width/2;var bottomBound=this.pos.y+this.sheet.rect.size.height/2;if(rightBound>w)
this.pos.x=0;else if(this.pos.x<0)
this.pos.x=w-this.sheet.rect.size.width/2;if(bottomBound>h)
this.pos.y=0;else if(this.pos.y<0)
this.pos.y=h-this.sheet.rect.size.height/2;},destroy:function(){this.sheet.destroy();}});var LaserBullet=new Class({Extends:Bullet,initialize:function(){Bullet.prototype.initialize.apply(this,arguments);this.vel=new Vector(750,750);this.lastDrawPos=this.pos.cp();},initCanvas:function(){var s=Math.max(GameGlobals.laserImage.width,GameGlobals.laserImage.height);this.sheet=new Sheet(new Rect(0,0,s,s));},update:function(tdelta){Bullet.prototype.update.apply(this,arguments);},draw:function(){this.sheet.drawLaser(this.pos,this.dir);this.lastDrawPos=this.pos.cp();},checkBounds:function(){var w=this.game.windowSize.width;var h=this.game.windowSize.height;var rightBound=this.pos.x+this.sheet.rect.size.width/2;var bottomBound=this.pos.y+this.sheet.rect.size.height/2;if(rightBound>w||this.pos.x<0)
this.outOfBounds=true;if(bottomBound>h||this.pos.y<0)
this.outOfBounds=true;},destroy:function(){this.sheet.destroy();}});GameGlobals.laserImage=document.createElement('img');GameGlobals.laserImage.src=GameGlobals.path('css/gfx/kickass/laser.png');
var Explosion=new Class({initialize:function(pos,element){this.bornAt=now();this.pos=pos.cp();},update:function(tdelta){},checkBounds:function(){},destroy:function(){}});
var ParticleExplosion=new Class({Extends:Explosion,initialize:function(pos,element){Explosion.prototype.initialize.apply(this,arguments);this.particleVel=new Vector(150,0);this.particles=[];this.generateParticles();this.sheet=new Sheet(new Rect(pos.x,pos.y,250,250));},update:function(tdelta){for(var i=0,particle;particle=this.particles[i];i++)
particle.pos.add(particle.vel.mulNew(tdelta).mul(random(0.5,1.0)).setAngle(particle.dir.angle()));this.sheet.clear();this.sheet.drawExplosion(this.particles);},generateParticles:function(){for(var i=0,j=!GameGlobals.hasCanvas?10:40;i<j;i++){this.particles.push({dir:(new Vector(random(0,20)-10,random(0,20)-10)).normalize(),vel:this.particleVel.cp(),pos:new Vector(0,0),color:['yellow','red'][random(0,1)]});}},checkBounds:function(){var right=this.sheet.rect.getRight();var bottom=this.sheet.rect.getBottom();var w=this.game.windowSize.width;var h=this.game.windowSize.height;if(right>w)
this.pos.x-=right-w;if(bottom>h)
this.pos.y-=bottom-h;this.sheet.setPosition(this.pos);},destroy:function(){this.sheet.destroy();}});
var MegaParticleExplosion=new Class({Extends:ParticleExplosion,initialize:function(pos,element){Explosion.prototype.initialize.apply(this,arguments);this.particleVel=new Vector(200,0);this.particles=[];this.generateParticles();this.sheet=new Sheet(new Rect(pos.x,pos.y,500,500));this.ttl=2000;this.generationDelay=0.6;this.generationTimes=2;this.nextGenerate=this.generationDelay;},update:function(tdelta){this.nextGenerate-=tdelta;if(this.nextGenerate<=0&&this.generationTimes>0){this.nextGenerate=this.generationDelay;this.generateParticles();this.generationTimes--;}
ParticleExplosion.prototype.update.call(this,tdelta);}});var SplitExplosion=new Class({Extends:Explosion,initialize:function(pos,element){if(!element)return;Explosion.prototype.initialize.apply(this,arguments);this.element=element;this.fx=new Fx();this.fx.addListener(this);this.start();},update:function(tdelta){if(!this.element)return;this.fx.update();},set:function(key,value){if(key=='opacity'){}},start:function(){var pieces=this.createClones();var left=pieces[0],right=pieces[1];var lT='rotate(-'+random(30,50)+'deg) translate(-100px, 40px)';var rT='rotate('+random(30,50)+'deg) translate(100px, 40px)';setStyles(left,{'transform':lT});setStyles(right,{'transform':rT});this.left=left;this.right=right;this.fx.add('opacity',{start:1,end:0.5,duration:500});},createClones:function(){var coords=getRect(this.element);var leftContainer=this.createContainer(coords);var rightContainer=this.createContainer(coords);var left=cloneElement(this.element);var right=cloneElement(this.element);addClass(left,'KICKASSELEMENT');addClass(right,'KICKASSELEMENT');var styles={margin:0,overflow:'hidden'};setStyles(left,styles);setStyles(right,styles);leftContainer.appendChild(left);rightContainer.appendChild(right);rightContainer.style.left=coords.left+coords.width/2+'px';rightContainer.scrollLeft+=coords.width/2;this.element.style.opacity=0;this.element.style.visibility='hidden';this.element.style.display='none';return each([leftContainer,rightContainer],function(el){el.style.transition='transform 500ms ease-in';});},createContainer:function(coords){var ret=document.createElement('div');setStyles(ret,{position:'absolute',left:coords.left,top:coords.top,width:coords.width*0.5,height:coords.height,overflow:'hidden'});getAppContainerElement().appendChild(ret);return ret;},destroy:function(){try{this.left.parentNode.removeChild(this.left);this.right.parentNode.removeChild(this.right);this.element.parentNode.removeChild(this.element);}catch(e){}}});var Weapons={1:{name:'Cannon',id:'cannon',cannonClass:BallCannon},2:{name:'Laser',id:'laser',cannonClass:LaserCannon}};var WeaponMap={'cannon':Weapons[1],'laser':Weapons[2]};
var SheetCanvas=new Class({initialize:function(rect){this.canvas=document.createElement('canvas');this.canvas.className='KICKASSELEMENT';with(this.canvas.style){position='absolute';zIndex='1000000';}
GameGlobals.kickass.registerElement(this.canvas);if(this.canvas.getContext)
this.ctx=this.canvas.getContext('2d');this.rect=rect;this.angle=0;this.updateCanvas();getAppContainerElement().appendChild(this.canvas);},tracePoly:function(verts){if(!verts[0])return;this.ctx.save();this.ctx.translate(this.rect.size.width/2,this.rect.size.height/2);this.ctx.rotate(this.angle);this.ctx.beginPath();this.ctx.moveTo(verts[0].x,verts[0].y);for(var i=0;i<verts.length;i++){this.ctx.lineTo(verts[i].x,verts[i].y);}
this.ctx.restore();},setAngle:function(angle){this.angle=angle;},updateCanvas:function(){if(this.canvas.width!=this.rect.size.width)
this.canvas.width=this.rect.size.width;if(this.canvas.height!=this.rect.size.height)
this.canvas.height=this.rect.size.height;this.canvas.style.left=GameGlobals.kickass.scrollPos.x+(this.rect.pos.x-this.rect.size.width/2)+'px';this.canvas.style.top=GameGlobals.kickass.scrollPos.y+(this.rect.pos.y-this.rect.size.height/2)+'px';},drawLine:function(xFrom,yFrom,xTo,yTo){this.ctx.save();this.ctx.translate(this.rect.size.width/2,this.rect.size.height/2);this.ctx.beginPath();this.ctx.moveTo(xFrom,yFrom);this.ctx.lineTo(xTo,yTo);this.ctx.closePath();this.ctx.stroke();this.ctx.restore();},drawCircle:function(radius,pos){pos=pos||{x:0,y:0};this.ctx.save();this.ctx.translate(this.rect.size.width/2,this.rect.size.height/2);if(pos)
this.ctx.translate(pos.x,pos.y);this.ctx.beginPath();this.ctx.arc(0,0,radius,0,Math.PI*2,true);this.ctx.fill();this.ctx.closePath();this.ctx.restore();},drawRect:function(x,y,w,h){this.ctx.save();this.ctx.translate(this.rect.size.width/2,this.rect.size.height/2);this.ctx.translate(x,y);this.ctx.fillRect(x,y,w,h);this.ctx.restore();this.ctx.fill();},drawImageFull:function(image){this.ctx.drawImage(image,0,0,this.rect.size.width,this.rect.size.height);},drawImage:function(image,x,y){this.ctx.save();this.ctx.translate(this.rect.size.width/2+x,this.rect.size.height/2+y);this.ctx.rotate(this.angle);this.ctx.drawImage(image,0,-11);this.ctx.restore();},setFillColor:function(color){this.ctx.fillStyle=color;},setStrokeColor:function(color){this.ctx.strokeStyle=color;},setLineWidth:function(width){this.ctx.lineWidth=width;},fillPath:function(){this.ctx.fill();},strokePath:function(){this.ctx.stroke();},clear:function(){this.ctx.clearRect(0,0,this.rect.size.width,this.rect.size.height);},destroy:function(){GameGlobals.kickass.unregisterElement(this.canvas);this.canvas.parentNode.removeChild(this.canvas);}});
var Sheet=new Class({initialize:function(rect){this.rect=rect;this.drawer=new SheetCanvas(rect);},clear:function(){this.drawer.clear();},setPosition:function(pos){this.rect.pos=pos.cp();this.drawer.rect=this.rect;this.drawer.updateCanvas();},setAngle:function(angle){this.drawer.setAngle(angle);},drawPlayer:function(verts){this.drawer.setFillColor('white');this.drawer.setStrokeColor('black');this.drawer.setLineWidth(1.5);this.drawer.tracePoly(verts);this.drawer.fillPath();this.drawer.tracePoly(verts);this.drawer.strokePath();},drawBrokenPlayer:function(verts,lineOffsets){this.drawer.setStrokeColor('black');this.drawer.setLineWidth(1.5);for(var i=1,vert,lastVert=verts[0];vert=verts[i];i++,lastVert=vert){var o=lineOffsets[i-1];this.drawer.drawLine(lastVert.x+o.pos.x,lastVert.x+o.pos.y,vert.x+o.pos.x,vert.y+o.pos.y);}},drawFlames:function(flames,angle){this.drawer.setLineWidth(1.5);this.drawer.setFillColor('red');this.drawer.tracePoly(flames.r);this.drawer.fillPath();this.drawer.setFillColor('yellow');this.drawer.tracePoly(flames.y);this.drawer.fillPath();},drawBullet:function(){this.drawer.setFillColor(GameGlobals.bulletColor);this.drawer.drawCircle(2.5);},drawExplosion:function(particles){for(var i=0,particle;particle=particles[i];i++){this.drawer.setFillColor(particle.color);this.drawer.drawRect(particle.pos.x,particle.pos.y,3,3);}},drawFace:function(face){this.drawer.drawImageFull(face);},drawLaser:function(pos,dir){this.clear();this.setPosition(pos);this.drawer.setAngle(dir.angle());this.drawer.drawImage(GameGlobals.laserImage,0,0);},transformToSheetCoordinates:function(vec){var ret=vec.cp().sub(new Vector(this.rect.size.width/2,this.rect.size.height/2));return ret;},destroy:function(){this.drawer.destroy();}});var namespace = getGlobalNamespace();
var initKickAss = function() {
// If an instance of KickAss is already present, we add a player
if (!namespace.KICKASSGAME) {
if (namespace.KICKASS_SITE_KEY) {
var mySite = new MySite(namespace.KICKASS_SITE_KEY);
mySite.load(function(ok) {
namespace.KICKASSGAME = GameGlobals.kickass = new KickAss({
mySite: ok ? mySite : false
});
namespace.KICKASSGAME.begin();
});
} else {
namespace.KICKASSGAME = GameGlobals.kickass = new KickAss();
namespace.KICKASSGAME.begin();
}
} else {
namespace.KICKASSGAME.addPlayer();
}
};
if (namespace.LAZYLOAD_KICKASS) {
window.startBrowserBlaster = initKickAss;
} else {
initKickAss();
}
function getAppContainerElement() {
if (namespace.KICKASS_CONTAINER_ELEMENT) {
return document.getElementById(namespace.KICKASS_CONTAINER_ELEMENT);
} else {
return document.body;
}
}
})(typeof exports != 'undefined' ? exports : window);