17 return shift ?
'A' :
'a';
19 return shift ?
'Z' :
'z';
21 return shift ?
'E' :
'e';
23 return shift ?
'R' :
'r';
25 return shift ?
'T' :
't';
27 return shift ?
'Y' :
'y';
29 return shift ?
'U' :
'u';
31 return shift ?
'I' :
'i';
33 return shift ?
'O' :
'o';
35 return shift ?
'P' :
'p';
38 return shift ?
'Q' :
'q';
40 return shift ?
'S' :
's';
42 return shift ?
'D' :
'd';
44 return shift ?
'F' :
'f';
46 return shift ?
'G' :
'g';
48 return shift ?
'H' :
'h';
50 return shift ?
'J' :
'j';
52 return shift ?
'K' :
'k';
54 return shift ?
'M' :
'm';
56 return shift ?
'L' :
'l';
59 return shift ?
'W' :
'w';
61 return shift ?
'X' :
'x';
63 return shift ?
'C' :
'c';
65 return shift ?
'V' :
'v';
67 return shift ?
'B' :
'b';
69 return shift ?
'N' :
'n';
101 auto ®istry = AScene::getRegistry();
103 registry.onComponentAdded(
104 [&renderer, ®istry](
const ecs::Entity e,
const std::type_info &type)
106 const auto *colorComp = registry.getComponent<
ecs::Color>(e);
107 const auto *fontComp = registry.getComponent<
ecs::Font>(e);
108 const auto *textComp = registry.getComponent<
ecs::Text>(e);
113 if (textComp && transform && fontComp)
115 renderer->createFont(fontComp->
id, fontComp->path);
116 renderer->createText(
117 {.font_name = fontComp->
id,
118 .color = {.r = colorComp->r, .g = colorComp->g, .b = colorComp->b, .a = colorComp->a},
119 .content = textComp->content,
120 .size = textComp->font_size,
123 .name = textComp->
id});
129 registry.createEntity()
131 .with<ecs::Transform>(
"transform_title", 100.F, 60.F, 0.F)
134 .with<ecs::Text>(
"title", std::string(
"CREATE ROOM"), 72U)
137 for (
size_t i = 0; i <
m_options.size(); ++i)
139 registry.createEntity()
141 .with<ecs::Transform>(
"transform_option_" + std::to_string(i), 100.F, 200.F + i * 50.F, 0.F)
150 registry.createEntity()
152 .with<ecs::Transform>(
"transform_room_name_value", 580.F, 200.F, 0.F)
156 .with<ecs::Text>(
"room_name_value",
m_roomName, 24U)
160 registry.createEntity()
162 .with<ecs::Transform>(
"transform_max_players_value", 580.F, 250.F, 0.F)
166 .with<ecs::Text>(
"max_players_value", std::to_string(
m_maxPlayers), 24U)
175 auto ® = getRegistry();
179 m_animationTime += dt;
183 for (
auto &[entity, text] : texts)
185 for (
size_t i = 0; i < m_options.size(); ++i)
187 if (text.id ==
"option_" + m_options[i])
189 auto &color = colors.at(entity);
191 if (i == m_selectedIndex)
193 const float glowIntensity = std::sin(m_animationTime * 2.5F);
195 color.g =
static_cast<unsigned char>(191U + (glowIntensity * 50));
225 m_selectedIndex = (m_selectedIndex == 0) ? m_options.size() - 1 : m_selectedIndex - 1;
230 m_selectedIndex = (m_selectedIndex == m_options.size() - 1) ? 0 : m_selectedIndex + 1;
234 if (m_selectedIndex == 2 && onCreate)
237 onCreate(m_roomName, m_maxPlayers);
239 else if (m_selectedIndex == 3 && onBackToMulti)
246 if (m_selectedIndex == 1)
251 updateValueDisplay();
256 updateValueDisplay();
262 if (m_selectedIndex == 0)
264 if (!m_roomName.empty())
266 m_roomName.pop_back();
267 updateValueDisplay();
273 if (m_selectedIndex == 0)
277 if (inputChar !=
'\0')
279 if (m_roomName.length() < 20)
281 m_roomName += inputChar;
282 updateValueDisplay();
297 auto ® = getRegistry();
299 if (
auto *roomNameText = reg.getComponent<
ecs::Text>(m_roomNameValueEntity))
301 roomNameText->content = m_roomName;
304 if (
auto *maxPlayersText = reg.getComponent<
ecs::Text>(m_maxPlayersValueEntity))
306 maxPlayersText->content = std::to_string(m_maxPlayers);
312 utl::Logger::log(
"CreateRoomScene: Creating room '" + m_roomName +
"' with " + std::to_string(m_maxPlayers) +
317 packet.
maxPlayers =
static_cast<std::uint8_t
>(m_maxPlayers);
319 packet.nameLen =
static_cast<uint8_t
>(m_roomName.size());
320 for (
size_t i = 0; i < m_roomName.size(); ++i)
322 packet.lobbyName[i] = m_roomName[i];
325 utl::Logger::log(
"CreateRoomScene: Publishing LOBBY_CREATE event to component " +
334 for (
const auto events = m_eventBus.consumeForTarget(m_eventComponentId);
const auto &event : events)
341 utl::Logger::log(
"CreateRoomScene: Lobby created successfully with ID " + std::to_string(lobbyId),
346 onRoomCreated(
static_cast<int>(lobbyId),
nullptr);
351 utl::Logger::log(
"CreateRoomScene: Failed to create lobby, error code " + std::to_string(errorCode),
This file contains the component definitions.
Lobby creation scene for R-Type multiplayer.
Event structures and types for event-driven communication.
This file contains the Logger class.
This file contains the network protocol.
Network packet serializer for RNP protocol.
utl::EventBus & m_eventBus
std::uint32_t m_eventComponentId
std::string m_roomName
Current room name input (default: "My Room")
void update(float dt, const eng::WindowSize &size) override
Update the scene (called each frame)
void processEventBus() const
Process events from the event bus.
const std::vector< std::string > m_options
void updateValueDisplay()
Update the visual display of configuration values.
int m_maxPlayers
Maximum players setting (default: 4)
ecs::Entity m_titleEntity
Title text entity.
ecs::Entity m_roomNameValueEntity
Text entity displaying room name.
ecs::Entity m_maxPlayersValueEntity
Text entity displaying max players.
void event(const eng::Event &event) override
Handle input events.
void createRoom() const
Send lobby creation request to server.
CreateRoomScene(eng::id assignedId, const std::shared_ptr< eng::IRenderer > &renderer)
Constructor.
Binary serializer for RNP protocol packets.
PacketLobbyCreateResponse deserializeLobbyCreateResponse()
Deserialize LOBBY_CREATE_RESPONSE packet.
void registerComponent(std::uint32_t componentId, const std::string &name)
Register component name for better debugging.
void subscribe(std::uint32_t componentId, EventType type)
Subscribe component to specific event types.
static void log(const std::string &message, const LogLevel &logLevel)
static char keyToChar(const eng::Key key, bool shift=false)
This file contains common definitions and constants.
static constexpr eng::Color TEXT_VALUE_COLOR
static constexpr eng::Color GRAY_BLUE_SUBTLE
static constexpr eng::Color CYAN_ELECTRIC
constexpr auto FONTS_RTYPE
static constexpr std::uint32_t NETWORK_CLIENT
LOBBY_CREATE packet payload.