From 0e0a486c016df6d13531c490d8599df62d5bf6fb Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Tue, 8 Mar 2016 11:48:54 +0100 Subject: [PATCH 1/2] AmmoPickupSystem should now be able to give ammo to all classtypes --- include/Game/Systems/AmmoPickupSystem.h | 12 +++++ src/Game/Systems/AmmoPickupSystem.cpp | 69 +++++++++++++++++++++---- 2 files changed, 71 insertions(+), 10 deletions(-) diff --git a/include/Game/Systems/AmmoPickupSystem.h b/include/Game/Systems/AmmoPickupSystem.h index 70c5630f..d34427e3 100644 --- a/include/Game/Systems/AmmoPickupSystem.h +++ b/include/Game/Systems/AmmoPickupSystem.h @@ -40,5 +40,17 @@ private: }; std::vector m_PickupAtMaximum; void DoPickup(EntityWrapper &player, EntityWrapper &trigger); + //class + enum class PlayerClass { + Assault, + Defender, + Sniper, + None + }; + //helper methods + bool DoesPlayerHaveMaxAmmo(EntityWrapper &player); + PlayerClass DetermineClass(EntityWrapper &player); + int& GetPlayerAmmo(EntityWrapper &player); + int GetPlayerMaxAmmo(EntityWrapper &player); }; #endif diff --git a/src/Game/Systems/AmmoPickupSystem.cpp b/src/Game/Systems/AmmoPickupSystem.cpp index e28c38ff..21101b69 100644 --- a/src/Game/Systems/AmmoPickupSystem.cpp +++ b/src/Game/Systems/AmmoPickupSystem.cpp @@ -37,8 +37,7 @@ void AmmoPickupSystem::Update(double dt) //erase the current element (somePickup) it = m_ETriggerTouchVector.erase(it); - } - else { + } else { it++; } } @@ -48,7 +47,7 @@ void AmmoPickupSystem::Update(double dt) m_PickupAtMaximum.erase(it); break; } - if ((int)it->player["AssaultWeapon"]["Ammo"] < (int)it->player["AssaultWeapon"]["MaxAmmo"]) { + if (!DoesPlayerHaveMaxAmmo(it->player)) { DoPickup(it->player, it->trigger); m_PickupAtMaximum.erase(it); break; @@ -56,6 +55,56 @@ void AmmoPickupSystem::Update(double dt) } } } +bool AmmoPickupSystem::DoesPlayerHaveMaxAmmo(EntityWrapper &player) { + PlayerClass playerClass = DetermineClass(player); + if (playerClass == PlayerClass::Defender) { + return !((int)player["DefenderWeapon"]["Ammo"] < (int)player["DefenderWeapon"]["MaxAmmo"]); + } else if (playerClass == PlayerClass::Sniper) { + return !((int)player["SniperWeapon"]["Ammo"] < (int)player["SniperWeapon"]["MaxAmmo"]); + } else if (playerClass == PlayerClass::Assault) { + return !((int)player["AssaultWeapon"]["Ammo"] < (int)player["AssaultWeapon"]["MaxAmmo"]); + } else { + return false; + } +} +int& AmmoPickupSystem::GetPlayerAmmo(EntityWrapper &player) { + PlayerClass playerClass = DetermineClass(player); + if (playerClass == PlayerClass::Defender) { + return (int)player["DefenderWeapon"]["Ammo"]; + } else if (playerClass == PlayerClass::Sniper) { + return (int)player["SniperWeapon"]["Ammo"]; + } else if (playerClass == PlayerClass::Assault) { + return (int)player["AssaultWeapon"]["Ammo"]; + } else { + //TODO: should really return something here + } +} +int AmmoPickupSystem::GetPlayerMaxAmmo(EntityWrapper &player) { + PlayerClass playerClass = DetermineClass(player); + if (playerClass == PlayerClass::Defender) { + return (int)player["DefenderWeapon"]["MaxAmmo"]; + } else if (playerClass == PlayerClass::Sniper) { + return (int)player["SniperWeapon"]["MaxAmmo"]; + } else if (playerClass == PlayerClass::Assault) { + return (int)player["AssaultWeapon"]["MaxAmmo"]; + } else { + return -1; + } +} +AmmoPickupSystem::PlayerClass AmmoPickupSystem::DetermineClass(EntityWrapper &player) +{ + //determine the class based on what component the inflictor-player has + if (m_World->HasComponent(player.ID, "DashAbility")) { + return PlayerClass::Assault; + } + if (m_World->HasComponent(player.ID, "ShieldAbility")) { + return PlayerClass::Defender; + } + if (m_World->HasComponent(player.ID, "SprintAbility")) { + return PlayerClass::Sniper; + } + return PlayerClass::None; +} bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e) { @@ -63,7 +112,7 @@ bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e) return false; } //TODO: add other weapontypes - if (!e.Entity.HasComponent("AssaultWeapon")) { + if (DetermineClass(e.Entity) == PlayerClass::None) { return false; } if (!e.Trigger.HasComponent("AmmoPickup")) { @@ -71,7 +120,7 @@ bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e) } //if at maxammo, save the trigger-touch to a vector since standing inside it will not re-trigger the trigger - if ((int)e.Entity["AssaultWeapon"]["Ammo"] >= (int)e.Entity["AssaultWeapon"]["MaxAmmo"]) { + if (DoesPlayerHaveMaxAmmo(e.Entity)) { m_PickupAtMaximum.push_back({ e.Entity, e.Trigger }); return false; } @@ -85,15 +134,15 @@ bool AmmoPickupSystem::OnAmmoPickup(Events::AmmoPickup & e) return false; } //TODO: add other weapontypes - if (!e.Player.HasComponent("AssaultWeapon")) { + if (DetermineClass(e.Player) == PlayerClass::None) { return false; } - int maxWeaponAmmo = (int)e.Player["AssaultWeapon"]["MaxAmmo"]; - int& currentAmmo = (int)e.Player["AssaultWeapon"]["Ammo"]; //cant pick up ammopacks if you are already at MaxAmmo - if (currentAmmo >= maxWeaponAmmo) { + if (DoesPlayerHaveMaxAmmo(e.Player)) { return false; } + int maxWeaponAmmo = GetPlayerMaxAmmo(e.Player); + int& currentAmmo = GetPlayerAmmo(e.Player); currentAmmo = std::min(currentAmmo + e.AmmoGain, maxWeaponAmmo); @@ -119,7 +168,7 @@ void AmmoPickupSystem::DoPickup(EntityWrapper &player, EntityWrapper &trigger) { if (!trigger.Valid()) { return; } - int maxWeaponAmmo = (int)player["AssaultWeapon"]["MaxAmmo"]; + int maxWeaponAmmo = GetPlayerMaxAmmo(player); int ammoGiven = 0.01*(double)trigger["AmmoPickup"]["AmmoGain"] * maxWeaponAmmo; Events::AmmoPickup ePlayerAmmoPickup; From 52d3cb3ebf3e09d0fa70be0e5b9d8b8a8d7c9233 Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Tue, 8 Mar 2016 16:33:08 +0100 Subject: [PATCH 2/2] GetPlayerAmmo is now a SetPlayerAmmo instead to fix some potential problems if the player has no weapon at all --- include/Game/Systems/AmmoPickupSystem.h | 2 +- src/Game/Systems/AmmoPickupSystem.cpp | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/include/Game/Systems/AmmoPickupSystem.h b/include/Game/Systems/AmmoPickupSystem.h index d34427e3..1e61dd32 100644 --- a/include/Game/Systems/AmmoPickupSystem.h +++ b/include/Game/Systems/AmmoPickupSystem.h @@ -50,7 +50,7 @@ private: //helper methods bool DoesPlayerHaveMaxAmmo(EntityWrapper &player); PlayerClass DetermineClass(EntityWrapper &player); - int& GetPlayerAmmo(EntityWrapper &player); + void SetPlayerAmmo(EntityWrapper &player, int ammoGain); int GetPlayerMaxAmmo(EntityWrapper &player); }; #endif diff --git a/src/Game/Systems/AmmoPickupSystem.cpp b/src/Game/Systems/AmmoPickupSystem.cpp index 21101b69..ea4561c6 100644 --- a/src/Game/Systems/AmmoPickupSystem.cpp +++ b/src/Game/Systems/AmmoPickupSystem.cpp @@ -67,16 +67,18 @@ bool AmmoPickupSystem::DoesPlayerHaveMaxAmmo(EntityWrapper &player) { return false; } } -int& AmmoPickupSystem::GetPlayerAmmo(EntityWrapper &player) { +void AmmoPickupSystem::SetPlayerAmmo(EntityWrapper &player, int ammoGain) { + int maxWeaponAmmo = GetPlayerMaxAmmo(player); + PlayerClass playerClass = DetermineClass(player); if (playerClass == PlayerClass::Defender) { - return (int)player["DefenderWeapon"]["Ammo"]; + (int&)player["DefenderWeapon"]["Ammo"] = std::min((int)player["DefenderWeapon"]["Ammo"] + ammoGain, maxWeaponAmmo); } else if (playerClass == PlayerClass::Sniper) { - return (int)player["SniperWeapon"]["Ammo"]; + (int&)player["SniperWeapon"]["Ammo"] = std::min((int)player["SniperWeapon"]["Ammo"] + ammoGain, maxWeaponAmmo); } else if (playerClass == PlayerClass::Assault) { - return (int)player["AssaultWeapon"]["Ammo"]; + (int&)player["AssaultWeapon"]["Ammo"] = std::min((int)player["AssaultWeapon"]["Ammo"] + ammoGain, maxWeaponAmmo); } else { - //TODO: should really return something here + //unknown class - ignore } } int AmmoPickupSystem::GetPlayerMaxAmmo(EntityWrapper &player) { @@ -141,12 +143,9 @@ bool AmmoPickupSystem::OnAmmoPickup(Events::AmmoPickup & e) if (DoesPlayerHaveMaxAmmo(e.Player)) { return false; } - int maxWeaponAmmo = GetPlayerMaxAmmo(e.Player); - int& currentAmmo = GetPlayerAmmo(e.Player); + SetPlayerAmmo(e.Player, e.AmmoGain); - currentAmmo = std::min(currentAmmo + e.AmmoGain, maxWeaponAmmo); - - return false; + return true; } bool AmmoPickupSystem::OnTriggerLeave(Events::TriggerLeave& e) {