From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:14:01 +0000 (+0100) Subject: Add undergarments & "Censor Nudity" toggle to options (#33185) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=27cfc0939cafcaf633adb36d645187048399e0eb;p=space-station-14.git Add undergarments & "Censor Nudity" toggle to options (#33185) * Initial commit * Attribution * Review changes * Added comment for upstream --- diff --git a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs index 6eb5dd9ec9..2d532968de 100644 --- a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs +++ b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs @@ -1,8 +1,10 @@ +using Content.Shared.CCVar; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Preferences; using Robust.Client.GameObjects; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -12,12 +14,15 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnHandleState); + Subs.CVar(_configurationManager, CCVars.AccessibilityClientCensorNudity, OnCvarChanged, true); + Subs.CVar(_configurationManager, CCVars.AccessibilityServerCensorNudity, OnCvarChanged, true); } private void OnHandleState(EntityUid uid, HumanoidAppearanceComponent component, ref AfterAutoHandleStateEvent args) @@ -25,6 +30,15 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem UpdateSprite(component, Comp(uid)); } + private void OnCvarChanged(bool value) + { + var humanoidQuery = EntityManager.AllEntityQueryEnumerator(); + while (humanoidQuery.MoveNext(out var _, out var humanoidComp, out var spriteComp)) + { + UpdateSprite(humanoidComp, spriteComp); + } + } + private void UpdateSprite(HumanoidAppearanceComponent component, SpriteComponent sprite) { UpdateLayers(component, sprite); @@ -207,16 +221,30 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem // Really, markings should probably be a separate component altogether. ClearAllMarkings(humanoid, sprite); + var censorNudity = _configurationManager.GetCVar(CCVars.AccessibilityClientCensorNudity) || + _configurationManager.GetCVar(CCVars.AccessibilityServerCensorNudity); + // The reason we're splitting this up is in case the character already has undergarment equipped in that slot. + var applyUndergarmentTop = censorNudity; + var applyUndergarmentBottom = censorNudity; + foreach (var markingList in humanoid.MarkingSet.Markings.Values) { foreach (var marking in markingList) { if (_markingManager.TryGetMarking(marking, out var markingPrototype)) + { ApplyMarking(markingPrototype, marking.MarkingColors, marking.Visible, humanoid, sprite); + if (markingPrototype.BodyPart == HumanoidVisualLayers.UndergarmentTop) + applyUndergarmentTop = false; + else if (markingPrototype.BodyPart == HumanoidVisualLayers.UndergarmentBottom) + applyUndergarmentBottom = false; + } } } humanoid.ClientOldMarkings = new MarkingSet(humanoid.MarkingSet); + + AddUndergarments(humanoid, sprite, applyUndergarmentTop, applyUndergarmentBottom); } private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteComponent sprite) @@ -264,6 +292,31 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem spriteComp.RemoveLayer(index); } } + + private void AddUndergarments(HumanoidAppearanceComponent humanoid, SpriteComponent sprite, bool undergarmentTop, bool undergarmentBottom) + { + if (undergarmentTop && humanoid.UndergarmentTop != null) + { + var marking = new Marking(humanoid.UndergarmentTop, new List { new Color() }); + if (_markingManager.TryGetMarking(marking, out var prototype)) + { + // Markings are added to ClientOldMarkings because otherwise it causes issues when toggling the feature on/off. + humanoid.ClientOldMarkings.Markings.Add(MarkingCategories.UndergarmentTop, new List{ marking }); + ApplyMarking(prototype, null, true, humanoid, sprite); + } + } + + if (undergarmentBottom && humanoid.UndergarmentBottom != null) + { + var marking = new Marking(humanoid.UndergarmentBottom, new List { new Color() }); + if (_markingManager.TryGetMarking(marking, out var prototype)) + { + humanoid.ClientOldMarkings.Markings.Add(MarkingCategories.UndergarmentBottom, new List{ marking }); + ApplyMarking(prototype, null, true, humanoid, sprite); + } + } + } + private void ApplyMarking(MarkingPrototype markingPrototype, IReadOnlyList? colors, bool visible, diff --git a/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml b/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml index 763fd995ca..5041b498a0 100644 --- a/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml +++ b/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml @@ -4,6 +4,8 @@ + diff --git a/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml.cs b/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml.cs index e1dead0b0e..f87cda746c 100644 --- a/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml.cs @@ -21,6 +21,8 @@ public sealed partial class AccessibilityTab : Control Control.AddOptionPercentSlider(CCVars.SpeechBubbleSpeakerOpacity, SpeechBubbleSpeakerOpacitySlider); Control.AddOptionPercentSlider(CCVars.SpeechBubbleBackgroundOpacity, SpeechBubbleBackgroundOpacitySlider); + Control.AddOptionCheckBox(CCVars.AccessibilityClientCensorNudity, CensorNudityCheckBox); + Control.Initialize(); } } diff --git a/Content.Shared/CCVar/CCVars.Accessibility.cs b/Content.Shared/CCVar/CCVars.Accessibility.cs index 14312363a1..3f752cbeea 100644 --- a/Content.Shared/CCVar/CCVars.Accessibility.cs +++ b/Content.Shared/CCVar/CCVars.Accessibility.cs @@ -60,5 +60,17 @@ public sealed partial class CCVars public static readonly CVarDef SpeechBubbleBackgroundOpacity = CVarDef.Create("accessibility.speech_bubble_background_opacity", 0.75f, CVar.CLIENTONLY | CVar.ARCHIVE); + /// + /// If enabled, censors character nudity by forcing clothes markings on characters, selected by the client. + /// Both this and AccessibilityServerCensorNudity must be false to display nudity on the client. + /// + public static readonly CVarDef AccessibilityClientCensorNudity = + CVarDef.Create("accessibility.censor_nudity", false, CVar.CLIENTONLY | CVar.ARCHIVE); + /// + /// If enabled, censors character nudity by forcing clothes markings on characters, selected by the server. + /// Both this and AccessibilityClientCensorNudity must be false to display nudity on the client. + /// + public static readonly CVarDef AccessibilityServerCensorNudity = + CVarDef.Create("accessibility.server_censor_nudity", false, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); } diff --git a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs index 016ab64f1a..0bf11f5762 100644 --- a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs +++ b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs @@ -88,6 +88,15 @@ public sealed partial class HumanoidAppearanceComponent : Component /// [DataField] public HashSet HideLayersOnEquip = [HumanoidVisualLayers.Hair]; + + /// + /// Which markings the humanoid defaults to when nudity is toggled off. + /// + [DataField] + public ProtoId? UndergarmentTop = new ProtoId("UndergarmentTopTanktop"); + + [DataField] + public ProtoId? UndergarmentBottom = new ProtoId("UndergarmentBottomBoxers"); } [DataDefinition] diff --git a/Content.Shared/Humanoid/HumanoidVisualLayers.cs b/Content.Shared/Humanoid/HumanoidVisualLayers.cs index cecd8a1c13..ca78564bfd 100644 --- a/Content.Shared/Humanoid/HumanoidVisualLayers.cs +++ b/Content.Shared/Humanoid/HumanoidVisualLayers.cs @@ -10,6 +10,8 @@ namespace Content.Shared.Humanoid Tail, Hair, FacialHair, + UndergarmentTop, + UndergarmentBottom, Chest, Head, Snout, @@ -19,7 +21,6 @@ namespace Content.Shared.Humanoid RArm, LArm, RHand, - LHand, RLeg, LLeg, diff --git a/Content.Shared/Humanoid/Markings/MarkingCategories.cs b/Content.Shared/Humanoid/Markings/MarkingCategories.cs index db82fb1fd3..2551175096 100644 --- a/Content.Shared/Humanoid/Markings/MarkingCategories.cs +++ b/Content.Shared/Humanoid/Markings/MarkingCategories.cs @@ -13,6 +13,8 @@ namespace Content.Shared.Humanoid.Markings HeadSide, Snout, Chest, + UndergarmentTop, + UndergarmentBottom, Arms, Legs, Tail, @@ -33,6 +35,8 @@ namespace Content.Shared.Humanoid.Markings HumanoidVisualLayers.HeadSide => MarkingCategories.HeadSide, HumanoidVisualLayers.Snout => MarkingCategories.Snout, HumanoidVisualLayers.Chest => MarkingCategories.Chest, + HumanoidVisualLayers.UndergarmentTop => MarkingCategories.UndergarmentTop, + HumanoidVisualLayers.UndergarmentBottom => MarkingCategories.UndergarmentBottom, HumanoidVisualLayers.RArm => MarkingCategories.Arms, HumanoidVisualLayers.LArm => MarkingCategories.Arms, HumanoidVisualLayers.RHand => MarkingCategories.Arms, diff --git a/Content.Shared/Humanoid/Markings/MarkingColoring.cs b/Content.Shared/Humanoid/Markings/MarkingColoring.cs index a13481debf..fa47475a23 100644 --- a/Content.Shared/Humanoid/Markings/MarkingColoring.cs +++ b/Content.Shared/Humanoid/Markings/MarkingColoring.cs @@ -89,7 +89,7 @@ public static class MarkingColoring public sealed partial class LayerColoringDefinition { [DataField("type")] - public LayerColoringType Type = new SkinColoring(); + public LayerColoringType? Type = new SkinColoring(); /// /// Coloring types that will be used if main coloring type will return nil @@ -105,7 +105,9 @@ public sealed partial class LayerColoringDefinition public Color GetColor(Color? skin, Color? eyes, MarkingSet markingSet) { - var color = Type.GetColor(skin, eyes, markingSet); + Color? color = null; + if (Type != null) + color = Type.GetColor(skin, eyes, markingSet); if (color == null) { foreach (var type in FallbackTypes) diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index e6b6a5250a..32a77f8b6b 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -279,15 +279,21 @@ cmd-options-help = Usage: options [tab] ## Accessibility menu +ui-options-accessability-header-visuals = Visuals +ui-options-accessability-header-content = Content + ui-options-enable-color-name = Add colors to character names ui-options-colorblind-friendly = Colorblind friendly mode ui-options-reduced-motion = Reduce motion of visual effects ui-options-screen-shake-intensity = Screen shake intensity + ui-options-chat-window-opacity = Chat window opacity ui-options-speech-bubble-text-opacity = Speech bubble text opacity ui-options-speech-bubble-speaker-opacity = Speech bubble speaker opacity ui-options-speech-bubble-background-opacity = Speech bubble background opacity +ui-options-censor-nudity = Censor character nudity + ## Admin menu ui-options-enable-classic-overlay = Revert antag overlay to classic mode diff --git a/Resources/Locale/en-US/markings/undergarment.ftl b/Resources/Locale/en-US/markings/undergarment.ftl new file mode 100644 index 0000000000..3740d0573d --- /dev/null +++ b/Resources/Locale/en-US/markings/undergarment.ftl @@ -0,0 +1,21 @@ +marking-UndergarmentTopTanktop = Tanktop +marking-UndergarmentTopBinder = Binder +marking-UndergarmentTopBra = Classic Bra +marking-UndergarmentTopSportsbra = Sports Bra + +marking-UndergarmentBottomBoxers = Boxers +marking-UndergarmentBottomBriefs = Briefs +marking-UndergarmentBottomSatin = Satin + +marking-UndergarmentTopTanktopVox = Tanktop +marking-UndergarmentTopBinderVox = Binder +marking-UndergarmentTopBraVox = Classic Bra +marking-UndergarmentTopSportsbraVox = Sports Bra + +marking-UndergarmentBottomBoxersVox = Boxers +marking-UndergarmentBottomBriefsVox = Briefs +marking-UndergarmentBottomSatinVox = Satin + +marking-UndergarmentBottomBoxersReptilian = Boxers +marking-UndergarmentBottomBriefsReptilian = Briefs +marking-UndergarmentBottomSatinReptilian = Satin diff --git a/Resources/Locale/en-US/preferences/ui/markings-picker.ftl b/Resources/Locale/en-US/preferences/ui/markings-picker.ftl index ba274ec9ca..af2e81ce3b 100644 --- a/Resources/Locale/en-US/preferences/ui/markings-picker.ftl +++ b/Resources/Locale/en-US/preferences/ui/markings-picker.ftl @@ -21,6 +21,8 @@ markings-category-Head = Head markings-category-HeadTop = Head (Top) markings-category-HeadSide = Head (Side) markings-category-Snout = Snout +markings-category-UndergarmentTop = Undergarment (Top) +markings-category-UndergarmentBottom = Undergarment (Bottom) markings-category-Chest = Chest markings-category-Arms = Arms markings-category-Legs = Legs diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/undergarments.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/undergarments.yml new file mode 100644 index 0000000000..b7f62290e1 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/undergarments.yml @@ -0,0 +1,223 @@ +# These options are kept very sparse to not put emphasis on nudity, and to provide a base for players to feel comfortable with. +# It's unlikely more will be added to upstream for cosmetic reasons. + +- type: marking + id: UndergarmentBottomBoxers + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: boxers + +- type: marking + id: UndergarmentBottomBriefs + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: briefs + +- type: marking + id: UndergarmentBottomSatin + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: satin + +- type: marking + id: UndergarmentTopBra + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: classic + +- type: marking + id: UndergarmentTopSportsbra + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: sports + +- type: marking + id: UndergarmentTopBinder + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: binder + +- type: marking + id: UndergarmentTopTanktop + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: tanktop + +- type: marking + id: UndergarmentBottomBoxersVox # Voxers. + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Vox] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: boxers_vox + +- type: marking + id: UndergarmentBottomBriefsVox + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Vox] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: briefs_vox + +- type: marking + id: UndergarmentBottomSatinVox + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Vox] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: satin_vox + +- type: marking + id: UndergarmentTopBraVox + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Vox] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: classic_vox + +- type: marking + id: UndergarmentTopSportsbraVox + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Vox] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: sports_vox + +- type: marking + id: UndergarmentTopBinderVox + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Vox] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: binder_vox + +- type: marking + id: UndergarmentTopTanktopVox + bodyPart: UndergarmentTop + markingCategory: UndergarmentTop + speciesRestriction: [Vox] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: tanktop_vox + +- type: marking + id: UndergarmentBottomBoxersReptilian + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Reptilian] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: boxers_reptilian + +- type: marking + id: UndergarmentBottomBriefsReptilian + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Reptilian] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: briefs_reptilian + +- type: marking + id: UndergarmentBottomSatinReptilian + bodyPart: UndergarmentBottom + markingCategory: UndergarmentBottom + speciesRestriction: [Reptilian] + coloring: + default: + type: null + fallbackColor: '#FFFFFF' + sprites: + - sprite: Mobs/Customization/undergarments.rsi + state: satin_reptilian diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 66cf7ccfab..5391aec03f 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -81,6 +81,8 @@ - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ] - map: ["jumpsuit"] - map: ["enum.HumanoidVisualLayers.LFoot"] - map: ["enum.HumanoidVisualLayers.RFoot"] diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 67fb5f2303..364bd743d9 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -19,6 +19,8 @@ - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ] - map: ["jumpsuit"] - map: ["enum.HumanoidVisualLayers.LFoot"] - map: ["enum.HumanoidVisualLayers.RFoot"] @@ -305,6 +307,8 @@ - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ] - map: ["jumpsuit"] - map: ["enum.HumanoidVisualLayers.LFoot"] - map: ["enum.HumanoidVisualLayers.RFoot"] diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 6d55596859..59e3d6a7a5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -83,6 +83,8 @@ - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ] - map: [ "jumpsuit" ] - map: [ "enum.HumanoidVisualLayers.LHand" ] - map: [ "enum.HumanoidVisualLayers.RHand" ] diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index f172f631c1..efa4660032 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -11,6 +11,7 @@ - Snout - HeadTop - HeadSide + undergarmentBottom: UndergarmentBottomBoxersReptilian - type: Hunger - type: Puller needsHands: false @@ -90,6 +91,7 @@ - Snout - HeadTop - HeadSide + undergarmentBottom: UndergarmentBottomBoxersReptilian - type: Inventory speciesId: reptilian femaleDisplacements: diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 50d224ec3b..8967e17574 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -11,8 +11,10 @@ - type: Body prototype: Vox requiredLegs: 2 - - type: HumanoidAppearance + - type: HumanoidAppearance species: Vox + undergarmentTop: UndergarmentTopTanktopVox + undergarmentBottom: UndergarmentBottomBoxersVox #- type: VoxAccent # Not yet coded - type: Speech speechVerb: Vox @@ -71,6 +73,8 @@ - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ] + - map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ] - map: [ "jumpsuit" ] - map: [ "enum.HumanoidVisualLayers.LFoot" ] - map: [ "enum.HumanoidVisualLayers.RFoot" ] @@ -150,6 +154,8 @@ components: - type: HumanoidAppearance species: Vox + undergarmentTop: UndergarmentTopTanktopVox + undergarmentBottom: UndergarmentBottomBoxersVox - type: Body prototype: Vox - type: Inventory diff --git a/Resources/Prototypes/Species/arachnid.yml b/Resources/Prototypes/Species/arachnid.yml index 07a72cda17..9786b1da2e 100644 --- a/Resources/Prototypes/Species/arachnid.yml +++ b/Resources/Prototypes/Species/arachnid.yml @@ -19,6 +19,8 @@ sprites: Head: MobArachnidHead Snout: MobHumanoidAnyMarking + UndergarmentTop: MobHumanoidAnyMarking + UndergarmentBottom: MobHumanoidAnyMarking Chest: MobArachnidTorso HeadTop: MobHumanoidAnyMarking HeadSide: MobHumanoidAnyMarking diff --git a/Resources/Prototypes/Species/diona.yml b/Resources/Prototypes/Species/diona.yml index 19fafaa3e1..e0ba53e99c 100644 --- a/Resources/Prototypes/Species/diona.yml +++ b/Resources/Prototypes/Species/diona.yml @@ -19,6 +19,8 @@ Head: MobDionaHead HeadTop: MobHumanoidAnyMarking HeadSide: MobHumanoidAnyMarking + UndergarmentTop: MobHumanoidAnyMarking + UndergarmentBottom: MobHumanoidAnyMarking Chest: MobDionaTorso Eyes: MobDionaEyes LArm: MobDionaLArm @@ -43,6 +45,12 @@ HeadSide: points: 1 required: false + UndergarmentTop: + points: 1 + required: false + UndergarmentBottom: + points: 1 + required: false Chest: points: 1 required: false diff --git a/Resources/Prototypes/Species/human.yml b/Resources/Prototypes/Species/human.yml index 2549529606..9c95d87dcf 100644 --- a/Resources/Prototypes/Species/human.yml +++ b/Resources/Prototypes/Species/human.yml @@ -22,6 +22,8 @@ Hair: MobHumanoidAnyMarking FacialHair: MobHumanoidAnyMarking Snout: MobHumanoidAnyMarking + UndergarmentTop: MobHumanoidAnyMarking + UndergarmentBottom: MobHumanoidAnyMarking Chest: MobHumanTorso Eyes: MobHumanoidEyes HeadTop: MobHumanoidAnyMarking @@ -55,6 +57,12 @@ HeadTop: points: 1 required: false + UndergarmentTop: + points: 1 + required: false + UndergarmentBottom: + points: 1 + required: false Chest: points: 1 required: false diff --git a/Resources/Prototypes/Species/moth.yml b/Resources/Prototypes/Species/moth.yml index 4f587eb40e..22a5b978f1 100644 --- a/Resources/Prototypes/Species/moth.yml +++ b/Resources/Prototypes/Species/moth.yml @@ -17,6 +17,8 @@ sprites: Head: MobMothHead Snout: MobHumanoidAnyMarking + UndergarmentTop: MobHumanoidAnyMarking + UndergarmentBottom: MobHumanoidAnyMarking Chest: MobMothTorso HeadTop: MobHumanoidAnyMarking HeadSide: MobHumanoidAnyMarking @@ -64,6 +66,12 @@ Head: points: 1 required: false + UndergarmentTop: + points: 1 + required: false + UndergarmentBottom: + points: 1 + required: false Chest: points: 1 required: false diff --git a/Resources/Prototypes/Species/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml index 321e01cfe7..18d43a5906 100644 --- a/Resources/Prototypes/Species/reptilian.yml +++ b/Resources/Prototypes/Species/reptilian.yml @@ -17,6 +17,8 @@ sprites: Head: MobReptilianHead Snout: MobHumanoidAnyMarking + UndergarmentTop: MobHumanoidAnyMarking + UndergarmentBottom: MobHumanoidAnyMarking Chest: MobReptilianTorso HeadTop: MobHumanoidAnyMarking HeadSide: MobHumanoidAnyMarking @@ -55,6 +57,12 @@ HeadSide: points: 1 required: false + UndergarmentTop: + points: 1 + required: false + UndergarmentBottom: + points: 1 + required: false Chest: points: 3 required: false diff --git a/Resources/Prototypes/Species/slime.yml b/Resources/Prototypes/Species/slime.yml index 8c42b4d7bf..5fd4a0f81e 100644 --- a/Resources/Prototypes/Species/slime.yml +++ b/Resources/Prototypes/Species/slime.yml @@ -15,6 +15,8 @@ Head: MobSlimeHead Hair: MobSlimeMarkingFollowSkin FacialHair: MobSlimeMarkingFollowSkin + UndergarmentTop: MobHumanoidAnyMarking + UndergarmentBottom: MobHumanoidAnyMarking Chest: MobSlimeTorso Eyes: MobHumanoidEyes LArm: MobSlimeLArm diff --git a/Resources/Prototypes/Species/vox.yml b/Resources/Prototypes/Species/vox.yml index 7419f3f277..29cc0583fc 100644 --- a/Resources/Prototypes/Species/vox.yml +++ b/Resources/Prototypes/Species/vox.yml @@ -21,6 +21,8 @@ Snout: MobHumanoidAnyMarking Hair: MobHumanoidAnyMarking FacialHair: MobHumanoidAnyMarking + UndergarmentTop: MobHumanoidAnyMarking + UndergarmentBottom: MobHumanoidAnyMarking Chest: MobVoxTorso Eyes: MobVoxEyes LArm: MobVoxLArm @@ -58,6 +60,12 @@ points: 4 required: true defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ] + UndergarmentTop: + points: 1 + required: false + UndergarmentBottom: + points: 1 + required: false Chest: points: 1 required: false diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/binder.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/binder.png new file mode 100644 index 0000000000..e5a5a6c8d4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/binder.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/binder_vox.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/binder_vox.png new file mode 100644 index 0000000000..e318b9925f Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/binder_vox.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers.png new file mode 100644 index 0000000000..f7aadbe9eb Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_reptilian.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_reptilian.png new file mode 100644 index 0000000000..2b851f456c Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_reptilian.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_vox.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_vox.png new file mode 100644 index 0000000000..c838e8f652 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_vox.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs.png new file mode 100644 index 0000000000..4874810d99 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_reptilian.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_reptilian.png new file mode 100644 index 0000000000..09e9d5fb11 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_reptilian.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_vox.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_vox.png new file mode 100644 index 0000000000..11e2744caf Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_vox.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/classic.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/classic.png new file mode 100644 index 0000000000..d6b987b8d1 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/classic.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/classic_vox.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/classic_vox.png new file mode 100644 index 0000000000..2323e31253 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/classic_vox.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/meta.json b/Resources/Textures/Mobs/Customization/undergarments.rsi/meta.json new file mode 100644 index 0000000000..345c141ccd --- /dev/null +++ b/Resources/Textures/Mobs/Customization/undergarments.rsi/meta.json @@ -0,0 +1,79 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "sprites taken from https://github.com/cmss13-devs/cmss13/blob/884ab172389b6fc54ef063f5fbea5e8b0a0a2235/icons/mob/humans/underwear.dmi and https://github.com/cmss13-devs/cmss13/blob/884ab172389b6fc54ef063f5fbea5e8b0a0a2235/icons/mob/humans/undershirt.dmi, edited by SlamBamActionman", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "briefs", + "directions": 4 + }, + { + "name": "satin", + "directions": 4 + }, + { + "name": "boxers", + "directions": 4 + }, + { + "name": "classic", + "directions": 4 + }, + { + "name": "sports", + "directions": 4 + }, + { + "name": "binder", + "directions": 4 + }, + { + "name": "tanktop", + "directions": 4 + }, + { + "name": "briefs_vox", + "directions": 4 + }, + { + "name": "satin_vox", + "directions": 4 + }, + { + "name": "boxers_vox", + "directions": 4 + }, + { + "name": "classic_vox", + "directions": 4 + }, + { + "name": "sports_vox", + "directions": 4 + }, + { + "name": "binder_vox", + "directions": 4 + }, + { + "name": "tanktop_vox", + "directions": 4 + }, + { + "name": "briefs_reptilian", + "directions": 4 + }, + { + "name": "satin_reptilian", + "directions": 4 + }, + { + "name": "boxers_reptilian", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/satin.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/satin.png new file mode 100644 index 0000000000..3e1e6ec3ab Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/satin.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/satin_reptilian.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/satin_reptilian.png new file mode 100644 index 0000000000..0bf4b58867 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/satin_reptilian.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/satin_vox.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/satin_vox.png new file mode 100644 index 0000000000..e4c1178ab6 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/satin_vox.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/sports.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/sports.png new file mode 100644 index 0000000000..529565f40a Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/sports.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/sports_vox.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/sports_vox.png new file mode 100644 index 0000000000..f95ec114f2 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/sports_vox.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop.png new file mode 100644 index 0000000000..2e4e4d48c8 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop.png differ diff --git a/Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop_vox.png b/Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop_vox.png new file mode 100644 index 0000000000..0a7c4e1c02 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop_vox.png differ