From 01457a0cd5b33949567fab3fa261e5016063f042 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 15 Jun 2021 12:19:40 +0200 Subject: [PATCH 1/6] Clearing the lobby on leave --- lib/Ray/sources/Drawables/Texture.cpp | 6 + lib/Ray/sources/Drawables/Texture.hpp | 3 + .../Controllable/ControllableComponent.hpp | 3 +- sources/Runner/LobbyScene.cpp | 129 +++++++++--------- sources/System/Lobby/LobbySystem.cpp | 19 +++ sources/System/Lobby/LobbySystem.hpp | 3 + 6 files changed, 98 insertions(+), 65 deletions(-) diff --git a/lib/Ray/sources/Drawables/Texture.cpp b/lib/Ray/sources/Drawables/Texture.cpp index 7a70a459..936b399b 100644 --- a/lib/Ray/sources/Drawables/Texture.cpp +++ b/lib/Ray/sources/Drawables/Texture.cpp @@ -56,4 +56,10 @@ namespace RAY { DrawTextureEx(*this, this->_position, 0, scale, this->_color); } + + void Texture::unload() + { + this->_texture = nullptr; + this->_resourcePath = ""; + } } diff --git a/lib/Ray/sources/Drawables/Texture.hpp b/lib/Ray/sources/Drawables/Texture.hpp index 74eab4c8..43126c9d 100644 --- a/lib/Ray/sources/Drawables/Texture.hpp +++ b/lib/Ray/sources/Drawables/Texture.hpp @@ -44,6 +44,9 @@ namespace RAY //! @brief Load texture from file, lets one use one entity for multiple files Texture &use(const std::string &filename); + //! @brief Unload the current texture (calls to drawOn will no-op). + void unload(); + protected: private: //! @brief Texture, really, that's just it... diff --git a/sources/Component/Controllable/ControllableComponent.hpp b/sources/Component/Controllable/ControllableComponent.hpp index 5b7d39ad..50c98e07 100644 --- a/sources/Component/Controllable/ControllableComponent.hpp +++ b/sources/Component/Controllable/ControllableComponent.hpp @@ -25,7 +25,8 @@ namespace BBM GAMEPAD_0, GAMEPAD_1, GAMEPAD_2, - GAMEPAD_3 + GAMEPAD_3, + AI }; //! @brief The X and Z abscis of the movement. diff --git a/sources/Runner/LobbyScene.cpp b/sources/Runner/LobbyScene.cpp index 54e45191..52787fd6 100644 --- a/sources/Runner/LobbyScene.cpp +++ b/sources/Runner/LobbyScene.cpp @@ -44,94 +44,95 @@ namespace BBM .addComponent(1920 / 2.75, 100, 0) .addComponent("Get Ready", 120, RAY::Vector2(), ORANGE); auto &play = scene->addEntity("play button") - .addComponent(1920 / 2.5, 1080 - 180, 0) - .addComponent("assets/buttons/button_new_game.png") - .addComponent([](WAL::Entity &entity, WAL::Wal &wal) - { - auto *texture = dynamic_cast(entity.getComponent().drawable.get()); - texture->use("assets/buttons/button_new_game.png"); - }) - .addComponent([](WAL::Entity &entity, WAL::Wal &wal) - { - auto *texture = dynamic_cast(entity.getComponent().drawable.get()); - texture->use("assets/buttons/button_new_game_hovered.png"); - }) - .addComponent([](WAL::Entity &entity, WAL::Wal &wal) - { - if (Runner::gameState.currentScene != GameState::LobbyScene - || !LobbySystem::playersAreReady(*wal.getScene())) - return; - LobbySystem::switchToGame(wal); - }) - .addComponent>(); + .addComponent(1920 / 2.5, 1080 - 180, 0) + .addComponent("assets/buttons/button_new_game.png") + .addComponent([](WAL::Entity &entity, WAL::Wal &wal) + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); + texture->use("assets/buttons/button_new_game.png"); + }) + .addComponent([](WAL::Entity &entity, WAL::Wal &wal) + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); + texture->use("assets/buttons/button_new_game_hovered.png"); + }) + .addComponent([](WAL::Entity &entity, WAL::Wal &wal) + { + if (Runner::gameState.currentScene != GameState::LobbyScene + || !LobbySystem::playersAreReady(*wal.getScene())) + return; + LobbySystem::switchToGame(wal); + }) + .addComponent>(); auto &back = scene->addEntity("back to menu") .addComponent(10, 1080 - 85, 0) .addComponent("assets/buttons/button_back.png") - .addComponent([](WAL::Entity &entity, WAL::Wal &) - { - gameState.nextScene = BBM::GameState::SceneID::MainMenuScene; - }) + .addComponent([](WAL::Entity &entity, WAL::Wal &wal) + { + gameState.nextScene = BBM::GameState::SceneID::MainMenuScene; + wal.getSystem().unloadLobby(); + }) .addComponent([](WAL::Entity &entity, WAL::Wal &) - { - RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); - texture->use("assets/buttons/button_back.png"); - }) + texture->use("assets/buttons/button_back.png"); + }) .addComponent([](WAL::Entity &entity, WAL::Wal &) - { - RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); - texture->use("assets/buttons/button_back_hovered.png"); - }); + texture->use("assets/buttons/button_back_hovered.png"); + }); auto &lavaOption = scene->addEntity("lava option text") .addComponent(1920 / 6, 2 * 1080 / 3, 0) .addComponent("Lava: Off", 70, RAY::Vector2(), BLACK) .addComponent([](WAL::Entity &entity, WAL::Wal &wal) - { - RAY2D::Text *text = dynamic_cast(entity.getComponent().drawable.get()); + { + auto *text = dynamic_cast(entity.getComponent().drawable.get()); - if (text->getString().find("Off") != std::string::npos) { - text->setText("Lava: On"); - //do - } else { - text->setText("Lava: Off"); - //do - } - }) + if (text->getString().find("Off") != std::string::npos) { + text->setText("Lava: On"); + //do + } else { + text->setText("Lava: Off"); + //do + } + }) .addComponent([](WAL::Entity &entity, WAL::Wal &) - { - entity.getComponent().drawable->setColor(BLACK); - }) + { + entity.getComponent().drawable->setColor(BLACK); + }) .addComponent([](WAL::Entity &entity, WAL::Wal &) - { - entity.getComponent().drawable->setColor(ORANGE); - }); + { + entity.getComponent().drawable->setColor(ORANGE); + }); auto &heightOption = scene->addEntity("Height option text") .addComponent(1920 / 1.75, 2 * 1080 / 3, 0) .addComponent("2nd Level: Off", 70, RAY::Vector2(), BLACK) .addComponent([](WAL::Entity &entity, WAL::Wal &wal) - { - RAY2D::Text *text = dynamic_cast(entity.getComponent().drawable.get()); + { + auto *text = dynamic_cast(entity.getComponent().drawable.get()); - if (text->getString().find("Off") != std::string::npos) { - text->setText("2nd Level: On"); - //do - } else { - text->setText("2nd Level: Off"); - //do - } - }) + if (text->getString().find("Off") != std::string::npos) { + text->setText("2nd Level: On"); + //do + } else { + text->setText("2nd Level: Off"); + //do + } + }) .addComponent([](WAL::Entity &entity, WAL::Wal &) - { - entity.getComponent().drawable->setColor(BLACK); - }) + { + entity.getComponent().drawable->setColor(BLACK); + }) .addComponent([](WAL::Entity &entity, WAL::Wal &) - { - entity.getComponent().drawable->setColor(ORANGE); - }); + { + entity.getComponent().drawable->setColor(ORANGE); + }); for (int i = 0; i < 4; i++) { auto &playerTile = scene->addEntity("player tile") diff --git a/sources/System/Lobby/LobbySystem.cpp b/sources/System/Lobby/LobbySystem.cpp index 9c020625..f11b9a7e 100644 --- a/sources/System/Lobby/LobbySystem.cpp +++ b/sources/System/Lobby/LobbySystem.cpp @@ -143,6 +143,9 @@ namespace BBM case ControllableComponent::GAMEPAD_3: player.addComponent(3); break; + case ControllableComponent::AI: + throw std::runtime_error("Not implemented error"); + break; default: throw std::runtime_error("Invalid controller for a player."); } @@ -169,5 +172,21 @@ namespace BBM } Runner::gameState._loadedScenes[GameState::SceneID::GameScene] = scene; Runner::gameState.nextScene = BBM::GameState::SceneID::GameScene; + wal.getSystem().unloadLobby(); + } + + void LobbySystem::unloadLobby() + { + this->_colorTaken.fill(false); + for (auto &[_, lobby, drawable] : this->getView()) { + lobby.layout = ControllableComponent::NONE; + lobby.ready = false; + lobby.color = -1; + drawable.drawable = std::make_shared("assets/player/icons/none.png"); + lobby.coloredTile.getComponent().drawable->setColor(RAY::Color(0, 0, 0, 0)); + auto *texture = dynamic_cast(lobby.readyButton.getComponent().drawable.get()); + if (texture) + texture->unload(); + } } } \ No newline at end of file diff --git a/sources/System/Lobby/LobbySystem.hpp b/sources/System/Lobby/LobbySystem.hpp index b0a91bb3..d92171f9 100644 --- a/sources/System/Lobby/LobbySystem.hpp +++ b/sources/System/Lobby/LobbySystem.hpp @@ -42,6 +42,9 @@ namespace BBM //! @param wal The engine. static void switchToGame(WAL::Wal &wal); + //! @brief Reset the lobby scene to it's default state. + void unloadLobby(); + //! @brief A default constructor explicit LobbySystem(WAL::Wal &wal); //! @brief A Lobby system is copy constructable From 123fe91080381d93a586425624184c7bd2a2b42d Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 15 Jun 2021 14:03:07 +0200 Subject: [PATCH 2/6] Renaming the select button --- sources/Component/Controllable/ControllableComponent.hpp | 4 ++-- sources/Runner/Runner.cpp | 2 +- sources/System/Gamepad/GamepadSystem.cpp | 2 +- sources/System/Keyboard/KeyboardSystem.cpp | 2 +- sources/System/Lobby/LobbySystem.cpp | 8 ++++---- .../System/MenuControllable/MenuControllableSystem.cpp | 2 +- sources/System/Sound/MenuSoundManagerSystem.cpp | 2 +- sources/System/Sound/PlayerSoundManagerSystem.cpp | 6 +++--- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/sources/Component/Controllable/ControllableComponent.hpp b/sources/Component/Controllable/ControllableComponent.hpp index 50c98e07..62c0bd13 100644 --- a/sources/Component/Controllable/ControllableComponent.hpp +++ b/sources/Component/Controllable/ControllableComponent.hpp @@ -31,8 +31,8 @@ namespace BBM //! @brief The X and Z abscis of the movement. Vector2f move; - //! @brief input value for jump - bool jump = false; + //! @brief input value to select + bool select = false; //! @brief input value for bomb bool bomb = false; //! @brief input value for pause diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 6af5e04c..a8d1bf00 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -50,7 +50,7 @@ namespace BBM if (component.pause && gameState.currentScene == GameState::SceneID::GameScene) { gameState.nextScene = GameState::SceneID::PauseMenuScene; break; - } else if (gameState.currentScene == GameState::SceneID::SplashScreen && component.jump) { + } else if (gameState.currentScene == GameState::SceneID::SplashScreen && component.select) { gameState.nextScene = GameState::SceneID::TitleScreenScene; break; } diff --git a/sources/System/Gamepad/GamepadSystem.cpp b/sources/System/Gamepad/GamepadSystem.cpp index 623d5edd..7ff78016 100644 --- a/sources/System/Gamepad/GamepadSystem.cpp +++ b/sources/System/Gamepad/GamepadSystem.cpp @@ -24,7 +24,7 @@ namespace BBM Gamepad gamepad(gamepadComponent.getID()); const std::map keyPressedMap = { - {gamepadComponent.keyJump, controllable.jump}, + {gamepadComponent.keyJump, controllable.select}, {gamepadComponent.keyBomb, controllable.bomb}, {gamepadComponent.keyPause, controllable.pause} }; diff --git a/sources/System/Keyboard/KeyboardSystem.cpp b/sources/System/Keyboard/KeyboardSystem.cpp index 334b757a..8dbda5ab 100644 --- a/sources/System/Keyboard/KeyboardSystem.cpp +++ b/sources/System/Keyboard/KeyboardSystem.cpp @@ -22,7 +22,7 @@ namespace BBM auto &controllable = entity.get(); const std::map keyPressedMap = { - {keyboard.keyJump, controllable.jump}, + {keyboard.keyJump, controllable.select}, {keyboard.keyBomb, controllable.bomb}, {keyboard.keyPause, controllable.pause} }; diff --git a/sources/System/Lobby/LobbySystem.cpp b/sources/System/Lobby/LobbySystem.cpp index f11b9a7e..140f85c6 100644 --- a/sources/System/Lobby/LobbySystem.cpp +++ b/sources/System/Lobby/LobbySystem.cpp @@ -67,7 +67,7 @@ namespace BBM if (lobby.layout == ControllableComponent::NONE) { for (auto &[_, ctrl] : this->_wal.getScene()->view()) { auto &controller = ctrl; - if (controller.jump) { + if (controller.select) { if (std::any_of(this->getView().begin(), this->getView().end(), [&controller](WAL::ViewEntity &view) { return view.get().layout == controller.layout; })) @@ -76,7 +76,7 @@ namespace BBM lobby.color = -1; this->_nextColor(entity); lobby.layout = controller.layout; - controller.jump = false; + controller.select = false; return; } } @@ -85,10 +85,10 @@ namespace BBM for (auto &[_, controller] : this->_wal.getScene()->view()) { if (controller.layout != lobby.layout) continue; - if (controller.jump && !lobby.ready) { + if (controller.select && !lobby.ready) { lobby.ready = true; lobby.lastInput = lastTick; - controller.jump = false; + controller.select = false; this->_wal.getSystem().now = lastTick; auto *texture = dynamic_cast(lobby.readyButton.getComponent().drawable.get()); if (texture) diff --git a/sources/System/MenuControllable/MenuControllableSystem.cpp b/sources/System/MenuControllable/MenuControllableSystem.cpp index 6dcc95e3..d70ae7bc 100644 --- a/sources/System/MenuControllable/MenuControllableSystem.cpp +++ b/sources/System/MenuControllable/MenuControllableSystem.cpp @@ -60,6 +60,6 @@ namespace BBM } if (!this->_currentButton) return; - this->_updateCurrentButton(controllable.jump, controllable.move); + this->_updateCurrentButton(controllable.select, controllable.move); } } \ No newline at end of file diff --git a/sources/System/Sound/MenuSoundManagerSystem.cpp b/sources/System/Sound/MenuSoundManagerSystem.cpp index c1261f32..7f3e57e4 100644 --- a/sources/System/Sound/MenuSoundManagerSystem.cpp +++ b/sources/System/Sound/MenuSoundManagerSystem.cpp @@ -20,7 +20,7 @@ namespace BBM { std::map soundIndex = { {controllable.move.x, SoundComponent::MOVE}, {controllable.move.y, SoundComponent::MOVE}, - {controllable.jump, SoundComponent::JUMP}, + {controllable.select, SoundComponent::JUMP}, }; for (auto &a : soundIndex) { if (a.first) { diff --git a/sources/System/Sound/PlayerSoundManagerSystem.cpp b/sources/System/Sound/PlayerSoundManagerSystem.cpp index dac45304..4068a5e3 100644 --- a/sources/System/Sound/PlayerSoundManagerSystem.cpp +++ b/sources/System/Sound/PlayerSoundManagerSystem.cpp @@ -19,9 +19,9 @@ namespace BBM { sound.setVolume(sound.volume); std::map soundIndex = { - {health.getHealthPoint() <= 0, SoundComponent::DEATH}, - {controllable.bomb, SoundComponent::BOMB}, - {controllable.jump, SoundComponent::JUMP}, + {health.getHealthPoint() <= 0, SoundComponent::DEATH}, + {controllable.bomb, SoundComponent::BOMB}, + {controllable.select, SoundComponent::JUMP}, {controllable.move.x != 0 || controllable.move.y != 0, SoundComponent::MOVE} }; for (auto &a : soundIndex) { From 404c5d3d57d3843f82fe584e3db0a37339602929 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 15 Jun 2021 16:09:47 +0200 Subject: [PATCH 3/6] Adding AIs buttons --- assets/buttons/cpu_add.png | Bin 0 -> 11118 bytes assets/buttons/cpu_add_hovered.png | Bin 0 -> 10301 bytes assets/buttons/cpu_remove.png | Bin 0 -> 13327 bytes assets/buttons/cpu_remove_hovered.png | Bin 0 -> 11896 bytes sources/Runner/LobbyScene.cpp | 48 +++++++++++++++++++++++--- sources/System/Lobby/LobbySystem.cpp | 41 ++++++++++++++++++++++ sources/System/Lobby/LobbySystem.hpp | 6 ++++ 7 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 assets/buttons/cpu_add.png create mode 100644 assets/buttons/cpu_add_hovered.png create mode 100644 assets/buttons/cpu_remove.png create mode 100644 assets/buttons/cpu_remove_hovered.png diff --git a/assets/buttons/cpu_add.png b/assets/buttons/cpu_add.png new file mode 100644 index 0000000000000000000000000000000000000000..adf5167f8d3d2bf62c92401f8a7b3aa2af098e28 GIT binary patch literal 11118 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 V;duWm?rQ>ohKjCo`AwVf{{!CWM$7;J literal 0 HcmV?d00001 diff --git a/assets/buttons/cpu_add_hovered.png b/assets/buttons/cpu_add_hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..51c828d9385974dd71f1c0d2f44f233bb0e2b810 GIT binary patch literal 10301 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 Dk;956 literal 0 HcmV?d00001 diff --git a/assets/buttons/cpu_remove_hovered.png b/assets/buttons/cpu_remove_hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..03d935bffd070e61874c5ea109937b3d9fe28b12 GIT binary patch literal 11896 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 Mq@`GP&phyd0iZ&OFaQ7m literal 0 HcmV?d00001 diff --git a/sources/Runner/LobbyScene.cpp b/sources/Runner/LobbyScene.cpp index 52787fd6..5370ed95 100644 --- a/sources/Runner/LobbyScene.cpp +++ b/sources/Runner/LobbyScene.cpp @@ -87,7 +87,7 @@ namespace BBM texture->use("assets/buttons/button_back_hovered.png"); }); auto &lavaOption = scene->addEntity("lava option text") - .addComponent(1920 / 6, 2 * 1080 / 3, 0) + .addComponent(1920 / 6, 1.85 * 1080 / 3, 0) .addComponent("Lava: Off", 70, RAY::Vector2(), BLACK) .addComponent([](WAL::Entity &entity, WAL::Wal &wal) { @@ -111,7 +111,7 @@ namespace BBM }); auto &heightOption = scene->addEntity("Height option text") - .addComponent(1920 / 1.75, 2 * 1080 / 3, 0) + .addComponent(1920 / 6, 2.1 * 1080 / 3, 0) .addComponent("2nd Level: Off", 70, RAY::Vector2(), BLACK) .addComponent([](WAL::Entity &entity, WAL::Wal &wal) { @@ -134,6 +134,42 @@ namespace BBM entity.getComponent().drawable->setColor(ORANGE); }); + auto &aiMore = scene->addEntity("AI+") + .addComponent(1920 / 1.75, 1.85 * 1080 / 3, 0) + .addComponent("assets/buttons/cpu_add.png") + .addComponent([](WAL::Entity &entity, WAL::Wal &wal) + { + wal.getSystem().addAI(); + }) + .addComponent([](WAL::Entity &entity, WAL::Wal &) + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); + texture->use("assets/buttons/cpu_add.png"); + }) + .addComponent([](WAL::Entity &entity, WAL::Wal &) + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); + texture->use("assets/buttons/cpu_add_hovered.png"); + }); + + auto &aiLess = scene->addEntity("AI-") + .addComponent(1920 / 1.75, 2.10 * 1080 / 3, 0) + .addComponent("assets/buttons/cpu_remove.png") + .addComponent([](WAL::Entity &entity, WAL::Wal &wal) + { + wal.getSystem().removeAI(); + }) + .addComponent([](WAL::Entity &entity, WAL::Wal &) + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); + texture->use("assets/buttons/cpu_remove.png"); + }) + .addComponent([](WAL::Entity &entity, WAL::Wal &) + { + auto *texture = dynamic_cast(entity.getComponent().drawable.get()); + texture->use("assets/buttons/cpu_remove_hovered.png"); + }); + for (int i = 0; i < 4; i++) { auto &playerTile = scene->addEntity("player tile") .addComponent(224 * (i + 1) + 200 * i, 1080 / 3, 0) @@ -149,10 +185,12 @@ namespace BBM scene->addEntity("camera") .addComponent(8, 20, 7) .addComponent(Vector3f(8, 0, 8)); - play.getComponent().setButtonLinks(&lavaOption, &back, &back, nullptr); + play.getComponent().setButtonLinks(&heightOption, &back, &back, nullptr); back.getComponent().setButtonLinks(&play, nullptr, nullptr, &play); - lavaOption.getComponent().setButtonLinks(nullptr, &play, nullptr, &heightOption); - heightOption.getComponent().setButtonLinks(nullptr, &play, &lavaOption, nullptr); + lavaOption.getComponent().setButtonLinks(nullptr, &heightOption, nullptr, &aiMore); + heightOption.getComponent().setButtonLinks(&lavaOption, &play, nullptr, &aiLess); + aiMore.getComponent().setButtonLinks(nullptr, &aiLess, &lavaOption, nullptr); + aiLess.getComponent().setButtonLinks(&aiMore, &play, &heightOption, nullptr); return scene; } } \ No newline at end of file diff --git a/sources/System/Lobby/LobbySystem.cpp b/sources/System/Lobby/LobbySystem.cpp index 140f85c6..4ff24b97 100644 --- a/sources/System/Lobby/LobbySystem.cpp +++ b/sources/System/Lobby/LobbySystem.cpp @@ -101,6 +101,47 @@ namespace BBM } } + void LobbySystem::addAI() + { + for (auto entity : this->getView()) { + auto &lobby = entity.get(); + if (lobby.layout != ControllableComponent::NONE) + continue; + lobby.color = -1; + this->_nextColor(entity); + lobby.layout = ControllableComponent::AI; + lobby.ready = true; + auto *texture = dynamic_cast(lobby.readyButton.getComponent().drawable.get()); + if (texture) + texture->use("assets/player/icons/ready.png"); + return; + } + } + + void LobbySystem::removeAI() + { + std::optional> last; + for (auto &entity : this->getView()) { + auto &lobby = entity.get(); + if (lobby.layout == ControllableComponent::AI) + last.emplace(entity); + } + if (!last) + return; + auto &entity = *last; + auto &lobby = entity.get(); + auto &drawable = entity.get(); + this->_colorTaken[lobby.color] = false; + lobby.color = -1; + lobby.layout = ControllableComponent::NONE; + lobby.ready = false; + drawable.drawable = std::make_shared("assets/player/icons/none.png"); + lobby.coloredTile.getComponent().drawable->setColor(RAY::Color(0, 0, 0, 0)); + auto *texture = dynamic_cast(lobby.readyButton.getComponent().drawable.get()); + if (texture) + texture->unload(); + } + void LobbySystem::onSelfUpdate() { auto &view = this->_wal.getScene()->view, Drawable2DComponent>(); diff --git a/sources/System/Lobby/LobbySystem.hpp b/sources/System/Lobby/LobbySystem.hpp index d92171f9..2cbf0258 100644 --- a/sources/System/Lobby/LobbySystem.hpp +++ b/sources/System/Lobby/LobbySystem.hpp @@ -45,6 +45,12 @@ namespace BBM //! @brief Reset the lobby scene to it's default state. void unloadLobby(); + //! @brief Add an AI to the game. + void addAI(); + + //! @brief Remove an AI from the game. + void removeAI(); + //! @brief A default constructor explicit LobbySystem(WAL::Wal &wal); //! @brief A Lobby system is copy constructable From 0533796f632c936c9e9049486e218966ec480e87 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 15 Jun 2021 16:35:04 +0200 Subject: [PATCH 4/6] Adding ai holders --- assets/player/icons/ai.png | Bin 19339 -> 16520 bytes sources/System/Lobby/LobbySystem.cpp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/player/icons/ai.png b/assets/player/icons/ai.png index ccd108e6195bb0bf28b72205d7d1c5a0cd9e3c09..7e069b3ee0bef9f8d37754f5a2563823554f50e2 100644 GIT binary patch literal 16520 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 F{{RYAcFq6* literal 19339 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 XuDW9OmP1t600000NkvXXu0mjf2uLx) diff --git a/sources/System/Lobby/LobbySystem.cpp b/sources/System/Lobby/LobbySystem.cpp index 4ff24b97..7ad06983 100644 --- a/sources/System/Lobby/LobbySystem.cpp +++ b/sources/System/Lobby/LobbySystem.cpp @@ -113,7 +113,7 @@ namespace BBM lobby.ready = true; auto *texture = dynamic_cast(lobby.readyButton.getComponent().drawable.get()); if (texture) - texture->use("assets/player/icons/ready.png"); + texture->use("assets/player/icons/ai.png"); return; } } From 19d8425af0a7ad7a953b1deab2a5a8202e17c496 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 15 Jun 2021 17:05:26 +0200 Subject: [PATCH 5/6] Enabling height toogle --- sources/Runner/GameScene.cpp | 5 +---- sources/Runner/LobbyScene.cpp | 4 ++-- sources/Runner/Runner.cpp | 1 + sources/Runner/Runner.hpp | 6 ++++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sources/Runner/GameScene.cpp b/sources/Runner/GameScene.cpp index 50242df1..7793ab32 100644 --- a/sources/Runner/GameScene.cpp +++ b/sources/Runner/GameScene.cpp @@ -14,11 +14,8 @@ #include "Component/Collision/CollisionComponent.hpp" #include "Component/Movable/MovableComponent.hpp" #include "Component/BombHolder/BombHolderComponent.hpp" -#include "Component/Shaders/ShaderComponent.hpp" #include "Component/Tag/TagComponent.hpp" #include "Component/Renderer/Drawable3DComponent.hpp" -#include "Component/Button/ButtonComponent.hpp" -#include "Drawables/2D/Text.hpp" #include "Component/Gravity/GravityComponent.hpp" #include "Component/BumperTimer/BumperTimerComponent.hpp" #include "Model/Model.hpp" @@ -34,7 +31,7 @@ namespace BBM scene->addEntity("camera") .addComponent(8, 20, 7) .addComponent(Vector3f(8, 0, 8)); - MapGenerator::loadMap(16, 16, MapGenerator::createMap(16, 16), scene); + MapGenerator::loadMap(16, 16, MapGenerator::createMap(16, 16, hasHeights), scene); return scene; } diff --git a/sources/Runner/LobbyScene.cpp b/sources/Runner/LobbyScene.cpp index 5370ed95..c2221298 100644 --- a/sources/Runner/LobbyScene.cpp +++ b/sources/Runner/LobbyScene.cpp @@ -119,10 +119,10 @@ namespace BBM if (text->getString().find("Off") != std::string::npos) { text->setText("2nd Level: On"); - //do + Runner::hasHeights = true; } else { text->setText("2nd Level: Off"); - //do + Runner::hasHeights = false; } }) .addComponent([](WAL::Entity &entity, WAL::Wal &) diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index a8d1bf00..2e29e4b2 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -39,6 +39,7 @@ namespace BBM { GameState Runner::gameState; + bool Runner::hasHeights = false; void Runner::updateState(WAL::Wal &engine, GameState &state) { diff --git a/sources/Runner/Runner.hpp b/sources/Runner/Runner.hpp index dd225e1e..b5b0bb4d 100644 --- a/sources/Runner/Runner.hpp +++ b/sources/Runner/Runner.hpp @@ -9,9 +9,11 @@ namespace BBM { class Runner { - public: + public: + //! @brief Has the map heights or is it disabled? + static bool hasHeights; - //! @brief store current scenes informations + //! @brief store current scenes information static GameState gameState; //! @brief Start the game and run a Bomberman. //! @return 0 on success, another value on error. From 856809d9c074c0c597dee732a4581b41e37b66ea Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 15 Jun 2021 18:00:37 +0200 Subject: [PATCH 6/6] Fixing p --- sources/System/Lobby/LobbySystem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sources/System/Lobby/LobbySystem.cpp b/sources/System/Lobby/LobbySystem.cpp index 7ad06983..6fcee4ac 100644 --- a/sources/System/Lobby/LobbySystem.cpp +++ b/sources/System/Lobby/LobbySystem.cpp @@ -185,7 +185,7 @@ namespace BBM player.addComponent(3); break; case ControllableComponent::AI: - throw std::runtime_error("Not implemented error"); +// throw std::runtime_error("Not implemented error"); break; default: throw std::runtime_error("Invalid controller for a player."); @@ -206,7 +206,7 @@ namespace BBM _addController(player, lobby.layout); player.getComponent().position = Vector3f(mapWidth * (playerCount % 2), 0, - mapHeight * ((playerCount + 1) % 2)); + mapHeight * (!(playerCount % 3))); auto *model = dynamic_cast(player.getComponent().drawable.get()); model->setTextureToMaterial(MAP_DIFFUSE, "assets/player/textures/" + _colors[lobby.color] + ".png"); playerCount++;