gusucode.com > hl游戏微信朋友圈小游戏源码程序 > hl游戏微信朋友圈小游戏源码程序/hl/Dragons_files/game.js

    
/*
	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<imglib.length;a++)
		{
			m.spritesheets[imglib[a].sheetname] = new spritesheet(imglib[a]);
		}
		g.titlescreen	= new Image();	g.titlescreen.src	= g.imageData[0].src; 
		g.gameback[0]	= new Image();	g.gameback[0].src	= g.imageData[1].src; 
		g.gameback[1]	= new Image();	g.gameback[1].src	= g.imageData[2].src; 
		g.gameback[2]	= new Image();	g.gameback[2].src	= g.imageData[3].src; 
		g.splash		= new Image();	g.splash.src		= "library/splash.png";
		g.playpause		= new Image();	g.playpause.src		= "library/playpause.gif";

		for (var a=0;a < 1;a++)
		{
			g.bg[a] = new backgroundimage("bg"+a,"library/background"+a+".gif",320,480,0,0,1,1);
		}
			
	}
	catch (e)
	{
		write("CreateSprites1: " + e.message);
	}
	
	try
	{
		//g.volumecontrol = new Image(); g.volumecontrol.src = "library/volumecontrols.png";

		// STANDARD SPRITES
		m.player = new sprite("player", "player", m.spritesheets["playersheet"], 0, 0, 16, 4, 1);

		// SPRITE POTS
		NUM.BOMBS = 4;
		NUM.ITEMS = 4;
		NUM.BONUSES = 12;
		NUM.MONSTERS = 4;
		NUM.TEXTSPRITES = 12;
		for (var a=0;a<NUM.BOMBS;a++) m.bomb[a] = new sprite("bomb"+a, "bomb", m.spritesheets["bombsheet"], 0, 0, 2, 0, 0);
		for (var a=0;a<NUM.ITEMS;a++) m.items[a] = new sprite("item"+a, "item", m.spritesheets["itemsheet"], 0, 0, 2, 0, 0);
		for (var a=0;a<NUM.BONUSES;a++) m.bonuses[a] = new sprite("bonuses"+a, "bonus", m.spritesheets["bonussheet"], 0, 0, 2, 0, 0);
		for (var a=0;a<NUM.MONSTERS;a++) m.monsters[a] = new sprite("monster"+a, "monster", m.spritesheets["monstersheet"], 0, 0, 2, 0, 0);
		for (var a=0;a<NUM.TEXTSPRITES;a++) m.textsprites[a] = new textsprite("textsprite"+a,-32,-32,"",0.1);
	}
	catch (e)
	{
		write("CreateSprites2: " + e.message);
	}

	try
	{
		// SET UP THE TOUCH SCREEN
		initTouch();

		// SET UP THE GAME START
		initHiScore();
		setSplash();
		// TICKER
		g.ticker = setTimeout("loop()", 0);
	}
	catch (e)
	{
		write("CreateSprites3: " + e.message);
	}
};

function rnd(threshold)
{
	return Math.floor(Math.random()*threshold) + 1;
};

function preCache() {

	for (var a=0;a<gamedata.imageFiles.length;a++)
	{
		g.imageData[a] = new Image();
		g.imageData[a].src = gamedata.imageFiles[a];
		g.imageData[a].onload = check;
	}

};

function check() {
	try
	{
		g.checkCount ++;
		var pc = Math.round((g.checkCount / g.checkSum) * 100);
		var bar = Math.round(g.canvaswidth * (pc / 100));
		g.ctx.clearRect(140,150,32,16);
		g.ctx.fillStyle = "rgb(16,16,16)";
		g.ctx.fillRect(0,200,g.canvaswidth,16);
		g.ctx.fillStyle = "rgb(80,80,80)";
		g.ctx.fillRect(0,200,bar,16);
		if (g.checkCount >= 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<m.bomb.length;a++) kill(m.bomb[a]);
	for (var a=0;a<m.monsters.length;a++) kill(m.monsters[a]);
	for (var a=0;a<m.items.length;a++) kill(m.items[a]);
	for (var a=0;a<m.textsprites.length;a++) kill(m.textsprites[a]); 
	for (var a=0;a<m.bonuses.length;a++) kill(m.bonuses[a]); 
};

function kill(o)
{
	o.visible = false;
};

function playerDeath()
{
	m.player.dying = false;
	kill(m.player);
	m.player.lives --;
	playerStart();
	m.player.speed = 1;
};

function drawPlayer(o)
{
	if (!o.visible) return;
	try
	{
		if (isNaN(o.attacking)) o.attacking = 0;
		o.row = 0;
		
		g.ctx.save();
		if (o.attacking > 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<NUM.MONSTERS;z++)
	{
		var a = m.monsters[z];
		if (a.visible)
		{
			var mx = a.x;
			var my = a.y;
			var mw = a.w;
			var mh = a.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 (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<NUM.TEXTSPRITES;a++) 
				{
					moveTextSprite(m.textsprites[a]);
					drawTextSprite(m.textsprites[a]);
				}

				spawnItem();
				spawnBonus();
				updateScore();
				playerLives();
				goldBar();
			break;

			case "landscape":
			break;
			case "levelup":
				g.resetting --;
				m.player.treasure --;
				if (m.player.treasure < 0) m.player.treasure = 0;
				if (g.resetting < 1)
				{
					setLevel();
					playerStart();
					g.mode = "game";
				}
				writeText("STAGE COMPLETE",24,240,20,SCOREFONT);
				writeText("Flames used "+g.shotsfired,24,265,16,"Arial, Sans-Serif");
				writeText("Torched ratio "+g.hitratio+"%",24,285,16,"Arial, Sans-Serif");
				writeText("Bonus "+(g.hitratio*100),24,305,16,"Arial, Sans-Serif");
				updateScore();
				playerLives();
				for (var a=0;a < NUM.TEXTSPRITES;a++)
				{
					moveTextSprite(m.textsprites[a]);
					drawTextSprite(m.textsprites[a]);
				}
				goldBar();
			break;
			case "gameover":
				writeText(textdata[3],72,230,32,SCOREFONT);
				g.resetting --;
				if (g.resetting < 1)
				{
					setTitle();
				}
				updateScore();
			break;
		}
		if (g.mode == "game" || g.mode == "pregame") { g.ctx.drawImage(g.playpause, g.pausemode * 32, 0, 32, 32, 8, 8, 32, 32); }

		if (g.ori != 0) { 
			g.ctx.fillStyle = "rgba(0,0,0,0.5)";
			g.ctx.fillRect(0,184,g.canvaswidth,40);
			writeText(textdata[2],24,200,16,"Orbitron"); 
			g.pausemode = 1;
		}
		if (isNaN(g.framedelay)) g.framedelay = 30;
		
		g.ticker = setTimeout("loop()", g.framedelay);
	}
	catch (e)
	{
		write("Loop: " + e.message);
	}
};

function playerLives()
{
	var o = m.player;
	for (var a=0;a<(m.player.lives-1);a++)
	{
		g.ctx.drawImage(o.spritesheet.canvas, 0, 0, o.w, o.h, (g.canvaswidth-90)+(a * 18), 16, 16, 16);
	}
};

function goldBar()
{
	var pc = Math.round((m.player.treasure / g.leveltreasure) * 100);
	var bar = Math.round((g.canvaswidth - 60) * (pc / 100));
	g.ctx.fillStyle = "rgba(255,236,172,0.3)";
	g.ctx.fillRect(48,40,(g.canvaswidth - 60),24);
	g.ctx.fillStyle = "rgb(255,255,0)";
	g.ctx.fillRect(48,40,bar,24);
};

function testFPS()
{
	try
	{
		// FPS
		if (isNaN(g.fps)) g.fps = 0;
		if (g.fps) 
		{
			var d = new Date();
			var c = Math.round(1000 / (d - g.fps));
		}
		var s = new String(c);
		g.fps = new Date();
		//if (c) writeString(s,220,g.canvasheight - 128);
		if (isNaN(g.testy)) g.testy = 0;
		if (isNaN(g.ave)) g.ave = 0;
		if (g.testy < 20) 
		{ 
			g.testy ++; g.ave += c; 
			if (g.testy >= 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<NUM.TEXTSPRITES;a++)
	{
		if (!m.textsprites[a].visible)
		{
			var e = m.textsprites[a];
			e.visible = true;
			e.ticks = 30;
			e.x = o.x;
			e.y = o.y;
			e.text = t;
			e.speed = 1;
			e.colour = g.colours[rnd(g.colours.length)-1];
			break;
		}
	}
};

function spawnTextSpriteXY(x,y,t)
{
	for (var a=0;a<NUM.TEXTSPRITES;a++)
	{
		if (!m.textsprites[a].visible)
		{
			var e = m.textsprites[a];
			e.visible = true;
			e.ticks = 30;
			e.x = x;
			e.y = y;
			e.text = t;
			e.speed = 1;
			break;
		}
	}
};

function spawnMonster()
{
	if (g.pausemode < 1 && !m.player.dying)
	{
		var y = g.canvasheight;
		var d = 0;
		var r = g.level; if (r > 12) r = 12;
		var sp = 6 + rnd(r);
		var hp = 10;
		var r = rnd(2)-1;

		for (var a=0;a<NUM.MONSTERS;a++)
		{
			if (!m.monsters[a].visible)
			{
				var e = m.monsters[a];
				g.monsterstartx += 100; if (g.monsterstartx > 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<NUM.ITEMS;a++)
		{
			if (!m.items[a].visible)
			{
				var s = m.items[a];
				s.visible = true;
				s.x = 32 + rnd(g.canvaswidth - 96);
				s.y = g.canvasheight;
				s.w = s.spritesheet.framewidth;
				s.h = s.spritesheet.frameheight;
				s.framesperdirection = s.spritesheet.framesperdirection;
				s.startframe = 0;
				s.direction = 0;
				s.xmod = rnd(100) < 49 ? -1 : 1;
				s.row = g.level < 3 ? 0 : rnd(4)-1;
				s.speed = 6 + rnd(8);
				if (s.row == 3) { s.speed = 10; s.x = m.player.x; }
				break;
			}
		}
	}
};

function spawnBonus()
{
	if ((rnd(100) < 3) && g.pausemode < 1 && !m.player.dying) 
	{
		for (var a=0;a<NUM.BONUSES;a++)
		{
			if (!m.bonuses[a].visible)
			{
				var s = m.bonuses[a];
				s.visible = true;
				s.x = 32 + rnd(g.canvaswidth - 96);
				s.y = -16; //162;
				s.w = s.spritesheet.framewidth;
				s.h = s.spritesheet.frameheight;
				s.framesperdirection = s.spritesheet.framesperdirection;
				s.startframe = 0;
				s.direction = 4;
				s.bounced = false;
				s.taken = false;
				s.collected = false;
				s.speed = 4;
				s.row = rnd(3)-1;
				s.decay = 150;
				break;
			}
		}
	}
};

function spawnBonusReward(x,y)
{
	for (var a=0;a<NUM.BONUSES;a++)
	{
		if (!m.bonuses[a].visible)
		{
			var s = m.bonuses[a];
			s.visible = true;
			s.x = x;
			s.y = y;
			s.w = s.spritesheet.framewidth;
			s.h = s.spritesheet.frameheight;
			s.framesperdirection = s.spritesheet.framesperdirection;
			s.startframe = 0;
			s.direction = 0;
			s.bounced = false;
			s.taken = false;
			s.collected = false;
			s.speed = 4;
			s.row = rnd(3)-1;
			s.decay = 100;
			break;
		}
	}
};

function spawnBonusXY(x,y)
{
	for (var a=0;a<NUM.BONUSES;a++)
	{
		if (!m.bonuses[a].visible)
		{
			var s = m.bonuses[a];
			s.visible = true;
			s.x = x;
			s.y = y;
			s.w = s.spritesheet.framewidth;
			s.h = s.spritesheet.frameheight;
			s.framesperdirection = s.spritesheet.framesperdirection;
			s.startframe = 0;
			s.direction = 0;
			s.bounced = false;
			s.taken = false;
			s.collected = true;
			s.speed = 16;
			s.row = rnd(3)-1;
			calculateMods(s,16,16);
			s.decay = 1000;
			break;
		}
	}
};

function spawnFireball(o)
{
	if (!o.visible) { return; }
	if (g.pausemode > 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<NUM.BOMBS;a++)
	{
		if (!m.bomb[a].visible)
		{
			var s = m.bomb[a];
			s.visible = true;
			s.direction = 4;
			s.x = o.x + ((o.w/2) - (s.w/2));
			s.y = o.y + (o.h/2);
			s.row = 0;
			s.speed = 8;
			s.size = 4;
			s.framesperdirection = s.spritesheet.framesperdirection;
			g.shotsfired ++;
			break;
		}
	}
};

function writeString(s,x,y)
{
	var o = m.spritesheets["numberssheet"];
	for (var a=0;a<s.length;a++)
	{
		x += o.framewidth;
		var i = s.substr(a,1);
		g.ctx.drawImage(o.image, i*o.framewidth, 0, o.framewidth, o.frameheight, x, y, o.framewidth, o.frameheight);
	}
};

function writeLevel()
{
	var ph = new String();
	var ph2 = new String(g.level);
	var ls = ph2.length;
	var s = new String();
	
	for (var b = 0; b < ph2.length; b++) s += ph2.substring(b,b+1);
	
	writeString(s,190,200);

};

function hiScore()
{
	try
	{
		var sScore = new String();
		var sInScore = new String(m.player.hiscore);
		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);
		
		writeText(s,96,26,28,SCOREFONT)
		
	}
	catch (e)
	{
		write(e.message);
	}
};

function updateScore()
{
	try
	{
		m.player.score += 50;
		if (m.player.score > 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);
};