1package {
2	import bigroom.input.KeyPoll;
3	import flash.display.*;
4	import flash.geom.*;
5  import flash.events.*;
6  import flash.net.*;
7
8	public class entityclass extends Sprite {
9		static public var BLOCK:Number = 0;
10    static public var TRIGGER:Number = 1;
11		static public var DAMAGE:Number = 2;
12		static public var DIRECTIONAL:Number = 3;
13		static public var SAFE:Number = 4;
14		static public var ACTIVITY:Number = 5;
15
16		public var opt_useblock:Boolean;
17		public var opt_usetrigger:Boolean;
18		public var opt_usedamage:Boolean;
19		public var opt_usedirectional:Boolean;
20		public var opt_usesafe:Boolean;
21		public var opt_useactivity:Boolean;
22
23		public function init():void {
24			nentity = 0;
25			nblocks = 0;
26			temprect = new Rectangle();
27			temprect2 = new Rectangle();
28			colpoint1 = new Point; colpoint2 = new Point;
29
30			skipdirblocks = false;
31			customplatformtile=0;
32			platformtile = 0; vertplatforms = false; horplatforms = false;
33
34			nearelephant = false;
35		  upsetmode = false; upset = 0;
36
37			trophytext = 0 ; trophytype = 0;
38			altstates = 0;
39
40			for (var i:int = 0; i < 6; i++) {
41				customcrewmoods.push(1);
42			}
43
44			for (i = 0; i < 100; i++) {
45				var t:int = 0; flags.push(t);
46			}
47
48			for (i = 0; i < 500; i++) {
49				var block:blockclass = new blockclass;
50  			blocks.push(block);
51			}
52
53			for (var z:Number = 0; z < 200; z++) {
54				var entity:entclass = new entclass;
55  			entities.push(entity);
56			}
57
58			for (i = 0; i < 20; i++) {
59				var lcross:entclass = new entclass;
60  			linecrosskludge.push(lcross);
61				collect.push(new int);
62        customcollect.push(new int(0));
63			}
64			nlinecrosskludge = 0;
65		}
66
67		public function resetallflags():void {
68			for (var i:Number = 0; i < 100; i++) {
69				flags[i] = 0;
70			}
71		}
72
73		public function resetflags():void {
74			for (var i:Number = 0; i < 100; i++) {
75				if (flags[i] == 2) flags[i] = 0;
76			}
77		}
78
79		public function confirmflags():void {
80			for (var i:Number = 0; i < 100; i++) {
81				if (flags[i] == 2) flags[i] = 1;
82			}
83		}
84
85		public function changecollect(t:int, s:int):void {
86		  collect[t] = s;
87		}
88
89		public function changecustomcollect(t:int, s:int):void {
90		  customcollect[t] = s;
91		}
92
93		public function changeflag(t:int, s:int):void {
94		  flags[t] = s;
95		}
96
97		public function fatal_top():void { createblock(DAMAGE, -8, -8, 384, 16); }
98		public function fatal_bottom():void { createblock(DAMAGE, -8, 224, 384, 16); }
99		public function fatal_left():void { createblock(DAMAGE, -8, -8, 16, 260); }
100		public function fatal_right():void { createblock(DAMAGE, 312, -8, 16, 260); }
101
102		public function setblockcolour(t:int, col:String):void {
103			if (col == "cyan") {      	blocks[t].r = 164; blocks[t].g = 164; blocks[t].b = 255;
104			}else if (col == "red") {	  blocks[t].r = 255; blocks[t].g = 60;  blocks[t].b = 60;
105			}else if (col == "green")  {	blocks[t].r = 144; blocks[t].g = 255; blocks[t].b = 144;
106			}else if (col == "yellow") {	blocks[t].r = 255; blocks[t].g = 255; blocks[t].b = 134;
107			}else if (col == "blue") {  	blocks[t].r = 95;  blocks[t].g = 95;  blocks[t].b = 255;
108			}else if (col == "purple") {	blocks[t].r = 255; blocks[t].g = 134; blocks[t].b = 255;
109			}else if (col == "white") {	  blocks[t].r = 244; blocks[t].g = 244; blocks[t].b = 244;
110			}else if (col == "gray") {	  blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174;
111			}else if (col == "orange") {	  blocks[t].r = 255; blocks[t].g = 130;  blocks[t].b = 20;
112			}else {
113				//use a gray
114				blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174;
115			}
116		}
117
118		public function swncolour(t:int):int {
119			//given colour t, return colour in setcol
120			if (t == 0) return 11;
121			if (t == 1) return 6;
122			if (t == 2) return 8;
123			if (t == 3) return 12;
124			if (t == 4) return 9;
125			if (t == 5) return 7;
126			return 0;
127		}
128
129		public function swnenemiescol(t:int):void {
130			//change the colour of all SWN enemies to the current one
131			for (i = 0; i < nentity; i++) {
132				if (entities[i].active) {
133					if (entities[i].type == 23) {
134						entities[i].colour = swncolour(t);
135					}
136				}
137			}
138		}
139
140		public function gravcreate(game:gameclass, ypos:int, dir:int, xoff:int = 0, yoff:int = 0):void {
141			if (dir == 0) {
142				createentity(game, -150 - xoff, 58 + (ypos * 20)+yoff, 23, 0, 0);
143			}else{
144			  createentity(game, 320+150 + xoff, 58 + (ypos * 20)+yoff, 23, 1, 0);
145			}
146		}
147
148		public function generateswnwave(game:gameclass, help:helpclass, t:int):void {
149			//generate a wave for the SWN game
150			if(game.swndelay<=0){
151				if (t == 0) { //game 0, survive for 30 seconds
152					switch(game.swnstate) {
153						case 0:
154						  //Decide on a wave here
155							//default case
156							game.swnstate = 1; game.swndelay = 5;
157
158              if (game.swntimer <= 150) { //less than 5 seconds
159							  game.swnstate = 9; game.swndelay = 8;
160							}else	if (game.swntimer <= 300) { //less than 10 seconds
161							  game.swnstate = 6; game.swndelay = 12;
162							}else	if (game.swntimer <= 360) { //less than 12 seconds
163							  game.swnstate = 5+game.swnstate2; game.swndelay = 15;
164							}else	if (game.swntimer <= 420) { //less than 14 seconds
165							  game.swnstate = 7+game.swnstate2; game.swndelay = 15;
166							}else	if (game.swntimer <= 480) { //less than 16 seconds
167							  game.swnstate = 5+game.swnstate2; game.swndelay = 15;
168							}else	if (game.swntimer <= 540) { //less than 18 seconds
169							  game.swnstate = 7+game.swnstate2; game.swndelay = 15;
170							}else	if (game.swntimer <= 600) { //less than 20 seconds
171							  game.swnstate = 5+game.swnstate2; game.swndelay = 15;
172							}else	if (game.swntimer <= 900) { //less than 30 seconds
173							  game.swnstate = 4; game.swndelay = 20;
174							}else	if (game.swntimer <= 1050) { //less than 35 seconds
175							  game.swnstate = 3; game.swndelay = 10;
176							}else	if (game.swntimer <= 1200) { //less than 40 seconds
177							  game.swnstate = 3; game.swndelay = 20;
178							}else	if (game.swntimer <= 1500) { //less than 50 seconds
179							  game.swnstate = 2; game.swndelay = 10;
180						  }else	if (game.swntimer <= 1650) { //less than 55 seconds
181							  game.swnstate = 1; game.swndelay = 15;
182							}else	if (game.swntimer <= 1800) { //less than 60 seconds
183							  game.swnstate = 1; game.swndelay = 25;
184							}
185
186							if (game.deathcounts - game.swndeaths > 7) game.swndelay += 2;
187							if (game.deathcounts - game.swndeaths > 15) game.swndelay += 2;
188							if (game.deathcounts - game.swndeaths > 25) game.swndelay += 4;
189						break;
190						case 1:
191					    createentity(game, -150, 58 + (int(Math.random() * 6) * 20), 23, 0, 0);
192						  game.swnstate = 0; game.swndelay = 0; //return to decision state
193						break;
194						case 2:
195						  if(game.swnstate3==0){
196								game.swnstate2++;
197								if (game.swnstate2 >= 6) {
198									game.swnstate3 = 1;
199									game.swnstate2--;
200								}
201							}else {
202								game.swnstate2--;
203								if (game.swnstate2 < 0) {
204									game.swnstate3 = 0;
205									game.swnstate2++;
206								}
207							}
208					    createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0);
209						  game.swnstate = 0; game.swndelay = 0; //return to decision state
210						break;
211						case 3:
212					    createentity(game, 320+150, 58 + (int(Math.random() * 6) * 20), 23, 1, 0);
213						  game.swnstate = 0; game.swndelay = 0; //return to decision state
214						break;
215						case 4:
216						  //left and right compliments
217							game.swnstate2 = int(Math.random() * 6);
218					    createentity(game, -150, 58 + (game.swnstate2  * 20), 23, 0, 0);
219					    createentity(game, 320+150, 58 + ((5-game.swnstate2) * 20), 23, 1, 0);
220						  game.swnstate = 0; game.swndelay = 0; //return to decision state
221							game.swnstate2 = 0;
222						break;
223						case 5:
224						  //Top and bottom
225					    createentity(game, -150, 58, 23, 0, 0);
226					    createentity(game, -150, 58 + (5 * 20), 23, 0, 0);
227						  game.swnstate = 0; game.swndelay = 0; //return to decision state
228							game.swnstate2 = 1;
229						break;
230						case 6:
231						  //Middle
232					    createentity(game, -150, 58 + (2 * 20), 23, 0, 0);
233					    createentity(game, -150, 58 + (3 * 20), 23, 0, 0);
234						  game.swnstate = 0; game.swndelay = 0; //return to decision state
235							game.swnstate2 = 0;
236						break;
237						case 7:
238						  //Top and bottom
239					    createentity(game, 320+150, 58, 23, 1, 0);
240					    createentity(game, 320+150, 58 + (5 * 20), 23, 1, 0);
241						  game.swnstate = 0; game.swndelay = 0; //return to decision state
242							game.swnstate2 = 1;
243						break;
244						case 8:
245						  //Middle
246					    createentity(game, 320+150, 58 + (2 * 20), 23, 1, 0);
247					    createentity(game, 320+150, 58 + (3 * 20), 23, 1, 0);
248						  game.swnstate = 0; game.swndelay = 0; //return to decision state
249							game.swnstate2 = 0;
250						break;
251						case 9:
252						  if(game.swnstate3==0){
253								game.swnstate2++;
254								if (game.swnstate2 >= 6) {
255									game.swnstate3 = 1;
256									game.swnstate2--;
257								}
258							}else {
259								game.swnstate2--;
260								if (game.swnstate2 < 0) {
261									game.swnstate3 = 0;
262									game.swnstate2++;
263								}
264							}
265  					  createentity(game, 320 + 150, 58 + (int(game.swnstate2) * 20), 23, 1, 0);
266						  game.swnstate = 0; game.swndelay = 0; //return to decision state
267						break;
268					}
269				}else if (t == 1) {
270					//Game 2, super gravitron
271					switch(game.swnstate) {
272						case 0:
273						  //Choose either simple or filler
274							game.swnstate2 = 0; game.swnstate3 = 0; game.swnstate4 = 0;
275
276							game.swnstate2 = int(Math.random() * 100);
277							if (game.swnstate2 < 25) {
278								//simple
279								game.swnstate = 2; game.swndelay = 0;
280							}else {
281								//filler
282								game.swnstate = 4; game.swndelay = 0;
283							}
284							game.swnstate2 = 0;
285						break;
286						case 1:
287						  //complex chain
288							game.swnstate2 = int(Math.random() * 8);
289							if (game.swnstate2 == 0) { game.swnstate = 10; game.swndelay = 0;
290							}else if (game.swnstate2 == 1) { game.swnstate = 12; game.swndelay = 0;
291							}else if (game.swnstate2 == 2) { game.swnstate = 14; game.swndelay = 0;
292							}else if (game.swnstate2 == 3) { game.swnstate = 20; game.swndelay = 0;
293							}else if (game.swnstate2 == 4) { game.swnstate = 21; game.swndelay = 0;
294							}else if (game.swnstate2 == 5) { game.swnstate = 22; game.swndelay = 0;
295							}else if (game.swnstate2 == 6) { game.swnstate = 22; game.swndelay = 0;
296							}else if (game.swnstate2 == 7) { game.swnstate = 14; game.swndelay = 0;
297							}
298
299							game.swnstate2 = 0;
300						break;
301						case 2:
302						  //simple chain
303							game.swnstate2 = int(Math.random() * 6);
304							if (game.swnstate2 == 0) { game.swnstate = 23; game.swndelay = 0;
305							}else if (game.swnstate2 == 1) { game.swnstate = 24; game.swndelay = 0;
306							}else if (game.swnstate2 == 2) { game.swnstate = 25; game.swndelay = 0;
307							}else if (game.swnstate2 == 3) { game.swnstate = 26; game.swndelay = 0;
308							}else if (game.swnstate2 == 4) { game.swnstate = 27; game.swndelay = 0;
309							}else if (game.swnstate2 == 5) { game.swnstate = 14; game.swndelay = 0;
310							}
311
312							game.swnstate2 = 0;
313						break;
314						case 3:
315						  //Choose a major action
316							game.swnstate2 = int(Math.random() * 100);
317							if (game.swnstate2 < 25) {
318								//complex
319								game.swnstate = 1; game.swndelay = 0;
320							}else {
321								//simple
322								game.swnstate = 2; game.swndelay = 0;
323							}
324						break;
325						case 4:
326						  //filler chain
327							game.swnstate2 = int(Math.random() * 6);
328							if (game.swnstate2 == 0) { game.swnstate = 28; game.swndelay = 0;
329							}else if (game.swnstate2 == 1) { game.swnstate = 29; game.swndelay = 0;
330							}else if (game.swnstate2 == 2) { game.swnstate = 28; game.swndelay = 0;
331							}else if (game.swnstate2 == 3) { game.swnstate = 29; game.swndelay = 0;
332							}else if (game.swnstate2 == 4) { game.swnstate = 30; game.swndelay = 0;
333							}else if (game.swnstate2 == 5) { game.swnstate = 31; game.swndelay = 0;
334							}
335
336							game.swnstate2 = 0;
337						break;
338						case 10:
339						  gravcreate(game, 0, 0);
340							gravcreate(game, 1, 0);
341							gravcreate(game, 2, 0);
342						  game.swnstate++; game.swndelay = 10; //return to decision state
343						break;
344						case 11:
345						  gravcreate(game, 3, 0);
346							gravcreate(game, 4, 0);
347							gravcreate(game, 5, 0);
348							game.swnstate2++;
349							if(game.swnstate2==3){
350						    game.swnstate = 0; game.swndelay = 30; //return to decision state
351							}else {
352								game.swnstate--; game.swndelay = 10; //return to decision state
353							}
354						break;
355						case 12:
356						  gravcreate(game, 0, 1);
357							gravcreate(game, 1, 1);
358							gravcreate(game, 2, 1);
359						  game.swnstate++; game.swndelay = 10; //return to decision state
360						break;
361						case 13:
362						  gravcreate(game, 3, 1);
363							gravcreate(game, 4, 1);
364							gravcreate(game, 5, 1);
365							game.swnstate2++;
366							if(game.swnstate2==3){
367						    game.swnstate = 0; game.swndelay = 30; //return to decision state
368							}else {
369								game.swnstate--; game.swndelay = 10; //return to decision state
370							}
371						break;
372						case 14:
373						  gravcreate(game, 0, 0, 0);
374							gravcreate(game, 5, 1, 0);
375
376						  game.swnstate++; game.swndelay = 20; //return to decision state
377						break;
378						case 15:
379							gravcreate(game, 1, 0);
380							gravcreate(game, 4, 1);
381
382						  game.swnstate++; game.swndelay = 20; //return to decision state
383						break;
384						case 16:
385							gravcreate(game, 2, 0);
386							gravcreate(game, 3, 1);
387
388						  game.swnstate++; game.swndelay = 20; //return to decision state
389						break;
390						case 17:
391							gravcreate(game, 3, 0);
392							gravcreate(game, 2, 1);
393
394						  game.swnstate++; game.swndelay = 20; //return to decision state
395						break;
396						case 18:
397							gravcreate(game, 4, 0);
398							gravcreate(game, 1, 1);
399
400						  game.swnstate++; game.swndelay = 20; //return to decision state
401						break;
402						case 19:
403							gravcreate(game, 5, 0);
404							gravcreate(game, 0, 1);
405
406						  game.swnstate=0; game.swndelay = 20; //return to decision state
407						break;
408						case 20:
409						  game.swnstate4++;
410						  if(game.swnstate3==0){
411								game.swnstate2++;
412								if (game.swnstate2 >= 6) {
413									game.swnstate3 = 1;
414									game.swnstate2--;
415								}
416							}else {
417								game.swnstate2--;
418								if (game.swnstate2 < 0) {
419									game.swnstate3 = 0;
420									game.swnstate2++;
421								}
422							}
423					    createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0);
424							if(game.swnstate4<=6){
425						    game.swnstate = 20; game.swndelay = 10; //return to decision state
426							}else {
427								game.swnstate = 0; game.swndelay = 10; //return to decision state
428							}
429						break;
430						case 21:
431						  game.swnstate4++;
432						  if(game.swnstate3==0){
433								game.swnstate2++;
434								if (game.swnstate2 >= 6) {
435									game.swnstate3 = 1;
436									game.swnstate2--;
437								}
438							}else {
439								game.swnstate2--;
440								if (game.swnstate2 < 0) {
441									game.swnstate3 = 0;
442									game.swnstate2++;
443								}
444							}
445					    createentity(game, 320+150, 58 + (int(game.swnstate2) * 20), 23, 1, 0);
446							if(game.swnstate4<=6){
447						    game.swnstate = 21; game.swndelay = 10; //return to decision state
448							}else {
449								game.swnstate = 0; game.swndelay = 10; //return to decision state
450							}
451						break;
452						case 22:
453						  game.swnstate4++;
454						  //left and right compliments
455							game.swnstate2 = int(Math.random() * 6);
456					    createentity(game, -150, 58 + (game.swnstate2  * 20), 23, 0, 0);
457					    createentity(game, 320 + 150, 58 + ((5 - game.swnstate2) * 20), 23, 1, 0);
458							if(game.swnstate4<=12){
459						    game.swnstate = 22; game.swndelay = 18; //return to decision state
460							}else {
461								game.swnstate = 0; game.swndelay = 18; //return to decision state
462							}
463							game.swnstate2 = 0;
464						break;
465						case 23:
466							gravcreate(game, 1, 0);
467							gravcreate(game, 2, 0, 15);
468							gravcreate(game, 2, 0, -15);
469							gravcreate(game, 3, 0, 15);
470							gravcreate(game, 3, 0, -15);
471							gravcreate(game, 4, 0);
472						  game.swnstate = 0; game.swndelay = 15; //return to decision state
473						break;
474						case 24:
475							gravcreate(game, 1, 1);
476							gravcreate(game, 2, 1, 15);
477							gravcreate(game, 2, 1, -15);
478							gravcreate(game, 3, 1, 15);
479							gravcreate(game, 3, 1, -15);
480							gravcreate(game, 4, 1);
481						  game.swnstate = 0; game.swndelay = 15; //return to decision state
482						break;
483						case 25:
484							gravcreate(game, 0, 0);
485							gravcreate(game, 1, 1,0,10);
486							gravcreate(game, 4, 1,0,-10);
487							gravcreate(game, 5, 0);
488						  game.swnstate = 0; game.swndelay = 20; //return to decision state
489						break;
490						case 26:
491							gravcreate(game, 0, 1, 0);
492							gravcreate(game, 1, 1, 10);
493							gravcreate(game, 4, 1, 40);
494							gravcreate(game, 5, 1, 50);
495						  game.swnstate = 0; game.swndelay = 20; //return to decision state
496						break;
497						case 27:
498							gravcreate(game, 0, 0, 0);
499							gravcreate(game, 1, 0, 10);
500							gravcreate(game, 4, 0, 40);
501							gravcreate(game, 5, 0, 50);
502						  game.swnstate = 0; game.swndelay = 20; //return to decision state
503						break;
504						case 28:
505						  game.swnstate4++;
506						  game.swnstate2 = int(Math.random() * 6);
507					    createentity(game, -150, 58 + (game.swnstate2  * 20), 23, 0, 0);
508							if(game.swnstate4<=6){
509						    game.swnstate = 28; game.swndelay = 8; //return to decision state
510							}else {
511								game.swnstate = 3; game.swndelay = 15; //return to decision state
512							}
513							game.swnstate2 = 0;
514						break;
515						case 29:
516						  game.swnstate4++;
517						  game.swnstate2 = int(Math.random() * 6);
518							gravcreate(game, game.swnstate2, 1);
519							if(game.swnstate4<=6){
520						    game.swnstate = 29; game.swndelay = 8; //return to decision state
521							}else {
522								game.swnstate = 3; game.swndelay = 15; //return to decision state
523							}
524							game.swnstate2 = 0;
525						break;
526						case 30:
527						  game.swnstate4++;
528						  game.swnstate2 = int(Math.random() * 3);
529							gravcreate(game, game.swnstate2, 0);
530							gravcreate(game, 5-game.swnstate2, 0);
531							if(game.swnstate4<=2){
532						    game.swnstate = 30; game.swndelay = 14; //return to decision state
533							}else {
534								game.swnstate = 3; game.swndelay = 15; //return to decision state
535							}
536							game.swnstate2 = 0;
537						break;
538						case 31:
539						  game.swnstate4++;
540						  game.swnstate2 = int(Math.random() * 3);
541							gravcreate(game, game.swnstate2, 1);
542							gravcreate(game, 5-game.swnstate2, 1);
543							if(game.swnstate4<=2){
544						    game.swnstate = 31; game.swndelay = 14; //return to decision state
545							}else {
546								game.swnstate = 3; game.swndelay = 15; //return to decision state
547							}
548							game.swnstate2 = 0;
549						break;
550					}
551				}
552			}else {
553				game.swndelay--;
554			}
555		}
556
557		public function createblock(t:int, xp:int=0, yp:int=0, w:int=0, h:int=0, trig:int=0):void{
558			if(nblocks == 0) {
559				//If there are no active blocks, Z=0;
560				k = 0; nblocks++;
561			}else {
562				i = 0; k = -1;
563				while (i < nblocks) {
564					if (!blocks[i].active) {
565						k = i; i = nblocks;
566					}
567					i++;
568				}
569				if (k == -1) {
570					k = nblocks;
571					nblocks++;
572				}
573			}
574
575			blocks[k].clear();
576			blocks[k].active = true;
577			switch(t) {
578				case BLOCK: //Block
579					 blocks[k].type = BLOCK;
580					 blocks[k].xp = xp;
581					 blocks[k].yp = yp;
582					 blocks[k].wp = w;
583					 blocks[k].hp = h;
584					 blocks[k].rectset(xp, yp, w, h);
585
586					 opt_useblock = true;
587				break;
588				case TRIGGER: //Trigger
589					 blocks[k].type = TRIGGER;
590					 blocks[k].x = xp;
591					 blocks[k].y = yp;
592					 blocks[k].wp = w;
593					 blocks[k].hp = h;
594					 blocks[k].rectset(xp, yp, w, h);
595					 blocks[k].trigger = trig;
596
597					 opt_usetrigger = true;
598				break;
599				case DAMAGE: //Damage
600					 blocks[k].type = DAMAGE;
601					 blocks[k].x = xp;
602					 blocks[k].y = yp;
603					 blocks[k].wp = w;
604					 blocks[k].hp = h;
605					 blocks[k].rectset(xp, yp, w, h);
606
607					 opt_usedamage = true;
608				break;
609				case DIRECTIONAL: //Directional
610					 blocks[k].type = DIRECTIONAL;
611					 blocks[k].x = xp;
612					 blocks[k].y = yp;
613					 blocks[k].wp = w;
614					 blocks[k].hp = h;
615					 blocks[k].rectset(xp, yp, w, h);
616					 blocks[k].trigger = trig;
617
618					 opt_usedirectional = true;
619				break;
620				case SAFE: //Safe block
621					 blocks[k].type = SAFE;
622					 blocks[k].xp = xp;
623					 blocks[k].yp = yp;
624					 blocks[k].wp = w;
625					 blocks[k].hp = h;
626					 blocks[k].rectset(xp, yp, w, h);
627
628					 opt_usesafe = true;
629				break;
630				case ACTIVITY: //Activity Zone
631					blocks[k].type = ACTIVITY;
632					blocks[k].x = xp;
633					blocks[k].y = yp;
634					blocks[k].wp = w;
635					blocks[k].hp = h;
636					blocks[k].rectset(xp, yp, w, h);
637
638					opt_useactivity = true;
639
640					//Ok, each and every activity zone in the game is initilised here. "Trig" in this case is a variable that
641					//assigns all the details.
642					switch(trig) {
643						case 0: //testing zone
644						  blocks[k].prompt = "Press ENTER to explode";
645							if(mobilemenus) blocks[k].prompt = "Explode";
646						  blocks[k].script = "intro";
647							setblockcolour(k, "orange");
648						  trig=1;
649						break;
650						case 1:
651						  blocks[k].prompt = "Press ENTER to talk to Violet";
652							if(mobilemenus) blocks[k].prompt = "Talk to Violet";
653						  blocks[k].script = "talkpurple";
654							setblockcolour(k, "purple");
655						  trig=0;
656						break;
657						case 2:
658						  blocks[k].prompt = "Press ENTER to talk to Vitellary";
659							if(mobilemenus) blocks[k].prompt = "Talk to Vitellary";
660						  blocks[k].script = "talkyellow";
661							setblockcolour(k, "yellow");
662						  trig=0;
663						break;
664						case 3:
665						  blocks[k].prompt = "Press ENTER to talk to Vermilion";
666							if(mobilemenus) blocks[k].prompt = "Talk to Vermilion";
667						  blocks[k].script = "talkred";
668							setblockcolour(k, "red");
669						  trig=0;
670						break;
671						case 4:
672						  blocks[k].prompt = "Press ENTER to talk to Verdigris";
673							if(mobilemenus) blocks[k].prompt = "Talk to Verdigris";
674						  blocks[k].script = "talkgreen";
675							setblockcolour(k, "green");
676						  trig=0;
677						break;
678						case 5:
679						  blocks[k].prompt = "Press ENTER to talk to Victoria";
680							if(mobilemenus) blocks[k].prompt = "Talk to Victoria";
681						  blocks[k].script = "talkblue";
682							setblockcolour(k, "blue");
683						  trig=0;
684						break;
685						case 6:
686						  blocks[k].prompt = "Press ENTER to activate terminal";
687							if(mobilemenus) blocks[k].prompt = "Activate terminal";
688						  blocks[k].script = "terminal_station_1";
689							setblockcolour(k, "orange");
690						  trig=0;
691						break;
692						case 7:
693						  blocks[k].prompt = "Press ENTER to activate terminal";
694							if(mobilemenus) blocks[k].prompt = "Activate terminal";
695						  blocks[k].script = "terminal_outside_1";
696							setblockcolour(k, "orange");
697						  trig=0;
698						break;
699						case 8:
700						  blocks[k].prompt = "Press ENTER to activate terminal";
701							if(mobilemenus) blocks[k].prompt = "Activate terminal";
702						  blocks[k].script = "terminal_outside_2";
703							setblockcolour(k, "orange");
704						  trig=0;
705						break;
706						case 9:
707						  blocks[k].prompt = "Press ENTER to activate terminal";
708							if(mobilemenus) blocks[k].prompt = "Activate terminal";
709						  blocks[k].script = "terminal_outside_3";
710							setblockcolour(k, "orange");
711						  trig=0;
712						break;
713						case 10:
714						  blocks[k].prompt = "Press ENTER to activate terminal";
715							if(mobilemenus) blocks[k].prompt = "Activate terminal";
716						  blocks[k].script = "terminal_outside_4";
717							setblockcolour(k, "orange");
718						  trig=0;
719						break;
720						case 11:
721						  blocks[k].prompt = "Press ENTER to activate terminal";
722							if(mobilemenus) blocks[k].prompt = "Activate terminal";
723						  blocks[k].script = "terminal_outside_5";
724							setblockcolour(k, "orange");
725						  trig=0;
726						break;
727						case 12:
728						  blocks[k].prompt = "Press ENTER to activate terminal";
729							if(mobilemenus) blocks[k].prompt = "Activate terminal";
730						  blocks[k].script = "terminal_outside_6";
731							setblockcolour(k, "orange");
732						  trig=0;
733						break;
734						case 13:
735						  blocks[k].prompt = "Press ENTER to activate terminal";
736							if(mobilemenus) blocks[k].prompt = "Activate terminal";
737						  blocks[k].script = "terminal_finallevel";
738							setblockcolour(k, "orange");
739						  trig=0;
740						break;
741						case 14:
742						  blocks[k].prompt = "Press ENTER to activate terminal";
743							if(mobilemenus) blocks[k].prompt = "Activate terminal";
744						  blocks[k].script = "terminal_station_2";
745							setblockcolour(k, "orange");
746						  trig=0;
747						break;
748						case 15:
749						  blocks[k].prompt = "Press ENTER to activate terminal";
750							if(mobilemenus) blocks[k].prompt = "Activate terminal";
751						  blocks[k].script = "terminal_station_3";
752							setblockcolour(k, "orange");
753						  trig=0;
754						break;
755						case 16:
756						  blocks[k].prompt = "Press ENTER to activate terminal";
757							if(mobilemenus) blocks[k].prompt = "Activate terminal";
758						  blocks[k].script = "terminal_station_4";
759							setblockcolour(k, "orange");
760						  trig=0;
761						break;
762						case 17:
763						  blocks[k].prompt = "Press ENTER to activate terminal";
764							if(mobilemenus) blocks[k].prompt = "Activate terminal";
765						  blocks[k].script = "terminal_warp_1";
766							setblockcolour(k, "orange");
767						  trig=0;
768						break;
769						case 18:
770						  blocks[k].prompt = "Press ENTER to activate terminal";
771							if(mobilemenus) blocks[k].prompt = "Activate terminal";
772						  blocks[k].script = "terminal_warp_2";
773							setblockcolour(k, "orange");
774						  trig=0;
775						break;
776						case 19:
777						  blocks[k].prompt = "Press ENTER to activate terminal";
778							if(mobilemenus) blocks[k].prompt = "Activate terminal";
779						  blocks[k].script = "terminal_lab_1";
780							setblockcolour(k, "orange");
781						  trig=0;
782						break;
783						case 20:
784						  blocks[k].prompt = "Press ENTER to activate terminal";
785							if(mobilemenus) blocks[k].prompt = "Activate terminal";
786						  blocks[k].script = "terminal_lab_2";
787							setblockcolour(k, "orange");
788						  trig=0;
789						break;
790						case 21:
791						  blocks[k].prompt = "Press ENTER to activate terminal";
792							if(mobilemenus) blocks[k].prompt = "Activate terminal";
793						  blocks[k].script = "terminal_secretlab";
794							setblockcolour(k, "orange");
795						  trig=0;
796						break;
797						case 22:
798						  blocks[k].prompt = "Press ENTER to activate terminal";
799							if(mobilemenus) blocks[k].prompt = "Activate terminal";
800						  blocks[k].script = "terminal_shipcomputer";
801							setblockcolour(k, "orange");
802						  trig=0;
803						break;
804						case 23:
805						  blocks[k].prompt = "Press ENTER to activate terminals";
806							if(mobilemenus) blocks[k].prompt = "Activate terminals";
807						  blocks[k].script = "terminal_radio";
808							setblockcolour(k, "orange");
809						  trig=0;
810						break;
811						case 24:
812						  blocks[k].prompt = "Press ENTER to activate terminal";
813							if(mobilemenus) blocks[k].prompt = "Activate terminal";
814						  blocks[k].script = "terminal_jukebox";
815							setblockcolour(k, "orange");
816						  trig=0;
817						break;
818						case 25:
819						  blocks[k].prompt = "Passion for exploring";
820						  blocks[k].script = "terminal_juke1";
821							setblockcolour(k, "orange");
822						  trig=0;
823						break;
824						case 26:
825						  blocks[k].prompt = "Pushing onwards";
826						  blocks[k].script = "terminal_juke2";
827							setblockcolour(k, "orange");
828						  trig=0;
829						break;
830						case 27:
831						  blocks[k].prompt = "Positive force";
832						  blocks[k].script = "terminal_juke3";
833							setblockcolour(k, "orange");
834						  trig=0;
835						break;
836						case 28:
837						  blocks[k].prompt = "Presenting VVVVVV";
838						  blocks[k].script = "terminal_juke4";
839							setblockcolour(k, "orange");
840						  trig=0;
841						break;
842						case 29:
843						  blocks[k].prompt = "Potential for anything";
844						  blocks[k].script = "terminal_juke5";
845							setblockcolour(k, "orange");
846						  trig=0;
847						break;
848						case 30:
849						  blocks[k].prompt = "Predestined fate";
850						  blocks[k].script = "terminal_juke6";
851							setblockcolour(k, "orange");
852						  trig=0;
853						break;
854						case 31:
855						  blocks[k].prompt = "Pipe Dream";
856						  blocks[k].script = "terminal_juke7";
857							setblockcolour(k, "orange");
858						  trig=0;
859						break;
860						case 32:
861						  blocks[k].prompt = "Popular Potpourri";
862						  blocks[k].script = "terminal_juke8";
863							setblockcolour(k, "orange");
864						  trig=0;
865						break;
866						case 33:
867						  blocks[k].prompt = "Pressure Cooker";
868						  blocks[k].script = "terminal_juke9";
869							setblockcolour(k, "orange");
870						  trig=0;
871						break;
872						case 34:
873						  blocks[k].prompt = "ecrof evitisoP";
874						  blocks[k].script = "terminal_juke10";
875							setblockcolour(k, "orange");
876						  trig=0;
877						break;
878						case 35:
879							blocks[k].prompt = "Press ENTER to activate terminal";
880							if(mobilemenus) blocks[k].prompt = "Activate terminal";
881							blocks[k].script = "custom_"+customscript;
882							setblockcolour(k, "orange");
883							trig=0;
884            break;
885					}
886				break;
887			}
888		}
889
890		public function removeallblocks():void{
891			for(i=0; i<nblocks; i++) blocks[i].clear();
892			nblocks=0;
893		}
894
895		public function removeblock(t:int):void {
896			blocks[t].clear();
897		}
898
899		public function removeblockat(x:int, y:int):void{
900			for (i = 0; i < nblocks; i++) {
901				if(blocks[i].xp == int(x) && blocks[i].yp == int(y)) removeblock(i);
902			}
903		}
904
905		public function removetrigger(t:int):void{
906			for(i=0; i<nblocks; i++){
907				if(blocks[i].type == TRIGGER) {
908					if (blocks[i].trigger == t) {
909						blocks[i].active = false;
910						removeblock(i);
911					}
912				}
913			}
914		}
915
916		public function copylinecross(t:int):void {
917			//Copy entity t into the first free linecrosskludge entity
918			linecrosskludge[nlinecrosskludge].clear();
919			linecrosskludge[nlinecrosskludge].xp = entities[t].xp;
920			linecrosskludge[nlinecrosskludge].yp = entities[t].yp;
921			linecrosskludge[nlinecrosskludge].w = entities[t].w;
922			linecrosskludge[nlinecrosskludge].onentity = entities[t].onentity;
923			linecrosskludge[nlinecrosskludge].state = entities[t].state;
924			linecrosskludge[nlinecrosskludge].life = entities[t].life;
925			nlinecrosskludge++;
926		}
927
928		public function revertlinecross(t:int, s:int):void {
929			//Restore entity t info from linecrossing s
930			entities[t].onentity = linecrosskludge[s].onentity;
931			entities[t].state = linecrosskludge[s].state;
932			entities[t].life = linecrosskludge[s].life;
933		}
934
935		public function gridmatch(p1:int, p2:int, p3:int, p4:int, p11:int, p21:int, p31:int, p41:int):Boolean {
936			if (p1 == p11 && p2 == p21 && p3 == p31 && p4 == p41) return true;
937			return false;
938		}
939
940		public function crewcolour(t:int):int {
941			//Return the colour of the indexed crewmate
942			switch(t) {
943				case 0: return 0; break;
944				case 1: return 20; break;
945				case 2: return 14; break;
946				case 3: return 15; break;
947				case 4: return 13; break;
948				case 5: return 16; break;
949			}
950			return 0;
951		}
952
953
954		public function setenemyroom(t:int, rx:int, ry:int):void {
955		  //Simple function to initilise simple enemies
956			rx -= 100; ry -= 100;
957			switch(rn(rx, ry)) {
958				//Space Station 1
959				case rn(12, 3):  //Security Drone
960				 	entities[t].tile = 36; entities[t].colour = 8; entities[t].animate = 1;
961				break;
962				case rn(13, 3):  //Wavelengths
963				  entities[t].tile = 32; entities[t].colour = 7; 	entities[t].animate = 1;
964					entities[t].w = 32;
965				break;
966				case rn(15, 3):  //Traffic
967				  entities[t].tile = 28; entities[t].colour = 6; entities[t].animate = 1;
968					entities[t].w = 22;	entities[t].h = 32;
969				break;
970				case rn(12, 5):  //The Yes Men
971				  entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1;
972					entities[t].w = 20;	entities[t].h = 20;
973				break;
974				case rn(13, 6):  //Hunchbacked Guards
975				  entities[t].tile = 44; entities[t].colour = 8;	entities[t].animate = 1;
976					entities[t].w = 16;	entities[t].h = 20;
977				break;
978				case rn(13, 4):  //Communication Station
979				  entities[t].harmful = false;
980					if (entities[t].xp == 256) {
981						//transmittor
982						entities[t].tile = 104; entities[t].colour = 4; entities[t].animate = 7;
983						entities[t].w = 16;	entities[t].h = 16;
984						entities[t].xp -= 24; entities[t].yp -= 16;
985					}else {
986						//radar dish
987						entities[t].tile =124; entities[t].colour = 4;	entities[t].animate = 6;
988						entities[t].w = 32;	entities[t].h = 32; entities[t].cx = 4; entities[t].size = 9;
989						entities[t].xp -= 4; entities[t].yp -= 32;
990					}
991
992				break;
993				//The Lab
994				case rn(4, 0):
995				  entities[t].tile = 78; entities[t].colour = 7;	entities[t].animate = 1;
996					entities[t].w = 16;	entities[t].h = 16;
997				break;
998				case rn(2, 0):
999				  entities[t].tile = 88; entities[t].colour = 11;	entities[t].animate = 1;
1000					entities[t].w = 16;	entities[t].h = 16;
1001				break;
1002				//Space Station 2
1003				case rn(14, 11): entities[t].colour = 17;	break; //Lies
1004				case rn(16, 11): entities[t].colour = 8;	break; //Lies
1005				case rn(13, 10): entities[t].colour = 11;	break; //Factory
1006				case rn(13, 9): entities[t].colour = 9;	break; //Factory
1007				case rn(13, 8): entities[t].colour = 8;	break; //Factory
1008				case rn(11, 13): //Truth
1009				  entities[t].tile = 64; entities[t].colour = 7;	entities[t].animate = 100;
1010					entities[t].w = 44;	entities[t].h = 10; entities[t].size = 10;
1011				break;
1012				case rn(17, 7): //Brass sent us under the top
1013				  entities[t].tile =82; entities[t].colour = 8;	entities[t].animate = 5;
1014					entities[t].w = 28;	entities[t].h = 32; entities[t].cx = 4;
1015				break;
1016				case rn(10, 7): // (deception)
1017				  entities[t].tile = 92; entities[t].colour = 6;	entities[t].animate = 1;
1018					entities[t].w = 16;	entities[t].h = 16;
1019				break;
1020				case rn(14, 13): // (chose poorly)
1021				  entities[t].tile = 56; entities[t].colour = 6;	entities[t].animate = 1;
1022					entities[t].w = 15;	entities[t].h = 24;
1023				break;
1024				case rn(13, 12): // (backsliders)
1025				  entities[t].tile = 164; entities[t].colour = 7;	entities[t].animate = 1;
1026					entities[t].w = 16;	entities[t].h = 16;
1027				break;
1028				case rn(14, 8): // (wheel of fortune room)
1029				  entities[t].tile = 116; entities[t].colour = 12;	entities[t].animate = 1;
1030					entities[t].w = 32;	entities[t].h = 32;
1031				break;
1032				case rn(16, 9): // (seeing dollar signs)
1033				  entities[t].tile = 68; entities[t].colour = 7;	entities[t].animate = 1;
1034					entities[t].w = 16;	entities[t].h = 16;
1035				break;
1036				case rn(16, 7): // (tomb of mad carew)
1037				  entities[t].tile = 106; entities[t].colour = 7;	entities[t].animate = 2;
1038					entities[t].w = 24;	entities[t].h = 25;
1039				break;
1040				//Warp Zone
1041				case rn(15, 2): // (numbers)
1042				  entities[t].tile = 100; entities[t].colour = 6;	entities[t].animate = 1;
1043					entities[t].w = 32;	entities[t].h = 14; entities[t].yp += 1;
1044				break;
1045				case rn(16, 2): // (Manequins)
1046				  entities[t].tile = 52; entities[t].colour = 7;	entities[t].animate = 5;
1047					entities[t].w = 16;	entities[t].h = 25; entities[t].yp -= 4;
1048				break;
1049				case rn(18, 0): // (Obey)
1050				  entities[t].tile = 51; entities[t].colour = 11;	entities[t].animate = 100;
1051					entities[t].w = 30;	entities[t].h = 14;
1052				break;
1053				case rn(19, 1): // Ascending and Descending
1054				  entities[t].tile = 48; entities[t].colour = 9;	entities[t].animate = 5;
1055					entities[t].w = 16;	entities[t].h = 16;
1056				break;
1057				case rn(19, 2): // Shockwave Rider
1058				  entities[t].tile = 176; entities[t].colour = 6;	entities[t].animate = 1;
1059					entities[t].w = 16;	entities[t].h = 16;
1060				break;
1061				case rn(18, 3): // Mind the gap
1062				  entities[t].tile = 168; entities[t].colour = 7;	entities[t].animate = 1;
1063					entities[t].w = 16;	entities[t].h = 16;
1064				break;
1065				case rn(17, 3): // Edge Games
1066					if (entities[t].yp ==96) {
1067						entities[t].tile = 160; entities[t].colour = 8;	entities[t].animate = 1;
1068						entities[t].w = 16;	entities[t].h = 16;
1069					}else {
1070						entities[t].tile = 156; entities[t].colour = 8;	entities[t].animate = 1;
1071						entities[t].w = 16;	entities[t].h = 16;
1072					}
1073				break;
1074				case rn(16, 0): // I love you
1075				  entities[t].tile = 112; entities[t].colour = 8;	entities[t].animate = 5;
1076					entities[t].w = 16;	entities[t].h = 16;
1077				break;
1078				case rn(14, 2): // That's why I have to kill you
1079				  entities[t].tile = 114; entities[t].colour = 6;	entities[t].animate = 5;
1080					entities[t].w = 16;	entities[t].h = 16;
1081				break;
1082				case rn(18, 2): // Thinking with Portals
1083				  //depends on direction
1084					if (entities[t].xp ==88) {
1085				    entities[t].tile = 54+12; entities[t].colour = 12;	entities[t].animate = 100;
1086					  entities[t].w = 60;	entities[t].h = 16; entities[t].size = 10;
1087					}else{
1088				    entities[t].tile = 54; entities[t].colour = 12;	entities[t].animate = 100;
1089					  entities[t].w = 60;	entities[t].h = 16; entities[t].size = 10;
1090					}
1091				break;
1092				//Final level
1093				case rn(50-100, 53-100):  //The Yes Men
1094				  entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1;
1095					entities[t].w = 20;	entities[t].h = 20;
1096				break;
1097				case rn(48-100, 51-100):  //Wavelengths
1098				  entities[t].tile = 32; entities[t].colour = 7; 	entities[t].animate = 1;
1099					entities[t].w = 32;
1100				break;
1101				case rn(43-100,52-100): // Ascending and Descending
1102				  entities[t].tile = 48; entities[t].colour = 9;	entities[t].animate = 5;
1103					entities[t].w = 16;	entities[t].h = 16;
1104				break;
1105				case rn(46-100,51-100): //kids his age
1106				  entities[t].tile = 88; entities[t].colour = 11;	entities[t].animate = 1;
1107					entities[t].w = 16;	entities[t].h = 16;
1108				break;
1109				case rn(43-100,51-100): // Mind the gap
1110				  entities[t].tile = 168; entities[t].colour = 7;	entities[t].animate = 1;
1111					entities[t].w = 16;	entities[t].h = 16;
1112				break;
1113				case rn(44-100,51-100): // vertigo?
1114				  entities[t].tile = 172; entities[t].colour = 7;	entities[t].animate = 100;
1115					entities[t].w = 32;	entities[t].h = 32;
1116				break;
1117				case rn(44-100,52-100): // (backsliders)
1118				  entities[t].tile = 164; entities[t].colour = 7;	entities[t].animate = 1;
1119					entities[t].w = 16;	entities[t].h = 16;
1120				break;
1121				case rn(43-100, 56-100): //Intermission 1
1122				  entities[t].tile = 88; entities[t].colour = 21;	entities[t].animate = 1;
1123					entities[t].w = 16;	entities[t].h = 16;
1124				break;
1125				case rn(45-100, 56-100): //Intermission 1
1126				  entities[t].tile = 88; entities[t].colour = 21;	entities[t].animate = 1;
1127					entities[t].w = 16;	entities[t].h = 16;
1128				break;
1129				//The elephant
1130				case rn(11, 9): case rn(12, 9): case rn(11, 8): case rn(12, 8):
1131				  entities[t].tile = 0; entities[t].colour = 102;	entities[t].animate = 0;
1132					entities[t].w = 464;	entities[t].h = 320; entities[t].size = 11;
1133					entities[t].harmful = false;
1134				break;
1135			}
1136		}
1137
1138		public function setenemy(t:int, r:int):void {
1139			switch(t) {
1140				case 0:
1141				  //lies emitter
1142					if(entities[r].para==0){
1143						entities[r].tile = 60; entities[r].animate = 2;
1144						entities[r].colour = 6; entities[r].behave = 10;
1145						entities[r].w = 32;	entities[r].h = 32;
1146						entities[r].x1 = -200;
1147					}else if (entities[r].para == 1) {
1148						entities[r].yp += 10;
1149						entities[r].tile = 63; entities[r].animate = 100; //LIES
1150					  entities[r].colour = 6;
1151						entities[r].behave = 11; entities[r].para = 9; //destroyed when outside
1152						entities[r].x1 = -200; entities[r].x2 = 400;
1153						entities[r].w = 26;	entities[r].h = 10;
1154						entities[r].cx = 1;	entities[r].cy = 1;
1155					}else if (entities[r].para == 2) {
1156						entities[r].tile = 62; entities[r].animate = 100;
1157						entities[r].colour = 6; entities[r].behave = -1;
1158						entities[r].w = 32;	entities[r].h = 32;
1159					}
1160				break;
1161				case 1:
1162				  //FACTORY emitter
1163					if(entities[r].para==0){
1164						entities[r].tile = 72; entities[r].animate = 3; entities[r].size = 9;
1165						entities[r].colour = 6; entities[r].behave = 12;
1166						entities[r].w = 64;	entities[r].h = 40;
1167						entities[r].cx = 0;	entities[r].cy = 24;
1168					}else if (entities[r].para == 1) {
1169						entities[r].xp += 4; entities[r].yp -= 4;
1170						entities[r].tile = 76; entities[r].animate = 100; // Clouds
1171						entities[r].colour = 6;
1172						entities[r].behave = 13; entities[r].para = -6; //destroyed when outside
1173						entities[r].x2 = 400;
1174						entities[r].w = 32;	entities[r].h = 12;
1175						entities[r].cx = 0;	entities[r].cy = 6;
1176					}else if (entities[r].para == 2) {
1177						entities[r].tile = 77; entities[r].animate = 100;
1178						entities[r].colour = 6; entities[r].behave = -1;
1179						entities[r].w = 32;	entities[r].h = 16;
1180					}
1181				break;
1182				default:
1183				break;
1184			}
1185		}
1186
1187
1188		public function rn(rx:int, ry:int):int {
1189			return rx + (ry * 100);
1190		}
1191
1192		public function settreadmillcolour(t:int, rx:int, ry:int):void {
1193      rx -= 100; ry -= 100;
1194			rx += 50 - 12; ry += 50 - 14;   //Space Station
1195
1196			entities[t].tile = 20; //default as blue
1197			switch(rn(rx, ry)) {
1198				case rn(52, 48): entities[t].tile = 791; break; //Cyan
1199
1200				case rn(49, 47): entities[t].tile = 24; break; //Yellow
1201				case rn(56, 44): entities[t].tile = 24; break; //Yellow
1202				case rn(54, 49): entities[t].tile = 24; break; //Yellow
1203
1204				case rn(49, 49): entities[t].tile = 36; break; //Green
1205				case rn(55, 44): entities[t].tile = 36; break; //Green
1206				case rn(54, 43): entities[t].tile = 36; break; //Green
1207				case rn(53, 49): entities[t].tile = 36; break; //Green
1208				case rn(54, 45): entities[t].tile = 711; break; //Green (special)
1209				case rn(51, 48): entities[t].tile = 711; break; //Green (special)
1210
1211				case rn(50, 49): entities[t].tile = 28; break; //Purple
1212				case rn(54, 44): entities[t].tile = 28; break; //Purple
1213				case rn(49, 42): entities[t].tile = 28; break; //Purple
1214				case rn(55, 43): entities[t].tile = 28; break; //Purple
1215				case rn(54, 47): entities[t].tile = 28; break; //Purple
1216				case rn(53, 48): entities[t].tile = 28; break; //Purple
1217
1218				case rn(51, 47): entities[t].tile = 32; break; //Red
1219				case rn(52, 49): entities[t].tile = 32; break; //Red
1220				case rn(48, 43): entities[t].tile = 32; break; //Red
1221				case rn(55, 47): entities[t].tile = 32; break; //Red
1222				case rn(54, 48): entities[t].tile = 32; break; //Red
1223			}
1224		}
1225
1226		public function createentity(game:gameclass, xp:Number, yp:Number, t:int, vx:Number = 0, vy:Number = 0,
1227		                                            p1:int = 0, p2:int = 0, p3:int = 320, p4:int = 240 ):void {
1228			//Find the first inactive case z that we can use to index the new entity
1229			if (nentity == 0) {
1230				//If there are no active entities, Z=0;
1231				k = 0; nentity++;
1232			}else {
1233				i = 0; k = -1;
1234				while (i < nentity) {
1235				  if (!entities[i].active) {
1236						k = i; i = nentity;
1237					}
1238					i++;
1239			  }
1240				if (k == -1) {
1241					k = nentity;
1242					nentity++;
1243				}
1244			}
1245
1246			//Size 0 is a sprite
1247			//Size 1 is a tile
1248			//Beyond that are special cases (to do)
1249			//Size 2 is a moving platform of width 4 (32)
1250			//Size 3 is apparently a "bug chunky pixel"
1251			//Size 4 is a coin/small pickup
1252			//Size 5 is a horizontal line, 6 is vertical
1253
1254			//Rule 0 is the playable character
1255			//Rule 1 is anything harmful
1256			//Rule 2 is anything decorative (no collisions)
1257			//Rule 3 is anything that results in an entity to entity collision and state change
1258			//Rule 4 is a horizontal line, 5 is vertical
1259			//Rule 6 is a crew member
1260
1261			//trace("creating entity type ", t, xp, yp);
1262
1263			entities[k].clear();
1264			entities[k].active = true;
1265			entities[k].type = t;
1266			switch(t) {
1267				case 0: //Player
1268				  entities[k].rule = 0; //Playable character
1269				  entities[k].tile = 0; entities[k].colour = 0;
1270					entities[k].xp = xp; entities[k].yp = yp;
1271					entities[k].cx = 6; entities[k].cy = 2;
1272					entities[k].w = 12;	entities[k].h = 21;
1273					entities[k].dir = 1;
1274
1275					if(vx==1) entities[k].invis = true;
1276
1277          entities[k].gravity = true;
1278				break;
1279				case 1: //Simple enemy, bouncing about like a spastic
1280				  entities[k].rule = 1;
1281					entities[k].xp = xp; entities[k].yp = yp;
1282					entities[k].behave = vx; entities[k].para = vy;
1283					entities[k].w = 16;	entities[k].h = 16;
1284					entities[k].cx = 0;	entities[k].cy = 0;
1285
1286					entities[k].x1 = p1; entities[k].y1 = p2;
1287					entities[k].x2 = p3; entities[k].y2 = p4;
1288
1289					entities[k].harmful = true;
1290					//Exact appearance depends entirely on location, assigned here:
1291					/*
1292					}else if (game.roomx == 50 && game.roomy == 52) {
1293						entities[k].tile = 48; entities[k].colour = 6;
1294						entities[k].w = 32;	entities[k].h = 27;
1295						entities[k].animate = 1;
1296						//ok, for space station 2
1297						*/
1298						entities[k].tile = 24;
1299						entities[k].animate = 0;
1300						entities[k].colour = 8;
1301
1302
1303						if  (game.roomy == 111 && (game.roomx >= 113 && game.roomx <= 117)) {
1304							setenemy(0, k);
1305							setenemyroom(k, game.roomx, game.roomy); //For colour
1306						}else if  (game.roomx == 113 && (game.roomy <= 110 && game.roomy >= 108)) {
1307							setenemy(1, k);
1308							setenemyroom(k, game.roomx, game.roomy); //For colour
1309						}else if (game.roomx == 113 && game.roomy == 107) {
1310							//MAVVERRRICK
1311							entities[k].tile = 96; entities[k].colour = 6; entities[k].size = 9;
1312					  	entities[k].w = 64;	entities[k].h = 44;
1313						  entities[k].animate = 4;
1314						}else {
1315							setenemyroom(k, game.roomx, game.roomy);
1316						}
1317
1318
1319					//}else{*/
1320					/*
1321						entities[k].tile = 24;
1322						entities[k].animate = 0;
1323						entities[k].colour = 8;
1324						//for warpzone:
1325						if (game.roomx == 51 && game.roomy == 51) entities[k].colour = 6;
1326						if (game.roomx == 52 && game.roomy == 51) entities[k].colour = 7;
1327						if (game.roomx == 54 && game.roomy == 49) entities[k].colour = 11;
1328						if (game.roomx == 55 && game.roomy == 50) entities[k].colour = 9;
1329						if (game.roomx == 55 && game.roomy == 51) entities[k].colour = 6;
1330						if (game.roomx == 54 && game.roomy == 51) entities[k].colour = 12;
1331						if (game.roomx == 54 && game.roomy == 52) entities[k].colour = 7;
1332						if (game.roomx == 53 && game.roomy == 52) entities[k].colour = 8;
1333						if (game.roomx == 51 && game.roomy == 52) entities[k].colour = 6;
1334						if (game.roomx == 52 && game.roomy == 49) entities[k].colour = 8;
1335					//}
1336					*/
1337				break;
1338				case 2: //A moving platform
1339				  entities[k].rule = 2; entities[k].type = 1;
1340					entities[k].size = 2; entities[k].tile = 1;
1341
1342					if (customplatformtile > 0){
1343            entities[k].tile = customplatformtile;
1344					}else if (platformtile > 0) {
1345						entities[k].tile = platformtile;
1346					}else{
1347						//appearance again depends on location
1348						if (gridmatch(p1, p2, p3, p4, 100, 70, 320, 160)) entities[k].tile = 616;
1349						if (gridmatch(p1, p2, p3, p4, 72, 0, 248, 240)) entities[k].tile = 610;
1350						if (gridmatch(p1, p2, p3, p4, -20, 0, 320, 240)) entities[k].tile = 413;
1351
1352						if (gridmatch(p1, p2, p3, p4, -96, -72, 400, 312)) entities[k].tile = 26;
1353						if (gridmatch(p1, p2, p3, p4, -32, -40, 352, 264)) entities[k].tile = 27;
1354					}
1355
1356					entities[k].xp = xp; entities[k].yp = yp;
1357					entities[k].w = 32;	entities[k].h = 8;
1358
1359					if (vx <= 1) vertplatforms = true;
1360					if (vx >= 2  && vx <= 5) horplatforms = true;
1361					if (vx == 14 || vx == 15) horplatforms = true; //special case for last part of Space Station
1362					if (vx >= 6  && vx <= 7) vertplatforms = true;
1363
1364					if (vx >= 10  && vx <= 11) {
1365						//Double sized threadmills
1366					  entities[k].w = 64;	entities[k].h = 8;
1367						vx -= 2; entities[k].size = 8;
1368					}
1369
1370					entities[k].behave = vx; entities[k].para = vy;
1371
1372					if (vx >= 8  && vx <= 9) {
1373						horplatforms = true; //threadmill!
1374					  entities[k].animate = 10;
1375						if(customplatformtile>0){
1376              entities[k].tile = customplatformtile+4;
1377              if (vx == 8) entities[k].tile += 4;
1378							if (vx == 9) entities[k].animate = 11;
1379            }else{
1380							settreadmillcolour(k, game.roomx, game.roomy);
1381							if (vx == 8) entities[k].tile += 40;
1382							if (vx == 9) entities[k].animate = 11;
1383            }
1384
1385					}else {
1386						entities[k].animate = 100;
1387					}
1388
1389					entities[k].x1 = p1; entities[k].y1 = p2;
1390					entities[k].x2 = p3; entities[k].y2 = p4;
1391
1392					entities[k].isplatform = true;
1393
1394					createblock(0, xp, yp, 32, 8);
1395				break;
1396				case 3: //Disappearing platforms
1397				  entities[k].rule = 3; entities[k].type = 2;
1398					entities[k].size = 2;
1399				  entities[k].tile = 2;
1400					//appearance again depends on location
1401					if(customplatformtile>0){
1402						entities[k].tile=customplatformtile;
1403					}else if (vx > 0) {
1404						entities[k].tile = int(vx);
1405					}else{
1406					  if(game.roomx==49 && game.roomy==52) entities[k].tile = 18;
1407					  if (game.roomx == 50 && game.roomy == 52) entities[k].tile = 22;
1408					}
1409
1410					entities[k].xp = xp; entities[k].yp = yp;
1411					entities[k].cy = -1;
1412					entities[k].w = 32;	entities[k].h = 10;
1413					entities[k].behave = vx; entities[k].para = vy;
1414					entities[k].onentity = 1;
1415					entities[k].animate = 100;
1416
1417					createblock(0, xp, yp, 32, 8);
1418				break;
1419				case 4: //Breakable blocks
1420				  entities[k].rule = 6; entities[k].type = 3;
1421					entities[k].size = 1;
1422				  entities[k].tile = 10;
1423					entities[k].xp = xp; entities[k].yp = yp;
1424					entities[k].cy = -1;
1425					entities[k].w = 8;	entities[k].h = 10;
1426					entities[k].behave = vx; entities[k].para = vy;
1427					entities[k].onentity = 1;
1428					entities[k].animate = 100;
1429
1430					createblock(0, xp, yp, 8, 8);
1431				break;
1432				case 5: //Gravity Tokens
1433				  entities[k].rule = 3; entities[k].type = 4;
1434					entities[k].size = 0;  entities[k].tile = 11;
1435					entities[k].xp = xp; entities[k].yp = yp;
1436					entities[k].w = 16;	entities[k].h = 16;
1437					entities[k].behave = vx; entities[k].para = vy;
1438					entities[k].onentity = 1;
1439					entities[k].animate = 100;
1440				break;
1441				case 6: //Decorative particles
1442				  entities[k].rule = 2; entities[k].type = 5;  //Particles
1443				  entities[k].colour = 1; entities[k].size = 3;
1444					entities[k].xp = xp;
1445					entities[k].yp = yp;
1446					entities[k].vx = vx;
1447					entities[k].vy = vy;
1448
1449					entities[k].life = 12;
1450				break;
1451				case 7: //Decorative particles
1452				  entities[k].rule = 2; entities[k].type = 5;  //Particles
1453				  entities[k].colour = 2; entities[k].size = 3;
1454					entities[k].xp = xp;
1455					entities[k].yp = yp;
1456					entities[k].vx = vx;
1457					entities[k].vy = vy;
1458
1459					entities[k].life = 12;
1460				break;
1461				case 8: //Small collectibles
1462				  entities[k].rule = 3; entities[k].type = 6;
1463					entities[k].size = 4;  entities[k].tile = 48;
1464					entities[k].xp = xp; entities[k].yp = yp;
1465					entities[k].w = 8;	entities[k].h = 8;
1466					entities[k].onentity = 1;
1467					entities[k].animate = 100;
1468
1469					//Check if it's already been collected
1470					entities[k].para = vx;
1471					if (collect[vx] == 1) entities[k].active = false;
1472				break;
1473				case 9: //Something Shiny
1474				  entities[k].rule = 3; entities[k].type = 7;
1475					entities[k].size = 0;  entities[k].tile = 22;
1476					entities[k].xp = xp; entities[k].yp = yp;
1477					entities[k].w = 16;	entities[k].h = 16;
1478					entities[k].colour = 3;
1479					entities[k].onentity = 1;
1480					entities[k].animate = 100;
1481
1482					//Check if it's already been collected
1483					entities[k].para = vx;
1484					if (collect[vx] == 1) entities[k].active = false;
1485				break;
1486				case 10: //Savepoint
1487				  entities[k].rule = 3; entities[k].type = 8;
1488					entities[k].size = 0;  entities[k].tile = 20 + vx;
1489					entities[k].xp = xp; entities[k].yp = yp;
1490					entities[k].w = 16;	entities[k].h = 16;
1491					entities[k].colour = 4;
1492					entities[k].onentity = 1;
1493					entities[k].animate = 100;
1494					entities[k].para = vy;
1495
1496					if (game.savepoint == vy) {
1497						entities[k].colour = 5;
1498						entities[k].onentity = 0;
1499					}
1500
1501					if (game.nodeathmode) {
1502						entities[k].active = false;
1503					}
1504				break;
1505				case 11: //Horizontal Gravity Line
1506				  entities[k].rule = 4; entities[k].type = 9;
1507					entities[k].size = 5; entities[k].life = 0;
1508					entities[k].xp = xp; entities[k].yp = yp;
1509					entities[k].w = vx;	entities[k].h = 1;
1510					entities[k].onentity = 1;
1511				break;
1512				case 12: //Vertical Gravity Line
1513				  entities[k].rule = 5; entities[k].type = 10;
1514					entities[k].size = 6; entities[k].life = 0;
1515					entities[k].xp = xp; entities[k].yp = yp;
1516					entities[k].w = 1;	entities[k].h = vx;
1517					//entities[k].colour = 0;
1518					entities[k].onentity = 1;
1519				break;
1520				case 13: //Warp token
1521				  entities[k].rule = 3; entities[k].type = 11;
1522					entities[k].size = 0;  entities[k].tile = 18;
1523					entities[k].xp = xp; entities[k].yp = yp;
1524					entities[k].w = 16;	entities[k].h = 16;
1525					entities[k].colour = 10;
1526					entities[k].onentity = 1;
1527					entities[k].animate = 2;
1528
1529					//Added in port, hope it doesn't break anything
1530					entities[k].behave = vx;
1531					entities[k].para = vy;
1532				break;
1533				case 14: // Teleporter
1534				  entities[k].rule = 3; entities[k].type = 100;
1535					entities[k].size = 7;  entities[k].tile = 1; //inactive
1536					entities[k].xp = xp; entities[k].yp = yp;
1537					entities[k].w = 96;	entities[k].h = 96;
1538					entities[k].colour = 100;
1539					entities[k].onentity = 1;
1540					entities[k].animate = 100;
1541					entities[k].para = vy;
1542
1543					//we'll init it's activeness here later
1544					/*if (game.savepoint == vy) {
1545						entities[k].colour = 5;
1546						entities[k].onentity = 0;
1547					}*/
1548				break;
1549				case 15: // Crew Member (warp zone)
1550				  entities[k].rule = 6; entities[k].type = 12; //A special case!
1551				  entities[k].tile = 144; entities[k].colour = 13; //144 for sad :(
1552					entities[k].xp = xp; entities[k].yp = yp;
1553					entities[k].cx = 6; entities[k].cy = 2;
1554					entities[k].w = 12;	entities[k].h = 21;
1555					entities[k].dir = 0;
1556
1557					entities[k].state = vx;
1558
1559					entities[k].gravity = true;
1560				break;
1561				case 16: // Crew Member, upside down (space station)
1562				  entities[k].rule = 7; entities[k].type = 12; //A special case!
1563				  entities[k].tile = 144+6; entities[k].colour = 14; //144 for sad (upside down+12):(
1564					entities[k].xp = xp; entities[k].yp = yp;
1565					entities[k].cx = 6; entities[k].cy = 2;
1566					entities[k].w = 12;	entities[k].h = 21;
1567					entities[k].dir = 1;
1568
1569					entities[k].state = vx;
1570
1571					entities[k].gravity = true;
1572				break;
1573				case 17: // Crew Member (Lab)
1574				  entities[k].rule = 6; entities[k].type = 12; //A special case!
1575				  entities[k].tile = 144; entities[k].colour = 16; //144 for sad :(
1576					entities[k].xp = xp; entities[k].yp = yp;
1577					entities[k].cx = 6; entities[k].cy = 2;
1578					entities[k].w = 12;	entities[k].h = 21;
1579					entities[k].dir = 1;
1580
1581					entities[k].state = vx;
1582
1583					entities[k].gravity = true;
1584				break;
1585				case 18: // Crew Member (Ship)
1586				  //This is the scriping crewmember
1587				  entities[k].rule = 6; entities[k].type = 12; //A special case!
1588					entities[k].colour = vx;
1589					if (vy == 0) {
1590				    entities[k].tile = 0;
1591					}else {
1592						entities[k].tile = 144;
1593					}
1594					entities[k].xp = xp; entities[k].yp = yp;
1595					entities[k].cx = 6; entities[k].cy = 2;
1596					entities[k].w = 12;	entities[k].h = 21;
1597					entities[k].dir = 0;
1598
1599					entities[k].state = p1;
1600					entities[k].para = p2;
1601
1602					if (p1 == 17) {
1603						entities[k].dir = p2;
1604					}
1605
1606					entities[k].gravity = true;
1607				break;
1608				case 19: // Crew Member (Ship) More tests!
1609				  entities[k].rule = 6; entities[k].type = 12; //A special case!
1610				  entities[k].tile = 0; entities[k].colour = 6; //54 for sad :(
1611					entities[k].xp = xp; entities[k].yp = yp;
1612					entities[k].cx = 6; entities[k].cy = 2;
1613					entities[k].w = 12;	entities[k].h = 21;
1614					entities[k].dir = 1;
1615
1616					entities[k].state = vx;
1617
1618					entities[k].gravity = true;
1619				break;
1620				case 20: //Terminal
1621				  entities[k].rule = 3; entities[k].type = 13;
1622					entities[k].size = 0;  entities[k].tile = 16 + vx;
1623					entities[k].xp = xp; entities[k].yp = yp;
1624					entities[k].w = 16;	entities[k].h = 16;
1625					entities[k].colour = 4;
1626					entities[k].onentity = 1;
1627					entities[k].animate = 100;
1628					entities[k].para = vy;
1629
1630					/*if (game.savepoint == vy) {
1631						entities[k].colour = 5;
1632						entities[k].onentity = 0;
1633					}*/
1634				break;
1635				case 21: //as above, except doesn't highlight
1636				  entities[k].rule = 3; entities[k].type = 13;
1637					entities[k].size = 0;  entities[k].tile = 16 + vx;
1638					entities[k].xp = xp; entities[k].yp = yp;
1639					entities[k].w = 16;	entities[k].h = 16;
1640					entities[k].colour = 4;
1641					entities[k].onentity = 0;
1642					entities[k].animate = 100;
1643					entities[k].para = vy;
1644
1645					/*if (game.savepoint == vy) {
1646						entities[k].colour = 5;
1647						entities[k].onentity = 0;
1648					}*/
1649				break;
1650				case 22: //Fake trinkets, only appear if you've collected them
1651				  entities[k].rule = 3; entities[k].type = 7;
1652					entities[k].size = 0;  entities[k].tile = 22;
1653					entities[k].xp = xp; entities[k].yp = yp;
1654					entities[k].w = 16;	entities[k].h = 16;
1655					entities[k].colour = 3;
1656					entities[k].onentity = 0;
1657					entities[k].animate = 100;
1658
1659					//Check if it's already been collected
1660					entities[k].para = vx;
1661					if (collect[vx] == 0) entities[k].active = false;
1662				break;
1663				case 23: //SWN Enemies
1664				  //Given a different behavior, these enemies are especially for SWN mode and disappear outside the screen.
1665					entities[k].rule = 1;  entities[k].type = 23;
1666					entities[k].xp = xp; entities[k].yp = yp;
1667					entities[k].behave = vx; entities[k].para = vy;
1668					entities[k].w = 16;	entities[k].h = 16;
1669					entities[k].cx = 0;	entities[k].cy = 0;
1670
1671					entities[k].x1 = -2000; entities[k].y1 = -100;
1672					entities[k].x2 = 5200; entities[k].y2 = 340;
1673
1674					entities[k].harmful = true;
1675
1676					//initilise tiles here based on behavior
1677					entities[k].size = 12; //don't wrap around
1678					entities[k].colour = 21;
1679					entities[k].tile = 78; //default case
1680					entities[k].animate = 1;
1681					if (game.swngame == 1) {
1682						//set colour based on current state
1683						entities[k].colour = swncolour(game.swncolstate);
1684					}
1685				break;
1686				case 24: // Super Crew Member
1687				  //This special crewmember is way more advanced than the usual kind, and can interact with game objects
1688				  entities[k].rule = 6; entities[k].type = 14; //A special case!
1689					entities[k].colour = vx;
1690					if(vx==16){
1691						//victoria is sad!
1692						if (vy == 2) vy = 1;
1693					}else {
1694						if (vy == 2) vy = 0;
1695					}
1696					if (vy == 0) {
1697				    entities[k].tile = 0;
1698					}else {
1699						entities[k].tile = 144;
1700					}
1701					entities[k].xp = xp; entities[k].yp = yp;
1702					entities[k].cx = 6; entities[k].cy = 2;
1703					entities[k].w = 12;	entities[k].h = 21;
1704					entities[k].dir = 1;
1705
1706					entities[k].x1 = -2000; entities[k].y1 = -100;
1707					entities[k].x2 = 5200; entities[k].y2 = 340;
1708
1709					entities[k].state = p1;
1710					entities[k].para = p2;
1711
1712					if (p1 == 17) {
1713						entities[k].dir = p2;
1714					}
1715
1716					entities[k].gravity = true;
1717				break;
1718				case 25: //Trophies
1719				  entities[k].rule = 3; entities[k].type = 15;
1720					entities[k].size = 0;
1721					entities[k].xp = xp; entities[k].yp = yp;
1722					entities[k].w = 16;	entities[k].h = 16;
1723					entities[k].colour = 4;
1724					entities[k].onentity = 1;
1725					entities[k].animate = 100;
1726					entities[k].para = vy;
1727
1728					//Decide tile here based on given achievement: both whether you have them and what they are
1729					//default is just a trophy base:
1730					entities[k].tile = 180 + vx;
1731					switch(vy) {
1732						case 1: if(game.bestrank[0]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 31;}	break;
1733						case 2: if(game.bestrank[1]>=3) { entities[k].tile = 186 + vx; entities[k].colour = 35;}	break;
1734						case 3: if(game.bestrank[2]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 33;}	break;
1735						case 4: if(game.bestrank[3]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 32;}	break;
1736						case 5: if(game.bestrank[4]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 34;}	break;
1737						case 6: if(game.bestrank[5]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 30;}	break;
1738
1739						case 7:
1740						  if(game.unlock[5]){
1741								entities[k].tile = 188 + vx;
1742								entities[k].colour = 37;
1743								entities[k].h += 3;
1744							}
1745						break;
1746						case 8:
1747						  if(game.unlock[19]){
1748								entities[k].tile = 188 + vx;
1749								entities[k].colour = 37;
1750								entities[k].h += 3;
1751							}
1752						break;
1753
1754						case 9:
1755						  if (game.bestgamedeaths > -1) {
1756								if (game.bestgamedeaths <= 50) {
1757							    entities[k].tile = 182 + vx; entities[k].colour = 40;
1758								}
1759							}
1760						break;
1761						case 10:
1762						  if (game.bestgamedeaths > -1) {
1763								if (game.bestgamedeaths <= 100) {
1764						      entities[k].tile = 182 + vx; entities[k].colour = 36;
1765								}
1766							}
1767						break;
1768						case 11:
1769						  if (game.bestgamedeaths > -1) {
1770								if (game.bestgamedeaths <= 250) {
1771						      entities[k].tile = 182 + vx; entities[k].colour = 38;
1772								}
1773							}
1774						break;
1775						case 12:
1776						  if (game.bestgamedeaths > -1) {
1777								if (game.bestgamedeaths <= 500) {
1778									entities[k].tile = 182 + vx; entities[k].colour = 39;
1779								}
1780							}
1781						break;
1782
1783						case 13: if(game.swnbestrank>=1) { entities[k].tile = 182 + vx; entities[k].colour = 39;}	break;
1784						case 14: if(game.swnbestrank>=2) { entities[k].tile = 182 + vx; entities[k].colour = 39;}	break;
1785						case 15: if(game.swnbestrank>=3) { entities[k].tile = 182 + vx; entities[k].colour = 39;}	break;
1786						case 16: if(game.swnbestrank>=4) { entities[k].tile = 182 + vx; entities[k].colour = 38;}	break;
1787						case 17: if(game.swnbestrank>=5) { entities[k].tile = 182 + vx; entities[k].colour = 36;}	break;
1788						case 18: if(game.swnbestrank>=6) { entities[k].tile = 182 + vx; entities[k].colour = 40;}	break;
1789
1790						case 19:
1791						  if(game.unlock[20]){
1792								entities[k].tile = 3; entities[k].colour = 102;
1793								entities[k].size = 13;
1794								entities[k].xp -= 64; entities[k].yp -= 128;
1795							}
1796						break;
1797
1798					}
1799
1800				break;
1801				case 26: //Epilogue super warp token
1802				  entities[k].rule = 3; entities[k].type = 11;
1803					entities[k].size = 0;  entities[k].tile = 18;
1804					entities[k].xp = xp; entities[k].yp = yp;
1805					entities[k].w = 16;	entities[k].h = 16;
1806					entities[k].colour = 3;
1807					entities[k].onentity = 0;
1808					entities[k].animate = 100;
1809					entities[k].para = vy;
1810					entities[k].size = 13;
1811				break;
1812				case 51: //Vertical Warp Line
1813					entities[k].rule = 5;
1814					entities[k].type = 51;
1815					entities[k].size = 6;
1816					entities[k].life = 0;
1817					entities[k].xp = xp;
1818					entities[k].yp = yp;
1819					entities[k].w = 1;
1820					entities[k].h = vx;
1821					//entities[k].colour = 0;
1822					entities[k].onentity = 1;
1823					entities[k].invis=true;
1824        break;
1825				case 52: //Vertical Warp Line
1826					entities[k].rule = 5;
1827					entities[k].type = 52;
1828					entities[k].size = 6;
1829					entities[k].life = 0;
1830					entities[k].xp = xp;
1831					entities[k].yp = yp;
1832					entities[k].w = 1;
1833					entities[k].h = vx;
1834					//entities[k].colour = 0;
1835					entities[k].onentity = 1;
1836					entities[k].invis=true;
1837        break;
1838				case 53: //Horizontal Warp Line
1839					entities[k].rule = 7;
1840					entities[k].type = 53;
1841					entities[k].size = 5;
1842					entities[k].life = 0;
1843					entities[k].xp = xp;
1844					entities[k].yp = yp;
1845					entities[k].w = vx;
1846					entities[k].h = 1;
1847					entities[k].onentity = 1;
1848					entities[k].invis=true;
1849        break;
1850				case 54: //Horizontal Warp Line
1851					entities[k].rule = 7;
1852					entities[k].type = 54;
1853					entities[k].size = 5;
1854					entities[k].life = 0;
1855					entities[k].xp = xp;
1856					entities[k].yp = yp;
1857					entities[k].w = vx;
1858					entities[k].h = 1;
1859					entities[k].onentity = 1;
1860					entities[k].invis=true;
1861        break;
1862				case 55: // Crew Member (custom, collectable)
1863					//1 - position in array
1864					//2 - colour
1865					entities[k].rule = 3;
1866					entities[k].type = 55;
1867					if(customcrewmoods[int(vy)]==1){
1868						entities[k].tile = 144;
1869					}else{
1870						entities[k].tile = 0;
1871					}
1872					entities[k].colour = crewcolour(int(vy));
1873					entities[k].xp = xp;
1874					entities[k].yp = yp;
1875					entities[k].cx = 6;
1876					entities[k].cy = 2;
1877					entities[k].w = 12;
1878					entities[k].h = 21;
1879					entities[k].dir = 0;
1880
1881					entities[k].state = 0;
1882					entities[k].onentity = 1;
1883					//entities[k].state = vx;
1884
1885					entities[k].gravity = true;
1886
1887					//Check if it's already been collected
1888					entities[k].para = vx;
1889					if (customcollect[vx] == 1) entities[k].active = false;
1890        break;
1891				case 56: //Custom enemy
1892					entities[k].rule = 1;
1893					entities[k].type = 1;
1894					entities[k].xp = xp;
1895					entities[k].yp = yp;
1896					entities[k].behave = vx;
1897					entities[k].para = vy;
1898					entities[k].w = 16;
1899					entities[k].h = 16;
1900					entities[k].cx = 0;
1901					entities[k].cy = 0;
1902
1903					entities[k].x1 = p1;
1904					entities[k].y1 = p2;
1905					entities[k].x2 = p3;
1906					entities[k].y2 = p4;
1907
1908					entities[k].harmful = true;
1909
1910					switch(customenemy){
1911						case 0: setenemyroom(k, 4+100, 0+100); break;
1912						case 1: setenemyroom(k, 2+100, 0+100); break;
1913						case 2: setenemyroom(k, 12+100, 3+100); break;
1914						case 3: setenemyroom(k, 13+100, 12+100); break;
1915						case 4: setenemyroom(k, 16+100, 9+100); break;
1916						case 5: setenemyroom(k, 19+100, 1+100); break;
1917						case 6: setenemyroom(k, 19+100, 2+100); break;
1918						case 7: setenemyroom(k, 18+100, 3+100); break;
1919						case 8: setenemyroom(k, 16+100, 0+100); break;
1920						case 9: setenemyroom(k, 14+100, 2+100); break;
1921						default: setenemyroom(k, 4+100, 0+100); break;
1922					}
1923
1924					//Set colour based on room tile
1925					 //Set custom colours
1926					if(customplatformtile>0){
1927						var entcol:int = (customplatformtile / 12);
1928						switch(entcol){
1929							//RED
1930							case 3: case 7: case 12: case 23: case 28:
1931							case 34: case 42: case 48: case 58:
1932								entities[k].colour = 6; break;
1933							//GREEN
1934							case 5: case 9: case 22: case 25: case 29:
1935							case 31: case 38: case 46: case 52: case 53:
1936								entities[k].colour = 7; break;
1937							//BLUE
1938							case 1: case 6: case 14: case 27: case 33:
1939							case 44: case 50: case 57:
1940								entities[k].colour = 12; break;
1941							//YELLOW
1942							case 4: case 17: case 24: case 30: case 37:
1943							case 45: case 51: case 55:
1944								entities[k].colour = 9; break;
1945							//PURPLE
1946							case 2: case 11: case 15: case 19: case 32:
1947							case 36: case 49:
1948								entities[k].colour = 20; break;
1949							//CYAN
1950							case 8: case 10: case 13: case 18: case 26:
1951							case 35: case 41: case 47: case 54:
1952								entities[k].colour = 11; break;
1953							//PINK
1954							case 16: case 20: case 39: case 43: case 56:
1955								entities[k].colour = 8; break;
1956							//ORANGE
1957							case 21: case 40:
1958								entities[k].colour = 17; break;
1959							default:
1960								entities[k].colour = 6;
1961							break;
1962						}
1963					}
1964        break;
1965			}
1966		}
1967
1968		public function updateentities(i:int, help:helpclass, game:gameclass, music:musicclass):Boolean {
1969			if(entities[i].active){
1970				if(entities[i].statedelay<=0){
1971					switch(entities[i].type) {
1972						case 0:  //Player
1973						  if (entities[i].state == 0) {
1974							}
1975						break;
1976						case 1:  //Movement behaviors
1977						  //Enemies can have a number of different behaviors:
1978							switch(entities[i].behave) {
1979								case 0: //Bounce, Start moving down
1980								  if (entities[i].state == 0) { //Init
1981										entities[i].state = 3; updateentities(i, help, game, music);
1982									}else if (entities[i].state == 1) {
1983										if (entities[i].outside()) entities[i].state = entities[i].onwall;
1984							    }else if (entities[i].state == 2) {
1985									  entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
1986									}else if (entities[i].state == 3) {
1987										entities[i].vy = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
1988								break;
1989								case 1: //Bounce, Start moving up
1990								  if (entities[i].state == 0) { //Init
1991										entities[i].state = 2; updateentities(i, help, game, music);
1992							    }else if (entities[i].state == 1) {
1993										if (entities[i].outside()) entities[i].state = entities[i].onwall;
1994							    }else if (entities[i].state == 2) {
1995									  entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
1996									}else if (entities[i].state == 3) {
1997										entities[i].vy = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
1998								break;
1999								case 2: //Bounce, Start moving left
2000								  if (entities[i].state == 0) { //Init
2001										entities[i].state = 3; updateentities(i, help, game, music);
2002							    }else if (entities[i].state == 1) {
2003										if (entities[i].outside()) entities[i].state = entities[i].onwall;
2004							    }else if (entities[i].state == 2) {
2005									  entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
2006									}else if (entities[i].state == 3) {
2007										entities[i].vx = -entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
2008								break;
2009								case 3: //Bounce, Start moving right
2010								  if (entities[i].state == 0) { //Init
2011										entities[i].state = 3; updateentities(i, help, game, music);
2012							    }else if (entities[i].state == 1) {
2013										if (entities[i].outside()) entities[i].state = entities[i].onwall;
2014							    }else if (entities[i].state == 2) {
2015									  entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
2016									}else if (entities[i].state == 3) {
2017										entities[i].vx = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
2018								break;
2019								case 4: //Always move left
2020								  if (entities[i].state == 0) { //Init
2021										entities[i].vx = entities[i].para;
2022									}
2023								break;
2024								case 5: //Always move right
2025								  if (entities[i].state == 0) { //Init
2026										entities[i].vx = entities[i].para;
2027										entities[i].state = 1
2028										entities[i].onwall = 2;
2029									}else if (entities[i].state == 2) {
2030										entities[i].vx = 0; entities[i].onwall = 0;
2031										entities[i].xp -= entities[i].para;
2032										entities[i].statedelay=8; entities[i].state=0;
2033									}
2034								break;
2035								case 6: //Always move up
2036								  if (entities[i].state == 0) { //Init
2037										entities[i].vy = entities[i].para;
2038										entities[i].state = 1;
2039										entities[i].onwall = 2;
2040									}else if (entities[i].state == 2) {
2041										entities[i].vy = -entities[i].para; entities[i].onwall = 0;
2042										entities[i].yp -= entities[i].para;
2043										entities[i].statedelay=8; entities[i].state=0;
2044									}
2045								break;
2046								case 7: //Always move down
2047								  if (entities[i].state == 0) { //Init
2048										entities[i].vx = entities[i].para;
2049									}
2050								break;
2051								case 8: case 9:
2052								  //Threadmill: don't move, just impart velocity
2053									if (entities[i].state == 0) { //Init
2054										entities[i].vx = 0;
2055										entities[i].state = 1;
2056										entities[i].onwall = 0;
2057									}
2058								break;
2059								case 10:
2060								  //Emitter: shoot an enemy every so often
2061									if (entities[i].state == 0) {
2062										createentity(game, entities[i].xp+28, entities[i].yp, 1, 10, 1);
2063										entities[i].state = 1; entities[i].statedelay = 12;
2064									}else if (entities[i].state == 1) {
2065									  entities[i].state = 0;
2066									}
2067								break;
2068								case 11: //Always move right, destroy when outside screen
2069								  if (entities[i].state == 0) { //Init
2070										entities[i].vx = entities[i].para;
2071										entities[i].state = 1
2072									}else if (entities[i].state == 1) {
2073										if (entities[i].xp >= 335) entities[i].active = false;
2074										if (game.roomx == 117) {
2075											if (entities[i].xp >= (33*8)-32) entities[i].active = false;
2076											//collector for LIES
2077										}
2078									}
2079								break;
2080								case 12:
2081								  //Emitter: shoot an enemy every so often (up)
2082									if (entities[i].state == 0) {
2083										createentity(game, entities[i].xp, entities[i].yp, 1, 12, 1);
2084										entities[i].state = 1; entities[i].statedelay = 16;
2085									}else if (entities[i].state == 1) {
2086									  entities[i].state = 0;
2087									}
2088								break;
2089								case 13: //Always move up, destroy when outside screen
2090								  if (entities[i].state == 0) { //Init
2091										entities[i].vy = entities[i].para;
2092										entities[i].state = 1
2093									}else if (entities[i].state == 1) {
2094										if (entities[i].yp <= -60) entities[i].active = false;
2095										if (game.roomy == 108) {
2096											if (entities[i].yp <= 60) entities[i].active = false;
2097											//collector for factory
2098										}
2099									}
2100								break;
2101								case 14: //Very special hack: as two, but doesn't move in specific circumstances
2102								  if (entities[i].state == 0) { //Init
2103										for (j = 0; j < nentity; j++) {
2104									    if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp-32) {
2105										    entities[i].state = 3; updateentities(i, help, game, music);
2106									    }
2107								    }
2108							    }else if (entities[i].state == 1) {
2109										if (entities[i].outside()) entities[i].state = entities[i].onwall;
2110							    }else if (entities[i].state == 2) {
2111									  entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
2112									}else if (entities[i].state == 3) {
2113										entities[i].vx = -entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
2114								break;
2115								case 15: //As above, but for 3!
2116								  if (entities[i].state == 0) { //Init
2117										for (j = 0; j < nentity; j++) {
2118									    if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp+32) {
2119										    entities[i].state = 3; updateentities(i, help, game, music);
2120									    }
2121								    }
2122							    }else if (entities[i].state == 1) {
2123										if (entities[i].outside()) entities[i].state = entities[i].onwall;
2124							    }else if (entities[i].state == 2) {
2125									  entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
2126									}else if (entities[i].state == 3) {
2127										entities[i].vx = entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
2128								break;
2129								case 16: //MAVERICK BUS FOLLOWS HIS OWN RULES
2130								  if (entities[i].state == 0) { //Init
2131										//first, y position
2132										if (entities[getplayer()].yp > 14 * 8) {
2133											entities[i].tile = 120;
2134											entities[i].yp = (28*8)-62;
2135										}else {
2136											entities[i].tile = 96;
2137											entities[i].yp = 24;
2138										}
2139										//now, x position
2140										if (entities[getplayer()].xp > 20 * 8) {
2141											//approach from the left
2142											entities[i].xp = -64;
2143										  entities[i].state = 2; updateentities(i, help, game, music); //right
2144										}else {
2145											//approach from the left
2146											entities[i].xp = 320;
2147										  entities[i].state = 3; updateentities(i, help, game, music); //left
2148										}
2149
2150							    }else if (entities[i].state == 1) {
2151										if (entities[i].outside()) entities[i].state = entities[i].onwall;
2152							    }else if (entities[i].state == 2) {
2153									  entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
2154									}else if (entities[i].state == 3) {
2155										entities[i].vx = -entities[i].para; entities[i].onwall = 2;	entities[i].state = 1;  }
2156								break;
2157								case 17: //Special for ASCII Snake (left)
2158								  if (entities[i].state == 0) { //Init
2159										entities[i].statedelay = 6; entities[i].xp -= entities[i].para;
2160							    }
2161								break;
2162								case 18: //Special for ASCII Snake (right)
2163								  if (entities[i].state == 0) { //Init
2164										entities[i].statedelay = 6; entities[i].xp += entities[i].para;
2165							    }
2166								break;
2167							}
2168						break;
2169						case 2: //Disappearing platforms
2170						  //wait for collision
2171						  if (entities[i].state == 1) {
2172								entities[i].life = 12;
2173								entities[i].state = 2; entities[i].onentity = 0;
2174
2175								music.playef(7,10);
2176							}else if (entities[i].state == 2) {
2177							  entities[i].life--;
2178								if (entities[i].life % 3 == 0) entities[i].tile++;
2179								if (entities[i].life <= 0) {
2180									removeblockat(entities[i].xp, entities[i].yp);
2181									entities[i].state = 3;// = false;
2182									entities[i].invis = true;
2183								}
2184							}else if (entities[i].state == 3) {
2185								//wait until recharged!
2186							}else if (entities[i].state == 4) {
2187								//restart!
2188					      createblock(0, entities[i].xp, entities[i].yp, 32, 8);
2189								entities[i].state = 4;
2190								entities[i].invis = false;
2191								entities[i].tile--;
2192								entities[i].state++; entities[i].onentity = 1;
2193							}else if (entities[i].state == 5) {
2194							  entities[i].life+=3;
2195								if (entities[i].life % 3 == 0) entities[i].tile--;
2196								if (entities[i].life >= 12) {
2197									entities[i].life = 12;
2198									entities[i].state = 0;
2199								  entities[i].tile++;
2200								}
2201							}
2202						break;
2203						case 3: //Breakable blocks
2204						  //Only counts if vy of player entity is non zero
2205						  if (entities[i].state == 1) {
2206								j = getplayer();
2207								//if (entities[j].vy > 0.5 && (entities[j].yp+entities[j].h<=entities[i].yp+6)) {
2208									entities[i].life = 4;
2209									entities[i].state = 2; entities[i].onentity = 0;
2210								  music.playef(6,10);
2211								/*}else if (entities[j].vy <= -0.5  && (entities[j].yp>=entities[i].yp+2)) {
2212									entities[i].life = 4;
2213									entities[i].state = 2; entities[i].onentity = 0;
2214                }else {
2215									entities[i].state = 0;
2216								}*/
2217							}else if (entities[i].state == 2) {
2218							  entities[i].life--;
2219								entities[i].tile++;
2220								if (entities[i].life <= 0) {
2221									removeblockat(entities[i].xp, entities[i].yp);
2222									entities[i].active = false;
2223								}
2224							}
2225						break;
2226						case 4: //Gravity token
2227						  //wait for collision
2228						  if (entities[i].state == 1) {
2229								entities[i].active = false;
2230								game.gravitycontrol = (game.gravitycontrol + 1) % 2;
2231
2232							}
2233						break;
2234						case 5:  //Particle sprays
2235						  if (entities[i].state == 0) {
2236								entities[i].life--;
2237								if (entities[i].life < 0) entities[i].active = false;
2238							}
2239						break;
2240						case 6: //Small pickup
2241						  //wait for collision
2242						  if (entities[i].state == 1) {
2243								game.coins++;
2244								music.playef(4,10);
2245								collect[entities[i].para] = 1;
2246
2247								entities[i].active = false;
2248							}
2249						break;
2250						case 7: //Found a trinket
2251						  //wait for collision
2252						  if (entities[i].state == 1) {
2253								game.trinkets++;
2254								if (game.intimetrial) {
2255									collect[entities[i].para] = 1;
2256									music.playef(25,10);
2257								}else{
2258									game.state = 1000;
2259									//music.haltdasmusik();
2260									music.silencedasmusik();
2261									music.playef(3,10);
2262									collect[entities[i].para] = 1;
2263									if (game.trinkets > game.stat_trinkets) {
2264										game.stat_trinkets = game.trinkets;
2265									}
2266								}
2267
2268								entities[i].active = false;
2269							}
2270						break;
2271						case 8: //Savepoints
2272						  //wait for collision
2273						  if (entities[i].state == 1) {
2274								//First, deactivate all other savepoints
2275								for (j = 0; j < nentity; j++) {
2276									if (entities[j].type == 8 && entities[j].active) {
2277										entities[j].colour = 4; entities[j].onentity = 1;
2278									}
2279								}
2280								entities[i].colour = 5;
2281						    entities[i].onentity = 0;
2282								game.savepoint = entities[i].para;
2283								music.playef(5,10);
2284
2285								game.savex = entities[i].xp - 4;
2286
2287								if (entities[i].tile == 20) {
2288								  game.savey = entities[i].yp - 1;
2289								  game.savegc = 1;
2290								}else if (entities[i].tile == 21) {
2291								  game.savey = entities[i].yp-8;
2292								  game.savegc = 0;
2293								}
2294
2295								game.saverx = game.roomx; game.savery = game.roomy;
2296								game.savedir = entities[getplayer()].dir;
2297								entities[i].state = 0;
2298
2299								if(!game.mobilequicksave_thisroom){
2300									game.autoquicksave = true;
2301									game.mobilequicksave_thisroom = true;
2302								}
2303							}
2304						break;
2305						case 9: //Gravity Lines
2306						  if (entities[i].state == 1) {
2307								entities[i].life--;
2308								entities[i].onentity = 0;
2309
2310								if (entities[i].life <= 0) {
2311								  entities[i].state = 0;
2312									entities[i].onentity = 1;
2313								}
2314							}
2315						break;
2316						case 10: //Vertical gravity Lines
2317						  if (entities[i].state == 1) {
2318								entities[i].onentity = 3;
2319								entities[i].state = 2;
2320
2321
2322								music.playef(8,10);
2323								game.gravitycontrol = (game.gravitycontrol + 1) % 2;
2324						    game.totalflips++;
2325								temp = getplayer();
2326								if (game.gravitycontrol == 0) {
2327									if (entities[temp].vy < 3) entities[temp].vy = 3;
2328								}else {
2329									if (entities[temp].vy > -3) entities[temp].vy = -3;
2330								}
2331							}else if (entities[i].state == 2) {
2332								entities[i].life--;
2333								if (entities[i].life <= 0) {
2334								  entities[i].state = 0;
2335									entities[i].onentity = 1;
2336								}
2337							}else if (entities[i].state == 3) {
2338								entities[i].state = 2; entities[i].life = 4;
2339								entities[i].onentity = 3;
2340							}else if (entities[i].state == 4) {
2341								//Special case for room initilisations: As state one, except without the reversal
2342								entities[i].onentity = 3;
2343								entities[i].state = 2;
2344							}
2345						break;
2346						case 11: //Warp point
2347						  //wait for collision
2348						  if (entities[i].state == 1) {
2349								//Depending on the room the warp point is in, teleport to a new location!
2350								entities[i].onentity = 0;
2351								//play a sound or somefink
2352								music.playef(10);
2353								game.teleport = true;
2354
2355                game.edteleportent = i;
2356								//for the multiple room:
2357								if (int(entities[i].xp) == 12*8) game.teleportxpos = 1;
2358								if (int(entities[i].xp) == 5*8) game.teleportxpos = 2;
2359								if (int(entities[i].xp) == 28*8) game.teleportxpos = 3;
2360								if (int(entities[i].xp) == 21*8) game.teleportxpos = 4;
2361							}
2362						break;
2363						case 12: //Crew member
2364						  //Somewhat complex AI: exactly what they do depends on room, location, state etc
2365							//At state 0, do nothing at all.
2366						  if (entities[i].state == 1) {
2367								//happy!
2368								if (entities[k].rule == 6)	entities[k].tile = 0;
2369								if (entities[k].rule == 7)	entities[k].tile = 6;
2370							  //Stay close to the hero!
2371								j = getplayer();
2372								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2373								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2374
2375								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2376								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2377
2378								//Special rules:
2379								if (game.roomx == 110 && game.roomy == 105) {
2380									if (entities[i].xp < 155) {	if (entities[i].ax < 0) entities[i].ax = 0; }
2381								}
2382							}else if (entities[i].state == 2) {
2383								//Basic rules, don't change expression
2384								j = getplayer();
2385								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2386								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2387
2388								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2389								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2390							}else if (entities[i].state == 10) {
2391								//Everything from 10 on is for cutscenes
2392								//Basic rules, don't change expression
2393								j = getplayer();
2394								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2395								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2396
2397								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2398								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2399							}else if (entities[i].state == 11) {
2400								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
2401								j=getcrewman(1); //purple
2402								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2403								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2404
2405								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2406								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2407							}else if (entities[i].state == 12) {
2408								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
2409								j=getcrewman(2); //yellow
2410								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2411								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2412
2413								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2414								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2415							}else if (entities[i].state == 13) {
2416								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
2417								j=getcrewman(3); //red
2418								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2419								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2420
2421								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2422								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2423							}else if (entities[i].state == 14) {
2424								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
2425								j=getcrewman(4); //green
2426								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2427								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2428
2429								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2430								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2431							}else if (entities[i].state == 15) {
2432								//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
2433								j=getcrewman(5); //blue
2434								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2435								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2436
2437								if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2438								}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2439							}else if (entities[i].state == 16) {
2440								//Follow a position: given an x coordinate, seek it out.
2441								if (entities[i].para > entities[i].xp + 5) { entities[i].dir = 1;
2442								}else if (entities[i].para < entities[i].xp - 5) {	entities[i].dir = 0; }
2443
2444								if (entities[i].para > entities[i].xp + 45) {	entities[i].ax = 3;
2445								}else if (entities[i].para < entities[i].xp - 45) {	entities[i].ax = -3; }
2446							}else if (entities[i].state == 17) {
2447								//stand still
2448							}else if (entities[i].state == 18) {
2449								//Stand still and face the player
2450								j = getplayer();
2451								if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2452								}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2453							}else if (entities[i].state == 19) {
2454								//Walk right off the screen after time t
2455								if (entities[i].para <= 0) {
2456									entities[i].dir = 1;
2457									entities[i].ax = 3;
2458								}else {
2459									entities[i].para--;
2460								}
2461							}else if (entities[i].state == 20) {
2462								//Panic! For briefing script
2463								if (entities[i].life == 0) {
2464									//walk left for a bit
2465									entities[i].ax = 0;
2466									if (40 > entities[i].xp + 5) { entities[i].dir = 1;
2467									}else if (40 < entities[i].xp - 5) {	entities[i].dir = 0; }
2468
2469									if (40 > entities[i].xp + 45) {	entities[i].ax = 3;
2470									}else if (40 < entities[i].xp - 45) {	entities[i].ax = -3; }
2471									if (entities[i].ax == 0) { entities[i].life = 1; entities[i].para = 30;}
2472								}else	if (entities[i].life == 1) {
2473									//Stand around for a bit
2474									entities[i].para--;
2475									if (entities[i].para <= 0) {
2476										entities[i].life++;
2477									}
2478								}else if (entities[i].life == 2) {
2479									//walk right for a bit
2480									entities[i].ax = 0;
2481									if (280 > entities[i].xp + 5) { entities[i].dir = 1;
2482									}else if (280 < entities[i].xp - 5) {	entities[i].dir = 0; }
2483
2484									if (280 > entities[i].xp + 45) {	entities[i].ax = 3;
2485									}else if (280 < entities[i].xp - 45) {	entities[i].ax = -3; }
2486									if (entities[i].ax == 0) { entities[i].life = 3; entities[i].para = 30;}
2487								}else	if (entities[i].life == 3) {
2488									//Stand around for a bit
2489									entities[i].para--;
2490									if (entities[i].para <= 0) {
2491										entities[i].life=0;
2492									}
2493								}
2494							}
2495						break;
2496						case 13: //Terminals (very similar to savepoints)
2497						  //wait for collision
2498						  if (entities[i].state == 1) {
2499								entities[i].colour = 5;
2500						    entities[i].onentity = 0;
2501								music.playef(17,10);
2502
2503								entities[i].state = 0;
2504							}
2505						break;
2506						case 14: //Super Crew member
2507						  //Actually needs less complex AI than the scripting crewmember
2508						  if (entities[i].state == 0) {
2509								//follow player, but only if he's on the floor!
2510								j = getplayer();
2511								if(entities[j].onground>0){
2512									if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2513									}else if (entities[j].xp>15 && entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2514
2515									if (entities[j].xp > entities[i].xp + 45) {	entities[i].ax = 3;
2516									}else if (entities[j].xp < entities[i].xp - 45) {	entities[i].ax = -3; }
2517									if (entities[i].ax < 0 && entities[i].xp < 60) {
2518										entities[i].ax = 0;
2519									}
2520								}else {
2521									if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
2522									}else if (entities[j].xp < entities[i].xp - 5) {	entities[i].dir = 0; }
2523
2524									entities[i].ax = 0;
2525								}
2526
2527								if (entities[i].xp > 240) {
2528									entities[i].ax = 3; entities[i].dir = 1;
2529								}
2530								if (entities[i].xp >= 310) {
2531									game.scmprogress++;
2532									entities[i].active = false;
2533								}
2534							}
2535						break;
2536						case 15: //Trophy
2537						  //wait for collision
2538						  if (entities[i].state == 1) {
2539								trophytext+=2; if (trophytext > 30) trophytext = 30;
2540								trophytype = entities[i].para;
2541
2542								entities[i].state = 0;
2543							}
2544						break;
2545						case 23:
2546						  //swn game!
2547							switch(entities[i].behave) {
2548								case 0:
2549								  if (entities[i].state == 0) { //Init
2550									  entities[i].vx = 7;
2551										if (entities[i].xp > 320) entities[i].active = false;
2552									}
2553								break;
2554								case 1:
2555								  if (entities[i].state == 0) { //Init
2556									  entities[i].vx = -7;
2557										if (entities[i].xp <-20) entities[i].active = false;
2558									}
2559								break;
2560							}
2561						break;
2562						case 51: //Vertical warp line
2563							if (entities[i].state == 2){
2564								var j:int = getplayer();
2565								if(entities[j].xp<=307){
2566									customwarpmodevon=false;
2567									entities[i].state = 0;
2568								}
2569							}else if (entities[i].state == 1){
2570								entities[i].state = 2;
2571								entities[i].statedelay = 2;
2572								entities[i].onentity = 1;
2573								customwarpmodevon=true;
2574							}
2575						break;
2576						case 52: //Vertical warp line
2577							if (entities[i].state == 2){
2578								j = getplayer();
2579								if(entities[j].xp<=307){
2580									customwarpmodevon=false;
2581									entities[i].state = 0;
2582								}
2583							}else if (entities[i].state == 1){
2584								entities[i].state = 2;
2585								entities[i].statedelay = 2;
2586								entities[i].onentity = 1;
2587								customwarpmodevon=true;
2588							}
2589						break;
2590						case 53: //Warp lines Horizonal
2591							if (entities[i].state == 2){
2592								customwarpmodehon=false;
2593								entities[i].state = 0;
2594							}else if (entities[i].state == 1){
2595								entities[i].state = 2;
2596								entities[i].statedelay = 2;
2597								entities[i].onentity = 1;
2598								customwarpmodehon=true;
2599							}
2600						break;
2601						case 54: //Warp lines Horizonal
2602							////if (entities[i].state != 0) {
2603								//trace("entity 54 is still here! ", i, ": state = ", entities[i].state, String(int(Math.random()*100)), entities[i].active);
2604							////}
2605							if (entities[i].state == 2){
2606								customwarpmodehon=false;
2607								entities[i].state = 0;
2608							}else if (entities[i].state == 1){
2609								entities[i].state = 2;
2610								entities[i].statedelay = 2;
2611								entities[i].onentity = 1;
2612								customwarpmodehon=true;
2613							}
2614						break;
2615						case 55: //Collectable crewmate
2616							//wait for collision
2617							if (entities[i].state == 0){
2618								//Basic rules, don't change expression
2619								j = getplayer();
2620								if (entities[j].xp > entities[i].xp + 5){
2621									entities[i].dir = 1;
2622								}else if (entities[j].xp < entities[i].xp - 5) {
2623									entities[i].dir = 0;
2624								}
2625							}else if (entities[i].state == 1){
2626								game.crewmates++;
2627								if (game.intimetrial){
2628									customcollect[entities[i].para] = 1;
2629									music.playef(27,10);
2630								}else{
2631									game.state = 1010;
2632									//music.haltdasmusik();
2633									if(music.currentsong!=-1) music.silencedasmusik();
2634									music.playef(27,10);
2635									customcollect[entities[i].para] = 1;
2636								}
2637
2638								entities[i].active = false;
2639							}
2640						break;
2641						case 100: //The teleporter
2642						  if (entities[i].state == 1) {
2643								//if inactive, activate!
2644								if (entities[i].tile == 1) {
2645								  music.playef(18, 10);
2646									entities[i].onentity = 0;
2647									entities[i].tile = 2;
2648									entities[i].colour = 101;
2649									if(!game.intimetrial && !game.nodeathmode){
2650									  game.state = 2000; game.statedelay = 0;
2651									}
2652
2653									game.activetele = true;
2654									game.teleblock.x = entities[i].xp - 32;	game.teleblock.y = entities[i].yp - 32;
2655									game.teleblock.width = 160;							game.teleblock.height = 160;
2656
2657
2658									//Alright, let's set this as our savepoint too
2659									//First, deactivate all other savepoints
2660									for (j = 0; j < nentity; j++) {
2661										if (entities[j].type == 8 && entities[j].active) {
2662											entities[j].colour = 4; entities[j].onentity = 1;
2663										}
2664									}
2665									game.savepoint = entities[i].para;
2666									game.savex = entities[i].xp + 44;
2667									game.savey = entities[i].yp + 44;
2668									game.savegc = 0;
2669
2670									game.saverx = game.roomx; game.savery = game.roomy;
2671									game.savedir = entities[getplayer()].dir;
2672									entities[i].state = 0;
2673
2674									if(!game.mobilequicksave_thisroom){
2675										game.autoquicksave = true;
2676										game.mobilequicksave_thisroom = true;
2677									}
2678								}
2679
2680								entities[i].state = 0;
2681							}else if (entities[i].state == 2) {
2682								//Initilise the teleporter without changing the game state or playing sound
2683								entities[i].onentity = 0;
2684								entities[i].tile = 6;
2685								entities[i].colour = 102;
2686
2687								game.activetele = true;
2688								game.teleblock.x = entities[i].xp - 32;	game.teleblock.y = entities[i].yp - 32;
2689								game.teleblock.width = 160;							game.teleblock.height = 160;
2690
2691								entities[i].state = 0;
2692							}
2693						break;
2694					}
2695				}else {
2696					entities[i].statedelay--;
2697					if (entities[i].statedelay < 0) entities[i].statedelay = 0;
2698				}
2699			}
2700
2701			return true;
2702		}
2703
2704		public function animateentities(i:int, game:gameclass, help:helpclass):void {
2705			if(entities[i].active){
2706				if(entities[i].statedelay<=0){
2707					switch(entities[i].type) {
2708						case 0:
2709						  entities[i].framedelay--;
2710							if(entities[i].dir==1){
2711								entities[i].drawframe=entities[i].tile;
2712							}else{
2713								entities[i].drawframe=entities[i].tile+3;
2714							}
2715
2716							if(entities[i].onground>0 || entities[i].onroof>0){
2717							  if(int(entities[i].vx)!=0){
2718									//Walking
2719									if(entities[i].framedelay<=0){
2720										entities[i].framedelay=4;
2721										entities[i].walkingframe++;
2722									}
2723									if (entities[i].walkingframe >=2) entities[i].walkingframe=0;
2724									entities[i].drawframe += entities[i].walkingframe + 1;
2725								}
2726
2727							  if (entities[i].onroof > 0) entities[i].drawframe += 6;
2728							}else {
2729								entities[i].drawframe ++;
2730								if (game.gravitycontrol == 1) {
2731									entities[i].drawframe += 6;
2732								}
2733							}
2734
2735							if (game.deathseq > -1) {
2736							  entities[i].drawframe=13;
2737								if (entities[i].dir == 1) entities[i].drawframe = 12;
2738								if (game.gravitycontrol == 1) entities[i].drawframe += 2;
2739							}
2740						break;
2741						case 1: case 23:
2742						  //Variable animation
2743							switch(entities[i].animate) {
2744								case 0:
2745								  //Simple oscilation
2746									entities[i].framedelay--;
2747									if(entities[i].framedelay<=0){
2748										entities[i].framedelay = 8;
2749										if(entities[i].actionframe==0){
2750										  entities[i].walkingframe++;
2751											if (entities[i].walkingframe == 4) {
2752												entities[i].walkingframe = 2;
2753												entities[i].actionframe = 1;
2754											}
2755										}else {
2756											entities[i].walkingframe--;
2757											if (entities[i].walkingframe == -1) {
2758												entities[i].walkingframe = 1;
2759												entities[i].actionframe = 0;
2760											}
2761										}
2762									}
2763
2764							    entities[i].drawframe = entities[i].tile;
2765									entities[i].drawframe += entities[i].walkingframe;
2766								break;
2767								case 1:
2768								  //Simple Loop
2769									entities[i].framedelay--;
2770									if(entities[i].framedelay<=0){
2771										entities[i].framedelay = 8;
2772										entities[i].walkingframe++;
2773										if (entities[i].walkingframe == 4) {
2774											entities[i].walkingframe = 0;
2775										}
2776									}
2777
2778							    entities[i].drawframe = entities[i].tile;
2779									entities[i].drawframe += entities[i].walkingframe;
2780								break;
2781								case 2:
2782								  //Simpler Loop (just two frames)
2783									entities[i].framedelay--;
2784									if(entities[i].framedelay<=0){
2785										entities[i].framedelay = 2;
2786										entities[i].walkingframe++;
2787										if (entities[i].walkingframe == 2) {
2788											entities[i].walkingframe = 0;
2789										}
2790									}
2791
2792							    entities[i].drawframe = entities[i].tile;
2793									entities[i].drawframe += entities[i].walkingframe;
2794								break;
2795								case 3:
2796								  //Simpler Loop (just two frames, but double sized)
2797									entities[i].framedelay--;
2798									if(entities[i].framedelay<=0){
2799										entities[i].framedelay = 2;
2800										entities[i].walkingframe++;
2801										if (entities[i].walkingframe == 2) {
2802											entities[i].walkingframe = 0;
2803										}
2804									}
2805
2806							    entities[i].drawframe = entities[i].tile;
2807									entities[i].drawframe += (entities[i].walkingframe*2);
2808								break;
2809								case 4:
2810								  //Simpler Loop (just two frames, but double sized) (as above but slower)
2811									entities[i].framedelay--;
2812									if(entities[i].framedelay<=0){
2813										entities[i].framedelay = 6;
2814										entities[i].walkingframe++;
2815										if (entities[i].walkingframe == 2) {
2816											entities[i].walkingframe = 0;
2817										}
2818									}
2819
2820							    entities[i].drawframe = entities[i].tile;
2821									entities[i].drawframe += (entities[i].walkingframe*2);
2822								break;
2823								case 5:
2824								  //Simpler Loop (just two frames) (slower)
2825									entities[i].framedelay--;
2826									if(entities[i].framedelay<=0){
2827										entities[i].framedelay = 6;
2828										entities[i].walkingframe++;
2829										if (entities[i].walkingframe == 2) {
2830											entities[i].walkingframe = 0;
2831										}
2832									}
2833
2834							    entities[i].drawframe = entities[i].tile;
2835									entities[i].drawframe += entities[i].walkingframe;
2836								break;
2837								case 6:
2838								  //Normal Loop (four frames, double sized)
2839									entities[i].framedelay--;
2840									if(entities[i].framedelay<=0){
2841										entities[i].framedelay = 4;
2842										entities[i].walkingframe++;
2843										if (entities[i].walkingframe == 4) {
2844											entities[i].walkingframe = 0;
2845										}
2846									}
2847
2848							    entities[i].drawframe = entities[i].tile;
2849									entities[i].drawframe += (entities[i].walkingframe*2);
2850								break;
2851								case 7:
2852								  //Simpler Loop (just two frames) (slower) (with directions!)
2853									entities[i].framedelay--;
2854									if(entities[i].framedelay<=0){
2855										entities[i].framedelay = 6;
2856										entities[i].walkingframe++;
2857										if (entities[i].walkingframe == 2) {
2858											entities[i].walkingframe = 0;
2859										}
2860									}
2861
2862							    entities[i].drawframe = entities[i].tile;
2863									entities[i].drawframe += entities[i].walkingframe;
2864
2865									if (entities[i].vx > 0) entities[i].drawframe += 2;
2866								break;
2867								case 10:
2868								  //Threadmill left
2869									entities[i].framedelay--;
2870									if(entities[i].framedelay<=0){
2871										entities[i].framedelay = 3;//(6-entities[i].para);
2872										entities[i].walkingframe--;
2873										if (entities[i].walkingframe == -1) {
2874											entities[i].walkingframe = 3;
2875										}
2876									}
2877
2878							    entities[i].drawframe = entities[i].tile;
2879									entities[i].drawframe += entities[i].walkingframe;
2880								break;
2881								case 11:
2882								  //Threadmill right
2883									entities[i].framedelay--;
2884									if(entities[i].framedelay<=0){
2885										entities[i].framedelay = 3;//(6-entities[i].para);
2886										entities[i].walkingframe++;
2887										if (entities[i].walkingframe == 4) {
2888											entities[i].walkingframe = 0;
2889										}
2890									}
2891
2892							    entities[i].drawframe = entities[i].tile;
2893									entities[i].drawframe += entities[i].walkingframe;
2894								break;
2895								case 100:
2896								  //Simple case for no animation (platforms, etc)
2897								  entities[i].drawframe = entities[i].tile;
2898								break;
2899								default:
2900							    entities[i].drawframe = entities[i].tile;
2901								break;
2902							}
2903						break;
2904						case 11:
2905							entities[i].drawframe = entities[i].tile;
2906							if(entities[i].animate==2) {
2907								//Simpler Loop (just two frames)
2908								entities[i].framedelay--;
2909								if(entities[i].framedelay<=0){
2910									entities[i].framedelay = 10;
2911									entities[i].walkingframe++;
2912									if (entities[i].walkingframe == 2) {
2913										entities[i].walkingframe = 0;
2914									}
2915								}
2916
2917								entities[i].drawframe = entities[i].tile;
2918								entities[i].drawframe += entities[i].walkingframe;
2919							}
2920  					break;
2921						case 12: case 55: case 14: //Crew member! Very similar to hero
2922						  entities[i].framedelay--;
2923							if(entities[i].dir==1){
2924								entities[i].drawframe=entities[i].tile;
2925							}else{
2926								entities[i].drawframe=entities[i].tile+3;
2927							}
2928
2929							if(entities[i].onground>0 || entities[i].onroof>0){
2930							  if(entities[i].vx!=0){
2931									//Walking
2932									if(entities[i].framedelay<=0){
2933										entities[i].framedelay=4;
2934										entities[i].walkingframe++;
2935									}
2936									if (entities[i].walkingframe >=2) entities[i].walkingframe=0;
2937									entities[i].drawframe += entities[i].walkingframe + 1;
2938								}
2939
2940							  //if (entities[i].onroof > 0) entities[i].drawframe += 6;
2941							}else {
2942								entities[i].drawframe ++;
2943								//if (game.gravitycontrol == 1) {
2944								//	entities[i].drawframe += 6;
2945								//}
2946							}
2947
2948							if (game.deathseq > -1) {
2949							  entities[i].drawframe=13;
2950								if (entities[i].dir == 1) entities[i].drawframe = 12;
2951								if (entities[i].rule == 7) entities[i].drawframe += 2;
2952								//if (game.gravitycontrol == 1) entities[i].drawframe += 2;
2953							}
2954						break;
2955						case 100: //the teleporter!
2956						  if (entities[i].tile == 1) {
2957								//it's inactive
2958								entities[i].drawframe = entities[i].tile;
2959							}else if (entities[i].tile == 2){
2960								entities[i].drawframe = entities[i].tile;
2961
2962								entities[i].framedelay--;
2963								if(entities[i].framedelay<=0){
2964									entities[i].framedelay = 1;
2965									entities[i].walkingframe = int(Math.random() * 6);
2966									if (entities[i].walkingframe >= 4) {
2967										entities[i].walkingframe = -1;
2968									  entities[i].framedelay = 4;
2969									}
2970								}
2971
2972								entities[i].drawframe = entities[i].tile;
2973								entities[i].drawframe += entities[i].walkingframe;
2974							}else if (entities[i].tile == 6) {
2975								//faster!
2976								entities[i].drawframe = entities[i].tile;
2977
2978								entities[i].framedelay--;
2979								if(entities[i].framedelay<=0){
2980									entities[i].framedelay = 2;
2981									entities[i].walkingframe = int(Math.random() * 6);
2982									if (entities[i].walkingframe >= 4) {
2983										entities[i].walkingframe = -5;
2984									  entities[i].framedelay = 4;
2985									}
2986								}
2987
2988								entities[i].drawframe = entities[i].tile;
2989								entities[i].drawframe += entities[i].walkingframe;
2990							}
2991						break;
2992						default:
2993							entities[i].drawframe = entities[i].tile;
2994						break;
2995					}
2996				}else {
2997					//entities[i].statedelay--;
2998					if (entities[i].statedelay < 0) entities[i].statedelay = 0;
2999				}
3000			}
3001		}
3002
3003		public function gettype(t:int):Boolean {
3004		  //Returns true is there is an entity of type t onscreen
3005			for (var i:int = 0; i < nentity; i++) {
3006				if(entities[i].type==t){
3007			    return true;
3008				}
3009			}
3010
3011			return false;
3012		}
3013
3014		public function getcompanion(t:int):int {
3015		  //Returns the index of the companion with rule t
3016			for (var i:int = 0; i < nentity; i++) {
3017				if(entities[i].rule==6 || entities[i].rule==7){
3018			    return i;
3019				}
3020			}
3021
3022			return -1;
3023		}
3024
3025		public function getplayer():int {
3026		  //Returns the index of the first player entity
3027			for (var i:int = 0; i < nentity; i++) {
3028				if (entities[i].type == 0) {
3029			    return i;
3030				}
3031			}
3032
3033			return -1;
3034		}
3035
3036		public function getscm():int {
3037		  //Returns the supercrewmate
3038			for (var i:int = 0; i < nentity; i++) {
3039				if(entities[i].type==14){
3040			    return i;
3041				}
3042			}
3043
3044			return 0;
3045		}
3046
3047		public function getlineat(t:int):int {
3048			//Get the entity which is a horizontal line at height t (for SWN game)
3049			for (var i:int = 0; i < nentity; i++) {
3050				if (entities[i].size == 5) {
3051					if (entities[i].yp == t) {
3052					  return i;
3053					}
3054				}
3055			}
3056
3057			return 0;
3058		}
3059
3060		public function getcrewman(t:int):int {
3061		  //Returns the index of the crewman with colour index given by t
3062			if (t == 0) t = 0;
3063			if (t == 1) t = 20;
3064			if (t == 2) t = 14;
3065			if (t == 3) t = 15;
3066			if (t == 4) t = 13;
3067			if (t == 5) t = 16;
3068
3069			for (var i:int = 0; i < nentity; i++) {
3070				if (entities[i].rule == 6 || entities[i].rule == 7) {
3071					if(entities[i].colour==t){
3072			      return i;
3073					}
3074				}
3075			}
3076
3077			return 0;
3078		}
3079
3080		public function getcustomcrewman(t:int):int {
3081			//Returns the index of the crewman with colour index given by t
3082			if (t == 0) t = 0;
3083			if (t == 1) t = 20;
3084			if (t == 2) t = 14;
3085			if (t == 3) t = 15;
3086			if (t == 4) t = 13;
3087			if (t == 5) t = 16;
3088
3089			for (var i:int = 0; i < nentity; i++){
3090				if (entities[i].type == 55){
3091					if(entities[i].colour==t){
3092						return i;
3093					}
3094				}
3095			}
3096
3097			return 0;
3098		}
3099
3100		public function getteleporter():int {
3101			for (var i:int = 0; i < nentity; i++) {
3102				if(entities[i].type==100 && entities[i].active){
3103			    return i;
3104				}
3105			}
3106
3107			return -1;
3108		}
3109
3110		public function rectset(xi:int, yi:int, wi:int, hi:int):void {
3111			temprect.x = xi; temprect.y = yi; temprect.width = wi; temprect.height = hi;
3112		}
3113
3114		public function rect2set(xi:int, yi:int, wi:int, hi:int):void {
3115			temprect2.x = xi; temprect2.y = yi; temprect2.width = wi; temprect2.height = hi;
3116		}
3117
3118		public function entitycollide(a:int, b:int):Boolean {
3119			//Do entities a and b collide?
3120			tempx = entities[a].xp + entities[a].cx; tempy = entities[a].yp + entities[a].cy;
3121			tempw = entities[a].w; temph = entities[a].h;
3122			rectset(tempx, tempy, tempw, temph);
3123
3124			tempx = entities[b].xp + entities[b].cx; tempy = entities[b].yp + entities[b].cy;
3125			tempw = entities[b].w; temph = entities[b].h;
3126			rect2set(tempx, tempy, tempw, temph);
3127
3128			if (temprect.intersects(temprect2)) return true;
3129			return false;
3130		}
3131
3132		public function checkdirectional(t:int):Boolean{
3133			//Returns true if player entity (rule 0) moving in dir t through directional block
3134			if(opt_usedirectional){
3135				i = getplayer();
3136				if (i > -1) {
3137					if(entities[i].rule==0){
3138						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
3139						tempw = entities[i].w; temph = entities[i].h;
3140						rectset(tempx, tempy, tempw, temph);
3141
3142						for (j = 0; j < nblocks; j++) {
3143							if (blocks[j].type == DIRECTIONAL && blocks[j].active){
3144								if(blocks[j].rect.intersects(temprect)) {
3145									return true;
3146								}
3147							}
3148						}
3149					}
3150				}
3151			}
3152			return false;
3153		}
3154
3155		public function checkdamage():Boolean{
3156			//Returns true if player entity (rule 0) collides with a damagepoint
3157			if(opt_usedamage){
3158				i = getplayer();
3159				if (i > -1) {
3160					if(entities[i].rule==0){
3161						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
3162						tempw = entities[i].w; temph = entities[i].h;
3163						rectset(tempx, tempy, tempw, temph);
3164
3165						for (j=0; j<nblocks; j++){
3166							if (blocks[j].type == DAMAGE && blocks[j].active){
3167								if(blocks[j].rect.intersects(temprect)) {
3168									return true;
3169								}
3170							}
3171						}
3172					}
3173				}
3174			}
3175			return false;
3176		}
3177
3178		public function scmcheckdamage():Boolean{
3179			//Returns true if supercrewmate collides with a damagepoint
3180			for(i = 0; i < nentity; i++) {
3181				if(entities[i].type==14){
3182					tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
3183					tempw = entities[i].w; temph = entities[i].h;
3184					rectset(tempx, tempy, tempw, temph);
3185
3186					for (j=0; j<nblocks; j++){
3187						if (blocks[j].type == DAMAGE && blocks[j].active){
3188							if(blocks[j].rect.intersects(temprect)) {
3189								return true;
3190							}
3191						}
3192					}
3193				}
3194			}
3195			return false;
3196		}
3197
3198		public function settemprect(t:int):void {
3199			//setup entity t in temprect
3200			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
3201			tempw = entities[t].w; temph = entities[t].h;
3202			rectset(tempx, tempy, tempw, temph);
3203		}
3204
3205		public function checktrigger():int{
3206			//Returns an int player entity (rule 0) collides with a trigger
3207			if (opt_usetrigger) {
3208				i = getplayer();
3209				if (i > -1) {
3210					if(entities[i].rule==0){
3211						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
3212						tempw = entities[i].w; temph = entities[i].h;
3213						rectset(tempx, tempy, tempw, temph);
3214
3215						for (j=0; j<nblocks; j++){
3216							if (blocks[j].type == TRIGGER && blocks[j].active){
3217								if (blocks[j].rect.intersects(temprect)) {
3218									activetrigger = blocks[j].trigger;
3219									return blocks[j].trigger;
3220								}
3221							}
3222						}
3223					}
3224				}
3225			}
3226			return -1;
3227		}
3228
3229		public function checkactivity():int{
3230			//Returns an int player entity (rule 0) collides with an activity
3231		  if(opt_useactivity){
3232				i = getplayer();
3233				if(i>-1){
3234					if(entities[i].rule==0){
3235						tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
3236						tempw = entities[i].w; temph = entities[i].h;
3237						rectset(tempx, tempy, tempw, temph);
3238
3239						for (j=0; j<nblocks; j++){
3240							if (blocks[j].type == ACTIVITY && blocks[j].active){
3241								if (blocks[j].rect.intersects(temprect)) {
3242									return j;
3243								}
3244							}
3245						}
3246					}
3247				}
3248			}
3249			return -1;
3250		}
3251
3252		public function getgridpoint(t:int):int {
3253			t = (t - (t % 8)) / 8;
3254			return t;
3255		}
3256
3257		public function cblocks(t:int):Boolean {
3258			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
3259			tempw = entities[t].w; temph = entities[t].h;
3260			rectset(tempx, tempy, tempw, temph);
3261
3262			return checkblocks();
3263		}
3264
3265		public function checkplatform():Boolean {
3266			//Return true if rectset intersects a moving platform, setups px & py to the platform x & y
3267			for (i = 0; i < nblocks; i++) {
3268				if (blocks[i].active) {
3269					if (blocks[i].type == BLOCK){
3270						if (blocks[i].rect.intersects(temprect)) {
3271							px = blocks[i].xp; py = blocks[i].yp;
3272							return true;
3273						}
3274					}
3275				}
3276			}
3277			return false;
3278		}
3279
3280		public function checkblocks():Boolean {
3281			for (i = 0; i < nblocks; i++) {
3282				if (blocks[i].active) {
3283					if (!skipdirblocks) {
3284						if (blocks[i].type == DIRECTIONAL) {
3285							if (dy > 0 && blocks[i].trigger == 0) if (blocks[i].rect.intersects(temprect)) return true;
3286							if (dy <= 0 && blocks[i].trigger == 1) if (blocks[i].rect.intersects(temprect)) return true;
3287							if (dx > 0 && blocks[i].trigger == 2) if (blocks[i].rect.intersects(temprect)) return true;
3288							if (dx <= 0 && blocks[i].trigger == 3) if (blocks[i].rect.intersects(temprect)) return true;
3289						}
3290					}
3291					if (blocks[i].type == BLOCK){
3292						if (blocks[i].rect.intersects(temprect)) {
3293							return true;
3294						}
3295					}
3296					if (blocks[i].type == SAFE) {
3297						if(dr==1){
3298							if (blocks[i].rect.intersects(temprect)) {
3299								return true;
3300							}
3301						}
3302					}
3303				}
3304			}
3305			return false;
3306		}
3307
3308		public function checktowerspikes(t:int, map:mapclass):Boolean {
3309			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
3310			tempw = entities[t].w; temph = entities[t].h;
3311			rectset(tempx, tempy, tempw, temph);
3312
3313      tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y);
3314			tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1);
3315			if (map.spikecollide(tempx, tempy)) return true;
3316			if (map.spikecollide(tempw, tempy)) return true;
3317			if (map.spikecollide(tempx, temph)) return true;
3318			if (map.spikecollide(tempw, temph)) return true;
3319			if (temprect.height >= 12) {
3320				tpy1 = getgridpoint(temprect.y + 6);
3321				if (map.spikecollide(tempx, tpy1)) return true;
3322			  if (map.spikecollide(tempw, tpy1)) return true;
3323				if (temprect.height >= 18) {
3324					tpy1 = getgridpoint(temprect.y + 12);
3325					if (map.spikecollide(tempx, tpy1)) return true;
3326					if (map.spikecollide(tempw, tpy1)) return true;
3327					if (temprect.height >= 24) {
3328						tpy1 = getgridpoint(temprect.y + 18);
3329						if (map.spikecollide(tempx, tpy1)) return true;
3330						if (map.spikecollide(tempw, tpy1)) return true;
3331					}
3332				}
3333			}
3334			if (temprect.width >= 12) {
3335				tpx1 = getgridpoint(temprect.x + 6);
3336			if (map.collide(tpx1, tempy)) return true;
3337			if (map.collide(tpx1, temph)) return true;
3338			}
3339			return false;
3340		}
3341
3342		public function checkwall(map:mapclass):Boolean{
3343			//Returns true if entity setup in temprect collides with a wall
3344			//used for proper collision functions; you can't just, like, call it
3345			//whenever you feel like it and expect a response
3346			//
3347			//that won't work at all
3348			if(skipblocks){
3349				if (checkblocks()) return true;
3350			}
3351
3352			tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y);
3353			tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1);
3354			if (map.collide(tempx, tempy)) return true;
3355			if (map.collide(tempw, tempy)) return true;
3356			if (map.collide(tempx, temph)) return true;
3357			if (map.collide(tempw, temph)) return true;
3358			if (temprect.height >= 12) {
3359				tpy1 = getgridpoint(temprect.y + 6);
3360				if (map.collide(tempx, tpy1)) return true;
3361			  if (map.collide(tempw, tpy1)) return true;
3362				if (temprect.height >= 18) {
3363					tpy1 = getgridpoint(temprect.y + 12);
3364					if (map.collide(tempx, tpy1)) return true;
3365					if (map.collide(tempw, tpy1)) return true;
3366					if (temprect.height >= 24) {
3367						tpy1 = getgridpoint(temprect.y + 18);
3368						if (map.collide(tempx, tpy1)) return true;
3369						if (map.collide(tempw, tpy1)) return true;
3370					}
3371				}
3372			}
3373			if (temprect.width >= 12) {
3374				tpx1 = getgridpoint(temprect.x + 6);
3375			if (map.collide(tpx1, tempy)) return true;
3376			if (map.collide(tpx1, temph)) return true;
3377			}
3378			return false;
3379		}
3380
3381		public function hplatformat():Number {
3382			//Returns first entity of horizontal platform at (px, py), -1000 otherwise.
3383			for (i = 0; i < nentity; i++) {
3384				if (entities[i].active) {
3385					if (entities[i].rule == 2) {
3386						if (entities[i].behave >= 2) {
3387							if (entities[i].xp == px && entities[i].yp == py) {
3388							  if (entities[i].behave == 8) { //threadmill!
3389									return entities[i].para;
3390								}else if(entities[i].behave == 9) { //threadmill!
3391									return -entities[i].para;
3392								}else{
3393								  return entities[i].vx;
3394								}
3395							}
3396						}
3397					}
3398				}
3399			}
3400			return -1000;
3401		}
3402
3403		public function yline(a:int, b:int):int {
3404			if (a < b) return -1;
3405			return 1;
3406		}
3407
3408		public function entityhlinecollide(t:int, l:int):Boolean {
3409			//Returns true is entity t collided with the horizontal line l.
3410			if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){
3411			  if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){
3412					linetemp = 0;
3413
3414					linetemp += yline(entities[t].yp, entities[l].yp);
3415					linetemp += yline(entities[t].yp + entities[t].h, entities[l].yp);
3416					linetemp += yline(entities[t].oldyp, entities[l].yp);
3417					linetemp += yline(entities[t].oldyp + entities[t].h, entities[l].yp);
3418
3419					if (linetemp > -4 && linetemp < 4) return true;
3420					return false;
3421				}
3422			}
3423			return false;
3424		}
3425
3426		public function entityvlinecollide(t:int, l:int):Boolean {
3427			//Returns true is entity t collided with the vertical line l.
3428			if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){
3429			  if(entities[t].yp + entities[t].cy<=entities[l].yp+entities[l].h){
3430					linetemp = 0;
3431
3432					linetemp += yline(entities[t].xp + entities[t].cx+1, entities[l].xp);
3433					linetemp += yline(entities[t].xp + entities[t].cx+1 + entities[t].w, entities[l].xp);
3434					linetemp += yline(entities[t].oldxp + entities[t].cx+1, entities[l].xp);
3435					linetemp += yline(entities[t].oldxp + entities[t].cx+1 + entities[t].w, entities[l].xp);
3436
3437					if (linetemp > -4 && linetemp < 4) return true;
3438					return false;
3439				}
3440			}
3441			return false;
3442		}
3443
3444		public function entitywarphlinecollide(t:int, l:int):Boolean {
3445			//Returns true is entity t collided with the horizontal line l.
3446			if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){
3447			  if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){
3448					linetemp = 0;
3449					if (entities[l].yp < 120) {
3450						//Top line
3451						if (entities[t].vy < 0) {
3452							if (entities[t].yp < entities[l].yp + 10) linetemp++;
3453							if (entities[t].yp + entities[t].h < entities[l].yp + 10) linetemp++;
3454							if (entities[t].oldyp < entities[l].yp + 10) linetemp++;
3455							if (entities[t].oldyp + entities[t].h < entities[l].yp + 10) linetemp++;
3456						}
3457
3458						if (linetemp > 0) return true;
3459						return false;
3460					}else {
3461						//Bottom line
3462						if (entities[t].vy > 0) {
3463							if (entities[t].yp > entities[l].yp - 10) linetemp++;
3464							if (entities[t].yp + entities[t].h > entities[l].yp - 10) linetemp++;
3465							if (entities[t].oldyp > entities[l].yp - 10) linetemp++;
3466							if (entities[t].oldyp + entities[t].h > entities[l].yp - 10) linetemp++;
3467						}
3468
3469						if (linetemp > 0) return true;
3470						return false;
3471					}
3472				}
3473			}
3474			return false;
3475		}
3476
3477		public function entitywarpvlinecollide(t:int, l:int):Boolean {
3478			//Returns true is entity t collided with the vertical warp line l.
3479			if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){
3480			  if (entities[t].yp + entities[t].cy <= entities[l].yp + entities[l].h) {
3481					linetemp = 0;
3482					if (entities[l].xp < 160) {
3483						//Left hand line
3484						if (entities[t].xp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++;
3485						if (entities[t].xp + entities[t].cx+1 + entities[t].w < entities[l].xp + 10) linetemp++;
3486						if (entities[t].oldxp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++;
3487						if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w < entities[l].xp + 10) linetemp++;
3488
3489						if (linetemp > 0) return true;
3490						return false;
3491					}else {
3492						//Right hand line
3493						if (entities[t].xp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++;
3494						if (entities[t].xp + entities[t].cx+1 + entities[t].w > entities[l].xp - 10) linetemp++;
3495						if (entities[t].oldxp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++;
3496						if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w > entities[l].xp - 10) linetemp++;
3497
3498						if (linetemp > 0) return true;
3499						return false;
3500					}
3501				}
3502			}
3503			return false;
3504		}
3505
3506		public function entitycollideplatformroof(map:mapclass, t:int):Number{
3507			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy -1;
3508			tempw = entities[t].w; temph = entities[t].h;
3509			rectset(tempx, tempy, tempw, temph);
3510
3511			if (checkplatform()) {
3512				//px and py now contain an x y coordinate for a platform, find it
3513				return hplatformat();
3514			}
3515			return -1000;
3516		}
3517
3518		public function entitycollideplatformfloor(map:mapclass, t:int):Number{
3519			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1;
3520			tempw = entities[t].w; temph = entities[t].h;
3521			rectset(tempx, tempy, tempw, temph);
3522
3523			if (checkplatform()) {
3524				//px and py now contain an x y coordinate for a platform, find it
3525				return hplatformat();
3526			}
3527			return -1000;
3528		}
3529
3530		public function entitycollidefloor(map:mapclass, t:int):Boolean{
3531			//see? like here, for example!
3532			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1;
3533			tempw = entities[t].w; temph = entities[t].h;
3534			rectset(tempx, tempy, tempw, temph);
3535
3536			if (checkwall(map)) return true;
3537			return false;
3538		}
3539
3540		public function entitycollideroof(map:mapclass, t:int):Boolean{
3541			//and here!
3542			tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy - 1;
3543			tempw = entities[t].w; temph = entities[t].h;
3544			rectset(tempx, tempy, tempw, temph);
3545
3546			if (checkwall(map)) return true;
3547			return false;
3548		}
3549
3550		public function testwallsx(t:int, map:mapclass, tx:int, ty:int):Boolean{
3551			tempx = tx + entities[t].cx; tempy = ty + entities[t].cy;
3552			tempw = entities[t].w; temph = entities[t].h;
3553			rectset(tempx, tempy, tempw, temph);
3554
3555			if (entities[t].rule < 2) {	skipblocks = true; } else { skipblocks = false; }
3556			if (entities[t].type == 14) skipblocks = true;
3557			dx = 0; dy = 0; if (entities[t].rule == 0) dx = entities[t].vx;
3558			dr = entities[t].rule;
3559
3560			//Ok, now we check walls
3561			if (checkwall(map)) {
3562				if (entities[t].vx > 1) {
3563					entities[t].vx--;
3564					entities[t].newxp = int(entities[t].xp + entities[t].vx);
3565					return testwallsx(t, map, entities[t].newxp, entities[t].yp);
3566				}else if (entities[t].vx < -1) {
3567					entities[t].vx++;
3568					entities[t].newxp = int(entities[t].xp + entities[t].vx);
3569					return testwallsx(t, map, entities[t].newxp, entities[t].yp);
3570				}else {
3571					entities[t].vx=0;
3572					return false;
3573				}
3574			}
3575			return true;
3576		}
3577
3578		public function testwallsy(t:int, map:mapclass, tx:int, ty:int):Boolean {
3579			tempx = tx + entities[t].cx; tempy = ty + entities[t].cy;
3580			tempw = entities[t].w; temph = entities[t].h;
3581			rectset(tempx, tempy, tempw, temph);
3582
3583			if (entities[t].rule < 2) {	skipblocks = true; } else { skipblocks = false; }
3584			if (entities[t].type == 14) skipblocks = true;
3585
3586			dx = 0; dy = 0;  if (entities[t].rule == 0) dy = entities[t].vy;
3587			dr = entities[t].rule;
3588
3589			//Ok, now we check walls
3590			if (checkwall(map)) {
3591				if (entities[t].vy > 1) {
3592					entities[t].vy--;
3593					entities[t].newyp = int(entities[t].yp + entities[t].vy);
3594					return testwallsy(t, map, entities[t].xp, entities[t].newyp);
3595				}else if (entities[t].vy < -1) {
3596					entities[t].vy++;
3597					entities[t].newyp = int(entities[t].yp + entities[t].vy);
3598					return testwallsy(t, map, entities[t].xp, entities[t].newyp);
3599				}else {
3600					entities[t].vy=0;
3601					return false;
3602				}
3603			}
3604			return true;
3605		}
3606
3607		public function fixfriction(t:int, xfix:Number, xrate:Number, yrate:Number):void{
3608			if (entities[t].vx > xfix) entities[t].vx -= xrate;
3609			if (entities[t].vx < xfix) entities[t].vx += xrate;
3610			if (entities[t].vy > 0) entities[t].vy -= yrate;
3611			if (entities[t].vy < 0) entities[t].vy += yrate;
3612			if (entities[t].vy > 10) entities[t].vy = 10;
3613			if (entities[t].vy < -10) entities[t].vy = -10;
3614			if (entities[t].vx > 6) entities[t].vx = 6;
3615			if (entities[t].vx < -6) entities[t].vx = -6;
3616
3617			if (Math.abs(entities[t].vx-xfix) <= xrate) entities[t].vx = xfix;
3618			if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0;
3619		}
3620
3621		public function applyfriction(t:int, xrate:Number, yrate:Number):void{
3622			if (entities[t].vx > 0) entities[t].vx -= xrate;
3623			if (entities[t].vx < 0) entities[t].vx += xrate;
3624			if (entities[t].vy > 0) entities[t].vy -= yrate;
3625			if (entities[t].vy < 0) entities[t].vy += yrate;
3626			if (entities[t].vy > 10) entities[t].vy = 10;
3627			if (entities[t].vy < -10) entities[t].vy = -10;
3628			if (entities[t].vx > 6) entities[t].vx = 6;
3629			if (entities[t].vx < -6) entities[t].vx = -6;
3630
3631			if (Math.abs(entities[t].vx) <= xrate) entities[t].vx = 0;
3632			if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0;
3633		}
3634
3635		public function cleanup():void {
3636			i = nentity - 1; while (i >= 0 && !entities[i].active) { nentity--; i--; }
3637			i = nblocks - 1; while (i >= 0 && !blocks[i].active) { nblocks--; i--; }
3638		}
3639
3640		public function updateentitylogic(t:int, game:gameclass):void {
3641			entities[t].oldxp = entities[t].xp; entities[t].oldyp = entities[t].yp;
3642
3643			entities[t].vx = entities[t].vx + entities[t].ax;
3644			entities[t].vy = entities[t].vy + entities[t].ay;
3645			entities[t].ax = 0;
3646
3647			if (entities[t].gravity) {
3648				if (entities[t].rule == 0) {
3649					if(game.gravitycontrol==0){
3650						entities[t].ay = 3;
3651					}else {
3652						entities[t].ay = -3;
3653					}
3654				}else if (entities[t].rule == 7) {
3655					entities[t].ay = -3;
3656				}else {
3657					entities[t].ay = 3;
3658				}
3659				applyfriction(t, game.inertia, 0.25);
3660			}
3661
3662			entities[t].newxp = entities[t].xp + entities[t].vx;
3663			entities[t].newyp = entities[t].yp + entities[t].vy;
3664		}
3665
3666
3667		public function entitymapcollision(t:int, map:mapclass):void {
3668			if (testwallsx(t, map, entities[t].newxp, entities[t].yp)) {
3669				entities[t].xp = entities[t].newxp;
3670			}else {
3671				if (entities[t].onwall > 0) entities[t].state = entities[t].onwall;
3672				if (entities[t].onxwall > 0) entities[t].state = entities[t].onxwall;
3673			}
3674			if (testwallsy(t, map, entities[t].xp, entities[t].newyp)) {
3675				entities[t].yp = entities[t].newyp;
3676			}else {
3677				if (entities[t].onwall > 0) entities[t].state = entities[t].onwall;
3678				if (entities[t].onywall > 0) entities[t].state = entities[t].onywall;
3679				entities[t].jumpframe = 0;
3680			}
3681		}
3682
3683		public function movingplatformfix(t:int, map:mapclass):void{
3684			//If this intersects the player, then we move the player along it
3685			j = getplayer();
3686			if (entitycollide(t, j)) {
3687				//ok, bollox, let's make sure
3688				entities[j].yp = entities[j].yp + entities[j].vy;
3689				if (entitycollide(t, j)) {
3690					entities[j].yp = entities[j].yp - entities[j].vy;
3691					entities[j].vy = entities[t].vy;
3692					entities[j].newyp = entities[j].yp + entities[j].vy;
3693					if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) {
3694						if (entities[t].vy > 0) {
3695							entities[j].yp = entities[t].yp + entities[t].h;
3696							entities[j].vy = 0;
3697							entities[j].onroof = 1;
3698						}else {
3699							entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy;
3700							entities[j].vy = 0;
3701							entities[j].onground = 1;
3702						}
3703					}else {
3704						entities[t].state = entities[t].onwall;
3705					}
3706				}
3707			}
3708		}
3709
3710		public function scmmovingplatformfix(t:int, map:mapclass):void{
3711			//If this intersects the SuperCrewMate, then we move them along it
3712			j = getscm();
3713			if (entitycollide(t, j)) {
3714				//ok, bollox, let's make sure
3715				entities[j].yp = entities[j].yp + entities[j].vy;
3716				if (entitycollide(t, j)) {
3717					entities[j].yp = entities[j].yp - entities[j].vy;
3718					entities[j].vy = entities[t].vy;
3719					entities[j].newyp = entities[j].yp + entities[j].vy;
3720					if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) {
3721						if (entities[t].vy > 0) {
3722							entities[j].yp = entities[t].yp + entities[t].h;
3723							entities[j].vy = 0;
3724							//entities[j].onroof = true;
3725						}else {
3726							entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy;
3727							entities[j].vy = 0;
3728							//entities[j].onground = true;
3729						}
3730					}else {
3731						entities[t].state = entities[t].onwall;
3732					}
3733				}
3734			}
3735		}
3736
3737		public function hormovingplatformfix(t:int, map:mapclass):void{
3738			//If this intersects the player, then we move the player along it
3739			//for horizontal platforms, this is simplier
3740		  createblock(0, entities[t].xp, entities[t].yp, entities[t].w, entities[t].h);
3741			/*j = getplayer();
3742			if (entitycollide(t, j)) {
3743				//ok, bollox, let's make sure
3744				entities[j].yp = entities[j].yp + entities[j].vy;
3745				if (entitycollide(t, j)) {
3746					//entities[t].state = entities[t].onwall;
3747				}
3748			}*/
3749		}
3750
3751		public function customwarplinecheck(i:int):void {
3752			//Turns on obj.customwarpmodevon and obj.customwarpmodehon if player collides
3753			//with warp lines
3754
3755			if (entities[i].active) {
3756				//We test entity to entity
3757				for (j = 0; j < nentity; j++) {
3758					if (entities[j].active && i != j) {//Active
3759						if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line!
3760							if (entities[j].type == 51 || entities[j].type == 52) {
3761								if (entitywarpvlinecollide(i, j)) {
3762									customwarpmodevon = true;
3763								}
3764							}
3765						}
3766
3767						if (entities[i].rule == 0 && entities[j].rule == 7){   //Player vs horizontal WARP line
3768							if (entities[j].type == 53 || entities[j].type == 54) {
3769								if (entitywarphlinecollide(i, j)) {
3770									customwarpmodehon = true;
3771								}
3772							}
3773						}
3774					}
3775				}
3776			}
3777		}
3778
3779		public function entitycollisioncheck(dwgfx:dwgraphicsclass, game:gameclass, map:mapclass, music:musicclass):void {
3780			i = getplayer();
3781			if (entities[i].active) {
3782				//We test entity to entity
3783				for (j = 0; j < nentity; j++) {
3784					if (entities[j].active && i != j) {//Active
3785						if (entities[i].rule == 0 && entities[j].rule == 1 && entities[j].harmful) {
3786							//player i hits enemy or enemy bullet j
3787							if (entitycollide(i, j) && !map.invincibility) {
3788								if (entities[i].size == 0 && (entities[j].size == 0 || entities[j].size == 12)) {
3789									//They're both sprites, so do a per pixel collision
3790									colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp;
3791									colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp;
3792									if (dwgfx.flipmode) {
3793										if (dwgfx.flipsprites[entities[i].drawframe].hitTest(
3794												colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) {
3795											//Do the collision stuff
3796											game.deathseq = 30;
3797										}
3798									}else{
3799										if (dwgfx.sprites[entities[i].drawframe].hitTest(
3800												colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) {
3801											//Do the collision stuff
3802											game.deathseq = 30;
3803										}
3804									}
3805								}else {
3806									//Ok, then we just assume a normal bounding box collision
3807									game.deathseq = 30;
3808								}
3809							}
3810						}
3811						if (entities[i].rule == 0 && entities[j].rule == 2) { //Moving platforms
3812							if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp);
3813						}
3814						if (entities[i].rule == 0 && entities[j].rule == 3) { //Entity to entity
3815							if(entities[j].onentity>0){
3816								if (entitycollide(i, j)) entities[j].state = entities[j].onentity;
3817							}
3818						}
3819						if (entities[i].rule == 0 && entities[j].rule == 4) { //Player vs horizontal line!
3820							if(game.deathseq==-1){
3821								//Here we compare the player's old position versus his new one versus the line.
3822								//All points either be above or below it. Otherwise, there was a collision this frame.
3823								if (entities[j].onentity > 0) {
3824									if (entityhlinecollide(i, j)) {
3825										music.playef(8,10);
3826										game.gravitycontrol = (game.gravitycontrol + 1) % 2;
3827										game.totalflips++;
3828										if (game.gravitycontrol == 0) {
3829											if (entities[i].vy < 1) entities[i].vy = 1;
3830										}else {
3831											if (entities[i].vy > -1) entities[i].vy = -1;
3832										}
3833
3834										entities[j].state = entities[j].onentity;
3835										entities[j].life = 6;
3836									}
3837								}
3838							}
3839						}
3840						if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line!
3841							if(game.deathseq==-1){
3842								if(entities[j].onentity>0){
3843									if (entityvlinecollide(i, j)) {
3844										entities[j].state = entities[j].onentity;
3845										entities[j].life = 4;
3846									}
3847								}
3848							}
3849						}
3850						if (entities[i].rule == 0 && entities[j].rule == 6) { //Player versus crumbly blocks! Special case
3851							if (entities[j].onentity > 0) {
3852								//ok; only check the actual collision if they're in a close proximity
3853								temp = entities[i].yp - entities[j].yp;
3854								if (temp < 30 || temp > -30) {
3855									temp = entities[i].xp - entities[j].xp;
3856									if (temp < 30 || temp > -30) {
3857										if (entitycollide(i, j)) entities[j].state = entities[j].onentity;
3858									}
3859								}
3860							}
3861						}
3862						/*
3863						if (entities[i].rule == 0 && entities[j].rule == 7){   //Player vs horizontal WARP line
3864							if (game.deathseq == -1) {
3865								if (entities[j].onentity > 0) {
3866									if (entityhlinecollide(i, j)) {
3867										entities[j].state = entities[j].onentity;
3868										entities[j].life = 4;
3869									}
3870								}
3871							}
3872						}
3873						*/
3874					}
3875				}
3876			}
3877
3878			if (game.supercrewmate) {
3879				//some extra collisions
3880				for (i = 0; i < nentity; i++) {
3881					if (entities[i].active) {
3882						for (j = 0; j < nentity; j++) {
3883							if (entities[j].active && i != j) {//Active
3884								if (entities[i].type == 14) { //i is the supercrewmate
3885									if (entities[j].rule == 1 && entities[j].harmful) {//j is a harmful enemy
3886										//player i hits enemy or enemy bullet j
3887										if (entitycollide(i, j) && !map.invincibility) {
3888											if (entities[i].size == 0 && entities[j].size == 0) {
3889											//They're both sprites, so do a per pixel collision
3890												colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp;
3891												colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp;
3892												if (dwgfx.flipmode) {
3893													if (dwgfx.flipsprites[entities[i].drawframe].hitTest(
3894															colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) {
3895														//Do the collision stuff
3896														game.deathseq = 30; game.scmhurt = true;
3897													}
3898												}else{
3899													if (dwgfx.sprites[entities[i].drawframe].hitTest(
3900															colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) {
3901														//Do the collision stuff
3902														game.deathseq = 30; game.scmhurt = true;
3903													}
3904												}
3905											}else {
3906												//Ok, then we just assume a normal bounding box collision
3907												game.deathseq = 30; game.scmhurt = true;
3908											}
3909										}
3910									}
3911									if (entities[j].rule == 2) { //Moving platforms
3912										if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp);
3913									}
3914									if (entities[j].type == 8 && entities[j].rule == 3) { //Entity to entity (well, checkpoints anyway!)
3915										if(entities[j].onentity>0){
3916											if (entitycollide(i, j)) entities[j].state = entities[j].onentity;
3917										}
3918									}
3919								}
3920							}
3921						}
3922					}
3923				}
3924			}
3925
3926			//can't have the player being stuck...
3927			j = getplayer();
3928			skipdirblocks = true;
3929			if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) {
3930				//Let's try to get out...
3931				if (entities[j].rule == 0) {
3932					if(game.gravitycontrol==0){
3933						entities[j].yp -= 3;
3934					}else {
3935						entities[j].yp += 3;
3936					}
3937				}
3938			}
3939			skipdirblocks = false;
3940
3941			//Can't have the supercrewmate getting stuck either!
3942			if (game.supercrewmate) {
3943				j = getscm();
3944				skipdirblocks = true;
3945				if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) {
3946					//Let's try to get out...
3947						if(game.gravitycontrol==0){
3948							entities[j].yp -= 3;
3949						}else {
3950							entities[j].yp += 3;
3951						}
3952				}
3953				skipdirblocks = false;
3954			}
3955
3956			//Is the player colliding with any damageblocks?
3957			if (checkdamage() && !map.invincibility) {
3958				//usual player dead stuff
3959				game.deathseq = 30;
3960			}
3961
3962			//how about the supercrewmate?
3963			if (game.supercrewmate) {
3964				if (scmcheckdamage() && !map.invincibility) {
3965					//usual player dead stuff
3966					game.scmhurt = true;
3967					game.deathseq = 30;
3968				}
3969			}
3970
3971			activetrigger = -1;
3972			if (checktrigger() > -1) {
3973				game.state = activetrigger;
3974				game.statedelay = 0;
3975			}
3976		}
3977
3978		public var nentity:int;
3979		public var entities:Vector.<entclass> = new Vector.<entclass>;
3980
3981		public var linecrosskludge:Vector.<entclass> = new Vector.<entclass>;
3982		public var nlinecrosskludge:int;
3983		public var colpoint1:Point, colpoint2:Point;
3984
3985		public var tempx:int, tempy:int, tempw:int, temph:int, temp:int, temp2:int;
3986		public var tpx1:int, tpy1:int, tpx2:int, tpy2:int;
3987		public var temprect:Rectangle, temprect2:Rectangle;
3988		public var i:int, j:int, k:int;// z:int;
3989		public var dx:int, dy:int, dr:int;
3990		public var px:int, py:int, linetemp:int;
3991		public var activetrigger:int;
3992
3993    public var blocks:Vector.<blockclass> = new Vector.<blockclass>;
3994		public var flags:Array = new Array;
3995		public var collect:Array = new Array;
3996		public var customcollect:Array = new Array;
3997    public var nblocks:int;
3998		public var skipblocks:Boolean, skipdirblocks:Boolean;
3999
4000		public var platformtile:int;
4001		public var vertplatforms:Boolean, horplatforms:Boolean;
4002
4003		// :(
4004		public var nearelephant:Boolean;
4005		public var upsetmode:Boolean, upset:int;
4006
4007		//Trophy Text
4008		public var trophytext:int, trophytype:int;
4009
4010		//Secret lab scripts
4011		public var altstates:int;
4012
4013		//Custom stuff
4014    public var customenemy:int;
4015    public var customplatformtile:int;
4016    public var customwarpmode:Boolean, customwarpmodevon:Boolean, customwarpmodehon:Boolean;
4017		public var customscript:String;
4018    public var customcrewmoods:Array = new Array();
4019
4020		public var mobilemenus:Boolean = true;
4021	}
4022}