refactor: add game listener

This commit is contained in:
2021-12-13 19:45:01 +01:00
parent 61166023df
commit 2148c0050c
6 changed files with 46 additions and 16 deletions

View File

@@ -12,11 +12,25 @@ enum class GameState : std::uint8_t {
Game, Game,
EndGame, EndGame,
Disconnected, Disconnected,
Closed
}; };
typedef std::map<std::uint8_t, Player> PlayerList; typedef std::map<std::uint8_t, Player> PlayerList;
class Game { class GameListener {
public:
virtual void OnPlayerJoin(PlayerID player) {}
virtual void OnPlayerLeave(PlayerID player) {}
virtual void OnGameStateUpdate(GameState newState) {}
virtual void OnGameBegin() {}
virtual void OnGameEnd() {}
virtual void OnGameClose() {}
};
typedef utils::ObjectNotifier<GameListener> GameNotifier;
class Game : public GameNotifier {
protected: protected:
World* m_World; World* m_World;
TeamList m_Teams = { Team{TeamColor::Red}, Team{TeamColor::Blue} }; TeamList m_Teams = { Team{TeamColor::Red}, Team{TeamColor::Blue} };

View File

@@ -125,8 +125,6 @@ class WorldListener {
public: public:
WorldListener() {} WorldListener() {}
virtual void OnGameEnd() {}
virtual void OnTowerAdd(TowerPtr tower) {} virtual void OnTowerAdd(TowerPtr tower) {}
virtual void OnTowerRemove(TowerPtr tower) {} virtual void OnTowerRemove(TowerPtr tower) {}
@@ -231,8 +229,6 @@ public:
virtual void OnArrowShot(MobPtr target, bool fire, Tower* shooter); virtual void OnArrowShot(MobPtr target, bool fire, Tower* shooter);
virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter); virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter);
virtual void OnGameEnd();
// MobListener // MobListener
virtual void OnMobDamage(Mob* target, float damage, Tower* source); virtual void OnMobDamage(Mob* target, float damage, Tower* source);

View File

@@ -9,7 +9,7 @@ namespace server {
class Server; class Server;
class ServerGame : public game::Game { class ServerGame : public game::Game, public game::GameListener {
private: private:
Server* m_Server; Server* m_Server;
ServerWorld m_ServerWorld; ServerWorld m_ServerWorld;
@@ -22,6 +22,13 @@ public:
virtual void tick(std::uint64_t delta); virtual void tick(std::uint64_t delta);
void startGame(); void startGame();
// GameListener
virtual void OnGameStateUpdate(game::GameState newState);
virtual void OnGameBegin();
virtual void OnGameEnd();
virtual void OnGameClose();
private: private:
void balanceTeams(); void balanceTeams();
void updateGoldMines(); void updateGoldMines();

View File

@@ -106,7 +106,7 @@ bool World::saveMap(const std::string& fileName) const {
} }
void World::tick(std::uint64_t delta) { void World::tick(std::uint64_t delta) {
if(m_Game->getGameState() != GameState::Game) return; if (m_Game->getGameState() != GameState::Game) return;
tickMobs(delta); tickMobs(delta);
for (TowerPtr tower : m_Towers) { for (TowerPtr tower : m_Towers) {
@@ -295,7 +295,7 @@ void World::OnExplosion(utils::shape::Circle explosion, float centerDamage, Towe
void World::OnMobCastleDamage(Mob* damager, TeamCastle* enemyCastle, float damage) { void World::OnMobCastleDamage(Mob* damager, TeamCastle* enemyCastle, float damage) {
enemyCastle->damage(damage); enemyCastle->damage(damage);
if (enemyCastle->getLife() <= 0) { if (enemyCastle->getLife() <= 0) {
getWorldNotifier().notifyListeners(&WorldListener::OnGameEnd); m_Game->notifyListeners(&GameListener::OnGameEnd);
} }
} }
@@ -306,10 +306,6 @@ void World::OnMobDamage(Mob* target, float damage, Tower* source) {
} }
} }
void World::OnGameEnd(){
m_Game->setGameState(GameState::EndGame);
}
Team& World::getRedTeam() { Team& World::getRedTeam() {
return m_Game->getRedTeam(); return m_Game->getRedTeam();
} }

View File

@@ -37,10 +37,8 @@ void Lobby::tick() {
return; return;
if (utils::getTime() - m_StartTimerTime >= LobbyWaitingTime) { if (utils::getTime() - m_StartTimerTime >= LobbyWaitingTime) {
protocol::UpdateGameStatePacket packet(game::GameState::Game); m_Server->getGame().notifyListeners(&game::GameListener::OnGameBegin);
m_Server->broadcastPacket(&packet);
m_GameStarted = true; m_GameStarted = true;
m_Server->lauchGame();
return; return;
} }

View File

@@ -5,7 +5,7 @@ namespace td {
namespace server { namespace server {
ServerGame::ServerGame(server::Server* server) : game::Game(&m_ServerWorld), m_Server(server), m_ServerWorld(server, this) { ServerGame::ServerGame(server::Server* server) : game::Game(&m_ServerWorld), m_Server(server), m_ServerWorld(server, this) {
bindListener(this);
} }
void ServerGame::tick(std::uint64_t delta) { void ServerGame::tick(std::uint64_t delta) {
@@ -70,5 +70,24 @@ void ServerGame::balanceTeams() {
} }
} }
void ServerGame::OnGameStateUpdate(game::GameState newState) {
setGameState(newState);
protocol::UpdateGameStatePacket packet(newState);
m_Server->broadcastPacket(&packet);
}
void ServerGame::OnGameEnd() {
notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::EndGame);
}
void ServerGame::OnGameClose() {
notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::Closed);
}
void ServerGame::OnGameBegin() {
notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::Game);
startGame();
}
} // namespace game } // namespace game
} // namespace td } // namespace td