1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-03 03:23:33 +02:00
VVVVVV/mobile_version/src/mapclass.as
Terry Cavanagh 72d018ea04 Update mobile version to mobile v2.2.1
The android version just got a much needed update to fix some resolution issues on devices with cutouts.

It turns out the mobile source was actually pretty out of date, like 3 versions out of date! This commit brings it up to date.

All the changes have just been about keeping the game running on modern devices, though. The biggest change was adding the Starling library to the project, which made the game GPU powered and sped the whole thing up.
2022-12-02 18:19:58 +01:00

1612 lines
59 KiB
ActionScript

package {
import flash.geom.*;
import flash.events.*;
import flash.net.*;
public class mapclass {
public function mapclass():void {
//Start here!
r = 196; g = 196; b = 196;
colstate = 0; colstatedelay = 0; colsuperstate = 0;
spikeleveltop = 0; spikelevelbottom = 0;
warpx = false; warpy = false;
extrarow = 0;
showteleporters = false; showtargets = false; showtrinkets = false;
finalmode = false; finalstretch = false;
finalx = 50; finaly = 50;
cursorstate = 0; cursordelay = 0;
final_colormode = false; final_colorframe = 0; final_colorframedelay = 0;
final_mapcol = 0;
final_aniframe = 0; final_aniframedelay = 0;
rcol = 0;
//This needs to be in map instead!
invincibility = false;
//We init the lookup table:
for (i = 0; i < 30; i++) {
vmult.push(int(i * 40));
teleporters.push(new Point());
shinytrinkets.push(new Point());
}
//We create a blank map
for (j = 0; j < 30; j++) {
for (i = 0; i < 40; i++) {
contents.push(int(0));
optimiser.push(int(0));
}
}
for (j = 0; j < 20; j++) {
for (i = 0; i < 20; i++) {
areamap.push(0);
roomdeaths.push(0);
roomdeathsfinal.push(0);
explored.push(0);
}
}
tileset = 0;
initmapdata();
for (i = 0; i < 8; i++) {
specialnames.push(new String);
}
resetnames();
//roomtext
for (i = 0; i < 40; i++) {
roomtextx.push(int(0));
roomtexty.push(int(0));
roomtext.push(new String);
}
//here
roomtexton = false; roomtextnumlines = 0;
//Areamap starts at 100,100 and extends 20x20
realtmap = new Array();
realtmap.push("1,2,2,2,2,2,2,2,0,3,0,0,0,4,4,4,4,4,4,4");
realtmap.push("1,2,2,2,2,2,2,0,0,3,0,0,0,0,4,4,4,4,4,4");
realtmap.push("0,1,0,0,2,0,0,0,0,3,0,0,0,0,4,4,4,4,4,4");
realtmap.push("0,0,0,0,2,0,0,0,0,3,0,0,5,5,5,5,4,4,4,4");
realtmap.push("0,0,2,2,2,0,0,0,0,3,11,11,5,5,5,5,0,0,0,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,5,5,5,5,5,5,0,0,0,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,5,5,5,5,5,5,5,0,0,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,5,5,5,5,5,5,5,5,5,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,0,0,0,5,5,5,5,5,5,0");
realtmap.push("0,0,0,0,0,0,0,0,11,3,0,0,0,5,5,5,5,5,5,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,0,0,0,5,5,5,5,5,5,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,0,5,5,5,5,5,5,5,5,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,0,5,5,5,5,5,5,0,5,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,0,5,5,5,5,5,5,0,5,0");
realtmap.push("0,0,0,0,0,0,0,0,0,3,0,5,5,0,0,0,0,0,5,0");
realtmap.push("0,0,0,0,0,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0");
realtmap.push("0,0,2,2,2,2,2,2,0,3,0,0,0,0,0,0,0,0,0,0");
realtmap.push("0,2,2,2,2,2,2,2,0,3,0,0,0,0,0,0,0,0,0,0");
realtmap.push("2,2,2,2,2,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0");
realtmap.push("2,2,2,2,2,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0");
fillareamap(realtmap);
}
public function RGB(red:Number,green:Number,blue:Number):Number{
return (blue | (green << 8) | (red << 16))
}
public function intpol(a:int, b:int, c:Number):int {
return int(a + ((b - a) * c));
}
public function setteleporter(t:int, x:int, y:int):void {
teleporters[t].x = x; teleporters[t].y = y;
}
public function settrinket(t:int, x:int, y:int):void {
shinytrinkets[t].x = x; shinytrinkets[t].y = y;
}
public function resetmap():void {
//clear the explored area of the map
for (j = 0; j < 20; j++) {
for (i = 0; i < 20; i++){
explored[i + (j * 20)] = 0;
}
}
}
public function resetnames():void {
//Reset all the special names
specialnames[0] = "Rear Window";
specialnames[1] = "On the Waterfront";
specialnames[2] = "The Untouchables";
specialnames[3] = "Television Newsveel";
specialnames[4] = "Vwitched";
specialnames[5] = "Gvnsmoke";
specialnames[6] = "Please enjoy these repeats";
specialnames[7] = "Try Jiggling the Antenna";
glitchmode = 0; glitchdelay = 0;
}
public function transformname(t:int):void {
//transform special names into new ones, one step at a time
/*
if (specialnames[3] == "") { specialnames[3] = ;
}else if (specialnames[3] == "") { specialnames[3] = ;
}
*/
glitchdelay--;
if(glitchdelay<=0){
switch(t) {
case 3:
//Television Newsveel -> The 9 O'Clock News
if (specialnames[3] == "Television Newsveel") { specialnames[3] = "Television Newsvel";
}else if (specialnames[3] == "Television Newsvel") { specialnames[3] = "TelevisvonvNewsvel";
}else if (specialnames[3] == "TelevisvonvNewsvel") { specialnames[3] = "TvlvvvsvonvNevsvel";
}else if (specialnames[3] == "TvlvvvsvonvNevsvel") { specialnames[3] = "vvvvvvsvovvNe svel";
}else if (specialnames[3] == "vvvvvvsvovvNe svel") { specialnames[3] = "vhv vvv'vvovv vevl";
}else if (specialnames[3] == "vhv vvv'vvovv vevl") { specialnames[3] = "vhv V v'Cvovv vewv";
}else if (specialnames[3] == "vhv V v'Cvovv vewv") { specialnames[3] = "vhe 9 v'Cvovv vewv";
}else if (specialnames[3] == "vhe 9 v'Cvovv vewv") { specialnames[3] = "vhe 9 v'Cvovv Newv";
}else if (specialnames[3] == "vhe 9 v'Cvovv Newv") { specialnames[3] = "The 9 O'Cvovk Newv";
}else if (specialnames[3] == "The 9 O'Cvovk Newv") { specialnames[3] = "The 9 O'Clock News";
}
break;
case 4:
//Vwitched -> Dial M for Murder
if (specialnames[4] == "Vwitched") { specialnames[4] = "Vwitvhed";
}else if (specialnames[4] == "Vwitvhed") { specialnames[4] = "vVwivcvedv";
}else if (specialnames[4] == "vVwivcvedv") { specialnames[4] = "vvvwMvcvMdvv";
}else if (specialnames[4] == "vvvwMvcvMdvv") { specialnames[4] = "DvvvwMvfvvMdvvv";
}else if (specialnames[4] == "DvvvwMvfvvMdvvv") { specialnames[4] = "Dvav Mvfvr Mdvvvv";
}else if (specialnames[4] == "Dvav Mvfvr Mdvvvv") { specialnames[4] = "Diav M for Mdrver";
}else if (specialnames[4] == "Diav M for Mdrver") { specialnames[4] = "Dial M for Murder";
}
break;
case 5:
//Gvnsmoke -> Gunsmoke 1966
if (specialnames[5] == "Gvnsmoke") { specialnames[5] = "Gvnsmove";
}else if (specialnames[5] == "Gvnsmove") { specialnames[5] = "Gvnvmovevv";
}else if (specialnames[5] == "Gvnvmovevv") { specialnames[5] = "Gunvmove1vv6";
}else if (specialnames[5] == "Gunvmove1vv6") { specialnames[5] = "Vunsmoke 19v6";
}else if (specialnames[5] == "Vunsmoke 19v6") { specialnames[5] = "Gunsmoke 1966";
}
break;
case 6:
//Please enjoy these repeats -> In the Margins
if (specialnames[6] == "Please enjoy these repeats") { specialnames[6] = "Please envoy theve repeats";
}else if (specialnames[6] == "Please envoy theve repeats") { specialnames[6] = "Plse envoy tse rvpvas";
}else if (specialnames[6] == "Plase envoy these rvpeas") { specialnames[6] = "Plse envoy tse rvpvas";
}else if (specialnames[6] == "Plse envoy tse rvpvas") { specialnames[6] = "Vl envoy te rvevs";
}else if (specialnames[6] == "Vl envoy te rvevs") { specialnames[6] = "Vv evo tv vevs";
}else if (specialnames[6] == "Vv evo tv vevs") { specialnames[6] = "Iv vhv Mvrvivs";
}else if (specialnames[6] == "Iv vhv Mvrvivs") { specialnames[6] = "In the Margins";
}
break;
case 7:
//Try Jiggling the Antenna -> Heaven's Gate
if (specialnames[7] == "Try Jiggling the Antenna") { specialnames[7] = "Try Viggling the Antenna";
}else if (specialnames[7] == "Try Viggling the Antenna") { specialnames[7] = "TryJivglvng theAvtevna";
}else if (specialnames[7] == "TryJivglvng theAvtevna") { specialnames[7] = "Tvvivglvng thAvtvvv";
}else if (specialnames[7] == "Tvvivglvng thAvtvvv") { specialnames[7] = "Vvvgglvnv tvnvva";
}else if (specialnames[7] == "Vvvgglvnv tvnvva") { specialnames[7] = "Vvavvnvs vvtv";
}else if (specialnames[7] == "Vvavvnvs vvtv") { specialnames[7] = "Veavvn's Gvte";
}else if (specialnames[7] == "Veavvn's Gvte") { specialnames[7] = "Heaven's Gate";
}
break;
}
glitchdelay = 5;
}else {
glitchdelay--;
}
}
public function getglitchname(x:int, y:int):String {
//Returns the name in the final area.
if (roomname == "glitch") {
//8 Cases!
//First, the three "glitches"
glitchdelay--;
if (glitchdelay <= -5) {
glitchmode = (glitchmode + 1) % 2;
glitchdelay = 0;
if (glitchmode == 0) glitchdelay = 20 +int(Math.random() * 10);
}
if (x == 42 && y == 51) {
if (glitchmode == 0) {
return specialnames[0];
}else return "Rear Vindow";
}else if (x == 48 && y == 51) {
if (glitchmode == 0) {
return specialnames[1];
}else return "On the Vaterfront";
}else if (x == 49 && y == 51) {
if (glitchmode == 0) {
return specialnames[2];
}else return "The Untouchavles";
}
}else if (roomname == "change") {
if (finalstretch) {
if (x == 45 && y == 51) transformname(3);
if (x == 46 && y == 51) transformname(4);
if (x == 47 && y == 51) transformname(5);
if (x == 50 && y == 53) transformname(6);
if (x == 50 && y == 54) transformname(7);
}
if (x == 45 && y == 51) return specialnames[3];
if (x == 46 && y == 51) return specialnames[4];
if (x == 47 && y == 51) return specialnames[5];
if (x == 50 && y == 53) return specialnames[6];
if (x == 50 && y == 54) return specialnames[7];
return roomname;
}else{
return roomname;
}
return roomname;
}
public function initmapdata():void {
//Set up static map information like teleporters and shiny trinkets.
numteleporters = 17;
setteleporter(0, 0, 0);
setteleporter(1, 0, 16);
setteleporter(2, 2, 4);
setteleporter(3, 2, 11);
setteleporter(4, 7, 9);
setteleporter(5, 7, 15);
setteleporter(6, 8, 11);
setteleporter(7, 10, 5);
setteleporter(8, 11, 4);
setteleporter(9, 13, 2);
setteleporter(10, 13, 8);
setteleporter(11, 14, 19);
setteleporter(12, 15, 0);
setteleporter(13, 17, 12);
setteleporter(14, 17, 17);
setteleporter(15, 18, 1);
setteleporter(16, 18, 7);
numshinytrinkets = 18;
settrinket(0, 14, 4);
settrinket(1, 13, 6);
settrinket(2, 11, 12);
settrinket(3, 15, 12);
settrinket(4, 14, 11);
settrinket(5, 18, 14);
settrinket(6, 11, 7);
settrinket(7, 9, 2);
settrinket(8, 9, 16);
settrinket(9, 2, 18);
settrinket(10, 7, 18);
settrinket(11, 6, 1);
settrinket(12, 17, 3);
settrinket(13, 10, 19);
settrinket(14, 5, 15);
settrinket(15, 1, 10);
settrinket(16, 3, 2);
settrinket(17, 10, 8);
}
public function finalat(x:int, y:int):int {
//return the tile index of the final stretch tiles offset by the colour difference
if (contents[x + vmult[y]] == 740) {
//Special case: animated tiles
if (final_mapcol == 1) {
return contents[x + vmult[y]] - (final_mapcol * 3) + (int(Math.random()*12)*40);
}else{
return contents[x + vmult[y]] - (final_mapcol * 3) + (final_aniframe * 40);
}
}else if (contents[x + vmult[y]] >= 80) {
return contents[x + vmult[y]] - (final_mapcol * 3);
}else {
return contents[x + vmult[y]];
}
return 0;
}
public function maptiletoenemycol(t:int):int {
//returns the colour index for enemies that matches the map colour t
switch(t) {
case 0: return 11; break;
case 1: return 6; break;
case 2: return 8; break;
case 3: return 12; break;
case 4: return 9; break;
case 5: return 7; break;
case 6: return 18; break;
}
return 11;
}
public function changefinalcol(t:int, obj:entityclass, game:gameclass):void {
//change the map to colour t - for the game's final stretch.
//First up, the tiles. This is just a setting:
final_mapcol = t;
temp = 6 - t;
//Next, entities
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].type == 1) { //something with a movement behavior
if (obj.entities[i].animate == 10 || obj.entities[i].animate == 11) { //treadmill
if(temp<3){
obj.entities[i].tile = 907 + (temp * 80);
}else {
obj.entities[i].tile = 911 + ((temp-3) * 80);
}
if(obj.entities[i].animate == 10) obj.entities[i].tile += 40;
}else if (obj.entities[i].isplatform){
obj.entities[i].tile = 915+(temp*40);
}else { //just an enemy
obj.entities[i].colour = maptiletoenemycol(temp);
}
}else if (obj.entities[i].type == 2) { //disappearing platforms
obj.entities[i].tile = 915+(temp*40);
}
}
}
public function setcol(r1:int, g1:int, b1:int, r2:int, g2:int, b2:int, c:int):void {
r = intpol(r1, r2, c / 5);
g = intpol(g1, g2, c / 5);
b = intpol(b1, b2, c / 5);
}
public function updatetowerglow():void {
if (colstatedelay <= 0 || colsuperstate > 0) {
if (colsuperstate > 0) colstate--;
colstate++; if (colstate >= 30) colstate = 0;
check = colstate % 5; //current state of phase
cmode = (colstate - check) / 5; // current colour transition
switch(cmode) {
case 0: setcol(255, 93, 107, 255, 255, 93, check); break;
case 1: setcol(255, 255, 93, 159, 255, 93, check); break;
case 2: setcol(159, 255, 93, 93, 245, 255, check); break;
case 3: setcol(93, 245, 255, 177, 93, 255, check); break;
case 4: setcol(177, 93, 255, 255, 93, 255, check); break;
case 5: setcol(255, 93, 255, 255, 93, 107, check); break;
}
if (check == 0) {
colstatedelay = 45;
}else {
colstatedelay = 0;
}
if (colsuperstate > 0) colstatedelay = 0;
tdrawback = true;
towercol = RGB(r*0.04, g*0.04, b*0.04);
}else {
colstatedelay--;
}
}
public function nexttowercolour():void {
colstate+=5; if (colstate >= 30) colstate = 0;
check = colstate % 5; //current state of phase
cmode = (colstate - check) / 5; // current colour transition
switch(cmode) {
case 0: setcol(255, 93, 107, 255, 255, 93, check); break;
case 1: setcol(255, 255, 93, 159, 255, 93, check); break;
case 2: setcol(159, 255, 93, 93, 245, 255, check); break;
case 3: setcol(93, 245, 255, 177, 93, 255, check); break;
case 4: setcol(177, 93, 255, 255, 93, 255, check); break;
case 5: setcol(255, 93, 255, 255, 93, 107, check); break;
}
tdrawback = true;
towercol = RGB(r*0.04, g*0.04, b*0.04);
}
public function settowercolour(t:int):void {
colstate=t*5; if (colstate >= 30) colstate = 0;
check = colstate % 5; //current state of phase
cmode = (colstate - check) / 5; // current colour transition
switch(cmode) {
case 0: setcol(255, 93, 107, 255, 255, 93, check); break;
case 1: setcol(255, 255, 93, 159, 255, 93, check); break;
case 2: setcol(159, 255, 93, 93, 245, 255, check); break;
case 3: setcol(93, 245, 255, 177, 93, 255, check); break;
case 4: setcol(177, 93, 255, 255, 93, 255, check); break;
case 5: setcol(255, 93, 255, 255, 93, 107, check); break;
}
tdrawback = true;
towercol = RGB(r*0.04, g*0.04, b*0.04);
}
public function spikecollide(x:int, y:int):Boolean {
if (invincibility) return false;
if (tower.at(x,y,0)>= 6 && tower.at(x,y,0) <= 11) return true;
return false;
}
public function collide(x:int, y:int):Boolean {
if (towermode) {
if (tower.at(x, y, 0) >= 12 && tower.at(x, y, 0) <= 27) return true;
}else if (tileset == 2) {
if (y == -1) return collide(x, y + 1);
if (y == 29+extrarow) return collide(x, y - 1);
if (x == -1) return collide(x + 1, y);
if (x == 40) return collide(x - 1, y);
if (x < 0 || y < 0 || x >= 40 || y >= 29 + extrarow) return false;
if (contents[x + vmult[y]] >= 12 && contents[x + vmult[y]] <= 27) return true;
if (invincibility) {
if (contents[x + vmult[y]] >= 6 && contents[x + vmult[y]] <= 11) return true;
}
}else {
if (y == -1) return collide(x, y + 1);
if (y == 29+extrarow) return collide(x, y - 1);
if (x == -1) return collide(x + 1, y);
if (x == 40) return collide(x - 1, y);
if (x < 0 || y < 0 || x >= 40 || y >= 29+extrarow) return false;
if (contents[x + vmult[y]] == 1) return true;
if (tileset==0 && contents[x + vmult[y]] == 59) return true;
if (contents[x + vmult[y]]>= 80 && contents[x + vmult[y]] < 680) return true;
if (contents[x + vmult[y]] == 740 && tileset==1) return true;
if (invincibility) {
if (contents[x + vmult[y]]>= 6 && contents[x + vmult[y]] <= 9) return true;
if (contents[x + vmult[y]]>= 49 && contents[x + vmult[y]] <= 50) return true;
if (tileset == 1) {
if (contents[x + vmult[y]]>= 49 && contents[x + vmult[y]] < 80) return true;
}
}
}
return false;
}
public function fillareamap(realtmap:Array):void {
var maprow:Array;
for (j = 0; j < 20; j++) {
maprow = new Array();
maprow = realtmap[j].split(",");
for (i = 0; i < 20; i++) {
areamap[i + (j * 20)] = maprow[i];
}
}
}
public function settile(xp:int, yp:int, t:int):void {
if (xp >= 0 && xp < 40 && yp >= 0 && yp < 29+extrarow) {
contents[xp + vmult[yp]] = t;
}
}
/*
* crazy old function
public function fillcontent(tmap:Array):void {
var maprow:Array;
for (j = 0; j < 29+extrarow; j++) {
maprow = new Array();
maprow = tmap[j].split(",");
for (i = 0; i < 40; i++) {
contents[i + vmult[j]] = maprow[i];
}
}
}
*/
public var currentrow:String;
public var currentrowlength:int;
public var startindex:int, endindex:int;
public var currentchar:String;
public function fillcontent():void {
//tmap is a 30 element array containing 30 strings, 40 characters long
//need to tokenize each string to extract each
for (j = 0; j < 29 + extrarow; j++) {
currentrow = tmap.contents[j];
currentrowlength = currentrow.length;
startindex = 0; endindex = 0;
i = 0;
//First 39 characters here
while (endindex < currentrowlength) {
currentchar = currentrow.substr(endindex, 1);
if (currentchar == ",") {
contents[i + vmult[j]] = int(currentrow.substr(startindex, endindex - startindex));
endindex++; startindex = endindex;
i++;
}
endindex++;
}
//Final character here
contents[i + vmult[j]] = int(currentrow.substr(startindex, endindex - startindex));
}
}
public function rn(rx:int, ry:int):int {
return rx + (ry * 100);
}
public function area(rx:int, ry:int):int {
if (finalmode) {
return 6;
}else {
if (rx - 100 >= 0 && rx - 100 < 20 && ry - 100 >= 0 && ry - 100 < 20) {
return areamap[(rx - 100) + ((ry - 100) * 20)];
}else{
return 6;
}
}
}
public function exploretower():void {
for (i = 0; i < 20; i++) {
explored[9 + (i * 20)] = 1;
}
}
public function hideship():void {
//remove the ship from the explored areas
explored[2 + (10 * 20)] = 0;
explored[3 + (10 * 20)] = 0;
explored[4 + (10 * 20)] = 0;
explored[2 + (11 * 20)] = 0;
explored[3 + (11 * 20)] = 0;
explored[4 + (11 * 20)] = 0;
}
public function showship():void {
//remove the ship from the explored areas
explored[2 + (10 * 20)] = 1;
explored[3 + (10 * 20)] = 1;
explored[4 + (10 * 20)] = 1;
explored[2 + (11 * 20)] = 1;
explored[3 + (11 * 20)] = 1;
explored[4 + (11 * 20)] = 1;
}
public function resetplayer(dwgfx:dwgraphicsclass, game:gameclass, obj:entityclass, music:musicclass):void {
if (game.roomx != game.saverx || game.roomy != game.savery) {
gotoroom(game.saverx, game.savery, dwgfx, game, obj, music);
}
game.deathseq = -1;
i = obj.getplayer();
if(i>-1){
obj.entities[i].vx = 0; obj.entities[i].vy = 0;
obj.entities[i].ax = 0; obj.entities[i].ay = 0;
obj.entities[i].xp = game.savex; obj.entities[i].yp = game.savey; obj.entities[i].dir = game.savedir;
obj.entities[i].colour = 0; game.lifeseq = 10; obj.entities[i].invis = true;
}
game.scmhurt = false; //Just in case the supercrewmate is fucking this up!
if (game.supercrewmate) {
if (game.roomx == game.scmprogress + 41) {
game.scmprogress = game.roomx - 41;
}else{
game.scmprogress = game.roomx - 40;
}
if (game.scmprogress != 0) {
game.scmmoveme = true;
}else {
game.scmmoveme = false;
}
}
}
public function warpto(rx:int, ry:int, t:int, tx:int, ty:int, dwgfx:dwgraphicsclass, game:gameclass, obj:entityclass, music:musicclass):void {
gotoroom(rx, ry, dwgfx, game, obj, music);
game.teleport = false;
obj.entities[t].xp = tx * 8; obj.entities[t].yp = (ty * 8) - obj.entities[t].h; game.gravitycontrol = 0;
}
public function gotoroom(rx:int, ry:int, dwgfx:dwgraphicsclass, game:gameclass, obj:entityclass, music:musicclass):void {
//First, destroy the current room
obj.removeallblocks();
game.activetele = false; game.readytotele = 0;
game.mobilequicksave_thisroom = false;
dwgfx.forcescreenupdates();
obj.opt_useblock = false;
obj.opt_usetrigger = false;
obj.opt_usedamage = false;
obj.opt_usedirectional = false;
obj.opt_usesafe = false;
obj.opt_useactivity = false;
//Ok, let's save the position of all lines on the screen
obj.nlinecrosskludge = 0;
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].type == 9 && obj.entities[i].active) {
//It's a horizontal line
if (obj.entities[i].xp <= 0 || obj.entities[i].xp + obj.entities[i].w >= 312) {
//it's on a screen edge
obj.copylinecross(i);
}
}
}
for (i = 0; i < obj.nentity; i++) {
//Of course the player's always gonna be object zero, this is just in case
if (obj.entities[i].rule != 0) obj.entities[i].active = false;
}
obj.cleanup();
game.door_up = rx + ((ry - 1) * 100); game.door_down = rx + ((ry + 1) * 100);
game.door_right = rx + 1 + (ry * 100); game.door_left = rx -1 + (ry * 100);
if (rx < game.roomx) {
game.roomchangedir = 0;
}else {
game.roomchangedir = 1;
}
if (finalmode) {
//Ok, what way are we moving?
/*if (rx - finalx >= 1) finalx++;
if (rx - finalx <= -1) finalx--;
if (ry - finaly >= 1) finaly++;
if (ry - finaly <= -1) finaly--;*/
finalx = rx; finaly = ry;
game.roomx = finalx; game.roomy = finaly; game.roomchange = true;
rx = finalx; ry = finaly;
if (game.roomy < 10) {
game.roomy = 11; finaly = 11;
}
if(game.roomx>=41 && game.roomy>=48 && game.roomx<61 && game.roomy<68 ){
game.currentroomdeaths = roomdeathsfinal[game.roomx - 41 + (20 * (game.roomy - 48))];
}else {
game.currentroomdeaths = 0;
}
//Final level for time trial
if (game.intimetrial) {
if (game.roomx == 46 && game.roomy == 54) music.niceplay(15); //Final level remix
}
}else if (custommode){
game.roomx = rx;
game.roomy = ry;
game.roomchange = true;
if (game.roomx < 100) game.roomx = 100 + editor.mapwidth - 1;
if (game.roomy < 100) game.roomy = 100 + editor.mapheight - 1;
if (game.roomx > 100 + editor.mapwidth - 1) game.roomx = 100;
if (game.roomy > 100 + editor.mapheight - 1) game.roomy = 100;
}else {
game.roomx = rx; game.roomy = ry; game.roomchange = true;
if (game.roomx < 100) game.roomx = 119; if (game.roomy < 100) game.roomy = 119;
if (game.roomx > 119) game.roomx = 100; if (game.roomy > 119) game.roomy = 100;
game.currentroomdeaths = roomdeaths[game.roomx - 100 + (20 * (game.roomy - 100))];
//Alright, change music depending on where we are:
//Tower
if (game.roomx == 107 && game.roomy == 106) music.niceplay(4);
if (game.roomx == 107 && game.roomy == 107) music.niceplay(4);
if (game.roomx == 107 && game.roomy == 108) music.niceplay(4);
if (game.roomx == 107 && game.roomy == 109) music.niceplay(4);
if (game.roomx == 108 && game.roomy == 109) {
if (dwgfx.setflipmode) { music.niceplay(9);
}else{ music.niceplay(2); }
}
if (game.roomx == 109) {
if (dwgfx.setflipmode) { music.niceplay(9);
}else{ music.niceplay(2); }
}
//Warp Zone
if (game.roomx == 112 && game.roomy == 101) music.niceplay(4);
if (game.roomx == 113 && game.roomy == 101) music.niceplay(4);
if (game.roomx == 113 && game.roomy == 102) music.niceplay(4);
if (game.roomx == 114 && game.roomy == 101) music.niceplay(12);
if (game.roomx == 115 && game.roomy == 101) music.niceplay(12);
if (game.roomx == 115 && game.roomy == 102) music.niceplay(12);
//Lab
if (game.roomx == 101 && game.roomy == 115) music.niceplay(4);
if (game.roomx == 100 && game.roomy == 115) music.niceplay(4);
if (game.roomx == 101 && game.roomy == 116) music.niceplay(4);
if (game.roomx == 100 && game.roomy == 116) music.niceplay(4);
if (game.roomx == 102 && game.roomy == 116) music.niceplay(3);
if (game.roomx == 102 && game.roomy == 117) music.niceplay(3);
if (game.roomx == 101 && game.roomy == 117) music.niceplay(3);
//Space Station
if (game.intimetrial) {
if (game.roomx == 111 && game.roomy == 112) music.niceplay(1);
if (game.roomx == 111 && game.roomy == 113) music.niceplay(1);
if (game.roomx == 112 && game.roomy == 114) music.niceplay(1);
if (game.roomx == 112 && game.roomy == 115) music.niceplay(1);
}else{
if (game.roomx == 111 && game.roomy == 112) music.niceplay(1);
if (game.roomx == 111 && game.roomy == 113) music.niceplay(1);
if (game.roomx == 112 && game.roomy == 114) music.niceplay(4);
if (game.roomx == 112 && game.roomy == 115) music.niceplay(4);
}
//Leaving the Ship
if (game.roomx == 104 && game.roomy == 112) music.niceplay(4);
}
temp = rx + (ry * 100);
loadlevel(game.roomx, game.roomy, dwgfx, game, obj, music);
dwgfx.backgrounddrawn = false; //Used for background caching speedup
dwgfx.foregrounddrawn = false; //Used for background caching speedup
//a very special case: if entering the communication room, room 13,4 before tag 5 is set, set the game state to a background
//textbox thingy. if tag five is not set when changing room, reset the game state. (tag 5 is set when you get back to the ship)
if(!game.intimetrial){
if (obj.flags[5] == 0 && !finalmode) {
game.state = 0;
if (game.roomx == 113 && game.roomy == 104) {
game.state = 50;
}
}
}
//Ok, kludge to fix lines in crossing rooms - if we're intersecting a gravity line right now, let's
//set it to an inactive state.
//Alright! So, let's look at our lines from the previous rooms, and determine if any of them are actually
//continuations!
temp = obj.getplayer();
if(temp>-1){
obj.entities[temp].oldxp = obj.entities[temp].xp;
obj.entities[temp].oldyp = obj.entities[temp].yp;
}
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].type == 9 && obj.entities[i].active) {
//It's a horizontal line
if (obj.entities[i].xp <= 0 || obj.entities[i].xp + obj.entities[i].w >= 312) {
//it's on a screen edge
for (j = 0; j < obj.nlinecrosskludge; j++) {
if (obj.entities[i].yp == obj.linecrosskludge[j].yp) {
//y's match, how about x's?
//we're moving left:
if (game.roomchangedir == 0) {
if (obj.entities[i].xp + obj.entities[i].w >= 312 && obj.linecrosskludge[j].xp <= 0) {
obj.revertlinecross(i, j);
}
}else {
if (obj.entities[i].xp <= 0 && obj.linecrosskludge[j].xp + obj.linecrosskludge[j].w >= 312) {
obj.revertlinecross(i, j);
}
}
}
}
}
}
}
}
public function currentarea(t:int):String {
switch(t) {
case 0: return "Dimension VVVVVV"; break;
case 1: return "Dimension VVVVVV"; break;
case 2: return "Laboratory"; break;
case 3: return "The Tower"; break;
case 4: return "Warpzone"; break;
case 5: return "Space Station"; break;
case 6: return "Outside Dimension VVVVVV"; break;
case 7: return "Outside Dimension VVVVVV"; break;
case 8: return "Outside Dimension VVVVVV"; break;
case 9: return "Outside Dimension VVVVVV"; break;
case 10: return "Outside Dimension VVVVVV"; break;
case 11: return "The Tower"; break;
}
return "???";
}
public function loadlevel(rx:int, ry:int, dwgfx:dwgraphicsclass, game:gameclass, obj:entityclass, music:musicclass):void {
var t:int;
//t = rx + (ry * 100);
//roomname = "[UNTITLED] (" + String(rx)+","+String(ry)+")";
if (!finalmode) {
explored[rx - 100 + ((ry - 100) * 20)] = 1;
if (rx == 109) {
exploretower();
}
}
roomtexton = false; roomtextx[0] = 0; roomtexty[0] = 0; roomtextnumlines = 0;
obj.customplatformtile = 0;
obj.platformtile = 0; obj.vertplatforms = false; obj.horplatforms = false;
roomname = ""; background = 1;
warpx = false; warpy = false;
towermode = false; ypos = 0; extrarow = 0;
//Custom stuff for warplines
obj.customwarpmode=false;
obj.customwarpmodevon=false;
obj.customwarpmodehon=false;
if (finalmode) {
t = 6;
//check if we're in the towers
if (rx == 49 && ry == 52) {
//entered tower 1
t = 7;
}else if (rx == 49 && ry == 53) {
//re entered tower 1
t = 8;
}else if (rx == 51 && ry == 54) {
//entered tower 2
t = 9;
}else if (rx == 51 && ry == 53) {
//re entered tower 2
t = 10;
}
}else if (custommode){
t= 12;
}else {
t = area(rx, ry);
if (t == 3) {
//correct position for tower
if (ry == 109) {
//entered from ground floor
i = obj.getplayer();
obj.entities[i].yp += (671 * 8);
ypos = (700-29) * 8;
bypos = ypos / 2;
cameramode = 0;
colstate = 0; colsuperstate = 0;
}else if (ry == 104) {
//you've entered from the top floor
ypos = 0;
bypos = 0;
cameramode = 0;
colstate = 0; colsuperstate = 0;
}
}
if (t < 2) { //on the world map, want to test if we're in the secret lab
if (rx >= 116) {
if (ry >= 105) {
if (ry <= 107) {
if (rx == 119 && ry == 105) {
//Ah, this is just a normal area
}else {
//in the secret lab! Crazy background!
background = 2;
if (rx == 116 && ry == 105) dwgfx.rcol = 1;
if (rx == 117 && ry == 105) dwgfx.rcol = 5;
if (rx == 118 && ry == 105) dwgfx.rcol = 4;
if (rx == 117 && ry == 106) dwgfx.rcol = 2;
if (rx == 118 && ry == 106) dwgfx.rcol = 0;
if (rx == 119 && ry == 106) dwgfx.rcol = 3;
if (rx == 119 && ry == 107) dwgfx.rcol = 1;
}
}
}
}
}
}
if (rx == 119 && ry == 108) {
background = 5;
dwgfx.rcol = 3;
warpx = true;
warpy = true;
}
switch(t) {
case 0: case 1: //World Map
tileset = 1; extrarow = 1;
otherlevel.loadlevel(rx, ry, game, obj);
fillcontent();
roomname = otherlevel.roomname;
tileset = otherlevel.roomtileset;
//do the appear/remove roomname here
if (otherlevel.roomtexton) {
roomtexton = true;
roomtextx[0] = otherlevel.roomtextx;
roomtexty[0] = otherlevel.roomtexty;
roomtextnumlines = otherlevel.roomtextnumlines;
for (i = 0; i < roomtextnumlines; i++) {
roomtext[i] = otherlevel.roomtext[i];
}
}
break;
case 2: //The Lab
lablevel.loadlevel(rx, ry, game, obj);
fillcontent();
roomname = lablevel.roomname;
tileset = 1; background = 2;
dwgfx.rcol = lablevel.rcol;
break;
case 3: //The Tower
tdrawback = true; minitowermode = false; tower.minitowermode = false;
bscroll = 0; scrolldir = 0;
roomname = "The Tower";
tileset = 1; background = 3;
towermode = true;
//bypos = 0; ypos = 0; cameramode = 0;
//All the entities for here are just loaded here; it's essentially one room after all
obj.createentity(game, 48, 5456, 10, 1, 505007); // (savepoint)
obj.createentity(game, 224, 4528, 10, 1, 505017); // (savepoint)
obj.createentity(game, 232, 4168, 10, 0, 505027); // (savepoint)
obj.createentity(game, 280, 3816, 10, 1, 505037); // (savepoint)
obj.createentity(game, 152, 3552, 10, 1, 505047); // (savepoint)
obj.createentity(game, 216, 3280, 10, 0, 505057); // (savepoint)
obj.createentity(game, 216, 4808, 10, 1, 505067); // (savepoint)
obj.createentity(game, 72, 3096, 10, 0, 505077); // (savepoint)
obj.createentity(game, 176, 2600, 10, 0, 505087); // (savepoint)
obj.createentity(game, 216, 2392, 10, 0, 505097); // (savepoint)
obj.createentity(game, 152, 1184, 10, 1, 505107); // (savepoint)
obj.createentity(game, 152, 912, 10, 1, 505117); // (savepoint)
obj.createentity(game, 152, 536, 10, 1, 505127); // (savepoint)
obj.createentity(game, 120, 5136, 10, 0, 505137); // (savepoint)
obj.createentity(game, 144, 1824, 10, 0, 505147); // (savepoint)
obj.createentity(game, 72, 2904, 10, 0, 505157); // (savepoint)
obj.createentity(game, 224, 1648, 10, 1, 505167); // (savepoint)
obj.createentity(game, 112, 5280, 10, 1, 50517); // (savepoint)
obj.createentity(game, 24, 4216, 9, 7); // (shiny trinket)
obj.createentity(game, 280, 3216, 9, 8); // (shiny trinket)
break;
case 4: //The Warpzone
warplevel.loadlevel(rx, ry, game, obj);
fillcontent();
roomname = warplevel.roomname;
tileset = 1; background = 3;
dwgfx.rcol = warplevel.rcol;
dwgfx.backgrounddrawn = false;
warpx = warplevel.warpx; warpy = warplevel.warpy;
background = 5;
if (warpy) background = 4;
if (warpx) background = 3;
if (warpx && warpy) background = 5;
break;
case 5: //Space station
spacestation2.loadlevel(rx, ry, game, obj);
fillcontent();
roomname = spacestation2.roomname;
tileset = 0;
break;
case 6: //final level
finallevel.loadlevel(finalx, finaly, game, obj);
fillcontent();
roomname = finallevel.roomname;
tileset = 1; background = 3;
dwgfx.rcol = finallevel.rcol;
dwgfx.backgrounddrawn = false;
if (finalstretch) {
background = 6;
}else{
warpx = finallevel.warpx; warpy = finallevel.warpy;
background = 5;
if (warpy) background = 4;
if (warpx) background = 3;
if (warpx && warpy) background = 5;
}
dwgfx.rcol = 6;
changefinalcol(final_mapcol, obj, game);
break;
case 7: //Final Level, Tower 1
tdrawback = true; minitowermode = true; tower.minitowermode = true;
bscroll = 0; scrolldir = 1;
roomname = "Panic Room";
tileset = 1; background = 3;
towermode = true;
tower.loadminitower1();
ypos = 0;
bypos = 0;
cameramode = 0;
colstate = 0; colsuperstate = 0;
break;
case 8: //Final Level, Tower 1 (reentered from below)
tdrawback = true; minitowermode = true; tower.minitowermode = true;
bscroll = 0; scrolldir = 1;
roomname = "Panic Room";
tileset = 1; background = 3;
towermode = true;
tower.loadminitower1();
i = obj.getplayer();
obj.entities[i].yp += (71 * 8);
game.roomy--; finaly--;
ypos = (100-29) * 8;
bypos = ypos/2;
cameramode = 0;
colstate = 0; colsuperstate = 0;
break;
case 9: //Final Level, Tower 2
tdrawback = true; minitowermode = true; tower.minitowermode = true;
bscroll = 0; scrolldir = 0;
final_colorframe = 2;
roomname = "The Final Challenge";
tileset = 1; background = 3;
towermode = true;
tower.loadminitower2();
obj.createentity(game, 56, 556, 11, 136); // (horizontal gravity line)
obj.createentity(game, 184, 592, 10, 0, 50500); // (savepoint)
obj.createentity(game, 184, 644, 11, 88); // (horizontal gravity line)
obj.createentity(game, 56, 460, 11, 136); // (horizontal gravity line)
obj.createentity(game, 216, 440, 10, 0, 50501); // (savepoint)
obj.createentity(game, 104, 508, 11, 168); // (horizontal gravity line)
obj.createentity(game, 219, 264, 12, 56); // (vertical gravity line)
obj.createentity(game, 120, 332, 11, 96); // (horizontal gravity line)
obj.createentity(game, 219, 344, 12, 56); // (vertical gravity line)
obj.createentity(game, 224, 332, 11, 48); // (horizontal gravity line)
obj.createentity(game, 56, 212, 11, 144); // (horizontal gravity line)
obj.createentity(game, 32, 20, 11, 96); // (horizontal gravity line)
obj.createentity(game, 72, 156, 11, 200); // (horizontal gravity line)
i = obj.getplayer();
obj.entities[i].yp += (71 * 8);
game.roomy--; finaly--;
ypos = (100-29) * 8;
bypos = ypos/2;
cameramode = 0;
colstate = 0; colsuperstate = 0;
break;
case 10: //Final Level, Tower 2
tdrawback = true; minitowermode = true; tower.minitowermode = true;
bscroll = 0; scrolldir = 0;
final_colorframe = 2;
roomname = "The Final Challenge";
tileset = 1; background = 3;
towermode = true;
tower.loadminitower2();
obj.createentity(game, 56, 556, 11, 136); // (horizontal gravity line)
obj.createentity(game, 184, 592, 10, 0, 50500); // (savepoint)
obj.createentity(game, 184, 644, 11, 88); // (horizontal gravity line)
obj.createentity(game, 56, 460, 11, 136); // (horizontal gravity line)
obj.createentity(game, 216, 440, 10, 0, 50501); // (savepoint)
obj.createentity(game, 104, 508, 11, 168); // (horizontal gravity line)
obj.createentity(game, 219, 264, 12, 56); // (vertical gravity line)
obj.createentity(game, 120, 332, 11, 96); // (horizontal gravity line)
obj.createentity(game, 219, 344, 12, 56); // (vertical gravity line)
obj.createentity(game, 224, 332, 11, 48); // (horizontal gravity line)
obj.createentity(game, 56, 212, 11, 144); // (horizontal gravity line)
obj.createentity(game, 32, 20, 11, 96); // (horizontal gravity line)
obj.createentity(game, 72, 156, 11, 200); // (horizontal gravity line)
i = obj.getplayer();
ypos = 0;
bypos = 0;
cameramode = 0;
colstate = 0; colsuperstate = 0;
break;
case 11: //Tower Hallways //Content is held in final level routine
finallevel.loadlevel(rx, ry, game, obj);
fillcontent();
roomname = finallevel.roomname;
tileset = 2;
if (rx == 108) { background = 7; rcol = 15; }
if (rx == 110) { background = 8; rcol = 10; }
if (rx == 111) { background = 9; rcol = 0;}
break;
case 12: //Custom level
var curlevel:int = (rx - 100) + ((ry - 100) * editor.maxwidth);
game.customcol = editor.getlevelcol(curlevel) + 1;
obj.customplatformtile = game.customcol * 12;
switch(editor.level[curlevel].tileset){
case 0: //Space Station
tileset = 0;
background = 1;
break;
case 1: //Outside
tileset = 1;
background = 1;
break;
case 2: //Lab
tileset = 1;
background = 2;
dwgfx.rcol = editor.level[curlevel].tilecol;
break;
case 3: //Warp Zone/intermission
tileset = 1;
background = 6;
break;
case 4://Ship
tileset = 1;
background = 1;
break;
default:
tileset = 1;
background = 1;
break;
}
//If screen warping, then override all that:
dwgfx.backgrounddrawn = false;
if(editor.level[curlevel].warpdir>0){
if(editor.level[curlevel].warpdir==1){
warpx=true;
background=3;
dwgfx.rcol = editor.getwarpbackground(rx-100,ry-100);
}else if(editor.level[curlevel].warpdir==2){
warpy=true;
background=4;
dwgfx.rcol = editor.getwarpbackground(rx-100,ry-100);
}else if(editor.level[curlevel].warpdir==3){
warpx=true; warpy=true;
background = 5;
dwgfx.rcol = editor.getwarpbackground(rx-100,ry-100);
}
}
roomname="";
if(editor.level[curlevel].roomname!=""){
roomname=editor.level[curlevel].roomname;
}
extrarow = 1;
editor.loadlevel(rx, ry);
roomtexton = false;
roomtextnumlines = 0;
for (var edj:int = 0; edj < 30; edj++) {
for (var edi:int = 0; edi < 40; edi++) {
contents[edi + vmult[edj]] = editor.swapmap[edi + vmult[edj]];
}
}
//Entities have to be created HERE, akwardly
var tempcheckpoints:int=0;
var tempscriptbox:int=0;
var bx1:int, by1:int, bx2:int, by2:int;
for (edi = 0; edi < editor.editordata.numedentities; edi++) {
//If entity is in this room, create it
var tsx:int = (editor.edentity[edi].x - (editor.edentity[edi].x % 40)) / 40;
var tsy:int = (editor.edentity[edi].y - (editor.edentity[edi].y % 30)) / 30;
if(tsx==rx-100 && tsy==ry-100){
switch(editor.edentity[edi].t){
case 1: //Enemies
bx1=editor.level[rx-100+((ry-100)*editor.maxwidth)].enemyx1;
by1=editor.level[rx-100+((ry-100)*editor.maxwidth)].enemyy1;
bx2=editor.level[rx-100+((ry-100)*editor.maxwidth)].enemyx2;
by2 = editor.level[rx - 100 + ((ry - 100) * editor.maxwidth)].enemyy2;
if(warpx){ if(bx1==0 && bx2==320){ bx1=-100; bx2=420; } }
if (warpy) { if (by1 == 0 && by2 == 240) { by1 = -100; by2 = 340; } }
obj.customenemy=editor.level[tsx+((editor.maxwidth)*tsy)].enemytype;
obj.createentity(game, (editor.edentity[edi].x*8)- ((rx-100)*40*8),(editor.edentity[edi].y*8)- ((ry-100)*30*8), 56,
editor.edentity[edi].p1, 4, bx1, by1, bx2, by2);
break;
case 2: //Platforms and Threadmills
if(editor.edentity[edi].p1<=4){
bx1 = editor.level[rx - 100 + ((ry - 100) * editor.maxwidth)].platx1;
by1 = editor.level[rx - 100 + ((ry - 100) * editor.maxwidth)].platy1;
bx2 = editor.level[rx - 100 + ((ry - 100) * editor.maxwidth)].platx2;
by2 = editor.level[rx - 100 + ((ry - 100) * editor.maxwidth)].platy2;
if (warpx) { if (bx1 == 0 && bx2 == 320) { bx1 = -100; bx2 = 420; } }
if (warpy) { if (by1 == 0 && by2 == 240) { by1 = -100; by2 = 340; } }
obj.createentity(game, (editor.edentity[edi].x*8)- ((rx-100)*40*8),(editor.edentity[edi].y*8)- ((ry-100)*30*8), 2,
editor.edentity[edi].p1, editor.level[rx-100+((ry-100)*editor.mapwidth)].platv, bx1, by1, bx2, by2);
}else if(editor.edentity[edi].p1>=5 && editor.edentity[edi].p1<=8){ //Threadmill
obj.createentity(game, (editor.edentity[edi].x*8)- ((rx-100)*40*8),(editor.edentity[edi].y*8)- ((ry-100)*30*8), 2,
editor.edentity[edi].p1+3, 4);
}
break;
case 3: //Disappearing platforms
obj.createentity(game, (editor.edentity[edi].x*8)- ((rx-100)*40*8),(editor.edentity[edi].y*8)- ((ry-100)*30*8), 3);
break;
case 9:
obj.createentity(game, (editor.edentity[edi].x*8)- ((rx-100)*40*8),(editor.edentity[edi].y*8)- ((ry-100)*30*8), 9, editor.findtrinket(edi));
break;
case 10: //Checkpoints
obj.createentity(game, (editor.edentity[edi].x*8)- ((rx-100)*40*8),(editor.edentity[edi].y*8)- ((ry-100)*30*8), 10,
editor.edentity[edi].p1, ((rx + (ry * 100)) * 20) + tempcheckpoints);
tempcheckpoints++;
break;
case 11: //Gravity Lines
if(editor.edentity[edi].p1==0){ //Horizontal
obj.createentity(game, (editor.edentity[edi].p2 * 8), (editor.edentity[edi].y * 8) - ((ry - 100) * 30 * 8) + 4, 11, editor.edentity[edi].p3);
}else{ //Vertical
obj.createentity(game, (editor.edentity[edi].x * 8) - ((rx - 100) * 40 * 8) + 3, (editor.edentity[edi].p2 * 8), 12, editor.edentity[edi].p3);
}
break;
case 13: //Warp Tokens
obj.createentity(game, (editor.edentity[edi].x*8)- ((rx-100)*40*8),(editor.edentity[edi].y*8)- ((ry-100)*30*8), 13, editor.edentity[edi].p1, editor.edentity[edi].p2);
break;
case 15: //Collectable crewmate
obj.createentity(game, (editor.edentity[edi].x * 8) - ((rx - 100) * 40 * 8) - 4, (editor.edentity[edi].y * 8) - ((ry - 100) * 30 * 8) + 1, 55, editor.findcrewmate(edi), editor.edentity[edi].p1, editor.edentity[edi].p2);
break;
case 17: //Roomtext!
roomtexton = true;
roomtextx[roomtextnumlines] = editor.edentity[edi].x - ((rx-100)*40);
roomtexty[roomtextnumlines] = editor.edentity[edi].y - ((ry-100)*30);
roomtext[roomtextnumlines] = editor.edentity[edi].scriptname;
roomtextnumlines++;
break;
case 18: //Terminals
obj.customscript=editor.edentity[edi].scriptname;
obj.createentity(game, (editor.edentity[edi].x * 8) - ((rx - 100) * 40 * 8), (editor.edentity[edi].y * 8) - ((ry - 100) * 30 * 8) + 8, 20, 1);
obj.createblock(5, (editor.edentity[edi].x * 8) - ((rx - 100) * 40 * 8) - 8, (editor.edentity[edi].y * 8) - ((ry - 100) * 30 * 8) + 8, 20, 16, 35);
break;
case 19: //Script Box
game.customscript[tempscriptbox] = editor.edentity[edi].scriptname;
obj.createblock(1, (editor.edentity[edi].x * 8) - ((rx - 100) * 40 * 8), (editor.edentity[edi].y * 8) - ((ry - 100) * 30 * 8),
editor.edentity[edi].p1 * 8, editor.edentity[edi].p2 * 8, 300 + tempscriptbox);
tempscriptbox++;
break;
case 50: //Warp Lines
obj.customwarpmode=true;
if(editor.edentity[edi].p1==0){ //
obj.createentity(game, (editor.edentity[edi].x * 8) - ((rx - 100) * 40 * 8) + 4, (editor.edentity[edi].p2 * 8), 51, editor.edentity[edi].p3);
}else if(editor.edentity[edi].p1==1){ //Horizontal, right
obj.createentity(game, (editor.edentity[edi].x * 8) - ((rx - 100) * 40 * 8) + 4, (editor.edentity[edi].p2 * 8), 52, editor.edentity[edi].p3);
}else if(editor.edentity[edi].p1==2){ //Vertical, top
obj.createentity(game, (editor.edentity[edi].p2 * 8), (editor.edentity[edi].y * 8) - ((ry - 100) * 30 * 8) + 7, 53, editor.edentity[edi].p3);
}else if(editor.edentity[edi].p1==3){
obj.createentity(game, (editor.edentity[edi].p2 * 8), (editor.edentity[edi].y * 8) - ((ry - 100) * 30 * 8), 54, editor.edentity[edi].p3);
}
break;
}
}
}
customtrinkets = editor.numtrinkets;
customcrewmates = editor.numcrewmates;
break;
}
//The room's loaded: now we fill out damage blocks based on the tiles.
if (towermode) {
for (j = 0; j < 700; j++) {
for (i = 0; i < 40; i++) {
//Damage blocks
//if (tower.contents[i + tower.vmult[j]] >=6 && tower.contents[i + tower.vmult[j]] <= 11) obj.createblock(2, (i * 8) + 1, j * 8, 6, 8);
}
}
}else{
initspikes(game, obj);
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].active){
if (obj.entities[i].type == 1 && obj.entities[i].behave >= 8 && obj.entities[i].behave < 10) {
//put a block underneath
temp = int(obj.entities[i].xp / 8);
temp2 = int(obj.entities[i].yp / 8);
settile(temp, temp2, 1);
settile(temp+1, temp2, 1);
settile(temp+2, temp2, 1);
settile(temp+3, temp2, 1);
if (obj.entities[i].w == 64) {
settile(temp+4, temp2, 1);
settile(temp+5, temp2, 1);
settile(temp+6, temp2, 1);
settile(temp+7, temp2, 1);
}
}
}
}
}
//Special scripting: Create objects and triggers based on what crewmembers are rescued.
if (!finalmode) {
//First up: the extra bits:
//Vermilion's quest:
if (rx == 100 && ry == 105) { //On path to verdigris
if (game.crewstats[3] && !game.crewstats[4]) {
obj.createentity(game, 87, 105, 18, 15, 0, 18);
obj.createblock(5, 87-32, 0, 32+32+32, 240, 3);
}
}else if (rx == 107 && ry == 100) { //victoria
if (game.crewstats[3] && !game.crewstats[5]) {
obj.createentity(game, 140, 137, 18, 15, 0, 18);
obj.createblock(5, 140-32, 0, 32+32+32, 240, 3);
}
}else if (rx == 114 && ry == 109) {
if (game.crewstats[3] && !game.crewstats[2]) {
obj.createentity(game, 235, 81, 18, 15, 0, 18);
obj.createblock(5, 235-32, 0, 32+32+32, 240, 3);
}
}
//Verdigris fixing the ship
if (rx == 101 && ry == 109) {
if (game.crewstats[4]) {
if(game.crewrescued()>4 && game.crewrescued()!=6){
obj.createentity(game, 175, 121, 18, 13, 0, 18);
obj.createblock(5, 175-32, 0, 32+32+32, 240, 4);
}
}
}else if (rx == 103 && ry == 109) {
if (game.crewstats[4]) {
if(game.crewrescued()<=4 && game.crewrescued()!=6){
obj.createentity(game, 53, 161, 18, 13, 1, 18);
obj.createblock(5, 53-32, 0, 32+32+32, 240, 4);
}
}
}
if (rx == 104 && ry == 111) {
//Red
//First: is he rescued?
if (game.crewstats[3]) {
//If so, red will always be at his post
obj.createentity(game, 107, 121, 18, 15, 0, 18);
//What script do we use?
obj.createblock(5, 107-32, 0, 32+32+32, 240, 3);
}
}else if (rx == 103 && ry == 111) {
//Yellow
//First: is he rescued?
if (game.crewstats[2]) {
obj.createentity(game, 198, 105, 18, 14, 0, 18);
//What script do we use?
obj.createblock(5, 198-32, 0, 32+32+32, 240, 2);
}
}else if (rx == 103 && ry == 110) {
//Green
//First: is he rescued?
if (game.crewstats[4]) {
obj.createentity(game, 242, 177, 18, 13, 0, 18);
//What script do we use?
obj.createblock(5, 242-32, 177-20, 32+32+32, 40, 4);
}
}else if (rx == 104 && ry == 110) {
//Purple
//First: is she rescued?
if (game.crewstats[1]) {
obj.createentity(game, 140, 177, 18, 20, 0, 18);
//What script do we use?
obj.createblock(5, 140-32, 0, 32+32+32, 240, 1);
}
}else if (rx == 102 && ry == 110) {
//Blue
//First: is she rescued?
if (game.crewstats[5]) {
//A slight varation - she's upside down
obj.createentity(game, 249, 62, 18, 16, 0, 18);
j = obj.getcrewman(5);
obj.entities[j].rule = 7; obj.entities[j].tile +=6;
//What script do we use?
obj.createblock(5, 249-32, 0, 32+32+32, 240, 5);
}
}
}
//Make sure our crewmates are facing the player if appliciable
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].rule == 6 || obj.entities[i].rule == 7) {
if (obj.entities[i].state == 18) {
//face the player
j = obj.getplayer();
if (obj.entities[j].xp > obj.entities[i].xp + 5) { obj.entities[i].dir = 1;
}else if (obj.entities[j].xp < obj.entities[i].xp - 5) { obj.entities[i].dir = 0; }
}
}
}
}
public function clearoptimiser():void {
for (j = 0; j < 29 + extrarow; j++) {
for (i = 0; i < 40; i++) {
optimiser[int(i + vmult[j])] = int(0);
}
}
}
public function checkspikeright(x:int, y:int, t:int):int {
//Check how many tiles this extends right for
temp = 0;
while (x < 40 && contents[int(x + vmult[y])] == int(t)) {
optimiser[int(x + vmult[y])] = int(1);
temp++;
x++
}
return temp;
}
public function checkspikedown(x:int, y:int, t:int):int {
//Check how many tiles this extends down for
temp = 0;
while (y < 30 && contents[int(x + vmult[y])] == int(t)) {
optimiser[int(x + vmult[y])] = int(1);
temp++;
y++
}
return temp;
}
public function initspikes(game:gameclass, obj:entityclass):void {
//Turn spikes into damage blocks for quick collision checking
clearoptimiser();
for (j = 0; j < 29 + extrarow; j++) {
for (i = 0; i < 40; i++) {
//Damage blocks
if (optimiser[int(i + vmult[j])] == 0) {
if (tileset == 0) {
if (contents[i + vmult[j]] == 6 || contents[i + vmult[j]] == 8) {
//sticking up
spikecount = checkspikeright(i, j, contents[i + vmult[j]]);
obj.createblock(2, (i * 8), (j * 8) + 4, 8 * spikecount, 4);
}
if (contents[i + vmult[j]] == 7 || contents[i + vmult[j]] == 9) {
//Sticking down
spikecount = checkspikeright(i, j, contents[i + vmult[j]]);
obj.createblock(2, (i * 8), (j * 8), 8 * spikecount, 4);
}
if (contents[i + vmult[j]] == 49 || contents[i + vmult[j]] == 50) {
//left or right
spikecount = checkspikedown(i, j, contents[i + vmult[j]]);
if(spikecount==1){
obj.createblock(2, (i * 8), (j * 8) + 3, 8, 2);
}else {
obj.createblock(2, (i * 8), (j * 8) + 3, 8, 2 + (8 * (spikecount - 1)));
}
}
}else if (tileset == 1) {
//if (contents[i + vmult[j]] >= 6 && contents[i + vmult[j]] <= 9) obj.createblock(2, (i * 8), (j * 8)+1, 8, 6);
//if (contents[i + vmult[j]] >= 49 && contents[i + vmult[j]] <= 79) obj.createblock(2, (i * 8) + 1, (j * 8) + 1, 6, 6);
if ((contents[i + vmult[j]] >= 63 && contents[i + vmult[j]] <= 74) ||
(contents[i + vmult[j]] >= 6 && contents[i + vmult[j]] <= 9)) {
//sticking up) {
if (contents[i + vmult[j]] < 10) contents[i + vmult[j]]++;
//sticking up
if (contents[i + vmult[j]] % 2 == 0) {
spikecount = checkspikeright(i, j, contents[i + vmult[j]]);
obj.createblock(2, (i * 8), (j * 8), 8 * spikecount, 4);
}else{
//Sticking down
spikecount = checkspikeright(i, j, contents[i + vmult[j]]);
obj.createblock(2, (i * 8), (j * 8) + 4, 8 * spikecount, 4);
}
if (contents[i + vmult[j]] < 11) contents[i + vmult[j]]--;
}
if (contents[i + vmult[j]] >= 49 && contents[i + vmult[j]] <= 62) {
//left or right
spikecount = checkspikedown(i, j, contents[i + vmult[j]]);
if(spikecount==1){
obj.createblock(2, (i * 8), (j * 8) + 3, 8, 2);
}else {
obj.createblock(2, (i * 8), (j * 8) + 3, 8, 2 + ((spikecount - 1) * 8));
}
}
}else if (tileset == 2) {
if (contents[i + vmult[j]] == 6 || contents[i + vmult[j]] == 8) {
//sticking up
spikecount = checkspikeright(i, j, contents[i + vmult[j]]);
obj.createblock(2, (i * 8), (j * 8) + 4, 8 * spikecount, 4);
}
if (contents[i + vmult[j]] == 7 || contents[i + vmult[j]] == 9) {
//Sticking down
spikecount = checkspikeright(i, j, contents[i + vmult[j]]);
obj.createblock(2, (i * 8), (j * 8), 8 * spikecount, 4);
}
}
}
//Breakable blocks
if (contents[i + vmult[j]] == 10) {
contents[i + vmult[j]] = 0;
obj.createentity(game, i * 8, j * 8, 4);
}
//Directional blocks
if (contents[i + vmult[j]] >= 14 && contents[i + vmult[j]] <= 17) {
obj.createblock(3, i * 8, j * 8, 8, 8, contents[i + vmult[j]] - 14);
obj.opt_usedirectional = true;
}
}
}
}
public var roomdeaths:Array = new Array();
public var roomdeathsfinal:Array = new Array();
public var areamap:Vector.<int> = new Vector.<int>;
public var contents:Vector.<int> = new Vector.<int>;
public var optimiser:Vector.<int> = new Vector.<int>;
public var explored:Array = new Array();
public var vmult:Array = new Array();
public var realtmap:Array = new Array();
public var temp:int, temp2:int;
public var i:int, j:int;
public var background:int, rcol:int;
public var tileset:int;
public var warpx:Boolean;
public var warpy:Boolean;
public var roomname:String;
//Special tower stuff
public var towermode:Boolean;
public var ypos:Number, bypos:Number;
public var cameramode:int;
public var cameraseek:int, cameraseekframe:int;
public var resumedelay:int;
public var minitowermode:Boolean;
public var scrolldir:int;
//This is the old colour cycle
public var r:int, g:int, b:int;
public var check:int, cmode:int;
public var towercol:int;
public var colstate:int, colstatedelay:int;
public var colsuperstate:int;
public var spikeleveltop:int, spikelevelbottom:int;
public var tdrawback:Boolean;
public var bscroll:int;
//Variables for playing custom levels
public var custommode:Boolean;
public var custommodeforreal:Boolean;
public var customx:int, customy:int;
public var customwidth:int, customheight:int;
public var customtrinkets:int;
public var customcrewmates:int;
public var custommmxoff:int, custommmyoff:int, custommmxsize:int, custommmysize:int;
public var customzoom:int;
public var customshowmm:Boolean;
//final level navigation
public var finalx:int, finaly:int, finalmode:Boolean;
public var finalstretch:Boolean; //if true, disable screen warping and enable special background
public var specialnames:Array = new Array();
public var glitchmode:int, glitchdelay:int, glitchname:String;
//final level colour cycling stuff
public var final_colormode:Boolean, final_mapcol:int;
public var final_aniframe:int, final_aniframedelay:int;
public var final_colorframe:int, final_colorframedelay:int;
//Teleporters and Trinkets on the map
public var teleporters:Array = new Array();
public var shinytrinkets:Array = new Array();
public var numteleporters:int, numshinytrinkets:int;
public var showteleporters:Boolean, showtargets:Boolean, showtrinkets:Boolean;
//Roomtext
public var roomtextx:Vector.<int> = new Vector.<int>;
public var roomtexty:Vector.<int> = new Vector.<int>;
public var roomtexton:Boolean;
public var roomtext:Array = new Array();
public var roomtextnumlines:int;
//Levels
public var spacestation2:spacestation2class = new spacestation2class();
public var otherlevel:otherlevelclass = new otherlevelclass();
public var lablevel:labclass = new labclass();
public var warplevel:warpclass = new warpclass();
public var finallevel:finalclass = new finalclass();
public var tower:towerclass = new towerclass();
public var extrarow:int;
//Accessibility options
public var invincibility:Boolean;
//Map cursor
public var cursorstate:int, cursordelay:int;
public var spikecount:int;
}
}