Commit 28218a7d authored by alistert's avatar alistert

Slight simplification to game mode handling.

parent b03fa295
...@@ -210,7 +210,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) { ...@@ -210,7 +210,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) {
int ret; int ret;
// Networking // Networking
if (gameMode) { if (multiplayer) {
ret = game->step(ticks); ret = game->step(ticks);
...@@ -248,7 +248,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) { ...@@ -248,7 +248,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) {
if (controls.release(C_STATS)) { if (controls.release(C_STATS)) {
if (!gameMode) stats ^= S_SCREEN; if (!multiplayer) stats ^= S_SCREEN;
else stats = (stats + 1) & 3; else stats = (stats + 1) & 3;
} }
...@@ -281,7 +281,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) { ...@@ -281,7 +281,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) {
case 3: // Setup case 3: // Setup
if (!gameMode) { if (!multiplayer) {
if (setupMenu.setup() == E_QUIT) return E_QUIT; if (setupMenu.setup() == E_QUIT) return E_QUIT;
...@@ -302,7 +302,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) { ...@@ -302,7 +302,7 @@ int BaseLevel::loop (bool& menu, int& option, bool& message) {
} }
if (!gameMode) paused = message || menu; if (!multiplayer) paused = message || menu;
timeCalcs(); timeCalcs();
...@@ -319,7 +319,7 @@ void BaseLevel::addTimer () { ...@@ -319,7 +319,7 @@ void BaseLevel::addTimer () {
endTime += 2 * 60 * 1000; // 2 minutes. Is this right? endTime += 2 * 60 * 1000; // 2 minutes. Is this right?
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_PROP; buffer[0] = MTL_L_PROP;
buffer[1] = MT_L_PROP; buffer[1] = MT_L_PROP;
...@@ -344,7 +344,7 @@ void BaseLevel::setStage (LevelStage newStage) { ...@@ -344,7 +344,7 @@ void BaseLevel::setStage (LevelStage newStage) {
stage = newStage; stage = newStage;
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_STAGE; buffer[0] = MTL_L_STAGE;
buffer[1] = MT_L_STAGE; buffer[1] = MT_L_STAGE;
......
...@@ -76,9 +76,10 @@ class BaseLevel { ...@@ -76,9 +76,10 @@ class BaseLevel {
unsigned int endTime; unsigned int endTime;
float smoothfps; float smoothfps;
int items; int items;
bool multiplayer;
bool paused; bool paused;
LevelStage stage; LevelStage stage;
int stats; int stats;
int playScene (char* file); int playScene (char* file);
void timeCalcs (); void timeCalcs ();
......
...@@ -183,7 +183,7 @@ int Bonus::loadTiles (char *fileName) { ...@@ -183,7 +183,7 @@ int Bonus::loadTiles (char *fileName) {
} }
Bonus::Bonus (char * fileName, unsigned char diff) { Bonus::Bonus (char * fileName, unsigned char diff, bool multi) {
Anim* pAnims[BPANIMS]; Anim* pAnims[BPANIMS];
File *file; File *file;
...@@ -369,6 +369,9 @@ Bonus::Bonus (char * fileName, unsigned char diff) { ...@@ -369,6 +369,9 @@ Bonus::Bonus (char * fileName, unsigned char diff) {
panelBigFont->mapPalette(0, 32, 15, -16); panelBigFont->mapPalette(0, 32, 15, -16);
multiplayer = multi;
return; return;
} }
......
...@@ -73,7 +73,7 @@ class Bonus : public BaseLevel { ...@@ -73,7 +73,7 @@ class Bonus : public BaseLevel {
void draw (); void draw ();
public: public:
Bonus (char* fileName, unsigned char diff); Bonus (char* fileName, unsigned char diff, bool multi);
~Bonus (); ~Bonus ();
bool checkMask (fixed x, fixed y); bool checkMask (fixed x, fixed y);
......
...@@ -43,7 +43,7 @@ ClientGame::ClientGame (char* address) { ...@@ -43,7 +43,7 @@ ClientGame::ClientGame (char* address) {
unsigned char buffer[BUFFER_LENGTH]; unsigned char buffer[BUFFER_LENGTH];
unsigned int timeout; unsigned int timeout;
int count, ret; int count, ret;
GameModeType mode; GameModeType modeType;
sock = net->join(address); sock = net->join(address);
...@@ -111,13 +111,13 @@ ClientGame::ClientGame (char* address) { ...@@ -111,13 +111,13 @@ ClientGame::ClientGame (char* address) {
printf("Connected to server (version %d).\n", buffer[2]); printf("Connected to server (version %d).\n", buffer[2]);
// Copy game parameters // Copy game parameters
mode = GameModeType(buffer[3]); modeType = GameModeType(buffer[3]);
difficulty = buffer[4]; difficulty = buffer[4];
maxPlayers = buffer[5]; maxPlayers = buffer[5];
nPlayers = buffer[6]; nPlayers = buffer[6];
clientID = buffer[7]; clientID = buffer[7];
printf("Game mode %d, difficulty %d, %d of %d players.\n", mode, difficulty, nPlayers, maxPlayers); printf("Game mode %d, difficulty %d, %d of %d players.\n", modeType, difficulty, nPlayers, maxPlayers);
if (nPlayers > maxPlayers) { if (nPlayers > maxPlayers) {
...@@ -128,9 +128,9 @@ ClientGame::ClientGame (char* address) { ...@@ -128,9 +128,9 @@ ClientGame::ClientGame (char* address) {
} }
gameMode = createGameMode(mode); mode = createMode(modeType);
if (gameMode == NULL) { if (!mode) {
net->close(sock); net->close(sock);
...@@ -157,7 +157,7 @@ ClientGame::ClientGame (char* address) { ...@@ -157,7 +157,7 @@ ClientGame::ClientGame (char* address) {
if (file) delete file; if (file) delete file;
delete gameMode; delete mode;
throw ret; throw ret;
...@@ -187,7 +187,7 @@ ClientGame::ClientGame (char* address) { ...@@ -187,7 +187,7 @@ ClientGame::ClientGame (char* address) {
if (file) delete file; if (file) delete file;
delete gameMode; delete mode;
throw E_QUIT; throw E_QUIT;
...@@ -199,7 +199,7 @@ ClientGame::ClientGame (char* address) { ...@@ -199,7 +199,7 @@ ClientGame::ClientGame (char* address) {
if (file) delete file; if (file) delete file;
delete gameMode; delete mode;
throw E_UNUSED; throw E_UNUSED;
...@@ -216,7 +216,7 @@ ClientGame::ClientGame (char* address) { ...@@ -216,7 +216,7 @@ ClientGame::ClientGame (char* address) {
if (file) delete file; if (file) delete file;
delete gameMode; delete mode;
throw ret; throw ret;
...@@ -235,7 +235,7 @@ ClientGame::~ClientGame () { ...@@ -235,7 +235,7 @@ ClientGame::~ClientGame () {
if (file) delete file; if (file) delete file;
delete gameMode; delete mode;
return; return;
...@@ -524,7 +524,7 @@ void ClientGame::setCheckpoint (unsigned char gridX, unsigned char gridY) { ...@@ -524,7 +524,7 @@ void ClientGame::setCheckpoint (unsigned char gridX, unsigned char gridY) {
unsigned char buffer[MTL_G_CHECK]; unsigned char buffer[MTL_G_CHECK];
if (gameMode) { if (mode) {
buffer[0] = MTL_G_CHECK; buffer[0] = MTL_G_CHECK;
buffer[1] = MT_G_CHECK; buffer[1] = MT_G_CHECK;
......
...@@ -58,7 +58,7 @@ Game::Game (char *firstLevel, int gameDifficulty) { ...@@ -58,7 +58,7 @@ Game::Game (char *firstLevel, int gameDifficulty) {
difficulty = gameDifficulty; difficulty = gameDifficulty;
gameMode = NULL; mode = new SingleGameMode();
// Create the player // Create the player
nPlayers = 1; nPlayers = 1;
...@@ -82,6 +82,44 @@ Game::~Game () { ...@@ -82,6 +82,44 @@ Game::~Game () {
} }
GameMode* Game::createMode (GameModeType modeType) {
switch (modeType) {
case M_SINGLE:
return new SingleGameMode();
case M_COOP:
return new CoopGameMode();
case M_BATTLE:
return new BattleGameMode();
case M_TEAMBATTLE:
return new TeamBattleGameMode();
case M_RACE:
return new RaceGameMode();
}
return NULL;
}
GameMode* Game::getMode () {
return mode;
}
int Game::setLevel (char *fileName) { int Game::setLevel (char *fileName) {
if (levelFile) delete[] levelFile; if (levelFile) delete[] levelFile;
...@@ -98,11 +136,13 @@ int Game::play () { ...@@ -98,11 +136,13 @@ int Game::play () {
Planet* planet; Planet* planet;
Bonus* bonus; Bonus* bonus;
char* fileName; char* fileName;
bool multiplayer;
bool checkpoint; bool checkpoint;
int ret; int ret;
int planetId; int planetId;
multiplayer = (mode->getMode() != M_SINGLE);
checkpoint = false; checkpoint = false;
planetId = -1; planetId = -1;
...@@ -120,7 +160,7 @@ int Game::play () { ...@@ -120,7 +160,7 @@ int Game::play () {
try { try {
baseLevel = bonus = new Bonus(levelFile, difficulty); baseLevel = bonus = new Bonus(levelFile, difficulty, multiplayer);
} catch (int e) { } catch (int e) {
...@@ -155,7 +195,7 @@ int Game::play () { ...@@ -155,7 +195,7 @@ int Game::play () {
try { try {
baseLevel = jj2Level = new JJ2Level(levelFile, difficulty, checkpoint); baseLevel = jj2Level = new JJ2Level(levelFile, difficulty, checkpoint, multiplayer);
} catch (int e) { } catch (int e) {
...@@ -200,43 +240,47 @@ int Game::play () { ...@@ -200,43 +240,47 @@ int Game::play () {
try { try {
baseLevel = level = new Level(levelFile, difficulty, checkpoint); baseLevel = level = new Level(levelFile, difficulty, checkpoint, multiplayer);
} catch (int e) { } catch (int e) {
return e; return e;
} }
planet = NULL;
fileName = createFileName(F_PLANET, level->getWorld());
try { if (!multiplayer) {
planet = new Planet(fileName, planetId); planet = NULL;
fileName = createFileName(F_PLANET, level->getWorld());
} catch (int e) { try {
// Do nothing planet = new Planet(fileName, planetId);
} } catch (int e) {
delete[] fileName; // Do nothing
if (planet) { }
if (planet->play() == E_QUIT) { delete[] fileName;
delete planet; if (planet) {
delete level;
return E_QUIT; if (planet->play() == E_QUIT) {
} delete planet;
delete level;
return E_QUIT;
planetId = planet->getId(); }
delete planet; planetId = planet->getId();
delete planet;
}
} }
......
...@@ -86,17 +86,21 @@ class File; ...@@ -86,17 +86,21 @@ class File;
class Game { class Game {
protected: protected:
char *levelFile; GameMode* mode;
char* levelFile;
int difficulty; int difficulty;
unsigned int sendTime, checkTime; unsigned int sendTime, checkTime;
unsigned char checkX, checkY; unsigned char checkX, checkY;
Game (); Game ();
GameMode* createMode (GameModeType modeType);
public: public:
Game (char *firstLevel, int gameDifficulty); Game (char *firstLevel, int gameDifficulty);
virtual ~Game (); virtual ~Game ();
GameMode* getMode ();
virtual int setLevel (char *fileName); virtual int setLevel (char *fileName);
int play (); int play ();
void view (int change); void view (int change);
......
...@@ -62,6 +62,27 @@ void GameMode::outOfTime () { ...@@ -62,6 +62,27 @@ void GameMode::outOfTime () {
} }
GameModeType SingleGameMode::getMode () {
return M_SINGLE;
}
unsigned char SingleGameMode::chooseTeam () {
return 0;
}
void SingleGameMode::drawScore (Font* font) {
return;
}
unsigned char CooperativeGameMode::chooseTeam () { unsigned char CooperativeGameMode::chooseTeam () {
// All players are on the same team // All players are on the same team
...@@ -153,17 +174,6 @@ GameModeType CoopGameMode::getMode () { ...@@ -153,17 +174,6 @@ GameModeType CoopGameMode::getMode () {
} }
bool CoopGameMode::endOfLevel (Player *player, unsigned char gridX, unsigned char gridY) {
game->setCheckpoint(gridX, gridY);
baseLevel->setStage(LS_END);
return true;
}
GameModeType BattleGameMode::getMode () { GameModeType BattleGameMode::getMode () {
return M_BATTLE; return M_BATTLE;
...@@ -202,35 +212,3 @@ bool RaceGameMode::endOfLevel (Player *player, unsigned char gridX, unsigned cha ...@@ -202,35 +212,3 @@ bool RaceGameMode::endOfLevel (Player *player, unsigned char gridX, unsigned cha
} }
GameMode * createGameMode (GameModeType mode) {
switch (mode) {
case M_SINGLE:
return NULL;
case M_COOP:
return new CoopGameMode();
case M_BATTLE:
return new BattleGameMode();
case M_TEAMBATTLE:
return new TeamBattleGameMode();
case M_RACE:
return new RaceGameMode();
}
return NULL;
}
...@@ -59,6 +59,15 @@ class GameMode { ...@@ -59,6 +59,15 @@ class GameMode {
}; };
class SingleGameMode : public GameMode {
public:
GameModeType getMode ();
unsigned char chooseTeam ();
void drawScore (Font* font);
};
class CooperativeGameMode : public GameMode { class CooperativeGameMode : public GameMode {
public: public:
...@@ -86,8 +95,7 @@ class TeamGameMode : public GameMode { ...@@ -86,8 +95,7 @@ class TeamGameMode : public GameMode {
class CoopGameMode : public CooperativeGameMode { class CoopGameMode : public CooperativeGameMode {
public: public:
GameModeType getMode (); GameModeType getMode ();
bool endOfLevel (Player *player, unsigned char gridX, unsigned char gridY);
}; };
...@@ -123,16 +131,5 @@ class RaceGameMode : public FreeForAllGameMode { ...@@ -123,16 +131,5 @@ class RaceGameMode : public FreeForAllGameMode {
}; };
// Variable
EXTERN GameMode *gameMode; // NULL for single-player games
// Function
GameMode * createGameMode (GameModeType mode);
#endif #endif
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#include <string.h> #include <string.h>
ServerGame::ServerGame (GameModeType mode, char* firstLevel, int gameDifficulty) { ServerGame::ServerGame (GameModeType modeType, char* firstLevel, int gameDifficulty) {
int count; int count;
...@@ -77,7 +77,7 @@ ServerGame::ServerGame (GameModeType mode, char* firstLevel, int gameDifficulty) ...@@ -77,7 +77,7 @@ ServerGame::ServerGame (GameModeType mode, char* firstLevel, int gameDifficulty)
difficulty = gameDifficulty; difficulty = gameDifficulty;
gameMode = createGameMode(mode); mode = createMode(modeType);
return; return;
...@@ -98,7 +98,7 @@ ServerGame::~ServerGame () { ...@@ -98,7 +98,7 @@ ServerGame::~ServerGame () {
if (levelData) delete[] levelData; if (levelData) delete[] levelData;
delete gameMode; delete mode;
return; return;
...@@ -253,7 +253,7 @@ int ServerGame::step (unsigned int ticks) { ...@@ -253,7 +253,7 @@ int ServerGame::step (unsigned int ticks) {
// Set up the new player // Set up the new player
recvBuffers[count][4] = gameMode->chooseTeam(); recvBuffers[count][4] = mode->chooseTeam();
players[nPlayers].init((char *)(recvBuffers[count]) + 9, players[nPlayers].init((char *)(recvBuffers[count]) + 9,
recvBuffers[count] + 5, recvBuffers[count][4]); recvBuffers[count] + 5, recvBuffers[count][4]);
...@@ -339,7 +339,7 @@ int ServerGame::step (unsigned int ticks) { ...@@ -339,7 +339,7 @@ int ServerGame::step (unsigned int ticks) {
sendBuffer[0] = MTL_G_PROPS; sendBuffer[0] = MTL_G_PROPS;
sendBuffer[1] = MT_G_PROPS; sendBuffer[1] = MT_G_PROPS;
sendBuffer[2] = 1; // Server version sendBuffer[2] = 1; // Server version
sendBuffer[3] = gameMode->getMode(); sendBuffer[3] = mode->getMode();
sendBuffer[4] = difficulty; sendBuffer[4] = difficulty;
sendBuffer[5] = MAX_PLAYERS; sendBuffer[5] = MAX_PLAYERS;
sendBuffer[6] = nPlayers; // Number of players sendBuffer[6] = nPlayers; // Number of players
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
#include <string.h> #include <string.h>
JJ2Level::JJ2Level (char* fileName, unsigned char diff, bool checkpoint) { JJ2Level::JJ2Level (char* fileName, unsigned char diff, bool checkpoint, bool multi) {
int ret; int ret;
...@@ -56,6 +56,8 @@ JJ2Level::JJ2Level (char* fileName, unsigned char diff, bool checkpoint) { ...@@ -56,6 +56,8 @@ JJ2Level::JJ2Level (char* fileName, unsigned char diff, bool checkpoint) {
if (ret < 0) throw ret; if (ret < 0) throw ret;
multiplayer = multi;
return; return;
} }
...@@ -150,7 +152,7 @@ void JJ2Level::setNext (char* fileName) { ...@@ -150,7 +152,7 @@ void JJ2Level::setNext (char* fileName) {
delete[] nextLevel; delete[] nextLevel;
nextLevel = createString(fileName); nextLevel = createString(fileName);
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_PROP; buffer[0] = MTL_L_PROP;
buffer[1] = MT_L_PROP; buffer[1] = MT_L_PROP;
...@@ -173,7 +175,7 @@ void JJ2Level::setFrame (unsigned char gridX, unsigned char gridY, unsigned char ...@@ -173,7 +175,7 @@ void JJ2Level::setFrame (unsigned char gridX, unsigned char gridY, unsigned char
layer->setFrame(gridX, gridY, frame); layer->setFrame(gridX, gridY, frame);
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_GRID; buffer[0] = MTL_L_GRID;
buffer[1] = MT_L_GRID; buffer[1] = MT_L_GRID;
...@@ -220,7 +222,7 @@ void JJ2Level::setWaterLevel (unsigned char gridY, bool instant) { ...@@ -220,7 +222,7 @@ void JJ2Level::setWaterLevel (unsigned char gridY, bool instant) {
if (instant) waterLevel = waterLevelTarget - F8; if (instant) waterLevel = waterLevelTarget - F8;
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_PROP; buffer[0] = MTL_L_PROP;
buffer[1] = MT_L_PROP; buffer[1] = MT_L_PROP;
......
...@@ -129,7 +129,7 @@ class JJ2Level : public BaseLevel { ...@@ -129,7 +129,7 @@ class JJ2Level : public BaseLevel {
void draw (); void draw ();
public: public:
JJ2Level (char* fileName, unsigned char diff, bool checkpoint); JJ2Level (char* fileName, unsigned char diff, bool checkpoint, bool multi);
~JJ2Level (); ~JJ2Level ();
bool checkMaskDown (fixed x, fixed y, bool drop); bool checkMaskDown (fixed x, fixed y, bool drop);
......
...@@ -77,7 +77,7 @@ int JJ2Level::step () { ...@@ -77,7 +77,7 @@ int JJ2Level::step () {
if (players[x].getJJ2LevelPlayer()->reacted(ticks) == JJ2PR_KILLED) { if (players[x].getJJ2LevelPlayer()->reacted(ticks) == JJ2PR_KILLED) {
if (!gameMode) return LOST; if (!multiplayer) return LOST;
game->resetPlayer(players + x); game->resetPlayer(players + x);
...@@ -143,7 +143,7 @@ void JJ2Level::draw () { ...@@ -143,7 +143,7 @@ void JJ2Level::draw () {
// Show "panel" data // Show "panel" data
// Show score // Show score
if (gameMode) gameMode->drawScore(font); if (multiplayer) game->getMode()->drawScore(font);
else panelSmallFont->showNumber(localPlayer->getScore(), 64, 8); else panelSmallFont->showNumber(localPlayer->getScore(), 64, 8);
......
...@@ -753,7 +753,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -753,7 +753,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
// Generate player's animation set references // Generate player's animation set references
if (gameMode) { if (multiplayer) {
string = new char[MTL_P_ANIMS + 1]; string = new char[MTL_P_ANIMS + 1];
......
...@@ -44,8 +44,8 @@ DemoLevel::DemoLevel (const char* fileName) { ...@@ -44,8 +44,8 @@ DemoLevel::DemoLevel (const char* fileName) {
File* file; File* file;
char* levelFile; char* levelFile;
int lNum, wNum, diff, ret; int lNum, wNum, diff, ret;
gameMode = NULL; multiplayer = false;
try { try {
......
...@@ -1056,10 +1056,12 @@ void Event::drawEnergy (unsigned int ticks) { ...@@ -1056,10 +1056,12 @@ void Event::drawEnergy (unsigned int ticks) {
// Get the event properties // Get the event properties
set = level->getEvent(gridX, gridY); set = level->getEvent(gridX, gridY);
if (set[E_MODIFIER] != 8) { if (!set || set[E_MODIFIER] != 8) {
if (next) next->drawEnergy(ticks); if (next) next->drawEnergy(ticks);
return;
} else if (set[E_HITSTOKILL]) { } else if (set[E_HITSTOKILL]) {
......
...@@ -67,7 +67,7 @@ Level::Level () { ...@@ -67,7 +67,7 @@ Level::Level () {
} }
Level::Level (char* fileName, unsigned char diff, bool checkpoint) { Level::Level (char* fileName, unsigned char diff, bool checkpoint, bool multi) {
int ret; int ret;
...@@ -77,6 +77,8 @@ Level::Level (char* fileName, unsigned char diff, bool checkpoint) { ...@@ -77,6 +77,8 @@ Level::Level (char* fileName, unsigned char diff, bool checkpoint) {
if (ret < 0) throw ret; if (ret < 0) throw ret;
multiplayer = multi;
return; return;
} }
...@@ -193,7 +195,7 @@ void Level::setNext (int nextLevel, int nextWorld) { ...@@ -193,7 +195,7 @@ void Level::setNext (int nextLevel, int nextWorld) {
nextLevelNum = nextLevel; nextLevelNum = nextLevel;
nextWorldNum = nextWorld; nextWorldNum = nextWorld;
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_PROP; buffer[0] = MTL_L_PROP;
buffer[1] = MT_L_PROP; buffer[1] = MT_L_PROP;
...@@ -216,7 +218,7 @@ void Level::setTile (unsigned char gridX, unsigned char gridY, unsigned char til ...@@ -216,7 +218,7 @@ void Level::setTile (unsigned char gridX, unsigned char gridY, unsigned char til
grid[gridY][gridX].tile = tile; grid[gridY][gridX].tile = tile;
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_GRID; buffer[0] = MTL_L_GRID;
buffer[1] = MT_L_GRID; buffer[1] = MT_L_GRID;
...@@ -276,7 +278,7 @@ void Level::clearEvent (unsigned char gridX, unsigned char gridY) { ...@@ -276,7 +278,7 @@ void Level::clearEvent (unsigned char gridX, unsigned char gridY) {
grid[gridY][gridX].event = 0; grid[gridY][gridX].event = 0;
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_GRID; buffer[0] = MTL_L_GRID;
buffer[1] = MT_L_GRID; buffer[1] = MT_L_GRID;
...@@ -325,7 +327,7 @@ int Level::hitEvent (unsigned char gridX, unsigned char gridY, LevelPlayer* sour ...@@ -325,7 +327,7 @@ int Level::hitEvent (unsigned char gridX, unsigned char gridY, LevelPlayer* sour
} }
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_GRID; buffer[0] = MTL_L_GRID;
buffer[1] = MT_L_GRID; buffer[1] = MT_L_GRID;
...@@ -387,7 +389,7 @@ void Level::setWaterLevel (unsigned char gridY) { ...@@ -387,7 +389,7 @@ void Level::setWaterLevel (unsigned char gridY) {
waterLevelTarget = TTOF(gridY); waterLevelTarget = TTOF(gridY);
if (gameMode) { if (multiplayer) {
buffer[0] = MTL_L_PROP; buffer[0] = MTL_L_PROP;
buffer[1] = MT_L_PROP; buffer[1] = MT_L_PROP;
...@@ -444,7 +446,7 @@ int Level::playBonus () { ...@@ -444,7 +446,7 @@ int Level::playBonus () {
try { try {
baseLevel = bonus = new Bonus(bonusFile, difficulty); baseLevel = bonus = new Bonus(bonusFile, difficulty, multiplayer);
} catch (int e) { } catch (int e) {
...@@ -556,7 +558,7 @@ int Level::play () { ...@@ -556,7 +558,7 @@ int Level::play () {
// Check if level has been won // Check if level has been won
if (game && returnTime && (ticks > returnTime)) { if (game && returnTime && (ticks > returnTime)) {
if (!gameMode) { if (!multiplayer) {
// If the gem has been collected, play the bonus level // If the gem has been collected, play the bonus level
if (playBonus() == E_QUIT) return E_QUIT; if (playBonus() == E_QUIT) return E_QUIT;
......
...@@ -138,7 +138,7 @@ class Level : public BaseLevel { ...@@ -138,7 +138,7 @@ class Level : public BaseLevel {
EventPath path[PATHS]; EventPath path[PATHS];
Level (); Level ();
Level (char* fileName, unsigned char diff, bool checkpoint); Level (char* fileName, unsigned char diff, bool checkpoint, bool multi);
virtual ~Level (); virtual ~Level ();
bool checkMaskUp (fixed x, fixed y); bool checkMaskUp (fixed x, fixed y);
......
...@@ -138,12 +138,16 @@ int Level::step () { ...@@ -138,12 +138,16 @@ int Level::step () {
// Check if time has run out // Check if time has run out
if (ticks > endTime) { if (ticks > endTime) {
if (!gameMode) { if (multiplayer) {
game->getMode()->outOfTime();
} else {
if ((difficulty >= 2) && (stage == LS_NORMAL)) if ((difficulty >= 2) && (stage == LS_NORMAL))
localPlayer->getLevelPlayer()->kill(NULL, endTime); localPlayer->getLevelPlayer()->kill(NULL, endTime);
} else gameMode->outOfTime(); }
} }
...@@ -161,7 +165,7 @@ int Level::step () { ...@@ -161,7 +165,7 @@ int Level::step () {
if (players[x].getLevelPlayer()->reacted(ticks) == PR_KILLED) { if (players[x].getLevelPlayer()->reacted(ticks) == PR_KILLED) {
if (!gameMode) return LOST; if (!multiplayer) return LOST;
game->resetPlayer(players + x); game->resetPlayer(players + x);
...@@ -335,7 +339,7 @@ void Level::draw () { ...@@ -335,7 +339,7 @@ void Level::draw () {
// If this is a competitive game, draw the score // If this is a competitive game, draw the score
if (gameMode) gameMode->drawScore(font); if (multiplayer) game->getMode()->drawScore(font);
// Show panel // Show panel
......
...@@ -886,7 +886,7 @@ int Level::load (char* fileName, unsigned char diff, bool checkpoint) { ...@@ -886,7 +886,7 @@ int Level::load (char* fileName, unsigned char diff, bool checkpoint) {
delete[] buffer; delete[] buffer;
if (gameMode) { if (multiplayer) {
string[0] = MTL_P_ANIMS + PANIMS; string[0] = MTL_P_ANIMS + PANIMS;
string[1] = MT_P_ANIMS; string[1] = MT_P_ANIMS;
......
...@@ -217,7 +217,7 @@ bool JJ2LevelPlayer::hit (Player *source, unsigned int ticks) { ...@@ -217,7 +217,7 @@ bool JJ2LevelPlayer::hit (Player *source, unsigned int ticks) {
if (source && (source->getTeam() == player->team)) return false; if (source && (source->getTeam() == player->team)) return false;
if (!gameMode || gameMode->hit(source, player)) { if (game->getMode()->hit(source, player)) {
energy--; energy--;
...@@ -259,7 +259,7 @@ void JJ2LevelPlayer::kill (Player *source, unsigned int ticks) { ...@@ -259,7 +259,7 @@ void JJ2LevelPlayer::kill (Player *source, unsigned int ticks) {
if (reaction != JJ2PR_NONE) return; if (reaction != JJ2PR_NONE) return;
if (!gameMode || gameMode->kill(source, player)) { if (game->getMode()->kill(source, player)) {
energy = 0; energy = 0;
player->lives--; player->lives--;
......
...@@ -121,13 +121,7 @@ void JJ2LevelPlayer::modify (JJ2Modifier* nextMod, unsigned int ticks) { ...@@ -121,13 +121,7 @@ void JJ2LevelPlayer::modify (JJ2Modifier* nextMod, unsigned int ticks) {
if (!energy) return; if (!energy) return;
if (!gameMode) { if (!game->getMode()->endOfLevel(player, FTOT(x + PXO_MID), FTOT(y + PYO_MID))) return;
if (game) game->setCheckpoint(FTOT(x + PXO_MID), FTOT(y + PYO_MID));
jj2Level->setStage(LS_END);
} else if (!(gameMode->endOfLevel(player, FTOT(x + PXO_MID), FTOT(y + PYO_MID)))) return;
break; break;
...@@ -897,7 +891,7 @@ void JJ2LevelPlayer::draw (unsigned int ticks, int change) { ...@@ -897,7 +891,7 @@ void JJ2LevelPlayer::draw (unsigned int ticks, int change) {
// Show the player's name // Show the player's name
if (gameMode) if (nPlayers > 1)
panelBigFont->showString(player->name, panelBigFont->showString(player->name,
FTOI(drawX + PXO_MID) - (panelBigFont->getStringWidth(player->name) >> 1), FTOI(drawX + PXO_MID) - (panelBigFont->getStringWidth(player->name) >> 1),
FTOI(drawY - F32 - F16)); FTOI(drawY - F32 - F16));
......
...@@ -224,7 +224,7 @@ bool LevelPlayer::hit (Player *source, unsigned int ticks) { ...@@ -224,7 +224,7 @@ bool LevelPlayer::hit (Player *source, unsigned int ticks) {
if (shield == 3) shield = 0; if (shield == 3) shield = 0;
else if (shield) shield--; else if (shield) shield--;
else if (!gameMode || gameMode->hit(source, player)) { else if (game->getMode()->hit(source, player)) {
energy--; energy--;
...@@ -266,7 +266,7 @@ void LevelPlayer::kill (Player *source, unsigned int ticks) { ...@@ -266,7 +266,7 @@ void LevelPlayer::kill (Player *source, unsigned int ticks) {
if (reaction != PR_NONE) return; if (reaction != PR_NONE) return;
if (!gameMode || gameMode->kill(source, player)) { if (game->getMode()->kill(source, player)) {
energy = 0; energy = 0;
player->lives--; player->lives--;
...@@ -274,9 +274,9 @@ void LevelPlayer::kill (Player *source, unsigned int ticks) { ...@@ -274,9 +274,9 @@ void LevelPlayer::kill (Player *source, unsigned int ticks) {
reaction = PR_KILLED; reaction = PR_KILLED;
reactionTime = ticks + PRT_KILLED; reactionTime = ticks + PRT_KILLED;
} if (game->getMode()->getMode() == M_SINGLE) level->flash(0, 0, 0, T_END << 1);
if (!gameMode) level->flash(0, 0, 0, T_END << 1); }
return; return;
...@@ -372,13 +372,7 @@ bool LevelPlayer::takeEvent (unsigned char gridX, unsigned char gridY, unsigned ...@@ -372,13 +372,7 @@ bool LevelPlayer::takeEvent (unsigned char gridX, unsigned char gridY, unsigned
if (!energy) return false; if (!energy) return false;
if (!gameMode) { if (!game->getMode()->endOfLevel(player, gridX, gridY)) return false;
if (game) game->setCheckpoint(gridX, gridY);
level->setStage(LS_END);
} else if (!(gameMode->endOfLevel(player, gridX, gridY))) return false;
break; break;
......
...@@ -791,7 +791,7 @@ void LevelPlayer::draw (unsigned int ticks, int change) { ...@@ -791,7 +791,7 @@ void LevelPlayer::draw (unsigned int ticks, int change) {
// Show the player's name // Show the player's name
if (gameMode) if (nPlayers > 1)
panelBigFont->showString(player->name, panelBigFont->showString(player->name,
FTOI(drawX + PXO_MID) - (panelBigFont->getStringWidth(player->name) >> 1), FTOI(drawX + PXO_MID) - (panelBigFont->getStringWidth(player->name) >> 1),
FTOI(drawY - F32 - F16)); FTOI(drawY - F32 - F16));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment