bettola/srv/game/game.cpp

54 lines
1.6 KiB
C++

#include <algorithm>
#include "game.h"
#include "network/game_state_message.h"
#include "network/socket.h"
#include "network/message.h"
Player* Game::add_player(BettolaLib::Network::Socket* socket) {
_players.emplace_back(socket);
return &_players.back();
}
void Game::remove_player(unsigned int player_id) {
_players.erase(
std::remove_if(_players.begin(), _players.end(),
[player_id](const Player& player) {
/* this is a sh.t way to compare players. */
return player.get_id() == player_id;
}),
_players.end());
}
void Game::update_player_pos(unsigned int player_id, float x, float y) {
auto it = std::find_if(_players.begin(), _players.end(),
[player_id](const Player& player) {
return player.get_id() == player_id;
});
if(it != _players.end()) {
it->set_position(x, y);
}
}
void Game::broadcast_game_state(void) {
BettolaLib::Network::GameStateMessage msg;
msg.num_players = _players.size();
for(size_t i = 0; i < _players.size(); ++i) {
msg.players[i].player_id = _players[i].get_id();
msg.players[i].x = _players[i].get_x();
msg.players[i].y = _players[i].get_y();
}
BettolaLib::Network::MessageHeader header;
header.type = BettolaLib::Network::MessageType::GameState;
header.size = sizeof(msg);
for(const auto& player : _players) {
BettolaLib::Network::Socket& socket = player.get_socket();
socket.send(&header, sizeof(header));
socket.send(&msg, sizeof(msg));
}
}