Visual nubody (humanoid appearance refactor) (#42476)

* initial visual nubody

* oops overlay

* im so pheeming rn

* conversion...

* tests

* comeback of the underwear

* oops eyes

* blabbl

* zeds

* yaml linted

* search and visible count constraints

* reordering

* preserve previously selected markings colors

* fix test

* some ui niceties

* ordering

* make DB changes backwards-compatible/downgrade-friendly

* fix things again

* fix migration

* vulpkanin markings limit increase

* wrapping

* code cleanup and more code cleanup and more code cleanup and more code cleanup and

* fix slop ports

* better sampling API

* make filter work + use the method i made for its intended purpose

* fix test fails real quick

* magic mirror cleanup, remove TODO

* don't 0-init the organ profile data

* remove deltastates

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>

# Conflicts:
#	Content.Server/Humanoid/Components/RandomHumanoidAppearanceComponent.cs
#	Content.Server/Humanoid/Systems/RandomHumanoidAppearanceSystem.cs

# Conflicts:
#	Resources/Prototypes/Species/diona.yml

# Conflicts:
#	Content.Server/Zombies/ZombieSystem.Transform.cs
This commit is contained in:
pathetic meowmeow
2026-06-29 12:43:35 +02:00
committed by Coryler
parent 4f85f1b483
commit c57721eca5
196 changed files with 9583 additions and 8052 deletions
@@ -1,4 +1,7 @@
using Content.Shared.Body;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Humanoid.Prototypes;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared.Humanoid;
@@ -12,56 +15,29 @@ public enum HumanoidMarkingModifierKey
[Serializable, NetSerializable]
public sealed class HumanoidMarkingModifierMarkingSetMessage : BoundUserInterfaceMessage
{
public MarkingSet MarkingSet { get; }
public bool ResendState { get; }
public Dictionary<ProtoId<OrganCategoryPrototype>, Dictionary<HumanoidVisualLayers, List<Marking>>> Markings { get; }
public HumanoidMarkingModifierMarkingSetMessage(MarkingSet set, bool resendState)
public HumanoidMarkingModifierMarkingSetMessage(Dictionary<ProtoId<OrganCategoryPrototype>, Dictionary<HumanoidVisualLayers, List<Marking>>> markings)
{
MarkingSet = set;
ResendState = resendState;
Markings = markings;
}
}
[Serializable, NetSerializable]
public sealed class HumanoidMarkingModifierBaseLayersSetMessage : BoundUserInterfaceMessage
{
public HumanoidMarkingModifierBaseLayersSetMessage(HumanoidVisualLayers layer, CustomBaseLayerInfo? info, bool resendState)
{
Layer = layer;
Info = info;
ResendState = resendState;
}
public HumanoidVisualLayers Layer { get; }
public CustomBaseLayerInfo? Info { get; }
public bool ResendState { get; }
}
[Serializable, NetSerializable]
public sealed class HumanoidMarkingModifierState : BoundUserInterfaceState
{
// TODO just use the component state, remove the BUI state altogether.
public HumanoidMarkingModifierState(
MarkingSet markingSet,
string species,
Sex sex,
Color skinColor,
Dictionary<HumanoidVisualLayers, CustomBaseLayerInfo> customBaseLayers
Dictionary<ProtoId<OrganCategoryPrototype>, Dictionary<HumanoidVisualLayers, List<Marking>>> markings,
Dictionary<ProtoId<OrganCategoryPrototype>, OrganMarkingData> organData,
Dictionary<ProtoId<OrganCategoryPrototype>, OrganProfileData> organProfileData
)
{
MarkingSet = markingSet;
Species = species;
Sex = sex;
SkinColor = skinColor;
CustomBaseLayers = customBaseLayers;
Markings = markings;
OrganData = organData;
OrganProfileData = organProfileData;
}
public MarkingSet MarkingSet { get; }
public string Species { get; }
public Sex Sex { get; }
public Color SkinColor { get; }
public Color EyeColor { get; }
public Color? HairColor { get; }
public Color? FacialHairColor { get; }
public Dictionary<HumanoidVisualLayers, CustomBaseLayerInfo> CustomBaseLayers { get; }
public Dictionary<ProtoId<OrganCategoryPrototype>, Dictionary<HumanoidVisualLayers, List<Marking>>> Markings { get; }
public Dictionary<ProtoId<OrganCategoryPrototype>, OrganMarkingData> OrganData { get; }
public Dictionary<ProtoId<OrganCategoryPrototype>, OrganProfileData> OrganProfileData { get; }
}