From bc759b6ad9ee74a0c382033d4b7688f76f72ddc3 Mon Sep 17 00:00:00 2001 From: Samuel Date: Wed, 12 Aug 2015 21:22:05 -0400 Subject: [PATCH] - Improved Squad class - Updated ZombieUnit and VampireUnit now hinerits from squad --- Assets/Scripts/Squad.cs | 225 ++++++++++++++++++++++++++++++---- Assets/Scripts/Unit.cs | 4 +- Assets/Scripts/VampireUnit.cs | 2 +- Assets/Scripts/ZombieUnit.cs | 4 +- 4 files changed, 204 insertions(+), 31 deletions(-) diff --git a/Assets/Scripts/Squad.cs b/Assets/Scripts/Squad.cs index 6af56a3..f98fb63 100644 --- a/Assets/Scripts/Squad.cs +++ b/Assets/Scripts/Squad.cs @@ -1,53 +1,117 @@ -using UnityEngine; +using System; +using UnityEngine; using System.Collections; using System.Collections.Generic; -public class Squad : Unit +using System.Linq; + +public class Squad : Unit { + #region class members + /// /// List of non attackable units. /// private List humans; + /// /// List of attackable units. /// private List soldiers; - // Use this for initialization - void Start () + /// + /// List of abandonned units. (this list is accessible for both teams) + /// + private List abandonnedUnits; + + /// + /// Index of the first soldier in the list. + /// + private int targetSoldierIndex; + + /// + /// The tag to assign for each soldiers in the squad + /// + public String squadTag; + + #endregion + + // Use this for initialization + void Start () { + InitializeSquadTag(); humans = new List(); soldiers = new List(); - } - - // Update is called once per frame - void Update () + } + + // Update is called once per frame + void Update () { - // TODO execute movement command + // TODO execute movement command // TODO Check if all the units are dead // if yes destroy - if (soldiers.Count == 0) - { - // then we destroy the squad + if (soldiers.Count == 0) + { + // first release all humans ... + AbandonUnits(humans.Count); + // then we destroy the squad DestroyUnit(); - } - } + } + } - void addHuman(Unit humanUnit) + #region squad related functions + /// + /// Assign the corresponding squad tag to each soldiers. + /// + private void InitializeSquadTag() + { + foreach (var soldier in soldiers) + { + soldier.Tag = squadTag; + } + } + + /// + /// Add the human unit in the humans unit list. + /// + /// the human unit to add in the human unit list + void AddHuman(Unit humanUnit) { humans.Add(humanUnit); } - void addSoldier(Unit soldierUnit) + /// + /// Add the human unit in the abandonned unit list. + /// + /// the soldier unit to add in the soldier unit list + void AddSoldier(Unit soldierUnit) { soldiers.Add(soldierUnit); } /// - /// Dispose of a human unit and heal all the soldiers with a percentage depending - /// of the number of remaining soldiers. + /// Add the human unit in the abandonned unit list. + /// + /// the human to add in the abandonned unit list + void AddAbandonnedHuman(Unit humanUnit) + { + abandonnedUnits.Add(humanUnit); + } + + /// + /// Remove the human unit from the abandonned unit list. + /// + /// the human unit to remove + void RemoveAbandonnedHuman(Unit humanUnit) + { + abandonnedUnits.Remove(humanUnit); + } + + /// + /// Dispose of a human unit and heal all the soldiers with a percentage depending + /// of the number of remaining soldiers. /// /// The human to dispose - void healSquad(Unit humanUnit ) + public void HealSquad(Unit humanUnit) { var percentageOfHpToHeal = ( humanUnit.Hp / soldiers.Count ); @@ -58,23 +122,38 @@ public class Squad : Unit } // dispose of the human unit - removeHuman(humanUnit); + RemoveHuman(humanUnit); } /// /// Abandon a specified amount of units. /// /// The number of units to abandon - void AbandonUnits(int nbUnits) + public void AbandonUnits(int nbUnits) { - humans.RemoveRange(0,nbUnits); + if (nbUnits <= humans.Count) + { + for (var i = 0; i < nbUnits; i++) + { + // retreive the human at the specified index + var humanUnit = humans.ElementAt(i); + // add the human to the abandonned Unit list + AddAbandonnedHuman(humanUnit); + // remove the human from the humandUnit that was added to the abandonned unit list + RemoveHuman(humanUnit); + } + } + else + { + Debug.LogError("Exceded the maximum numbers of units in the humans list!"); + } } /// /// Remove the selected soldier from the unit list. /// /// the corresponding soldier that we want to remove - void removeSoldier(Unit soldierUnit) + void RemoveSoldier(Unit soldierUnit) { soldiers.Remove(soldierUnit); } @@ -83,13 +162,107 @@ public class Squad : Unit /// Remove the selected human from the human list. /// /// the corresponding human that we want to remove - void removeHuman(Unit humanUnit) + void RemoveHuman(Unit humanUnit) { humans.Remove(humanUnit); } - void transformHuman() + /// + /// Transform the human to the corresponding type of the squad. + /// + /// the number of humans to transform + public void TransformHuman(int nbHumans) { - + if (nbHumans <= humans.Count) + { + for (var i = 0; i < nbHumans; i++) + { + // retreive the human at the specified index + var humanUnit = humans.ElementAt(i); + + // remove the human from the human list + RemoveHuman(humanUnit); + + // AddSoldier((VampireUnit) humanUnit) ) (VampireUnit or ZombieUnit) + if (squadTag.Equals(TagManager.VampirePlayer)) + { + // add the vampire to the soldier list + AddSoldier((VampireUnit) humanUnit); + } + else + { + // add the zombie to the soldier list + AddSoldier((ZombieUnit)humanUnit); + } + } + } + else + { + Debug.LogError("Exceded the maximum nb of humans in the humans list!"); + } + } + + public void ReceiveDamage(int amountOfDamage) + { + // apply the damage to the first soldier in the list + // update the soldier hp + // if the soldier hp reach zero + // the soldier is destroyed + // and then dead soldier is removed in the soldier list + var topSoldier = soldiers.ElementAt(0); + topSoldier.Hp -= amountOfDamage; + } + + void CaptureHuman(Unit unit) + { + AddHuman(unit); + Debug.Log("Entered in collision with: " + unit.Tag); + } + + void AttackEnemy(Unit targetedUnit) + { + //TODO improve this method add the total of squad damage or to compute the reduce of hp, etc... + // compute the amount of hp reduced to this unit + //unit.Hp -= Attack; // we remove some hp of the unit that was + var amountOfDamageToApply = ComputeAttackDamage(); + + var squad = targetedUnit as Squad; + + if (squad != null) + { + // cast the unit to a squad + var squadTargetedUnit = squad; + // apply the damage to the squad + squadTargetedUnit.ReceiveDamage(amountOfDamageToApply); + } + else + { + // TODO update the attack ennemy in Vampire Unit and Zombie Unit class + } + + Debug.Log("Attacked the ennemy : " + targetedUnit.Tag); + } + + int ComputeAttackDamage() + { + // TODO improve the damage algorithm depending of the number of units in the soldiers list. + return Attack; + } + + #endregion + + + #region squad accessors and mutators + + /// + /// Return the list of the abandonned units to the ennemy team + /// + /// + public List GetAbandonnedUnits() + { + return abandonnedUnits; + } + + #endregion } diff --git a/Assets/Scripts/Unit.cs b/Assets/Scripts/Unit.cs index c7ffcfd..818a59f 100644 --- a/Assets/Scripts/Unit.cs +++ b/Assets/Scripts/Unit.cs @@ -26,12 +26,12 @@ public class Unit : MonoBehaviour /// Add a command at the end of the list /// /// The command to add - protected void addCommand(Command c) + protected void AddCommand(Command c) { this.commandList.AddLast(c); } - protected void executeCommand() + protected void ExecuteCommand() { } diff --git a/Assets/Scripts/VampireUnit.cs b/Assets/Scripts/VampireUnit.cs index dcf5722..c63b9a9 100644 --- a/Assets/Scripts/VampireUnit.cs +++ b/Assets/Scripts/VampireUnit.cs @@ -4,7 +4,7 @@ using System.Collections; /// /// This class contains the information of the Vampire Units. /// -public class VampireUnit : Unit +public class VampireUnit : Squad { // Use this for initialization diff --git a/Assets/Scripts/ZombieUnit.cs b/Assets/Scripts/ZombieUnit.cs index 0cccd59..c54ea88 100644 --- a/Assets/Scripts/ZombieUnit.cs +++ b/Assets/Scripts/ZombieUnit.cs @@ -4,7 +4,7 @@ using System.Collections; /// /// This class contains the information of the Vampire Units. /// -public class ZombieUnit : Unit +public class ZombieUnit : Squad { // Use this for initialization @@ -41,7 +41,7 @@ public class ZombieUnit : Unit Debug.LogError("Please set a vampire Tag, check the Tag & layers in the inspector!\n" + ex); } - // set the tag of the gameObject to vampire + // set the tag of the gameObject to zombie if (this.gameObject.tag != Tag) { this.gameObject.tag = Tag;