mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-11-05 02:39:41 +01:00
1547 lines
53 KiB
C++
1547 lines
53 KiB
C++
|
#include "Logic.h"
|
||
|
#include "Network.h"
|
||
|
|
||
|
extern int temp;
|
||
|
|
||
|
void titlelogic( Graphics& dwgfx, Game& game, entityclass& obj, UtilityClass& help, musicclass& music, mapclass& map)
|
||
|
{
|
||
|
//Misc
|
||
|
//map.updatetowerglow();
|
||
|
help.updateglow();
|
||
|
|
||
|
map.bypos -= 2;
|
||
|
map.bscroll = -2;
|
||
|
//if (map.ypos <= 0) { map.ypos = 0; map.bypos = 0; map.bscroll = 0; }
|
||
|
//if (map.ypos >= 5368) { map.ypos = 5368; map.bypos = map.ypos / 2; } //700-29 * 8 = 5368
|
||
|
|
||
|
if (game.menucountdown > 0)
|
||
|
{
|
||
|
game.menucountdown--;
|
||
|
if (game.menucountdown == 0)
|
||
|
{
|
||
|
if (game.menudest == "mainmenu")
|
||
|
{
|
||
|
music.play(6);
|
||
|
}
|
||
|
else if (game.menudest == "gameover2")
|
||
|
{
|
||
|
music.playef(11, 10);
|
||
|
}
|
||
|
else if (game.menudest == "timetrialcomplete3")
|
||
|
{
|
||
|
music.playef(3, 10);
|
||
|
}
|
||
|
game.createmenu(game.menudest);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void maplogic(Graphics& dwgfx, Game& game, entityclass& obj, musicclass& music, mapclass& map, UtilityClass& help)
|
||
|
{
|
||
|
//Misc
|
||
|
help.updateglow();
|
||
|
}
|
||
|
|
||
|
|
||
|
void gamecompletelogic(Graphics& dwgfx, Game& game, entityclass& obj, musicclass& music, mapclass& map, UtilityClass& help)
|
||
|
{
|
||
|
//Misc
|
||
|
map.updatetowerglow();
|
||
|
help.updateglow();
|
||
|
dwgfx.crewframe = 0;
|
||
|
|
||
|
map.tdrawback = true;
|
||
|
|
||
|
game.creditposition--;
|
||
|
if (game.creditposition <= -1650)
|
||
|
{
|
||
|
game.creditposition = -1650;
|
||
|
map.bscroll = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
map.bypos += 1;
|
||
|
map.bscroll = +1;
|
||
|
}
|
||
|
|
||
|
if (dwgfx.fademode == 1)
|
||
|
{
|
||
|
//Fix some graphical things
|
||
|
dwgfx.showcutscenebars = false;
|
||
|
dwgfx.cutscenebarspos = 0;
|
||
|
//Return to game
|
||
|
game.gamestate = 7;
|
||
|
dwgfx.fademode = 4;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void gamecompletelogic2(Graphics& dwgfx, Game& game, entityclass& obj, musicclass& music, mapclass& map, UtilityClass& help)
|
||
|
{
|
||
|
//Misc
|
||
|
map.updatetowerglow();
|
||
|
help.updateglow();
|
||
|
|
||
|
game.creditposdelay--;
|
||
|
if (game.creditposdelay <= 0)
|
||
|
{
|
||
|
game.creditposdelay = 1;
|
||
|
game.creditposx++;
|
||
|
if (game.creditposx > 40)
|
||
|
{
|
||
|
game.creditposy++;
|
||
|
game.creditposx = 0;
|
||
|
if (game.creditposy > 30) game.creditposy = 30;
|
||
|
}
|
||
|
}
|
||
|
/*
|
||
|
game.creditposition--;
|
||
|
if (game.creditposition <= -1650) {
|
||
|
game.creditposition = -1650;
|
||
|
map.bscroll = 0;
|
||
|
}else {
|
||
|
map.bypos += 1; map.bscroll = +1;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
if (dwgfx.fademode == 1)
|
||
|
{
|
||
|
//Fix some graphical things
|
||
|
dwgfx.showcutscenebars = false;
|
||
|
dwgfx.cutscenebarspos = 0;
|
||
|
//Fix the save thingy
|
||
|
game.deletequick();
|
||
|
int tmp=music.currentsong;
|
||
|
music.currentsong=4;
|
||
|
game.savetele(map,obj,music);
|
||
|
music.currentsong=tmp;
|
||
|
game.telegotoship();
|
||
|
//Return to game
|
||
|
map.colstate = 10;
|
||
|
game.gamestate = 1;
|
||
|
dwgfx.fademode = 4;
|
||
|
music.playef(18, 10);
|
||
|
game.createmenu("gamecompletecontinue");
|
||
|
map.nexttowercolour();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void towerlogic(Graphics& dwgfx, Game& game, entityclass& obj, musicclass& music, mapclass& map, UtilityClass& help)
|
||
|
{
|
||
|
//Logic for the tower level
|
||
|
map.updatetowerglow();
|
||
|
help.updateglow();
|
||
|
|
||
|
if(!game.completestop)
|
||
|
{
|
||
|
if (map.cameramode == 0)
|
||
|
{
|
||
|
//do nothing!
|
||
|
//a trigger will set this off in the game
|
||
|
map.cameramode = 1;
|
||
|
map.bscroll = 0;
|
||
|
}
|
||
|
else if (map.cameramode == 1)
|
||
|
{
|
||
|
//move normally
|
||
|
if(map.scrolldir==0)
|
||
|
{
|
||
|
map.ypos -= 2;
|
||
|
map.bypos -= 1;
|
||
|
map.bscroll = -1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
map.ypos += 2;
|
||
|
map.bypos += 1;
|
||
|
map.bscroll = 1;
|
||
|
}
|
||
|
}
|
||
|
else if (map.cameramode == 2)
|
||
|
{
|
||
|
//do nothing, but cycle colours (for taking damage)
|
||
|
map.bscroll = 0;
|
||
|
}
|
||
|
else if (map.cameramode == 4)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
map.cameraseek = map.ypos - (obj.entities[i].yp - 120);
|
||
|
|
||
|
map.cameraseek = map.cameraseek / 10;
|
||
|
map.cameraseekframe = 10;
|
||
|
|
||
|
map.cameramode = 5;
|
||
|
|
||
|
map.bscroll = map.cameraseek/2;
|
||
|
}
|
||
|
else if (map.cameramode == 5)
|
||
|
{
|
||
|
//actually do it
|
||
|
if (map.spikeleveltop > 0) map.spikeleveltop-=2;
|
||
|
if (map.spikelevelbottom > 0) map.spikelevelbottom-=2;
|
||
|
if (map.cameraseekframe > 0)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
map.ypos -= map.cameraseek;
|
||
|
if (map.cameraseek > 0)
|
||
|
{
|
||
|
if (map.ypos < obj.entities[i].yp - 120)
|
||
|
{
|
||
|
map.ypos = obj.entities[i].yp - 120;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (map.ypos > obj.entities[i].yp - 120)
|
||
|
{
|
||
|
map.ypos = obj.entities[i].yp - 120;
|
||
|
}
|
||
|
}
|
||
|
map.cameraseekframe--;
|
||
|
map.bypos = map.ypos / 2;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
map.ypos = obj.entities[i].yp - 120;
|
||
|
map.bypos = map.ypos / 2;
|
||
|
map.cameramode = 0;
|
||
|
map.colsuperstate = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
map.bscroll = 0;
|
||
|
}
|
||
|
|
||
|
if (map.ypos <= 0)
|
||
|
{
|
||
|
map.ypos = 0;
|
||
|
map.bypos = 0;
|
||
|
map.bscroll = 0;
|
||
|
}
|
||
|
if (map.minitowermode)
|
||
|
{
|
||
|
if (map.ypos >= 568)
|
||
|
{
|
||
|
map.ypos = 568;
|
||
|
map.bypos = map.ypos / 2;
|
||
|
map.bscroll = 0;
|
||
|
} //100-29 * 8 = 568
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (map.ypos >= 5368)
|
||
|
{
|
||
|
map.ypos = 5368; //700-29 * 8 = 5368
|
||
|
map.bypos = map.ypos / 2.0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (game.lifeseq > 0)
|
||
|
{
|
||
|
if (map.cameramode == 2)
|
||
|
{
|
||
|
map.cameraseekframe = 20;
|
||
|
map.cameramode = 4;
|
||
|
map.resumedelay = 4;
|
||
|
}
|
||
|
|
||
|
if (map.cameraseekframe <= 0)
|
||
|
{
|
||
|
if (map.resumedelay <= 0)
|
||
|
{
|
||
|
game.lifesequence(obj);
|
||
|
if (game.lifeseq == 0) map.cameramode = 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
map.resumedelay--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (game.deathseq != -1)
|
||
|
{
|
||
|
map.colsuperstate = 1; //cause the palette to go spastic!
|
||
|
map.cameramode = 2;
|
||
|
game.deathsequence(map, obj, music);
|
||
|
game.deathseq--;
|
||
|
if (game.deathseq <= 0)
|
||
|
{
|
||
|
if (game.nodeathmode)
|
||
|
{
|
||
|
game.deathseq = 1;
|
||
|
game.gethardestroom(map);
|
||
|
//start depressing sequence here...
|
||
|
if (game.gameoverdelay <= -10 && dwgfx.fademode==0) dwgfx.fademode = 2;
|
||
|
if (dwgfx.fademode == 1) script.resetgametomenu(dwgfx, game, map, obj, help, music);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (game.currentroomdeaths > game.hardestroomdeaths)
|
||
|
{
|
||
|
game.hardestroomdeaths = game.currentroomdeaths;
|
||
|
game.hardestroom = map.roomname;
|
||
|
}
|
||
|
|
||
|
game.gravitycontrol = game.savegc;
|
||
|
dwgfx.textboxremove();
|
||
|
map.resetplayer(dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//State machine for game logic
|
||
|
game.updatestate(dwgfx, map, obj, help, music);
|
||
|
|
||
|
|
||
|
//Time trial stuff
|
||
|
if (game.intimetrial)
|
||
|
{
|
||
|
if (game.timetrialcountdown > 0)
|
||
|
{
|
||
|
game.hascontrol = true;
|
||
|
game.timetrialcountdown--;
|
||
|
if (game.timetrialcountdown > 30)
|
||
|
{
|
||
|
game.hascontrol = false;
|
||
|
}
|
||
|
if(game.timetrialcountdown == 120) music.playef(21, 10);
|
||
|
if(game.timetrialcountdown == 90) music.playef(21, 10);
|
||
|
if(game.timetrialcountdown == 60) music.playef(21, 10);
|
||
|
if (game.timetrialcountdown == 30)
|
||
|
{
|
||
|
switch(game.timetriallevel)
|
||
|
{
|
||
|
case 0:
|
||
|
music.play(1);
|
||
|
break;
|
||
|
case 1:
|
||
|
music.play(3);
|
||
|
break;
|
||
|
case 2:
|
||
|
music.play(2);
|
||
|
break;
|
||
|
case 3:
|
||
|
music.play(1);
|
||
|
break;
|
||
|
case 4:
|
||
|
music.play(12);
|
||
|
break;
|
||
|
case 5:
|
||
|
music.play(15);
|
||
|
break;
|
||
|
}
|
||
|
music.playef(22, 10);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Have we lost the par?
|
||
|
if (!game.timetrialparlost)
|
||
|
{
|
||
|
if ((game.minutes * 60) + game.seconds > game.timetrialpar)
|
||
|
{
|
||
|
game.timetrialparlost = true;
|
||
|
int i = obj.getplayer();
|
||
|
if (i > -1)
|
||
|
{
|
||
|
obj.entities[i].tile = 144;
|
||
|
}
|
||
|
music.playef(2, 10);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//Update entities
|
||
|
|
||
|
if(!game.completestop)
|
||
|
{
|
||
|
for (int i = obj.nentity - 1; i >= 0; i--)
|
||
|
{
|
||
|
//Remove old platform
|
||
|
//if (obj.entities[i].isplatform) obj.removeblockat(obj.entities[i].xp, obj.entities[i].yp);
|
||
|
|
||
|
obj.updateentities(i, help, game, music); // Behavioral logic
|
||
|
obj.updateentitylogic(i, game); // Basic Physics
|
||
|
obj.entitymapcollision(i, map); // Collisions with walls
|
||
|
|
||
|
//Create new platform
|
||
|
//if (obj.entities[i].isplatform) obj.movingplatformfix(i, map);
|
||
|
}
|
||
|
|
||
|
obj.entitycollisioncheck(dwgfx, game, map, music); // Check ent v ent collisions, update states
|
||
|
//special for tower: is the player touching any spike blocks?
|
||
|
int player = obj.getplayer();
|
||
|
if(obj.checktowerspikes(player, map) && dwgfx.fademode==0)
|
||
|
{
|
||
|
game.deathseq = 30;
|
||
|
}
|
||
|
|
||
|
//Right so! Screenwraping for tower:
|
||
|
if (map.minitowermode)
|
||
|
{
|
||
|
if (map.scrolldir == 1)
|
||
|
{
|
||
|
//This is minitower 1!
|
||
|
player = obj.getplayer();
|
||
|
if (game.door_left > -2 && obj.entities[player].xp < -14)
|
||
|
{
|
||
|
obj.entities[player].xp += 320;
|
||
|
map.gotoroom(48, 52, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.door_right > -2 && obj.entities[player].xp >= 308)
|
||
|
{
|
||
|
obj.entities[player].xp -= 320;
|
||
|
obj.entities[player].yp -= (71*8);
|
||
|
map.gotoroom(game.roomx + 1, game.roomy+1, dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//This is minitower 2!
|
||
|
player = obj.getplayer();
|
||
|
if (game.door_left > -2 && obj.entities[player].xp < -14)
|
||
|
{
|
||
|
if (obj.entities[player].yp > 300)
|
||
|
{
|
||
|
obj.entities[player].xp += 320;
|
||
|
obj.entities[player].yp -= (71 * 8);
|
||
|
map.gotoroom(50, 54, dwgfx, game, obj, music);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.entities[player].xp += 320;
|
||
|
map.gotoroom(50, 53, dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
if (game.door_right > -2 && obj.entities[player].xp >= 308)
|
||
|
{
|
||
|
obj.entities[player].xp -= 320;
|
||
|
map.gotoroom(52, 53, dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//Always wrap except for the very top and very bottom of the tower
|
||
|
if(map.ypos>=500 && map.ypos <=5000)
|
||
|
{
|
||
|
for (int i = 0; i < obj.nentity; i++)
|
||
|
{
|
||
|
if (obj.entities[i].xp <= -10)
|
||
|
{
|
||
|
obj.entities[i].xp += 320;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].xp > 310)
|
||
|
{
|
||
|
obj.entities[i].xp -= 320;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//Do not wrap! Instead, go to the correct room
|
||
|
player = obj.getplayer();
|
||
|
if (game.door_left > -2 && obj.entities[player].xp < -14)
|
||
|
{
|
||
|
obj.entities[player].xp += 320;
|
||
|
obj.entities[player].yp -= (671 * 8);
|
||
|
map.gotoroom(108, 109, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.door_right > -2 && obj.entities[player].xp >= 308)
|
||
|
{
|
||
|
obj.entities[player].xp -= 320;
|
||
|
map.gotoroom(110, 104, dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(game.lifeseq==0)
|
||
|
{
|
||
|
int player = obj.getplayer();
|
||
|
if(!map.invincibility)
|
||
|
{
|
||
|
if (obj.entities[player].yp-map.ypos <= 0)
|
||
|
{
|
||
|
game.deathseq = 30;
|
||
|
}
|
||
|
else if (obj.entities[player].yp-map.ypos >= 208)
|
||
|
{
|
||
|
game.deathseq = 30;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[player].yp-map.ypos <= 0)
|
||
|
{
|
||
|
map.ypos-=10;
|
||
|
map.bypos = map.ypos / 2;
|
||
|
map.bscroll = 0;
|
||
|
}
|
||
|
else if (obj.entities[player].yp-map.ypos >= 208)
|
||
|
{
|
||
|
map.ypos+=2;
|
||
|
map.bypos = map.ypos / 2;
|
||
|
map.bscroll = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (obj.entities[player].yp - map.ypos <= 40)
|
||
|
{
|
||
|
map.spikeleveltop++;
|
||
|
if (map.spikeleveltop >= 8) map.spikeleveltop = 8;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (map.spikeleveltop > 0) map.spikeleveltop--;
|
||
|
}
|
||
|
|
||
|
if (obj.entities[player].yp - map.ypos >= 164)
|
||
|
{
|
||
|
map.spikelevelbottom++;
|
||
|
if (map.spikelevelbottom >= 8) map.spikelevelbottom = 8;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (map.spikelevelbottom > 0) map.spikelevelbottom--;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
//now! let's clean up removed entities
|
||
|
obj.cleanup();
|
||
|
|
||
|
//Looping around, room change conditions!
|
||
|
}
|
||
|
|
||
|
if (game.teleport_to_new_area) script.teleport(dwgfx, game, map, obj, help, music);
|
||
|
}
|
||
|
|
||
|
void gamelogic(Graphics& dwgfx, Game& game, entityclass& obj, musicclass& music, mapclass& map, UtilityClass& help)
|
||
|
{
|
||
|
//Misc
|
||
|
help.updateglow();
|
||
|
|
||
|
if (game.alarmon)
|
||
|
{
|
||
|
game.alarmdelay--;
|
||
|
if (game.alarmdelay <= 0)
|
||
|
{
|
||
|
music.playef(19);
|
||
|
game.alarmdelay = 20;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (obj.nearelephant)
|
||
|
{
|
||
|
obj.upset++;
|
||
|
if (obj.upset == 300)
|
||
|
{
|
||
|
obj.upsetmode = true;
|
||
|
//change player to sad
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].tile = 144;
|
||
|
music.playef(2, 10);
|
||
|
}
|
||
|
if (obj.upset > 301) obj.upset = 301;
|
||
|
}
|
||
|
else if (obj.upsetmode)
|
||
|
{
|
||
|
obj.upset--;
|
||
|
if (obj.upset <= 0)
|
||
|
{
|
||
|
obj.upset = 0;
|
||
|
obj.upsetmode = false;
|
||
|
//change player to happy
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].tile = 0;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.upset = 0;
|
||
|
}
|
||
|
|
||
|
game.lifesequence(obj);
|
||
|
|
||
|
|
||
|
if (game.deathseq != -1)
|
||
|
{
|
||
|
for (int i = 0; i < obj.nentity; i++)
|
||
|
{
|
||
|
if (game.roomx == 111 && game.roomy == 107)
|
||
|
{
|
||
|
if (obj.entities[i].type == 1)
|
||
|
{
|
||
|
if (obj.entities[i].xp < 152)
|
||
|
{
|
||
|
obj.entities[i].xp = 152;
|
||
|
obj.entities[i].newxp = 152;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (obj.entities[i].type == 2 && obj.entities[i].state == 3)
|
||
|
{
|
||
|
//Ok! super magical exception for the room with the intention death for the shiny trinket
|
||
|
//fix this when the maps are finalised
|
||
|
if (game.roomx != 111 && game.roomy != 107)
|
||
|
{
|
||
|
obj.entities[i].state = 4;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.entities[i].state = 4;
|
||
|
map.settile(18, 9, 59);
|
||
|
}
|
||
|
}
|
||
|
else if (obj.entities[i].type == 2 && obj.entities[i].state == 2)
|
||
|
{
|
||
|
//ok, unfortunate case where the disappearing platform hasn't fully disappeared. Accept a little
|
||
|
//graphical uglyness to avoid breaking the room!
|
||
|
while (obj.entities[i].state == 2) obj.updateentities(i, help, game, music);
|
||
|
obj.entities[i].state = 4;
|
||
|
}
|
||
|
else if (map.finalstretch && obj.entities[i].type == 2)
|
||
|
{
|
||
|
//TODO: }else if (map.finallevel && map.finalstretch && obj.entities[i].type == 2) {
|
||
|
//for the final level. probably something 99% of players won't see.
|
||
|
while (obj.entities[i].state == 2) obj.updateentities(i, help, game, music);
|
||
|
obj.entities[i].state = 4;
|
||
|
}
|
||
|
else if (obj.entities[i].type == 23 && game.swnmode && game.deathseq<15)
|
||
|
{
|
||
|
//if playing SWN, get the enemies offscreen.
|
||
|
obj.entities[i].xp += obj.entities[i].vx*5;
|
||
|
obj.entities[i].yp += obj.entities[i].vy*5;
|
||
|
}
|
||
|
}
|
||
|
if (game.swnmode)
|
||
|
{
|
||
|
//if playing SWN game a, push the clock back to the nearest 10 second interval
|
||
|
if (game.swngame == 0)
|
||
|
{
|
||
|
game.swnpenalty();
|
||
|
}
|
||
|
else if (game.swngame == 1)
|
||
|
{
|
||
|
game.swnstate = 0;
|
||
|
game.swnstate2 = 0;
|
||
|
game.swnstate3 = 0;
|
||
|
game.swnstate4 = 0;
|
||
|
game.swndelay = 0;
|
||
|
if (game.swntimer >= game.swnrecord)
|
||
|
{
|
||
|
if (game.swnmessage == 0) music.playef(25, 10);
|
||
|
game.swnmessage = 1;
|
||
|
game.swnrecord = game.swntimer;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
game.deathsequence(map, obj, music);
|
||
|
game.deathseq--;
|
||
|
if (game.deathseq <= 0)
|
||
|
{
|
||
|
if (game.nodeathmode)
|
||
|
{
|
||
|
game.deathseq = 1;
|
||
|
game.gethardestroom(map);
|
||
|
//start depressing sequence here...
|
||
|
if (game.gameoverdelay <= -10 && dwgfx.fademode==0) dwgfx.fademode = 2;
|
||
|
if (dwgfx.fademode == 1) script.resetgametomenu(dwgfx, game, map, obj, help, music);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (game.swnmode)
|
||
|
{
|
||
|
//if playing SWN game b, reset the clock
|
||
|
if (game.swngame == 1)
|
||
|
{
|
||
|
game.swntimer = 0;
|
||
|
game.swnmessage = 0;
|
||
|
game.swnrank = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
game.gethardestroom(map);
|
||
|
game.hascontrol = true;
|
||
|
|
||
|
|
||
|
game.gravitycontrol = game.savegc;
|
||
|
dwgfx.textboxremove();
|
||
|
map.resetplayer(dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//Update colour thingy
|
||
|
if (map.finalmode)
|
||
|
{
|
||
|
if (map.final_colormode)
|
||
|
{
|
||
|
if (map.final_colorframe > 0)
|
||
|
{
|
||
|
map.final_colorframedelay--;
|
||
|
if (map.final_colorframedelay <= 0)
|
||
|
{
|
||
|
if (map.final_colorframe == 1)
|
||
|
{
|
||
|
map.final_colorframedelay = 40;
|
||
|
temp = 1+int(fRandom() * 6);
|
||
|
if (temp == map.final_mapcol) temp = (temp + 1) % 6;
|
||
|
if (temp == 0) temp = 6;
|
||
|
map.changefinalcol(temp, obj,game);
|
||
|
}
|
||
|
else if (map.final_colorframe == 2)
|
||
|
{
|
||
|
map.final_colorframedelay = 15;
|
||
|
temp = 1+int(fRandom() * 6);
|
||
|
if (temp == map.final_mapcol) temp = (temp + 1) % 6;
|
||
|
if (temp == 0) temp = 6;
|
||
|
map.changefinalcol(temp, obj,game);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//State machine for game logic
|
||
|
game.updatestate(dwgfx, map, obj, help, music);
|
||
|
if (game.startscript)
|
||
|
{
|
||
|
script.load(game.newscript);
|
||
|
game.startscript = false;
|
||
|
}
|
||
|
|
||
|
//Intermission 1 Logic
|
||
|
//Player can't walk off a screen with SCM on it until they've left
|
||
|
if (game.supercrewmate)
|
||
|
{
|
||
|
if (game.roomx == 41 + game.scmprogress) //he's in the same room
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
if (obj.entities[i].ax > 0 && obj.entities[i].xp > 280)
|
||
|
{
|
||
|
obj.entities[i].ax = 0;
|
||
|
obj.entities[i].dir = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//SWN Minigame Logic
|
||
|
if (game.swnmode) //which game?
|
||
|
{
|
||
|
if(game.swngame==0) //intermission, survive 60 seconds game
|
||
|
{
|
||
|
game.swntimer -= 1;
|
||
|
if (game.swntimer <= 0)
|
||
|
{
|
||
|
music.niceplay(8);
|
||
|
game.swngame = 5;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.generateswnwave(game, help, 0);
|
||
|
}
|
||
|
}
|
||
|
else if(game.swngame==1) //super gravitron game
|
||
|
{
|
||
|
game.swntimer += 1;
|
||
|
if (game.swntimer > game.swnrecord) game.swnrecord = game.swntimer;
|
||
|
|
||
|
if (game.swntimer >= 150 && game.swnrank == 0)
|
||
|
{
|
||
|
game.swnrank = 1;
|
||
|
if (game.swnbestrank < 1)
|
||
|
{
|
||
|
NETWORK_unlockAchievement("vvvvvvsupgrav5");
|
||
|
game.swnbestrank = 1;
|
||
|
game.swnmessage = 2+30;
|
||
|
music.playef(26, 10);
|
||
|
}
|
||
|
}
|
||
|
else if (game.swntimer >= 300 && game.swnrank == 1)
|
||
|
{
|
||
|
game.swnrank = 2;
|
||
|
if (game.swnbestrank < 2)
|
||
|
{
|
||
|
NETWORK_unlockAchievement("vvvvvvsupgrav10");
|
||
|
game.swnbestrank = 2;
|
||
|
game.swnmessage = 2+30;
|
||
|
music.playef(26, 10);
|
||
|
}
|
||
|
}
|
||
|
else if (game.swntimer >= 450 && game.swnrank == 2)
|
||
|
{
|
||
|
game.swnrank = 3;
|
||
|
if (game.swnbestrank < 3)
|
||
|
{
|
||
|
NETWORK_unlockAchievement("vvvvvvsupgrav15");
|
||
|
game.swnbestrank = 3;
|
||
|
game.swnmessage = 2+30;
|
||
|
music.playef(26, 10);
|
||
|
}
|
||
|
}
|
||
|
else if (game.swntimer >= 600 && game.swnrank == 3)
|
||
|
{
|
||
|
game.swnrank = 4;
|
||
|
if (game.swnbestrank < 4)
|
||
|
{
|
||
|
NETWORK_unlockAchievement("vvvvvvsupgrav20");
|
||
|
game.swnbestrank = 4;
|
||
|
game.swnmessage = 2+30;
|
||
|
music.playef(26, 10);
|
||
|
}
|
||
|
}
|
||
|
else if (game.swntimer >= 900 && game.swnrank == 4)
|
||
|
{
|
||
|
game.swnrank = 5;
|
||
|
if (game.swnbestrank < 5)
|
||
|
{
|
||
|
NETWORK_unlockAchievement("vvvvvvsupgrav30");
|
||
|
game.swnbestrank = 5;
|
||
|
game.swnmessage = 2+30;
|
||
|
music.playef(26, 10);
|
||
|
}
|
||
|
}
|
||
|
else if (game.swntimer >= 1800 && game.swnrank == 5)
|
||
|
{
|
||
|
game.swnrank = 6;
|
||
|
if (game.swnbestrank < 6)
|
||
|
{
|
||
|
NETWORK_unlockAchievement("vvvvvvsupgrav60");
|
||
|
game.swnbestrank = 6;
|
||
|
game.swnmessage = 2+30;
|
||
|
music.playef(26, 10);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
obj.generateswnwave(game, help, 1);
|
||
|
|
||
|
game.swncoldelay--;
|
||
|
if(game.swncoldelay<=0)
|
||
|
{
|
||
|
game.swncolstate = (game.swncolstate+1)%6;
|
||
|
game.swncoldelay = 30;
|
||
|
dwgfx.rcol = game.swncolstate;
|
||
|
obj.swnenemiescol(game.swncolstate);
|
||
|
}
|
||
|
}
|
||
|
else if (game.swngame == 2) //introduce game a
|
||
|
{
|
||
|
game.swndelay--;
|
||
|
if (game.swndelay <= 0)
|
||
|
{
|
||
|
game.swngame = 0;
|
||
|
game.swndelay = 0;
|
||
|
game.swntimer = (60 * 30) - 1;
|
||
|
//game.swntimer = 15;
|
||
|
}
|
||
|
}
|
||
|
else if (game.swngame == 3) //extend line
|
||
|
{
|
||
|
obj.entities[obj.getlineat(84 - 32)].w += 24;
|
||
|
if (obj.entities[obj.getlineat(84 - 32)].w > 332)
|
||
|
{
|
||
|
obj.entities[obj.getlineat(84 - 32)].w = 332;
|
||
|
game.swngame = 2;
|
||
|
}
|
||
|
}
|
||
|
else if (game.swngame == 4) //create top line
|
||
|
{
|
||
|
game.swngame = 3;
|
||
|
obj.createentity(game, -8, 84 - 32, 11, 8); // (horizontal gravity line)
|
||
|
music.niceplay(2);
|
||
|
game.swndeaths = game.deathcounts;
|
||
|
}
|
||
|
else if (game.swngame == 5) //remove line
|
||
|
{
|
||
|
obj.entities[obj.getlineat(148 + 32)].xp += 24;
|
||
|
if (obj.entities[obj.getlineat(148 + 32)].xp > 320)
|
||
|
{
|
||
|
obj.entities[obj.getlineat(148 + 32)].active = false;
|
||
|
game.swnmode = false;
|
||
|
game.swngame = 6;
|
||
|
}
|
||
|
}
|
||
|
else if (game.swngame == 6) //Init the super gravitron
|
||
|
{
|
||
|
game.swngame = 7;
|
||
|
music.niceplay(3);
|
||
|
}
|
||
|
else if (game.swngame == 7) //introduce game b
|
||
|
{
|
||
|
game.swndelay--;
|
||
|
if (game.swndelay <= 0)
|
||
|
{
|
||
|
game.swngame = 1;
|
||
|
game.swndelay = 0;
|
||
|
game.swntimer = 0;
|
||
|
game.swncolstate = 3;
|
||
|
game.swncoldelay = 30;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Time trial stuff
|
||
|
if (game.intimetrial)
|
||
|
{
|
||
|
|
||
|
if (game.timetrialcountdown > 0)
|
||
|
{
|
||
|
game.timetrialparlost = false;
|
||
|
game.hascontrol = true;
|
||
|
game.timetrialcountdown--;
|
||
|
if (game.timetrialcountdown > 30)
|
||
|
{
|
||
|
game.hascontrol = false;
|
||
|
}
|
||
|
if(game.timetrialcountdown == 120) music.playef(21, 10);
|
||
|
if(game.timetrialcountdown == 90) music.playef(21, 10);
|
||
|
if(game.timetrialcountdown == 60) music.playef(21, 10);
|
||
|
if (game.timetrialcountdown == 30)
|
||
|
{
|
||
|
switch(game.timetriallevel)
|
||
|
{
|
||
|
case 0:
|
||
|
music.play(1);
|
||
|
break;
|
||
|
case 1:
|
||
|
music.play(3);
|
||
|
break;
|
||
|
case 2:
|
||
|
music.play(2);
|
||
|
break;
|
||
|
case 3:
|
||
|
music.play(1);
|
||
|
break;
|
||
|
case 4:
|
||
|
music.play(12);
|
||
|
break;
|
||
|
case 5:
|
||
|
music.play(15);
|
||
|
break;
|
||
|
}
|
||
|
music.playef(22, 10);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Have we lost the par?
|
||
|
if (!game.timetrialparlost)
|
||
|
{
|
||
|
if ((game.minutes * 60) + game.seconds > game.timetrialpar)
|
||
|
{
|
||
|
game.timetrialparlost = true;
|
||
|
int i = obj.getplayer();
|
||
|
if (i > -1)
|
||
|
{
|
||
|
obj.entities[i].tile = 144;
|
||
|
}
|
||
|
music.playef(2, 10);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Update entities
|
||
|
//Ok, moving platform fuckers
|
||
|
if(!game.completestop)
|
||
|
{
|
||
|
if(obj.vertplatforms)
|
||
|
{
|
||
|
for (int i = obj.nentity - 1; i >= 0; i--)
|
||
|
{
|
||
|
if (obj.entities[i].isplatform)
|
||
|
{
|
||
|
if(abs(obj.entities[i].vx) < 0.000001f)
|
||
|
{
|
||
|
obj.removeblockat(obj.entities[i].xp, obj.entities[i].yp);
|
||
|
|
||
|
obj.updateentities(i, help, game, music); // Behavioral logic
|
||
|
obj.updateentitylogic(i, game); // Basic Physics
|
||
|
obj.entitymapcollision(i, map); // Collisions with walls
|
||
|
|
||
|
obj.createblock(0, obj.entities[i].xp, obj.entities[i].yp, obj.entities[i].w, obj.entities[i].h);
|
||
|
if (game.supercrewmate)
|
||
|
{
|
||
|
obj.movingplatformfix(i, map);
|
||
|
obj.scmmovingplatformfix(i, map);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.movingplatformfix(i, map);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(obj.horplatforms)
|
||
|
{
|
||
|
for (int ie = obj.nentity - 1; ie >= 0; ie--)
|
||
|
{
|
||
|
if (obj.entities[ie].isplatform)
|
||
|
{
|
||
|
if(abs(obj.entities[ie].vy) < 0.000001f)
|
||
|
{
|
||
|
obj.removeblockat(obj.entities[ie].xp, obj.entities[ie].yp);
|
||
|
|
||
|
obj.updateentities(ie, help, game, music); // Behavioral logic
|
||
|
obj.updateentitylogic(ie, game); // Basic Physics
|
||
|
obj.entitymapcollision(ie, map); // Collisions with walls
|
||
|
|
||
|
obj.hormovingplatformfix(ie, map);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//is the player standing on a moving platform?
|
||
|
int i = obj.getplayer();
|
||
|
float j = obj.entitycollideplatformfloor(map, i);
|
||
|
if (j > -1000)
|
||
|
{
|
||
|
obj.entities[i].newxp = obj.entities[i].xp + j;
|
||
|
obj.entitymapcollision(i, map);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
j = obj.entitycollideplatformroof(map, i);
|
||
|
if (j > -1000)
|
||
|
{
|
||
|
obj.entities[i].newxp = obj.entities[i].xp + j;
|
||
|
obj.entitymapcollision(i, map);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (int ie = obj.nentity - 1; ie >= 0; ie--)
|
||
|
{
|
||
|
if (!obj.entities[ie].isplatform)
|
||
|
{
|
||
|
obj.updateentities(ie, help, game, music); // Behavioral logic
|
||
|
obj.updateentitylogic(ie, game); // Basic Physics
|
||
|
obj.entitymapcollision(ie, map); // Collisions with walls
|
||
|
}
|
||
|
}
|
||
|
|
||
|
obj.entitycollisioncheck(dwgfx, game, map, music); // Check ent v ent collisions, update states
|
||
|
}
|
||
|
|
||
|
//now! let's clean up removed entities
|
||
|
obj.cleanup();
|
||
|
|
||
|
//Using warplines?
|
||
|
if (obj.customwarpmode) {
|
||
|
//Rewritten system for mobile update: basically, the new logic is to
|
||
|
//check if the player is leaving the map, and if so do a special check against
|
||
|
//warp lines for collision
|
||
|
obj.customwarpmodehon = false;
|
||
|
obj.customwarpmodevon = false;
|
||
|
|
||
|
int i = obj.getplayer();
|
||
|
if ((game.door_down > -2 && obj.entities[i].yp >= 226-16) || (game.door_up > -2 && obj.entities[i].yp < -2+16) || (game.door_left > -2 && obj.entities[i].xp < -14+16) || (game.door_right > -2 && obj.entities[i].xp >= 308-16)){
|
||
|
//Player is leaving room
|
||
|
obj.customwarplinecheck(i);
|
||
|
}
|
||
|
|
||
|
if(obj.customwarpmodehon){ map.warpy=true;
|
||
|
}else{ map.warpy=false; }
|
||
|
if(obj.customwarpmodevon){ map.warpx=true;
|
||
|
}else{ map.warpx=false; }
|
||
|
}
|
||
|
|
||
|
//Finally: Are we changing room?
|
||
|
if (map.warpx && map.warpy)
|
||
|
{
|
||
|
for (int i = 0; i < obj.nentity; i++)
|
||
|
{
|
||
|
if(obj.entities[i].type<50){ //Don't warp warp lines
|
||
|
if (obj.entities[i].size < 12) //Don't wrap SWN enemies
|
||
|
{
|
||
|
if (obj.entities[i].xp <= -10)
|
||
|
{
|
||
|
obj.entities[i].xp += 320;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].xp > 310)
|
||
|
{
|
||
|
obj.entities[i].xp -= 320;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (int i = 0; i < obj.nentity; i++)
|
||
|
{
|
||
|
|
||
|
if(obj.entities[i].type<50){ //Don't warp warp lines
|
||
|
if (obj.entities[i].size < 12) //Don't wrap SWN enemies
|
||
|
{
|
||
|
if (obj.entities[i].yp <= -12)
|
||
|
{
|
||
|
obj.entities[i].yp += 232;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].yp > 226)
|
||
|
{
|
||
|
obj.entities[i].yp -= 232;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (map.warpx)
|
||
|
{
|
||
|
for (int i = 0; i < obj.nentity; i++)
|
||
|
{
|
||
|
if(obj.entities[i].type<50){ //Don't warp warp lines
|
||
|
if (obj.entities[i].size < 12) //Don't wrap SWN enemies
|
||
|
{
|
||
|
if (game.roomx == 118 && game.roomy == 102 && obj.entities[i].rule==1 && !map.custommode)
|
||
|
{
|
||
|
//ascii snakes
|
||
|
if (obj.entities[i].xp <= -80)
|
||
|
{
|
||
|
obj.entities[i].xp += 400;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].xp > 320)
|
||
|
{
|
||
|
obj.entities[i].xp -= 400;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].xp <= -10)
|
||
|
{
|
||
|
obj.entities[i].xp += 320;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].xp > 310)
|
||
|
{
|
||
|
obj.entities[i].xp -= 320;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int player = obj.getplayer();
|
||
|
if (game.door_down > -2 && obj.entities[player].yp >= 238)
|
||
|
{
|
||
|
obj.entities[player].yp -= 240;
|
||
|
map.gotoroom(game.roomx, game.roomy + 1, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.door_up > -2 && obj.entities[player].yp < -2)
|
||
|
{
|
||
|
obj.entities[player].yp += 240;
|
||
|
map.gotoroom(game.roomx, game.roomy - 1, dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
else if (map.warpy)
|
||
|
{
|
||
|
for (int i = 0; i < obj.nentity; i++)
|
||
|
{
|
||
|
if(obj.entities[i].type<50){ //Don't warp warp lines
|
||
|
if (obj.entities[i].yp <= -12)
|
||
|
{
|
||
|
obj.entities[i].yp += 232;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].yp > 226)
|
||
|
{
|
||
|
obj.entities[i].yp -= 232;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (int i = 0; i < obj.nentity; i++)
|
||
|
{
|
||
|
|
||
|
if(obj.entities[i].type<50){ //Don't warp warp lines
|
||
|
if(obj.entities[i].rule!=0)
|
||
|
{
|
||
|
if (obj.entities[i].xp <= -30)
|
||
|
{
|
||
|
obj.entities[i].xp += 350;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (obj.entities[i].xp > 320)
|
||
|
{
|
||
|
obj.entities[i].xp -= 350;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int player = obj.getplayer();
|
||
|
if (game.door_left > -2 && obj.entities[player].xp < -14)
|
||
|
{
|
||
|
obj.entities[player].xp += 320;
|
||
|
map.gotoroom(game.roomx - 1, game.roomy, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.door_right > -2 && obj.entities[player].xp >= 308)
|
||
|
{
|
||
|
obj.entities[player].xp -= 320;
|
||
|
map.gotoroom(game.roomx + 1, game.roomy, dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//Normal! Just change room
|
||
|
int player = obj.getplayer();
|
||
|
if (game.door_down > -2 && obj.entities[player].yp >= 238)
|
||
|
{
|
||
|
obj.entities[player].yp -= 240;
|
||
|
map.gotoroom(game.roomx, game.roomy + 1, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.door_up > -2 && obj.entities[player].yp < -2)
|
||
|
{
|
||
|
obj.entities[player].yp += 240;
|
||
|
map.gotoroom(game.roomx, game.roomy - 1, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.door_left > -2 && obj.entities[player].xp < -14)
|
||
|
{
|
||
|
obj.entities[player].xp += 320;
|
||
|
map.gotoroom(game.roomx - 1, game.roomy, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.door_right > -2 && obj.entities[player].xp >= 308)
|
||
|
{
|
||
|
obj.entities[player].xp -= 320;
|
||
|
map.gotoroom(game.roomx + 1, game.roomy, dwgfx, game, obj, music);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Warp tokens
|
||
|
if (map.custommode){
|
||
|
if (game.teleport)
|
||
|
{
|
||
|
int edi=obj.entities[game.edteleportent].behave;
|
||
|
int edj=obj.entities[game.edteleportent].para;
|
||
|
int edi2, edj2;
|
||
|
edi2 = (edi-(edi%40))/40;
|
||
|
edj2 = (edj-(edj%30))/30;
|
||
|
|
||
|
map.warpto(100+edi2, 100+edj2, obj.getplayer(), edi%40, (edj%30)+2, dwgfx, game, obj, music);
|
||
|
game.teleport = false;
|
||
|
|
||
|
if (game.teleport == false)
|
||
|
{
|
||
|
game.flashlight = 6;
|
||
|
game.screenshake = 25;
|
||
|
}
|
||
|
}
|
||
|
}else{
|
||
|
if (game.teleport)
|
||
|
{
|
||
|
if (game.roomx == 117 && game.roomy == 102)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].yp = 225;
|
||
|
map.gotoroom(119, 100, dwgfx, game, obj, music);
|
||
|
game.teleport = false;
|
||
|
}
|
||
|
else if (game.roomx == 119 && game.roomy == 100)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].yp = 225;
|
||
|
map.gotoroom(119, 103, dwgfx, game, obj, music);
|
||
|
game.teleport = false;
|
||
|
}
|
||
|
else if (game.roomx == 119 && game.roomy == 103)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].xp = 0;
|
||
|
map.gotoroom(116, 103, dwgfx, game, obj, music);
|
||
|
game.teleport = false;
|
||
|
}
|
||
|
else if (game.roomx == 116 && game.roomy == 103)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].yp = 225;
|
||
|
map.gotoroom(116, 100, dwgfx, game, obj, music);
|
||
|
game.teleport = false;
|
||
|
}
|
||
|
else if (game.roomx == 116 && game.roomy == 100)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].xp = 0;
|
||
|
map.gotoroom(114, 102, dwgfx, game, obj, music);
|
||
|
game.teleport = false;
|
||
|
}
|
||
|
else if (game.roomx == 114 && game.roomy == 102)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
obj.entities[i].yp = 225;
|
||
|
map.gotoroom(113, 100, dwgfx, game, obj, music);
|
||
|
game.teleport = false;
|
||
|
}
|
||
|
else if (game.roomx == 116 && game.roomy == 104)
|
||
|
{
|
||
|
//pre warp zone here
|
||
|
map.warpto(107, 101, obj.getplayer(), 14, 16, dwgfx, game, obj, music);
|
||
|
}
|
||
|
else if (game.roomx == 107 && game.roomy == 101)
|
||
|
{
|
||
|
map.warpto(105, 119, obj.getplayer(), 5, 26, dwgfx, game, obj, music);
|
||
|
}
|
||
|
else if (game.roomx == 105 && game.roomy == 118)
|
||
|
{
|
||
|
map.warpto(101, 111, obj.getplayer(), 34, 6, dwgfx, game, obj, music);
|
||
|
}
|
||
|
else if (game.roomx == 101 && game.roomy == 111)
|
||
|
{
|
||
|
//There are lots of warp tokens in this room, so we have to distinguish!
|
||
|
switch(game.teleportxpos)
|
||
|
{
|
||
|
case 1:
|
||
|
map.warpto(108, 108, obj.getplayer(), 4, 27, dwgfx, game, obj, music);
|
||
|
break;
|
||
|
case 2:
|
||
|
map.warpto(101, 111, obj.getplayer(), 12, 27, dwgfx, game, obj, music);
|
||
|
break;
|
||
|
case 3:
|
||
|
map.warpto(119, 111, obj.getplayer(), 31, 7, dwgfx, game, obj, music);
|
||
|
break;
|
||
|
case 4:
|
||
|
map.warpto(114, 117, obj.getplayer(), 19, 16, dwgfx, game, obj, music);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else if (game.roomx == 108 && game.roomy == 106)
|
||
|
{
|
||
|
map.warpto(119, 111, obj.getplayer(), 4, 27, dwgfx, game, obj, music);
|
||
|
}
|
||
|
else if (game.roomx == 100 && game.roomy == 111)
|
||
|
{
|
||
|
map.warpto(101, 111, obj.getplayer(), 24, 6, dwgfx, game, obj, music);
|
||
|
}
|
||
|
else if (game.roomx == 119 && game.roomy == 107)
|
||
|
{
|
||
|
//Secret lab, to super gravitron
|
||
|
map.warpto(119, 108, obj.getplayer(), 19, 10, dwgfx, game, obj, music);
|
||
|
}
|
||
|
if (game.teleport == false)
|
||
|
{
|
||
|
game.flashlight = 6;
|
||
|
game.screenshake = 25;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
int j;
|
||
|
if (game.roomchange)
|
||
|
{
|
||
|
//We've changed room? Let's bring our companion along!
|
||
|
game.roomchange = false;
|
||
|
if (game.companion > 0)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
//ok, we'll presume our companion has been destroyed in the room change. So:
|
||
|
switch(game.companion)
|
||
|
{
|
||
|
case 6:
|
||
|
obj.createentity(game, obj.entities[i].xp, 121.0f, 15.0f,1); //Y=121, the floor in that particular place!
|
||
|
j = obj.getcompanion(6);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
break;
|
||
|
case 7:
|
||
|
if (game.roomy <= 105) //don't jump after him!
|
||
|
{
|
||
|
if (game.roomx == 110)
|
||
|
{
|
||
|
obj.createentity(game, 320, 86, 16, 1); //Y=86, the ROOF in that particular place!
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.createentity(game, obj.entities[i].xp, 86.0f, 16.0f, 1); //Y=86, the ROOF in that particular place!
|
||
|
}
|
||
|
j = obj.getcompanion(7);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
}
|
||
|
break;
|
||
|
case 8:
|
||
|
if (game.roomy >= 104) //don't jump after him!
|
||
|
{
|
||
|
if (game.roomx == 102)
|
||
|
{
|
||
|
obj.createentity(game, 310, 177, 17, 1);
|
||
|
j = obj.getcompanion(8);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.createentity(game, obj.entities[i].xp, 177.0f, 17.0f, 1);
|
||
|
j = obj.getcompanion(8);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 9:
|
||
|
if (!map.towermode) //don't go back into the tower!
|
||
|
{
|
||
|
if (game.roomx == 110 && obj.entities[i].xp<20)
|
||
|
{
|
||
|
obj.createentity(game, 100, 185, 18, 15, 0, 1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.createentity(game, obj.entities[i].xp, 185.0f, 18.0f, 15, 0, 1);
|
||
|
}
|
||
|
j = obj.getcompanion(9);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
}
|
||
|
break;
|
||
|
case 10:
|
||
|
//intermission 2, choose colour based on lastsaved
|
||
|
if (game.roomy == 51)
|
||
|
{
|
||
|
if (obj.flags[59] == 0)
|
||
|
{
|
||
|
obj.createentity(game, 225.0f, 169.0f, 18, dwgfx.crewcolour(game.lastsaved), 0, 10);
|
||
|
j = obj.getcompanion(10);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
}
|
||
|
}
|
||
|
else if (game.roomy >= 52)
|
||
|
{
|
||
|
if (obj.flags[59] == 1)
|
||
|
{
|
||
|
obj.createentity(game, 160.0f, 177.0f, 18, dwgfx.crewcolour(game.lastsaved), 0, 18, 1);
|
||
|
j = obj.getcompanion(10);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.flags[59] = 1;
|
||
|
obj.createentity(game, obj.entities[i].xp, -20.0f, 18.0f, dwgfx.crewcolour(game.lastsaved), 0, 10, 0);
|
||
|
j = obj.getcompanion(10);
|
||
|
obj.entities[j].vx = obj.entities[i].vx;
|
||
|
obj.entities[j].dir = obj.entities[i].dir;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 11:
|
||
|
//Intermission 1: We're using the SuperCrewMate instead!
|
||
|
//obj.createentity(game, obj.entities[i].xp, obj.entities[i].yp, 24, dwgfx.crewcolour(game.lastsaved));
|
||
|
if(game.roomx-41==game.scmprogress)
|
||
|
{
|
||
|
switch(game.scmprogress)
|
||
|
{
|
||
|
case 0:
|
||
|
obj.createentity(game, 76, 161, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 1:
|
||
|
obj.createentity(game, 10, 169, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 2:
|
||
|
obj.createentity(game, 10, 177, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 3:
|
||
|
if (game.scmmoveme)
|
||
|
{
|
||
|
obj.createentity(game, obj.entities[obj.getplayer()].xp, 185, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
game.scmmoveme = false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj.createentity(game, 10, 177, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
}
|
||
|
break;
|
||
|
case 4:
|
||
|
obj.createentity(game, 10, 185, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 5:
|
||
|
obj.createentity(game, 10, 185, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 6:
|
||
|
obj.createentity(game, 10, 185, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 7:
|
||
|
obj.createentity(game, 10, 41, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 8:
|
||
|
obj.createentity(game, 10, 169, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 9:
|
||
|
obj.createentity(game, 10, 169, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 10:
|
||
|
obj.createentity(game, 10, 129, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 11:
|
||
|
obj.createentity(game, 10, 129, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 12:
|
||
|
obj.createentity(game, 10, 65, 24, dwgfx.crewcolour(game.lastsaved), 2);
|
||
|
break;
|
||
|
case 13:
|
||
|
obj.createentity(game, 10, 177, 24, dwgfx.crewcolour(game.lastsaved));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (game.scmmoveme)
|
||
|
{
|
||
|
obj.entities[obj.getscm()].xp = obj.entities[obj.getplayer()].xp;
|
||
|
game.scmmoveme = false;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
game.activeactivity = obj.checkactivity();
|
||
|
|
||
|
if (game.activetele)
|
||
|
{
|
||
|
int i = obj.getplayer();
|
||
|
obj.settemprect(i);
|
||
|
if (help.intersects(game.teleblock, obj.temprect))
|
||
|
{
|
||
|
game.readytotele += 25;
|
||
|
if (game.readytotele >= 255) game.readytotele = 255;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
game.readytotele -= 50;
|
||
|
if (game.readytotele < 0) game.readytotele = 0;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (game.readytotele > 0)
|
||
|
{
|
||
|
game.readytotele -= 50;
|
||
|
if (game.readytotele < 0) game.readytotele = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (game.teleport_to_new_area)
|
||
|
script.teleport(dwgfx, game, map, obj, help, music);
|
||
|
}
|