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;