R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
RoomList.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** File description:
4** RoomList.hpp - List of available rooms
5*/
6
7#pragma once
8
9#include <capnp/message.h>
10#include <capnp/serialize.h>
11#include <cstdint>
12#include <string>
13#include <vector>
14#include "schemas/s2c_messages.capnp.h"
15
16namespace RType::Messages::S2C {
17
18 struct RoomInfoData {
19 std::string roomId;
20 std::string roomName;
21 uint32_t playerCount;
22 uint32_t maxPlayers;
24 uint8_t state; // 0=WAITING, 1=STARTING, 2=IN_PROGRESS, 3=FINISHED
25 };
26
27 class RoomList {
28 public:
29 std::vector<RoomInfoData> rooms;
30
31 RoomList() = default;
32
33 [[nodiscard]] std::vector<uint8_t> serialize() const {
34 capnp::MallocMessageBuilder message;
35 auto builder = message.initRoot<::RoomList>();
36 auto roomsBuilder = builder.initRooms(rooms.size());
37
38 for (size_t i = 0; i < rooms.size(); ++i) {
39 auto roomBuilder = roomsBuilder[i];
40 roomBuilder.setRoomId(rooms[i].roomId);
41 roomBuilder.setRoomName(rooms[i].roomName);
42 roomBuilder.setPlayerCount(rooms[i].playerCount);
43 roomBuilder.setMaxPlayers(rooms[i].maxPlayers);
44 roomBuilder.setIsPrivate(rooms[i].isPrivate);
45 roomBuilder.setState(rooms[i].state);
46 }
47
48 auto bytes = capnp::messageToFlatArray(message);
49 auto byteArray = bytes.asBytes();
50 return std::vector<uint8_t>(byteArray.begin(), byteArray.end());
51 }
52
53 static RoomList deserialize(const std::vector<uint8_t> &data) {
54 KJ_REQUIRE(data.size() % sizeof(capnp::word) == 0,
55 "Serialized data size must be a multiple of capnp::word");
56 auto aligned = kj::heapArray<uint8_t>(data.size());
57 memcpy(aligned.begin(), data.data(), data.size());
58 kj::ArrayPtr<const capnp::word> words(reinterpret_cast<const capnp::word *>(aligned.begin()),
59 aligned.size() / sizeof(capnp::word));
60
61 capnp::FlatArrayMessageReader reader(words);
62 auto msg = reader.getRoot<::RoomList>();
63
64 RoomList result;
65 auto roomsList = msg.getRooms();
66 for (auto room : roomsList) {
67 RoomInfoData info;
68 info.roomId = room.getRoomId().cStr();
69 info.roomName = room.getRoomName().cStr();
70 info.playerCount = room.getPlayerCount();
71 info.maxPlayers = room.getMaxPlayers();
72 info.isPrivate = room.getIsPrivate();
73 info.state = room.getState();
74 result.rooms.push_back(info);
75 }
76 return result;
77 }
78 };
79
80} // namespace RType::Messages::S2C
std::vector< uint8_t > serialize() const
Definition RoomList.hpp:33
std::vector< RoomInfoData > rooms
Definition RoomList.hpp:29
static RoomList deserialize(const std::vector< uint8_t > &data)
Definition RoomList.hpp:53
Server-to-Client messages.
Definition Server.hpp:34