R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
CreateRoom.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** File description:
4** CreateRoom.hpp - Create a new room
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/c2s_messages.capnp.h"
15
16namespace RType::Messages::C2S {
17
18 class CreateRoom {
19 public:
20 std::string roomName;
21 uint32_t maxPlayers;
24
26 CreateRoom(const std::string &name, uint32_t max, bool priv, float speedMultiplier = 1.0f)
27 : roomName(name), maxPlayers(max), isPrivate(priv), gameSpeedMultiplier(speedMultiplier) {}
28
29 [[nodiscard]] std::vector<uint8_t> serialize() const {
30 capnp::MallocMessageBuilder message;
31 auto builder = message.initRoot<::CreateRoom>();
32 builder.setRoomName(roomName);
33 builder.setMaxPlayers(maxPlayers);
34 builder.setIsPrivate(isPrivate);
35 builder.setGameSpeedMultiplier(gameSpeedMultiplier);
36
37 auto bytes = capnp::messageToFlatArray(message);
38 auto byteArray = bytes.asBytes();
39 return std::vector<uint8_t>(byteArray.begin(), byteArray.end());
40 }
41
42 static CreateRoom deserialize(const std::vector<uint8_t> &data) {
43 KJ_REQUIRE(data.size() % sizeof(capnp::word) == 0,
44 "Serialized data size must be a multiple of capnp::word");
45 auto aligned = kj::heapArray<uint8_t>(data.size());
46 memcpy(aligned.begin(), data.data(), data.size());
47 kj::ArrayPtr<const capnp::word> words(reinterpret_cast<const capnp::word *>(aligned.begin()),
48 aligned.size() / sizeof(capnp::word));
49
50 capnp::FlatArrayMessageReader reader(words);
51 auto msg = reader.getRoot<::CreateRoom>();
52
53 CreateRoom result;
54 result.roomName = msg.getRoomName().cStr();
55 result.maxPlayers = msg.getMaxPlayers();
56 result.isPrivate = msg.getIsPrivate();
57 result.gameSpeedMultiplier = msg.getGameSpeedMultiplier();
58 // Clamp to valid range and default if not set (0.0f means unset in capnp)
59 if (result.gameSpeedMultiplier <= 0.0f || result.gameSpeedMultiplier > 1.0f) {
60 result.gameSpeedMultiplier = 1.0f;
61 }
62 return result;
63 }
64 };
65
66} // namespace RType::Messages::C2S
float gameSpeedMultiplier
Game speed multiplier (0.25 to 1.0, default 1.0)
CreateRoom(const std::string &name, uint32_t max, bool priv, float speedMultiplier=1.0f)
std::vector< uint8_t > serialize() const
static CreateRoom deserialize(const std::vector< uint8_t > &data)
Client-to-Server messages.