/* HyperGunner An HTML5 game by Mark Wilcox (C) Mark Wilcox */ var GAMETITLE = "HYPERGUNNER"; var SCOREFONT = "Arial, Sans-Serif"; var IPHONEHACK = true; var ISPORTRAIT = true; /* -- AJAX ---------------------------------------------------------------------------- */ var AJAX = { "user" : "mark", "pass" : "", "gameId" : "", "playerId" : "", "ts" : "", "score" : "", "url" : "senddata.php" }; function getData() { AJAX.gameId = ""; AJAX.playerId = ""; g.displayBanner = 0; g.qs = window.location.search.substring(1).split("&"); for (var a=0;a < g.qs.length;a++) { var s = g.qs[a].split("="); write(s[0] + " = " + s[1]); switch(s[0]) { case "banner": g.displayBanner = s[1]; break; case "gameId": AJAX.gameId = s[1]; break; case "playerId": AJAX.playerId = s[1]; break; } } }; function postData() { AJAX.ts = g.time; AJAX.score = m.player.score; $.ajax({ url: AJAX.url, type: "get", data: "user=" + AJAX.user + "&pass=" + AJAX.pass + "&gameId=" + AJAX.gameId + "&playerId=" + AJAX.playerId + "&ts=" + AJAX.ts + "&score=" + AJAX.score, success: function(msg){ write("Data Sent Successfully !"); }, error: function(jqXHR, textStatus, errorThrown) { write("Send error: " + jqXHR); write("Send error (" + textStatus + "): " + errorThrown); } }); write("SENT user = " + AJAX.user); write("SENT pass = " + AJAX.pass); write("SENT gameId = " + AJAX.gameId); write("SENT playerId = " + AJAX.playerId); write("SENT ts = " + AJAX.ts); write("SENT score = " + AJAX.score); }; /* ------------------------------------------------------------------------------------ */ var g = {}; // Define the global namespace. g.characterset = new Image(); g.characterset.src = "library/characterset.gif"; var m = { // Game media namespace. spritesheets : [], player : null, monster : [], numbers : null, explosion : [], playermissile : [], spark : [], entity : [], alienbomb : [] }; var stars = []; var gameaudio = []; g.checkSum = gamedata.imageFiles.length; // + gamedata.audioFiles.length; g.checkCount = 1; g.imageData = []; g.audioData = []; g.colours = []; g.colours[0] = "#bf0000"; g.colours[1] = "#4386d0"; g.colours[2] = "#28d98c"; g.colours[3] = "#3de231"; g.colours[4] = "#d8e231"; g.colours[5] = "#feba4f"; g.colours[6] = "#fe5b4f"; g.colours[7] = "#fe4fd7"; g.colours[8] = "#ca4ffe"; function createStars() { for (var a=0;a<20;a++) { stars[a] = new star("star"+a, rnd(g.canvaswidth), rnd(g.canvasheight), 4, rnd(4)+1, 4, g.colours[rnd(g.colours.length)-1]); } }; function createSprites() { // Load game media for (var a=0;a= g.checkSum) { createSprites(); } }; function init() { try { g.canvas = document.querySelector('canvas'); g.ctx = g.canvas.getContext('2d'); g.canvas.setAttribute('class', 'canvas'); g.banad = document.getElementById("banad"); g.canvaswidth = 320; g.canvasheight = 460; g.canvaspadding = 32; g.ori = 0; setResolution(); setCanvasDimensions(); g.canvas.style.backgroundColor = "#142760"; g.nextthink = 0; g.console = document.getElementById('console'); g.console.style.display = 'none'; g.console.style.textAlign = 'left'; write("Console ready."); BrowserDetect.init(); write("Browser: " + BrowserDetect.browser + " " + BrowserDetect.version); write("OS: " + BrowserDetect.OS); write("Language: " + BrowserDetect.Language); var br = new String(BrowserDetect.OS); g.framedelay = 30; g.ISIPHONE = false; if (br.indexOf("iPhone") != -1) { //if (IPHONEHACK) { g.framedelay = 0; } g.ISIPHONE = true; } g.thousandseparator = textformat.thousandseparator; g.banad.style.display = "none"; pickAdURL(); g.pausemode = 0; g.audiomode = 1; window.scrollTo(0,0) preCache(); } catch (e) { write("!!"+e.message); } }; function setResolution() { var w = 0; var h = 0; if(document.all){ h = document.body.offsetHeight; w = document.body.offsetWidth; } else { h = innerHeight; w = innerWidth; } g.canvaswidth = 320; g.canvasheight = 480; /* // force resolution on larger devices if (w > 640) { var pc = (h / w); w = 640; h = Math.round(w * pc); } // avoid splitting integers if (w % 2 > 0) w ++; if (h % 2 > 0) h ++; if (ISPORTRAIT) { if (w > h) { g.canvaswidth = h; g.canvasheight = w; } else { g.canvaswidth = w; g.canvasheight = h; } } else { if (h > w) { g.canvaswidth = h; g.canvasheight = w; } else { g.canvaswidth = w; g.canvasheight = h; } } */ }; function setCanvasDimensions(e) { g.canvaspadding = 32; g.displaypadding = 0; if (typeof(window.orientation)!="undefined") { g.ori = window.orientation; // 0, -90 or 90 } g.canvas.width = g.canvaswidth; g.canvas.height = g.canvasheight; g.textcentre = g.canvaswidth / 2; g.canvascentre = g.canvasheight / 2; window.scrollTo(0,1); }; function initTouch() { if(checkForTouch()) { if (document.body.addEventListener) { document.body.addEventListener('touchmove', touchMove, false); document.body.addEventListener('touchstart', touchStart, false); } else { window.addEventListener('touchmove', touchMove, false); window.addEventListener('touchstart', touchStart, false); } } else { window.addEventListener('mousemove', mouseMove, false); window.addEventListener('mouseup', mouseUp, false); } }; function initHiScore() { m.player.hiscore = 0; if (typeof localStorage.key == "function") { if (localStorage.getItem(GAMETITLE + "-hiscore") != null) { m.player.hiscore = localStorage.getItem(GAMETITLE + "-hiscore"); } } }; function sfx(o) { return; if (g.audiomode > 0) { o.play(); } }; function handleAudio() { if (g.audiomode < 1) { soundManager.pauseAll(); } else { soundManager.resumeAll(); } }; function checkForTouch() { var d = document.createElement("div"); d.setAttribute("ontouchmove", "return;"); return typeof d.ontouchmove == "function" ? true : false; }; function touch(event) { if (g.mode == "title" && g.resetting < 70) setGame(); if (g.mode == "pregame") { setLevel(); g.mode = "levelup"; } var o = m.player; var tx = (event.pageX - (g.canvas.offsetParent ? g.canvas.parentNode.offsetLeft : 0)) - (o.w / 2); var ty = (event.pageY - (g.canvas.offsetParent ? g.canvas.parentNode.offsetTop : 0)) - (o.h / 2); if (g.pausemode < 1) { o.x = tx; } if (tx < 32 && ty < 32) g.pausemode ++; if (g.pausemode > 1) g.pausemode = 0; //if (tx < 72 && (ty > 96 && ty < 140)) //{ // g.audiomode ++; if (g.audiomode > 1) g.audiomode = 0; // handleAudio(); //} }; function touchStart(event) { touch(event.touches[0]); window.scrollTo(0, 1); spawnLaser(m.player); event.preventDefault(); }; function touchMove(event) { touch(event.touches[0]); spawnLaser(m.player); }; function mouseMove(event) { touch(event); spawnLaser(m.player); }; function mouseUp(event) { spawnLaser(m.player); }; function setSplash() { g.mode = "splash"; g.resetting = 100; g.banad.style.display = "none"; }; function setTitle() { g.mode = "title"; g.resetting = 80; g.canvas.style.backgroundImage = "none"; g.canvas.style.backgroundColor = "#142760"; g.banad.style.display = "block"; }; function setGame() { g.banad.style.display = "none"; g.mode = "pregame"; g.canvas.style.backgroundImage = "none"; g.canvas.style.backgroundColor = "#142760"; g.time = new Date(); m.player.score = 0; m.player.targetscore = 0; m.player.lives = 3; m.player.gunmode = 0; g.level = 1; g.levelwave = 0; g.wavetype = 0; g.resetting = 1000; g.levelwavemultiplier = 2; g.warplength = 200; g.saucermode = 0; m.player.energy = 0; m.player.milestohome = 20000000000; m.player.totalstars = 0; createStars(); g.extralife = 0; sfx(gameaudio["titlemusic"]); }; function endGame() { g.mode = "endgame"; m.starfighter.x = (g.canvaswidth / 2) - (m.starfighter.w / 2); m.starfighter.y = -28; m.starfighter.row = 0; }; function finallyHome() { g.canvas.style.backgroundImage = "url('" + g.gamebackdrops[1].src + "')"; g.canvas.style.backgroundRepeat = "no-repeat"; g.canvas.style.backgroundColor = "#00cc00"; g.mode = "finallyhome"; m.starfighter.x = (g.canvaswidth / 2) - (m.starfighter.w / 2) - 32; m.starfighter.y = -28; m.starfighter.row = 1; wipe(true); }; function setStars() { for (var a=0;a leveldata.length) ? 0 : g.level-1; aa = leveldata[l].aliens.split(","); var c = 0; m.player.aliencount = 0; g.levelaliens = 0; if (g.wavetype != 0) { for (var row=0;row<2;row++) { for (var a=0;a<4;a++) { var x = ((g.canvaswidth / 2) - 80) + (a * 40); var y = 128 + (row * 40); var d = 0; switch (g.wavetype) { case 1: d = (row == 0) ? 0 : (a < 2) ? 5 : 3; break; case 2: case 5: d = (row == 0) ? ((a < 2) ? 7 : 1) : (a < 2) ? 5 : 3; break; case 3: case 6: d = (row == 0) ? ((a < 2) ? 5 : 3) : (a < 2) ? 7 : 1; break; case 4: d = (row == 0) ? 2 : 6; break; } var s = 2; var f = 0; var ty = -1; var hp = g.level; spawnMonster(x,y,d,s,f,1,rnd(5)+1,hp); c ++; g.levelaliens ++; } } sfx(gameaudio["regen"]); } else { for (var a=0;a < 16;a++) { var x = g.canvaswidth / 2; var y = (a * 64) * -1; var d = 4; var s = 4; var f = 0; var ty = 1; var hp = 2; spawnMonster(x,y,d,s,f,1,rnd(5),hp); c ++; g.levelaliens ++; } } g.wavetype ++; if (g.wavetype > 6) g.wavetype = 0; }; function wipe(doentities) { for (var a=0;a 0) { o.magicpower --; } else { o.row = 0; } try { if (isNaN(o.attacking)) o.attacking = 0; if (o.attacking > 0) { o.attacking --; o.frame = o.spritesheet.attackframe; } else { g.ctx.save(); if (o.dying > 0) { o.angle += 45; if (o.angle > 360) o.angle = 0; g.ctx.translate(o.x + (o.w/2),o.y + (o.h/2)); spawnExplosion(o,1,rnd(3)); g.ctx.rotate(o.angle * (Math.PI / 180)); g.ctx.drawImage(o.spritesheet.image, o.frame * o.spritesheet.framewidth, 0, o.w, o.h, -o.w/2, -o.h/2, o.w, o.h); o.dying --; if (o.dying < 1) { if (m.player.lives < 1) { g.mode = "gameover"; g.miles = thousandSeparator(m.player.milestohome, g.thousandseparator) g.resetting = 100; g.banad.style.display = "block"; g.time = new Date() - g.time; } else { setLevel(); } } } else { if (o.targetx < 0 && o.targety < 0) getDirection(o); if (isNaN(o.frame)) o.frame = o.startframe; o.framedelay --; if (o.framedelay < 0) { o.framedelay = o.framedelaymax; o.frame ++; if (o.frame >= (o.startframe + o.spritesheet.framesperdirection)) { o.frame = o.startframe; } if (o.magicpower > 0 && o.magicpower < 50) { o.row ++; if (o.row > 1) o.row = 0; } } if (o.inpain > 0) { o.frame = o.spritesheet.painframe; o.inpain --; } 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); } g.ctx.restore(); } } catch (e) { write(o.frame + " - " + e.message); } }; function draw(o) { if (!o.visible) return; try { if (o.decay > 0) { o.decay --; if (o.decay < 1) { remove(o); sparkShower(o); } } if (isNaN(o.attacking)) o.attacking = 0; if (o.attacking > 0) { o.attacking --; o.frame = o.spritesheet.attackframe; } else { if (isNaN(o.frame)) o.frame = o.startframe; o.framedelay --; if (o.framedelay < 0) { o.framedelay = o.framedelaymax; o.frame ++; if (o.frame >= (o.startframe + o.spritesheet.framesperdirection)) { if (o.spritesheet.type == "explosion") { remove(o); } else { o.frame = o.startframe; } } } } if (o.inpain > 0) { o.frame = o.spritesheet.painframe; o.inpain --; o.y += 4; } if (o.spritesheet.type == "playermissile") { o.row = Math.round(m.player.gunmode); if (g.hyperdrive > 0) o.row = 5; } if (o.decay > 0 && o.decay < 50) { o.toggle ++; if (o.toggle > 1) o.toggle = 0; if (o.toggle < 1) { 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); } } else { 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); } } catch (e) { write(o.row + " - " + o.spritesheet.type + ", " + o.frame + " - " + e.message); } }; function drawStar(o) { try { g.ctx.fillStyle = o.colour; if (g.mode == "game") { o.size = g.hyperdrive > 0 ? o.basesize * 4 : o.basesize; } else if (g.mode == "endlevel") { if (g.resetting <= (g.warplength / 2)) { o.size -= 0.5; } else { o.size += 0.5; } } else if (g.mode == "endgame") { g.ctx.fillStyle = rnd(10) < 5 ? "#4362b2" : "#365298"; o.size = 64; o.direction = 0; } g.ctx.fillRect(o.x,o.y,2,o.size); } catch (e) { write(o.id); } }; function moveStar(o) { if (g.mode == "game") { o.speed = g.hyperdrive > 0 ? o.basespeed * 8 : o.basespeed; } else if (g.mode == "endlevel") { if (g.resetting <= (g.warplength / 2)) { o.speed -= 0.5; } else { o.speed += 0.5; } } else if (g.mode == "endgame") { o.speed = o.basespeed + 16; } switch (o.direction) { case 0: o.y -= o.speed; break; case 1: o.y -= (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 2: o.x += o.speed; break; case 3: o.y += (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 4: o.y += o.speed; break; case 5: o.y += (o.speed / 1.5); o.x -= (o.speed / 1.5); break; case 6: o.x -= o.speed; break; case 7: o.y -= (o.speed / 1.5); o.x -= (o.speed / 1.5); break; } if ((o.x + o.w) < 0) o.x = o.canvaswidth; if (o.x > g.canvaswidth) o.x = (o.size * -1); if ((o.y + o.size) < 0) o.y = g.canvasheight; if (o.y > g.canvasheight) o.y = o.size * -1; }; function getDirection(o) { o.direction = -1; if (o.moveup) { o.direction = 0; o.angle = 0; if (o.moveleft) { o.direction = 7; o.angle = 315; } if (o.moveright) { o.direction = 1; o.angle = 45; } } if (o.movedown) { o.direction = 4; o.angle = 180; if (o.moveleft) { o.direction = 5; o.angle = 225; } if (o.moveright) { o.direction = 3; o.angle = 135; } } if (o.moveleft) { o.direction = 6; o.angle = 270; if (o.moveup) { o.direction = 7; o.angle = 315; } if (o.movedown) { o.direction = 5; o.angle = 225; } } if (o.moveright) { o.direction = 2; o.angle = 90; if (o.moveup) { o.direction = 1; o.angle = 45; } if (o.movedown) { o.direction = 3; o.angle = 135; } } if (o.direction >= 0) o.lastdirection = o.direction; }; function movePlayer(o) { if (!o.visible || g.pausemode > 0) return; o.oldx = o.x; o.oldy = o.y; if (o.moveleft) { o.direction = 6; } else if (o.moveright) { o.direction = 2; } else { o.direction = -1; } switch (o.direction) { case 2: o.x += o.speed; break; case 6: o.x -= o.speed; break; } if (o.x < 0) { o.x = o.oldx; o.moveleft = false; } if ((o.x + o.w) > g.canvaswidth) { o.x = o.oldx; o.moveright = false; } }; function moveToTarget(o) { if (!o.visible || o.dead || o.dying || g.pausemode > 0) return; o.oldx = o.x; o.oldy = o.y; if (o.targetx < 0 && o.targety < 0) { switch (o.direction) { case 0: o.y -= o.speed; break; case 1: o.y -= (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 2: o.x += o.speed; break; case 3: o.y += (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 4: o.y += o.speed; break; case 5: o.y += (o.speed / 1.5); o.x -= (o.speed / 1.5); break; case 6: o.x -= o.speed; break; case 7: o.y -= (o.speed / 1.5); o.x -= (o.speed / 1.5); break; } } else { if (o.spritesheet.type == "entity") { if (o.y >= o.targety) { if (o.bounced == 0) { o.bounced = 3; } else { if (o.bounced > 1) { o.bounced --; o.y = o.y - (o.bounced * 4); o.speed = (o.bounced * -4); } else { o.speed = 0; } } } if (o.dying > 0) { if (o.targetx > o.x) { o.x += o.speed; } if (o.targetx < o.x) { o.x -= o.speed; } if (o.targety < o.y) { o.y -= o.speed; } if (o.targety > o.y) { o.y += o.speed; } if (o.y < 0) { remove(o); } } if (o.bounced > 0) o.speed += 2; if (o.y < o.targety) { o.y += o.speed; } } else { if (o.targetx > o.x) { o.x += o.speed; } if (o.targetx < o.x) { o.x -= o.speed; } if (o.targety < o.y) { o.y -= o.speed; } if (o.targety > o.y) { o.y += o.speed; } } } if (o.dying < 1) { if (o.x < g.canvaspadding) o.x = g.canvaspadding; if ((o.x + o.w) > (g.canvaswidth - g.canvaspadding)) o.x = g.canvaswidth - g.canvaspadding - o.w; if (o.y < g.canvaspadding) o.y = g.canvaspadding; if ((o.y + o.h) > (g.canvasheight - g.canvaspadding)) o.y = g.canvasheight - g.canvaspadding - o.h; } }; function move(o) { if (!o.visible || g.pausemode > 0) return; switch (o.direction) { case 0: o.y -= o.speed; break; case 1: o.y -= (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 2: o.x += o.speed; break; case 3: o.y += (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 4: o.y += o.speed; break; case 5: o.y += (o.speed / 1.5); o.x -= (o.speed / 1.5); break; case 6: o.x -= o.speed; break; case 7: o.y -= (o.speed / 1.5); o.x -= (o.speed / 1.5); break; } if ((o.x + o.w) < 0) remove(o); if (o.x > g.canvaswidth) remove(o); if ((o.y - o.h) < 0 && o.spritesheet.type != "starfighter") remove(o); if (g.mode == "finallyhome" && o.y > (g.canvasheight - 170)) { g.mode = "landed"; } if (o.y > g.canvasheight) { if (g.mode == "endgame") { finallyHome(); } else { remove(o); } } }; function moveAlien(o) { if (!o.visible || g.pausemode > 0) return; if ((g.wavetype-1) != 0) { o.nextthink --; if (o.nextthink < 1) { o.nextthink = o.basenextthink; if (o.row == 0) { o.direction = rnd(10) <= 5 ? 2 : 6; } else { changeDirection(o); } } } switch (o.direction) { case 0: o.y -= o.speed; break; case 1: o.y -= (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 2: o.x += o.speed; break; case 3: o.y += (o.speed / 1.5); o.x += (o.speed / 1.5); break; case 4: o.y += o.speed; break; case 5: o.y += (o.speed / 1.5); o.x -= (o.speed / 1.5); break; case 6: o.x -= o.speed; break; case 7: o.y -= (o.speed / 1.5); o.x -= (o.speed / 1.5); break; } if (o.row == 0) { if ((o.x + o.w) > g.canvaswidth) { o.direction = 6; } if (o.x < 0) { o.direction = 2; } } if ((g.wavetype-1) == 0) { if (isNaN(o.mod)) { o.mod = 0; o.moddir = "right"; } if (o.moddir == "right") { o.x += o.mod; if ((o.x + o.mod) > (g.canvaswidth - o.w)) { o.mod = 0; o.moddir = "left"; } } else { o.x -= o.mod; if ((o.x + o.mod) < (o.w)) { o.mod = 0; o.moddir = "right"; } } o.mod += o.moddir == "right" ? (((o.x > g.canvaswidth / 4) * 3) ? (g.canvaswidth-o.x)*-0.0001 : 0.05) : (o.x < g.canvaswidth / 4) ? (o.x)*-0.001 : 0.05; if (o.y > g.canvasheight) o.y = -32; } }; function changeDirection(o) { switch (o.direction) { case 0: o.direction = 4; break; case 1: o.direction = 5; break; case 2: o.direction = 6; break; case 3: o.direction = 7; break; case 4: o.direction = 0; break; case 5: o.direction = 1; break; case 6: o.direction = 2; break; case 7: o.direction = 3; break; } }; function changeRow(r,d) { for (var a=0;a 0) return; var ox = o.x; var oy = o.y; var ow = o.w; var oh = o.h; var mx = m.player.x; var my = m.player.y; var mw = m.player.w; var mh = m.player.h; var c1 = false, c2 = false, c3 = false, c4 = false; if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true; if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true; if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true; if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true; if (c1 == true || c2 == true || c3 == true || c4 == true) { if (o.spritesheet.type == "monster") { remove(o); sparkShower(o); if (m.player.magicpower > 0) { m.player.targetscore += 10; } else { playerDeath(); } } else { bootMonster(o); } } }; function bootMonster(o) { if (o.dying) return; m.player.targetscore += 10; o.speed = 32; sparkShower(o); remove(o); }; function entityCollision(o,m) // Entity and Player passed in. Alien bombs are entities. { if (!o.visible || !m.visible || m.dead || m.dying > 0 || o.dying > 0 || g.pausemode > 0) return; var ox = o.x; var oy = o.y; var ow = o.w; var oh = o.h; var mx = m.x; var my = m.y; var mw = m.w; var mh = m.h; var c1 = false, c2 = false, c3 = false, c4 = false; if (ox <= (mx+mw) && oy <= (my+mh) && ox >= (mx) && oy >= my) c1 = true; if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true; if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true; if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true; if (c1 == true || c2 == true || c3 == true || c4 == true) { if (m.spritesheet.type == "player") { if (o.spritesheet.type == "alienbomb") { if (m.magicpower < 1) { playerDeath(); } } else { if (o.spritesheet.type = "entity") { switch (o.row) { case 0: playerDeath(); break; case 1: m.totalstars ++; m.stars ++; m.targetscore += 10; if (g.hyperdrive < 1) m.energy += 4; if (m.energy > 100) { g.hyperdrive = 1000; m.energy = 0; sfx(gameaudio["hyperdrive"]); } break; case 2: m.scoremultiplier += 0.1; if (m.scoremultiplier > 50) m.scoremultiplier = 50; break; case 3: m.gunmode += 0.1; if (m.gunmode > 5) m.gunmode = 5; break; case 4: m.gunmode += 0.2; if (m.gunmode > 5) m.gunmode = 5; break; case 5: m.targetscore += 50; if (g.hyperdrive < 1) m.energy += 16; if (m.energy > 100) { g.hyperdrive = 1000; m.energy = 0; sfx(gameaudio['hyperdrive']); } break; } sfx(gameaudio['bonusitem']); m.targetscore += g.hyperdrive > 0 ? (o.row * (Math.round(m.scoremultiplier)*10)) * 2 : (o.row * (Math.round(m.scoremultiplier) * 10)); } } } remove(o); } }; function alienBombCollision(o,m) // Entity and Player passed in. { if (!o.visible || !m.visible || m.dead || m.dying > 0 || o.dying > 0 || g.pausemode > 0) return; var ox = o.x; var oy = o.y; var ow = o.w; var oh = o.h; var mx = m.x; var my = m.y; var mw = m.w; var mh = m.h; var t = 8; var c1 = false, c2 = false, c3 = false, c4 = false; if (ox <= (mx+(mw-t)) && oy <= (my+(mh-t)) && ox >= (mx+t) && oy >= (my+t)) c1 = true; if ((ox+ow) >= (mx+t) && oy >= (my+t) && (ox+ow) <= (mx+(mw-t)) && oy <= (my+(mh-t))) c2 = true; if (ox <= (mx+(mw-t)) && (oy+oh) >= (my+t) && ox >= (mx+t) && (oy+oh) <= (my+(mh-t))) c3 = true; if (((ox + ow) >= (mx+t)) && ((ox + ow) <= (mx + (mw-t))) && ((oy + oh) >= (my+t)) && ((oy + oh) <= (my + (mh-t)))) c4 = true; if (c1 == true || c2 == true || c3 == true || c4 == true) { remove(o); if (m.magicpower < 1) { playerDeath(); } } }; function monsterLaserCollision(o) // Laser passed in { if (!o.visible || o.dying > 0 || g.pausemode > 0) return; var ox = o.x; var oy = o.y; var ow = o.w; var oh = o.h; for (var a=0;a= (mx) && oy >= my) c1 = true; if ((ox+ow) >= mx && oy >= my && (ox+ow) <= (mx+mw) && oy <= (my+mh)) c2 = true; if (ox <= (mx+mw) && (oy+oh) >= my && ox >= mx && (oy+oh) <= (my+mh)) c3 = true; if (((ox + ow) >= mx) && ((ox + ow) <= (mx + mw)) && ((oy + oh) >= my) && ((oy + oh) <= (my + mh))) c4 = true; if (c1 == true || c2 == true || c3 == true || c4 == true) { remove(o); b.hp -= (m.player.gunmode + 1); if (b.inpain < 1) b.y -= 8; b.inpain = 2; if (b.hp < 1) { remove(b); spawnExplosion(b,0,1); if (b.row == 0) g.saucermode = 0; sfx(gameaudio['explosion']); spawnEntityChance(true,b); if (b.row > 0) { m.player.aliencount ++; m.player.targetscore += 50 * m.player.scoremultiplier; if (m.player.aliencount >= g.levelaliens) { if ((g.wavetype-1) == 0) for (var a=0;a 24) mg = 24; if (g.levelwave > mg) { for (var x=0;x<3;x++) { spawnEntity((b.x-32)+(x*32),b.y,(b.x-32)+(x*32),g.canvasheight - 64,3); } g.mode = "endlevel"; g.resetting = g.warplength; sfx(gameaudio['wavecomplete']); } else { setAliens(); } } } } m.player.lasercooldown = 0; } } } }; function writeText(t,x,y,s,f) { var sx = x; var grid = {}; grid.w = 10; grid.h = 16; var text = new String(t); g.ctx.save(); var ss = ""; g.ctx.font = "normal "+s+"px '"+f+"', Sans-Serif"; g.ctx.shadowOffsetX = 2; g.ctx.shadowOffsetY = 2; g.ctx.shadowBlur = 2; g.ctx.shadowColor = "rgba(0, 0, 0, 0.9)"; g.ctx.textAlign = "center"; g.ctx.fillStyle = "#ffffff"; g.ctx.fillText(text, x,y+8); g.ctx.restore(); }; /** ---------------------------------------------------------------- **/ /** ---------------------------------------------------------------- **/ function loop() { try { clearTimeout(g.ticker); g.ctx.save(); g.ctx.clearRect(0, 0, g.canvaswidth, g.canvasheight); switch (g.mode) { case "splash": g.ctx.drawImage(g.splash,0,0); g.resetting --; if (g.resetting < 0) { setTitle(); } break; case "title": hiScore(); g.ctx.drawImage(g.titlescreen, (g.canvaswidth/2) - 160, 80); writeText(textdata[1],g.textcentre,290,14,SCOREFONT); g.resetting --; if (g.resetting < 0) { g.resetting = 0; } break; case "pregame": g.ctx.drawImage(g.pregame, 0, (g.canvasheight/2)-80); for (var a=0;a 0) g.nextthink --; if (g.hyperdrive > 0) { g.hyperdrive --; m.player.milestohome -= 5000000 + rnd(500000); } for (var a=0;a 0) m.player.lasercooldown --; if (m.player.dying < 1) // i.e. not dying { for (var a=0;a= 10) { if (g.ave > 1500) g.framedelay = 24; // throttle the fast devices } } } catch (e) { write(e.message); } }; function drawEnergy() { if (m.player.dying > 0) return; var w = 300 * (m.player.energy / 100); g.ctx.fillStyle = "rgba(" + rnd(255) + "," + rnd(255) + ",0,0.8)"; g.ctx.fillRect(8,48,w,16); g.ctx.drawImage(g.staricon, 8, 38); }; function drawLevelFlags() { for (var a=0;a<((g.level*g.levelwavemultiplier)+1)-g.levelwave;a++) { g.ctx.drawImage(g.levelflag, 8 + (a * 10), g.canvasheight - 24); } }; function spawnMonsterChance() { if (rnd(100) < (10 + (g.level)) && g.pausemode < 1) { var x = -32; var y = -32; var d = 0; var s = 0; var f = 0; if (rnd(100) < 50) { // Aliens !! y = (g.canvaspadding * 2) + rnd(g.canvasheight / 2); if (rnd(10) < 5) { x = -32; d = 2; } else { x = g.canvaswidth; d = 6; } s = 1 + rnd(3); var row = parseInt(m.spritesheets["monstersheet"].height) / parseInt(m.spritesheets["monstersheet"].frameheight); spawnMonster(x,y,d,s,f,1,rnd(row)-1,10); } } }; function spawnSaucer() { if (g.saucermode > 0 || g.level < 7) return; if (rnd(100) < 10) { spawnMonster(0,64,2,2,0,1,0,100); g.saucermode = 1; } }; function spawnMonster(x,y,d,s,f,ty,row,hp) { if (ty == 1) { for (var a=0;a 0 || o.dying || g.mode != "game") return; for (var n = 0;n < (g.hyperdrive > 0 ? 5 : (o.gunmode < 3 ? 2 : 3));n++) { for (var a=0;a 0) { if (g.hyperdrive > 0) { if (n == 0) e.x = o.x; if (n == 1) e.x = (o.x + o.w) - e.w; if (n == 2) e.x = o.x + (o.w / 2) - (e.w / 2); if (n == 3) e.x = o.x - 16; if (n == 4) e.x = o.x + o.w + 16; } else { e.x = (n < 1) ? o.x : ((n < 2) ? (o.x + o.w) - e.w : o.x + (o.w / 2) - (e.w / 2)); } } else { e.x = o.x + (o.w / 2) - (e.w / 2); } e.y = (n > 1) ? o.y - (e.h * 1.5) : o.y - (e.h); e.frame = 0; e.startframe = 0; e.direction = 0; e.speed = 16; o.lasercooldown = o.lasercooldownmax; break; } } } sfx(gameaudio["playershot"]); }; function spawnExplosion(o,d,sp) { for (var a=0;a 20 || !o.visible || g.pausemode > 0 || o.y > (g.canvasheight - 80)) return; var d = 4; var sp = o.row == 0 ? 8 : (g.level/2); if (sp > 14) sp = 14; if (sp < 8) sp = 8; for (var a=0;a 10) return; if ((rnd(1000) < 5 || force == true) && g.pausemode < 1) { if (o != null) { x = o.x; y = o.y; tx = o.x; } else { x = (g.canvaspadding * 2) + rnd(g.canvaswidth / 2); tx = x; y = 32; } ty = g.canvasheight - 64; var row = (parseInt(m.spritesheets["entitysheet"].height) / parseInt(m.spritesheets["entitysheet"].frameheight)) + 1; var r = rnd(row) - 1; if (force) r = rnd(10) < 8 ? 1 : (rnd(10) < 5 ? 2 : 3); // Favour stars if (g.mode == "endlevel" || g.mode == "levelup" && r == 1) r = rnd(10) < 7 ? 2 : 3; // Over-ride for hyperspace if (g.level < 9 && r == 0) r = 1; spawnEntity(x,y,tx,ty,r); } }; function spawnEntity(x,y,tx,ty,row) { for (var a=0;a 50000 && g.extralife < 1) { m.player.lives ++; g.extralife = 1; } if (m.player.targetscore > 100000 && g.extralife < 2) { m.player.lives ++; g.extralife = 2; } if (m.player.targetscore > 150000 && g.extralife < 3) { m.player.lives ++; g.extralife = 3; } if (m.player.score > 99999999) m.player.score = 99999999; if (m.player.score > m.player.targetscore) m.player.score = m.player.targetscore; if (m.player.score > m.player.hiscore) { m.player.hiscore = m.player.score; localStorage.setItem(GAMETITLE + "-hiscore", m.player.hiscore); } var sScore = new String(); var sInScore = new String(m.player.score); var ls = sInScore.length; var s = new String(); for (var a = 0; a < (8-ls); a++) s += "0"; for (var b = 0; b < sInScore.length; b++) s += "" + sInScore.substring(b,b+1); writeString(s,(g.canvaswidth/2) - 64,0); //if (g.mode == "gameover") writeString(s,40,0); else writeString(s,90,0); } catch (e) { write(e.message); } }; function updateLives() { g.ctx.drawImage(g.playericon, 64, 8); var ph = new String(); var ph2 = new String(m.player.lives); var ls = ph2.length; var s = new String(); for (var b = 0; b < ph2.length; b++) s += ph2.substring(b,b+1); writeString(s,16,0); }; function updateEnergy() { return; g.ctx.drawImage(g.staricon, 230, 8); var ph = new String(); var ph2 = new String(m.player.energy); var ls = ph2.length; var s = new String(); for (var b = 0; b < ph2.length; b++) s += ph2.substring(b,b+1); writeString(s,240,0); }; function remove(o) { o.visible = false; }; function scanInput(e) { if (window.event) keypress = e.keyCode; else if(e.which) keypress = e.which; switch (keypress) { case 16: // SHIFT break; case 18: // ALT break; case 32: // Space break; case 38: // Up break; case 40: // Down break; case 39: // Right m.player.moveright = true; break; case 37: // Left m.player.moveleft = true; break; case 67: // C g.console.style.display = g.console.style.display == "none" ? "block" : "none"; break; case 80: // P g.pausemode ++; if (g.pausemode > 1) g.pausemode = 0; break; case 83: // S g.audiomode ++; if (g.audiomode > 1) g.audiomode = 0; handleAudio(); break; case 17: // CTRL case 90: // Z if (g.mode == "landed") setTitle(); if (g.mode == "title" && g.resetting < 1) setGame(); if (g.mode == "game") spawnLaser(m.player); if (g.mode == "pregame") { if (g.resetting < 950) { setLevel(); g.mode = "levelup"; } } break; } }; function stopMove(e) { if (window.event) // IE { keyup = e.keyCode; } else if(e.which) { keyup = e.which; } var k = 0; if (keyup >= 48 && keyup <= 57) { k = (48 - keyup) * -1; } switch (keyup) { case 16: // SHIFT break; case 18: // ALT break; case 32: // Space break; case 38: // Up break; case 40: // Down break; case 39: // Right m.player.moveright = false; break; case 37: // Left m.player.moveleft = false; break; case 67: // C break; case 83: // S break; case 17: // CTRL case 90: // Z break; } }; window.onorientationchange = function(event) { setCanvasDimensions(event); };