Лобби: комнаты на сервере (C++) и UI на клиенте
Сервер: Lobby/Room/Player — create/join/leave/list_rooms, broadcast обновлений, проверка авторизации (hello) и состояния комнаты (waiting/full/in_progress). Клиент: полноценный UI лобби (создание, список, вход в комнату, выход), блокировка кнопок до установки WS-соединения. nginx: no-cache для JS/CSS (нет хеширования имён файлов).
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
#pragma once
|
||||
|
||||
#include <App.h>
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
struct PerSocketData {
|
||||
std::string player_id;
|
||||
std::string nickname;
|
||||
std::string room_id; // пусто, если игрок в лобби, а не в комнате
|
||||
};
|
||||
|
||||
using WS = uWS::WebSocket<false, true, PerSocketData>;
|
||||
|
||||
struct RoomPlayer {
|
||||
std::string player_id;
|
||||
std::string nickname;
|
||||
WS *ws;
|
||||
};
|
||||
|
||||
struct Room {
|
||||
std::string id;
|
||||
std::string mode; // "coop" | "pvp"
|
||||
std::string state = "waiting"; // waiting | playing | finished
|
||||
std::vector<RoomPlayer> players;
|
||||
};
|
||||
|
||||
// Лобби и реестр комнат (этап 3 из TZ.md). Игровая логика — этапы 4-5.
|
||||
class Lobby {
|
||||
public:
|
||||
void onOpen(WS *ws);
|
||||
void onMessage(WS *ws, std::string_view message);
|
||||
void onClose(WS *ws);
|
||||
|
||||
private:
|
||||
static constexpr size_t kMaxPlayersPerRoom = 2;
|
||||
|
||||
std::unordered_map<std::string, Room> rooms_;
|
||||
std::unordered_set<WS *> sockets_;
|
||||
int next_player_id_ = 1;
|
||||
int next_room_id_ = 1;
|
||||
|
||||
void handleHello(WS *ws, const json &payload);
|
||||
void handleListRooms(WS *ws);
|
||||
void handleCreateRoom(WS *ws, const json &payload);
|
||||
void handleJoinRoom(WS *ws, const json &payload);
|
||||
void handleLeaveRoom(WS *ws);
|
||||
void removePlayerFromRoom(WS *ws);
|
||||
|
||||
void broadcastRoomsToLobby();
|
||||
void broadcastRoomUpdated(const Room &room, WS *exclude = nullptr);
|
||||
|
||||
json roomsSummary() const;
|
||||
json roomPlayers(const Room &room) const;
|
||||
std::string generateRoomId();
|
||||
|
||||
static void send(WS *ws, const std::string &type, json payload);
|
||||
static void sendError(WS *ws, const std::string &code, const std::string &message);
|
||||
};
|
||||
Reference in New Issue
Block a user