// // Created by Zoe Roux on 6/11/21. // #include "System/Event/EventSystem.hpp" #include "Component/Renderer/Drawable2DComponent.hpp" #include "System/Lobby/ResumeLobbySystem.hpp" #include "Component/Controllable/ControllableComponent.hpp" #include "Component/Speed/SpeedComponent.hpp" #include "System/MenuControllable/MenuControllableSystem.hpp" #include "Component/Tag/TagComponent.hpp" #include #include #include #include #include #include "Component/Color/ColorComponent.hpp" #include "System/Lobby/LobbySystem.hpp" namespace RAY3D = RAY::Drawables::Drawables3D; namespace RAY2D = RAY::Drawables::Drawables2D; namespace BBM { ResumeLobbySystem::ResumeLobbySystem(WAL::Wal &wal) : System(wal) {} void ResumeLobbySystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) { auto &lobby = entity.get(); auto lastTick = std::chrono::steady_clock::now(); if (lastTick - lobby.lastInput < std::chrono::milliseconds(150)) return; if (lobby.layout == ControllableComponent::NONE) { for (auto &[_, ctrl] : this->_wal.getScene()->view()) { auto &controller = ctrl; if (controller.bomb) { if (std::any_of(this->getView().begin(), this->getView().end(), [&controller](WAL::ViewEntity &view) { return view.get().layout == controller.layout; })) return; lobby.ready = true; lobby.lastInput = lastTick; lobby.layout = controller.layout; controller.bomb = false; this->_wal.getSystem().now = lastTick; auto *texture = dynamic_cast(lobby.readyButton.getComponent().drawable.get()); if (texture) texture->use("assets/player/icons/ready.png"); return; } } } } void ResumeLobbySystem::onSelfUpdate(std::chrono::nanoseconds dtime) { auto &view = this->_wal.getScene()->view, Drawable2DComponent>(); if (view.size() == 0) return; auto *texture = dynamic_cast(view.front().get().drawable.get()); if (!texture) return; if (playersAreReady(*this->_wal.getScene())) texture->setColor(WHITE); else texture->setColor(GRAY); } bool ResumeLobbySystem::playersAreReady(WAL::Scene &scene) { auto &lobby = scene.view(); return std::all_of(lobby.begin(), lobby.end(), [](WAL::ViewEntity &entity) { auto &lobbyPlayer = entity.get(); return lobbyPlayer.ready && lobbyPlayer.layout != ControllableComponent::NONE; }); } void ResumeLobbySystem::resumeToGame(WAL::Wal &wal) { auto scene = Runner::gameState.loadedScenes[GameState::SceneID::GameScene]; int countPlayer = 0; for (auto &[_, lobby] : wal.getScene()->view()) { if (lobby.layout == ControllableComponent::NONE) continue; auto &player = Runner::createPlayer(*scene); player.setName(ParserYAML::playersInfos[countPlayer].name); auto *position = player.tryGetComponent(); auto *bombHolder = player.tryGetComponent(); auto *model = player.tryGetComponent(); auto *speed = player.tryGetComponent(); if (position && bombHolder && model && speed) { dynamic_cast(model->drawable.get())->setTextureToMaterial(MAP_DIFFUSE, ParserYAML::playersInfos[countPlayer].asset); position->position = ParserYAML::playersInfos[countPlayer].position; bombHolder->explosionRadius = ParserYAML::playersInfos[countPlayer].explosionRange; bombHolder->maxBombCount = ParserYAML::playersInfos[countPlayer].maxBombCount; speed->speed = ParserYAML::playersInfos[countPlayer].speed; } LobbySystem::addController(player, lobby.layout); LobbySystem::createTile(scene, player, lobby.playerColor, countPlayer); countPlayer++; } Runner::gameState.nextScene = BBM::GameState::SceneID::GameScene; wal.getSystem().unloadLobbyFromResume(); ParserYAML::playersInfos.clear(); } void ResumeLobbySystem::unloadLobbyFromResume() { for (auto &entity : this->getView()) { entity->scheduleDeletion(); } } }