R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
GameStart.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** Created on 09/12/2025.
4** File description:
5** GameStart.hpp
6*/
7
8#pragma once
9
10#include <capnp/message.h>
11#include <capnp/serialize.h>
12#include <cstdint>
13#include <string>
14#include <vector>
15#include "GameState.hpp"
16#include "schemas/s2c_messages.capnp.h"
17
18namespace RType::Messages::S2C {
19
24 struct MapConfig {
25 std::string background;
26 std::string parallaxBackground;
27 float scrollSpeed = 50.0f;
28 float parallaxSpeedFactor = 0.3f;
29 };
30
44 class GameStart {
45 public:
46 uint32_t yourEntityId;
49
51
52 [[nodiscard]] std::vector<uint8_t> serialize() const {
53 capnp::MallocMessageBuilder message;
54 auto builder = message.initRoot<::GameStart>();
55
56 builder.setYourEntityId(yourEntityId);
57
58 // Build initial state inline
59 auto stateBuilder = builder.initInitialState();
60 stateBuilder.setServerTick(initialState.serverTick);
61
62 auto entitiesBuilder =
63 stateBuilder.initEntities(static_cast<unsigned int>(initialState.entities.size()));
64 for (size_t i = 0; i < initialState.entities.size(); ++i) {
65 initialState.entities[i].toCapnp(entitiesBuilder[static_cast<unsigned int>(i)]);
66 }
67
68 // Build map config
69 auto mapConfigBuilder = builder.initMapConfig();
70 mapConfigBuilder.setBackground(mapConfig.background);
71 mapConfigBuilder.setParallaxBackground(mapConfig.parallaxBackground);
72 mapConfigBuilder.setScrollSpeed(mapConfig.scrollSpeed);
73 mapConfigBuilder.setParallaxSpeedFactor(mapConfig.parallaxSpeedFactor);
74
75 auto bytes = capnp::messageToFlatArray(message);
76 auto byteArray = bytes.asBytes();
77 return std::vector<uint8_t>(byteArray.begin(), byteArray.end());
78 }
79
80 static GameStart deserialize(const std::vector<uint8_t> &data) {
81 // Ensure buffer is word-aligned for Cap'n Proto (undefined behavior if not)
82 KJ_REQUIRE(data.size() % sizeof(capnp::word) == 0,
83 "Serialized data size must be a multiple of capnp::word");
84 auto aligned = kj::heapArray<uint8_t>(data.size());
85 memcpy(aligned.begin(), data.data(), data.size());
86 kj::ArrayPtr<const capnp::word> words(reinterpret_cast<const capnp::word *>(aligned.begin()),
87 data.size() / sizeof(capnp::word));
88
89 capnp::FlatArrayMessageReader message(words);
90 auto reader = message.getRoot<::GameStart>();
91
92 GameStart result;
93 result.yourEntityId = reader.getYourEntityId();
94
95 // Deserialize initial state inline
96 auto stateReader = reader.getInitialState();
97 result.initialState.serverTick = stateReader.getServerTick();
98
99 auto entitiesReader = stateReader.getEntities();
100 result.initialState.entities.reserve(entitiesReader.size());
101 for (auto entityReader : entitiesReader) {
102 result.initialState.entities.push_back(EntityState::fromCapnp(entityReader));
103 }
104
105 // Deserialize map config
106 if (reader.hasMapConfig()) {
107 auto mapConfigReader = reader.getMapConfig();
108 result.mapConfig.background = mapConfigReader.getBackground();
109 result.mapConfig.parallaxBackground = mapConfigReader.getParallaxBackground();
110 result.mapConfig.scrollSpeed = mapConfigReader.getScrollSpeed();
111 result.mapConfig.parallaxSpeedFactor = mapConfigReader.getParallaxSpeedFactor();
112 }
113
114 return result;
115 }
116 };
117
118} // namespace RType::Messages::S2C
static EntityState fromCapnp(::EntityState::Reader reader)
Game start notification from server to client.
Definition GameStart.hpp:44
static GameStart deserialize(const std::vector< uint8_t > &data)
Definition GameStart.hpp:80
std::vector< uint8_t > serialize() const
Definition GameStart.hpp:52
Complete snapshot of the game world.
Definition GameState.hpp:31
std::vector< EntityState > entities
Definition GameState.hpp:34
Server-to-Client messages.
Definition Server.hpp:34
Map background configuration sent to client.
Definition GameStart.hpp:24
std::string parallaxBackground
Path to parallax layer texture (empty = none)
Definition GameStart.hpp:26
float parallaxSpeedFactor
Parallax layer speed factor.
Definition GameStart.hpp:28
float scrollSpeed
Background scroll speed in pixels/second.
Definition GameStart.hpp:27
std::string background
Path to main background texture.
Definition GameStart.hpp:25