using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using JetBrains.Annotations; using Pools; using Routes; using UnityEngine; namespace Roads { [Serializable] public struct CrossingData { public Transform west; public Transform north; public Transform east; public Transform south; } public enum RoadDirection { West, North, East, South, None } public enum TurnDirection { Right, Left, Straight } static class TurnDirectionMapper { private static readonly Dictionary fromSouth = new Dictionary { {RoadDirection.East, TurnDirection.Right}, {RoadDirection.West, TurnDirection.Left} }; private static readonly Dictionary fromNorth = new Dictionary { {RoadDirection.East, TurnDirection.Left}, {RoadDirection.West, TurnDirection.Right} }; private static readonly Dictionary fromWest = new Dictionary { {RoadDirection.North, TurnDirection.Left}, {RoadDirection.South, TurnDirection.Right} }; private static readonly Dictionary fromEast = new Dictionary { {RoadDirection.North, TurnDirection.Right}, {RoadDirection.South, TurnDirection.Left} }; public static TurnDirection GetTurnDirection(RoadDirection from, RoadDirection to) { TurnDirection direction; switch (from) { case RoadDirection.West: return fromWest.TryGetValue(to, out direction) ? direction : TurnDirection.Straight; case RoadDirection.North: return fromNorth.TryGetValue(to, out direction) ? direction : TurnDirection.Straight; case RoadDirection.East: return fromEast.TryGetValue(to, out direction) ? direction : TurnDirection.Straight; case RoadDirection.South: return fromSouth.TryGetValue(to, out direction) ? direction : TurnDirection.Straight; default: return TurnDirection.Straight; } } } public class CrossingExtras : Turn { public CrossingData crossingData; protected override Transform RoadDirectionToTransform(RoadDirection position) { switch (position) { case RoadDirection.North: return crossingData.north; case RoadDirection.West: return crossingData.west; case RoadDirection.East: return crossingData.east; case RoadDirection.South: return crossingData.south; case RoadDirection.None: throw new ArgumentException("RoadDirection.None not allowed for adding arrows"); default: throw new ArgumentOutOfRangeException(nameof(position), position, "Wrong Argument for AddArrows"); } } } }