public Task <Turn> PlayTurn(PlayTurnRequest request)
        {
            var avoidCombat = false;

            return(Strategic());

            Task <Turn> Strategic()
            {
                return(request.IsCombat ? StrategicCombat() : StrategicNonCombat());
            }

            Task <Turn> StrategicCombat()
            {
                if (!request.IsCombat)
                {
                    return(Task.FromResult(new Turn(TurnAction.Attack)));
                }

                if (HealthChecker.NeedsToChug(request.PartyMember) && request.PossibleActions.Contains(TurnAction.DrinkPotion))
                {
                    return(Task.FromResult(new Turn(TurnAction.DrinkPotion)));
                }

                return(Task.FromResult(new Turn(TurnAction.Attack, Targeter.GetPriorityTarget(request.PossibleTargets))));
            }

            Task <Turn> StrategicNonCombat()
            {
                if (request.PossibleActions.Contains(TurnAction.Attack) && _random.NextDouble() > 0.5)
                {
                    return(StrategicCombat());
                }

                var movements = MovementTracker.GetMovementActions();

                if (request.PossibleActions.Contains(TurnAction.Loot))
                {
                    return(Task.FromResult(new Turn(TurnAction.Loot)));
                }

                if (request.PossibleActions.Contains(TurnAction.Open))
                {
                    return(Task.FromResult(new Turn(TurnAction.Open)));
                }

                var movementoptions =
                    request.PossibleActions.Where(s => movements.Contains(s));

                var direction = movetracker.GetNextDirection(movementoptions.ToList(), request.PartyLocation);

                Debug.WriteLine(direction);

                return(Task.FromResult(new Turn(direction)));
            }
        }