game.js 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390
  1. /*
  2. Galactians 2
  3. (C) Mark Wilcox
  4. More games at www.spacemonsters.co.uk
  5. */
  6. var GAMETITLE = "GALACTIANS2";
  7. var SCOREFONT = "Arial, Sans-Serif";
  8. var IPHONEHACK = false;
  9. var ISPORTRAIT = true;
  10. /*
  11. -- AJAX ----------------------------------------------------------------------------
  12. */
  13. var AJAX = {
  14. "user" : "mark",
  15. "pass" : "2a4e5174107a8c2c88d3da2fc8e08d1cc65aeb6735758cd9bf6186fccc9d4c60",
  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 = {};
  73. g.go = 0;
  74. var m = {
  75. spritesheets : [],
  76. player : null,
  77. explosion : [],
  78. lasers : [],
  79. aliens : [],
  80. alienbomb : [],
  81. textsprites : [],
  82. bonusitems : []
  83. };
  84. var stars = [];
  85. var dots = [];
  86. var gameaudio = [];
  87. g.checkSum = gamedata.imageFiles.length;// + gamedata.audioFiles.length;
  88. g.checkCount = 0;
  89. g.imageData = [];
  90. g.audioData = [];
  91. g.aliensarray = [];
  92. g.colours = [];
  93. g.colours[0] = "#bf0000";
  94. g.colours[1] = "#4386d0";
  95. g.colours[2] = "#28d98c";
  96. g.colours[3] = "#3de231";
  97. g.colours[4] = "#d8e231";
  98. g.colours[5] = "#feba4f";
  99. g.colours[6] = "#fe5b4f";
  100. g.colours[7] = "#fe4fd7";
  101. g.colours[8] = "#ca4ffe";
  102. g.explosionColours = [];
  103. g.explosionColours[0] = "#ffffaa";
  104. g.explosionColours[1] = "#ffe651";
  105. g.explosionColours[2] = "#ffc51f";
  106. g.explosionColours[3] = "#ff911a";
  107. g.explosionColours[4] = "#e7623e";
  108. g.explosionColours[5] = "#a81300";
  109. function createStars()
  110. {
  111. for (var a=0;a<20;a++)
  112. {
  113. stars[a] = new star("star"+a, rnd(g.canvaswidth), rnd(g.canvasheight), 4, rnd(2)+1, 4, g.colours[rnd(g.colours.length)-1]);
  114. }
  115. };
  116. function createDots()
  117. {
  118. for (var a=0;a<100;a++)
  119. {
  120. dots[a] = new dot("dot"+a, rnd(g.canvaswidth), rnd(g.canvasheight), 4, rnd(2)+1, 4, g.colours[rnd(g.colours.length)-1]);
  121. }
  122. };
  123. function createSprites()
  124. {
  125. try
  126. {
  127. // Load game media
  128. for (var a=0;a<imglib.length;a++)
  129. {
  130. m.spritesheets[imglib[a].sheetname] = new spritesheet(imglib[a]);
  131. }
  132. g.titlescreen = new Image(); g.titlescreen.src = g.imageData[0].src;
  133. g.titleback = new Image(); g.titleback.src = g.imageData[1].src;
  134. g.gameback = new Image(); g.gameback.src = "library/gamebackdrop.gif";
  135. g.playpause = new Image(); g.playpause.src = "library/playpause.png";
  136. g.splash = new Image(); g.splash.src = "library/splash.png";
  137. //g.volumecontrol = new Image(); g.volumecontrol.src = "library/volumecontrols.png";
  138. // STANDARD SPRITES
  139. m.player = new sprite("player", "player", m.spritesheets["playersheet"], 0, 0, 16, 4, 1);
  140. // SPRITE POTS
  141. for (var a=0;a<6;a++) m.alienbomb[a] = new sprite("alienbomb"+a, "alienbomb", m.spritesheets["alienbombsheet"], 0, 0, 2, 0, 0);
  142. for (var a=0;a<40;a++) m.aliens[a] = new sprite("aliens"+a, "alien", m.spritesheets["aliensheet"], 0, 0, 2, 0, 0);
  143. for (var a=0;a<8;a++) m.explosion[a] = new sprite("explosion"+a, "explosion", m.spritesheets["explosionsheet"], 0, 0, 2, 0, 0);
  144. for (var a=0;a<32;a++) m.lasers[a] = new sprite("lasers"+a, "lasers", m.spritesheets["laserssheet"], 0, 0, 2, 0, 0);
  145. for (var a=0;a<8;a++) m.bonusitems[a] = new sprite("bonus"+a, "bonus", m.spritesheets["bonussheet"], 0, 0, 2, 0, 0);
  146. for (var a=0;a<40;a++) m.textsprites[a] = new textsprite("textsprite"+a,-32,-32,"",0.1);
  147. // SET UP THE TOUCH SCREEN
  148. initTouch();
  149. // SET UP THE GAME START
  150. initHiScore();
  151. setSplash();
  152. setBackground();
  153. // TICKER
  154. g.ticker = setTimeout("loop()", 0);
  155. }
  156. catch (e)
  157. {
  158. write("CreateSprites: " + e.message);
  159. }
  160. };
  161. function rnd(threshold)
  162. {
  163. return Math.floor(Math.random()*threshold) + 1;
  164. };
  165. function preCache() {
  166. for (var a=0;a<gamedata.imageFiles.length;a++)
  167. {
  168. g.imageData[a] = new Image();
  169. g.imageData[a].src = gamedata.imageFiles[a];
  170. g.imageData[a].onload = check;
  171. }
  172. };
  173. function check() {
  174. try
  175. {
  176. g.checkCount ++;
  177. var pc = Math.round((g.checkCount / g.checkSum) * 100);
  178. var bar = Math.round(g.canvaswidth * (pc / 100));
  179. g.ctx.clearRect(140,150,32,16);
  180. g.ctx.fillStyle = "rgb(16,16,16)";
  181. g.ctx.fillRect(0,200,g.canvaswidth,16);
  182. g.ctx.fillStyle = "rgb(80,80,80)";
  183. g.ctx.fillRect(0,200,bar,16);
  184. if (g.checkCount >= g.checkSum)
  185. {
  186. createSprites();
  187. }
  188. }
  189. catch (e)
  190. {
  191. write ("Check: " + e.message);
  192. }
  193. };
  194. function rnd(threshold)
  195. {
  196. return Math.floor(Math.random()*threshold) + 1;
  197. };
  198. function init()
  199. {
  200. try
  201. {
  202. g.canvas = document.querySelector('canvas');
  203. g.ctx = g.canvas.getContext('2d');
  204. g.canvas.setAttribute('class', 'canvas');
  205. g.container = document.getElementById('container');
  206. g.banad = document.getElementById("banad");
  207. g.ori = 0;
  208. g.scale = 1;
  209. setResolution();
  210. setCanvasDimensions();
  211. g.canvas.style.backgroundColor = "transparent";
  212. g.nextthink = 0;
  213. g.console = document.getElementById('console');
  214. g.console.style.display = 'none';
  215. g.console.style.textAlign = 'left';
  216. write("Console ready.");
  217. BrowserDetect.init();
  218. write("Browser: " + BrowserDetect.browser + " " + BrowserDetect.version);
  219. write("OS: " + BrowserDetect.OS);
  220. var br = new String(BrowserDetect.OS);
  221. g.framedelay = 30;
  222. g.ISIPHONE = false;
  223. if (br.indexOf("iPhone") != -1)
  224. {
  225. //if (IPHONEHACK) { g.framedelay = 0; }
  226. g.ISIPHONE = true;
  227. }
  228. g.nextthink = 0;
  229. g.banad.style.display = "none";
  230. pickAdURL();
  231. window.scrollTo(0,0);
  232. g.pausemode = 0;
  233. g.audiomode = 1;
  234. getData();
  235. g.displayBanner = 1;
  236. //g.banad = document.getElementById("banad");
  237. //pickAdURL();
  238. g.playmode = "keyboard";
  239. createDots();
  240. preCache();
  241. }
  242. catch (e)
  243. {
  244. write(e.message);
  245. }
  246. };
  247. function setResolution()
  248. {
  249. var w = 0;
  250. var h = 0;
  251. if(document.all){
  252. h = document.body.offsetHeight;
  253. w = document.body.offsetWidth;
  254. }
  255. else
  256. {
  257. h = innerHeight;
  258. w = innerWidth;
  259. }
  260. g.canvaswidth = 320;
  261. g.canvasheight = 480;
  262. g.scale = 1;
  263. /*
  264. // avoid splitting integers
  265. if (w % 2 > 0) w ++;
  266. if (h % 2 > 0) h ++;
  267. // force resolution on larger devices
  268. if (w > 320)
  269. {
  270. if (w >= 480 && h >= 640)
  271. {
  272. g.canvaswidth = 480;
  273. g.canvasheight = 640;
  274. g.scale = 1.5;
  275. } else {
  276. if (w <= (g.canvaswidth * 1.5) && h <= (g.canvasheight * 1.5))
  277. { // stretch to full screen - dimension acceptable
  278. g.canvaswidth = w;
  279. g.canvasheight = h;
  280. g.scale = 1.25;
  281. }
  282. }
  283. }
  284. */
  285. };
  286. function setCanvasDimensions(e)
  287. {
  288. g.canvaspadding = 32;
  289. g.displaypadding = 0;
  290. if (typeof(window.orientation)!="undefined")
  291. {
  292. g.ori = window.orientation; // 0, -90 or 90
  293. }
  294. g.canvas.width = g.canvaswidth;
  295. g.canvas.height = g.canvasheight;
  296. g.textcentre = g.canvaswidth / 2;
  297. g.canvascentre = g.canvasheight / 2;
  298. window.scrollTo(0,1);
  299. };
  300. function setBackground()
  301. {
  302. g.container.style.backgroundColor = "black";
  303. g.container.style.background = "url(" + g.gameback.src + ")";
  304. };
  305. function initTouch()
  306. {
  307. if(checkForTouch()) {
  308. if (document.body.addEventListener)
  309. {
  310. document.body.addEventListener('touchmove', touchMove, false);
  311. document.body.addEventListener('touchstart', touchStart, false);
  312. document.body.addEventListener('touchend', touchEnd, false);
  313. } else {
  314. window.addEventListener('touchmove', touchMove, false);
  315. window.addEventListener('touchstart', touchStart, false);
  316. window.addEventListener('touchend', touchEnd, false);
  317. }
  318. } else {
  319. window.addEventListener('mousemove', mouseMove, false);
  320. window.addEventListener('mouseup', mouseUp, false);
  321. write("No touch capability.");
  322. }
  323. };
  324. function initHiScore()
  325. {
  326. if (typeof localStorage.key == "function")
  327. {
  328. if (localStorage.getItem(GAMETITLE + "-hiscore") != null)
  329. {
  330. m.player.hiscore = localStorage.getItem(GAMETITLE + "-hiscore");
  331. } else {
  332. m.player.hiscore = 0;
  333. }
  334. }
  335. };
  336. function sfx(o)
  337. {
  338. };
  339. function handleAudio()
  340. {
  341. };
  342. function checkForTouch() {
  343. var d = document.createElement("div");
  344. d.setAttribute("ontouchmove", "return;");
  345. return typeof d.ontouchmove == "function" ? true : false;
  346. };
  347. function touch(event) {
  348. if (g.mode == "title") { setGame(); g.playmode = "touch"; }
  349. var o = m.player;
  350. var tx = (event.pageX - (g.canvas.offsetParent ? g.canvas.parentNode.offsetLeft : 0)) - (o.w / 2);
  351. var ty = (event.pageY - (g.canvas.offsetParent ? g.canvas.parentNode.offsetTop : 0)) - (o.h / 2);
  352. if (tx < 64 && ty < 64)
  353. {
  354. g.pausemode ++; if (g.pausemode > 1) g.pausemode = 0;
  355. }
  356. if (g.playmode == "touch")
  357. {
  358. if (g.pausemode < 1)
  359. {
  360. o.x = tx;
  361. }
  362. if (o.x > (g.canvaswidth - o.w)) m.player.x = g.canvaswidth - o.w;
  363. if (o.x < 0) o.x = 0;
  364. }
  365. };
  366. function touchStart(event) {
  367. touch(event.touches[0]);
  368. };
  369. function touchMove(event) {
  370. touch(event.touches[0]);
  371. window.scrollTo(0, 1);
  372. event.preventDefault();
  373. };
  374. function touchEnd(event) {
  375. touch(event.touches[0]);
  376. };
  377. function mouseMove(event) {
  378. if (g.mode != "title") touch(event);
  379. };
  380. function mouseUp(event) {
  381. touch(event);
  382. };
  383. function setSplash()
  384. {
  385. g.mode = "splash";
  386. g.resetting = 100;
  387. g.banad.style.display = "none";
  388. };
  389. function setTitle()
  390. {
  391. g.mode = "title";
  392. g.canvas.style.backgroundImage = "none";
  393. g.canvas.style.backgroundColor = "transparent";
  394. g.stage = 0;
  395. g.banad.style.display = "block";
  396. //g.banad.style.display = g.displayBanner > 0 ? "block" : "none";
  397. };
  398. function setGame()
  399. {
  400. g.banad.style.display = "none";
  401. g.mode = "pregame";
  402. g.resetting = 60;
  403. g.time = new Date();
  404. m.player.score = 0;
  405. m.player.targetscore = 0;
  406. m.player.lives = 3;
  407. g.level = 1;
  408. g.displaylevel = 1;
  409. g.bonuspoints = 0;
  410. g.lasercooldown = 0;
  411. g.lasercooldownmax = 8;
  412. g.alienbombcooldown = 0;
  413. g.wavetype = 1;
  414. g.bonuslife1 = false;
  415. g.bonuslife2 = false;
  416. g.bonuslife3 = false;
  417. g.bonuslife4 = false;
  418. g.canvas.style.backgroundImage = "none";
  419. g.canvas.style.backgroundColor = "transparent";
  420. setLevel();
  421. playerStart();
  422. };
  423. function setLevel()
  424. {
  425. wipe(true);
  426. m.player.dying = false;
  427. m.player.visible = true;
  428. //setStars();
  429. g.aliensarray.splice(0,g.aliensarray.length);
  430. setAliens();
  431. g.shotsfired = 0;
  432. g.hitratio = 0;
  433. };
  434. function setStars()
  435. {return;
  436. for (var a=0;a<stars.length;a++)
  437. {
  438. stars[a].x = rnd(g.canvaswidth);
  439. stars[a].y = rnd(g.canvasheight);
  440. stars[a].speed = stars[a].basespeed;
  441. }
  442. };
  443. function setLandscape()
  444. {
  445. g.oldmode = g.mode;
  446. g.mode = "landscape";
  447. };
  448. function playerStart()
  449. {
  450. m.player.x = g.canvaswidth / 2 - (m.player.w / 2);
  451. m.player.y = g.canvasheight - 120;
  452. m.player.targetx = m.player.x + (m.player.w / 2);
  453. m.player.targety = g.canvasheight - 128;
  454. m.player.basey = g.canvasheight - 128;
  455. m.player.moveleft = false;
  456. m.player.moveright = false;
  457. m.player.speed = 6;
  458. m.player.basespeed = m.player.speed;
  459. m.player.shottype = 1;
  460. };
  461. function wipe(doentities)
  462. {
  463. for (var a=0;a<m.alienbomb.length;a++) kill(m.alienbomb[a]);
  464. for (var a=0;a<m.aliens.length;a++) kill(m.aliens[a]);
  465. for (var a=0;a<m.explosion.length;a++) kill(m.explosion[a]);
  466. for (var a=0;a<m.lasers.length;a++) kill(m.lasers[a]);
  467. for (var a=0;a<m.bonusitems.length;a++) { if (m.bonusitems[a].row > 0 && m.bonusitems[a].row < 3) kill(m.bonusitems[a]); }
  468. for (var a=0;a<m.textsprites.length;a++) kill(m.textsprites[a]);
  469. };
  470. function kill(o)
  471. {
  472. o.visible = false;
  473. };
  474. function playerDeath()
  475. {
  476. for (var a=0;a<m.lasers.length;a++) { kill(m.lasers[a]); }
  477. for (var a=0;a<m.alienbomb.length;a++) { kill(m.alienbomb[a]); }
  478. for (var a=0;a<m.bonusitems.length;a++) { if (m.bonusitems[a].row > 0 && m.bonusitems[a].row < 3) kill(m.bonusitems[a]); }
  479. if (m.player.dying) return;
  480. //spawnExplosion(m.player,0,1);
  481. dotExplosion(m.player);
  482. m.player.dying = true;
  483. kill(m.player);
  484. m.player.lives --;
  485. m.player.speed = m.player.basespeed;
  486. m.player.shottype = 1;
  487. g.resetting = 80;
  488. };
  489. function movePlayer(o)
  490. {
  491. if (!o.visible) return;
  492. try
  493. {
  494. if (m.player.moveleft) { o.x -= o.speed; }
  495. if (m.player.moveright) { o.x += o.speed; }
  496. if (o.x > (g.canvaswidth - o.w)) m.player.x = g.canvaswidth - o.w;
  497. if (o.x < 0) o.x = 0;
  498. }
  499. catch (e)
  500. {
  501. write("MovePlayer: " + e.message);
  502. }
  503. };
  504. function drawPlayer(o)
  505. {
  506. if (!o.visible) return;
  507. try
  508. {
  509. if (isNaN(o.attacking)) o.attacking = 0;
  510. if (o.attacking > 0)
  511. {
  512. o.attacking --;
  513. o.frame = o.spritesheet.attackframe;
  514. } else {
  515. g.ctx.save();
  516. if (o.spinning > 0)
  517. {
  518. o.angle += 32; if (o.angle > 360) o.angle = 0;
  519. g.ctx.translate(o.x + (o.w/2),o.y + (o.h/2));
  520. g.ctx.rotate(o.angle * (Math.PI / 180));
  521. g.ctx.drawImage(s.spritesheet.image, s.frame * s.spritesheet.framewidth, 0, s.w, s.h, -s.w/2, o.jumping ? (stages[g.stage].type=="night"?(-s.h/2)-40:(-s.h/2)+(24-o.speed)) : (stages[g.stage].type=="night"?(-s.h/2)-40:(-s.h/2)+4), s.w, s.h);
  522. g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, 0, o.w, o.h, -o.w/2, -o.h/2, o.w, o.h);
  523. o.spinning --;
  524. if (o.spinning < 1)
  525. {
  526. g.roadspeed = g.roadspeedmax;
  527. }
  528. } else {
  529. if (isNaN(o.frame)) o.frame = o.startframe;
  530. o.framedelay --;
  531. if (o.framedelay < 0)
  532. {
  533. o.framedelay = o.framedelaymax;
  534. o.frame ++;
  535. if (o.frame >= (o.startframe + o.spritesheet.framesperdirection))
  536. {
  537. o.frame = o.startframe;
  538. }
  539. if (o.magicpower > 0 && o.magicpower < 50)
  540. {
  541. o.row ++; if (o.row > 1) o.row = 0;
  542. }
  543. }
  544. if (o.inpain) { o.frame = o.spritesheet.painframe; o.inpain = false; }
  545. o.angle = 0;
  546. g.ctx.translate(o.x + (o.w/2),o.y + (o.h/2));
  547. g.ctx.rotate(o.angle * (Math.PI / 180));
  548. if (!o.dying) g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, -o.w/2, -o.h/2, o.w, o.h);
  549. }
  550. g.ctx.restore();
  551. }
  552. }
  553. catch (e)
  554. {
  555. write("DrawPlayer: " + o.frame + " - " + e.message);
  556. }
  557. };
  558. function drawStar(o)
  559. {
  560. try
  561. {
  562. g.ctx.fillStyle = o.colour;
  563. if (g.mode == "game")
  564. {
  565. o.size = g.hyperdrive > 0 ? o.basesize * 4 : o.basesize;
  566. } else if (g.mode == "endlevel")
  567. {
  568. if (g.resetting <= (g.warplength / 2))
  569. {
  570. o.size -= 0.5;
  571. } else {
  572. o.size += 0.5;
  573. }
  574. } else if (g.mode == "endgame")
  575. {
  576. g.ctx.fillStyle = rnd(10) < 5 ? "#4362b2" : "#365298";
  577. o.size = 64;
  578. o.direction = 0;
  579. }
  580. g.ctx.fillRect(o.x,o.y,2,o.size);
  581. }
  582. catch (e)
  583. {
  584. write(o.id);
  585. }
  586. };
  587. function moveStar(o)
  588. {
  589. if (g.mode == "game")
  590. {
  591. o.speed = g.hyperdrive > 0 ? o.basespeed * 8 : o.basespeed;
  592. } else if (g.mode == "endlevel")
  593. {
  594. if (g.resetting <= (g.warplength / 2))
  595. {
  596. o.speed -= 0.5;
  597. } else {
  598. o.speed += 0.5;
  599. }
  600. } else if (g.mode == "endgame")
  601. {
  602. o.speed = o.basespeed + 16;
  603. }
  604. switch (o.direction)
  605. {
  606. case 0:
  607. o.y -= o.speed;
  608. break;
  609. case 1:
  610. o.y -= (o.speed / 1.5);
  611. o.x += (o.speed / 1.5);
  612. break;
  613. case 2:
  614. o.x += o.speed;
  615. break;
  616. case 3:
  617. o.y += (o.speed / 1.5);
  618. o.x += (o.speed / 1.5);
  619. break;
  620. case 4:
  621. o.y += o.speed;
  622. break;
  623. case 5:
  624. o.y += (o.speed / 1.5);
  625. o.x -= (o.speed / 1.5);
  626. break;
  627. case 6:
  628. o.x -= o.speed;
  629. break;
  630. case 7:
  631. o.y -= (o.speed / 1.5);
  632. o.x -= (o.speed / 1.5);
  633. break;
  634. }
  635. if ((o.x + o.w) < 0) o.x = o.canvaswidth;
  636. if (o.x > g.canvaswidth) o.x = (o.size * -1);
  637. if ((o.y + o.size) < 0) o.y = g.canvasheight;
  638. if (o.y > g.canvasheight) o.y = o.size * -1;
  639. };
  640. function drawDot(o)
  641. {
  642. if (!o.visible) return;
  643. try
  644. {
  645. if (o.colourindex >= 0 && g.pausemode < 1)
  646. {
  647. o.nextthink --;
  648. if (o.nextthink < 1)
  649. {
  650. o.colourindex ++;
  651. if (o.colourindex >= g.explosionColours.length)
  652. {
  653. o.colourindex = g.explosionColours.length - 1;
  654. }
  655. o.nextthink = 4;
  656. }
  657. }
  658. if (o.colourindex >= 0)
  659. {
  660. g.ctx.fillStyle = g.explosionColours[o.colourindex];
  661. } else {
  662. g.ctx.fillStyle = o.colour;
  663. }
  664. //g.ctx.fillStyle = o.colourindex >= 0 ? { write(g.explosionColours[o.colourindex]); : o.colour;
  665. g.ctx.fillRect(o.x,o.y,o.w,o.h);
  666. }
  667. catch (e)
  668. {
  669. write("Dot: " + o.colourindex + " - " + e.message);
  670. }
  671. };
  672. function moveDot(o)
  673. {
  674. if (!o.visible || g.pausemode > 0) return;
  675. if (o.y < g.canvasheight - 100)
  676. {
  677. switch (o.direction)
  678. {
  679. case 0:
  680. o.y -= o.speed;
  681. break;
  682. case 1:
  683. o.y -= (o.speed / 1.5);
  684. o.x += (o.speed / 1.5);
  685. break;
  686. case 2:
  687. o.x += o.speed;
  688. break;
  689. case 3:
  690. o.y += (o.speed / 1.5);
  691. o.x += (o.speed / 1.5);
  692. break;
  693. case 4:
  694. o.y += o.speed;
  695. break;
  696. case 5:
  697. o.y += (o.speed / 1.5);
  698. o.x -= (o.speed / 1.5);
  699. break;
  700. case 6:
  701. o.x -= o.speed;
  702. break;
  703. case 7:
  704. o.y -= (o.speed / 1.5);
  705. o.x -= (o.speed / 1.5);
  706. break;
  707. }
  708. o.speed += 1;
  709. o.x += o.xmod;
  710. } else {
  711. o.y += 0.5;
  712. o.h -= 0.1;
  713. }
  714. if (o.y > g.canvasheight-80) kill(o);
  715. };
  716. function draw(o)
  717. {
  718. if (!o.visible) return;
  719. try
  720. {
  721. if (isNaN(o.attacking)) o.attacking = 0;
  722. if (o.decay > 0 && g.pausemode < 1)
  723. {
  724. o.decay --;
  725. if (o.decay < 1)
  726. {
  727. if (o.row == 1) dotBlobExplosion(o);
  728. kill(o);
  729. }
  730. }
  731. if (o.attacking > 0)
  732. {
  733. o.attacking --;
  734. o.frame = o.spritesheet.attackframe;
  735. } else if (!o.diving) {
  736. if (isNaN(o.frame)) o.frame = o.startframe;
  737. o.framedelay --;
  738. if (o.framedelay < 0)
  739. {
  740. o.framedelay = o.framedelaymax;
  741. o.frame ++;
  742. if (o.frame >= (o.startframe + o.spritesheet.framesperdirection))
  743. {
  744. if (o.spritesheet.type == "explosion")
  745. {
  746. kill(o);
  747. } else {
  748. o.frame = o.startframe;
  749. }
  750. }
  751. }
  752. if (o.inpain) { o.frame = o.spritesheet.painframe; o.inpain = false; }
  753. } else {
  754. o.frame = 0;
  755. }
  756. g.ctx.save();
  757. if (o.diving)
  758. {
  759. var angle = 0;
  760. if (o.divestage == 1) angle = o.divedirection == 6 ? -45 : 45;
  761. if (o.divestage == 2) angle = o.divedirection == 6 ? 225 : 135;
  762. if (o.divestage == 3) angle = o.divedirection == 6 ? 165 : -165;
  763. g.ctx.translate(o.x + (o.w/2),o.y + (o.h/2));
  764. g.ctx.rotate(angle * (Math.PI / 180));
  765. g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, -o.w/2, -o.h/2, o.w, o.h);
  766. } else {
  767. if (o.decay > 0 && o.decay < 16)
  768. {
  769. if (o.decay % 2 < 1)
  770. {
  771. g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h);
  772. }
  773. } else {
  774. g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h);
  775. }
  776. }
  777. g.ctx.restore();
  778. }
  779. catch (e)
  780. {
  781. write("Draw: Angle = " + o.angle + " - " + o.spritesheet.type + ", " + o.frame + " - " + e.message);
  782. }
  783. };
  784. function moveLaser(o)
  785. {
  786. if (!o.visible || g.pausemode > 0) return;
  787. o.y -= o.speed;
  788. if (o.y < (o.h * -1)) kill(o);
  789. };
  790. function drawLaser(o)
  791. {
  792. try
  793. {
  794. if (!o.visible) return;
  795. g.ctx.drawImage(o.spritesheet.canvas, o.x, o.y, o.w, o.h);
  796. }
  797. catch (e)
  798. {
  799. write("DrawLaser: " + e.message);
  800. }
  801. };
  802. function moveToTarget(o)
  803. {
  804. if (!o.visible || o.dead || g.pausemode > 0) return;
  805. o.oldx = o.x;
  806. o.oldy = o.y;
  807. if (o.targetx < 0 && o.targety < 0)
  808. {
  809. switch (o.direction)
  810. {
  811. case 0:
  812. o.y -= o.speed;
  813. break;
  814. case 1:
  815. o.y -= (o.speed / 1.5);
  816. o.x += (o.speed / 1.5);
  817. break;
  818. case 2:
  819. o.x += o.speed;
  820. break;
  821. case 3:
  822. o.y += (o.speed / 1.5);
  823. o.x += (o.speed / 1.5);
  824. break;
  825. case 4:
  826. o.y += o.speed;
  827. break;
  828. case 5:
  829. o.y += (o.speed / 1.5);
  830. o.x -= (o.speed / 1.5);
  831. break;
  832. case 6:
  833. o.x -= o.speed;
  834. break;
  835. case 7:
  836. o.y -= (o.speed / 1.5);
  837. o.x -= (o.speed / 1.5);
  838. break;
  839. }
  840. } else {
  841. if (o.jumping)
  842. {
  843. if (o.y >= o.targety)
  844. {
  845. if (!o.bounced)
  846. {
  847. o.bounced = true;
  848. o.y = o.y - 8;
  849. o.speed = -8;
  850. } else {
  851. o.speed = o.basespeed;
  852. o.jumping = false;
  853. }
  854. }
  855. if (o.dying > 0)
  856. {
  857. if (o.targetx > o.x) { o.x += o.speed; }
  858. if (o.targetx < o.x) { o.x -= o.speed; }
  859. if (o.targety < o.y) { o.y -= o.speed; }
  860. if (o.targety > o.y) { o.y += o.speed; }
  861. if (o.y < 0)
  862. {
  863. kill(o);
  864. }
  865. }
  866. if (o.bounced) o.speed += 2;
  867. if (o.y < o.targety) { o.y += o.speed; }
  868. } else {
  869. if (o.divestage == 4 && o.diving)
  870. {
  871. var thresh = 1;
  872. if ((Math.round(o.x) >= Math.round(o.targetx) - thresh)
  873. &&
  874. (Math.round(o.x) <= Math.round(o.targetx) + o.w + thresh)
  875. &&
  876. (Math.round(o.y) >= Math.round(o.targety) - thresh)
  877. &&
  878. (Math.round(o.y) <= Math.round(o.targety) + o.h + thresh)
  879. )
  880. {
  881. o.divestage = 0;
  882. o.diving = false;
  883. o.speed = o.basespeed;
  884. g.divingaliens --;
  885. } else {
  886. if (o.targetx > o.x) { o.x += o.speed; }
  887. if (o.targetx < o.x) { o.x -= o.speed; }
  888. if (o.targety < o.y) { o.y -= o.speed; }
  889. if (o.targety > o.y) { o.y += o.speed; }
  890. }
  891. } else {
  892. // Target co-ords set by screen touch.
  893. if (o.targetx > o.x) { o.x += o.speed; }
  894. if (o.targetx < o.x) { o.x -= o.speed; }
  895. if (o.targety < o.y) { o.y -= o.speed; }
  896. if (o.targety > o.y) { o.y += o.speed; }
  897. }
  898. }
  899. }
  900. if (o.dying < 1)
  901. {
  902. if (o.x < g.canvaspadding) o.x = g.canvaspadding;
  903. if ((o.x + o.w) > (g.canvaswidth - g.canvaspadding)) o.x = g.canvaswidth - g.canvaspadding - o.w;
  904. if (o.y < g.canvaspadding) o.y = g.canvaspadding;
  905. if ((o.y + o.h) > (g.canvasheight - g.canvaspadding)) o.y = g.canvasheight - g.canvaspadding - o.h;
  906. }
  907. };
  908. function setAliens()
  909. {
  910. g.levelaliens = 0;
  911. g.alienskilled = 0;
  912. g.maxdivingaliens = Math.round(g.level / 6) + 1;
  913. if (g.maxdivingaliens > 4) g.maxdivingaliens = 4;
  914. g.divingaliens = 0;
  915. var c = 0;
  916. var r = 0;
  917. g.level ++;
  918. if (g.level > 12) g.level = 12;
  919. for (var row=0;row<5;row++)
  920. {
  921. for (var a=0;a<4;a++)
  922. {
  923. var x = ((g.canvaswidth / 2) - 112) + (a * 64);
  924. var y = 64 + (row * 24);
  925. var d = 4;
  926. var s = 0.5;
  927. var f = 0;
  928. var ty = -1;
  929. var hp = 1;
  930. if (!((row == 0 || row == 4 ) && (a== 0 || a == 3)))
  931. {
  932. spawnAlien(x,y,d,s,hp,r);
  933. g.levelaliens ++;
  934. }
  935. c ++;
  936. }
  937. r ++; if (r > 3) r = 0;
  938. }
  939. };
  940. function resetAliens()
  941. {
  942. g.divingaliens = 0;
  943. for (var a=0;a<g.aliensarray.length;a++)
  944. {
  945. var o = g.aliensarray[a];
  946. if (!o.killed)
  947. {
  948. o.visible = true;
  949. o.x = o.originx;
  950. o.y = o.originy;
  951. o.diving = false;
  952. o.speed = o.basespeed;
  953. o.direction = 4;
  954. }
  955. }
  956. };
  957. function move(o)
  958. {
  959. if (!o.visible || g.pausemode > 0) return;
  960. var bomb = o.spritesheet.type == "alienbomb" ? true : false;
  961. switch (o.direction)
  962. {
  963. case 0:
  964. o.y -= o.speed;
  965. break;
  966. case 1:
  967. o.y -= (o.speed / 1.5);
  968. o.x += (o.speed / 1.5);
  969. break;
  970. case 2:
  971. o.x += o.speed;
  972. break;
  973. case 3:
  974. o.y += (o.speed / 1.5);
  975. o.x += (o.speed / 1.5);
  976. break;
  977. case 4:
  978. o.x += bomb ? o.xmod : o.speed;
  979. o.y += o.speed;
  980. break;
  981. case 5:
  982. o.y += (o.speed / 1.5);
  983. o.x -= (o.speed / 1.5);
  984. break;
  985. case 6:
  986. o.x -= o.speed;
  987. break;
  988. case 7:
  989. o.y -= (o.speed / 1.5);
  990. o.x -= (o.speed / 1.5);
  991. break;
  992. }
  993. if (bomb)
  994. {
  995. if (o.y > (g.canvasheight - 110))
  996. {
  997. dotBombExplosion(o);
  998. kill(o);
  999. }
  1000. }
  1001. };
  1002. function moveBonus(o)
  1003. {
  1004. if (!o.visible || g.pausemode > 0) return;
  1005. switch (o.direction)
  1006. {
  1007. case 0:
  1008. o.y -= o.speed;
  1009. break;
  1010. case 1:
  1011. o.y -= (o.speed / 1.5);
  1012. o.x += (o.speed / 1.5);
  1013. break;
  1014. case 2:
  1015. o.x += o.speed;
  1016. break;
  1017. case 3:
  1018. o.y += (o.speed / 1.5);
  1019. o.x += (o.speed / 1.5);
  1020. break;
  1021. case 4:
  1022. o.y += o.landed ? 0 : o.row == 2 ? o.speed / 4 : o.row == 1 && !o.bounced ? o.speed / 2 : o.speed;
  1023. break;
  1024. case 5:
  1025. o.y += (o.speed / 1.5);
  1026. o.x -= (o.speed / 1.5);
  1027. break;
  1028. case 6:
  1029. o.x -= o.speed;
  1030. break;
  1031. case 7:
  1032. o.y -= (o.speed / 1.5);
  1033. o.x -= (o.speed / 1.5);
  1034. break;
  1035. }
  1036. if (o.row == 2)
  1037. {
  1038. if (o.y > (g.canvasheight - 128))
  1039. {
  1040. dotExplosion(o);
  1041. kill(o);
  1042. } else {
  1043. o.mod += o.x > m.player.x ? -0.4 : 0.4;
  1044. o.x += o.mod;
  1045. }
  1046. } else {
  1047. if (o.y > (g.canvasheight - 128) && !o.bounced)
  1048. {
  1049. o.bounced = true;
  1050. if (o.row == 1)
  1051. {
  1052. o.ymod = -16;
  1053. o.decay = 40;
  1054. } else {
  1055. o.ymod = -16;
  1056. o.decay = 50;
  1057. }
  1058. }
  1059. if (o.bounced && !o.landed)
  1060. {
  1061. o.y += o.ymod;
  1062. o.ymod += 0.25;
  1063. }
  1064. if (o.y > (g.canvasheight - 128) && o.bounced && !o.landed)
  1065. {
  1066. o.landed = true;
  1067. }
  1068. }
  1069. };
  1070. function moveAlien(o)
  1071. {
  1072. if (!o.visible || g.pausemode > 0) return;
  1073. if (!o.diving)
  1074. {
  1075. o.nextthink --;
  1076. if (o.nextthink < 1)
  1077. {
  1078. o.nextthink = o.basenextthink;
  1079. changeDirection(o);
  1080. }
  1081. switch (o.direction)
  1082. {
  1083. case 0:
  1084. o.y -= o.speed;
  1085. break;
  1086. case 1:
  1087. o.y -= (o.speed / 1.5);
  1088. o.x += (o.speed / 1.5);
  1089. break;
  1090. case 2:
  1091. o.x += o.speed;
  1092. break;
  1093. case 3:
  1094. o.y += (o.speed / 1.5);
  1095. o.x += (o.speed / 1.5);
  1096. break;
  1097. case 4:
  1098. o.y += o.speed;
  1099. break;
  1100. case 5:
  1101. o.y += (o.speed / 1.5);
  1102. o.x -= (o.speed / 1.5);
  1103. break;
  1104. case 6:
  1105. o.x -= o.speed;
  1106. break;
  1107. case 7:
  1108. o.y -= (o.speed / 1.5);
  1109. o.x -= (o.speed / 1.5);
  1110. break;
  1111. }
  1112. } else {
  1113. // Diving alien
  1114. if (o.divestage == 1)
  1115. {
  1116. o.steps ++;
  1117. if (o.steps > 4)
  1118. {
  1119. o.divestage = 2;
  1120. o.steps = 0;
  1121. }
  1122. o.y -= o.speed;
  1123. o.x += o.divedirection == 6 ? o.speed * -1 : o.speed;
  1124. }
  1125. if (o.divestage == 2)
  1126. {
  1127. o.steps ++;
  1128. if (o.steps > 4)
  1129. {
  1130. o.divestage = 3;
  1131. o.steps = 0;
  1132. o.speed = 2 + rnd(2);
  1133. o.xmod = o.divedirection == 6 ? 8 : -8;
  1134. o.ymod = 1;
  1135. }
  1136. o.y += o.speed;
  1137. o.x += o.divedirection == 6 ? o.speed * -1 : o.speed;
  1138. }
  1139. if (o.divestage == 3)
  1140. {
  1141. o.xmod -= o.divedirection == 6 ? o.xmodinc : o.xmodinc * -1;
  1142. o.ymod -= 0.1; if (o.ymod < 1) o.ymod = 1;
  1143. o.y += o.speed + o.ymod;
  1144. o.x += o.xmod;
  1145. if (o.y > g.canvasheight)
  1146. {
  1147. o.x = g.canvaswidth / 2 - (o.w / 2);
  1148. o.y = o.h * -1;
  1149. o.targetx = Math.round(o.storedx);
  1150. o.targety = Math.round(o.storedy);
  1151. o.speed = 2;
  1152. o.divestage = 4;
  1153. }
  1154. }
  1155. if (o.divestage == 4)
  1156. {
  1157. moveToTarget(o);
  1158. }
  1159. //o.x = Math.round(o.x);
  1160. //o.y = Math.round(o.y);
  1161. }
  1162. };
  1163. function spawnDive(o)
  1164. {
  1165. if (g.resetting > 1) return;
  1166. var x = (g.levelaliens + 1) - (g.levelaliens - g.alienskilled);
  1167. if (rnd(100) > (x * 4) || !o.visible || o.diving || (g.divingaliens >= g.maxdivingaliens) || g.mode != "game") return;
  1168. g.divingaliens ++;
  1169. o.diving = true;
  1170. o.divestage = 1;
  1171. o.direction = 4;
  1172. o.divedirection = o.x < (g.canvaswidth / 2) ? 6 : 2;
  1173. o.inc = 0;
  1174. o.speed = 2;
  1175. o.xmodinc = 0.4;
  1176. o.storedx = o.x;
  1177. o.storedy = o.y;
  1178. o.steps = 0;
  1179. o.turned = false;
  1180. };
  1181. function changeDirection(o)
  1182. {
  1183. switch (o.direction)
  1184. {
  1185. case 0:
  1186. o.direction = 4;
  1187. break;
  1188. case 1:
  1189. o.direction = 5;
  1190. break;
  1191. case 2:
  1192. o.direction = 6;
  1193. break;
  1194. case 3:
  1195. o.direction = 7;
  1196. break;
  1197. case 4:
  1198. o.direction = 0;
  1199. break;
  1200. case 5:
  1201. o.direction = 1;
  1202. break;
  1203. case 6:
  1204. o.direction = 2;
  1205. break;
  1206. case 7:
  1207. o.direction = 3;
  1208. break;
  1209. }
  1210. };
  1211. function bonusCollision(o,m)
  1212. {
  1213. if (!o.visible || m.dead || m.dying > 0 || o.dying > 0 || g.pausemode > 0) return;
  1214. var ox = o.x;
  1215. var oy = o.y;
  1216. var ow = o.w;
  1217. var oh = o.h;
  1218. var mx = m.x;
  1219. var my = m.y;
  1220. var mw = m.w;
  1221. var mh = m.h;
  1222. var c1 = false, c2 = false, c3 = false, c4 = false;
  1223. if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true;
  1224. if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true;
  1225. if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true;
  1226. if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true;
  1227. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1228. {
  1229. switch(o.row) // Which entity ?
  1230. {
  1231. case 0:
  1232. m.targetscore += 1500;
  1233. spawnTextSprite(o,"1500");
  1234. break;
  1235. case 1:
  1236. case 2:
  1237. playerDeath();
  1238. break;
  1239. case 3:
  1240. m.shottype ++;
  1241. if (m.shottype > 3) m.shottype = 3;
  1242. break;
  1243. default:
  1244. break;
  1245. }
  1246. kill(o);
  1247. }
  1248. };
  1249. function alienMissileCollision(o)
  1250. {
  1251. if (!o.visible || g.pausemode > 0) return;
  1252. var ox = o.x;
  1253. var oy = o.y;
  1254. var ow = o.w;
  1255. var oh = o.h;
  1256. for (var z=0;z<m.aliens.length;z++)
  1257. {
  1258. var a = m.aliens[z];
  1259. if (a.visible)
  1260. {
  1261. var mx = a.x;
  1262. var my = a.y;
  1263. var mw = a.w;
  1264. var mh = a.h;
  1265. var c1 = false, c2 = false, c3 = false, c4 = false;
  1266. if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true;
  1267. if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true;
  1268. if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true;
  1269. if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true;
  1270. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1271. {
  1272. a.hp -= o.damage;
  1273. if (a.hp < 1)
  1274. {
  1275. kill(a);
  1276. alienKill(a);
  1277. }
  1278. kill(o);
  1279. }
  1280. }
  1281. }
  1282. };
  1283. function bonusMissileCollision(o)
  1284. {
  1285. if (!o.visible || g.pausemode > 0) return;
  1286. var ox = o.x;
  1287. var oy = o.y;
  1288. var ow = o.w;
  1289. var oh = o.h;
  1290. for (var z=0;z<m.bonusitems.length;z++)
  1291. {
  1292. var a = m.bonusitems[z];
  1293. if (a.visible)
  1294. {
  1295. var mx = a.x;
  1296. var my = a.y;
  1297. var mw = a.w;
  1298. var mh = a.h;
  1299. var c1 = false, c2 = false, c3 = false, c4 = false;
  1300. if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true;
  1301. if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true;
  1302. if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true;
  1303. if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true;
  1304. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1305. {
  1306. switch(a.row)
  1307. {
  1308. case 0:
  1309. break;
  1310. case 1:
  1311. if (a.bounced)
  1312. {
  1313. kill(o);
  1314. kill(a);
  1315. dotBombExplosion(a);
  1316. m.player.targetscore += 50000;
  1317. m.player.score = m.player.targetscore;
  1318. spawnTextSprite(a,"50000");
  1319. }
  1320. break;
  1321. case 2:
  1322. break;
  1323. }
  1324. }
  1325. }
  1326. }
  1327. };
  1328. function endLevel()
  1329. {
  1330. wipe();
  1331. g.hitratio = Math.round((g.levelaliens/g.shotsfired)*100);
  1332. m.player.score += g.hitratio * 100;
  1333. m.player.targetscore = m.player.score;
  1334. g.mode = "levelup";
  1335. g.resetting = 90;
  1336. g.starfighterbonus = 0;
  1337. g.starfighterrank = "";
  1338. if (g.hitratio > 15) { g.starfighterbonus = 5000; g.starfighterrank = textdata[11]; }
  1339. if (g.hitratio > 25) { g.starfighterbonus = 10000; g.starfighterrank = textdata[12]; }
  1340. if (g.hitratio > 35) { g.starfighterbonus = 25000; g.starfighterrank = textdata[13]; }
  1341. if (g.hitratio > 45) { g.starfighterbonus = 50000; g.starfighterrank = textdata[14]; }
  1342. m.player.score += g.starfighterbonus;
  1343. m.player.targetscore = m.player.score;
  1344. };
  1345. function alienBonus(a)
  1346. {
  1347. var bonus = 0;
  1348. bonus = Math.round(a.y * 10);
  1349. if (bonus > 3000)
  1350. {
  1351. spawnTextSpriteXY(a.x,a.y-24,textdata[5] + " " + textdata[6]);
  1352. bonus = bonus * 5;
  1353. } else if (bonus > 2500)
  1354. {
  1355. spawnTextSpriteXY(a.x,a.y-24,textdata[4] + " " + textdata[6]);
  1356. bonus = bonus * 2;
  1357. }
  1358. m.player.score += bonus;
  1359. m.player.targetscore = m.player.score;
  1360. m.player.targetscore += 10;
  1361. };
  1362. function alienBombCollision(o,m)
  1363. {
  1364. if (!o.visible || !m.visible || m.dead || m.dying > 0 || o.dying > 0 || g.pausemode > 0) return;
  1365. var ox = o.x;
  1366. var oy = o.y;
  1367. var ow = o.w;
  1368. var oh = o.h;
  1369. var mx = m.x;
  1370. var my = m.y;
  1371. var mw = m.w;
  1372. var mh = m.h;
  1373. var t = 8; // attempt to set a threshold a la manic shooter tiny boxes.
  1374. var c1 = false, c2 = false, c3 = false, c4 = false;
  1375. if (ox <= (mx+(mw-t)) && oy <= (my+(mh-t)) && ox >= (mx+t) && oy >= (my+t)) c1 = true;
  1376. if ((ox+ow) >= (mx+t) && oy >= (my+t) && (ox+ow) <= (mx+(mw-t)) && oy <= (my+(mh-t))) c2 = true;
  1377. if (ox <= (mx+(mw-t)) && (oy+oh) >= (my+t) && ox >= (mx+t) && (oy+oh) <= (my+(mh-t))) c3 = true;
  1378. if (((ox + ow) >= (mx+t)) && ((ox + ow) <= (mx + (mw-t))) && ((oy + oh) >= (my+t)) && ((oy + oh) <= (my + (mh-t)))) c4 = true;
  1379. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1380. {
  1381. kill(o);
  1382. playerDeath();
  1383. }
  1384. };
  1385. function alienPlayerCollision(o,m)
  1386. {
  1387. if (!o.visible || !m.visible || m.dead || m.dying > 0 || o.dying > 0 || g.pausemode > 0) return;
  1388. var ox = o.x;
  1389. var oy = o.y;
  1390. var ow = o.w;
  1391. var oh = o.h;
  1392. var mx = m.x;
  1393. var my = m.y;
  1394. var mw = m.w;
  1395. var mh = m.h;
  1396. var t = 8; // attempt to set a threshold a la manic shooter tiny boxes.
  1397. var c1 = false, c2 = false, c3 = false, c4 = false;
  1398. if (ox <= (mx+(mw-t)) && oy <= (my+(mh-t)) && ox >= (mx+t) && oy >= (my+t)) c1 = true;
  1399. if ((ox+ow) >= (mx+t) && oy >= (my+t) && (ox+ow) <= (mx+(mw-t)) && oy <= (my+(mh-t))) c2 = true;
  1400. if (ox <= (mx+(mw-t)) && (oy+oh) >= (my+t) && ox >= (mx+t) && (oy+oh) <= (my+(mh-t))) c3 = true;
  1401. if (((ox + ow) >= (mx+t)) && ((ox + ow) <= (mx + (mw-t))) && ((oy + oh) >= (my+t)) && ((oy + oh) <= (my + (mh-t)))) c4 = true;
  1402. if (c1 == true || c2 == true || c3 == true || c4 == true)
  1403. {
  1404. alienBonus(o);
  1405. kill(o);
  1406. alienKill(o);
  1407. playerDeath();
  1408. }
  1409. };
  1410. function alienKill(o)
  1411. {
  1412. for (var a=0;a < g.aliensarray.length;a++)
  1413. {
  1414. var b = g.aliensarray[a];
  1415. if (b == o)
  1416. {
  1417. b.killed = true;
  1418. break;
  1419. }
  1420. }
  1421. if (o.diving)
  1422. {
  1423. g.divingaliens --;
  1424. }
  1425. alienBonus(o);
  1426. if (!o.diving) spawnBonusChance(o);
  1427. //spawnExplosionXY(o.x,o.y,0,1);
  1428. for (var a=0;a<8;a++)
  1429. {
  1430. spawnDot(o.x,o.y);
  1431. }
  1432. g.alienskilled ++;
  1433. if (g.alienskilled >= g.levelaliens)
  1434. {
  1435. endLevel();
  1436. }
  1437. };
  1438. function writeText(t,x,y,s,f)
  1439. {
  1440. var sx = x;
  1441. var grid = {};
  1442. grid.w = 10;
  1443. grid.h = 16;
  1444. var text = new String(t);
  1445. //text = text.toUpperCase();
  1446. g.ctx.save();
  1447. var ss = "";
  1448. g.ctx.font = "normal "+(s*g.scale)+"px '"+f+"', Sans-Serif";
  1449. g.ctx.textAlign = "center";
  1450. g.ctx.fillStyle = "#ffffff";
  1451. if (y > 260) // Starfighter bonus !
  1452. {
  1453. g.ctx.fillStyle = g.colours[rnd(g.colours.length-1)];
  1454. }
  1455. g.ctx.fillText(text, x,y+8);
  1456. g.ctx.restore();
  1457. };
  1458. function drawTextSprite(o)
  1459. {
  1460. if (!o.visible) return;
  1461. var text = new String(o.text);
  1462. g.ctx.save();
  1463. g.ctx.font = "normal " + (14*g.scale) + "px " + SCOREFONT;
  1464. g.ctx.textAlign = "left";
  1465. g.ctx.fillStyle = "#ffffcc";//g.colours[rnd(g.colours.length)-1];
  1466. g.ctx.fillText(text, o.x,o.y+8);
  1467. g.ctx.restore();
  1468. };
  1469. function moveTextSprite(o)
  1470. {
  1471. if (!o.visible) return;
  1472. o.y -= o.speed;
  1473. o.ticks --;
  1474. if (o.ticks < 0) kill(o);
  1475. };
  1476. /** ---------------------------------------------------------------- **/
  1477. /** ---------------------------------------------------------------- **/
  1478. function loop()
  1479. {
  1480. try
  1481. {
  1482. clearTimeout(g.ticker);
  1483. g.ctx.save();
  1484. g.ctx.clearRect(0, 0, g.canvaswidth, g.canvasheight);
  1485. switch (g.mode)
  1486. {
  1487. case "splash":
  1488. g.ctx.drawImage(g.splash,0,0);
  1489. g.resetting --;
  1490. if (g.resetting < 1)
  1491. {
  1492. setTitle();
  1493. }
  1494. break;
  1495. case "title":
  1496. hiScore();
  1497. g.ctx.drawImage(g.titlescreen,(g.canvaswidth/2)-160,0);
  1498. writeText(textdata[1],g.textcentre,278,22,SCOREFONT);
  1499. break;
  1500. case "pregame":
  1501. movePlayer(m.player);
  1502. drawPlayer(m.player);
  1503. g.resetting --;
  1504. if (g.resetting < 1)
  1505. {
  1506. g.mode = "game";
  1507. }
  1508. for (var a=0;a < m.aliens.length;a++)
  1509. {
  1510. moveAlien(m.aliens[a]);
  1511. draw(m.aliens[a]);
  1512. }
  1513. writeText(textdata[0],g.textcentre,200,20,SCOREFONT);
  1514. updateScore();
  1515. playerLives();
  1516. break;
  1517. case "game":
  1518. for (var a=0;a<dots.length;a++) { moveDot(dots[a]); drawDot(dots[a]); }
  1519. if (g.nextthink > 0) g.nextthink --;
  1520. if (m.player.dying)
  1521. {
  1522. g.resetting --;
  1523. if (g.resetting < 1)
  1524. {
  1525. if (m.player.lives < 1)
  1526. {
  1527. g.mode = "gameover";
  1528. g.resetting = 100;
  1529. g.banad.style.display = "block";
  1530. g.time = new Date() - g.time;
  1531. } else {
  1532. resetAliens();
  1533. m.player.visible = true;
  1534. m.player.dying = false;
  1535. g.mode = "pregame";
  1536. g.resetting = 100;
  1537. }
  1538. }
  1539. }
  1540. if (g.playmode == "touch")
  1541. {
  1542. if (g.lasercooldown < 1)
  1543. {
  1544. spawnLaser(m.player.x + (m.player.w / 2) - 2, m.player.y - 8);
  1545. g.lasercooldown = g.lasercooldownmax;
  1546. } else {
  1547. g.lasercooldown --;
  1548. }
  1549. }
  1550. movePlayer(m.player);
  1551. drawPlayer(m.player);
  1552. g.alienbombcooldown --;
  1553. if (g.alienbombcooldown < 1) g.alienbombcooldown = 20;
  1554. for (var a=0;a < m.lasers.length;a++)
  1555. {
  1556. moveLaser(m.lasers[a]);
  1557. drawLaser(m.lasers[a]);
  1558. alienMissileCollision(m.lasers[a]);
  1559. bonusMissileCollision(m.lasers[a]);
  1560. }
  1561. for (var a=0;a < m.aliens.length;a++)
  1562. {
  1563. moveAlien(m.aliens[a]);
  1564. draw(m.aliens[a]);
  1565. spawnAlienBomb(m.aliens[a]);
  1566. spawnDive(m.aliens[a]);
  1567. alienPlayerCollision(m.aliens[a],m.player);
  1568. }
  1569. for (var a=0;a < m.explosion.length;a++)
  1570. {
  1571. move(m.explosion[a]);
  1572. draw(m.explosion[a]);
  1573. }
  1574. for (var a=0;a < m.bonusitems.length;a++)
  1575. {
  1576. moveBonus(m.bonusitems[a]);
  1577. draw(m.bonusitems[a]);
  1578. bonusCollision(m.bonusitems[a], m.player);
  1579. }
  1580. for (var a=0;a<m.alienbomb.length;a++)
  1581. {
  1582. move(m.alienbomb[a]);
  1583. draw(m.alienbomb[a]);
  1584. alienBombCollision(m.alienbomb[a],m.player);
  1585. }
  1586. for (var a=0;a < m.textsprites.length;a++)
  1587. {
  1588. moveTextSprite(m.textsprites[a]);
  1589. drawTextSprite(m.textsprites[a]);
  1590. }
  1591. updateScore();
  1592. playerLives();
  1593. break;
  1594. case "landscape":
  1595. break;
  1596. case "levelup":
  1597. for (var a=0;a<dots.length;a++) { moveDot(dots[a]); drawDot(dots[a]); }
  1598. g.resetting --;
  1599. if (g.resetting < 1)
  1600. {
  1601. setLevel();
  1602. //playerStart();
  1603. g.mode = "game";
  1604. }
  1605. writeText(textdata[7],g.textcentre,150,20,SCOREFONT);
  1606. writeText(textdata[8] + g.shotsfired,g.textcentre,180,14,SCOREFONT);
  1607. writeText(textdata[9] + g.hitratio+"%",g.textcentre,210,14,SCOREFONT);
  1608. writeText(textdata[10] + (g.hitratio*100),g.textcentre,240,14,SCOREFONT);
  1609. if (g.starfighterbonus > 0)
  1610. {
  1611. writeText(g.starfighterrank + " " + textdata[10] + " " + g.starfighterbonus,g.textcentre,270,14,SCOREFONT);
  1612. }
  1613. updateScore();
  1614. playerLives();
  1615. for (var a=0;a < m.bonusitems.length;a++)
  1616. {
  1617. moveBonus(m.bonusitems[a]);
  1618. draw(m.bonusitems[a]);
  1619. bonusCollision(m.bonusitems[a], m.player);
  1620. }
  1621. for (var a=0;a < m.textsprites.length;a++)
  1622. {
  1623. moveTextSprite(m.textsprites[a]);
  1624. drawTextSprite(m.textsprites[a]);
  1625. }
  1626. movePlayer(m.player);
  1627. drawPlayer(m.player);
  1628. break;
  1629. case "gameover":
  1630. for (var a=0;a<dots.length;a++) { moveDot(dots[a]); drawDot(dots[a]); }
  1631. writeText(textdata[3],g.textcentre,200,20,SCOREFONT);
  1632. g.resetting --;
  1633. if (g.resetting < 1)
  1634. {
  1635. postData();
  1636. setTitle();
  1637. }
  1638. updateScore();
  1639. break;
  1640. }
  1641. if (g.mode != "splash" && g.mode != "title") g.ctx.drawImage(g.playpause, g.pausemode * 32, 0, 32, 32, 8, 8, 32, 32);
  1642. if (ISPORTRAIT && (g.ori != 0 && g.ori != 180) || !ISPORTRAIT && (g.ori != 90 && g.ori != -90))
  1643. {
  1644. g.ctx.fillStyle = "rgba(0,0,0,0.5)";
  1645. g.ctx.fillRect(0,184,g.canvaswidth,40);
  1646. writeText(textdata[2],g.textcentre - (ISPORTRAIT ? 0 : 80),200,16,SCOREFONT);
  1647. g.pausemode = 1;
  1648. }
  1649. g.ticker = setTimeout("loop()", g.framedelay);
  1650. g.ctx.restore();
  1651. }
  1652. catch (e)
  1653. {
  1654. write("Loop: " + e.message);
  1655. }
  1656. };
  1657. function playerLives()
  1658. {
  1659. var o = m.player;
  1660. for (var a=0;a<m.player.lives-1;a++)
  1661. {
  1662. g.ctx.drawImage(o.spritesheet.canvas, 0, 0, o.w, o.h, (g.canvaswidth-90)+(a * 18), 16, 16, 16);
  1663. }
  1664. };
  1665. function testFPS()
  1666. {
  1667. try
  1668. {
  1669. // FPS
  1670. if (isNaN(g.fps)) g.fps = 0;
  1671. if (g.fps)
  1672. {
  1673. var d = new Date();
  1674. var c = Math.round(1000 / (d - g.fps));
  1675. }
  1676. var s = new String(c);
  1677. g.fps = new Date();
  1678. //if (c) writeString(s,220,g.canvasheight - 128);
  1679. if (isNaN(g.testy)) g.testy = 0;
  1680. if (isNaN(g.ave)) g.ave = 0;
  1681. if (g.testy < 20)
  1682. {
  1683. g.testy ++; g.ave += c;
  1684. if (g.testy >= 10)
  1685. {
  1686. if (g.ave > 1000) g.framedelay = 42; // throttle the fast devices
  1687. }
  1688. }
  1689. }
  1690. catch (e)
  1691. {
  1692. write(e.message);
  1693. }
  1694. };
  1695. function spawnTextSprite(o,t)
  1696. {
  1697. for (var a=0;a<m.textsprites.length;a++)
  1698. {
  1699. if (!m.textsprites[a].visible)
  1700. {
  1701. var e = m.textsprites[a];
  1702. e.visible = true;
  1703. e.ticks = 30;
  1704. e.x = o.x;
  1705. e.y = o.y;
  1706. e.text = t;
  1707. e.speed = 1;
  1708. break;
  1709. }
  1710. }
  1711. };
  1712. function spawnTextSpriteXY(x,y,t)
  1713. {
  1714. for (var a=0;a<m.textsprites.length;a++)
  1715. {
  1716. if (!m.textsprites[a].visible)
  1717. {
  1718. var e = m.textsprites[a];
  1719. e.visible = true;
  1720. e.ticks = 30;
  1721. e.x = x;
  1722. e.y = y;
  1723. e.text = t;
  1724. e.speed = 1;
  1725. break;
  1726. }
  1727. }
  1728. };
  1729. function spawnExplosion(o,d,sp)
  1730. {
  1731. for (var a=0;a<m.explosion.length;a++)
  1732. {
  1733. if (!m.explosion[a].visible)
  1734. {
  1735. var e = m.explosion[a];
  1736. e.visible = true;
  1737. e.direction = d;
  1738. e.x = o.x;
  1739. e.y = o.y;
  1740. e.speed = 0.1;
  1741. e.frame = 0;
  1742. break;
  1743. }
  1744. }
  1745. };
  1746. function spawnExplosionXY(x,y,d,sp)
  1747. {
  1748. for (var a=0;a<m.explosion.length;a++)
  1749. {
  1750. if (!m.explosion[a].visible)
  1751. {
  1752. var e = m.explosion[a];
  1753. e.visible = true;
  1754. e.direction = d;
  1755. e.x = x;
  1756. e.y = y;
  1757. e.speed = sp;
  1758. e.frame = 0;
  1759. break;
  1760. }
  1761. }
  1762. };
  1763. function spawnAlien(x,y,d,sp,hp,r)
  1764. {
  1765. for (var a=0;a<m.aliens.length;a++)
  1766. {
  1767. if (!m.aliens[a].visible)
  1768. {
  1769. var e = m.aliens[a];
  1770. e.visible = true;
  1771. e.direction = d;
  1772. e.w = e.spritesheet.framewidth;
  1773. e.h = e.spritesheet.frameheight;
  1774. e.x = x;
  1775. e.y = y;
  1776. e.originx = x;
  1777. e.originy = y;
  1778. e.killed = false;
  1779. e.targetx = x;
  1780. e.targety = y;
  1781. e.hp = hp;
  1782. e.speed = sp;
  1783. e.basespeed = sp;
  1784. e.frame = 0;
  1785. e.row = r;
  1786. e.nextthink = 16;
  1787. e.decay = 0;
  1788. e.basenextthink = e.nextthink;
  1789. e.startframe = 0;
  1790. e.inpain = 0;
  1791. e.diving = false;
  1792. e.divestage = 0;
  1793. e.mod = 0;
  1794. e.moddir = "right";
  1795. g.aliensarray.push(e);
  1796. break;
  1797. }
  1798. }
  1799. };
  1800. function spawnBonusChance(o)
  1801. {
  1802. if ((rnd(100) < 50) && g.pausemode < 1)
  1803. {
  1804. spawnBonus(o.x, o.y);
  1805. }
  1806. };
  1807. function spawnBonus(x,y)
  1808. {
  1809. for (var a=0;a<m.bonusitems.length;a++)
  1810. {
  1811. if (!m.bonusitems[a].visible)
  1812. {
  1813. var s = m.bonusitems[a];
  1814. var row = rnd(parseInt(m.spritesheets["bonussheet"].height) / parseInt(m.spritesheets["bonussheet"].frameheight)) - 1;
  1815. if (row > 0 && g.level < 3) row = 0;
  1816. if (row == 2 && g.level < 7) row = 0;
  1817. //if (row == 2 && m.player.shottype == 3) { row = 0; }
  1818. s.visible = true;
  1819. s.x = x;
  1820. s.y = y;
  1821. s.direction = 4;
  1822. s.speed = 12;
  1823. s.dying = 0;
  1824. s.row = row;
  1825. if (row == 2)
  1826. {
  1827. s.mod = 0.1;
  1828. }
  1829. s.bounced = false;
  1830. s.landed = false;
  1831. s.decay = 0;
  1832. break;
  1833. }
  1834. }
  1835. };
  1836. function spawnAlienBomb(o)
  1837. {
  1838. if (rnd(500) > (g.level * 3)) { return; }
  1839. if (!o.visible) { return; }
  1840. if (g.pausemode > 0) { return; }
  1841. //if (!o.diving) { return; }
  1842. if ((o.x + o.w) < 0) { return; }
  1843. if (o.x > g.canvaswidth) { return; }
  1844. if (g.alienbombcooldown > 2) { return; }
  1845. if (g.mode != "game") { return; }
  1846. if (m.player.dying) { return; }
  1847. var d = 4;
  1848. for (var a=0;a<m.alienbomb.length;a++)
  1849. {
  1850. if (!m.alienbomb[a].visible)
  1851. {
  1852. var s = m.alienbomb[a];
  1853. s.visible = true;
  1854. s.direction = d;
  1855. s.x = o.x + (o.w/2);
  1856. s.y = o.y + (o.h/2);
  1857. s.spawny = o.y + 16;
  1858. s.decay = 0;
  1859. s.opacity = 1;
  1860. s.row = 0;
  1861. s.xmod = 0;
  1862. s.speed = 8;
  1863. //if (g.level > 6 && rnd(100) < 49 && (o.y < (g.canvasheight - 250)))
  1864. if (o.diving && (o.y < (g.canvasheight - 250)))
  1865. {
  1866. s.speed = 4;//(g.level / 2) + 2;
  1867. s.row = 1;
  1868. calculateMods(o,m.player,s);
  1869. }
  1870. break;
  1871. }
  1872. }
  1873. };
  1874. function calculateModsAlien(a)
  1875. {
  1876. var steps = (a.ghosty - (a.y + a.h)) / a.speed;
  1877. var gx = a.ghostx; //a.divestage == 2 ? m.player.x : a.ghostx;
  1878. a.xmod = (gx - a.x) / steps;
  1879. };
  1880. function calculateMods(a,p,o)
  1881. {
  1882. var steps = ((p.y + p.h) - (a.y + a.h)) / o.speed;
  1883. o.xmod = (p.x - a.x) / steps;
  1884. };
  1885. function spawnLaser(x,y)
  1886. {
  1887. try
  1888. {
  1889. if (m.player.dying || g.pausemode > 0) return;
  1890. for (var b=0;b < m.player.shottype;b++)
  1891. {
  1892. for (var a=0;a<m.lasers.length;a++)
  1893. {
  1894. if (!m.lasers[a].visible)
  1895. {
  1896. var s = m.lasers[a];
  1897. s.visible = true;
  1898. s.y = y;
  1899. s.x = x;
  1900. if (m.player.shottype == 1)
  1901. {
  1902. s.x = x;
  1903. } else if (m.player.shottype == 2)
  1904. {
  1905. s.x = b < 1 ? x - 16 : x + 16;
  1906. } else if (m.player.shottype == 3)
  1907. {
  1908. s.x = b < 1 ? x - 16 : (b == 2 ? x : x + 16);
  1909. s.y = b == 2 ? y - 8 : y;
  1910. }
  1911. s.speed = 8;
  1912. s.dead = false;
  1913. s.damage = 1;
  1914. s.h = 16;
  1915. var c1 = 100 + rnd(155);
  1916. var c2 = 100 + rnd(155);
  1917. var c3 = 100 + rnd(155);
  1918. s.color = "255,255,255";
  1919. g.shotsfired ++;
  1920. break;
  1921. }
  1922. }
  1923. }
  1924. }
  1925. catch (e)
  1926. {
  1927. write("SpawnLaser: " + e.message);
  1928. }
  1929. };
  1930. function dotExplosion(o)
  1931. {
  1932. for (var a=0;a < 8;a ++)
  1933. {
  1934. spawnDot(o.x,o.y);//g.explosionColours[rnd(g.explosionColours.length-1)]);
  1935. }
  1936. };
  1937. function dotBombExplosion(o)
  1938. {
  1939. for (var a=0;a < 4;a ++)
  1940. {
  1941. spawnDot(o.x,o.y,o.row == 0 ? "#bf0000" : "#bf0000");//g.explosionColours[rnd(g.explosionColours.length-1)]);
  1942. }
  1943. };
  1944. function dotBlobExplosion(o)
  1945. {
  1946. for (var a=0;a < 32;a ++)
  1947. {
  1948. spawnDot(o.x + (o.w / 2),o.y,"#bf0000");//g.explosionColours[rnd(g.explosionColours.length-1)]);
  1949. }
  1950. };
  1951. function spawnDot(x,y,c)
  1952. {
  1953. try
  1954. {
  1955. if (m.player.dying) return;
  1956. for (var a=0;a<dots.length;a++)
  1957. {
  1958. if (!dots[a].visible)
  1959. {
  1960. var s = dots[a];
  1961. s.visible = true;
  1962. s.x = x;
  1963. s.y = y;
  1964. s.speed = (2 + rnd(6)) * -1;
  1965. s.dir = 4;
  1966. s.xmod = rnd(10) < 5 ? rnd(4) : rnd(4) * -1;
  1967. if (c)
  1968. { s.colour = c;
  1969. s.colourindex = -1;
  1970. } else {
  1971. s.colour = g.explosionColours[0];
  1972. s.colourindex = 0;
  1973. s.nextthink = 10;
  1974. }
  1975. s.w = 1 + rnd(3);
  1976. s.h = s.w;
  1977. break;
  1978. }
  1979. }
  1980. }
  1981. catch (e)
  1982. {
  1983. write("SpawnDot: " + e.message);
  1984. }
  1985. };
  1986. function writeString(s,x,y)
  1987. {
  1988. var o = m.spritesheets["numberssheet"];
  1989. for (var a=0;a<s.length;a++)
  1990. {
  1991. x += o.framewidth;
  1992. var i = s.substr(a,1);
  1993. g.ctx.drawImage(o.image, i*o.framewidth, 0, o.framewidth, o.frameheight, x, y, o.framewidth, o.frameheight);
  1994. }
  1995. };
  1996. function writeLevel()
  1997. {
  1998. var ph = new String();
  1999. var ph2 = new String(g.level);
  2000. var ls = ph2.length;
  2001. var s = new String();
  2002. for (var b = 0; b < ph2.length; b++) s += ph2.substring(b,b+1);
  2003. writeString(s,190,200);
  2004. };
  2005. function hiScore()
  2006. {
  2007. try
  2008. {
  2009. var sScore = new String();
  2010. var sInScore = new String(m.player.hiscore);
  2011. var ls = sInScore.length;
  2012. var s = new String();
  2013. for (var a = 0; a < (8-ls); a++) s += "0";
  2014. for (var b = 0; b < sInScore.length; b++) s += "" + sInScore.substring(b,b+1);
  2015. writeText(s,g.textcentre,26,28,SCOREFONT)
  2016. }
  2017. catch (e)
  2018. {
  2019. write(e.message);
  2020. }
  2021. };
  2022. function updateScore()
  2023. {
  2024. try
  2025. {
  2026. m.player.score += 50;
  2027. if (m.player.score > m.player.targetscore) m.player.score = m.player.targetscore;
  2028. if (m.player.score > m.player.hiscore)
  2029. {
  2030. m.player.hiscore = Math.round(m.player.score);
  2031. localStorage.setItem(GAMETITLE + "-hiscore", m.player.hiscore);
  2032. }
  2033. if (m.player.score > 99999999) m.player.score = 99999999;
  2034. var sScore = new String();
  2035. var sInScore = new String(m.player.score);
  2036. var ls = sInScore.length;
  2037. var s = new String();
  2038. for (var a = 0; a < (8-ls); a++) s += "0";
  2039. for (var b = 0; b < sInScore.length; b++) s += "" + sInScore.substring(b,b+1);
  2040. if (m.player.score >= 500000 && !g.bonuslife1)
  2041. {
  2042. m.player.lives ++;
  2043. spawnTextSprite(m.player,textdata[16]);
  2044. g.bonuslife1 = true;
  2045. }
  2046. if (m.player.score >= 1000000 && !g.bonuslife2)
  2047. {
  2048. m.player.lives ++;
  2049. spawnTextSprite(m.player,textdata[16]);
  2050. g.bonuslife2 = true;
  2051. }
  2052. if (m.player.score >= 1500000 && !g.bonuslife3)
  2053. {
  2054. m.player.lives ++;
  2055. spawnTextSprite(m.player,textdata[16]);
  2056. g.bonuslife3 = true;
  2057. }
  2058. if (m.player.score >= 2000000 && !g.bonuslife4)
  2059. {
  2060. m.player.lives ++;
  2061. spawnTextSprite(m.player,textdata[16]);
  2062. g.bonuslife4 = true;
  2063. }
  2064. writeText(s,g.textcentre,26,28,SCOREFONT)
  2065. }
  2066. catch (e)
  2067. {
  2068. write("Score: " + e.message);
  2069. }
  2070. };
  2071. function scanInput(e)
  2072. {
  2073. if (window.event) keypress = e.keyCode;
  2074. else if(e.which) keypress = e.which;
  2075. switch (keypress)
  2076. {
  2077. case 16: // SHIFT
  2078. break;
  2079. case 18: // ALT
  2080. break;
  2081. case 32: // Space
  2082. if (g.mode == "title") setGame();
  2083. break;
  2084. case 38: // Up
  2085. break;
  2086. case 40: // Down
  2087. break;
  2088. case 39: // Right
  2089. m.player.moveleft = false;
  2090. m.player.moveright = true;
  2091. break;
  2092. case 37: // Left
  2093. m.player.moveleft = true;
  2094. m.player.moveright = false;
  2095. break;
  2096. case 67: // C
  2097. g.console.style.display = g.console.style.display == "none" ? "block" : "none";
  2098. break;
  2099. case 80: // P
  2100. g.pausemode ++; if (g.pausemode > 1) g.pausemode = 0;
  2101. break;
  2102. case 83: // S
  2103. g.audiomode ++; if (g.audiomode > 1) g.audiomode = 0;
  2104. handleAudio();
  2105. break;
  2106. case 17: // CTRL
  2107. case 90: // Z
  2108. if (g.mode == "title") setGame();
  2109. break;
  2110. }
  2111. };
  2112. function stopMove(e)
  2113. {
  2114. if (window.event) // IE
  2115. {
  2116. keyup = e.keyCode;
  2117. }
  2118. else if(e.which)
  2119. {
  2120. keyup = e.which;
  2121. }
  2122. var k = 0;
  2123. if (keyup >= 48 && keyup <= 57)
  2124. {
  2125. k = (48 - keyup) * -1;
  2126. }
  2127. switch (keyup)
  2128. {
  2129. case 16: // SHIFT
  2130. break;
  2131. case 18: // ALT
  2132. break;
  2133. case 32: // Space
  2134. break;
  2135. case 38: // Up
  2136. m.player.shottype ++; if (m.player.shottype > 3) { m.player.shottype = 3; }
  2137. break;
  2138. case 40: // Down
  2139. m.player.shottype --; if (m.player.shottype < 1) { m.player.shottype = 1; }
  2140. break;
  2141. case 39: // Right
  2142. m.player.moveright = false;
  2143. break;
  2144. case 37: // Left
  2145. m.player.moveleft = false;
  2146. break;
  2147. case 67: // C
  2148. break;
  2149. case 75: // K
  2150. playerDeath();
  2151. break;
  2152. case 83: // S
  2153. break;
  2154. case 17: // CTRL
  2155. case 90: // Z
  2156. if (g.mode == "game" && g.playmode != "touch") spawnLaser(m.player.x + (m.player.w / 2) - 2, m.player.y - 8);
  2157. break;
  2158. }
  2159. };
  2160. window.onorientationchange = function(event) {
  2161. setCanvasDimensions(event);
  2162. };