diff --git a/include/Game/Systems/AbilityCooldownHUDSystem.h b/include/Game/Systems/AbilityCooldownHUDSystem.h
new file mode 100644
index 00000000..610b4dc2
--- /dev/null
+++ b/include/Game/Systems/AbilityCooldownHUDSystem.h
@@ -0,0 +1,17 @@
+#ifndef AbilityCooldownHUDSystem_h__
+#define AbilityCooldownHUDSystem_h__
+
+#include "../../Engine/Core/System.h"
+#include "../../Engine/GLM.h"
+
+class AbilityCooldownHUDSystem : public ImpureSystem
+{
+public:
+ AbilityCooldownHUDSystem(SystemParams params)
+ : System(params)
+ { }
+
+ virtual void Update(double dt) override;
+};
+
+#endif
\ No newline at end of file
diff --git a/include/Game/Systems/BoostIconsHUDSystem.h b/include/Game/Systems/BoostIconsHUDSystem.h
new file mode 100644
index 00000000..d8de777d
--- /dev/null
+++ b/include/Game/Systems/BoostIconsHUDSystem.h
@@ -0,0 +1,19 @@
+#ifndef BoostIconsHUDSystem_h__
+#define BoostIconsHUDSystem_h__
+
+#include "../../Engine/Core/System.h"
+#include "../../Engine/GLM.h"
+
+class BoostIconsHUDSystem : public PureSystem
+{
+public:
+ BoostIconsHUDSystem(SystemParams params)
+ : System(params)
+ , PureSystem("BoostIconsHUD")
+ { }
+
+ virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
+
+};
+
+#endif
\ No newline at end of file
diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd
index e559db09..d1572252 100644
--- a/resources/Schema/Components.xsd
+++ b/resources/Schema/Components.xsd
@@ -51,11 +51,13 @@
+
+
\ No newline at end of file
diff --git a/resources/Schema/Components/AbilityCooldownHUD.xml b/resources/Schema/Components/AbilityCooldownHUD.xml
new file mode 100644
index 00000000..8f91bbc3
--- /dev/null
+++ b/resources/Schema/Components/AbilityCooldownHUD.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/resources/Schema/Components/AbilityCooldownHUD.xsd b/resources/Schema/Components/AbilityCooldownHUD.xsd
new file mode 100644
index 00000000..5bfb01a8
--- /dev/null
+++ b/resources/Schema/Components/AbilityCooldownHUD.xsd
@@ -0,0 +1,9 @@
+
+
+
+
+
+ HUD element for tracking ability cooldown. If it has a sprite and fill component it will fill the sprite with chosen color depending on the cooldown.\n A child with text component named "Cooldown"
+
+
+
\ No newline at end of file
diff --git a/resources/Schema/Components/BoostIconsHUD.xml b/resources/Schema/Components/BoostIconsHUD.xml
new file mode 100644
index 00000000..e25d9611
--- /dev/null
+++ b/resources/Schema/Components/BoostIconsHUD.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/Schema/Components/BoostIconsHUD.xsd b/resources/Schema/Components/BoostIconsHUD.xsd
new file mode 100644
index 00000000..c5fe2e5d
--- /dev/null
+++ b/resources/Schema/Components/BoostIconsHUD.xsd
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Origin for the 3 boost states. Create 3 children with Sprite and Fill components, name them "Sprint", "Defender", "Assault"
+
+
+
\ No newline at end of file
diff --git a/resources/Schema/Components/Text.xml b/resources/Schema/Components/Text.xml
index d38d3961..cda29b86 100644
--- a/resources/Schema/Components/Text.xml
+++ b/resources/Schema/Components/Text.xml
@@ -1,7 +1,7 @@
-
+ Fonts/DroidSans.ttf,64
true
diff --git a/resources/Schema/Entities/Player.xml b/resources/Schema/Entities/Player.xml
index 28ace561..34692605 100644
--- a/resources/Schema/Entities/Player.xml
+++ b/resources/Schema/Entities/Player.xml
@@ -100,12 +100,12 @@
1
-
100/100
Fonts/DroidSans.ttf,64
+
@@ -132,7 +132,70 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/White.png
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/White.png
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/White.png
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -196,7 +259,6 @@
3
- 0.80222018197612788
@@ -231,6 +293,7 @@
4
+ 1
@@ -286,7 +349,7 @@
Textures/Core/UnitHexagon.png
-
+
@@ -297,7 +360,8 @@
-
+ 1
+
Textures/Core/UnitHexagon_Rotated.png
@@ -306,7 +370,7 @@
-
+
@@ -369,6 +433,25 @@
+
+
+
+
+ Models/Widgets/Arrows/Arrow5.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd
index 1da5e628..126276f6 100644
--- a/resources/Schema/Types/Entity.xsd
+++ b/resources/Schema/Types/Entity.xsd
@@ -51,8 +51,10 @@
+
+
diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp
index 5e82dc2e..ab4b9652 100644
--- a/src/Game/Game.cpp
+++ b/src/Game/Game.cpp
@@ -27,9 +27,11 @@
#include "Rendering/AnimationSystem.h"
#include "Network/MultiplayerSnapshotFilter.h"
#include "Game/Systems/AmmunitionHUDSystem.h"
+#include "Game/Systems/AbilityCooldownHUDSystem.h"
#include "Game/Systems/CapturePointArrowHUDSystem.h"
#include "Game/Systems/KillFeedSystem.h"
#include "Game/Systems/BoostSystem.h"
+#include "Game/Systems/BoostIconsHUDSystem.h"
#include "GUI/ButtonSystem.h"
#include "GUI/MainMenuSystem.h"
@@ -134,6 +136,7 @@ Game::Game(int argc, char* argv[])
m_SystemPipeline->AddSystem(updateOrderLevel);
m_SystemPipeline->AddSystem(updateOrderLevel);
m_SystemPipeline->AddSystem(updateOrderLevel);
+ m_SystemPipeline->AddSystem(updateOrderLevel);
m_SystemPipeline->AddSystem(updateOrderLevel);
m_SystemPipeline->AddSystem(updateOrderLevel);
m_SystemPipeline->AddSystem(updateOrderLevel);
@@ -147,6 +150,7 @@ Game::Game(int argc, char* argv[])
m_SystemPipeline->AddSystem(updateOrderLevel);
m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer);
m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer);
+ m_SystemPipeline->AddSystem(updateOrderLevel);
// Populate Octree with collidables
++updateOrderLevel;
m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeCollision, "Collidable");
diff --git a/src/Game/Systems/AbilityCooldownHUDSystem.cpp b/src/Game/Systems/AbilityCooldownHUDSystem.cpp
new file mode 100644
index 00000000..44180a62
--- /dev/null
+++ b/src/Game/Systems/AbilityCooldownHUDSystem.cpp
@@ -0,0 +1,30 @@
+#include "Game/Systems/AbilityCooldownHUDSystem.h"
+
+void AbilityCooldownHUDSystem::Update(double dt)
+{
+ //HUD element for tracking cooldown on the parent entity with Dashability TODO: Make sure it support other abilities when they are made.
+
+ auto abilityHUDs = m_World->GetComponents("AbilityCooldownHUD");
+ if (abilityHUDs == nullptr)
+ return;
+
+ for (auto& abilityHUDC : *abilityHUDs) {
+ EntityWrapper entity = EntityWrapper(m_World, abilityHUDC.EntityID);
+ EntityWrapper abilityEntity = entity.FirstParentWithComponent("DashAbility");
+ if (!abilityEntity.Valid())
+ return;
+ EntityWrapper cooldownTextEntity = entity.FirstChildByName("Cooldown");
+ if(cooldownTextEntity.Valid()) {
+ if(cooldownTextEntity.HasComponent("Text"))
+ {
+ double maxAbilityCD = (double)abilityEntity["DashAbility"]["CoolDownMaxTimer"];
+ double currentAbilityCD = (double)abilityEntity["DashAbility"]["CoolDownTimer"];
+ currentAbilityCD = currentAbilityCD >= 0.0 ? currentAbilityCD : 0.0;
+ std::string t = (std::string&)cooldownTextEntity["Text"]["Content"] = std::to_string(currentAbilityCD).substr(0, 3);
+ if(entity.HasComponent("Fill")) {
+ entity["Fill"]["Percentage"] = currentAbilityCD/maxAbilityCD; //TODO: current time needs to be in the component.
+ }
+ }
+ }
+ }
+}
diff --git a/src/Game/Systems/BoostIconsHUDSystem.cpp b/src/Game/Systems/BoostIconsHUDSystem.cpp
new file mode 100644
index 00000000..f83278ff
--- /dev/null
+++ b/src/Game/Systems/BoostIconsHUDSystem.cpp
@@ -0,0 +1,42 @@
+#include "Game/Systems/BoostIconsHUDSystem.h"
+
+void BoostIconsHUDSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt)
+{
+ EntityWrapper assaultEntity = entity.FirstChildByName("Assault");
+ EntityWrapper defenderEntity = entity.FirstChildByName("Defender");
+ EntityWrapper sniperEntity = entity.FirstChildByName("Sniper");
+
+ if(assaultEntity.Valid()) {
+ if (assaultEntity.HasComponent("Fill")) {
+ EntityWrapper parentWithAssaultBoost = assaultEntity.FirstParentWithComponent("BoostAssault");
+ if (parentWithAssaultBoost.Valid()) {
+ (double&)assaultEntity["Fill"]["Percentage"] = 1.0;
+ } else {
+ (double&)assaultEntity["Fill"]["Percentage"] = 0.0;
+ }
+ }
+ }
+
+ if (defenderEntity.Valid()) {
+ if (defenderEntity.HasComponent("Fill")) {
+ EntityWrapper parentWithAssaultBoost = defenderEntity.FirstParentWithComponent("BoostDefender");
+ if (parentWithAssaultBoost.Valid()) {
+ (double&)defenderEntity["Fill"]["Percentage"] = 1.0;
+ } else {
+ (double&)defenderEntity["Fill"]["Percentage"] = 0.0;
+ }
+ }
+ }
+
+ if (sniperEntity.Valid()) {
+ if (sniperEntity.HasComponent("Fill")) {
+ EntityWrapper parentWithAssaultBoost = sniperEntity.FirstParentWithComponent("BoostSniper");
+ if (parentWithAssaultBoost.Valid()) {
+ (double&)sniperEntity["Fill"]["Percentage"] = 1.0;
+ } else {
+ (double&)sniperEntity["Fill"]["Percentage"] = 0.0;
+ }
+ }
+ }
+}
+