package {
	import bigroom.input.KeyPoll;
	import flash.display.*;
	import flash.geom.*;
  import flash.events.*;
  import flash.net.*;
	
	public class entityclass extends Sprite {
		static public var BLOCK:Number = 0;
    static public var TRIGGER:Number = 1;
		static public var DAMAGE:Number = 2;
		static public var DIRECTIONAL:Number = 3;
		static public var SAFE:Number = 4;
		static public var ACTIVITY:Number = 5;
		
		public var opt_useblock:Boolean;
		public var opt_usetrigger:Boolean;
		public var opt_usedamage:Boolean;
		public var opt_usedirectional:Boolean;
		public var opt_usesafe:Boolean;
		public var opt_useactivity:Boolean;
		
		public function init():void {			
			nentity = 0;
			nblocks = 0;
			temprect = new Rectangle();
			temprect2 = new Rectangle();
			colpoint1 = new Point; colpoint2 = new Point;
			
			skipdirblocks = false;
			customplatformtile=0;
			platformtile = 0; vertplatforms = false; horplatforms = false;
			
			nearelephant = false;
		  upsetmode = false; upset = 0;
			
			trophytext = 0 ; trophytype = 0;
			altstates = 0;
			
			for (var i:int = 0; i < 6; i++) {
				customcrewmoods.push(1);
			}
			
			for (i = 0; i < 100; i++) {
				var t:int = 0; flags.push(t); 
			}
			
			for (i = 0; i < 500; i++) {				
				var block:blockclass = new blockclass;
  			blocks.push(block);
			}
			
			for (var z:Number = 0; z < 200; z++) {
				var entity:entclass = new entclass;
  			entities.push(entity);
			}
			
			for (i = 0; i < 20; i++) {
				var lcross:entclass = new entclass;
  			linecrosskludge.push(lcross);
				collect.push(new int);
        customcollect.push(new int(0));
			}
			nlinecrosskludge = 0;
		}
		
		public function resetallflags():void {
			for (var i:Number = 0; i < 100; i++) {
				flags[i] = 0;
			}
		}
		
		public function resetflags():void {
			for (var i:Number = 0; i < 100; i++) {
				if (flags[i] == 2) flags[i] = 0;
			}
		}
		
		public function confirmflags():void {
			for (var i:Number = 0; i < 100; i++) {
				if (flags[i] == 2) flags[i] = 1;
			}
		}
		
		public function changecollect(t:int, s:int):void {
		  collect[t] = s;
		}
		
		public function changecustomcollect(t:int, s:int):void {
		  customcollect[t] = s;
		}
		
		public function changeflag(t:int, s:int):void {
		  flags[t] = s;
		}
		
		public function fatal_top():void { createblock(DAMAGE, -8, -8, 384, 16); }
		public function fatal_bottom():void { createblock(DAMAGE, -8, 224, 384, 16); }
		public function fatal_left():void { createblock(DAMAGE, -8, -8, 16, 260); }
		public function fatal_right():void { createblock(DAMAGE, 312, -8, 16, 260); }
		
		public function setblockcolour(t:int, col:String):void {
			if (col == "cyan") {      	blocks[t].r = 164; blocks[t].g = 164; blocks[t].b = 255;
			}else if (col == "red") {	  blocks[t].r = 255; blocks[t].g = 60;  blocks[t].b = 60;
			}else if (col == "green")  {	blocks[t].r = 144; blocks[t].g = 255; blocks[t].b = 144;
			}else if (col == "yellow") {	blocks[t].r = 255; blocks[t].g = 255; blocks[t].b = 134;
			}else if (col == "blue") {  	blocks[t].r = 95;  blocks[t].g = 95;  blocks[t].b = 255;
			}else if (col == "purple") {	blocks[t].r = 255; blocks[t].g = 134; blocks[t].b = 255;
			}else if (col == "white") {	  blocks[t].r = 244; blocks[t].g = 244; blocks[t].b = 244;
			}else if (col == "gray") {	  blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174;
			}else if (col == "orange") {	  blocks[t].r = 255; blocks[t].g = 130;  blocks[t].b = 20;
			}else {
				//use a gray
				blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174;
			}
		}
		
		public function swncolour(t:int):int {
			//given colour t, return colour in setcol
			if (t == 0) return 11;
			if (t == 1) return 6;
			if (t == 2) return 8;
			if (t == 3) return 12;
			if (t == 4) return 9;
			if (t == 5) return 7;
			return 0;
		}
		
		public function swnenemiescol(t:int):void {
			//change the colour of all SWN enemies to the current one
			for (i = 0; i < nentity; i++) {
				if (entities[i].active) {
					if (entities[i].type == 23) {
						entities[i].colour = swncolour(t);
					}
				}
			}
		}
		
		public function gravcreate(game:gameclass, ypos:int, dir:int, xoff:int = 0, yoff:int = 0):void {
			if (dir == 0) {
				createentity(game, -150 - xoff, 58 + (ypos * 20)+yoff, 23, 0, 0);
			}else{
			  createentity(game, 320+150 + xoff, 58 + (ypos * 20)+yoff, 23, 1, 0);
			}
		}
		
		public function generateswnwave(game:gameclass, help:helpclass, t:int):void {
			//generate a wave for the SWN game
			if(game.swndelay<=0){
				if (t == 0) { //game 0, survive for 30 seconds
					switch(game.swnstate) {
						case 0:
						  //Decide on a wave here
							//default case
							game.swnstate = 1; game.swndelay = 5;
							
              if (game.swntimer <= 150) { //less than 5 seconds				
							  game.swnstate = 9; game.swndelay = 8;				
							}else	if (game.swntimer <= 300) { //less than 10 seconds		
							  game.swnstate = 6; game.swndelay = 12;
							}else	if (game.swntimer <= 360) { //less than 12 seconds		
							  game.swnstate = 5+game.swnstate2; game.swndelay = 15;
							}else	if (game.swntimer <= 420) { //less than 14 seconds			
							  game.swnstate = 7+game.swnstate2; game.swndelay = 15;		
							}else	if (game.swntimer <= 480) { //less than 16 seconds		
							  game.swnstate = 5+game.swnstate2; game.swndelay = 15;		
							}else	if (game.swntimer <= 540) { //less than 18 seconds			
							  game.swnstate = 7+game.swnstate2; game.swndelay = 15;		
							}else	if (game.swntimer <= 600) { //less than 20 seconds		
							  game.swnstate = 5+game.swnstate2; game.swndelay = 15;
							}else	if (game.swntimer <= 900) { //less than 30 seconds								
							  game.swnstate = 4; game.swndelay = 20;					
							}else	if (game.swntimer <= 1050) { //less than 35 seconds								
							  game.swnstate = 3; game.swndelay = 10;
							}else	if (game.swntimer <= 1200) { //less than 40 seconds					
							  game.swnstate = 3; game.swndelay = 20;
							}else	if (game.swntimer <= 1500) { //less than 50 seconds				
							  game.swnstate = 2; game.swndelay = 10;										
						  }else	if (game.swntimer <= 1650) { //less than 55 seconds			
							  game.swnstate = 1; game.swndelay = 15;					
							}else	if (game.swntimer <= 1800) { //less than 60 seconds		
							  game.swnstate = 1; game.swndelay = 25;						
							}			
							
							if (game.deathcounts - game.swndeaths > 7) game.swndelay += 2;
							if (game.deathcounts - game.swndeaths > 15) game.swndelay += 2;
							if (game.deathcounts - game.swndeaths > 25) game.swndelay += 4;
						break;
						case 1:
					    createentity(game, -150, 58 + (int(Math.random() * 6) * 20), 23, 0, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
						break;
						case 2:
						  if(game.swnstate3==0){
								game.swnstate2++;
								if (game.swnstate2 >= 6) {
									game.swnstate3 = 1;
									game.swnstate2--;
								}
							}else {
								game.swnstate2--;
								if (game.swnstate2 < 0) {
									game.swnstate3 = 0;
									game.swnstate2++;
								}
							}
					    createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
						break;						
						case 3:
					    createentity(game, 320+150, 58 + (int(Math.random() * 6) * 20), 23, 1, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
						break;				
						case 4:
						  //left and right compliments
							game.swnstate2 = int(Math.random() * 6);
					    createentity(game, -150, 58 + (game.swnstate2  * 20), 23, 0, 0);
					    createentity(game, 320+150, 58 + ((5-game.swnstate2) * 20), 23, 1, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
							game.swnstate2 = 0;
						break;
						case 5:
						  //Top and bottom
					    createentity(game, -150, 58, 23, 0, 0);
					    createentity(game, -150, 58 + (5 * 20), 23, 0, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
							game.swnstate2 = 1;
						break;				
						case 6:
						  //Middle
					    createentity(game, -150, 58 + (2 * 20), 23, 0, 0);
					    createentity(game, -150, 58 + (3 * 20), 23, 0, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
							game.swnstate2 = 0;
						break;		
						case 7:
						  //Top and bottom
					    createentity(game, 320+150, 58, 23, 1, 0);
					    createentity(game, 320+150, 58 + (5 * 20), 23, 1, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
							game.swnstate2 = 1;
						break;				
						case 8:
						  //Middle
					    createentity(game, 320+150, 58 + (2 * 20), 23, 1, 0);
					    createentity(game, 320+150, 58 + (3 * 20), 23, 1, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
							game.swnstate2 = 0;
						break;		
						case 9:
						  if(game.swnstate3==0){
								game.swnstate2++;
								if (game.swnstate2 >= 6) {
									game.swnstate3 = 1;
									game.swnstate2--;
								}
							}else {
								game.swnstate2--;
								if (game.swnstate2 < 0) {
									game.swnstate3 = 0;
									game.swnstate2++;
								}
							}
  					  createentity(game, 320 + 150, 58 + (int(game.swnstate2) * 20), 23, 1, 0);
						  game.swnstate = 0; game.swndelay = 0; //return to decision state
						break;	
					}
				}else if (t == 1) {
					//Game 2, super gravitron
					switch(game.swnstate) {
						case 0:
						  //Choose either simple or filler
							game.swnstate2 = 0; game.swnstate3 = 0; game.swnstate4 = 0;
							
							game.swnstate2 = int(Math.random() * 100);
							if (game.swnstate2 < 25) {
								//simple
								game.swnstate = 2; game.swndelay = 0;
							}else {
								//filler
								game.swnstate = 4; game.swndelay = 0;
							}
							game.swnstate2 = 0;
						break;
						case 1:
						  //complex chain
							game.swnstate2 = int(Math.random() * 8);
							if (game.swnstate2 == 0) { game.swnstate = 10; game.swndelay = 0;
							}else if (game.swnstate2 == 1) { game.swnstate = 12; game.swndelay = 0;
							}else if (game.swnstate2 == 2) { game.swnstate = 14; game.swndelay = 0;
							}else if (game.swnstate2 == 3) { game.swnstate = 20; game.swndelay = 0;
							}else if (game.swnstate2 == 4) { game.swnstate = 21; game.swndelay = 0;
							}else if (game.swnstate2 == 5) { game.swnstate = 22; game.swndelay = 0;
							}else if (game.swnstate2 == 6) { game.swnstate = 22; game.swndelay = 0;
							}else if (game.swnstate2 == 7) { game.swnstate = 14; game.swndelay = 0;
							}
							
							game.swnstate2 = 0;
						break;
						case 2:
						  //simple chain
							game.swnstate2 = int(Math.random() * 6);
							if (game.swnstate2 == 0) { game.swnstate = 23; game.swndelay = 0;
							}else if (game.swnstate2 == 1) { game.swnstate = 24; game.swndelay = 0;
							}else if (game.swnstate2 == 2) { game.swnstate = 25; game.swndelay = 0;
							}else if (game.swnstate2 == 3) { game.swnstate = 26; game.swndelay = 0;
							}else if (game.swnstate2 == 4) { game.swnstate = 27; game.swndelay = 0;
							}else if (game.swnstate2 == 5) { game.swnstate = 14; game.swndelay = 0;
							}
							
							game.swnstate2 = 0;
						break;
						case 3:
						  //Choose a major action							
							game.swnstate2 = int(Math.random() * 100);
							if (game.swnstate2 < 25) {
								//complex
								game.swnstate = 1; game.swndelay = 0;
							}else {
								//simple
								game.swnstate = 2; game.swndelay = 0;
							}
						break;
						case 4:
						  //filler chain
							game.swnstate2 = int(Math.random() * 6);
							if (game.swnstate2 == 0) { game.swnstate = 28; game.swndelay = 0;
							}else if (game.swnstate2 == 1) { game.swnstate = 29; game.swndelay = 0;
							}else if (game.swnstate2 == 2) { game.swnstate = 28; game.swndelay = 0;
							}else if (game.swnstate2 == 3) { game.swnstate = 29; game.swndelay = 0;
							}else if (game.swnstate2 == 4) { game.swnstate = 30; game.swndelay = 0;
							}else if (game.swnstate2 == 5) { game.swnstate = 31; game.swndelay = 0;
							}
							
							game.swnstate2 = 0;
						break;
						case 10:
						  gravcreate(game, 0, 0);
							gravcreate(game, 1, 0);
							gravcreate(game, 2, 0);
						  game.swnstate++; game.swndelay = 10; //return to decision state
						break;
						case 11:
						  gravcreate(game, 3, 0);
							gravcreate(game, 4, 0);
							gravcreate(game, 5, 0);
							game.swnstate2++;
							if(game.swnstate2==3){
						    game.swnstate = 0; game.swndelay = 30; //return to decision state
							}else {
								game.swnstate--; game.swndelay = 10; //return to decision state
							}
						break;
						case 12:
						  gravcreate(game, 0, 1);
							gravcreate(game, 1, 1);
							gravcreate(game, 2, 1);
						  game.swnstate++; game.swndelay = 10; //return to decision state
						break;
						case 13:
						  gravcreate(game, 3, 1);
							gravcreate(game, 4, 1);
							gravcreate(game, 5, 1);
							game.swnstate2++;
							if(game.swnstate2==3){
						    game.swnstate = 0; game.swndelay = 30; //return to decision state
							}else {
								game.swnstate--; game.swndelay = 10; //return to decision state
							}
						break;
						case 14:
						  gravcreate(game, 0, 0, 0);
							gravcreate(game, 5, 1, 0);
							
						  game.swnstate++; game.swndelay = 20; //return to decision state
						break;
						case 15:
							gravcreate(game, 1, 0);
							gravcreate(game, 4, 1);
							
						  game.swnstate++; game.swndelay = 20; //return to decision state
						break;
						case 16:
							gravcreate(game, 2, 0);
							gravcreate(game, 3, 1);
							
						  game.swnstate++; game.swndelay = 20; //return to decision state
						break;
						case 17:
							gravcreate(game, 3, 0);
							gravcreate(game, 2, 1);
							
						  game.swnstate++; game.swndelay = 20; //return to decision state
						break;
						case 18:
							gravcreate(game, 4, 0);
							gravcreate(game, 1, 1);
							
						  game.swnstate++; game.swndelay = 20; //return to decision state
						break;
						case 19:
							gravcreate(game, 5, 0);
							gravcreate(game, 0, 1);
							
						  game.swnstate=0; game.swndelay = 20; //return to decision state
						break;						
						case 20:
						  game.swnstate4++;
						  if(game.swnstate3==0){
								game.swnstate2++;
								if (game.swnstate2 >= 6) {
									game.swnstate3 = 1;
									game.swnstate2--;
								}
							}else {
								game.swnstate2--;
								if (game.swnstate2 < 0) {
									game.swnstate3 = 0;
									game.swnstate2++;
								}
							}
					    createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0);
							if(game.swnstate4<=6){
						    game.swnstate = 20; game.swndelay = 10; //return to decision state
							}else {
								game.swnstate = 0; game.swndelay = 10; //return to decision state
							}
						break;					
						case 21:
						  game.swnstate4++;
						  if(game.swnstate3==0){
								game.swnstate2++;
								if (game.swnstate2 >= 6) {
									game.swnstate3 = 1;
									game.swnstate2--;
								}
							}else {
								game.swnstate2--;
								if (game.swnstate2 < 0) {
									game.swnstate3 = 0;
									game.swnstate2++;
								}
							}
					    createentity(game, 320+150, 58 + (int(game.swnstate2) * 20), 23, 1, 0);
							if(game.swnstate4<=6){
						    game.swnstate = 21; game.swndelay = 10; //return to decision state
							}else {
								game.swnstate = 0; game.swndelay = 10; //return to decision state
							}
						break;		
						case 22:
						  game.swnstate4++;
						  //left and right compliments
							game.swnstate2 = int(Math.random() * 6);
					    createentity(game, -150, 58 + (game.swnstate2  * 20), 23, 0, 0);
					    createentity(game, 320 + 150, 58 + ((5 - game.swnstate2) * 20), 23, 1, 0);
							if(game.swnstate4<=12){
						    game.swnstate = 22; game.swndelay = 18; //return to decision state
							}else {
								game.swnstate = 0; game.swndelay = 18; //return to decision state
							}
							game.swnstate2 = 0;
						break;
						case 23:
							gravcreate(game, 1, 0);
							gravcreate(game, 2, 0, 15);
							gravcreate(game, 2, 0, -15);
							gravcreate(game, 3, 0, 15);
							gravcreate(game, 3, 0, -15);
							gravcreate(game, 4, 0);
						  game.swnstate = 0; game.swndelay = 15; //return to decision state
						break;
						case 24:
							gravcreate(game, 1, 1);
							gravcreate(game, 2, 1, 15);
							gravcreate(game, 2, 1, -15);
							gravcreate(game, 3, 1, 15);
							gravcreate(game, 3, 1, -15);
							gravcreate(game, 4, 1);
						  game.swnstate = 0; game.swndelay = 15; //return to decision state
						break;
						case 25:
							gravcreate(game, 0, 0);
							gravcreate(game, 1, 1,0,10);
							gravcreate(game, 4, 1,0,-10);
							gravcreate(game, 5, 0);
						  game.swnstate = 0; game.swndelay = 20; //return to decision state
						break;						
						case 26:
							gravcreate(game, 0, 1, 0);
							gravcreate(game, 1, 1, 10);
							gravcreate(game, 4, 1, 40);
							gravcreate(game, 5, 1, 50);
						  game.swnstate = 0; game.swndelay = 20; //return to decision state
						break;						
						case 27:
							gravcreate(game, 0, 0, 0);
							gravcreate(game, 1, 0, 10);
							gravcreate(game, 4, 0, 40);
							gravcreate(game, 5, 0, 50);
						  game.swnstate = 0; game.swndelay = 20; //return to decision state
						break;
						case 28:
						  game.swnstate4++;
						  game.swnstate2 = int(Math.random() * 6);
					    createentity(game, -150, 58 + (game.swnstate2  * 20), 23, 0, 0);
							if(game.swnstate4<=6){
						    game.swnstate = 28; game.swndelay = 8; //return to decision state
							}else {
								game.swnstate = 3; game.swndelay = 15; //return to decision state
							}
							game.swnstate2 = 0;
						break;
						case 29:
						  game.swnstate4++;
						  game.swnstate2 = int(Math.random() * 6);
							gravcreate(game, game.swnstate2, 1);
							if(game.swnstate4<=6){
						    game.swnstate = 29; game.swndelay = 8; //return to decision state
							}else {
								game.swnstate = 3; game.swndelay = 15; //return to decision state
							}
							game.swnstate2 = 0;
						break;
						case 30:
						  game.swnstate4++;
						  game.swnstate2 = int(Math.random() * 3);
							gravcreate(game, game.swnstate2, 0);
							gravcreate(game, 5-game.swnstate2, 0);
							if(game.swnstate4<=2){
						    game.swnstate = 30; game.swndelay = 14; //return to decision state
							}else {
								game.swnstate = 3; game.swndelay = 15; //return to decision state
							}
							game.swnstate2 = 0;
						break;
						case 31:
						  game.swnstate4++;
						  game.swnstate2 = int(Math.random() * 3);
							gravcreate(game, game.swnstate2, 1);
							gravcreate(game, 5-game.swnstate2, 1);
							if(game.swnstate4<=2){
						    game.swnstate = 31; game.swndelay = 14; //return to decision state
							}else {
								game.swnstate = 3; game.swndelay = 15; //return to decision state
							}
							game.swnstate2 = 0;
						break;
					}
				}
			}else {
				game.swndelay--;
			}
		}
		
		public function createblock(t:int, xp:int=0, yp:int=0, w:int=0, h:int=0, trig:int=0):void{
			if(nblocks == 0) {
				//If there are no active blocks, Z=0;
				k = 0; nblocks++;
			}else {
				i = 0; k = -1;
				while (i < nblocks) {
					if (!blocks[i].active) {
						k = i; i = nblocks;
					}
					i++;
				}
				if (k == -1) {
					k = nblocks;
					nblocks++;
				}
			}

			blocks[k].clear();
			blocks[k].active = true;
			switch(t) {
				case BLOCK: //Block
					 blocks[k].type = BLOCK;
					 blocks[k].xp = xp;
					 blocks[k].yp = yp;
					 blocks[k].wp = w;
					 blocks[k].hp = h;
					 blocks[k].rectset(xp, yp, w, h);
					 
					 opt_useblock = true;
				break;
				case TRIGGER: //Trigger
					 blocks[k].type = TRIGGER;
					 blocks[k].x = xp;
					 blocks[k].y = yp;
					 blocks[k].wp = w;
					 blocks[k].hp = h;
					 blocks[k].rectset(xp, yp, w, h);
					 blocks[k].trigger = trig;
					 
					 opt_usetrigger = true;
				break;
				case DAMAGE: //Damage
					 blocks[k].type = DAMAGE;
					 blocks[k].x = xp;
					 blocks[k].y = yp;
					 blocks[k].wp = w;
					 blocks[k].hp = h;
					 blocks[k].rectset(xp, yp, w, h);
					 
					 opt_usedamage = true;
				break;
				case DIRECTIONAL: //Directional
					 blocks[k].type = DIRECTIONAL;
					 blocks[k].x = xp;
					 blocks[k].y = yp;
					 blocks[k].wp = w;
					 blocks[k].hp = h;
					 blocks[k].rectset(xp, yp, w, h);
					 blocks[k].trigger = trig;
					 
					 opt_usedirectional = true;
				break;
				case SAFE: //Safe block
					 blocks[k].type = SAFE;
					 blocks[k].xp = xp;
					 blocks[k].yp = yp;
					 blocks[k].wp = w;
					 blocks[k].hp = h;
					 blocks[k].rectset(xp, yp, w, h);
					 
					 opt_usesafe = true;
				break;
				case ACTIVITY: //Activity Zone
					blocks[k].type = ACTIVITY;
					blocks[k].x = xp;
					blocks[k].y = yp;
					blocks[k].wp = w;
					blocks[k].hp = h;
					blocks[k].rectset(xp, yp, w, h);
					
					opt_useactivity = true;
					 
					//Ok, each and every activity zone in the game is initilised here. "Trig" in this case is a variable that
					//assigns all the details.
					switch(trig) {
						case 0: //testing zone
						  blocks[k].prompt = "Press ENTER to explode";
							if(mobilemenus) blocks[k].prompt = "Explode";
						  blocks[k].script = "intro";
							setblockcolour(k, "orange");
						  trig=1;
						break;
						case 1:
						  blocks[k].prompt = "Press ENTER to talk to Violet";
							if(mobilemenus) blocks[k].prompt = "Talk to Violet";
						  blocks[k].script = "talkpurple";
							setblockcolour(k, "purple");
						  trig=0;
						break;
						case 2:
						  blocks[k].prompt = "Press ENTER to talk to Vitellary";
							if(mobilemenus) blocks[k].prompt = "Talk to Vitellary";
						  blocks[k].script = "talkyellow";
							setblockcolour(k, "yellow");
						  trig=0;
						break;
						case 3:
						  blocks[k].prompt = "Press ENTER to talk to Vermilion";
							if(mobilemenus) blocks[k].prompt = "Talk to Vermilion";
						  blocks[k].script = "talkred";
							setblockcolour(k, "red");
						  trig=0;
						break;
						case 4:
						  blocks[k].prompt = "Press ENTER to talk to Verdigris";
							if(mobilemenus) blocks[k].prompt = "Talk to Verdigris";
						  blocks[k].script = "talkgreen";
							setblockcolour(k, "green");
						  trig=0;
						break;
						case 5:
						  blocks[k].prompt = "Press ENTER to talk to Victoria";
							if(mobilemenus) blocks[k].prompt = "Talk to Victoria";
						  blocks[k].script = "talkblue";
							setblockcolour(k, "blue");
						  trig=0;
						break;
						case 6:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_station_1";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 7:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_outside_1";
							setblockcolour(k, "orange");
						  trig=0;
						break;						
						case 8:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_outside_2";
							setblockcolour(k, "orange");
						  trig=0;
						break;				
						case 9:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_outside_3";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 10:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_outside_4";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 11:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_outside_5";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 12:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_outside_6";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 13:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_finallevel";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 14:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_station_2";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 15:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_station_3";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 16:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_station_4";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 17:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_warp_1";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 18:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_warp_2";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 19:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_lab_1";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 20:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_lab_2";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 21:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_secretlab";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 22:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_shipcomputer";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 23:
						  blocks[k].prompt = "Press ENTER to activate terminals";
							if(mobilemenus) blocks[k].prompt = "Activate terminals";
						  blocks[k].script = "terminal_radio";
							setblockcolour(k, "orange");
						  trig=0;
						break;						
						case 24:
						  blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
						  blocks[k].script = "terminal_jukebox";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 25:
						  blocks[k].prompt = "Passion for Exploring";
						  blocks[k].script = "terminal_juke1";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 26:
						  blocks[k].prompt = "Pushing Onwards";
						  blocks[k].script = "terminal_juke2";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 27:
						  blocks[k].prompt = "Positive Force";
						  blocks[k].script = "terminal_juke3";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 28:
						  blocks[k].prompt = "Presenting VVVVVV";
						  blocks[k].script = "terminal_juke4";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 29:
						  blocks[k].prompt = "Potential for Anything";
						  blocks[k].script = "terminal_juke5";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 30:
						  blocks[k].prompt = "Predestined Fate";
						  blocks[k].script = "terminal_juke6";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 31:
						  blocks[k].prompt = "Pipe Dream";
						  blocks[k].script = "terminal_juke7";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 32:
						  blocks[k].prompt = "Popular Potpourri";
						  blocks[k].script = "terminal_juke8";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 33:
						  blocks[k].prompt = "Pressure Cooker";
						  blocks[k].script = "terminal_juke9";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 34:
						  blocks[k].prompt = "ecroF evitisoP";
						  blocks[k].script = "terminal_juke10";
							setblockcolour(k, "orange");
						  trig=0;
						break;
						case 35:
							blocks[k].prompt = "Press ENTER to activate terminal";
							if(mobilemenus) blocks[k].prompt = "Activate terminal";
							blocks[k].script = "custom_"+customscript;
							setblockcolour(k, "orange");
							trig=0;
            break;
					}
				break;
			}
		}

		public function removeallblocks():void{
			for(i=0; i<nblocks; i++) blocks[i].clear();
			nblocks=0;
		}
		
		public function removeblock(t:int):void {
			blocks[t].clear();
		}

		public function removeblockat(x:int, y:int):void{
			for (i = 0; i < nblocks; i++) {
				if(blocks[i].xp == int(x) && blocks[i].yp == int(y)) removeblock(i);
			}
		}

		public function removetrigger(t:int):void{
			for(i=0; i<nblocks; i++){
				if(blocks[i].type == TRIGGER) {
					if (blocks[i].trigger == t) {
						blocks[i].active = false;
						removeblock(i);
					}
				}
			}
		}
		
		public function copylinecross(t:int):void {
			//Copy entity t into the first free linecrosskludge entity
			linecrosskludge[nlinecrosskludge].clear();
			linecrosskludge[nlinecrosskludge].xp = entities[t].xp;
			linecrosskludge[nlinecrosskludge].yp = entities[t].yp;
			linecrosskludge[nlinecrosskludge].w = entities[t].w;			
			linecrosskludge[nlinecrosskludge].onentity = entities[t].onentity;			
			linecrosskludge[nlinecrosskludge].state = entities[t].state;
			linecrosskludge[nlinecrosskludge].life = entities[t].life;
			nlinecrosskludge++;
		}
		
		public function revertlinecross(t:int, s:int):void {
			//Restore entity t info from linecrossing s
			entities[t].onentity = linecrosskludge[s].onentity;
			entities[t].state = linecrosskludge[s].state;
			entities[t].life = linecrosskludge[s].life;
		}
		
		public function gridmatch(p1:int, p2:int, p3:int, p4:int, p11:int, p21:int, p31:int, p41:int):Boolean {
			if (p1 == p11 && p2 == p21 && p3 == p31 && p4 == p41) return true;
			return false;
		}
		
		public function crewcolour(t:int):int {
			//Return the colour of the indexed crewmate
			switch(t) {
				case 0: return 0; break;
				case 1: return 20; break;
				case 2: return 14; break;
				case 3: return 15; break;
				case 4: return 13; break;
				case 5: return 16; break;
			}
			return 0;
		}
		
		
		public function setenemyroom(t:int, rx:int, ry:int):void {
		  //Simple function to initilise simple enemies
			rx -= 100; ry -= 100;
			switch(rn(rx, ry)) {
				//Space Station 1
				case rn(12, 3):  //Security Drone
				 	entities[t].tile = 36; entities[t].colour = 8; entities[t].animate = 1;
				break;
				case rn(13, 3):  //Wavelengths
				  entities[t].tile = 32; entities[t].colour = 7; 	entities[t].animate = 1;
					entities[t].w = 32;	
				break;
				case rn(15, 3):  //Traffic
				  entities[t].tile = 28; entities[t].colour = 6; entities[t].animate = 1;
					entities[t].w = 22;	entities[t].h = 32;
				break;
				case rn(12, 5):  //The Yes Men						
				  entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1;
					entities[t].w = 20;	entities[t].h = 20;
				break;
				case rn(13, 6):  //Hunchbacked Guards
				  entities[t].tile = 44; entities[t].colour = 8;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 20;
				break;
				case rn(13, 4):  //Communication Station
				  entities[t].harmful = false;
					if (entities[t].xp == 256) {
						//transmittor		
						entities[t].tile = 104; entities[t].colour = 4; entities[t].animate = 7;
						entities[t].w = 16;	entities[t].h = 16;
						entities[t].xp -= 24; entities[t].yp -= 16;
					}else {
						//radar dish
						entities[t].tile =124; entities[t].colour = 4;	entities[t].animate = 6;
						entities[t].w = 32;	entities[t].h = 32; entities[t].cx = 4; entities[t].size = 9;
						entities[t].xp -= 4; entities[t].yp -= 32;
					}
					
				break;
				//The Lab
				case rn(4, 0): 
				  entities[t].tile = 78; entities[t].colour = 7;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;
				case rn(2, 0): 
				  entities[t].tile = 88; entities[t].colour = 11;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;
				//Space Station 2
				case rn(14, 11): entities[t].colour = 17;	break; //Lies
				case rn(16, 11): entities[t].colour = 8;	break; //Lies
				case rn(13, 10): entities[t].colour = 11;	break; //Factory
				case rn(13, 9): entities[t].colour = 9;	break; //Factory
				case rn(13, 8): entities[t].colour = 8;	break; //Factory
				case rn(11, 13): //Truth
				  entities[t].tile = 64; entities[t].colour = 7;	entities[t].animate = 100;
					entities[t].w = 44;	entities[t].h = 10; entities[t].size = 10;
				break;
				case rn(17, 7): //Brass sent us under the top
				  entities[t].tile =82; entities[t].colour = 8;	entities[t].animate = 5;
					entities[t].w = 28;	entities[t].h = 32; entities[t].cx = 4;
				break;				
				case rn(10, 7): // (deception)
				  entities[t].tile = 92; entities[t].colour = 6;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;				
				case rn(14, 13): // (chose poorly)
				  entities[t].tile = 56; entities[t].colour = 6;	entities[t].animate = 1;
					entities[t].w = 15;	entities[t].h = 24;
				break;
				case rn(13, 12): // (backsliders)
				  entities[t].tile = 164; entities[t].colour = 7;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;				
				case rn(14, 8): // (wheel of fortune room)
				  entities[t].tile = 116; entities[t].colour = 12;	entities[t].animate = 1;
					entities[t].w = 32;	entities[t].h = 32;
				break;
				case rn(16, 9): // (seeing dollar signs)
				  entities[t].tile = 68; entities[t].colour = 7;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;				
				case rn(16, 7): // (tomb of mad carew)
				  entities[t].tile = 106; entities[t].colour = 7;	entities[t].animate = 2;
					entities[t].w = 24;	entities[t].h = 25;
				break;
				//Warp Zone
				case rn(15, 2): // (numbers)
				  entities[t].tile = 100; entities[t].colour = 6;	entities[t].animate = 1;
					entities[t].w = 32;	entities[t].h = 14; entities[t].yp += 1;
				break;				
				case rn(16, 2): // (Manequins)
				  entities[t].tile = 52; entities[t].colour = 7;	entities[t].animate = 5;
					entities[t].w = 16;	entities[t].h = 25; entities[t].yp -= 4;
				break;
				case rn(18, 0): // (Obey)
				  entities[t].tile = 51; entities[t].colour = 11;	entities[t].animate = 100;
					entities[t].w = 30;	entities[t].h = 14; 
				break;
				case rn(19, 1): // Ascending and Descending
				  entities[t].tile = 48; entities[t].colour = 9;	entities[t].animate = 5;
					entities[t].w = 16;	entities[t].h = 16; 
				break;
				case rn(19, 2): // Shockwave Rider
				  entities[t].tile = 176; entities[t].colour = 6;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16; 
				break;					
				case rn(18, 3): // Mind the gap
				  entities[t].tile = 168; entities[t].colour = 7;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16; 
				break;					
				case rn(17, 3): // Edge Games
					if (entities[t].yp ==96) {
						entities[t].tile = 160; entities[t].colour = 8;	entities[t].animate = 1;
						entities[t].w = 16;	entities[t].h = 16; 
					}else {
						entities[t].tile = 156; entities[t].colour = 8;	entities[t].animate = 1;
						entities[t].w = 16;	entities[t].h = 16; 
					}
				break;						
				case rn(16, 0): // I love you
				  entities[t].tile = 112; entities[t].colour = 8;	entities[t].animate = 5;
					entities[t].w = 16;	entities[t].h = 16; 
				break;							
				case rn(14, 2): // That's why I have to kill you
				  entities[t].tile = 114; entities[t].colour = 6;	entities[t].animate = 5;
					entities[t].w = 16;	entities[t].h = 16; 
				break;		
				case rn(18, 2): // Thinking with Portals
				  //depends on direction
					if (entities[t].xp ==88) {
				    entities[t].tile = 54+12; entities[t].colour = 12;	entities[t].animate = 100;
					  entities[t].w = 60;	entities[t].h = 16; entities[t].size = 10;
					}else{
				    entities[t].tile = 54; entities[t].colour = 12;	entities[t].animate = 100;
					  entities[t].w = 60;	entities[t].h = 16; entities[t].size = 10;
					}
				break;
				//Final level
				case rn(50-100, 53-100):  //The Yes Men						
				  entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1;
					entities[t].w = 20;	entities[t].h = 20;
				break;
				case rn(48-100, 51-100):  //Wavelengths
				  entities[t].tile = 32; entities[t].colour = 7; 	entities[t].animate = 1;
					entities[t].w = 32;	
				break;
				case rn(43-100,52-100): // Ascending and Descending
				  entities[t].tile = 48; entities[t].colour = 9;	entities[t].animate = 5;
					entities[t].w = 16;	entities[t].h = 16; 
				break;
				case rn(46-100,51-100): //kids his age
				  entities[t].tile = 88; entities[t].colour = 11;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;				
				case rn(43-100,51-100): // Mind the gap
				  entities[t].tile = 168; entities[t].colour = 7;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16; 
				break;	
				case rn(44-100,51-100): // vertigo?
				  entities[t].tile = 172; entities[t].colour = 7;	entities[t].animate = 100;
					entities[t].w = 32;	entities[t].h = 32; 
				break;					
				case rn(44-100,52-100): // (backsliders)
				  entities[t].tile = 164; entities[t].colour = 7;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;			
				case rn(43-100, 56-100): //Intermission 1
				  entities[t].tile = 88; entities[t].colour = 21;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;	
				case rn(45-100, 56-100): //Intermission 1
				  entities[t].tile = 88; entities[t].colour = 21;	entities[t].animate = 1;
					entities[t].w = 16;	entities[t].h = 16;
				break;
				//The elephant
				case rn(11, 9): case rn(12, 9): case rn(11, 8): case rn(12, 8):
				  entities[t].tile = 0; entities[t].colour = 102;	entities[t].animate = 0;
					entities[t].w = 464;	entities[t].h = 320; entities[t].size = 11;
					entities[t].harmful = false;
				break;
			}
		}
		
		public function setenemy(t:int, r:int):void {
			switch(t) {
				case 0:
				  //lies emitter
					if(entities[r].para==0){
						entities[r].tile = 60; entities[r].animate = 2;
						entities[r].colour = 6; entities[r].behave = 10;
						entities[r].w = 32;	entities[r].h = 32;
						entities[r].x1 = -200;
					}else if (entities[r].para == 1) {
						entities[r].yp += 10;
						entities[r].tile = 63; entities[r].animate = 100; //LIES
					  entities[r].colour = 6; 
						entities[r].behave = 11; entities[r].para = 9; //destroyed when outside
						entities[r].x1 = -200; entities[r].x2 = 400; 
						entities[r].w = 26;	entities[r].h = 10;
						entities[r].cx = 1;	entities[r].cy = 1;
					}else if (entities[r].para == 2) {
						entities[r].tile = 62; entities[r].animate = 100; 
						entities[r].colour = 6; entities[r].behave = -1;
						entities[r].w = 32;	entities[r].h = 32;
					}
				break;
				case 1:
				  //FACTORY emitter
					if(entities[r].para==0){
						entities[r].tile = 72; entities[r].animate = 3; entities[r].size = 9;
						entities[r].colour = 6; entities[r].behave = 12;
						entities[r].w = 64;	entities[r].h = 40;
						entities[r].cx = 0;	entities[r].cy = 24;
					}else if (entities[r].para == 1) {
						entities[r].xp += 4; entities[r].yp -= 4;
						entities[r].tile = 76; entities[r].animate = 100; // Clouds
						entities[r].colour = 6; 
						entities[r].behave = 13; entities[r].para = -6; //destroyed when outside
						entities[r].x2 = 400; 
						entities[r].w = 32;	entities[r].h = 12;
						entities[r].cx = 0;	entities[r].cy = 6;
					}else if (entities[r].para == 2) {
						entities[r].tile = 77; entities[r].animate = 100; 
						entities[r].colour = 6; entities[r].behave = -1;
						entities[r].w = 32;	entities[r].h = 16;
					}
				break;
				default:
				break;
			}
		}
		
		
		public function rn(rx:int, ry:int):int {
			return rx + (ry * 100);
		}
		
		public function settreadmillcolour(t:int, rx:int, ry:int):void {
      rx -= 100; ry -= 100;
			rx += 50 - 12; ry += 50 - 14;   //Space Station
			
			entities[t].tile = 20; //default as blue
			switch(rn(rx, ry)) {
				case rn(52, 48): entities[t].tile = 791; break; //Cyan
				
				case rn(49, 47): entities[t].tile = 24; break; //Yellow
				case rn(56, 44): entities[t].tile = 24; break; //Yellow
				case rn(54, 49): entities[t].tile = 24; break; //Yellow
				
				case rn(49, 49): entities[t].tile = 36; break; //Green
				case rn(55, 44): entities[t].tile = 36; break; //Green
				case rn(54, 43): entities[t].tile = 36; break; //Green
				case rn(53, 49): entities[t].tile = 36; break; //Green
				case rn(54, 45): entities[t].tile = 711; break; //Green (special)
				case rn(51, 48): entities[t].tile = 711; break; //Green (special)
				
				case rn(50, 49): entities[t].tile = 28; break; //Purple
				case rn(54, 44): entities[t].tile = 28; break; //Purple
				case rn(49, 42): entities[t].tile = 28; break; //Purple
				case rn(55, 43): entities[t].tile = 28; break; //Purple
				case rn(54, 47): entities[t].tile = 28; break; //Purple
				case rn(53, 48): entities[t].tile = 28; break; //Purple
				
				case rn(51, 47): entities[t].tile = 32; break; //Red
				case rn(52, 49): entities[t].tile = 32; break; //Red
				case rn(48, 43): entities[t].tile = 32; break; //Red
				case rn(55, 47): entities[t].tile = 32; break; //Red
				case rn(54, 48): entities[t].tile = 32; break; //Red
			}
		}
		
		public function createentity(game:gameclass, xp:Number, yp:Number, t:int, vx:Number = 0, vy:Number = 0, 
		                                            p1:int = 0, p2:int = 0, p3:int = 320, p4:int = 240 ):void {
			//Find the first inactive case z that we can use to index the new entity
			if (nentity == 0) {
				//If there are no active entities, Z=0;
				k = 0; nentity++;
			}else {
				i = 0; k = -1;
				while (i < nentity) {
				  if (!entities[i].active) {
						k = i; i = nentity;
					}
					i++;
			  }
				if (k == -1) {
					k = nentity;
					nentity++;
				}
			}
			
			//Size 0 is a sprite
			//Size 1 is a tile
			//Beyond that are special cases (to do)
			//Size 2 is a moving platform of width 4 (32)
			//Size 3 is apparently a "bug chunky pixel"
			//Size 4 is a coin/small pickup
			//Size 5 is a horizontal line, 6 is vertical
			
			//Rule 0 is the playable character
			//Rule 1 is anything harmful
			//Rule 2 is anything decorative (no collisions)
			//Rule 3 is anything that results in an entity to entity collision and state change
			//Rule 4 is a horizontal line, 5 is vertical
			//Rule 6 is a crew member
			
			//trace("creating entity type ", t, xp, yp);
			
			entities[k].clear();
			entities[k].active = true;
			entities[k].type = t;
			switch(t) {
				case 0: //Player
				  entities[k].rule = 0; //Playable character
				  entities[k].tile = 0; entities[k].colour = 0;
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cx = 6; entities[k].cy = 2;
					entities[k].w = 12;	entities[k].h = 21;
					entities[k].dir = 1;
					
					if(vx==1) entities[k].invis = true;
					
          entities[k].gravity = true;
				break;
				case 1: //Simple enemy, bouncing off the walls
				  entities[k].rule = 1; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].behave = vx; entities[k].para = vy;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].cx = 0;	entities[k].cy = 0;
					
					entities[k].x1 = p1; entities[k].y1 = p2;
					entities[k].x2 = p3; entities[k].y2 = p4;
					
					entities[k].harmful = true;
					//Exact appearance depends entirely on location, assigned here:
					/*	
					}else if (game.roomx == 50 && game.roomy == 52) {
						entities[k].tile = 48; entities[k].colour = 6;
						entities[k].w = 32;	entities[k].h = 27;
						entities[k].animate = 1;
						//ok, for space station 2
						*/
						entities[k].tile = 24; 
						entities[k].animate = 0;
						entities[k].colour = 8;
						
					  
						if  (game.roomy == 111 && (game.roomx >= 113 && game.roomx <= 117)) {
							setenemy(0, k);
							setenemyroom(k, game.roomx, game.roomy); //For colour
						}else if  (game.roomx == 113 && (game.roomy <= 110 && game.roomy >= 108)) {
							setenemy(1, k);
							setenemyroom(k, game.roomx, game.roomy); //For colour
						}else if (game.roomx == 113 && game.roomy == 107) {
							//MAVVERRRICK
							entities[k].tile = 96; entities[k].colour = 6; entities[k].size = 9;
					  	entities[k].w = 64;	entities[k].h = 44;
						  entities[k].animate = 4;
						}else {
							setenemyroom(k, game.roomx, game.roomy);
						}
						
						
					//}else{*/					
					/*
						entities[k].tile = 24; 
						entities[k].animate = 0;
						entities[k].colour = 8;
						//for warpzone:
						if (game.roomx == 51 && game.roomy == 51) entities[k].colour = 6;
						if (game.roomx == 52 && game.roomy == 51) entities[k].colour = 7;
						if (game.roomx == 54 && game.roomy == 49) entities[k].colour = 11;
						if (game.roomx == 55 && game.roomy == 50) entities[k].colour = 9;
						if (game.roomx == 55 && game.roomy == 51) entities[k].colour = 6;
						if (game.roomx == 54 && game.roomy == 51) entities[k].colour = 12;
						if (game.roomx == 54 && game.roomy == 52) entities[k].colour = 7;
						if (game.roomx == 53 && game.roomy == 52) entities[k].colour = 8;
						if (game.roomx == 51 && game.roomy == 52) entities[k].colour = 6;
						if (game.roomx == 52 && game.roomy == 49) entities[k].colour = 8;
					//}
					*/
				break;
				case 2: //A moving platform
				  entities[k].rule = 2; entities[k].type = 1; 
					entities[k].size = 2; entities[k].tile = 1; 
					
					if (customplatformtile > 0){
            entities[k].tile = customplatformtile;
					}else if (platformtile > 0) {
						entities[k].tile = platformtile;
					}else{
						//appearance again depends on location
						if (gridmatch(p1, p2, p3, p4, 100, 70, 320, 160)) entities[k].tile = 616; 
						if (gridmatch(p1, p2, p3, p4, 72, 0, 248, 240)) entities[k].tile = 610; 
						if (gridmatch(p1, p2, p3, p4, -20, 0, 320, 240)) entities[k].tile = 413;
						
						if (gridmatch(p1, p2, p3, p4, -96, -72, 400, 312)) entities[k].tile = 26; 					
						if (gridmatch(p1, p2, p3, p4, -32, -40, 352, 264)) entities[k].tile = 27; 
					}
					
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 32;	entities[k].h = 8;
					
					if (vx <= 1) vertplatforms = true;
					if (vx >= 2  && vx <= 5) horplatforms = true;
					if (vx == 14 || vx == 15) horplatforms = true; //special case for last part of Space Station
					if (vx >= 6  && vx <= 7) vertplatforms = true;
					
					if (vx >= 10  && vx <= 11) {
						//Double sized threadmills
					  entities[k].w = 64;	entities[k].h = 8;
						vx -= 2; entities[k].size = 8;
					}
					
					entities[k].behave = vx; entities[k].para = vy;
					
					if (vx >= 8  && vx <= 9) {
						horplatforms = true; //threadmill!
					  entities[k].animate = 10;
						if(customplatformtile>0){
              entities[k].tile = customplatformtile+4;
              if (vx == 8) entities[k].tile += 4;
							if (vx == 9) entities[k].animate = 11;
            }else{
							settreadmillcolour(k, game.roomx, game.roomy);
							if (vx == 8) entities[k].tile += 40;
							if (vx == 9) entities[k].animate = 11;
            }
						
					}else {
						entities[k].animate = 100;
					}
					
					entities[k].x1 = p1; entities[k].y1 = p2;
					entities[k].x2 = p3; entities[k].y2 = p4;
					
					entities[k].isplatform = true;
					
					createblock(0, xp, yp, 32, 8);
				break;
				case 3: //Disappearing platforms
				  entities[k].rule = 3; entities[k].type = 2; 
					entities[k].size = 2; 
				  entities[k].tile = 2; 
					//appearance again depends on location
					if(customplatformtile>0){
						entities[k].tile=customplatformtile;
					}else if (vx > 0) {
						entities[k].tile = int(vx);
					}else{
					  if(game.roomx==49 && game.roomy==52) entities[k].tile = 18; 
					  if (game.roomx == 50 && game.roomy == 52) entities[k].tile = 22; 
					}
					
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cy = -1;
					entities[k].w = 32;	entities[k].h = 10;
					entities[k].behave = vx; entities[k].para = vy;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					
					createblock(0, xp, yp, 32, 8);
				break;
				case 4: //Breakable blocks
				  entities[k].rule = 6; entities[k].type = 3; 
					entities[k].size = 1; 
				  entities[k].tile = 10; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cy = -1;
					entities[k].w = 8;	entities[k].h = 10;
					entities[k].behave = vx; entities[k].para = vy;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					
					createblock(0, xp, yp, 8, 8);
				break;
				case 5: //Gravity Tokens
				  entities[k].rule = 3; entities[k].type = 4; 
					entities[k].size = 0;  entities[k].tile = 11; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].behave = vx; entities[k].para = vy;
					entities[k].onentity = 1;
					entities[k].animate = 100;
				break;
				case 6: //Decorative particles
				  entities[k].rule = 2; entities[k].type = 5;  //Particles
				  entities[k].colour = 1; entities[k].size = 3;
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].vx = vx;
					entities[k].vy = vy;
					
					entities[k].life = 12;
				break;
				case 7: //Decorative particles
				  entities[k].rule = 2; entities[k].type = 5;  //Particles
				  entities[k].colour = 2; entities[k].size = 3;
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].vx = vx;
					entities[k].vy = vy;
					
					entities[k].life = 12;
				break;
				case 8: //Small collectibles
				  entities[k].rule = 3; entities[k].type = 6; 
					entities[k].size = 4;  entities[k].tile = 48; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 8;	entities[k].h = 8;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					
					//Check if it's already been collected
					entities[k].para = vx;
					if (collect[vx] == 1) entities[k].active = false;
				break;
				case 9: //Something Shiny
				  entities[k].rule = 3; entities[k].type = 7; 
					entities[k].size = 0;  entities[k].tile = 22; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 3;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					
					//Check if it's already been collected
					entities[k].para = vx;
					if (collect[vx] == 1) entities[k].active = false;
				break;
				case 10: //Savepoint
				  entities[k].rule = 3; entities[k].type = 8; 
					entities[k].size = 0;  entities[k].tile = 20 + vx; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 4;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					entities[k].para = vy;
					
					if (game.savepoint == vy) {
						entities[k].colour = 5;
						entities[k].onentity = 0;
					}
					
					if (game.nodeathmode) {
						entities[k].active = false;						
					}
				break;
				case 11: //Horizontal Gravity Line
				  entities[k].rule = 4; entities[k].type = 9; 
					entities[k].size = 5; entities[k].life = 0;
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = vx;	entities[k].h = 1;
					entities[k].onentity = 1;					
				break;
				case 12: //Vertical Gravity Line
				  entities[k].rule = 5; entities[k].type = 10; 
					entities[k].size = 6; entities[k].life = 0;
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 1;	entities[k].h = vx;
					//entities[k].colour = 0;
					entities[k].onentity = 1;					
				break;
				case 13: //Warp token 
				  entities[k].rule = 3; entities[k].type = 11; 
					entities[k].size = 0;  entities[k].tile = 18; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 10;
					entities[k].onentity = 1;
					entities[k].animate = 2;
					
					//Added in port, hope it doesn't break anything
					entities[k].behave = vx;
					entities[k].para = vy;
				break;
				case 14: // Teleporter
				  entities[k].rule = 3; entities[k].type = 100; 
					entities[k].size = 7;  entities[k].tile = 1; //inactive
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 96;	entities[k].h = 96;
					entities[k].colour = 100;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					entities[k].para = vy;
					
					//we'll init it's activeness here later
					/*if (game.savepoint == vy) {
						entities[k].colour = 5;
						entities[k].onentity = 0;
					}*/
				break;
				case 15: // Crew Member (warp zone)
				  entities[k].rule = 6; entities[k].type = 12; //A special case!
				  entities[k].tile = 144; entities[k].colour = 13; //144 for sad :(
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cx = 6; entities[k].cy = 2;
					entities[k].w = 12;	entities[k].h = 21;
					entities[k].dir = 0;
					
					entities[k].state = vx;
          
					entities[k].gravity = true;
				break;
				case 16: // Crew Member, upside down (space station)
				  entities[k].rule = 7; entities[k].type = 12; //A special case!
				  entities[k].tile = 144+6; entities[k].colour = 14; //144 for sad (upside down+12):(
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cx = 6; entities[k].cy = 2;
					entities[k].w = 12;	entities[k].h = 21;
					entities[k].dir = 1;
					
					entities[k].state = vx;
          
					entities[k].gravity = true;
				break;
				case 17: // Crew Member (Lab)
				  entities[k].rule = 6; entities[k].type = 12; //A special case!
				  entities[k].tile = 144; entities[k].colour = 16; //144 for sad :(
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cx = 6; entities[k].cy = 2;
					entities[k].w = 12;	entities[k].h = 21;
					entities[k].dir = 1;
					
					entities[k].state = vx;
          
					entities[k].gravity = true;
				break;
				case 18: // Crew Member (Ship)
				  //This is the scriping crewmember
				  entities[k].rule = 6; entities[k].type = 12; //A special case!
					entities[k].colour = vx;
					if (vy == 0) {
				    entities[k].tile = 0; 
					}else {
						entities[k].tile = 144; 
					}
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cx = 6; entities[k].cy = 2;
					entities[k].w = 12;	entities[k].h = 21;
					entities[k].dir = 0;
					
					entities[k].state = p1;
					entities[k].para = p2;
					
					if (p1 == 17) {
						entities[k].dir = p2;
					}
          
					entities[k].gravity = true;
				break;				
				case 19: // Crew Member (Ship) More tests!
				  entities[k].rule = 6; entities[k].type = 12; //A special case!
				  entities[k].tile = 0; entities[k].colour = 6; //54 for sad :(
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cx = 6; entities[k].cy = 2;
					entities[k].w = 12;	entities[k].h = 21;
					entities[k].dir = 1;
					
					entities[k].state = vx;
          
					entities[k].gravity = true;
				break;
				case 20: //Terminal
				  entities[k].rule = 3; entities[k].type = 13; 
					entities[k].size = 0;  entities[k].tile = 16 + vx; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 4;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					entities[k].para = vy;
					
					/*if (game.savepoint == vy) {
						entities[k].colour = 5;
						entities[k].onentity = 0;
					}*/
				break;
				case 21: //as above, except doesn't highlight
				  entities[k].rule = 3; entities[k].type = 13; 
					entities[k].size = 0;  entities[k].tile = 16 + vx; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 4;
					entities[k].onentity = 0;
					entities[k].animate = 100;
					entities[k].para = vy;
					
					/*if (game.savepoint == vy) {
						entities[k].colour = 5;
						entities[k].onentity = 0;
					}*/
				break;
				case 22: //Fake trinkets, only appear if you've collected them
				  entities[k].rule = 3; entities[k].type = 7; 
					entities[k].size = 0;  entities[k].tile = 22; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 3;
					entities[k].onentity = 0;
					entities[k].animate = 100;
					
					//Check if it's already been collected
					entities[k].para = vx;
					if (collect[vx] == 0) entities[k].active = false;
				break;
				case 23: //SWN Enemies
				  //Given a different behavior, these enemies are especially for SWN mode and disappear outside the screen.
					entities[k].rule = 1;  entities[k].type = 23;
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].behave = vx; entities[k].para = vy;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].cx = 0;	entities[k].cy = 0;
					
					entities[k].x1 = -2000; entities[k].y1 = -100;
					entities[k].x2 = 5200; entities[k].y2 = 340;
					
					entities[k].harmful = true;
					
					//initilise tiles here based on behavior
					entities[k].size = 12; //don't wrap around
					entities[k].colour = 21;
					entities[k].tile = 78; //default case
					entities[k].animate = 1;
					if (game.swngame == 1) {
						//set colour based on current state
						entities[k].colour = swncolour(game.swncolstate);
					}
				break;
				case 24: // Super Crew Member 
				  //This special crewmember is way more advanced than the usual kind, and can interact with game objects
				  entities[k].rule = 6; entities[k].type = 14; //A special case!
					entities[k].colour = vx;
					if(vx==16){
						//victoria is sad!
						if (vy == 2) vy = 1;
					}else {
						if (vy == 2) vy = 0;
					}
					if (vy == 0) {
				    entities[k].tile = 0; 
					}else {
						entities[k].tile = 144; 
					}
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].cx = 6; entities[k].cy = 2;
					entities[k].w = 12;	entities[k].h = 21;
					entities[k].dir = 1;
					
					entities[k].x1 = -2000; entities[k].y1 = -100;
					entities[k].x2 = 5200; entities[k].y2 = 340;
					
					entities[k].state = p1;
					entities[k].para = p2;
					
					if (p1 == 17) {
						entities[k].dir = p2;
					}
          
					entities[k].gravity = true;
				break;	
				case 25: //Trophies
				  entities[k].rule = 3; entities[k].type = 15; 
					entities[k].size = 0;  
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 4;
					entities[k].onentity = 1;
					entities[k].animate = 100;
					entities[k].para = vy;
					
					//Decide tile here based on given achievement: both whether you have them and what they are
					//default is just a trophy base:
					entities[k].tile = 180 + vx; 
					switch(vy) {
						case 1: if(game.bestrank[0]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 31;}	break;
						case 2: if(game.bestrank[1]>=3) { entities[k].tile = 186 + vx; entities[k].colour = 35;}	break;
						case 3: if(game.bestrank[2]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 33;}	break;
						case 4: if(game.bestrank[3]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 32;}	break;
						case 5: if(game.bestrank[4]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 34;}	break;
						case 6: if(game.bestrank[5]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 30;}	break;
						
						case 7:
						  if(game.unlock[5]){
								entities[k].tile = 188 + vx; 
								entities[k].colour = 37;	
								entities[k].h += 3;
							}
						break;
						case 8: 
						  if(game.unlock[19]){
								entities[k].tile = 188 + vx; 
								entities[k].colour = 37;	
								entities[k].h += 3;
							}
						break;
						
						case 9: 
						  if (game.bestgamedeaths > -1) {
								if (game.bestgamedeaths <= 50) {
							    entities[k].tile = 182 + vx; entities[k].colour = 40;	
								}
							}
						break;
						case 10: 
						  if (game.bestgamedeaths > -1) {
								if (game.bestgamedeaths <= 100) {
						      entities[k].tile = 182 + vx; entities[k].colour = 36;	
								}
							}
						break;
						case 11: 
						  if (game.bestgamedeaths > -1) {
								if (game.bestgamedeaths <= 250) {
						      entities[k].tile = 182 + vx; entities[k].colour = 38;	
								}
							}
						break;
						case 12:
						  if (game.bestgamedeaths > -1) {
								if (game.bestgamedeaths <= 500) {
									entities[k].tile = 182 + vx; entities[k].colour = 39;	
								}
							}
						break;
						
						case 13: if(game.swnbestrank>=1) { entities[k].tile = 182 + vx; entities[k].colour = 39;}	break;
						case 14: if(game.swnbestrank>=2) { entities[k].tile = 182 + vx; entities[k].colour = 39;}	break;
						case 15: if(game.swnbestrank>=3) { entities[k].tile = 182 + vx; entities[k].colour = 39;}	break;
						case 16: if(game.swnbestrank>=4) { entities[k].tile = 182 + vx; entities[k].colour = 38;}	break;
						case 17: if(game.swnbestrank>=5) { entities[k].tile = 182 + vx; entities[k].colour = 36;}	break;
						case 18: if(game.swnbestrank>=6) { entities[k].tile = 182 + vx; entities[k].colour = 40;}	break;
						
						case 19:
						  if(game.unlock[20]){
								entities[k].tile = 3; entities[k].colour = 102;
								entities[k].size = 13;
								entities[k].xp -= 64; entities[k].yp -= 128;
							}
						break;
						
					}
					
				break;
				case 26: //Epilogue super warp token
				  entities[k].rule = 3; entities[k].type = 11; 
					entities[k].size = 0;  entities[k].tile = 18; 
					entities[k].xp = xp; entities[k].yp = yp;
					entities[k].w = 16;	entities[k].h = 16;
					entities[k].colour = 3;
					entities[k].onentity = 0;
					entities[k].animate = 100;
					entities[k].para = vy;
					entities[k].size = 13;
				break;
				case 51: //Vertical Warp Line
					entities[k].rule = 5;
					entities[k].type = 51;
					entities[k].size = 6;
					entities[k].life = 0;
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].w = 1;
					entities[k].h = vx;
					//entities[k].colour = 0;
					entities[k].onentity = 1;
					entities[k].invis=true;
        break;
				case 52: //Vertical Warp Line
					entities[k].rule = 5;
					entities[k].type = 52;
					entities[k].size = 6;
					entities[k].life = 0;
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].w = 1;
					entities[k].h = vx;
					//entities[k].colour = 0;
					entities[k].onentity = 1;
					entities[k].invis=true;
        break;
				case 53: //Horizontal Warp Line
					entities[k].rule = 7;
					entities[k].type = 53;
					entities[k].size = 5;
					entities[k].life = 0;
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].w = vx;
					entities[k].h = 1;
					entities[k].onentity = 1;
					entities[k].invis=true;
        break;
				case 54: //Horizontal Warp Line
					entities[k].rule = 7;
					entities[k].type = 54;
					entities[k].size = 5;
					entities[k].life = 0;
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].w = vx;
					entities[k].h = 1;
					entities[k].onentity = 1;
					entities[k].invis=true;
        break;
				case 55: // Crew Member (custom, collectable)
					//1 - position in array
					//2 - colour
					entities[k].rule = 3;
					entities[k].type = 55;
					if(customcrewmoods[int(vy)]==1){
						entities[k].tile = 144;
					}else{
						entities[k].tile = 0;
					}
					entities[k].colour = crewcolour(int(vy));
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].cx = 6;
					entities[k].cy = 2;
					entities[k].w = 12;
					entities[k].h = 21;
					entities[k].dir = 0;

					entities[k].state = 0;
					entities[k].onentity = 1;
					//entities[k].state = vx;

					entities[k].gravity = true;

					//Check if it's already been collected
					entities[k].para = vx;
					if (customcollect[vx] == 1) entities[k].active = false;
        break;
				case 56: //Custom enemy
					entities[k].rule = 1;
					entities[k].type = 1;
					entities[k].xp = xp;
					entities[k].yp = yp;
					entities[k].behave = vx;
					entities[k].para = vy;
					entities[k].w = 16;
					entities[k].h = 16;
					entities[k].cx = 0;
					entities[k].cy = 0;

					entities[k].x1 = p1;
					entities[k].y1 = p2;
					entities[k].x2 = p3;
					entities[k].y2 = p4;

					entities[k].harmful = true;

					switch(customenemy){
						case 0: setenemyroom(k, 4+100, 0+100); break;
						case 1: setenemyroom(k, 2+100, 0+100); break;
						case 2: setenemyroom(k, 12+100, 3+100); break;
						case 3: setenemyroom(k, 13+100, 12+100); break;
						case 4: setenemyroom(k, 16+100, 9+100); break;
						case 5: setenemyroom(k, 19+100, 1+100); break;
						case 6: setenemyroom(k, 19+100, 2+100); break;
						case 7: setenemyroom(k, 18+100, 3+100); break;
						case 8: setenemyroom(k, 16+100, 0+100); break;
						case 9: setenemyroom(k, 14+100, 2+100); break;
						default: setenemyroom(k, 4+100, 0+100); break;
					}

					//Set colour based on room tile
					 //Set custom colours
					if(customplatformtile>0){
						var entcol:int = (customplatformtile / 12);
						switch(entcol){
							//RED
							case 3: case 7: case 12: case 23: case 28:
							case 34: case 42: case 48: case 58:
								entities[k].colour = 6; break;
							//GREEN
							case 5: case 9: case 22: case 25: case 29:
							case 31: case 38: case 46: case 52: case 53:
								entities[k].colour = 7; break;
							//BLUE
							case 1: case 6: case 14: case 27: case 33:
							case 44: case 50: case 57:
								entities[k].colour = 12; break;
							//YELLOW
							case 4: case 17: case 24: case 30: case 37:
							case 45: case 51: case 55:
								entities[k].colour = 9; break;
							//PURPLE
							case 2: case 11: case 15: case 19: case 32:
							case 36: case 49:
								entities[k].colour = 20; break;
							//CYAN
							case 8: case 10: case 13: case 18: case 26:
							case 35: case 41: case 47: case 54:
								entities[k].colour = 11; break;
							//PINK
							case 16: case 20: case 39: case 43: case 56:
								entities[k].colour = 8; break;
							//ORANGE
							case 21: case 40:
								entities[k].colour = 17; break;
							default:
								entities[k].colour = 6;
							break;
						}
					}
        break;
			}
		}
		
		public function updateentities(i:int, help:helpclass, game:gameclass, music:musicclass):Boolean {
			if(entities[i].active){
				if(entities[i].statedelay<=0){
					switch(entities[i].type) {
						case 0:  //Player
						  if (entities[i].state == 0) {
							}
						break;
						case 1:  //Movement behaviors
						  //Enemies can have a number of different behaviors:
							switch(entities[i].behave) {
								case 0: //Bounce, Start moving down
								  if (entities[i].state == 0) { //Init
										entities[i].state = 3; updateentities(i, help, game, music);
									}else if (entities[i].state == 1) { 
										if (entities[i].outside()) entities[i].state = entities[i].onwall; 
							    }else if (entities[i].state == 2) { 
									  entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
									}else if (entities[i].state == 3) {
										entities[i].vy = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
								break;
								case 1: //Bounce, Start moving up
								  if (entities[i].state == 0) { //Init
										entities[i].state = 2; updateentities(i, help, game, music);
							    }else if (entities[i].state == 1) { 
										if (entities[i].outside()) entities[i].state = entities[i].onwall; 
							    }else if (entities[i].state == 2) { 
									  entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
									}else if (entities[i].state == 3) {
										entities[i].vy = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
								break;
								case 2: //Bounce, Start moving left
								  if (entities[i].state == 0) { //Init
										entities[i].state = 3; updateentities(i, help, game, music);
							    }else if (entities[i].state == 1) { 
										if (entities[i].outside()) entities[i].state = entities[i].onwall; 
							    }else if (entities[i].state == 2) { 
									  entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
									}else if (entities[i].state == 3) {
										entities[i].vx = -entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
								break;
								case 3: //Bounce, Start moving right
								  if (entities[i].state == 0) { //Init
										entities[i].state = 3; updateentities(i, help, game, music);
							    }else if (entities[i].state == 1) { 
										if (entities[i].outside()) entities[i].state = entities[i].onwall; 
							    }else if (entities[i].state == 2) { 
									  entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
									}else if (entities[i].state == 3) {
										entities[i].vx = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
								break;
								case 4: //Always move left
								  if (entities[i].state == 0) { //Init
										entities[i].vx = entities[i].para; 
									}
								break;
								case 5: //Always move right
								  if (entities[i].state == 0) { //Init
										entities[i].vx = entities[i].para;
										entities[i].state = 1
										entities[i].onwall = 2;
									}else if (entities[i].state == 2) {
										entities[i].vx = 0; entities[i].onwall = 0;
										entities[i].xp -= entities[i].para;
										entities[i].statedelay=8; entities[i].state=0;
									}
								break;
								case 6: //Always move up
								  if (entities[i].state == 0) { //Init
										entities[i].vy = entities[i].para;
										entities[i].state = 1;
										entities[i].onwall = 2;
									}else if (entities[i].state == 2) {
										entities[i].vy = -entities[i].para; entities[i].onwall = 0;
										entities[i].yp -= entities[i].para;
										entities[i].statedelay=8; entities[i].state=0;
									}
								break;
								case 7: //Always move down
								  if (entities[i].state == 0) { //Init
										entities[i].vx = entities[i].para; 
									}
								break;
								case 8: case 9:
								  //Threadmill: don't move, just impart velocity
									if (entities[i].state == 0) { //Init
										entities[i].vx = 0;
										entities[i].state = 1;
										entities[i].onwall = 0;
									}
								break;
								case 10:
								  //Emitter: shoot an enemy every so often
									if (entities[i].state == 0) { 
										createentity(game, entities[i].xp+28, entities[i].yp, 1, 10, 1);
										entities[i].state = 1; entities[i].statedelay = 12;
									}else if (entities[i].state == 1) { 
									  entities[i].state = 0;
									}
								break;
								case 11: //Always move right, destroy when outside screen
								  if (entities[i].state == 0) { //Init
										entities[i].vx = entities[i].para;
										entities[i].state = 1
									}else if (entities[i].state == 1) {
										if (entities[i].xp >= 335) entities[i].active = false;
										if (game.roomx == 117) {
											if (entities[i].xp >= (33*8)-32) entities[i].active = false;
											//collector for LIES
										}
									}
								break;
								case 12:
								  //Emitter: shoot an enemy every so often (up)
									if (entities[i].state == 0) { 
										createentity(game, entities[i].xp, entities[i].yp, 1, 12, 1);
										entities[i].state = 1; entities[i].statedelay = 16;
									}else if (entities[i].state == 1) { 
									  entities[i].state = 0;
									}
								break;
								case 13: //Always move up, destroy when outside screen
								  if (entities[i].state == 0) { //Init
										entities[i].vy = entities[i].para;
										entities[i].state = 1
									}else if (entities[i].state == 1) {
										if (entities[i].yp <= -60) entities[i].active = false;
										if (game.roomy == 108) {
											if (entities[i].yp <= 60) entities[i].active = false;
											//collector for factory
										}
									}
								break;
								case 14: //Very special hack: as two, but doesn't move in specific circumstances
								  if (entities[i].state == 0) { //Init
										for (j = 0; j < nentity; j++) {
									    if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp-32) {
										    entities[i].state = 3; updateentities(i, help, game, music);
									    }
								    }
							    }else if (entities[i].state == 1) { 
										if (entities[i].outside()) entities[i].state = entities[i].onwall; 
							    }else if (entities[i].state == 2) { 
									  entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
									}else if (entities[i].state == 3) {
										entities[i].vx = -entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
								break;
								case 15: //As above, but for 3!
								  if (entities[i].state == 0) { //Init
										for (j = 0; j < nentity; j++) {
									    if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp+32) {
										    entities[i].state = 3; updateentities(i, help, game, music);
									    }
								    }
							    }else if (entities[i].state == 1) { 
										if (entities[i].outside()) entities[i].state = entities[i].onwall; 
							    }else if (entities[i].state == 2) { 
									  entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
									}else if (entities[i].state == 3) {
										entities[i].vx = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
								break;
								case 16: //MAVERICK BUS FOLLOWS HIS OWN RULES
								  if (entities[i].state == 0) { //Init
										//first, y position
										if (entities[getplayer()].yp > 14 * 8) {
											entities[i].tile = 120; 
											entities[i].yp = (28*8)-62;
										}else {
											entities[i].tile = 96; 
											entities[i].yp = 24;
										}
										//now, x position
										if (entities[getplayer()].xp > 20 * 8) {
											//approach from the left
											entities[i].xp = -64;
										  entities[i].state = 2; updateentities(i, help, game, music); //right
										}else {
											//approach from the left
											entities[i].xp = 320;
										  entities[i].state = 3; updateentities(i, help, game, music); //left
										}
										
							    }else if (entities[i].state == 1) { 
										if (entities[i].outside()) entities[i].state = entities[i].onwall; 
							    }else if (entities[i].state == 2) { 
									  entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
									}else if (entities[i].state == 3) {
										entities[i].vx = -entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
								break;
								case 17: //Special for ASCII Snake (left)
								  if (entities[i].state == 0) { //Init
										entities[i].statedelay = 6; entities[i].xp -= entities[i].para;
							    }
								break;
								case 18: //Special for ASCII Snake (right)
								  if (entities[i].state == 0) { //Init
										entities[i].statedelay = 6; entities[i].xp += entities[i].para;
							    }
								break;
							}
						break;
						case 2: //Disappearing platforms
						  //wait for collision
						  if (entities[i].state == 1) { 
								entities[i].life = 12;
								entities[i].state = 2; entities[i].onentity = 0;
								
								music.playef(7,10);
							}else if (entities[i].state == 2) { 
							  entities[i].life--;
								if (entities[i].life % 3 == 0) entities[i].tile++;
								if (entities[i].life <= 0) {
									removeblockat(entities[i].xp, entities[i].yp);
									entities[i].state = 3;// = false;
									entities[i].invis = true;
								}
							}else if (entities[i].state == 3) {
								//wait until recharged!
							}else if (entities[i].state == 4) {
								//restart!
					      createblock(0, entities[i].xp, entities[i].yp, 32, 8);
								entities[i].state = 4;
								entities[i].invis = false;
								entities[i].tile--;
								entities[i].state++; entities[i].onentity = 1;
							}else if (entities[i].state == 5) { 
							  entities[i].life+=3;
								if (entities[i].life % 3 == 0) entities[i].tile--;
								if (entities[i].life >= 12) {
									entities[i].life = 12;
									entities[i].state = 0;
								  entities[i].tile++;
								}
							}
						break;
						case 3: //Breakable blocks
						  //Only counts if vy of player entity is non zero
						  if (entities[i].state == 1) { 
								j = getplayer();
								//if (entities[j].vy > 0.5 && (entities[j].yp+entities[j].h<=entities[i].yp+6)) {
									entities[i].life = 4;
									entities[i].state = 2; entities[i].onentity = 0;
								  music.playef(6,10);
								/*}else if (entities[j].vy <= -0.5  && (entities[j].yp>=entities[i].yp+2)) {
									entities[i].life = 4;
									entities[i].state = 2; entities[i].onentity = 0;
                }else {
									entities[i].state = 0;
								}*/
							}else if (entities[i].state == 2) { 
							  entities[i].life--;
								entities[i].tile++;
								if (entities[i].life <= 0) {
									removeblockat(entities[i].xp, entities[i].yp);
									entities[i].active = false;
								}
							}
						break;
						case 4: //Gravity token
						  //wait for collision
						  if (entities[i].state == 1) { 
								entities[i].active = false;
								game.gravitycontrol = (game.gravitycontrol + 1) % 2;
								
							}
						break;
						case 5:  //Particle sprays
						  if (entities[i].state == 0) {
								entities[i].life--;
								if (entities[i].life < 0) entities[i].active = false;
							}
						break;
						case 6: //Small pickup
						  //wait for collision
						  if (entities[i].state == 1) { 
								game.coins++;
								music.playef(4,10);
								collect[entities[i].para] = 1;
								
								entities[i].active = false;
							}
						break;
						case 7: //Found a trinket
						  //wait for collision
						  if (entities[i].state == 1) { 
								game.trinkets++;
								if (game.intimetrial) {
									collect[entities[i].para] = 1;
									music.playef(25,10);
								}else{
									game.state = 1000;
									//music.haltdasmusik();
									music.silencedasmusik();
									music.playef(3,10);
									collect[entities[i].para] = 1;
									if (game.trinkets > game.stat_trinkets) {
										game.stat_trinkets = game.trinkets;
									}
								}
									
								entities[i].active = false;
							}
						break;
						case 8: //Savepoints
						  //wait for collision
						  if (entities[i].state == 1) { 
								//First, deactivate all other savepoints
								for (j = 0; j < nentity; j++) {
									if (entities[j].type == 8 && entities[j].active) {
										entities[j].colour = 4; entities[j].onentity = 1;
									}
								}
								entities[i].colour = 5;
						    entities[i].onentity = 0;
								game.savepoint = entities[i].para;
								music.playef(5,10);
								
								game.savex = entities[i].xp - 4; 
								
								if (entities[i].tile == 20) {
								  game.savey = entities[i].yp - 1;
								  game.savegc = 1;
								}else if (entities[i].tile == 21) {
								  game.savey = entities[i].yp-8;
								  game.savegc = 0;
								}
								
								game.saverx = game.roomx; game.savery = game.roomy;  
								game.savedir = entities[getplayer()].dir;		
								entities[i].state = 0;
								
								if(!game.mobilequicksave_thisroom){
									game.autoquicksave = true;
									game.mobilequicksave_thisroom = true;
								}
							}
						break;
						case 9: //Gravity Lines
						  if (entities[i].state == 1) { 
								entities[i].life--;
								entities[i].onentity = 0;
								
								if (entities[i].life <= 0) {
								  entities[i].state = 0;
									entities[i].onentity = 1;
								}
							}
						break;
						case 10: //Vertical gravity Lines
						  if (entities[i].state == 1) { 
								entities[i].onentity = 3;
								entities[i].state = 2;
								
								
								music.playef(8,10);
								game.gravitycontrol = (game.gravitycontrol + 1) % 2;
						    game.totalflips++;
								temp = getplayer();
								if (game.gravitycontrol == 0) {
									if (entities[temp].vy < 3) entities[temp].vy = 3;
								}else {
									if (entities[temp].vy > -3) entities[temp].vy = -3;
								}
							}else if (entities[i].state == 2) { 
								entities[i].life--;
								if (entities[i].life <= 0) {
								  entities[i].state = 0;
									entities[i].onentity = 1;
								}
							}else if (entities[i].state == 3) { 
								entities[i].state = 2; entities[i].life = 4;
								entities[i].onentity = 3;
							}else if (entities[i].state == 4) { 
								//Special case for room initilisations: As state one, except without the reversal
								entities[i].onentity = 3;
								entities[i].state = 2;
							}
						break;
						case 11: //Warp point
						  //wait for collision
						  if (entities[i].state == 1) { 
								//Depending on the room the warp point is in, teleport to a new location!
								entities[i].onentity = 0;
								//play a sound or somefink
								music.playef(10);
								game.teleport = true;

                game.edteleportent = i;
								//for the multiple room:
								if (int(entities[i].xp) == 12*8) game.teleportxpos = 1;
								if (int(entities[i].xp) == 5*8) game.teleportxpos = 2;
								if (int(entities[i].xp) == 28*8) game.teleportxpos = 3;
								if (int(entities[i].xp) == 21*8) game.teleportxpos = 4;
							}
						break;
						case 12: //Crew member
						  //Somewhat complex AI: exactly what they do depends on room, location, state etc
							//At state 0, do nothing at all.
						  if (entities[i].state == 1) { 
								//happy!
								if (entities[k].rule == 6)	entities[k].tile = 0;
								if (entities[k].rule == 7)	entities[k].tile = 6;
							  //Stay close to the hero!
								j = getplayer();
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
								
								//Special rules:
								if (game.roomx == 110 && game.roomy == 105) {
									if (entities[i].xp < 155) {	if (entities[i].ax < 0) entities[i].ax = 0; }
								}
							}else if (entities[i].state == 2) {
								//Basic rules, don't change expression
								j = getplayer();
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 10) {
								//Everything from 10 on is for cutscenes
								//Basic rules, don't change expression
								j = getplayer();
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 11) {
								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
								j=getcrewman(1); //purple
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 12) {
								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
								j=getcrewman(2); //yellow
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 13) {
								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
								j=getcrewman(3); //red
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 14) {
								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
								j=getcrewman(4); //green
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 15) {
								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
								j=getcrewman(5); //blue
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 16) {
								//Follow a position: given an x coordinate, seek it out.
								if (entities[i].para > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[i].para < entities[i].xp - 5) {	entities[i].dir = 0; }
								
								if (entities[i].para > entities[i].xp + 45) {	entities[i].ax = 3; 
								}else if (entities[i].para < entities[i].xp - 45) {	entities[i].ax = -3; }
							}else if (entities[i].state == 17) {
								//stand still
							}else if (entities[i].state == 18) {
								//Stand still and face the player
								j = getplayer();
								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
							}else if (entities[i].state == 19) {
								//Walk right off the screen after time t
								if (entities[i].para <= 0) {
									entities[i].dir = 1;
									entities[i].ax = 3; 
								}else {
									entities[i].para--;
								}
							}else if (entities[i].state == 20) {
								//Panic! For briefing script
								if (entities[i].life == 0) {
									//walk left for a bit
									entities[i].ax = 0;
									if (40 > entities[i].xp + 5) { entities[i].dir = 1;
									}else if (40 < entities[i].xp - 5) {	entities[i].dir = 0; }
									
									if (40 > entities[i].xp + 45) {	entities[i].ax = 3; 
									}else if (40 < entities[i].xp - 45) {	entities[i].ax = -3; }
									if (entities[i].ax == 0) { entities[i].life = 1; entities[i].para = 30;}
								}else	if (entities[i].life == 1) {
									//Stand around for a bit
									entities[i].para--;
									if (entities[i].para <= 0) {
										entities[i].life++;
									}
								}else if (entities[i].life == 2) {
									//walk right for a bit
									entities[i].ax = 0;
									if (280 > entities[i].xp + 5) { entities[i].dir = 1;
									}else if (280 < entities[i].xp - 5) {	entities[i].dir = 0; }
									
									if (280 > entities[i].xp + 45) {	entities[i].ax = 3; 
									}else if (280 < entities[i].xp - 45) {	entities[i].ax = -3; }
									if (entities[i].ax == 0) { entities[i].life = 3; entities[i].para = 30;}
								}else	if (entities[i].life == 3) {
									//Stand around for a bit
									entities[i].para--;
									if (entities[i].para <= 0) {
										entities[i].life=0;
									}
								}
							}
						break;
						case 13: //Terminals (very similar to savepoints)
						  //wait for collision
						  if (entities[i].state == 1) { 
								entities[i].colour = 5;
						    entities[i].onentity = 0;
								music.playef(17,10);
								
								entities[i].state = 0;
							}
						break;
						case 14: //Super Crew member
						  //Actually needs less complex AI than the scripting crewmember
						  if (entities[i].state == 0) {
								//follow player, but only if he's on the floor!
								j = getplayer();
								if(entities[j].onground>0){
									if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
									}else if (entities[j].xp>15 && entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
									
									if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3; 
									}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
									if (entities[i].ax < 0 && entities[i].xp < 60) {
										entities[i].ax = 0;
									}
								}else {
									if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
									}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
									
									entities[i].ax = 0;
								}
								
								if (entities[i].xp > 240) {
									entities[i].ax = 3; entities[i].dir = 1;
								}
								if (entities[i].xp >= 310) {		
									game.scmprogress++;
									entities[i].active = false;
								}
							}
						break;
						case 15: //Trophy
						  //wait for collision
						  if (entities[i].state == 1) { 
								trophytext+=2; if (trophytext > 30) trophytext = 30;
								trophytype = entities[i].para;
								
								entities[i].state = 0;
							}
						break;
						case 23:
						  //swn game!
							switch(entities[i].behave) {
								case 0:
								  if (entities[i].state == 0) { //Init
									  entities[i].vx = 7;
										if (entities[i].xp > 320) entities[i].active = false;
									}
								break;
								case 1:
								  if (entities[i].state == 0) { //Init
									  entities[i].vx = -7;
										if (entities[i].xp <-20) entities[i].active = false;
									}
								break;
							}
						break;
						case 51: //Vertical warp line
							if (entities[i].state == 2){
								var j:int = getplayer();								
								if(entities[j].xp<=307){
									customwarpmodevon=false;
									entities[i].state = 0;
								}
							}else if (entities[i].state == 1){
								entities[i].state = 2;
								entities[i].statedelay = 2;
								entities[i].onentity = 1;
								customwarpmodevon=true;
							}
						break;
						case 52: //Vertical warp line
							if (entities[i].state == 2){
								j = getplayer();
								if(entities[j].xp<=307){
									customwarpmodevon=false;
									entities[i].state = 0;
								}
							}else if (entities[i].state == 1){
								entities[i].state = 2;
								entities[i].statedelay = 2;
								entities[i].onentity = 1;
								customwarpmodevon=true;
							}
						break;
						case 53: //Warp lines Horizonal
							if (entities[i].state == 2){
								customwarpmodehon=false;
								entities[i].state = 0;
							}else if (entities[i].state == 1){
								entities[i].state = 2;
								entities[i].statedelay = 2;
								entities[i].onentity = 1;
								customwarpmodehon=true;
							}
						break;
						case 54: //Warp lines Horizonal
							////if (entities[i].state != 0) {
								//trace("entity 54 is still here! ", i, ": state = ", entities[i].state, String(int(Math.random()*100)), entities[i].active);
							////}
							if (entities[i].state == 2){
								customwarpmodehon=false;
								entities[i].state = 0;
							}else if (entities[i].state == 1){
								entities[i].state = 2;
								entities[i].statedelay = 2;
								entities[i].onentity = 1;
								customwarpmodehon=true;
							}
						break;
						case 55: //Collectable crewmate
							//wait for collision
							if (entities[i].state == 0){
								//Basic rules, don't change expression
								j = getplayer();
								if (entities[j].xp > entities[i].xp + 5){
									entities[i].dir = 1;
								}else if (entities[j].xp < entities[i].xp - 5) {
									entities[i].dir = 0;
								}
							}else if (entities[i].state == 1){
								game.crewmates++;
								if (game.intimetrial){
									customcollect[entities[i].para] = 1;
									music.playef(27,10);
								}else{
									game.state = 1010;
									//music.haltdasmusik();
									if(music.currentsong!=-1) music.silencedasmusik();
									music.playef(27,10);
									customcollect[entities[i].para] = 1;
								}
								
								entities[i].active = false;
							}
						break;
						case 100: //The teleporter
						  if (entities[i].state == 1) { 
								//if inactive, activate!
								if (entities[i].tile == 1) {
								  music.playef(18, 10);
									entities[i].onentity = 0;
									entities[i].tile = 2;
									entities[i].colour = 101;		
									if(!game.intimetrial && !game.nodeathmode){
									  game.state = 2000; game.statedelay = 0;
									}
									
									game.activetele = true;
									game.teleblock.x = entities[i].xp - 32;	game.teleblock.y = entities[i].yp - 32;
									game.teleblock.width = 160;							game.teleblock.height = 160;
									
									
									//Alright, let's set this as our savepoint too
									//First, deactivate all other savepoints
									for (j = 0; j < nentity; j++) {
										if (entities[j].type == 8 && entities[j].active) {
											entities[j].colour = 4; entities[j].onentity = 1;
										}
									}
									game.savepoint = entities[i].para;
									game.savex = entities[i].xp + 44; 
									game.savey = entities[i].yp + 44; 
									game.savegc = 0;
									
									game.saverx = game.roomx; game.savery = game.roomy;  
									game.savedir = entities[getplayer()].dir;		
									entities[i].state = 0;
									
									if(!game.mobilequicksave_thisroom){
										game.autoquicksave = true;
										game.mobilequicksave_thisroom = true;
									}
								}
								
								entities[i].state = 0;
							}else if (entities[i].state == 2) { 
								//Initilise the teleporter without changing the game state or playing sound
								entities[i].onentity = 0;
								entities[i].tile = 6;
								entities[i].colour = 102;		
									
								game.activetele = true;
								game.teleblock.x = entities[i].xp - 32;	game.teleblock.y = entities[i].yp - 32;
								game.teleblock.width = 160;							game.teleblock.height = 160;
								
								entities[i].state = 0;
							}
						break;
					}
				}else {
					entities[i].statedelay--;
					if (entities[i].statedelay < 0) entities[i].statedelay = 0;
				}
			}
			
			return true;
		}
		
		public function animateentities(i:int, game:gameclass, help:helpclass):void {
			if(entities[i].active){
				if(entities[i].statedelay<=0){
					switch(entities[i].type) {
						case 0:
						  entities[i].framedelay--;
							if(entities[i].dir==1){
								entities[i].drawframe=entities[i].tile;
							}else{
								entities[i].drawframe=entities[i].tile+3;
							}
							
							if(entities[i].onground>0 || entities[i].onroof>0){
							  if(int(entities[i].vx)!=0){
									//Walking
									if(entities[i].framedelay<=0){
										entities[i].framedelay=4;
										entities[i].walkingframe++;
									}
									if (entities[i].walkingframe >=2) entities[i].walkingframe=0;
									entities[i].drawframe += entities[i].walkingframe + 1;
								}
								
							  if (entities[i].onroof > 0) entities[i].drawframe += 6;
							}else {
								entities[i].drawframe ++;
								if (game.gravitycontrol == 1) {
									entities[i].drawframe += 6;
								}
							}
							
							if (game.deathseq > -1) {
							  entities[i].drawframe=13;
								if (entities[i].dir == 1) entities[i].drawframe = 12;
								if (game.gravitycontrol == 1) entities[i].drawframe += 2;
							}
						break;
						case 1: case 23:
						  //Variable animation
							switch(entities[i].animate) {
								case 0:
								  //Simple oscilation
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 8;
										if(entities[i].actionframe==0){
										  entities[i].walkingframe++;
											if (entities[i].walkingframe == 4) {
												entities[i].walkingframe = 2;
												entities[i].actionframe = 1;
											}
										}else {
											entities[i].walkingframe--;
											if (entities[i].walkingframe == -1) {
												entities[i].walkingframe = 1;
												entities[i].actionframe = 0;
											}
										}
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += entities[i].walkingframe;
								break;
								case 1:
								  //Simple Loop
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 8;
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 4) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += entities[i].walkingframe;
								break;
								case 2:
								  //Simpler Loop (just two frames)
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 2;
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 2) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += entities[i].walkingframe;
								break;
								case 3:
								  //Simpler Loop (just two frames, but double sized)
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 2;
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 2) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += (entities[i].walkingframe*2);
								break;
								case 4:
								  //Simpler Loop (just two frames, but double sized) (as above but slower)
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 6;
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 2) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += (entities[i].walkingframe*2);
								break;
								case 5:
								  //Simpler Loop (just two frames) (slower)
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 6;
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 2) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += entities[i].walkingframe;
								break;
								case 6:
								  //Normal Loop (four frames, double sized) 
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 4;
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 4) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += (entities[i].walkingframe*2);
								break;
								case 7:
								  //Simpler Loop (just two frames) (slower) (with directions!)
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 6;
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 2) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += entities[i].walkingframe;
									
									if (entities[i].vx > 0) entities[i].drawframe += 2;
								break;
								case 10:
								  //Threadmill left
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 3;//(6-entities[i].para);
										entities[i].walkingframe--;
										if (entities[i].walkingframe == -1) {
											entities[i].walkingframe = 3;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += entities[i].walkingframe;
								break;
								case 11:
								  //Threadmill right
									entities[i].framedelay--;
									if(entities[i].framedelay<=0){
										entities[i].framedelay = 3;//(6-entities[i].para);
										entities[i].walkingframe++;
										if (entities[i].walkingframe == 4) {
											entities[i].walkingframe = 0;
										}										
									}
									
							    entities[i].drawframe = entities[i].tile;
									entities[i].drawframe += entities[i].walkingframe;
								break;
								case 100:
								  //Simple case for no animation (platforms, etc)
								  entities[i].drawframe = entities[i].tile;
								break;
								default:
							    entities[i].drawframe = entities[i].tile;
								break;
							}
						break;
						case 11:
							entities[i].drawframe = entities[i].tile;
							if(entities[i].animate==2) {
								//Simpler Loop (just two frames)
								entities[i].framedelay--;
								if(entities[i].framedelay<=0){
									entities[i].framedelay = 10;
									entities[i].walkingframe++;
									if (entities[i].walkingframe == 2) {
										entities[i].walkingframe = 0;
									}										
								}
								
								entities[i].drawframe = entities[i].tile;
								entities[i].drawframe += entities[i].walkingframe;
							}
  					break;
						case 12: case 55: case 14: //Crew member! Very similar to hero
						  entities[i].framedelay--;
							if(entities[i].dir==1){
								entities[i].drawframe=entities[i].tile;
							}else{
								entities[i].drawframe=entities[i].tile+3;
							}
							
							if(entities[i].onground>0 || entities[i].onroof>0){
							  if(entities[i].vx!=0){
									//Walking
									if(entities[i].framedelay<=0){
										entities[i].framedelay=4;
										entities[i].walkingframe++;
									}
									if (entities[i].walkingframe >=2) entities[i].walkingframe=0;
									entities[i].drawframe += entities[i].walkingframe + 1;
								}
								
							  //if (entities[i].onroof > 0) entities[i].drawframe += 6;
							}else {
								entities[i].drawframe ++;
								//if (game.gravitycontrol == 1) {
								//	entities[i].drawframe += 6;
								//}
							}
							
							if (game.deathseq > -1) {
							  entities[i].drawframe=13;
								if (entities[i].dir == 1) entities[i].drawframe = 12;
								if (entities[i].rule == 7) entities[i].drawframe += 2;
								//if (game.gravitycontrol == 1) entities[i].drawframe += 2;
							}
						break;
						case 100: //the teleporter!
						  if (entities[i].tile == 1) {
								//it's inactive
								entities[i].drawframe = entities[i].tile;
							}else if (entities[i].tile == 2){
								entities[i].drawframe = entities[i].tile;
								
								entities[i].framedelay--;
								if(entities[i].framedelay<=0){
									entities[i].framedelay = 1;
									entities[i].walkingframe = int(Math.random() * 6);
									if (entities[i].walkingframe >= 4) {
										entities[i].walkingframe = -1;
									  entities[i].framedelay = 4;
									}										
								}
								
								entities[i].drawframe = entities[i].tile;
								entities[i].drawframe += entities[i].walkingframe;
							}else if (entities[i].tile == 6) {
								//faster!
								entities[i].drawframe = entities[i].tile;
								
								entities[i].framedelay--;
								if(entities[i].framedelay<=0){
									entities[i].framedelay = 2;
									entities[i].walkingframe = int(Math.random() * 6);
									if (entities[i].walkingframe >= 4) {
										entities[i].walkingframe = -5;
									  entities[i].framedelay = 4;
									}										
								}
								
								entities[i].drawframe = entities[i].tile;
								entities[i].drawframe += entities[i].walkingframe;
							}
						break;
						default:
							entities[i].drawframe = entities[i].tile;
						break;
					}
				}else {
					//entities[i].statedelay--;
					if (entities[i].statedelay < 0) entities[i].statedelay = 0;
				}
			}
		}
		
		public function gettype(t:int):Boolean {
		  //Returns true is there is an entity of type t onscreen
			for (var i:int = 0; i < nentity; i++) {
				if(entities[i].type==t){
			    return true;
				}
			}
			
			return false;
		}		
		
		public function getcompanion(t:int):int {
		  //Returns the index of the companion with rule t
			for (var i:int = 0; i < nentity; i++) {
				if(entities[i].rule==6 || entities[i].rule==7){
			    return i;
				}
			}
			
			return -1;
		}
		
		public function getplayer():int {
		  //Returns the index of the first player entity
			for (var i:int = 0; i < nentity; i++) {
				if (entities[i].type == 0) {
			    return i;
				}
			}
			
			return -1;
		}
		
		public function getscm():int {
		  //Returns the supercrewmate
			for (var i:int = 0; i < nentity; i++) {
				if(entities[i].type==14){
			    return i;
				}
			}
			
			return 0;
		}
		
		public function getlineat(t:int):int {
			//Get the entity which is a horizontal line at height t (for SWN game)
			for (var i:int = 0; i < nentity; i++) {
				if (entities[i].size == 5) {
					if (entities[i].yp == t) {
					  return i;
					}
				}
			}
			
			return 0;
		}
		
		public function getcrewman(t:int):int {
		  //Returns the index of the crewman with colour index given by t
			if (t == 0) t = 0;
			if (t == 1) t = 20;
			if (t == 2) t = 14;
			if (t == 3) t = 15;
			if (t == 4) t = 13;
			if (t == 5) t = 16;
			
			for (var i:int = 0; i < nentity; i++) {
				if (entities[i].rule == 6 || entities[i].rule == 7) {
					if(entities[i].colour==t){ 
			      return i;
					}
				}
			}
			
			return 0;
		}
		
		public function getcustomcrewman(t:int):int {
			//Returns the index of the crewman with colour index given by t
			if (t == 0) t = 0;
			if (t == 1) t = 20;
			if (t == 2) t = 14;
			if (t == 3) t = 15;
			if (t == 4) t = 13;
			if (t == 5) t = 16;
			
			for (var i:int = 0; i < nentity; i++){
				if (entities[i].type == 55){
					if(entities[i].colour==t){
						return i;
					}
				}
			}
			
			return 0;
		}
		
		public function getteleporter():int {
			for (var i:int = 0; i < nentity; i++) {
				if(entities[i].type==100 && entities[i].active){
			    return i;
				}
			}
			
			return -1;
		}
		
		public function rectset(xi:int, yi:int, wi:int, hi:int):void {
			temprect.x = xi; temprect.y = yi; temprect.width = wi; temprect.height = hi;
		}
		
		public function rect2set(xi:int, yi:int, wi:int, hi:int):void {
			temprect2.x = xi; temprect2.y = yi; temprect2.width = wi; temprect2.height = hi;
		}
		
		public function entitycollide(a:int, b:int):Boolean {
			//Do entities a and b collide?
			tempx = entities[a].xp + entities[a].cx; tempy = entities[a].yp + entities[a].cy;
			tempw = entities[a].w; temph = entities[a].h;
			rectset(tempx, tempy, tempw, temph);
			
			tempx = entities[b].xp + entities[b].cx; tempy = entities[b].yp + entities[b].cy;
			tempw = entities[b].w; temph = entities[b].h;
			rect2set(tempx, tempy, tempw, temph);
			
			if (temprect.intersects(temprect2)) return true;
			return false;
		}
		
		public function checkdirectional(t:int):Boolean{
			//Returns true if player entity (rule 0) moving in dir t through directional block
			if(opt_usedirectional){
				i = getplayer();
				if (i > -1) {
					if(entities[i].rule==0){
						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
						tempw = entities[i].w; temph = entities[i].h;
						rectset(tempx, tempy, tempw, temph);
						
						for (j = 0; j < nblocks; j++) {
							if (blocks[j].type == DIRECTIONAL && blocks[j].active){
								if(blocks[j].rect.intersects(temprect)) {
									return true;
								}
							}
						}
					}
				}
			}
			return false;
		}
		
		public function checkdamage():Boolean{
			//Returns true if player entity (rule 0) collides with a damagepoint
			if(opt_usedamage){
				i = getplayer();
				if (i > -1) {
					if(entities[i].rule==0){
						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
						tempw = entities[i].w; temph = entities[i].h;
						rectset(tempx, tempy, tempw, temph);
						
						for (j=0; j<nblocks; j++){
							if (blocks[j].type == DAMAGE && blocks[j].active){
								if(blocks[j].rect.intersects(temprect)) {
									return true;
								}
							}
						}
					}
				}
			}
			return false;
		}
		
		public function scmcheckdamage():Boolean{
			//Returns true if supercrewmate collides with a damagepoint
			for(i = 0; i < nentity; i++) {
				if(entities[i].type==14){
					tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
					tempw = entities[i].w; temph = entities[i].h;
					rectset(tempx, tempy, tempw, temph);
					
					for (j=0; j<nblocks; j++){
						if (blocks[j].type == DAMAGE && blocks[j].active){
							if(blocks[j].rect.intersects(temprect)) {
								return true;
							}
						}
					}
				}
			}
			return false;
		}
		
		public function settemprect(t:int):void {
			//setup entity t in temprect
			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
		}
		
		public function checktrigger():int{
			//Returns an int player entity (rule 0) collides with a trigger
			if (opt_usetrigger) {
				i = getplayer();
				if (i > -1) {
					if(entities[i].rule==0){
						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
						tempw = entities[i].w; temph = entities[i].h;
						rectset(tempx, tempy, tempw, temph);

						for (j=0; j<nblocks; j++){
							if (blocks[j].type == TRIGGER && blocks[j].active){
								if (blocks[j].rect.intersects(temprect)) {
									activetrigger = blocks[j].trigger;
									return blocks[j].trigger;
								}
							}
						}
					}
				}
			}
			return -1;
		}
		
		public function checkactivity():int{
			//Returns an int player entity (rule 0) collides with an activity
		  if(opt_useactivity){
				i = getplayer();
				if(i>-1){
					if(entities[i].rule==0){
						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
						tempw = entities[i].w; temph = entities[i].h;
						rectset(tempx, tempy, tempw, temph);

						for (j=0; j<nblocks; j++){
							if (blocks[j].type == ACTIVITY && blocks[j].active){
								if (blocks[j].rect.intersects(temprect)) {
									return j;
								}
							}
						}
					}
				}
			}
			return -1;
		}
		
		public function getgridpoint(t:int):int {
			t = (t - (t % 8)) / 8;
			return t;
		}
		
		public function cblocks(t:int):Boolean {
			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
			return checkblocks();
		}
		
		public function checkplatform():Boolean {
			//Return true if rectset intersects a moving platform, setups px & py to the platform x & y
			for (i = 0; i < nblocks; i++) {
				if (blocks[i].active) {
					if (blocks[i].type == BLOCK){
						if (blocks[i].rect.intersects(temprect)) {
							px = blocks[i].xp; py = blocks[i].yp;
							return true;
						}
					}
				}
			}
			return false;
		}
		
		public function checkblocks():Boolean {
			for (i = 0; i < nblocks; i++) {
				if (blocks[i].active) {
					if (!skipdirblocks) {
						if (blocks[i].type == DIRECTIONAL) {
							if (dy > 0 && blocks[i].trigger == 0) if (blocks[i].rect.intersects(temprect)) return true;
							if (dy <= 0 && blocks[i].trigger == 1) if (blocks[i].rect.intersects(temprect)) return true;
							if (dx > 0 && blocks[i].trigger == 2) if (blocks[i].rect.intersects(temprect)) return true;
							if (dx <= 0 && blocks[i].trigger == 3) if (blocks[i].rect.intersects(temprect)) return true;						
						}
					}
					if (blocks[i].type == BLOCK){
						if (blocks[i].rect.intersects(temprect)) {
							return true;
						}
					}
					if (blocks[i].type == SAFE) {
						if(dr==1){
							if (blocks[i].rect.intersects(temprect)) {
								return true;
							}
						}
					}
				}
			}
			return false;
		}
		
		public function checktowerspikes(t:int, map:mapclass):Boolean {
			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
      tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y);
			tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1);
			if (map.spikecollide(tempx, tempy)) return true;
			if (map.spikecollide(tempw, tempy)) return true;
			if (map.spikecollide(tempx, temph)) return true;
			if (map.spikecollide(tempw, temph)) return true;
			if (temprect.height >= 12) {
				tpy1 = getgridpoint(temprect.y + 6);
				if (map.spikecollide(tempx, tpy1)) return true;
			  if (map.spikecollide(tempw, tpy1)) return true;
				if (temprect.height >= 18) {
					tpy1 = getgridpoint(temprect.y + 12);
					if (map.spikecollide(tempx, tpy1)) return true;
					if (map.spikecollide(tempw, tpy1)) return true;
					if (temprect.height >= 24) {
						tpy1 = getgridpoint(temprect.y + 18);
						if (map.spikecollide(tempx, tpy1)) return true;
						if (map.spikecollide(tempw, tpy1)) return true;
					}
				}
			}
			if (temprect.width >= 12) {
				tpx1 = getgridpoint(temprect.x + 6);
			if (map.collide(tpx1, tempy)) return true;
			if (map.collide(tpx1, temph)) return true;
			}
			return false;
		}
		
		public function checkwall(map:mapclass):Boolean{
			//Returns true if entity setup in temprect collides with a wall
			//used for proper collision functions; you can't just, like, call it
			//whenever you feel like it and expect a response
			//
			//that won't work at all
			if(skipblocks){
				if (checkblocks()) return true;
			}
			
			tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y);
			tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1);
			if (map.collide(tempx, tempy)) return true;
			if (map.collide(tempw, tempy)) return true;
			if (map.collide(tempx, temph)) return true;
			if (map.collide(tempw, temph)) return true;
			if (temprect.height >= 12) {
				tpy1 = getgridpoint(temprect.y + 6);
				if (map.collide(tempx, tpy1)) return true;
			  if (map.collide(tempw, tpy1)) return true;
				if (temprect.height >= 18) {
					tpy1 = getgridpoint(temprect.y + 12);
					if (map.collide(tempx, tpy1)) return true;
					if (map.collide(tempw, tpy1)) return true;
					if (temprect.height >= 24) {
						tpy1 = getgridpoint(temprect.y + 18);
						if (map.collide(tempx, tpy1)) return true;
						if (map.collide(tempw, tpy1)) return true;
					}
				}
			}
			if (temprect.width >= 12) {
				tpx1 = getgridpoint(temprect.x + 6);
			if (map.collide(tpx1, tempy)) return true;
			if (map.collide(tpx1, temph)) return true;
			}
			return false;
		}
		
		public function hplatformat():Number {
			//Returns first entity of horizontal platform at (px, py), -1000 otherwise.
			for (i = 0; i < nentity; i++) {
				if (entities[i].active) {
					if (entities[i].rule == 2) {
						if (entities[i].behave >= 2) {
							if (entities[i].xp == px && entities[i].yp == py) {
							  if (entities[i].behave == 8) { //threadmill!
									return entities[i].para;
								}else if(entities[i].behave == 9) { //threadmill!
									return -entities[i].para;
								}else{
								  return entities[i].vx;
								}
							}
						}
					}
				}
			}
			return -1000;
		}
		
		public function yline(a:int, b:int):int {
			if (a < b) return -1;
			return 1;
		}
		
		public function entityhlinecollide(t:int, l:int):Boolean {
			//Returns true is entity t collided with the horizontal line l.
			if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){
			  if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){
					linetemp = 0;
					
					linetemp += yline(entities[t].yp, entities[l].yp);
					linetemp += yline(entities[t].yp + entities[t].h, entities[l].yp);
					linetemp += yline(entities[t].oldyp, entities[l].yp);
					linetemp += yline(entities[t].oldyp + entities[t].h, entities[l].yp);
					
					if (linetemp > -4 && linetemp < 4) return true;
					return false;
				}
			}
			return false;
		}
				
		public function entityvlinecollide(t:int, l:int):Boolean {
			//Returns true is entity t collided with the vertical line l.
			if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){
			  if(entities[t].yp + entities[t].cy<=entities[l].yp+entities[l].h){
					linetemp = 0;
					
					linetemp += yline(entities[t].xp + entities[t].cx+1, entities[l].xp);
					linetemp += yline(entities[t].xp + entities[t].cx+1 + entities[t].w, entities[l].xp);
					linetemp += yline(entities[t].oldxp + entities[t].cx+1, entities[l].xp);
					linetemp += yline(entities[t].oldxp + entities[t].cx+1 + entities[t].w, entities[l].xp);
					
					if (linetemp > -4 && linetemp < 4) return true;
					return false;
				}
			}
			return false;
		}
		
		public function entitywarphlinecollide(t:int, l:int):Boolean {
			//Returns true is entity t collided with the horizontal line l.
			if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){
			  if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){
					linetemp = 0;
					if (entities[l].yp < 120) {
						//Top line
						if (entities[t].vy < 0) {
							if (entities[t].yp < entities[l].yp + 10) linetemp++;
							if (entities[t].yp + entities[t].h < entities[l].yp + 10) linetemp++;
							if (entities[t].oldyp < entities[l].yp + 10) linetemp++;
							if (entities[t].oldyp + entities[t].h < entities[l].yp + 10) linetemp++;
						}
							
						if (linetemp > 0) return true;
						return false;
					}else {
						//Bottom line
						if (entities[t].vy > 0) {
							if (entities[t].yp > entities[l].yp - 10) linetemp++;
							if (entities[t].yp + entities[t].h > entities[l].yp - 10) linetemp++;
							if (entities[t].oldyp > entities[l].yp - 10) linetemp++;
							if (entities[t].oldyp + entities[t].h > entities[l].yp - 10) linetemp++;
						}
						
						if (linetemp > 0) return true;
						return false;
					}
				}
			}
			return false;
		}
		
		public function entitywarpvlinecollide(t:int, l:int):Boolean {
			//Returns true is entity t collided with the vertical warp line l.
			if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){
			  if (entities[t].yp + entities[t].cy <= entities[l].yp + entities[l].h) {
					linetemp = 0;
					if (entities[l].xp < 160) {
						//Left hand line
						if (entities[t].xp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++;
						if (entities[t].xp + entities[t].cx+1 + entities[t].w < entities[l].xp + 10) linetemp++;
						if (entities[t].oldxp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++;
						if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w < entities[l].xp + 10) linetemp++;
						
						if (linetemp > 0) return true;
						return false;
					}else {
						//Right hand line
						if (entities[t].xp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++;
						if (entities[t].xp + entities[t].cx+1 + entities[t].w > entities[l].xp - 10) linetemp++;
						if (entities[t].oldxp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++;
						if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w > entities[l].xp - 10) linetemp++;
						
						if (linetemp > 0) return true;
						return false;
					}
				}
			}
			return false;
		}
		
		public function entitycollideplatformroof(map:mapclass, t:int):Number{
			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy -1;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
			if (checkplatform()) {
				//px and py now contain an x y coordinate for a platform, find it 
				return hplatformat();
			}
			return -1000;
		}
		
		public function entitycollideplatformfloor(map:mapclass, t:int):Number{
			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
			if (checkplatform()) {
				//px and py now contain an x y coordinate for a platform, find it 
				return hplatformat();
			}
			return -1000;
		}
		
		public function entitycollidefloor(map:mapclass, t:int):Boolean{
			//see? like here, for example!
			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
			if (checkwall(map)) return true;
			return false;
		}
		
		public function entitycollideroof(map:mapclass, t:int):Boolean{
			//and here!
			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy - 1;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
			if (checkwall(map)) return true;
			return false;
		}
		
		public function testwallsx(t:int, map:mapclass, tx:int, ty:int):Boolean{
			tempx = tx + entities[t].cx; tempy = ty + entities[t].cy;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
			if (entities[t].rule < 2) {	skipblocks = true; } else { skipblocks = false; }
			if (entities[t].type == 14) skipblocks = true;
			dx = 0; dy = 0; if (entities[t].rule == 0) dx = entities[t].vx;
			dr = entities[t].rule;
			
			//Ok, now we check walls
			if (checkwall(map)) {
				if (entities[t].vx > 1) {
					entities[t].vx--;
					entities[t].newxp = int(entities[t].xp + entities[t].vx);
					return testwallsx(t, map, entities[t].newxp, entities[t].yp);
				}else if (entities[t].vx < -1) {
					entities[t].vx++;
					entities[t].newxp = int(entities[t].xp + entities[t].vx);
					return testwallsx(t, map, entities[t].newxp, entities[t].yp);
				}else {
					entities[t].vx=0;
					return false;
				}
			}
			return true;
		}
		
		public function testwallsy(t:int, map:mapclass, tx:int, ty:int):Boolean {
			tempx = tx + entities[t].cx; tempy = ty + entities[t].cy;
			tempw = entities[t].w; temph = entities[t].h;
			rectset(tempx, tempy, tempw, temph);
			
			if (entities[t].rule < 2) {	skipblocks = true; } else { skipblocks = false; }
			if (entities[t].type == 14) skipblocks = true;
			
			dx = 0; dy = 0;  if (entities[t].rule == 0) dy = entities[t].vy;
			dr = entities[t].rule;

			//Ok, now we check walls
			if (checkwall(map)) {
				if (entities[t].vy > 1) {
					entities[t].vy--;
					entities[t].newyp = int(entities[t].yp + entities[t].vy);
					return testwallsy(t, map, entities[t].xp, entities[t].newyp);
				}else if (entities[t].vy < -1) {
					entities[t].vy++;
					entities[t].newyp = int(entities[t].yp + entities[t].vy);
					return testwallsy(t, map, entities[t].xp, entities[t].newyp);
				}else {
					entities[t].vy=0;
					return false;
				}
			}
			return true;
		}
		
		public function fixfriction(t:int, xfix:Number, xrate:Number, yrate:Number):void{
			if (entities[t].vx > xfix) entities[t].vx -= xrate;
			if (entities[t].vx < xfix) entities[t].vx += xrate;
			if (entities[t].vy > 0) entities[t].vy -= yrate;
			if (entities[t].vy < 0) entities[t].vy += yrate;
			if (entities[t].vy > 10) entities[t].vy = 10;
			if (entities[t].vy < -10) entities[t].vy = -10;
			if (entities[t].vx > 6) entities[t].vx = 6;
			if (entities[t].vx < -6) entities[t].vx = -6;
			
			if (Math.abs(entities[t].vx-xfix) <= xrate) entities[t].vx = xfix;
			if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0;
		}
		
		public function applyfriction(t:int, xrate:Number, yrate:Number):void{
			if (entities[t].vx > 0) entities[t].vx -= xrate;
			if (entities[t].vx < 0) entities[t].vx += xrate;
			if (entities[t].vy > 0) entities[t].vy -= yrate;
			if (entities[t].vy < 0) entities[t].vy += yrate;
			if (entities[t].vy > 10) entities[t].vy = 10;
			if (entities[t].vy < -10) entities[t].vy = -10;
			if (entities[t].vx > 6) entities[t].vx = 6;
			if (entities[t].vx < -6) entities[t].vx = -6;
			
			if (Math.abs(entities[t].vx) <= xrate) entities[t].vx = 0;
			if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0;
		}
		
		public function cleanup():void {
			i = nentity - 1; while (i >= 0 && !entities[i].active) { nentity--; i--; }
			i = nblocks - 1; while (i >= 0 && !blocks[i].active) { nblocks--; i--; }
		}
		
		public function updateentitylogic(t:int, game:gameclass):void {
			entities[t].oldxp = entities[t].xp; entities[t].oldyp = entities[t].yp;
			
			entities[t].vx = entities[t].vx + entities[t].ax;
			entities[t].vy = entities[t].vy + entities[t].ay;
			entities[t].ax = 0;
			
			if (entities[t].gravity) {
				if (entities[t].rule == 0) {
					if(game.gravitycontrol==0){
						entities[t].ay = 3;
					}else {
						entities[t].ay = -3;
					}	
				}else if (entities[t].rule == 7) {
					entities[t].ay = -3;
				}else {
					entities[t].ay = 3;
				}			
				applyfriction(t, game.inertia, 0.25);
			}
			
			entities[t].newxp = entities[t].xp + entities[t].vx;
			entities[t].newyp = entities[t].yp + entities[t].vy;
		}
		
		
		public function entitymapcollision(t:int, map:mapclass):void {
			if (testwallsx(t, map, entities[t].newxp, entities[t].yp)) {
				entities[t].xp = entities[t].newxp;
			}else {
				if (entities[t].onwall > 0) entities[t].state = entities[t].onwall;
				if (entities[t].onxwall > 0) entities[t].state = entities[t].onxwall;
			}
			if (testwallsy(t, map, entities[t].xp, entities[t].newyp)) {
				entities[t].yp = entities[t].newyp;
			}else {
				if (entities[t].onwall > 0) entities[t].state = entities[t].onwall;
				if (entities[t].onywall > 0) entities[t].state = entities[t].onywall;
				entities[t].jumpframe = 0;
			}
		}
		
		public function movingplatformfix(t:int, map:mapclass):void{
			//If this intersects the player, then we move the player along it
			j = getplayer();
			if (entitycollide(t, j)) {
				//ok, bollox, let's make sure
				entities[j].yp = entities[j].yp + entities[j].vy;
				if (entitycollide(t, j)) {
					entities[j].yp = entities[j].yp - entities[j].vy;
					entities[j].vy = entities[t].vy;
					entities[j].newyp = entities[j].yp + entities[j].vy;
					if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) {
						if (entities[t].vy > 0) {
							entities[j].yp = entities[t].yp + entities[t].h;
							entities[j].vy = 0;
							entities[j].onroof = 1;
						}else {
							entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy;
							entities[j].vy = 0;
							entities[j].onground = 1; 
						}
					}else {
						entities[t].state = entities[t].onwall;
					}
				}
			}
		}
		
		public function scmmovingplatformfix(t:int, map:mapclass):void{
			//If this intersects the SuperCrewMate, then we move them along it
			j = getscm();
			if (entitycollide(t, j)) {
				//ok, bollox, let's make sure
				entities[j].yp = entities[j].yp + entities[j].vy;
				if (entitycollide(t, j)) {
					entities[j].yp = entities[j].yp - entities[j].vy;
					entities[j].vy = entities[t].vy;
					entities[j].newyp = entities[j].yp + entities[j].vy;
					if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) {
						if (entities[t].vy > 0) {
							entities[j].yp = entities[t].yp + entities[t].h;
							entities[j].vy = 0;
							//entities[j].onroof = true;
						}else {
							entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy;
							entities[j].vy = 0;
							//entities[j].onground = true; 
						}
					}else {
						entities[t].state = entities[t].onwall;
					}
				}
			}
		}
		
		public function hormovingplatformfix(t:int, map:mapclass):void{
			//If this intersects the player, then we move the player along it
			//for horizontal platforms, this is simplier
		  createblock(0, entities[t].xp, entities[t].yp, entities[t].w, entities[t].h);
			/*j = getplayer();
			if (entitycollide(t, j)) {				
				//ok, bollox, let's make sure
				entities[j].yp = entities[j].yp + entities[j].vy;
				if (entitycollide(t, j)) {
					//entities[t].state = entities[t].onwall;
				}
			}*/
		}
		
		public function customwarplinecheck(i:int):void {
			//Turns on obj.customwarpmodevon and obj.customwarpmodehon if player collides
			//with warp lines
			
			if (entities[i].active) {
				//We test entity to entity
				for (j = 0; j < nentity; j++) {
					if (entities[j].active && i != j) {//Active
						if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line!
							if (entities[j].type == 51 || entities[j].type == 52) {								
								if (entitywarpvlinecollide(i, j)) {	
									customwarpmodevon = true;
								}
							}
						}
						
						if (entities[i].rule == 0 && entities[j].rule == 7){   //Player vs horizontal WARP line
							if (entities[j].type == 53 || entities[j].type == 54) {								
								if (entitywarphlinecollide(i, j)) {
									customwarpmodehon = true;
								}
							}
						}
					}
				}
			}
		}
		
		public function entitycollisioncheck(dwgfx:dwgraphicsclass, game:gameclass, map:mapclass, music:musicclass):void {
			i = getplayer();
			if (entities[i].active) {
				//We test entity to entity
				for (j = 0; j < nentity; j++) {
					if (entities[j].active && i != j) {//Active
						if (entities[i].rule == 0 && entities[j].rule == 1 && entities[j].harmful) { 
							//player i hits enemy or enemy bullet j
							if (entitycollide(i, j) && !map.invincibility) {
								if (entities[i].size == 0 && (entities[j].size == 0 || entities[j].size == 12)) {
									//They're both sprites, so do a per pixel collision
									colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp;
									colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp;
									if (dwgfx.flipmode) {
										if (dwgfx.flipsprites[entities[i].drawframe].hitTest(
												colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) {
											//Do the collision stuff		
											game.deathseq = 30;
										}
									}else{
										if (dwgfx.sprites[entities[i].drawframe].hitTest(
												colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) {
											//Do the collision stuff		
											game.deathseq = 30;
										}
									}
								}else {
									//Ok, then we just assume a normal bounding box collision
									game.deathseq = 30;
								}
							}
						}
						if (entities[i].rule == 0 && entities[j].rule == 2) { //Moving platforms
							if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp);
						}
						if (entities[i].rule == 0 && entities[j].rule == 3) { //Entity to entity
							if(entities[j].onentity>0){
								if (entitycollide(i, j)) entities[j].state = entities[j].onentity;
							}
						}
						if (entities[i].rule == 0 && entities[j].rule == 4) { //Player vs horizontal line!
							if(game.deathseq==-1){
								//Here we compare the player's old position versus his new one versus the line.
								//All points either be above or below it. Otherwise, there was a collision this frame.
								if (entities[j].onentity > 0) {
									if (entityhlinecollide(i, j)) {
										music.playef(8,10);
										game.gravitycontrol = (game.gravitycontrol + 1) % 2;
										game.totalflips++;
										if (game.gravitycontrol == 0) {
											if (entities[i].vy < 1) entities[i].vy = 1;
										}else {
											if (entities[i].vy > -1) entities[i].vy = -1;
										}
										
										entities[j].state = entities[j].onentity;
										entities[j].life = 6;
									}
								}
							}
						}
						if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line!
							if(game.deathseq==-1){
								if(entities[j].onentity>0){
									if (entityvlinecollide(i, j)) {		
										entities[j].state = entities[j].onentity;
										entities[j].life = 4;
									}
								}
							}
						}
						if (entities[i].rule == 0 && entities[j].rule == 6) { //Player versus crumbly blocks! Special case
							if (entities[j].onentity > 0) {
								//ok; only check the actual collision if they're in a close proximity
								temp = entities[i].yp - entities[j].yp;
								if (temp < 30 || temp > -30) {
									temp = entities[i].xp - entities[j].xp;
									if (temp < 30 || temp > -30) {
										if (entitycollide(i, j)) entities[j].state = entities[j].onentity;
									}
								}
							}
						}
						/*
						if (entities[i].rule == 0 && entities[j].rule == 7){   //Player vs horizontal WARP line
							if (game.deathseq == -1) {
								if (entities[j].onentity > 0) {
									if (entityhlinecollide(i, j)) {
										entities[j].state = entities[j].onentity;
										entities[j].life = 4;
									}
								}
							}
						}
						*/
					}
				}
			}
			
			if (game.supercrewmate) {
				//some extra collisions
				for (i = 0; i < nentity; i++) {
					if (entities[i].active) {
						for (j = 0; j < nentity; j++) {
							if (entities[j].active && i != j) {//Active
								if (entities[i].type == 14) { //i is the supercrewmate
									if (entities[j].rule == 1 && entities[j].harmful) {//j is a harmful enemy
										//player i hits enemy or enemy bullet j
										if (entitycollide(i, j) && !map.invincibility) {
											if (entities[i].size == 0 && entities[j].size == 0) {
											//They're both sprites, so do a per pixel collision
												colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp;
												colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp;
												if (dwgfx.flipmode) {
													if (dwgfx.flipsprites[entities[i].drawframe].hitTest(
															colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) {
														//Do the collision stuff		
														game.deathseq = 30; game.scmhurt = true;
													}
												}else{
													if (dwgfx.sprites[entities[i].drawframe].hitTest(
															colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) {
														//Do the collision stuff	
														game.deathseq = 30; game.scmhurt = true;
													}
												}
											}else {
												//Ok, then we just assume a normal bounding box collision
												game.deathseq = 30; game.scmhurt = true;
											}
										}
									}
									if (entities[j].rule == 2) { //Moving platforms
										if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp);
									}
									if (entities[j].type == 8 && entities[j].rule == 3) { //Entity to entity (well, checkpoints anyway!)
										if(entities[j].onentity>0){
											if (entitycollide(i, j)) entities[j].state = entities[j].onentity;
										}
									}
								}
							}
						}
					}
				}
			}
			
			//can't have the player being stuck...
			j = getplayer();
			skipdirblocks = true;
			if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) {
				//Let's try to get out...
				if (entities[j].rule == 0) {
					if(game.gravitycontrol==0){
						entities[j].yp -= 3;
					}else {
						entities[j].yp += 3;
					}
				}
			}
			skipdirblocks = false;
			
			//Can't have the supercrewmate getting stuck either!
			if (game.supercrewmate) {
				j = getscm();
				skipdirblocks = true;
				if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) {
					//Let's try to get out...
						if(game.gravitycontrol==0){
							entities[j].yp -= 3;
						}else {
							entities[j].yp += 3;
						}
				}
				skipdirblocks = false;
			}
			
			//Is the player colliding with any damageblocks?
			if (checkdamage() && !map.invincibility) {
				//usual player dead stuff
				game.deathseq = 30;
			}
			
			//how about the supercrewmate?
			if (game.supercrewmate) {
				if (scmcheckdamage() && !map.invincibility) {
					//usual player dead stuff
					game.scmhurt = true;
					game.deathseq = 30;
				}
			}

			activetrigger = -1;
			if (checktrigger() > -1) {
				game.state = activetrigger;
				game.statedelay = 0;
			}
		}
			
		public var nentity:int;
		public var entities:Vector.<entclass> = new Vector.<entclass>;
		
		public var linecrosskludge:Vector.<entclass> = new Vector.<entclass>;
		public var nlinecrosskludge:int;
		public var colpoint1:Point, colpoint2:Point;
		
		public var tempx:int, tempy:int, tempw:int, temph:int, temp:int, temp2:int;
		public var tpx1:int, tpy1:int, tpx2:int, tpy2:int;
		public var temprect:Rectangle, temprect2:Rectangle;
		public var i:int, j:int, k:int;// z:int;
		public var dx:int, dy:int, dr:int;
		public var px:int, py:int, linetemp:int;
		public var activetrigger:int;
		
    public var blocks:Vector.<blockclass> = new Vector.<blockclass>;
		public var flags:Array = new Array;
		public var collect:Array = new Array;
		public var customcollect:Array = new Array;
    public var nblocks:int;
		public var skipblocks:Boolean, skipdirblocks:Boolean;
		
		public var platformtile:int;
		public var vertplatforms:Boolean, horplatforms:Boolean;
		
		// :(
		public var nearelephant:Boolean;
		public var upsetmode:Boolean, upset:int;
		
		//Trophy Text
		public var trophytext:int, trophytype:int;
		
		//Secret lab scripts
		public var altstates:int;
		
		//Custom stuff
    public var customenemy:int;
    public var customplatformtile:int;
    public var customwarpmode:Boolean, customwarpmodevon:Boolean, customwarpmodehon:Boolean;
		public var customscript:String;
    public var customcrewmoods:Array = new Array();
		
		public var mobilemenus:Boolean = true;
	}
}
