1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-12-23 01:59:43 +01:00
VVVVVV/mobile_version/src/entityclass.as

4019 lines
140 KiB
ActionScript
Raw Normal View History

package {
2020-01-01 21:29:24 +01:00
import bigroom.input.KeyPoll;
import flash.geom.*;
public class entityclass {
2020-01-01 21:29:24 +01:00
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].xp = xp;
blocks[k].yp = yp;
2020-01-01 21:29:24 +01:00
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].xp = xp;
blocks[k].yp = yp;
2020-01-01 21:29:24 +01:00
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].xp = xp;
blocks[k].yp = yp;
2020-01-01 21:29:24 +01:00
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].xp = xp;
blocks[k].yp = yp;
2020-01-01 21:29:24 +01:00
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";
2020-01-01 21:29:24 +01:00
blocks[k].script = "terminal_juke1";
setblockcolour(k, "orange");
trig=0;
break;
case 26:
blocks[k].prompt = "Pushing onwards";
2020-01-01 21:29:24 +01:00
blocks[k].script = "terminal_juke2";
setblockcolour(k, "orange");
trig=0;
break;
case 27:
blocks[k].prompt = "Positive force";
2020-01-01 21:29:24 +01:00
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";
2020-01-01 21:29:24 +01:00
blocks[k].script = "terminal_juke5";
setblockcolour(k, "orange");
trig=0;
break;
case 30:
blocks[k].prompt = "Predestined fate";
2020-01-01 21:29:24 +01:00
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";
2020-01-01 21:29:24 +01:00
blocks[k].script = "terminal_juke10";
setblockcolour(k, "orange");
trig=0;
break;
case 35:
blocks[k].prompt = "Press ENTER to activate terminal";
if(mobilemenus) blocks[k].prompt = "Activate terminal";
blocks[k].script = "custom_"+customscript;
setblockcolour(k, "orange");
trig=0;
break;
}
break;
}
}
public function removeallblocks():void{
for(i=0; i<nblocks; i++) blocks[i].clear();
nblocks=0;
}
public function removeblock(t:int):void {
blocks[t].clear();
}
public function removeblockat(x:int, y:int):void{
for (i = 0; i < nblocks; i++) {
if(blocks[i].xp == int(x) && blocks[i].yp == int(y)) removeblock(i);
}
}
public function removetrigger(t:int):void{
for(i=0; i<nblocks; i++){
if(blocks[i].type == TRIGGER) {
if (blocks[i].trigger == t) {
blocks[i].active = false;
removeblock(i);
}
}
}
}
public function copylinecross(t:int):void {
//Copy entity t into the first free linecrosskludge entity
linecrosskludge[nlinecrosskludge].clear();
linecrosskludge[nlinecrosskludge].xp = entities[t].xp;
linecrosskludge[nlinecrosskludge].yp = entities[t].yp;
linecrosskludge[nlinecrosskludge].w = entities[t].w;
linecrosskludge[nlinecrosskludge].onentity = entities[t].onentity;
linecrosskludge[nlinecrosskludge].state = entities[t].state;
linecrosskludge[nlinecrosskludge].life = entities[t].life;
nlinecrosskludge++;
}
public function revertlinecross(t:int, s:int):void {
//Restore entity t info from linecrossing s
entities[t].onentity = linecrosskludge[s].onentity;
entities[t].state = linecrosskludge[s].state;
entities[t].life = linecrosskludge[s].life;
}
public function gridmatch(p1:int, p2:int, p3:int, p4:int, p11:int, p21:int, p31:int, p41:int):Boolean {
if (p1 == p11 && p2 == p21 && p3 == p31 && p4 == p41) return true;
return false;
}
public function crewcolour(t:int):int {
//Return the colour of the indexed crewmate
switch(t) {
case 0: return 0; break;
case 1: return 20; break;
case 2: return 14; break;
case 3: return 15; break;
case 4: return 13; break;
case 5: return 16; break;
}
return 0;
}
public function setenemyroom(t:int, rx:int, ry:int):void {
//Simple function to initilise simple enemies
rx -= 100; ry -= 100;
switch(rn(rx, ry)) {
//Space Station 1
case rn(12, 3): //Security Drone
entities[t].tile = 36; entities[t].colour = 8; entities[t].animate = 1;
break;
case rn(13, 3): //Wavelengths
entities[t].tile = 32; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 32;
break;
case rn(15, 3): //Traffic
entities[t].tile = 28; entities[t].colour = 6; entities[t].animate = 1;
entities[t].w = 22; entities[t].h = 32;
break;
case rn(12, 5): //The Yes Men
entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1;
entities[t].w = 20; entities[t].h = 20;
break;
case rn(13, 6): //Hunchbacked Guards
entities[t].tile = 44; entities[t].colour = 8; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 20;
break;
case rn(13, 4): //Communication Station
entities[t].harmful = false;
if (entities[t].xp == 256) {
//transmittor
entities[t].tile = 104; entities[t].colour = 4; entities[t].animate = 7;
entities[t].w = 16; entities[t].h = 16;
entities[t].xp -= 24; entities[t].yp -= 16;
}else {
//radar dish
entities[t].tile =124; entities[t].colour = 4; entities[t].animate = 6;
entities[t].w = 32; entities[t].h = 32; entities[t].cx = 4; entities[t].size = 9;
entities[t].xp -= 4; entities[t].yp -= 32;
}
break;
//The Lab
case rn(4, 0):
entities[t].tile = 78; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(2, 0):
entities[t].tile = 88; entities[t].colour = 11; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
//Space Station 2
case rn(14, 11): entities[t].colour = 17; break; //Lies
case rn(16, 11): entities[t].colour = 8; break; //Lies
case rn(13, 10): entities[t].colour = 11; break; //Factory
case rn(13, 9): entities[t].colour = 9; break; //Factory
case rn(13, 8): entities[t].colour = 8; break; //Factory
case rn(11, 13): //Truth
entities[t].tile = 64; entities[t].colour = 7; entities[t].animate = 100;
entities[t].w = 44; entities[t].h = 10; entities[t].size = 10;
break;
case rn(17, 7): //Brass sent us under the top
entities[t].tile =82; entities[t].colour = 8; entities[t].animate = 5;
entities[t].w = 28; entities[t].h = 32; entities[t].cx = 4;
break;
case rn(10, 7): // (deception)
entities[t].tile = 92; entities[t].colour = 6; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(14, 13): // (chose poorly)
entities[t].tile = 56; entities[t].colour = 6; entities[t].animate = 1;
entities[t].w = 15; entities[t].h = 24;
break;
case rn(13, 12): // (backsliders)
entities[t].tile = 164; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(14, 8): // (wheel of fortune room)
entities[t].tile = 116; entities[t].colour = 12; entities[t].animate = 1;
entities[t].w = 32; entities[t].h = 32;
break;
case rn(16, 9): // (seeing dollar signs)
entities[t].tile = 68; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(16, 7): // (tomb of mad carew)
entities[t].tile = 106; entities[t].colour = 7; entities[t].animate = 2;
entities[t].w = 24; entities[t].h = 25;
break;
//Warp Zone
case rn(15, 2): // (numbers)
entities[t].tile = 100; entities[t].colour = 6; entities[t].animate = 1;
entities[t].w = 32; entities[t].h = 14; entities[t].yp += 1;
break;
case rn(16, 2): // (Manequins)
entities[t].tile = 52; entities[t].colour = 7; entities[t].animate = 5;
entities[t].w = 16; entities[t].h = 25; entities[t].yp -= 4;
break;
case rn(18, 0): // (Obey)
entities[t].tile = 51; entities[t].colour = 11; entities[t].animate = 100;
entities[t].w = 30; entities[t].h = 14;
break;
case rn(19, 1): // Ascending and Descending
entities[t].tile = 48; entities[t].colour = 9; entities[t].animate = 5;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(19, 2): // Shockwave Rider
entities[t].tile = 176; entities[t].colour = 6; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(18, 3): // Mind the gap
entities[t].tile = 168; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(17, 3): // Edge Games
if (entities[t].yp ==96) {
entities[t].tile = 160; entities[t].colour = 8; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
}else {
entities[t].tile = 156; entities[t].colour = 8; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
}
break;
case rn(16, 0): // I love you
entities[t].tile = 112; entities[t].colour = 8; entities[t].animate = 5;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(14, 2): // That's why I have to kill you
entities[t].tile = 114; entities[t].colour = 6; entities[t].animate = 5;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(18, 2): // Thinking with Portals
//depends on direction
if (entities[t].xp ==88) {
entities[t].tile = 54+12; entities[t].colour = 12; entities[t].animate = 100;
entities[t].w = 60; entities[t].h = 16; entities[t].size = 10;
}else{
entities[t].tile = 54; entities[t].colour = 12; entities[t].animate = 100;
entities[t].w = 60; entities[t].h = 16; entities[t].size = 10;
}
break;
//Final level
case rn(50-100, 53-100): //The Yes Men
entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1;
entities[t].w = 20; entities[t].h = 20;
break;
case rn(48-100, 51-100): //Wavelengths
entities[t].tile = 32; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 32;
break;
case rn(43-100,52-100): // Ascending and Descending
entities[t].tile = 48; entities[t].colour = 9; entities[t].animate = 5;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(46-100,51-100): //kids his age
entities[t].tile = 88; entities[t].colour = 11; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(43-100,51-100): // Mind the gap
entities[t].tile = 168; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(44-100,51-100): // vertigo?
entities[t].tile = 172; entities[t].colour = 7; entities[t].animate = 100;
entities[t].w = 32; entities[t].h = 32;
break;
case rn(44-100,52-100): // (backsliders)
entities[t].tile = 164; entities[t].colour = 7; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(43-100, 56-100): //Intermission 1
entities[t].tile = 88; entities[t].colour = 21; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
case rn(45-100, 56-100): //Intermission 1
entities[t].tile = 88; entities[t].colour = 21; entities[t].animate = 1;
entities[t].w = 16; entities[t].h = 16;
break;
//The elephant
case rn(11, 9): case rn(12, 9): case rn(11, 8): case rn(12, 8):
entities[t].tile = 0; entities[t].colour = 102; entities[t].animate = 0;
entities[t].w = 464; entities[t].h = 320; entities[t].size = 11;
entities[t].harmful = false;
break;
}
}
public function setenemy(t:int, r:int):void {
switch(t) {
case 0:
//lies emitter
if(entities[r].para==0){
entities[r].tile = 60; entities[r].animate = 2;
entities[r].colour = 6; entities[r].behave = 10;
entities[r].w = 32; entities[r].h = 32;
entities[r].x1 = -200;
}else if (entities[r].para == 1) {
entities[r].yp += 10;
entities[r].tile = 63; entities[r].animate = 100; //LIES
entities[r].colour = 6;
entities[r].behave = 11; entities[r].para = 9; //destroyed when outside
entities[r].x1 = -200; entities[r].x2 = 400;
entities[r].w = 26; entities[r].h = 10;
entities[r].cx = 1; entities[r].cy = 1;
}else if (entities[r].para == 2) {
entities[r].tile = 62; entities[r].animate = 100;
entities[r].colour = 6; entities[r].behave = -1;
entities[r].w = 32; entities[r].h = 32;
}
break;
case 1:
//FACTORY emitter
if(entities[r].para==0){
entities[r].tile = 72; entities[r].animate = 3; entities[r].size = 9;
entities[r].colour = 6; entities[r].behave = 12;
entities[r].w = 64; entities[r].h = 40;
entities[r].cx = 0; entities[r].cy = 24;
}else if (entities[r].para == 1) {
entities[r].xp += 4; entities[r].yp -= 4;
entities[r].tile = 76; entities[r].animate = 100; // Clouds
entities[r].colour = 6;
entities[r].behave = 13; entities[r].para = -6; //destroyed when outside
entities[r].x2 = 400;
entities[r].w = 32; entities[r].h = 12;
entities[r].cx = 0; entities[r].cy = 6;
}else if (entities[r].para == 2) {
entities[r].tile = 77; entities[r].animate = 100;
entities[r].colour = 6; entities[r].behave = -1;
entities[r].w = 32; entities[r].h = 16;
}
break;
default:
break;
}
}
public function rn(rx:int, ry:int):int {
return rx + (ry * 100);
}
public function settreadmillcolour(t:int, rx:int, ry:int):void {
rx -= 100; ry -= 100;
rx += 50 - 12; ry += 50 - 14; //Space Station
entities[t].tile = 20; //default as blue
switch(rn(rx, ry)) {
case rn(52, 48): entities[t].tile = 791; break; //Cyan
case rn(49, 47): entities[t].tile = 24; break; //Yellow
case rn(56, 44): entities[t].tile = 24; break; //Yellow
case rn(54, 49): entities[t].tile = 24; break; //Yellow
case rn(49, 49): entities[t].tile = 36; break; //Green
case rn(55, 44): entities[t].tile = 36; break; //Green
case rn(54, 43): entities[t].tile = 36; break; //Green
case rn(53, 49): entities[t].tile = 36; break; //Green
case rn(54, 45): entities[t].tile = 711; break; //Green (special)
case rn(51, 48): entities[t].tile = 711; break; //Green (special)
case rn(50, 49): entities[t].tile = 28; break; //Purple
case rn(54, 44): entities[t].tile = 28; break; //Purple
case rn(49, 42): entities[t].tile = 28; break; //Purple
case rn(55, 43): entities[t].tile = 28; break; //Purple
case rn(54, 47): entities[t].tile = 28; break; //Purple
case rn(53, 48): entities[t].tile = 28; break; //Purple
case rn(51, 47): entities[t].tile = 32; break; //Red
case rn(52, 49): entities[t].tile = 32; break; //Red
case rn(48, 43): entities[t].tile = 32; break; //Red
case rn(55, 47): entities[t].tile = 32; break; //Red
case rn(54, 48): entities[t].tile = 32; break; //Red
}
}
public function createentity(game:gameclass, xp:Number, yp:Number, t:int, vx:Number = 0, vy:Number = 0,
p1:int = 0, p2:int = 0, p3:int = 320, p4:int = 240 ):void {
//Find the first inactive case z that we can use to index the new entity
if (nentity == 0) {
//If there are no active entities, Z=0;
k = 0; nentity++;
}else {
i = 0; k = -1;
while (i < nentity) {
if (!entities[i].active) {
k = i; i = nentity;
}
i++;
}
if (k == -1) {
k = nentity;
nentity++;
}
}
//Size 0 is a sprite
//Size 1 is a tile
//Beyond that are special cases (to do)
//Size 2 is a moving platform of width 4 (32)
//Size 3 is apparently a "bug chunky pixel"
//Size 4 is a coin/small pickup
//Size 5 is a horizontal line, 6 is vertical
//Rule 0 is the playable character
//Rule 1 is anything harmful
//Rule 2 is anything decorative (no collisions)
//Rule 3 is anything that results in an entity to entity collision and state change
//Rule 4 is a horizontal line, 5 is vertical
//Rule 6 is a crew member
//trace("creating entity type ", t, xp, yp);
entities[k].clear();
entities[k].active = true;
entities[k].type = t;
switch(t) {
case 0: //Player
entities[k].rule = 0; //Playable character
entities[k].tile = 0; entities[k].colour = 0;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cx = 6; entities[k].cy = 2;
entities[k].w = 12; entities[k].h = 21;
entities[k].dir = 1;
if(vx==1) entities[k].invis = true;
entities[k].gravity = true;
break;
case 1:
2020-01-01 21:29:24 +01:00
entities[k].rule = 1;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].behave = vx; entities[k].para = vy;
entities[k].w = 16; entities[k].h = 16;
entities[k].cx = 0; entities[k].cy = 0;
entities[k].x1 = p1; entities[k].y1 = p2;
entities[k].x2 = p3; entities[k].y2 = p4;
entities[k].harmful = true;
//Exact appearance depends entirely on location, assigned here:
/*
}else if (game.roomx == 50 && game.roomy == 52) {
entities[k].tile = 48; entities[k].colour = 6;
entities[k].w = 32; entities[k].h = 27;
entities[k].animate = 1;
//ok, for space station 2
*/
entities[k].tile = 24;
entities[k].animate = 0;
entities[k].colour = 8;
if (game.roomy == 111 && (game.roomx >= 113 && game.roomx <= 117)) {
setenemy(0, k);
setenemyroom(k, game.roomx, game.roomy); //For colour
}else if (game.roomx == 113 && (game.roomy <= 110 && game.roomy >= 108)) {
setenemy(1, k);
setenemyroom(k, game.roomx, game.roomy); //For colour
}else if (game.roomx == 113 && game.roomy == 107) {
//MAVVERRRICK
entities[k].tile = 96; entities[k].colour = 6; entities[k].size = 9;
entities[k].w = 64; entities[k].h = 44;
entities[k].animate = 4;
}else {
setenemyroom(k, game.roomx, game.roomy);
}
//}else{*/
/*
entities[k].tile = 24;
entities[k].animate = 0;
entities[k].colour = 8;
//for warpzone:
if (game.roomx == 51 && game.roomy == 51) entities[k].colour = 6;
if (game.roomx == 52 && game.roomy == 51) entities[k].colour = 7;
if (game.roomx == 54 && game.roomy == 49) entities[k].colour = 11;
if (game.roomx == 55 && game.roomy == 50) entities[k].colour = 9;
if (game.roomx == 55 && game.roomy == 51) entities[k].colour = 6;
if (game.roomx == 54 && game.roomy == 51) entities[k].colour = 12;
if (game.roomx == 54 && game.roomy == 52) entities[k].colour = 7;
if (game.roomx == 53 && game.roomy == 52) entities[k].colour = 8;
if (game.roomx == 51 && game.roomy == 52) entities[k].colour = 6;
if (game.roomx == 52 && game.roomy == 49) entities[k].colour = 8;
//}
*/
break;
case 2: //A moving platform
entities[k].rule = 2; entities[k].type = 1;
entities[k].size = 2; entities[k].tile = 1;
if (customplatformtile > 0){
entities[k].tile = customplatformtile;
}else if (platformtile > 0) {
entities[k].tile = platformtile;
}else{
//appearance again depends on location
if (gridmatch(p1, p2, p3, p4, 100, 70, 320, 160)) entities[k].tile = 616;
if (gridmatch(p1, p2, p3, p4, 72, 0, 248, 240)) entities[k].tile = 610;
if (gridmatch(p1, p2, p3, p4, -20, 0, 320, 240)) entities[k].tile = 413;
if (gridmatch(p1, p2, p3, p4, -96, -72, 400, 312)) entities[k].tile = 26;
if (gridmatch(p1, p2, p3, p4, -32, -40, 352, 264)) entities[k].tile = 27;
}
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 32; entities[k].h = 8;
if (vx <= 1) vertplatforms = true;
if (vx >= 2 && vx <= 5) horplatforms = true;
if (vx == 14 || vx == 15) horplatforms = true; //special case for last part of Space Station
if (vx >= 6 && vx <= 7) vertplatforms = true;
if (vx >= 10 && vx <= 11) {
//Double sized threadmills
entities[k].w = 64; entities[k].h = 8;
vx -= 2; entities[k].size = 8;
}
entities[k].behave = vx; entities[k].para = vy;
if (vx >= 8 && vx <= 9) {
horplatforms = true; //threadmill!
entities[k].animate = 10;
if(customplatformtile>0){
entities[k].tile = customplatformtile+4;
if (vx == 8) entities[k].tile += 4;
if (vx == 9) entities[k].animate = 11;
}else{
settreadmillcolour(k, game.roomx, game.roomy);
if (vx == 8) entities[k].tile += 40;
if (vx == 9) entities[k].animate = 11;
}
}else {
entities[k].animate = 100;
}
entities[k].x1 = p1; entities[k].y1 = p2;
entities[k].x2 = p3; entities[k].y2 = p4;
entities[k].isplatform = true;
createblock(0, xp, yp, 32, 8);
break;
case 3: //Disappearing platforms
entities[k].rule = 3; entities[k].type = 2;
entities[k].size = 2;
entities[k].tile = 2;
//appearance again depends on location
if(customplatformtile>0){
entities[k].tile=customplatformtile;
}else if (vx > 0) {
entities[k].tile = int(vx);
}else{
if(game.roomx==49 && game.roomy==52) entities[k].tile = 18;
if (game.roomx == 50 && game.roomy == 52) entities[k].tile = 22;
}
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cy = -1;
entities[k].w = 32; entities[k].h = 10;
entities[k].behave = vx; entities[k].para = vy;
entities[k].onentity = 1;
entities[k].animate = 100;
createblock(0, xp, yp, 32, 8);
break;
case 4: //Breakable blocks
entities[k].rule = 6; entities[k].type = 3;
entities[k].size = 1;
entities[k].tile = 10;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cy = -1;
entities[k].w = 8; entities[k].h = 10;
entities[k].behave = vx; entities[k].para = vy;
entities[k].onentity = 1;
entities[k].animate = 100;
createblock(0, xp, yp, 8, 8);
break;
case 5: //Gravity Tokens
entities[k].rule = 3; entities[k].type = 4;
entities[k].size = 0; entities[k].tile = 11;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].behave = vx; entities[k].para = vy;
entities[k].onentity = 1;
entities[k].animate = 100;
break;
case 6: //Decorative particles
entities[k].rule = 2; entities[k].type = 5; //Particles
entities[k].colour = 1; entities[k].size = 3;
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].vx = vx;
entities[k].vy = vy;
entities[k].life = 12;
break;
case 7: //Decorative particles
entities[k].rule = 2; entities[k].type = 5; //Particles
entities[k].colour = 2; entities[k].size = 3;
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].vx = vx;
entities[k].vy = vy;
entities[k].life = 12;
break;
case 8: //Small collectibles
entities[k].rule = 3; entities[k].type = 6;
entities[k].size = 4; entities[k].tile = 48;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 8; entities[k].h = 8;
entities[k].onentity = 1;
entities[k].animate = 100;
//Check if it's already been collected
entities[k].para = vx;
if (collect[vx] == 1) entities[k].active = false;
break;
case 9: //Something Shiny
entities[k].rule = 3; entities[k].type = 7;
entities[k].size = 0; entities[k].tile = 22;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 3;
entities[k].onentity = 1;
entities[k].animate = 100;
//Check if it's already been collected
entities[k].para = vx;
if (collect[vx] == 1) entities[k].active = false;
break;
case 10: //Savepoint
entities[k].rule = 3; entities[k].type = 8;
entities[k].size = 0; entities[k].tile = 20 + vx;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 4;
entities[k].onentity = 1;
entities[k].animate = 100;
entities[k].para = vy;
if (game.savepoint == vy) {
entities[k].colour = 5;
entities[k].onentity = 0;
}
if (game.nodeathmode) {
entities[k].active = false;
}
break;
case 11: //Horizontal Gravity Line
entities[k].rule = 4; entities[k].type = 9;
entities[k].size = 5; entities[k].life = 0;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = vx; entities[k].h = 1;
entities[k].onentity = 1;
break;
case 12: //Vertical Gravity Line
entities[k].rule = 5; entities[k].type = 10;
entities[k].size = 6; entities[k].life = 0;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 1; entities[k].h = vx;
//entities[k].colour = 0;
entities[k].onentity = 1;
break;
case 13: //Warp token
entities[k].rule = 3; entities[k].type = 11;
entities[k].size = 0; entities[k].tile = 18;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 10;
entities[k].onentity = 1;
entities[k].animate = 2;
//Added in port, hope it doesn't break anything
entities[k].behave = vx;
entities[k].para = vy;
break;
case 14: // Teleporter
entities[k].rule = 3; entities[k].type = 100;
entities[k].size = 7; entities[k].tile = 1; //inactive
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 96; entities[k].h = 96;
entities[k].colour = 100;
entities[k].onentity = 1;
entities[k].animate = 100;
entities[k].para = vy;
//we'll init it's activeness here later
/*if (game.savepoint == vy) {
entities[k].colour = 5;
entities[k].onentity = 0;
}*/
break;
case 15: // Crew Member (warp zone)
entities[k].rule = 6; entities[k].type = 12; //A special case!
entities[k].tile = 144; entities[k].colour = 13; //144 for sad :(
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cx = 6; entities[k].cy = 2;
entities[k].w = 12; entities[k].h = 21;
entities[k].dir = 0;
entities[k].state = vx;
entities[k].gravity = true;
break;
case 16: // Crew Member, upside down (space station)
entities[k].rule = 7; entities[k].type = 12; //A special case!
entities[k].tile = 144+6; entities[k].colour = 14; //144 for sad (upside down+12):(
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cx = 6; entities[k].cy = 2;
entities[k].w = 12; entities[k].h = 21;
entities[k].dir = 1;
entities[k].state = vx;
entities[k].gravity = true;
break;
case 17: // Crew Member (Lab)
entities[k].rule = 6; entities[k].type = 12; //A special case!
entities[k].tile = 144; entities[k].colour = 16; //144 for sad :(
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cx = 6; entities[k].cy = 2;
entities[k].w = 12; entities[k].h = 21;
entities[k].dir = 1;
entities[k].state = vx;
entities[k].gravity = true;
break;
case 18: // Crew Member (Ship)
//This is the scriping crewmember
entities[k].rule = 6; entities[k].type = 12; //A special case!
entities[k].colour = vx;
if (vy == 0) {
entities[k].tile = 0;
}else {
entities[k].tile = 144;
}
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cx = 6; entities[k].cy = 2;
entities[k].w = 12; entities[k].h = 21;
entities[k].dir = 0;
entities[k].state = p1;
entities[k].para = p2;
if (p1 == 17) {
entities[k].dir = p2;
}
entities[k].gravity = true;
break;
case 19: // Crew Member (Ship) More tests!
entities[k].rule = 6; entities[k].type = 12; //A special case!
entities[k].tile = 0; entities[k].colour = 6; //54 for sad :(
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cx = 6; entities[k].cy = 2;
entities[k].w = 12; entities[k].h = 21;
entities[k].dir = 1;
entities[k].state = vx;
entities[k].gravity = true;
break;
case 20: //Terminal
entities[k].rule = 3; entities[k].type = 13;
entities[k].size = 0; entities[k].tile = 16 + vx;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 4;
entities[k].onentity = 1;
entities[k].animate = 100;
entities[k].para = vy;
/*if (game.savepoint == vy) {
entities[k].colour = 5;
entities[k].onentity = 0;
}*/
break;
case 21: //as above, except doesn't highlight
entities[k].rule = 3; entities[k].type = 13;
entities[k].size = 0; entities[k].tile = 16 + vx;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 4;
entities[k].onentity = 0;
entities[k].animate = 100;
entities[k].para = vy;
/*if (game.savepoint == vy) {
entities[k].colour = 5;
entities[k].onentity = 0;
}*/
break;
case 22: //Fake trinkets, only appear if you've collected them
entities[k].rule = 3; entities[k].type = 7;
entities[k].size = 0; entities[k].tile = 22;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 3;
entities[k].onentity = 0;
entities[k].animate = 100;
//Check if it's already been collected
entities[k].para = vx;
if (collect[vx] == 0) entities[k].active = false;
break;
case 23: //SWN Enemies
//Given a different behavior, these enemies are especially for SWN mode and disappear outside the screen.
entities[k].rule = 1; entities[k].type = 23;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].behave = vx; entities[k].para = vy;
entities[k].w = 16; entities[k].h = 16;
entities[k].cx = 0; entities[k].cy = 0;
entities[k].x1 = -2000; entities[k].y1 = -100;
entities[k].x2 = 5200; entities[k].y2 = 340;
entities[k].harmful = true;
//initilise tiles here based on behavior
entities[k].size = 12; //don't wrap around
entities[k].colour = 21;
entities[k].tile = 78; //default case
entities[k].animate = 1;
if (game.swngame == 1) {
//set colour based on current state
entities[k].colour = swncolour(game.swncolstate);
}
break;
case 24: // Super Crew Member
//This special crewmember is way more advanced than the usual kind, and can interact with game objects
entities[k].rule = 6; entities[k].type = 14; //A special case!
entities[k].colour = vx;
if(vx==16){
//victoria is sad!
if (vy == 2) vy = 1;
}else {
if (vy == 2) vy = 0;
}
if (vy == 0) {
entities[k].tile = 0;
}else {
entities[k].tile = 144;
}
entities[k].xp = xp; entities[k].yp = yp;
entities[k].cx = 6; entities[k].cy = 2;
entities[k].w = 12; entities[k].h = 21;
entities[k].dir = 1;
entities[k].x1 = -2000; entities[k].y1 = -100;
entities[k].x2 = 5200; entities[k].y2 = 340;
entities[k].state = p1;
entities[k].para = p2;
if (p1 == 17) {
entities[k].dir = p2;
}
entities[k].gravity = true;
break;
case 25: //Trophies
entities[k].rule = 3; entities[k].type = 15;
entities[k].size = 0;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 4;
entities[k].onentity = 1;
entities[k].animate = 100;
entities[k].para = vy;
//Decide tile here based on given achievement: both whether you have them and what they are
//default is just a trophy base:
entities[k].tile = 180 + vx;
switch(vy) {
case 1: if(game.bestrank[0]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 31;} break;
case 2: if(game.bestrank[1]>=3) { entities[k].tile = 186 + vx; entities[k].colour = 35;} break;
case 3: if(game.bestrank[2]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 33;} break;
case 4: if(game.bestrank[3]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 32;} break;
case 5: if(game.bestrank[4]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 34;} break;
case 6: if(game.bestrank[5]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 30;} break;
case 7:
if(game.unlock[5]){
entities[k].tile = 188 + vx;
entities[k].colour = 37;
entities[k].h += 3;
}
break;
case 8:
if(game.unlock[19]){
entities[k].tile = 188 + vx;
entities[k].colour = 37;
entities[k].h += 3;
}
break;
case 9:
if (game.bestgamedeaths > -1) {
if (game.bestgamedeaths <= 50) {
entities[k].tile = 182 + vx; entities[k].colour = 40;
}
}
break;
case 10:
if (game.bestgamedeaths > -1) {
if (game.bestgamedeaths <= 100) {
entities[k].tile = 182 + vx; entities[k].colour = 36;
}
}
break;
case 11:
if (game.bestgamedeaths > -1) {
if (game.bestgamedeaths <= 250) {
entities[k].tile = 182 + vx; entities[k].colour = 38;
}
}
break;
case 12:
if (game.bestgamedeaths > -1) {
if (game.bestgamedeaths <= 500) {
entities[k].tile = 182 + vx; entities[k].colour = 39;
}
}
break;
case 13: if(game.swnbestrank>=1) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break;
case 14: if(game.swnbestrank>=2) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break;
case 15: if(game.swnbestrank>=3) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break;
case 16: if(game.swnbestrank>=4) { entities[k].tile = 182 + vx; entities[k].colour = 38;} break;
case 17: if(game.swnbestrank>=5) { entities[k].tile = 182 + vx; entities[k].colour = 36;} break;
case 18: if(game.swnbestrank>=6) { entities[k].tile = 182 + vx; entities[k].colour = 40;} break;
case 19:
if(game.unlock[20]){
entities[k].tile = 3; entities[k].colour = 102;
entities[k].size = 13;
entities[k].xp -= 64; entities[k].yp -= 128;
}
break;
}
break;
case 26: //Epilogue super warp token
entities[k].rule = 3; entities[k].type = 11;
entities[k].size = 0; entities[k].tile = 18;
entities[k].xp = xp; entities[k].yp = yp;
entities[k].w = 16; entities[k].h = 16;
entities[k].colour = 3;
entities[k].onentity = 0;
entities[k].animate = 100;
entities[k].para = vy;
entities[k].size = 13;
break;
case 51: //Vertical Warp Line
entities[k].rule = 5;
entities[k].type = 51;
entities[k].size = 6;
entities[k].life = 0;
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].w = 1;
entities[k].h = vx;
//entities[k].colour = 0;
entities[k].onentity = 1;
entities[k].invis=true;
break;
case 52: //Vertical Warp Line
entities[k].rule = 5;
entities[k].type = 52;
entities[k].size = 6;
entities[k].life = 0;
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].w = 1;
entities[k].h = vx;
//entities[k].colour = 0;
entities[k].onentity = 1;
entities[k].invis=true;
break;
case 53: //Horizontal Warp Line
entities[k].rule = 7;
entities[k].type = 53;
entities[k].size = 5;
entities[k].life = 0;
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].w = vx;
entities[k].h = 1;
entities[k].onentity = 1;
entities[k].invis=true;
break;
case 54: //Horizontal Warp Line
entities[k].rule = 7;
entities[k].type = 54;
entities[k].size = 5;
entities[k].life = 0;
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].w = vx;
entities[k].h = 1;
entities[k].onentity = 1;
entities[k].invis=true;
break;
case 55: // Crew Member (custom, collectable)
//1 - position in array
//2 - colour
entities[k].rule = 3;
entities[k].type = 55;
if(customcrewmoods[int(vy)]==1){
entities[k].tile = 144;
}else{
entities[k].tile = 0;
}
entities[k].colour = crewcolour(int(vy));
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].cx = 6;
entities[k].cy = 2;
entities[k].w = 12;
entities[k].h = 21;
entities[k].dir = 0;
entities[k].state = 0;
entities[k].onentity = 1;
//entities[k].state = vx;
entities[k].gravity = true;
//Check if it's already been collected
entities[k].para = vx;
if (customcollect[vx] == 1) entities[k].active = false;
break;
case 56: //Custom enemy
entities[k].rule = 1;
entities[k].type = 1;
entities[k].xp = xp;
entities[k].yp = yp;
entities[k].behave = vx;
entities[k].para = vy;
entities[k].w = 16;
entities[k].h = 16;
entities[k].cx = 0;
entities[k].cy = 0;
entities[k].x1 = p1;
entities[k].y1 = p2;
entities[k].x2 = p3;
entities[k].y2 = p4;
entities[k].harmful = true;
switch(customenemy){
case 0: setenemyroom(k, 4+100, 0+100); break;
case 1: setenemyroom(k, 2+100, 0+100); break;
case 2: setenemyroom(k, 12+100, 3+100); break;
case 3: setenemyroom(k, 13+100, 12+100); break;
case 4: setenemyroom(k, 16+100, 9+100); break;
case 5: setenemyroom(k, 19+100, 1+100); break;
case 6: setenemyroom(k, 19+100, 2+100); break;
case 7: setenemyroom(k, 18+100, 3+100); break;
case 8: setenemyroom(k, 16+100, 0+100); break;
case 9: setenemyroom(k, 14+100, 2+100); break;
default: setenemyroom(k, 4+100, 0+100); break;
}
//Set colour based on room tile
//Set custom colours
if(customplatformtile>0){
var entcol:int = (customplatformtile / 12);
switch(entcol){
//RED
case 3: case 7: case 12: case 23: case 28:
case 34: case 42: case 48: case 58:
entities[k].colour = 6; break;
//GREEN
case 5: case 9: case 22: case 25: case 29:
case 31: case 38: case 46: case 52: case 53:
entities[k].colour = 7; break;
//BLUE
case 1: case 6: case 14: case 27: case 33:
case 44: case 50: case 57:
entities[k].colour = 12; break;
//YELLOW
case 4: case 17: case 24: case 30: case 37:
case 45: case 51: case 55:
entities[k].colour = 9; break;
//PURPLE
case 2: case 11: case 15: case 19: case 32:
case 36: case 49:
entities[k].colour = 20; break;
//CYAN
case 8: case 10: case 13: case 18: case 26:
case 35: case 41: case 47: case 54:
entities[k].colour = 11; break;
//PINK
case 16: case 20: case 39: case 43: case 56:
entities[k].colour = 8; break;
//ORANGE
case 21: case 40:
entities[k].colour = 17; break;
default:
entities[k].colour = 6;
break;
}
}
break;
}
}
public function updateentities(i:int, help:helpclass, game:gameclass, music:musicclass):Boolean {
if(entities[i].active){
if(entities[i].statedelay<=0){
switch(entities[i].type) {
case 0: //Player
if (entities[i].state == 0) {
}
break;
case 1: //Movement behaviors
//Enemies can have a number of different behaviors:
switch(entities[i].behave) {
case 0: //Bounce, Start moving down
if (entities[i].state == 0) { //Init
entities[i].state = 3; updateentities(i, help, game, music);
}else if (entities[i].state == 1) {
if (entities[i].outside()) entities[i].state = entities[i].onwall;
}else if (entities[i].state == 2) {
entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
}else if (entities[i].state == 3) {
entities[i].vy = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; }
break;
case 1: //Bounce, Start moving up
if (entities[i].state == 0) { //Init
entities[i].state = 2; updateentities(i, help, game, music);
}else if (entities[i].state == 1) {
if (entities[i].outside()) entities[i].state = entities[i].onwall;
}else if (entities[i].state == 2) {
entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
}else if (entities[i].state == 3) {
entities[i].vy = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; }
break;
case 2: //Bounce, Start moving left
if (entities[i].state == 0) { //Init
entities[i].state = 3; updateentities(i, help, game, music);
}else if (entities[i].state == 1) {
if (entities[i].outside()) entities[i].state = entities[i].onwall;
}else if (entities[i].state == 2) {
entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
}else if (entities[i].state == 3) {
entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; }
break;
case 3: //Bounce, Start moving right
if (entities[i].state == 0) { //Init
entities[i].state = 3; updateentities(i, help, game, music);
}else if (entities[i].state == 1) {
if (entities[i].outside()) entities[i].state = entities[i].onwall;
}else if (entities[i].state == 2) {
entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
}else if (entities[i].state == 3) {
entities[i].vx = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; }
break;
case 4: //Always move left
if (entities[i].state == 0) { //Init
entities[i].vx = entities[i].para;
}
break;
case 5: //Always move right
if (entities[i].state == 0) { //Init
entities[i].vx = entities[i].para;
entities[i].state = 1
entities[i].onwall = 2;
}else if (entities[i].state == 2) {
entities[i].vx = 0; entities[i].onwall = 0;
entities[i].xp -= entities[i].para;
entities[i].statedelay=8; entities[i].state=0;
}
break;
case 6: //Always move up
if (entities[i].state == 0) { //Init
entities[i].vy = entities[i].para;
entities[i].state = 1;
entities[i].onwall = 2;
}else if (entities[i].state == 2) {
entities[i].vy = -entities[i].para; entities[i].onwall = 0;
entities[i].yp -= entities[i].para;
entities[i].statedelay=8; entities[i].state=0;
}
break;
case 7: //Always move down
if (entities[i].state == 0) { //Init
entities[i].vx = entities[i].para;
}
break;
case 8: case 9:
//Threadmill: don't move, just impart velocity
if (entities[i].state == 0) { //Init
entities[i].vx = 0;
entities[i].state = 1;
entities[i].onwall = 0;
}
break;
case 10:
//Emitter: shoot an enemy every so often
if (entities[i].state == 0) {
createentity(game, entities[i].xp+28, entities[i].yp, 1, 10, 1);
entities[i].state = 1; entities[i].statedelay = 12;
}else if (entities[i].state == 1) {
entities[i].state = 0;
}
break;
case 11: //Always move right, destroy when outside screen
if (entities[i].state == 0) { //Init
entities[i].vx = entities[i].para;
entities[i].state = 1
}else if (entities[i].state == 1) {
if (entities[i].xp >= 335) entities[i].active = false;
if (game.roomx == 117) {
if (entities[i].xp >= (33*8)-32) entities[i].active = false;
//collector for LIES
}
}
break;
case 12:
//Emitter: shoot an enemy every so often (up)
if (entities[i].state == 0) {
createentity(game, entities[i].xp, entities[i].yp, 1, 12, 1);
entities[i].state = 1; entities[i].statedelay = 16;
}else if (entities[i].state == 1) {
entities[i].state = 0;
}
break;
case 13: //Always move up, destroy when outside screen
if (entities[i].state == 0) { //Init
entities[i].vy = entities[i].para;
entities[i].state = 1
}else if (entities[i].state == 1) {
if (entities[i].yp <= -60) entities[i].active = false;
if (game.roomy == 108) {
if (entities[i].yp <= 60) entities[i].active = false;
//collector for factory
}
}
break;
case 14: //Very special hack: as two, but doesn't move in specific circumstances
if (entities[i].state == 0) { //Init
for (j = 0; j < nentity; j++) {
if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp-32) {
entities[i].state = 3; updateentities(i, help, game, music);
}
}
}else if (entities[i].state == 1) {
if (entities[i].outside()) entities[i].state = entities[i].onwall;
}else if (entities[i].state == 2) {
entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
}else if (entities[i].state == 3) {
entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; }
break;
case 15: //As above, but for 3!
if (entities[i].state == 0) { //Init
for (j = 0; j < nentity; j++) {
if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp+32) {
entities[i].state = 3; updateentities(i, help, game, music);
}
}
}else if (entities[i].state == 1) {
if (entities[i].outside()) entities[i].state = entities[i].onwall;
}else if (entities[i].state == 2) {
entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
}else if (entities[i].state == 3) {
entities[i].vx = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; }
break;
case 16: //MAVERICK BUS FOLLOWS HIS OWN RULES
if (entities[i].state == 0) { //Init
//first, y position
if (entities[getplayer()].yp > 14 * 8) {
entities[i].tile = 120;
entities[i].yp = (28*8)-62;
}else {
entities[i].tile = 96;
entities[i].yp = 24;
}
//now, x position
if (entities[getplayer()].xp > 20 * 8) {
//approach from the left
entities[i].xp = -64;
entities[i].state = 2; updateentities(i, help, game, music); //right
}else {
//approach from the left
entities[i].xp = 320;
entities[i].state = 3; updateentities(i, help, game, music); //left
}
}else if (entities[i].state == 1) {
if (entities[i].outside()) entities[i].state = entities[i].onwall;
}else if (entities[i].state == 2) {
entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1;
}else if (entities[i].state == 3) {
entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; }
break;
case 17: //Special for ASCII Snake (left)
if (entities[i].state == 0) { //Init
entities[i].statedelay = 6; entities[i].xp -= entities[i].para;
}
break;
case 18: //Special for ASCII Snake (right)
if (entities[i].state == 0) { //Init
entities[i].statedelay = 6; entities[i].xp += entities[i].para;
}
break;
}
break;
case 2: //Disappearing platforms
//wait for collision
if (entities[i].state == 1) {
entities[i].life = 12;
entities[i].state = 2; entities[i].onentity = 0;
music.playef(7,10);
}else if (entities[i].state == 2) {
entities[i].life--;
if (entities[i].life % 3 == 0) entities[i].tile++;
if (entities[i].life <= 0) {
removeblockat(entities[i].xp, entities[i].yp);
entities[i].state = 3;// = false;
entities[i].invis = true;
}
}else if (entities[i].state == 3) {
//wait until recharged!
}else if (entities[i].state == 4) {
//restart!
createblock(0, entities[i].xp, entities[i].yp, 32, 8);
entities[i].state = 4;
entities[i].invis = false;
entities[i].tile--;
entities[i].state++; entities[i].onentity = 1;
}else if (entities[i].state == 5) {
entities[i].life+=3;
if (entities[i].life % 3 == 0) entities[i].tile--;
if (entities[i].life >= 12) {
entities[i].life = 12;
entities[i].state = 0;
entities[i].tile++;
}
}
break;
case 3: //Breakable blocks
//Only counts if vy of player entity is non zero
if (entities[i].state == 1) {
j = getplayer();
//if (entities[j].vy > 0.5 && (entities[j].yp+entities[j].h<=entities[i].yp+6)) {
entities[i].life = 4;
entities[i].state = 2; entities[i].onentity = 0;
music.playef(6,10);
/*}else if (entities[j].vy <= -0.5 && (entities[j].yp>=entities[i].yp+2)) {
entities[i].life = 4;
entities[i].state = 2; entities[i].onentity = 0;
}else {
entities[i].state = 0;
}*/
}else if (entities[i].state == 2) {
entities[i].life--;
entities[i].tile++;
if (entities[i].life <= 0) {
removeblockat(entities[i].xp, entities[i].yp);
entities[i].active = false;
}
}
break;
case 4: //Gravity token
//wait for collision
if (entities[i].state == 1) {
entities[i].active = false;
game.gravitycontrol = (game.gravitycontrol + 1) % 2;
}
break;
case 5: //Particle sprays
if (entities[i].state == 0) {
entities[i].life--;
if (entities[i].life < 0) entities[i].active = false;
}
break;
case 6: //Small pickup
//wait for collision
if (entities[i].state == 1) {
game.coins++;
music.playef(4,10);
collect[entities[i].para] = 1;
entities[i].active = false;
}
break;
case 7: //Found a trinket
//wait for collision
if (entities[i].state == 1) {
game.trinkets++;
if (game.intimetrial) {
collect[entities[i].para] = 1;
music.playef(25,10);
}else{
game.state = 1000;
//music.haltdasmusik();
music.silencedasmusik();
music.playef(3,10);
collect[entities[i].para] = 1;
if (game.trinkets > game.stat_trinkets) {
game.stat_trinkets = game.trinkets;
}
}
entities[i].active = false;
}
break;
case 8: //Savepoints
//wait for collision
if (entities[i].state == 1) {
//First, deactivate all other savepoints
for (j = 0; j < nentity; j++) {
if (entities[j].type == 8 && entities[j].active) {
entities[j].colour = 4; entities[j].onentity = 1;
}
}
entities[i].colour = 5;
entities[i].onentity = 0;
game.savepoint = entities[i].para;
music.playef(5,10);
game.savex = entities[i].xp - 4;
if (entities[i].tile == 20) {
game.savey = entities[i].yp - 1;
game.savegc = 1;
}else if (entities[i].tile == 21) {
game.savey = entities[i].yp-8;
game.savegc = 0;
}
game.saverx = game.roomx; game.savery = game.roomy;
game.savedir = entities[getplayer()].dir;
entities[i].state = 0;
if(!game.mobilequicksave_thisroom){
game.autoquicksave = true;
game.mobilequicksave_thisroom = true;
}
}
break;
case 9: //Gravity Lines
if (entities[i].state == 1) {
entities[i].life--;
entities[i].onentity = 0;
if (entities[i].life <= 0) {
entities[i].state = 0;
entities[i].onentity = 1;
}
}
break;
case 10: //Vertical gravity Lines
if (entities[i].state == 1) {
entities[i].onentity = 3;
entities[i].state = 2;
music.playef(8,10);
game.gravitycontrol = (game.gravitycontrol + 1) % 2;
game.totalflips++;
temp = getplayer();
if (game.gravitycontrol == 0) {
if (entities[temp].vy < 3) entities[temp].vy = 3;
}else {
if (entities[temp].vy > -3) entities[temp].vy = -3;
}
}else if (entities[i].state == 2) {
entities[i].life--;
if (entities[i].life <= 0) {
entities[i].state = 0;
entities[i].onentity = 1;
}
}else if (entities[i].state == 3) {
entities[i].state = 2; entities[i].life = 4;
entities[i].onentity = 3;
}else if (entities[i].state == 4) {
//Special case for room initilisations: As state one, except without the reversal
entities[i].onentity = 3;
entities[i].state = 2;
}
break;
case 11: //Warp point
//wait for collision
if (entities[i].state == 1) {
//Depending on the room the warp point is in, teleport to a new location!
entities[i].onentity = 0;
//play a sound or somefink
music.playef(10);
game.teleport = true;
game.edteleportent = i;
//for the multiple room:
if (int(entities[i].xp) == 12*8) game.teleportxpos = 1;
if (int(entities[i].xp) == 5*8) game.teleportxpos = 2;
if (int(entities[i].xp) == 28*8) game.teleportxpos = 3;
if (int(entities[i].xp) == 21*8) game.teleportxpos = 4;
}
break;
case 12: //Crew member
//Somewhat complex AI: exactly what they do depends on room, location, state etc
//At state 0, do nothing at all.
if (entities[i].state == 1) {
//happy!
if (entities[k].rule == 6) entities[k].tile = 0;
if (entities[k].rule == 7) entities[k].tile = 6;
//Stay close to the hero!
j = getplayer();
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
//Special rules:
if (game.roomx == 110 && game.roomy == 105) {
if (entities[i].xp < 155) { if (entities[i].ax < 0) entities[i].ax = 0; }
}
}else if (entities[i].state == 2) {
//Basic rules, don't change expression
j = getplayer();
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 10) {
//Everything from 10 on is for cutscenes
//Basic rules, don't change expression
j = getplayer();
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 11) {
//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
j=getcrewman(1); //purple
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 12) {
//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
j=getcrewman(2); //yellow
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 13) {
//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
j=getcrewman(3); //red
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 14) {
//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
j=getcrewman(4); //green
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 15) {
//11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue)
j=getcrewman(5); //blue
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 16) {
//Follow a position: given an x coordinate, seek it out.
if (entities[i].para > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[i].para < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[i].para > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[i].para < entities[i].xp - 45) { entities[i].ax = -3; }
}else if (entities[i].state == 17) {
//stand still
}else if (entities[i].state == 18) {
//Stand still and face the player
j = getplayer();
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
}else if (entities[i].state == 19) {
//Walk right off the screen after time t
if (entities[i].para <= 0) {
entities[i].dir = 1;
entities[i].ax = 3;
}else {
entities[i].para--;
}
}else if (entities[i].state == 20) {
//Panic! For briefing script
if (entities[i].life == 0) {
//walk left for a bit
entities[i].ax = 0;
if (40 > entities[i].xp + 5) { entities[i].dir = 1;
}else if (40 < entities[i].xp - 5) { entities[i].dir = 0; }
if (40 > entities[i].xp + 45) { entities[i].ax = 3;
}else if (40 < entities[i].xp - 45) { entities[i].ax = -3; }
if (entities[i].ax == 0) { entities[i].life = 1; entities[i].para = 30;}
}else if (entities[i].life == 1) {
//Stand around for a bit
entities[i].para--;
if (entities[i].para <= 0) {
entities[i].life++;
}
}else if (entities[i].life == 2) {
//walk right for a bit
entities[i].ax = 0;
if (280 > entities[i].xp + 5) { entities[i].dir = 1;
}else if (280 < entities[i].xp - 5) { entities[i].dir = 0; }
if (280 > entities[i].xp + 45) { entities[i].ax = 3;
}else if (280 < entities[i].xp - 45) { entities[i].ax = -3; }
if (entities[i].ax == 0) { entities[i].life = 3; entities[i].para = 30;}
}else if (entities[i].life == 3) {
//Stand around for a bit
entities[i].para--;
if (entities[i].para <= 0) {
entities[i].life=0;
}
}
}
break;
case 13: //Terminals (very similar to savepoints)
//wait for collision
if (entities[i].state == 1) {
entities[i].colour = 5;
entities[i].onentity = 0;
music.playef(17,10);
entities[i].state = 0;
}
break;
case 14: //Super Crew member
//Actually needs less complex AI than the scripting crewmember
if (entities[i].state == 0) {
//follow player, but only if he's on the floor!
j = getplayer();
if(entities[j].onground>0){
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp>15 && entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3;
}else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; }
if (entities[i].ax < 0 && entities[i].xp < 60) {
entities[i].ax = 0;
}
}else {
if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; }
entities[i].ax = 0;
}
if (entities[i].xp > 240) {
entities[i].ax = 3; entities[i].dir = 1;
}
if (entities[i].xp >= 310) {
game.scmprogress++;
entities[i].active = false;
}
}
break;
case 15: //Trophy
//wait for collision
if (entities[i].state == 1) {
trophytext+=2; if (trophytext > 30) trophytext = 30;
trophytype = entities[i].para;
entities[i].state = 0;
}
break;
case 23:
//swn game!
switch(entities[i].behave) {
case 0:
if (entities[i].state == 0) { //Init
entities[i].vx = 7;
if (entities[i].xp > 320) entities[i].active = false;
}
break;
case 1:
if (entities[i].state == 0) { //Init
entities[i].vx = -7;
if (entities[i].xp <-20) entities[i].active = false;
}
break;
}
break;
case 51: //Vertical warp line
if (entities[i].state == 2){
var j:int = getplayer();
if(entities[j].xp<=307){
customwarpmodevon=false;
entities[i].state = 0;
}
}else if (entities[i].state == 1){
entities[i].state = 2;
entities[i].statedelay = 2;
entities[i].onentity = 1;
customwarpmodevon=true;
}
break;
case 52: //Vertical warp line
if (entities[i].state == 2){
j = getplayer();
if(entities[j].xp<=307){
customwarpmodevon=false;
entities[i].state = 0;
}
}else if (entities[i].state == 1){
entities[i].state = 2;
entities[i].statedelay = 2;
entities[i].onentity = 1;
customwarpmodevon=true;
}
break;
case 53: //Warp lines Horizonal
if (entities[i].state == 2){
customwarpmodehon=false;
entities[i].state = 0;
}else if (entities[i].state == 1){
entities[i].state = 2;
entities[i].statedelay = 2;
entities[i].onentity = 1;
customwarpmodehon=true;
}
break;
case 54: //Warp lines Horizonal
////if (entities[i].state != 0) {
//trace("entity 54 is still here! ", i, ": state = ", entities[i].state, String(int(Math.random()*100)), entities[i].active);
////}
if (entities[i].state == 2){
customwarpmodehon=false;
entities[i].state = 0;
}else if (entities[i].state == 1){
entities[i].state = 2;
entities[i].statedelay = 2;
entities[i].onentity = 1;
customwarpmodehon=true;
}
break;
case 55: //Collectable crewmate
//wait for collision
if (entities[i].state == 0){
//Basic rules, don't change expression
j = getplayer();
if (entities[j].xp > entities[i].xp + 5){
entities[i].dir = 1;
}else if (entities[j].xp < entities[i].xp - 5) {
entities[i].dir = 0;
}
}else if (entities[i].state == 1){
game.crewmates++;
if (game.intimetrial){
customcollect[entities[i].para] = 1;
music.playef(27,10);
}else{
game.state = 1010;
//music.haltdasmusik();
if(music.currentsong!=-1) music.silencedasmusik();
music.playef(27,10);
customcollect[entities[i].para] = 1;
}
entities[i].active = false;
}
break;
case 100: //The teleporter
if (entities[i].state == 1) {
//if inactive, activate!
if (entities[i].tile == 1) {
music.playef(18, 10);
entities[i].onentity = 0;
entities[i].tile = 2;
entities[i].colour = 101;
if(!game.intimetrial && !game.nodeathmode){
game.state = 2000; game.statedelay = 0;
}
game.activetele = true;
game.teleblock.x = entities[i].xp - 32; game.teleblock.y = entities[i].yp - 32;
game.teleblock.width = 160; game.teleblock.height = 160;
//Alright, let's set this as our savepoint too
//First, deactivate all other savepoints
for (j = 0; j < nentity; j++) {
if (entities[j].type == 8 && entities[j].active) {
entities[j].colour = 4; entities[j].onentity = 1;
}
}
game.savepoint = entities[i].para;
game.savex = entities[i].xp + 44;
game.savey = entities[i].yp + 44;
game.savegc = 0;
game.saverx = game.roomx; game.savery = game.roomy;
game.savedir = entities[getplayer()].dir;
entities[i].state = 0;
if(!game.mobilequicksave_thisroom){
game.autoquicksave = true;
game.mobilequicksave_thisroom = true;
}
}
entities[i].state = 0;
}else if (entities[i].state == 2) {
//Initilise the teleporter without changing the game state or playing sound
entities[i].onentity = 0;
entities[i].tile = 6;
entities[i].colour = 102;
game.activetele = true;
game.teleblock.x = entities[i].xp - 32; game.teleblock.y = entities[i].yp - 32;
game.teleblock.width = 160; game.teleblock.height = 160;
entities[i].state = 0;
}
break;
}
}else {
entities[i].statedelay--;
if (entities[i].statedelay < 0) entities[i].statedelay = 0;
}
}
return true;
}
public function animateentities(i:int, game:gameclass, help:helpclass):void {
if(entities[i].active){
if(entities[i].statedelay<=0){
switch(entities[i].type) {
case 0:
entities[i].framedelay--;
if(entities[i].dir==1){
entities[i].drawframe=entities[i].tile;
}else{
entities[i].drawframe=entities[i].tile+3;
}
if(entities[i].onground>0 || entities[i].onroof>0){
if(int(entities[i].vx)!=0){
//Walking
if(entities[i].framedelay<=0){
entities[i].framedelay=4;
entities[i].walkingframe++;
}
if (entities[i].walkingframe >=2) entities[i].walkingframe=0;
entities[i].drawframe += entities[i].walkingframe + 1;
}
if (entities[i].onroof > 0) entities[i].drawframe += 6;
}else {
entities[i].drawframe ++;
if (game.gravitycontrol == 1) {
entities[i].drawframe += 6;
}
}
if (game.deathseq > -1) {
entities[i].drawframe=13;
if (entities[i].dir == 1) entities[i].drawframe = 12;
if (game.gravitycontrol == 1) entities[i].drawframe += 2;
}
break;
case 1: case 23:
//Variable animation
switch(entities[i].animate) {
case 0:
//Simple oscilation
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 8;
if(entities[i].actionframe==0){
entities[i].walkingframe++;
if (entities[i].walkingframe == 4) {
entities[i].walkingframe = 2;
entities[i].actionframe = 1;
}
}else {
entities[i].walkingframe--;
if (entities[i].walkingframe == -1) {
entities[i].walkingframe = 1;
entities[i].actionframe = 0;
}
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
break;
case 1:
//Simple Loop
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 8;
entities[i].walkingframe++;
if (entities[i].walkingframe == 4) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
break;
case 2:
//Simpler Loop (just two frames)
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 2;
entities[i].walkingframe++;
if (entities[i].walkingframe == 2) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
break;
case 3:
//Simpler Loop (just two frames, but double sized)
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 2;
entities[i].walkingframe++;
if (entities[i].walkingframe == 2) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += (entities[i].walkingframe*2);
break;
case 4:
//Simpler Loop (just two frames, but double sized) (as above but slower)
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 6;
entities[i].walkingframe++;
if (entities[i].walkingframe == 2) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += (entities[i].walkingframe*2);
break;
case 5:
//Simpler Loop (just two frames) (slower)
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 6;
entities[i].walkingframe++;
if (entities[i].walkingframe == 2) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
break;
case 6:
//Normal Loop (four frames, double sized)
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 4;
entities[i].walkingframe++;
if (entities[i].walkingframe == 4) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += (entities[i].walkingframe*2);
break;
case 7:
//Simpler Loop (just two frames) (slower) (with directions!)
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 6;
entities[i].walkingframe++;
if (entities[i].walkingframe == 2) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
if (entities[i].vx > 0) entities[i].drawframe += 2;
break;
case 10:
//Threadmill left
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 3;//(6-entities[i].para);
entities[i].walkingframe--;
if (entities[i].walkingframe == -1) {
entities[i].walkingframe = 3;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
break;
case 11:
//Threadmill right
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 3;//(6-entities[i].para);
entities[i].walkingframe++;
if (entities[i].walkingframe == 4) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
break;
case 100:
//Simple case for no animation (platforms, etc)
entities[i].drawframe = entities[i].tile;
break;
default:
entities[i].drawframe = entities[i].tile;
break;
}
break;
case 11:
entities[i].drawframe = entities[i].tile;
if(entities[i].animate==2) {
//Simpler Loop (just two frames)
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 10;
entities[i].walkingframe++;
if (entities[i].walkingframe == 2) {
entities[i].walkingframe = 0;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
}
break;
case 12: case 55: case 14: //Crew member! Very similar to hero
entities[i].framedelay--;
if(entities[i].dir==1){
entities[i].drawframe=entities[i].tile;
}else{
entities[i].drawframe=entities[i].tile+3;
}
if(entities[i].onground>0 || entities[i].onroof>0){
if(entities[i].vx!=0){
//Walking
if(entities[i].framedelay<=0){
entities[i].framedelay=4;
entities[i].walkingframe++;
}
if (entities[i].walkingframe >=2) entities[i].walkingframe=0;
entities[i].drawframe += entities[i].walkingframe + 1;
}
//if (entities[i].onroof > 0) entities[i].drawframe += 6;
}else {
entities[i].drawframe ++;
//if (game.gravitycontrol == 1) {
// entities[i].drawframe += 6;
//}
}
if (game.deathseq > -1) {
entities[i].drawframe=13;
if (entities[i].dir == 1) entities[i].drawframe = 12;
if (entities[i].rule == 7) entities[i].drawframe += 2;
//if (game.gravitycontrol == 1) entities[i].drawframe += 2;
}
break;
case 100: //the teleporter!
if (entities[i].tile == 1) {
//it's inactive
entities[i].drawframe = entities[i].tile;
}else if (entities[i].tile == 2){
entities[i].drawframe = entities[i].tile;
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 1;
entities[i].walkingframe = int(Math.random() * 6);
if (entities[i].walkingframe >= 4) {
entities[i].walkingframe = -1;
entities[i].framedelay = 4;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
}else if (entities[i].tile == 6) {
//faster!
entities[i].drawframe = entities[i].tile;
entities[i].framedelay--;
if(entities[i].framedelay<=0){
entities[i].framedelay = 2;
entities[i].walkingframe = int(Math.random() * 6);
if (entities[i].walkingframe >= 4) {
entities[i].walkingframe = -5;
entities[i].framedelay = 4;
}
}
entities[i].drawframe = entities[i].tile;
entities[i].drawframe += entities[i].walkingframe;
}
break;
default:
entities[i].drawframe = entities[i].tile;
break;
}
}else {
//entities[i].statedelay--;
if (entities[i].statedelay < 0) entities[i].statedelay = 0;
}
}
}
public function gettype(t:int):Boolean {
//Returns true is there is an entity of type t onscreen
for (var i:int = 0; i < nentity; i++) {
if(entities[i].type==t){
return true;
}
}
return false;
}
public function getcompanion(t:int):int {
//Returns the index of the companion with rule t
for (var i:int = 0; i < nentity; i++) {
if(entities[i].rule==6 || entities[i].rule==7){
return i;
}
}
return -1;
}
public function getplayer():int {
//Returns the index of the first player entity
for (var i:int = 0; i < nentity; i++) {
if (entities[i].type == 0) {
return i;
}
}
return -1;
}
public function getscm():int {
//Returns the supercrewmate
for (var i:int = 0; i < nentity; i++) {
if(entities[i].type==14){
return i;
}
}
return 0;
}
public function getlineat(t:int):int {
//Get the entity which is a horizontal line at height t (for SWN game)
for (var i:int = 0; i < nentity; i++) {
if (entities[i].size == 5) {
if (entities[i].yp == t) {
return i;
}
}
}
return 0;
}
public function getcrewman(t:int):int {
//Returns the index of the crewman with colour index given by t
if (t == 0) t = 0;
if (t == 1) t = 20;
if (t == 2) t = 14;
if (t == 3) t = 15;
if (t == 4) t = 13;
if (t == 5) t = 16;
for (var i:int = 0; i < nentity; i++) {
if (entities[i].rule == 6 || entities[i].rule == 7) {
if(entities[i].colour==t){
return i;
}
}
}
return 0;
}
public function getcustomcrewman(t:int):int {
//Returns the index of the crewman with colour index given by t
if (t == 0) t = 0;
if (t == 1) t = 20;
if (t == 2) t = 14;
if (t == 3) t = 15;
if (t == 4) t = 13;
if (t == 5) t = 16;
for (var i:int = 0; i < nentity; i++){
if (entities[i].type == 55){
if(entities[i].colour==t){
return i;
}
}
}
return 0;
}
public function getteleporter():int {
for (var i:int = 0; i < nentity; i++) {
if(entities[i].type==100 && entities[i].active){
return i;
}
}
return -1;
}
public function rectset(xi:int, yi:int, wi:int, hi:int):void {
temprect.x = xi; temprect.y = yi; temprect.width = wi; temprect.height = hi;
}
public function rect2set(xi:int, yi:int, wi:int, hi:int):void {
temprect2.x = xi; temprect2.y = yi; temprect2.width = wi; temprect2.height = hi;
}
public function entitycollide(a:int, b:int):Boolean {
//Do entities a and b collide?
tempx = entities[a].xp + entities[a].cx; tempy = entities[a].yp + entities[a].cy;
tempw = entities[a].w; temph = entities[a].h;
rectset(tempx, tempy, tempw, temph);
tempx = entities[b].xp + entities[b].cx; tempy = entities[b].yp + entities[b].cy;
tempw = entities[b].w; temph = entities[b].h;
rect2set(tempx, tempy, tempw, temph);
if (temprect.intersects(temprect2)) return true;
return false;
}
public function checkdirectional(t:int):Boolean{
//Returns true if player entity (rule 0) moving in dir t through directional block
if(opt_usedirectional){
i = getplayer();
if (i > -1) {
if(entities[i].rule==0){
tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
tempw = entities[i].w; temph = entities[i].h;
rectset(tempx, tempy, tempw, temph);
for (j = 0; j < nblocks; j++) {
if (blocks[j].type == DIRECTIONAL && blocks[j].active){
if(blocks[j].rect.intersects(temprect)) {
return true;
}
}
}
}
}
}
return false;
}
public function checkdamage():Boolean{
//Returns true if player entity (rule 0) collides with a damagepoint
if(opt_usedamage){
i = getplayer();
if (i > -1) {
if(entities[i].rule==0){
tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
tempw = entities[i].w; temph = entities[i].h;
rectset(tempx, tempy, tempw, temph);
for (j=0; j<nblocks; j++){
if (blocks[j].type == DAMAGE && blocks[j].active){
if(blocks[j].rect.intersects(temprect)) {
return true;
}
}
}
}
}
}
return false;
}
public function scmcheckdamage():Boolean{
//Returns true if supercrewmate collides with a damagepoint
for(i = 0; i < nentity; i++) {
if(entities[i].type==14){
tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
tempw = entities[i].w; temph = entities[i].h;
rectset(tempx, tempy, tempw, temph);
for (j=0; j<nblocks; j++){
if (blocks[j].type == DAMAGE && blocks[j].active){
if(blocks[j].rect.intersects(temprect)) {
return true;
}
}
}
}
}
return false;
}
public function settemprect(t:int):void {
//setup entity t in temprect
tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
}
public function checktrigger():int{
//Returns an int player entity (rule 0) collides with a trigger
if (opt_usetrigger) {
i = getplayer();
if (i > -1) {
if(entities[i].rule==0){
tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
tempw = entities[i].w; temph = entities[i].h;
rectset(tempx, tempy, tempw, temph);
for (j=0; j<nblocks; j++){
if (blocks[j].type == TRIGGER && blocks[j].active){
if (blocks[j].rect.intersects(temprect)) {
activetrigger = blocks[j].trigger;
return blocks[j].trigger;
}
}
}
}
}
}
return -1;
}
public function checkactivity():int{
//Returns an int player entity (rule 0) collides with an activity
if(opt_useactivity){
i = getplayer();
if(i>-1){
if(entities[i].rule==0){
tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy;
tempw = entities[i].w; temph = entities[i].h;
rectset(tempx, tempy, tempw, temph);
for (j=0; j<nblocks; j++){
if (blocks[j].type == ACTIVITY && blocks[j].active){
if (blocks[j].rect.intersects(temprect)) {
return j;
}
}
}
}
}
}
return -1;
}
public function getgridpoint(t:int):int {
t = (t - (t % 8)) / 8;
return t;
}
public function cblocks(t:int):Boolean {
tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
return checkblocks();
}
public function checkplatform():Boolean {
//Return true if rectset intersects a moving platform, setups px & py to the platform x & y
for (i = 0; i < nblocks; i++) {
if (blocks[i].active) {
if (blocks[i].type == BLOCK){
if (blocks[i].rect.intersects(temprect)) {
px = blocks[i].xp; py = blocks[i].yp;
return true;
}
}
}
}
return false;
}
public function checkblocks():Boolean {
for (i = 0; i < nblocks; i++) {
if (blocks[i].active) {
if (!skipdirblocks) {
if (blocks[i].type == DIRECTIONAL) {
if (dy > 0 && blocks[i].trigger == 0) if (blocks[i].rect.intersects(temprect)) return true;
if (dy <= 0 && blocks[i].trigger == 1) if (blocks[i].rect.intersects(temprect)) return true;
if (dx > 0 && blocks[i].trigger == 2) if (blocks[i].rect.intersects(temprect)) return true;
if (dx <= 0 && blocks[i].trigger == 3) if (blocks[i].rect.intersects(temprect)) return true;
}
}
if (blocks[i].type == BLOCK){
if (blocks[i].rect.intersects(temprect)) {
return true;
}
}
if (blocks[i].type == SAFE) {
if(dr==1){
if (blocks[i].rect.intersects(temprect)) {
return true;
}
}
}
}
}
return false;
}
public function checktowerspikes(t:int, map:mapclass):Boolean {
tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y);
tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1);
if (map.spikecollide(tempx, tempy)) return true;
if (map.spikecollide(tempw, tempy)) return true;
if (map.spikecollide(tempx, temph)) return true;
if (map.spikecollide(tempw, temph)) return true;
if (temprect.height >= 12) {
tpy1 = getgridpoint(temprect.y + 6);
if (map.spikecollide(tempx, tpy1)) return true;
if (map.spikecollide(tempw, tpy1)) return true;
if (temprect.height >= 18) {
tpy1 = getgridpoint(temprect.y + 12);
if (map.spikecollide(tempx, tpy1)) return true;
if (map.spikecollide(tempw, tpy1)) return true;
if (temprect.height >= 24) {
tpy1 = getgridpoint(temprect.y + 18);
if (map.spikecollide(tempx, tpy1)) return true;
if (map.spikecollide(tempw, tpy1)) return true;
}
}
}
if (temprect.width >= 12) {
tpx1 = getgridpoint(temprect.x + 6);
if (map.collide(tpx1, tempy)) return true;
if (map.collide(tpx1, temph)) return true;
}
return false;
}
public function checkwall(map:mapclass):Boolean{
//Returns true if entity setup in temprect collides with a wall
//used for proper collision functions; you can't just, like, call it
//whenever you feel like it and expect a response
//
//that won't work at all
if(skipblocks){
if (checkblocks()) return true;
}
tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y);
tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1);
if (map.collide(tempx, tempy)) return true;
if (map.collide(tempw, tempy)) return true;
if (map.collide(tempx, temph)) return true;
if (map.collide(tempw, temph)) return true;
if (temprect.height >= 12) {
tpy1 = getgridpoint(temprect.y + 6);
if (map.collide(tempx, tpy1)) return true;
if (map.collide(tempw, tpy1)) return true;
if (temprect.height >= 18) {
tpy1 = getgridpoint(temprect.y + 12);
if (map.collide(tempx, tpy1)) return true;
if (map.collide(tempw, tpy1)) return true;
if (temprect.height >= 24) {
tpy1 = getgridpoint(temprect.y + 18);
if (map.collide(tempx, tpy1)) return true;
if (map.collide(tempw, tpy1)) return true;
}
}
}
if (temprect.width >= 12) {
tpx1 = getgridpoint(temprect.x + 6);
if (map.collide(tpx1, tempy)) return true;
if (map.collide(tpx1, temph)) return true;
}
return false;
}
public function hplatformat():Number {
//Returns first entity of horizontal platform at (px, py), -1000 otherwise.
for (i = 0; i < nentity; i++) {
if (entities[i].active) {
if (entities[i].rule == 2) {
if (entities[i].behave >= 2) {
if (entities[i].xp == px && entities[i].yp == py) {
if (entities[i].behave == 8) { //threadmill!
return entities[i].para;
}else if(entities[i].behave == 9) { //threadmill!
return -entities[i].para;
}else{
return entities[i].vx;
}
}
}
}
}
}
return -1000;
}
public function yline(a:int, b:int):int {
if (a < b) return -1;
return 1;
}
public function entityhlinecollide(t:int, l:int):Boolean {
//Returns true is entity t collided with the horizontal line l.
if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){
if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){
linetemp = 0;
linetemp += yline(entities[t].yp, entities[l].yp);
linetemp += yline(entities[t].yp + entities[t].h, entities[l].yp);
linetemp += yline(entities[t].oldyp, entities[l].yp);
linetemp += yline(entities[t].oldyp + entities[t].h, entities[l].yp);
if (linetemp > -4 && linetemp < 4) return true;
return false;
}
}
return false;
}
public function entityvlinecollide(t:int, l:int):Boolean {
//Returns true is entity t collided with the vertical line l.
if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){
if(entities[t].yp + entities[t].cy<=entities[l].yp+entities[l].h){
linetemp = 0;
linetemp += yline(entities[t].xp + entities[t].cx+1, entities[l].xp);
linetemp += yline(entities[t].xp + entities[t].cx+1 + entities[t].w, entities[l].xp);
linetemp += yline(entities[t].oldxp + entities[t].cx+1, entities[l].xp);
linetemp += yline(entities[t].oldxp + entities[t].cx+1 + entities[t].w, entities[l].xp);
if (linetemp > -4 && linetemp < 4) return true;
return false;
}
}
return false;
}
public function entitywarphlinecollide(t:int, l:int):Boolean {
//Returns true is entity t collided with the horizontal line l.
if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){
if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){
linetemp = 0;
if (entities[l].yp < 120) {
//Top line
if (entities[t].vy < 0) {
if (entities[t].yp < entities[l].yp + 10) linetemp++;
if (entities[t].yp + entities[t].h < entities[l].yp + 10) linetemp++;
if (entities[t].oldyp < entities[l].yp + 10) linetemp++;
if (entities[t].oldyp + entities[t].h < entities[l].yp + 10) linetemp++;
}
if (linetemp > 0) return true;
return false;
}else {
//Bottom line
if (entities[t].vy > 0) {
if (entities[t].yp > entities[l].yp - 10) linetemp++;
if (entities[t].yp + entities[t].h > entities[l].yp - 10) linetemp++;
if (entities[t].oldyp > entities[l].yp - 10) linetemp++;
if (entities[t].oldyp + entities[t].h > entities[l].yp - 10) linetemp++;
}
if (linetemp > 0) return true;
return false;
}
}
}
return false;
}
public function entitywarpvlinecollide(t:int, l:int):Boolean {
//Returns true is entity t collided with the vertical warp line l.
if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){
if (entities[t].yp + entities[t].cy <= entities[l].yp + entities[l].h) {
linetemp = 0;
if (entities[l].xp < 160) {
//Left hand line
if (entities[t].xp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++;
if (entities[t].xp + entities[t].cx+1 + entities[t].w < entities[l].xp + 10) linetemp++;
if (entities[t].oldxp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++;
if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w < entities[l].xp + 10) linetemp++;
if (linetemp > 0) return true;
return false;
}else {
//Right hand line
if (entities[t].xp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++;
if (entities[t].xp + entities[t].cx+1 + entities[t].w > entities[l].xp - 10) linetemp++;
if (entities[t].oldxp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++;
if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w > entities[l].xp - 10) linetemp++;
if (linetemp > 0) return true;
return false;
}
}
}
return false;
}
public function entitycollideplatformroof(map:mapclass, t:int):Number{
tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy -1;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
if (checkplatform()) {
//px and py now contain an x y coordinate for a platform, find it
return hplatformat();
}
return -1000;
}
public function entitycollideplatformfloor(map:mapclass, t:int):Number{
tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
if (checkplatform()) {
//px and py now contain an x y coordinate for a platform, find it
return hplatformat();
}
return -1000;
}
public function entitycollidefloor(map:mapclass, t:int):Boolean{
//see? like here, for example!
tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
if (checkwall(map)) return true;
return false;
}
public function entitycollideroof(map:mapclass, t:int):Boolean{
//and here!
tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy - 1;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
if (checkwall(map)) return true;
return false;
}
public function testwallsx(t:int, map:mapclass, tx:int, ty:int):Boolean{
tempx = tx + entities[t].cx; tempy = ty + entities[t].cy;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
if (entities[t].rule < 2) { skipblocks = true; } else { skipblocks = false; }
if (entities[t].type == 14) skipblocks = true;
dx = 0; dy = 0; if (entities[t].rule == 0) dx = entities[t].vx;
dr = entities[t].rule;
//Ok, now we check walls
if (checkwall(map)) {
if (entities[t].vx > 1) {
entities[t].vx--;
entities[t].newxp = int(entities[t].xp + entities[t].vx);
return testwallsx(t, map, entities[t].newxp, entities[t].yp);
}else if (entities[t].vx < -1) {
entities[t].vx++;
entities[t].newxp = int(entities[t].xp + entities[t].vx);
return testwallsx(t, map, entities[t].newxp, entities[t].yp);
}else {
entities[t].vx=0;
return false;
}
}
return true;
}
public function testwallsy(t:int, map:mapclass, tx:int, ty:int):Boolean {
tempx = tx + entities[t].cx; tempy = ty + entities[t].cy;
tempw = entities[t].w; temph = entities[t].h;
rectset(tempx, tempy, tempw, temph);
if (entities[t].rule < 2) { skipblocks = true; } else { skipblocks = false; }
if (entities[t].type == 14) skipblocks = true;
dx = 0; dy = 0; if (entities[t].rule == 0) dy = entities[t].vy;
dr = entities[t].rule;
//Ok, now we check walls
if (checkwall(map)) {
if (entities[t].vy > 1) {
entities[t].vy--;
entities[t].newyp = int(entities[t].yp + entities[t].vy);
return testwallsy(t, map, entities[t].xp, entities[t].newyp);
}else if (entities[t].vy < -1) {
entities[t].vy++;
entities[t].newyp = int(entities[t].yp + entities[t].vy);
return testwallsy(t, map, entities[t].xp, entities[t].newyp);
}else {
entities[t].vy=0;
return false;
}
}
return true;
}
public function fixfriction(t:int, xfix:Number, xrate:Number, yrate:Number):void{
if (entities[t].vx > xfix) entities[t].vx -= xrate;
if (entities[t].vx < xfix) entities[t].vx += xrate;
if (entities[t].vy > 0) entities[t].vy -= yrate;
if (entities[t].vy < 0) entities[t].vy += yrate;
if (entities[t].vy > 10) entities[t].vy = 10;
if (entities[t].vy < -10) entities[t].vy = -10;
if (entities[t].vx > 6) entities[t].vx = 6;
if (entities[t].vx < -6) entities[t].vx = -6;
if (Math.abs(entities[t].vx-xfix) <= xrate) entities[t].vx = xfix;
if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0;
}
public function applyfriction(t:int, xrate:Number, yrate:Number):void{
if (entities[t].vx > 0) entities[t].vx -= xrate;
if (entities[t].vx < 0) entities[t].vx += xrate;
if (entities[t].vy > 0) entities[t].vy -= yrate;
if (entities[t].vy < 0) entities[t].vy += yrate;
if (entities[t].vy > 10) entities[t].vy = 10;
if (entities[t].vy < -10) entities[t].vy = -10;
if (entities[t].vx > 6) entities[t].vx = 6;
if (entities[t].vx < -6) entities[t].vx = -6;
if (Math.abs(entities[t].vx) <= xrate) entities[t].vx = 0;
if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0;
}
public function cleanup():void {
i = nentity - 1; while (i >= 0 && !entities[i].active) { nentity--; i--; }
i = nblocks - 1; while (i >= 0 && !blocks[i].active) { nblocks--; i--; }
}
public function updateentitylogic(t:int, game:gameclass):void {
entities[t].oldxp = entities[t].xp; entities[t].oldyp = entities[t].yp;
entities[t].vx = entities[t].vx + entities[t].ax;
entities[t].vy = entities[t].vy + entities[t].ay;
entities[t].ax = 0;
if (entities[t].gravity) {
if (entities[t].rule == 0) {
if(game.gravitycontrol==0){
entities[t].ay = 3;
}else {
entities[t].ay = -3;
}
}else if (entities[t].rule == 7) {
entities[t].ay = -3;
}else {
entities[t].ay = 3;
}
applyfriction(t, game.inertia, 0.25);
}
entities[t].newxp = entities[t].xp + entities[t].vx;
entities[t].newyp = entities[t].yp + entities[t].vy;
}
public function entitymapcollision(t:int, map:mapclass):void {
if (testwallsx(t, map, entities[t].newxp, entities[t].yp)) {
entities[t].xp = entities[t].newxp;
}else {
if (entities[t].onwall > 0) entities[t].state = entities[t].onwall;
if (entities[t].onxwall > 0) entities[t].state = entities[t].onxwall;
}
if (testwallsy(t, map, entities[t].xp, entities[t].newyp)) {
entities[t].yp = entities[t].newyp;
}else {
if (entities[t].onwall > 0) entities[t].state = entities[t].onwall;
if (entities[t].onywall > 0) entities[t].state = entities[t].onywall;
entities[t].jumpframe = 0;
}
}
public function movingplatformfix(t:int, map:mapclass):void{
//If this intersects the player, then we move the player along it
j = getplayer();
if (entitycollide(t, j)) {
//ok, bollox, let's make sure
entities[j].yp = entities[j].yp + entities[j].vy;
if (entitycollide(t, j)) {
entities[j].yp = entities[j].yp - entities[j].vy;
entities[j].vy = entities[t].vy;
entities[j].newyp = entities[j].yp + entities[j].vy;
if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) {
if (entities[t].vy > 0) {
entities[j].yp = entities[t].yp + entities[t].h;
entities[j].vy = 0;
entities[j].onroof = 1;
}else {
entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy;
entities[j].vy = 0;
entities[j].onground = 1;
}
}else {
entities[t].state = entities[t].onwall;
}
}
}
}
public function scmmovingplatformfix(t:int, map:mapclass):void{
//If this intersects the SuperCrewMate, then we move them along it
j = getscm();
if (entitycollide(t, j)) {
//ok, bollox, let's make sure
entities[j].yp = entities[j].yp + entities[j].vy;
if (entitycollide(t, j)) {
entities[j].yp = entities[j].yp - entities[j].vy;
entities[j].vy = entities[t].vy;
entities[j].newyp = entities[j].yp + entities[j].vy;
if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) {
if (entities[t].vy > 0) {
entities[j].yp = entities[t].yp + entities[t].h;
entities[j].vy = 0;
//entities[j].onroof = true;
}else {
entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy;
entities[j].vy = 0;
//entities[j].onground = true;
}
}else {
entities[t].state = entities[t].onwall;
}
}
}
}
public function hormovingplatformfix(t:int, map:mapclass):void{
//If this intersects the player, then we move the player along it
//for horizontal platforms, this is simplier
createblock(0, entities[t].xp, entities[t].yp, entities[t].w, entities[t].h);
/*j = getplayer();
if (entitycollide(t, j)) {
//ok, bollox, let's make sure
entities[j].yp = entities[j].yp + entities[j].vy;
if (entitycollide(t, j)) {
//entities[t].state = entities[t].onwall;
}
}*/
}
public function customwarplinecheck(i:int):void {
//Turns on obj.customwarpmodevon and obj.customwarpmodehon if player collides
//with warp lines
if (entities[i].active) {
//We test entity to entity
for (j = 0; j < nentity; j++) {
if (entities[j].active && i != j) {//Active
if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line!
if (entities[j].type == 51 || entities[j].type == 52) {
if (entitywarpvlinecollide(i, j)) {
customwarpmodevon = true;
}
}
}
if (entities[i].rule == 0 && entities[j].rule == 7){ //Player vs horizontal WARP line
if (entities[j].type == 53 || entities[j].type == 54) {
if (entitywarphlinecollide(i, j)) {
customwarpmodehon = true;
}
}
}
}
}
}
}
public function entitycollisioncheck(dwgfx:dwgraphicsclass, game:gameclass, map:mapclass, music:musicclass):void {
i = getplayer();
if (entities[i].active) {
//We test entity to entity
for (j = 0; j < nentity; j++) {
if (entities[j].active && i != j) {//Active
if (entities[i].rule == 0 && entities[j].rule == 1 && entities[j].harmful) {
//player i hits enemy or enemy bullet j
if (entitycollide(i, j) && !map.invincibility) {
if (entities[i].size == 0 && (entities[j].size == 0 || entities[j].size == 12)) {
//They're both sprites, so do a per pixel collision
colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp;
colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp;
if (dwgfx.flipmode) {
if (dwgfx.flipsprites_bitmap[entities[i].drawframe].hitTest(
colpoint1, 1, dwgfx.flipsprites_bitmap[entities[j].drawframe], colpoint2, 1)) {
2020-01-01 21:29:24 +01:00
//Do the collision stuff
game.deathseq = 30;
}
}else {
if (dwgfx.sprites_bitmap[entities[i].drawframe].hitTest(
colpoint1, 1, dwgfx.sprites_bitmap[entities[j].drawframe], colpoint2, 1)) {
2020-01-01 21:29:24 +01:00
//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) {
2020-01-01 21:29:24 +01:00
temp = entities[i].xp - entities[j].xp;
if (temp < 30 || temp > -30) {
2020-01-01 21:29:24 +01:00
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_bitmap[entities[i].drawframe].hitTest(
colpoint1, 1, dwgfx.flipsprites_bitmap[entities[j].drawframe], colpoint2, 1)) {
2020-01-01 21:29:24 +01:00
//Do the collision stuff
game.deathseq = 30; game.scmhurt = true;
}
}else {
if (dwgfx.sprites_bitmap[entities[i].drawframe].hitTest(
colpoint1, 1, dwgfx.sprites_bitmap[entities[j].drawframe], colpoint2, 1)) {
2020-01-01 21:29:24 +01:00
//Do the collision stuff
game.deathseq = 30; game.scmhurt = true;
}
}
}else {
//Ok, then we just assume a normal bounding box collision
game.deathseq = 30; game.scmhurt = true;
}
}
}
if (entities[j].rule == 2) { //Moving platforms
if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp);
}
if (entities[j].type == 8 && entities[j].rule == 3) { //Entity to entity (well, checkpoints anyway!)
if(entities[j].onentity>0){
if (entitycollide(i, j)) entities[j].state = entities[j].onentity;
}
}
}
}
}
}
}
}
//can't have the player being stuck...
j = getplayer();
skipdirblocks = true;
if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) {
//Let's try to get out...
if (entities[j].rule == 0) {
if(game.gravitycontrol==0){
entities[j].yp -= 3;
}else {
entities[j].yp += 3;
}
}
}
skipdirblocks = false;
//Can't have the supercrewmate getting stuck either!
if (game.supercrewmate) {
j = getscm();
skipdirblocks = true;
if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) {
//Let's try to get out...
if(game.gravitycontrol==0){
entities[j].yp -= 3;
}else {
entities[j].yp += 3;
}
}
skipdirblocks = false;
}
//Is the player colliding with any damageblocks?
if (checkdamage() && !map.invincibility) {
//usual player dead stuff
game.deathseq = 30;
}
//how about the supercrewmate?
if (game.supercrewmate) {
if (scmcheckdamage() && !map.invincibility) {
//usual player dead stuff
game.scmhurt = true;
game.deathseq = 30;
}
}
activetrigger = -1;
if (checktrigger() > -1) {
game.state = activetrigger;
game.statedelay = 0;
}
}
public var nentity:int;
public var entities:Vector.<entclass> = new Vector.<entclass>;
public var linecrosskludge:Vector.<entclass> = new Vector.<entclass>;
public var nlinecrosskludge:int;
public var colpoint1:Point, colpoint2:Point;
public var tempx:int, tempy:int, tempw:int, temph:int, temp:int, temp2:int;
public var tpx1:int, tpy1:int, tpx2:int, tpy2:int;
public var temprect:Rectangle, temprect2:Rectangle;
public var i:int, j:int, k:int;// z:int;
public var dx:int, dy:int, dr:int;
public var px:int, py:int, linetemp:int;
public var activetrigger:int;
public var blocks:Vector.<blockclass> = new Vector.<blockclass>;
public var flags:Array = new Array;
public var collect:Array = new Array;
public var customcollect:Array = new Array;
public var nblocks:int;
public var skipblocks:Boolean, skipdirblocks:Boolean;
public var platformtile:int;
public var vertplatforms:Boolean, horplatforms:Boolean;
// :(
public var nearelephant:Boolean;
public var upsetmode:Boolean, upset:int;
//Trophy Text
public var trophytext:int, trophytype:int;
//Secret lab scripts
public var altstates:int;
//Custom stuff
public var customenemy:int;
public var customplatformtile:int;
public var customwarpmode:Boolean, customwarpmodevon:Boolean, customwarpmodehon:Boolean;
public var customscript:String;
public var customcrewmoods:Array = new Array();
public var mobilemenus:Boolean = true;
}
}