HumanoidVisualLayersExtension.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. using Content.Shared.Body.Components;
  2. using Content.Shared.Body.Part;
  3. namespace Content.Shared.Humanoid
  4. {
  5. public static class HumanoidVisualLayersExtension
  6. {
  7. public static bool HasSexMorph(HumanoidVisualLayers layer)
  8. {
  9. return layer switch
  10. {
  11. HumanoidVisualLayers.Chest => true,
  12. HumanoidVisualLayers.Head => true,
  13. _ => false
  14. };
  15. }
  16. public static string GetSexMorph(HumanoidVisualLayers layer, Sex sex, string id)
  17. {
  18. if (!HasSexMorph(layer) || sex == Sex.Unsexed)
  19. return id;
  20. return $"{id}{sex}";
  21. }
  22. /// <summary>
  23. /// Sublayers. Any other layers that may visually depend on this layer existing.
  24. /// For example, the head has layers such as eyes, hair, etc. depending on it.
  25. /// </summary>
  26. /// <param name="layer"></param>
  27. /// <returns>Enumerable of layers that depend on that given layer. Empty, otherwise.</returns>
  28. /// <remarks>This could eventually be replaced by a body system implementation.</remarks>
  29. public static IEnumerable<HumanoidVisualLayers> Sublayers(HumanoidVisualLayers layer)
  30. {
  31. switch (layer)
  32. {
  33. case HumanoidVisualLayers.Head:
  34. yield return HumanoidVisualLayers.Head;
  35. yield return HumanoidVisualLayers.Eyes;
  36. yield return HumanoidVisualLayers.HeadSide;
  37. yield return HumanoidVisualLayers.HeadTop;
  38. yield return HumanoidVisualLayers.Hair;
  39. yield return HumanoidVisualLayers.FacialHair;
  40. yield return HumanoidVisualLayers.Snout;
  41. break;
  42. case HumanoidVisualLayers.LArm:
  43. yield return HumanoidVisualLayers.LArm;
  44. yield return HumanoidVisualLayers.LHand;
  45. break;
  46. case HumanoidVisualLayers.RArm:
  47. yield return HumanoidVisualLayers.RArm;
  48. yield return HumanoidVisualLayers.RHand;
  49. break;
  50. case HumanoidVisualLayers.LLeg:
  51. yield return HumanoidVisualLayers.LLeg;
  52. yield return HumanoidVisualLayers.LFoot;
  53. break;
  54. case HumanoidVisualLayers.RLeg:
  55. yield return HumanoidVisualLayers.RLeg;
  56. yield return HumanoidVisualLayers.RFoot;
  57. break;
  58. case HumanoidVisualLayers.Chest:
  59. yield return HumanoidVisualLayers.Chest;
  60. yield return HumanoidVisualLayers.Tail;
  61. break;
  62. // Shitmed Change Start
  63. case HumanoidVisualLayers.LHand:
  64. yield return HumanoidVisualLayers.LHand;
  65. break;
  66. case HumanoidVisualLayers.RHand:
  67. yield return HumanoidVisualLayers.RHand;
  68. break;
  69. case HumanoidVisualLayers.LFoot:
  70. yield return HumanoidVisualLayers.LFoot;
  71. break;
  72. case HumanoidVisualLayers.RFoot:
  73. yield return HumanoidVisualLayers.RFoot;
  74. break;
  75. // Shitmed Change End
  76. default:
  77. yield break;
  78. }
  79. }
  80. public static HumanoidVisualLayers? ToHumanoidLayers(this BodyPartComponent part)
  81. {
  82. switch (part.PartType)
  83. {
  84. case BodyPartType.Other:
  85. break;
  86. case BodyPartType.Torso:
  87. return HumanoidVisualLayers.Chest;
  88. case BodyPartType.Tail:
  89. return HumanoidVisualLayers.Tail;
  90. case BodyPartType.Head:
  91. // use the Sublayers method to hide the rest of the parts,
  92. // if that's what you're looking for
  93. return HumanoidVisualLayers.Head;
  94. case BodyPartType.Arm:
  95. switch (part.Symmetry)
  96. {
  97. case BodyPartSymmetry.None:
  98. break;
  99. case BodyPartSymmetry.Left:
  100. return HumanoidVisualLayers.LArm;
  101. case BodyPartSymmetry.Right:
  102. return HumanoidVisualLayers.RArm;
  103. }
  104. break;
  105. case BodyPartType.Hand:
  106. switch (part.Symmetry)
  107. {
  108. case BodyPartSymmetry.None:
  109. break;
  110. case BodyPartSymmetry.Left:
  111. return HumanoidVisualLayers.LHand;
  112. case BodyPartSymmetry.Right:
  113. return HumanoidVisualLayers.RHand;
  114. }
  115. break;
  116. case BodyPartType.Leg:
  117. switch (part.Symmetry)
  118. {
  119. case BodyPartSymmetry.None:
  120. break;
  121. case BodyPartSymmetry.Left:
  122. return HumanoidVisualLayers.LLeg;
  123. case BodyPartSymmetry.Right:
  124. return HumanoidVisualLayers.RLeg;
  125. }
  126. break;
  127. case BodyPartType.Foot:
  128. switch (part.Symmetry)
  129. {
  130. case BodyPartSymmetry.None:
  131. break;
  132. case BodyPartSymmetry.Left:
  133. return HumanoidVisualLayers.LFoot;
  134. case BodyPartSymmetry.Right:
  135. return HumanoidVisualLayers.RFoot;
  136. }
  137. break;
  138. }
  139. return null;
  140. }
  141. }
  142. }