diff --git a/sources/Runner/LobbyScene.cpp b/sources/Runner/LobbyScene.cpp index 1c34fd79..8c8daa9d 100644 --- a/sources/Runner/LobbyScene.cpp +++ b/sources/Runner/LobbyScene.cpp @@ -62,7 +62,7 @@ namespace BBM .addComponent([](WAL::Entity &entity, WAL::Wal &wal) { if (Runner::gameState.currentScene != GameState::LobbyScene - && !LobbySystem::playersAreReady(*wal.getScene())) + || !LobbySystem::playersAreReady(*wal.getScene())) return; LobbySystem::switchToGame(wal); }) diff --git a/sources/System/Lobby/LobbySystem.cpp b/sources/System/Lobby/LobbySystem.cpp index 4d775996..0449380c 100644 --- a/sources/System/Lobby/LobbySystem.cpp +++ b/sources/System/Lobby/LobbySystem.cpp @@ -177,11 +177,11 @@ namespace BBM return false; return std::all_of(lobby.begin(), lobby.end(), [](WAL::ViewEntity &entity) { auto &lobbyPlayer = entity.get(); - return lobbyPlayer.ready && lobbyPlayer.layout != ControllableComponent::NONE; + return lobbyPlayer.ready || lobbyPlayer.layout == ControllableComponent::NONE; }); } - void LobbySystem::_addController(WAL::Entity &player, ControllableComponent::Layout layout) + void LobbySystem::addController(WAL::Entity &player, ControllableComponent::Layout layout) { switch (layout) { case ControllableComponent::KEYBOARD_0: @@ -209,35 +209,18 @@ namespace BBM player.getComponent().layout = layout; } - void LobbySystem::switchToGame(WAL::Wal &wal) + void LobbySystem::createTile(std::shared_ptr scene, WAL::Entity &player, int color, int playerCount) { - auto scene = Runner::loadGameScene(); - int mapWidth = Runner::mapWidth; - int mapHeight = Runner::mapHeight; - int playerCount = 0; - - for (auto &[_, lobby] : wal.getScene()->view()) { - if (lobby.layout == ControllableComponent::NONE) - continue; - auto &player = Runner::createPlayer(*scene); - _addController(player, lobby.layout); - player.getComponent().position = Vector3f(mapWidth * (playerCount % 2), - (Runner::hasHeights ? 1.01 : 0), - mapHeight * (!(playerCount % 3))); - auto *model = dynamic_cast(player.getComponent().drawable.get()); - model->setTextureToMaterial(MAP_DIFFUSE, "assets/player/textures/" + colors[lobby.color] + ".png"); - - - std::string texturePath = "assets/player/ui/" + colors[lobby.color] + ".png"; - int x = (playerCount % 2 == 0) ? 1920 - 10 - 320 : 10; - int y = (playerCount % 3 != 0) ? 1080 - 10 - 248 : 10; - scene->addEntity("player color tile") + std::string texturePath = "assets/player/ui/" + colors[color] + ".png"; + int x = (playerCount % 2 == 0) ? 1920 - 10 - 320 : 10; + int y = (playerCount % 3 != 0) ? 1080 - 10 - 248 : 10; + scene->addEntity("player color tile") .addComponent(x, y - 2, 0) - .addComponent(x, y, 320, 248, _rayColors[lobby.color]); - scene->addEntity("player ui tile") + .addComponent(x, y, 320, 248, _rayColors[color]); + scene->addEntity("player ui tile") .addComponent(x, y, 0) .addComponent(texturePath); - scene->addEntity("player hide fireup") + scene->addEntity("player hide fireup") .addComponent(x + 220, y + 35, 0) .addComponent("", 20, x, y, WHITE) .addComponent([&player](Drawable2DComponent &drawble) { @@ -250,7 +233,7 @@ namespace BBM return; text->setText(std::to_string(static_cast(bonus->explosionRadius))); }); - scene->addEntity("player hide bombup") + scene->addEntity("player hide bombup") .addComponent(x + 220, y + 77, 0) .addComponent("", 20, x, y, WHITE) .addComponent([&player](Drawable2DComponent &drawble) { @@ -263,7 +246,7 @@ namespace BBM return; text->setText(std::to_string(bonus->bombCount) + " / " + std::to_string(bonus->maxBombCount)); }); - scene->addEntity("player hide speedup") + scene->addEntity("player hide speedup") .addComponent(x + 220, y + 122, 0) .addComponent("", 20, x, y, WHITE) .addComponent([&player](Drawable2DComponent &drawble) { @@ -276,7 +259,7 @@ namespace BBM return; text->setText(std::to_string(static_cast(speed->speed * 100))); }); - scene->addEntity("player hide wall") + scene->addEntity("player hide wall") .addComponent(x + 220, y + 161, 0) .addComponent("", 20, x, y, WHITE) .addComponent([&player](Drawable2DComponent &drawble) { @@ -289,6 +272,27 @@ namespace BBM return; text->setText(bonus->isNoClipOn ? "YES" : "NO"); }); + } + + void LobbySystem::switchToGame(WAL::Wal &wal) + { + auto scene = Runner::loadGameScene(); + int mapWidth = Runner::mapWidth; + int mapHeight = Runner::mapHeight; + int playerCount = 0; + + for (auto &[_, lobby] : wal.getScene()->view()) { + if (lobby.layout == ControllableComponent::NONE) + continue; + auto &player = Runner::createPlayer(*scene); + player.getComponent().position = Vector3f(mapWidth * (playerCount % 2), + (Runner::hasHeights ? 1.01 : 0), + mapHeight * (!(playerCount % 3))); + auto *model = dynamic_cast(player.getComponent().drawable.get()); + model->setTextureToMaterial(MAP_DIFFUSE, "assets/player/textures/" + colors[lobby.color] + ".png"); + + addController(player, lobby.layout); + createTile(scene, player, lobby.color, playerCount); playerCount++; } Runner::gameState._loadedScenes[GameState::SceneID::GameScene] = scene; diff --git a/sources/System/Lobby/LobbySystem.hpp b/sources/System/Lobby/LobbySystem.hpp index b10641aa..114c6247 100644 --- a/sources/System/Lobby/LobbySystem.hpp +++ b/sources/System/Lobby/LobbySystem.hpp @@ -17,8 +17,6 @@ namespace BBM class LobbySystem : public WAL::System { private: - //! @brief Add a controller for the player. - static void _addController(WAL::Entity &player, ControllableComponent::Layout layout); void _nextColor(WAL::ViewEntity &entity); @@ -29,6 +27,11 @@ namespace BBM public: static std::array colors; + //! @brief Add a controller for the player. + static void addController(WAL::Entity &player, ControllableComponent::Layout layout); + + static void createTile(std::shared_ptr scene, WAL::Entity &player, int color, int playerCount); + //! @inherit void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; diff --git a/sources/System/Lobby/ResumeLobbySystem.cpp b/sources/System/Lobby/ResumeLobbySystem.cpp index 6c0f4a74..faf4ba07 100644 --- a/sources/System/Lobby/ResumeLobbySystem.cpp +++ b/sources/System/Lobby/ResumeLobbySystem.cpp @@ -23,26 +23,13 @@ #include "Component/Color/ColorComponent.hpp" #include "Component/Stat/StatComponent.hpp" #include "Component/Bonus/PlayerBonusComponent.hpp" +#include "System/Lobby/LobbySystem.hpp" namespace RAY3D = RAY::Drawables::Drawables3D; namespace RAY2D = RAY::Drawables::Drawables2D; namespace BBM { - std::array ResumeLobbySystem::_colors = { - "blue", - "red", - "green", - "yellow" - }; - - std::array ResumeLobbySystem::_rayColors = { - BLUE, - RED, - GREEN, - YELLOW - }; - ResumeLobbySystem::ResumeLobbySystem(WAL::Wal &wal) : System(wal) {} @@ -100,33 +87,6 @@ namespace BBM }); } - void ResumeLobbySystem::addController(WAL::Entity &player, ControllableComponent::Layout layout) - { - switch (layout) { - case ControllableComponent::KEYBOARD_0: - case ControllableComponent::KEYBOARD_1: - player.addComponent(layout); - break; - case ControllableComponent::GAMEPAD_0: - player.addComponent(0); - break; - case ControllableComponent::GAMEPAD_1: - player.addComponent(1); - break; - case ControllableComponent::GAMEPAD_2: - player.addComponent(2); - break; - case ControllableComponent::GAMEPAD_3: - player.addComponent(3); - break; - case ControllableComponent::AI: - player.addComponent("./assets/ai_scripts/john.lua"); - break; - default: - throw std::runtime_error("Invalid controller for a player."); - } - } - void ResumeLobbySystem::resumeToGame(WAL::Wal &wal) { auto scene = Runner::gameState._loadedScenes[GameState::SceneID::GameScene]; @@ -149,68 +109,8 @@ namespace BBM bombHolder->maxBombCount = ParserYAML::playersInfos[countPlayer].maxBombCount; speed->speed = ParserYAML::playersInfos[countPlayer].speed; } - addController(player, lobby.layout); - std::string texturePath = "assets/player/ui/" + _colors[lobby.playerColor] + ".png"; - int x = (countPlayer % 2 == 0) ? 1920 - 10 - 320 : 10; - int y = (countPlayer % 3 != 0) ? 1080 - 10 - 248 : 10; - scene->addEntity("player color tile") - .addComponent(x, y - 2, 0) - .addComponent(x, y, 320, 248, _rayColors[lobby.playerColor]); - scene->addEntity("player ui tile") - .addComponent(x, y, 0) - .addComponent(texturePath); - scene->addEntity("player hide fireup") - .addComponent(x + 220, y + 35, 0) - .addComponent("", 20, x, y, WHITE) - .addComponent([&player](Drawable2DComponent &drawble) { - const BombHolderComponent *bonus = player.tryGetComponent(); - - if (!bonus) - return; - RAY2D::Text *text = dynamic_cast(drawble.drawable.get()); - if (!text) - return; - text->setText(std::to_string(static_cast(bonus->explosionRadius))); - }); - scene->addEntity("player hide bombup") - .addComponent(x + 220, y + 77, 0) - .addComponent("", 20, x, y, WHITE) - .addComponent([&player](Drawable2DComponent &drawble) { - const BombHolderComponent *bonus = player.tryGetComponent(); - - if (!bonus) - return; - RAY2D::Text *text = dynamic_cast(drawble.drawable.get()); - if (!text) - return; - text->setText(std::to_string(bonus->bombCount) + " / " + std::to_string(bonus->maxBombCount)); - }); - scene->addEntity("player hide speedup") - .addComponent(x + 220, y + 122, 0) - .addComponent("", 20, x, y, WHITE) - .addComponent([&player](Drawable2DComponent &drawble) { - auto speedComponent = player.tryGetComponent(); - - if (!speedComponent) - return; - RAY2D::Text *text = dynamic_cast(drawble.drawable.get()); - if (!text) - return; - text->setText(std::to_string(static_cast(speedComponent->speed * 100))); - }); - scene->addEntity("player hide wall") - .addComponent(x + 220, y + 161, 0) - .addComponent("", 20, x, y, WHITE) - .addComponent([&player](Drawable2DComponent &drawble) { - const PlayerBonusComponent *bonus = player.tryGetComponent(); - - if (!bonus) - return; - RAY2D::Text *text = dynamic_cast(drawble.drawable.get()); - if (!text) - return; - text->setText(bonus->isNoClipOn ? "YES" : "NO"); - }); + LobbySystem::addController(player, lobby.layout); + LobbySystem::createTile(scene, player, lobby.playerColor, countPlayer); countPlayer++; } Runner::gameState.nextScene = BBM::GameState::SceneID::GameScene; diff --git a/sources/System/Lobby/ResumeLobbySystem.hpp b/sources/System/Lobby/ResumeLobbySystem.hpp index 1621a2e1..10d0a487 100644 --- a/sources/System/Lobby/ResumeLobbySystem.hpp +++ b/sources/System/Lobby/ResumeLobbySystem.hpp @@ -16,13 +16,7 @@ namespace BBM //! @brief A system to handle Health entities. class ResumeLobbySystem : public WAL::System { - private: - static std::array _colors; - - static std::array _rayColors; public: - //! @brief Add a controller for the player. - static void addController(WAL::Entity &player, ControllableComponent::Layout layout); //! @brief Add a controller for the player when we resume a game static void resumeToGame(WAL::Wal &wal);