From 5c2844c1370517674be6c6bc1fdc9e8b24d06bc9 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Thu, 8 Oct 2015 20:02:51 +0200 Subject: [PATCH] InkBlaster functions as intended! It just needs ink! --- include/Core/Engine.h | 6 ++ include/Game/BallSystem.h | 5 +- include/Game/CBall.h | 1 + include/Game/CProjectile.h | 25 ++++++ include/Game/EActionButton.h | 2 +- include/Game/EHitPad.h | 4 +- include/Game/EInkBlaster.h | 25 ++++++ include/Game/ELifebuoy.h | 2 +- include/Game/LevelSystem.h | 3 + include/Game/ProjectileSystem.h | 72 +++++++++++++++++ include/Physics/CPhysics.h | 16 ++-- src/game/Game/BallSystem.cpp | 30 ++++--- src/game/Game/LevelSystem.cpp | 67 +++++++++++++--- src/game/Game/PadSystem.cpp | 4 +- src/game/Game/ProjectileSystem.cpp | 124 +++++++++++++++++++++++++++++ 15 files changed, 350 insertions(+), 36 deletions(-) create mode 100644 include/Game/CProjectile.h create mode 100644 include/Game/EInkBlaster.h create mode 100644 include/Game/ProjectileSystem.h create mode 100644 src/game/Game/ProjectileSystem.cpp diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 09db604..ed3a2ba 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -44,10 +44,12 @@ #include "Game/CBall.h" #include "Game/CPad.h" #include "Game/CLifebuoy.h" +#include "Game/CProjectile.h" #include "Game/CBrick.h" #include "Game/BallSystem.h" #include "Game/HitLagSystem.h" #include "Game/LifebuoySystem.h" +#include "Game/ProjectileSystem.h" #include "Game/Bricks/CPowerUpBrick.h" #include "Physics/PhysicsSystem.h" @@ -113,6 +115,7 @@ public: m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -132,6 +135,9 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::LifebuoySystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::ProjectileSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->SystemFactory.Register( [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index 8399209..9b7c4ca 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -22,6 +22,7 @@ #include "Game/EMultiBall.h" #include "Game/EMultiBallLost.h" #include "Game/EStickyPad.h" +#include "Game/EInkBlaster.h" #include "Game/EGameOver.h" #include "Game/EPause.h" #include "Game/EHitPad.h" @@ -93,8 +94,8 @@ private: bool m_Pause = false; bool m_Waiting = true; bool m_Sticky = false; + bool m_InkBlaster = false; int m_StickyCounter = 5; - EntityID m_LastCollision = 999999; glm::vec3 m_SavedSpeed; bool m_InitializePause = false; @@ -109,6 +110,7 @@ private: dd::EventRelay m_EResetBall; dd::EventRelay m_EMultiBall; dd::EventRelay m_EStickyPad; + dd::EventRelay m_EInkBlaster; dd::EventRelay m_EPause; dd::EventRelay m_Contact; dd::EventRelay m_EActionButton; @@ -119,6 +121,7 @@ private: bool OnResetBall(const dd::Events::ResetBall &event); bool OnMultiBall(const dd::Events::MultiBall &event); bool OnStickyPad(const dd::Events::StickyPad &event); + bool OnInkBlaster(const dd::Events::InkBlaster &event); bool OnPause(const dd::Events::Pause &event); bool OnActionButton(const dd::Events::ActionButton &event); }; diff --git a/include/Game/CBall.h b/include/Game/CBall.h index bd9698a..738616d 100644 --- a/include/Game/CBall.h +++ b/include/Game/CBall.h @@ -20,6 +20,7 @@ struct Ball : Component int Combo = 0; bool Paused = false; bool Waiting = true; + bool InkBlaster = false; bool Sticky = false; glm::vec3 StickyPlacement = glm::vec3(0, 0, 0); glm::vec3 SavedSpeed = glm::vec3(0, 0, 0); diff --git a/include/Game/CProjectile.h b/include/Game/CProjectile.h new file mode 100644 index 0000000..6161b6f --- /dev/null +++ b/include/Game/CProjectile.h @@ -0,0 +1,25 @@ +// +// Created by Adniklastrator on 2015-10-08. +// + +#ifndef DAYDREAM_CPROJECTILE_H +#define DAYDREAM_CPROJECTILE_H + +#include "Core/Component.h" + +namespace dd +{ + +namespace Components +{ + +struct Projectile : Component +{ + +}; + +} + +} + +#endif //DAYDREAM_CPROJECTILE_H diff --git a/include/Game/EActionButton.h b/include/Game/EActionButton.h index fc387c8..fc275f2 100644 --- a/include/Game/EActionButton.h +++ b/include/Game/EActionButton.h @@ -15,7 +15,7 @@ namespace Events struct ActionButton : Event { - + glm::vec3 Position; }; } diff --git a/include/Game/EHitPad.h b/include/Game/EHitPad.h index 573f8ef..e8bfdcc 100644 --- a/include/Game/EHitPad.h +++ b/include/Game/EHitPad.h @@ -6,6 +6,7 @@ #define DAYDREAM_EHITPAD_H #include "Core/EventBroker.h" +#include "Core/Entity.h" namespace dd { @@ -13,7 +14,8 @@ namespace Events { struct HitPad : Event { - + EntityID Pad; + EntityID Ball; }; } } diff --git a/include/Game/EInkBlaster.h b/include/Game/EInkBlaster.h new file mode 100644 index 0000000..1128c5e --- /dev/null +++ b/include/Game/EInkBlaster.h @@ -0,0 +1,25 @@ +// +// Created by Adniklastrator on 2015-10-08. +// + +#ifndef DAYDREAM_EINKBLASTER_H +#define DAYDREAM_EINKBLASTER_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct InkBlaster : Event +{ + Components::Transform* Transform; +}; + +} + +} + +#endif //DAYDREAM_EINKBLASTER_H diff --git a/include/Game/ELifebuoy.h b/include/Game/ELifebuoy.h index 194dbb3..ba3b6f2 100644 --- a/include/Game/ELifebuoy.h +++ b/include/Game/ELifebuoy.h @@ -1,5 +1,5 @@ // -// Created by Adniklastrator on 2015-09-17. +// Created by Adniklastrator on 2015-10-08. // #ifndef DAYDREAM_ELIFEBUOY_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 2f7d637..1bc1e92 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -15,6 +15,7 @@ #include "Game/CBrick.h" #include "Game/CBall.h" #include "Game/CLife.h" +#include "Game/CProjectile.h" #include "Game/CPowerUp.h" #include "Game/EStageCleared.h" #include "Game/ELifeLost.h" @@ -24,6 +25,7 @@ #include "Game/EHitPad.h" #include "Game/ELifebuoy.h" #include "Game/EStickyPad.h" +#include "Game/EInkBlaster.h" #include "Game/EMultiBall.h" #include "Game/EMultiBallLost.h" #include "Game/EPause.h" @@ -127,6 +129,7 @@ private: const int MultiBallBrick = 2; const int LifebuoyBrick = 3; const int StickyBrick = 4; + const int InkBlasterBrick = 5; EntityID m_BrickTemplate; diff --git a/include/Game/ProjectileSystem.h b/include/Game/ProjectileSystem.h new file mode 100644 index 0000000..7310044 --- /dev/null +++ b/include/Game/ProjectileSystem.h @@ -0,0 +1,72 @@ +// +// Created by Adniklastrator on 2015-09-09. +// + +#ifndef DAYDREAM_PROJECTILESYSTEM_H +#define DAYDREAM_PROJECTILESYSTEM_H + +#include "Core/System.h" +#include "Core/CTransform.h" +#include "Core/CTemplate.h" +#include "Core/EventBroker.h" +#include "Core/World.h" +#include "Physics/EContact.h" +#include "Rendering/CModel.h" +#include "Physics/CPhysics.h" +#include "Physics/CCircleShape.h" +#include "Game/EPause.h" +#include "Game/EInkBlaster.h" +#include "Game/EActionButton.h" +#include "Game/EHitPad.h" +#include "Game/CProjectile.h" +#include "Game/CBall.h" +#include +#include + +namespace dd +{ + +namespace Systems +{ + +class ProjectileSystem : public System +{ +public: + ProjectileSystem(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; + bool m_InkBlaster = false; + bool m_SquidLoaded = false; + int m_Shots = 0; + EntityID m_InkBlastTemplate; + EntityID m_AttachedSquid; + + dd::EventRelay m_EContact; + dd::EventRelay m_EPause; + dd::EventRelay m_EInkBlaster; + dd::EventRelay m_EHitPad; + dd::EventRelay m_EActionButton; + + bool OnContact(const dd::Events::Contact &event); + bool OnPause(const dd::Events::Pause &event); + bool OnInkBlaster(const dd::Events::InkBlaster &event); + bool OnHitPad(const dd::Events::HitPad &event); + bool OnActionButton(const dd::Events::ActionButton &event); +}; + +} + +} + +#endif //DAYDREAM_PROJECTILESYSTEM_H diff --git a/include/Physics/CPhysics.h b/include/Physics/CPhysics.h index 6a20a1e..b3d4447 100644 --- a/include/Physics/CPhysics.h +++ b/include/Physics/CPhysics.h @@ -9,13 +9,15 @@ namespace CollisionLayer { enum Type { - Pad = 1 << 0, - Ball = 1 << 1, - Brick = 1 << 2, - Water = 1 << 3, - PowerUp = 1 << 4, - Other = 1 << 5, - Wall = 1 << 6 + Pad = 1 << 0, + Ball = 1 << 1, + Brick = 1 << 2, + Water = 1 << 3, + PowerUp = 1 << 4, + Other = 1 << 5, + Wall = 1 << 6, + + Projectile = 1 << 8 }; } diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index ce36cb8..545893f 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -19,6 +19,7 @@ void dd::Systems::BallSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &BallSystem::OnResetBall); EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &BallSystem::OnMultiBall); EVENT_SUBSCRIBE_MEMBER(m_EStickyPad, &BallSystem::OnStickyPad); + EVENT_SUBSCRIBE_MEMBER(m_EInkBlaster, &BallSystem::OnInkBlaster); EVENT_SUBSCRIBE_MEMBER(m_EPause, &BallSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_EActionButton, &BallSystem::OnActionButton); @@ -44,9 +45,6 @@ void dd::Systems::BallSystem::Initialize() physics->Calculate = true; transform->Sticky = true; - //auto plight = m_World->AddComponent(ent); - //plight->Radius = 2.f; - m_World->CommitEntity(ent); SetBall(ent); @@ -114,7 +112,7 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID if (m_Waiting == false) { ballComponent->Waiting = false; auto transform = m_World->GetComponent(entity); - transform->Velocity = glm::normalize(glm::vec3(-0.5f, 1, 0.f)) * ballComponent->Speed; + transform->Velocity = glm::normalize(glm::vec3(0.5f, 1, 0.f)) * ballComponent->Speed; if (ballComponent->Sticky) { transform->Velocity = ballComponent->SavedSpeed; m_StickyCounter--; @@ -260,6 +258,8 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) auto padTransform = m_World->GetComponent(otherEntitiy); Events::HitPad e; + e.Ball = ballEntity; + e.Pad = otherEntitiy; EventBroker->Publish(e); // Events::HitLag el; // el.Time = 0.1f; @@ -272,12 +272,17 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) ballComponent->Combo = 0; - if (m_Sticky) { + if (m_InkBlaster) { + m_InkBlaster = false; + ballComponent->Sticky = true; + ballComponent->StickyPlacement = glm::vec3(0, 0.5f, 0); + ballTransform->Velocity = glm::vec3(0.f, 0.f, 0.f); + } else if (m_Sticky) { m_Sticky = false; m_Waiting = true; ballComponent->Sticky = true; ballComponent->Waiting = true; - ballComponent->StickyPlacement = padTransform->Position - ballTransform->Position; + ballComponent->StickyPlacement = ballTransform->Position - padTransform->Position; ballComponent->SavedSpeed = glm::normalize(glm::vec3(x, y, 0.f)) * ballComponent->Speed; ballTransform->Velocity *= -1; return true; @@ -301,13 +306,6 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) normalList.push_back(event.Normal); m_Contacts[ballEntity] = normalList; } - - auto brick = m_World->GetComponent(otherEntitiy); - if (brick != nullptr) { - auto physicsComponent = m_World->GetComponent(otherEntitiy); - physicsComponent->CollisionType = CollisionType::Type::Dynamic; - - } } return true; @@ -431,6 +429,12 @@ bool dd::Systems::BallSystem::OnStickyPad(const dd::Events::StickyPad &event) return true; } +bool dd::Systems::BallSystem::OnInkBlaster(const dd::Events::InkBlaster &event) +{ + m_InkBlaster = true; + return true; +} + bool dd::Systems::BallSystem::OnActionButton(const dd::Events::ActionButton &event) { m_Waiting = false; diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index a96038a..8c12032 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -30,7 +30,7 @@ void dd::Systems::LevelSystem::Initialize() cPhys->CollisionType = CollisionType::Type::Static; cPhys->GravityScale = 0.f; cPhys->Category = CollisionLayer::Type::Brick; - cPhys->Mask = CollisionLayer::Type::Ball; + cPhys->Mask = static_cast(CollisionLayer::Type::Ball | CollisionLayer::Type::Projectile); transform->Sticky = false; model->ModelFile = "Models/Brick/WhiteBrick.obj"; @@ -90,6 +90,9 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID } else if (brick->Type == StickyBrick) { Events::StickyPad e; EventBroker->Publish(e); + } else if (brick->Type == InkBlasterBrick) { + Events::InkBlaster e; + EventBroker->Publish(e); } m_LooseBricks--; m_World->RemoveEntity(entity); @@ -203,6 +206,10 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe cBrick->Type = StickyBrick; auto model = m_World->GetComponent(brick); model->Color = glm::vec4(0.f, 0.f, 1.f, .0f); + } else if (typeInt == InkBlasterBrick) { + cBrick->Type = InkBlasterBrick; + auto model = m_World->GetComponent(brick); + model->Color = glm::vec4(0.1f, 0.1f, 0.1f, .0f); } float x = line * spacesBetweenBricks.x; float y = row * spacesBetweenBricks.y; @@ -218,8 +225,10 @@ void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) { + LOG_DEBUG("Collision happened!"); EntityID entityBrick; EntityID entityBall; + EntityID entityShot = 0; auto ball = m_World->GetComponent(event.Entity2); auto brick = m_World->GetComponent(event.Entity1); if (brick != nullptr) { @@ -239,7 +248,19 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) if (ball != nullptr) { entityBall = event.Entity1; } else { - return false; + auto shot = m_World->GetComponent(event.Entity1); + if (shot != nullptr) { + LOG_DEBUG("Entity1 is a shot!"); + entityShot = event.Entity1; + } else { + shot = m_World->GetComponent(event.Entity2); + if (shot != nullptr) { + LOG_DEBUG("Entity2 is a shot!"); + entityShot = event.Entity2; + } else { + return false; + } + } } } @@ -248,13 +269,37 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) return false; } - /*auto power = m_World->GetComponent(entityBrick); - if (power != nullptr && NumberOfBricks() > 1) { - Events::CreatePowerUp e; - auto transform = m_World->GetComponent(entityBrick); - e.Position = transform->Position; - EventBroker->Publish(e); - }*/ + if (entityShot != 0) { + // For when a brick gets shot. + brick->Removed = true; + + auto physicsComponent = m_World->GetComponent(entityBrick); + physicsComponent->CollisionType = CollisionType::Type::Dynamic; + physicsComponent->GravityScale = 1.f; + physicsComponent->Mask = static_cast(CollisionLayer::Water | CollisionLayer::Wall); + + auto transformComponentBrick = m_World->GetComponent(entityBrick); + auto transformComponentShot = m_World->GetComponent(entityShot); + + Events::SetImpulse e; + e.Entity = entityBrick; + + glm::vec2 point = glm::vec2(transformComponentBrick->Position.x + ((transformComponentShot->Position.x - transformComponentBrick->Position.x) / 4), + transformComponentBrick->Position.y + ((transformComponentShot->Position.y - transformComponentBrick->Position.y) / 4)); + + e.Impulse = glm::normalize(point)*5.f; + e.Point = point; + EventBroker->Publish(e); + + + SetNumberOfBricks(NumberOfBricks() - 1); + Events::ScoreEvent es; + es.Score = brick->Score; + EventBroker->Publish(es); + + m_World->RemoveEntity(entityShot); + return true; + } if (!Restarting() && !brick->Removed) { brick->Removed = true; @@ -268,6 +313,7 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) auto ballTransform = m_World->GetComponent(entityBall); auto physicsComponent = m_World->GetComponent(entityBrick); + physicsComponent->CollisionType = CollisionType::Type::Dynamic; physicsComponent->GravityScale = 1.f; physicsComponent->Mask = static_cast(CollisionLayer::Water | CollisionLayer::Wall); @@ -381,6 +427,7 @@ void dd::Systems::LevelSystem::GetNextLevel() // 2 is multiball brick. // 3 is lifebuoy brick. // 4 is sticky brick. + // 5 is ink blaster brick. if (m_CurrentCluster == 0) { if (m_CurrentLevel == 1) { level = @@ -431,7 +478,7 @@ void dd::Systems::LevelSystem::GetNextLevel() 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 0, 1, 0, 1, 1, - 4, 0, 0, 3, 0, 0, 1}; + 4, 0, 0, 3, 0, 0, 5}; } else if (m_CurrentLevel == 2) { level = {1, 0, 0, 0, 0, 0, 1, diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 55d8790..f0866f4 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -63,8 +63,7 @@ void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID p if (ball->Sticky) { auto transform = m_World->GetComponent(entity); transform->Position = Transform()->Position; - transform->Position -= ball->StickyPlacement; - transform->Orientation = glm::quat(); + transform->Position += ball->StickyPlacement; } } } @@ -170,6 +169,7 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { EventBroker->Publish(e); } else if (val == GLFW_KEY_SPACE) { Events::ActionButton e; + e.Position = Transform()->Position; EventBroker->Publish(e); } else if (val == GLFW_KEY_D) { return false; diff --git a/src/game/Game/ProjectileSystem.cpp b/src/game/Game/ProjectileSystem.cpp new file mode 100644 index 0000000..3bf977b --- /dev/null +++ b/src/game/Game/ProjectileSystem.cpp @@ -0,0 +1,124 @@ +// +// Created by Adniklastrator on 2015-10-08. +// + + +#include "PrecompiledHeader.h" +#include "Game/ProjectileSystem.h" + + +void dd::Systems::ProjectileSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EContact, &ProjectileSystem::OnContact); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &ProjectileSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EInkBlaster, &ProjectileSystem::OnInkBlaster); + EVENT_SUBSCRIBE_MEMBER(m_EHitPad, &ProjectileSystem::OnHitPad); + EVENT_SUBSCRIBE_MEMBER(m_EActionButton, &ProjectileSystem::OnActionButton); + + //Ink Blast + { + auto ent = m_World->CreateEntity(); + m_World->SetProperty(ent, "Name", "Projectile"); + std::shared_ptr ctransform = m_World->AddComponent(ent); + + auto circleShape = m_World->AddComponent(ent); + auto inkBlastTemplate = m_World->AddComponent(ent); + circleShape->Radius = 0.1f; + auto physics = m_World->AddComponent(ent); + physics->CollisionType = CollisionType::Type::Dynamic; + physics->Category = CollisionLayer::Type::Projectile; + physics->Mask = static_cast(CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall); + physics->Calculate = true; + ctransform->Sticky = true; + ctransform->Position = glm::vec3(0.f, 0.f, -10.f); + ctransform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); + auto cModel = m_World->AddComponent(ent); + cModel->ModelFile = "Models/Test/Ball/Sid.obj"; + auto projectile = m_World->AddComponent(ent); + + m_World->CommitEntity(ent); + + m_InkBlastTemplate = ent; + } + + return; +} + +void dd::Systems::ProjectileSystem::Update(double dt) +{ + +} + +void dd::Systems::ProjectileSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + if (IsPaused()) { + return; + } + auto templateCheck = m_World->GetComponent(entity); + if (templateCheck != nullptr){ return; } + + auto shot = m_World->GetComponent(entity); + if (shot != nullptr) { + auto transform = m_World->GetComponent(entity); + if (transform->Position.y > 8) { + m_World->RemoveEntity(entity); + } + } +} + +bool dd::Systems::ProjectileSystem::OnPause(const dd::Events::Pause &event) +{ + if (event.Type != "ProjectileSystem" && event.Type != "All") { + return false; + } + + if (IsPaused()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + + +bool dd::Systems::ProjectileSystem::OnContact(const dd::Events::Contact &event) +{ + + return true; +} + +bool dd::Systems::ProjectileSystem::OnInkBlaster(const dd::Events::InkBlaster &event) +{ + m_InkBlaster = true; + m_Shots = 5; + return true; +} + +bool dd::Systems::ProjectileSystem::OnHitPad(const dd::Events::HitPad &event) +{ + if (m_InkBlaster) { + m_SquidLoaded = true; + m_AttachedSquid = event.Ball; + } + return true; +} + +bool dd::Systems::ProjectileSystem::OnActionButton(const dd::Events::ActionButton &event) +{ + if (m_InkBlaster && m_SquidLoaded) { + auto ent = m_World->CloneEntity(m_InkBlastTemplate); + m_World->RemoveComponent(ent); + auto transform = m_World->GetComponent(ent); + transform->Position = event.Position; + transform->Velocity = glm::vec3(0, 5, 0); + m_Shots--; + if (m_Shots <= 0) { + auto ball = m_World->GetComponent(m_AttachedSquid); + m_InkBlaster = false; + m_SquidLoaded = false; + ball->InkBlaster = false; + ball->Sticky = false; + } + } + return true; +}