// // Created by Adniklastrator on 2015-10-20. // #include "PrecompiledHeader.h" #include "Game/WaterSystem.h" void dd::Systems::WaterSystem::Initialize() { EVENT_SUBSCRIBE_MEMBER(m_EPause, &WaterSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_EResume, &WaterSystem::OnResume); EVENT_SUBSCRIBE_MEMBER(m_ERelevantObjectCreated, &WaterSystem::OnRelevantObjectCreated); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &WaterSystem::OnStageCleared); EVENT_SUBSCRIBE_MEMBER(m_ERaiseWater, &WaterSystem::OnRaiseWater); EVENT_SUBSCRIBE_MEMBER(m_ERaiseWaterWall, &WaterSystem::OnRaiseWaterWall); m_RaiseWater = ResourceManager::Load("Config.ini")->GetValue("Debug.RaiseWater", false); //Water test { auto t_waterBody = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_waterBody); transform->Position = glm::vec3(0.f, -3.5f, -10.f); transform->Scale = glm::vec3(7.0f, 1.5f, 1.f); auto water = m_World->AddComponent(t_waterBody); auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); } m_BrickPartCounters = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; } void dd::Systems::WaterSystem::Update(double dt) { if (m_Pause) { return; } } void dd::Systems::WaterSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { if (m_Pause) { return; } auto templateCheck = m_World->GetComponent(entity); if (templateCheck != nullptr){ return; } auto brickPart = m_World->GetComponent(entity); if (brickPart != nullptr) { auto transform = m_World->GetComponent(entity); if (m_RaiseWater) { if (!brickPart->Submerged) { if (transform->Position.y < m_SubmergedHeight) { brickPart->Submerged = true; m_BrickPartCounters[brickPart->NumberOfPartsInBrick]++; //std::cout << "Parts: " << m_BrickPartCounters[brickPart->NumberOfPartsInBrick] << " of " << brickPart->NumberOfPartsInBrick << std::endl; if (m_BrickPartCounters[brickPart->NumberOfPartsInBrick] >= brickPart->NumberOfPartsInBrick) { m_BrickPartCounters[brickPart->NumberOfPartsInBrick] = 0; Events::RaiseWater e; e.Amount = 0.2; e.Speed = 0.2; EventBroker->Publish(e); } } } } if (transform->Position.y < -10) { m_World->RemoveEntity(entity); return; } } if (m_BottomWall == 0) { for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { if (m_World->GetProperty(it->first, "Name") == "BottomWall") { m_BottomWall = entity; break; } } } auto newWater = m_World->GetComponent(entity); if (newWater != nullptr) { if (m_RemoveWater) { //m_World->RemoveComponent(entity); //m_World->RemoveComponent(entity); //m_World->RemoveComponent(entity); //m_World->RemoveEntity(entity); //m_World->RemoveComponent(); } /*auto transform = m_World->AddComponent(entity); if (transform->Position.y < -10) { m_World->RemoveEntity(entity); }*/ } } bool dd::Systems::WaterSystem::OnPause(const dd::Events::Pause &event) { /*if (event.Type != "WaterSystem" && event.Type != "All") { return false; }*/ m_Pause = true; return true; } bool dd::Systems::WaterSystem::OnResume(const dd::Events::Resume &event) { /*if (event.Type != "WaterSystem" && event.Type != "All") { return false; }*/ m_Pause = false; return true; } bool dd::Systems::WaterSystem::OnRelevantObjectCreated(const dd::Events::RelevantObjectCreated &event) { if (event.ObjectName == "BottomWall") { m_BottomWall = event.ObjectID; } return true; } bool dd::Systems::WaterSystem::OnStageCleared(const dd::Events::StageCleared &event) { m_SubmergedHeight = m_SubmergedOriginalHeight; m_RemoveWater = true; return true; } bool dd::Systems::WaterSystem::OnArrivedAtNewStage(const dd::Events::ArrivedAtNewStage &event) { m_RemoveWater = false; return true; } bool dd::Systems::WaterSystem::OnRaiseWater(const dd::Events::RaiseWater &event) { { auto t_waterBody = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_waterBody); transform->Position = glm::vec3(0.f, m_SubmergedHeight, -10.f); transform->Scale = glm::vec3(7.0f, event.Amount * 1.4f, 1.f); auto water = m_World->AddComponent(t_waterBody); auto newWater = m_World->AddComponent(t_waterBody); //Meaning it isn't the original water we had. auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); } m_SubmergedHeight += event.Amount; return true; } bool dd::Systems::WaterSystem::OnRaiseWaterWall(const dd::Events::RaiseWaterWall &event) { auto transform = m_World->GetComponent(m_BottomWall); if (transform != nullptr) { glm::vec3 raise = glm::vec3(0, event.Amount, 0); Events::Move e; e.Entity = m_BottomWall; e.GoalPosition = transform->Position + raise; e.Queue = true; e.Speed = 0.2; EventBroker->Publish(e); } else { LOG_ERROR("There is no BottomWall in WaterSystem"); } return true; }