From fbdd3536f33fb635c8f8091a925fcb837783cdc2 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Tue, 20 Oct 2015 11:43:39 +0200 Subject: [PATCH] Kraken shows up on last stage. Created WaterSystem for possible future use. --- include/Core/Engine.h | 6 +- include/Game/CProjectile.h | 2 +- include/Game/EClusterClear.h | 2 +- include/Game/EInkBlaster.h | 1 + include/Game/EKrakenDefeated.h | 26 +++++ include/Game/EKrakenHit.h | 26 +++++ include/Game/ERaiseWater.h | 1 + include/Game/ERaiseWaterWall.h | 26 +++++ include/Game/ERelevantObjectCreated.h | 27 +++++ include/Game/EStageCleared.h | 1 + include/Game/EStartedNewLevel.h | 22 ++++ include/Game/KrakenSystem.h | 9 ++ include/Game/LevelSystem.h | 9 ++ include/Game/PadSystem.h | 4 + include/Game/ProjectileSystem.h | 1 + include/Game/WaterSystem.h | 72 +++++++++++++ src/game/Game/KrakenSystem.cpp | 147 +++++++++++++++++++++++++- src/game/Game/LevelSystem.cpp | 46 +++++--- src/game/Game/PadSystem.cpp | 55 +++++++--- src/game/Game/ProjectileSystem.cpp | 5 +- src/game/Game/TravellingSystem.cpp | 2 +- src/game/Game/WaterSystem.cpp | 124 ++++++++++++++++++++++ 22 files changed, 576 insertions(+), 38 deletions(-) create mode 100644 include/Game/EKrakenDefeated.h create mode 100644 include/Game/EKrakenHit.h create mode 100644 include/Game/ERaiseWaterWall.h create mode 100644 include/Game/ERelevantObjectCreated.h create mode 100644 include/Game/EStartedNewLevel.h create mode 100644 include/Game/WaterSystem.h create mode 100644 src/game/Game/WaterSystem.cpp diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 79c08be..35eafa8 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -59,6 +59,7 @@ #include "Game/LifebuoySystem.h" #include "Game/ProjectileSystem.h" #include "Game/KrakenSystem.h" +#include "Game/WaterSystem.h" #include "Game/Bricks/CPowerUpBrick.h" #include "Game/BrickComponents.h" @@ -164,7 +165,7 @@ public: m_World->ComponentFactory.Register(); m_World->SystemFactory.Register( - [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); + [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); m_World->SystemFactory.Register( [this]() { return new Systems::PadSystem(m_World.get(), m_EventBroker); }); @@ -193,6 +194,9 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::KrakenSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::WaterSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); diff --git a/include/Game/CProjectile.h b/include/Game/CProjectile.h index 6161b6f..ea5eee1 100644 --- a/include/Game/CProjectile.h +++ b/include/Game/CProjectile.h @@ -15,7 +15,7 @@ namespace Components struct Projectile : Component { - + float Speed = 5; }; } diff --git a/include/Game/EClusterClear.h b/include/Game/EClusterClear.h index 79cd9c4..0d9379e 100644 --- a/include/Game/EClusterClear.h +++ b/include/Game/EClusterClear.h @@ -12,7 +12,7 @@ namespace Events struct ClusterClear : Event { - + int ClusterCleared; }; } diff --git a/include/Game/EInkBlaster.h b/include/Game/EInkBlaster.h index 03058ca..8ec42e3 100644 --- a/include/Game/EInkBlaster.h +++ b/include/Game/EInkBlaster.h @@ -17,6 +17,7 @@ struct InkBlaster : Event { Components::Transform* Transform; int Shots; + float Speed = 5; }; } diff --git a/include/Game/EKrakenDefeated.h b/include/Game/EKrakenDefeated.h new file mode 100644 index 0000000..30cffaf --- /dev/null +++ b/include/Game/EKrakenDefeated.h @@ -0,0 +1,26 @@ +// +// Created by Adniklastrator on 2015-10-19. +// + +#ifndef DAYDREAM_EKRAKENDEFEATED_H +#define DAYDREAM_EKRAKENDEFEATED_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct KrakenDefeated : Event +{ + EntityID Kraken; + EntityID Hitter; +}; + +} + +} + +#endif //DAYDREAM_EKRAKENDEFEATED_H diff --git a/include/Game/EKrakenHit.h b/include/Game/EKrakenHit.h new file mode 100644 index 0000000..7024395 --- /dev/null +++ b/include/Game/EKrakenHit.h @@ -0,0 +1,26 @@ +// +// Created by Adniklastrator on 2015-10-19. +// + +#ifndef DAYDREAM_EKRAKENHIT_H +#define DAYDREAM_EKRAKENHIT_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct KrakenHit : Event +{ + EntityID Kraken; + EntityID Hitter; +}; + +} + +} + +#endif //DAYDREAM_EKRAKENHIT_H diff --git a/include/Game/ERaiseWater.h b/include/Game/ERaiseWater.h index 2697723..3ccf199 100644 --- a/include/Game/ERaiseWater.h +++ b/include/Game/ERaiseWater.h @@ -16,6 +16,7 @@ namespace Events struct RaiseWater : Event { float Amount; + float Speed; }; } diff --git a/include/Game/ERaiseWaterWall.h b/include/Game/ERaiseWaterWall.h new file mode 100644 index 0000000..872b97d --- /dev/null +++ b/include/Game/ERaiseWaterWall.h @@ -0,0 +1,26 @@ +// +// Created by Administrator on 2015-10-20. +// + +#ifndef DAYDREAM_ERAISEWATERWALL_H +#define DAYDREAM_ERAISEWATERWALL_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct RaiseWaterWall : Event +{ + float Amount; + float Speed; +}; + +} + +} + +#endif //DAYDREAM_ERAISEWATERWALL_H diff --git a/include/Game/ERelevantObjectCreated.h b/include/Game/ERelevantObjectCreated.h new file mode 100644 index 0000000..b9f392b --- /dev/null +++ b/include/Game/ERelevantObjectCreated.h @@ -0,0 +1,27 @@ +// +// Created by Administrator on 2015-10-20. +// + +#ifndef DAYDREAM_ERELEVANTOBJECTCREATED_H +#define DAYDREAM_ERELEVANTOBJECTCREATED_H + +#include "Core/EventBroker.h" +#include "Core/Entity.h" + +namespace dd +{ + +namespace Events +{ + +struct RelevantObjectCreated : Event +{ + std::string ObjectName; + EntityID ObjectID; +}; + +} + +} + +#endif //DAYDREAM_ERELEVANTOBJECTCREATED_H diff --git a/include/Game/EStageCleared.h b/include/Game/EStageCleared.h index 1de7bb5..5b01afb 100644 --- a/include/Game/EStageCleared.h +++ b/include/Game/EStageCleared.h @@ -17,6 +17,7 @@ struct StageCleared : Event { int ClearedStage = 0; int StageCluster = 0; + int StagesInCluster = 6; }; } diff --git a/include/Game/EStartedNewLevel.h b/include/Game/EStartedNewLevel.h new file mode 100644 index 0000000..58593ba --- /dev/null +++ b/include/Game/EStartedNewLevel.h @@ -0,0 +1,22 @@ +// +// Created by Administrator on 2015-10-19. +// + +#ifndef DAYDREAM_ESTARTEDNEWLEVEL_H +#define DAYDREAM_ESTARTEDNEWLEVEL_H + +#include "Core/EventBroker.h" +#include "Core/Entity.h" + +namespace dd +{ +namespace Events +{ +struct StartedNewLevel : Event +{ + +}; +} +} + +#endif //DAYDREAM_ESTARTEDNEWLEVEL_H diff --git a/include/Game/KrakenSystem.h b/include/Game/KrakenSystem.h index fb836e8..6c21d60 100644 --- a/include/Game/KrakenSystem.h +++ b/include/Game/KrakenSystem.h @@ -17,13 +17,18 @@ #include "Physics/CCircleShape.h" #include "Physics/CPhysics.h" #include "Physics/EContact.h" +#include "Physics/ESetImpulse.h" +#include "Physics/ECreateParticleSequence.h" #include "Game/EPause.h" #include "Game/EResume.h" #include "Game/EKrakenAppear.h" #include "Game/EKrakenAttack.h" +#include "Game/EKrakenHit.h" +#include "Game/EKrakenDefeated.h" #include "Game/EBrickGenerating.h" #include "Game/CTravels.h" #include "Game/CKraken.h" +#include "Game/CBall.h" #include "Sound/CCollisionSound.h" //#include "Core/Camera.h" Camera Component @@ -69,12 +74,16 @@ private: dd::EventRelay m_EContact; dd::EventRelay m_EKrakenAppear; dd::EventRelay m_EKrakenAttack; + dd::EventRelay m_EKrakenHit; + dd::EventRelay m_EKrakenDefeated; dd::EventRelay m_EBrickGenerating; bool OnPause(const dd::Events::Pause &event); bool OnResume(const dd::Events::Resume &event); bool OnContact(const dd::Events::Contact &event); bool OnKrakenAppear(const dd::Events::KrakenAppear &event); bool OnKrakenAttack(const dd::Events::KrakenAttack &event); + bool OnKrakenHit(const dd::Events::KrakenHit &event); + bool OnKrakenDefeated(const dd::Events::KrakenDefeated &event); bool OnBrickGenerating(const dd::Events::BrickGenerating &event); void GetBrickSet(); }; diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 691230e..280cd35 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -31,7 +31,9 @@ #include "Game/BrickComponents.h" +#include "Game/ERelevantObjectCreated.h" #include "Game/EStageCleared.h" +#include "Game/EArrivedAtNewStage.h" #include "Game/ELifeLost.h" #include "Game/EResetBall.h" #include "Game/EScoreEvent.h" @@ -50,7 +52,9 @@ #include "Game/ECreatePowerUp.h" #include "Game/EPowerUpTaken.h" +#include "Game/CKraken.h" #include "Game/EKrakenAppear.h" +#include "Game/EKrakenDefeated.h" #include "Game/EBrickGenerating.h" #include "Physics/CPhysics.h" @@ -145,6 +149,7 @@ private: int m_NumberOfBricks; int m_Rows = 6; int m_Lines = 7; + int m_StagesInCluster = 6; float m_SpaceToEdge = 0.25f; glm::vec2 m_SpaceBetweenBricks = glm::vec2(1, 0.4); float m_NotResettingTheStage = 5.f; @@ -174,10 +179,12 @@ private: dd::EventRelay m_ECreatePowerUp; dd::EventRelay m_EPowerUpTaken; dd::EventRelay m_EStageCleared; + dd::EventRelay m_EArrivedAtNewStage; dd::EventRelay m_EPause; dd::EventRelay m_EResume; dd::EventRelay m_EHitPad; dd::EventRelay m_EBrickGenerating; + dd::EventRelay m_EKrakenDefeated; bool OnContact(const dd::Events::Contact &event); bool OnScoreEvent(const dd::Events::ScoreEvent &event); @@ -186,11 +193,13 @@ private: bool OnCreatePowerUp(const dd::Events::CreatePowerUp &event); bool OnPowerUpTaken(const dd::Events::PowerUpTaken &event); bool OnStageCleared(const dd::Events::StageCleared &event); + bool OnArrivedAtNewStage(const dd::Events::ArrivedAtNewStage &event); bool OnPause(const dd::Events::Pause &event); bool OnResume(const dd::Events::Resume &event); bool OnHitPad(const dd::Events::HitPad &event); bool OnBrickGenerating(const dd::Events::BrickGenerating &event); void GetBrickSet(int Set); + bool OnKrakenDefeated(const dd::Events::KrakenDefeated &event); void GetNextLevel(); void SetBrokenModel(EntityID entity); diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index d5b43aa..204b56f 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -36,6 +36,7 @@ #include "Game/EResetBall.h" #include "Game/EResetAll.h" #include "Game/ERaiseWater.h" +#include "Game/ERaiseWaterWall.h" #include "Game/EMultiBall.h" #include "Game/ELifebuoy.h" #include "Game/EStickyPad.h" @@ -118,6 +119,7 @@ private: dd::EventRelay m_EResetBall; dd::EventRelay m_EResetAll; dd::EventRelay m_ERaiseWater; + dd::EventRelay m_ERaiseWaterWall; dd::EventRelay m_EPause; dd::EventRelay m_EResume; dd::EventRelay m_EKrakenAttack; @@ -133,6 +135,8 @@ private: bool OnResetBall(const dd::Events::ResetBall &event); bool OnResetAll(const dd::Events::ResetAll &event); bool OnRaiseWater(const dd::Events::RaiseWater &event); + bool OnRaiseWaterWall(const dd::Events::RaiseWaterWall &event); + bool RaisePad(float amount, float speed); bool OnPause(const dd::Events::Pause &event); bool OnResume(const dd::Events::Resume &event); bool OnKrakenAttack(const dd::Events::KrakenAttack &event); diff --git a/include/Game/ProjectileSystem.h b/include/Game/ProjectileSystem.h index d4a6e11..8d6059d 100644 --- a/include/Game/ProjectileSystem.h +++ b/include/Game/ProjectileSystem.h @@ -52,6 +52,7 @@ private: bool m_InkBlaster = false; bool m_SquidLoaded = false; int m_Shots = 0; + float m_InkBlasterSpeed = 5; EntityID m_InkBlastTemplate; EntityID m_AttachedSquid; diff --git a/include/Game/WaterSystem.h b/include/Game/WaterSystem.h new file mode 100644 index 0000000..91fe459 --- /dev/null +++ b/include/Game/WaterSystem.h @@ -0,0 +1,72 @@ +// +// Created by Adniklastrator on 2015-10-20. +// + +#ifndef DAYDREAM_WATERSYSTEM_H +#define DAYDREAM_WATERSYSTEM_H + + +#include "Core/System.h" +#include "Core/CTransform.h" +#include "Core/CTemplate.h" +#include "Core/EventBroker.h" +#include "Core/World.h" +#include "Transform/EMove.h" +#include "Physics/CWaterVolume.h" +#include "Physics/CRectangleShape.h" +#include "Game/EPause.h" +#include "Game/EResume.h" +#include "Game/ERelevantObjectCreated.h" +#include "Game/ERaiseWater.h" +#include "Game/ERaiseWaterWall.h" +#include "Game/EArrivedAtNewStage.h" +#include "Game/EStageCleared.h" + + +namespace dd +{ + +namespace Systems +{ + +class WaterSystem : public System +{ +public: + WaterSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) + { } + + + void Initialize() override; + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + + bool IsPaused() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + +private: + bool m_Pause = false; + EntityID m_BottomWall = 0; + + dd::EventRelay m_EPause; + dd::EventRelay m_EResume; + dd::EventRelay m_ERelevantObjectCreated; + dd::EventRelay m_EStageCleared; + dd::EventRelay m_EArrivedAtNewStage; + dd::EventRelay m_ERaiseWater; + dd::EventRelay m_ERaiseWaterWall; + + bool OnPause(const dd::Events::Pause &event); + bool OnResume(const dd::Events::Resume &event); + bool OnRelevantObjectCreated(const dd::Events::RelevantObjectCreated &event); + bool OnStageCleared(const dd::Events::StageCleared &event); + bool OnArrivedAtNewStage(const dd::Events::ArrivedAtNewStage &event); + bool OnRaiseWater(const dd::Events::RaiseWater &event); + bool OnRaiseWaterWall(const dd::Events::RaiseWaterWall &event); +}; + +} + +} + +#endif //DAYDREAM_WATERSYSTEM_H diff --git a/src/game/Game/KrakenSystem.cpp b/src/game/Game/KrakenSystem.cpp index 61f7088..fbf6058 100644 --- a/src/game/Game/KrakenSystem.cpp +++ b/src/game/Game/KrakenSystem.cpp @@ -11,8 +11,11 @@ void dd::Systems::KrakenSystem::Initialize() m_RandomGenerator = std::mt19937(rd()); EVENT_SUBSCRIBE_MEMBER(m_EPause, &KrakenSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_EResume, &KrakenSystem::OnResume); + EVENT_SUBSCRIBE_MEMBER(m_EContact, &KrakenSystem::OnContact); EVENT_SUBSCRIBE_MEMBER(m_EKrakenAppear, &KrakenSystem::OnKrakenAppear); EVENT_SUBSCRIBE_MEMBER(m_EKrakenAttack, &KrakenSystem::OnKrakenAttack); + EVENT_SUBSCRIBE_MEMBER(m_EKrakenHit, &KrakenSystem::OnKrakenHit); + EVENT_SUBSCRIBE_MEMBER(m_EKrakenDefeated, &KrakenSystem::OnKrakenDefeated); EVENT_SUBSCRIBE_MEMBER(m_EBrickGenerating, &KrakenSystem::OnBrickGenerating); EntityID ent = m_World->CreateEntity(); @@ -59,7 +62,7 @@ void dd::Systems::KrakenSystem::Update(double dt) void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - if (IsPaused()) { + if (IsPaused() || !m_KrakenBattle) { return; } @@ -68,6 +71,11 @@ void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityI auto kraken = m_World->GetComponent(entity); if (kraken != nullptr) { + auto transform = m_World->GetComponent(entity); + if (transform->Position.y < -10) { + m_World->RemoveEntity(entity); + return; + } Events::KrakenAttack krakenAttack; switch (kraken->CurrentAction) { @@ -77,9 +85,9 @@ void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityI m_KrakenTimer = 0; std::uniform_real_distribution dist(1, 2.999f); float random = dist(m_RandomGenerator); - std::cout << random << std::endl; + //std::cout << random << std::endl; kraken->CurrentAction = random; - std::cout << kraken->CurrentAction << std::endl; + //std::cout << kraken->CurrentAction << std::endl; } break; case 2: // Grabbing @@ -126,6 +134,42 @@ bool dd::Systems::KrakenSystem::OnResume(const dd::Events::Resume &event) return true; } +bool dd::Systems::KrakenSystem::OnContact(const dd::Events::Contact &event) +{ + Components::Kraken* kraken1 = m_World->GetComponent(event.Entity1); + Components::Kraken* kraken2 = m_World->GetComponent(event.Entity2); + Components::Kraken* kraken; + + if (kraken1 != nullptr && kraken2 != nullptr) { + return false; + } + + EntityID krakenEntity, otherEntitiy; + + //Which is the ball? + if (kraken1 != nullptr) { + krakenEntity = event.Entity1; + otherEntitiy = event.Entity2; + kraken = kraken1; + } + else if (kraken2 != nullptr) { + krakenEntity = event.Entity2; + otherEntitiy = event.Entity1; + kraken = kraken2; + } + else { + return false; + } + + auto ball = m_World->GetComponent(otherEntitiy); + if (ball != nullptr) { + Events::KrakenHit e; + e.Kraken = krakenEntity; + e.Hitter = otherEntitiy; + EventBroker->Publish(e); + } +} + bool dd::Systems::KrakenSystem::OnKrakenAppear(const dd::Events::KrakenAppear &event) { auto ent = m_World->CloneEntity(m_KrakenTemplate); @@ -144,6 +188,103 @@ bool dd::Systems::KrakenSystem::OnKrakenAttack(const dd::Events::KrakenAttack &e return true; } +bool dd::Systems::KrakenSystem::OnKrakenHit(const dd::Events::KrakenHit &event) +{ + auto kraken = m_World->GetComponent(event.Kraken); + //kraken->Health--; + //std::cout << kraken->Health << std::endl; + kraken->Health = -1; + if (kraken->Health < 0) { + Events::KrakenDefeated e; + e.Kraken = event.Kraken; + e.Hitter = event.Hitter; + EventBroker->Publish(e); + } + return false; +} + +bool dd::Systems::KrakenSystem::OnKrakenDefeated(const dd::Events::KrakenDefeated &event) +{ + m_KrakenBattle = false; + + auto kraken = m_World->GetComponent(event.Kraken); + auto physicsComponent = m_World->GetComponent(event.Kraken); + /*physicsComponent->CollisionType = CollisionType::Type::Dynamic; + physicsComponent->GravityScale = 1.f; + physicsComponent->Mask = static_cast(CollisionLayer::Water | CollisionLayer::Wall); + physicsComponent->Calculate = false;*/ + + auto transformComponentBrick = m_World->GetComponent(event.Kraken); + auto transformComponentHitter = m_World->GetComponent(event.Hitter); + + + auto brickModel = m_World->GetComponent(event.Kraken); + + auto cTransform = m_World->GetComponent(event.Kraken); + /*cTransform->Position = cTransform->Position + transformComponentBrick->Position; + glm::vec2 ballToBrick = 4.f * glm::normalize(glm::vec2(cTransform->Position.x - transformComponentHitter->Position.x, cTransform->Position.y - transformComponentHitter->Position.y)); + cTransform->Velocity = glm::vec3(ballToBrick.x, ballToBrick.y, 0.f); + + std::uniform_real_distribution dist(-1.5f, 1.5f); + int impulseStrength = dist(m_RandomGenerator); + + Events::SetImpulse i; + i.Entity = event.Kraken; + i.Impulse = glm::vec2(impulseStrength, 0.f); + i.Point = glm::vec2(cTransform->Position.x, cTransform->Position.y + 0.5f); + EventBroker->Publish(i);*/ + + auto cModel = m_World->GetComponent(event.Kraken); + cModel->Color = brickModel->Color; + cModel->Color *= 0.5f; + + /*m_World->RemoveComponent(event.Kraken); + m_World->SetEntityParent(event.Kraken, 0); + m_World->CommitEntity(event.Kraken);*/ + + //Particle trail + Events::CreateParticleSequence trail; + trail.parent = event.Kraken; + trail.AlphaValues.push_back(1.f); + trail.AlphaValues.push_back(0.f); + trail.ScaleValues.push_back(glm::vec3(0.08f)); + trail.ScaleValues.push_back(glm::vec3(0.f)); + trail.RadiusDistribution = 1; + trail.EmitterLifeTime = 2.f; + trail.ParticleLifeTime = 1.f; + trail.ParticlesPerTick = 1; + trail.SpawnRate = 0.1f; + trail.Speed = 10.f; + trail.EmittingAngle = glm::half_pi(); + trail.SpriteFile = "Textures/Particles/FadeBall.png"; + trail.Color = brickModel->Color; + //p.Spread = ... + EventBroker->Publish(trail); + + //ParticlePoof + Events::CreateParticleSequence poof; + poof.EmitterLifeTime = 4; + poof.EmittingAngle = glm::half_pi(); + poof.Spread = 0.5f; + poof.NumberOfTicks = 1; + poof.ParticleLifeTime = 1.5f; + poof.ParticlesPerTick = 1; + poof.Position = cTransform->Position; + poof.ScaleValues.clear(); + poof.ScaleValues.push_back(glm::vec3(0.5f)); + poof.ScaleValues.push_back(glm::vec3(2.f, 2.f, 0.2f)); + poof.SpriteFile = "Textures/Particles/Cloud_Particle.png"; + poof.Color = brickModel->Color; + poof.AlphaValues.clear(); + poof.AlphaValues.push_back(1.f); + poof.AlphaValues.push_back(0.f); + poof.Speed = 10; + EventBroker->Publish(poof); + + + return true; +} + bool dd::Systems::KrakenSystem::OnBrickGenerating(const dd::Events::BrickGenerating &event) { return true; diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index d3051e4..5a52c0e 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -18,10 +18,12 @@ void dd::Systems::LevelSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, &LevelSystem::OnMultiBallLost); EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, &LevelSystem::OnPowerUpTaken); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &LevelSystem::OnStageCleared); + EVENT_SUBSCRIBE_MEMBER(m_EArrivedAtNewStage, &LevelSystem::OnArrivedAtNewStage); EVENT_SUBSCRIBE_MEMBER(m_EPause, &LevelSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_EResume, &LevelSystem::OnResume); EVENT_SUBSCRIBE_MEMBER(m_EHitPad, &LevelSystem::OnHitPad); EVENT_SUBSCRIBE_MEMBER(m_EBrickGenerating, &LevelSystem::OnBrickGenerating); + EVENT_SUBSCRIBE_MEMBER(m_EKrakenDefeated, &LevelSystem::OnKrakenDefeated); //PointLightTest { @@ -82,16 +84,7 @@ void dd::Systems::LevelSystem::Initialize() }*/ // auto particleEmitter= m_World->AddComponent(Pe); - //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); - } + //ParticleTest @@ -132,20 +125,23 @@ void dd::Systems::LevelSystem::Initialize() //TODO: Why does the ball not collide with these bricks? //BottomBox { - auto BottomWall = m_World->CreateEntity(); + EntityID BottomWall = m_World->CreateEntity(); auto transform = m_World->AddComponent(BottomWall); auto wall = m_World->AddComponent(BottomWall); transform->Position = glm::vec3(0.f, -6.f, -10.f); transform->Scale = glm::vec3(20.f, 0.5f, 1.f); - //std::shared_ptr sprite = m_World->AddComponent(BottomWall); - //sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + std::shared_ptr sprite = m_World->AddComponent(BottomWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; std::shared_ptr rectangleShape = m_World->AddComponent(BottomWall); rectangleShape->Dimensions = glm::vec2(20.f, 0.5f); std::shared_ptr physics = m_World->AddComponent(BottomWall); physics->CollisionType = CollisionType::Type::Static; physics->Category = CollisionLayer::Wall; + physics->Calculate = true; physics->Mask = static_cast(CollisionLayer::LifeBuoy); m_World->CommitEntity(BottomWall); + + m_World->SetProperty(BottomWall, "Name", "BottomWall"); } { @@ -295,6 +291,7 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID } else if (brick->Type == InkBlasterBrick) { Events::InkBlaster e; e.Shots = 5; + e.Speed = 5; EventBroker->Publish(e); } else if(brick->Type == KrakenAttackBrick) { Events::KrakenAttack e; @@ -315,6 +312,7 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID Events::StageCleared ec; ec.ClearedStage = m_CurrentLevel; ec.StageCluster = m_CurrentCluster; + ec.StagesInCluster = m_StagesInCluster; EventBroker->Publish(ec); } else { if (ball != nullptr && MultiBalls() > 0) { @@ -682,6 +680,7 @@ void dd::Systems::LevelSystem::BrickHit(EntityID entityHitter, EntityID entityBr Events::InkBlaster e; e.Transform = transformComponentBrick; e.Shots = 5; + e.Speed = 5; EventBroker->Publish(e); } else { @@ -704,8 +703,6 @@ void dd::Systems::LevelSystem::BrickHit(EntityID entityHitter, EntityID entityBr auto brickChildren = m_World->GetEntityChildren(entityBrick); for (auto b : brickChildren) { - - auto cTransform = m_World->GetComponent(b); cTransform->Position = cTransform->Position + transformComponentBrick->Position; glm::vec2 ballToBrick = 4.f * glm::normalize(glm::vec2(cTransform->Position.x - transformComponentHitter->Position.x, cTransform->Position.y - transformComponentHitter->Position.y)); @@ -831,6 +828,16 @@ bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &ev return true; } +bool dd::Systems::LevelSystem::OnKrakenDefeated(const dd::Events::KrakenDefeated &event) +{ + SetNumberOfBricks(NumberOfBricks() - 1); + m_LooseBricks--; + + std::cout << m_LooseBricks << std::endl; + + return true; +} + bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) { if (!m_Cleared) { @@ -842,12 +849,13 @@ bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &ev es.Score = 500; EventBroker->Publish(es); m_CurrentLevel++; - if (m_CurrentLevel < 6) { + if (m_CurrentLevel <= event.StagesInCluster) { GetNextLevel(); CreateLevel(12); //NextLevelDistance } else { // Win Events::ClusterClear e; + e.ClusterCleared = m_CurrentCluster; EventBroker->Publish(e); Events::Pause p; @@ -858,6 +866,12 @@ bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &ev return true; } +bool dd::Systems::LevelSystem::OnArrivedAtNewStage(const dd::Events::ArrivedAtNewStage &event) +{ + m_Cleared = false; + return true; +} + void dd::Systems::LevelSystem::GetNextLevel() { std::array level; diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index b366d64..65654d1 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -30,6 +30,7 @@ void dd::Systems::PadSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); EVENT_SUBSCRIBE_MEMBER(m_EResetAll, &PadSystem::OnResetAll); EVENT_SUBSCRIBE_MEMBER(m_ERaiseWater, &PadSystem::OnRaiseWater); + EVENT_SUBSCRIBE_MEMBER(m_ERaiseWaterWall, &PadSystem::OnRaiseWaterWall); EVENT_SUBSCRIBE_MEMBER(m_EPause, &PadSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_EResume, &PadSystem::OnResume); EVENT_SUBSCRIBE_MEMBER(m_EKrakenAttack, &PadSystem::OnKrakenAttack); @@ -74,6 +75,17 @@ void dd::Systems::PadSystem::Initialize() m_StickTransform = transform; m_StickyAim = sticky; + + /*{ + auto entChild = m_World->CreateEntity(ent); + std::shared_ptr transform = m_World->AddComponent(entChild); + transform->Position = glm::vec3(0.f, 12.5f, 0.f); + + transform->Scale = glm::vec3(0.1f, 25.f, 0.1f); + std::shared_ptr sprite = m_World->AddComponent(entChild); + sprite->SpriteFile = "Models/Brick/White.png"; + sprite->Color = glm::vec4(0.f, 0.5f, 0.f, 0.5f); + }*/ } m_ResetBall = true; @@ -219,8 +231,14 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { } else if (val == GLFW_KEY_W) { Events::RaiseWater e; e.Amount = 0.2; + e.Speed = 0.2; EventBroker->Publish(e); - } else if (val == GLFW_KEY_A) { + } else if (val == GLFW_KEY_Q) { + Events::RaiseWaterWall e; + e.Amount = 0.2; + e.Speed = 0.2; + EventBroker->Publish(e); + } else if (val == GLFW_KEY_A) { Events::ResetAll e; EventBroker->Publish(e); } else if (val == GLFW_KEY_M) { @@ -267,6 +285,7 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { } else if (val == GLFW_KEY_I) { Events::InkBlaster e; e.Shots = 5; + e.Speed = 5; EventBroker->Publish(e); } else if (val == GLFW_KEY_K) { Events::KrakenAttack e; @@ -416,21 +435,29 @@ bool dd::Systems::PadSystem::OnResetAll(const dd::Events::ResetAll &event) } bool dd::Systems::PadSystem::OnRaiseWater(const dd::Events::RaiseWater &event) +{ + RaisePad(event.Amount, event.Speed); + + return true; +} + +bool dd::Systems::PadSystem::OnRaiseWaterWall(const dd::Events::RaiseWaterWall &event) +{ + RaisePad(event.Amount, event.Speed); + + return true; +} + +bool dd::Systems::PadSystem::RaisePad(float amount, float speed) { auto transform = Transform(); - glm::vec3 raise = glm::vec3(0, event.Amount, 0); - transform->Position += raise; - - { - 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, event.Amount * 1.6f, 1.f); - auto water = m_World->AddComponent(t_waterBody); - auto body = m_World->AddComponent(t_waterBody); - m_World->CommitEntity(t_waterBody); - } - + glm::vec3 raise = glm::vec3(0, amount, 0); + Events::Move e; + e.Entity = m_Entity; + e.GoalPosition = transform->Position + raise; + e.Speed = speed; + e.Queue = true; + EventBroker->Publish(e); return true; } diff --git a/src/game/Game/ProjectileSystem.cpp b/src/game/Game/ProjectileSystem.cpp index 7e73f86..4457f2d 100644 --- a/src/game/Game/ProjectileSystem.cpp +++ b/src/game/Game/ProjectileSystem.cpp @@ -98,6 +98,7 @@ bool dd::Systems::ProjectileSystem::OnInkBlaster(const dd::Events::InkBlaster &e { m_InkBlaster = true; m_Shots = event.Shots; + m_InkBlasterSpeed = event.Speed; return true; } @@ -115,9 +116,11 @@ bool dd::Systems::ProjectileSystem::OnActionButton(const dd::Events::ActionButto if (m_InkBlaster && m_SquidLoaded) { auto ent = m_World->CloneEntity(m_InkBlastTemplate); m_World->RemoveComponent(ent); + auto projectile = m_World->GetComponent(ent); + projectile->Speed = m_InkBlasterSpeed; auto transform = m_World->GetComponent(ent); transform->Position = event.Position; - transform->Velocity = glm::vec3(0, 5, 0); + transform->Velocity = glm::vec3(0, projectile->Speed, 0); m_Shots--; if (m_Shots <= 0) { auto ball = m_World->GetComponent(m_AttachedSquid); diff --git a/src/game/Game/TravellingSystem.cpp b/src/game/Game/TravellingSystem.cpp index 13dc89b..f6985e2 100644 --- a/src/game/Game/TravellingSystem.cpp +++ b/src/game/Game/TravellingSystem.cpp @@ -97,7 +97,7 @@ bool dd::Systems::TravellingSystem::OnResume(const dd::Events::Resume &event) bool dd::Systems::TravellingSystem::OnStageCleared(const dd::Events::StageCleared &event) { - if (event.ClearedStage < 5) { + if (event.ClearedStage < event.StagesInCluster) { m_Travelling = true; } return true; diff --git a/src/game/Game/WaterSystem.cpp b/src/game/Game/WaterSystem.cpp new file mode 100644 index 0000000..39a5b8c --- /dev/null +++ b/src/game/Game/WaterSystem.cpp @@ -0,0 +1,124 @@ +// +// 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); + + //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); + } +} + +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; } + + 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; + } + } + } +} + +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) +{ + + return true; +} + +bool dd::Systems::WaterSystem::OnArrivedAtNewStage(const dd::Events::ArrivedAtNewStage &event) +{ + + 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, -3.5f, -10.f); + transform->Scale = glm::vec3(7.0f, event.Amount * 1.6f, 1.f); + auto water = m_World->AddComponent(t_waterBody); + auto body = m_World->AddComponent(t_waterBody); + m_World->CommitEntity(t_waterBody); + } + + 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; +} \ No newline at end of file