/// <summary>
 /// Items the action.
 /// </summary>
 public void ItemAction()
 {
     currentState = EnumBattleState.SelectingTarget;
     battlAction  = EnumBattleAction.Item;
     SelectTheFirstEnemy();
     PassAction();
 }
 /// <summary>
 /// Accepts the decision.
 /// </summary>
 public void AcceptDecision()
 {
     SoundManager.UISound();
     currentState = EnumBattleState.SelectedTarget;
     HideTargetSelector();
     HideDecision();
     PlayerAction();
 }
 /// <summary>
 /// Declines the decision.
 /// </summary>
 public void DeclineDecision()
 {
     SoundManager.UISound();
     currentState = EnumBattleState.PlayerTurn;
     ShowMenu();
     HideTargetSelector();
     HideDecision();
 }
 /// <summary>
 /// Magics the action.
 /// </summary>
 public void MagicAction()
 {
     currentState = EnumBattleState.SelectingTarget;
     battlAction  = EnumBattleAction.Magic;
     SelectTheFirstEnemy();
     HideMenu();
     ShowDecision();
 }
    /// <summary>
    /// Nexts the battle sequence.
    /// </summary>
    public void NextBattleSequence()
    {
        var x = turnByTurnSequenceList.Where(w => w.First == EnumPlayerOrEnemy.Enemy).Count();
        var y = turnByTurnSequenceList.Where(w => w.First == EnumPlayerOrEnemy.Player).Count();

        if (x <= 0)
        {
            currentState = EnumBattleState.PlayerWon;
            return;
        }
        else if (y <= 0)
        {
            currentState = EnumBattleState.EnemyWon;
            return;
        }


        if (sequenceEnumerator.MoveNext())
        {
            PositionSelector(sequenceEnumerator.Current.Second);
            if (sequenceEnumerator.Current.First == EnumPlayerOrEnemy.Player)
            {
                currentState = EnumBattleState.PlayerTurn;

                selectedPlayer                 = sequenceEnumerator.Current.Second;
                selectedPlayerDatas            = GetCharacterDatas(selectedPlayer.name);
                BattlePanels.SelectedCharacter = selectedPlayerDatas;
            }
            else if (sequenceEnumerator.Current.First == EnumPlayerOrEnemy.Enemy)
            {
                currentState = EnumBattleState.EnemyTurn;
            }
        }
        else
        {
            sequenceEnumerator = turnByTurnSequenceList.GetEnumerator();
            NextBattleSequence();
        }
    }
    /// <summary>
    /// This is the main loop and where the system detect the presed keys and send them to the controller.
    /// </summary>
    void Update()
    {
        if (HOTween.GetAllPlayingTweens().Any())
        {
            return;
        }
        else if (currentState == EnumBattleState.SelectingTarget)
        {
            //Detecting if the player clicked on the left mouse button and also if there is no animation playing
            if (Input.GetButtonDown("Fire1"))
            {
                //The 3 following lines is to get the clicked GameObject and getting the RaycastHit2D that will help us know the clicked object
                RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
                if (hit.transform != null)
                {
                    //TODO: Add tweening condition
                    bool foundEnemy = false;
                    foreach (var x in generatedEnemyList)
                    {
                        if (x.GetInstanceID() == hit.transform.gameObject.GetInstanceID())
                        {
                            foundEnemy    = true;
                            selectedEnemy = hit.transform.gameObject;
                            PositionTargetSelector(selectedEnemy);
                            break;
                        }
                    }
                    if (!foundEnemy)
                    {
                        return;
                    }
                }
            }
        }
        else if (currentState == EnumBattleState.EnemyTurn)
        {
            Log(GameTexts.EnemyTurn);
            var z = turnByTurnSequenceList.Where(w => w.First == EnumPlayerOrEnemy.Player);
            var playerTargetedByEnemy      = z.ElementAt(UnityEngine.Random.Range(0, z.Count() - 1));
            var playerTargetedByEnemyDatas = GetCharacterDatas(playerTargetedByEnemy.Second.name);

            PositionTargetSelector(playerTargetedByEnemy.Second);
            EnemyAttack(playerTargetedByEnemy.Second, playerTargetedByEnemyDatas);
            NextBattleSequence();
        }
        else if (currentState == EnumBattleState.PlayerTurn)
        {
            Log(GameTexts.PlayerTurn);
            HideTargetSelector();
            ShowMenu();
            currentState = EnumBattleState.None;
        }
        else if (currentState == EnumBattleState.PlayerWon)
        {
            Log(GameTexts.PlayerWon);
            HideTargetSelector();
            HideMenu();
            int totalXP = 0;
            foreach (var x in generatedEnemyList)
            {
                totalXP += x.GetComponent <EnemyCharacterDatas> ().XP;
            }

            foreach (var x in turnByTurnSequenceList)
            {
                var characterdatas = GetCharacterDatas(x.Second.name);
                characterdatas.XP += totalXP;
                var calculatedXP = Math.Floor(Math.Sqrt(625 + 100 * characterdatas.XP) - 25) / 50;
                characterdatas.Level = (int)calculatedXP;
            }
            var textTodisplay = GameTexts.EndOfTheBattle + "\n\n" + GameTexts.PlayerXP + totalXP;
            ShowDropMenu(textTodisplay);
            currentState = EnumBattleState.EndBattle;
            var go = GameObject.FindGameObjectsWithTag(Settings.Music).FirstOrDefault();
            if (go)
            {
                go.GetComponent <AudioSource>().Stop();
            }
            SoundManager.WinningMusic();
        }
        else if (currentState == EnumBattleState.EnemyWon)
        {
            Log(GameTexts.EnemyWon);
            HideTargetSelector();
            HideMenu();

            var textTodisplay = GameTexts.EndOfTheBattle + "\n\n" + GameTexts.YouLost;
            ShowDropMenu(textTodisplay);

            currentState = EnumBattleState.None;
            var go = GameObject.FindGameObjectsWithTag(Settings.Music).FirstOrDefault();
            if (go)
            {
                go.GetComponent <AudioSource>().Stop();
            }
            SoundManager.GameOverMusic();
        }
    }