From 2148c0050c5b71a482205fa291eca7166cb9940e Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Mon, 13 Dec 2021 19:45:01 +0100 Subject: [PATCH] refactor: add game listener --- include/game/BaseGame.h | 16 +++++++++++++++- include/game/World.h | 4 ---- include/game/server/ServerGame.h | 9 ++++++++- src/game/World.cpp | 8 ++------ src/game/server/Lobby.cpp | 4 +--- src/game/server/ServerGame.cpp | 21 ++++++++++++++++++++- 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/include/game/BaseGame.h b/include/game/BaseGame.h index a16d616..77042fe 100644 --- a/include/game/BaseGame.h +++ b/include/game/BaseGame.h @@ -12,11 +12,25 @@ enum class GameState : std::uint8_t { Game, EndGame, Disconnected, + Closed }; typedef std::map 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 GameNotifier; + +class Game : public GameNotifier { protected: World* m_World; TeamList m_Teams = { Team{TeamColor::Red}, Team{TeamColor::Blue} }; diff --git a/include/game/World.h b/include/game/World.h index 1ba38a8..9de0966 100644 --- a/include/game/World.h +++ b/include/game/World.h @@ -125,8 +125,6 @@ class WorldListener { public: WorldListener() {} - virtual void OnGameEnd() {} - virtual void OnTowerAdd(TowerPtr tower) {} virtual void OnTowerRemove(TowerPtr tower) {} @@ -231,8 +229,6 @@ public: virtual void OnArrowShot(MobPtr target, bool fire, Tower* shooter); virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter); - virtual void OnGameEnd(); - // MobListener virtual void OnMobDamage(Mob* target, float damage, Tower* source); diff --git a/include/game/server/ServerGame.h b/include/game/server/ServerGame.h index 72a5f7f..b53389c 100644 --- a/include/game/server/ServerGame.h +++ b/include/game/server/ServerGame.h @@ -9,7 +9,7 @@ namespace server { class Server; -class ServerGame : public game::Game { +class ServerGame : public game::Game, public game::GameListener { private: Server* m_Server; ServerWorld m_ServerWorld; @@ -22,6 +22,13 @@ public: virtual void tick(std::uint64_t delta); void startGame(); + + // GameListener + + virtual void OnGameStateUpdate(game::GameState newState); + virtual void OnGameBegin(); + virtual void OnGameEnd(); + virtual void OnGameClose(); private: void balanceTeams(); void updateGoldMines(); diff --git a/src/game/World.cpp b/src/game/World.cpp index a73829f..884e6f8 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -106,7 +106,7 @@ bool World::saveMap(const std::string& fileName) const { } void World::tick(std::uint64_t delta) { - if(m_Game->getGameState() != GameState::Game) return; + if (m_Game->getGameState() != GameState::Game) return; tickMobs(delta); 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) { enemyCastle->damage(damage); 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() { return m_Game->getRedTeam(); } diff --git a/src/game/server/Lobby.cpp b/src/game/server/Lobby.cpp index 31d0094..ecdc2b3 100644 --- a/src/game/server/Lobby.cpp +++ b/src/game/server/Lobby.cpp @@ -37,10 +37,8 @@ void Lobby::tick() { return; if (utils::getTime() - m_StartTimerTime >= LobbyWaitingTime) { - protocol::UpdateGameStatePacket packet(game::GameState::Game); - m_Server->broadcastPacket(&packet); + m_Server->getGame().notifyListeners(&game::GameListener::OnGameBegin); m_GameStarted = true; - m_Server->lauchGame(); return; } diff --git a/src/game/server/ServerGame.cpp b/src/game/server/ServerGame.cpp index 9f52a39..a393de4 100644 --- a/src/game/server/ServerGame.cpp +++ b/src/game/server/ServerGame.cpp @@ -5,7 +5,7 @@ namespace td { namespace server { 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) { @@ -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 td