async Task BattlerTurn(Battler battler)
    {
        try
        {
            await battler.TurnStart();

            var turn = await battler.GetTurn();

            await QueueActionAndAwait(() => battleCanvas.UnbindActionArrow());

            if (turn != null && turn.Skill != null)
            {
                var usedSkill = turn.Skill;
                var targets   = turn.Targets;

                GameController.Instance.QueueAction(() =>
                                                    Debug.Log($"Skill: {usedSkill.SkillName}, Targets: {String.Join(", ", turn.Targets.Select(target => $"{target.BattlerName}"))}"));

                await battler.ExecuteTurn(turn);

                var effectResults =
                    await Task.WhenAll(targets.EachDo((target) => target.ReceiveSkill(battler, usedSkill)));

                var concatResults = effectResults.SelectMany(x => x);

                await battler.AfterSkill(
                    concatResults);
            }

            await battler.TurnEnd();
        }
        catch (Exception e)
        {
            Debug.LogException(e);
        }
    }