Files
Tower-Defense/src/game/server/Lobby.cpp
2023-08-12 14:48:38 +02:00

89 lines
1.9 KiB
C++

#include "game/server/Lobby.h"
#include "game/server/Server.h"
#include "protocol/packets/UpdateLobbyTimePacket.h"
#include "misc/Time.h"
#ifdef NDEBUG
#define MIN_PLAYER_WAITING 2
#else
#define MIN_PLAYER_WAITING 1
#endif
namespace td {
namespace server {
/*static constexpr std::uint8_t timeNotifications[] = {
2 * 60, // 2 min
60 + 30, // 1 min 30 s
60, // 1 min
30, // 30 s
15, // 15 s
10, // 10 s
5, // 5 s
4, // 4 s
3, // 3 s
2, // 2 s
1, // 1 s
};*/
Lobby::Lobby(Server* server) : m_Server(server), m_Timer(1000, std::bind(&Lobby::SendTimeRemaining, this)) {
}
void Lobby::Tick() {
if (m_GameStarted || m_StartTime == 0)
return;
if (utils::GetTime() >= m_StartTime) {
m_Server->GetGame().NotifyListeners(&game::GameListener::OnGameBegin);
m_GameStarted = true;
return;
}
//m_Timer.Update();
}
void Lobby::SendTimeRemaining() {
protocol::UpdateLobbyTimePacket packet(m_StartTime);
m_Server->BroadcastPacket(&packet);
}
void Lobby::OnPlayerJoin(std::uint8_t playerID) {
if (m_GameStarted)
return;
utils::LOG("(Server) Player Joined Lobby !");
m_Players.push_back(playerID);
if (m_Players.size() == MIN_PLAYER_WAITING) { // start timer if a second player join the match
m_StartTime = utils::GetTime() + static_cast<std::uint64_t>(LobbyWaitingTime);
m_Timer.Reset();
SendTimeRemaining();
}
// notify player that just arrived
protocol::UpdateLobbyTimePacket packet(m_StartTime);
m_Server->GetConnexions().at(playerID).SendPacket(&packet);
}
void Lobby::OnPlayerLeave(std::uint8_t playerID) {
if (m_GameStarted)
return;
utils::LOG("(Server) Player Leaved Lobby !");
auto it = std::find(m_Players.begin(), m_Players.end(), playerID);
if (it == m_Players.end())
return;
m_Players.erase(it);
if (m_Players.size() == 1) {
m_StartTime = 0; // reset timer if there is only one player left
SendTimeRemaining();
}
}
} // namespace server
} // namespace td