2022-12-02 18:19:58 +01:00
|
|
|
package {
|
2020-01-01 21:29:24 +01:00
|
|
|
import flash.geom.*;
|
|
|
|
import flash.events.*;
|
|
|
|
import flash.net.*;
|
|
|
|
|
2022-12-02 18:19:58 +01:00
|
|
|
public class mapclass {
|
2020-01-01 21:29:24 +01:00
|
|
|
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;
|
|
|
|
|
2022-12-02 18:19:58 +01:00
|
|
|
dwgfx.forcescreenupdates();
|
|
|
|
|
2020-01-01 21:29:24 +01:00
|
|
|
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;
|
2022-12-02 18:19:58 +01:00
|
|
|
case 4: return "Warpzone"; break;
|
2020-01-01 21:29:24 +01:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-02 18:19:58 +01:00
|
|
|
if (rx == 119 && ry == 108) {
|
2020-01-01 21:29:24 +01:00
|
|
|
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;
|
|
|
|
}
|
2022-12-02 18:19:58 +01:00
|
|
|
}
|