/* Dragons (C) Mark Wilcox More games at www.spacemonsters.co.uk */ var GAMETITLE = "DRAGONS"; var SCOREFONT = "Irish Grover"; var IPHONEHACK = true; var g = {}; var NUM = {}; g.go = 0; g.bg = []; var m = { spritesheets : [], player : null, explosion : [], lasers : [], monsters : [], bomb : [], textsprites : [], items : [], bonuses : [] }; var stars = []; var gameaudio = []; g.checkSum = gamedata.imageFiles.length;// + gamedata.audioFiles.length; g.checkCount = 0; g.imageData = []; g.audioData = []; g.aliensarray = []; g.gameback = []; g.channels = []; g.channels[0] = null; g.channels[1] = null; g.channels[2] = null; g.channels[3] = null; g.channels[4] = null; 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 createSprites() { try { // Load game media for (var a=0;a= g.checkSum) { createSprites(); } } catch (e) { write ("Check: " + e.message); } }; function rnd(threshold) { return Math.floor(Math.random()*threshold) + 1; }; 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.ori = 0; setCanvasDimensions(); g.canvas.style.backgroundColor = "#000"; 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); 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.nextthink = 0; g.banad.style.display = "none"; pickAdURL(); window.scrollTo(0,0); g.level = 1; g.pausemode = 0; g.audiomode = 1; preCache(); } catch (e) { write(e.message); } }; function setCanvasDimensions(e) { g.canvaspadding = 32; g.displaypadding = 0; if (typeof(window.orientation)!="undefined") { g.ori = window.orientation; // 0, -90 or 90 } g.canvaswidth = 320; g.canvasheight = 480; g.canvas.width = g.canvaswidth; g.canvas.height = g.canvasheight; window.scrollTo(0,0); }; function initTouch() { if(checkForTouch()) { if (document.body.addEventListener) { document.body.addEventListener('touchmove', touchMove, false); document.body.addEventListener('touchstart', touchStart, false); document.body.addEventListener('touchend', touchEnd, false); } else { window.addEventListener('touchmove', touchMove, false); window.addEventListener('touchstart', touchStart, false); window.addEventListener('touchend', touchEnd, false); } } else { window.addEventListener('mousemove', mouseMove, false); window.addEventListener('mouseup', mouseUp, false); write("No touch capability."); } }; function initHiScore() { if (typeof localStorage.key == "function") { if (localStorage.getItem(GAMETITLE + "-hiscore") != null) { m.player.hiscore = localStorage.getItem(GAMETITLE + "-hiscore"); } else { m.player.hiscore = 0; } } }; function sfx(o) { }; function handleAudio() { }; function checkForTouch() { var d = document.createElement("div"); d.setAttribute("ontouchmove", "return;"); return typeof d.ontouchmove == "function" ? true : false; }; function touch(event) { 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 (tx < 128 && tx > 64 && ty < 64) g.audiomode ++; if (g.audiomode > 1) g.audiomode = 0; if (g.mode == "game") { if (!o.dying) { o.targetx = tx - (o.w/2); if (o.targetx > (g.canvaswidth - o.w)) o.targetx = g.canvaswidth - o.w; if (o.targetx < 0) o.targetx = 0; } } }; function touchStart(event) { // exclusively the pause function var tx = (event.touches[0].pageX - g.canvas.offsetLeft); var ty = (event.touches[0].pageY - g.canvas.offsetTop); if (g.mode == "title") { //if (ty > 320 && ty < 400) //{ // document.location.href = "http://m.spacemonsters.co.uk"; //} else { setGame(); //} } else if (g.mode == "game" || g.mode == "pregame") { if (tx < 80 && ty < 80) { g.pausemode ++; if (g.pausemode > 1) { g.pausemode = 0; } } } }; function touchMove(event) { touch(event.touches[0]); window.scrollTo(0, 1); event.preventDefault(); }; function touchEnd(event) { //touch(event.touches[0]); }; function mouseMove(event) { if (g.mode != "title") touch(event); }; function mouseUp(event) { if (g.mode == "title") { //if (event.pageY > 320 && event.pageY < 400) //{ // document.location.href = "http://m.spacemonsters.co.uk"; //} else { setGame(); //} } else { touch(event); } }; function setSplash() { g.mode = "splash"; g.resetting = 100; g.banad.style.display = "none"; }; function setTitle() { g.mode = "title"; g.canvas.style.backgroundImage = "none"; g.canvas.style.backgroundColor = "#000000"; g.stage = 0; g.banad.style.display = "block"; }; function setGame() { g.banad.style.display = "none"; g.mode = "pregame"; g.resetting = 200; m.player.score = 0; m.player.targetscore = 0; m.player.lives = 3; g.level = 1; g.displaylevel = 1; g.resetting = 120; g.bonuspoints = 0; g.alienbombcooldown = 0; g.wavetype = 1; g.bonuslife1 = false; // 100,000 g.bonuslife2 = false; // 200,000 g.monstercooldown = 0; setLevel(); }; function setLevel() { g.canvas.style.backgroundImage = "url(" + g.gameback[rnd(g.gameback.length)-1].src + ")"; g.canvas.style.backgroundRepeat = "norepeat"; wipe(); m.player.dying = false; m.player.visible = true; g.fireballcooldown = 20; g.monsterstartx = 48; g.leveltreasure = 50; g.shotsfired = 0; g.hitratio = 0; g.levelmonsters = 0; playerStart(); }; function setLandscape() { g.oldmode = g.mode; g.mode = "landscape"; }; function playerStart() { m.player.x = 32; m.player.y = 146; m.player.targetx = g.canvaswidth / 2 - 16; m.player.targety = 146; m.player.speed = 1; m.player.basey = g.canvasheight - 128; m.player.nextthink = 10; m.player.nextthinkmax = m.player.nextthink; m.player.direction = 0; m.player.row = 0; m.player.treasure = 0; }; function wipe() { for (var a=0;a 0 && !o.dying) { o.attacking --; o.row = 1; } else { var fpd = o.spritesheet.framesperdirection; o.startframe = 0; if (g.mode == "game") { o.startframe = 6; fpd = 2; if (!o.dying) { o.speed = 4; } } else if (g.mode == "pregame") { o.startframe = 0; fpd = 3; o.speed = 1; } if (o.dying) { o.startframe = 9; fpd = 2; } 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 + fpd)) { o.frame = o.startframe; } } if (o.inpain) { o.frame = o.spritesheet.painframe; o.inpain = false; } } g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h); g.ctx.restore(); } catch (e) { write("DrawPlayer: " + o.frame + " - " + e.message); } }; function draw(o) { if (!o.visible) return; try { if (isNaN(o.attacking)) o.attacking = 0; if (o.attacking > 0) { o.attacking --; o.frame = o.spritesheet.attackframe; } else { if (o.jumping) { o.frame = o.xmod < 0 ? 4 : 3; if (o.spritesheet.type == "monster") moveMonster(o); } else { if (isNaN(o.frame)) o.frame = o.startframe; o.framedelay --; if (o.framedelay < 0) { o.framedelay = o.framedelaymax; o.frame ++; if (o.spritesheet.type == "monster" && !o.falling) moveMonster(o); } if (o.frame >= (o.startframe + o.framesperdirection)) { if (o.spritesheet.type == "explosion") { kill(o); } else { o.frame = o.startframe; } } if (o.inpain) { o.frame = o.spritesheet.painframe; o.inpain = false; } } } g.ctx.save(); if (o.spritesheet.type == "bomb") { o.size += 2; var x = o.x + ((o.spritesheet.framewidth / 2) - (o.size / 2)); if (o.size > o.spritesheet.framewidth) o.size = o.spritesheet.framewidth; g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, x, o.y, o.size, o.size); } else if (o.spritesheet.type == "item") { o.angle = 0; if (o.speed < 2) o.angle = o.xmod > 0 ? 45 : -45; if (o.speed < 0) o.angle = o.xmod > 0 ? 90 : -90; if (o.speed < -2) o.angle = o.xmod > 0 ? 135 : -135; if (o.speed < -4) o.angle = o.xmod > 0 ? 180 : -180; g.ctx.translate(o.x + (o.w/2),o.y + (o.h/2)); g.ctx.rotate(o.angle * (Math.PI / 180)); g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, -o.w/2, -o.h/2, o.w, o.h); } else if (o.spritesheet.type == "bonus") { o.decay --; if (o.decay < 0) kill(o); var d = true; if (o.decay < 50 && (o.decay%2 > 0)) d = false; if (d) { g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h); } } else { g.ctx.drawImage(o.spritesheet.canvas, o.frame * o.spritesheet.framewidth, o.row * o.spritesheet.frameheight, o.w, o.h, o.x, o.y, o.w, o.h); } g.ctx.restore(); } catch (e) { write("Draw: Angle = " + o.x); } }; 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 { // Target co-ords set by screen touch. 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 movePlayer(o) { if (!o.visible || o.dead || g.pausemode > 0) return; if (!o.dying) { if (o.targetx > o.x) { o.x += o.speed; } if (o.targetx < o.x) { o.x -= o.speed; } } if (g.mode == "game") { if (o.dying) { o.y -= o.speed; o.speed -= 1; } else { o.nextthink --; if (o.nextthink < 1) { o.nextthink = o.nextthinkmax; if (o.direction == 0) { o.direction = 4; } else { o.direction = 0; } } if (o.direction == 4) { o.y += 1; } else { o.y -= 1; } } } if (!o.dying && !g.mode == "game") { if (o.x < g.canvaspadding) o.x = 8; if ((o.x + o.w) > (g.canvaswidth - 8)) o.x = g.canvaswidth - 8 - o.w; } else { if (o.y > g.canvasheight) { playerDeath(); if (m.player.lives < 1) { g.banad.style.display = "block"; g.mode = "gameover"; g.resetting = 200; } else { m.player.visible = true; m.player.dying = false; g.mode = "pregame"; g.resetting = 100; } } } }; function move(o) { if (!o.visible || g.pausemode > 0) return; var bomb = o.spritesheet.type == "bomb" ? true : false; var item = o.spritesheet.type == "item" ? true : false; var bonus = o.spritesheet.type == "bonus" ? true : false; if (item) { if (o.row < 3) { o.speed -= 0.2; o.x += o.xmod; } } 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 (bomb) { if (o.y > (g.canvasheight)) { kill(o); } } else if (item) { if (o.row < 3) { if (o.y > (g.canvasheight)) { kill(o); } } else { if ((o.y + o.h) < 0) { kill(o); } } } }; function moveBonus(o) { if (!o.visible || g.pausemode > 0) return; if (o.collected) { o.y -= o.speed; o.x -= o.xmod; if (o.y < 32 && o.x < 32) { kill(o); m.player.targetscore += 200; } } else { if (!o.taken && o.y != 162) { o.y += o.speed; o.speed += 1; } if (o.y > 162 && !o.taken && !o.bounced) { o.speed = -8; o.bounced = true; } else if (o.y > 162) { o.y = 162; } } }; function moveMonster(o) { if (!o.visible || g.pausemode > 0) return; if (o.jumping) { o.speed += 1; o.y += o.speed; o.x += o.xmod; } else { o.nextthink --; if (o.nextthink < 1) { o.nextthink = o.basenextthink; } 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.y > g.canvasheight) kill(o); if (o.y < 178 && !o.jumping) { o.jumping = true; o.speed = -8; o.xmod = o.x < (g.canvaswidth / 2) ? 1 : -1; m.player.treasure -= rnd(g.level); if (m.player.treasure < 0) m.player.treasure = 0; } }; 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 itemCollision(o,m) { if (!o.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 (o.row == 0) { var x = o.x - 16; for (var a=0;a<4;a++) { spawnBonusReward(x + (a*16),-16); m.targetscore += 250; } } else { playerDying(); } kill(o); } }; function bonusCollision(o,m) { try { if (!o.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) { o.collected = true; o.speed = 16; calculateMods(o, 16, 16); // the location of the treasure icon var bonus = (o.row + 1) * 50; spawnTextSprite(o,bonus); m.targetscore += bonus; m.treasure ++; checkEndOfLevel(); } } catch (e) { write("BonusColl: " + e.message); } }; function checkEndOfLevel() { if (m.player.treasure >= g.leveltreasure) { endLevel(); } }; function calculateMods(o,tx,ty) { try { var steps = (o.y - ty) / o.speed; o.xmod = (o.x - tx) / steps; } catch (e) { write("Calcmods: " + e.message); } }; function playerDying() { wipe(); m.player.dying = true; g.resetting = 100; m.player.y = 146; m.player.speed = 16; }; function monsterFireballCollision(o) { if (!o.visible || g.pausemode > 0 || o.falling) return; var ox = o.x; var oy = o.y; var ow = o.w; var oh = o.h; for (var z=0;z= (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 (a.jumping) { spawnBonusXY(a.x,a.y); spawnTextSprite(a,"X5 BONUS !"); m.player.targetscore += 500; m.player.score = m.player.targetscore; } a.falling = true; a.jumping = false; a.frame = 2; a.startframe = 2; a.framesperdirection = 1; a.direction = 4; a.speed = 6; a.framedelay = 4; a.framedelaymax = 4; //} spawnTextSprite(o, "100"); m.player.targetscore += 100; kill(o); m.player.treasure ++; checkEndOfLevel(); } } } }; function endLevel() { g.hitratio = Math.round((g.levelmonsters/g.shotsfired)*100); m.player.targetscore += g.hitratio * 100; m.player.score = m.player.targetscore; g.mode = "levelup"; g.resetting = 90; wipe(); g.level ++; }; function alienBonus(a) { var bonus = 0; bonus = Math.round(a.y * 10); if (bonus > 3000) { spawnTextSpriteXY(a.x,a.y-24,"X5 BONUS!"); bonus = bonus * 5; } else if (bonus > 2500) { spawnTextSpriteXY(a.x,a.y-24,"X2 BONUS!"); bonus = bonus * 2; } spawnTextSprite(a,bonus); m.player.score += bonus; m.player.targetscore = m.player.score; m.player.targetscore += 10; }; function monsterBombCollision(o,m) { 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; // attempt to set a threshold a la manic shooter tiny boxes. 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) { kill(o); } }; function itemPlayerCollision(o,m) // redundant just now { 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; // attempt to set a threshold a la manic shooter tiny boxes. 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) { kill(o); } }; function writeText(t,x,y,s,f) { var sx = x; var grid = {}; grid.w = 10; grid.h = 16; var text = new String(t); //text = text.toUpperCase(); g.ctx.save(); var ss = ""; g.ctx.font = "normal "+s+"px '"+f+"', Sans-Serif"; g.ctx.textAlign = "left"; g.ctx.fillStyle = "#ffffff"; if (y > 300) // bonus ! { g.ctx.fillStyle = g.colours[rnd(g.colours.length-1)]; } g.ctx.fillText(text, x,y+8); g.ctx.restore(); }; function drawTextSprite(o) { return; if (!o.visible) return; var text = new String(o.text); g.ctx.save(); g.ctx.font = "bold 16px Arial, Sans-Serif"; g.ctx.textAlign = "left"; g.ctx.shadowOffsetX = 1; g.ctx.shadowOffsetY = 1; g.ctx.shadowBlur = 1; g.ctx.shadowColor = "rgba(0,0,0, 1)"; g.ctx.fillStyle = o.colour; g.ctx.fillText(text, o.x,o.y+8); g.ctx.restore(); }; function moveTextSprite(o) { if (!o.visible) return; o.y -= o.speed; o.ticks --; if (o.ticks < 0) kill(o); }; function moveBackground() { try { var bg = g.bg[0]; g.ctx.drawImage(bg.img,bg.x,bg.y); g.ctx.drawImage(bg.img,bg.x,bg.y + bg.h); bg.y -= bg.speed; if ((bg.y + bg.h) < 0) bg.y = g.canvasheight * (bg.screens - 1); } catch (e) { write("MoveBG: " + bg.img.src); } }; /** ---------------------------------------------------------------- **/ /** ---------------------------------------------------------------- **/ function loop() { try { clearTimeout(g.ticker); 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 < 1) { setTitle(); } break; case "title": g.ctx.drawImage(g.titlescreen,(g.canvaswidth/2)-160,0); hiScore(); writeText(textdata[1],64,216,22,SCOREFONT); break; case "pregame": drawPlayer(m.player); movePlayer(m.player); g.resetting --; m.player.treasure --; if (m.player.treasure < 0) m.player.treasure = 0; if (g.resetting < 1) { g.mode = "game"; m.player.frame = 6; } writeText(textdata[0],84,230,32,SCOREFONT); updateScore(); playerLives(); goldBar(); break; case "game": if (g.nextthink > 0) g.nextthink --; g.fireballcooldown --; if (g.fireballcooldown < 0 && !m.player.dying) { m.player.attacking = 2; spawnFireball(m.player); g.fireballcooldown = 15; } g.monstercooldown --; if (g.monstercooldown < 1) { spawnMonster(); g.monstercooldown = 30; } for (var a=0;a < NUM.MONSTERS;a++) { if (m.monsters[a].falling) { moveMonster(m.monsters[a]); } draw(m.monsters[a]); } drawPlayer(m.player); movePlayer(m.player); for (var a=0;a < NUM.ITEMS;a++) { move(m.items[a]); draw(m.items[a]); itemCollision(m.items[a],m.player); } for (var a=0;a < NUM.BONUSES;a++) { moveBonus(m.bonuses[a]); draw(m.bonuses[a]); bonusCollision(m.bonuses[a],m.player); } for (var a=0;a < NUM.BOMBS;a++) { move(m.bomb[a]); draw(m.bomb[a]); monsterFireballCollision(m.bomb[a]); } for (var a=0;a= 10) { if (g.ave > 1000) g.framedelay = 42; // throttle the fast devices } } } catch (e) { write(e.message); } }; function spawnTextSprite(o,t) { for (var a=0;a 12) r = 12; var sp = 6 + rnd(r); var hp = 10; var r = rnd(2)-1; for (var a=0;a 248) g.monsterstartx = 48; e.visible = true; e.direction = 0; e.w = e.spritesheet.framewidth; e.h = e.spritesheet.frameheight; e.framesperdirection = e.spritesheet.framesperdirection; e.killed = false; e.hp = hp; e.speed = sp; e.basespeed = sp; e.frame = 0; e.row = r; e.nextthink = 16; e.decay = 0; e.basenextthink = e.nextthink; e.startframe = 0; e.inpain = 0; e.x = g.monsterstartx; e.y = y; e.falling = false; e.jumping = false; g.levelmonsters ++; break; } } } }; function spawnItemChance(o) { var x = 0; var y = 0; if ((rnd(100) < 10) && g.pausemode < 1) { x = o.x + 32 + (rnd(g.roadwidth - 64)); y = 0; var row = parseInt(m.spritesheets["entitysheet"].height) / parseInt(m.spritesheets["entitysheet"].frameheight); var r = rnd(100)<(g.level)?rnd(3)-1:2+rnd(row-3); if (g.level < 5 && r == 5) { if (rnd(100)>5) r = 4; // frig to prevent too much missile exposure on early levels } spawnEntity(x, y, r); } }; function spawnItem() { if ((rnd(200) < (g.level < 3 ? 2 : 3)) && g.pausemode < 1 && !m.player.dying) { for (var a=0;a 0) { return; } if ((o.x + o.w) < 0) { return; } if (o.x > g.canvaswidth) { return; } if (g.fireballcooldown > 2) { return; } if (g.mode != "game") { return; } if (o.dying) { return; } var d = 4; for (var a=0;a m.player.targetscore) m.player.score = m.player.targetscore; if (m.player.score > m.player.hiscore) { m.player.hiscore = Math.round(m.player.score); localStorage.setItem(GAMETITLE + "-hiscore", m.player.hiscore); } if (m.player.score > 99999999) m.player.score = 99999999; 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); if (m.player.score >= 100000 && !g.bonuslife1) { m.player.lives ++; spawnTextSprite(m.player,"EXTRA LIFE"); g.bonuslife1 = true; } if (m.player.score >= 200000 && !g.bonuslife2) { m.player.lives ++; spawnTextSprite(m.player,"EXTRA LIFE"); g.bonuslife2 = true; } writeText(s,96,26,28,SCOREFONT) } catch (e) { write("Score: " + e.message); } }; 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 if (g.mode == "title") setGame(); break; case 38: // Up break; case 40: // Down break; case 39: // Right break; case 37: // Left 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 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 break; case 37: // Left break; case 67: // C break; case 83: // S break; case 17: // CTRL case 90: // Z break; } }; window.onorientationchange = function(event) { setCanvasDimensions(event); };