public void CheckMeleeAttackStatus(Friendly friendlyActor)
        {
            // If I'm colliding with my target
            if (friendlyActor.Sprite.SpriteFrame.Intersects(friendlyActor.TargetQueue.PeekFirst().Sprite.SpriteFrame) &&
                 friendlyActor.FriendlyAggroMode != FriendlyAggroMode.IDLING)
            {
                // I should start attacking
                UpdateUnitSpeed(friendlyActor);
                friendlyActor.FriendlyAggroMode = FriendlyAggroMode.ATTACKING;
            }
            // But if I'm NOT colliding with my target
            else if (!friendlyActor.Sprite.SpriteFrame.Intersects(friendlyActor.TargetQueue.PeekFirst().Sprite.SpriteFrame))
            {
                // I should be moving :)
                friendlyActor.FriendlyAggroMode = FriendlyAggroMode.MOVING;
                UpdateUnitSpeed(friendlyActor);
                MoveTowardsTargetCoordinate(friendlyActor);

            }
        }
        public void ScanGlobalList(Friendly friendlyActor)
        {
            GameObject.mPotentialTargetListList.Reset();

            // Check the global list to see if another object's sprite frame intersects our FOV.
            // If so
            // InsertTargetIntoQueue

            for (int i = 0; i < GameObject.mPotentialTargetListList.GetCount(); i++)
            {
                currentTarget = GameObject.mPotentialTargetListList.GetCurrent().gameObject;

                // If my field of view intersects another object's frame.
                // And if the other object is not an friendlyActor.
                // And if the other object is not a castle.
                // And if the other object is not a structure.
                if (friendlyActor.FieldOfView.Intersects(currentTarget.Sprite.SpriteFrame)
                    && currentTarget.Hostility != Hostility.FRIENDLY
                    && currentTarget.Hostility != Hostility.CASTLE
                    && currentTarget.Hostility != Hostility.STRUCTURE)
                {
                    // Reset current node back to first node.
                    friendlyActor.TargetQueue.mTargetList.Reset();

                    // Check to make sure he is not already in my queue.
                    isInQueue = false;
                    for (int j = 0; j < friendlyActor.TargetQueue.mTargetList.GetCount(); j++)
                    {
                        if (currentTarget.ObjectID == friendlyActor.TargetQueue.mTargetList.GetCurrent().gameObject.ObjectID)
                        {
                            isInQueue = true;

                        }
                        // Go to next node in Queue
                        friendlyActor.TargetQueue.mTargetList.NextNode();
                    }
                    if (!isInQueue)
                    {
                        InsertTargetIntoQueue(friendlyActor);
                    }

                }

                GameObject.mPotentialTargetListList.NextNode();

            }
        }
        public static void PrintUpgradeUnitAttributes(ref float textScale, ref TextBoxString gameObjectAttribute,
												ref List<TextBoxString> gameObjectAttributeList, ref string gameObjectAttributeString)
        {
            //TODO: unit name, HP, armor, damage

            switch (tempStructure.UnitType)
            {
                case ObjectType.DRAGON:
                    tempFriendly = GameController.FriendlyPool[7];
                    break;

                case ObjectType.NECROMANCER:
                    tempFriendly = GameController.FriendlyPool[5];
                    break;

                case ObjectType.ARCANE_MAGE:
                    tempFriendly = GameController.FriendlyPool[2];
                    break;

                case ObjectType.FIRE_MAGE:
                    tempFriendly = GameController.FriendlyPool[6];
                    break;

                case ObjectType.AXE_THROWER:
                    tempFriendly = GameController.FriendlyPool[3];
                    break;

                case ObjectType.BERSERKER:
                    tempFriendly = GameController.FriendlyPool[1];
                    break;

                case ObjectType.WOLF:
                    tempFriendly = GameController.FriendlyPool[0];
                    break;

                case ObjectType.CLERIC:
                    tempFriendly = GameController.FriendlyPool[4];
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
            }

            // Print Upgrade Stats
            gameObjectAttributeString = "Unit Type: " + tempStructure.UnitType + "\nHealth Points: " + tempFriendly.FriendlyAttribute.MaxHealthPoints +
                                        "\nArmor: " + tempFriendly.FriendlyAttribute.CurrentArmor + "\nDamge: "
                                       + tempFriendly.FriendlyAttribute.CurrentMinimumDamage + " - " + tempFriendly.FriendlyAttribute.CurrentMaximumDamage;
            WriteLine(ref gameObjectAttribute, textScale, gameObjectAttributeString, gameObjectAttributeList);

            gameObjectAttributeString = " ";
        }
        private void PlayProjectileAudio(Friendly friendlyActor)
        {
            switch (friendlyActor.CreatureType)
            {

                case ObjectType.NECROMANCER:

                    PlayNecromancerProjectileSound();
                    break;
                case ObjectType.ARCANE_MAGE:
                    PlayArcaneMageProjectileSound();
                    break;
                case ObjectType.FIRE_MAGE:
                    PlayFireMageProjectileSound();
                    break;
                case ObjectType.AXE_THROWER:
                    PlayAxeThrowerProjectileSound();
                    break;

                default:
                    break;
            }
        }
        public void InitializeFriendlyPool(ref Friendly[] FriendlyPool)
        {
            FriendlyPool = new Friendly[8];

            FriendlyPool[0] = new Friendly(ObjectType.WOLF, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);

            FriendlyPool[1] = new Friendly(ObjectType.BERSERKER, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);

            FriendlyPool[2] = new Friendly(ObjectType.ARCANE_MAGE, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);

            FriendlyPool[3] = new Friendly(ObjectType.AXE_THROWER, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);

            FriendlyPool[4] = new Friendly(ObjectType.CLERIC, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);

            FriendlyPool[5] = new Friendly(ObjectType.NECROMANCER, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);

            FriendlyPool[6] = new Friendly(ObjectType.FIRE_MAGE, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);

            FriendlyPool[7] = new Friendly(ObjectType.DRAGON, content, SpriteState.MOVE_LEFT,
                Vector2.Zero, Vector2.Zero, 1, 1);
        }
        private void HandleHealingUnitBehavior(Friendly friendlyActor)
        {
            TimeStamp += friendlyActor.gameTime.ElapsedGameTime.Milliseconds;

            UpdateUnitSpeed(friendlyActor);

            // Always Move To CurrentTarget Unless I'm attacking
            if (!isAttacking)
            {
                friendlyActor.FriendlyAttribute.UnitSpeed = 2.0f;

                MoveTowardsTargetCoordinate(friendlyActor);
            }
            StopWhenAtTargetCoordinate(friendlyActor);

            HealTimer += friendlyActor.gameTime.ElapsedGameTime.Milliseconds;

            if (HealTimer >= friendlyActor.FriendlyAttribute.AttackSpeed)
            {
                // Time to play heal animation
                AnimationTimer += friendlyActor.gameTime.ElapsedGameTime.Milliseconds;
                if (AnimationTimer <= GetAnimationLength(friendlyActor))
                {
                    PlayAttackAnimation(friendlyActor);
                }
                else
                {
                    PlayClericAnimationSound();
                    friendlyActor.FriendlyAttribute.Heal();
                    HealTimer = 0;
                    AnimationTimer = 0;
                }

            }
        }
        // Play the death animation after our HP has dropped below 0.
        private void BeginDying(Friendly friendlyActor)
        {
            switch (friendlyActor.CreatureType)
            {

                case ObjectType.DRAGON:
                    if (mDeathAnimationTimer <= friendlyActor.DragonDeathAnimationFrames * friendlyActor.DragonDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT
                        || friendlyActor.SpriteState == SpriteState.IDLE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;

                    }

                    else if (mDeathAnimationTimer <= friendlyActor.DragonDeathAnimationFrames * friendlyActor.DragonDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT
                        || friendlyActor.SpriteState == SpriteState.IDLE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.DragonDeathAnimationFrames * friendlyActor.DragonDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;
                case ObjectType.NECROMANCER:

                    if (mDeathAnimationTimer <= friendlyActor.NecromancerDeathAnimationFrames * friendlyActor.NecromancerDeathAnimationInterval
            && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT
            || friendlyActor.SpriteState == SpriteState.IDLE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;
                    }

                    else if (mDeathAnimationTimer <= friendlyActor.NecromancerDeathAnimationFrames * friendlyActor.NecromancerDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT
                        || friendlyActor.SpriteState == SpriteState.IDLE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.NecromancerDeathAnimationFrames * friendlyActor.NecromancerDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;
                case ObjectType.ARCANE_MAGE:
                    if (mDeathAnimationTimer <= friendlyActor.ArcaneMageDeathAnimationFrames * friendlyActor.ArcaneMageDeathAnimationInterval
            && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT
            || friendlyActor.SpriteState == SpriteState.IDLE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;
                    }

                    else if (mDeathAnimationTimer <= friendlyActor.ArcaneMageDeathAnimationFrames * friendlyActor.ArcaneMageDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT
                        || friendlyActor.SpriteState == SpriteState.IDLE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.ArcaneMageDeathAnimationFrames * friendlyActor.ArcaneMageDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;
                case ObjectType.FIRE_MAGE:

                    if (mDeathAnimationTimer <= friendlyActor.FireMageDeathAnimationFrames * friendlyActor.FireMageDeathAnimationInterval
            && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT
            || friendlyActor.SpriteState == SpriteState.IDLE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;
                    }

                    else if (mDeathAnimationTimer <= friendlyActor.FireMageDeathAnimationFrames * friendlyActor.FireMageDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT
                        || friendlyActor.SpriteState == SpriteState.IDLE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.FireMageDeathAnimationFrames * friendlyActor.FireMageDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;
                case ObjectType.WOLF:

                    if (mDeathAnimationTimer <= friendlyActor.WolfDeathAnimationFrames * friendlyActor.WolfDeathAnimationInterval
            && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT
            || friendlyActor.SpriteState == SpriteState.IDLE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;
                    }

                    else if (mDeathAnimationTimer <= friendlyActor.WolfDeathAnimationFrames * friendlyActor.WolfDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT
                        || friendlyActor.SpriteState == SpriteState.IDLE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.WolfDeathAnimationFrames * friendlyActor.WolfDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;
                case ObjectType.AXE_THROWER:
                    if (mDeathAnimationTimer <= friendlyActor.AxeThrowerDeathAnimationFrames * friendlyActor.AxeThrowerDeathAnimationInterval
                         && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT ||
                         friendlyActor.SpriteState == SpriteState.IDLE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;
                    }

                    else if (mDeathAnimationTimer <= friendlyActor.AxeThrowerDeathAnimationFrames * friendlyActor.AxeThrowerDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT
                         || friendlyActor.SpriteState == SpriteState.IDLE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.AxeThrowerDeathAnimationFrames * friendlyActor.AxeThrowerDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;
                case ObjectType.BERSERKER:
                    if (mDeathAnimationTimer <= friendlyActor.BerserkerDeathAnimationFrames * friendlyActor.BerserkerDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT
                        || friendlyActor.SpriteState == SpriteState.IDLE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;
                    }

                    else if (mDeathAnimationTimer <= friendlyActor.BerserkerDeathAnimationFrames * friendlyActor.BerserkerDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT
                        || friendlyActor.SpriteState == SpriteState.IDLE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.BerserkerDeathAnimationFrames * friendlyActor.BerserkerDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;
                case ObjectType.CLERIC:
                    if (mDeathAnimationTimer <= friendlyActor.ClericDeathAnimationFrames * friendlyActor.ClericDeathAnimationInterval
            && (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT || friendlyActor.SpriteState == SpriteState.MOVE_LEFT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_LEFT;
                    }

                    else if (mDeathAnimationTimer <= friendlyActor.ClericDeathAnimationFrames * friendlyActor.ClericDeathAnimationInterval
                        && (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT || friendlyActor.SpriteState == SpriteState.MOVE_RIGHT))
                    {
                        friendlyActor.SpriteState = SpriteState.DEATH_RIGHT;
                    }
                    else if (mDeathAnimationTimer >= friendlyActor.ClericDeathAnimationFrames * friendlyActor.ClericDeathAnimationInterval)
                    {
                        friendlyActor.HasDied = true;
                    }

                    break;

                default:
                    break;
            }
        }
        public void Update(Friendly friendlyActor, GameTime gameTime)
        {
            this.gameTime = gameTime;

            CheckVitalSigns(friendlyActor);

            if (!isDying)
            {

                // Hmmm.. What type of attacks do I have again?
                if (friendlyActor.CombatType == CombatType.MELEE)
                {
                    HandleMeleeUnitBehavior(friendlyActor);
                }
                else if (friendlyActor.CombatType == CombatType.RANGED)
                {
                    HandleRangedUnitBehavior(friendlyActor);
                }
                else if (friendlyActor.CombatType == CombatType.HEALER)
                {
                    HandleHealingUnitBehavior(friendlyActor);
                }

                targetDirection = friendlyActor.CurrentTarget - friendlyActor.Sprite.WorldPosition;
                targetDirection.Normalize();

                friendlyActor.Direction = friendlyActor.Direction + targetDirection * this.weight;

                if (friendlyActor.CreatureType != ObjectType.CLERIC)
                {
                    ScanGlobalList(friendlyActor);

                    // Check if current target is in our field of view still
                    MaintainTarget(friendlyActor);
                }
            }
        }
        // Will play Idle Animation for duration of animation
        public void PlayAttackAnimation(Friendly friendlyActor)
        {
            switch (friendlyActor.CreatureType)
            {

                case ObjectType.DRAGON:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;
                case ObjectType.NECROMANCER:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;
                case ObjectType.ARCANE_MAGE:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;
                case ObjectType.FIRE_MAGE:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;
                case ObjectType.WOLF:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;
                case ObjectType.AXE_THROWER:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;
                case ObjectType.BERSERKER:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;
                case ObjectType.CLERIC:
                    if (friendlyActor.SpriteState == SpriteState.IDLE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.IDLE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_LEFT;
                    }
                    else if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
                    {
                        friendlyActor.SpriteState = SpriteState.ATTACK_RIGHT;
                    }
                    PlayUnitAnimationAudio(friendlyActor);
                    break;

                default:
                    break;
            }
        }
        // Decides if we are moving left or right based on time stamps taken at different frames of reference.
        public void MoveTowardsTargetCoordinate(Friendly friendlyActor)
        {
            if (TimeStamp < 100.0f)
            {

                InitialPosition = friendlyActor.Sprite.WorldPosition.X;
            }

            if (TimeStamp >= 200.0f)
            {

                FinalPosition = friendlyActor.Sprite.WorldPosition.X;
                DeltaX = FinalPosition - InitialPosition;

                TimeStamp = 0.0f;
                if (DeltaX > 0)
                {
                    friendlyActor.SpriteState = SpriteState.MOVE_RIGHT;

                }
                if (DeltaX <= 0)
                {
                    friendlyActor.SpriteState = SpriteState.MOVE_LEFT;

                }
            }
        }
 public void MaintainTarget(Friendly friendlyActor)
 {
     // If my target queue is not empty.
     // And my FOV is no longer intersecting my first target's sprite frame.
     if (!(friendlyActor.TargetQueue.IsEmpty()) &&
         !(friendlyActor.FieldOfView.Intersects(friendlyActor.TargetQueue.PeekFirst().Sprite.SpriteFrame)))
     {
         friendlyActor.TargetQueue.PopTarget();
     }
 }
        public void InsertTargetIntoQueue(Friendly friendlyActor)
        {
            // current object = THIS object.
            // hostile object = object that ran into my field of view.

            // If my target queue is empty
            if (friendlyActor.TargetQueue.IsEmpty())
            {
                //Push onto queue.
                friendlyActor.TargetQueue.InsertTarget(currentTarget);
            }

                    // If the hostile object is a creature.
            else if (currentTarget.Hostility == Hostility.ENEMY)
            {

                // Reset the current object's target queue's current node to = first node.
                friendlyActor.TargetQueue.mTargetList.Reset();

                // Iterate through the current object's target queue to determine where to put the new target.
                for (int i = 0; i < friendlyActor.TargetQueue.mTargetList.GetCount(); i++)
                {

                    // If first target is a senemy
                    if (friendlyActor.TargetQueue.mTargetList.GetCurrent().gameObject.Hostility ==
                        Hostility.ENEMY)
                    {
                        // Push creatue to front of the line.
                        friendlyActor.TargetQueue.mTargetList.InsertLast(currentTarget);
                        // We placed the target and now we're done.
                        break;
                    }

                    friendlyActor.TargetQueue.mTargetList.NextNode();
                }
            }
        }
        public void HandleRangedUnitBehavior(Friendly friendlyActor)
        {
            TimeStamp += friendlyActor.gameTime.ElapsedGameTime.Milliseconds;

            UpdateUnitSpeed(friendlyActor);

            // Always Move To CurrentTarget Unless I'm attacking
            if (!isAttacking)
            {
                friendlyActor.FriendlyAttribute.UnitSpeed = 2.0f;

                MoveTowardsTargetCoordinate(friendlyActor);
            }
            StopWhenAtTargetCoordinate(friendlyActor);

            // If I have a list of targets. And I am Ranged
            if (!friendlyActor.TargetQueue.IsEmpty() && friendlyActor.CombatType == CombatType.RANGED)
            {
                // Check if I made it to my target's sprite frame.
                CheckRangedAttackStatus(friendlyActor);

                if (friendlyActor.FriendlyAggroMode == FriendlyAggroMode.ATTACKING)
                {
                    //I'm sitting at my enemy's feet. I'm committed, lock me into attack mode.
                    isAttacking = true;
                    AnimationTimer += friendlyActor.gameTime.ElapsedGameTime.Milliseconds;

                    // If I'm attacking then I should play my Attack animation from start to finish.
                    if (AnimationTimer <= GetAnimationLength(friendlyActor))
                    {
                        PlayAttackAnimation(friendlyActor);

                        Console.WriteLine("Now I'm playing attacking Animation");
                    }
                    else
                    {
                        // Then I should apply my damage to the current target
                        Console.WriteLine("Applying Damage");
                        PlayUnitAttackLandedAudio(friendlyActor);
                        friendlyActor.FriendlyAttribute.Attack();
                        friendlyActor.FriendlyAggroMode = FriendlyAggroMode.IDLING;
                        WaitTimer = 0;
                    }
                }
                // Now I'm done playing my animation for attack. Now play idle while I cool off
                else if (friendlyActor.FriendlyAggroMode == FriendlyAggroMode.IDLING && WaitTimer <= friendlyActor.FriendlyAttribute.AttackSpeed)
                {
                    WaitTimer += friendlyActor.gameTime.ElapsedGameTime.Milliseconds;
                    PlayIdleAnimationFromAttacking(friendlyActor);
                }
                // After I wait I should play my attack animation again
                else if (WaitTimer >= friendlyActor.FriendlyAttribute.AttackSpeed)
                {
                    AnimationTimer = 0;
                    friendlyActor.FriendlyAggroMode = FriendlyAggroMode.ATTACKING;
                }
            }
            else
            {
                //If we are done slaughtering our foes.
                friendlyActor.FriendlyAggroMode = FriendlyAggroMode.MOVING;
                isAttacking = false;
                UpdateUnitSpeed(friendlyActor);
                StopWhenAtTargetCoordinate(friendlyActor);
            }
        }
        //Gets how long my attack animation lasts
        public float GetAnimationLength(Friendly friendlyActor)
        {
            switch (friendlyActor.CreatureType)
            {

                case ObjectType.DRAGON:
                    PlayDragonAnimationSound();
                    return friendlyActor.DragonAttackAnimationFrames * friendlyActor.DragonAttackAnimationInterval;
                    break;
                case ObjectType.NECROMANCER:
                    return friendlyActor.NecromancerAttackAnimationFrames * friendlyActor.NecromancerAttackAnimationInterval;
                    break;
                case ObjectType.ARCANE_MAGE:
                    return friendlyActor.ArcaneMageAttackAnimationFrames * friendlyActor.ArcaneMageAttackAnimationInterval;
                    break;
                case ObjectType.FIRE_MAGE:
                    return friendlyActor.FireMageAttackAnimationFrames * friendlyActor.FireMageAttackAnimationInterval;
                    break;
                case ObjectType.WOLF:
                    return friendlyActor.WolfAttackAnimationFrames * friendlyActor.WolfAttackAnimationInterval;
                    break;
                case ObjectType.AXE_THROWER:
                    return friendlyActor.AxeThrowerAttackAnimationFrames * friendlyActor.AxeThrowerAttackAnimationInterval;
                    break;
                case ObjectType.BERSERKER:
                    return friendlyActor.BerserkerAttackAnimationFrames * friendlyActor.BerserkerAttackAnimationInterval;
                    break;

                case ObjectType.CLERIC:
                    return friendlyActor.ClericAttackAnimationFrames * friendlyActor.ClericAttackAnimationInterval;
                    break;

                default:
                    return 0.0f;
                    break;
            }
        }
        // WIll play the idle animation if we were attacking before
        public void PlayIdleAnimationFromAttacking(Friendly friendlyActor)
        {
            if (friendlyActor.SpriteState == SpriteState.ATTACK_LEFT)
            {
                friendlyActor.SpriteState = SpriteState.IDLE_LEFT;
            }

            if (friendlyActor.SpriteState == SpriteState.ATTACK_RIGHT)
            {
                friendlyActor.SpriteState = SpriteState.IDLE_RIGHT;
            }
        }
 // Will cause the unit to stop moving when target location is reached.
 public void StopWhenAtTargetCoordinate(Friendly friendlyActor)
 {
     if ((friendlyActor.Sprite.WorldPosition.X >= friendlyActor.CurrentTarget.X - 30 &&
              friendlyActor.Sprite.WorldPosition.Y >= friendlyActor.CurrentTarget.Y - 30) &&
              (friendlyActor.Sprite.WorldPosition.X <= friendlyActor.CurrentTarget.X + 30 &&
              friendlyActor.Sprite.WorldPosition.Y <= friendlyActor.CurrentTarget.Y + 30))
     {
         friendlyActor.FriendlyAttribute.UnitSpeed = 0.0f;
         PlayIdleAnimationFromMotion(friendlyActor);
     }
 }
        // Will play idle animation if we were moving prior to calling
        public void PlayIdleAnimationFromMotion(Friendly friendlyActor)
        {
            if (friendlyActor.SpriteState == SpriteState.MOVE_LEFT)
            {
                friendlyActor.SpriteState = SpriteState.IDLE_LEFT;
            }

            if (friendlyActor.SpriteState == SpriteState.MOVE_RIGHT)
            {
                friendlyActor.SpriteState = SpriteState.IDLE_RIGHT;
            }
        }
 public void UpdateUnitSpeed(Friendly friendlyActor)
 {
     switch (friendlyActor.FriendlyAggroMode)
     {
         case FriendlyAggroMode.ATTACKING:
             friendlyActor.FriendlyAttribute.UnitSpeed = 0.0f;
             break;
         case FriendlyAggroMode.IDLING:
             friendlyActor.FriendlyAttribute.UnitSpeed = 0.0f;
             break;
         case FriendlyAggroMode.MOVING:
             friendlyActor.FriendlyAttribute.UnitSpeed = 2.0f;
             break;
         default:
             throw new ArgumentOutOfRangeException();
     }
 }
        public void PlayUnitAnimationAudio(Friendly friendlyActor)
        {
            // Decide what type of unit I am.
            // Pick a random number and use that to select which sound effect I make this time.

            switch (friendlyActor.CreatureType)
            {

                case ObjectType.DRAGON:
                    PlayDragonAnimationSound();
                    break;
                case ObjectType.NECROMANCER:

                    break;
                case ObjectType.ARCANE_MAGE:
                    PlayArcaneMageAnimationSound();
                    break;
                case ObjectType.FIRE_MAGE:
                    PlayFireMageAnimationSound();
                    break;
                case ObjectType.WOLF:
                    PlayWolfAnimationSound();
                    break;
                case ObjectType.AXE_THROWER:
                    PlayAxeThrowerAnimationSound();

                    break;
                case ObjectType.BERSERKER:
                    PlayBerserkerAnimationSound();
                    break;

                case ObjectType.CLERIC:

                    break;

                default:
                    break;
            }
        }
 private void CheckVitalSigns(Friendly friendlyActor)
 {
     if (0 >= friendlyActor.FriendlyAttribute.CurrentHealthPoints)
     {
         mDeathAnimationTimer += friendlyActor.gameTime.ElapsedGameTime.Milliseconds;
         PlayUnitDeathAudio(friendlyActor);
         isDying = true;
         BeginDying(friendlyActor);
     }
     else
     {
         isDying = false;
     }
 }
        public void PlayUnitAttackLandedAudio(Friendly friendlyActor)
        {
            // Decide what type of unit I am.
            // Pick a random number and use that to select which sound effect I make this time.

            switch (friendlyActor.CreatureType)
            {
                case ObjectType.WOLF:
                    PlayWolfAttackLandedSound();
                    break;

                case ObjectType.BERSERKER:
                    PlayBerserkerAttackLandedSound();
                    break;

                default:
                    break;
            }
        }
        public void PlayUnitStruckAudio(Friendly friendlyActor)
        {
            //TODO: place holder
            switch (friendlyActor.CreatureType)
            {

                case ObjectType.DRAGON:
                    PlayDragonStruckSound();
                    break;
                case ObjectType.NECROMANCER:
                    PlayNecromancerStruckSound();
                    break;
                case ObjectType.ARCANE_MAGE:
                    PlayArcaneMageStruckSound();
                    break;
                case ObjectType.FIRE_MAGE:
                    PlayFireMageStruckSound();
                    break;
                case ObjectType.WOLF:
                    PlayWolfStruckSound();
                    break;
                case ObjectType.AXE_THROWER:
                    PlayAxeThrowerStruckSound();
                    break;
                case ObjectType.BERSERKER:
                    PlayBerserkerStruckSound();
                    break;

                case ObjectType.CLERIC:
                    PlayClericStruckSound();
                    break;

                default:
                    break;
            }
        }
        public void PlayUnitDeathAudio(Friendly friendlyActor)
        {
            switch (friendlyActor.CreatureType)
            {

                case ObjectType.DRAGON:
                    PlayDragonDeathSounds();
                    break;

                case ObjectType.NECROMANCER:
                    PlayNecromancerDeathSounds();
                    break;

                case ObjectType.ARCANE_MAGE:
                    PlayArcaneMageDeathSounds();
                    break;

                case ObjectType.FIRE_MAGE:
                    PlayFireMageDeathSounds();
                    break;

                case ObjectType.WOLF:
                    PlayWolfDeathSounds();
                    break;

                case ObjectType.AXE_THROWER:
                    PlayAxeThrowerDeathSounds();
                    break;

                case ObjectType.BERSERKER:
                    PlayBerserkerDeathSounds();
                    break;

                case ObjectType.CLERIC:
                    PlayClericDeathSound();
                    break;

                default:
                    break;
            }
        }
        public void SpawnFriendly(int i)
        {
            bool notCapped = false;

            switch (InPlayStructures[i].UnitType)
            {
                case ObjectType.DRAGON:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountDragons <
                        InPlayStructures[i].StructureAttribute.MaxDragonAmount)
                        notCapped = true;
                    break;

                case ObjectType.NECROMANCER:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountNecromancers <
                        InPlayStructures[i].StructureAttribute.MaxNecromancerAmount)
                        notCapped = true;
                    break;

                case ObjectType.ARCANE_MAGE:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountArcaneMages <
                        InPlayStructures[i].StructureAttribute.MaxArcaneMageAmount)
                        notCapped = true;
                    break;

                case ObjectType.FIRE_MAGE:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountFireMages <
                        InPlayStructures[i].StructureAttribute.MaxFireMageAmount)
                        notCapped = true;
                    break;

                case ObjectType.AXE_THROWER:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountAxeThrowers <
                        InPlayStructures[i].StructureAttribute.MaxAxeThrowerAmount)
                        notCapped = true;
                    break;

                case ObjectType.BERSERKER:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountBerserkers <
                        InPlayStructures[i].StructureAttribute.MaxBerserkerAmount)
                        notCapped = true;
                    break;

                case ObjectType.WOLF:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountWolfs <
                        InPlayStructures[i].StructureAttribute.MaxWolfAmount)
                        notCapped = true;
                    break;

                case ObjectType.CLERIC:
                    if (InPlayStructures[i].StructureAttribute.CurrentAmountClerics <
                        InPlayStructures[i].StructureAttribute.MaxClericAmount)
                        notCapped = true;
                    break;

                default:
                    Console.WriteLine("Spawn Friendly problems");
                    break;
            }

            if (notCapped)
            {
                Friendly tempFriendly = new Friendly(InPlayStructures[i].UnitType, content, SpriteState.MOVE_LEFT,
                                                     Vector2.Zero, InPlayStructures[i].StructureAttribute.DefaultUnitTarget, InPlayStructures[i].StructureAttribute.AttackLevel, InPlayStructures[i].StructureAttribute.DefenseLevel);

                mInPlayObjectList.InsertLast(tempFriendly);
                GameObject.mPotentialTargetListList.InsertLast(tempFriendly);

                tempFriendly.Sprite.LoadContent();
                tempFriendly.Sprite.WorldPosition =
                    new Vector2(InPlayStructures[i].Sprite.WorldPosition.X - tempFriendly.Sprite.SpriteFrame.Width,
                                InPlayStructures[i].Sprite.WorldPosition.Y);
                tempFriendly.Color = InPlayStructures[i].StructureColor;
                tempFriendly.PostSetFOV();

                PassGameTime();

                switch (InPlayStructures[i].UnitType)
                {
                    case ObjectType.DRAGON:
                        InPlayStructures[i].StructureAttribute.CurrentAmountDragons++;
                        break;

                    case ObjectType.NECROMANCER:
                        InPlayStructures[i].StructureAttribute.CurrentAmountNecromancers++;
                        break;

                    case ObjectType.ARCANE_MAGE:
                        InPlayStructures[i].StructureAttribute.CurrentAmountArcaneMages++;
                        break;

                    case ObjectType.FIRE_MAGE:
                        InPlayStructures[i].StructureAttribute.CurrentAmountFireMages++;
                        break;

                    case ObjectType.AXE_THROWER:
                        InPlayStructures[i].StructureAttribute.CurrentAmountAxeThrowers++;
                        break;

                    case ObjectType.BERSERKER:
                        InPlayStructures[i].StructureAttribute.CurrentAmountBerserkers++;
                        break;

                    case ObjectType.WOLF:
                        InPlayStructures[i].StructureAttribute.CurrentAmountWolfs++;
                        break;

                    case ObjectType.CLERIC:
                        InPlayStructures[i].StructureAttribute.CurrentAmountClerics++;
                        break;

                    default:
                        Console.WriteLine("Spawn Friendly problems");
                        break;
                }

                    notCapped = false;

            }
        }
        public void PlayUnitStruckAudio(Friendly friendlyActor, Enemy EnemyActor)
        {
            //TODO: place holder
            switch (friendlyActor.TargetQueue.PeekFirst().CreatureType)
            {

                case ObjectType.BANSHEE:
                    PlayBansheeStruckSound();
                    break;
                case ObjectType.REAPER:
                    PlayReaperStruckSound();
                    break;
                case ObjectType.DOOM_HOUND:
                    PlayDoomHoundStruckSound();
                    break;
                case ObjectType.IMP:
                    PlayImpStruckSound();
                    break;
                case ObjectType.GOG:
                    PlayGogStruckSound();
                    break;

                default:
                    break;
            }
        }
 public FriendlyAttribute(Friendly mFriendlyActor, ContentManager content)
     : base(content)
 {
     randomNumberGenerator = new Random();
     this.mFriendlyActor = mFriendlyActor;
 }
        public static void PrintFriendlyAttributes(ref float textScale, ref TextBoxString gameObjectAttribute,
												ref List<TextBoxString> gameObjectAttributeList, ref string gameObjectAttributeString,
												 Friendly tempFriendly)
        {
            // Print Health
            gameObjectAttributeString = "Health: " + tempFriendly.FriendlyAttribute.CurrentHealthPoints.ToString();
            WriteLine(ref gameObjectAttribute, textScale, gameObjectAttributeString, gameObjectAttributeList);

            // Print Armor
            gameObjectAttributeString = "Armor: " + tempFriendly.FriendlyAttribute.CurrentArmor;
            WriteLine(ref gameObjectAttribute, textScale, gameObjectAttributeString, gameObjectAttributeList);

            //Print Sprite Frame
            gameObjectAttributeString = "Damage: " + tempFriendly.FriendlyAttribute.CurrentMinimumDamage + " - " + tempFriendly.FriendlyAttribute.CurrentMaximumDamage;
            WriteLine(ref gameObjectAttribute, textScale, gameObjectAttributeString, gameObjectAttributeList);

            gameObjectAttributeString = " ";
        }