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