CrossingExtras.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Cryptography;
  5. using JetBrains.Annotations;
  6. using Pools;
  7. using Routes;
  8. using UnityEngine;
  9. namespace Roads
  10. {
  11. [Serializable]
  12. public struct CrossingData
  13. {
  14. public Transform west;
  15. public Transform north;
  16. public Transform east;
  17. public Transform south;
  18. }
  19. public enum RoadDirection
  20. {
  21. West,
  22. North,
  23. East,
  24. South,
  25. None
  26. }
  27. public enum TurnDirection
  28. {
  29. Right,
  30. Left,
  31. Straight
  32. }
  33. static class TurnDirectionMapper
  34. {
  35. private static readonly Dictionary<RoadDirection, TurnDirection> fromSouth =
  36. new Dictionary<RoadDirection, TurnDirection>
  37. {
  38. {RoadDirection.East, TurnDirection.Right},
  39. {RoadDirection.West, TurnDirection.Left}
  40. };
  41. private static readonly Dictionary<RoadDirection, TurnDirection> fromNorth =
  42. new Dictionary<RoadDirection, TurnDirection>
  43. {
  44. {RoadDirection.East, TurnDirection.Left},
  45. {RoadDirection.West, TurnDirection.Right}
  46. };
  47. private static readonly Dictionary<RoadDirection, TurnDirection> fromWest =
  48. new Dictionary<RoadDirection, TurnDirection>
  49. {
  50. {RoadDirection.North, TurnDirection.Left},
  51. {RoadDirection.South, TurnDirection.Right}
  52. };
  53. private static readonly Dictionary<RoadDirection, TurnDirection> fromEast =
  54. new Dictionary<RoadDirection, TurnDirection>
  55. {
  56. {RoadDirection.North, TurnDirection.Right},
  57. {RoadDirection.South, TurnDirection.Left}
  58. };
  59. public static TurnDirection GetTurnDirection(RoadDirection from, RoadDirection to)
  60. {
  61. TurnDirection direction;
  62. switch (from)
  63. {
  64. case RoadDirection.West:
  65. return fromWest.TryGetValue(to, out direction) ? direction : TurnDirection.Straight;
  66. case RoadDirection.North:
  67. return fromNorth.TryGetValue(to, out direction) ? direction : TurnDirection.Straight;
  68. case RoadDirection.East:
  69. return fromEast.TryGetValue(to, out direction) ? direction : TurnDirection.Straight;
  70. case RoadDirection.South:
  71. return fromSouth.TryGetValue(to, out direction) ? direction : TurnDirection.Straight;
  72. default:
  73. return TurnDirection.Straight;
  74. }
  75. }
  76. }
  77. public class CrossingExtras : Turn
  78. {
  79. public CrossingData crossingData;
  80. [CanBeNull] private Pool arrowPool;
  81. private bool arrowPoolAvailable;
  82. private TurnDirection turnDirection;
  83. private void Awake()
  84. {
  85. arrowPool = FindObjectsOfType<Pool>().FirstOrDefault(o => o.CompareTag("ArrowPool"));
  86. arrowPoolAvailable = arrowPool != null;
  87. if (!arrowPoolAvailable) Debug.LogWarning("Arrow Pool not found");
  88. }
  89. private void Start()
  90. {
  91. if (comingFrom == RoadDirection.None || goingTo == RoadDirection.None) return;
  92. turnDirection = TurnDirectionMapper.GetTurnDirection(comingFrom, goingTo);
  93. var items = new[] {RoadDirection.West, RoadDirection.North, RoadDirection.East, RoadDirection.South};
  94. foreach (var position in items.Where(i => i != comingFrom && i != goingTo))
  95. {
  96. AddArrows(position);
  97. }
  98. }
  99. private void AddArrows(RoadDirection position)
  100. {
  101. if (!arrowPoolAvailable) return;
  102. Transform t;
  103. switch (position)
  104. {
  105. case RoadDirection.North:
  106. t = crossingData.north;
  107. break;
  108. case RoadDirection.West:
  109. t = crossingData.west;
  110. break;
  111. case RoadDirection.East:
  112. t = crossingData.east;
  113. break;
  114. case RoadDirection.South:
  115. t = crossingData.south;
  116. break;
  117. case RoadDirection.None:
  118. throw new ArgumentException("RoadDirection.None not allowed for adding arrows");
  119. default:
  120. throw new ArgumentOutOfRangeException(nameof(position), position, "Wrong Argument for AddArrows");
  121. }
  122. System.Diagnostics.Debug.Assert(arrowPool != null, nameof(arrowPool) + " != null");
  123. var arrows = arrowPool.GetItem();
  124. SetRotation(arrows, position);
  125. arrows.transform.position = t.position;
  126. }
  127. private void SetRotation(GameObject arrows, RoadDirection position)
  128. {
  129. //by default, the arrow shows to north
  130. switch (position)
  131. {
  132. case RoadDirection.West:
  133. {
  134. if (turnDirection == TurnDirection.Left ||
  135. turnDirection == TurnDirection.Straight && goingTo == RoadDirection.South)
  136. {
  137. arrows.transform.Rotate(Vector3.up, 90);
  138. }
  139. else if (turnDirection == TurnDirection.Right ||
  140. turnDirection == TurnDirection.Straight && goingTo == RoadDirection.North)
  141. {
  142. arrows.transform.Rotate(Vector3.up, 90);
  143. }
  144. break;
  145. }
  146. case RoadDirection.North:
  147. if (turnDirection == TurnDirection.Left ||
  148. turnDirection == TurnDirection.Straight && goingTo == RoadDirection.East)
  149. {
  150. arrows.transform.Rotate(Vector3.up, 180);
  151. }
  152. break;
  153. case RoadDirection.East:
  154. if (turnDirection == TurnDirection.Right ||
  155. turnDirection == TurnDirection.Straight && goingTo == RoadDirection.South)
  156. {
  157. arrows.transform.Rotate(Vector3.up, 90);
  158. }
  159. else if (turnDirection == TurnDirection.Left ||
  160. turnDirection == TurnDirection.Straight && goingTo == RoadDirection.North)
  161. {
  162. arrows.transform.Rotate(Vector3.up, -90);
  163. }
  164. break;
  165. case RoadDirection.South:
  166. if (turnDirection == TurnDirection.Right ||
  167. turnDirection == TurnDirection.Straight && goingTo == RoadDirection.West)
  168. {
  169. arrows.transform.Rotate(Vector3.up, 180);
  170. }
  171. break;
  172. case RoadDirection.None:
  173. throw new ArgumentException("RoadDirection.None not allowed for adding arrows");
  174. default:
  175. throw new ArgumentOutOfRangeException(nameof(position), position, null);
  176. }
  177. }
  178. }
  179. }