// // Created by Zoe Roux on 2021-06-14. // #include #include "System/Movable/MovableSystem.hpp" #include #include #include #include #include "Component/Button/ButtonComponent.hpp" #include "Component/Renderer/CameraComponent.hpp" #include "Component/Renderer/Drawable2DComponent.hpp" #include "Runner.hpp" #include "Models/GameState.hpp" #include #include #include #include "System/Music/MusicSystem.hpp" #include "System/Lobby/LobbySystem.hpp" #include "Component/Lobby/LobbyComponent.hpp" namespace RAY3D = RAY::Drawables::Drawables3D; namespace RAY2D = RAY::Drawables::Drawables2D; namespace BBM { std::shared_ptr Runner::loadLobbyScene() { static const std::map sounds = { {SoundComponent::BOMB, "assets/sounds/click.ogg"} }; auto scene = std::make_shared(); addMenuControl(*scene, sounds); scene->addEntity("Control entity") .addComponent("assets/musics/music_player_select.ogg") .addComponent(sounds); scene->addEntity("background") .addComponent() .addComponent("assets/backgrounds/menu.png"); scene->addEntity("white background") .addComponent(200, 300 - 50, 0) .addComponent(Vector2f(), Vector2f(1525, 550), RAY::Color(WHITE).setA(150)); scene->addEntity("white background") .addComponent(1920 / 2 - 500, 1080 - 100, 0) .addComponent(Vector2f(), Vector2f(1000, 100), RAY::Color(WHITE).setA(150)); scene->addEntity("white background") .addComponent(1920 / 2.75 - 10, 80, 0) .addComponent(Vector2f(), Vector2f(650, 130), RAY::Color(WHITE).setA(150)); scene->addEntity("lobby text") .addComponent(1920 / 2.75, 80, 0) .addComponent("Get Ready", 120, RAY::Vector2(), ORANGE); scene->addEntity("lobby text") .addComponent(1920 / 2.75, 1080 - 80, 0) .addComponent("Join: A Button / Space / Right Ctrl", 30, RAY::Vector2(), BLACK); scene->addEntity("lobby text") .addComponent(1920 / 4 + 100, 1080 - 40, 0) .addComponent("Change Skin: B Button / Shift / Left Ctrl", 30, RAY::Vector2(), BLACK); auto &play = scene->addEntity("play button") .addComponent(1920 / 2.5, 1080 - 180 - 50, 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 &, WAL::Wal &wal) { wal.getSystem().unloadLobby(); gameState.nextScene = BBM::GameState::SceneID::MainMenuScene; }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { auto *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_back.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { auto *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_back_hovered.png"); }); auto &howToPlay = scene->addEntity("to to play") .addComponent(1920 - 10 - 75, 1080 - 85, 0) .addComponent("assets/buttons/button_htp.png") .addComponent([](WAL::Entity &entity, WAL::Wal &) { gameState.nextScene = BBM::GameState::SceneID::HowToPlayScene; }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_htp.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_htp_hovered.png"); }); auto &heightOption = scene->addEntity("Height option text") .addComponent(1920 / 6, 2 * 1080 / 3 - 50, 0) .addComponent("2nd Level: Off", 70, RAY::Vector2(), BLACK) .addComponent([](WAL::Entity &entity, WAL::Wal &wal) { auto *text = dynamic_cast(entity.getComponent().drawable.get()); if (text->getString().find("Off") != std::string::npos) { text->setText("2nd Level: On"); Runner::hasHeights = true; } else { text->setText("2nd Level: Off"); Runner::hasHeights = false; } }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { entity.getComponent().drawable->setColor(BLACK); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { entity.getComponent().drawable->setColor(ORANGE); }); auto &aiMore = scene->addEntity("AI+") .addComponent(1920 / 1.75, 1.85 * 1080 / 3 - 50, 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 - 50, 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 - 50, 0) .addComponent(RAY::Vector2(224 * (i + 1) + 200 * i, 1080 / 3), RAY::Vector2(200, 200), RAY::Color(0, 0, 0, 0)); auto &player = scene->addEntity("player") .addComponent(224 * (i + 1) + 200 * i, 1080 / 3 - 50, 0) .addComponent("assets/player/icons/none.png"); auto &ready = scene->addEntity("ready") .addComponent(224 * (i + 1) + 200 * i, 1080 / 3 - 50, 0) .addComponent(); player.addComponent(i, ready, playerTile); } scene->addEntity("camera") .addComponent(-5, 0, -5) .addComponent(Vector3f(8, 0, 8)); play.getComponent().setButtonLinks(&heightOption, &back, &back, &howToPlay); howToPlay.getComponent().setButtonLinks(&play, nullptr, &play); back.getComponent().setButtonLinks(&play, nullptr, nullptr, &play); heightOption.getComponent().setButtonLinks(nullptr, &play, nullptr, &aiLess); aiMore.getComponent().setButtonLinks(nullptr, &aiLess, &heightOption, nullptr); aiLess.getComponent().setButtonLinks(&aiMore, &play, &heightOption, nullptr); return scene; } }