1
0

PipeDirection.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using Robust.Shared.Serialization;
  2. namespace Content.Shared.Atmos
  3. {
  4. [Serializable, NetSerializable]
  5. public enum PipeVisuals
  6. {
  7. VisualState
  8. }
  9. [Flags]
  10. [Serializable, NetSerializable]
  11. public enum PipeDirection
  12. {
  13. None = 0,
  14. //Half of a pipe in a direction
  15. North = 1 << 0,
  16. South = 1 << 1,
  17. West = 1 << 2,
  18. East = 1 << 3,
  19. //Straight pipes
  20. Longitudinal = North | South,
  21. Lateral = West | East,
  22. //Bends
  23. NWBend = North | West,
  24. NEBend = North | East,
  25. SWBend = South | West,
  26. SEBend = South | East,
  27. //T-Junctions
  28. TNorth = North | Lateral,
  29. TSouth = South | Lateral,
  30. TWest = West | Longitudinal,
  31. TEast = East | Longitudinal,
  32. //Four way
  33. Fourway = North | South | East | West,
  34. All = -1,
  35. }
  36. public enum PipeShape
  37. {
  38. Half,
  39. Straight,
  40. Bend,
  41. TJunction,
  42. Fourway
  43. }
  44. public static class PipeShapeHelpers
  45. {
  46. /// <summary>
  47. /// Gets the direction of a shape when facing 0 degrees (the initial direction of entities).
  48. /// </summary>
  49. public static PipeDirection ToBaseDirection(this PipeShape shape)
  50. {
  51. return shape switch
  52. {
  53. PipeShape.Half => PipeDirection.South,
  54. PipeShape.Straight => PipeDirection.Longitudinal,
  55. PipeShape.Bend => PipeDirection.SWBend,
  56. PipeShape.TJunction => PipeDirection.TSouth,
  57. PipeShape.Fourway => PipeDirection.Fourway,
  58. _ => throw new ArgumentOutOfRangeException(nameof(shape), $"{shape} does not have an associated {nameof(PipeDirection)}."),
  59. };
  60. }
  61. }
  62. public static class PipeDirectionHelpers
  63. {
  64. public const int PipeDirections = 4;
  65. /// <summary>
  66. /// Includes the Up and Down directions.
  67. /// </summary>
  68. public const int AllPipeDirections = 6;
  69. public static bool HasDirection(this PipeDirection pipeDirection, PipeDirection other)
  70. {
  71. return (pipeDirection & other) == other;
  72. }
  73. public static Angle ToAngle(this PipeDirection pipeDirection)
  74. {
  75. return pipeDirection.ToDirection().ToAngle();
  76. }
  77. public static PipeDirection ToPipeDirection(this Direction direction)
  78. {
  79. return direction switch
  80. {
  81. Direction.North => PipeDirection.North,
  82. Direction.South => PipeDirection.South,
  83. Direction.East => PipeDirection.East,
  84. Direction.West => PipeDirection.West,
  85. _ => throw new ArgumentOutOfRangeException(nameof(direction)),
  86. };
  87. }
  88. public static Direction ToDirection(this PipeDirection pipeDirection)
  89. {
  90. return pipeDirection switch
  91. {
  92. PipeDirection.North => Direction.North,
  93. PipeDirection.South => Direction.South,
  94. PipeDirection.East => Direction.East,
  95. PipeDirection.West => Direction.West,
  96. _ => throw new ArgumentOutOfRangeException(nameof(pipeDirection)),
  97. };
  98. }
  99. public static PipeDirection GetOpposite(this PipeDirection pipeDirection)
  100. {
  101. return pipeDirection switch
  102. {
  103. PipeDirection.North => PipeDirection.South,
  104. PipeDirection.South => PipeDirection.North,
  105. PipeDirection.East => PipeDirection.West,
  106. PipeDirection.West => PipeDirection.East,
  107. _ => throw new ArgumentOutOfRangeException(nameof(pipeDirection)),
  108. };
  109. }
  110. public static PipeShape PipeDirectionToPipeShape(this PipeDirection pipeDirection)
  111. {
  112. return pipeDirection switch
  113. {
  114. PipeDirection.North => PipeShape.Half,
  115. PipeDirection.South => PipeShape.Half,
  116. PipeDirection.East => PipeShape.Half,
  117. PipeDirection.West => PipeShape.Half,
  118. PipeDirection.Lateral => PipeShape.Straight,
  119. PipeDirection.Longitudinal => PipeShape.Straight,
  120. PipeDirection.NEBend => PipeShape.Bend,
  121. PipeDirection.NWBend => PipeShape.Bend,
  122. PipeDirection.SEBend => PipeShape.Bend,
  123. PipeDirection.SWBend => PipeShape.Bend,
  124. PipeDirection.TNorth => PipeShape.TJunction,
  125. PipeDirection.TSouth => PipeShape.TJunction,
  126. PipeDirection.TEast => PipeShape.TJunction,
  127. PipeDirection.TWest => PipeShape.TJunction,
  128. PipeDirection.Fourway => PipeShape.Fourway,
  129. _ => throw new ArgumentOutOfRangeException(nameof(pipeDirection)),
  130. };
  131. }
  132. public static PipeDirection RotatePipeDirection(this PipeDirection pipeDirection, double diff)
  133. {
  134. var newPipeDir = PipeDirection.None;
  135. for (var i = 0; i < PipeDirections; i++)
  136. {
  137. var currentPipeDirection = (PipeDirection) (1 << i);
  138. if (!pipeDirection.HasFlag(currentPipeDirection)) continue;
  139. var angle = currentPipeDirection.ToAngle();
  140. angle += diff;
  141. newPipeDir |= angle.GetCardinalDir().ToPipeDirection();
  142. }
  143. return newPipeDir;
  144. }
  145. }
  146. }