using System; using System.Collections.Generic; using System.Linq; using Random = Unity.Mathematics.Random; public abstract class ZoneSelector { public abstract GalaxyZone SelectZone(List candidates); } public abstract class OrderedZoneSelector : ZoneSelector { public bool Flip = false; protected abstract Func Comparison { get; } public override GalaxyZone SelectZone(List candidates) { var sorted = candidates.OrderBy(Comparison); return Flip ? sorted.Last() : sorted.First(); } } public class DistanceSelector : OrderedZoneSelector { private GalaxyZone Target { get; } public DistanceSelector(string[] args, IZoneResolver zoneResolver) { Target = zoneResolver.ResolveZone(args[0].Trim()); } protected override Func Comparison => zone => Target?.Distance[zone] ?? 0; } public class RandomSelector : ZoneSelector { private Random Random { get; } public RandomSelector(ref Random random) { Random = random; } public override GalaxyZone SelectZone(List candidates) { return candidates[Random.NextInt(candidates.Count)]; } }