Add undergarments & "Censor Nudity" toggle to options (#33185)
* Initial commit * Attribution * Review changes * Added comment for upstream
@@ -1,8 +1,10 @@
|
|||||||
|
using Content.Shared.CCVar;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
using Content.Shared.Humanoid.Markings;
|
using Content.Shared.Humanoid.Markings;
|
||||||
using Content.Shared.Humanoid.Prototypes;
|
using Content.Shared.Humanoid.Prototypes;
|
||||||
using Content.Shared.Preferences;
|
using Content.Shared.Preferences;
|
||||||
using Robust.Client.GameObjects;
|
using Robust.Client.GameObjects;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
@@ -12,12 +14,15 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
[Dependency] private readonly MarkingManager _markingManager = default!;
|
[Dependency] private readonly MarkingManager _markingManager = default!;
|
||||||
|
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
SubscribeLocalEvent<HumanoidAppearanceComponent, AfterAutoHandleStateEvent>(OnHandleState);
|
SubscribeLocalEvent<HumanoidAppearanceComponent, AfterAutoHandleStateEvent>(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)
|
private void OnHandleState(EntityUid uid, HumanoidAppearanceComponent component, ref AfterAutoHandleStateEvent args)
|
||||||
@@ -25,6 +30,15 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
|||||||
UpdateSprite(component, Comp<SpriteComponent>(uid));
|
UpdateSprite(component, Comp<SpriteComponent>(uid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnCvarChanged(bool value)
|
||||||
|
{
|
||||||
|
var humanoidQuery = EntityManager.AllEntityQueryEnumerator<HumanoidAppearanceComponent, SpriteComponent>();
|
||||||
|
while (humanoidQuery.MoveNext(out var _, out var humanoidComp, out var spriteComp))
|
||||||
|
{
|
||||||
|
UpdateSprite(humanoidComp, spriteComp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void UpdateSprite(HumanoidAppearanceComponent component, SpriteComponent sprite)
|
private void UpdateSprite(HumanoidAppearanceComponent component, SpriteComponent sprite)
|
||||||
{
|
{
|
||||||
UpdateLayers(component, sprite);
|
UpdateLayers(component, sprite);
|
||||||
@@ -207,16 +221,30 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
|||||||
// Really, markings should probably be a separate component altogether.
|
// Really, markings should probably be a separate component altogether.
|
||||||
ClearAllMarkings(humanoid, sprite);
|
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 markingList in humanoid.MarkingSet.Markings.Values)
|
||||||
{
|
{
|
||||||
foreach (var marking in markingList)
|
foreach (var marking in markingList)
|
||||||
{
|
{
|
||||||
if (_markingManager.TryGetMarking(marking, out var markingPrototype))
|
if (_markingManager.TryGetMarking(marking, out var markingPrototype))
|
||||||
|
{
|
||||||
ApplyMarking(markingPrototype, marking.MarkingColors, marking.Visible, humanoid, sprite);
|
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);
|
humanoid.ClientOldMarkings = new MarkingSet(humanoid.MarkingSet);
|
||||||
|
|
||||||
|
AddUndergarments(humanoid, sprite, applyUndergarmentTop, applyUndergarmentBottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteComponent sprite)
|
private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteComponent sprite)
|
||||||
@@ -264,6 +292,31 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
|||||||
spriteComp.RemoveLayer(index);
|
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<Color> { 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>{ marking });
|
||||||
|
ApplyMarking(prototype, null, true, humanoid, sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (undergarmentBottom && humanoid.UndergarmentBottom != null)
|
||||||
|
{
|
||||||
|
var marking = new Marking(humanoid.UndergarmentBottom, new List<Color> { new Color() });
|
||||||
|
if (_markingManager.TryGetMarking(marking, out var prototype))
|
||||||
|
{
|
||||||
|
humanoid.ClientOldMarkings.Markings.Add(MarkingCategories.UndergarmentBottom, new List<Marking>{ marking });
|
||||||
|
ApplyMarking(prototype, null, true, humanoid, sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ApplyMarking(MarkingPrototype markingPrototype,
|
private void ApplyMarking(MarkingPrototype markingPrototype,
|
||||||
IReadOnlyList<Color>? colors,
|
IReadOnlyList<Color>? colors,
|
||||||
bool visible,
|
bool visible,
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
<BoxContainer Orientation="Vertical">
|
<BoxContainer Orientation="Vertical">
|
||||||
<ScrollContainer VerticalExpand="True" HScrollEnabled="False">
|
<ScrollContainer VerticalExpand="True" HScrollEnabled="False">
|
||||||
<BoxContainer Orientation="Vertical" Margin="8">
|
<BoxContainer Orientation="Vertical" Margin="8">
|
||||||
|
<Label Text="{Loc 'ui-options-accessability-header-visuals'}"
|
||||||
|
StyleClasses="LabelKeyText"/>
|
||||||
<CheckBox Name="ReducedMotionCheckBox" Text="{Loc 'ui-options-reduced-motion'}" />
|
<CheckBox Name="ReducedMotionCheckBox" Text="{Loc 'ui-options-reduced-motion'}" />
|
||||||
<CheckBox Name="EnableColorNameCheckBox" Text="{Loc 'ui-options-enable-color-name'}" />
|
<CheckBox Name="EnableColorNameCheckBox" Text="{Loc 'ui-options-enable-color-name'}" />
|
||||||
<CheckBox Name="ColorblindFriendlyCheckBox" Text="{Loc 'ui-options-colorblind-friendly'}" />
|
<CheckBox Name="ColorblindFriendlyCheckBox" Text="{Loc 'ui-options-colorblind-friendly'}" />
|
||||||
@@ -12,6 +14,9 @@
|
|||||||
<ui:OptionSlider Name="SpeechBubbleTextOpacitySlider" Title="{Loc 'ui-options-speech-bubble-text-opacity'}" />
|
<ui:OptionSlider Name="SpeechBubbleTextOpacitySlider" Title="{Loc 'ui-options-speech-bubble-text-opacity'}" />
|
||||||
<ui:OptionSlider Name="SpeechBubbleSpeakerOpacitySlider" Title="{Loc 'ui-options-speech-bubble-speaker-opacity'}" />
|
<ui:OptionSlider Name="SpeechBubbleSpeakerOpacitySlider" Title="{Loc 'ui-options-speech-bubble-speaker-opacity'}" />
|
||||||
<ui:OptionSlider Name="SpeechBubbleBackgroundOpacitySlider" Title="{Loc 'ui-options-speech-bubble-background-opacity'}" />
|
<ui:OptionSlider Name="SpeechBubbleBackgroundOpacitySlider" Title="{Loc 'ui-options-speech-bubble-background-opacity'}" />
|
||||||
|
<Label Text="{Loc 'ui-options-accessability-header-content'}"
|
||||||
|
StyleClasses="LabelKeyText"/>
|
||||||
|
<CheckBox Name="CensorNudityCheckBox" Text="{Loc 'ui-options-censor-nudity'}" />
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
</ScrollContainer>
|
</ScrollContainer>
|
||||||
<ui:OptionsTabControlRow Name="Control" Access="Public" />
|
<ui:OptionsTabControlRow Name="Control" Access="Public" />
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ public sealed partial class AccessibilityTab : Control
|
|||||||
Control.AddOptionPercentSlider(CCVars.SpeechBubbleSpeakerOpacity, SpeechBubbleSpeakerOpacitySlider);
|
Control.AddOptionPercentSlider(CCVars.SpeechBubbleSpeakerOpacity, SpeechBubbleSpeakerOpacitySlider);
|
||||||
Control.AddOptionPercentSlider(CCVars.SpeechBubbleBackgroundOpacity, SpeechBubbleBackgroundOpacitySlider);
|
Control.AddOptionPercentSlider(CCVars.SpeechBubbleBackgroundOpacity, SpeechBubbleBackgroundOpacitySlider);
|
||||||
|
|
||||||
|
Control.AddOptionCheckBox(CCVars.AccessibilityClientCensorNudity, CensorNudityCheckBox);
|
||||||
|
|
||||||
Control.Initialize();
|
Control.Initialize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,5 +60,17 @@ public sealed partial class CCVars
|
|||||||
public static readonly CVarDef<float> SpeechBubbleBackgroundOpacity =
|
public static readonly CVarDef<float> SpeechBubbleBackgroundOpacity =
|
||||||
CVarDef.Create("accessibility.speech_bubble_background_opacity", 0.75f, CVar.CLIENTONLY | CVar.ARCHIVE);
|
CVarDef.Create("accessibility.speech_bubble_background_opacity", 0.75f, CVar.CLIENTONLY | CVar.ARCHIVE);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<bool> AccessibilityClientCensorNudity =
|
||||||
|
CVarDef.Create("accessibility.censor_nudity", false, CVar.CLIENTONLY | CVar.ARCHIVE);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<bool> AccessibilityServerCensorNudity =
|
||||||
|
CVarDef.Create("accessibility.server_censor_nudity", false, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,6 +88,15 @@ public sealed partial class HumanoidAppearanceComponent : Component
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField]
|
[DataField]
|
||||||
public HashSet<HumanoidVisualLayers> HideLayersOnEquip = [HumanoidVisualLayers.Hair];
|
public HashSet<HumanoidVisualLayers> HideLayersOnEquip = [HumanoidVisualLayers.Hair];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Which markings the humanoid defaults to when nudity is toggled off.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public ProtoId<MarkingPrototype>? UndergarmentTop = new ProtoId<MarkingPrototype>("UndergarmentTopTanktop");
|
||||||
|
|
||||||
|
[DataField]
|
||||||
|
public ProtoId<MarkingPrototype>? UndergarmentBottom = new ProtoId<MarkingPrototype>("UndergarmentBottomBoxers");
|
||||||
}
|
}
|
||||||
|
|
||||||
[DataDefinition]
|
[DataDefinition]
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ namespace Content.Shared.Humanoid
|
|||||||
Tail,
|
Tail,
|
||||||
Hair,
|
Hair,
|
||||||
FacialHair,
|
FacialHair,
|
||||||
|
UndergarmentTop,
|
||||||
|
UndergarmentBottom,
|
||||||
Chest,
|
Chest,
|
||||||
Head,
|
Head,
|
||||||
Snout,
|
Snout,
|
||||||
@@ -19,7 +21,6 @@ namespace Content.Shared.Humanoid
|
|||||||
RArm,
|
RArm,
|
||||||
LArm,
|
LArm,
|
||||||
RHand,
|
RHand,
|
||||||
|
|
||||||
LHand,
|
LHand,
|
||||||
RLeg,
|
RLeg,
|
||||||
LLeg,
|
LLeg,
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ namespace Content.Shared.Humanoid.Markings
|
|||||||
HeadSide,
|
HeadSide,
|
||||||
Snout,
|
Snout,
|
||||||
Chest,
|
Chest,
|
||||||
|
UndergarmentTop,
|
||||||
|
UndergarmentBottom,
|
||||||
Arms,
|
Arms,
|
||||||
Legs,
|
Legs,
|
||||||
Tail,
|
Tail,
|
||||||
@@ -33,6 +35,8 @@ namespace Content.Shared.Humanoid.Markings
|
|||||||
HumanoidVisualLayers.HeadSide => MarkingCategories.HeadSide,
|
HumanoidVisualLayers.HeadSide => MarkingCategories.HeadSide,
|
||||||
HumanoidVisualLayers.Snout => MarkingCategories.Snout,
|
HumanoidVisualLayers.Snout => MarkingCategories.Snout,
|
||||||
HumanoidVisualLayers.Chest => MarkingCategories.Chest,
|
HumanoidVisualLayers.Chest => MarkingCategories.Chest,
|
||||||
|
HumanoidVisualLayers.UndergarmentTop => MarkingCategories.UndergarmentTop,
|
||||||
|
HumanoidVisualLayers.UndergarmentBottom => MarkingCategories.UndergarmentBottom,
|
||||||
HumanoidVisualLayers.RArm => MarkingCategories.Arms,
|
HumanoidVisualLayers.RArm => MarkingCategories.Arms,
|
||||||
HumanoidVisualLayers.LArm => MarkingCategories.Arms,
|
HumanoidVisualLayers.LArm => MarkingCategories.Arms,
|
||||||
HumanoidVisualLayers.RHand => MarkingCategories.Arms,
|
HumanoidVisualLayers.RHand => MarkingCategories.Arms,
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public static class MarkingColoring
|
|||||||
public sealed partial class LayerColoringDefinition
|
public sealed partial class LayerColoringDefinition
|
||||||
{
|
{
|
||||||
[DataField("type")]
|
[DataField("type")]
|
||||||
public LayerColoringType Type = new SkinColoring();
|
public LayerColoringType? Type = new SkinColoring();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Coloring types that will be used if main coloring type will return nil
|
/// 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)
|
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)
|
if (color == null)
|
||||||
{
|
{
|
||||||
foreach (var type in FallbackTypes)
|
foreach (var type in FallbackTypes)
|
||||||
|
|||||||
@@ -279,15 +279,21 @@ cmd-options-help = Usage: options [tab]
|
|||||||
|
|
||||||
## Accessibility menu
|
## 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-enable-color-name = Add colors to character names
|
||||||
ui-options-colorblind-friendly = Colorblind friendly mode
|
ui-options-colorblind-friendly = Colorblind friendly mode
|
||||||
ui-options-reduced-motion = Reduce motion of visual effects
|
ui-options-reduced-motion = Reduce motion of visual effects
|
||||||
ui-options-screen-shake-intensity = Screen shake intensity
|
ui-options-screen-shake-intensity = Screen shake intensity
|
||||||
|
|
||||||
ui-options-chat-window-opacity = Chat window opacity
|
ui-options-chat-window-opacity = Chat window opacity
|
||||||
ui-options-speech-bubble-text-opacity = Speech bubble text 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-speaker-opacity = Speech bubble speaker opacity
|
||||||
ui-options-speech-bubble-background-opacity = Speech bubble background opacity
|
ui-options-speech-bubble-background-opacity = Speech bubble background opacity
|
||||||
|
|
||||||
|
ui-options-censor-nudity = Censor character nudity
|
||||||
|
|
||||||
## Admin menu
|
## Admin menu
|
||||||
|
|
||||||
ui-options-enable-classic-overlay = Revert antag overlay to classic mode
|
ui-options-enable-classic-overlay = Revert antag overlay to classic mode
|
||||||
|
|||||||
21
Resources/Locale/en-US/markings/undergarment.ftl
Normal file
@@ -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
|
||||||
@@ -21,6 +21,8 @@ markings-category-Head = Head
|
|||||||
markings-category-HeadTop = Head (Top)
|
markings-category-HeadTop = Head (Top)
|
||||||
markings-category-HeadSide = Head (Side)
|
markings-category-HeadSide = Head (Side)
|
||||||
markings-category-Snout = Snout
|
markings-category-Snout = Snout
|
||||||
|
markings-category-UndergarmentTop = Undergarment (Top)
|
||||||
|
markings-category-UndergarmentBottom = Undergarment (Bottom)
|
||||||
markings-category-Chest = Chest
|
markings-category-Chest = Chest
|
||||||
markings-category-Arms = Arms
|
markings-category-Arms = Arms
|
||||||
markings-category-Legs = Legs
|
markings-category-Legs = Legs
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -81,6 +81,8 @@
|
|||||||
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ]
|
||||||
- map: ["jumpsuit"]
|
- map: ["jumpsuit"]
|
||||||
- map: ["enum.HumanoidVisualLayers.LFoot"]
|
- map: ["enum.HumanoidVisualLayers.LFoot"]
|
||||||
- map: ["enum.HumanoidVisualLayers.RFoot"]
|
- map: ["enum.HumanoidVisualLayers.RFoot"]
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ]
|
||||||
- map: ["jumpsuit"]
|
- map: ["jumpsuit"]
|
||||||
- map: ["enum.HumanoidVisualLayers.LFoot"]
|
- map: ["enum.HumanoidVisualLayers.LFoot"]
|
||||||
- map: ["enum.HumanoidVisualLayers.RFoot"]
|
- map: ["enum.HumanoidVisualLayers.RFoot"]
|
||||||
@@ -305,6 +307,8 @@
|
|||||||
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ]
|
||||||
- map: ["jumpsuit"]
|
- map: ["jumpsuit"]
|
||||||
- map: ["enum.HumanoidVisualLayers.LFoot"]
|
- map: ["enum.HumanoidVisualLayers.LFoot"]
|
||||||
- map: ["enum.HumanoidVisualLayers.RFoot"]
|
- map: ["enum.HumanoidVisualLayers.RFoot"]
|
||||||
|
|||||||
@@ -83,6 +83,8 @@
|
|||||||
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ]
|
||||||
- map: [ "jumpsuit" ]
|
- map: [ "jumpsuit" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.LHand" ]
|
- map: [ "enum.HumanoidVisualLayers.LHand" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.RHand" ]
|
- map: [ "enum.HumanoidVisualLayers.RHand" ]
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
- Snout
|
- Snout
|
||||||
- HeadTop
|
- HeadTop
|
||||||
- HeadSide
|
- HeadSide
|
||||||
|
undergarmentBottom: UndergarmentBottomBoxersReptilian
|
||||||
- type: Hunger
|
- type: Hunger
|
||||||
- type: Puller
|
- type: Puller
|
||||||
needsHands: false
|
needsHands: false
|
||||||
@@ -90,6 +91,7 @@
|
|||||||
- Snout
|
- Snout
|
||||||
- HeadTop
|
- HeadTop
|
||||||
- HeadSide
|
- HeadSide
|
||||||
|
undergarmentBottom: UndergarmentBottomBoxersReptilian
|
||||||
- type: Inventory
|
- type: Inventory
|
||||||
speciesId: reptilian
|
speciesId: reptilian
|
||||||
femaleDisplacements:
|
femaleDisplacements:
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
requiredLegs: 2
|
requiredLegs: 2
|
||||||
- type: HumanoidAppearance
|
- type: HumanoidAppearance
|
||||||
species: Vox
|
species: Vox
|
||||||
|
undergarmentTop: UndergarmentTopTanktopVox
|
||||||
|
undergarmentBottom: UndergarmentBottomBoxersVox
|
||||||
#- type: VoxAccent # Not yet coded
|
#- type: VoxAccent # Not yet coded
|
||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Vox
|
speechVerb: Vox
|
||||||
@@ -71,6 +73,8 @@
|
|||||||
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentBottom" ]
|
||||||
|
- map: [ "enum.HumanoidVisualLayers.UndergarmentTop" ]
|
||||||
- map: [ "jumpsuit" ]
|
- map: [ "jumpsuit" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
|
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
|
||||||
- map: [ "enum.HumanoidVisualLayers.RFoot" ]
|
- map: [ "enum.HumanoidVisualLayers.RFoot" ]
|
||||||
@@ -150,6 +154,8 @@
|
|||||||
components:
|
components:
|
||||||
- type: HumanoidAppearance
|
- type: HumanoidAppearance
|
||||||
species: Vox
|
species: Vox
|
||||||
|
undergarmentTop: UndergarmentTopTanktopVox
|
||||||
|
undergarmentBottom: UndergarmentBottomBoxersVox
|
||||||
- type: Body
|
- type: Body
|
||||||
prototype: Vox
|
prototype: Vox
|
||||||
- type: Inventory
|
- type: Inventory
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
sprites:
|
sprites:
|
||||||
Head: MobArachnidHead
|
Head: MobArachnidHead
|
||||||
Snout: MobHumanoidAnyMarking
|
Snout: MobHumanoidAnyMarking
|
||||||
|
UndergarmentTop: MobHumanoidAnyMarking
|
||||||
|
UndergarmentBottom: MobHumanoidAnyMarking
|
||||||
Chest: MobArachnidTorso
|
Chest: MobArachnidTorso
|
||||||
HeadTop: MobHumanoidAnyMarking
|
HeadTop: MobHumanoidAnyMarking
|
||||||
HeadSide: MobHumanoidAnyMarking
|
HeadSide: MobHumanoidAnyMarking
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
Head: MobDionaHead
|
Head: MobDionaHead
|
||||||
HeadTop: MobHumanoidAnyMarking
|
HeadTop: MobHumanoidAnyMarking
|
||||||
HeadSide: MobHumanoidAnyMarking
|
HeadSide: MobHumanoidAnyMarking
|
||||||
|
UndergarmentTop: MobHumanoidAnyMarking
|
||||||
|
UndergarmentBottom: MobHumanoidAnyMarking
|
||||||
Chest: MobDionaTorso
|
Chest: MobDionaTorso
|
||||||
Eyes: MobDionaEyes
|
Eyes: MobDionaEyes
|
||||||
LArm: MobDionaLArm
|
LArm: MobDionaLArm
|
||||||
@@ -43,6 +45,12 @@
|
|||||||
HeadSide:
|
HeadSide:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
UndergarmentTop:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
|
UndergarmentBottom:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
Chest:
|
Chest:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
Hair: MobHumanoidAnyMarking
|
Hair: MobHumanoidAnyMarking
|
||||||
FacialHair: MobHumanoidAnyMarking
|
FacialHair: MobHumanoidAnyMarking
|
||||||
Snout: MobHumanoidAnyMarking
|
Snout: MobHumanoidAnyMarking
|
||||||
|
UndergarmentTop: MobHumanoidAnyMarking
|
||||||
|
UndergarmentBottom: MobHumanoidAnyMarking
|
||||||
Chest: MobHumanTorso
|
Chest: MobHumanTorso
|
||||||
Eyes: MobHumanoidEyes
|
Eyes: MobHumanoidEyes
|
||||||
HeadTop: MobHumanoidAnyMarking
|
HeadTop: MobHumanoidAnyMarking
|
||||||
@@ -55,6 +57,12 @@
|
|||||||
HeadTop:
|
HeadTop:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
UndergarmentTop:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
|
UndergarmentBottom:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
Chest:
|
Chest:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
sprites:
|
sprites:
|
||||||
Head: MobMothHead
|
Head: MobMothHead
|
||||||
Snout: MobHumanoidAnyMarking
|
Snout: MobHumanoidAnyMarking
|
||||||
|
UndergarmentTop: MobHumanoidAnyMarking
|
||||||
|
UndergarmentBottom: MobHumanoidAnyMarking
|
||||||
Chest: MobMothTorso
|
Chest: MobMothTorso
|
||||||
HeadTop: MobHumanoidAnyMarking
|
HeadTop: MobHumanoidAnyMarking
|
||||||
HeadSide: MobHumanoidAnyMarking
|
HeadSide: MobHumanoidAnyMarking
|
||||||
@@ -64,6 +66,12 @@
|
|||||||
Head:
|
Head:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
UndergarmentTop:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
|
UndergarmentBottom:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
Chest:
|
Chest:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
sprites:
|
sprites:
|
||||||
Head: MobReptilianHead
|
Head: MobReptilianHead
|
||||||
Snout: MobHumanoidAnyMarking
|
Snout: MobHumanoidAnyMarking
|
||||||
|
UndergarmentTop: MobHumanoidAnyMarking
|
||||||
|
UndergarmentBottom: MobHumanoidAnyMarking
|
||||||
Chest: MobReptilianTorso
|
Chest: MobReptilianTorso
|
||||||
HeadTop: MobHumanoidAnyMarking
|
HeadTop: MobHumanoidAnyMarking
|
||||||
HeadSide: MobHumanoidAnyMarking
|
HeadSide: MobHumanoidAnyMarking
|
||||||
@@ -55,6 +57,12 @@
|
|||||||
HeadSide:
|
HeadSide:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
UndergarmentTop:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
|
UndergarmentBottom:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
Chest:
|
Chest:
|
||||||
points: 3
|
points: 3
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
Head: MobSlimeHead
|
Head: MobSlimeHead
|
||||||
Hair: MobSlimeMarkingFollowSkin
|
Hair: MobSlimeMarkingFollowSkin
|
||||||
FacialHair: MobSlimeMarkingFollowSkin
|
FacialHair: MobSlimeMarkingFollowSkin
|
||||||
|
UndergarmentTop: MobHumanoidAnyMarking
|
||||||
|
UndergarmentBottom: MobHumanoidAnyMarking
|
||||||
Chest: MobSlimeTorso
|
Chest: MobSlimeTorso
|
||||||
Eyes: MobHumanoidEyes
|
Eyes: MobHumanoidEyes
|
||||||
LArm: MobSlimeLArm
|
LArm: MobSlimeLArm
|
||||||
|
|||||||
@@ -21,6 +21,8 @@
|
|||||||
Snout: MobHumanoidAnyMarking
|
Snout: MobHumanoidAnyMarking
|
||||||
Hair: MobHumanoidAnyMarking
|
Hair: MobHumanoidAnyMarking
|
||||||
FacialHair: MobHumanoidAnyMarking
|
FacialHair: MobHumanoidAnyMarking
|
||||||
|
UndergarmentTop: MobHumanoidAnyMarking
|
||||||
|
UndergarmentBottom: MobHumanoidAnyMarking
|
||||||
Chest: MobVoxTorso
|
Chest: MobVoxTorso
|
||||||
Eyes: MobVoxEyes
|
Eyes: MobVoxEyes
|
||||||
LArm: MobVoxLArm
|
LArm: MobVoxLArm
|
||||||
@@ -58,6 +60,12 @@
|
|||||||
points: 4
|
points: 4
|
||||||
required: true
|
required: true
|
||||||
defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ]
|
defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ]
|
||||||
|
UndergarmentTop:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
|
UndergarmentBottom:
|
||||||
|
points: 1
|
||||||
|
required: false
|
||||||
Chest:
|
Chest:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |