game.js 47 KB

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