HumanoidVisualLayersExtension.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. default:
  63. yield break;
  64. }
  65. }
  66. public static HumanoidVisualLayers? ToHumanoidLayers(this BodyPartComponent part)
  67. {
  68. switch (part.PartType)
  69. {
  70. case BodyPartType.Other:
  71. break;
  72. case BodyPartType.Torso:
  73. return HumanoidVisualLayers.Chest;
  74. case BodyPartType.Tail:
  75. return HumanoidVisualLayers.Tail;
  76. case BodyPartType.Head:
  77. // use the Sublayers method to hide the rest of the parts,
  78. // if that's what you're looking for
  79. return HumanoidVisualLayers.Head;
  80. case BodyPartType.Arm:
  81. switch (part.Symmetry)
  82. {
  83. case BodyPartSymmetry.None:
  84. break;
  85. case BodyPartSymmetry.Left:
  86. return HumanoidVisualLayers.LArm;
  87. case BodyPartSymmetry.Right:
  88. return HumanoidVisualLayers.RArm;
  89. }
  90. break;
  91. case BodyPartType.Hand:
  92. switch (part.Symmetry)
  93. {
  94. case BodyPartSymmetry.None:
  95. break;
  96. case BodyPartSymmetry.Left:
  97. return HumanoidVisualLayers.LHand;
  98. case BodyPartSymmetry.Right:
  99. return HumanoidVisualLayers.RHand;
  100. }
  101. break;
  102. case BodyPartType.Leg:
  103. switch (part.Symmetry)
  104. {
  105. case BodyPartSymmetry.None:
  106. break;
  107. case BodyPartSymmetry.Left:
  108. return HumanoidVisualLayers.LLeg;
  109. case BodyPartSymmetry.Right:
  110. return HumanoidVisualLayers.RLeg;
  111. }
  112. break;
  113. case BodyPartType.Foot:
  114. switch (part.Symmetry)
  115. {
  116. case BodyPartSymmetry.None:
  117. break;
  118. case BodyPartSymmetry.Left:
  119. return HumanoidVisualLayers.LFoot;
  120. case BodyPartSymmetry.Right:
  121. return HumanoidVisualLayers.RFoot;
  122. }
  123. break;
  124. }
  125. return null;
  126. }
  127. }
  128. }