diff --git a/Content.Server/FloofStation/InteractionVerbs/Actions/ToggleLayersAction.cs b/Content.Server/FloofStation/InteractionVerbs/Actions/ToggleLayersAction.cs
new file mode 100644
index 00000000000..bd80cd52436
--- /dev/null
+++ b/Content.Server/FloofStation/InteractionVerbs/Actions/ToggleLayersAction.cs
@@ -0,0 +1,47 @@
+using Content.Server.Humanoid;
+using Content.Shared.Humanoid;
+using Content.Shared.Humanoid.Markings;
+using Content.Shared.InteractionVerbs;
+
+namespace Content.Server.FloofStation.InteractionVerbs.Actions;
+
+///
+/// Toggles a humanoid visual layer.
+///
+[Serializable]
+public sealed partial class ToggleLayersAction : InteractionAction
+{
+ [DataField]
+ public HumanoidVisualLayers? NeededMarkingCategory;
+
+ [DataField]
+ public HashSet ToggleLayers;
+
+ public override bool CanPerform(InteractionArgs args, InteractionVerbPrototype proto, bool isBefore, VerbDependencies deps)
+ {
+ if (NeededMarkingCategory == null)
+ return true;
+
+ var markingCategory = MarkingCategoriesConversion.FromHumanoidVisualLayers(NeededMarkingCategory.Value);
+
+ return deps.EntMan.TryGetComponent(args.Target, out HumanoidAppearanceComponent? bodyAppearance)
+ && bodyAppearance.MarkingSet.Markings.TryGetValue(markingCategory, out var markingList)
+ && markingList.Count > 0; // Check if at least one entry exists
+ }
+
+ public override bool Perform(InteractionArgs args, InteractionVerbPrototype proto, VerbDependencies deps)
+ {
+ if (deps.EntMan.TryGetComponent(args.Target, out var humanoidAppearance))
+ {
+ foreach (HumanoidVisualLayers layer in ToggleLayers)
+ {
+ deps.EntMan.System().SetLayerVisibility(
+ args.Target,
+ layer, humanoidAppearance.HiddenLayers.Contains(layer)
+ );
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/Content.Shared/Floofstation/InteractionVerbs/Requirements/ClothingSlotBlacklistRequirement.cs b/Content.Shared/Floofstation/InteractionVerbs/Requirements/ClothingSlotBlacklistRequirement.cs
new file mode 100644
index 00000000000..befc4e35174
--- /dev/null
+++ b/Content.Shared/Floofstation/InteractionVerbs/Requirements/ClothingSlotBlacklistRequirement.cs
@@ -0,0 +1,20 @@
+using Content.Shared.InteractionVerbs;
+using Content.Shared.Inventory;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Floofstation.InteractionVerbs.Requirements;
+
+
+///
+/// Requires a mob to not be wearing anything in this slot.
+///
+[Serializable, NetSerializable]
+public sealed partial class ClothingSlotBlacklistRequirement : InvertableInteractionRequirement
+{
+ [DataField] public string Slot;
+
+ public override bool IsMet(InteractionArgs args, InteractionVerbPrototype proto, InteractionAction.VerbDependencies deps)
+ {
+ return !deps.EntMan.System().TryGetSlotEntity(args.Target, Slot, out _);
+ }
+}
diff --git a/Content.Shared/Humanoid/HumanoidVisualLayers.cs b/Content.Shared/Humanoid/HumanoidVisualLayers.cs
index 8a2353d270e..3aa3f767057 100644
--- a/Content.Shared/Humanoid/HumanoidVisualLayers.cs
+++ b/Content.Shared/Humanoid/HumanoidVisualLayers.cs
@@ -11,6 +11,8 @@ public enum HumanoidVisualLayers : byte
Hair,
FacialHair,
Chest,
+ Underwear, // Floof, add underwear
+ Undershirt, // Floof, add underwear
Head,
Snout,
HeadSide, // side parts (i.e., frills)
diff --git a/Content.Shared/Humanoid/Markings/MarkingCategories.cs b/Content.Shared/Humanoid/Markings/MarkingCategories.cs
index 324c5463823..9e71da6764f 100644
--- a/Content.Shared/Humanoid/Markings/MarkingCategories.cs
+++ b/Content.Shared/Humanoid/Markings/MarkingCategories.cs
@@ -12,6 +12,8 @@ public enum MarkingCategories : byte
HeadSide,
Snout,
Chest,
+ Underwear, // Floof, add underwear
+ Undershirt, // Floof, add underwear
RightArm,
RightHand,
LeftArm,
@@ -38,6 +40,8 @@ public static MarkingCategories FromHumanoidVisualLayers(HumanoidVisualLayers la
HumanoidVisualLayers.HeadSide => MarkingCategories.HeadSide,
HumanoidVisualLayers.Snout => MarkingCategories.Snout,
HumanoidVisualLayers.Chest => MarkingCategories.Chest,
+ HumanoidVisualLayers.Underwear => MarkingCategories.Underwear, // Floof, add underwear
+ HumanoidVisualLayers.Undershirt => MarkingCategories.Undershirt, // Floof, add underwear
HumanoidVisualLayers.RArm => MarkingCategories.RightArm,
HumanoidVisualLayers.LArm => MarkingCategories.LeftArm,
HumanoidVisualLayers.RHand => MarkingCategories.RightHand,
diff --git a/Resources/Locale/en-US/Floof/interaction/verbs/underwear.ftl b/Resources/Locale/en-US/Floof/interaction/verbs/underwear.ftl
new file mode 100644
index 00000000000..819ef8eb96b
--- /dev/null
+++ b/Resources/Locale/en-US/Floof/interaction/verbs/underwear.ftl
@@ -0,0 +1,19 @@
+interaction-ToggleUndershirt-name = Toggle undershirt
+interaction-ToggleUndershirt-description = Toggle the undershirt of this person!
+
+interaction-ToggleUndershirt-success-self-popup = You toggle {THE($target)}'s undershirt.
+interaction-ToggleUndershirt-success-target-popup = {THE($user)} toggles your undershirt!
+interaction-ToggleUndershirt-fail-self-popup = You fail to toggle the undershirt.
+
+interaction-ToggleUndershirt-delayed-self-popup = You try to toggle {THE($target)}'s undershirt.
+interaction-ToggleUndershirt-delayed-target-popup = {THE($user)} is trying to toggle your undershirt!
+
+interaction-ToggleUnderwear-name = Toggle underwear
+interaction-ToggleUnderwear-description = Toggle the underwear of this person!
+
+interaction-ToggleUnderwear-success-self-popup = You toggle {THE($target)}'s underwear.
+interaction-ToggleUnderwear-success-target-popup = {THE($user)} toggles your underwear!
+interaction-ToggleUnderwear-fail-self-popup = You fail to toggle the underwear.
+
+interaction-ToggleUnderwear-delayed-self-popup = You try to toggle {THE($target)}'s underwear.
+interaction-ToggleUnderwear-delayed-target-popup = {THE($user)} is trying to toggle your underwear!
diff --git a/Resources/Locale/en-US/Floof/markings/underwear.ftl b/Resources/Locale/en-US/Floof/markings/underwear.ftl
new file mode 100644
index 00000000000..2caf959e76e
--- /dev/null
+++ b/Resources/Locale/en-US/Floof/markings/underwear.ftl
@@ -0,0 +1,41 @@
+markings-category-Undershirt = Undershirt
+markings-category-Underwear = Underwear
+
+marking-UndershirtStandard = Undershirt (Standard)
+marking-UndershirtStandard-t_undershirt = Undershirt
+
+marking-UndershirtSleeveless = Undershirt (Sleeveless)
+marking-UndershirtSleeveless-t_undershirt_sleeveless = Undershirt
+
+marking-UndershirtRolled = Undershirt (Rolled)
+marking-UndershirtRolled-t_rolled_undershirt = Undershirt
+
+marking-UndershirtRolledSleeveless = Undershirt (Sleeveless Rolled)
+marking-UndershirtRolledSleeveless-t_rolled_undershirt_sleeveless = Undershirt
+
+marking-UndershirtLong = Undershirt (Long)
+marking-UndershirtLong-t_long_undershirt = Undershirt
+
+marking-UndershirtClassic = Bra (Classic)
+marking-UndershirtClassic-snow_classic = Bra
+
+marking-UndershirtSports = Bra (Sport)
+marking-UndershirtSports-snow_sports = Bra
+
+marking-UndershirtStrapless = Bra (Strapless)
+marking-UndershirtStrapless-snow_strapless = Bra
+
+marking-UnderwearBoxers = Boxers
+marking-UnderwearBoxers-snow_boxers = Boxers
+
+marking-UnderwearBriefs = Briefs
+marking-UnderwearBriefs-snow_briefs = Briefs
+
+marking-UnderwearLowriders = Lowrides
+marking-UnderwearLowriders-snow_lowriders = Lowrides
+
+marking-UnderwearSatin = Satin
+marking-UnderwearSatin-snow_satin = Satin
+
+marking-UnderwearTanga = Tanga
+marking-UnderwearTanga-snow_tanga = Tanga
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/rodentia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/rodentia.yml
index b82d6cad014..577d7b78d93 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/rodentia.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/rodentia.yml
@@ -42,6 +42,8 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ]
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ]
- map: [ "jumpsuit" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml
index 51641dd0182..d4278a44819 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml
@@ -33,6 +33,8 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ]
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ]
- map: [ "jumpsuit" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
diff --git a/Resources/Prototypes/DeltaV/Species/rodentia.yml b/Resources/Prototypes/DeltaV/Species/rodentia.yml
index 57c9cd89346..b7caa49cfbd 100644
--- a/Resources/Prototypes/DeltaV/Species/rodentia.yml
+++ b/Resources/Prototypes/DeltaV/Species/rodentia.yml
@@ -28,6 +28,8 @@
FacialHair: MobHumanoidAnyMarking
Snout: MobHumanoidAnyMarking
Chest: MobRodentiaTorso
+ Underwear: MobHumanoidAnyMarking
+ Undershirt: MobHumanoidAnyMarking
HeadTop: MobHumanoidAnyMarking
HeadSide: MobHumanoidAnyMarking
Tail: MobHumanoidAnyMarking
@@ -45,6 +47,13 @@
- type: markingPoints
id: MobRodentiaMarkingLimits
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ]
+ Undershirt:
+ points: 1
+ required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml
index 520485ba9d4..9b4c356770f 100644
--- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml
+++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml
@@ -21,6 +21,8 @@
FacialHair: MobHumanoidAnyMarking
Snout: MobHumanoidAnyMarking
Chest: MobVulpkaninTorso
+ Underwear: MobHumanoidAnyMarking
+ Undershirt: MobHumanoidAnyMarking
HeadTop: MobHumanoidAnyMarking
HeadSide: MobHumanoidAnyMarking
Tail: MobHumanoidAnyMarking
@@ -38,6 +40,13 @@
- type: markingPoints
id: MobVulpkaninMarkingLimits
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ]
+ Undershirt:
+ points: 1
+ required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml
index ab4fba96311..fa8d6550f5f 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml
@@ -34,6 +34,8 @@
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_arm
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Floof, add underwear
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Floof, add underwear
- map: [ "jumpsuit" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
color: "#e8b59b"
diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
index e357f573f1e..7153fa8842a 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
@@ -92,6 +92,8 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Floof, add underwear
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Floof, add underwear
- 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 02d3355b325..95b9cd7309d 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -17,6 +17,8 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Floof, add underwear
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Floof, add underwear
- map: ["jumpsuit"]
- map: ["enum.HumanoidVisualLayers.LFoot"]
- map: ["enum.HumanoidVisualLayers.RFoot"]
@@ -349,6 +351,8 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - map: ["enum.HumanoidVisualLayers.Undershirt"] # Floof, add underwear
+ - map: ["enum.HumanoidVisualLayers.Underwear"] # Floof, add underwear
- shader: StencilClear
sprite: Mobs/Species/Human/parts.rsi
state: l_leg
diff --git a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml
index b3fcd565c4b..2105586b0f0 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml
@@ -24,6 +24,8 @@
- map: [ "underpants" ]
- map: [ "undershirt" ]
- map: [ "socks" ]
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Floof, add underwear
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Floof, add underwear
- 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 b9ce75978a8..d1f86f339a2 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml
@@ -80,6 +80,8 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Floof, add underwear
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Floof, add underwear
- map: [ "jumpsuit" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
diff --git a/Resources/Prototypes/Entities/Mobs/Species/shadowkin.yml b/Resources/Prototypes/Entities/Mobs/Species/shadowkin.yml
index 71dabd42ab6..ea8053ff8d3 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/shadowkin.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/shadowkin.yml
@@ -160,6 +160,8 @@
- map: ["enum.HumanoidVisualLayers.LFoot"]
- map: ["enum.HumanoidVisualLayers.RFoot"]
- map: ["socks"]
+ - map: [ "enum.HumanoidVisualLayers.Underwear" ] # Floof, add underwear
+ - map: [ "enum.HumanoidVisualLayers.Undershirt" ] # Floof, add underwear
- map: ["underpants"]
- map: ["undershirt"]
- map: ["jumpsuit"]
diff --git a/Resources/Prototypes/Floof/Entities/Mobs/Customization/Markings/undershirt.yml b/Resources/Prototypes/Floof/Entities/Mobs/Customization/Markings/undershirt.yml
new file mode 100644
index 00000000000..38e2da8be3a
--- /dev/null
+++ b/Resources/Prototypes/Floof/Entities/Mobs/Customization/Markings/undershirt.yml
@@ -0,0 +1,111 @@
+- type: marking
+ id: UndershirtStandard
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: t_undershirt
+
+- type: marking
+ id: UndershirtSleeveless
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: t_undershirt_sleeveless
+
+- type: marking
+ id: UndershirtRolled
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: t_rolled_undershirt
+
+- type: marking
+ id: UndershirtRolledSleeveless
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: t_rolled_undershirt_sleeveless
+
+- type: marking
+ id: UndershirtLong
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: t_long_undershirt
+
+- type: marking
+ id: UndershirtClassic
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: snow_bra
+
+- type: marking
+ id: UndershirtSports
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: snow_sports
+
+- type: marking
+ id: UndershirtStrapless
+ bodyPart: Undershirt
+ markingCategory: Undershirt
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/undershirt.rsi
+ state: snow_strapless
diff --git a/Resources/Prototypes/Floof/Entities/Mobs/Customization/Markings/underwear.yml b/Resources/Prototypes/Floof/Entities/Mobs/Customization/Markings/underwear.yml
new file mode 100644
index 00000000000..5b9b8cee2c2
--- /dev/null
+++ b/Resources/Prototypes/Floof/Entities/Mobs/Customization/Markings/underwear.yml
@@ -0,0 +1,69 @@
+- type: marking
+ id: UnderwearBoxers
+ bodyPart: Underwear
+ markingCategory: Underwear
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/underwear.rsi
+ state: snow_boxers
+
+- type: marking
+ id: UnderwearLowriders
+ bodyPart: Underwear
+ markingCategory: Underwear
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/underwear.rsi
+ state: snow_lowriders
+
+- type: marking
+ id: UnderwearBriefs
+ bodyPart: Underwear
+ markingCategory: Underwear
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/underwear.rsi
+ state: snow_briefs
+
+- type: marking
+ id: UnderwearSatin
+ bodyPart: Underwear
+ markingCategory: Underwear
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/underwear.rsi
+ state: snow_satin
+
+- type: marking
+ id: UnderwearTanga
+ bodyPart: Underwear
+ markingCategory: Underwear
+ speciesRestriction: [Shadowkin, Diona, Arachnid, Reptilian, Moth, SlimePerson, Resomi, Rodentia, Human, Rodentia, Felinid, Oni, Vulpkanin, Harpy]
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Floof/Mobs/Customization/underwear.rsi
+ state: snow_tanga
diff --git a/Resources/Prototypes/Floof/Interactions/underwear_interactions.yml b/Resources/Prototypes/Floof/Interactions/underwear_interactions.yml
new file mode 100644
index 00000000000..c990aa5996e
--- /dev/null
+++ b/Resources/Prototypes/Floof/Interactions/underwear_interactions.yml
@@ -0,0 +1,39 @@
+- type: Interaction
+ parent: [BaseGlobal, BaseHands]
+ id: ToggleUndershirt
+ priority: -11
+ delay: 3
+ allowSelfInteract: true
+ hideByRequirement: true
+ requirement:
+ !type:ComplexRequirement
+ requirements:
+ - !type:EntityWhitelistRequirement
+ whitelist:
+ components: [HumanoidAppearance]
+ - !type:ClothingSlotBlacklistRequirement
+ slot: jumpsuit
+ effectSuccess:
+ popup: Obvious
+ sound: {path: /Audio/Effects/thudswoosh.ogg}
+ soundPerceivedByOthers: false
+ action:
+ !type:ToggleLayersAction
+ neededMarkingCategory: Undershirt
+ toggleLayers:
+ - Undershirt
+
+- type: Interaction
+ parent: ToggleUndershirt
+ id: ToggleUnderwear
+ priority: -12
+ delay: 2.2
+ effectSuccess:
+ popup: Obvious
+ sound: {path: /Audio/Effects/thudswoosh.ogg}
+ soundPerceivedByOthers: false
+ action:
+ !type:ToggleLayersAction
+ neededMarkingCategory: Underwear
+ toggleLayers:
+ - Underwear
diff --git a/Resources/Prototypes/Species/arachne.yml b/Resources/Prototypes/Species/arachne.yml
index 7daf122a197..04e9fa634eb 100644
--- a/Resources/Prototypes/Species/arachne.yml
+++ b/Resources/Prototypes/Species/arachne.yml
@@ -18,6 +18,9 @@
- type: markingPoints
id: MobArachneMarkingLimits
points:
+ Undershirt:
+ points: 1
+ required: false # Floof, add underwear
Hair:
points: 1
required: false
@@ -59,6 +62,8 @@
Head: MobHumanHead
Hair: MobHumanoidAnyMarking
Chest: MobHumanTorso
+ Underwear: MobHumanoidAnyMarking
+ Undershirt: MobHumanoidAnyMarking
Eyes: MobArachneEyes
LArm: MobHumanLArm
RArm: MobHumanRArm
diff --git a/Resources/Prototypes/Species/arachnid.yml b/Resources/Prototypes/Species/arachnid.yml
index a7965370639..66e9b3aacc0 100644
--- a/Resources/Prototypes/Species/arachnid.yml
+++ b/Resources/Prototypes/Species/arachnid.yml
@@ -21,6 +21,8 @@
Head: MobArachnidHead
Snout: MobHumanoidAnyMarking
Chest: MobArachnidTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
HeadTop: MobHumanoidAnyMarking
HeadSide: MobHumanoidAnyMarking
Tail: MobHumanoidAnyMarking
@@ -45,6 +47,13 @@
id: MobArachnidMarkingLimits
onlyWhitelisted: true
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1
+ required: false # Floof, add underwear
Hair:
points: 0
required: false
diff --git a/Resources/Prototypes/Species/diona.yml b/Resources/Prototypes/Species/diona.yml
index 2edd329103e..689b57018f5 100644
--- a/Resources/Prototypes/Species/diona.yml
+++ b/Resources/Prototypes/Species/diona.yml
@@ -21,6 +21,8 @@
HeadTop: MobHumanoidAnyMarking
HeadSide: MobHumanoidAnyMarking
Chest: MobDionaTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
Eyes: MobDionaEyes
LArm: MobDionaLArm
RArm: MobDionaRArm
@@ -37,6 +39,13 @@
id: MobDionaMarkingLimits
onlyWhitelisted: true
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1
+ required: false # Floof, add underwear
Head:
points: 2
required: false
diff --git a/Resources/Prototypes/Species/harpy.yml b/Resources/Prototypes/Species/harpy.yml
index bb6e04fe372..55676f30d3f 100644
--- a/Resources/Prototypes/Species/harpy.yml
+++ b/Resources/Prototypes/Species/harpy.yml
@@ -23,6 +23,8 @@
FacialHair: MobHumanoidAnyMarking
Snout: MobHumanoidAnyMarking
Chest: MobHarpyTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
HeadTop: MobHumanoidAnyMarking
HeadSide: MobHumanoidAnyMarking
Tail: MobHumanoidAnyMarking
@@ -41,6 +43,13 @@
- type: markingPoints
id: MobHarpyMarkingLimits
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1 # Floof, add underwear
+ required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Species/human.yml b/Resources/Prototypes/Species/human.yml
index 012fc4ba42d..88433dedf6d 100644
--- a/Resources/Prototypes/Species/human.yml
+++ b/Resources/Prototypes/Species/human.yml
@@ -23,6 +23,8 @@
FacialHair: MobHumanoidAnyMarking
Snout: MobHumanoidAnyMarking
Chest: MobHumanTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
Eyes: MobHumanoidEyes
LArm: MobHumanLArm
RArm: MobHumanRArm
@@ -40,6 +42,13 @@
- type: markingPoints
id: MobHumanMarkingLimits
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1
+ required: false # Floof, add underwear
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Species/ipc.yml b/Resources/Prototypes/Species/ipc.yml
index afebc7be190..10003dd2ad2 100644
--- a/Resources/Prototypes/Species/ipc.yml
+++ b/Resources/Prototypes/Species/ipc.yml
@@ -35,6 +35,8 @@
Wings: MobHumanoidAnyMarking
Hair: MobHumanoidMarkingMatchSkin
Chest: MobIPCTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
LArm: MobIPCLArm
RArm: MobIPCRArm
LHand: MobIPCLHand
diff --git a/Resources/Prototypes/Species/moth.yml b/Resources/Prototypes/Species/moth.yml
index 23dc9a98772..7254d605ced 100644
--- a/Resources/Prototypes/Species/moth.yml
+++ b/Resources/Prototypes/Species/moth.yml
@@ -19,6 +19,8 @@
Head: MobMothHead
Snout: MobHumanoidAnyMarking
Chest: MobMothTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
HeadTop: MobHumanoidAnyMarking
HeadSide: MobHumanoidAnyMarking
Tail: MobHumanoidAnyMarking
@@ -42,6 +44,13 @@
id: MobMothMarkingLimits
onlyWhitelisted: true
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1 # Floof, add underwear
+ required: false
Hair:
points: 0
required: false
diff --git a/Resources/Prototypes/Species/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml
index 0cfd6d89456..29d3270c463 100644
--- a/Resources/Prototypes/Species/reptilian.yml
+++ b/Resources/Prototypes/Species/reptilian.yml
@@ -25,6 +25,8 @@
Head: MobReptilianHead
Snout: MobHumanoidAnyMarking
Chest: MobReptilianTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
HeadTop: MobHumanoidAnyMarking
HeadSide: MobHumanoidAnyMarking
Tail: MobHumanoidAnyMarking
@@ -43,6 +45,13 @@
id: MobReptilianMarkingLimits
onlyWhitelisted: true
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1 # Floof, add underwear
+ required: false
Hair:
points: 0
required: false
diff --git a/Resources/Prototypes/Species/shadowkin.yml b/Resources/Prototypes/Species/shadowkin.yml
index 7cbd752092f..dc6d23ef0b2 100644
--- a/Resources/Prototypes/Species/shadowkin.yml
+++ b/Resources/Prototypes/Species/shadowkin.yml
@@ -35,6 +35,8 @@
HeadSide: MobShadowkinAnyMarkingFollowSkin
Tail: MobShadowkinAnyMarkingFollowSkin
Chest: MobShadowkinTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
Eyes: MobShadowkinEyes
LArm: MobShadowkinLArm
RArm: MobShadowkinRArm
@@ -48,6 +50,13 @@
- type: markingPoints
id: MobShadowkinMarkingLimits
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1
+ required: false # Floof, add underwear
Tail:
points: 1
required: true
diff --git a/Resources/Prototypes/Species/skeleton.yml b/Resources/Prototypes/Species/skeleton.yml
index 1f2a95e9918..4c4066e18f1 100644
--- a/Resources/Prototypes/Species/skeleton.yml
+++ b/Resources/Prototypes/Species/skeleton.yml
@@ -16,6 +16,8 @@
sprites:
Head: MobSkeletonHead
Chest: MobSkeletonTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
LArm: MobSkeletonLArm
RArm: MobSkeletonRArm
LHand: MobSkeletonLHand
diff --git a/Resources/Prototypes/Species/slime.yml b/Resources/Prototypes/Species/slime.yml
index f7b8adf2eff..60c36c6fdc0 100644
--- a/Resources/Prototypes/Species/slime.yml
+++ b/Resources/Prototypes/Species/slime.yml
@@ -18,6 +18,8 @@
FacialHair: MobSlimeMarkingFollowSkin
Snout: MobSlimeMarkingFollowSkin
Chest: MobSlimeTorso
+ Underwear: MobHumanoidAnyMarking # Floof, add underwear
+ Undershirt: MobHumanoidAnyMarking # Floof, add underwear
HeadTop: MobSlimeMarkingFollowSkin
HeadSide: MobSlimeMarkingFollowSkin
Tail: MobSlimeMarkingFollowSkin
@@ -35,6 +37,13 @@
- type: markingPoints
id: MobSlimeMarkingLimits
points:
+ Underwear:
+ points: 1
+ required: true
+ defaultMarkings: [ UnderwearBoxers ] # Floof, add underwear
+ Undershirt:
+ points: 1
+ required: false # Floof, add underwear
Hair:
points: 1
required: false
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/meta.json b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/meta.json
new file mode 100644
index 00000000000..a26b06084a8
--- /dev/null
+++ b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/meta.json
@@ -0,0 +1,43 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken and modified from cmss13 at https://github.com/cmss13-devs/cmss13/blob/884ab172389b6fc54ef063f5fbea5e8b0a0a2235/icons/mob/humans/undershirt.dmi",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "t_undershirt",
+ "directions": 4
+ },
+ {
+ "name": "t_undershirt_sleeveless",
+ "directions": 4
+ },
+ {
+ "name": "t_rolled_undershirt",
+ "directions": 4
+ },
+ {
+ "name": "t_rolled_undershirt_sleeveless",
+ "directions": 4
+ },
+ {
+ "name": "t_long_undershirt",
+ "directions": 4
+ },
+ {
+ "name": "snow_bra",
+ "directions": 4
+ },
+ {
+ "name": "snow_sports",
+ "directions": 4
+ },
+ {
+ "name": "snow_strapless",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_bra.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_bra.png
new file mode 100644
index 00000000000..5e1231602f6
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_bra.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_sports.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_sports.png
new file mode 100644
index 00000000000..65bbeaefce9
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_sports.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_strapless.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_strapless.png
new file mode 100644
index 00000000000..b27b44860e3
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/snow_strapless.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_long_undershirt.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_long_undershirt.png
new file mode 100644
index 00000000000..3e16fc0a532
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_long_undershirt.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_rolled_undershirt.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_rolled_undershirt.png
new file mode 100644
index 00000000000..786eb63f4d7
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_rolled_undershirt.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_rolled_undershirt_sleeveless.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_rolled_undershirt_sleeveless.png
new file mode 100644
index 00000000000..59d93e8ef73
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_rolled_undershirt_sleeveless.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_undershirt.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_undershirt.png
new file mode 100644
index 00000000000..9e953adc767
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_undershirt.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_undershirt_sleeveless.png b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_undershirt_sleeveless.png
new file mode 100644
index 00000000000..96432de20d7
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/undershirt.rsi/t_undershirt_sleeveless.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/meta.json b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/meta.json
new file mode 100644
index 00000000000..78d8f7eab41
--- /dev/null
+++ b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/meta.json
@@ -0,0 +1,31 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Take from https://github.com/cmss13-devs/cmss13/blob/884ab172389b6fc54ef063f5fbea5e8b0a0a2235/icons/mob/humans/underwear.dmi",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "snow_boxers",
+ "directions": 4
+ },
+ {
+ "name": "snow_lowriders",
+ "directions": 4
+ },
+ {
+ "name": "snow_briefs",
+ "directions": 4
+ },
+ {
+ "name": "snow_satin",
+ "directions": 4
+ },
+ {
+ "name": "snow_tanga",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_boxers.png b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_boxers.png
new file mode 100644
index 00000000000..e49b8b72773
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_boxers.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_briefs.png b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_briefs.png
new file mode 100644
index 00000000000..2eab274ab7e
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_briefs.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_lowriders.png b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_lowriders.png
new file mode 100644
index 00000000000..7bf2266a04f
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_lowriders.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_satin.png b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_satin.png
new file mode 100644
index 00000000000..e7939ebc756
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_satin.png differ
diff --git a/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_tanga.png b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_tanga.png
new file mode 100644
index 00000000000..0b6d238079b
Binary files /dev/null and b/Resources/Textures/Floof/Mobs/Customization/underwear.rsi/snow_tanga.png differ