package { import bigroom.input.KeyPoll; import flash.display.*; import flash.geom.*; import flash.events.*; import flash.net.*; public class entityclass extends Sprite { static public var BLOCK:Number = 0; static public var TRIGGER:Number = 1; static public var DAMAGE:Number = 2; static public var DIRECTIONAL:Number = 3; static public var SAFE:Number = 4; static public var ACTIVITY:Number = 5; public var opt_useblock:Boolean; public var opt_usetrigger:Boolean; public var opt_usedamage:Boolean; public var opt_usedirectional:Boolean; public var opt_usesafe:Boolean; public var opt_useactivity:Boolean; public function init():void { nentity = 0; nblocks = 0; temprect = new Rectangle(); temprect2 = new Rectangle(); colpoint1 = new Point; colpoint2 = new Point; skipdirblocks = false; customplatformtile=0; platformtile = 0; vertplatforms = false; horplatforms = false; nearelephant = false; upsetmode = false; upset = 0; trophytext = 0 ; trophytype = 0; altstates = 0; for (var i:int = 0; i < 6; i++) { customcrewmoods.push(1); } for (i = 0; i < 100; i++) { var t:int = 0; flags.push(t); } for (i = 0; i < 500; i++) { var block:blockclass = new blockclass; blocks.push(block); } for (var z:Number = 0; z < 200; z++) { var entity:entclass = new entclass; entities.push(entity); } for (i = 0; i < 20; i++) { var lcross:entclass = new entclass; linecrosskludge.push(lcross); collect.push(new int); customcollect.push(new int(0)); } nlinecrosskludge = 0; } public function resetallflags():void { for (var i:Number = 0; i < 100; i++) { flags[i] = 0; } } public function resetflags():void { for (var i:Number = 0; i < 100; i++) { if (flags[i] == 2) flags[i] = 0; } } public function confirmflags():void { for (var i:Number = 0; i < 100; i++) { if (flags[i] == 2) flags[i] = 1; } } public function changecollect(t:int, s:int):void { collect[t] = s; } public function changecustomcollect(t:int, s:int):void { customcollect[t] = s; } public function changeflag(t:int, s:int):void { flags[t] = s; } public function fatal_top():void { createblock(DAMAGE, -8, -8, 384, 16); } public function fatal_bottom():void { createblock(DAMAGE, -8, 224, 384, 16); } public function fatal_left():void { createblock(DAMAGE, -8, -8, 16, 260); } public function fatal_right():void { createblock(DAMAGE, 312, -8, 16, 260); } public function setblockcolour(t:int, col:String):void { if (col == "cyan") { blocks[t].r = 164; blocks[t].g = 164; blocks[t].b = 255; }else if (col == "red") { blocks[t].r = 255; blocks[t].g = 60; blocks[t].b = 60; }else if (col == "green") { blocks[t].r = 144; blocks[t].g = 255; blocks[t].b = 144; }else if (col == "yellow") { blocks[t].r = 255; blocks[t].g = 255; blocks[t].b = 134; }else if (col == "blue") { blocks[t].r = 95; blocks[t].g = 95; blocks[t].b = 255; }else if (col == "purple") { blocks[t].r = 255; blocks[t].g = 134; blocks[t].b = 255; }else if (col == "white") { blocks[t].r = 244; blocks[t].g = 244; blocks[t].b = 244; }else if (col == "gray") { blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174; }else if (col == "orange") { blocks[t].r = 255; blocks[t].g = 130; blocks[t].b = 20; }else { //use a gray blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174; } } public function swncolour(t:int):int { //given colour t, return colour in setcol if (t == 0) return 11; if (t == 1) return 6; if (t == 2) return 8; if (t == 3) return 12; if (t == 4) return 9; if (t == 5) return 7; return 0; } public function swnenemiescol(t:int):void { //change the colour of all SWN enemies to the current one for (i = 0; i < nentity; i++) { if (entities[i].active) { if (entities[i].type == 23) { entities[i].colour = swncolour(t); } } } } public function gravcreate(game:gameclass, ypos:int, dir:int, xoff:int = 0, yoff:int = 0):void { if (dir == 0) { createentity(game, -150 - xoff, 58 + (ypos * 20)+yoff, 23, 0, 0); }else{ createentity(game, 320+150 + xoff, 58 + (ypos * 20)+yoff, 23, 1, 0); } } public function generateswnwave(game:gameclass, help:helpclass, t:int):void { //generate a wave for the SWN game if(game.swndelay<=0){ if (t == 0) { //game 0, survive for 30 seconds switch(game.swnstate) { case 0: //Decide on a wave here //default case game.swnstate = 1; game.swndelay = 5; if (game.swntimer <= 150) { //less than 5 seconds game.swnstate = 9; game.swndelay = 8; }else if (game.swntimer <= 300) { //less than 10 seconds game.swnstate = 6; game.swndelay = 12; }else if (game.swntimer <= 360) { //less than 12 seconds game.swnstate = 5+game.swnstate2; game.swndelay = 15; }else if (game.swntimer <= 420) { //less than 14 seconds game.swnstate = 7+game.swnstate2; game.swndelay = 15; }else if (game.swntimer <= 480) { //less than 16 seconds game.swnstate = 5+game.swnstate2; game.swndelay = 15; }else if (game.swntimer <= 540) { //less than 18 seconds game.swnstate = 7+game.swnstate2; game.swndelay = 15; }else if (game.swntimer <= 600) { //less than 20 seconds game.swnstate = 5+game.swnstate2; game.swndelay = 15; }else if (game.swntimer <= 900) { //less than 30 seconds game.swnstate = 4; game.swndelay = 20; }else if (game.swntimer <= 1050) { //less than 35 seconds game.swnstate = 3; game.swndelay = 10; }else if (game.swntimer <= 1200) { //less than 40 seconds game.swnstate = 3; game.swndelay = 20; }else if (game.swntimer <= 1500) { //less than 50 seconds game.swnstate = 2; game.swndelay = 10; }else if (game.swntimer <= 1650) { //less than 55 seconds game.swnstate = 1; game.swndelay = 15; }else if (game.swntimer <= 1800) { //less than 60 seconds game.swnstate = 1; game.swndelay = 25; } if (game.deathcounts - game.swndeaths > 7) game.swndelay += 2; if (game.deathcounts - game.swndeaths > 15) game.swndelay += 2; if (game.deathcounts - game.swndeaths > 25) game.swndelay += 4; break; case 1: createentity(game, -150, 58 + (int(Math.random() * 6) * 20), 23, 0, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state break; case 2: if(game.swnstate3==0){ game.swnstate2++; if (game.swnstate2 >= 6) { game.swnstate3 = 1; game.swnstate2--; } }else { game.swnstate2--; if (game.swnstate2 < 0) { game.swnstate3 = 0; game.swnstate2++; } } createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state break; case 3: createentity(game, 320+150, 58 + (int(Math.random() * 6) * 20), 23, 1, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state break; case 4: //left and right compliments game.swnstate2 = int(Math.random() * 6); createentity(game, -150, 58 + (game.swnstate2 * 20), 23, 0, 0); createentity(game, 320+150, 58 + ((5-game.swnstate2) * 20), 23, 1, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state game.swnstate2 = 0; break; case 5: //Top and bottom createentity(game, -150, 58, 23, 0, 0); createentity(game, -150, 58 + (5 * 20), 23, 0, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state game.swnstate2 = 1; break; case 6: //Middle createentity(game, -150, 58 + (2 * 20), 23, 0, 0); createentity(game, -150, 58 + (3 * 20), 23, 0, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state game.swnstate2 = 0; break; case 7: //Top and bottom createentity(game, 320+150, 58, 23, 1, 0); createentity(game, 320+150, 58 + (5 * 20), 23, 1, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state game.swnstate2 = 1; break; case 8: //Middle createentity(game, 320+150, 58 + (2 * 20), 23, 1, 0); createentity(game, 320+150, 58 + (3 * 20), 23, 1, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state game.swnstate2 = 0; break; case 9: if(game.swnstate3==0){ game.swnstate2++; if (game.swnstate2 >= 6) { game.swnstate3 = 1; game.swnstate2--; } }else { game.swnstate2--; if (game.swnstate2 < 0) { game.swnstate3 = 0; game.swnstate2++; } } createentity(game, 320 + 150, 58 + (int(game.swnstate2) * 20), 23, 1, 0); game.swnstate = 0; game.swndelay = 0; //return to decision state break; } }else if (t == 1) { //Game 2, super gravitron switch(game.swnstate) { case 0: //Choose either simple or filler game.swnstate2 = 0; game.swnstate3 = 0; game.swnstate4 = 0; game.swnstate2 = int(Math.random() * 100); if (game.swnstate2 < 25) { //simple game.swnstate = 2; game.swndelay = 0; }else { //filler game.swnstate = 4; game.swndelay = 0; } game.swnstate2 = 0; break; case 1: //complex chain game.swnstate2 = int(Math.random() * 8); if (game.swnstate2 == 0) { game.swnstate = 10; game.swndelay = 0; }else if (game.swnstate2 == 1) { game.swnstate = 12; game.swndelay = 0; }else if (game.swnstate2 == 2) { game.swnstate = 14; game.swndelay = 0; }else if (game.swnstate2 == 3) { game.swnstate = 20; game.swndelay = 0; }else if (game.swnstate2 == 4) { game.swnstate = 21; game.swndelay = 0; }else if (game.swnstate2 == 5) { game.swnstate = 22; game.swndelay = 0; }else if (game.swnstate2 == 6) { game.swnstate = 22; game.swndelay = 0; }else if (game.swnstate2 == 7) { game.swnstate = 14; game.swndelay = 0; } game.swnstate2 = 0; break; case 2: //simple chain game.swnstate2 = int(Math.random() * 6); if (game.swnstate2 == 0) { game.swnstate = 23; game.swndelay = 0; }else if (game.swnstate2 == 1) { game.swnstate = 24; game.swndelay = 0; }else if (game.swnstate2 == 2) { game.swnstate = 25; game.swndelay = 0; }else if (game.swnstate2 == 3) { game.swnstate = 26; game.swndelay = 0; }else if (game.swnstate2 == 4) { game.swnstate = 27; game.swndelay = 0; }else if (game.swnstate2 == 5) { game.swnstate = 14; game.swndelay = 0; } game.swnstate2 = 0; break; case 3: //Choose a major action game.swnstate2 = int(Math.random() * 100); if (game.swnstate2 < 25) { //complex game.swnstate = 1; game.swndelay = 0; }else { //simple game.swnstate = 2; game.swndelay = 0; } break; case 4: //filler chain game.swnstate2 = int(Math.random() * 6); if (game.swnstate2 == 0) { game.swnstate = 28; game.swndelay = 0; }else if (game.swnstate2 == 1) { game.swnstate = 29; game.swndelay = 0; }else if (game.swnstate2 == 2) { game.swnstate = 28; game.swndelay = 0; }else if (game.swnstate2 == 3) { game.swnstate = 29; game.swndelay = 0; }else if (game.swnstate2 == 4) { game.swnstate = 30; game.swndelay = 0; }else if (game.swnstate2 == 5) { game.swnstate = 31; game.swndelay = 0; } game.swnstate2 = 0; break; case 10: gravcreate(game, 0, 0); gravcreate(game, 1, 0); gravcreate(game, 2, 0); game.swnstate++; game.swndelay = 10; //return to decision state break; case 11: gravcreate(game, 3, 0); gravcreate(game, 4, 0); gravcreate(game, 5, 0); game.swnstate2++; if(game.swnstate2==3){ game.swnstate = 0; game.swndelay = 30; //return to decision state }else { game.swnstate--; game.swndelay = 10; //return to decision state } break; case 12: gravcreate(game, 0, 1); gravcreate(game, 1, 1); gravcreate(game, 2, 1); game.swnstate++; game.swndelay = 10; //return to decision state break; case 13: gravcreate(game, 3, 1); gravcreate(game, 4, 1); gravcreate(game, 5, 1); game.swnstate2++; if(game.swnstate2==3){ game.swnstate = 0; game.swndelay = 30; //return to decision state }else { game.swnstate--; game.swndelay = 10; //return to decision state } break; case 14: gravcreate(game, 0, 0, 0); gravcreate(game, 5, 1, 0); game.swnstate++; game.swndelay = 20; //return to decision state break; case 15: gravcreate(game, 1, 0); gravcreate(game, 4, 1); game.swnstate++; game.swndelay = 20; //return to decision state break; case 16: gravcreate(game, 2, 0); gravcreate(game, 3, 1); game.swnstate++; game.swndelay = 20; //return to decision state break; case 17: gravcreate(game, 3, 0); gravcreate(game, 2, 1); game.swnstate++; game.swndelay = 20; //return to decision state break; case 18: gravcreate(game, 4, 0); gravcreate(game, 1, 1); game.swnstate++; game.swndelay = 20; //return to decision state break; case 19: gravcreate(game, 5, 0); gravcreate(game, 0, 1); game.swnstate=0; game.swndelay = 20; //return to decision state break; case 20: game.swnstate4++; if(game.swnstate3==0){ game.swnstate2++; if (game.swnstate2 >= 6) { game.swnstate3 = 1; game.swnstate2--; } }else { game.swnstate2--; if (game.swnstate2 < 0) { game.swnstate3 = 0; game.swnstate2++; } } createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0); if(game.swnstate4<=6){ game.swnstate = 20; game.swndelay = 10; //return to decision state }else { game.swnstate = 0; game.swndelay = 10; //return to decision state } break; case 21: game.swnstate4++; if(game.swnstate3==0){ game.swnstate2++; if (game.swnstate2 >= 6) { game.swnstate3 = 1; game.swnstate2--; } }else { game.swnstate2--; if (game.swnstate2 < 0) { game.swnstate3 = 0; game.swnstate2++; } } createentity(game, 320+150, 58 + (int(game.swnstate2) * 20), 23, 1, 0); if(game.swnstate4<=6){ game.swnstate = 21; game.swndelay = 10; //return to decision state }else { game.swnstate = 0; game.swndelay = 10; //return to decision state } break; case 22: game.swnstate4++; //left and right compliments game.swnstate2 = int(Math.random() * 6); createentity(game, -150, 58 + (game.swnstate2 * 20), 23, 0, 0); createentity(game, 320 + 150, 58 + ((5 - game.swnstate2) * 20), 23, 1, 0); if(game.swnstate4<=12){ game.swnstate = 22; game.swndelay = 18; //return to decision state }else { game.swnstate = 0; game.swndelay = 18; //return to decision state } game.swnstate2 = 0; break; case 23: gravcreate(game, 1, 0); gravcreate(game, 2, 0, 15); gravcreate(game, 2, 0, -15); gravcreate(game, 3, 0, 15); gravcreate(game, 3, 0, -15); gravcreate(game, 4, 0); game.swnstate = 0; game.swndelay = 15; //return to decision state break; case 24: gravcreate(game, 1, 1); gravcreate(game, 2, 1, 15); gravcreate(game, 2, 1, -15); gravcreate(game, 3, 1, 15); gravcreate(game, 3, 1, -15); gravcreate(game, 4, 1); game.swnstate = 0; game.swndelay = 15; //return to decision state break; case 25: gravcreate(game, 0, 0); gravcreate(game, 1, 1,0,10); gravcreate(game, 4, 1,0,-10); gravcreate(game, 5, 0); game.swnstate = 0; game.swndelay = 20; //return to decision state break; case 26: gravcreate(game, 0, 1, 0); gravcreate(game, 1, 1, 10); gravcreate(game, 4, 1, 40); gravcreate(game, 5, 1, 50); game.swnstate = 0; game.swndelay = 20; //return to decision state break; case 27: gravcreate(game, 0, 0, 0); gravcreate(game, 1, 0, 10); gravcreate(game, 4, 0, 40); gravcreate(game, 5, 0, 50); game.swnstate = 0; game.swndelay = 20; //return to decision state break; case 28: game.swnstate4++; game.swnstate2 = int(Math.random() * 6); createentity(game, -150, 58 + (game.swnstate2 * 20), 23, 0, 0); if(game.swnstate4<=6){ game.swnstate = 28; game.swndelay = 8; //return to decision state }else { game.swnstate = 3; game.swndelay = 15; //return to decision state } game.swnstate2 = 0; break; case 29: game.swnstate4++; game.swnstate2 = int(Math.random() * 6); gravcreate(game, game.swnstate2, 1); if(game.swnstate4<=6){ game.swnstate = 29; game.swndelay = 8; //return to decision state }else { game.swnstate = 3; game.swndelay = 15; //return to decision state } game.swnstate2 = 0; break; case 30: game.swnstate4++; game.swnstate2 = int(Math.random() * 3); gravcreate(game, game.swnstate2, 0); gravcreate(game, 5-game.swnstate2, 0); if(game.swnstate4<=2){ game.swnstate = 30; game.swndelay = 14; //return to decision state }else { game.swnstate = 3; game.swndelay = 15; //return to decision state } game.swnstate2 = 0; break; case 31: game.swnstate4++; game.swnstate2 = int(Math.random() * 3); gravcreate(game, game.swnstate2, 1); gravcreate(game, 5-game.swnstate2, 1); if(game.swnstate4<=2){ game.swnstate = 31; game.swndelay = 14; //return to decision state }else { game.swnstate = 3; game.swndelay = 15; //return to decision state } game.swnstate2 = 0; break; } } }else { game.swndelay--; } } public function createblock(t:int, xp:int=0, yp:int=0, w:int=0, h:int=0, trig:int=0):void{ if(nblocks == 0) { //If there are no active blocks, Z=0; k = 0; nblocks++; }else { i = 0; k = -1; while (i < nblocks) { if (!blocks[i].active) { k = i; i = nblocks; } i++; } if (k == -1) { k = nblocks; nblocks++; } } blocks[k].clear(); blocks[k].active = true; switch(t) { case BLOCK: //Block blocks[k].type = BLOCK; blocks[k].xp = xp; blocks[k].yp = yp; blocks[k].wp = w; blocks[k].hp = h; blocks[k].rectset(xp, yp, w, h); opt_useblock = true; break; case TRIGGER: //Trigger blocks[k].type = TRIGGER; blocks[k].x = xp; blocks[k].y = yp; blocks[k].wp = w; blocks[k].hp = h; blocks[k].rectset(xp, yp, w, h); blocks[k].trigger = trig; opt_usetrigger = true; break; case DAMAGE: //Damage blocks[k].type = DAMAGE; blocks[k].x = xp; blocks[k].y = yp; blocks[k].wp = w; blocks[k].hp = h; blocks[k].rectset(xp, yp, w, h); opt_usedamage = true; break; case DIRECTIONAL: //Directional blocks[k].type = DIRECTIONAL; blocks[k].x = xp; blocks[k].y = yp; blocks[k].wp = w; blocks[k].hp = h; blocks[k].rectset(xp, yp, w, h); blocks[k].trigger = trig; opt_usedirectional = true; break; case SAFE: //Safe block blocks[k].type = SAFE; blocks[k].xp = xp; blocks[k].yp = yp; blocks[k].wp = w; blocks[k].hp = h; blocks[k].rectset(xp, yp, w, h); opt_usesafe = true; break; case ACTIVITY: //Activity Zone blocks[k].type = ACTIVITY; blocks[k].x = xp; blocks[k].y = yp; blocks[k].wp = w; blocks[k].hp = h; blocks[k].rectset(xp, yp, w, h); opt_useactivity = true; //Ok, each and every activity zone in the game is initilised here. "Trig" in this case is a variable that //assigns all the details. switch(trig) { case 0: //testing zone blocks[k].prompt = "Press ENTER to explode"; if(mobilemenus) blocks[k].prompt = "Explode"; blocks[k].script = "intro"; setblockcolour(k, "orange"); trig=1; break; case 1: blocks[k].prompt = "Press ENTER to talk to Violet"; if(mobilemenus) blocks[k].prompt = "Talk to Violet"; blocks[k].script = "talkpurple"; setblockcolour(k, "purple"); trig=0; break; case 2: blocks[k].prompt = "Press ENTER to talk to Vitellary"; if(mobilemenus) blocks[k].prompt = "Talk to Vitellary"; blocks[k].script = "talkyellow"; setblockcolour(k, "yellow"); trig=0; break; case 3: blocks[k].prompt = "Press ENTER to talk to Vermilion"; if(mobilemenus) blocks[k].prompt = "Talk to Vermilion"; blocks[k].script = "talkred"; setblockcolour(k, "red"); trig=0; break; case 4: blocks[k].prompt = "Press ENTER to talk to Verdigris"; if(mobilemenus) blocks[k].prompt = "Talk to Verdigris"; blocks[k].script = "talkgreen"; setblockcolour(k, "green"); trig=0; break; case 5: blocks[k].prompt = "Press ENTER to talk to Victoria"; if(mobilemenus) blocks[k].prompt = "Talk to Victoria"; blocks[k].script = "talkblue"; setblockcolour(k, "blue"); trig=0; break; case 6: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_station_1"; setblockcolour(k, "orange"); trig=0; break; case 7: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_outside_1"; setblockcolour(k, "orange"); trig=0; break; case 8: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_outside_2"; setblockcolour(k, "orange"); trig=0; break; case 9: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_outside_3"; setblockcolour(k, "orange"); trig=0; break; case 10: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_outside_4"; setblockcolour(k, "orange"); trig=0; break; case 11: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_outside_5"; setblockcolour(k, "orange"); trig=0; break; case 12: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_outside_6"; setblockcolour(k, "orange"); trig=0; break; case 13: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_finallevel"; setblockcolour(k, "orange"); trig=0; break; case 14: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_station_2"; setblockcolour(k, "orange"); trig=0; break; case 15: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_station_3"; setblockcolour(k, "orange"); trig=0; break; case 16: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_station_4"; setblockcolour(k, "orange"); trig=0; break; case 17: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_warp_1"; setblockcolour(k, "orange"); trig=0; break; case 18: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_warp_2"; setblockcolour(k, "orange"); trig=0; break; case 19: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_lab_1"; setblockcolour(k, "orange"); trig=0; break; case 20: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_lab_2"; setblockcolour(k, "orange"); trig=0; break; case 21: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_secretlab"; setblockcolour(k, "orange"); trig=0; break; case 22: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_shipcomputer"; setblockcolour(k, "orange"); trig=0; break; case 23: blocks[k].prompt = "Press ENTER to activate terminals"; if(mobilemenus) blocks[k].prompt = "Activate terminals"; blocks[k].script = "terminal_radio"; setblockcolour(k, "orange"); trig=0; break; case 24: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "terminal_jukebox"; setblockcolour(k, "orange"); trig=0; break; case 25: blocks[k].prompt = "Passion for Exploring"; blocks[k].script = "terminal_juke1"; setblockcolour(k, "orange"); trig=0; break; case 26: blocks[k].prompt = "Pushing Onwards"; blocks[k].script = "terminal_juke2"; setblockcolour(k, "orange"); trig=0; break; case 27: blocks[k].prompt = "Positive Force"; blocks[k].script = "terminal_juke3"; setblockcolour(k, "orange"); trig=0; break; case 28: blocks[k].prompt = "Presenting VVVVVV"; blocks[k].script = "terminal_juke4"; setblockcolour(k, "orange"); trig=0; break; case 29: blocks[k].prompt = "Potential for Anything"; blocks[k].script = "terminal_juke5"; setblockcolour(k, "orange"); trig=0; break; case 30: blocks[k].prompt = "Predestined Fate"; blocks[k].script = "terminal_juke6"; setblockcolour(k, "orange"); trig=0; break; case 31: blocks[k].prompt = "Pipe Dream"; blocks[k].script = "terminal_juke7"; setblockcolour(k, "orange"); trig=0; break; case 32: blocks[k].prompt = "Popular Potpourri"; blocks[k].script = "terminal_juke8"; setblockcolour(k, "orange"); trig=0; break; case 33: blocks[k].prompt = "Pressure Cooker"; blocks[k].script = "terminal_juke9"; setblockcolour(k, "orange"); trig=0; break; case 34: blocks[k].prompt = "ecroF evitisoP"; blocks[k].script = "terminal_juke10"; setblockcolour(k, "orange"); trig=0; break; case 35: blocks[k].prompt = "Press ENTER to activate terminal"; if(mobilemenus) blocks[k].prompt = "Activate terminal"; blocks[k].script = "custom_"+customscript; setblockcolour(k, "orange"); trig=0; break; } break; } } public function removeallblocks():void{ for(i=0; i= 113 && game.roomx <= 117)) { setenemy(0, k); setenemyroom(k, game.roomx, game.roomy); //For colour }else if (game.roomx == 113 && (game.roomy <= 110 && game.roomy >= 108)) { setenemy(1, k); setenemyroom(k, game.roomx, game.roomy); //For colour }else if (game.roomx == 113 && game.roomy == 107) { //MAVVERRRICK entities[k].tile = 96; entities[k].colour = 6; entities[k].size = 9; entities[k].w = 64; entities[k].h = 44; entities[k].animate = 4; }else { setenemyroom(k, game.roomx, game.roomy); } //}else{*/ /* entities[k].tile = 24; entities[k].animate = 0; entities[k].colour = 8; //for warpzone: if (game.roomx == 51 && game.roomy == 51) entities[k].colour = 6; if (game.roomx == 52 && game.roomy == 51) entities[k].colour = 7; if (game.roomx == 54 && game.roomy == 49) entities[k].colour = 11; if (game.roomx == 55 && game.roomy == 50) entities[k].colour = 9; if (game.roomx == 55 && game.roomy == 51) entities[k].colour = 6; if (game.roomx == 54 && game.roomy == 51) entities[k].colour = 12; if (game.roomx == 54 && game.roomy == 52) entities[k].colour = 7; if (game.roomx == 53 && game.roomy == 52) entities[k].colour = 8; if (game.roomx == 51 && game.roomy == 52) entities[k].colour = 6; if (game.roomx == 52 && game.roomy == 49) entities[k].colour = 8; //} */ break; case 2: //A moving platform entities[k].rule = 2; entities[k].type = 1; entities[k].size = 2; entities[k].tile = 1; if (customplatformtile > 0){ entities[k].tile = customplatformtile; }else if (platformtile > 0) { entities[k].tile = platformtile; }else{ //appearance again depends on location if (gridmatch(p1, p2, p3, p4, 100, 70, 320, 160)) entities[k].tile = 616; if (gridmatch(p1, p2, p3, p4, 72, 0, 248, 240)) entities[k].tile = 610; if (gridmatch(p1, p2, p3, p4, -20, 0, 320, 240)) entities[k].tile = 413; if (gridmatch(p1, p2, p3, p4, -96, -72, 400, 312)) entities[k].tile = 26; if (gridmatch(p1, p2, p3, p4, -32, -40, 352, 264)) entities[k].tile = 27; } entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 32; entities[k].h = 8; if (vx <= 1) vertplatforms = true; if (vx >= 2 && vx <= 5) horplatforms = true; if (vx == 14 || vx == 15) horplatforms = true; //special case for last part of Space Station if (vx >= 6 && vx <= 7) vertplatforms = true; if (vx >= 10 && vx <= 11) { //Double sized threadmills entities[k].w = 64; entities[k].h = 8; vx -= 2; entities[k].size = 8; } entities[k].behave = vx; entities[k].para = vy; if (vx >= 8 && vx <= 9) { horplatforms = true; //threadmill! entities[k].animate = 10; if(customplatformtile>0){ entities[k].tile = customplatformtile+4; if (vx == 8) entities[k].tile += 4; if (vx == 9) entities[k].animate = 11; }else{ settreadmillcolour(k, game.roomx, game.roomy); if (vx == 8) entities[k].tile += 40; if (vx == 9) entities[k].animate = 11; } }else { entities[k].animate = 100; } entities[k].x1 = p1; entities[k].y1 = p2; entities[k].x2 = p3; entities[k].y2 = p4; entities[k].isplatform = true; createblock(0, xp, yp, 32, 8); break; case 3: //Disappearing platforms entities[k].rule = 3; entities[k].type = 2; entities[k].size = 2; entities[k].tile = 2; //appearance again depends on location if(customplatformtile>0){ entities[k].tile=customplatformtile; }else if (vx > 0) { entities[k].tile = int(vx); }else{ if(game.roomx==49 && game.roomy==52) entities[k].tile = 18; if (game.roomx == 50 && game.roomy == 52) entities[k].tile = 22; } entities[k].xp = xp; entities[k].yp = yp; entities[k].cy = -1; entities[k].w = 32; entities[k].h = 10; entities[k].behave = vx; entities[k].para = vy; entities[k].onentity = 1; entities[k].animate = 100; createblock(0, xp, yp, 32, 8); break; case 4: //Breakable blocks entities[k].rule = 6; entities[k].type = 3; entities[k].size = 1; entities[k].tile = 10; entities[k].xp = xp; entities[k].yp = yp; entities[k].cy = -1; entities[k].w = 8; entities[k].h = 10; entities[k].behave = vx; entities[k].para = vy; entities[k].onentity = 1; entities[k].animate = 100; createblock(0, xp, yp, 8, 8); break; case 5: //Gravity Tokens entities[k].rule = 3; entities[k].type = 4; entities[k].size = 0; entities[k].tile = 11; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].behave = vx; entities[k].para = vy; entities[k].onentity = 1; entities[k].animate = 100; break; case 6: //Decorative particles entities[k].rule = 2; entities[k].type = 5; //Particles entities[k].colour = 1; entities[k].size = 3; entities[k].xp = xp; entities[k].yp = yp; entities[k].vx = vx; entities[k].vy = vy; entities[k].life = 12; break; case 7: //Decorative particles entities[k].rule = 2; entities[k].type = 5; //Particles entities[k].colour = 2; entities[k].size = 3; entities[k].xp = xp; entities[k].yp = yp; entities[k].vx = vx; entities[k].vy = vy; entities[k].life = 12; break; case 8: //Small collectibles entities[k].rule = 3; entities[k].type = 6; entities[k].size = 4; entities[k].tile = 48; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 8; entities[k].h = 8; entities[k].onentity = 1; entities[k].animate = 100; //Check if it's already been collected entities[k].para = vx; if (collect[vx] == 1) entities[k].active = false; break; case 9: //Something Shiny entities[k].rule = 3; entities[k].type = 7; entities[k].size = 0; entities[k].tile = 22; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 3; entities[k].onentity = 1; entities[k].animate = 100; //Check if it's already been collected entities[k].para = vx; if (collect[vx] == 1) entities[k].active = false; break; case 10: //Savepoint entities[k].rule = 3; entities[k].type = 8; entities[k].size = 0; entities[k].tile = 20 + vx; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 4; entities[k].onentity = 1; entities[k].animate = 100; entities[k].para = vy; if (game.savepoint == vy) { entities[k].colour = 5; entities[k].onentity = 0; } if (game.nodeathmode) { entities[k].active = false; } break; case 11: //Horizontal Gravity Line entities[k].rule = 4; entities[k].type = 9; entities[k].size = 5; entities[k].life = 0; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = vx; entities[k].h = 1; entities[k].onentity = 1; break; case 12: //Vertical Gravity Line entities[k].rule = 5; entities[k].type = 10; entities[k].size = 6; entities[k].life = 0; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 1; entities[k].h = vx; //entities[k].colour = 0; entities[k].onentity = 1; break; case 13: //Warp token entities[k].rule = 3; entities[k].type = 11; entities[k].size = 0; entities[k].tile = 18; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 10; entities[k].onentity = 1; entities[k].animate = 2; //Added in port, hope it doesn't break anything entities[k].behave = vx; entities[k].para = vy; break; case 14: // Teleporter entities[k].rule = 3; entities[k].type = 100; entities[k].size = 7; entities[k].tile = 1; //inactive entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 96; entities[k].h = 96; entities[k].colour = 100; entities[k].onentity = 1; entities[k].animate = 100; entities[k].para = vy; //we'll init it's activeness here later /*if (game.savepoint == vy) { entities[k].colour = 5; entities[k].onentity = 0; }*/ break; case 15: // Crew Member (warp zone) entities[k].rule = 6; entities[k].type = 12; //A special case! entities[k].tile = 144; entities[k].colour = 13; //144 for sad :( entities[k].xp = xp; entities[k].yp = yp; entities[k].cx = 6; entities[k].cy = 2; entities[k].w = 12; entities[k].h = 21; entities[k].dir = 0; entities[k].state = vx; entities[k].gravity = true; break; case 16: // Crew Member, upside down (space station) entities[k].rule = 7; entities[k].type = 12; //A special case! entities[k].tile = 144+6; entities[k].colour = 14; //144 for sad (upside down+12):( entities[k].xp = xp; entities[k].yp = yp; entities[k].cx = 6; entities[k].cy = 2; entities[k].w = 12; entities[k].h = 21; entities[k].dir = 1; entities[k].state = vx; entities[k].gravity = true; break; case 17: // Crew Member (Lab) entities[k].rule = 6; entities[k].type = 12; //A special case! entities[k].tile = 144; entities[k].colour = 16; //144 for sad :( entities[k].xp = xp; entities[k].yp = yp; entities[k].cx = 6; entities[k].cy = 2; entities[k].w = 12; entities[k].h = 21; entities[k].dir = 1; entities[k].state = vx; entities[k].gravity = true; break; case 18: // Crew Member (Ship) //This is the scriping crewmember entities[k].rule = 6; entities[k].type = 12; //A special case! entities[k].colour = vx; if (vy == 0) { entities[k].tile = 0; }else { entities[k].tile = 144; } entities[k].xp = xp; entities[k].yp = yp; entities[k].cx = 6; entities[k].cy = 2; entities[k].w = 12; entities[k].h = 21; entities[k].dir = 0; entities[k].state = p1; entities[k].para = p2; if (p1 == 17) { entities[k].dir = p2; } entities[k].gravity = true; break; case 19: // Crew Member (Ship) More tests! entities[k].rule = 6; entities[k].type = 12; //A special case! entities[k].tile = 0; entities[k].colour = 6; //54 for sad :( entities[k].xp = xp; entities[k].yp = yp; entities[k].cx = 6; entities[k].cy = 2; entities[k].w = 12; entities[k].h = 21; entities[k].dir = 1; entities[k].state = vx; entities[k].gravity = true; break; case 20: //Terminal entities[k].rule = 3; entities[k].type = 13; entities[k].size = 0; entities[k].tile = 16 + vx; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 4; entities[k].onentity = 1; entities[k].animate = 100; entities[k].para = vy; /*if (game.savepoint == vy) { entities[k].colour = 5; entities[k].onentity = 0; }*/ break; case 21: //as above, except doesn't highlight entities[k].rule = 3; entities[k].type = 13; entities[k].size = 0; entities[k].tile = 16 + vx; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 4; entities[k].onentity = 0; entities[k].animate = 100; entities[k].para = vy; /*if (game.savepoint == vy) { entities[k].colour = 5; entities[k].onentity = 0; }*/ break; case 22: //Fake trinkets, only appear if you've collected them entities[k].rule = 3; entities[k].type = 7; entities[k].size = 0; entities[k].tile = 22; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 3; entities[k].onentity = 0; entities[k].animate = 100; //Check if it's already been collected entities[k].para = vx; if (collect[vx] == 0) entities[k].active = false; break; case 23: //SWN Enemies //Given a different behavior, these enemies are especially for SWN mode and disappear outside the screen. entities[k].rule = 1; entities[k].type = 23; entities[k].xp = xp; entities[k].yp = yp; entities[k].behave = vx; entities[k].para = vy; entities[k].w = 16; entities[k].h = 16; entities[k].cx = 0; entities[k].cy = 0; entities[k].x1 = -2000; entities[k].y1 = -100; entities[k].x2 = 5200; entities[k].y2 = 340; entities[k].harmful = true; //initilise tiles here based on behavior entities[k].size = 12; //don't wrap around entities[k].colour = 21; entities[k].tile = 78; //default case entities[k].animate = 1; if (game.swngame == 1) { //set colour based on current state entities[k].colour = swncolour(game.swncolstate); } break; case 24: // Super Crew Member //This special crewmember is way more advanced than the usual kind, and can interact with game objects entities[k].rule = 6; entities[k].type = 14; //A special case! entities[k].colour = vx; if(vx==16){ //victoria is sad! if (vy == 2) vy = 1; }else { if (vy == 2) vy = 0; } if (vy == 0) { entities[k].tile = 0; }else { entities[k].tile = 144; } entities[k].xp = xp; entities[k].yp = yp; entities[k].cx = 6; entities[k].cy = 2; entities[k].w = 12; entities[k].h = 21; entities[k].dir = 1; entities[k].x1 = -2000; entities[k].y1 = -100; entities[k].x2 = 5200; entities[k].y2 = 340; entities[k].state = p1; entities[k].para = p2; if (p1 == 17) { entities[k].dir = p2; } entities[k].gravity = true; break; case 25: //Trophies entities[k].rule = 3; entities[k].type = 15; entities[k].size = 0; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 4; entities[k].onentity = 1; entities[k].animate = 100; entities[k].para = vy; //Decide tile here based on given achievement: both whether you have them and what they are //default is just a trophy base: entities[k].tile = 180 + vx; switch(vy) { case 1: if(game.bestrank[0]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 31;} break; case 2: if(game.bestrank[1]>=3) { entities[k].tile = 186 + vx; entities[k].colour = 35;} break; case 3: if(game.bestrank[2]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 33;} break; case 4: if(game.bestrank[3]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 32;} break; case 5: if(game.bestrank[4]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 34;} break; case 6: if(game.bestrank[5]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 30;} break; case 7: if(game.unlock[5]){ entities[k].tile = 188 + vx; entities[k].colour = 37; entities[k].h += 3; } break; case 8: if(game.unlock[19]){ entities[k].tile = 188 + vx; entities[k].colour = 37; entities[k].h += 3; } break; case 9: if (game.bestgamedeaths > -1) { if (game.bestgamedeaths <= 50) { entities[k].tile = 182 + vx; entities[k].colour = 40; } } break; case 10: if (game.bestgamedeaths > -1) { if (game.bestgamedeaths <= 100) { entities[k].tile = 182 + vx; entities[k].colour = 36; } } break; case 11: if (game.bestgamedeaths > -1) { if (game.bestgamedeaths <= 250) { entities[k].tile = 182 + vx; entities[k].colour = 38; } } break; case 12: if (game.bestgamedeaths > -1) { if (game.bestgamedeaths <= 500) { entities[k].tile = 182 + vx; entities[k].colour = 39; } } break; case 13: if(game.swnbestrank>=1) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break; case 14: if(game.swnbestrank>=2) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break; case 15: if(game.swnbestrank>=3) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break; case 16: if(game.swnbestrank>=4) { entities[k].tile = 182 + vx; entities[k].colour = 38;} break; case 17: if(game.swnbestrank>=5) { entities[k].tile = 182 + vx; entities[k].colour = 36;} break; case 18: if(game.swnbestrank>=6) { entities[k].tile = 182 + vx; entities[k].colour = 40;} break; case 19: if(game.unlock[20]){ entities[k].tile = 3; entities[k].colour = 102; entities[k].size = 13; entities[k].xp -= 64; entities[k].yp -= 128; } break; } break; case 26: //Epilogue super warp token entities[k].rule = 3; entities[k].type = 11; entities[k].size = 0; entities[k].tile = 18; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 16; entities[k].h = 16; entities[k].colour = 3; entities[k].onentity = 0; entities[k].animate = 100; entities[k].para = vy; entities[k].size = 13; break; case 51: //Vertical Warp Line entities[k].rule = 5; entities[k].type = 51; entities[k].size = 6; entities[k].life = 0; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 1; entities[k].h = vx; //entities[k].colour = 0; entities[k].onentity = 1; entities[k].invis=true; break; case 52: //Vertical Warp Line entities[k].rule = 5; entities[k].type = 52; entities[k].size = 6; entities[k].life = 0; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = 1; entities[k].h = vx; //entities[k].colour = 0; entities[k].onentity = 1; entities[k].invis=true; break; case 53: //Horizontal Warp Line entities[k].rule = 7; entities[k].type = 53; entities[k].size = 5; entities[k].life = 0; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = vx; entities[k].h = 1; entities[k].onentity = 1; entities[k].invis=true; break; case 54: //Horizontal Warp Line entities[k].rule = 7; entities[k].type = 54; entities[k].size = 5; entities[k].life = 0; entities[k].xp = xp; entities[k].yp = yp; entities[k].w = vx; entities[k].h = 1; entities[k].onentity = 1; entities[k].invis=true; break; case 55: // Crew Member (custom, collectable) //1 - position in array //2 - colour entities[k].rule = 3; entities[k].type = 55; if(customcrewmoods[int(vy)]==1){ entities[k].tile = 144; }else{ entities[k].tile = 0; } entities[k].colour = crewcolour(int(vy)); entities[k].xp = xp; entities[k].yp = yp; entities[k].cx = 6; entities[k].cy = 2; entities[k].w = 12; entities[k].h = 21; entities[k].dir = 0; entities[k].state = 0; entities[k].onentity = 1; //entities[k].state = vx; entities[k].gravity = true; //Check if it's already been collected entities[k].para = vx; if (customcollect[vx] == 1) entities[k].active = false; break; case 56: //Custom enemy entities[k].rule = 1; entities[k].type = 1; entities[k].xp = xp; entities[k].yp = yp; entities[k].behave = vx; entities[k].para = vy; entities[k].w = 16; entities[k].h = 16; entities[k].cx = 0; entities[k].cy = 0; entities[k].x1 = p1; entities[k].y1 = p2; entities[k].x2 = p3; entities[k].y2 = p4; entities[k].harmful = true; switch(customenemy){ case 0: setenemyroom(k, 4+100, 0+100); break; case 1: setenemyroom(k, 2+100, 0+100); break; case 2: setenemyroom(k, 12+100, 3+100); break; case 3: setenemyroom(k, 13+100, 12+100); break; case 4: setenemyroom(k, 16+100, 9+100); break; case 5: setenemyroom(k, 19+100, 1+100); break; case 6: setenemyroom(k, 19+100, 2+100); break; case 7: setenemyroom(k, 18+100, 3+100); break; case 8: setenemyroom(k, 16+100, 0+100); break; case 9: setenemyroom(k, 14+100, 2+100); break; default: setenemyroom(k, 4+100, 0+100); break; } //Set colour based on room tile //Set custom colours if(customplatformtile>0){ var entcol:int = (customplatformtile / 12); switch(entcol){ //RED case 3: case 7: case 12: case 23: case 28: case 34: case 42: case 48: case 58: entities[k].colour = 6; break; //GREEN case 5: case 9: case 22: case 25: case 29: case 31: case 38: case 46: case 52: case 53: entities[k].colour = 7; break; //BLUE case 1: case 6: case 14: case 27: case 33: case 44: case 50: case 57: entities[k].colour = 12; break; //YELLOW case 4: case 17: case 24: case 30: case 37: case 45: case 51: case 55: entities[k].colour = 9; break; //PURPLE case 2: case 11: case 15: case 19: case 32: case 36: case 49: entities[k].colour = 20; break; //CYAN case 8: case 10: case 13: case 18: case 26: case 35: case 41: case 47: case 54: entities[k].colour = 11; break; //PINK case 16: case 20: case 39: case 43: case 56: entities[k].colour = 8; break; //ORANGE case 21: case 40: entities[k].colour = 17; break; default: entities[k].colour = 6; break; } } break; } } public function updateentities(i:int, help:helpclass, game:gameclass, music:musicclass):Boolean { if(entities[i].active){ if(entities[i].statedelay<=0){ switch(entities[i].type) { case 0: //Player if (entities[i].state == 0) { } break; case 1: //Movement behaviors //Enemies can have a number of different behaviors: switch(entities[i].behave) { case 0: //Bounce, Start moving down if (entities[i].state == 0) { //Init entities[i].state = 3; updateentities(i, help, game, music); }else if (entities[i].state == 1) { if (entities[i].outside()) entities[i].state = entities[i].onwall; }else if (entities[i].state == 2) { entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; }else if (entities[i].state == 3) { entities[i].vy = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } break; case 1: //Bounce, Start moving up if (entities[i].state == 0) { //Init entities[i].state = 2; updateentities(i, help, game, music); }else if (entities[i].state == 1) { if (entities[i].outside()) entities[i].state = entities[i].onwall; }else if (entities[i].state == 2) { entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; }else if (entities[i].state == 3) { entities[i].vy = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } break; case 2: //Bounce, Start moving left if (entities[i].state == 0) { //Init entities[i].state = 3; updateentities(i, help, game, music); }else if (entities[i].state == 1) { if (entities[i].outside()) entities[i].state = entities[i].onwall; }else if (entities[i].state == 2) { entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1; }else if (entities[i].state == 3) { entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } break; case 3: //Bounce, Start moving right if (entities[i].state == 0) { //Init entities[i].state = 3; updateentities(i, help, game, music); }else if (entities[i].state == 1) { if (entities[i].outside()) entities[i].state = entities[i].onwall; }else if (entities[i].state == 2) { entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; }else if (entities[i].state == 3) { entities[i].vx = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } break; case 4: //Always move left if (entities[i].state == 0) { //Init entities[i].vx = entities[i].para; } break; case 5: //Always move right if (entities[i].state == 0) { //Init entities[i].vx = entities[i].para; entities[i].state = 1 entities[i].onwall = 2; }else if (entities[i].state == 2) { entities[i].vx = 0; entities[i].onwall = 0; entities[i].xp -= entities[i].para; entities[i].statedelay=8; entities[i].state=0; } break; case 6: //Always move up if (entities[i].state == 0) { //Init entities[i].vy = entities[i].para; entities[i].state = 1; entities[i].onwall = 2; }else if (entities[i].state == 2) { entities[i].vy = -entities[i].para; entities[i].onwall = 0; entities[i].yp -= entities[i].para; entities[i].statedelay=8; entities[i].state=0; } break; case 7: //Always move down if (entities[i].state == 0) { //Init entities[i].vx = entities[i].para; } break; case 8: case 9: //Threadmill: don't move, just impart velocity if (entities[i].state == 0) { //Init entities[i].vx = 0; entities[i].state = 1; entities[i].onwall = 0; } break; case 10: //Emitter: shoot an enemy every so often if (entities[i].state == 0) { createentity(game, entities[i].xp+28, entities[i].yp, 1, 10, 1); entities[i].state = 1; entities[i].statedelay = 12; }else if (entities[i].state == 1) { entities[i].state = 0; } break; case 11: //Always move right, destroy when outside screen if (entities[i].state == 0) { //Init entities[i].vx = entities[i].para; entities[i].state = 1 }else if (entities[i].state == 1) { if (entities[i].xp >= 335) entities[i].active = false; if (game.roomx == 117) { if (entities[i].xp >= (33*8)-32) entities[i].active = false; //collector for LIES } } break; case 12: //Emitter: shoot an enemy every so often (up) if (entities[i].state == 0) { createentity(game, entities[i].xp, entities[i].yp, 1, 12, 1); entities[i].state = 1; entities[i].statedelay = 16; }else if (entities[i].state == 1) { entities[i].state = 0; } break; case 13: //Always move up, destroy when outside screen if (entities[i].state == 0) { //Init entities[i].vy = entities[i].para; entities[i].state = 1 }else if (entities[i].state == 1) { if (entities[i].yp <= -60) entities[i].active = false; if (game.roomy == 108) { if (entities[i].yp <= 60) entities[i].active = false; //collector for factory } } break; case 14: //Very special hack: as two, but doesn't move in specific circumstances if (entities[i].state == 0) { //Init for (j = 0; j < nentity; j++) { if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp-32) { entities[i].state = 3; updateentities(i, help, game, music); } } }else if (entities[i].state == 1) { if (entities[i].outside()) entities[i].state = entities[i].onwall; }else if (entities[i].state == 2) { entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1; }else if (entities[i].state == 3) { entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } break; case 15: //As above, but for 3! if (entities[i].state == 0) { //Init for (j = 0; j < nentity; j++) { if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp+32) { entities[i].state = 3; updateentities(i, help, game, music); } } }else if (entities[i].state == 1) { if (entities[i].outside()) entities[i].state = entities[i].onwall; }else if (entities[i].state == 2) { entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; }else if (entities[i].state == 3) { entities[i].vx = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } break; case 16: //MAVERICK BUS FOLLOWS HIS OWN RULES if (entities[i].state == 0) { //Init //first, y position if (entities[getplayer()].yp > 14 * 8) { entities[i].tile = 120; entities[i].yp = (28*8)-62; }else { entities[i].tile = 96; entities[i].yp = 24; } //now, x position if (entities[getplayer()].xp > 20 * 8) { //approach from the left entities[i].xp = -64; entities[i].state = 2; updateentities(i, help, game, music); //right }else { //approach from the left entities[i].xp = 320; entities[i].state = 3; updateentities(i, help, game, music); //left } }else if (entities[i].state == 1) { if (entities[i].outside()) entities[i].state = entities[i].onwall; }else if (entities[i].state == 2) { entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1; }else if (entities[i].state == 3) { entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } break; case 17: //Special for ASCII Snake (left) if (entities[i].state == 0) { //Init entities[i].statedelay = 6; entities[i].xp -= entities[i].para; } break; case 18: //Special for ASCII Snake (right) if (entities[i].state == 0) { //Init entities[i].statedelay = 6; entities[i].xp += entities[i].para; } break; } break; case 2: //Disappearing platforms //wait for collision if (entities[i].state == 1) { entities[i].life = 12; entities[i].state = 2; entities[i].onentity = 0; music.playef(7,10); }else if (entities[i].state == 2) { entities[i].life--; if (entities[i].life % 3 == 0) entities[i].tile++; if (entities[i].life <= 0) { removeblockat(entities[i].xp, entities[i].yp); entities[i].state = 3;// = false; entities[i].invis = true; } }else if (entities[i].state == 3) { //wait until recharged! }else if (entities[i].state == 4) { //restart! createblock(0, entities[i].xp, entities[i].yp, 32, 8); entities[i].state = 4; entities[i].invis = false; entities[i].tile--; entities[i].state++; entities[i].onentity = 1; }else if (entities[i].state == 5) { entities[i].life+=3; if (entities[i].life % 3 == 0) entities[i].tile--; if (entities[i].life >= 12) { entities[i].life = 12; entities[i].state = 0; entities[i].tile++; } } break; case 3: //Breakable blocks //Only counts if vy of player entity is non zero if (entities[i].state == 1) { j = getplayer(); //if (entities[j].vy > 0.5 && (entities[j].yp+entities[j].h<=entities[i].yp+6)) { entities[i].life = 4; entities[i].state = 2; entities[i].onentity = 0; music.playef(6,10); /*}else if (entities[j].vy <= -0.5 && (entities[j].yp>=entities[i].yp+2)) { entities[i].life = 4; entities[i].state = 2; entities[i].onentity = 0; }else { entities[i].state = 0; }*/ }else if (entities[i].state == 2) { entities[i].life--; entities[i].tile++; if (entities[i].life <= 0) { removeblockat(entities[i].xp, entities[i].yp); entities[i].active = false; } } break; case 4: //Gravity token //wait for collision if (entities[i].state == 1) { entities[i].active = false; game.gravitycontrol = (game.gravitycontrol + 1) % 2; } break; case 5: //Particle sprays if (entities[i].state == 0) { entities[i].life--; if (entities[i].life < 0) entities[i].active = false; } break; case 6: //Small pickup //wait for collision if (entities[i].state == 1) { game.coins++; music.playef(4,10); collect[entities[i].para] = 1; entities[i].active = false; } break; case 7: //Found a trinket //wait for collision if (entities[i].state == 1) { game.trinkets++; if (game.intimetrial) { collect[entities[i].para] = 1; music.playef(25,10); }else{ game.state = 1000; //music.haltdasmusik(); music.silencedasmusik(); music.playef(3,10); collect[entities[i].para] = 1; if (game.trinkets > game.stat_trinkets) { game.stat_trinkets = game.trinkets; } } entities[i].active = false; } break; case 8: //Savepoints //wait for collision if (entities[i].state == 1) { //First, deactivate all other savepoints for (j = 0; j < nentity; j++) { if (entities[j].type == 8 && entities[j].active) { entities[j].colour = 4; entities[j].onentity = 1; } } entities[i].colour = 5; entities[i].onentity = 0; game.savepoint = entities[i].para; music.playef(5,10); game.savex = entities[i].xp - 4; if (entities[i].tile == 20) { game.savey = entities[i].yp - 1; game.savegc = 1; }else if (entities[i].tile == 21) { game.savey = entities[i].yp-8; game.savegc = 0; } game.saverx = game.roomx; game.savery = game.roomy; game.savedir = entities[getplayer()].dir; entities[i].state = 0; if(!game.mobilequicksave_thisroom){ game.autoquicksave = true; game.mobilequicksave_thisroom = true; } } break; case 9: //Gravity Lines if (entities[i].state == 1) { entities[i].life--; entities[i].onentity = 0; if (entities[i].life <= 0) { entities[i].state = 0; entities[i].onentity = 1; } } break; case 10: //Vertical gravity Lines if (entities[i].state == 1) { entities[i].onentity = 3; entities[i].state = 2; music.playef(8,10); game.gravitycontrol = (game.gravitycontrol + 1) % 2; game.totalflips++; temp = getplayer(); if (game.gravitycontrol == 0) { if (entities[temp].vy < 3) entities[temp].vy = 3; }else { if (entities[temp].vy > -3) entities[temp].vy = -3; } }else if (entities[i].state == 2) { entities[i].life--; if (entities[i].life <= 0) { entities[i].state = 0; entities[i].onentity = 1; } }else if (entities[i].state == 3) { entities[i].state = 2; entities[i].life = 4; entities[i].onentity = 3; }else if (entities[i].state == 4) { //Special case for room initilisations: As state one, except without the reversal entities[i].onentity = 3; entities[i].state = 2; } break; case 11: //Warp point //wait for collision if (entities[i].state == 1) { //Depending on the room the warp point is in, teleport to a new location! entities[i].onentity = 0; //play a sound or somefink music.playef(10); game.teleport = true; game.edteleportent = i; //for the multiple room: if (int(entities[i].xp) == 12*8) game.teleportxpos = 1; if (int(entities[i].xp) == 5*8) game.teleportxpos = 2; if (int(entities[i].xp) == 28*8) game.teleportxpos = 3; if (int(entities[i].xp) == 21*8) game.teleportxpos = 4; } break; case 12: //Crew member //Somewhat complex AI: exactly what they do depends on room, location, state etc //At state 0, do nothing at all. if (entities[i].state == 1) { //happy! if (entities[k].rule == 6) entities[k].tile = 0; if (entities[k].rule == 7) entities[k].tile = 6; //Stay close to the hero! j = getplayer(); if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } //Special rules: if (game.roomx == 110 && game.roomy == 105) { if (entities[i].xp < 155) { if (entities[i].ax < 0) entities[i].ax = 0; } } }else if (entities[i].state == 2) { //Basic rules, don't change expression j = getplayer(); if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 10) { //Everything from 10 on is for cutscenes //Basic rules, don't change expression j = getplayer(); if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 11) { //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) j=getcrewman(1); //purple if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 12) { //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) j=getcrewman(2); //yellow if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 13) { //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) j=getcrewman(3); //red if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 14) { //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) j=getcrewman(4); //green if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 15) { //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) j=getcrewman(5); //blue if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 16) { //Follow a position: given an x coordinate, seek it out. if (entities[i].para > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[i].para < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[i].para > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[i].para < entities[i].xp - 45) { entities[i].ax = -3; } }else if (entities[i].state == 17) { //stand still }else if (entities[i].state == 18) { //Stand still and face the player j = getplayer(); if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } }else if (entities[i].state == 19) { //Walk right off the screen after time t if (entities[i].para <= 0) { entities[i].dir = 1; entities[i].ax = 3; }else { entities[i].para--; } }else if (entities[i].state == 20) { //Panic! For briefing script if (entities[i].life == 0) { //walk left for a bit entities[i].ax = 0; if (40 > entities[i].xp + 5) { entities[i].dir = 1; }else if (40 < entities[i].xp - 5) { entities[i].dir = 0; } if (40 > entities[i].xp + 45) { entities[i].ax = 3; }else if (40 < entities[i].xp - 45) { entities[i].ax = -3; } if (entities[i].ax == 0) { entities[i].life = 1; entities[i].para = 30;} }else if (entities[i].life == 1) { //Stand around for a bit entities[i].para--; if (entities[i].para <= 0) { entities[i].life++; } }else if (entities[i].life == 2) { //walk right for a bit entities[i].ax = 0; if (280 > entities[i].xp + 5) { entities[i].dir = 1; }else if (280 < entities[i].xp - 5) { entities[i].dir = 0; } if (280 > entities[i].xp + 45) { entities[i].ax = 3; }else if (280 < entities[i].xp - 45) { entities[i].ax = -3; } if (entities[i].ax == 0) { entities[i].life = 3; entities[i].para = 30;} }else if (entities[i].life == 3) { //Stand around for a bit entities[i].para--; if (entities[i].para <= 0) { entities[i].life=0; } } } break; case 13: //Terminals (very similar to savepoints) //wait for collision if (entities[i].state == 1) { entities[i].colour = 5; entities[i].onentity = 0; music.playef(17,10); entities[i].state = 0; } break; case 14: //Super Crew member //Actually needs less complex AI than the scripting crewmember if (entities[i].state == 0) { //follow player, but only if he's on the floor! j = getplayer(); if(entities[j].onground>0){ if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp>15 && entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } if (entities[i].ax < 0 && entities[i].xp < 60) { entities[i].ax = 0; } }else { if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } entities[i].ax = 0; } if (entities[i].xp > 240) { entities[i].ax = 3; entities[i].dir = 1; } if (entities[i].xp >= 310) { game.scmprogress++; entities[i].active = false; } } break; case 15: //Trophy //wait for collision if (entities[i].state == 1) { trophytext+=2; if (trophytext > 30) trophytext = 30; trophytype = entities[i].para; entities[i].state = 0; } break; case 23: //swn game! switch(entities[i].behave) { case 0: if (entities[i].state == 0) { //Init entities[i].vx = 7; if (entities[i].xp > 320) entities[i].active = false; } break; case 1: if (entities[i].state == 0) { //Init entities[i].vx = -7; if (entities[i].xp <-20) entities[i].active = false; } break; } break; case 51: //Vertical warp line if (entities[i].state == 2){ var j:int = getplayer(); if(entities[j].xp<=307){ customwarpmodevon=false; entities[i].state = 0; } }else if (entities[i].state == 1){ entities[i].state = 2; entities[i].statedelay = 2; entities[i].onentity = 1; customwarpmodevon=true; } break; case 52: //Vertical warp line if (entities[i].state == 2){ j = getplayer(); if(entities[j].xp<=307){ customwarpmodevon=false; entities[i].state = 0; } }else if (entities[i].state == 1){ entities[i].state = 2; entities[i].statedelay = 2; entities[i].onentity = 1; customwarpmodevon=true; } break; case 53: //Warp lines Horizonal if (entities[i].state == 2){ customwarpmodehon=false; entities[i].state = 0; }else if (entities[i].state == 1){ entities[i].state = 2; entities[i].statedelay = 2; entities[i].onentity = 1; customwarpmodehon=true; } break; case 54: //Warp lines Horizonal ////if (entities[i].state != 0) { //trace("entity 54 is still here! ", i, ": state = ", entities[i].state, String(int(Math.random()*100)), entities[i].active); ////} if (entities[i].state == 2){ customwarpmodehon=false; entities[i].state = 0; }else if (entities[i].state == 1){ entities[i].state = 2; entities[i].statedelay = 2; entities[i].onentity = 1; customwarpmodehon=true; } break; case 55: //Collectable crewmate //wait for collision if (entities[i].state == 0){ //Basic rules, don't change expression j = getplayer(); if (entities[j].xp > entities[i].xp + 5){ entities[i].dir = 1; }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } }else if (entities[i].state == 1){ game.crewmates++; if (game.intimetrial){ customcollect[entities[i].para] = 1; music.playef(27,10); }else{ game.state = 1010; //music.haltdasmusik(); if(music.currentsong!=-1) music.silencedasmusik(); music.playef(27,10); customcollect[entities[i].para] = 1; } entities[i].active = false; } break; case 100: //The teleporter if (entities[i].state == 1) { //if inactive, activate! if (entities[i].tile == 1) { music.playef(18, 10); entities[i].onentity = 0; entities[i].tile = 2; entities[i].colour = 101; if(!game.intimetrial && !game.nodeathmode){ game.state = 2000; game.statedelay = 0; } game.activetele = true; game.teleblock.x = entities[i].xp - 32; game.teleblock.y = entities[i].yp - 32; game.teleblock.width = 160; game.teleblock.height = 160; //Alright, let's set this as our savepoint too //First, deactivate all other savepoints for (j = 0; j < nentity; j++) { if (entities[j].type == 8 && entities[j].active) { entities[j].colour = 4; entities[j].onentity = 1; } } game.savepoint = entities[i].para; game.savex = entities[i].xp + 44; game.savey = entities[i].yp + 44; game.savegc = 0; game.saverx = game.roomx; game.savery = game.roomy; game.savedir = entities[getplayer()].dir; entities[i].state = 0; if(!game.mobilequicksave_thisroom){ game.autoquicksave = true; game.mobilequicksave_thisroom = true; } } entities[i].state = 0; }else if (entities[i].state == 2) { //Initilise the teleporter without changing the game state or playing sound entities[i].onentity = 0; entities[i].tile = 6; entities[i].colour = 102; game.activetele = true; game.teleblock.x = entities[i].xp - 32; game.teleblock.y = entities[i].yp - 32; game.teleblock.width = 160; game.teleblock.height = 160; entities[i].state = 0; } break; } }else { entities[i].statedelay--; if (entities[i].statedelay < 0) entities[i].statedelay = 0; } } return true; } public function animateentities(i:int, game:gameclass, help:helpclass):void { if(entities[i].active){ if(entities[i].statedelay<=0){ switch(entities[i].type) { case 0: entities[i].framedelay--; if(entities[i].dir==1){ entities[i].drawframe=entities[i].tile; }else{ entities[i].drawframe=entities[i].tile+3; } if(entities[i].onground>0 || entities[i].onroof>0){ if(int(entities[i].vx)!=0){ //Walking if(entities[i].framedelay<=0){ entities[i].framedelay=4; entities[i].walkingframe++; } if (entities[i].walkingframe >=2) entities[i].walkingframe=0; entities[i].drawframe += entities[i].walkingframe + 1; } if (entities[i].onroof > 0) entities[i].drawframe += 6; }else { entities[i].drawframe ++; if (game.gravitycontrol == 1) { entities[i].drawframe += 6; } } if (game.deathseq > -1) { entities[i].drawframe=13; if (entities[i].dir == 1) entities[i].drawframe = 12; if (game.gravitycontrol == 1) entities[i].drawframe += 2; } break; case 1: case 23: //Variable animation switch(entities[i].animate) { case 0: //Simple oscilation entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 8; if(entities[i].actionframe==0){ entities[i].walkingframe++; if (entities[i].walkingframe == 4) { entities[i].walkingframe = 2; entities[i].actionframe = 1; } }else { entities[i].walkingframe--; if (entities[i].walkingframe == -1) { entities[i].walkingframe = 1; entities[i].actionframe = 0; } } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; break; case 1: //Simple Loop entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 8; entities[i].walkingframe++; if (entities[i].walkingframe == 4) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; break; case 2: //Simpler Loop (just two frames) entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 2; entities[i].walkingframe++; if (entities[i].walkingframe == 2) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; break; case 3: //Simpler Loop (just two frames, but double sized) entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 2; entities[i].walkingframe++; if (entities[i].walkingframe == 2) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += (entities[i].walkingframe*2); break; case 4: //Simpler Loop (just two frames, but double sized) (as above but slower) entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 6; entities[i].walkingframe++; if (entities[i].walkingframe == 2) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += (entities[i].walkingframe*2); break; case 5: //Simpler Loop (just two frames) (slower) entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 6; entities[i].walkingframe++; if (entities[i].walkingframe == 2) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; break; case 6: //Normal Loop (four frames, double sized) entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 4; entities[i].walkingframe++; if (entities[i].walkingframe == 4) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += (entities[i].walkingframe*2); break; case 7: //Simpler Loop (just two frames) (slower) (with directions!) entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 6; entities[i].walkingframe++; if (entities[i].walkingframe == 2) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; if (entities[i].vx > 0) entities[i].drawframe += 2; break; case 10: //Threadmill left entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 3;//(6-entities[i].para); entities[i].walkingframe--; if (entities[i].walkingframe == -1) { entities[i].walkingframe = 3; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; break; case 11: //Threadmill right entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 3;//(6-entities[i].para); entities[i].walkingframe++; if (entities[i].walkingframe == 4) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; break; case 100: //Simple case for no animation (platforms, etc) entities[i].drawframe = entities[i].tile; break; default: entities[i].drawframe = entities[i].tile; break; } break; case 11: entities[i].drawframe = entities[i].tile; if(entities[i].animate==2) { //Simpler Loop (just two frames) entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 10; entities[i].walkingframe++; if (entities[i].walkingframe == 2) { entities[i].walkingframe = 0; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; } break; case 12: case 55: case 14: //Crew member! Very similar to hero entities[i].framedelay--; if(entities[i].dir==1){ entities[i].drawframe=entities[i].tile; }else{ entities[i].drawframe=entities[i].tile+3; } if(entities[i].onground>0 || entities[i].onroof>0){ if(entities[i].vx!=0){ //Walking if(entities[i].framedelay<=0){ entities[i].framedelay=4; entities[i].walkingframe++; } if (entities[i].walkingframe >=2) entities[i].walkingframe=0; entities[i].drawframe += entities[i].walkingframe + 1; } //if (entities[i].onroof > 0) entities[i].drawframe += 6; }else { entities[i].drawframe ++; //if (game.gravitycontrol == 1) { // entities[i].drawframe += 6; //} } if (game.deathseq > -1) { entities[i].drawframe=13; if (entities[i].dir == 1) entities[i].drawframe = 12; if (entities[i].rule == 7) entities[i].drawframe += 2; //if (game.gravitycontrol == 1) entities[i].drawframe += 2; } break; case 100: //the teleporter! if (entities[i].tile == 1) { //it's inactive entities[i].drawframe = entities[i].tile; }else if (entities[i].tile == 2){ entities[i].drawframe = entities[i].tile; entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 1; entities[i].walkingframe = int(Math.random() * 6); if (entities[i].walkingframe >= 4) { entities[i].walkingframe = -1; entities[i].framedelay = 4; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; }else if (entities[i].tile == 6) { //faster! entities[i].drawframe = entities[i].tile; entities[i].framedelay--; if(entities[i].framedelay<=0){ entities[i].framedelay = 2; entities[i].walkingframe = int(Math.random() * 6); if (entities[i].walkingframe >= 4) { entities[i].walkingframe = -5; entities[i].framedelay = 4; } } entities[i].drawframe = entities[i].tile; entities[i].drawframe += entities[i].walkingframe; } break; default: entities[i].drawframe = entities[i].tile; break; } }else { //entities[i].statedelay--; if (entities[i].statedelay < 0) entities[i].statedelay = 0; } } } public function gettype(t:int):Boolean { //Returns true is there is an entity of type t onscreen for (var i:int = 0; i < nentity; i++) { if(entities[i].type==t){ return true; } } return false; } public function getcompanion(t:int):int { //Returns the index of the companion with rule t for (var i:int = 0; i < nentity; i++) { if(entities[i].rule==6 || entities[i].rule==7){ return i; } } return -1; } public function getplayer():int { //Returns the index of the first player entity for (var i:int = 0; i < nentity; i++) { if (entities[i].type == 0) { return i; } } return -1; } public function getscm():int { //Returns the supercrewmate for (var i:int = 0; i < nentity; i++) { if(entities[i].type==14){ return i; } } return 0; } public function getlineat(t:int):int { //Get the entity which is a horizontal line at height t (for SWN game) for (var i:int = 0; i < nentity; i++) { if (entities[i].size == 5) { if (entities[i].yp == t) { return i; } } } return 0; } public function getcrewman(t:int):int { //Returns the index of the crewman with colour index given by t if (t == 0) t = 0; if (t == 1) t = 20; if (t == 2) t = 14; if (t == 3) t = 15; if (t == 4) t = 13; if (t == 5) t = 16; for (var i:int = 0; i < nentity; i++) { if (entities[i].rule == 6 || entities[i].rule == 7) { if(entities[i].colour==t){ return i; } } } return 0; } public function getcustomcrewman(t:int):int { //Returns the index of the crewman with colour index given by t if (t == 0) t = 0; if (t == 1) t = 20; if (t == 2) t = 14; if (t == 3) t = 15; if (t == 4) t = 13; if (t == 5) t = 16; for (var i:int = 0; i < nentity; i++){ if (entities[i].type == 55){ if(entities[i].colour==t){ return i; } } } return 0; } public function getteleporter():int { for (var i:int = 0; i < nentity; i++) { if(entities[i].type==100 && entities[i].active){ return i; } } return -1; } public function rectset(xi:int, yi:int, wi:int, hi:int):void { temprect.x = xi; temprect.y = yi; temprect.width = wi; temprect.height = hi; } public function rect2set(xi:int, yi:int, wi:int, hi:int):void { temprect2.x = xi; temprect2.y = yi; temprect2.width = wi; temprect2.height = hi; } public function entitycollide(a:int, b:int):Boolean { //Do entities a and b collide? tempx = entities[a].xp + entities[a].cx; tempy = entities[a].yp + entities[a].cy; tempw = entities[a].w; temph = entities[a].h; rectset(tempx, tempy, tempw, temph); tempx = entities[b].xp + entities[b].cx; tempy = entities[b].yp + entities[b].cy; tempw = entities[b].w; temph = entities[b].h; rect2set(tempx, tempy, tempw, temph); if (temprect.intersects(temprect2)) return true; return false; } public function checkdirectional(t:int):Boolean{ //Returns true if player entity (rule 0) moving in dir t through directional block if(opt_usedirectional){ i = getplayer(); if (i > -1) { if(entities[i].rule==0){ tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; tempw = entities[i].w; temph = entities[i].h; rectset(tempx, tempy, tempw, temph); for (j = 0; j < nblocks; j++) { if (blocks[j].type == DIRECTIONAL && blocks[j].active){ if(blocks[j].rect.intersects(temprect)) { return true; } } } } } } return false; } public function checkdamage():Boolean{ //Returns true if player entity (rule 0) collides with a damagepoint if(opt_usedamage){ i = getplayer(); if (i > -1) { if(entities[i].rule==0){ tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; tempw = entities[i].w; temph = entities[i].h; rectset(tempx, tempy, tempw, temph); for (j=0; j -1) { if(entities[i].rule==0){ tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; tempw = entities[i].w; temph = entities[i].h; rectset(tempx, tempy, tempw, temph); for (j=0; j-1){ if(entities[i].rule==0){ tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; tempw = entities[i].w; temph = entities[i].h; rectset(tempx, tempy, tempw, temph); for (j=0; j 0 && blocks[i].trigger == 0) if (blocks[i].rect.intersects(temprect)) return true; if (dy <= 0 && blocks[i].trigger == 1) if (blocks[i].rect.intersects(temprect)) return true; if (dx > 0 && blocks[i].trigger == 2) if (blocks[i].rect.intersects(temprect)) return true; if (dx <= 0 && blocks[i].trigger == 3) if (blocks[i].rect.intersects(temprect)) return true; } } if (blocks[i].type == BLOCK){ if (blocks[i].rect.intersects(temprect)) { return true; } } if (blocks[i].type == SAFE) { if(dr==1){ if (blocks[i].rect.intersects(temprect)) { return true; } } } } } return false; } public function checktowerspikes(t:int, map:mapclass):Boolean { tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy; tempw = entities[t].w; temph = entities[t].h; rectset(tempx, tempy, tempw, temph); tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y); tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1); if (map.spikecollide(tempx, tempy)) return true; if (map.spikecollide(tempw, tempy)) return true; if (map.spikecollide(tempx, temph)) return true; if (map.spikecollide(tempw, temph)) return true; if (temprect.height >= 12) { tpy1 = getgridpoint(temprect.y + 6); if (map.spikecollide(tempx, tpy1)) return true; if (map.spikecollide(tempw, tpy1)) return true; if (temprect.height >= 18) { tpy1 = getgridpoint(temprect.y + 12); if (map.spikecollide(tempx, tpy1)) return true; if (map.spikecollide(tempw, tpy1)) return true; if (temprect.height >= 24) { tpy1 = getgridpoint(temprect.y + 18); if (map.spikecollide(tempx, tpy1)) return true; if (map.spikecollide(tempw, tpy1)) return true; } } } if (temprect.width >= 12) { tpx1 = getgridpoint(temprect.x + 6); if (map.collide(tpx1, tempy)) return true; if (map.collide(tpx1, temph)) return true; } return false; } public function checkwall(map:mapclass):Boolean{ //Returns true if entity setup in temprect collides with a wall //used for proper collision functions; you can't just, like, call it //whenever you feel like it and expect a response // //that won't work at all if(skipblocks){ if (checkblocks()) return true; } tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y); tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1); if (map.collide(tempx, tempy)) return true; if (map.collide(tempw, tempy)) return true; if (map.collide(tempx, temph)) return true; if (map.collide(tempw, temph)) return true; if (temprect.height >= 12) { tpy1 = getgridpoint(temprect.y + 6); if (map.collide(tempx, tpy1)) return true; if (map.collide(tempw, tpy1)) return true; if (temprect.height >= 18) { tpy1 = getgridpoint(temprect.y + 12); if (map.collide(tempx, tpy1)) return true; if (map.collide(tempw, tpy1)) return true; if (temprect.height >= 24) { tpy1 = getgridpoint(temprect.y + 18); if (map.collide(tempx, tpy1)) return true; if (map.collide(tempw, tpy1)) return true; } } } if (temprect.width >= 12) { tpx1 = getgridpoint(temprect.x + 6); if (map.collide(tpx1, tempy)) return true; if (map.collide(tpx1, temph)) return true; } return false; } public function hplatformat():Number { //Returns first entity of horizontal platform at (px, py), -1000 otherwise. for (i = 0; i < nentity; i++) { if (entities[i].active) { if (entities[i].rule == 2) { if (entities[i].behave >= 2) { if (entities[i].xp == px && entities[i].yp == py) { if (entities[i].behave == 8) { //threadmill! return entities[i].para; }else if(entities[i].behave == 9) { //threadmill! return -entities[i].para; }else{ return entities[i].vx; } } } } } } return -1000; } public function yline(a:int, b:int):int { if (a < b) return -1; return 1; } public function entityhlinecollide(t:int, l:int):Boolean { //Returns true is entity t collided with the horizontal line l. if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){ if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){ linetemp = 0; linetemp += yline(entities[t].yp, entities[l].yp); linetemp += yline(entities[t].yp + entities[t].h, entities[l].yp); linetemp += yline(entities[t].oldyp, entities[l].yp); linetemp += yline(entities[t].oldyp + entities[t].h, entities[l].yp); if (linetemp > -4 && linetemp < 4) return true; return false; } } return false; } public function entityvlinecollide(t:int, l:int):Boolean { //Returns true is entity t collided with the vertical line l. if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){ if(entities[t].yp + entities[t].cy<=entities[l].yp+entities[l].h){ linetemp = 0; linetemp += yline(entities[t].xp + entities[t].cx+1, entities[l].xp); linetemp += yline(entities[t].xp + entities[t].cx+1 + entities[t].w, entities[l].xp); linetemp += yline(entities[t].oldxp + entities[t].cx+1, entities[l].xp); linetemp += yline(entities[t].oldxp + entities[t].cx+1 + entities[t].w, entities[l].xp); if (linetemp > -4 && linetemp < 4) return true; return false; } } return false; } public function entitywarphlinecollide(t:int, l:int):Boolean { //Returns true is entity t collided with the horizontal line l. if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){ if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){ linetemp = 0; if (entities[l].yp < 120) { //Top line if (entities[t].vy < 0) { if (entities[t].yp < entities[l].yp + 10) linetemp++; if (entities[t].yp + entities[t].h < entities[l].yp + 10) linetemp++; if (entities[t].oldyp < entities[l].yp + 10) linetemp++; if (entities[t].oldyp + entities[t].h < entities[l].yp + 10) linetemp++; } if (linetemp > 0) return true; return false; }else { //Bottom line if (entities[t].vy > 0) { if (entities[t].yp > entities[l].yp - 10) linetemp++; if (entities[t].yp + entities[t].h > entities[l].yp - 10) linetemp++; if (entities[t].oldyp > entities[l].yp - 10) linetemp++; if (entities[t].oldyp + entities[t].h > entities[l].yp - 10) linetemp++; } if (linetemp > 0) return true; return false; } } } return false; } public function entitywarpvlinecollide(t:int, l:int):Boolean { //Returns true is entity t collided with the vertical warp line l. if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){ if (entities[t].yp + entities[t].cy <= entities[l].yp + entities[l].h) { linetemp = 0; if (entities[l].xp < 160) { //Left hand line if (entities[t].xp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++; if (entities[t].xp + entities[t].cx+1 + entities[t].w < entities[l].xp + 10) linetemp++; if (entities[t].oldxp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++; if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w < entities[l].xp + 10) linetemp++; if (linetemp > 0) return true; return false; }else { //Right hand line if (entities[t].xp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++; if (entities[t].xp + entities[t].cx+1 + entities[t].w > entities[l].xp - 10) linetemp++; if (entities[t].oldxp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++; if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w > entities[l].xp - 10) linetemp++; if (linetemp > 0) return true; return false; } } } return false; } public function entitycollideplatformroof(map:mapclass, t:int):Number{ tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy -1; tempw = entities[t].w; temph = entities[t].h; rectset(tempx, tempy, tempw, temph); if (checkplatform()) { //px and py now contain an x y coordinate for a platform, find it return hplatformat(); } return -1000; } public function entitycollideplatformfloor(map:mapclass, t:int):Number{ tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1; tempw = entities[t].w; temph = entities[t].h; rectset(tempx, tempy, tempw, temph); if (checkplatform()) { //px and py now contain an x y coordinate for a platform, find it return hplatformat(); } return -1000; } public function entitycollidefloor(map:mapclass, t:int):Boolean{ //see? like here, for example! tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1; tempw = entities[t].w; temph = entities[t].h; rectset(tempx, tempy, tempw, temph); if (checkwall(map)) return true; return false; } public function entitycollideroof(map:mapclass, t:int):Boolean{ //and here! tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy - 1; tempw = entities[t].w; temph = entities[t].h; rectset(tempx, tempy, tempw, temph); if (checkwall(map)) return true; return false; } public function testwallsx(t:int, map:mapclass, tx:int, ty:int):Boolean{ tempx = tx + entities[t].cx; tempy = ty + entities[t].cy; tempw = entities[t].w; temph = entities[t].h; rectset(tempx, tempy, tempw, temph); if (entities[t].rule < 2) { skipblocks = true; } else { skipblocks = false; } if (entities[t].type == 14) skipblocks = true; dx = 0; dy = 0; if (entities[t].rule == 0) dx = entities[t].vx; dr = entities[t].rule; //Ok, now we check walls if (checkwall(map)) { if (entities[t].vx > 1) { entities[t].vx--; entities[t].newxp = int(entities[t].xp + entities[t].vx); return testwallsx(t, map, entities[t].newxp, entities[t].yp); }else if (entities[t].vx < -1) { entities[t].vx++; entities[t].newxp = int(entities[t].xp + entities[t].vx); return testwallsx(t, map, entities[t].newxp, entities[t].yp); }else { entities[t].vx=0; return false; } } return true; } public function testwallsy(t:int, map:mapclass, tx:int, ty:int):Boolean { tempx = tx + entities[t].cx; tempy = ty + entities[t].cy; tempw = entities[t].w; temph = entities[t].h; rectset(tempx, tempy, tempw, temph); if (entities[t].rule < 2) { skipblocks = true; } else { skipblocks = false; } if (entities[t].type == 14) skipblocks = true; dx = 0; dy = 0; if (entities[t].rule == 0) dy = entities[t].vy; dr = entities[t].rule; //Ok, now we check walls if (checkwall(map)) { if (entities[t].vy > 1) { entities[t].vy--; entities[t].newyp = int(entities[t].yp + entities[t].vy); return testwallsy(t, map, entities[t].xp, entities[t].newyp); }else if (entities[t].vy < -1) { entities[t].vy++; entities[t].newyp = int(entities[t].yp + entities[t].vy); return testwallsy(t, map, entities[t].xp, entities[t].newyp); }else { entities[t].vy=0; return false; } } return true; } public function fixfriction(t:int, xfix:Number, xrate:Number, yrate:Number):void{ if (entities[t].vx > xfix) entities[t].vx -= xrate; if (entities[t].vx < xfix) entities[t].vx += xrate; if (entities[t].vy > 0) entities[t].vy -= yrate; if (entities[t].vy < 0) entities[t].vy += yrate; if (entities[t].vy > 10) entities[t].vy = 10; if (entities[t].vy < -10) entities[t].vy = -10; if (entities[t].vx > 6) entities[t].vx = 6; if (entities[t].vx < -6) entities[t].vx = -6; if (Math.abs(entities[t].vx-xfix) <= xrate) entities[t].vx = xfix; if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0; } public function applyfriction(t:int, xrate:Number, yrate:Number):void{ if (entities[t].vx > 0) entities[t].vx -= xrate; if (entities[t].vx < 0) entities[t].vx += xrate; if (entities[t].vy > 0) entities[t].vy -= yrate; if (entities[t].vy < 0) entities[t].vy += yrate; if (entities[t].vy > 10) entities[t].vy = 10; if (entities[t].vy < -10) entities[t].vy = -10; if (entities[t].vx > 6) entities[t].vx = 6; if (entities[t].vx < -6) entities[t].vx = -6; if (Math.abs(entities[t].vx) <= xrate) entities[t].vx = 0; if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0; } public function cleanup():void { i = nentity - 1; while (i >= 0 && !entities[i].active) { nentity--; i--; } i = nblocks - 1; while (i >= 0 && !blocks[i].active) { nblocks--; i--; } } public function updateentitylogic(t:int, game:gameclass):void { entities[t].oldxp = entities[t].xp; entities[t].oldyp = entities[t].yp; entities[t].vx = entities[t].vx + entities[t].ax; entities[t].vy = entities[t].vy + entities[t].ay; entities[t].ax = 0; if (entities[t].gravity) { if (entities[t].rule == 0) { if(game.gravitycontrol==0){ entities[t].ay = 3; }else { entities[t].ay = -3; } }else if (entities[t].rule == 7) { entities[t].ay = -3; }else { entities[t].ay = 3; } applyfriction(t, game.inertia, 0.25); } entities[t].newxp = entities[t].xp + entities[t].vx; entities[t].newyp = entities[t].yp + entities[t].vy; } public function entitymapcollision(t:int, map:mapclass):void { if (testwallsx(t, map, entities[t].newxp, entities[t].yp)) { entities[t].xp = entities[t].newxp; }else { if (entities[t].onwall > 0) entities[t].state = entities[t].onwall; if (entities[t].onxwall > 0) entities[t].state = entities[t].onxwall; } if (testwallsy(t, map, entities[t].xp, entities[t].newyp)) { entities[t].yp = entities[t].newyp; }else { if (entities[t].onwall > 0) entities[t].state = entities[t].onwall; if (entities[t].onywall > 0) entities[t].state = entities[t].onywall; entities[t].jumpframe = 0; } } public function movingplatformfix(t:int, map:mapclass):void{ //If this intersects the player, then we move the player along it j = getplayer(); if (entitycollide(t, j)) { //ok, bollox, let's make sure entities[j].yp = entities[j].yp + entities[j].vy; if (entitycollide(t, j)) { entities[j].yp = entities[j].yp - entities[j].vy; entities[j].vy = entities[t].vy; entities[j].newyp = entities[j].yp + entities[j].vy; if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) { if (entities[t].vy > 0) { entities[j].yp = entities[t].yp + entities[t].h; entities[j].vy = 0; entities[j].onroof = 1; }else { entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy; entities[j].vy = 0; entities[j].onground = 1; } }else { entities[t].state = entities[t].onwall; } } } } public function scmmovingplatformfix(t:int, map:mapclass):void{ //If this intersects the SuperCrewMate, then we move them along it j = getscm(); if (entitycollide(t, j)) { //ok, bollox, let's make sure entities[j].yp = entities[j].yp + entities[j].vy; if (entitycollide(t, j)) { entities[j].yp = entities[j].yp - entities[j].vy; entities[j].vy = entities[t].vy; entities[j].newyp = entities[j].yp + entities[j].vy; if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) { if (entities[t].vy > 0) { entities[j].yp = entities[t].yp + entities[t].h; entities[j].vy = 0; //entities[j].onroof = true; }else { entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy; entities[j].vy = 0; //entities[j].onground = true; } }else { entities[t].state = entities[t].onwall; } } } } public function hormovingplatformfix(t:int, map:mapclass):void{ //If this intersects the player, then we move the player along it //for horizontal platforms, this is simplier createblock(0, entities[t].xp, entities[t].yp, entities[t].w, entities[t].h); /*j = getplayer(); if (entitycollide(t, j)) { //ok, bollox, let's make sure entities[j].yp = entities[j].yp + entities[j].vy; if (entitycollide(t, j)) { //entities[t].state = entities[t].onwall; } }*/ } public function customwarplinecheck(i:int):void { //Turns on obj.customwarpmodevon and obj.customwarpmodehon if player collides //with warp lines if (entities[i].active) { //We test entity to entity for (j = 0; j < nentity; j++) { if (entities[j].active && i != j) {//Active if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line! if (entities[j].type == 51 || entities[j].type == 52) { if (entitywarpvlinecollide(i, j)) { customwarpmodevon = true; } } } if (entities[i].rule == 0 && entities[j].rule == 7){ //Player vs horizontal WARP line if (entities[j].type == 53 || entities[j].type == 54) { if (entitywarphlinecollide(i, j)) { customwarpmodehon = true; } } } } } } } public function entitycollisioncheck(dwgfx:dwgraphicsclass, game:gameclass, map:mapclass, music:musicclass):void { i = getplayer(); if (entities[i].active) { //We test entity to entity for (j = 0; j < nentity; j++) { if (entities[j].active && i != j) {//Active if (entities[i].rule == 0 && entities[j].rule == 1 && entities[j].harmful) { //player i hits enemy or enemy bullet j if (entitycollide(i, j) && !map.invincibility) { if (entities[i].size == 0 && (entities[j].size == 0 || entities[j].size == 12)) { //They're both sprites, so do a per pixel collision colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp; colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp; if (dwgfx.flipmode) { if (dwgfx.flipsprites[entities[i].drawframe].hitTest( colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) { //Do the collision stuff game.deathseq = 30; } }else{ if (dwgfx.sprites[entities[i].drawframe].hitTest( colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) { //Do the collision stuff game.deathseq = 30; } } }else { //Ok, then we just assume a normal bounding box collision game.deathseq = 30; } } } if (entities[i].rule == 0 && entities[j].rule == 2) { //Moving platforms if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp); } if (entities[i].rule == 0 && entities[j].rule == 3) { //Entity to entity if(entities[j].onentity>0){ if (entitycollide(i, j)) entities[j].state = entities[j].onentity; } } if (entities[i].rule == 0 && entities[j].rule == 4) { //Player vs horizontal line! if(game.deathseq==-1){ //Here we compare the player's old position versus his new one versus the line. //All points either be above or below it. Otherwise, there was a collision this frame. if (entities[j].onentity > 0) { if (entityhlinecollide(i, j)) { music.playef(8,10); game.gravitycontrol = (game.gravitycontrol + 1) % 2; game.totalflips++; if (game.gravitycontrol == 0) { if (entities[i].vy < 1) entities[i].vy = 1; }else { if (entities[i].vy > -1) entities[i].vy = -1; } entities[j].state = entities[j].onentity; entities[j].life = 6; } } } } if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line! if(game.deathseq==-1){ if(entities[j].onentity>0){ if (entityvlinecollide(i, j)) { entities[j].state = entities[j].onentity; entities[j].life = 4; } } } } if (entities[i].rule == 0 && entities[j].rule == 6) { //Player versus crumbly blocks! Special case if (entities[j].onentity > 0) { //ok; only check the actual collision if they're in a close proximity temp = entities[i].yp - entities[j].yp; if (temp < 30 || temp > -30) { temp = entities[i].xp - entities[j].xp; if (temp < 30 || temp > -30) { if (entitycollide(i, j)) entities[j].state = entities[j].onentity; } } } } /* if (entities[i].rule == 0 && entities[j].rule == 7){ //Player vs horizontal WARP line if (game.deathseq == -1) { if (entities[j].onentity > 0) { if (entityhlinecollide(i, j)) { entities[j].state = entities[j].onentity; entities[j].life = 4; } } } } */ } } } if (game.supercrewmate) { //some extra collisions for (i = 0; i < nentity; i++) { if (entities[i].active) { for (j = 0; j < nentity; j++) { if (entities[j].active && i != j) {//Active if (entities[i].type == 14) { //i is the supercrewmate if (entities[j].rule == 1 && entities[j].harmful) {//j is a harmful enemy //player i hits enemy or enemy bullet j if (entitycollide(i, j) && !map.invincibility) { if (entities[i].size == 0 && entities[j].size == 0) { //They're both sprites, so do a per pixel collision colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp; colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp; if (dwgfx.flipmode) { if (dwgfx.flipsprites[entities[i].drawframe].hitTest( colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) { //Do the collision stuff game.deathseq = 30; game.scmhurt = true; } }else{ if (dwgfx.sprites[entities[i].drawframe].hitTest( colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) { //Do the collision stuff game.deathseq = 30; game.scmhurt = true; } } }else { //Ok, then we just assume a normal bounding box collision game.deathseq = 30; game.scmhurt = true; } } } if (entities[j].rule == 2) { //Moving platforms if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp); } if (entities[j].type == 8 && entities[j].rule == 3) { //Entity to entity (well, checkpoints anyway!) if(entities[j].onentity>0){ if (entitycollide(i, j)) entities[j].state = entities[j].onentity; } } } } } } } } //can't have the player being stuck... j = getplayer(); skipdirblocks = true; if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) { //Let's try to get out... if (entities[j].rule == 0) { if(game.gravitycontrol==0){ entities[j].yp -= 3; }else { entities[j].yp += 3; } } } skipdirblocks = false; //Can't have the supercrewmate getting stuck either! if (game.supercrewmate) { j = getscm(); skipdirblocks = true; if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) { //Let's try to get out... if(game.gravitycontrol==0){ entities[j].yp -= 3; }else { entities[j].yp += 3; } } skipdirblocks = false; } //Is the player colliding with any damageblocks? if (checkdamage() && !map.invincibility) { //usual player dead stuff game.deathseq = 30; } //how about the supercrewmate? if (game.supercrewmate) { if (scmcheckdamage() && !map.invincibility) { //usual player dead stuff game.scmhurt = true; game.deathseq = 30; } } activetrigger = -1; if (checktrigger() > -1) { game.state = activetrigger; game.statedelay = 0; } } public var nentity:int; public var entities:Vector. = new Vector.; public var linecrosskludge:Vector. = new Vector.; public var nlinecrosskludge:int; public var colpoint1:Point, colpoint2:Point; public var tempx:int, tempy:int, tempw:int, temph:int, temp:int, temp2:int; public var tpx1:int, tpy1:int, tpx2:int, tpy2:int; public var temprect:Rectangle, temprect2:Rectangle; public var i:int, j:int, k:int;// z:int; public var dx:int, dy:int, dr:int; public var px:int, py:int, linetemp:int; public var activetrigger:int; public var blocks:Vector. = new Vector.; public var flags:Array = new Array; public var collect:Array = new Array; public var customcollect:Array = new Array; public var nblocks:int; public var skipblocks:Boolean, skipdirblocks:Boolean; public var platformtile:int; public var vertplatforms:Boolean, horplatforms:Boolean; // :( public var nearelephant:Boolean; public var upsetmode:Boolean, upset:int; //Trophy Text public var trophytext:int, trophytype:int; //Secret lab scripts public var altstates:int; //Custom stuff public var customenemy:int; public var customplatformtile:int; public var customwarpmode:Boolean, customwarpmodevon:Boolean, customwarpmodehon:Boolean; public var customscript:String; public var customcrewmoods:Array = new Array(); public var mobilemenus:Boolean = true; } }