diff --git a/assets/DefaultConfig.ini b/assets/DefaultConfig.ini index a7c7600..267d3ae 100755 --- a/assets/DefaultConfig.ini +++ b/assets/DefaultConfig.ini @@ -1,6 +1,7 @@ [Debug] -SkipStory=false LogLevel=1 +SkipPreload=false +SkipMenu=false [Audio] SFXVolume=0.5 @@ -9,4 +10,10 @@ BGMVolume=0.5 [Video] Fullscreen=false Width=675 -Height=1080[Water]Radius=0.3[Cheat]GodMode=false[Water]Radius=0.3[Cheat]GodMode=false \ No newline at end of file +Height=1080 + +[Water] +Radius=0.3 + +[Cheat] +GodMode=false \ No newline at end of file diff --git a/assets/Sounds/BGM/boss-fight.wav b/assets/Sounds/BGM/boss-fight.wav new file mode 100644 index 0000000..e74ae70 Binary files /dev/null and b/assets/Sounds/BGM/boss-fight.wav differ diff --git a/assets/Sounds/Boss/boss-hit.wav b/assets/Sounds/Boss/boss-hit.wav new file mode 100644 index 0000000..b444809 Binary files /dev/null and b/assets/Sounds/Boss/boss-hit.wav differ diff --git a/assets/Sounds/Boss/boss-roar.wav b/assets/Sounds/Boss/boss-roar.wav new file mode 100644 index 0000000..814dc56 Binary files /dev/null and b/assets/Sounds/Boss/boss-roar.wav differ diff --git a/assets/Sounds/Brick/LTTP_Boss_Hit.wav b/assets/Sounds/Brick/LTTP_Boss_Hit.wav deleted file mode 100644 index b8d4f01..0000000 Binary files a/assets/Sounds/Brick/LTTP_Boss_Hit.wav and /dev/null differ diff --git a/assets/Sounds/Brick/brick-hit.wav b/assets/Sounds/Brick/brick-hit.wav new file mode 100644 index 0000000..83e5cd4 Binary files /dev/null and b/assets/Sounds/Brick/brick-hit.wav differ diff --git a/assets/Sounds/Metal/impact.wav b/assets/Sounds/Metal/impact.wav deleted file mode 100644 index 5a08fc7..0000000 Binary files a/assets/Sounds/Metal/impact.wav and /dev/null differ diff --git a/assets/Sounds/jap-huh.wav b/assets/Sounds/jap-huh.wav new file mode 100644 index 0000000..2753a02 Binary files /dev/null and b/assets/Sounds/jap-huh.wav differ diff --git a/assets/Sounds/jap-lose-life.wav b/assets/Sounds/jap-lose-life.wav new file mode 100644 index 0000000..a8a88aa Binary files /dev/null and b/assets/Sounds/jap-lose-life.wav differ diff --git a/assets/Sounds/jap-story.wav b/assets/Sounds/jap-story.wav index 54fe420..00f4f7a 100644 Binary files a/assets/Sounds/jap-story.wav and b/assets/Sounds/jap-story.wav differ diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 3eaf296..a4e7b38 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -37,6 +37,7 @@ #include "Rendering/CModel.h" #include "Rendering/CSprite.h" #include "Rendering/CPointLight.h" +#include "Rendering/CCamera.h" #include "Transform/TransformSystem.h" #include "Sound/SoundSystem.h" #include "Sound/CCollisionSound.h" @@ -67,6 +68,7 @@ #include "Game/BrickComponents.h" +#include "Game/ScreenShakeSystem.h" #include "Game/EScreenShake.h" #include "Physics/PhysicsSystem.h" @@ -102,9 +104,6 @@ public: ResourceManager::RegisterType("Model"); ResourceManager::RegisterType("Sound"); ResourceManager::RegisterType("ConfigFile"); - ResourceManager::RegisterType("ShaderProgram"); - ResourceManager::RegisterType("VertexShader"); - ResourceManager::RegisterType("FragmentShader"); ResourceManager::LoadPreloadsFromFile(); auto config = ResourceManager::Load("Config.ini"); @@ -150,6 +149,7 @@ public: m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -212,6 +212,9 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::LifeSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::ScreenShakeSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -274,8 +277,6 @@ public: TEMPAddToRenderQueue(); } - std::unique_ptr defaultCamera = nullptr; - // Render scene //TODO send renderqueue to draw. m_Renderer->Draw(m_RendererQueue); @@ -295,6 +296,20 @@ public: { if (!m_TransformSystem) m_TransformSystem = m_World->GetSystem(); + + // HACK: How do we handle multiple cameras? Maybe view and projection matrices in render queue... + auto cameras = m_World->GetComponentsOfType(); + if (cameras != nullptr) { + for (auto& component : *cameras) { + auto camera = static_cast(component.get()); + auto transform = m_World->GetComponent(camera->Entity); + m_Renderer->Camera()->SetPosition(transform->Position); + m_Renderer->Camera()->SetOrientation(transform->Orientation); + m_Renderer->Camera()->SetFOV(camera->FOV); + m_Renderer->Camera()->SetNearClip(camera->NearClip); + m_Renderer->Camera()->SetFarClip(camera->FarClip); + } + } for (auto &pair : *m_World->GetEntities()) { diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index 678157b..f2e3fea 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -49,6 +49,7 @@ #include "Physics/ECreateParticleSequence.h" #include "Sound/CCollisionSound.h" +#include "Sound/EPlaySound.h" #include "Rendering/EAnimationComplete.h" namespace dd diff --git a/include/Game/CBall.h b/include/Game/CBall.h index 83ee4bc..77ac241 100644 --- a/include/Game/CBall.h +++ b/include/Game/CBall.h @@ -25,6 +25,8 @@ struct Ball : Component bool Loaded = false; glm::vec3 StickyPlacement = glm::vec3(0, 0, 0); glm::vec3 SavedSpeed = glm::vec3(0, 1, 0); + + int PosterBoy = 0; }; } diff --git a/include/Game/CBrick.h b/include/Game/CBrick.h index 7a5ae15..4e3a5af 100644 --- a/include/Game/CBrick.h +++ b/include/Game/CBrick.h @@ -20,6 +20,8 @@ struct Brick : Component int Type = 0; bool Removed = false; int Number = 100; // For the Kraken to keep track of which bricks needs replacing. + bool BeingGenerated = false; + glm::vec3 GenerationGoal; //What number of types each is. const int EmptyBrickSpace = 0; diff --git a/include/Game/CKraken.h b/include/Game/CKraken.h index 170f203..e2dea50 100644 --- a/include/Game/CKraken.h +++ b/include/Game/CKraken.h @@ -17,13 +17,14 @@ struct Kraken : Component { int MaxHealth = 30; int Health = MaxHealth; - int CurrentAction = 1; + int CurrentAction = 3; + float RetreatSpeed = 0.2; const int Idle = 1; const int Grabbing = 2; - const int Taunting = 3; - const int Moving = 4; - const int BrickGenerating = 5; + const int BrickGenerating = 3; + const int BrickGenerating2 = 4; + const int Waiting = 5; // Idle. Generating bricks. Taunting. No idea. }; diff --git a/include/Game/CLife.h b/include/Game/CLife.h index aeca335..0488ac8 100644 --- a/include/Game/CLife.h +++ b/include/Game/CLife.h @@ -13,10 +13,15 @@ namespace dd namespace Components { -struct Life : Component { - +struct Life : Component +{ int Number = 0; - + float SinusAltitude = 0; + float Amplitude = 1; + float Frequency = 1; + float SinusSpeed = 1; + bool Left = false; + bool Dead = false; }; } diff --git a/include/Game/EBreakAllBricks.h b/include/Game/EBreakAllBricks.h new file mode 100644 index 0000000..47142f5 --- /dev/null +++ b/include/Game/EBreakAllBricks.h @@ -0,0 +1,25 @@ +// +// Created by Adniklastrator on 2015-10-23. +// + +#ifndef DAYDREAM_EBREAKALLBRICKS_H +#define DAYDREAM_EBREAKALLBRICKS_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct BreakAllBricks : Event +{ + +}; + +} + +} + +#endif //DAYDREAM_EBREAKALLBRICKS_H diff --git a/include/Game/EBrickGenerating.h b/include/Game/EBrickGenerating.h index 6b5f012..47a723c 100644 --- a/include/Game/EBrickGenerating.h +++ b/include/Game/EBrickGenerating.h @@ -19,6 +19,7 @@ struct BrickGenerating : Event glm::vec3 Origin2; int TargetLine; int Set; + int SetCluster; }; } diff --git a/include/Game/KrakenSystem.h b/include/Game/KrakenSystem.h index 3d7d899..a806fba 100644 --- a/include/Game/KrakenSystem.h +++ b/include/Game/KrakenSystem.h @@ -28,6 +28,7 @@ #include "Game/EKrakenHit.h" #include "Game/EKrakenDefeated.h" #include "Game/EBrickGenerating.h" +#include "Game/EArrivedAtNewStage.h" #include "Game/CTravels.h" #include "Game/CKraken.h" #include "Game/CBall.h" @@ -64,12 +65,15 @@ private: bool m_Pause = false; bool m_KrakenBattle = false; + bool m_KrakenHasArrived = false; bool m_ReturnToIdle = false; EntityID m_KrakenTemplate; std::string m_Action = "Idle"; int m_NumberOfActions; float m_KrakenTimer = 0; - float m_KrakenSecondsToAction = 10; + float m_KrakenMaxSecondsToAction = 10; + float m_KrakenMinSecondsToAction = 10; + float m_KrakenCurrentSecondsToAction = 15; const int Idle = 1; std::array m_Bricks; @@ -83,6 +87,7 @@ private: dd::EventRelay m_EKrakenHit; dd::EventRelay m_EKrakenDefeated; dd::EventRelay m_EBrickGenerating; + dd::EventRelay m_EArrivedAtNewStage; bool OnPause(const dd::Events::Pause &event); bool OnResume(const dd::Events::Resume &event); bool OnContact(const dd::Events::Contact &event); @@ -91,6 +96,7 @@ private: bool OnKrakenHit(const dd::Events::KrakenHit &event); bool OnKrakenDefeated(const dd::Events::KrakenDefeated &event); bool OnBrickGenerating(const dd::Events::BrickGenerating &event); + bool OnArrivedAtNewStage(const dd::Events::ArrivedAtNewStage &event); void GetBrickSet(); }; diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index b236df4..ebbf28b 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -19,6 +19,7 @@ #include "Rendering/CSprite.h" #include "Rendering/CModel.h" #include "Rendering/CPointLight.h" +#include "Rendering/CCamera.h" #include "Transform/EMove.h" @@ -180,6 +181,8 @@ private: bool m_BrickGenerating = false; dd::Events::BrickGenerating m_BrickGeneratingEvent; + bool m_BreakAllBricks = false; + dd::EventRelay m_EContact; dd::EventRelay m_EScoreEvent; dd::EventRelay m_EMultiBall; @@ -207,7 +210,7 @@ private: bool OnHitPad(const dd::Events::HitPad &event); bool OnBrickGenerating(const dd::Events::BrickGenerating &event); bool BrickGenerating(const dd::Events::BrickGenerating &event); - void GetBrickSet(int Set); + void GetBrickSet(int Set, int SetCluster); bool OnKrakenDefeated(const dd::Events::KrakenDefeated &event); void GetNextLevel(); diff --git a/include/Game/LifeSystem.h b/include/Game/LifeSystem.h index 249e9ee..cfe4815 100644 --- a/include/Game/LifeSystem.h +++ b/include/Game/LifeSystem.h @@ -24,6 +24,10 @@ #include "Game/EGameOver.h" #include "Game/EKrakenAttackEnd.h" +#include "Rendering/CAnimation.h" +#include "Physics/CParticleEmitter.h" +#include "Physics/ECreateParticleSequence.h" + namespace dd { @@ -54,6 +58,7 @@ private: bool m_Pause = false; int m_Lives = 3; int m_PastLives = 3; + float m_LifeSpeed = 0.8; bool m_GodMode = false; diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 0e9f9cd..0148430 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -72,29 +72,12 @@ public: void Update(double dt) override; void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - EntityID& Entity() { return m_Entity; } - void SetEntity(const EntityID& ent) { m_Entity = ent; } - glm::vec3 Acceleration() const { return m_Acceleration; } - void SetAcceleration(const glm::vec3& acceleration) { m_Acceleration = acceleration; } - - bool Left() const { return m_Left; } - void SetLeft(const bool& left) { m_Left = left; } - bool Right() const { return m_Right; } - void SetRight(const bool& right) { m_Right = right; } - float Edge() const { return m_Edge; } - void SetEdge(const float& edge) { m_Edge = edge; } - - Components::Transform* Transform() const { return m_Transform; } - void SetTransform(Components::Transform* transform) { m_Transform = transform; } - Components::Pad* Pad() const { return m_Pad; } - void SetPad(Components::Pad* pad) { m_Pad = pad; } - bool IsPaused() const { return m_Pause; } void SetPause(const bool& pause) { m_Pause = pause; } private: - EntityID m_Entity = 0; - glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); + EntityID m_PadEntity = 0; + glm::vec3 m_PadAcceleration = glm::vec3(0.f, 0.f, 0.f); bool m_Left = false; bool m_Right = false; bool m_ReplaceBall = false; @@ -107,11 +90,11 @@ private: float m_Edge = 2.8f; float m_PadOriginalHeight = -4.8; float m_PadHeight = m_PadOriginalHeight; - EntityID m_KrakenArm = NULL; - EntityID m_KrakenArmHitbox = NULL; + EntityID m_KrakenArm = 0; + EntityID m_KrakenArmHitbox = 0; float m_PadRiseSpeed = 0.2; - Components::Transform* m_Transform = nullptr; - Components::Pad* m_Pad = nullptr; + Components::Transform* m_PadTransform = nullptr; + Components::Pad* m_PadComponent = nullptr; std::shared_ptr m_StickTransform; std::shared_ptr m_StickyAim; diff --git a/include/Game/ProjectileSystem.h b/include/Game/ProjectileSystem.h index 3ae63d8..cf60ec7 100644 --- a/include/Game/ProjectileSystem.h +++ b/include/Game/ProjectileSystem.h @@ -5,6 +5,10 @@ #ifndef DAYDREAM_PROJECTILESYSTEM_H #define DAYDREAM_PROJECTILESYSTEM_H + +#include +#include + #include "Core/System.h" #include "Core/CTransform.h" #include "Core/CTemplate.h" @@ -26,8 +30,6 @@ #include "Game/CProjectile.h" #include "Game/CBall.h" #include "Rendering/CSprite.h" -#include -#include #include "Rendering/CAnimation.h" namespace dd diff --git a/include/Game/ScreenShakeSystem.h b/include/Game/ScreenShakeSystem.h index 62d31d6..76d88f5 100644 --- a/include/Game/ScreenShakeSystem.h +++ b/include/Game/ScreenShakeSystem.h @@ -12,6 +12,7 @@ #include "Core/CTemplate.h" #include "Core/EventBroker.h" #include "Core/World.h" +#include "Rendering/CCamera.h" #include "Game/EPause.h" #include "Game/EResume.h" #include "Game/EScreenShake.h" diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h index 9ba9212..d4f795a 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -22,7 +22,7 @@ struct ParticleEmitter : public Component float Speed = 2.f; double LifeTime = 100; float RadiusDistribution = 0; - + bool DefaultScale = false; //values to interpolate between. std::vector ScaleValues; std::vector AlphaValues; diff --git a/include/Physics/ECreateParticleSequence.h b/include/Physics/ECreateParticleSequence.h index d1f165d..19eb372 100644 --- a/include/Physics/ECreateParticleSequence.h +++ b/include/Physics/ECreateParticleSequence.h @@ -26,6 +26,7 @@ struct CreateParticleSequence : public Event glm::vec4 Color = glm::vec4(0); EntityID parent = 0; // values to interpolate between. + bool DefaultScale = false; std::vector ScaleValues; std::vector AlphaValues; diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index c01c896..f237512 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -14,6 +14,7 @@ #include "Core/CTemplate.h" #include "Core/CTransform.h" #include "Core/CTemplate.h" +#include "Rendering/Texture.h" #include "Physics/EContact.h" #include "Physics/ESetImpulse.h" diff --git a/include/Rendering/BaseRenderer.h b/include/Rendering/BaseRenderer.h index 6ec23d8..b09cc37 100644 --- a/include/Rendering/BaseRenderer.h +++ b/include/Rendering/BaseRenderer.h @@ -37,8 +37,8 @@ public: void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; } bool VSYNC() const { return m_VSYNC; } void SetVSYNC(bool vsync) { m_VSYNC = vsync; } - const dd::Camera* Camera() const { return m_Camera; } - void SetCamera(const dd::Camera* camera) + dd::Camera* Camera() const { return m_Camera; } + void SetCamera(dd::Camera* camera) { if (camera == nullptr) { m_Camera = m_DefaultCamera.get(); @@ -55,7 +55,7 @@ protected: bool m_Fullscreen = false; bool m_VSYNC = false; std::unique_ptr m_DefaultCamera = nullptr; - const dd::Camera* m_Camera = nullptr; + dd::Camera* m_Camera = nullptr; GLFWwindow* m_Window = nullptr; }; diff --git a/include/Rendering/CCamera.h b/include/Rendering/CCamera.h index 7d0441c..ab7522d 100644 --- a/include/Rendering/CCamera.h +++ b/include/Rendering/CCamera.h @@ -30,14 +30,9 @@ namespace Components struct Camera : Component { - Camera() - : FOV(glm::radians(45.f)) - , NearClip(0.1f) - , FarClip(100.f) { } - - float FOV; - float NearClip; - float FarClip; + float FOV = glm::radians(45.f); + float NearClip = 0.01f; + float FarClip = 100.f; }; } diff --git a/include/Rendering/OpenGL/Rendering/Renderer.h b/include/Rendering/OpenGL/Rendering/Renderer.h index c806d0e..93a383e 100755 --- a/include/Rendering/OpenGL/Rendering/Renderer.h +++ b/include/Rendering/OpenGL/Rendering/Renderer.h @@ -43,7 +43,6 @@ class Renderer : public BaseRenderer public: void Initialize() override; void Draw(RenderQueueCollection& rq) override; - void PlaceCamera(glm::vec3 position); private: int m_GLVersion[2]; @@ -97,12 +96,6 @@ private: void DrawWater(RenderQueue &objects); void DrawGUI(RenderQueue& rq); void DebugKeys(); - - dd::EventRelay m_EScreenShake; - bool OnScreenShake(dd::Events::ScreenShake &event); - bool m_ScreenShake = false; - float m_ShakeIntensity = 0; - float m_ShakeTimer = 0; }; } diff --git a/include/Sound/SoundSystem.h b/include/Sound/SoundSystem.h index 56bd837..6aa577c 100644 --- a/include/Sound/SoundSystem.h +++ b/include/Sound/SoundSystem.h @@ -20,6 +20,7 @@ #include "Physics/ECreateParticleSequence.h" #include "Physics/EContact.h" #include "Game/EGameStart.h" +#include "Game/EKrakenAppear.h" namespace dd @@ -42,6 +43,7 @@ private: const std::string GAME_BGM = "Sounds/BGM/under-the-sea-n.wav"; const std::string WATER_BGM = "Sounds/BGM/water-flowing.wav"; const std::string STORY_VOICE = "Sounds/jap-story.wav"; + const std::string BOSS_BGM = "Sounds/BGM/boss-fight.wav"; float m_BGMMasterVolume = 1.f; float m_SFXMasterVolume = 1.f; @@ -62,6 +64,8 @@ private: bool OnMasterVolume(const dd::Events::MasterVolume &event); dd::EventRelay m_EGameStart; bool OnGameStart(const dd::Events::GameStart &event); + dd::EventRelay m_EKrakenAppear; + bool OnKrakenAppear(const dd::Events::KrakenAppear &event); ALuint CreateSource(); diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 63c2744..8ea30fe 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -65,6 +65,13 @@ void dd::Systems::BallSystem::Initialize() auto transform2 = m_World->GetComponent(ent2); transform2->Position = glm::vec3(-0.f, 0.26f, -10.f); transform2->Velocity = glm::vec3(0.0f, -10.f, 0.f); + + /*auto PosterBoy = CreateBall(); + auto PosterBall = m_World->GetComponent(PosterBoy); + PosterBall->PosterBoy = 1; + auto Postertran = m_World->GetComponent(PosterBoy); + Postertran->Position = glm::vec3(-3.f, -3.f, -10.f); + Postertran->Velocity = glm::vec3(0.0f, 0.f, 0.f);*/ } SetReplaceBall(true); @@ -89,6 +96,11 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID if (templateCheck != nullptr){ return; } if (ballComponent != nullptr) { + auto transformBall = m_World->GetComponent(entity); + if (ballComponent->PosterBoy == 1) { + transformBall->Position = glm::vec3(-3, 3, -10); + } + if (ReplaceBall()) { m_First = true; SetReplaceBall(false); @@ -98,17 +110,15 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID ballComponent->SavedSpeed = glm::vec3(random, 1, 0.f); //ballComponent->SavedSpeed = glm::vec3(0.f, 1, 0.f); ballComponent->Waiting = true; - auto transform = m_World->GetComponent(entity); } if (ballComponent->Waiting) { if (!m_Waiting) { m_Restarting = false; ballComponent->Waiting = false; - auto transform = m_World->GetComponent(entity); /*std::uniform_real_distribution dist(-0.5f, 0.5f); float random = dist(m_RandomGenerator);*/ - transform->Velocity = glm::normalize(ballComponent->SavedSpeed) * ballComponent->Speed; + transformBall->Velocity = glm::normalize(ballComponent->SavedSpeed) * ballComponent->Speed; auto cAnim = m_World->GetComponent(entity); cAnim->Loop = false; @@ -116,6 +126,7 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID cAnim->Time = 0.f; //transform->Velocity = glm::normalize(glm::vec3(0, 1, 0)) * ballComponent->Speed; } else { + transformBall->Velocity = glm::vec3(0.f, 0.f, 0.f); auto cModel = m_World->GetComponent(entity); cModel->ModelFile = "Models/Sid/Sid_Jump.dae"; @@ -141,8 +152,7 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID //TODO - Ball can stick to same pad just after detaching. if (!m_Waiting) { - auto transform = m_World->GetComponent(entity); - transform->Velocity = ballComponent->SavedSpeed; + transformBall->Velocity = ballComponent->SavedSpeed; m_StickyCounter--; if (m_StickyCounter > 0) { m_Sticky = true; @@ -151,7 +161,6 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID } } - auto transformBall = m_World->GetComponent(entity); if (glm::abs(transformBall->Velocity.y) < 2) { if (transformBall->Velocity.y > 0) { transformBall->Velocity.y = 2; @@ -170,6 +179,9 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID Events::LifeLost e; e.Entity = entity; EventBroker->Publish(e); + Events::PlaySound se; + se.FilePath = "Sounds/jap-lose-life.wav"; + EventBroker->Publish(se); return; } } //Removing this made the wall collisions work again diff --git a/src/game/Game/KrakenSystem.cpp b/src/game/Game/KrakenSystem.cpp index 13b19f9..a07cd48 100644 --- a/src/game/Game/KrakenSystem.cpp +++ b/src/game/Game/KrakenSystem.cpp @@ -17,6 +17,7 @@ void dd::Systems::KrakenSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EKrakenHit, &KrakenSystem::OnKrakenHit); EVENT_SUBSCRIBE_MEMBER(m_EKrakenDefeated, &KrakenSystem::OnKrakenDefeated); EVENT_SUBSCRIBE_MEMBER(m_EBrickGenerating, &KrakenSystem::OnBrickGenerating); + EVENT_SUBSCRIBE_MEMBER(m_EArrivedAtNewStage, &KrakenSystem::OnArrivedAtNewStage); EntityID ent = m_World->CreateEntity(); auto transform = m_World->AddComponent(ent); @@ -46,7 +47,7 @@ void dd::Systems::KrakenSystem::Initialize() //sound auto collisionSound = m_World->AddComponent(ent); - collisionSound->FilePath = "Sounds/Brick/LTTP_Boss_Hit.wav"; + collisionSound->FilePath = "Sounds/Boss/boss-hit.wav"; m_World->CommitEntity(ent); m_KrakenTemplate = ent; @@ -67,6 +68,16 @@ void dd::Systems::KrakenSystem::Update(double dt) void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + auto kraken = m_World->GetComponent(entity); + if (kraken != nullptr) { + if (kraken->Health < 0) { + auto transform = m_World->GetComponent(entity); + transform->Position.y += kraken->RetreatSpeed * dt; + kraken->RetreatSpeed += 0.05; + return; + } + } + if (IsPaused() || !m_KrakenBattle) { return; } @@ -74,7 +85,7 @@ void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityI auto templateCheck = m_World->GetComponent(entity); if (templateCheck != nullptr){ return; } - auto kraken = m_World->GetComponent(entity); + if (kraken != nullptr) { auto transform = m_World->GetComponent(entity); if (transform->Position.y < -10) { @@ -86,7 +97,7 @@ void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityI { case 1: // Idle m_KrakenTimer += dt; - if (m_KrakenTimer > m_KrakenSecondsToAction) { + if (m_KrakenTimer > m_KrakenCurrentSecondsToAction) { m_KrakenTimer = 0; if (m_NumberOfActions == 0) { kraken->CurrentAction = 3; @@ -114,7 +125,14 @@ void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityI Events::BrickGenerating e; e.Origin1 = glm::vec3(-5, 7, -10); e.Origin2 = glm::vec3(5, 7, -10); - std::uniform_real_distribution dist(1, 5.999f); + if (kraken->Health > 20) { + e.SetCluster = 0; + } else if (kraken->Health > 10) { + e.SetCluster = 1; + } else { + e.SetCluster = 2; + } + std::uniform_real_distribution dist(1, 6.999f); float random = dist(m_RandomGenerator); e.Set = random; EventBroker->Publish(e); @@ -126,7 +144,14 @@ void dd::Systems::KrakenSystem::UpdateEntity(double dt, EntityID entity, EntityI Events::BrickGenerating e; e.Origin1 = glm::vec3(-5, 7, -10); e.Origin2 = glm::vec3(5, 7, -10); - std::uniform_real_distribution dist(1, 5.999f); + if (kraken->Health > 20) { + e.SetCluster = 0; + } else if (kraken->Health > 10) { + e.SetCluster = 1; + } else { + e.SetCluster = 2; + } + std::uniform_real_distribution dist(1, 6.999f); float random = dist(m_RandomGenerator); e.Set = random; EventBroker->Publish(e); @@ -196,6 +221,7 @@ bool dd::Systems::KrakenSystem::OnContact(const dd::Events::Contact &event) if (projectile != nullptr) { Events::ScoreEvent es; es.Score = 23; + EventBroker->Publish(es); Events::KrakenHit e; e.Kraken = krakenEntity; e.Hitter = otherEntitiy; @@ -215,6 +241,7 @@ bool dd::Systems::KrakenSystem::OnContact(const dd::Events::Contact &event) EventBroker->Publish(ec); Events::ScoreEvent es; es.Score = ball->Combo * 23; + EventBroker->Publish(es); Events::KrakenHit e; e.Kraken = krakenEntity; e.Hitter = otherEntitiy; @@ -248,7 +275,62 @@ bool dd::Systems::KrakenSystem::OnKrakenAttack(const dd::Events::KrakenAttack &e bool dd::Systems::KrakenSystem::OnKrakenHit(const dd::Events::KrakenHit &event) { auto kraken = m_World->GetComponent(event.Kraken); + auto transform = m_World->GetComponent(event.Hitter); kraken->Health--; + //kraken->Health -= 15; + //kraken->Health = -1; //To defeat the kraken instantly. + + auto model = m_World->GetComponent(event.Kraken); + float modifier = ((float)kraken->MaxHealth - (float)kraken->Health) / (float)kraken->MaxHealth; // 1 is almost no life left, 0 is max life left. + //std::cout << modifier << std::endl; + model->Color = glm::vec4(1, 1 - modifier, 1 - modifier, 1); + + int timeDifferenceBetweenMaxAndMin = m_KrakenMaxSecondsToAction - m_KrakenMinSecondsToAction; + m_KrakenCurrentSecondsToAction = m_KrakenMaxSecondsToAction - (modifier * timeDifferenceBetweenMaxAndMin); + // If modifier is 1, MaxSeconds is 15, MinSeconds is 5, then... 15 - (1 * 10), meaning 5. + + auto ball = m_World->GetComponent(event.Hitter); + if (ball != nullptr) { + //Particle trail + Events::CreateParticleSequence trail; + trail.parent = event.Hitter; + 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 = 2; + trail.EmitterLifeTime = 1.f; + trail.ParticleLifeTime = 1.f; + trail.ParticlesPerTick = 1; + trail.SpawnRate = 0.5f; + trail.Speed = 10.f; + trail.EmittingAngle = glm::half_pi(); + trail.SpriteFile = "Textures/Particles/FadeBall.png"; + trail.Color = glm::vec4(1, 0, 0, 1); + //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 = 2; + poof.Position = transform->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 = glm::vec4(1, 0, 0, 1); + poof.AlphaValues.clear(); + poof.AlphaValues.push_back(1.f); + poof.AlphaValues.push_back(0.f); + poof.Speed = 20; + EventBroker->Publish(poof); + //std::cout << kraken->Health << std::endl; //kraken->Health = -1; if (kraken->Health < 0) { @@ -266,6 +348,8 @@ bool dd::Systems::KrakenSystem::OnKrakenDefeated(const dd::Events::KrakenDefeate auto kraken = m_World->GetComponent(event.Kraken); auto physicsComponent = m_World->GetComponent(event.Kraken); + + m_World->RemoveComponent(event.Kraken); /*physicsComponent->CollisionType = CollisionType::Type::Dynamic; physicsComponent->GravityScale = 1.f;*/ physicsComponent->Mask = static_cast(CollisionLayer::Water | CollisionLayer::Wall); @@ -292,8 +376,8 @@ bool dd::Systems::KrakenSystem::OnKrakenDefeated(const dd::Events::KrakenDefeate EventBroker->Publish(i);*/ auto cModel = m_World->GetComponent(event.Kraken); - cModel->Color = brickModel->Color; - cModel->Color *= 0.5f; + cModel->Color = glm::vec4(1, 1, 1, 1); + cModel->Color *= 0.3f; /*m_World->RemoveComponent(event.Kraken); m_World->SetEntityParent(event.Kraken, 0); @@ -345,4 +429,12 @@ bool dd::Systems::KrakenSystem::OnKrakenDefeated(const dd::Events::KrakenDefeate bool dd::Systems::KrakenSystem::OnBrickGenerating(const dd::Events::BrickGenerating &event) { return true; +} + +bool dd::Systems::KrakenSystem::OnArrivedAtNewStage(const dd::Events::ArrivedAtNewStage &event) +{ + if (m_KrakenBattle) { + m_KrakenHasArrived = true; + } + return true; } \ No newline at end of file diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index e681420..ff3bb8c 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -27,6 +27,15 @@ void dd::Systems::LevelSystem::Initialize() m_GodMode = ResourceManager::Load("Config.ini")->GetValue("Cheat.GodMode", false); + // Camera + { + auto ent = m_World->CreateEntity(); + auto transform = m_World->AddComponent(ent); + auto camera = m_World->AddComponent(ent); + camera->FOV = glm::radians(58.31f); + m_World->CommitEntity(ent); + } + //PointLightTest { auto t_Light = m_World->CreateEntity(); @@ -132,8 +141,8 @@ void dd::Systems::LevelSystem::Initialize() 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); @@ -238,7 +247,7 @@ void dd::Systems::LevelSystem::Initialize() transform->Position = glm::vec3(50, 50, -10); //sound auto collisionSound = m_World->AddComponent(m_BrickTemplate); - collisionSound->FilePath = "Sounds/Brick/shortbrickbreak.wav"; + collisionSound->FilePath = "Sounds/Brick/brick-hit.wav"; m_World->CommitEntity(m_BrickTemplate); return; @@ -281,7 +290,25 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID auto brick = m_World->GetComponent(entity); if (brick != nullptr) { - auto transform = m_World->GetComponent(entity); + if (m_BreakAllBricks) { + if (!brick->Removed) { + brick->Removed = true; + BrickHit(entity, entity, 1); + } + } + + auto transform = m_World->GetComponent(entity); + if (brick->BeingGenerated) { + if (transform->Position == brick->GenerationGoal) { + brick->BeingGenerated = false; + auto cPhys = m_World->AddComponent(entity); + cPhys->CollisionType = CollisionType::Type::Static; + cPhys->GravityScale = 0.f; + cPhys->Category = CollisionLayer::Type::Brick; + cPhys->Mask = static_cast(CollisionLayer::Type::Ball | CollisionLayer::Type::Projectile | CollisionLayer::Type::Wall | CollisionLayer::LifeBuoy); + } + } + //Removes bricks that falls out of the stage. if (transform->Position.y < -10) { if (brick->Type == StandardBrick) { @@ -317,7 +344,17 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID auto ball = m_World->GetComponent(entity); - if (NumberOfBricks() <= 0 && m_LooseBricks <= 0 && !Restarting()) { + if (ball != nullptr) { + if (m_BrickGenerating) { + auto transform = m_World->GetComponent(entity); + if (transform->Position.y < 0 && transform->Velocity.y < 0) { + m_BrickGenerating = false; + BrickGenerating(m_BrickGeneratingEvent); + } + } + } + + if (NumberOfBricks() <= 0 && m_LooseBricks <= 0 && !Restarting() && !m_Cleared) { if (MultiBalls() <= 0 && PowerUps() <= 0) { Events::StageCleared ec; ec.ClearedStage = m_CurrentLevel; @@ -470,7 +507,7 @@ bool dd::Systems::LevelSystem::OnBrickGenerating(const dd::Events::BrickGenerati bool dd::Systems::LevelSystem::BrickGenerating(const dd::Events::BrickGenerating &event) { - GetBrickSet(event.Set); + GetBrickSet(event.Set, event.SetCluster); int rows = 6; int lines = 7; @@ -481,6 +518,8 @@ bool dd::Systems::LevelSystem::BrickGenerating(const dd::Events::BrickGenerating auto ent = CreateBrick(i, j, SpaceBetweenBricks(), SpaceToEdge(), -3.2, 1, m_BrickSet[getter], m_ColorSet[getter]); if (ent != NULL) { auto brick = m_World->GetComponent(ent); + brick->BeingGenerated = true; + m_World->RemoveComponent(ent); brick->Number = getter; m_KrakenBricks[getter] = true; auto transform = m_World->GetComponent(ent); @@ -491,6 +530,7 @@ bool dd::Systems::LevelSystem::BrickGenerating(const dd::Events::BrickGenerating } else { transform->Position = event.Origin2; } + brick->GenerationGoal = e.GoalPosition; e.Entity = ent; e.Speed = 6; e.Queue = false; @@ -505,7 +545,7 @@ bool dd::Systems::LevelSystem::BrickGenerating(const dd::Events::BrickGenerating return true; } -void dd::Systems::LevelSystem::GetBrickSet(int set) // These are sets the Kraken gets! +void dd::Systems::LevelSystem::GetBrickSet(int set, int setCluster) // These are sets the Kraken gets! { std::array level; std::array color; @@ -537,101 +577,282 @@ void dd::Systems::LevelSystem::GetBrickSet(int set) // These are sets the Kraken glm::vec4 m = glm::vec4(1, 0, 1, 1); glm::vec4 d = glm::vec4(0, 0, 0, 1); - if (set == 1) { - level = - {1, 0, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0}; - color = - {r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r}; - } - else if (set == 2) { - level = - {0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 3, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0}; - color = - {y, y, y, y, y, y, y, - y, y, y, y, y, y, y, - y, y, y, y, y, y, y, - y, y, y, y, y, y, y, - y, y, y, y, y, y, y, - y, y, y, y, y, y, y}; - } - else if (set == 3) { - level = - {0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 1, 0, 1, - 0, 1, 1, 1, 1, 1, 0, - 0, 0, 4, 1, 1, 0, 0, - 0, 0, 0, 1, 0, 0, 0}; - color = - {b, b, b, b, b, b, b, - b, b, b, b, b, b, b, - b, b, b, b, b, b, b, - b, b, b, b, b, b, b, - b, b, b, b, b, b, b, - b, b, b, b, b, b, b}; - } - else if (set == 4) { - level = - {0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 3, 1, - 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0}; - color = - {m, m, m, m, m, m, m, - m, m, m, m, m, m, m, - m, m, m, m, m, m, m, - m, m, m, m, m, m, m, - m, m, m, m, m, m, m, - m, m, m, m, m, m, m}; - } - else if (set == 5) { - level = - {0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 0, - 0, 1, 2, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0}; - color = - {g, g, g, g, g, g, g, - g, g, g, g, g, g, g, - g, g, g, g, g, g, g, - g, g, g, g, g, g, g, - g, g, g, g, g, g, g, - g, g, g, g, g, g, g}; - } - else if (set == 6) { - level = - {0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0}; - color = - {r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r, - r, r, r, r, r, r, r}; + if (setCluster == 0) { + if (set == 1) { + level = // The Charge + {1, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r }; + } else if (set == 2) { + level = // The Audience + {0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y }; + } else if (set == 3) { + level = // The Alien Defense + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b }; + } else if (set == 4) { + level = // The Scales (right) + {1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1 }; + color = + {m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m }; + } else if (set == 5) { + level = // The Scales (left) + {0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0 }; + color = + {g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g }; + } else if (set == 6) { + level = // The Sword + {0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0 }; + color = + {c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c }; + } + } else if (setCluster == 1) { + if (set == 1) { + level = // The Wall + {1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r }; + } else if (set == 2) { + level = // The Checkerboard + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 3, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y }; + } else if (set == 3) { + level = // The Fighter Jet + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, + 0, 1, 1, 1, 1, 1, 0, + 0, 0, 4, 1, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0 }; + color = + {b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b }; + } else if (set == 4) { + level = // The Formation + {0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 3, 1, + 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m }; + } else if (set == 5) { + level = // The Pillars + {0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 1, 1, 0, + 0, 1, 2, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g }; + } else if (set == 6) { + level = // The Treasure Chest + {0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 5, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; + color = + {c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c }; + } + } else if (setCluster == 2) { + if (set == 1) { + level = // The Butterfly + {1, 0, 0, 1, 0, 0, 1, + 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 1, + 1, 0, 0, 2, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 3 }; + color = + {r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r, + r, r, r, r, r, r, r }; + } else if (set == 2) { + level = // The Cross + {1, 1, 0, 0, 0, 1, 1, + 0, 4, 1, 0, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 3, 1, 0, 0, + 0, 1, 1, 0, 1, 1, 0, + 1, 1, 0, 0, 0, 1, 1 }; + color = + {y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y, + y, y, y, y, y, y, y }; + } else if (set == 3) { + level = // The Inverted Cross + {0, 0, 1, 6, 1, 0, 0, + 1, 0, 0, 1, 0, 0, 1, + 1, 1, 0, 0, 0, 1, 3, + 1, 1, 0, 0, 0, 1, 1, + 1, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 1, 1, 0, 0 }; + color = + {b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b, + b, b, b, b, b, b, b }; + } else if (set == 4) { + level = // The Great Wall + {1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 5, 1, + 0, 0, 0, 0, 0, 0, 0, + 1, 3, 1, 1, 1, 1, 1 }; + color = + {m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m, + m, m, m, m, m, m, m }; + } else if (set == 5) { + level = // The Champion + {0, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 2, 0, 0, + 0, 0, 1, 1, 1, 0, 0, + 1, 1, 1, 0, 1, 1, 1, + 5, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1 }; + color = + {g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g, + g, g, g, g, g, g, g }; + } else if (set == 6) { + level = // The Dog. What, you can't see it? XD + {0, 1, 1, 1, 1, 1, 0, + 1, 1, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 0, 0, 0, 3, 0, 0, 0 }; + color = + {c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c, + c, c, c, c, c, c, c }; + } } std::copy(std::begin(level), std::end(level), std::begin(m_BrickSet)); @@ -690,7 +911,11 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) brick = m_World->GetComponent(entityBrick); if (brick == nullptr) { return false; - } + } + + if (brick->BeingGenerated) { + return false; + } if (entityShot != 0) { // For when a brick gets shot. @@ -913,10 +1138,15 @@ bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &ev bool dd::Systems::LevelSystem::OnKrakenDefeated(const dd::Events::KrakenDefeated &event) { m_BrickGenerating = false; + m_BreakAllBricks = true; SetNumberOfBricks(NumberOfBricks() - 1); m_LooseBricks--; - std::cout << m_LooseBricks << std::endl; + Events::ScoreEvent e; + e.Score = 1000; + EventBroker->Publish(e); + + //std::cout << m_LooseBricks << std::endl; return true; } @@ -924,6 +1154,7 @@ bool dd::Systems::LevelSystem::OnKrakenDefeated(const dd::Events::KrakenDefeated bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) { if (!m_Cleared) { + m_BreakAllBricks = false; m_Cleared = true; SetRestarting(true); Events::ResetBall e; @@ -1002,7 +1233,6 @@ void dd::Systems::LevelSystem::GetNextLevel() glm::vec4 p3 = glm::vec4(189.f / 255.f, 0.f / 255.f, 187.f / 255.f, 1.f); glm::vec4 p4 = glm::vec4(125.f / 255.f, 0.f / 255.f, 147.f / 255.f, 1.f); - if (m_CurrentCluster == 0) { if (m_CurrentLevel == 1) { level = @@ -1023,10 +1253,10 @@ void dd::Systems::LevelSystem::GetNextLevel() level = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0}; + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 100, 0, 0, 0}; color = {w, w, w, w, w, w, w, w, w, w, w, w, w, w, @@ -1102,7 +1332,7 @@ void dd::Systems::LevelSystem::GetNextLevel() 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; color = {w, w, w, w, w, w, w, @@ -1199,10 +1429,6 @@ void dd::Systems::LevelSystem::GetNextLevel() bool dd::Systems::LevelSystem::OnHitPad(const dd::Events::HitPad &event) { m_Cleared = false; - if (m_BrickGenerating) { - m_BrickGenerating = false; - BrickGenerating(m_BrickGeneratingEvent); - } return true; } diff --git a/src/game/Game/LifeSystem.cpp b/src/game/Game/LifeSystem.cpp index 944ed1c..290b9bf 100644 --- a/src/game/Game/LifeSystem.cpp +++ b/src/game/Game/LifeSystem.cpp @@ -47,14 +47,94 @@ void dd::Systems::LifeSystem::UpdateEntity(double dt, EntityID entity, EntityID auto templateCheck = m_World->GetComponent(entity); if (templateCheck != nullptr){ return; } + auto life = m_World->GetComponent(entity); - if (Lives() != PastLives()) { - auto life = m_World->GetComponent(entity); - if (life != nullptr) { - if (life->Number + 1 == PastLives()) { - m_World->RemoveEntity(entity); - SetPastLives(Lives()); + + if (life != nullptr) { + auto transform = m_World->GetComponent(entity); + if (transform->Position.y < -8) { + m_World->RemoveEntity(entity); + return; + } + + transform->Position.x += transform->Velocity.x * dt; + transform->Position.y += transform->Velocity.y * dt; + + glm::vec2 dir = glm::normalize(glm::vec2(transform->Velocity.x, transform->Velocity.y)); + glm::vec2 up = glm::vec2(0.f, 1.f); + float angle = glm::acos(glm::dot(dir, up)) * glm::sign(dir.x); + transform->Orientation = glm::rotate(glm::quat(), angle, glm::vec3(0.f, 0.f, -1.f)); + + if (!life->Dead) { + if (life->Left) { + if (transform->Position.x < -3.8) { + life->Left = false; + transform->Velocity.x = m_LifeSpeed; + } } + else { + if (transform->Position.x > 3.8) { + life->Left = true; + transform->Velocity.x = -m_LifeSpeed; + } + } + + float sin = life->SinusAltitude; + life->SinusAltitude += life->SinusSpeed * dt; + float y = glm::sin((sin)* glm::half_pi() * life->Frequency) * life->Amplitude; + transform->Velocity.y = y; + + if (Lives() != PastLives()) { + if (life->Number + 1 == PastLives()) { + life->Dead = true; + auto model = m_World->GetComponent(entity); + model->Color *= 0.3; + + //Particle trail + Events::CreateParticleSequence trail; + trail.parent = entity; + 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 = model->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 = transform->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 = model->Color; + poof.AlphaValues.clear(); + poof.AlphaValues.push_back(1.f); + poof.AlphaValues.push_back(0.f); + poof.Speed = 10; + EventBroker->Publish(poof); + + //m_World->RemoveEntity(entity); + SetPastLives(Lives()); + } + } + } else { + transform->Velocity.y -= 0.5 * dt; } } } @@ -63,15 +143,25 @@ void dd::Systems::LifeSystem::CreateLife(int number) { auto life = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(life); - transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); - transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); + //transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); + transform->Position = glm::vec3(-3.8f + number * 3.7f, -5.2f, -10.f); + //transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); + transform->Scale = glm::vec3(0.2f, 0.2f, 0.2f); + transform->Velocity.x = m_LifeSpeed; - std::shared_ptr lifeNr = m_World->AddComponent(life); - lifeNr->Number = number; + std::shared_ptr cLife = m_World->AddComponent(life); + cLife->Number = number; + cLife->SinusAltitude = glm::half_pi() * number; + cLife->Amplitude = 0.2; + cLife->Frequency = 1; + cLife->SinusSpeed = 1; auto model = m_World->AddComponent(life); model->ModelFile = "Models/Sid/Sid.dae"; + auto anim = m_World->AddComponent(life); + anim->Speed = 0.5f; + m_World->CommitEntity(life); } @@ -81,7 +171,7 @@ bool dd::Systems::LifeSystem::OnLifeLost(const dd::Events::LifeLost &event) SetLives(Lives() - 1); return true; } - return false; + return true; } bool dd::Systems::LifeSystem::OnPause(const dd::Events::Pause &event) diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 35d37fb..fb6390f 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -58,7 +58,11 @@ void dd::Systems::PadSystem::Initialize() auto pad = m_World->AddComponent(ent); m_World->CommitEntity(ent); - SetEdge(3.2 - (ctransform->Scale.x / 2)); + m_Edge = 3.2 - (ctransform->Scale.x / 2); + + m_PadEntity = ent; + m_PadTransform = ctransform.get(); + m_PadComponent = pad.get(); } //Stick @@ -77,18 +81,31 @@ 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); + /*{ + 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); + 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); }*/ } + // Kraken arm + { + m_KrakenArm = m_World->CreateEntity(m_PadEntity); + auto transform = m_World->AddComponent(m_KrakenArm); + transform->Position = glm::vec3(1.f, -3.0f, 0.f); + auto model = m_World->AddComponent(m_KrakenArm); + model->ModelFile = "Models/Kraken/Arm.dae"; + auto animation = m_World->AddComponent(m_KrakenArm); + animation->Speed = 0.0f; + animation->Loop = false; + m_World->CommitEntity(m_KrakenArm); + } + m_ResetBall = true; } @@ -110,7 +127,7 @@ void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID p m_ResetBall = false; } auto ballTransform = m_World->GetComponent(entity); - ballTransform->Position = Transform()->Position; + ballTransform->Position = m_PadTransform->Position; ballTransform->Position += ball->StickyPlacement; if (ball->Loaded) { ballTransform->Orientation = glm::quat(); @@ -138,17 +155,6 @@ void dd::Systems::PadSystem::Update(double dt) return; } - if (Entity() == 0) { - for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { - if (m_World->GetProperty(it->first, "Name") == "Pad") { - SetEntity(it->first); - SetTransform(m_World->GetComponent(Entity())); - SetPad(m_World->GetComponent(Entity())); - break; - } - } - } - if (m_KrakenAttack) { m_KrakenCharge -= m_KrakenStrength * dt; if (m_KrakenCharge < 0) { @@ -160,9 +166,9 @@ void dd::Systems::PadSystem::Update(double dt) return; } - auto transform = Transform(); - auto pad = Pad(); - auto acceleration = Acceleration(); + auto transform = m_PadTransform; + auto pad = m_PadComponent; + auto acceleration = m_PadAcceleration; if (glm::abs(transform->Position.y - m_PadHeight) > m_PadRiseSpeed) { if (transform->Position.y < m_PadHeight) { @@ -178,27 +184,27 @@ void dd::Systems::PadSystem::Update(double dt) transform->Velocity.x = pad->MaxSpeed; } transform->Position += transform->Velocity * (float)dt; - if (transform->Position.x > Edge()) { - transform->Position.x = Edge(); - } else if (transform->Position.x < -Edge()) { - transform->Position.x = -Edge(); + if (transform->Position.x > m_Edge) { + transform->Position.x = m_Edge; + } else if (transform->Position.x < -m_Edge) { + transform->Position.x = -m_Edge; } - transform->Velocity += acceleration * (float)dt; - if (glm::abs(transform->Velocity.x) > 1 || (!Left() && !Right())) { + transform->Velocity += acceleration * (float)dt; + if (glm::abs(transform->Velocity.x) > 1 || (!m_Left && !m_Right)) { transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float) dt; } - if (Left()) { + if (m_Left) { acceleration.x = -pad->AccelerationSpeed; - } else if (Right()) { + } else if (m_Right) { acceleration.x = pad->AccelerationSpeed; } else { acceleration.x = 0.f; } - SetTransform(transform); - SetPad(pad); - SetAcceleration(acceleration); + m_PadTransform = transform; + m_PadComponent = pad; + m_PadAcceleration = acceleration; return; } @@ -232,11 +238,11 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { } else if (val == GLFW_KEY_LEFT) { //std::cout << "Left!" << std::endl; //acceleration.x = -0.01f; - SetLeft(true); + m_Left = true; } else if (val == GLFW_KEY_RIGHT) { //std::cout << "Right!" << std::endl; //acceleration.x = 0.01f; - SetRight(true); + m_Right = true; } else if (val == GLFW_KEY_R) { Events::ResetBall e; EventBroker->Publish(e); @@ -255,7 +261,7 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { EventBroker->Publish(e); } else if (val == GLFW_KEY_M) { Events::MultiBall e; - e.padTransform = Transform(); + e.padTransform = m_PadTransform; EventBroker->Publish(e); } else if (val == GLFW_KEY_P) { if (IsPaused()) { @@ -289,7 +295,7 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { EventBroker->Publish(e); } else if (val == GLFW_KEY_L) { Events::Lifebuoy e; - e.Transform = Transform(); + e.Transform = m_PadTransform; EventBroker->Publish(e); } else if (val == GLFW_KEY_Y) { Events::StickyPad e; @@ -308,14 +314,14 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { EventBroker->Publish(e); } else if (val == GLFW_KEY_Q) { Events::Move e; - e.Entity = Entity(); + e.Entity = m_PadEntity; e.GoalPosition = glm::vec3(0, 0, -10); e.Speed = 5; e.Queue = false; EventBroker->Publish(e); } else if (val == GLFW_KEY_SPACE) { Events::ActionButton e; - e.Position = Transform()->Position; + e.Position = m_PadTransform->Position; EventBroker->Publish(e); } else if (val == GLFW_KEY_D) { return false; @@ -331,9 +337,9 @@ bool dd::Systems::PadSystem::OnKeyUp(const dd::Events::KeyUp &event) } else if (val == GLFW_KEY_DOWN) { } else if (val == GLFW_KEY_LEFT) { - SetLeft(false); + m_Left = false; } else if (val == GLFW_KEY_RIGHT) { - SetRight(false); + m_Right = false; } return true; } @@ -476,23 +482,15 @@ bool dd::Systems::PadSystem::OnKrakenAttack(const dd::Events::KrakenAttack &even m_PlayerStrength = event.PlayerStrength; m_KrakenCharge = event.ChargeUpdate; m_KrakenAttack = true; - auto transform = Transform(); - auto acceleration = Acceleration(); + auto transform = m_PadTransform; + auto acceleration = m_PadAcceleration; transform->Velocity = glm::vec3(0, 0, 0); acceleration = glm::vec3(0, 0, 0); - LOG_INFO("Kraken arm duuude"); - if (!m_KrakenArm){ - LOG_INFO("InKrakenArmDuuude"); - m_KrakenArm = m_World->CreateEntity(Entity()); - auto transform = m_World->AddComponent(m_KrakenArm); - transform->Position = glm::vec3(1.f, -3.0f, 0.f); - auto model = m_World->AddComponent(m_KrakenArm); - model->ModelFile = "Models/Kraken/Arm.dae"; - auto animation = m_World->AddComponent(m_KrakenArm); - animation->Speed = 1.0f; - animation->Loop = false; - m_World->CommitEntity(m_KrakenArm); + if (m_KrakenArmHitbox == 0) { + auto animation = m_World->GetComponent(m_KrakenArm); + animation->Time = 0.0; + animation->Speed = 1.0; m_KrakenArmHitbox = m_World->CreateEntity(); auto hb_transform = m_World->AddComponent(m_KrakenArmHitbox); @@ -513,8 +511,8 @@ bool dd::Systems::PadSystem::OnKrakenAttack(const dd::Events::KrakenAttack &even m_World->CommitEntity(m_KrakenArmHitbox); } - SetTransform(transform); - SetAcceleration(acceleration); + m_PadTransform = transform; + m_PadAcceleration = acceleration; } else if (m_KrakenCharge >= 1) { m_KrakenAttack = false; Events::KrakenAttackEnd e; @@ -530,10 +528,14 @@ bool dd::Systems::PadSystem::OnKrakenAttackEnd(const dd::Events::KrakenAttackEnd m_KrakenStrength = 0; m_PlayerStrength = 0; - m_World->RemoveEntity(m_KrakenArm); - m_World->RemoveEntity(m_KrakenArmHitbox); - m_KrakenArm = NULL; - m_KrakenArmHitbox = NULL; + //m_World->RemoveEntity(m_KrakenArm); + + auto animation = m_World->GetComponent(m_KrakenArm); + animation->Time = 0.0; + animation->Speed = -1.5; + m_World->RemoveEntity(m_KrakenArmHitbox); + //m_KrakenArm = NULL; + m_KrakenArmHitbox = 0; return true; } diff --git a/src/game/Game/ProjectileSystem.cpp.orig b/src/game/Game/ProjectileSystem.cpp.orig deleted file mode 100644 index 69b3667..0000000 --- a/src/game/Game/ProjectileSystem.cpp.orig +++ /dev/null @@ -1,151 +0,0 @@ -// -// 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_EResume, &ProjectileSystem::OnResume); - 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->Position = glm::vec3(0.f, 0.f, -10.f); - ctransform->Scale = glm::vec3(0.6f, 0.6f, 0.6f); -// auto cModel = m_World->AddComponent(ent); -// cModel->ModelFile = "Models/Test/Ball/Sid.obj"; - auto cSprite = m_World->AddComponent(ent); - cSprite->SpriteFile = "Textures/Particles/OilShot.png"; - auto projectile = m_World->AddComponent(ent); - - m_World->CommitEntity(ent); - - m_InkBlastTemplate = ent; - } - - return; -} - -void dd::Systems::ProjectileSystem::Update(double dt) -{ - if (m_Pause) { - return; - } -} - -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; - }*/ - - m_Pause = true; - - return true; -} - -bool dd::Systems::ProjectileSystem::OnResume(const dd::Events::Resume &event) -{ - /*if (event.Type != "ProjectileSystem" && event.Type != "All") { - return false; - }*/ - m_Pause = false; - 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 = event.Shots; - m_InkBlasterSpeed = event.Speed; - 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 projectile = m_World->GetComponent(ent); - projectile->Speed = m_InkBlasterSpeed; - auto transform = m_World->GetComponent(ent); - transform->Position = event.Position; -<<<<<<< HEAD - transform->Velocity = glm::vec3(0, projectile->Speed, 0); -======= - transform->Velocity = glm::vec3(0, 7, 0); ->>>>>>> origin/master - 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; - ball->Waiting = true; - - { - Events::InkBlasterOver e; - e.Ball = m_AttachedSquid; - EventBroker->Publish(e); - } - { - Events::ActionButton e; - EventBroker->Publish(e); - } - } - } - return true; -} diff --git a/src/game/Game/ScreenShakeSystem.cpp b/src/game/Game/ScreenShakeSystem.cpp index 82a2ab2..1f158f0 100644 --- a/src/game/Game/ScreenShakeSystem.cpp +++ b/src/game/Game/ScreenShakeSystem.cpp @@ -37,7 +37,7 @@ void dd::Systems::ScreenShakeSystem::UpdateEntity(double dt, EntityID entity, En return; } - /*auto camera = m_World->GetComponent(entity); + auto camera = m_World->GetComponent(entity); if (camera != nullptr) { auto transform = m_World->GetComponent(entity); @@ -74,7 +74,7 @@ void dd::Systems::ScreenShakeSystem::UpdateEntity(double dt, EntityID entity, En } else { m_CameraPosition = transform->Position; } - }*/ + } } bool dd::Systems::ScreenShakeSystem::OnPause(const dd::Events::Pause &event) diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 794302c..acdb631 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -236,7 +236,12 @@ void dd::Systems::PhysicsSystem::Update(double dt) auto particle = m_World->GetComponent(entity); transform->Position = glm::vec3(position.x, position.y, transform->Position.z); - transform->Scale = particle->Scale;//glm::vec3(particle->Radius * 2.f, particle->Radius * 2.f, 1); + EntityID emitter = m_ParticleEmitters.ParticleEmitter[e]; + auto cEmitter = m_World->GetComponent(emitter); + if (!cEmitter->DefaultScale) + { + transform->Scale = particle->Scale; + } } } @@ -272,7 +277,7 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity m_World->RemoveEntity(entity); } } - //Update alpha + //Update alpha & scale auto sprite = m_World->GetComponent(entity); float timeProgress = particle->TimeLived / (particle->LifeTime - 0.1); if (timeProgress > 1) { @@ -281,7 +286,9 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity auto emitter = m_World->GetComponent(particle->ParticleSystem); if (emitter) { sprite->Color.w = ScalarInterpolation(timeProgress, emitter->AlphaValues); - particle->Scale = VectorInterpolation(timeProgress, emitter->ScaleValues); + if (!emitter->DefaultScale) { + particle->Scale = VectorInterpolation(timeProgress, emitter->ScaleValues); + } } } @@ -720,8 +727,9 @@ bool dd::Systems::PhysicsSystem::CreateParticleSequence(const Events::CreatePart particleEmitter->EmittingAngle = event.EmittingAngle; particleEmitter->LifeTime = event.EmitterLifeTime; particleEmitter->AlphaValues = event.AlphaValues; - particleEmitter->ScaleValues = event.ScaleValues; particleEmitter->RadiusDistribution = event.RadiusDistribution; + particleEmitter->DefaultScale = event.DefaultScale; + particleEmitter->ScaleValues = event.ScaleValues; { //Creating Particle Template auto particle = m_World->CreateEntity(emitter); @@ -731,10 +739,17 @@ bool dd::Systems::PhysicsSystem::CreateParticleSequence(const Events::CreatePart m_World->AddComponent(particle); particleTransform->Position = emitterTransform->Position; sprite->SpriteFile = event.SpriteFile; + if (particleEmitter->DefaultScale == true) + { + Texture* texture = ResourceManager::Load(event.SpriteFile); + particleEmitter->ScaleValues.clear(); + particleEmitter->ScaleValues.push_back(glm::vec3(texture->Width / 100, texture->Height / 100, 1)); + + } sprite->Color = event.Color; particleComponent->LifeTime = event.ParticleLifeTime; particleComponent->Flags = event.Flags; - particleComponent->Scale = event.ScaleValues[0]; + particleComponent->Scale = particleEmitter->ScaleValues[0]; particleComponent->ParticleSystem = emitter; } m_World->CommitEntity(emitter); @@ -823,7 +838,7 @@ bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) } Events::PlaySound se; - //Spawn a particle when a brick collides with somthing + //Spawn a particle when a brick collides with something Events::CreateParticleSequence e; e.EmitterLifeTime = 3; e.EmittingAngle = glm::half_pi(); @@ -835,8 +850,9 @@ bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) e.Color = glm::vec4(1.f); e.AlphaValues.push_back(1.f); e.AlphaValues.push_back(0.f); - e.ScaleValues.push_back(glm::vec3(1.f)); + e.ScaleValues.push_back(glm::vec3(4)); e.Speed = 0; + e.DefaultScale = true; auto PowerFriend = m_World->GetComponent(entity); auto PowerSaviour = m_World->GetComponent(entity); @@ -846,21 +862,27 @@ bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) if (PowerFriend) { se.FilePath = "Sounds/jap-awesome.wav"; + EventBroker->Publish(se); e.SpriteFile = "Textures/PowerUps/Friends.png"; } else if (PowerSaviour) { se.FilePath = "Sounds/jap-awesome.wav"; + EventBroker->Publish(se); e.SpriteFile = "Textures/PowerUps/Saviour.png"; } else if (PowerSticky) { se.FilePath = "Sounds/jap-awesome.wav"; + EventBroker->Publish(se); e.SpriteFile = "Textures/PowerUps/Sticky.png"; } else if (PowerInkBlaster){ se.FilePath = "Sounds/jap-awesome.wav"; + EventBroker->Publish(se); e.SpriteFile = "Textures/PowerUps/InkBlaster.png"; } else if (PowerKraken) { - se.FilePath = "Sounds/jap-awesome.wav"; + se.FilePath = "Sounds/jap-huh.wav"; + EventBroker->Publish(se); e.SpriteFile = "Textures/PowerUps/RealeaseTheKraken.png"; } else { + e.DefaultScale = false; e.EmitterLifeTime = 4; e.EmittingAngle = glm::half_pi(); e.Spread = 0.5f; @@ -880,7 +902,6 @@ bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) } EventBroker->Publish(e); - EventBroker->Publish(se); return true; diff --git a/src/game/Rendering/AnimationSystem.cpp b/src/game/Rendering/AnimationSystem.cpp index 404f47a..3a48bd3 100644 --- a/src/game/Rendering/AnimationSystem.cpp +++ b/src/game/Rendering/AnimationSystem.cpp @@ -35,18 +35,17 @@ void dd::Systems::AnimationSystem::Update(double dt) if (animationComponent->Speed != 0.0) { double nextTime = animationComponent->Time + animationComponent->Speed * dt; - if (glm::abs(nextTime) > animation->Duration) { - if (!animationComponent->Loop) { - animationComponent->Time = glm::sign(nextTime) * animation->Duration; - animationComponent->Speed = 0.0; - LOG_DEBUG("Animation \"%s\" on Entity %i finished.", animationComponent->Name.c_str(), ent); - Events::AnimationComplete e; - e.Entity = ent; - e.Animation = animationComponent->Name; + if (!animationComponent->Loop && glm::abs(nextTime) > animation->Duration) { + animationComponent->Time = glm::sign(nextTime) * animation->Duration; + animationComponent->Speed = 0.0; + LOG_DEBUG("Animation \"%s\" on Entity %i finished.", animationComponent->Name.c_str(), ent); + Events::AnimationComplete e; + e.Entity = ent; + e.Animation = animationComponent->Name; EventBroker->Publish(e); - } + } else { + animationComponent->Time = nextTime; } - animationComponent->Time = nextTime; } } } diff --git a/src/game/Rendering/OpenGL/Renderer.cpp b/src/game/Rendering/OpenGL/Renderer.cpp index d0c0877..2e897b2 100644 --- a/src/game/Rendering/OpenGL/Renderer.cpp +++ b/src/game/Rendering/OpenGL/Renderer.cpp @@ -21,6 +21,10 @@ void dd::Renderer::Initialize() { + ResourceManager::RegisterType("ShaderProgram"); + ResourceManager::RegisterType("VertexShader"); + ResourceManager::RegisterType("FragmentShader"); + // Initialize GLFW if (!glfwInit()) { LOG_ERROR("GLFW: Initialization failed"); @@ -59,7 +63,7 @@ void dd::Renderer::Initialize() } // Create default camera - m_DefaultCamera = std::unique_ptr(new dd::Camera((float)m_Resolution.Width / m_Resolution.Height, 45.f, 0.01f, 5000.f)); + m_DefaultCamera = std::unique_ptr(new dd::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f)); m_DefaultCamera->SetPosition(glm::vec3(0, 0, 0)); if (m_Camera == nullptr) { m_Camera = m_DefaultCamera.get(); @@ -387,11 +391,6 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) DrawWater(objects); } -void dd::Renderer::PlaceCamera(glm::vec3 position) -{ - m_DefaultCamera->SetPosition(position); -} - void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) { GLuint shaderProgramHandle = program; diff --git a/src/game/Rendering/Skeleton.cpp b/src/game/Rendering/Skeleton.cpp index d68d59a..319bfd4 100644 --- a/src/game/Rendering/Skeleton.cpp +++ b/src/game/Rendering/Skeleton.cpp @@ -69,7 +69,7 @@ std::vector dd::Skeleton::GetFrameBones(const Animation& animation, d int currentKeyframeIndex = GetKeyframe(animation, time); const Animation::Keyframe& currentFrame = animation.Keyframes[currentKeyframeIndex]; - const Animation::Keyframe& nextFrame = animation.Keyframes[currentKeyframeIndex + 1]; + const Animation::Keyframe& nextFrame = animation.Keyframes[(currentKeyframeIndex + 1) % animation.Keyframes.size()]; float alpha = (time - currentFrame.Time) / (nextFrame.Time - currentFrame.Time); //auto animationFrame = Animations[""].Keyframes[frame]; @@ -149,7 +149,7 @@ int dd::Skeleton::GetKeyframe(const Animation& animation, double time) { if (time < 0) time = 0; - if (time > animation.Duration) + if (time >= animation.Duration) return animation.Keyframes.size() - 1; for (int keyframe = 0; keyframe < animation.Keyframes.size(); ++keyframe) { diff --git a/src/game/Sound/SoundSystem.cpp b/src/game/Sound/SoundSystem.cpp index afafec3..0d3d8e7 100644 --- a/src/game/Sound/SoundSystem.cpp +++ b/src/game/Sound/SoundSystem.cpp @@ -40,6 +40,7 @@ void dd::Systems::SoundSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound); EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume); EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &SoundSystem::OnGameStart); + EVENT_SUBSCRIBE_MEMBER(m_EKrakenAppear, &SoundSystem::OnKrakenAppear); m_SFXMasterVolume = ResourceManager::Load("Config.ini")->GetValue("Audio.SFXVolume", 1.f); m_BGMMasterVolume = ResourceManager::Load("Config.ini")->GetValue("Audio.BGMVolume", 1.f); @@ -214,5 +215,32 @@ bool dd::Systems::SoundSystem::OnGameStart(const dd::Events::GameStart &event) return true; } +bool dd::Systems::SoundSystem::OnKrakenAppear(const dd::Events::KrakenAppear &event) +{ + { + dd::Events::StopSound e; + e.FilePath = GAME_BGM; + EventBroker->Publish(e); + } + { + dd::Events::StopSound e; + e.FilePath = WATER_BGM; + EventBroker->Publish(e); + } + { + dd::Events::PlaySound e; + e.FilePath = BOSS_BGM; + e.IsAmbient = true; + e.Gain = 0.4f; + EventBroker->Publish(e); + } + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/Boss/boss-roar.wav"; + EventBroker->Publish(e); + } + return true; +} +