package {
	import flash.ui.Keyboard;
	import flash.display.*;
	import flash.geom.*;
  import flash.events.*;
  import flash.net.*;
	import bigroom.input.KeyPoll;
	import flash.system.fscommand;
	
	public class scriptclass extends Sprite {
		public var GAMEMODE:int = 0;
		public var TITLEMODE:int = 1;
		public var CLICKTOSTART:int = 2;
		public var FOCUSMODE:int = 3;
		public var MAPMODE:int = 4;
		public var TELEPORTERMODE:int = 5;
		public var GAMECOMPLETE:int = 6;
		public var GAMECOMPLETE2:int = 7;
		public var EDITORMODE:int = 8;
		
  	include "includes/scripts.as";
  	include "includes/terminalscripts.as";
		
		public function scriptclass():void {
		  //Init
			for (i = 0; i < 500; i++) {
				commands.push(new String);
			}
			for (i = 0; i < 40; i++) {
				words.push(new String);
				txt.push(new String);
			}
			position = 0; scriptlength = 0; scriptdelay = 0;
			running = false;
		}
		
		public function clearcustom():void{
			editor.customscript.length = 0;
		}
		
		public function add(t:String):void {
			commands[scriptlength] = t;
			scriptlength++;
		}
		
		public function tokenize(t:String):void {
			j = 0; tempword = "";
			
			for (i = 0; i < t.length; i++) {
				currentletter = t.substr(i, 1);
				if (currentletter == "(" || currentletter == ")" || currentletter == ",") {
					words[j] = tempword;
					words[j] = words[j].toLowerCase();
					j++; tempword = "";
				}else if (currentletter == " ") {
					//don't do anything - i.e. strip out spaces.
				}else {
					tempword += currentletter;
				}
			}
			
			if (tempword != "") {
				words[j] = tempword;
			}
		}
		
		public function run(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
		                    obj:entityclass, help:helpclass, music:musicclass):void {
			while(running && scriptdelay<=0 && !game.pausescript){
				if (position < scriptlength) {
					//Let's split or command in an array of words
					tokenize(commands[position]);
					
					//For script assisted input
	        game.press_left = false; game.press_right = false; game.press_action = false; game.press_map = false;
					
					//Ok, now we run a command based on that string
					if (words[0] == "moveplayer") {
						//USAGE: moveplayer(x offset, y offset)
						i = obj.getplayer();
						obj.entities[i].xp += int(words[1]);
						obj.entities[i].yp += int(words[2]);
						
						scriptdelay = 1;
					}else if (words[0] == "warpdir"){
						var temprx:int = int(words[1]) - 1;
						var tempry:int = int(words[2]) - 1;
						var curlevel:int = temprx + (editor.maxwidth * (tempry));
						editor.level[curlevel].warpdir = int(words[3]);
						//If screen warping, then override all that:
						dwgfx.backgrounddrawn = false;
						
						//Do we update our own room?
						if (game.roomx - 100 == temprx && game.roomy - 100 == tempry) {
							map.warpx = false; map.warpy = false;
							if (editor.level[curlevel].warpdir == 0) {
								map.background = 1;
							}else if(editor.level[curlevel].warpdir==1){
								map.warpx=true;
								map.background=3;
								dwgfx.rcol = editor.getwarpbackground(temprx, tempry);
							}else if(editor.level[curlevel].warpdir==2){
								map.warpy=true;
								map.background=4;
								dwgfx.rcol = editor.getwarpbackground(temprx,tempry);
							}else if(editor.level[curlevel].warpdir==3){
								map.warpx=true; map.warpy=true;
								map.background = 5;
								dwgfx.rcol = editor.getwarpbackground(temprx,tempry);
							}
						}
					}else if (words[0] == "ifwarp"){
						if (editor.level[int(words[1]) - 1 + (editor.maxwidth * (int(words[2]) - 1))].warpdir == int(words[3])) {
							load("custom_"+words[4]);
							position--;
						}
					}else if (words[0] == "destroy"){
						if(words[1]=="gravitylines"){
							for (var edi:int = 0; edi < obj.nentity; edi++) {
								if(obj.entities[edi].type==9) obj.entities[edi].active=false;
								if(obj.entities[edi].type==10) obj.entities[edi].active=false;
							}
						}else if(words[1]=="warptokens"){
							for (edi = 0; edi < obj.nentity; edi++) {
								if(obj.entities[edi].type==11) obj.entities[edi].active=false;
							}
						}else if(words[1]=="platforms"){
							for (edi = 0; edi < obj.nentity; edi++) {
								if(obj.entities[edi].rule==2 && obj.entities[edi].animate==100) obj.entities[edi].active=false;
							}
						}
					}else if (words[0] == "customiftrinkets"){
						if (game.trinkets >= int(words[1])) {
							load("custom_" + words[2]);
							position--;
						}
					}else if (words[0] == "customiftrinketsless"){
						if (game.stat_trinkets < int(words[1])) {
							load("custom_" + words[2]);
							position--;
						}
					}else if (words[0] == "customifflag"){
						if (obj.flags[int(words[1])] == 1) {
							load("custom_" + words[2]);
							position--;
						}
					}else	if (words[0] == "custommap"){
						if (words[1] == "on") {
							map.customshowmm = true;
						}else if (words[1] == "off") {
							map.customshowmm = false;
						}
					}else if (words[0] == "delay") {
						//USAGE: delay(frames)
						scriptdelay = int(words[1]);
					}else if (words[0] == "flag") {						
						if(words[2]=="on"){
							obj.changeflag(int(words[1]), 1);
						}else if(words[2]=="off"){
							obj.changeflag(int(words[1]), 0);
						}
					}else if (words[0] == "flash") {
						//USAGE: flash(frames)
						game.flashlight = int(words[1]);
					}else if (words[0] == "shake") {
						//USAGE: shake(frames)
						game.screenshake = int(words[1]);
					}else if (words[0] == "walk") {
						//USAGE: walk(dir,frames)
						if (words[1] == "left") {
							game.press_left = true;
						}else if (words[1] == "right") {
							game.press_right = true;
						}
						scriptdelay = int(words[2]);
					}else if (words[0] == "flip") {
						game.press_action = true;
						scriptdelay = 1;
					}else if (words[0] == "tofloor") {
						if(obj.entities[obj.getplayer()].onroof>0){
						  game.press_action = true;
						  scriptdelay = 1;
						}
					}else if (words[0] == "playef") {
						music.playef(int(words[1]), int(words[2]));
					}else if (words[0] == "play") {
						music.play(int(words[1]));
					}else if (words[0] == "stopmusic") {
						music.haltdasmusik();
					}else if (words[0] == "resumemusic") {
						music.play(music.resumesong);
					}else if (words[0] == "musicfadeout") {
						music.fadeout();
					}else if (words[0] == "musicfadein") {
						music.musicfadein = 90;
					}else if (words[0] == "trinketscriptmusic"){
						music.play(4);
					}else if (words[0] == "gotoposition") {
						//USAGE: gotoposition(x position, y position, gravity position)
						i = obj.getplayer();
						obj.entities[i].xp = int(words[1]);
						obj.entities[i].yp = int(words[2]);
						game.gravitycontrol = int(words[3]);
						
					}else if (words[0] == "gotoroom") {
						//USAGE: gotoroom(x,y) (manually add 100)
						map.gotoroom(int(words[1])+100, int(words[2])+100, dwgfx, game, obj, music); 
					}else if (words[0] == "cutscene") {
						dwgfx.showcutscenebars = true;
					}else if (words[0] == "endcutscene") {
						dwgfx.showcutscenebars = false;
					}else if (words[0] == "untilbars") {
						if (dwgfx.showcutscenebars) {
							if (dwgfx.cutscenebarspos < 360) { scriptdelay = 1; position--; }
						}else {
							if (dwgfx.cutscenebarspos > 0) { scriptdelay = 1; position--; }
						}
					}else if (words[0] == "text") {
						//oh boy
						//first word is the colour.
						if (words[1] == "cyan") {      	  r = 164; g = 164; b = 255;
						}else if (words[1] == "player") { r = 164; g = 164; b = 255;
						}else if (words[1] == "red") {	  r = 255; g = 60;  b = 60;
						}else if (words[1] == "green")  {	r = 144; g = 255; b = 144;
						}else if (words[1] == "yellow") {	r = 255; g = 255; b = 134;
						}else if (words[1] == "blue") {  	r = 95;  g = 95;  b = 255;
						}else if (words[1] == "purple") {	r = 255; g = 134; b = 255;
						}else if (words[1] == "gray") {	  r = 174; g = 174; b = 174;
						}else {
							//use a gray
							r = 174; g = 174; b = 174;
						}
						
						//next are the x,y coordinates
						textx = int(words[2]);
						texty = int(words[3]);
						
						//Number of lines for the textbox!
						txtnumlines = int(words[4]);
						for (i = 0; i < txtnumlines; i++) {
							position++;
							txt[i] = commands[position];
						}
					}else if (words[0] == "position") {
						//are we facing left or right? for some objects we don't care, default at 0.
						j = 0;
						
						//the first word is the object to position relative to
						if (words[1] == "player") {
							i = obj.getplayer();
							j = obj.entities[i].dir;
						}else if (words[1] == "cyan") {
							i = obj.getcrewman(0);
							j = obj.entities[i].dir;
						}else if (words[1] == "purple") {
							i = obj.getcrewman(1);
							j = obj.entities[i].dir;
						}else if (words[1] == "yellow") {
							i = obj.getcrewman(2);
							j = obj.entities[i].dir;
						}else if (words[1] == "red") {
							i = obj.getcrewman(3);
							j = obj.entities[i].dir;
						}else if (words[1] == "green") {
							i = obj.getcrewman(4);
							j = obj.entities[i].dir;
						}else if (words[1] == "blue") {
							i = obj.getcrewman(5);
							j = obj.entities[i].dir;
						}else if (words[1] == "centerx") {
							words[2] = "donothing"; j = -1;
							textx = -500;
						}else if (words[1] == "centery") {
							words[2] = "donothing"; j = -1;
							texty = -500;
						}else if (words[1] == "center") {
							words[2] = "donothing"; j = -1;
							textx = -500; texty = -500;
						}
						
						//next is whether to position above or below
						if (words[2] == "above") {
							if (j == 1) {  //left
								textx = obj.entities[i].xp -10000; //tells the box to be oriented correctly later
								texty = obj.entities[i].yp - 16 - (txtnumlines*8);
							}else if (j == 0) {  //Right
								textx = obj.entities[i].xp - 16;
								texty = obj.entities[i].yp - 18 - (txtnumlines * 8);
							}
						}else {
							if (j == 1) {  //left
								textx = obj.entities[i].xp -10000; //tells the box to be oriented correctly later
								texty = obj.entities[i].yp + 26;
							}else if (j == 0) {  //Right
								textx = obj.entities[i].xp - 16;
								texty = obj.entities[i].yp + 26;
							}
						}
				  }else if (words[0] == "customposition") {
						//are we facing left or right? for some objects we don't care, default at 0.
						j = 0;
						//the first word is the object to position relative to
						if (words[1] == "player"){
							i = obj.getcustomcrewman(0);
							j = obj.entities[i].dir;
						}else if (words[1] == "cyan"){
							i = obj.getcustomcrewman(0);
							j = obj.entities[i].dir;
						}else if (words[1] == "purple"){
							i = obj.getcustomcrewman(1);
							j = obj.entities[i].dir;
						}else if (words[1] == "yellow"){
							i = obj.getcustomcrewman(2);
							j = obj.entities[i].dir;
						}else if (words[1] == "red"){
							i = obj.getcustomcrewman(3);
							j = obj.entities[i].dir;
						}else if (words[1] == "green"){
							i = obj.getcustomcrewman(4);
							j = obj.entities[i].dir;
						}else if (words[1] == "blue"){
							i = obj.getcustomcrewman(5);
							j = obj.entities[i].dir;
						}else if (words[1] == "centerx"){
							words[2] = "donothing";
							j = -1;
							textx = -500;
						}else if (words[1] == "centery"){
							words[2] = "donothing";
							j = -1;
							texty = -500;
						}else if (words[1] == "center"){
							words[2] = "donothing";
							j = -1;
							textx = -500;
							texty = -500;
						}
						
						if (i == 0 && words[1] != "player" && words[1] != "cyan") {
							//Requested crewmate is not actually on screen
							words[2] = "donothing";
							j = -1;
							textx = -500;
							texty = -500;
						}
						
						//next is whether to position above or below
						if (words[2] == "above"){
							if (j == 1)    //left
							{
								textx = obj.entities[i].xp -10000; //tells the box to be oriented correctly later
								texty = obj.entities[i].yp - 16 - (txtnumlines*8);
							}
							else if (j == 0)     //Right
							{
								textx = obj.entities[i].xp - 16;
								texty = obj.entities[i].yp - 18 - (txtnumlines * 8);
							}
						}else{
							if (j == 1)    //left
							{
								textx = obj.entities[i].xp -10000; //tells the box to be oriented correctly later
								texty = obj.entities[i].yp + 26;
							}
							else if (j == 0)     //Right
							{
								textx = obj.entities[i].xp - 16;
								texty = obj.entities[i].yp + 26;
							}
						}
					}else if (words[0] == "backgroundtext") {
					  game.backgroundtext = true;
					}else if (words[0] == "flipme") {
						if(dwgfx.flipmode) texty += 2*(120 - texty);
				  }else if (words[0] == "speak_active") {
						//Ok, actually display the textbox we've initilised now!
						dwgfx.createtextbox(txt[0], textx, texty, r, g, b);
						if (txtnumlines > 1) {
						  for (i = 1; i < txtnumlines; i++) {
						     dwgfx.addline(txt[i]);
							}
						}
						
						//the textbox cannot be outside the screen. Fix if it is.
						if (textx <= -1000) {
							//position to the left of the player
							textx += 10000;
							textx -= dwgfx.textboxwidth();
							textx += 16;
							dwgfx.textboxmoveto(textx);
						}
						
						if (textx == -500) {
							dwgfx.textboxcenterx();
						}
						
						if (texty == -500) {
							dwgfx.textboxcentery();
						}
						
						dwgfx.textboxadjust();
						dwgfx.textboxactive();
						
						if (!game.backgroundtext) {
						  game.advancetext = true;	game.hascontrol = false; game.pausescript = true;
							if (key.isDown(90) || key.isDown(32) || key.isDown(86)
			          || key.isDown(Keyboard.UP) || key.isDown(Keyboard.DOWN)) {
								game.jumpheld = true;
							}
							if (game.mobilemenu) {
								if (game.controlstyle == 0) {
									/*
									for (var vti:int = 0; vti < key.touchPoints; vti++) {
										if (key.touchid[vti] != key.controlstick) {
											game.jumpheld = true;
										}
									}
									*/
									if (key.touchPoints > 0) {
										game.jumpheld = true;
									}
								}else {
									if (key.touchPoints > 0) {
										game.jumpheld = true;
									}
								}
							}
						}
					  game.backgroundtext = false;
					}else if (words[0] == "speak") {
						//Exactly as above, except don't make the textbox active (so we can use multiple textboxes)
						dwgfx.createtextbox(txt[0], textx, texty, r, g, b);
						if (txtnumlines > 1) {
						  for (i = 1; i < txtnumlines; i++) {
						     dwgfx.addline(txt[i]);
							}
						}
						
						//the textbox cannot be outside the screen. Fix if it is.
						if (textx <= -1000) {
							//position to the left of the player
							textx += 10000;
							textx -= dwgfx.textboxwidth();
							textx += 16;
							dwgfx.textboxmoveto(textx);
						}
						
						if (textx == -500) {
							dwgfx.textboxcenterx();
						}
						
						if (texty == -500) {
							dwgfx.textboxcentery();
						}
						
						dwgfx.textboxadjust();
						//dwgfx.textboxactive();
						
						if (!game.backgroundtext) {
						  game.advancetext = true;	game.hascontrol = false; game.pausescript = true;
							if (key.isDown(90) || key.isDown(32) || key.isDown(86)
			          || key.isDown(Keyboard.UP) || key.isDown(Keyboard.DOWN)) game.jumpheld = true;
						}
					  game.backgroundtext = false;
					}else if (words[0] == "endtext") {					
					  dwgfx.textboxremove();
					  game.hascontrol = true;
						game.advancetext = false;
					}else if (words[0] == "endtextfast") {					
					  dwgfx.textboxremovefast();
					  game.hascontrol = true;
						game.advancetext = false;
					}else if (words[0] == "do") {					
						//right, loop from this point
						looppoint = position;
						loopcount = int(words[1]);
					}else if (words[0] == "loop") {					
						//right, loop from this point
						loopcount--;
						if (loopcount > 0) {
						  position = looppoint;
						}
					}else if (words[0] == "vvvvvvman") {
						//Create the super VVVVVV combo!
						i = obj.getplayer();
						obj.entities[i].xp = 30;
						obj.entities[i].yp = 46;
						obj.entities[i].size = 13;
						obj.entities[i].colour = 23;
						obj.entities[i].cx = 36;// 6;
						obj.entities[i].cy = 12+80;// 2;
						obj.entities[i].h = 126-80;// 21;
					}else if (words[0] == "undovvvvvvman") {
						//Create the super VVVVVV combo!
						i = obj.getplayer();
						obj.entities[i].xp = 100;
						obj.entities[i].size = 0;
						obj.entities[i].colour = 0;
						obj.entities[i].cx = 6;
						obj.entities[i].cy = 2;
						obj.entities[i].h = 21;
					}else if (words[0] == "createentity") {
						obj.createentity(game, int(words[1]), int(words[2]), int(words[3]), int(words[4]), int(words[5]));
					}else if (words[0] == "createcrewman") {
						if (words[3] == "cyan") {         r=0;
						}else if (words[3] == "red") {	  r=15;
						}else if (words[3] == "green")  {	r=13;
						}else if (words[3] == "yellow") {	r=14;
						}else if (words[3] == "blue") {  	r=16;
						}else if (words[3] == "purple") {	r=20;
						}else if (words[3] == "gray") {	  r=19;
						}else {  r = 19; }
						
						//convert the command to the right index
						if (words[5] == "followplayer") words[5] = "10";
						if (words[5] == "followpurple") words[5] = "11";
						if (words[5] == "followyellow") words[5] = "12";
						if (words[5] == "followred") words[5] = "13";
						if (words[5] == "followgreen") words[5] = "14";
						if (words[5] == "followblue") words[5] = "15";
						
						if (words[5] == "followposition") words[5] = "16";
						if (words[5] == "faceleft") { words[5] = "17"; words[6] = "0"; }
					  if (words[5] == "faceright") {words[5] = "17"; words[6] = "1"; }
						if (words[5] == "faceplayer") { words[5] = "18"; words[6] = "0"; }
						if (words[5] == "panic") { words[5] = "20"; words[6] = "0"; }
						
						if (int(words[5]) >= 16) {
							obj.createentity(game, int(words[1]), int(words[2]), 18, r, int(words[4]), int(words[5]), int(words[6]));
						}else{
					    obj.createentity(game, int(words[1]), int(words[2]), 18, r, int(words[4]), int(words[5]));
						}
					}else if (words[0] == "changemood") {
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						if (int(words[2]) == 0) {
						  obj.entities[i].tile = 0;	
						}else {
							obj.entities[i].tile = 144;
						}
					}else if (words[0] == "changecustommood"){
						if (words[1] == "player"){
							i=obj.getcustomcrewman(0);
							obj.customcrewmoods[0] = int(words[2]);
						}else if (words[1] == "cyan"){
							i=obj.getcustomcrewman(0);
							obj.customcrewmoods[0]=int(words[2]);
						}else if (words[1] == "customcyan"){
							i=obj.getcustomcrewman(0);
							obj.customcrewmoods[0]=int(words[2]);
						}else if (words[1] == "red"){
							i=obj.getcustomcrewman(3);
							obj.customcrewmoods[3]=int(words[2]);
						}else if (words[1] == "green"){
							i=obj.getcustomcrewman(4);
							obj.customcrewmoods[4]=int(words[2]);
						}else if (words[1] == "yellow"){
							i=obj.getcustomcrewman(2);
							obj.customcrewmoods[2]=int(words[2]);
						}else if (words[1] == "blue"){
							i=obj.getcustomcrewman(5);
							obj.customcrewmoods[5]=int(words[2]);
						}else if (words[1] == "purple"){
							i=obj.getcustomcrewman(1);
							obj.customcrewmoods[1]=int(words[2]);
						}else if (words[1] == "pink"){
							i=obj.getcustomcrewman(1);
							obj.customcrewmoods[1]=int(words[2]);
						}
						
						if (int(words[2]) == 0){
							obj.entities[i].tile = 0;
						}else{
							obj.entities[i].tile = 144;
						}
					}else if (words[0] == "changetile") {
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						obj.entities[i].tile = int(words[2]);	
					}else if (words[0] == "flipgravity") {
						//not something I'll use a lot, I think. Doesn't need to be very robust!
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						obj.entities[i].rule =7;
						obj.entities[i].tile = 6;
					}else if (words[0] == "changegravity") {
						//not something I'll use a lot, I think. Doesn't need to be very robust!
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						obj.entities[i].tile +=12;
					}else if (words[0] == "changedir") {
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						if (int(words[2]) == 0) {
						  obj.entities[i].dir = 0;	
						}else {
							obj.entities[i].dir = 1;
						}
					}else if (words[0] == "alarmon") {					
						game.alarmon = true; game.alarmdelay = 0;
					}else if (words[0] == "alarmoff") {					
						game.alarmon = false;
					}else if (words[0] == "changeai") {
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						if (words[2] == "followplayer") words[2] = "10";
						if (words[2] == "followpurple") words[2] = "11";
						if (words[2] == "followyellow") words[2] = "12";
						if (words[2] == "followred") words[2] = "13";
						if (words[2] == "followgreen") words[2] = "14";
						if (words[2] == "followblue") words[2] = "15";
						
						if (words[2] == "followposition") words[2] = "16";
						if (words[2] == "faceleft") { words[2] = "17"; words[3] = "0"; }
					  if (words[2] == "faceright") { words[2] = "17"; words[3] = "1"; }
						
						
						obj.entities[i].state = int(words[2]);
						if (obj.entities[i].state == 16) {
							obj.entities[i].para=int(words[3]);
						}else if (obj.entities[i].state == 17) {
							obj.entities[i].dir=int(words[3]);
						}
					}else if (words[0] == "alarmon") {					
						game.alarmon = true; game.alarmdelay = 0;
					}else if (words[0] == "alarmoff") {					
						game.alarmon = false;
					}else if (words[0] == "activateteleporter") {		
						i = obj.getteleporter();
						obj.entities[i].tile = 6;
						obj.entities[i].colour = 102;
					}else if (words[0] == "changecolour") {
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						if (words[2] == "cyan") {             obj.entities[i].colour = 0;	
						}else if (words[2] == "red") {	      obj.entities[i].colour = 15;	
						}else if (words[2] == "green")  {	    obj.entities[i].colour = 13;	
						}else if (words[2] == "yellow") {	    obj.entities[i].colour = 14;	
						}else if (words[2] == "blue") {  	    obj.entities[i].colour = 16;	
						}else if (words[2] == "purple") {	    obj.entities[i].colour = 20;	
						}else if (words[2] == "teleporter") {	obj.entities[i].colour = 102;	
						}
					}else if (words[0] == "squeak") {
						if (words[1] == "player") {         music.playef(11, 10);
						}else if (words[1] == "cyan") {     music.playef(11, 10);
						}else if (words[1] == "red") {	    music.playef(16, 10);
						}else if (words[1] == "green")  {	  music.playef(12, 10);
						}else if (words[1] == "yellow") {	  music.playef(14, 10);
						}else if (words[1] == "blue") {  	  music.playef(13, 10);
						}else if (words[1] == "purple") {   music.playef(15, 10);
						}else if (words[1] == "cry") {	    music.playef(2, 10);
						}else if (words[1] == "terminal") { music.playef(20, 10);
						}
					}else if (words[0] == "blackout") {		
						game.blackout = true;
					}else if (words[0] == "blackon") {		
						game.blackout = false;
					}else if (words[0] == "mobilecontrolsfixmap") {
						map.explored[6 + (10 * 20)] = 0;
						map.explored[7 + (10 * 20)] = 0;
						map.explored[8 + (10 * 20)] = 0;
						map.explored[5 + (9 * 20)] = 0;
						map.explored[6 + (9 * 20)] = 0;
						map.explored[7 + (9 * 20)] = 0;
					}else if (words[0] == "domobilecontrols") {		
						if (game.mobilemenu && game.controlstyle == 0) {
							if (game.showcontroltutorial == 0) {
								game.showcontroltutorial = 1; game.savemystats = true;
								
								game.gamestate = game.CONTROLTUTORIALMODE;
								game.controltutorialstate = 0;
								game.controltutorialstatedelay = 0;
								game.controllerp1 = 0;
								game.controllerp2 = 0;
								game.controllerp3 = 0;
								
								map.contents[25 + map.vmult[8]] = 495;
								map.contents[26 + map.vmult[8]] = 495;
								map.contents[34 + map.vmult[8]] = 495;
								map.contents[35 + map.vmult[8]] = 495;
								
								map.contents[36 + map.vmult[4]] = 0;
								map.contents[37 + map.vmult[4]] = 0;
								map.contents[38 + map.vmult[4]] = 0;
								map.contents[39 + map.vmult[4]] = 0;
								map.contents[36 + map.vmult[5]] = 0;
								map.contents[37 + map.vmult[5]] = 0;
								map.contents[38 + map.vmult[5]] = 0;
								map.contents[39 + map.vmult[5]] = 0;
								map.contents[36 + map.vmult[6]] = 0;
								map.contents[37 + map.vmult[6]] = 0;
								map.contents[38 + map.vmult[6]] = 0;
								map.contents[39 + map.vmult[6]] = 0;
								map.contents[36 + map.vmult[7]] = 0;
								map.contents[37 + map.vmult[7]] = 0;
								map.contents[38 + map.vmult[7]] = 0;
								map.contents[39 + map.vmult[7]] = 0;
								/*
								map.contents[3 + map.vmult[7]] = 495;
								map.contents[3 + map.vmult[6]] = 495;
								map.contents[9 + map.vmult[7]] = 495;
								map.contents[9 + map.vmult[6]] = 495;
								map.contents[30 + map.vmult[7]] = 495;
								map.contents[30 + map.vmult[6]] = 495;
								*/
							}
						}
					}else if (words[0] == "setcheckpoint") {		
						i = obj.getplayer();
						game.savepoint = 0;
						game.savex = obj.entities[i].xp ; 
						game.savey = obj.entities[i].yp;
						game.savegc = game.gravitycontrol;
						game.saverx = game.roomx; game.savery = game.roomy;  
						game.savedir = obj.entities[i].dir;		
					}else if (words[0] == "gamestate") {		
						game.state = int(words[1]);
						game.statedelay = 0;
					}else if (words[0] == "textboxactive") {		
						dwgfx.textboxactive();
					}else if (words[0] == "gamemode") {		
						if (words[1] == "teleporter") {
							game.gamestate = 5;
							dwgfx.menuoffset = 240; //actually this should count the roomname
						  if (map.extrarow) dwgfx.menuoffset -= 10;
						  dwgfx.menubuffer.copyPixels(dwgfx.screenbuffer, dwgfx.screenbuffer.rect, dwgfx.tl, null, null, false);
							dwgfx.resumegamemode = false;
							
							game.useteleporter = false; //good heavens don't actually use it
						}else if (words[1] == "game") {
							dwgfx.resumegamemode = true;
						}
					}else if (words[0] == "ifexplored") {		
						if (map.explored[int(words[1]) + (20 * int(words[2]))] == 1) {
						  load(words[3]); position--;
						}
					}else if (words[0] == "iflast") {		
						if (game.lastsaved==int(words[1])) {
						  load(words[2]); position--;
						}
					}else if (words[0] == "ifskip") {		
						if (game.nocutscenes) {
						  load(words[1]); position--;
						}
					}else if (words[0] == "ifflag") {		
						if (obj.flags[int(words[1])]==1) {
						  load(words[2]); position--;
						}
					}else if (words[0] == "ifcrewlost") {		
						if (game.crewstats[int(words[1])]==false) {
						  load(words[2]); position--;
						}
					}else if (words[0] == "iftrinkets") {		
						if (game.trinkets >= int(words[1])){
						  load(words[2]); position--;
						}
					}else if (words[0] == "iftrinketsless") {		
						if (game.stat_trinkets < int(words[1])){
						  load(words[2]); position--;
						}
					}else if (words[0] == "hidecoordinates") {		
						map.explored[int(words[1]) + (20 * int(words[2]))] = 0;
					}else if (words[0] == "showcoordinates") {		
						map.explored[int(words[1]) + (20 * int(words[2]))] = 1;
					}else if (words[0] == "hideship") {		
						map.hideship();
					}else if (words[0] == "showship") {		
						map.showship();
					}else if (words[0] == "showsecretlab") {
						map.explored[16 + (20 * 5)] = 1;
						map.explored[17 + (20 * 5)] = 1;
						map.explored[18 + (20 * 5)] = 1;
						map.explored[17 + (20 * 6)] = 1;
						map.explored[18 + (20 * 6)] = 1;
						map.explored[19 + (20 * 6)] = 1;
						map.explored[19 + (20 * 7)] = 1;
						map.explored[19 + (20 * 8)] = 1;
					}else if (words[0] == "hidesecretlab") {
						map.explored[16 + (20 * 5)] = 0;
						map.explored[17 + (20 * 5)] = 0;
						map.explored[18 + (20 * 5)] = 0;
						map.explored[17 + (20 * 6)] = 0;
						map.explored[18 + (20 * 6)] = 0;
						map.explored[19 + (20 * 6)] = 0;
						map.explored[19 + (20 * 7)] = 0;
						map.explored[19 + (20 * 8)] = 0;
					}else if (words[0] == "showteleporters") {
						map.showteleporters = true;
					}else if (words[0] == "showtargets") {
						map.showtargets = true;
					}else if (words[0] == "showtrinkets") {
						map.showtrinkets = true;
					}else if (words[0] == "hideteleporters") {
						map.showteleporters = false;
					}else if (words[0] == "hidetargets") {
						map.showtargets = false;
					}else if (words[0] == "hidetrinkets") {
						map.showtrinkets = false;
					}else if (words[0] == "hideplayer") {		
						obj.entities[obj.getplayer()].invis = true;
					}else if (words[0] == "showplayer") {		
						obj.entities[obj.getplayer()].invis = false;
					}else if (words[0] == "teleportscript") {		
						game.teleportscript = words[1];
					}else if (words[0] == "clearteleportscript") {		
						game.teleportscript = "";
					}else if (words[0] == "nocontrol") {		
						game.hascontrol = false;
					}else if (words[0] == "hascontrol") {		
						game.hascontrol = true;
					}else if (words[0] == "companion") {
						game.companion = int(words[1]);
					}else if (words[0] == "befadein") {
						dwgfx.fadeamount = 0;
						dwgfx.fademode= 0;
					}else if (words[0] == "fadein") {
						dwgfx.fademode = 4;
					}else if (words[0] == "fadeout") {
						dwgfx.fademode = 2;
					}else if (words[0] == "untilfade") {
						if (dwgfx.fademode>1) {
							scriptdelay = 1; position--; 
						}
					}else if (words[0] == "entersecretlab") {
						game.unlock[8] = true;
						game.insecretlab = true;
					}else if (words[0] == "leavesecretlab") {
						game.insecretlab = false;
					}else if (words[0] == "resetgame") {
						map.resetnames();
						map.resetmap();
						map.resetplayer(dwgfx, game, obj, music);
						map.tdrawback = true;
						
						obj.resetallflags();
						i = obj.getplayer();
						obj.entities[i].tile = 0;
						
						game.trinkets = 0; for (i = 0; i < 100; i++) { obj.collect[i] = 0;  obj.customcollect[i] = 0; }
						game.deathcounts = 0; game.advancetext = false; game.hascontrol = true;
						game.frames = 0; game.seconds = 0; game.minutes = 0; game.hours = 0;
						game.gravitycontrol = 0; game.teleport = false; game.companion = 0; game.roomchange = false;
						game.teleport_to_new_area = false; game.teleport_to_x = 0; game.teleport_to_y = 0;
						
						game.teleportscript = "";
						
						//get out of final level mode!
						map.finalmode = false;
				    map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
						map.finalstretch = false;
					}else if (words[0] == "loadscript") {
						load(words[1]); position--;
					}else if (words[0] == "rollcredits") {
						game.gamestate = 6;
					  dwgfx.fademode = 4;
						game.creditposition = 0;
					}else if (words[0] == "finalmode") {
						map.finalmode = true; 
						map.finalx = int(words[1]); map.finaly = int(words[2]);
						game.roomx = map.finalx; game.roomy = map.finaly;
						map.gotoroom(game.roomx, game.roomy, dwgfx, game, obj, music); 
					}else if (words[0] == "rescued") {
						if (words[1] == "red") {	  game.crewstats[3] = true;
						}else if (words[1] == "green")  {	game.crewstats[4] = true;
						}else if (words[1] == "yellow") {	game.crewstats[2] = true;
						}else if (words[1] == "blue") {  	game.crewstats[5] = true;
						}else if (words[1] == "purple") { game.crewstats[1] = true;
						}else if (words[1] == "player") { game.crewstats[0] = true;
						}else if (words[1] == "cyan") { game.crewstats[0] = true;
						}
					}else if (words[0] == "missing") {
						if (words[1] == "red") {	  game.crewstats[3] = false;
						}else if (words[1] == "green")  {	game.crewstats[4] = false;
						}else if (words[1] == "yellow") {	game.crewstats[2] = false;
						}else if (words[1] == "blue") {  	game.crewstats[5] = false;
						}else if (words[1] == "purple") { game.crewstats[1] = false;
						}else if (words[1] == "player") { game.crewstats[0] = false;
						}else if (words[1] == "cyan") { game.crewstats[0] = false;
						}
					}else if (words[0] == "face") {
						if (words[1] == "player") {         i=obj.getplayer();
						}else if (words[1] == "cyan") {     i=obj.getcrewman(0);
						}else if (words[1] == "red") {	  i=obj.getcrewman(3);
						}else if (words[1] == "green")  {	i=obj.getcrewman(4);
						}else if (words[1] == "yellow") {	i=obj.getcrewman(2);
						}else if (words[1] == "blue") {  	i=obj.getcrewman(5);
						}else if (words[1] == "purple") {	i=obj.getcrewman(1);
						}
						
						if (words[2] == "player") {         j=obj.getplayer();
						}else if (words[2] == "cyan") {     j=obj.getcrewman(0);
						}else if (words[2] == "red") {	  j=obj.getcrewman(3);
						}else if (words[2] == "green")  {	j=obj.getcrewman(4);
						}else if (words[2] == "yellow") {	j=obj.getcrewman(2);
						}else if (words[2] == "blue") {  	j=obj.getcrewman(5);
						}else if (words[2] == "purple") { j=obj.getcrewman(1);
						}
						
						if (obj.entities[j].xp > obj.entities[i].xp + 5) { obj.entities[i].dir = 1;
						}else if (obj.entities[j].xp < obj.entities[i].xp - 5) {	obj.entities[i].dir = 0; }
					}else if (words[0] == "jukebox") {
						for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].type == 13 && obj.entities[j].active) {obj.entities[j].colour = 4;}}
						if (int(words[1]) == 1) {
							obj.createblock(5, 88 - 4, 80, 20, 16, 25);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 88 && obj.entities[j].yp==80) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 2) {
							obj.createblock(5, 128 - 4, 80, 20, 16, 26);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 128 && obj.entities[j].yp==80) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 3) {
							obj.createblock(5, 176 - 4, 80, 20, 16, 27);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 176 && obj.entities[j].yp==80) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 4) {
							obj.createblock(5, 216 - 4, 80, 20, 16, 28);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 216 && obj.entities[j].yp==80) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 5) {
							obj.createblock(5, 88 - 4, 128, 20, 16, 29);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 88 && obj.entities[j].yp==128) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 6) {
							obj.createblock(5, 176 - 4, 128, 20, 16, 30);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 176 && obj.entities[j].yp==128) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 7) {
							obj.createblock(5, 40 - 4, 40, 20, 16, 31);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 40 && obj.entities[j].yp==40) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 8) {
							obj.createblock(5, 216 - 4, 128, 20, 16, 32);	
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 216 && obj.entities[j].yp==128) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 9) {
							obj.createblock(5, 128 - 4, 128, 20, 16, 33);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 128 && obj.entities[j].yp==128) {obj.entities[j].colour = 5;}}
						}else if (int(words[1]) == 10) {
							obj.createblock(5, 264 - 4, 40, 20, 16, 34);
						  for (j = 0; j < obj.nentity; j++) {if (obj.entities[j].xp == 264 && obj.entities[j].yp==40) {obj.entities[j].colour = 5;}}
						}
					}else if (words[0] == "createactivityzone") {
						if (words[1] == "red") {	  i=3;
						}else if (words[1] == "green")  {	i=4;
						}else if (words[1] == "yellow") {	i=2;
						}else if (words[1] == "blue") {  	i=5;
						}else if (words[1] == "purple") {	i=1;
						}
						
						if (i == 4) {
							obj.createblock(5, obj.entities[obj.getcrewman(i)].xp - 32, obj.entities[obj.getcrewman(i)].yp-20, 96, 60, i);
						}else{
						  obj.createblock(5, obj.entities[obj.getcrewman(i)].xp - 32, 0, 96, 240, i);
						}
					}else if (words[0] == "createrescuedcrew") {
					  //special for final level cutscene
						//starting at 180, create the rescued crewmembers (ingoring violet, who's at 155)
						i = 215;
						if (game.crewstats[2] && game.lastsaved!=2) {obj.createentity(game, i, 153, 18, 14, 0, 17, 0);	i += 25; }
						if (game.crewstats[3] && game.lastsaved!=3) {obj.createentity(game, i, 153, 18, 15, 0, 17, 0);	i += 25; }
						if (game.crewstats[4] && game.lastsaved!=4) {obj.createentity(game, i, 153, 18, 13, 0, 17, 0);	i += 25; }
						if (game.crewstats[5] && game.lastsaved!=5) {obj.createentity(game, i, 153, 18, 16, 0, 17, 0);	i += 25; }
					}else if (words[0] == "restoreplayercolour") {
						i = obj.getplayer();
						obj.entities[i].colour = 0;
					}else if (words[0] == "changeplayercolour") {
						i = obj.getplayer();
						
						if (words[1] == "cyan") {             obj.entities[i].colour = 0;	
						}else if (words[1] == "red") {	      obj.entities[i].colour = 15;	
						}else if (words[1] == "green")  {	    obj.entities[i].colour = 13;	
						}else if (words[1] == "yellow") {	    obj.entities[i].colour = 14;	
						}else if (words[1] == "blue") {  	    obj.entities[i].colour = 16;	
						}else if (words[1] == "purple") {	    obj.entities[i].colour = 20;	
						}else if (words[1] == "teleporter") {	obj.entities[i].colour = 102;	
						}
					}else if (words[0] == "altstates") {
						obj.altstates = int(words[1]);
					}else if (words[0] == "activeteleporter") {
						i = obj.getteleporter();
						obj.entities[i].colour = 101;
					}else if (words[0] == "foundtrinket") {
						music.silencedasmusik();
			      music.playef(3,10);
						
						game.trinkets++;
						obj.collect[int(words[1])] = 1;
						
						dwgfx.textboxremovefast();
						
						dwgfx.createtextbox("        Congratulations!       ", 50, 85, 174, 174, 174);
						dwgfx.addline("");
						dwgfx.addline("You have found a shiny trinket!");
						dwgfx.textboxcenterx();
						
						dwgfx.createtextbox(" " + help.number(game.trinkets) + " out of Twenty ", 50, 135, 174, 174, 174);
						dwgfx.textboxcenterx();
						
						if (!game.backgroundtext) {
						  game.advancetext = true;	game.hascontrol = false; game.pausescript = true;
							if (key.isDown(90) || key.isDown(32) || key.isDown(86)
			          || key.isDown(Keyboard.UP) || key.isDown(Keyboard.DOWN)) game.jumpheld = true;
						}
					  game.backgroundtext = false;
					}else if (words[0] == "foundlab") {
						music.playef(3,10);
						
						dwgfx.textboxremovefast();
						
						dwgfx.createtextbox("        Congratulations!       ", 50, 85, 174, 174, 174);
						dwgfx.addline("");
						dwgfx.addline("You have found the secret lab!");
						dwgfx.textboxcenterx();
						dwgfx.textboxcentery();
						
						if (!game.backgroundtext) {
						  game.advancetext = true;	game.hascontrol = false; game.pausescript = true;
							if (key.isDown(90) || key.isDown(32) || key.isDown(86)
			          || key.isDown(Keyboard.UP) || key.isDown(Keyboard.DOWN)) game.jumpheld = true;
						}
					  game.backgroundtext = false;
					}else if (words[0] == "foundlab2") {						
						dwgfx.textboxremovefast();
						
						dwgfx.createtextbox("The secret lab is separate from", 50, 85, 174, 174, 174);
						      dwgfx.addline("the rest of the game. You can");
						      dwgfx.addline("now come back here at any time");
									dwgfx.addline("by selecting the new SECRET LAB");
								  dwgfx.addline("option in the play menu.");	
						dwgfx.textboxcenterx();
						dwgfx.textboxcentery();
						
						if (!game.backgroundtext) {
						  game.advancetext = true;	game.hascontrol = false; game.pausescript = true;
							if (key.isDown(90) || key.isDown(32) || key.isDown(86)
			          || key.isDown(Keyboard.UP) || key.isDown(Keyboard.DOWN)) game.jumpheld = true;
						}
					  game.backgroundtext = false;
					}else if (words[0] == "everybodysad") {
						for (i = 0; i < obj.nentity; i++) {
							if (obj.entities[i].rule == 6 || obj.entities[i].rule == 0) {
								obj.entities[i].tile = 144;
							}
						}
					}else if (words[0] == "startintermission2") {
						map.finalmode = true; //Enable final level mode
				    map.finalx = 46; map.finaly = 54; //Current
						
			      game.savex = 228; game.savey = 129; game.saverx = 53; game.savery = 49; 
						game.savegc = 0; game.savedir = 0; //Intermission level 2						
						game.savepoint = 0;
						game.gravitycontrol = 0;
						
						map.gotoroom(46, 54, dwgfx, game, obj, music); 
					}else if (words[0] == "telesave") {
						if (!game.intimetrial && !game.nodeathmode && !game.inintermission) {
							//game.savetele(map, obj, music, help);
							game.savequick(map, obj, music, help);
						}
					}else if (words[0] == "createlastrescued") {
						if (game.lastsaved==2) {          r=14;
						}else if (game.lastsaved==3) {	  r=15;
						}else if (game.lastsaved==4)  {	  r=13;
						}else if (game.lastsaved==5) {  	r=16;
						}else {  r = 19; }
						
						obj.createentity(game, 200, 153, 18, r, 0, 19, 30);
						i = obj.getcrewman(game.lastsaved);
						obj.entities[i].dir = 1;
					}else if (words[0] == "specialline") {
						switch(int(words[1])) {
							case 1:
							  txtnumlines = 1;
								
						    txt[0] = "I'm worried about " + game.unrescued() + ", Doctor!";
							break;
							case 2:
							  txtnumlines = 3;
								
								if (game.crewrescued() < 5) {
								  txt[1] = "to helping you find the";
								  txt[2] = "rest of the crew!";
								}else {
							    txtnumlines = 2;
								  txt[1] = "to helping you find " + game.unrescued() + "!";
								}
							break;
						}
					}else if (words[0] == "trinketbluecontrol") {
						if (game.trinkets == 20 && obj.flags[67] == 1) {
						  load("talkblue_trinket6"); position--;
						}else if (game.trinkets >= 19 && obj.flags[67] == 0) {
						  load("talkblue_trinket5"); position--;
						}else {
						  load("talkblue_trinket4"); position--;
						}
					}else if (words[0] == "trinketyellowcontrol") {
						if (game.trinkets >= 19) {
						  load("talkyellow_trinket3"); position--;
						}else {
						  load("talkyellow_trinket2"); position--;
						}
					}else if (words[0] == "redcontrol") {
						if (game.insecretlab) {
							load("talkred_14"); position--;
						}else	if (game.roomx != 104) {
							if (game.roomx == 100) {
						    load("talkred_10"); position--;
							}else if (game.roomx == 107) {
						    load("talkred_11"); position--;
							}else if (game.roomx == 114) {
						    load("talkred_12"); position--;
							}
						}else if (obj.flags[67] == 1) {
							//game complete
						  load("talkred_13"); position--;
						}else if (obj.flags[35] == 1 && obj.flags[52] == 0) {
							//Intermission level
							obj.flags[52] = 1;
						  load("talkred_9"); position--;
						}else if (obj.flags[51] == 0) {
							//We're back home!
							obj.flags[51] = 1;
						  load("talkred_5"); position--;
						}else if (obj.flags[48] == 0 && game.crewstats[5]) {
							//Victoria's back
							obj.flags[48] = 1;
						  load("talkred_6"); position--;
						}else if (obj.flags[49] == 0 && game.crewstats[4]) {
							//Verdigris' back
							obj.flags[49] = 1;
						  load("talkred_7"); position--;
						}else if (obj.flags[50] == 0 && game.crewstats[2]) {
							//Vitellary's back
							obj.flags[50] = 1;
						  load("talkred_8"); position--;
						}else if (obj.flags[45] == 0 && !game.crewstats[5]) {
							obj.flags[45] = 1;
						  load("talkred_2"); position--;
						}else if (obj.flags[46] == 0 && !game.crewstats[4]) {
							obj.flags[46] = 1;
						  load("talkred_3"); position--;
						}else if (obj.flags[47] == 0 && !game.crewstats[2]) {
							obj.flags[47] = 1;
						  load("talkred_4"); position--;
						}else {
							obj.flags[45] = 0;
							obj.flags[46] = 0;
							obj.flags[47] = 0;
              load("talkred_1"); position--;
						}
					}else if (words[0] == "greencontrol") {
            if (game.insecretlab) {
							load("talkgreen_11"); position--;
						}else	if (game.roomx == 103 && game.roomy == 109) {
						  load("talkgreen_8"); position--;							
						}else if (game.roomx == 101 && game.roomy == 109) {
						  load("talkgreen_9"); position--;							
						}else if (obj.flags[67] == 1) {
							//game complete
						  load("talkgreen_10"); position--;
						}else if (obj.flags[34] == 1 && obj.flags[57] == 0) {
							//Intermission level
							obj.flags[57] = 1;
						  load("talkgreen_7"); position--;
						}else if (obj.flags[53] == 0) {
							//Home!
							obj.flags[53] = 1;
						  load("talkgreen_6"); position--;
						}else if (obj.flags[54] == 0 && game.crewstats[2]) {
							obj.flags[54] = 1;
						  load("talkgreen_5"); position--;
						}else if (obj.flags[55] == 0 && game.crewstats[3]) {
							obj.flags[55] = 1;
						  load("talkgreen_4"); position--;
						}else if (obj.flags[56] == 0 && game.crewstats[5]) {
							obj.flags[56] = 1;
						  load("talkgreen_3"); position--;
						}else if (obj.flags[58] == 0) {
							obj.flags[58] = 1;
						  load("talkgreen_2"); position--;
						}else{
							load("talkgreen_1"); position--;
						}
					}else if (words[0] == "bluecontrol") {
						if (game.insecretlab) {
							load("talkblue_9"); position--;
						}else	if (obj.flags[67] == 1) {
							//game complete, everything changes for victoria
							if (obj.flags[41] == 1 && obj.flags[42] == 0) {
								//second trinket conversation
								obj.flags[42] = 1;
								load("talkblue_trinket2"); position--;
							}else if (obj.flags[41] == 0 && obj.flags[42] == 0) {
								//Third trinket conversation
								obj.flags[42] = 1;
								load("talkblue_trinket3"); position--;
							}else {
								//Ok, we've already dealt with the trinket thing; so either you have them all, or you don't. If you do:
								if (game.trinkets >= 20) {
								  load("startepilogue"); position--;
								}else {
						      load("talkblue_8"); position--;
								}
							}
						}else if (obj.flags[33] == 1 && obj.flags[40] == 0) {
							//Intermission level
							obj.flags[40] = 1;
						  load("talkblue_7"); position--;
						}else if (obj.flags[36] == 0 && game.crewstats[5]) {
							//Back on the ship!
							obj.flags[36] = 1;
						  load("talkblue_3"); position--;
						}else if (obj.flags[41] == 0 && game.crewrescued() <= 4) {
							//First trinket conversation
							obj.flags[41] = 1;
						  load("talkblue_trinket1"); position--;
						}else if (obj.flags[41] == 1 && obj.flags[42] == 0 && game.crewrescued() == 5) {
							//second trinket conversation
							obj.flags[42] = 1;
						  load("talkblue_trinket2"); position--;
						}else if (obj.flags[41] == 0 && obj.flags[42] == 0 && game.crewrescued() == 5) {
							//Third trinket conversation
							obj.flags[42] = 1;
						  load("talkblue_trinket3"); position--;
						}else if (obj.flags[37] == 0 && game.crewstats[2]) {
							obj.flags[37] = 1;
						  load("talkblue_4"); position--;
						}else if (obj.flags[38] == 0 && game.crewstats[3]) {
							obj.flags[38] = 1;
						  load("talkblue_5"); position--;
						}else if (obj.flags[39] == 0 && game.crewstats[4]) {
							obj.flags[39] = 1;
						  load("talkblue_6"); position--;
						}else{
              //if all else fails:
							//if yellow is found
							if (game.crewstats[2]) {
						    load("talkblue_2"); position--;
							}else{
						    load("talkblue_1"); position--;
							}
						}
					}else if (words[0] == "yellowcontrol") {
						if (game.insecretlab) {
							load("talkyellow_12"); position--;
						}else	if (obj.flags[67] == 1) {
							//game complete
						  load("talkyellow_11"); position--;
						}else if (obj.flags[32] == 1 && obj.flags[31] == 0) {
							//Intermission level
							obj.flags[31] = 1;
						  load("talkyellow_6"); position--;
						}else if (obj.flags[27] == 0 && game.crewstats[2]) {
							//Back on the ship!
							obj.flags[27] = 1;
						  load("talkyellow_10"); position--;
						}else if (obj.flags[43] == 0 && game.crewrescued() == 5 && !game.crewstats[5]) {
							//If by chance we've rescued everyone except Victoria by the end, Vitellary provides you with
							//the trinket information instead.
							obj.flags[43] = 1; obj.flags[42] = 1; obj.flags[41] = 1;
						  load("talkyellow_trinket1"); position--;
						}else if (obj.flags[24] == 0 && game.crewstats[5]) {
							obj.flags[24] = 1;
						  load("talkyellow_8"); position--;
						}else if (obj.flags[26] == 0 && game.crewstats[4]) {
							obj.flags[26] = 1;
						  load("talkyellow_7"); position--;
						}else if (obj.flags[25] == 0 && game.crewstats[3]) {
							obj.flags[25] = 1;
						  load("talkyellow_9"); position--;
						}else if (obj.flags[28] == 0) {
							obj.flags[28] = 1;
						  load("talkyellow_3"); position--;
						}else if (obj.flags[29] == 0) {
							obj.flags[29] = 1;
						  load("talkyellow_4"); position--;
						}else if (obj.flags[30] == 0) {
							obj.flags[30] = 1;
						  load("talkyellow_5"); position--;
						}else if (obj.flags[23] == 0) {
							obj.flags[23] = 1;
						  load("talkyellow_2"); position--;
						}else {
						  load("talkyellow_1"); position--;
							obj.flags[23] = 0;
						}
					}else if (words[0] == "purplecontrol") {
						//Controls Purple's conversion
						//Crew rescued:
						if (game.insecretlab) {
							load("talkpurple_9"); position--;
						}else	if (obj.flags[67] == 1) {
							//game complete
						  load("talkpurple_8"); position--;
						}else if (obj.flags[17] == 0 && game.crewstats[4]) {
							obj.flags[17] = 1;
						  load("talkpurple_6"); position--;
						}else if (obj.flags[15] == 0 && game.crewstats[5]) {
							obj.flags[15] = 1;
						  load("talkpurple_4"); position--;
						}else if (obj.flags[16] == 0 && game.crewstats[3]) {
							obj.flags[16] = 1;
						  load("talkpurple_5"); position--;
						}else if (obj.flags[18] == 0 && game.crewstats[2]) {
							obj.flags[18] = 1;
						  load("talkpurple_7"); position--;
						}else if (obj.flags[19] == 1 && obj.flags[20] == 0 && obj.flags[21] == 0) {
							//intermission one: if played one / not had first conversation / not played two [conversation one]
							obj.flags[21] = 1;
						  load("talkpurple_intermission1"); position--;
					  }else if (obj.flags[20] == 1 && obj.flags[21] == 1 && obj.flags[22] == 0) {
							//intermission two: if played two / had first conversation / not had second conversation [conversation two]
							obj.flags[22] = 1;
						  load("talkpurple_intermission2"); position--;
					  }else if (obj.flags[20] == 1 && obj.flags[21] == 0 && obj.flags[22] == 0) {
							//intermission two: if played two / not had first conversation / not had second conversation [conversation three]
							obj.flags[22] = 1;
						  load("talkpurple_intermission3"); position--;
					  }else if (obj.flags[12] == 0) {
							//Intro conversation
							obj.flags[12] = 1;
						  load("talkpurple_intro"); position--;
						}else if (obj.flags[14] == 0) {
							//Shorter intro conversation
							obj.flags[14] = 1;
						  load("talkpurple_3"); position--;
						}else{
              //if all else fails:
							//if green is found
							if (game.crewstats[4]) {
						    load("talkpurple_2"); position--;
							}else{
						    load("talkpurple_1"); position--;
							}
						}
					}
					
					position++;
				}else {
					running = false;
				}
			}
			
			if(scriptdelay>0){
				scriptdelay--;
			}
		}
		
		public function resetgametomenu(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
																		obj:entityclass, help:helpclass, music:musicclass):void {

  		game.gamestate = TITLEMODE;
			dwgfx.flipmode = false;
			obj.nentity = 0;
			dwgfx.fademode = 4;
			game.createmenu("gameover");
		}
		
		public function startgamemode(t:int, key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
															obj:entityclass, help:helpclass, music:musicclass):void {
      
			game.showloadingnotice = false;
			switch(t) {
				case 0:  //Normal new game
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.start(obj, music);
					game.jumpheld = true;
					dwgfx.showcutscenebars = true;
					dwgfx.cutscenebarspos = 320;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {	map.resetplayer(dwgfx, game, obj, music);	}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intro");
				break;
				case 1:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.start(obj, music);
					game.loadtele(map, obj, music);
					game.gravitycontrol = game.savegc;
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){ obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else { map.resetplayer(dwgfx, game, obj, music);	}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
				break;
				case 2: //Load Quicksave
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.start(obj, music);
					game.loadquick(map, obj, music);
					game.gravitycontrol = game.savegc;
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					//a very special case for here needs to ensure that the tower is set correctly
					if (map.towermode) {
						map.resetplayer(dwgfx, game, obj, music);
						
						i = obj.getplayer();
						map.ypos = obj.entities[i].yp - 120;
						map.bypos = map.ypos / 2;
						map.cameramode = 0;
						map.colsuperstate = 0;
					}
					dwgfx.fademode = 4;
				break;
				case 3:
					//Start Time Trial 1
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nocutscenes = true; game.intimetrial = true; game.timetrialcountdown = 150; game.timetrialparlost = false;
					game.timetriallevel = 0; game.timetrialpar = 75;  game.timetrialshinytarget = 2;
					
					music.fadeout();
					game.gamestate = GAMEMODE;	game.starttrial(game.timetriallevel, obj, music);	game.jumpheld = true;
					
					if (dwgfx.setflipmode) dwgfx.flipmode = true;//set flipmode
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {	map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
				break;
				case 4:
					//Start Time Trial 2
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nocutscenes = true; game.intimetrial = true; game.timetrialcountdown = 150; game.timetrialparlost = false;
					game.timetriallevel = 1; game.timetrialpar = 165;  game.timetrialshinytarget = 4;
					
					music.fadeout();
					game.gamestate = GAMEMODE;	game.starttrial(game.timetriallevel, obj, music);	game.jumpheld = true;
					
					if (dwgfx.setflipmode) dwgfx.flipmode = true;//set flipmode
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {	map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
				break;
				case 5:
					//Start Time Trial 3 tow
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nocutscenes = true; game.intimetrial = true; game.timetrialcountdown = 150; game.timetrialparlost = false;
					game.timetriallevel = 2; game.timetrialpar = 105;  game.timetrialshinytarget = 2;
					
					music.fadeout();
					game.gamestate = GAMEMODE;	game.starttrial(game.timetriallevel, obj, music);	game.jumpheld = true;
					
					if (dwgfx.setflipmode) dwgfx.flipmode = true;//set flipmode
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {	map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
				break;
				case 6:
					//Start Time Trial 4 station
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nocutscenes = true; game.intimetrial = true; game.timetrialcountdown = 150; game.timetrialparlost = false;
					game.timetriallevel = 3; game.timetrialpar = 200;  game.timetrialshinytarget = 5;
					
					music.fadeout();
					game.gamestate = GAMEMODE;	game.starttrial(game.timetriallevel, obj, music);	game.jumpheld = true;
					
					if (dwgfx.setflipmode) dwgfx.flipmode = true;//set flipmode
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {	map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
			  break;
				case 7:
					//Start Time Trial 5 warp
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nocutscenes = true; game.intimetrial = true; game.timetrialcountdown = 150; game.timetrialparlost = false;
					game.timetriallevel = 4; game.timetrialpar = 120;  game.timetrialshinytarget = 1;
					
					music.fadeout();
					game.gamestate = GAMEMODE;	game.starttrial(game.timetriallevel, obj, music);	game.jumpheld = true;
					
					if (dwgfx.setflipmode) dwgfx.flipmode = true;//set flipmode
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {	map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
				break;
				case 8:
					//Start Time Trial 6// final level!
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nocutscenes = true; game.intimetrial = true; game.timetrialcountdown = 150; game.timetrialparlost = false;
					game.timetriallevel = 5; game.timetrialpar = 135;  game.timetrialshinytarget = 1;
					
					music.fadeout();
					map.finalmode = true; //Enable final level mode
					map.finalx = 46; map.finaly = 54; //Current
					map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.gamestate = GAMEMODE;	game.starttrial(game.timetriallevel, obj, music);	game.jumpheld = true;
					
					if (dwgfx.setflipmode) dwgfx.flipmode = true;//set flipmode
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {	map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
				break;
				case 9:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nodeathmode = true;
					game.start(obj, music);
					game.jumpheld = true;
					dwgfx.showcutscenebars = true;
					dwgfx.cutscenebarspos = 320;
					//game.starttest(obj, music);
					//music.play(4);
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					
					load("intro");
				break;
				case 10:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.nodeathmode = true; game.nocutscenes = true;
					
					game.start(obj, music);
					game.jumpheld = true;
					dwgfx.showcutscenebars = true;
					dwgfx.cutscenebarspos = 320;
					//game.starttest(obj, music);
					//music.play(4);
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					
					load("intro");
				break;
				case 11:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					
					game.startspecial(0, obj, music);
					game.jumpheld = true;
					
					//Secret lab, so reveal the map, give them all 20 trinkets
					for (j = 0; j < 20; j++) {
						obj.collect[i] = true;
						for (i = 0; i < 20; i++) {
							map.explored[i + (j * 20)] = 1;
						}
					}
					game.trinkets = 20;
					game.insecretlab = true;
					map.showteleporters = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					music.play(11);
					dwgfx.fademode = 4;
				break;
				case 12:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 2; 
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;	game.companion = 11; game.supercrewmate = true; game.scmprogress = 0;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_1");
				break;
				case 13:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 3;
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;	game.companion = 11; game.supercrewmate = true; game.scmprogress = 0;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_1");
				break;
				case 14:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 4;
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;	game.companion = 11; game.supercrewmate = true; game.scmprogress = 0;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_1");
				break;
				case 15:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 5;
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;	game.companion = 11; game.supercrewmate = true; game.scmprogress = 0;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_1");
				break;
				case 16:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 2; 
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_2");
				break;
				case 17:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 3; 
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_2");
				break;
				case 18:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 4; 
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_2");
				break;
				case 19:
					game.gamestate = GAMEMODE;
					hardreset(key, dwgfx, game, map, obj, help, music);
					music.fadeout();
					
					game.lastsaved = 5; 
					
					game.crewstats[game.lastsaved] = true;
					game.inintermission = true;
					map.finalmode = true; map.finalx = 41; map.finaly = 56; map.final_colormode = false;	map.final_mapcol = 0;	map.final_colorframe = 0;
					game.startspecial(1, obj, music);
					game.jumpheld = true;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					if(obj.nentity==0){	obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else {map.resetplayer(dwgfx, game, obj, music);}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					load("intermission_2");
				break;
				case 20:
					//Level editor
					hardreset(key, dwgfx, game, map, obj, help, music);
					editor.reset();
					music.fadeout();
					
					game.gamestate = EDITORMODE;
					game.jumpheld = true;
					
					if (dwgfx.setflipmode) dwgfx.flipmode = true;//set flipmode
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else{
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					dwgfx.fademode = 4;
				break;
				case 21:  //play custom level (in editor)
					game.gamestate = GAMEMODE;
					music.fadeout();
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.customstart(obj, music);
					game.jumpheld = true;
					
					
					map.custommode = true;
					map.customx = 100;
					map.customy = 100;
					
					//dwgfx.showcutscenebars = true;
					//dwgfx.cutscenebarspos = 320;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else{
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					if(editor.levmusic>0){
						music.play(editor.levmusic);
					}else{
						music.currentsong=-1;
					}
					//load("intro");
				break;
				case 22:  //play custom level (in game)
					//Initilise the level
					//First up, find the start point
					editor.weirdloadthing(editor.ListOfMetaData[game.playcustomlevel].file_num);
					editor.findstartpoint(game);
					
					game.showloadingnotice = true;
					game.gamestate = GAMEMODE;
					music.fadeout();
					hardreset(key, dwgfx, game, map, obj, help, music);
					game.customstart(obj, music);
					game.jumpheld = true;
					
					map.custommodeforreal = true;
					map.custommode = true;
					map.customx = 100;
					map.customy = 100;
					
					//dwgfx.showcutscenebars = true;
					//dwgfx.cutscenebarspos = 320;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else{
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					
					editor.generatecustomminimap(dwgfx, map);
					map.customshowmm=true;
					if(editor.levmusic>0){
						music.play(editor.levmusic);
					}else{
						music.currentsong=-1;
					}
					dwgfx.fademode = 4;
					//load("intro");
				break;
				case 23: //Continue in custom level
						//Initilise the level
					//First up, find the start point
					editor.weirdloadthing(editor.ListOfMetaData[game.playcustomlevel].file_num);
					editor.findstartpoint(game);
					
					game.showloadingnotice = true;
					game.gamestate = GAMEMODE;
					music.fadeout();
					hardreset(key, dwgfx, game, map, obj, help, music);
					map.custommodeforreal = true;
					map.custommode = true;
					map.customx = 100;
					map.customy = 100;
					
					game.customstart(obj, music);
					game.customloadquick(editor.ListOfMetaData[game.playcustomlevel].file_num, map, obj, music);
					game.jumpheld = true;
					game.gravitycontrol = game.savegc;
					
					
					//dwgfx.showcutscenebars = true;
					//dwgfx.cutscenebarspos = 320;
					
					//set flipmode
					if (dwgfx.setflipmode) dwgfx.flipmode = true;
					
					if(obj.nentity==0){
						obj.createentity(game, game.savex, game.savey, 0, 0); //In this game, constant, never destroyed
					}else{
						map.resetplayer(dwgfx, game, obj, music);
					}
					map.gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
					/* Handled by load
					if(ed.levmusic>0){
						music.play(ed.levmusic);
					}else{
						music.currentsong=-1;
					}
					*/
					editor.generatecustomminimap(dwgfx, map);
					dwgfx.fademode = 4;
					//load("intro");
				break;
				case 100:
					game.savestats(map, dwgfx);
					fscommand("quit");
				break;
		  }
		}
		
		public function teleport(dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
														 obj:entityclass, help:helpclass, music:musicclass):void {
			//er, ok! Teleport to a new area, so!
			//A general rule of thumb: if you teleport with a companion, get rid of them!
			game.companion = 0;
			
			i = obj.getplayer(); //less likely to have a serious collision error if the player is centered
			obj.entities[i].xp = 150;
			obj.entities[i].yp = 110;
			if(game.teleport_to_x==17 && game.teleport_to_y==17) obj.entities[i].xp = 88; //prevent falling!
			
			if (game.teleportscript == "levelonecomplete") {
				game.teleport_to_x = 2; game.teleport_to_y = 11;
			}else if (game.teleportscript == "gamecomplete") {
				game.teleport_to_x = 2; game.teleport_to_y = 11;
			}
			
			game.gravitycontrol = 0;
			map.gotoroom(100+game.teleport_to_x, 100+game.teleport_to_y, dwgfx, game, obj, music);
			j = obj.getteleporter();
			obj.entities[j].state = 2;
			game.teleport_to_new_area = false;
			
			game.savepoint = obj.entities[j].para;
			game.savex = obj.entities[j].xp + 44; 
			game.savey = obj.entities[j].yp + 44; 
			game.savegc = 0;

			game.saverx = game.roomx; game.savery = game.roomy;  
			game.savedir = obj.entities[obj.getplayer()].dir;		
			
			if(game.teleport_to_x==0 && game.teleport_to_y==0){ game.state = 4020;
			}else if(game.teleport_to_x==0 && game.teleport_to_y==16){ game.state = 4030;
			}else if(game.teleport_to_x==7 && game.teleport_to_y==9){ game.state = 4040;
			}else if(game.teleport_to_x==8 && game.teleport_to_y==11){ game.state = 4050;
			}else if(game.teleport_to_x==14 && game.teleport_to_y==19){ game.state = 4030;
			}else if(game.teleport_to_x==17 && game.teleport_to_y==12){ game.state = 4020;
			}else if(game.teleport_to_x==17 && game.teleport_to_y==17){ game.state = 4020;
			}else if(game.teleport_to_x==18 && game.teleport_to_y==7){ game.state = 4060;
			}else {	game.state = 4010; }
			
			if (game.teleportscript != "") {
				game.state = 0;
				load(game.teleportscript);
				game.teleportscript = "";
			}else{
				//change music based on location
				if (dwgfx.setflipmode && game.teleport_to_x == 11 && game.teleport_to_y == 4) {
					music.niceplay(9);
				}else{
					music.changemusicarea(game.teleport_to_x, game.teleport_to_y);
				}
				if (!game.intimetrial && !game.nodeathmode && !game.inintermission) {
					if (dwgfx.flipmode) {
						dwgfx.createtextbox("    Game Saved    ", -1, 202, 174, 174, 174);
						dwgfx.textboxtimer(25);
					}else{
						dwgfx.createtextbox("    Game Saved    ", -1, 12, 174, 174, 174);
						dwgfx.textboxtimer(25);
					}
					game.savetele(map, obj, music, help);
				}
			}
		}
				
		public function hardreset(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
															obj:entityclass, help:helpclass, music:musicclass):void {
			//Gameclass:
			game.hascontrol = true; 
			game.gravitycontrol = 0; game.teleport = false; game.companion = 0; game.roomchange = false;
			game.teleport_to_new_area = false; game.teleport_to_x = 0; game.teleport_to_y = 0;
			game.teleportscript = "";
			
			game.tapleft = 0; game.tapright = 0;
			game.startscript = false; game.newscript = "";
			game.alarmon = false; game.alarmdelay = 0; game.blackout = false; 
			game.useteleporter = false; game.teleport_to_teleporter = 0;
			
			game.nodeathmode = false; game.nocutscenes = false;
			
			for (i = 0; i < 6; i++) {
				game.crewstats[i] = false;;
			}
			game.crewstats[0] = true;
			game.lastsaved = 0;
			
		  game.deathcounts = 0; game.gameoverdelay = 0;
		  game.frames = 0; game.seconds = 0; game.minutes = 0; game.hours = 0;
			game.gamesaved = false; 
			game.savetime = "00:00"; game.savearea = "nowhere"; game.savetrinkets = 0;
			
			game.intimetrial = false;
      game.timetrialcountdown = 0; game.timetrialshinytarget = 0;
			game.timetrialparlost = false; game.timetrialpar = 0; game.timetrialresulttime = 0;
			
	    game.totalflips = 0;
		  game.hardestroom = "Welcome Aboard"; game.hardestroomdeaths = 0; game.currentroomdeaths=0;
			
			game.swnmode = false; game.swntimer = 0; game.swngame = 0;//Not playing sine wave ninja!
			game.swnstate = 0; game.swnstate2 = 0; game.swnstate3 = 0; game.swnstate4 = 0;  game.swndelay = 0; game.swndeaths = 0;
			game.supercrewmate = false; game.scmhurt = false; game.scmprogress = 0; game.scmmoveme = false;
			game.swncolstate = 0; game.swncoldelay = 0;
			game.swnrank = 0; game.swnmessage = 0;
			game.creditposx = 0; game.creditposy = 0; game.creditposdelay = 0;
			
			game.inintermission = false;
			game.insecretlab = false;
			
			game.state = 0; game.statedelay = 0;
			//dwgraphicsclass
			dwgfx.backgrounddrawn = false;
			dwgfx.textboxremovefast();
			dwgfx.flipmode = false; //This will be reset if needs be elsewhere
			//mapclass
			map.warpx = false; map.warpy = false;
			map.showteleporters = false; map.showtargets = false; map.showtrinkets = false;
			map.finalmode = false; map.finalstretch = false;
			map.finalx = 50; map.finaly = 50;
			map.final_colormode = false; map.final_colorframe = 0; map.final_colorframedelay = 0;
			map.final_mapcol = 0;
			map.final_aniframe = 0; map.final_aniframedelay = 0;
			map.rcol = 0;
			map.resetnames();
			map.custommode=false;
			map.custommodeforreal=false;

			map.customshowmm=true;

			
			for (j = 0; j < 20; j++) {
			  for (i = 0; i < 20; i++) {
				  map.roomdeaths[i] = 0;
				  map.roomdeathsfinal[i] = 0;
				  map.explored[i + (j * 20)] = 0;
				}
			}
			//entityclass
			obj.nearelephant = false;
		  obj.upsetmode = false; obj.upset = 0;
			
			obj.trophytext = 0 ; obj.trophytype = 0;
			obj.altstates = 0;
			
			for (i = 0; i < 100; i++) {
			  obj.flags[i] = false;
			}
			
  for (i = 0; i < 6; i++){
    obj.customcrewmoods[i]=1;
  }

						
			for (i = 0; i < 20; i++) {
				obj.collect[i] = 0;
		obj.customcollect[i] = 0;
			}
			
			if (obj.getplayer() > -1) {
				obj.entities[obj.getplayer()].tile = 0;
			}
			
			//Script Stuff
			position = 0; scriptlength = 0; scriptdelay = 0;
			scriptname = "null"; running = false; 
		}
		
		//Script contents
		public var commands:Array = new Array();
		public var words:Array = new Array();
		public var txt:Array = new Array();
		public var scriptname:String;
		public var position:int, scriptlength:int;
		public var looppoint:int, loopcount:int;
		
		public var scriptdelay:int, running:Boolean;
		public var tempword:String, currentletter:String;
		
		//Textbox stuff
		public var textx:int, texty:int;
		public var r:int, g:int, b:int;
		public var txtnumlines:int;
		
		//Misc
		public var i:int, j:int, k:int;
	}
}