game.js 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114
  1. /*
  2. HyperGunner
  3. An HTML5 game by Mark Wilcox
  4. (C) Mark Wilcox
  5. */
  6. var GAMETITLE = "HYPERGUNNER";
  7. var SCOREFONT = "Arial, Sans-Serif";
  8. var IPHONEHACK = true;
  9. var ISPORTRAIT = true;
  10. /*
  11. -- AJAX ----------------------------------------------------------------------------
  12. */
  13. var AJAX = {
  14. "user" : "mark",
  15. "pass" : "",
  16. "gameId" : "",
  17. "playerId" : "",
  18. "ts" : "",
  19. "score" : "",
  20. "url" : "senddata.php"
  21. };
  22. function getData()
  23. {
  24. AJAX.gameId = "";
  25. AJAX.playerId = "";
  26. g.displayBanner = 0;
  27. g.qs = window.location.search.substring(1).split("&");
  28. for (var a=0;a < g.qs.length;a++)
  29. {
  30. var s = g.qs[a].split("=");
  31. write(s[0] + " = " + s[1]);
  32. switch(s[0])
  33. {
  34. case "banner":
  35. g.displayBanner = s[1];
  36. break;
  37. case "gameId":
  38. AJAX.gameId = s[1];
  39. break;
  40. case "playerId":
  41. AJAX.playerId = s[1];
  42. break;
  43. }
  44. }
  45. };
  46. function postData()
  47. {
  48. AJAX.ts = g.time;
  49. AJAX.score = m.player.score;
  50. $.ajax({
  51. url: AJAX.url,
  52. type: "get",
  53. data: "user=" + AJAX.user + "&pass=" + AJAX.pass + "&gameId=" + AJAX.gameId + "&playerId=" + AJAX.playerId + "&ts=" + AJAX.ts + "&score=" + AJAX.score,
  54. success: function(msg){
  55. write("Data Sent Successfully !");
  56. },
  57. error: function(jqXHR, textStatus, errorThrown) {
  58. write("Send error: " + jqXHR);
  59. write("Send error (" + textStatus + "): " + errorThrown);
  60. }
  61. });
  62. write("SENT user = " + AJAX.user);
  63. write("SENT pass = " + AJAX.pass);
  64. write("SENT gameId = " + AJAX.gameId);
  65. write("SENT playerId = " + AJAX.playerId);
  66. write("SENT ts = " + AJAX.ts);
  67. write("SENT score = " + AJAX.score);
  68. };
  69. /*
  70. ------------------------------------------------------------------------------------
  71. */
  72. var g = {}; // Define the global namespace.
  73. g.characterset = new Image(); g.characterset.src = "library/characterset.gif";
  74. var m = { // Game media namespace.
  75. spritesheets : [],
  76. player : null,
  77. monster : [],
  78. numbers : null,
  79. explosion : [],
  80. playermissile : [],
  81. spark : [],
  82. entity : [],
  83. alienbomb : []
  84. };
  85. var stars = [];
  86. var gameaudio = [];
  87. g.checkSum = gamedata.imageFiles.length; // + gamedata.audioFiles.length;
  88. g.checkCount = 1;
  89. g.imageData = [];
  90. g.audioData = [];
  91. g.colours = [];
  92. g.colours[0] = "#bf0000";
  93. g.colours[1] = "#4386d0";
  94. g.colours[2] = "#28d98c";
  95. g.colours[3] = "#3de231";
  96. g.colours[4] = "#d8e231";
  97. g.colours[5] = "#feba4f";
  98. g.colours[6] = "#fe5b4f";
  99. g.colours[7] = "#fe4fd7";
  100. g.colours[8] = "#ca4ffe";
  101. function createStars()
  102. {
  103. for (var a=0;a<20;a++)
  104. {
  105. stars[a] = new star("star"+a, rnd(g.canvaswidth), rnd(g.canvasheight), 4, rnd(4)+1, 4, g.colours[rnd(g.colours.length)-1]);
  106. }
  107. };
  108. function createSprites()
  109. {
  110. // Load game media
  111. for (var a=0;a<imglib.length;a++)
  112. {
  113. m.spritesheets[imglib[a].sheetname] = new spritesheet(imglib[a]);
  114. }
  115. g.titlescreen = new Image(); g.titlescreen.src = "library/titlescreen.png";
  116. g.gamebackdrops = [];
  117. g.gamebackdrops[0] = new Image(); g.gamebackdrops[0].src = "library/gamebackdrop.gif";
  118. g.gamebackdrops[1] = new Image(); g.gamebackdrops[1].src = "library/earth.gif";
  119. g.playericon = new Image(); g.playericon.src = "library/playericon.png";
  120. g.staricon = new Image(); g.staricon.src = "library/staricon.png";
  121. g.gameover = new Image(); g.gameover.src = "library/gameover.png";
  122. g.levelicon = new Image(); g.levelicon.src = "library/level.png";
  123. g.hiscore = new Image(); g.hiscore.src = "library/hiscore.png";
  124. g.levelcomplete = new Image(); g.levelcomplete.src = "library/levelcomplete.png";
  125. g.playpause = new Image(); g.playpause.src = "library/playpause.png";
  126. g.pregame = new Image(); g.pregame.src = "library/pregame.png";
  127. g.notportrait = new Image(); g.notportrait.src = "library/notportrait.png";
  128. g.volumecontrol = new Image(); g.volumecontrol.src = "library/volumecontrols.png";
  129. g.levelflag = new Image(); g.levelflag.src = "library/levelflag.png";
  130. g.splash = new Image(); g.splash.src = "library/splash.png";
  131. m.player = new sprite("player", "player", m.spritesheets["playersheet"], 0, 0, 8, 4, 1);
  132. m.player.hiscore = 0;
  133. m.starfighter = new sprite("starfighter", "starfighter", m.spritesheets["starfightersheet"], 0, 0, 1, 4, 1);
  134. m.numbers = new sprite("numbers", "numbers", m.spritesheets["numberssheet"], 0, 0, 0, 0, 1);
  135. for (var a=0;a<8;a++) m.alienbomb[a] = new sprite("alienbomb"+a, "alienbomb", m.spritesheets["alienbombsheet"], 0, 0, 2, 0, 0);
  136. for (var a=0;a<48;a++) m.monster[a] = new sprite("monster"+a, "monster", m.spritesheets["monstersheet"], 0, 0, 2, 0, 0);
  137. for (var a=0;a<16;a++) m.explosion[a] = new sprite("explosion"+a, "explosion", m.spritesheets["explosionsheet"], 0, 0, 2, 0, 0);
  138. for (var a=0;a<8;a++) m.entity[a] = new sprite("entity"+a, "entity", m.spritesheets["entitysheet"], 0, 0, 0, 0, 0);
  139. for (var a=0;a<96;a++) m.spark[a] = new sprite("spark"+a, "spark", m.spritesheets["sparksheet"], 0, 0, 2, 0, 0);
  140. for (var a=0;a<32;a++) m.playermissile[a] = new sprite("playermissile"+a, "playermissile", m.spritesheets["playermissilesheet"], 0, 0, 8, 0, 0);
  141. initTouch();
  142. initHiScore();
  143. setSplash();
  144. g.ticker = setTimeout("loop()", 0);
  145. };
  146. function rnd(threshold)
  147. {
  148. return Math.floor(Math.random()*threshold) + 1;
  149. };
  150. function preCache() {
  151. for (var a=0;a<gamedata.imageFiles.length;a++)
  152. {
  153. g.imageData[a] = new Image();
  154. g.imageData[a].src = gamedata.imageFiles[a];
  155. //write(a + " " + gamedata.imageFiles[a] + " of " + g.checkSum);
  156. g.imageData[a].onload = check;
  157. }
  158. /*soundManager.url = 'soundmanager2.swf';
  159. soundManager.useHTML5Audio = true;
  160. soundManager.onready(function() {
  161. soundManager.defaultOptions.autoLoad = true;
  162. soundManager.defaultOptions.onload = check;
  163. if (soundManager.supported()) {
  164. soundManager.debugMode = false;
  165. for (var a=0;a<gamedata.audioFiles.length;a++)
  166. {
  167. gameaudio[gamedata.audioFiles[a].name] = soundManager.createSound(
  168. {
  169. id:gamedata.audioFiles[a].name,
  170. url:gamedata.audioFiles[a].path,
  171. volume:gamedata.audioFiles[a].volume,
  172. onfinish: gamedata.audioFiles[a].repeat ? function(){ this.play(); } : null
  173. }
  174. );
  175. }
  176. }
  177. }
  178. );*/
  179. };
  180. function check() {
  181. g.checkCount ++;
  182. var pc = Math.round((g.checkCount / g.checkSum) * 100);
  183. var bar = Math.round(g.canvaswidth * (pc / 100));
  184. g.ctx.clearRect(160,150,32,16);
  185. g.ctx.fillStyle = "rgb(16,16,16)";
  186. g.ctx.fillRect(0,200,g.canvaswidth,16);
  187. g.ctx.fillStyle = "rgb(80,80,80)";
  188. g.ctx.fillRect(0,200,bar,16);
  189. if (g.checkCount >= g.checkSum)
  190. {
  191. createSprites();
  192. }
  193. };
  194. function init()
  195. {
  196. try
  197. {
  198. g.canvas = document.querySelector('canvas');
  199. g.ctx = g.canvas.getContext('2d');
  200. g.canvas.setAttribute('class', 'canvas');
  201. g.banad = document.getElementById("banad");
  202. g.canvaswidth = 320;
  203. g.canvasheight = 460;
  204. g.canvaspadding = 32;
  205. g.ori = 0;
  206. setResolution();
  207. setCanvasDimensions();
  208. g.canvas.style.backgroundColor = "#142760";
  209. g.nextthink = 0;
  210. g.console = document.getElementById('console');
  211. g.console.style.display = 'none';
  212. g.console.style.textAlign = 'left';
  213. write("Console ready.");
  214. BrowserDetect.init();
  215. write("Browser: " + BrowserDetect.browser + " " + BrowserDetect.version);
  216. write("OS: " + BrowserDetect.OS);
  217. write("Language: " + BrowserDetect.Language);
  218. var br = new String(BrowserDetect.OS);
  219. g.framedelay = 30;
  220. g.ISIPHONE = false;
  221. if (br.indexOf("iPhone") != -1)
  222. {
  223. //if (IPHONEHACK) { g.framedelay = 0; }
  224. g.ISIPHONE = true;
  225. }
  226. g.thousandseparator = textformat.thousandseparator;
  227. g.banad.style.display = "none";
  228. pickAdURL();
  229. g.pausemode = 0;
  230. g.audiomode = 1;
  231. window.scrollTo(0,0)
  232. preCache();
  233. }
  234. catch (e)
  235. {
  236. write("!!"+e.message);
  237. }
  238. };
  239. function setResolution()
  240. {
  241. var w = 0;
  242. var h = 0;
  243. if(document.all){
  244. h = document.body.offsetHeight;
  245. w = document.body.offsetWidth;
  246. }
  247. else
  248. {
  249. h = innerHeight;
  250. w = innerWidth;
  251. }
  252. g.canvaswidth = 320;
  253. g.canvasheight = 480;
  254. /*
  255. // force resolution on larger devices
  256. if (w > 640)
  257. {
  258. var pc = (h / w);
  259. w = 640;
  260. h = Math.round(w * pc);
  261. }
  262. // avoid splitting integers
  263. if (w % 2 > 0) w ++;
  264. if (h % 2 > 0) h ++;
  265. if (ISPORTRAIT)
  266. {
  267. if (w > h)
  268. {
  269. g.canvaswidth = h;
  270. g.canvasheight = w;
  271. } else {
  272. g.canvaswidth = w;
  273. g.canvasheight = h;
  274. }
  275. } else {
  276. if (h > w)
  277. {
  278. g.canvaswidth = h;
  279. g.canvasheight = w;
  280. } else {
  281. g.canvaswidth = w;
  282. g.canvasheight = h;
  283. }
  284. }
  285. */
  286. };
  287. function setCanvasDimensions(e)
  288. {
  289. g.canvaspadding = 32;
  290. g.displaypadding = 0;
  291. if (typeof(window.orientation)!="undefined")
  292. {
  293. g.ori = window.orientation; // 0, -90 or 90
  294. }
  295. g.canvas.width = g.canvaswidth;
  296. g.canvas.height = g.canvasheight;
  297. g.textcentre = g.canvaswidth / 2;
  298. g.canvascentre = g.canvasheight / 2;
  299. window.scrollTo(0,1);
  300. };
  301. function initTouch()
  302. {
  303. if(checkForTouch()) {
  304. if (document.body.addEventListener)
  305. {
  306. document.body.addEventListener('touchmove', touchMove, false);
  307. document.body.addEventListener('touchstart', touchStart, false);
  308. } else {
  309. window.addEventListener('touchmove', touchMove, false);
  310. window.addEventListener('touchstart', touchStart, false);
  311. }
  312. } else {
  313. window.addEventListener('mousemove', mouseMove, false);
  314. window.addEventListener('mouseup', mouseUp, false);
  315. }
  316. };
  317. function initHiScore()
  318. {
  319. m.player.hiscore = 0;
  320. if (typeof localStorage.key == "function")
  321. {
  322. if (localStorage.getItem(GAMETITLE + "-hiscore") != null)
  323. {
  324. m.player.hiscore = localStorage.getItem(GAMETITLE + "-hiscore");
  325. }
  326. }
  327. };
  328. function sfx(o)
  329. {
  330. return;
  331. if (g.audiomode > 0)
  332. {
  333. o.play();
  334. }
  335. };
  336. function handleAudio()
  337. {
  338. if (g.audiomode < 1)
  339. {
  340. soundManager.pauseAll();
  341. } else {
  342. soundManager.resumeAll();
  343. }
  344. };
  345. function checkForTouch() {
  346. var d = document.createElement("div");
  347. d.setAttribute("ontouchmove", "return;");
  348. return typeof d.ontouchmove == "function" ? true : false;
  349. };
  350. function touch(event) {
  351. if (g.mode == "title" && g.resetting < 70) setGame();
  352. if (g.mode == "pregame") { setLevel(); g.mode = "levelup"; }
  353. var o = m.player;
  354. var tx = (event.pageX - (g.canvas.offsetParent ? g.canvas.parentNode.offsetLeft : 0)) - (o.w / 2);
  355. var ty = (event.pageY - (g.canvas.offsetParent ? g.canvas.parentNode.offsetTop : 0)) - (o.h / 2);
  356. if (g.pausemode < 1)
  357. {
  358. o.x = tx;
  359. }
  360. if (tx < 32 && ty < 32) g.pausemode ++; if (g.pausemode > 1) g.pausemode = 0;
  361. //if (tx < 72 && (ty > 96 && ty < 140))
  362. //{
  363. // g.audiomode ++; if (g.audiomode > 1) g.audiomode = 0;
  364. // handleAudio();
  365. //}
  366. };
  367. function touchStart(event) {
  368. touch(event.touches[0]);
  369. window.scrollTo(0, 1);
  370. spawnLaser(m.player);
  371. event.preventDefault();
  372. };
  373. function touchMove(event) {
  374. touch(event.touches[0]);
  375. spawnLaser(m.player);
  376. };
  377. function mouseMove(event) {
  378. touch(event);
  379. spawnLaser(m.player);
  380. };
  381. function mouseUp(event) {
  382. spawnLaser(m.player);
  383. };
  384. function setSplash()
  385. {
  386. g.mode = "splash";
  387. g.resetting = 100;
  388. g.banad.style.display = "none";
  389. };
  390. function setTitle()
  391. {
  392. g.mode = "title";
  393. g.resetting = 80;
  394. g.canvas.style.backgroundImage = "none";
  395. g.canvas.style.backgroundColor = "#142760";
  396. g.banad.style.display = "block";
  397. };
  398. function setGame()
  399. {
  400. g.banad.style.display = "none";
  401. g.mode = "pregame";
  402. g.canvas.style.backgroundImage = "none";
  403. g.canvas.style.backgroundColor = "#142760";
  404. g.time = new Date();
  405. m.player.score = 0;
  406. m.player.targetscore = 0;
  407. m.player.lives = 3;
  408. m.player.gunmode = 0;
  409. g.level = 1;
  410. g.levelwave = 0;
  411. g.wavetype = 0;
  412. g.resetting = 1000;
  413. g.levelwavemultiplier = 2;
  414. g.warplength = 200;
  415. g.saucermode = 0;
  416. m.player.energy = 0;
  417. m.player.milestohome = 20000000000;
  418. m.player.totalstars = 0;
  419. createStars();
  420. g.extralife = 0;
  421. sfx(gameaudio["titlemusic"]);
  422. };
  423. function endGame()
  424. {
  425. g.mode = "endgame";
  426. m.starfighter.x = (g.canvaswidth / 2) - (m.starfighter.w / 2);
  427. m.starfighter.y = -28;
  428. m.starfighter.row = 0;
  429. };
  430. function finallyHome()
  431. {
  432. g.canvas.style.backgroundImage = "url('" + g.gamebackdrops[1].src + "')";
  433. g.canvas.style.backgroundRepeat = "no-repeat";
  434. g.canvas.style.backgroundColor = "#00cc00";
  435. g.mode = "finallyhome";
  436. m.starfighter.x = (g.canvaswidth / 2) - (m.starfighter.w / 2) - 32;
  437. m.starfighter.y = -28;
  438. m.starfighter.row = 1;
  439. wipe(true);
  440. };
  441. function setStars()
  442. {
  443. for (var a=0;a<stars.length;a++)
  444. {
  445. stars[a].x = rnd(g.canvaswidth);
  446. stars[a].y = rnd(g.canvasheight);
  447. stars[a].speed = stars[a].basespeed;
  448. }
  449. };
  450. function setLevel()
  451. {
  452. g.mode = "levelup";
  453. g.miles = thousandSeparator(m.player.milestohome, g.thousandseparator);
  454. wipe(true);
  455. g.resetting = 100;
  456. g.levelwave = 0;
  457. setStars();
  458. m.player.scoremultiplier = 1;
  459. playerStart();
  460. };
  461. function setLandscape()
  462. {
  463. g.oldmode = g.mode;
  464. g.mode = "landscape";
  465. };
  466. function playerStart()
  467. {
  468. if (g.level < 2)
  469. {
  470. m.player.x = g.canvaswidth / 2 - (m.player.w / 2);
  471. m.player.y = g.canvasheight - 102;
  472. m.player.basex = m.player.x;
  473. m.player.basey = m.player.y;
  474. m.player.targetx = m.player.x;
  475. m.player.targety = m.player.y;
  476. }
  477. m.player.health = 100;
  478. m.player.stars = 0;
  479. m.player.magicpower = 0;
  480. m.player.row = 0;
  481. m.player.lasercooldown = 0;
  482. m.player.lasercooldownmax = 5;
  483. m.player.aliencount = 0;
  484. m.player.speed = 8;
  485. g.saucermode = 0;
  486. g.hyperdrive = 0;
  487. };
  488. function setAliens()
  489. {
  490. var aa = [];
  491. var l = (g.level > leveldata.length) ? 0 : g.level-1;
  492. aa = leveldata[l].aliens.split(",");
  493. var c = 0;
  494. m.player.aliencount = 0;
  495. g.levelaliens = 0;
  496. if (g.wavetype != 0)
  497. {
  498. for (var row=0;row<2;row++)
  499. {
  500. for (var a=0;a<4;a++)
  501. {
  502. var x = ((g.canvaswidth / 2) - 80) + (a * 40);
  503. var y = 128 + (row * 40);
  504. var d = 0;
  505. switch (g.wavetype)
  506. {
  507. case 1:
  508. d = (row == 0) ? 0 : (a < 2) ? 5 : 3;
  509. break;
  510. case 2:
  511. case 5:
  512. d = (row == 0) ? ((a < 2) ? 7 : 1) : (a < 2) ? 5 : 3;
  513. break;
  514. case 3:
  515. case 6:
  516. d = (row == 0) ? ((a < 2) ? 5 : 3) : (a < 2) ? 7 : 1;
  517. break;
  518. case 4:
  519. d = (row == 0) ? 2 : 6;
  520. break;
  521. }
  522. var s = 2;
  523. var f = 0;
  524. var ty = -1;
  525. var hp = g.level;
  526. spawnMonster(x,y,d,s,f,1,rnd(5)+1,hp);
  527. c ++;
  528. g.levelaliens ++;
  529. }
  530. }
  531. sfx(gameaudio["regen"]);
  532. } else {
  533. for (var a=0;a < 16;a++)
  534. {
  535. var x = g.canvaswidth / 2;
  536. var y = (a * 64) * -1;
  537. var d = 4;
  538. var s = 4;
  539. var f = 0;
  540. var ty = 1;
  541. var hp = 2;
  542. spawnMonster(x,y,d,s,f,1,rnd(5),hp);
  543. c ++;
  544. g.levelaliens ++;
  545. }
  546. }
  547. g.wavetype ++; if (g.wavetype > 6) g.wavetype = 0;
  548. };
  549. function wipe(doentities)
  550. {
  551. for (var a=0;a<m.explosion.length;a++) m.explosion[a].visible = false;
  552. for (var a=0;a<m.monster.length;a++) m.monster[a].visible = false;
  553. for (var a=0;a<m.alienbomb.length;a++) m.alienbomb[a].visible = false;
  554. for (var a=0;a<m.playermissile.length;a++) m.playermissile[a].visible = false;
  555. if (doentities) for (var a=0;a<m.entity.length;a++) { if (m.entity[a].row == 0) { m.entity[a].visible = false; m.entity[a].x = -32; m.entity[a].y = -32; sparkShower(m.entity[a]); } }
  556. };
  557. function playerDeath()
  558. {
  559. m.player.dying = 40;
  560. g.wavetype --;
  561. m.player.gunmode = 0;
  562. m.player.lives --;
  563. m.player.energy = 0;
  564. };
  565. /* -- Game control routines -- */
  566. function drawPlayer(o)
  567. {
  568. if (!o.visible) return;
  569. if (o.magicpower > 0) { o.magicpower --; } else { o.row = 0; }
  570. try
  571. {
  572. if (isNaN(o.attacking)) o.attacking = 0;
  573. if (o.attacking > 0)
  574. {
  575. o.attacking --;
  576. o.frame = o.spritesheet.attackframe;
  577. } else {
  578. g.ctx.save();
  579. if (o.dying > 0)
  580. {
  581. o.angle += 45; if (o.angle > 360) o.angle = 0;
  582. g.ctx.translate(o.x + (o.w/2),o.y + (o.h/2));
  583. spawnExplosion(o,1,rnd(3));
  584. g.ctx.rotate(o.angle * (Math.PI / 180));
  585. g.ctx.drawImage(o.spritesheet.image, o.frame * o.spritesheet.framewidth, 0, o.w, o.h, -o.w/2, -o.h/2, o.w, o.h);
  586. o.dying --;
  587. if (o.dying < 1)
  588. {
  589. if (m.player.lives < 1)
  590. {
  591. g.mode = "gameover";
  592. g.miles = thousandSeparator(m.player.milestohome, g.thousandseparator)
  593. g.resetting = 100;
  594. g.banad.style.display = "block";
  595. g.time = new Date() - g.time;
  596. } else {
  597. setLevel();
  598. }
  599. }
  600. } else {
  601. if (o.targetx < 0 && o.targety < 0) getDirection(o);
  602. if (isNaN(o.frame)) o.frame = o.startframe;
  603. o.framedelay --;
  604. if (o.framedelay < 0)
  605. {
  606. o.framedelay = o.framedelaymax;
  607. o.frame ++;
  608. if (o.frame >= (o.startframe + o.spritesheet.framesperdirection))
  609. {
  610. o.frame = o.startframe;
  611. }
  612. if (o.magicpower > 0 && o.magicpower < 50)
  613. {
  614. o.row ++; if (o.row > 1) o.row = 0;
  615. }
  616. }
  617. if (o.inpain > 0) { o.frame = o.spritesheet.painframe; o.inpain --; }
  618. g.ctx.drawImage(o.spritesheet.image, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h);
  619. }
  620. g.ctx.restore();
  621. }
  622. }
  623. catch (e)
  624. {
  625. write(o.frame + " - " + e.message);
  626. }
  627. };
  628. function draw(o)
  629. {
  630. if (!o.visible) return;
  631. try
  632. {
  633. if (o.decay > 0) { o.decay --; if (o.decay < 1) { remove(o); sparkShower(o); } }
  634. if (isNaN(o.attacking)) o.attacking = 0;
  635. if (o.attacking > 0)
  636. {
  637. o.attacking --;
  638. o.frame = o.spritesheet.attackframe;
  639. } else {
  640. if (isNaN(o.frame)) o.frame = o.startframe;
  641. o.framedelay --;
  642. if (o.framedelay < 0)
  643. {
  644. o.framedelay = o.framedelaymax;
  645. o.frame ++;
  646. if (o.frame >= (o.startframe + o.spritesheet.framesperdirection))
  647. {
  648. if (o.spritesheet.type == "explosion")
  649. {
  650. remove(o);
  651. } else {
  652. o.frame = o.startframe;
  653. }
  654. }
  655. }
  656. }
  657. if (o.inpain > 0)
  658. {
  659. o.frame = o.spritesheet.painframe;
  660. o.inpain --;
  661. o.y += 4;
  662. }
  663. if (o.spritesheet.type == "playermissile")
  664. {
  665. o.row = Math.round(m.player.gunmode);
  666. if (g.hyperdrive > 0) o.row = 5;
  667. }
  668. if (o.decay > 0 && o.decay < 50)
  669. {
  670. o.toggle ++; if (o.toggle > 1) o.toggle = 0;
  671. if (o.toggle < 1)
  672. {
  673. g.ctx.drawImage(o.spritesheet.image, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h);
  674. }
  675. } else {
  676. g.ctx.drawImage(o.spritesheet.image, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h);
  677. }
  678. }
  679. catch (e)
  680. {
  681. write(o.row + " - " + o.spritesheet.type + ", " + o.frame + " - " + e.message);
  682. }
  683. };
  684. function drawStar(o)
  685. {
  686. try
  687. {
  688. g.ctx.fillStyle = o.colour;
  689. if (g.mode == "game")
  690. {
  691. o.size = g.hyperdrive > 0 ? o.basesize * 4 : o.basesize;
  692. } else if (g.mode == "endlevel")
  693. {
  694. if (g.resetting <= (g.warplength / 2))
  695. {
  696. o.size -= 0.5;
  697. } else {
  698. o.size += 0.5;
  699. }
  700. } else if (g.mode == "endgame")
  701. {
  702. g.ctx.fillStyle = rnd(10) < 5 ? "#4362b2" : "#365298";
  703. o.size = 64;
  704. o.direction = 0;
  705. }
  706. g.ctx.fillRect(o.x,o.y,2,o.size);
  707. }
  708. catch (e)
  709. {
  710. write(o.id);
  711. }
  712. };
  713. function moveStar(o)
  714. {
  715. if (g.mode == "game")
  716. {
  717. o.speed = g.hyperdrive > 0 ? o.basespeed * 8 : o.basespeed;
  718. } else if (g.mode == "endlevel")
  719. {
  720. if (g.resetting <= (g.warplength / 2))
  721. {
  722. o.speed -= 0.5;
  723. } else {
  724. o.speed += 0.5;
  725. }
  726. } else if (g.mode == "endgame")
  727. {
  728. o.speed = o.basespeed + 16;
  729. }
  730. switch (o.direction)
  731. {
  732. case 0:
  733. o.y -= o.speed;
  734. break;
  735. case 1:
  736. o.y -= (o.speed / 1.5);
  737. o.x += (o.speed / 1.5);
  738. break;
  739. case 2:
  740. o.x += o.speed;
  741. break;
  742. case 3:
  743. o.y += (o.speed / 1.5);
  744. o.x += (o.speed / 1.5);
  745. break;
  746. case 4:
  747. o.y += o.speed;
  748. break;
  749. case 5:
  750. o.y += (o.speed / 1.5);
  751. o.x -= (o.speed / 1.5);
  752. break;
  753. case 6:
  754. o.x -= o.speed;
  755. break;
  756. case 7:
  757. o.y -= (o.speed / 1.5);
  758. o.x -= (o.speed / 1.5);
  759. break;
  760. }
  761. if ((o.x + o.w) < 0) o.x = o.canvaswidth;
  762. if (o.x > g.canvaswidth) o.x = (o.size * -1);
  763. if ((o.y + o.size) < 0) o.y = g.canvasheight;
  764. if (o.y > g.canvasheight) o.y = o.size * -1;
  765. };
  766. function getDirection(o)
  767. {
  768. o.direction = -1;
  769. if (o.moveup)
  770. {
  771. o.direction = 0; o.angle = 0;
  772. if (o.moveleft) { o.direction = 7; o.angle = 315; }
  773. if (o.moveright) { o.direction = 1; o.angle = 45; }
  774. }
  775. if (o.movedown)
  776. {
  777. o.direction = 4; o.angle = 180;
  778. if (o.moveleft) { o.direction = 5; o.angle = 225; }
  779. if (o.moveright) { o.direction = 3; o.angle = 135; }
  780. }
  781. if (o.moveleft)
  782. {
  783. o.direction = 6; o.angle = 270;
  784. if (o.moveup) { o.direction = 7; o.angle = 315; }
  785. if (o.movedown) { o.direction = 5; o.angle = 225; }
  786. }
  787. if (o.moveright)
  788. {
  789. o.direction = 2; o.angle = 90;
  790. if (o.moveup) { o.direction = 1; o.angle = 45; }
  791. if (o.movedown) { o.direction = 3; o.angle = 135; }
  792. }
  793. if (o.direction >= 0) o.lastdirection = o.direction;
  794. };
  795. function movePlayer(o)
  796. {
  797. if (!o.visible || g.pausemode > 0) return;
  798. o.oldx = o.x;
  799. o.oldy = o.y;
  800. if (o.moveleft)
  801. {
  802. o.direction = 6;
  803. } else if (o.moveright)
  804. {
  805. o.direction = 2;
  806. } else {
  807. o.direction = -1;
  808. }
  809. switch (o.direction)
  810. {
  811. case 2:
  812. o.x += o.speed;
  813. break;
  814. case 6:
  815. o.x -= o.speed;
  816. break;
  817. }
  818. if (o.x < 0) { o.x = o.oldx; o.moveleft = false; }
  819. if ((o.x + o.w) > g.canvaswidth) { o.x = o.oldx; o.moveright = false; }
  820. };
  821. function moveToTarget(o)
  822. {
  823. if (!o.visible || o.dead || o.dying || g.pausemode > 0) return;
  824. o.oldx = o.x;
  825. o.oldy = o.y;
  826. if (o.targetx < 0 && o.targety < 0)
  827. {
  828. switch (o.direction)
  829. {
  830. case 0:
  831. o.y -= o.speed;
  832. break;
  833. case 1:
  834. o.y -= (o.speed / 1.5);
  835. o.x += (o.speed / 1.5);
  836. break;
  837. case 2:
  838. o.x += o.speed;
  839. break;
  840. case 3:
  841. o.y += (o.speed / 1.5);
  842. o.x += (o.speed / 1.5);
  843. break;
  844. case 4:
  845. o.y += o.speed;
  846. break;
  847. case 5:
  848. o.y += (o.speed / 1.5);
  849. o.x -= (o.speed / 1.5);
  850. break;
  851. case 6:
  852. o.x -= o.speed;
  853. break;
  854. case 7:
  855. o.y -= (o.speed / 1.5);
  856. o.x -= (o.speed / 1.5);
  857. break;
  858. }
  859. } else {
  860. if (o.spritesheet.type == "entity")
  861. {
  862. if (o.y >= o.targety)
  863. {
  864. if (o.bounced == 0)
  865. {
  866. o.bounced = 3;
  867. } else {
  868. if (o.bounced > 1)
  869. {
  870. o.bounced --;
  871. o.y = o.y - (o.bounced * 4);
  872. o.speed = (o.bounced * -4);
  873. } else {
  874. o.speed = 0;
  875. }
  876. }
  877. }
  878. if (o.dying > 0)
  879. {
  880. if (o.targetx > o.x) { o.x += o.speed; }
  881. if (o.targetx < o.x) { o.x -= o.speed; }
  882. if (o.targety < o.y) { o.y -= o.speed; }
  883. if (o.targety > o.y) { o.y += o.speed; }
  884. if (o.y < 0)
  885. {
  886. remove(o);
  887. }
  888. }
  889. if (o.bounced > 0) o.speed += 2;
  890. if (o.y < o.targety) { o.y += o.speed; }
  891. } else {
  892. if (o.targetx > o.x) { o.x += o.speed; }
  893. if (o.targetx < o.x) { o.x -= o.speed; }
  894. if (o.targety < o.y) { o.y -= o.speed; }
  895. if (o.targety > o.y) { o.y += o.speed; }
  896. }
  897. }
  898. if (o.dying < 1)
  899. {
  900. if (o.x < g.canvaspadding) o.x = g.canvaspadding;
  901. if ((o.x + o.w) > (g.canvaswidth - g.canvaspadding)) o.x = g.canvaswidth - g.canvaspadding - o.w;
  902. if (o.y < g.canvaspadding) o.y = g.canvaspadding;
  903. if ((o.y + o.h) > (g.canvasheight - g.canvaspadding)) o.y = g.canvasheight - g.canvaspadding - o.h;
  904. }
  905. };
  906. function move(o)
  907. {
  908. if (!o.visible || g.pausemode > 0) return;
  909. switch (o.direction)
  910. {
  911. case 0:
  912. o.y -= o.speed;
  913. break;
  914. case 1:
  915. o.y -= (o.speed / 1.5);
  916. o.x += (o.speed / 1.5);
  917. break;
  918. case 2:
  919. o.x += o.speed;
  920. break;
  921. case 3:
  922. o.y += (o.speed / 1.5);
  923. o.x += (o.speed / 1.5);
  924. break;
  925. case 4:
  926. o.y += o.speed;
  927. break;
  928. case 5:
  929. o.y += (o.speed / 1.5);
  930. o.x -= (o.speed / 1.5);
  931. break;
  932. case 6:
  933. o.x -= o.speed;
  934. break;
  935. case 7:
  936. o.y -= (o.speed / 1.5);
  937. o.x -= (o.speed / 1.5);
  938. break;
  939. }
  940. if ((o.x + o.w) < 0) remove(o);
  941. if (o.x > g.canvaswidth) remove(o);
  942. if ((o.y - o.h) < 0 && o.spritesheet.type != "starfighter") remove(o);
  943. if (g.mode == "finallyhome" && o.y > (g.canvasheight - 170))
  944. {
  945. g.mode = "landed";
  946. }
  947. if (o.y > g.canvasheight)
  948. {
  949. if (g.mode == "endgame")
  950. {
  951. finallyHome();
  952. } else {
  953. remove(o);
  954. }
  955. }
  956. };
  957. function moveAlien(o)
  958. {
  959. if (!o.visible || g.pausemode > 0) return;
  960. if ((g.wavetype-1) != 0)
  961. {
  962. o.nextthink --;
  963. if (o.nextthink < 1)
  964. {
  965. o.nextthink = o.basenextthink;
  966. if (o.row == 0)
  967. {
  968. o.direction = rnd(10) <= 5 ? 2 : 6;
  969. } else {
  970. changeDirection(o);
  971. }
  972. }
  973. }
  974. switch (o.direction)
  975. {
  976. case 0:
  977. o.y -= o.speed;
  978. break;
  979. case 1:
  980. o.y -= (o.speed / 1.5);
  981. o.x += (o.speed / 1.5);
  982. break;
  983. case 2:
  984. o.x += o.speed;
  985. break;
  986. case 3:
  987. o.y += (o.speed / 1.5);
  988. o.x += (o.speed / 1.5);
  989. break;
  990. case 4:
  991. o.y += o.speed;
  992. break;
  993. case 5:
  994. o.y += (o.speed / 1.5);
  995. o.x -= (o.speed / 1.5);
  996. break;
  997. case 6:
  998. o.x -= o.speed;
  999. break;
  1000. case 7:
  1001. o.y -= (o.speed / 1.5);
  1002. o.x -= (o.speed / 1.5);
  1003. break;
  1004. }
  1005. if (o.row == 0)
  1006. {
  1007. if ((o.x + o.w) > g.canvaswidth)
  1008. {
  1009. o.direction = 6;
  1010. }
  1011. if (o.x < 0)
  1012. {
  1013. o.direction = 2;
  1014. }
  1015. }
  1016. if ((g.wavetype-1) == 0)
  1017. {
  1018. if (isNaN(o.mod)) { o.mod = 0; o.moddir = "right"; }
  1019. if (o.moddir == "right")
  1020. {
  1021. o.x += o.mod;
  1022. if ((o.x + o.mod) > (g.canvaswidth - o.w)) { o.mod = 0; o.moddir = "left"; }
  1023. } else {
  1024. o.x -= o.mod;
  1025. if ((o.x + o.mod) < (o.w)) { o.mod = 0; o.moddir = "right"; }
  1026. }
  1027. o.mod += o.moddir == "right" ? (((o.x > g.canvaswidth / 4) * 3) ? (g.canvaswidth-o.x)*-0.0001 : 0.05) : (o.x < g.canvaswidth / 4) ? (o.x)*-0.001 : 0.05;
  1028. if (o.y > g.canvasheight) o.y = -32;
  1029. }
  1030. };
  1031. function changeDirection(o)
  1032. {
  1033. switch (o.direction)
  1034. {
  1035. case 0:
  1036. o.direction = 4;
  1037. break;
  1038. case 1:
  1039. o.direction = 5;
  1040. break;
  1041. case 2:
  1042. o.direction = 6;
  1043. break;
  1044. case 3:
  1045. o.direction = 7;
  1046. break;
  1047. case 4:
  1048. o.direction = 0;
  1049. break;
  1050. case 5:
  1051. o.direction = 1;
  1052. break;
  1053. case 6:
  1054. o.direction = 2;
  1055. break;
  1056. case 7:
  1057. o.direction = 3;
  1058. break;
  1059. }
  1060. };
  1061. function changeRow(r,d)
  1062. {
  1063. for (var a=0;a<m.monster.length;a++)
  1064. {
  1065. var b = m.monster[a];
  1066. b.direction = (b.direction == 6) ? 2 : 6;
  1067. b.y += 8;
  1068. }
  1069. };
  1070. function throwStars(force,o)
  1071. {
  1072. for (var a=0;a<m.player.stars;a++)
  1073. {
  1074. spawnEntityChance(force,o);
  1075. }
  1076. };
  1077. function playerMonsterCollision(o) // Monster passed in
  1078. {
  1079. if (!o.visible || o.dying || m.player.dead || g.pausemode > 0) return;
  1080. var ox = o.x;
  1081. var oy = o.y;
  1082. var ow = o.w;
  1083. var oh = o.h;
  1084. var mx = m.player.x;
  1085. var my = m.player.y;
  1086. var mw = m.player.w;
  1087. var mh = m.player.h;
  1088. var c1 = false, c2 = false, c3 = false, c4 = false;
  1089. if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true;
  1090. if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true;
  1091. if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true;
  1092. if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true;
  1093. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1094. {
  1095. if (o.spritesheet.type == "monster")
  1096. {
  1097. remove(o);
  1098. sparkShower(o);
  1099. if (m.player.magicpower > 0)
  1100. {
  1101. m.player.targetscore += 10;
  1102. } else {
  1103. playerDeath();
  1104. }
  1105. } else {
  1106. bootMonster(o);
  1107. }
  1108. }
  1109. };
  1110. function bootMonster(o)
  1111. {
  1112. if (o.dying) return;
  1113. m.player.targetscore += 10;
  1114. o.speed = 32;
  1115. sparkShower(o);
  1116. remove(o);
  1117. };
  1118. function entityCollision(o,m) // Entity and Player passed in. Alien bombs are entities.
  1119. {
  1120. if (!o.visible || !m.visible || m.dead || m.dying > 0 || o.dying > 0 || g.pausemode > 0) return;
  1121. var ox = o.x;
  1122. var oy = o.y;
  1123. var ow = o.w;
  1124. var oh = o.h;
  1125. var mx = m.x;
  1126. var my = m.y;
  1127. var mw = m.w;
  1128. var mh = m.h;
  1129. var c1 = false, c2 = false, c3 = false, c4 = false;
  1130. if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true;
  1131. if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true;
  1132. if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true;
  1133. if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true;
  1134. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1135. {
  1136. if (m.spritesheet.type == "player")
  1137. {
  1138. if (o.spritesheet.type == "alienbomb")
  1139. {
  1140. if (m.magicpower < 1)
  1141. {
  1142. playerDeath();
  1143. }
  1144. } else {
  1145. if (o.spritesheet.type = "entity")
  1146. {
  1147. switch (o.row)
  1148. {
  1149. case 0:
  1150. playerDeath();
  1151. break;
  1152. case 1:
  1153. m.totalstars ++;
  1154. m.stars ++;
  1155. m.targetscore += 10;
  1156. if (g.hyperdrive < 1) m.energy += 4;
  1157. if (m.energy > 100)
  1158. {
  1159. g.hyperdrive = 1000;
  1160. m.energy = 0;
  1161. sfx(gameaudio["hyperdrive"]);
  1162. }
  1163. break;
  1164. case 2:
  1165. m.scoremultiplier += 0.1;
  1166. if (m.scoremultiplier > 50) m.scoremultiplier = 50;
  1167. break;
  1168. case 3:
  1169. m.gunmode += 0.1;
  1170. if (m.gunmode > 5) m.gunmode = 5;
  1171. break;
  1172. case 4:
  1173. m.gunmode += 0.2;
  1174. if (m.gunmode > 5) m.gunmode = 5;
  1175. break;
  1176. case 5:
  1177. m.targetscore += 50;
  1178. if (g.hyperdrive < 1) m.energy += 16;
  1179. if (m.energy > 100)
  1180. {
  1181. g.hyperdrive = 1000;
  1182. m.energy = 0;
  1183. sfx(gameaudio['hyperdrive']);
  1184. }
  1185. break;
  1186. }
  1187. sfx(gameaudio['bonusitem']);
  1188. m.targetscore += g.hyperdrive > 0 ? (o.row * (Math.round(m.scoremultiplier)*10)) * 2 : (o.row * (Math.round(m.scoremultiplier) * 10));
  1189. }
  1190. }
  1191. }
  1192. remove(o);
  1193. }
  1194. };
  1195. function alienBombCollision(o,m) // Entity and Player passed in.
  1196. {
  1197. if (!o.visible || !m.visible || m.dead || m.dying > 0 || o.dying > 0 || g.pausemode > 0) return;
  1198. var ox = o.x;
  1199. var oy = o.y;
  1200. var ow = o.w;
  1201. var oh = o.h;
  1202. var mx = m.x;
  1203. var my = m.y;
  1204. var mw = m.w;
  1205. var mh = m.h;
  1206. var t = 8;
  1207. var c1 = false, c2 = false, c3 = false, c4 = false;
  1208. if (ox <= (mx+(mw-t)) && oy <= (my+(mh-t)) && ox >= (mx+t) && oy >= (my+t)) c1 = true;
  1209. if ((ox+ow) >= (mx+t) && oy >= (my+t) && (ox+ow) <= (mx+(mw-t)) && oy <= (my+(mh-t))) c2 = true;
  1210. if (ox <= (mx+(mw-t)) && (oy+oh) >= (my+t) && ox >= (mx+t) && (oy+oh) <= (my+(mh-t))) c3 = true;
  1211. if (((ox + ow) >= (mx+t)) && ((ox + ow) <= (mx + (mw-t))) && ((oy + oh) >= (my+t)) && ((oy + oh) <= (my + (mh-t)))) c4 = true;
  1212. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1213. {
  1214. remove(o);
  1215. if (m.magicpower < 1)
  1216. {
  1217. playerDeath();
  1218. }
  1219. }
  1220. };
  1221. function monsterLaserCollision(o) // Laser passed in
  1222. {
  1223. if (!o.visible || o.dying > 0 || g.pausemode > 0) return;
  1224. var ox = o.x;
  1225. var oy = o.y;
  1226. var ow = o.w;
  1227. var oh = o.h;
  1228. for (var a=0;a<m.monster.length;a++)
  1229. {
  1230. var b = m.monster[a];
  1231. if (b.visible)
  1232. {
  1233. var mx = b.x;
  1234. var my = b.y;
  1235. var mw = b.w;
  1236. var mh = b.h;
  1237. var c1 = false, c2 = false, c3 = false, c4 = false;
  1238. if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true;
  1239. if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true;
  1240. if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true;
  1241. if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true;
  1242. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1243. {
  1244. remove(o);
  1245. b.hp -= (m.player.gunmode + 1);
  1246. if (b.inpain < 1) b.y -= 8;
  1247. b.inpain = 2;
  1248. if (b.hp < 1)
  1249. {
  1250. remove(b);
  1251. spawnExplosion(b,0,1);
  1252. if (b.row == 0) g.saucermode = 0;
  1253. sfx(gameaudio['explosion']);
  1254. spawnEntityChance(true,b);
  1255. if (b.row > 0)
  1256. {
  1257. m.player.aliencount ++;
  1258. m.player.targetscore += 50 * m.player.scoremultiplier;
  1259. if (m.player.aliencount >= g.levelaliens)
  1260. {
  1261. if ((g.wavetype-1) == 0) for (var a=0;a<m.monster.length;a++) m.monster[a].visible = false;
  1262. g.levelwave ++;
  1263. var mg = g.level * g.levelwavemultiplier;
  1264. if (mg > 24) mg = 24;
  1265. if (g.levelwave > mg)
  1266. {
  1267. for (var x=0;x<3;x++)
  1268. {
  1269. spawnEntity((b.x-32)+(x*32),b.y,(b.x-32)+(x*32),g.canvasheight - 64,3);
  1270. }
  1271. g.mode = "endlevel";
  1272. g.resetting = g.warplength;
  1273. sfx(gameaudio['wavecomplete']);
  1274. } else {
  1275. setAliens();
  1276. }
  1277. }
  1278. }
  1279. }
  1280. m.player.lasercooldown = 0;
  1281. }
  1282. }
  1283. }
  1284. };
  1285. function writeText(t,x,y,s,f)
  1286. {
  1287. var sx = x;
  1288. var grid = {};
  1289. grid.w = 10;
  1290. grid.h = 16;
  1291. var text = new String(t);
  1292. g.ctx.save();
  1293. var ss = "";
  1294. g.ctx.font = "normal "+s+"px '"+f+"', Sans-Serif";
  1295. g.ctx.shadowOffsetX = 2;
  1296. g.ctx.shadowOffsetY = 2;
  1297. g.ctx.shadowBlur = 2;
  1298. g.ctx.shadowColor = "rgba(0, 0, 0, 0.9)";
  1299. g.ctx.textAlign = "center";
  1300. g.ctx.fillStyle = "#ffffff";
  1301. g.ctx.fillText(text, x,y+8);
  1302. g.ctx.restore();
  1303. };
  1304. /** ---------------------------------------------------------------- **/
  1305. /** ---------------------------------------------------------------- **/
  1306. function loop()
  1307. {
  1308. try
  1309. {
  1310. clearTimeout(g.ticker);
  1311. g.ctx.save();
  1312. g.ctx.clearRect(0, 0, g.canvaswidth, g.canvasheight);
  1313. switch (g.mode)
  1314. {
  1315. case "splash":
  1316. g.ctx.drawImage(g.splash,0,0);
  1317. g.resetting --; if (g.resetting < 0) { setTitle(); }
  1318. break;
  1319. case "title":
  1320. hiScore();
  1321. g.ctx.drawImage(g.titlescreen, (g.canvaswidth/2) - 160, 80);
  1322. writeText(textdata[1],g.textcentre,290,14,SCOREFONT);
  1323. g.resetting --; if (g.resetting < 0) { g.resetting = 0; }
  1324. break;
  1325. case "pregame":
  1326. g.ctx.drawImage(g.pregame, 0, (g.canvasheight/2)-80);
  1327. for (var a=0;a<stars.length;a++) { moveStar(stars[a]); drawStar(stars[a]); }
  1328. g.resetting --; if (g.resetting < 1) { setLevel(); g.mode = "levelup"; }
  1329. break;
  1330. case "game":
  1331. m.player.milestohome -= rnd(50000);
  1332. if (m.player.milestohome < 100000) m.player.milestohome = 100000;
  1333. if (g.nextthink > 0) g.nextthink --;
  1334. if (g.hyperdrive > 0)
  1335. {
  1336. g.hyperdrive --;
  1337. m.player.milestohome -= 5000000 + rnd(500000);
  1338. }
  1339. for (var a=0;a<stars.length;a++) { moveStar(stars[a]); drawStar(stars[a]); }
  1340. if (m.player.lasercooldown > 0) m.player.lasercooldown --;
  1341. if (m.player.dying < 1) // i.e. not dying
  1342. {
  1343. for (var a=0;a<m.monster.length;a++)
  1344. {
  1345. moveAlien(m.monster[a]);
  1346. draw(m.monster[a]);
  1347. spawnAlienBomb(m.monster[a]);
  1348. playerMonsterCollision(m.monster[a]);
  1349. }
  1350. for (var a=0;a<m.entity.length;a++)
  1351. {
  1352. move(m.entity[a]);
  1353. draw(m.entity[a]);
  1354. entityCollision(m.entity[a],m.player);
  1355. }
  1356. for (var a=0;a<m.alienbomb.length;a++)
  1357. {
  1358. move(m.alienbomb[a]);
  1359. draw(m.alienbomb[a]);
  1360. alienBombCollision(m.alienbomb[a],m.player);
  1361. }
  1362. movePlayer(m.player);
  1363. }
  1364. drawPlayer(m.player);
  1365. for (var a=0;a<m.spark.length;a++)
  1366. {
  1367. move(m.spark[a]);
  1368. draw(m.spark[a]);
  1369. }
  1370. for (var a=0;a<m.playermissile.length;a++)
  1371. {
  1372. move(m.playermissile[a]);
  1373. draw(m.playermissile[a]);
  1374. monsterLaserCollision(m.playermissile[a]);
  1375. }
  1376. for (var a=0;a<m.explosion.length;a++)
  1377. {
  1378. move(m.explosion[a]);
  1379. draw(m.explosion[a]);
  1380. }
  1381. updateScore();
  1382. updateLives();
  1383. drawEnergy();
  1384. drawLevelFlags();
  1385. if ((g.wavetype - 1) != 0) spawnSaucer();
  1386. break;
  1387. case "endgame":
  1388. for (var a=0;a<stars.length;a++) { moveStar(stars[a]); drawStar(stars[a]); }
  1389. move(m.starfighter);
  1390. draw(m.starfighter);
  1391. break;
  1392. case "finallyhome":
  1393. move(m.starfighter);
  1394. draw(m.starfighter);
  1395. break;
  1396. case "landed":
  1397. draw(m.starfighter);
  1398. writeText(textdata[4],g.textcentre,120,16,SCOREFONT);
  1399. writeText(textdata[5],g.textcentre,142,16,SCOREFONT);
  1400. break;
  1401. case "endlevel":
  1402. for (var a=0;a<stars.length;a++) { moveStar(stars[a]); drawStar(stars[a]); }
  1403. for (var a=0;a<m.spark.length;a++) { move(m.spark[a]); draw(m.spark[a]); }
  1404. g.resetting --;
  1405. if (g.resetting < 1)
  1406. {
  1407. g.level ++;
  1408. if (m.player.milestohome < 1)
  1409. {
  1410. endGame();
  1411. } else {
  1412. setLevel();
  1413. }
  1414. }
  1415. for (var a=0;a<m.entity.length;a++)
  1416. {
  1417. move(m.entity[a]);
  1418. draw(m.entity[a]);
  1419. entityCollision(m.entity[a],m.player);
  1420. }
  1421. drawPlayer(m.player);
  1422. movePlayer(m.player);
  1423. updateScore();
  1424. updateLives();
  1425. updateEnergy();
  1426. drawEnergy();
  1427. m.player.milestohome -= 50000 + rnd(50000);
  1428. writeText(textdata[8],g.textcentre,200,18,SCOREFONT);
  1429. spawnEntityChance(true, null);
  1430. break;
  1431. case "landscape":
  1432. break;
  1433. case "levelup":
  1434. for (var a=0;a<stars.length;a++) { moveStar(stars[a]); drawStar(stars[a]); }
  1435. writeLevel();
  1436. writeText(textdata[6] + g.miles,g.textcentre,260,16,SCOREFONT);
  1437. g.resetting --;
  1438. if (g.resetting < 1)
  1439. {
  1440. setAliens();
  1441. g.mode = "game";
  1442. }
  1443. drawPlayer(m.player);
  1444. movePlayer(m.player);
  1445. updateScore();
  1446. updateLives();
  1447. updateEnergy();
  1448. for (var a=0;a<m.entity.length;a++)
  1449. {
  1450. move(m.entity[a]);
  1451. draw(m.entity[a]);
  1452. entityCollision(m.entity[a],m.player);
  1453. }
  1454. drawEnergy();
  1455. break;
  1456. case "gameover":
  1457. for (var a=0;a<stars.length;a++) { moveStar(stars[a]); drawStar(stars[a]); }
  1458. writeText(textdata[3],g.textcentre,200,20,SCOREFONT);
  1459. g.resetting --;
  1460. if (g.resetting < 1)
  1461. {
  1462. //postData();
  1463. setTitle();
  1464. }
  1465. writeText(textdata[7] + g.miles,g.textcentre,260,16,SCOREFONT);
  1466. updateScore();
  1467. break;
  1468. case "getdata":
  1469. for (var a=0;a<stars.length;a++) { moveStar(stars[a]); drawStar(stars[a]); }
  1470. writeText(textdata[9],g.textcentre,100,16,SCOREFONT);
  1471. updateScore();
  1472. break;
  1473. }
  1474. if (g.mode != "splash" && g.mode != "title") g.ctx.drawImage(g.playpause, g.pausemode * 32, 0, 32, 32, 0, 8, 32, 32);
  1475. if (ISPORTRAIT && (g.ori != 0 && g.ori != 180) || !ISPORTRAIT && (g.ori != 90 && g.ori != -90))
  1476. {
  1477. g.ctx.fillStyle = "rgba(0,0,0,0.5)";
  1478. g.ctx.fillRect(0,184,g.canvaswidth,40);
  1479. writeText(textdata[2],g.textcentre - (ISPORTRAIT ? 0 : 80),200,16,SCOREFONT);
  1480. g.pausemode = 1;
  1481. }
  1482. g.ticker = setTimeout("loop()", g.framedelay);
  1483. g.ctx.restore();
  1484. }
  1485. catch (e)
  1486. {
  1487. write("*"+e.message);
  1488. }
  1489. };
  1490. function thousandSeparator(n,sep) {
  1491. var sRegExp = new RegExp('(-?[0-9]+)([0-9]{3})'),
  1492. sValue=n+"";
  1493. if (sep === undefined) {sep=',';}
  1494. while(sRegExp.test(sValue)) {
  1495. sValue = sValue.replace(sRegExp, '$1'+sep+'$2');
  1496. }
  1497. return sValue;
  1498. };
  1499. function testFPS()
  1500. {
  1501. try
  1502. {
  1503. // FPS
  1504. if (isNaN(g.fps)) g.fps = 0;
  1505. if (g.fps)
  1506. {
  1507. var d = new Date();
  1508. var c = Math.round(1000 / (d - g.fps));
  1509. }
  1510. var s = new String(c);
  1511. g.fps = new Date();
  1512. //if (c) writeString(s,220,g.canvasheight - 52);
  1513. if (isNaN(g.testy)) g.testy = 0;
  1514. if (isNaN(g.ave)) g.ave = 0;
  1515. if (g.mode != "title" && g.testy < 20)
  1516. {
  1517. g.testy ++; g.ave += c;
  1518. if (g.testy >= 10)
  1519. {
  1520. if (g.ave > 1500) g.framedelay = 24; // throttle the fast devices
  1521. }
  1522. }
  1523. }
  1524. catch (e)
  1525. {
  1526. write(e.message);
  1527. }
  1528. };
  1529. function drawEnergy()
  1530. {
  1531. if (m.player.dying > 0) return;
  1532. var w = 300 * (m.player.energy / 100);
  1533. g.ctx.fillStyle = "rgba(" + rnd(255) + "," + rnd(255) + ",0,0.8)";
  1534. g.ctx.fillRect(8,48,w,16);
  1535. g.ctx.drawImage(g.staricon, 8, 38);
  1536. };
  1537. function drawLevelFlags()
  1538. {
  1539. for (var a=0;a<((g.level*g.levelwavemultiplier)+1)-g.levelwave;a++)
  1540. {
  1541. g.ctx.drawImage(g.levelflag, 8 + (a * 10), g.canvasheight - 24);
  1542. }
  1543. };
  1544. function spawnMonsterChance()
  1545. {
  1546. if (rnd(100) < (10 + (g.level)) && g.pausemode < 1)
  1547. {
  1548. var x = -32; var y = -32;
  1549. var d = 0; var s = 0; var f = 0;
  1550. if (rnd(100) < 50)
  1551. {
  1552. // Aliens !!
  1553. y = (g.canvaspadding * 2) + rnd(g.canvasheight / 2);
  1554. if (rnd(10) < 5)
  1555. {
  1556. x = -32;
  1557. d = 2;
  1558. } else {
  1559. x = g.canvaswidth;
  1560. d = 6;
  1561. }
  1562. s = 1 + rnd(3);
  1563. var row = parseInt(m.spritesheets["monstersheet"].height) / parseInt(m.spritesheets["monstersheet"].frameheight);
  1564. spawnMonster(x,y,d,s,f,1,rnd(row)-1,10);
  1565. }
  1566. }
  1567. };
  1568. function spawnSaucer()
  1569. {
  1570. if (g.saucermode > 0 || g.level < 7) return;
  1571. if (rnd(100) < 10) { spawnMonster(0,64,2,2,0,1,0,100); g.saucermode = 1; }
  1572. };
  1573. function spawnMonster(x,y,d,s,f,ty,row,hp)
  1574. {
  1575. if (ty == 1)
  1576. {
  1577. for (var a=0;a<m.monster.length;a++)
  1578. {
  1579. if (!m.monster[a].visible)
  1580. {
  1581. var e = m.monster[a];
  1582. e.visible = true;
  1583. e.direction = d;
  1584. e.x = x;
  1585. e.y = y;
  1586. e.speed = s;
  1587. e.frame = 0;
  1588. e.startframe = f;
  1589. e.row = row;
  1590. e.hp = hp;
  1591. e.inpain = 0;
  1592. e.nextthink = row == 0 ? 30 : 40;
  1593. e.basenextthink = e.nextthink;
  1594. e.mod = 0;
  1595. e.moddir = rnd(10) <= 5 ? "right" : "left";
  1596. sparkShower(e);
  1597. break;
  1598. }
  1599. }
  1600. }
  1601. };
  1602. function spawnLaser(o,x)
  1603. {
  1604. if (o.lasercooldown > 0 || o.dying || g.mode != "game") return;
  1605. for (var n = 0;n < (g.hyperdrive > 0 ? 5 : (o.gunmode < 3 ? 2 : 3));n++)
  1606. {
  1607. for (var a=0;a<m.playermissile.length;a++)
  1608. {
  1609. if (!m.playermissile[a].visible)
  1610. {
  1611. var e = m.playermissile[a];
  1612. e.visible = true;
  1613. if (o.gunmode > 0)
  1614. {
  1615. if (g.hyperdrive > 0)
  1616. {
  1617. if (n == 0) e.x = o.x;
  1618. if (n == 1) e.x = (o.x + o.w) - e.w;
  1619. if (n == 2) e.x = o.x + (o.w / 2) - (e.w / 2);
  1620. if (n == 3) e.x = o.x - 16;
  1621. if (n == 4) e.x = o.x + o.w + 16;
  1622. } else {
  1623. e.x = (n < 1) ? o.x : ((n < 2) ? (o.x + o.w) - e.w : o.x + (o.w / 2) - (e.w / 2));
  1624. }
  1625. } else {
  1626. e.x = o.x + (o.w / 2) - (e.w / 2);
  1627. }
  1628. e.y = (n > 1) ? o.y - (e.h * 1.5) : o.y - (e.h);
  1629. e.frame = 0;
  1630. e.startframe = 0;
  1631. e.direction = 0;
  1632. e.speed = 16;
  1633. o.lasercooldown = o.lasercooldownmax;
  1634. break;
  1635. }
  1636. }
  1637. }
  1638. sfx(gameaudio["playershot"]);
  1639. };
  1640. function spawnExplosion(o,d,sp)
  1641. {
  1642. for (var a=0;a<m.explosion.length;a++)
  1643. {
  1644. if (!m.explosion[a].visible)
  1645. {
  1646. var e = m.explosion[a];
  1647. e.visible = true;
  1648. e.direction = d;
  1649. e.x = o.x + (o.w / 2) - (e.w / 2);
  1650. e.y = o.y + (o.h / 2) - (e.h / 2);
  1651. e.speed = sp;
  1652. e.frame = 0;
  1653. break;
  1654. }
  1655. }
  1656. };
  1657. function sparkShower(o)
  1658. {
  1659. for (var a=0;a<8;a++)
  1660. {
  1661. spawnSpark(o,a,12);
  1662. }
  1663. };
  1664. function spawnSpark(o,d,sp)
  1665. {
  1666. for (var a=0;a<m.spark.length;a++)
  1667. {
  1668. if (!m.spark[a].visible)
  1669. {
  1670. var s = m.spark[a];
  1671. s.visible = true;
  1672. s.direction = d;
  1673. s.x = o.x + (o.w/2);
  1674. s.y = o.y + (o.h/2);
  1675. s.spawny = o.y + 16;
  1676. s.speed = sp;
  1677. s.decay = 0;
  1678. s.opacity = 1;
  1679. break;
  1680. }
  1681. }
  1682. };
  1683. function spawnAlienBomb(o)
  1684. {
  1685. if (rnd(1000) > 20 || !o.visible || g.pausemode > 0 || o.y > (g.canvasheight - 80)) return;
  1686. var d = 4;
  1687. var sp = o.row == 0 ? 8 : (g.level/2);
  1688. if (sp > 14) sp = 14;
  1689. if (sp < 8) sp = 8;
  1690. for (var a=0;a<m.alienbomb.length;a++)
  1691. {
  1692. if (!m.alienbomb[a].visible)
  1693. {
  1694. var s = m.alienbomb[a];
  1695. s.visible = true;
  1696. s.direction = d;
  1697. s.x = o.x + (o.w/2);
  1698. s.y = o.y + (o.h/2);
  1699. s.spawny = o.y + 16;
  1700. s.speed = sp;
  1701. s.decay = 0;
  1702. s.opacity = 1;
  1703. s.row = o.row == 0 ? 1 : 0;
  1704. if (o.row == 0) sfx(gameaudio["saucerbomb"]);
  1705. break;
  1706. }
  1707. }
  1708. };
  1709. function spawnEntityChance(force,o)
  1710. {
  1711. var x = 0; var y = 0;
  1712. var tx = 0; var ty = 0;
  1713. if (g.mode == "endlevel" && rnd(100) > 10) return;
  1714. if ((rnd(1000) < 5 || force == true) && g.pausemode < 1)
  1715. {
  1716. if (o != null)
  1717. {
  1718. x = o.x;
  1719. y = o.y;
  1720. tx = o.x;
  1721. } else {
  1722. x = (g.canvaspadding * 2) + rnd(g.canvaswidth / 2);
  1723. tx = x;
  1724. y = 32;
  1725. }
  1726. ty = g.canvasheight - 64;
  1727. var row = (parseInt(m.spritesheets["entitysheet"].height) / parseInt(m.spritesheets["entitysheet"].frameheight)) + 1;
  1728. var r = rnd(row) - 1;
  1729. if (force) r = rnd(10) < 8 ? 1 : (rnd(10) < 5 ? 2 : 3); // Favour stars
  1730. if (g.mode == "endlevel" || g.mode == "levelup" && r == 1) r = rnd(10) < 7 ? 2 : 3; // Over-ride for hyperspace
  1731. if (g.level < 9 && r == 0) r = 1;
  1732. spawnEntity(x,y,tx,ty,r);
  1733. }
  1734. };
  1735. function spawnEntity(x,y,tx,ty,row)
  1736. {
  1737. for (var a=0;a<m.entity.length;a++)
  1738. {
  1739. if (!m.entity[a].visible)
  1740. {
  1741. var s = m.entity[a];
  1742. s.visible = true;
  1743. s.x = x;
  1744. s.y = y;
  1745. s.targetx = tx;
  1746. s.targety = ty;
  1747. s.direction = 4;
  1748. s.speed = row == 0 ? 1 : 6;
  1749. s.bounced = 0;
  1750. s.dying = 0;
  1751. s.decay = row == 0 ? 1000 : 100;
  1752. s.row = row;
  1753. break;
  1754. }
  1755. }
  1756. };
  1757. function writeString(s,x,y)
  1758. {
  1759. var o = m.spritesheets["numberssheet"];
  1760. for (var a=0;a<s.length;a++)
  1761. {
  1762. x += o.framewidth;
  1763. var i = s.substr(a,1);
  1764. g.ctx.drawImage(o.image, i*o.framewidth, 0, o.framewidth, o.frameheight, x, y, o.framewidth, o.frameheight);
  1765. }
  1766. };
  1767. function writeLevel()
  1768. {
  1769. var ph = new String();
  1770. var ph2 = new String(g.level);
  1771. var ls = ph2.length;
  1772. var s = new String();
  1773. for (var b = 0; b < ph2.length; b++) s += ph2.substring(b,b+1);
  1774. writeText(textdata[0] + s,g.textcentre,200,24,SCOREFONT);
  1775. };
  1776. function hiScore()
  1777. {
  1778. try
  1779. {
  1780. var sScore = new String();
  1781. var sInScore = new String(m.player.hiscore);
  1782. var ls = sInScore.length;
  1783. var s = new String();
  1784. for (var a = 0; a < (8-ls); a++) s += "0";
  1785. for (var b = 0; b < sInScore.length; b++) s += "" + sInScore.substring(b,b+1);
  1786. writeString(s,(g.canvaswidth/2) - 96,0);
  1787. }
  1788. catch (e)
  1789. {
  1790. write(e.message);
  1791. }
  1792. };
  1793. function updateScore()
  1794. {
  1795. try
  1796. {
  1797. m.player.score += 10;
  1798. if (m.player.targetscore > 50000 && g.extralife < 1) { m.player.lives ++; g.extralife = 1; }
  1799. if (m.player.targetscore > 100000 && g.extralife < 2) { m.player.lives ++; g.extralife = 2; }
  1800. if (m.player.targetscore > 150000 && g.extralife < 3) { m.player.lives ++; g.extralife = 3; }
  1801. if (m.player.score > 99999999) m.player.score = 99999999;
  1802. if (m.player.score > m.player.targetscore) m.player.score = m.player.targetscore;
  1803. if (m.player.score > m.player.hiscore)
  1804. {
  1805. m.player.hiscore = m.player.score;
  1806. localStorage.setItem(GAMETITLE + "-hiscore", m.player.hiscore);
  1807. }
  1808. var sScore = new String();
  1809. var sInScore = new String(m.player.score);
  1810. var ls = sInScore.length;
  1811. var s = new String();
  1812. for (var a = 0; a < (8-ls); a++) s += "0";
  1813. for (var b = 0; b < sInScore.length; b++) s += "" + sInScore.substring(b,b+1);
  1814. writeString(s,(g.canvaswidth/2) - 64,0);
  1815. //if (g.mode == "gameover") writeString(s,40,0); else writeString(s,90,0);
  1816. }
  1817. catch (e)
  1818. {
  1819. write(e.message);
  1820. }
  1821. };
  1822. function updateLives()
  1823. {
  1824. g.ctx.drawImage(g.playericon, 64, 8);
  1825. var ph = new String();
  1826. var ph2 = new String(m.player.lives);
  1827. var ls = ph2.length;
  1828. var s = new String();
  1829. for (var b = 0; b < ph2.length; b++) s += ph2.substring(b,b+1);
  1830. writeString(s,16,0);
  1831. };
  1832. function updateEnergy()
  1833. {
  1834. return;
  1835. g.ctx.drawImage(g.staricon, 230, 8);
  1836. var ph = new String();
  1837. var ph2 = new String(m.player.energy);
  1838. var ls = ph2.length;
  1839. var s = new String();
  1840. for (var b = 0; b < ph2.length; b++) s += ph2.substring(b,b+1);
  1841. writeString(s,240,0);
  1842. };
  1843. function remove(o)
  1844. {
  1845. o.visible = false;
  1846. };
  1847. function scanInput(e)
  1848. {
  1849. if (window.event) keypress = e.keyCode;
  1850. else if(e.which) keypress = e.which;
  1851. switch (keypress)
  1852. {
  1853. case 16: // SHIFT
  1854. break;
  1855. case 18: // ALT
  1856. break;
  1857. case 32: // Space
  1858. break;
  1859. case 38: // Up
  1860. break;
  1861. case 40: // Down
  1862. break;
  1863. case 39: // Right
  1864. m.player.moveright = true;
  1865. break;
  1866. case 37: // Left
  1867. m.player.moveleft = true;
  1868. break;
  1869. case 67: // C
  1870. g.console.style.display = g.console.style.display == "none" ? "block" : "none";
  1871. break;
  1872. case 80: // P
  1873. g.pausemode ++; if (g.pausemode > 1) g.pausemode = 0;
  1874. break;
  1875. case 83: // S
  1876. g.audiomode ++; if (g.audiomode > 1) g.audiomode = 0;
  1877. handleAudio();
  1878. break;
  1879. case 17: // CTRL
  1880. case 90: // Z
  1881. if (g.mode == "landed") setTitle();
  1882. if (g.mode == "title" && g.resetting < 1) setGame();
  1883. if (g.mode == "game") spawnLaser(m.player);
  1884. if (g.mode == "pregame") { if (g.resetting < 950) { setLevel(); g.mode = "levelup"; } }
  1885. break;
  1886. }
  1887. };
  1888. function stopMove(e)
  1889. {
  1890. if (window.event) // IE
  1891. {
  1892. keyup = e.keyCode;
  1893. }
  1894. else if(e.which)
  1895. {
  1896. keyup = e.which;
  1897. }
  1898. var k = 0;
  1899. if (keyup >= 48 && keyup <= 57)
  1900. {
  1901. k = (48 - keyup) * -1;
  1902. }
  1903. switch (keyup)
  1904. {
  1905. case 16: // SHIFT
  1906. break;
  1907. case 18: // ALT
  1908. break;
  1909. case 32: // Space
  1910. break;
  1911. case 38: // Up
  1912. break;
  1913. case 40: // Down
  1914. break;
  1915. case 39: // Right
  1916. m.player.moveright = false;
  1917. break;
  1918. case 37: // Left
  1919. m.player.moveleft = false;
  1920. break;
  1921. case 67: // C
  1922. break;
  1923. case 83: // S
  1924. break;
  1925. case 17: // CTRL
  1926. case 90: // Z
  1927. break;
  1928. }
  1929. };
  1930. window.onorientationchange = function(event) {
  1931. setCanvasDimensions(event);
  1932. };