Files
wwdpublic/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs
Skubman 8a3f7898c4 Markings Port Wave 1 (#1658)
# Description

Added a ton of markings to the game, ported from other codebases:

- All Goob LRP hairstyles
- Wizden hairstyles (including Pulato
https://github.com/space-wizards/space-station-14/pull/34117, Shaped and
Long Bow https://github.com/space-wizards/space-station-14/pull/31010)
- `HumanHairClassicLong2` and `HumanHairClassicLong3` have been
upstreamed from DV to Wizden so I'm doing the same here.
https://github.com/space-wizards/space-station-14/pull/30963
- Iron Jaw face augmentation from Adventure Time
- Adventure Time hairstyles and facial hair
- Some Corvax hairstyles and facial hair
- IPC wings (https://github.com/Goob-Station/Goob-Station/pull/1145)
- Plasmaman wings (from SimpleStation14)
- _B-b-b-but they get set on fire by oxyg-_ Counterpoint: Plasmamen with
wings look cool as heck.

Also cherry-picked
https://github.com/space-wizards/space-station-14/pull/30786 and
https://github.com/space-wizards/space-station-14/pull/30852.

I was initially going to include new Oni markings like horns, ears and
tails from Adventure Time here but due to what I think is quality issues
with some of them I've postponed adding them until I have the time to
correct them. I gotta put out the markings I can put out now cause I
know everyone's gonna want to immediately upstream merge all the other
content we've added today.

<details><summary><h1>Media</h1></summary>
<p>

**Pulato (from Wizden) + Iron Jaw (from Adventure Time)**

![image](https://github.com/user-attachments/assets/71251ef6-394f-4f7e-bd23-6d66248b3cb4)

**Side Comb + Beard (Short) (all from Adventure Time)**

![image](https://github.com/user-attachments/assets/34d3427b-edef-4abc-8d19-b883a24e663f)

**Front Braids (Medium) (from Goob LRP) + Gauze Head Wrap (from
Wizden)**

![image](https://github.com/user-attachments/assets/da7f26ac-53bb-4985-84a3-09759ce37500)

**IPC Wings (from SimpleStation) + Long Pompadour (from Goob LRP) +
Moustache (Handlebar 2) (from Corvax)**

<img width=394px
src="https://github.com/user-attachments/assets/13ea3638-d9b8-4470-88b5-7b91ef671ded">
<img width=290px
src="https://github.com/user-attachments/assets/c116ce27-d19f-49af-878c-75fb9f8b354b">

**Plasmaman Wings (from SimpleStation)**

<img width=278px
src="https://github.com/user-attachments/assets/82a767f2-cbe0-4f40-b585-4f496fafe51d">
<img width=250px
src="https://github.com/user-attachments/assets/bee96e6d-c105-46ac-8a1e-dd103af145b9">

</p>
</details>

# Changelog

🆑 Skubman
- add: New hairstyles have arrived, including all Goob LRP-original
hairstyles, Pulato, new facial hair and more!
- add: Added epic IPC wings and Plasmaman wings.
- add: Added the Iron Jaw face marking.
- tweak: Increased the maximum number of Reptilian chest markings to 3.
- fix: Harpy, Arachne and Lamia can no longer pick the "No Ears" marking
which had no effect as they had no default ear markings.

---------

Co-authored-by: ~DreamlyJack~ <148849095+DreamlyJack@users.noreply.github.com>
Co-authored-by: Арт <123451459+JustArt1m@users.noreply.github.com>
Co-authored-by: ScyronX <166930367+ScyronX@users.noreply.github.com>

(cherry picked from commit 91d14acb2be64da8193bb909623a053be73bc6b4)
2025-01-29 20:22:45 +03:00

152 lines
5.9 KiB
C#

using Content.Shared.Body.Components;
using Content.Shared.Body.Part;
namespace Content.Shared.Humanoid
{
public static class HumanoidVisualLayersExtension
{
public static bool HasSexMorph(HumanoidVisualLayers layer)
{
return layer switch
{
HumanoidVisualLayers.Chest => true,
HumanoidVisualLayers.Head => true,
_ => false
};
}
public static string GetSexMorph(HumanoidVisualLayers layer, Sex sex, string id)
{
if (!HasSexMorph(layer) || sex == Sex.Unsexed)
return id;
return $"{id}{sex}";
}
/// <summary>
/// Sublayers. Any other layers that may visually depend on this layer existing.
/// For example, the head has layers such as eyes, hair, etc. depending on it.
/// </summary>
/// <param name="layer"></param>
/// <returns>Enumerable of layers that depend on that given layer. Empty, otherwise.</returns>
/// <remarks>This could eventually be replaced by a body system implementation.</remarks>
public static IEnumerable<HumanoidVisualLayers> Sublayers(HumanoidVisualLayers layer)
{
switch (layer)
{
case HumanoidVisualLayers.Head:
yield return HumanoidVisualLayers.Head;
yield return HumanoidVisualLayers.Eyes;
yield return HumanoidVisualLayers.HeadSide;
yield return HumanoidVisualLayers.HeadTop;
yield return HumanoidVisualLayers.Hair;
yield return HumanoidVisualLayers.FacialHair;
yield return HumanoidVisualLayers.Snout;
break;
case HumanoidVisualLayers.LArm:
yield return HumanoidVisualLayers.LArm;
yield return HumanoidVisualLayers.LHand;
break;
case HumanoidVisualLayers.LHand:
yield return HumanoidVisualLayers.LHand;
break;
case HumanoidVisualLayers.RArm:
yield return HumanoidVisualLayers.RArm;
yield return HumanoidVisualLayers.RHand;
break;
case HumanoidVisualLayers.RHand:
yield return HumanoidVisualLayers.RHand;
break;
case HumanoidVisualLayers.LLeg:
yield return HumanoidVisualLayers.LLeg;
yield return HumanoidVisualLayers.LFoot;
break;
case HumanoidVisualLayers.LFoot:
yield return HumanoidVisualLayers.LFoot;
break;
case HumanoidVisualLayers.RLeg:
yield return HumanoidVisualLayers.RLeg;
yield return HumanoidVisualLayers.RFoot;
break;
case HumanoidVisualLayers.RFoot:
yield return HumanoidVisualLayers.RFoot;
break;
case HumanoidVisualLayers.Chest:
yield return HumanoidVisualLayers.Chest;
yield return HumanoidVisualLayers.Wings;
yield return HumanoidVisualLayers.Tail;
break;
default:
yield break;
}
}
public static HumanoidVisualLayers? ToHumanoidLayers(this BodyPartComponent part)
{
switch (part.PartType)
{
case BodyPartType.Other:
break;
case BodyPartType.Torso:
return HumanoidVisualLayers.Chest;
case BodyPartType.Tail:
return HumanoidVisualLayers.Tail;
case BodyPartType.Head:
// use the Sublayers method to hide the rest of the parts,
// if that's what you're looking for
return HumanoidVisualLayers.Head;
case BodyPartType.Arm:
switch (part.Symmetry)
{
case BodyPartSymmetry.None:
break;
case BodyPartSymmetry.Left:
return HumanoidVisualLayers.LArm;
case BodyPartSymmetry.Right:
return HumanoidVisualLayers.RArm;
}
break;
case BodyPartType.Hand:
switch (part.Symmetry)
{
case BodyPartSymmetry.None:
break;
case BodyPartSymmetry.Left:
return HumanoidVisualLayers.LHand;
case BodyPartSymmetry.Right:
return HumanoidVisualLayers.RHand;
}
break;
case BodyPartType.Leg:
switch (part.Symmetry)
{
case BodyPartSymmetry.None:
break;
case BodyPartSymmetry.Left:
return HumanoidVisualLayers.LLeg;
case BodyPartSymmetry.Right:
return HumanoidVisualLayers.RLeg;
}
break;
case BodyPartType.Foot:
switch (part.Symmetry)
{
case BodyPartSymmetry.None:
break;
case BodyPartSymmetry.Left:
return HumanoidVisualLayers.LFoot;
case BodyPartSymmetry.Right:
return HumanoidVisualLayers.RFoot;
}
break;
}
return null;
}
}
}