r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
rtypeClientMulti.cpp
Go to the documentation of this file.
10#include "Utils/EventBus.hpp"
11#include "Utils/Logger.hpp"
12
13void gme::RTypeClientMulti::update(float deltaTime, unsigned int width, unsigned int height) {}
14
15void gme::RTypeClientMulti::setupScenes(bool &showDebug, eng::id menuSceneId)
16{
17 auto serverSceneId = m_engine->getSceneManager()->generateNextId();
18 auto serverScene = std::make_unique<ServerScene>(serverSceneId, m_engine->getRenderer(), m_appConfig->host,
19 std::to_string(m_appConfig->port), m_appConfig->player_name);
20 m_mainSceneId = serverSceneId;
21 serverScene->addSystem(std::make_unique<ecs::AudioSystem>(m_engine->getAudio(), m_appConfig->audioVolume,
22 serverScene->getRegistry(), serverScene->playMusic()));
23 serverScene->addSystem(std::make_unique<ecs::StarfieldSystem>(m_engine->getRenderer(), serverScene->getRegistry()));
24 serverScene->addSystem(std::make_unique<ecs::SpriteSystem>(m_engine->getRenderer()));
25 serverScene->addSystem(std::make_unique<ecs::TextSystem>(m_engine->getRenderer()));
26 serverScene->addSystem(std::make_unique<ecs::DebugSystem>(m_engine->getRenderer(), m_showDebug));
27 auto configMultiId = m_engine->getSceneManager()->generateNextId();
28 auto configMulti = std::make_unique<ConfigMulti>(configMultiId, m_engine->getRenderer());
29 configMulti->addSystem(std::make_unique<ecs::AudioSystem>(m_engine->getAudio(), m_appConfig->audioVolume,
30 configMulti->getRegistry(), configMulti->playMusic()));
31 configMulti->addSystem(std::make_unique<ecs::StarfieldSystem>(m_engine->getRenderer(), configMulti->getRegistry()));
32 configMulti->addSystem(std::make_unique<ecs::SpriteSystem>(m_engine->getRenderer()));
33 configMulti->addSystem(std::make_unique<ecs::TextSystem>(m_engine->getRenderer()));
34 configMulti->addSystem(std::make_unique<ecs::DebugSystem>(m_engine->getRenderer(), m_showDebug));
35 auto createRoomId = m_engine->getSceneManager()->generateNextId();
36 auto createRoomScene = std::make_unique<CreateRoomScene>(createRoomId, m_engine->getRenderer());
37 createRoomScene->addSystem(std::make_unique<ecs::AudioSystem>(
38 m_engine->getAudio(), m_appConfig->audioVolume, createRoomScene->getRegistry(), createRoomScene->playMusic()));
39 createRoomScene->addSystem(
40 std::make_unique<ecs::StarfieldSystem>(m_engine->getRenderer(), createRoomScene->getRegistry()));
41 createRoomScene->addSystem(std::make_unique<ecs::SpriteSystem>(m_engine->getRenderer()));
42 createRoomScene->addSystem(std::make_unique<ecs::TextSystem>(m_engine->getRenderer()));
43 createRoomScene->addSystem(std::make_unique<ecs::DebugSystem>(m_engine->getRenderer(), m_showDebug));
44 auto joinRoomId = m_engine->getSceneManager()->generateNextId();
45 auto joinRoomScene = std::make_unique<JoinRoomScene>(joinRoomId, m_engine->getRenderer());
46 joinRoomScene->addSystem(std::make_unique<ecs::AudioSystem>(
47 m_engine->getAudio(), m_appConfig->audioVolume, joinRoomScene->getRegistry(), joinRoomScene->playMusic()));
48 joinRoomScene->addSystem(
49 std::make_unique<ecs::StarfieldSystem>(m_engine->getRenderer(), joinRoomScene->getRegistry()));
50 joinRoomScene->addSystem(std::make_unique<ecs::SpriteSystem>(m_engine->getRenderer()));
51 joinRoomScene->addSystem(std::make_unique<ecs::TextSystem>(m_engine->getRenderer()));
52 joinRoomScene->addSystem(std::make_unique<ecs::DebugSystem>(m_engine->getRenderer(), m_showDebug));
53 auto waitingRoomId = m_engine->getSceneManager()->generateNextId();
54 auto waitingRoomScene = std::make_unique<WaitingRoomScene>(waitingRoomId, m_engine->getRenderer());
55 waitingRoomScene->addSystem(std::make_unique<ecs::AudioSystem>(m_engine->getAudio(), m_appConfig->audioVolume,
56 waitingRoomScene->getRegistry(),
57 waitingRoomScene->playMusic()));
58 waitingRoomScene->addSystem(
59 std::make_unique<ecs::StarfieldSystem>(m_engine->getRenderer(), waitingRoomScene->getRegistry()));
60 waitingRoomScene->addSystem(std::make_unique<ecs::SpriteSystem>(m_engine->getRenderer()));
61 waitingRoomScene->addSystem(std::make_unique<ecs::TextSystem>(m_engine->getRenderer()));
62 waitingRoomScene->addSystem(std::make_unique<ecs::DebugSystem>(m_engine->getRenderer(), m_showDebug));
63 WaitingRoomScene *waitingRoomScenePtr = waitingRoomScene.get();
64
65 serverScene->onConnect =
66 [this, configMultiId](const std::string &playerName, const std::string &serverIP, const std::string &serverPort)
67 { m_engine->getSceneManager()->switchToScene(configMultiId); };
68 serverScene->onBackToMenu = [this, menuSceneId]() { m_engine->getSceneManager()->switchToScene(menuSceneId); };
69
70 configMulti->onOptionSelected = [this, menuSceneId, createRoomId, joinRoomId](const std::string &option)
71 {
72 if (option == "Create room")
73 {
74 m_engine->getSceneManager()->switchToScene(createRoomId);
75 }
76 else if (option == "Join room")
77 {
78 m_engine->getSceneManager()->switchToScene(joinRoomId);
79 }
80 else if (option == "Go back to menu")
81 {
82 m_engine->getSceneManager()->switchToScene(menuSceneId);
83 }
84 };
85
86 createRoomScene->onCreate = [this](const std::string &roomName, int maxPlayers)
87 {
88 // Room creation is handled through event bus
89 // Response will be processed in CreateRoomScene::processEventBus()
90 // We stay on the create room scene until we get a response
91 };
92 createRoomScene->onRoomCreated =
93 [this, waitingRoomId, waitingRoomScenePtr](const int lobbyId, const rnp::LobbyInfo *lobbyInfo)
94 {
95 utl::Logger::log("RTypeClientMulti: Room created with ID " + std::to_string(lobbyId), utl::LogLevel::INFO);
96 // Transition to waiting room after successful room creation
97 waitingRoomScenePtr->setLobbyId(static_cast<std::uint32_t>(lobbyId));
98 waitingRoomScenePtr->setIsHost(true); // Creator is the host
99 if (lobbyInfo)
100 {
101 waitingRoomScenePtr->setLobbyInfo(*lobbyInfo);
102 }
103 m_engine->getSceneManager()->switchToScene(waitingRoomId);
104 };
105 createRoomScene->onBackToMulti = [this, configMultiId]()
106 { m_engine->getSceneManager()->switchToScene(configMultiId); };
107
108 joinRoomScene->onJoin = [this, waitingRoomId, waitingRoomScenePtr](int roomId, const rnp::LobbyInfo *lobbyInfo)
109 {
110 utl::Logger::log("RTypeClientMulti: Joined room with ID " + std::to_string(roomId), utl::LogLevel::INFO);
111 waitingRoomScenePtr->setLobbyId(static_cast<std::uint32_t>(roomId));
112 waitingRoomScenePtr->setIsHost(false);
113 if (lobbyInfo)
114 {
115 waitingRoomScenePtr->setLobbyInfo(*lobbyInfo);
116 }
117 m_engine->getSceneManager()->switchToScene(waitingRoomId);
118 };
119 joinRoomScene->onBackToMulti = [this, configMultiId]()
120 { m_engine->getSceneManager()->switchToScene(configMultiId); };
121 joinRoomScene->onRefreshRequest = []()
122 {
123 // Room list refresh is handled through event bus
124 // JoinRoomScene::refreshRoomList() publishes LOBBY_LIST_REQUEST
125 // Response is processed in JoinRoomScene::handleLobbyListResponse()
126 };
127
128 waitingRoomScene->onLeaveLobby = [this, configMultiId]()
129 { m_engine->getSceneManager()->switchToScene(configMultiId); };
130 waitingRoomScene->onGameStart = [this, menuSceneId]()
131 {
132 utl::Logger::log("RTypeClientMulti: Game starting!", utl::LogLevel::INFO);
133
134 uint32_t sessionId = 0;
135 if (m_engine && m_engine->getNetwork())
136 {
137 sessionId = m_engine->getNetwork()->getSessionId();
138 utl::Logger::log("RTypeClientMulti: Using sessionId " + std::to_string(sessionId), utl::LogLevel::INFO);
139 }
140 auto gameMultiId = m_engine->getSceneManager()->generateNextId();
141 auto gameMulti = std::make_unique<GameMulti>(gameMultiId, m_engine->getRenderer(), m_engine->getAudio(),
142 m_appConfig->skinIndex, m_showDebug, sessionId);
143 gameMulti->addSystem(std::make_unique<ecs::AudioSystem>(m_engine->getAudio(), m_appConfig->audioVolume,
144 gameMulti->getRegistry(), gameMulti->playMusic()));
145 gameMulti->addSystem(std::make_unique<ExplosionSystem>(m_engine->getRenderer()));
146 gameMulti->addSystem(std::make_unique<ecs::SpriteSystem>(m_engine->getRenderer()));
147 gameMulti->addSystem(std::make_unique<ecs::TextSystem>(m_engine->getRenderer()));
148 gameMulti->addSystem(std::make_unique<ecs::StarfieldSystem>(m_engine->getRenderer(), gameMulti->getRegistry()));
149 gameMulti->addSystem(std::make_unique<ecs::AnimationSystem>(m_engine->getRenderer()));
150 gameMulti->addSystem(std::make_unique<gme::LoadingAnimationSystem>(m_engine->getRenderer()));
151 gameMulti->addSystem(std::make_unique<gme::ScrollingSystem>(m_engine->getRenderer()));
152 gameMulti->addSystem(std::make_unique<gme::CollisionSystem>(m_engine->getRenderer(), m_showDebug));
153 gameMulti->addSystem(std::make_unique<ecs::BeamSystem>(m_engine->getRenderer()));
154 gameMulti->addSystem(std::make_unique<gme::ProjectileSystem>(m_engine->getRenderer()));
155 gameMulti->addSystem(std::make_unique<gme::WeaponSystem>(m_engine->getRenderer()));
156 gameMulti->addSystem(std::make_unique<gme::PlayerDirectionSystem>());
157 gameMulti->addSystem(std::make_unique<gme::HealthBarSystem>(m_engine->getRenderer()));
158 gameMulti->addSystem(std::make_unique<ecs::DebugSystem>(m_engine->getRenderer(), m_showDebug));
159
160 gameMulti->onGameOver = [this, menuSceneId]()
161 {
162 utl::Logger::log("RTypeClientMulti: All players died - switching to GameOver scene", utl::LogLevel::INFO);
163
164 auto gameOverId = m_engine->getSceneManager()->generateNextId();
165 auto gameOver = std::make_unique<GameOverScene>(gameOverId, m_engine->getRenderer());
166 gameOver->addSystem(std::make_unique<ecs::AudioSystem>(m_engine->getAudio(), m_appConfig->audioVolume,
167 gameOver->getRegistry(), gameOver->playMusic()));
168 gameOver->addSystem(std::make_unique<ecs::TextSystem>(m_engine->getRenderer()));
169
170 gameOver->onBackToMenu = [this, menuSceneId]() { m_engine->getSceneManager()->switchToScene(menuSceneId); };
171
172 m_engine->getSceneManager()->addScene(std::move(gameOver));
173 m_engine->getSceneManager()->switchToScene(gameOverId);
174 };
175
176 m_engine->getSceneManager()->addScene(std::move(gameMulti));
177 m_engine->getSceneManager()->switchToScene(gameMultiId);
178 };
179
180 m_engine->getSceneManager()->addScene(std::move(serverScene));
181 m_engine->getSceneManager()->addScene(std::move(configMulti));
182 m_engine->getSceneManager()->addScene(std::move(createRoomScene));
183 m_engine->getSceneManager()->addScene(std::move(joinRoomScene));
184 m_engine->getSceneManager()->addScene(std::move(waitingRoomScene));
185}
This file contains the multiplayer configuration scene.
Lobby creation scene for R-Type multiplayer.
Thread-safe event bus implementation for inter-component communication.
Main multiplayer game scene for R-Type.
This file contains the game over scene.
Lobby browser scene for joining multiplayer games.
This file contains the Logger class.
R-Type multiplayer game client plugin implementation.
Server connection configuration scene for R-Type multiplayer.
Waiting room scene for R-Type multiplayer lobby system.
void update(float deltaTime, unsigned int width, unsigned int height) override
Update the multiplayer client plugin (called each frame)
void setupScenes(bool &showDebug, eng::id menuSceneId)
Setup all multiplayer game scenes.
Pre-game lobby scene where players wait before match starts.
void setIsHost(const bool isHost)
Set whether local player is the lobby host.
void setLobbyInfo(const rnp::LobbyInfo &lobbyInfo)
Update lobby information.
void setLobbyId(std::uint32_t lobbyId)
Set the lobby ID.
static void log(const std::string &message, const LogLevel &logLevel)
Definition Logger.hpp:51
unsigned int id
Definition IScene.hpp:20
This file contains the system definitions.
Lobby information structure.
Definition Protocol.hpp:237