r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
ServerScene.cpp
Go to the documentation of this file.
1#include <cmath>
2
3#include "ECS/Component.hpp"
5#include "Utils/Common.hpp"
6
7static char keyToChar(const eng::Key key, bool shift = false)
8{
9 switch (key)
10 {
11 case eng::Key::Q:
12 return shift ? 'A' : 'a';
13 case eng::Key::W:
14 return shift ? 'Z' : 'z';
15 case eng::Key::E:
16 return shift ? 'E' : 'e';
17 case eng::Key::R:
18 return shift ? 'R' : 'r';
19 case eng::Key::T:
20 return shift ? 'T' : 't';
21 case eng::Key::Y:
22 return shift ? 'Y' : 'y';
23 case eng::Key::U:
24 return shift ? 'U' : 'u';
25 case eng::Key::I:
26 return shift ? 'I' : 'i';
27 case eng::Key::O:
28 return shift ? 'O' : 'o';
29 case eng::Key::P:
30 return shift ? 'P' : 'p';
31
32 case eng::Key::A:
33 return shift ? 'Q' : 'q';
34 case eng::Key::S:
35 return shift ? 'S' : 's';
36 case eng::Key::D:
37 return shift ? 'D' : 'd';
38 case eng::Key::F:
39 return shift ? 'F' : 'f';
40 case eng::Key::G:
41 return shift ? 'G' : 'g';
42 case eng::Key::H:
43 return shift ? 'H' : 'h';
44 case eng::Key::J:
45 return shift ? 'J' : 'j';
46 case eng::Key::K:
47 return shift ? 'K' : 'k';
48 case eng::Key::M:
49 return shift ? 'M' : 'm';
50 case eng::Key::L:
51 return shift ? 'L' : 'l';
52
53 case eng::Key::Z:
54 return shift ? 'W' : 'w';
55 case eng::Key::X:
56 return shift ? 'X' : 'x';
57 case eng::Key::C:
58 return shift ? 'C' : 'c';
59 case eng::Key::V:
60 return shift ? 'V' : 'v';
61 case eng::Key::B:
62 return shift ? 'B' : 'b';
63 case eng::Key::N:
64 return shift ? 'N' : 'n';
65
66 case eng::Key::Num0:
67 return '0';
68 case eng::Key::Num1:
69 return '1';
70 case eng::Key::Num2:
71 return '2';
72 case eng::Key::Num3:
73 return '3';
74 case eng::Key::Num4:
75 return '4';
76 case eng::Key::Num5:
77 return '5';
78 case eng::Key::Num6:
79 return '6';
80 case eng::Key::Num7:
81 return '7';
82 case eng::Key::Num8:
83 return '8';
84 case eng::Key::Num9:
85 return '9';
86 case eng::Key::Space:
87 return ' ';
88 case eng::Key::Dot:
89 return '.';
90 default:
91 return '\0';
92 }
93}
94
95gme::ServerScene::ServerScene(const eng::id assignedId, const std::shared_ptr<eng::IRenderer> &renderer,
96 const std::string &host, const std::string &port, const std::string &playerName)
97 : AScene(assignedId), m_playerName(playerName), m_host(host), m_port(port)
98{
99 auto &registry = AScene::getRegistry();
100
101 registry.onComponentAdded(
102 [&renderer, &registry](const ecs::Entity e, const std::type_info &type)
103 {
104 const auto *colorComp = registry.getComponent<ecs::Color>(e);
105 const auto *fontComp = registry.getComponent<ecs::Font>(e);
106 const auto *textComp = registry.getComponent<ecs::Text>(e);
107 const auto *transform = registry.getComponent<ecs::Transform>(e);
108
109 if (type == typeid(ecs::Text))
110 {
111 if (textComp && transform && fontComp)
112 {
113 renderer->createFont(fontComp->id, fontComp->path);
114 renderer->createText(
115 {.font_name = fontComp->id,
116 .color = {.r = colorComp->r, .g = colorComp->g, .b = colorComp->b, .a = colorComp->a},
117 .content = textComp->content,
118 .size = textComp->font_size,
119 .x = transform->x,
120 .y = transform->y,
121 .name = textComp->id});
122 }
123 }
124 });
125 registry.createEntity()
126 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
127 .with<ecs::Transform>("transform_title", 100.F, 60.F, 0.F)
130 .with<ecs::Text>("title", std::string("SERVER"), 72U)
131 .build();
132 for (size_t i = 0; i < m_serverOptions.size(); ++i)
133 {
134 float yPosition = 0.0F;
135 if (i < 3)
136 {
137 yPosition = 200.F + i * 50.F;
138 }
139 else
140 {
141 yPosition = 200.F + i * 50.F + 30.F;
142 }
143 registry.createEntity()
144 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
145 .with<ecs::Transform>("transform_option_" + std::to_string(i), 100.F, yPosition, 0.F)
146 .with<ecs::Color>("color_option_" + std::to_string(i), utl::Config::Color::GRAY_BLUE_SUBTLE.r,
149 .with<ecs::Text>("option_" + m_serverOptions[i], m_serverOptions[i], 32U)
150 .build();
151 }
153 registry.createEntity()
154 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
155 .with<ecs::Transform>("transform_player_name_value", 580.F, 200.F, 0.F)
156 .with<ecs::Color>("color_player_name_value", utl::Config::Color::TEXT_VALUE_COLOR.r,
159 .with<ecs::Text>("player_name_value", m_playerName, 24U)
160 .build();
161
163 registry.createEntity()
164 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
165 .with<ecs::Transform>("transform_server_ip_value", 580.F, 250.F, 0.F)
166 .with<ecs::Color>("color_server_ip_value", utl::Config::Color::TEXT_VALUE_COLOR.r,
169 .with<ecs::Text>("server_ip_value", m_host, 24U)
170 .build();
171
173 registry.createEntity()
174 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
175 .with<ecs::Transform>("transform_server_port_value", 580.F, 300.F, 0.F)
176 .with<ecs::Color>("color_server_port_value", utl::Config::Color::TEXT_VALUE_COLOR.r,
179 .with<ecs::Text>("server_port_value", m_port, 24U)
180 .build();
181
184}
185
186void gme::ServerScene::update(const float dt, const eng::WindowSize & /*size*/)
187{
188 auto &reg = getRegistry();
189 auto &colors = reg.getAll<ecs::Color>();
190 auto &texts = reg.getAll<ecs::Text>();
191
192 m_animationTime += dt;
193
194 for (auto &[entity, text] : texts)
195 {
196 for (size_t i = 0; i < m_serverOptions.size(); ++i)
197 {
198 if (text.id == "option_" + m_serverOptions[i])
199 {
200 auto &color = colors.at(entity);
201
202 if (i == m_selectedIndex)
203 {
204 const float glowIntensity = std::sin(m_animationTime * 2.5f);
205 color.r = 0U;
206 color.g = static_cast<unsigned char>(191U + glowIntensity * 50);
207 color.b = 255U;
208 }
209 else
210 {
214 }
215 break;
216 }
217 }
218 }
219}
220
222{
223 switch (event.type)
224 {
226 if (event.key == eng::Key::Escape)
227 {
228 if (onBackToMenu)
229 {
230 onBackToMenu();
231 }
232 }
233 else if (event.key == eng::Key::Up)
234 {
235 m_playMusic = true;
236 m_selectedIndex = (m_selectedIndex == 0) ? m_serverOptions.size() - 1 : m_selectedIndex - 1;
237 }
238 else if (event.key == eng::Key::Down)
239 {
240 m_playMusic = true;
241 m_selectedIndex = (m_selectedIndex == m_serverOptions.size() - 1) ? 0 : m_selectedIndex + 1;
242 }
243 else if (event.key == eng::Key::Enter)
244 {
245 if (m_selectedIndex == 3 && onConnect)
246 {
247 connectServer(m_playerName, m_host, m_port);
248 onConnect(m_playerName, m_host, m_port);
249 }
250 else if (m_selectedIndex == 4 && onBackToMenu)
251 {
252 onBackToMenu();
253 }
254 }
255 else if (event.key == eng::Key::Delete)
256 {
257 if (m_selectedIndex < 3)
258 {
259 if (std::string &currentField = getCurrentEditField(); !currentField.empty())
260 {
261 currentField.pop_back();
262 updateValueDisplay();
263 }
264 }
265 }
266 else
267 {
268 if (m_selectedIndex < 3)
269 {
270 if (const char c = keyToChar(event.key); c != '\0')
271 {
272 std::string &currentField = getCurrentEditField();
273 if (c == ' ' && m_selectedIndex != 0)
274 {
275 return;
276 }
277 if (currentField.length() < 20)
278 {
279 currentField += c;
280 updateValueDisplay();
281 }
282 }
283 }
284 }
285 break;
287 break;
288 default:
289 break;
290 }
291}
292
294{
295 if (m_selectedIndex == 0)
296 {
297 return m_playerName;
298 }
299 if (m_selectedIndex == 1)
300 {
301 return m_host;
302 }
303 return m_port;
304}
305
307{
308 auto &reg = getRegistry();
309
310 if (auto *playerNameText = reg.getComponent<ecs::Text>(m_playerNameValueEntity))
311 {
312 playerNameText->content = m_playerName;
313 }
314
315 if (auto *serverIPText = reg.getComponent<ecs::Text>(m_serverIPValueEntity))
316 {
317 serverIPText->content = m_host;
318 }
319
320 if (auto *serverPortText = reg.getComponent<ecs::Text>(m_serverPortValueEntity))
321 {
322 serverPortText->content = m_port;
323 }
324}
325
326void gme::ServerScene::connectServer(const std::string &playerName, const std::string &serverIP,
327 const std::string &serverPort) const
328{
329 rnp::Serializer serializer;
330 serializer.writeString(playerName, 32);
331 serializer.writeString(serverIP, 15);
332 serializer.writeString(serverPort, 5);
333 const auto data = serializer.getData();
334
335 m_eventBus.publish(utl::EventType::REQUEST_CONNECT, data, m_eventComponentId, utl::NETWORK_CLIENT);
336}
This file contains the component definitions.
static char keyToChar(const eng::Key key, bool shift=false)
Server connection configuration scene for R-Type multiplayer.
utl::EventBus & m_eventBus
Definition IScene.hpp:84
std::uint32_t m_eventComponentId
Definition IScene.hpp:85
void event(const eng::Event &event) override
Handle input events.
ecs::Entity m_serverPortValueEntity
Text entity displaying server port.
std::string m_port
Server port input field.
void updateValueDisplay()
Update the visual display of input values.
void connectServer(const std::string &playerName, const std::string &serverIP, const std::string &serverPort) const
Initiate server connection with provided settings.
std::string m_host
Server host/IP input field.
ecs::Entity m_playerNameValueEntity
Text entity displaying player name.
const std::vector< std::string > m_serverOptions
ecs::Entity m_serverIPValueEntity
Text entity displaying server IP.
ServerScene(eng::id assignedId, const std::shared_ptr< eng::IRenderer > &renderer, const std::string &host, const std::string &port, const std::string &playerName)
Constructor.
std::string & getCurrentEditField()
Get reference to the currently selected input field.
std::string m_playerName
Player name input field.
void update(float dt, const eng::WindowSize &size) override
Update the scene (called each frame)
Binary serializer for RNP protocol packets.
void writeString(const std::string &str, std::size_t maxLength)
Write a string with length prefix.
const std::vector< std::uint8_t > & getData() const
Get the serialized data.
void registerComponent(std::uint32_t componentId, const std::string &name)
Register component name for better debugging.
Definition EventBus.hpp:423
static char keyToChar(const eng::Key key, bool shift=false)
This file contains common definitions and constants.
std::uint32_t Entity
Definition Entity.hpp:13
unsigned int id
Definition IScene.hpp:20
static constexpr eng::Color TEXT_VALUE_COLOR
Definition Common.hpp:66
static constexpr eng::Color GRAY_BLUE_SUBTLE
Definition Common.hpp:57
static constexpr eng::Color CYAN_ELECTRIC
Definition Common.hpp:56
constexpr auto FONTS_RTYPE
Definition Common.hpp:97
static constexpr std::uint32_t NETWORK_CLIENT
Definition Event.hpp:17
std::string id
Definition Component.hpp:15
unsigned char r
Definition IRenderer.hpp:17
unsigned char a
Definition IRenderer.hpp:20
unsigned char g
Definition IRenderer.hpp:18
unsigned char b
Definition IRenderer.hpp:19
EventType type