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. = new Vector.; public var contents:Vector. = new Vector.; public var optimiser:Vector. = new Vector.; 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. = new Vector.; public var roomtexty:Vector. = new Vector.; 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; } }