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))); } }