diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 85545ac8a70d..37c1df8dfba3 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,5 +1,5 @@
# hasn't specified or all
-* @sleepyyapril @VMSolidus @Remuchi
+* @sleepyyapril @Remuchi
/.* @DEATHB4DEFEAT
*.sln @DEATHB4DEFEAT
@@ -95,3 +95,13 @@
/Content.*/ProjectileSystem @angelofallars
/Content.*/ThrownItem @angelofallars
/Content.*/ThrowEvent @angelofallars
+
+# Nyano Systems
+/Content.*/Weapons @VMSolidus
+/Content.*/Abilities/Psionics @VMSolidus
+/Content.*/Psionics @VMSolidus
+/Content.*/Contests @VMSolidus
+/Content.*/Carrying @VMSolidus
+
+# Physics Stuff
+/Content.*/Atmos @VMSolidus
diff --git a/Content.Client/Chemistry/UI/ChemMasterBoundUserInterface.cs b/Content.Client/Chemistry/UI/ChemMasterBoundUserInterface.cs
index 57bd34ed064d..ff4bd0b71087 100644
--- a/Content.Client/Chemistry/UI/ChemMasterBoundUserInterface.cs
+++ b/Content.Client/Chemistry/UI/ChemMasterBoundUserInterface.cs
@@ -30,8 +30,6 @@ protected override void Open()
// Setup static button actions.
_window.InputEjectButton.OnPressed += _ => SendMessage(
new ItemSlotButtonPressedEvent(SharedChemMaster.InputSlotName));
- _window.OutputEjectButton.OnPressed += _ => SendMessage(
- new ItemSlotButtonPressedEvent(SharedChemMaster.OutputSlotName));
_window.BufferTransferButton.OnPressed += _ => SendMessage(
new ChemMasterSetModeMessage(ChemMasterMode.Transfer));
_window.BufferDiscardButton.OnPressed += _ => SendMessage(
@@ -49,11 +47,9 @@ protected override void Open()
_window.PillTypeButtons[i].OnPressed += _ => SendMessage(new ChemMasterSetPillTypeMessage(pillType));
}
- _window.OnReagentButtonPressed += (_, button, amount) => SendMessage(new ChemMasterReagentAmountButtonMessage(button.Id, amount, button.IsBuffer));
+ _window.OnReagentButtonPressed += (_, button, amount, isOutput) => SendMessage(new ChemMasterReagentAmountButtonMessage(button.Id, amount, button.IsBuffer, isOutput));
_window.OnSortMethodChanged += sortMethod => SendMessage(new ChemMasterSortMethodUpdated(sortMethod));
_window.OnTransferAmountChanged += amount => SendMessage(new ChemMasterTransferringAmountUpdated(amount));
-
-
}
///
diff --git a/Content.Client/Chemistry/UI/ChemMasterWindow.xaml b/Content.Client/Chemistry/UI/ChemMasterWindow.xaml
index 94e7a0e84bec..99dee5873588 100644
--- a/Content.Client/Chemistry/UI/ChemMasterWindow.xaml
+++ b/Content.Client/Chemistry/UI/ChemMasterWindow.xaml
@@ -2,136 +2,147 @@
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
- MinSize="500 770"
+ MinSize="800 00"
Title="{Loc 'chem-master-bound-user-interface-title'}">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs b/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
index bba3533d6148..59b0368e54ab 100644
--- a/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
+++ b/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
@@ -24,18 +24,18 @@ namespace Content.Client.Chemistry.UI
public sealed partial class ChemMasterWindow : FancyWindow
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
- public event Action? OnReagentButtonPressed;
+ public event Action? OnReagentButtonPressed;
+ public event Action? OnAmountButtonPressed;
public event Action? OnSortMethodChanged;
public event Action? OnTransferAmountChanged;
public readonly Button[] PillTypeButtons;
private Dictionary _reagents;
- private const string TransferringAmountColor = "#ffa500";
+ private const string TransferringAmountColor = "#ffffff";
private ReagentSortMethod _currentSortMethod = ReagentSortMethod.Alphabetical;
private ChemMasterBoundUserInterfaceState? _lastState;
- private string _lastAmountText = "50";
private int _transferAmount = 50;
-
+ private bool _isOutput = false;
private const string PillsRsiPath = "/Textures/Objects/Specific/Chemistry/pills.rsi";
@@ -49,12 +49,9 @@ public ChemMasterWindow()
IoCManager.InjectDependencies(this);
_reagents = new();
-
- InputAmountLineEdit.OnTextEntered += SetAmount;
- InputAmountLineEdit.OnFocusExit += SetAmount;
-
- OutputAmountLineEdit.OnTextEntered += SetAmount;
- OutputAmountLineEdit.OnFocusExit += SetAmount;
+ AmountLabel.HorizontalAlignment = HAlignment.Center;
+ AmountLineEdit.OnTextEntered += SetAmount;
+ AmountLineEdit.OnFocusExit += SetAmount;
// Pill type selection buttons, in total there are 20 pills.
// Pill rsi file should have states named as pill1, pill2, and so on.
@@ -109,12 +106,63 @@ public ChemMasterWindow()
SortMethod.AddItem(
Loc.GetString("chem-master-window-sort-method-Alphabetical-text"),
(int) ReagentSortMethod.Alphabetical);
- SortMethod.AddItem(Loc.GetString("chem-master-window-sort-method-Amount-text"), (int) ReagentSortMethod.Amount);
- SortMethod.AddItem(Loc.GetString("chem-master-window-sort-method-Time-text"), (int) ReagentSortMethod.Time);
+
+ SortMethod.AddItem(
+ Loc.GetString("chem-master-window-sort-method-Amount-text"),
+ (int) ReagentSortMethod.Amount);
+
+ SortMethod.AddItem(
+ Loc.GetString("chem-master-window-sort-method-Time-text"),
+ (int) ReagentSortMethod.Time);
+
SortMethod.OnItemSelected += HandleChildPressed;
+ PillSortMethod.AddItem(
+ Loc.GetString(
+ "chem-master-window-sort-method-Alphabetical-text"),
+ (int) ReagentSortMethod.Alphabetical);
+ PillSortMethod.AddItem(Loc.GetString(
+ "chem-master-window-sort-method-Amount-text"),
+ (int) ReagentSortMethod.Amount);
+ PillSortMethod.AddItem(
+ Loc.GetString("chem-master-window-sort-method-Time-text"),
+ (int) ReagentSortMethod.Time);
+
+ PillSortMethod.OnItemSelected += HandleChildPressed;
+
BufferTransferButton.OnPressed += HandleDiscardTransferPress;
BufferDiscardButton.OnPressed += HandleDiscardTransferPress;
+
+ var amounts = new List()
+ {
+ 1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 125, 150, 175, 200, 225, 250, 275, 300, 500
+ };
+
+ for (int i = 0; i < amounts.Count; i++)
+ {
+ var styleClass = StyleBase.ButtonOpenBoth;
+ var amount = amounts[i];
+ var columns = AmountButtons.Columns;
+
+ if (i == 0 || i % columns == 0)
+ styleClass = StyleBase.ButtonOpenRight;
+
+ if ((i + 1) % columns == 0)
+ styleClass = StyleBase.ButtonOpenLeft;
+
+ var button = new Button()
+ {
+ Text = amount.ToString(),
+ MinSize = new(10, 10),
+ StyleClasses = { styleClass },
+ HorizontalExpand = true
+ };
+
+ button.OnPressed += _ => OnAmountButtonPressed?.Invoke(amount);
+ AmountButtons.AddChild(button);
+ }
+
+ OnAmountButtonPressed += amount => SetAmountText(amount.ToString());
}
private void HandleDiscardTransferPress(BaseButton.ButtonEventArgs args)
@@ -137,6 +185,8 @@ private void HandleSortMethodChange(int newSortMethod)
_currentSortMethod = (ReagentSortMethod) newSortMethod;
SortMethod.SelectId(newSortMethod);
+ PillSortMethod.SelectId(newSortMethod);
+
SortUpdated();
}
@@ -158,12 +208,10 @@ private bool ValidateAmount(string newText)
{
if (string.IsNullOrWhiteSpace(newText) || !int.TryParse(newText, out int amount))
{
- InputAmountLineEdit.SetText(string.Empty);
- OutputAmountLineEdit.SetText(string.Empty);
+ AmountLineEdit.SetText(string.Empty);
return false;
}
- _lastAmountText = newText;
_transferAmount = amount;
OnTransferAmountChanged?.Invoke(amount);
return true;
@@ -174,10 +222,7 @@ private void SetAmount(LineEdit.LineEditEventArgs args) =>
private void SetAmountText(string newText)
{
- if (newText == _lastAmountText)
- return;
-
- if (!ValidateAmount(newText))
+ if (newText == _transferAmount.ToString() || !ValidateAmount(newText))
return;
var localizedAmount = Loc.GetString(
@@ -185,18 +230,15 @@ private void SetAmountText(string newText)
("quantity", newText),
("color", TransferringAmountColor));
- InputAmountLabel.Text = localizedAmount;
- OutputAmountLabel.Text = localizedAmount;
-
- InputAmountLineEdit.SetText(string.Empty);
- OutputAmountLineEdit.SetText(string.Empty);
+ AmountLabel.Text = localizedAmount;
+ AmountLineEdit.SetText(string.Empty);
}
private ReagentButton MakeReagentButton(string text, ReagentId id, bool isBuffer)
{
var reagentTransferButton = new ReagentButton(text, id, isBuffer);
reagentTransferButton.OnPressed += args
- => OnReagentButtonPressed?.Invoke(args, reagentTransferButton, _transferAmount);
+ => OnReagentButtonPressed?.Invoke(args, reagentTransferButton, _transferAmount, Tabs.CurrentTab == 1);
return reagentTransferButton;
}
///
@@ -237,49 +279,36 @@ public void UpdateState(BoundUserInterfaceState state)
HandleSortMethodChange(castState.SortMethod);
SetAmountText(castState.TransferringAmount.ToString());
- BufferCurrentVolume.Text = $" {castState.BufferCurrentVolume?.Int() ?? 0}u";
+ BufferCurrentVolume.Text = $" {castState.PillBufferCurrentVolume?.Int() ?? 0}u";
- InputEjectButton.Disabled = castState.InputContainerInfo is null;
- OutputEjectButton.Disabled = castState.OutputContainerInfo is null;
- CreateBottleButton.Disabled = castState.OutputContainerInfo?.Reagents == null;
- CreatePillButton.Disabled = castState.OutputContainerInfo?.Entities == null;
+ InputEjectButton.Disabled = castState.ContainerInfo is null;
+ CreateBottleButton.Disabled = castState.PillBufferReagents.Count == 0;
+ CreatePillButton.Disabled = castState.PillBufferReagents.Count == 0;
UpdateDosageFields(castState);
}
+ private FixedPoint2 CurrentStateBufferVolume(ChemMasterBoundUserInterfaceState state) =>
+ (Tabs.CurrentTab == 0 ? state.BufferCurrentVolume : state.PillBufferCurrentVolume) ?? 0;
+
//assign default values for pill and bottle fields.
private void UpdateDosageFields(ChemMasterBoundUserInterfaceState castState)
{
- var output = castState.OutputContainerInfo;
- var remainingCapacity = output is null ? 0 : (output.MaxVolume - output.CurrentVolume).Int();
- var holdsReagents = output?.Reagents != null;
- var pillNumberMax = holdsReagents ? 0 : remainingCapacity;
- var bottleAmountMax = holdsReagents ? remainingCapacity : 0;
- var bufferVolume = castState.BufferCurrentVolume?.Int() ?? 0;
-
- PillDosage.Value = (int)Math.Min(bufferVolume, castState.PillDosageLimit);
+ var bufferVolume = castState.PillBufferCurrentVolume?.Int() ?? 0;
+ PillDosage.Value = (int) Math.Min(bufferVolume, castState.PillDosageLimit);
PillTypeButtons[castState.SelectedPillType].Pressed = true;
- PillNumber.IsValid = x => x >= 0 && x <= pillNumberMax;
+ PillNumber.IsValid = x => x >= 0;
PillDosage.IsValid = x => x > 0 && x <= castState.PillDosageLimit;
- BottleDosage.IsValid = x => x >= 0 && x <= bottleAmountMax;
-
- if (PillNumber.Value > pillNumberMax)
- PillNumber.Value = pillNumberMax;
- if (BottleDosage.Value > bottleAmountMax)
- BottleDosage.Value = bottleAmountMax;
+ BottleDosage.IsValid = x => x >= 0;
// Avoid division by zero
if (PillDosage.Value > 0)
- {
- PillNumber.Value = Math.Min(bufferVolume / PillDosage.Value, pillNumberMax);
- }
+ PillNumber.Value = bufferVolume / PillDosage.Value;
else
- {
PillNumber.Value = 0;
- }
- BottleDosage.Value = Math.Min(bottleAmountMax, bufferVolume);
+ BottleDosage.Value = bufferVolume;
}
///
/// Generate a product label based on reagents in the buffer.
@@ -287,10 +316,12 @@ private void UpdateDosageFields(ChemMasterBoundUserInterfaceState castState)
/// State data sent by the server.
private string GenerateLabel(ChemMasterBoundUserInterfaceState state)
{
- if (state.BufferCurrentVolume == 0)
+ if (CurrentStateBufferVolume(state) == 0)
return "";
- var reagent = state.BufferReagents.OrderBy(r => r.Quantity).First().Reagent;
+ var buffer = Tabs.CurrentTab == 0 ? state.BufferReagents : state.PillBufferReagents;
+ var reagent = buffer.OrderBy(r => r.Quantity).First().Reagent;
+
_prototypeManager.TryIndex(reagent.Prototype, out ReagentPrototype? proto);
return proto?.LocalizedName ?? "";
}
@@ -304,15 +335,21 @@ private void UpdatePanelInfo(ChemMasterBoundUserInterfaceState state)
BufferTransferButton.Pressed = state.Mode == ChemMasterMode.Transfer;
BufferDiscardButton.Pressed = state.Mode == ChemMasterMode.Discard;
- BuildContainerUI(InputContainerInfo, state.InputContainerInfo, true);
- BuildContainerUI(OutputContainerInfo, state.OutputContainerInfo, false);
+ PillBufferTransferButton.Pressed = state.Mode == ChemMasterMode.Transfer;
+ PillBufferDiscardButton.Pressed = state.Mode == ChemMasterMode.Discard;
+
+ BuildContainerUI(ContainerInfoContainer, state.ContainerInfo, true);
+ BuildBufferInfo(state);
+ BuildPillBufferInfo(state);
+ }
+ private void BuildBufferInfo(ChemMasterBoundUserInterfaceState state)
+ {
BufferInfo.Children.Clear();
if (!state.BufferReagents.Any())
{
BufferInfo.Children.Add(new Label { Text = Loc.GetString("chem-master-window-buffer-empty-text") });
-
return;
}
@@ -386,6 +423,86 @@ private void UpdatePanelInfo(ChemMasterBoundUserInterfaceState state)
}
}
+ private void BuildPillBufferInfo(ChemMasterBoundUserInterfaceState state)
+ {
+ PillBufferInfo.Children.Clear();
+
+ if (!state.PillBufferReagents.Any())
+ {
+ PillBufferInfo.Children.Add(new Label { Text = Loc.GetString("chem-master-window-buffer-empty-text") });
+ return;
+ }
+
+ var bufferHBox = new BoxContainer
+ {
+ Orientation = LayoutOrientation.Horizontal
+ };
+ PillBufferInfo.AddChild(bufferHBox);
+
+ var bufferLabel = new Label { Text = $"{Loc.GetString("chem-master-window-buffer-label")} " };
+ bufferHBox.AddChild(bufferLabel);
+ var bufferVol = new Label
+ {
+ Text = $"{state.PillBufferCurrentVolume}u",
+ StyleClasses = { StyleNano.StyleClassLabelSecondaryColor }
+ };
+ bufferHBox.AddChild(bufferVol);
+
+ // initialises rowCount to allow for striped rows
+ var rowCount = 0;
+ var bufferReagents = state.PillBufferReagents.OrderBy(x => x.Reagent.Prototype);
+
+ if (_currentSortMethod == ReagentSortMethod.Amount)
+ bufferReagents = bufferReagents.OrderByDescending(x => x.Quantity);
+
+ if (_currentSortMethod == ReagentSortMethod.Time)
+ {
+ bufferReagents = bufferReagents.OrderByDescending(
+ x =>
+ {
+ var exists = _reagents.TryGetValue(x.Reagent.Prototype, out var reagent);
+ return exists && reagent != null ? reagent.TimeAdded : DateTimeOffset.UtcNow;
+ });
+ }
+
+ var bufferAsNames = bufferReagents.Select(r => r.Reagent.Prototype).ToHashSet();
+ var hashSetCachedReagents = _reagents.Keys.ToHashSet();
+ hashSetCachedReagents.ExceptWith(bufferAsNames);
+
+ foreach (var missing in hashSetCachedReagents)
+ _reagents.Remove(missing);
+
+ foreach (var (reagent, quantity) in bufferReagents)
+ {
+ var reagentId = reagent;
+ _prototypeManager.TryIndex(reagentId.Prototype, out ReagentPrototype? proto);
+ var name = proto?.LocalizedName ?? Loc.GetString("chem-master-window-unknown-reagent-text");
+ var reagentColor = proto?.SubstanceColor ?? default(Color);
+ PillBufferInfo.Children.Add(BuildReagentRow(reagentColor, rowCount++, name, reagentId, quantity, true, true));
+
+ var exists = _reagents.TryGetValue(reagent.Prototype, out var reagentCached);
+
+ if (!exists)
+ {
+ reagentCached = new()
+ {
+ Id = reagentId,
+ Quantity = quantity,
+ TimeAdded = reagentCached?.TimeAdded ?? DateTimeOffset.UtcNow
+ };
+
+ _reagents.Add(reagentId.Prototype, reagentCached);
+ }
+ else
+ {
+ reagentCached!.Quantity = quantity;
+ reagentCached!.Id = reagentId;
+
+ _reagents[reagentId.Prototype] = reagentCached;
+ }
+ }
+ }
+
private void BuildContainerUI(Control control, ContainerInfo? info, bool addReagentButtons)
{
control.Children.Clear();
diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs
index cfed1cb0994a..12ea7f1d25aa 100644
--- a/Content.Client/Clothing/ClientClothingSystem.cs
+++ b/Content.Client/Clothing/ClientClothingSystem.cs
@@ -195,6 +195,20 @@ private void OnDidUnequip(EntityUid uid, SpriteComponent component, DidUnequipEv
if (!inventorySlots.VisualLayerKeys.TryGetValue(args.Slot, out var revealedLayers))
return;
+ if (TryComp(args.Equipment, out var hideLayer) &&
+ hideLayer.ClothingSlots != null)
+ {
+ foreach (var clothingSlot in hideLayer.ClothingSlots)
+ {
+ if (!inventorySlots.VisualLayerKeys.TryGetValue(clothingSlot, out var revealedLayersToShow))
+ continue;
+
+ foreach (var layerToShow in revealedLayersToShow)
+ component.LayerSetVisible(layerToShow, true);
+ }
+ inventorySlots.HiddenSlots.ExceptWith(hideLayer.ClothingSlots);
+ }
+
// Remove old layers. We could also just set them to invisible, but as items may add arbitrary layers, this
// may eventually bloat the player with lots of invisible layers.
foreach (var layer in revealedLayers)
@@ -264,6 +278,20 @@ private void RenderEquipment(EntityUid equipee, EntityUid equipment, string slot
return;
}
+ if (TryComp(equipment, out var hideLayer) &&
+ hideLayer.ClothingSlots != null)
+ {
+ foreach (var clothingSlot in hideLayer.ClothingSlots)
+ {
+ if (!inventorySlots.VisualLayerKeys.TryGetValue(clothingSlot, out var revealedLayersToHide))
+ continue;
+
+ foreach (var layerToHide in revealedLayersToHide)
+ sprite.LayerSetVisible(layerToHide, false);
+ }
+ inventorySlots.HiddenSlots.UnionWith(hideLayer.ClothingSlots);
+ }
+
var displacementData = inventory.Displacements.GetValueOrDefault(slot);
if (clothingComponent.RenderLayer != null)
@@ -313,6 +341,9 @@ private void RenderEquipment(EntityUid equipee, EntityUid equipment, string slot
if (slot == Jumpsuit)
layerData.Shader ??= "StencilDraw";
+ if (inventorySlots.HiddenSlots.Contains(slot))
+ layerData.Visible = false;
+
sprite.LayerSetData(index, layerData);
layer.Offset += slotDef.Offset;
diff --git a/Content.Client/Effects/ColorFlashEffectSystem.cs b/Content.Client/Effects/ColorFlashEffectSystem.cs
index af0bd4b600dd..bc08607410e2 100644
--- a/Content.Client/Effects/ColorFlashEffectSystem.cs
+++ b/Content.Client/Effects/ColorFlashEffectSystem.cs
@@ -27,12 +27,12 @@ public override void Initialize()
SubscribeLocalEvent(OnEffectAnimationCompleted);
}
- public override void RaiseEffect(Color color, List entities, Filter filter)
+ public override void RaiseEffect(Color color, List entities, Filter filter, float? animationLength = null)
{
if (!_timing.IsFirstTimePredicted)
return;
- OnColorFlashEffect(new ColorFlashEffectEvent(color, GetNetEntityList(entities)));
+ OnColorFlashEffect(new ColorFlashEffectEvent(color, GetNetEntityList(entities), animationLength));
}
private void OnEffectAnimationCompleted(EntityUid uid, ColorFlashEffectComponent component, AnimationCompletedEvent args)
@@ -48,7 +48,7 @@ private void OnEffectAnimationCompleted(EntityUid uid, ColorFlashEffectComponent
RemCompDeferred(uid);
}
- private Animation? GetDamageAnimation(EntityUid uid, Color color, SpriteComponent? sprite = null)
+ private Animation? GetDamageAnimation(EntityUid uid, Color color, SpriteComponent? sprite = null, float? animationLength = null)
{
if (!Resolve(uid, ref sprite, false))
return null;
@@ -56,7 +56,7 @@ private void OnEffectAnimationCompleted(EntityUid uid, ColorFlashEffectComponent
// 90% of them are going to be this so why allocate a new class.
return new Animation
{
- Length = TimeSpan.FromSeconds(AnimationLength),
+ Length = TimeSpan.FromSeconds(animationLength ?? AnimationLength),
AnimationTracks =
{
new AnimationTrackComponentProperty
@@ -67,7 +67,7 @@ private void OnEffectAnimationCompleted(EntityUid uid, ColorFlashEffectComponent
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(color, 0f),
- new AnimationTrackProperty.KeyFrame(sprite.Color, AnimationLength)
+ new AnimationTrackProperty.KeyFrame(sprite.Color, animationLength ?? AnimationLength)
}
}
}
@@ -112,7 +112,7 @@ private void OnColorFlashEffect(ColorFlashEffectEvent ev)
sprite.Color = effect.Color;
}
- var animation = GetDamageAnimation(ent, color, sprite);
+ var animation = GetDamageAnimation(ent, color, sprite, ev.AnimationLength);
if (animation == null)
continue;
diff --git a/Content.Client/Inventory/InventorySlotsComponent.cs b/Content.Client/Inventory/InventorySlotsComponent.cs
index 84bc7d54392e..089551c778c0 100644
--- a/Content.Client/Inventory/InventorySlotsComponent.cs
+++ b/Content.Client/Inventory/InventorySlotsComponent.cs
@@ -16,4 +16,11 @@ public sealed partial class InventorySlotsComponent : Component
[ViewVariables]
[Access(typeof(ClientInventorySystem), Other = AccessPermissions.ReadWriteExecute)] // FIXME Friends
public readonly Dictionary> VisualLayerKeys = new();
+
+ ///
+ /// The slots whose associated visual layers are hidden.
+ ///
+ [ViewVariables]
+ [Access(typeof(ClientInventorySystem), Other = AccessPermissions.ReadWriteExecute)]
+ public readonly HashSet HiddenSlots = new();
}
diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs
index 58883d0ac833..feddc074dc1a 100644
--- a/Content.Client/Inventory/StrippableBoundUserInterface.cs
+++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs
@@ -6,6 +6,8 @@
using Content.Client.UserInterface.Controls;
using Content.Client.UserInterface.Systems.Hands.Controls;
using Content.Client.Verbs.UI;
+using Content.Shared._EstacaoPirata.Cards.Card;
+using Content.Shared._EstacaoPirata.Cards.Hand;
using Content.Shared.Cuffs;
using Content.Shared.Cuffs.Components;
using Content.Shared.Ensnaring.Components;
@@ -173,8 +175,7 @@ private void AddHandButton(Hand hand)
if (EntMan.TryGetComponent(Owner, out var cuff) && _cuffable.GetAllCuffs(cuff).Contains(virt.BlockingEntity))
button.BlockedRect.MouseFilter = MouseFilterMode.Ignore;
}
-
- UpdateEntityIcon(button, hand.HeldEntity);
+ UpdateEntityIcon(button, EntMan.HasComponent(hand.HeldEntity) ? _virtualHiddenEntity : hand.HeldEntity);
_strippingMenu!.HandsContainer.AddChild(button);
}
@@ -213,6 +214,10 @@ private void AddInventoryButton(EntityUid invUid, string slotId, InventoryCompon
&& thiefComponent.IgnoreStripHidden))
entity = _virtualHiddenEntity;
+ if (entity != null && EntMan.HasComponent(entity))
+ entity = _virtualHiddenEntity;
+
+
var button = new SlotButton(new SlotData(slotDef, container));
button.Pressed += SlotPressed;
diff --git a/Content.Client/Light/Components/LightFadeComponent.cs b/Content.Client/Light/Components/LightFadeComponent.cs
index de31dd90e5e2..e79693c3684a 100644
--- a/Content.Client/Light/Components/LightFadeComponent.cs
+++ b/Content.Client/Light/Components/LightFadeComponent.cs
@@ -8,4 +8,10 @@ public sealed partial class LightFadeComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), DataField("duration")]
public float Duration = 0.5f;
+
+ //
+ // The duration of the fade-in effect before starting the fade out effect.
+ //
+ [ViewVariables(VVAccess.ReadWrite), DataField]
+ public float RampUpDuration = 0f;
}
diff --git a/Content.Client/Light/EntitySystems/LightFadeSystem.cs b/Content.Client/Light/EntitySystems/LightFadeSystem.cs
index c4e4fff5fb04..eb32125006d4 100644
--- a/Content.Client/Light/EntitySystems/LightFadeSystem.cs
+++ b/Content.Client/Light/EntitySystems/LightFadeSystem.cs
@@ -34,7 +34,8 @@ private void OnFadeStartup(EntityUid uid, LightFadeComponent component, Componen
InterpolationMode = AnimationInterpolationMode.Cubic,
KeyFrames =
{
- new AnimationTrackProperty.KeyFrame(light.Energy, 0f),
+ new AnimationTrackProperty.KeyFrame(0f, 0f),
+ new AnimationTrackProperty.KeyFrame(light.Energy, component.RampUpDuration),
new AnimationTrackProperty.KeyFrame(0f, component.Duration)
}
}
diff --git a/Content.Client/Lobby/LobbyUIController.cs b/Content.Client/Lobby/LobbyUIController.cs
index a300e8c0542d..2c63c2aa6b3e 100644
--- a/Content.Client/Lobby/LobbyUIController.cs
+++ b/Content.Client/Lobby/LobbyUIController.cs
@@ -3,6 +3,7 @@
using Content.Client.Inventory;
using Content.Client.Lobby.UI;
using Content.Client.Players.PlayTimeTracking;
+using Content.Client.Station;
using Content.Shared.CCVar;
using Content.Shared.Clothing.Loadouts.Prototypes;
using Content.Shared.Clothing.Loadouts.Systems;
@@ -44,6 +45,7 @@ public sealed class LobbyUIController : UIController, IOnStateEntered(job.StartingGear);
+ gear = _stationSpawning.ApplySubGear(gear, profile, job);
foreach (var slot in slots)
{
@@ -289,6 +292,12 @@ public void GiveDummyJobClothes(EntityUid dummy, JobPrototype job, HumanoidChara
}
}
+ /// Applies loadouts to the dummy.
+ public void GiveDummyLoadout(EntityUid dummy, JobPrototype job, HumanoidCharacterProfile profile)
+ {
+ _loadouts.ApplyCharacterLoadout(dummy, job, profile, _jobRequirements.GetRawPlayTimeTrackers(), _jobRequirements.IsWhitelisted(), out _);
+ }
+
/// Loads the profile onto a dummy entity
public EntityUid LoadProfileEntity(HumanoidCharacterProfile? humanoid, bool jobClothes, bool loadouts)
{
@@ -312,7 +321,7 @@ public EntityUid LoadProfileEntity(HumanoidCharacterProfile? humanoid, bool jobC
if (jobClothes)
GiveDummyJobClothes(dummyEnt, job, humanoid);
if (loadouts)
- _loadouts.ApplyCharacterLoadout(dummyEnt, job, humanoid, _jobRequirements.GetRawPlayTimeTrackers(), _jobRequirements.IsWhitelisted(), out _);
+ GiveDummyLoadout(dummyEnt, job, humanoid);
}
return dummyEnt;
diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs
index 300929454722..673566875ceb 100644
--- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs
+++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs
@@ -690,6 +690,20 @@ private void ReloadPreview()
SpriteView.SetEntity(PreviewDummy);
}
+ /// Reloads the dummy entity's clothes for preview
+ private void ReloadClothes()
+ {
+ if (Profile == null)
+ return;
+
+ _controller.RemoveDummyClothes(PreviewDummy);
+ var job = _controller.GetPreferredJob(Profile);
+ if (ShowClothes.Pressed)
+ _controller.GiveDummyJobClothes(PreviewDummy, job, Profile);
+ if (ShowLoadouts.Pressed)
+ _controller.GiveDummyLoadout(PreviewDummy, job, Profile);
+ }
+
/// Resets the profile to the defaults
public void ResetToDefault()
{
@@ -1265,6 +1279,7 @@ private void SetSpecies(string newSpecies)
UpdateSpeciesGuidebookIcon();
IsDirty = true;
ReloadProfilePreview();
+ ReloadClothes(); // Species may have job-specific gear, reload the clothes
}
private void SetName(string newName)
diff --git a/Content.Client/SelfExtinguisher/SelfExtinguisherSystem.cs b/Content.Client/SelfExtinguisher/SelfExtinguisherSystem.cs
new file mode 100644
index 000000000000..0329cd487c25
--- /dev/null
+++ b/Content.Client/SelfExtinguisher/SelfExtinguisherSystem.cs
@@ -0,0 +1,5 @@
+using Content.Shared.SelfExtinguisher;
+
+namespace Content.Server.SelfExtinguisher;
+
+public sealed partial class SelfExtinguisherSystem : SharedSelfExtinguisherSystem { }
diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs
index 6be41af0d89e..40f6bd9bb35d 100644
--- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs
+++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs
@@ -293,11 +293,15 @@ public void UpdateIcons()
if (_action.BackgroundOn != null)
_buttonBackgroundTexture = _spriteSys.Frame0(_action.BackgroundOn);
}
+ else if (_action.IconDisabled is { } iconDisabled && !_action.Enabled)
+ SetActionIcon(_spriteSys.Frame0(iconDisabled));
+ else if (_action.IconCooldown is { } iconCooldown && _action.Cooldown is { } cooldown &&
+ cooldown.End > IoCManager.Resolve().CurTime)
+ SetActionIcon(_spriteSys.Frame0(iconCooldown));
else
- {
SetActionIcon(_action.Icon != null ? _spriteSys.Frame0(_action.Icon) : null);
- _buttonBackgroundTexture = Theme.ResolveTexture("SlotBackground");
- }
+
+ _buttonBackgroundTexture = Theme.ResolveTexture("SlotBackground");
}
public void UpdateBackground()
diff --git a/Content.Client/_EstacaoPirata/Cards/Card/CardSystem.cs b/Content.Client/_EstacaoPirata/Cards/Card/CardSystem.cs
new file mode 100644
index 000000000000..ef14b873173c
--- /dev/null
+++ b/Content.Client/_EstacaoPirata/Cards/Card/CardSystem.cs
@@ -0,0 +1,78 @@
+using System.Linq;
+using Content.Shared._EstacaoPirata.Cards.Card;
+using Robust.Client.GameObjects;
+using Robust.Shared.Utility;
+
+namespace Content.Client._EstacaoPirata.Cards.Card;
+
+///
+/// This handles...
+///
+public sealed class CardSystem : EntitySystem
+{
+ [Dependency] private readonly SpriteSystem _spriteSystem = default!;
+ [Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!;
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnComponentStartupEvent);
+ SubscribeNetworkEvent(OnFlip);
+ }
+
+ private void OnComponentStartupEvent(EntityUid uid, CardComponent comp, ComponentStartup args)
+ {
+ if (!TryComp(uid, out SpriteComponent? spriteComponent))
+ return;
+
+ for (var i = 0; i < spriteComponent.AllLayers.Count(); i++)
+ {
+ //Log.Debug($"Layer {i}");
+ if (!spriteComponent.TryGetLayer(i, out var layer) || layer.State.Name == null)
+ continue;
+
+ var rsi = layer.RSI ?? spriteComponent.BaseRSI;
+ if (rsi == null)
+ continue;
+
+ //Log.Debug("FOI");
+ comp.FrontSprite.Add(new SpriteSpecifier.Rsi(rsi.Path, layer.State.Name));
+ }
+
+ comp.BackSprite ??= comp.FrontSprite;
+ DirtyEntity(uid);
+ UpdateSprite(uid, comp);
+ }
+
+ private void OnFlip(CardFlipUpdatedEvent args)
+ {
+ if (!TryComp(GetEntity(args.Card), out CardComponent? comp))
+ return;
+ UpdateSprite(GetEntity(args.Card), comp);
+ }
+
+ private void UpdateSprite(EntityUid uid, CardComponent comp)
+ {
+ var newSprite = comp.Flipped ? comp.BackSprite : comp.FrontSprite;
+ //if (newSprite == null)
+ // return;
+
+ if (!TryComp(uid, out SpriteComponent? spriteComponent))
+ return;
+ var layerCount = newSprite.Count();
+
+ //inserts Missing Layers
+ if (spriteComponent.AllLayers.Count() < layerCount)
+ for (var i = spriteComponent.AllLayers.Count(); i < layerCount; i++)
+ spriteComponent.AddBlankLayer(i);
+ //Removes extra layers
+ else if (spriteComponent.AllLayers.Count() > layerCount)
+ for (var i = spriteComponent.AllLayers.Count() - 1; i >= layerCount; i--)
+ spriteComponent.RemoveLayer(i);
+
+ for (var i = 0; i < newSprite.Count(); i++)
+ {
+ var layer = newSprite[i];
+ spriteComponent.LayerSetSprite(i, layer);
+ }
+ }
+}
diff --git a/Content.Client/_EstacaoPirata/Cards/CardSpriteSystem.cs b/Content.Client/_EstacaoPirata/Cards/CardSpriteSystem.cs
new file mode 100644
index 000000000000..581e517b0426
--- /dev/null
+++ b/Content.Client/_EstacaoPirata/Cards/CardSpriteSystem.cs
@@ -0,0 +1,76 @@
+using System.Linq;
+using Content.Shared._EstacaoPirata.Cards.Stack;
+using Robust.Client.GameObjects;
+
+namespace Content.Client._EstacaoPirata.Cards;
+
+///
+/// This handles...
+///
+public sealed class CardSpriteSystem : EntitySystem
+{
+ ///
+ public override void Initialize() { }
+
+ public bool TryAdjustLayerQuantity(Entity uid, int? cardLimit = null)
+ {
+ var sprite = uid.Comp1;
+ var stack = uid.Comp2;
+ var cardCount = cardLimit == null ? stack.Cards.Count : Math.Min(stack.Cards.Count, cardLimit.Value);
+
+ var layerCount = 0;
+ //Gets the quantity of layers
+ var relevantCards = stack.Cards.TakeLast(cardCount).ToList();
+ foreach (var card in relevantCards)
+ {
+ if (!TryComp(card, out SpriteComponent? cardSprite))
+ return false;
+
+ layerCount += cardSprite.AllLayers.Count();
+ }
+ layerCount = int.Max(1, layerCount); // Frontier: you need one layer.
+ //inserts Missing Layers
+ if (sprite.AllLayers.Count() < layerCount)
+ for (var i = sprite.AllLayers.Count(); i < layerCount; i++)
+ sprite.AddBlankLayer(i);
+
+ //Removes extra layers
+ else if (sprite.AllLayers.Count() > layerCount)
+ for (var i = sprite.AllLayers.Count() - 1; i >= layerCount; i--)
+ sprite.RemoveLayer(i);
+
+ return true;
+ }
+
+ public bool TryHandleLayerConfiguration(Entity uid, int cardCount, Func, int, int, bool> layerFunc)
+ {
+ var sprite = uid.Comp1;
+ var stack = uid.Comp2;
+
+ // int = index of what card it is from
+ List<(int, ISpriteLayer)> layers = [];
+
+ var i = 0;
+ var cards = stack.Cards.TakeLast(cardCount).ToList();
+ foreach (var card in cards)
+ {
+ if (!TryComp(card, out SpriteComponent? cardSprite))
+ return false;
+ layers.AddRange(cardSprite.AllLayers.Select(layer => (i, layer)));
+ i++;
+ }
+
+ var j = 0;
+ foreach (var obj in layers)
+ {
+ var (cardIndex, layer) = obj;
+ sprite.LayerSetVisible(j, true);
+ sprite.LayerSetTexture(j, layer.Texture);
+ sprite.LayerSetState(j, layer.RsiState.Name);
+ layerFunc.Invoke((uid, sprite), cardIndex, j);
+ j++;
+ }
+
+ return true;
+ }
+}
diff --git a/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs b/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs
new file mode 100644
index 000000000000..c03888bba83b
--- /dev/null
+++ b/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs
@@ -0,0 +1,151 @@
+using System.Linq;
+using System.Numerics;
+using Content.Shared._EstacaoPirata.Cards.Deck;
+using Content.Shared._EstacaoPirata.Cards.Stack;
+using Robust.Client.GameObjects;
+
+namespace Content.Client._EstacaoPirata.Cards.Deck;
+
+///
+/// This handles...
+///
+public sealed class CardDeckSystem : EntitySystem
+{
+ private readonly Dictionary, int> _notInitialized = [];
+ [Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!;
+
+
+ ///
+ public override void Initialize()
+ {
+ UpdatesOutsidePrediction = false;
+ SubscribeLocalEvent(OnComponentStartupEvent);
+ SubscribeNetworkEvent(OnStackStart);
+ SubscribeNetworkEvent(OnStackUpdate);
+ SubscribeNetworkEvent(OnReorder);
+ SubscribeNetworkEvent(OnStackFlip);
+ SubscribeLocalEvent(OnAppearanceChanged);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ // Lazy way to make sure the sprite starts correctly
+ foreach (var kv in _notInitialized)
+ {
+ var ent = kv.Key;
+
+ if (kv.Value >= 5)
+ {
+ _notInitialized.Remove(ent);
+ continue;
+ }
+
+ _notInitialized[ent] = kv.Value + 1;
+
+ if (!TryComp(ent.Owner, out CardStackComponent? stack) || stack.Cards.Count <= 0)
+ continue;
+
+
+ // If the card was STILL not initialized, we skip it
+ if (!TryGetCardLayer(stack.Cards.Last(), out var _))
+ continue;
+
+ // If cards were correctly initialized, we update the sprite
+ UpdateSprite(ent.Owner, ent.Comp);
+ _notInitialized.Remove(ent);
+ }
+
+ }
+
+
+ private bool TryGetCardLayer(EntityUid card, out SpriteComponent.Layer? layer)
+ {
+ layer = null;
+ if (!TryComp(card, out SpriteComponent? cardSprite)
+ || !cardSprite.TryGetLayer(0, out var l))
+ return false;
+
+ layer = l;
+ return true;
+ }
+
+ private void UpdateSprite(EntityUid uid, CardDeckComponent comp)
+ {
+ if (!TryComp(uid, out SpriteComponent? sprite)
+ || !TryComp(uid, out CardStackComponent? cardStack))
+ return;
+
+ // Prevents error appearing at spawnMenu
+ if (cardStack.Cards.Count <= 0 || !TryGetCardLayer(cardStack.Cards.Last(), out var cardlayer) ||
+ cardlayer == null)
+ {
+ _notInitialized[(uid, comp)] = 0;
+ return;
+ }
+
+ _cardSpriteSystem.TryAdjustLayerQuantity((uid, sprite, cardStack), comp.CardLimit);
+
+ _cardSpriteSystem.TryHandleLayerConfiguration(
+ (uid, sprite, cardStack),
+ comp.CardLimit,
+ (_, cardIndex, layerIndex) =>
+ {
+ sprite.LayerSetRotation(layerIndex, Angle.FromDegrees(90));
+ sprite.LayerSetOffset(layerIndex, new Vector2(0, (comp.YOffset * cardIndex)));
+ sprite.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
+ return true;
+ }
+ );
+ }
+
+ private void OnStackUpdate(CardStackQuantityChangeEvent args)
+ {
+ if (!TryComp(GetEntity(args.Stack), out CardDeckComponent? comp))
+ return;
+ UpdateSprite(GetEntity(args.Stack), comp);
+ }
+
+ private void OnStackFlip(CardStackFlippedEvent args)
+ {
+ if (!TryComp(GetEntity(args.CardStack), out CardDeckComponent? comp))
+ return;
+ UpdateSprite(GetEntity(args.CardStack), comp);
+ }
+
+ private void OnReorder(CardStackReorderedEvent args)
+ {
+ if (!TryComp(GetEntity(args.Stack), out CardDeckComponent? comp))
+ return;
+ UpdateSprite(GetEntity(args.Stack), comp);
+ }
+
+ private void OnAppearanceChanged(EntityUid uid, CardDeckComponent comp, AppearanceChangeEvent args)
+ {
+ UpdateSprite(uid, comp);
+ }
+ private void OnComponentStartupEvent(EntityUid uid, CardDeckComponent comp, ComponentStartup args)
+ {
+ if (!TryComp(uid, out CardStackComponent? stack))
+ {
+ _notInitialized[(uid, comp)] = 0;
+ return;
+ }
+
+ if(stack.Cards.Count <= 0)
+ _notInitialized[(uid, comp)] = 0;
+ UpdateSprite(uid, comp);
+ }
+
+
+ private void OnStackStart(CardStackInitiatedEvent args)
+ {
+ var entity = GetEntity(args.CardStack);
+ if (!TryComp(entity, out CardDeckComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+}
diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs b/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs
new file mode 100644
index 000000000000..99b0019ea67d
--- /dev/null
+++ b/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs
@@ -0,0 +1,167 @@
+using System.Linq;
+using System.Numerics;
+using Content.Shared._EstacaoPirata.Cards.Hand;
+using Content.Shared._EstacaoPirata.Cards.Stack;
+using Robust.Client.GameObjects;
+
+namespace Content.Client._EstacaoPirata.Cards.Hand;
+
+///
+/// This handles...
+///
+public sealed class CardHandSystem : EntitySystem
+{
+ private readonly Dictionary, int> _notInit = [];
+ [Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!;
+
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnComponentStartupEvent);
+ SubscribeNetworkEvent(OnStackStart);
+ SubscribeNetworkEvent(OnStackUpdate);
+ SubscribeNetworkEvent(OnStackReorder);
+ SubscribeNetworkEvent(OnStackFlip);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+ foreach (var (ent, value) in _notInit)
+ {
+ if (value >= 5)
+ {
+ _notInit.Remove(ent);
+ continue;
+ }
+ _notInit[ent] = value + 1;
+ if(!TryComp(ent.Owner, out CardStackComponent? stack) || stack.Cards.Count <= 0)
+ continue;
+
+ // If cards were correctly initialized, we update the sprite
+ UpdateSprite(ent.Owner, ent.Comp);
+ _notInit.Remove(ent);
+ }
+ }
+
+ private bool TryGetCardLayer(EntityUid card, out SpriteComponent.Layer? layer)
+ {
+ layer = null;
+ if (!TryComp(card, out SpriteComponent? cardSprite)
+ || !cardSprite.TryGetLayer(0, out var l))
+ return false;
+
+ layer = l;
+ return true;
+ }
+
+ private void UpdateSprite(EntityUid uid, CardHandComponent comp)
+ {
+ if (!TryComp(uid, out SpriteComponent? sprite)
+ || !TryComp(uid, out CardStackComponent? cardStack))
+ return;
+
+ // Prevents error appearing at spawnMenu
+ if (cardStack.Cards.Count <= 0 || !TryGetCardLayer(cardStack.Cards.Last(), out var cardlayer) ||
+ cardlayer == null)
+ {
+ _notInit[(uid, comp)] = 0;
+ return;
+ }
+
+ _cardSpriteSystem.TryAdjustLayerQuantity((uid, sprite, cardStack), comp.CardLimit);
+
+ var cardCount = Math.Min(cardStack.Cards.Count, comp.CardLimit);
+
+ // Frontier: zero/one card case
+ if (cardCount <= 0)
+ {
+ // Placeholder - we need to have a valid sprite.
+ sprite.LayerSetVisible(0, true);
+ sprite.LayerSetState(0, "singlecard_down_black");
+ sprite.LayerSetOffset(0, new Vector2(0f, 0f));
+ sprite.LayerSetScale(0, new Vector2(1f, 1f));
+ }
+ else if (cardCount == 1)
+ {
+ _cardSpriteSystem.TryHandleLayerConfiguration(
+ (uid, sprite, cardStack),
+ cardCount,
+ (sprt, cardIndex, layerIndex) =>
+ {
+ sprt.Comp.LayerSetRotation(layerIndex, Angle.FromDegrees(0));
+ sprt.Comp.LayerSetOffset(layerIndex, new Vector2(0, 0.10f));
+ sprt.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
+ return true;
+ }
+ );
+ }
+ else
+ {
+ var intervalAngle = comp.Angle / (cardCount-1);
+ var intervalSize = comp.XOffset / (cardCount - 1);
+
+ _cardSpriteSystem.TryHandleLayerConfiguration(
+ (uid, sprite, cardStack),
+ cardCount,
+ (sprt, cardIndex, layerIndex) =>
+ {
+ var angle = (-(comp.Angle/2)) + cardIndex * intervalAngle;
+ var x = (-(comp.XOffset / 2)) + cardIndex * intervalSize;
+ var y = -(x * x) + 0.10f;
+
+ sprt.Comp.LayerSetRotation(layerIndex, Angle.FromDegrees(-angle));
+ sprt.Comp.LayerSetOffset(layerIndex, new Vector2(x, y));
+ sprt.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
+ return true;
+ }
+ );
+ }
+ }
+
+
+ private void OnStackUpdate(CardStackQuantityChangeEvent args)
+ {
+ if (!TryComp(GetEntity(args.Stack), out CardHandComponent? comp))
+ return;
+ UpdateSprite(GetEntity(args.Stack), comp);
+ }
+
+ private void OnStackStart(CardStackInitiatedEvent args)
+ {
+ var entity = GetEntity(args.CardStack);
+ if (!TryComp(entity, out CardHandComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+ private void OnComponentStartupEvent(EntityUid uid, CardHandComponent comp, ComponentStartup args)
+ {
+ if (!TryComp(uid, out CardStackComponent? stack))
+ {
+ _notInit[(uid, comp)] = 0;
+ return;
+ }
+ if(stack.Cards.Count <= 0)
+ _notInit[(uid, comp)] = 0;
+ UpdateSprite(uid, comp);
+ }
+
+ // Frontier
+ private void OnStackReorder(CardStackReorderedEvent args)
+ {
+ if (!TryComp(GetEntity(args.Stack), out CardHandComponent? comp))
+ return;
+ UpdateSprite(GetEntity(args.Stack), comp);
+ }
+
+ private void OnStackFlip(CardStackFlippedEvent args)
+ {
+ var entity = GetEntity(args.CardStack);
+ if (!TryComp(entity, out CardHandComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+}
diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml
new file mode 100644
index 000000000000..76cd42473098
--- /dev/null
+++ b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml.cs b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml.cs
new file mode 100644
index 000000000000..b63a28c3d1fd
--- /dev/null
+++ b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml.cs
@@ -0,0 +1,97 @@
+using Content.Client.UserInterface.Controls;
+using Content.Shared.Popups;
+using Robust.Client.AutoGenerated;
+using Robust.Client.GameObjects;
+using Robust.Client.Player;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using System.Numerics;
+using Content.Shared._EstacaoPirata.Cards.Card;
+using Content.Shared._EstacaoPirata.Cards.Stack;
+
+namespace Content.Client._EstacaoPirata.Cards.Hand.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class CardHandMenu : RadialMenu
+{
+ [Dependency] private readonly EntityManager _entManager = default!;
+ [Dependency] private readonly IPlayerManager _playerManager = default!;
+
+ private readonly SpriteSystem _spriteSystem;
+ private readonly SharedPopupSystem _popup;
+
+ public event Action? CardHandDrawMessageAction;
+
+ private EntityUid _owner;
+
+ public CardHandMenu(EntityUid owner, CardHandMenuBoundUserInterface bui)
+ {
+ IoCManager.InjectDependencies(this);
+ RobustXamlLoader.Load(this);
+
+ _spriteSystem = _entManager.System();
+ _popup = _entManager.System();
+
+ _owner = owner;
+
+ // Find the main radial container
+ var main = FindControl("Main");
+
+ if (!_entManager.TryGetComponent(owner, out var stack))
+ return;
+
+ foreach (var card in stack.Cards)
+ {
+ if (_playerManager.LocalSession == null
+ || !_entManager.TryGetComponent(card, out var cardComp))
+ return;
+
+ string cardName;
+ if (cardComp.Flipped && _entManager.TryGetComponent(card, out var metadata))
+ cardName = metadata.EntityName;
+ else
+ cardName = Loc.GetString(cardComp.Name);
+
+ var button = new CardMenuButton()
+ {
+ StyleClasses = { "RadialMenuButton" },
+ SetSize = new Vector2(64f, 64f),
+ ToolTip = cardName,
+ };
+
+ if (_entManager.TryGetComponent(card, out var sprite))
+ {
+ if (sprite.Icon == null)
+ continue;
+
+ var tex = new TextureRect()
+ {
+ VerticalAlignment = VAlignment.Center,
+ HorizontalAlignment = HAlignment.Center,
+ Texture = sprite.Icon?.Default,
+ TextureScale = new Vector2(2f, 2f),
+ };
+
+ button.AddChild(tex);
+ }
+
+ main.AddChild(button);
+
+ button.OnButtonUp += _ =>
+ {
+ CardHandDrawMessageAction?.Invoke(_entManager.GetNetEntity(card));
+ Close();
+ };
+ }
+
+ CardHandDrawMessageAction += bui.SendCardHandDrawMessage;
+ }
+}
+
+public sealed class CardMenuButton : RadialMenuTextureButton
+{
+ public CardMenuButton()
+ {
+
+ }
+}
diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs
new file mode 100644
index 000000000000..e93d983e51ca
--- /dev/null
+++ b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs
@@ -0,0 +1,44 @@
+using Content.Shared._EstacaoPirata.Cards.Hand;
+using Content.Shared.RCD;
+using JetBrains.Annotations;
+using Robust.Client.Graphics;
+using Robust.Client.Input;
+using Robust.Shared.Prototypes;
+
+namespace Content.Client._EstacaoPirata.Cards.Hand.UI;
+
+[UsedImplicitly]
+public sealed class CardHandMenuBoundUserInterface : BoundUserInterface
+{
+ [Dependency] private readonly IClyde _displayManager = default!;
+ [Dependency] private readonly IInputManager _inputManager = default!;
+
+ private CardHandMenu? _menu;
+
+ public CardHandMenuBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
+ {
+ IoCManager.InjectDependencies(this);
+ }
+
+ protected override void Open()
+ {
+ base.Open();
+
+ _menu = new(Owner, this);
+ _menu.OnClose += Close;
+
+ // Open the menu, centered on the mouse
+ var vpSize = _displayManager.ScreenSize;
+ _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize);
+ }
+
+ public void SendCardHandDrawMessage(NetEntity e) => SendMessage(new CardHandDrawMessage(e));
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+ if (!disposing) return;
+
+ _menu?.Dispose();
+ }
+}
diff --git a/Content.IntegrationTests/Tests/StoreTests.cs b/Content.IntegrationTests/Tests/StoreTests.cs
index 877db1d9a02d..6bb434431525 100644
--- a/Content.IntegrationTests/Tests/StoreTests.cs
+++ b/Content.IntegrationTests/Tests/StoreTests.cs
@@ -112,22 +112,23 @@ await server.WaitAssertion(() =>
var prototypeCost = prototype.Cost[UplinkSystem.TelecrystalCurrencyPrototype];
var discountDownTo = prototype.DiscountDownTo[UplinkSystem.TelecrystalCurrencyPrototype];
- Assert.That(plainDiscountedCost.Value, Is.GreaterThanOrEqualTo(discountDownTo.Value), "Expected discounted cost to be greater then DiscountDownTo value.");
- Assert.That(plainDiscountedCost.Value, Is.LessThan(prototypeCost.Value), "Expected discounted cost to be lower then prototype cost.");
+
+ Assert.That(plainDiscountedCost.Value, Is.GreaterThanOrEqualTo(discountDownTo.Value), $"Expected discounted cost to be greater then DiscountDownTo value. ({itemId})");
+ Assert.That(plainDiscountedCost.Value, Is.LessThan(prototypeCost.Value), $"Expected discounted cost to be lower then prototype cost. ({itemId})");
var buyMsg = new StoreBuyListingMessage(discountedListingItem.ID){Actor = human};
server.EntMan.EventBus.RaiseComponentEvent(pda, storeComponent, buyMsg);
var newBalance = storeComponent.Balance[UplinkSystem.TelecrystalCurrencyPrototype];
- Assert.That(newBalance.Value, Is.EqualTo((originalBalance - plainDiscountedCost).Value), "Expected to have balance reduced by discounted cost");
+ Assert.That(newBalance.Value, Is.EqualTo((originalBalance - plainDiscountedCost).Value), $"Expected to have balance reduced by discounted cost ({itemId})");
Assert.That(
discountedListingItem.IsCostModified,
Is.False,
- $"Expected item cost to not be modified after Buying discounted item."
+ $"Expected item cost to not be modified after Buying discounted item. ({itemId})"
);
var costAfterBuy = discountedListingItem.Cost[UplinkSystem.TelecrystalCurrencyPrototype];
- Assert.That(costAfterBuy.Value, Is.EqualTo(prototypeCost.Value), "Expected cost after discount refund to be equal to prototype cost.");
+ Assert.That(costAfterBuy.Value, Is.EqualTo(prototypeCost.Value), $"Expected cost after discount refund to be equal to prototype cost. ({itemId})");
var refundMsg = new StoreRequestRefundMessage { Actor = human };
server.EntMan.EventBus.RaiseComponentEvent(pda, storeComponent, refundMsg);
@@ -136,20 +137,20 @@ await server.WaitAssertion(() =>
discountedListingItem = storeComponent.FullListingsCatalog.First(x => x.ID == itemId);
var afterRefundBalance = storeComponent.Balance[UplinkSystem.TelecrystalCurrencyPrototype];
- Assert.That(afterRefundBalance.Value, Is.EqualTo(originalBalance.Value), "Expected refund to return all discounted cost value.");
+ Assert.That(afterRefundBalance.Value, Is.EqualTo(originalBalance.Value), $"Expected refund to return all discounted cost value. ({itemId})");
Assert.That(
discountComponent.Discounts.First(x => x.ListingId == discountedListingItem.ID).Count,
Is.EqualTo(0),
- "Discounted count should still be zero even after refund."
+ $"Discounted count should still be zero even after refund. ({itemId})"
);
Assert.That(
discountedListingItem.IsCostModified,
Is.False,
- $"Expected item cost to not be modified after Buying discounted item (even after refund was done)."
+ $"Expected item cost to not be modified after Buying discounted item (even after refund was done). ({itemId})"
);
var costAfterRefund = discountedListingItem.Cost[UplinkSystem.TelecrystalCurrencyPrototype];
- Assert.That(costAfterRefund.Value, Is.EqualTo(prototypeCost.Value), "Expected cost after discount refund to be equal to prototype cost.");
+ Assert.That(costAfterRefund.Value, Is.EqualTo(prototypeCost.Value), $"Expected cost after discount refund to be equal to prototype cost. ({itemId})");
});
}
diff --git a/Content.Server/Administration/Commands/SetOutfitCommand.cs b/Content.Server/Administration/Commands/SetOutfitCommand.cs
index a7427d708cf1..4df38344ed8d 100644
--- a/Content.Server/Administration/Commands/SetOutfitCommand.cs
+++ b/Content.Server/Administration/Commands/SetOutfitCommand.cs
@@ -9,6 +9,7 @@
using Content.Shared.PDA;
using Content.Shared.Preferences;
using Content.Shared.Roles;
+using Content.Shared.Station;
using Robust.Shared.Console;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
@@ -92,6 +93,9 @@ public static bool SetOutfit(EntityUid target, string gear, IEntityManager entit
var preferencesManager = IoCManager.Resolve();
var prefs = preferencesManager.GetPreferences(userId);
profile = prefs.SelectedCharacter as HumanoidCharacterProfile;
+
+ if (profile != null)
+ startingGear = IoCManager.Resolve().System().ApplySubGear(startingGear, profile);
}
var invSystem = entityManager.System();
diff --git a/Content.Server/Atmos/Components/FlammableComponent.cs b/Content.Server/Atmos/Components/FlammableComponent.cs
index e1c7974307b5..1ca436d165e6 100644
--- a/Content.Server/Atmos/Components/FlammableComponent.cs
+++ b/Content.Server/Atmos/Components/FlammableComponent.cs
@@ -67,6 +67,13 @@ public sealed partial class FlammableComponent : Component
[DataField]
public bool CanExtinguish = true;
+ ///
+ /// Should the component ignore fire protection when on fire?
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ [DataField]
+ public bool IgnoreFireProtection = false;
+
///
/// How many firestacks should be applied to component when being set on fire?
///
diff --git a/Content.Server/Atmos/Components/IgniteFromGasComponent.cs b/Content.Server/Atmos/Components/IgniteFromGasComponent.cs
new file mode 100644
index 000000000000..0d20d8553bd6
--- /dev/null
+++ b/Content.Server/Atmos/Components/IgniteFromGasComponent.cs
@@ -0,0 +1,48 @@
+using Content.Shared._Shitmed.Targeting;
+using Content.Shared.Atmos;
+
+namespace Content.Server.Atmos.Components;
+
+///
+/// Component that can be used to add (or remove) fire stacks when exposed to a type of gas, unless wearing ignition immunity.
+/// Don't add this component directly, instead attach a body part that has IgniteFromGasPartComponent.
+///
+[RegisterComponent]
+public sealed partial class IgniteFromGasComponent : Component
+{
+ ///
+ /// What type of gas triggers ignition.
+ /// Right now only one type of gas can be set, instead of different gasses per each body part.
+ ///
+ [DataField]
+ public Gas Gas;
+
+ ///
+ /// The total calculated fire stacks to apply every second without immunity.
+ ///
+ [DataField]
+ public float FireStacksPerUpdate = 0f;
+
+ ///
+ /// If this entity is currently not self-igniting.
+ ///
+ public bool HasImmunity => FireStacksPerUpdate == 0;
+
+ ///
+ /// The base amount of fire stacks to apply every second without immunity.
+ ///
+ [DataField]
+ public float BaseFireStacksPerUpdate = 0.13f;
+
+ ///
+ /// The body parts that are vulnerable to ignition when exposed, and their fire stack values.
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ public Dictionary IgnitableBodyParts = new();
+
+ ///
+ /// How many moles of the gas is needed to trigger ignition.
+ ///
+ [DataField]
+ public float MolesToIgnite = 0.5f;
+}
diff --git a/Content.Server/Atmos/Components/IgniteFromGasImmunityComponent.cs b/Content.Server/Atmos/Components/IgniteFromGasImmunityComponent.cs
new file mode 100644
index 000000000000..16b286c82089
--- /dev/null
+++ b/Content.Server/Atmos/Components/IgniteFromGasImmunityComponent.cs
@@ -0,0 +1,16 @@
+using Content.Shared._Shitmed.Targeting;
+
+namespace Content.Server.Atmos.Components;
+
+///
+/// Component that is used on clothing to prevent ignition when exposed to a specific gas.
+///
+[RegisterComponent]
+public sealed partial class IgniteFromGasImmunityComponent : Component
+{
+ //
+ // Which body parts are given ignition immunity.
+ //
+ [DataField(required: true)]
+ public HashSet Parts;
+}
diff --git a/Content.Server/Atmos/Components/IgniteFromGasPartComponent.cs b/Content.Server/Atmos/Components/IgniteFromGasPartComponent.cs
new file mode 100644
index 000000000000..099322b5a5e0
--- /dev/null
+++ b/Content.Server/Atmos/Components/IgniteFromGasPartComponent.cs
@@ -0,0 +1,23 @@
+using Content.Shared.Atmos;
+
+namespace Content.Server.Atmos.Components;
+
+///
+/// Component that can be used on body parts to add fire stacks and trigger ignition
+/// when the body part is exposed to a type of gas, unless wearing ignition immunity.
+///
+[RegisterComponent]
+public sealed partial class IgniteFromGasPartComponent : Component
+{
+ ///
+ /// What type of gas triggers ignition.
+ ///
+ [DataField(required: true)]
+ public Gas Gas;
+
+ ///
+ /// How many fire stacks this body part applies when exposed.
+ ///
+ [DataField]
+ public float FireStacks = 0.02f;
+}
diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.BreathTool.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.BreathTool.cs
index 741a9341e79e..327804f39a4f 100644
--- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.BreathTool.cs
+++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.BreathTool.cs
@@ -10,21 +10,21 @@ private void InitializeBreathTool()
SubscribeLocalEvent(OnBreathToolShutdown);
}
- private void OnBreathToolShutdown(EntityUid uid, BreathToolComponent component, ComponentShutdown args)
+ private void OnBreathToolShutdown(Entity entity, ref ComponentShutdown args)
{
- DisconnectInternals(component);
+ DisconnectInternals(entity);
}
- public void DisconnectInternals(BreathToolComponent component)
+ public void DisconnectInternals(Entity entity)
{
- var old = component.ConnectedInternalsEntity;
- component.ConnectedInternalsEntity = null;
+ var old = entity.Comp.ConnectedInternalsEntity;
+ entity.Comp.ConnectedInternalsEntity = null;
if (TryComp(old, out var internalsComponent))
{
- _internals.DisconnectBreathTool((old.Value, internalsComponent));
+ _internals.DisconnectBreathTool((old.Value, internalsComponent), entity.Owner);
}
- component.IsFunctional = false;
+ entity.Comp.IsFunctional = false;
}
}
diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs
index 0f6ce0780e4a..db2b7888c173 100644
--- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs
@@ -310,6 +310,7 @@ public void Extinguish(EntityUid uid, FlammableComponent? flammable = null)
_adminLogger.Add(LogType.Flammable, $"{ToPrettyString(uid):entity} stopped being on fire damage");
flammable.OnFire = false;
flammable.FireStacks = 0;
+ flammable.IgnoreFireProtection = false;
_ignitionSourceSystem.SetIgnited(uid, false);
@@ -317,7 +318,7 @@ public void Extinguish(EntityUid uid, FlammableComponent? flammable = null)
}
public void Ignite(EntityUid uid, EntityUid ignitionSource, FlammableComponent? flammable = null,
- EntityUid? ignitionSourceUser = null)
+ EntityUid? ignitionSourceUser = null, bool ignoreFireProtection = false)
{
if (!Resolve(uid, ref flammable))
return;
@@ -336,6 +337,9 @@ public void Ignite(EntityUid uid, EntityUid ignitionSource, FlammableComponent?
flammable.OnFire = true;
}
+ if (ignoreFireProtection)
+ flammable.IgnoreFireProtection = ignoreFireProtection;
+
UpdateAppearance(uid, flammable);
}
@@ -382,7 +386,7 @@ public void Resist(EntityUid uid,
uid.SpawnTimer(2000, () =>
{
flammable.Resisting = false;
- flammable.FireStacks -= 1f;
+ flammable.FireStacks -= flammable.FirestackFade * 10f;
UpdateAppearance(uid, flammable);
});
}
@@ -448,14 +452,20 @@ public override void Update(float frameTime)
if (TryComp(uid, out TemperatureComponent? temp))
_temperatureSystem.ChangeHeat(uid, 12500 * flammable.FireStacks, false, temp);
- var ev = new GetFireProtectionEvent();
- // let the thing on fire handle it
- RaiseLocalEvent(uid, ref ev);
- // and whatever it's wearing
- if (_inventoryQuery.TryComp(uid, out var inv))
- _inventory.RelayEvent((uid, inv), ref ev);
+ var multiplier = 1f;
+ if (!flammable.IgnoreFireProtection)
+ {
+ var ev = new GetFireProtectionEvent();
+ // let the thing on fire handle it
+ RaiseLocalEvent(uid, ref ev);
+ // and whatever it's wearing
+ if (_inventoryQuery.TryComp(uid, out var inv))
+ _inventory.RelayEvent((uid, inv), ref ev);
+
+ multiplier = ev.Multiplier;
+ }
- _damageableSystem.TryChangeDamage(uid, flammable.Damage * flammable.FireStacks * ev.Multiplier, interruptsDoAfters: false);
+ _damageableSystem.TryChangeDamage(uid, flammable.Damage * flammable.FireStacks * multiplier, interruptsDoAfters: false);
AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable);
}
diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
index 07594820fcc4..baad739804b8 100644
--- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
@@ -220,7 +220,7 @@ public GasMixture RemoveAirVolume(Entity gasTank, float volume
public bool CanConnectToInternals(GasTankComponent component)
{
var internals = GetInternalsComponent(component, component.User);
- return internals != null && internals.BreathToolEntity != null && !component.IsValveOpen;
+ return internals != null && internals.BreathTools.Count != 0 && !component.IsValveOpen;
}
public void ConnectToInternals(Entity ent)
diff --git a/Content.Server/Atmos/EntitySystems/IgniteFromGasSystem.cs b/Content.Server/Atmos/EntitySystems/IgniteFromGasSystem.cs
new file mode 100644
index 000000000000..253238db6387
--- /dev/null
+++ b/Content.Server/Atmos/EntitySystems/IgniteFromGasSystem.cs
@@ -0,0 +1,135 @@
+using System.Linq;
+using Content.Server.Atmos.Components;
+using Content.Server.Bed.Components;
+using Content.Shared._Shitmed.Targeting;
+using Content.Shared._Shitmed.Body.Events;
+using Content.Shared.Body.Part;
+using Content.Shared.Body.Systems;
+using Content.Shared.Inventory;
+using Content.Shared.Inventory.Events;
+using Content.Shared.Mobs;
+using Content.Shared.Mobs.Components;
+
+namespace Content.Server.Atmos.EntitySystems;
+
+public sealed class IgniteFromGasSystem : EntitySystem
+{
+ [Dependency] private readonly SharedBodySystem _body = default!;
+ [Dependency] private readonly InventorySystem _inventory = default!;
+ [Dependency] private readonly AtmosphereSystem _atmos = default!;
+ [Dependency] private readonly FlammableSystem _flammable = default!;
+
+ // All ignitions tick at the same time because FlammableSystem is also the same
+ private const float UpdateTimer = 1f;
+ private float _timer;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnBodyPartAdded);
+ SubscribeLocalEvent(OnBodyPartAttached);
+
+ SubscribeLocalEvent(OnBodyPartRemoved);
+ SubscribeLocalEvent(OnBodyPartDropped);
+
+ SubscribeLocalEvent(OnIgniteFromGasImmunityEquipped);
+ SubscribeLocalEvent(OnIgniteFromGasImmunityUnequipped);
+ }
+
+ private void OnBodyPartAdded(Entity ent, ref BodyPartAddedEvent args) =>
+ HandleAddBodyPart(ent.Owner, args.Part);
+ private void OnBodyPartAttached(Entity ent, ref BodyPartAttachedEvent args) =>
+ HandleAddBodyPart(ent.Owner, args.Part);
+
+ private void HandleAddBodyPart(EntityUid uid, Entity part)
+ {
+ if (!TryComp(part, out var ignitePart) ||
+ _body.GetTargetBodyPart(part.Comp.PartType, part.Comp.Symmetry) is not { } targetBodyPart)
+ return;
+
+ if (!TryComp(uid, out var ignite))
+ {
+ ignite = EnsureComp(uid);
+ ignite.Gas = ignitePart.Gas;
+ }
+
+ ignite.IgnitableBodyParts[targetBodyPart] = ignitePart.FireStacks;
+
+ UpdateIgniteImmunity((uid, ignite));
+ }
+
+ private void OnBodyPartRemoved(Entity ent, ref BodyPartRemovedEvent args) =>
+ HandleRemoveBodyPart(ent, args.Part);
+ private void OnBodyPartDropped(Entity ent, ref BodyPartDroppedEvent args) =>
+ HandleRemoveBodyPart(ent, args.Part);
+
+ private void HandleRemoveBodyPart(Entity ent, Entity part)
+ {
+ if (!HasComp(part) ||
+ _body.GetTargetBodyPart(part.Comp.PartType, part.Comp.Symmetry) is not { } targetBodyPart)
+ return;
+
+ ent.Comp.IgnitableBodyParts.Remove(targetBodyPart);
+
+ if (ent.Comp.IgnitableBodyParts.Count == 0)
+ {
+ RemCompDeferred(ent);
+ return;
+ }
+
+ UpdateIgniteImmunity((ent, ent.Comp));
+ }
+
+ private void OnIgniteFromGasImmunityEquipped(Entity ent, ref GotEquippedEvent args) =>
+ UpdateIgniteImmunity(args.Equipee);
+ private void OnIgniteFromGasImmunityUnequipped(Entity ent, ref GotUnequippedEvent args) =>
+ UpdateIgniteImmunity(args.Equipee);
+
+ public void UpdateIgniteImmunity(Entity ent)
+ {
+ if (!Resolve(ent, ref ent.Comp1, ref ent.Comp2, false))
+ return;
+
+ var exposedBodyParts = new Dictionary(ent.Comp1.IgnitableBodyParts);
+
+ var containerSlotEnumerator = _inventory.GetSlotEnumerator((ent, ent.Comp2));
+ while (containerSlotEnumerator.NextItem(out var item, out _))
+ {
+ if (!TryComp(item, out var immunity))
+ continue;
+
+ foreach (var immunePart in immunity.Parts)
+ exposedBodyParts.Remove(immunePart);
+ }
+
+ if (exposedBodyParts.Count == 0)
+ {
+ ent.Comp1.FireStacksPerUpdate = 0;
+ return;
+ }
+
+ ent.Comp1.FireStacksPerUpdate = ent.Comp1.BaseFireStacksPerUpdate + exposedBodyParts.Values.Sum();
+ }
+
+ public override void Update(float frameTime)
+ {
+ _timer += frameTime;
+ if (_timer < UpdateTimer)
+ return;
+ _timer -= UpdateTimer;
+
+ var enumerator = EntityQueryEnumerator();
+ while (enumerator.MoveNext(out var uid, out var ignite, out var mobState, out var flammable))
+ {
+ if (ignite.FireStacksPerUpdate == 0 ||
+ mobState.CurrentState is MobState.Dead ||
+ HasComp(uid) ||
+ _atmos.GetContainingMixture(uid, excite: true) is not { } gas ||
+ gas[(int) ignite.Gas] < ignite.MolesToIgnite
+ )
+ continue;
+
+ _flammable.AdjustFireStacks(uid, ignite.FireStacksPerUpdate, flammable);
+ _flammable.Ignite(uid, uid, flammable, ignoreFireProtection: true);
+ }
+ }
+}
diff --git a/Content.Server/Bed/BedSystem.cs b/Content.Server/Bed/BedSystem.cs
index 7220c04ea8c4..b09609a86f75 100644
--- a/Content.Server/Bed/BedSystem.cs
+++ b/Content.Server/Bed/BedSystem.cs
@@ -101,6 +101,8 @@ private void OnStasisStrapped(Entity bed, ref StrappedEvent
var metabolicEvent = new ApplyMetabolicMultiplierEvent(args.Buckle, bed.Comp.Multiplier, true);
RaiseLocalEvent(args.Buckle, ref metabolicEvent);
+
+ EnsureComp(args.Buckle);
}
private void OnStasisUnstrapped(Entity bed, ref UnstrappedEvent args)
@@ -110,6 +112,8 @@ private void OnStasisUnstrapped(Entity bed, ref UnstrappedEv
var metabolicEvent = new ApplyMetabolicMultiplierEvent(args.Buckle, bed.Comp.Multiplier, false);
RaiseLocalEvent(args.Buckle, ref metabolicEvent);
+
+ RemComp(args.Buckle);
}
private void OnPowerChanged(EntityUid uid, StasisBedComponent component, ref PowerChangedEvent args)
diff --git a/Content.Server/Bed/Components/InStasisComponent.cs b/Content.Server/Bed/Components/InStasisComponent.cs
new file mode 100644
index 000000000000..d7c0272f5ad0
--- /dev/null
+++ b/Content.Server/Bed/Components/InStasisComponent.cs
@@ -0,0 +1,7 @@
+namespace Content.Server.Bed.Components;
+
+//
+// Component added only to entities buckled to a stasis bed.
+//
+[RegisterComponent]
+public sealed partial class InStasisComponent : Component {}
diff --git a/Content.Server/Body/Components/InternalsComponent.cs b/Content.Server/Body/Components/InternalsComponent.cs
index 098f1789218f..ef908f96553c 100644
--- a/Content.Server/Body/Components/InternalsComponent.cs
+++ b/Content.Server/Body/Components/InternalsComponent.cs
@@ -13,7 +13,7 @@ public sealed partial class InternalsComponent : Component
public EntityUid? GasTankEntity;
[ViewVariables]
- public EntityUid? BreathToolEntity;
+ public HashSet BreathTools { get; set; } = new();
///
/// Toggle Internals delay when the target is not you.
diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs
index 56fc981a0f43..260c2e3e962b 100644
--- a/Content.Server/Body/Systems/InternalsSystem.cs
+++ b/Content.Server/Body/Systems/InternalsSystem.cs
@@ -44,7 +44,7 @@ public override void Initialize()
private void OnStartingGear(EntityUid uid, InternalsComponent component, ref StartingGearEquippedEvent args)
{
- if (component.BreathToolEntity == null)
+ if (component.BreathTools.Count == 0)
return;
if (component.GasTankEntity != null)
@@ -111,7 +111,7 @@ public void ToggleInternals(
}
// If they're not on then check if we have a mask to use
- if (internals.BreathToolEntity is null)
+ if (internals.BreathTools.Count == 0)
{
_popupSystem.PopupEntity(Loc.GetString("internals-no-breath-tool"), uid, user);
return;
@@ -178,29 +178,28 @@ private void OnInhaleLocation(Entity ent, ref InhaleLocation
_alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent));
}
}
- public void DisconnectBreathTool(Entity ent)
+ public void DisconnectBreathTool(Entity ent, EntityUid toolEntity)
{
- var old = ent.Comp.BreathToolEntity;
- ent.Comp.BreathToolEntity = null;
+ ent.Comp.BreathTools.Remove(toolEntity);
- if (TryComp(old, out BreathToolComponent? breathTool))
- {
- _atmos.DisconnectInternals(breathTool);
+ if (TryComp(toolEntity, out BreathToolComponent? breathTool))
+ _atmos.DisconnectInternals((toolEntity, breathTool));
+
+ if (ent.Comp.BreathTools.Count == 0)
DisconnectTank(ent);
- }
_alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent));
}
public void ConnectBreathTool(Entity ent, EntityUid toolEntity)
{
- if (TryComp(ent.Comp.BreathToolEntity, out BreathToolComponent? tool))
- {
- _atmos.DisconnectInternals(tool);
- }
+ if (!ent.Comp.BreathTools.Add(toolEntity))
+ return;
- ent.Comp.BreathToolEntity = toolEntity;
_alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent));
+
+ var ev = new BreathToolConnectedEvent(ent.Owner, toolEntity);
+ RaiseLocalEvent(ent.Owner, ev);
}
public void DisconnectTank(InternalsComponent? component)
@@ -217,7 +216,7 @@ public void DisconnectTank(InternalsComponent? component)
public bool TryConnectTank(Entity ent, EntityUid tankEntity)
{
- if (ent.Comp.BreathToolEntity is null)
+ if (ent.Comp.BreathTools.Count == 0)
return false;
if (TryComp(ent.Comp.GasTankEntity, out GasTankComponent? tank))
@@ -236,14 +235,14 @@ public bool AreInternalsWorking(EntityUid uid, InternalsComponent? component = n
public bool AreInternalsWorking(InternalsComponent component)
{
- return TryComp(component.BreathToolEntity, out BreathToolComponent? breathTool)
+ return TryComp(component.BreathTools.FirstOrNull(), out BreathToolComponent? breathTool)
&& breathTool.IsFunctional
&& HasComp(component.GasTankEntity);
}
private short GetSeverity(InternalsComponent component)
{
- if (component.BreathToolEntity is null || !AreInternalsWorking(component))
+ if (component.BreathTools.Count == 0 || !AreInternalsWorking(component))
return 2;
// If pressure in the tank is below low pressure threshold, flash warning on internals UI
@@ -292,3 +291,18 @@ private short GetSeverity(InternalsComponent component)
return null;
}
}
+
+///
+/// Raised on an equipee when it has breath tools connected.
+///
+public sealed class BreathToolConnectedEvent : EntityEventArgs
+{
+ public readonly EntityUid Equipee;
+ public readonly EntityUid BreathTool;
+
+ public BreathToolConnectedEvent(EntityUid equipee, EntityUid breathTool)
+ {
+ Equipee = equipee;
+ BreathTool = breathTool;
+ }
+}
diff --git a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs
index 09a8f3562dc4..50c63bff6e8a 100644
--- a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs
+++ b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs
@@ -33,16 +33,20 @@ public sealed class ChemMasterSystem : EntitySystem
{
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly AudioSystem _audioSystem = default!;
- [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
+ [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!;
[Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!;
[Dependency] private readonly StorageSystem _storageSystem = default!;
[Dependency] private readonly LabelSystem _labelSystem = default!;
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
+ [Dependency] private readonly IEntityManager _entityManager = default!;
[ValidatePrototypeId]
private const string PillPrototypeId = "Pill";
+ [ValidatePrototypeId]
+ private const string PillCanisterPrototypeId = "PillCanister";
+
public override void Initialize()
{
base.Initialize();
@@ -70,18 +74,25 @@ private void UpdateUiState(Entity ent, bool updateLabel = f
var (owner, chemMaster) = ent;
if (!_solutionContainerSystem.TryGetSolution(owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution))
return;
- var inputContainer = _itemSlotsSystem.GetItemOrNull(owner, SharedChemMaster.InputSlotName);
- var outputContainer = _itemSlotsSystem.GetItemOrNull(owner, SharedChemMaster.OutputSlotName);
+
+ if (!_solutionContainerSystem.TryGetSolution(owner, SharedChemMaster.PillBufferSolutionName, out _, out var pillBufferSolution))
+ return;
+
+ var container = _itemSlotsSystem.GetItemOrNull(owner, SharedChemMaster.InputSlotName);
var bufferReagents = bufferSolution.Contents;
var bufferCurrentVolume = bufferSolution.Volume;
+ var pillBufferReagents = pillBufferSolution.Contents;
+ var pillBufferCurrentVolume = pillBufferSolution.Volume;
+
var state = new ChemMasterBoundUserInterfaceState(
chemMaster.Mode,
- BuildInputContainerInfo(inputContainer),
- BuildOutputContainerInfo(outputContainer),
+ BuildInputContainerInfo(container),
bufferReagents,
+ pillBufferReagents,
bufferCurrentVolume,
+ pillBufferCurrentVolume,
chemMaster.PillType,
chemMaster.PillDosageLimit,
updateLabel,
@@ -118,10 +129,10 @@ private void OnReagentButtonMessage(Entity chemMaster, ref
switch (chemMaster.Comp.Mode)
{
case ChemMasterMode.Transfer:
- TransferReagents(chemMaster, message.ReagentId, message.Amount, message.FromBuffer);
+ TransferReagents(chemMaster, message.ReagentId, message.Amount, message.FromBuffer, message.IsOutput);
break;
case ChemMasterMode.Discard:
- DiscardReagents(chemMaster, message.ReagentId, message.Amount, message.FromBuffer);
+ DiscardReagents(chemMaster, message.ReagentId, message.Amount, message.FromBuffer, message.IsOutput);
break;
default:
// Invalid mode.
@@ -131,38 +142,45 @@ private void OnReagentButtonMessage(Entity chemMaster, ref
ClickSound(chemMaster);
}
- private void TransferReagents(Entity chemMaster, ReagentId id, FixedPoint2 amount, bool fromBuffer)
+ private void TransferReagents(Entity chemMaster, ReagentId id, FixedPoint2 amount, bool fromBuffer, bool isOutput)
{
var container = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.InputSlotName);
if (container is null ||
!_solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSoln, out var containerSolution) ||
- !_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution))
- {
+ !_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution) ||
+ !_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.PillBufferSolutionName, out _, out var pillBufferSolution))
return;
- }
if (fromBuffer) // Buffer to container
{
amount = FixedPoint2.Min(amount, containerSolution.AvailableVolume);
- amount = bufferSolution.RemoveReagent(id, amount, preserveOrder: true);
+ var solution = isOutput ? pillBufferSolution : bufferSolution;
+
+ amount = solution.RemoveReagent(id, amount, preserveOrder: true);
_solutionContainerSystem.TryAddReagent(containerSoln.Value, id, amount, out var _);
}
else // Container to buffer
{
amount = FixedPoint2.Min(amount, containerSolution.GetReagentQuantity(id));
_solutionContainerSystem.RemoveReagent(containerSoln.Value, id, amount);
- bufferSolution.AddReagent(id, amount);
+
+ var solution = isOutput ? pillBufferSolution : bufferSolution;
+ solution.AddReagent(id, amount);
}
UpdateUiState(chemMaster, updateLabel: true);
}
- private void DiscardReagents(Entity chemMaster, ReagentId id, FixedPoint2 amount, bool fromBuffer)
+ private void DiscardReagents(Entity chemMaster, ReagentId id, FixedPoint2 amount, bool fromBuffer, bool isOutput)
{
if (fromBuffer)
{
- if (_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution))
- bufferSolution.RemoveReagent(id, amount, preserveOrder: true);
+ if (_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution) &&
+ _solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.PillSolutionName, out _, out var pillBufferSolution))
+ {
+ var solution = isOutput ? pillBufferSolution : bufferSolution;
+ solution.RemoveReagent(id, amount, preserveOrder: true);
+ }
else
return;
}
@@ -171,9 +189,7 @@ private void DiscardReagents(Entity chemMaster, ReagentId i
var container = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.InputSlotName);
if (container is not null &&
_solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSolution, out _))
- {
_solutionContainerSystem.RemoveReagent(containerSolution.Value, id, amount);
- }
else
return;
}
@@ -185,6 +201,14 @@ private void OnCreatePillsMessage(Entity chemMaster, ref Ch
{
var user = message.Actor;
var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName);
+
+ if (maybeContainer == null)
+ {
+ var canister = _entityManager.SpawnEntity(PillCanisterPrototypeId, Transform(chemMaster.Owner).Coordinates);
+ _itemSlotsSystem.TryInsert(chemMaster.Owner, SharedChemMaster.OutputSlotName, canister, null);
+ maybeContainer = canister;
+ }
+
if (maybeContainer is not { Valid: true } container
|| !TryComp(container, out StorageComponent? storage))
{
@@ -215,16 +239,26 @@ private void OnCreatePillsMessage(Entity chemMaster, ref Ch
_storageSystem.Insert(container, item, out _, user: user, storage);
_labelSystem.Label(item, message.Label);
- var itemSolution = _solutionContainerSystem.EnsureSolutionEntity(item, SharedChemMaster.PillSolutionName, message.Dosage, null, out _);
- _solutionContainerSystem.TryAddSolution(itemSolution, withdrawal.SplitSolution(message.Dosage));
+ var hasItemSolution = _solutionContainerSystem.EnsureSolutionEntity(
+ (item, null),
+ SharedChemMaster.PillSolutionName,
+ out var itemSolution,
+ message.Dosage);
+
+ if (!hasItemSolution || itemSolution is null)
+ continue;
+
+ _solutionContainerSystem.TryAddSolution(itemSolution.Value, withdrawal.SplitSolution(message.Dosage));
var pill = EnsureComp(item);
pill.PillType = chemMaster.Comp.PillType;
Dirty(item, pill);
// Log pill creation by a user
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(user):user} printed {ToPrettyString(item):pill} {SharedSolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}");
+ _adminLogger.Add(
+ LogType.Action,
+ LogImpact.Low,
+ $"{ToPrettyString(user):user} printed {ToPrettyString(item):pill} {SharedSolutionContainerSystem.ToPrettyString(itemSolution.Value.Comp.Solution)}");
}
UpdateUiState(chemMaster);
@@ -235,11 +269,17 @@ private void OnOutputToBottleMessage(Entity chemMaster, ref
{
var user = message.Actor;
var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName);
+
+ if (maybeContainer == null)
+ {
+ var canister = _entityManager.SpawnEntity(PillCanisterPrototypeId, Transform(chemMaster.Owner).Coordinates);
+ _itemSlotsSystem.TryInsert(chemMaster.Owner, SharedChemMaster.OutputSlotName, canister, null);
+ maybeContainer = canister;
+ }
+
if (maybeContainer is not { Valid: true } container
|| !_solutionContainerSystem.TryGetSolution(container, SharedChemMaster.BottleSolutionName, out var soln, out var solution))
- {
return; // output can't fit reagents
- }
// Ensure the amount is valid.
if (message.Dosage == 0 || message.Dosage > solution.AvailableVolume)
@@ -270,10 +310,8 @@ private bool WithdrawFromBuffer(
{
outputSolution = null;
- if (!_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var solution))
- {
+ if (!_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.PillBufferSolutionName, out _, out var solution))
return false;
- }
if (solution.Volume == 0)
{
@@ -313,43 +351,11 @@ private void ClickSound(Entity chemMaster)
return BuildContainerInfo(Name(container.Value), solution);
}
- private ContainerInfo? BuildOutputContainerInfo(EntityUid? container)
- {
- if (container is not { Valid: true })
- return null;
-
- var name = Name(container.Value);
- {
- if (_solutionContainerSystem.TryGetSolution(
- container.Value, SharedChemMaster.BottleSolutionName, out _, out var solution))
- {
- return BuildContainerInfo(name, solution);
- }
- }
-
- if (!TryComp(container, out StorageComponent? storage))
- return null;
-
- var pills = storage.Container.ContainedEntities.Select((Func) (pill =>
- {
- _solutionContainerSystem.TryGetSolution(pill, SharedChemMaster.PillSolutionName, out _, out var solution);
- var quantity = solution?.Volume ?? FixedPoint2.Zero;
- return (Name(pill), quantity);
- })).ToList();
-
- return new ContainerInfo(name, _storageSystem.GetCumulativeItemAreas((container.Value, storage)), storage.Grid.GetArea())
- {
- Entities = pills
- };
- }
-
- private static ContainerInfo BuildContainerInfo(string name, Solution solution)
- {
- return new ContainerInfo(name, solution.Volume, solution.MaxVolume)
+ private static ContainerInfo BuildContainerInfo(string name, Solution solution) =>
+ new(name, solution.Volume, solution.MaxVolume)
{
Reagents = solution.Contents
};
- }
private void OnSortMethodUpdated(EntityUid uid, ChemMasterComponent chemMaster, ChemMasterSortMethodUpdated args)
{
diff --git a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs
index 77c8620ea49f..39ddca3412b8 100644
--- a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs
+++ b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs
@@ -1,5 +1,8 @@
+using Content.Server.Abilities.Chitinid;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
+using Content.Server.Chat.Managers;
+using Content.Shared.Chat;
using Content.Shared.Chemistry;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Components.SolutionManager;
@@ -13,6 +16,8 @@
using Content.Shared.Interaction;
using Content.Shared.Mobs.Components;
using Content.Shared.Stacks;
+using Robust.Server.Player;
+
namespace Content.Server.Chemistry.EntitySystems;
@@ -20,6 +25,10 @@ public sealed class InjectorSystem : SharedInjectorSystem
{
[Dependency] private readonly BloodstreamSystem _blood = default!;
[Dependency] private readonly ReactiveSystem _reactiveSystem = default!;
+ [Dependency] private readonly IChatManager _chat = default!;
+ [Dependency] private readonly IPlayerManager _playerManager = default!;
+
+ private const ChatChannel BlockInjectionDenyChannel = ChatChannel.Emotes;
public override void Initialize()
{
@@ -114,6 +123,24 @@ private void OnInjectorAfterInteract(Entity entity, ref After
///
private void InjectDoAfter(Entity injector, EntityUid target, EntityUid user)
{
+ if (TryComp(target, out var blockComponent)) // DeltaV
+ {
+ var msg = Loc.GetString($"injector-component-deny-{blockComponent.BlockReason}");
+ Popup.PopupEntity(msg, target, user);
+
+ if (!_playerManager.TryGetSessionByEntity(target, out var session))
+ return;
+
+ _chat.ChatMessageToOne(
+ BlockInjectionDenyChannel,
+ msg,
+ msg,
+ EntityUid.Invalid,
+ false,
+ session.Channel);
+ return;
+ }
+
// Create a pop-up for the user
if (injector.Comp.ToggleState == InjectorToggleMode.Draw)
{
@@ -254,6 +281,9 @@ private void TryInjectIntoBloodstream(Entity injector, Entity
private void TryInject(Entity injector, EntityUid targetEntity,
Entity targetSolution, EntityUid user, bool asRefill)
{
+ if (HasComp(targetEntity)) // DeltaV
+ return;
+
if (!SolutionContainers.TryGetSolution(injector.Owner, injector.Comp.SolutionName, out var soln,
out var solution) || solution.Volume == 0)
return;
diff --git a/Content.Server/Clothing/Systems/LoadoutSystem.cs b/Content.Server/Clothing/Systems/LoadoutSystem.cs
index 91826188994f..b27f33c9547d 100644
--- a/Content.Server/Clothing/Systems/LoadoutSystem.cs
+++ b/Content.Server/Clothing/Systems/LoadoutSystem.cs
@@ -34,10 +34,15 @@ public sealed class LoadoutSystem : EntitySystem
[Dependency] private readonly ISerializationManager _serialization = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IComponentFactory _componentFactory = default!;
+ [Dependency] private readonly ILogManager _log = default!;
+
+ private ISawmill _sawmill = default!;
public override void Initialize()
{
+ _sawmill = _log.GetSawmill("loadouts");
+
SubscribeLocalEvent(OnPlayerSpawnComplete);
}
@@ -46,7 +51,7 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent ev)
{
if (ev.JobId == null || Deleted(ev.Mob) || !Exists(ev.Mob)
|| !HasComp(ev.Mob) // TODO: FIND THE STUPID RACE CONDITION THAT IS MAKING ME CHECK FOR THIS.
- || !_protoMan.TryIndex(ev.JobId, out _)
+ || !_protoMan.TryIndex(ev.JobId, out var job)
|| !_configurationManager.GetCVar(CCVars.GameLoadoutsEnabled))
return;
@@ -55,7 +60,8 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent ev)
ev.JobId,
ev.Profile,
_playTimeTracking.GetTrackerTimes(ev.Player),
- ev.Player.ContentData()?.Whitelisted ?? false);
+ ev.Player.ContentData()?.Whitelisted ?? false,
+ jobProto: job);
}
@@ -66,29 +72,36 @@ public void ApplyCharacterLoadout(
HumanoidCharacterProfile profile,
Dictionary playTimes,
bool whitelisted,
- bool deleteFailed = false)
+ bool deleteFailed = false,
+ JobPrototype? jobProto = null)
{
// Spawn the loadout, get a list of items that failed to equip
var (failedLoadouts, allLoadouts) =
_loadout.ApplyCharacterLoadout(uid, job, profile, playTimes, whitelisted, out var heirlooms);
// Try to find back-mounted storage apparatus
- if (!_inventory.TryGetSlotEntity(uid, "back", out var item) ||
- !EntityManager.TryGetComponent(item, out var inventory))
- return;
-
- // Try inserting the entity into the storage, if it can't, it leaves the loadout item on the ground
- foreach (var loadout in failedLoadouts)
- {
- if ((!EntityManager.TryGetComponent(loadout, out var itemComp)
- || !_storage.CanInsert(item.Value, loadout, out _, inventory, itemComp)
- || !_storage.Insert(item.Value, loadout, out _, playSound: false))
- && deleteFailed)
- EntityManager.QueueDeleteEntity(loadout);
- }
+ if (_inventory.TryGetSlotEntity(uid, "back", out var item) &&
+ EntityManager.TryGetComponent(item, out var inventory))
+ // Try inserting the entity into the storage, if it can't, it leaves the loadout item on the ground
+ foreach (var loadout in failedLoadouts)
+ if ((!EntityManager.TryGetComponent(loadout, out var itemComp)
+ || !_storage.CanInsert(item.Value, loadout, out _, inventory, itemComp)
+ || !_storage.Insert(item.Value, loadout, out _, playSound: false))
+ && deleteFailed)
+ EntityManager.QueueDeleteEntity(loadout);
foreach (var loadout in allLoadouts)
{
+ if (loadout.Item1 == EntityUid.Invalid
+ || !HasComp(loadout.Item1)
+ || Deleted(loadout.Item1))
+ {
+ _sawmill.Warning($"Loadout {loadout.Item2.LoadoutName} failed to load properly, deleting.");
+ EntityManager.QueueDeleteEntity(loadout.Item1);
+
+ continue;
+ }
+
var loadoutProto = _protoMan.Index(loadout.Item2.LoadoutName);
if (loadoutProto.CustomName && loadout.Item2.CustomName != null)
_meta.SetEntityName(loadout.Item1, loadout.Item2.CustomName);
@@ -122,5 +135,10 @@ public void ApplyCharacterLoadout(
Dirty(uid, haver);
Dirty(heirloom.Item1, comp);
}
+
+ if (jobProto != null ||
+ _protoMan.TryIndex(job, out jobProto))
+ foreach (var special in jobProto.AfterLoadoutSpecial)
+ special.AfterEquip(uid);
}
}
diff --git a/Content.Server/Construction/ConstructionSystem.Interactions.cs b/Content.Server/Construction/ConstructionSystem.Interactions.cs
index ad7b2a11b0ed..c844dd2c9adc 100644
--- a/Content.Server/Construction/ConstructionSystem.Interactions.cs
+++ b/Content.Server/Construction/ConstructionSystem.Interactions.cs
@@ -2,7 +2,6 @@
using Content.Server.Administration.Logs;
using Content.Server.Construction.Components;
using Content.Server.Temperature.Components;
-using Content.Server.Temperature.Systems;
using Content.Shared.Construction;
using Content.Shared.Construction.Components;
using Content.Shared.Construction.EntitySystems;
@@ -11,6 +10,7 @@
using Content.Shared.Interaction;
using Content.Shared.Prying.Systems;
using Content.Shared.Radio.EntitySystems;
+using Content.Shared.Temperature;
using Content.Shared.Tools.Systems;
using Robust.Shared.Containers;
using Robust.Shared.Utility;
diff --git a/Content.Server/Damage/Components/DamageOnHitComponent.cs b/Content.Server/Damage/Components/DamageOnHitComponent.cs
index 3580e9a8d544..31b3ea730a36 100644
--- a/Content.Server/Damage/Components/DamageOnHitComponent.cs
+++ b/Content.Server/Damage/Components/DamageOnHitComponent.cs
@@ -1,7 +1,9 @@
using Content.Shared.Damage;
+using Content.Shared._Shitmed.Targeting;
-// Damages the held item by a set amount when it hits someone. Can be used to make melee items limited-use.
+// Damages the entity by a set amount when it hits someone.
+// Can be used to make melee items limited-use or make an entity deal self-damage with unarmed attacks.
namespace Content.Server.Damage.Components;
[RegisterComponent]
@@ -14,5 +16,13 @@ public sealed partial class DamageOnHitComponent : Component
[DataField("damage", required: true)]
[ViewVariables(VVAccess.ReadWrite)]
public DamageSpecifier Damage = default!;
-}
+ //
+ // The body parts to deal damage to.
+ // When there is more than one listed element,
+ // randomly selects between one of the elements.
+ //
+ [DataField]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public List? TargetParts = null;
+}
diff --git a/Content.Server/Damage/Systems/DamageOnHitSystem.cs b/Content.Server/Damage/Systems/DamageOnHitSystem.cs
index f129a14f799c..3626796dcdad 100644
--- a/Content.Server/Damage/Systems/DamageOnHitSystem.cs
+++ b/Content.Server/Damage/Systems/DamageOnHitSystem.cs
@@ -9,17 +9,22 @@ namespace Content.Server.Damage.Systems;
public sealed class DamageOnHitSystem : EntitySystem
{
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
+ private readonly Random _random = new Random();
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(DamageItem);
+ SubscribeLocalEvent(DamageSelf);
}
- // Looks for a hit, then damages the held item an appropriate amount.
- private void DamageItem(EntityUid uid, DamageOnHitComponent component, MeleeHitEvent args)
+
+ // Looks for a hit, then damages the entity an appropriate amount.
+ private void DamageSelf(EntityUid uid, DamageOnHitComponent component, MeleeHitEvent args)
{
if (args.HitEntities.Any()) {
- _damageableSystem.TryChangeDamage(uid, component.Damage, component.IgnoreResistances);
+ _damageableSystem.TryChangeDamage(uid, component.Damage, component.IgnoreResistances,
+ targetPart: component.TargetParts is not null
+ ? component.TargetParts[_random.Next(component.TargetParts.Count)]
+ : null);
}
}
}
diff --git a/Content.Server/DeltaV/Objectives/Components/TeachLessonConditionComponent.cs b/Content.Server/DeltaV/Objectives/Components/TeachLessonConditionComponent.cs
new file mode 100644
index 000000000000..d6c57129d5c0
--- /dev/null
+++ b/Content.Server/DeltaV/Objectives/Components/TeachLessonConditionComponent.cs
@@ -0,0 +1,20 @@
+using Content.Server.DeltaV.Objectives.Systems;
+using Content.Server.Objectives.Components;
+
+namespace Content.Server.DeltaV.Objectives.Components;
+
+///
+/// Requires that a target dies once and only once.
+/// Depends on to function.
+///
+[RegisterComponent, Access(typeof(TeachLessonConditionSystem))]
+public sealed partial class TeachLessonConditionComponent : Component
+{
+ ///
+ /// How close the assassin must be to the person "Being given a lesson", to ensure that the kill is reasonably
+ /// something that could be the assassin's doing. This way the objective isn't resolved by the target getting killed
+ /// by a space tick while on expedition.
+ ///
+ [DataField]
+ public float MaxDistance = 30f;
+}
diff --git a/Content.Server/DeltaV/Objectives/Systems/TeachLessonConditionSystem.cs b/Content.Server/DeltaV/Objectives/Systems/TeachLessonConditionSystem.cs
new file mode 100644
index 000000000000..929a361a3fed
--- /dev/null
+++ b/Content.Server/DeltaV/Objectives/Systems/TeachLessonConditionSystem.cs
@@ -0,0 +1,55 @@
+using Content.Server.DeltaV.Objectives.Components;
+using Content.Server.Objectives.Components;
+using Content.Server.Objectives.Systems;
+using Content.Shared.Mind.Components;
+using Content.Shared.Mobs;
+
+namespace Content.Server.DeltaV.Objectives.Systems;
+
+///
+/// Handles teach a lesson condition logic, does not assign target.
+///
+public sealed class TeachLessonConditionSystem : EntitySystem
+{
+ [Dependency] private readonly CodeConditionSystem _codeCondition = default!;
+ [Dependency] private readonly SharedTransformSystem _transform = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnMobStateChanged);
+ }
+
+ // TODO: subscribe by ref at some point in the future
+ private void OnMobStateChanged(MobStateChangedEvent args)
+ {
+ if (args.NewMobState != MobState.Dead)
+ return;
+
+ // Get the mind of the entity that just died (if it had one)
+ // Uses OriginalMind so if someone ghosts or otherwise loses control of a mob, you can still greentext
+ if (!TryComp(args.Target, out var mc) || mc.OriginalMind is not {} mindId)
+ return;
+
+ // Get all TeachLessonConditionComponent entities
+ var query = EntityQueryEnumerator();
+
+ while (query.MoveNext(out var uid, out var conditionComp, out var targetObjective))
+ {
+ // Check if this objective's target matches the entity that died
+ if (targetObjective.Target != mindId)
+ continue;
+
+ var userWorldPos = _transform.GetWorldPosition(uid);
+ var targetWorldPos = _transform.GetWorldPosition(args.Target);
+
+ var distance = (userWorldPos - targetWorldPos).Length();
+ if (distance > conditionComp.MaxDistance
+ || Transform(uid).MapID != Transform(args.Target).MapID)
+ continue;
+
+ _codeCondition.SetCompleted(uid);
+ }
+ }
+}
diff --git a/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs b/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs
index 142669f84a20..a81bab2ebc56 100644
--- a/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs
+++ b/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs
@@ -1,3 +1,4 @@
+using Content.Server.Clothing.Systems;
using Content.Server.DeltaV.ParadoxAnomaly.Components;
using Content.Server.DetailExaminable;
using Content.Server.GenericAntag;
@@ -37,6 +38,7 @@ public sealed class ParadoxAnomalySystem : EntitySystem
[Dependency] private readonly SharedRoleSystem _role = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly StationSpawningSystem _stationSpawning = default!;
+ [Dependency] private readonly LoadoutSystem _loadout = default!;
public override void Initialize()
{
@@ -147,6 +149,7 @@ private bool TrySpawnParadoxAnomaly(string rule, [NotNullWhen(true)] out EntityU
profile.Name,
job,
station);
+ _loadout.ApplyCharacterLoadout(spawned, job, profile, [], false); // TODO: find a way to get playtimes and whitelisted
}
foreach (var special in job.Special)
diff --git a/Content.Server/Effects/ColorFlashEffectSystem.cs b/Content.Server/Effects/ColorFlashEffectSystem.cs
index 2d2913465783..40e7060a1af5 100644
--- a/Content.Server/Effects/ColorFlashEffectSystem.cs
+++ b/Content.Server/Effects/ColorFlashEffectSystem.cs
@@ -5,8 +5,8 @@ namespace Content.Server.Effects;
public sealed class ColorFlashEffectSystem : SharedColorFlashEffectSystem
{
- public override void RaiseEffect(Color color, List entities, Filter filter)
+ public override void RaiseEffect(Color color, List entities, Filter filter, float? animationLength = null)
{
- RaiseNetworkEvent(new ColorFlashEffectEvent(color, GetNetEntityList(entities)), filter);
+ RaiseNetworkEvent(new ColorFlashEffectEvent(color, GetNetEntityList(entities), animationLength), filter);
}
}
diff --git a/Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs b/Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs
index 9ba0ee4b00a8..2a494ca21157 100644
--- a/Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs
+++ b/Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs
@@ -29,6 +29,7 @@ public bool TryAdjustBloodstream(Entity ent)
{
if (!TryComp(ent, out var bloodstream)
|| !_solutionContainer.TryGetSolution(ent.Owner, bloodstream.BloodSolutionName, out var bloodSolutionEnt)
+ || bloodstream.BloodMaxVolume == 0
|| !_config.GetCVar(CCVars.HeightAdjustModifiesBloodstream))
return false;
diff --git a/Content.Server/Jobs/ModifyEnvirohelmSpecial.cs b/Content.Server/Jobs/ModifyEnvirohelmSpecial.cs
new file mode 100644
index 000000000000..28ad9db0941b
--- /dev/null
+++ b/Content.Server/Jobs/ModifyEnvirohelmSpecial.cs
@@ -0,0 +1,52 @@
+using Content.Shared.Containers.ItemSlots;
+using Content.Shared.Humanoid;
+using Content.Shared.Humanoid.Prototypes;
+using Content.Shared.Inventory;
+using Content.Shared.Roles;
+using Content.Shared.Tag;
+using JetBrains.Annotations;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.Jobs;
+
+[UsedImplicitly]
+public sealed partial class ModifyEnvirohelmSpecial : JobSpecial
+{
+ //
+ // The new power cell of the envirohelm.
+ //
+ [DataField(required: true)]
+ public ProtoId PowerCell { get; private set; }
+
+ [ValidatePrototypeId]
+ private const string Species = "Plasmaman";
+
+ [ValidatePrototypeId]
+ private const string Tag = "Envirohelm";
+
+ private const string Slot = "head";
+
+ private const string ItemSlot = "cell_slot";
+
+ public override void AfterEquip(EntityUid mob)
+ {
+ var entMan = IoCManager.Resolve();
+ if (!entMan.TryGetComponent(mob, out var appearanceComp) ||
+ appearanceComp.Species != Species ||
+ !entMan.System().TryGetSlotEntity(mob, Slot, out var helmet) ||
+ helmet is not { } envirohelm ||
+ !entMan.System().HasTag(envirohelm, Tag) ||
+ !entMan.TryGetComponent(envirohelm, out var itemSlotsComp))
+ return;
+
+ var itemSlotsSystem = entMan.System();
+
+ if (itemSlotsSystem.GetItemOrNull(envirohelm, ItemSlot, itemSlotsComp) is { } powerCellToDelete)
+ entMan.DeleteEntity(powerCellToDelete);
+
+ var powerCell = entMan.Spawn(PowerCell);
+
+ if (!itemSlotsSystem.TryInsert(envirohelm, ItemSlot, powerCell, null, itemSlotsComp, excludeUserAudio: true))
+ entMan.DeleteEntity(powerCell);
+ }
+}
diff --git a/Content.Server/Jobs/ModifyEnvirosuitSpecial.cs b/Content.Server/Jobs/ModifyEnvirosuitSpecial.cs
new file mode 100644
index 000000000000..ff03f5debd13
--- /dev/null
+++ b/Content.Server/Jobs/ModifyEnvirosuitSpecial.cs
@@ -0,0 +1,36 @@
+using Content.Shared.Humanoid;
+using Content.Shared.Humanoid.Prototypes;
+using Content.Shared.Inventory;
+using Content.Shared.Roles;
+using Content.Shared.SelfExtinguisher;
+using JetBrains.Annotations;
+
+namespace Content.Server.Jobs;
+
+[UsedImplicitly]
+public sealed partial class ModifyEnvirosuitSpecial : JobSpecial
+{
+ //
+ // The new charges of the envirosuit's self-extinguisher.
+ //
+ [DataField(required: true)]
+ public int Charges { get; private set; }
+
+ [ValidatePrototypeId]
+ private const string Species = "Plasmaman";
+
+ private const string Slot = "jumpsuit";
+
+ public override void AfterEquip(EntityUid mob)
+ {
+ var entMan = IoCManager.Resolve();
+ if (!entMan.TryGetComponent(mob, out var appearance) ||
+ appearance.Species != Species ||
+ !entMan.System().TryGetSlotEntity(mob, Slot, out var jumpsuit) ||
+ jumpsuit is not { } envirosuit ||
+ !entMan.TryGetComponent(envirosuit, out var selfExtinguisher))
+ return;
+
+ entMan.System().SetCharges(envirosuit, Charges, Charges, selfExtinguisher);
+ }
+}
diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs
index 91e8b2bf9817..07c1140f167e 100644
--- a/Content.Server/Medical/HealthAnalyzerSystem.cs
+++ b/Content.Server/Medical/HealthAnalyzerSystem.cs
@@ -247,7 +247,7 @@ public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool s
_solutionContainerSystem.ResolveSolution(target, bloodstream.BloodSolutionName,
ref bloodstream.BloodSolution, out var bloodSolution))
{
- bloodAmount = bloodSolution.FillFraction;
+ bloodAmount = bloodSolution.MaxVolume != 0 ? bloodSolution.FillFraction : 0;
bleeding = bloodstream.BleedAmount > 0;
}
diff --git a/Content.Server/Mind/MindSystem.cs b/Content.Server/Mind/MindSystem.cs
index 2e7c31ec7a65..4934fb8bccd1 100644
--- a/Content.Server/Mind/MindSystem.cs
+++ b/Content.Server/Mind/MindSystem.cs
@@ -264,6 +264,7 @@ public override void TransferTo(EntityUid mindId, EntityUid? entity, bool ghostC
if (entity != null)
{
component!.Mind = mindId;
+ component.OriginalMind ??= mindId; // DeltaV
mind.OwnedEntity = entity;
mind.OriginalOwnedEntity ??= GetNetEntity(mind.OwnedEntity);
Entity mindEnt = (mindId, mind);
diff --git a/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs b/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs
index ec1b81cfb34f..b56e8e9abeda 100644
--- a/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs
+++ b/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs
@@ -214,7 +214,7 @@ private void CookItem(EntityUid uid, DeepFryerComponent component, EntityUid ite
if (TryComp(item, out var tempComp))
{
// Push the temperature towards what it should be but no higher.
- var delta = (component.PoweredTemperature - tempComp.CurrentTemperature) * tempComp.HeatCapacity;
+ var delta = (component.PoweredTemperature - tempComp.CurrentTemperature) * _temperature.GetHeatCapacity(item, tempComp);
if (delta > 0f)
_temperature.ChangeHeat(item, delta, false, tempComp);
diff --git a/Content.Server/SelfExtinguisher/SelfExtinguisherSystem.cs b/Content.Server/SelfExtinguisher/SelfExtinguisherSystem.cs
new file mode 100644
index 000000000000..b4d5a63c725c
--- /dev/null
+++ b/Content.Server/SelfExtinguisher/SelfExtinguisherSystem.cs
@@ -0,0 +1,130 @@
+using Content.Server.Atmos.Components;
+using Content.Server.Atmos.EntitySystems;
+using Content.Shared.Actions;
+using Content.Shared.Charges.Components;
+using Content.Shared.Charges.Systems;
+using Content.Shared.Effects;
+using Content.Shared.IdentityManagement;
+using Content.Shared.Popups;
+using Content.Shared.SelfExtinguisher;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Containers;
+using Robust.Shared.Player;
+using Robust.Shared.Timing;
+
+namespace Content.Server.SelfExtinguisher;
+
+public sealed partial class SelfExtinguisherSystem : SharedSelfExtinguisherSystem
+{
+ [Dependency] private readonly FlammableSystem _flammable = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly SharedChargesSystem _charges = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly SharedActionsSystem _actions = default!;
+ [Dependency] private readonly SharedColorFlashEffectSystem _color = default!;
+
+ // Same color as the water reagent
+ private readonly Color ExtinguishColor = Color.FromHex("#75b1f0");
+ private const float ExtinguishAnimationLength = 0.45f;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnSelfExtinguish);
+ }
+
+ private void OnSelfExtinguish(EntityUid uid, SelfExtinguisherComponent component, SelfExtinguishEvent args)
+ {
+ TryExtinguish(args.Performer, uid, component);
+ }
+
+ private void TryExtinguish(EntityUid user, EntityUid uid, SelfExtinguisherComponent? selfExtinguisher = null)
+ {
+ if (!_container.TryGetContainingContainer((uid, null, null), out var container) ||
+ !TryComp(container.Owner, out var flammable) ||
+ !Resolve(uid, ref selfExtinguisher))
+ return;
+
+ var target = container.Owner;
+ var targetIdentity = Identity.Entity(target, EntityManager);
+ var locSuffix = user == target ? "self" : "other";
+
+ var curTime = _timing.CurTime;
+ if (TryComp(uid, out var charges) &&
+ _charges.IsEmpty(uid, charges))
+ {
+ if (!SetPopupCooldown((uid, selfExtinguisher), curTime))
+ return;
+
+ _popup.PopupEntity(Loc.GetString("self-extinguisher-no-charges", ("item", uid)),
+ target, user, !flammable.OnFire ? PopupType.Small : PopupType.MediumCaution);
+ return;
+ }
+
+ if (selfExtinguisher.NextExtinguish > curTime)
+ {
+ if (!SetPopupCooldown((uid, selfExtinguisher), curTime))
+ return;
+
+ _popup.PopupEntity(Loc.GetString($"self-extinguisher-on-cooldown", ("item", uid)),
+ target, user, !flammable.OnFire ? PopupType.Small : PopupType.MediumCaution);
+ return;
+ }
+
+ if (!flammable.OnFire)
+ {
+ if (!SetPopupCooldown((uid, selfExtinguisher), curTime))
+ return;
+
+ _popup.PopupEntity(Loc.GetString($"self-extinguisher-not-on-fire-{locSuffix}", ("item", uid), ("target", targetIdentity)),
+ target, user);
+ return;
+ }
+
+ if (selfExtinguisher.RequiresIgniteFromGasImmune &&
+ // Non-self-igniters can use the self-extinguish whenever, but self-igniters must have
+ // all ignitable body parts covered up
+ TryComp(target, out var ignite) && !ignite.HasImmunity)
+ {
+ if (!SetPopupCooldown((uid, selfExtinguisher), curTime))
+ return;
+
+ _popup.PopupEntity(Loc.GetString($"self-extinguisher-not-immune-to-fire-{locSuffix}", ("item", uid), ("target", targetIdentity)),
+ target, user, PopupType.MediumCaution);
+ return;
+ }
+
+ _flammable.Extinguish(target, flammable);
+ _color.RaiseEffect(ExtinguishColor, [target], Filter.Pvs(target, entityManager: EntityManager), ExtinguishAnimationLength);
+ _audio.PlayPvs(selfExtinguisher.Sound, uid, selfExtinguisher.Sound.Params.WithVariation(0.125f));
+
+ _popup.PopupPredicted(
+ Loc.GetString("self-extinguisher-extinguish-other", ("item", uid), ("target", targetIdentity)),
+ target, target, PopupType.Medium
+ );
+ _popup.PopupEntity(
+ Loc.GetString("self-extinguisher-extinguish-self", ("item", uid)),
+ target, target, PopupType.Medium
+ );
+
+ if (charges != null)
+ {
+ _charges.UseCharge(uid, charges);
+ _actions.RemoveCharges(selfExtinguisher.ActionEntity, 1);
+
+ if (_actions.GetCharges(selfExtinguisher.ActionEntity) == 0)
+ {
+ _actions.SetEnabled(selfExtinguisher.ActionEntity, false);
+ return; // Don't set cooldown when out of charges, they can't use it anymore anyways
+ }
+ }
+
+ selfExtinguisher.NextExtinguish = curTime + selfExtinguisher.Cooldown;
+ _actions.StartUseDelay(selfExtinguisher.ActionEntity);
+
+ Dirty(uid, selfExtinguisher);
+ }
+}
diff --git a/Content.Server/Speech/EntitySystems/SkeletonAccentSystem.cs b/Content.Server/Speech/EntitySystems/SkeletonAccentSystem.cs
index d143c25fdbab..d83262953048 100644
--- a/Content.Server/Speech/EntitySystems/SkeletonAccentSystem.cs
+++ b/Content.Server/Speech/EntitySystems/SkeletonAccentSystem.cs
@@ -1,4 +1,4 @@
-using System.Text.RegularExpressions;
+using System.Text.RegularExpressions;
using Content.Server.Speech.Components;
using Robust.Shared.Random;
@@ -27,7 +27,8 @@ public sealed partial class SkeletonAccentSystem : EntitySystem
{ "killed", "skeletonized"},
{ "humorous", "humerus"},
{ "to be a", "tibia"},
- { "under", "ulna"}
+ { "under", "ulna"},
+ { "narrow", "marrow"},
};
public override void Initialize()
diff --git a/Content.Server/Station/Systems/StationSpawningSystem.cs b/Content.Server/Station/Systems/StationSpawningSystem.cs
index 85f5662b421a..f44416d0c98c 100644
--- a/Content.Server/Station/Systems/StationSpawningSystem.cs
+++ b/Content.Server/Station/Systems/StationSpawningSystem.cs
@@ -12,6 +12,7 @@
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
using Content.Shared.CCVar;
+using Content.Shared.Customization.Systems;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Prototypes;
using Content.Shared.PDA;
@@ -50,6 +51,7 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
[Dependency] private readonly InternalEncryptionKeySpawner _internalEncryption = default!;
[Dependency] private readonly ArrivalsSystem _arrivalsSystem = default!;
[Dependency] private readonly ContainerSpawnPointSystem _containerSpawnPointSystem = default!;
+ [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!;
private bool _randomizeCharacters;
@@ -142,6 +144,9 @@ public EntityUid SpawnPlayerMob(
if (prototype?.StartingGear != null)
{
var startingGear = _prototypeManager.Index(prototype.StartingGear);
+ if (profile != null)
+ startingGear = ApplySubGear(startingGear, profile, prototype);
+
EquipStartingGear(entity.Value, startingGear, raiseEvent: false);
if (profile != null)
EquipIdCard(entity.Value, profile.Name, prototype, station);
diff --git a/Content.Server/Temperature/Components/TemperatureComponent.cs b/Content.Server/Temperature/Components/TemperatureComponent.cs
index 3bfa12f26938..ae2c373b1403 100644
--- a/Content.Server/Temperature/Components/TemperatureComponent.cs
+++ b/Content.Server/Temperature/Components/TemperatureComponent.cs
@@ -1,4 +1,3 @@
-using Content.Server.Temperature.Systems;
using Content.Shared.Alert;
using Content.Shared.Atmos;
using Content.Shared.Damage;
@@ -51,15 +50,6 @@ public sealed partial class TemperatureComponent : Component
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float AtmosTemperatureTransferEfficiency = 0.1f;
- [Obsolete("Use system method")]
- public float HeatCapacity
- {
- get
- {
- return IoCManager.Resolve().System().GetHeatCapacity(Owner, this);
- }
- }
-
[DataField, ViewVariables(VVAccess.ReadWrite)]
public DamageSpecifier ColdDamage = new();
@@ -71,7 +61,7 @@ public float HeatCapacity
///
///
/// Okay it genuinely reaches this basically immediately for a plasma fire.
- ///
+ ///
[DataField, ViewVariables(VVAccess.ReadWrite)]
public FixedPoint2 DamageCap = FixedPoint2.New(8);
@@ -79,7 +69,7 @@ public float HeatCapacity
/// Used to keep track of when damage starts/stops. Useful for logs.
///
[DataField]
- public bool TakingDamage = false;
+ public bool TakingDamage;
[DataField]
public ProtoId HotAlert = "Hot";
diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs
index ee13cb96a5e3..be6dc782408c 100644
--- a/Content.Server/Temperature/Systems/TemperatureSystem.cs
+++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs
@@ -208,11 +208,18 @@ private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureCha
if (args.CurrentTemperature <= idealTemp)
{
+ // If there's no risk to being cold there's no reason to show a Cold alert
+ if (!temperature.ColdDamage.AnyPositive())
+ return;
+
type = temperature.ColdAlert;
threshold = temperature.ColdDamageThreshold;
}
else
{
+ if (!temperature.HeatDamage.AnyPositive())
+ return;
+
type = temperature.HotAlert;
threshold = temperature.HeatDamageThreshold;
}
@@ -414,17 +421,3 @@ private void RecalculateAndApplyParentThresholds(EntityUid uid,
return (newHeatThreshold, newColdThreshold);
}
}
-
-public sealed class OnTemperatureChangeEvent : EntityEventArgs
-{
- public float CurrentTemperature { get; }
- public float LastTemperature { get; }
- public float TemperatureDelta { get; }
-
- public OnTemperatureChangeEvent(float current, float last, float delta)
- {
- CurrentTemperature = current;
- LastTemperature = last;
- TemperatureDelta = delta;
- }
-}
diff --git a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs
index 133876bd751f..8ff49b4d10f4 100644
--- a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs
+++ b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs
@@ -1,8 +1,12 @@
using Content.Server.Thief.Components;
+using Content.Shared.Customization.Systems;
+using Content.Shared.Humanoid;
+using Content.Shared.Roles;
using Content.Shared.Item;
using Content.Shared.Thief;
using Robust.Server.GameObjects;
using Robust.Server.Audio;
+using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
namespace Content.Server.Thief.Systems;
@@ -15,8 +19,10 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem
{
[Dependency] private readonly AudioSystem _audio = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
+ [Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
+ [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!;
private const int MaxSelectedSets = 2;
public override void Initialize()
@@ -30,7 +36,7 @@ public override void Initialize()
private void OnUIOpened(Entity backpack, ref BoundUIOpenedEvent args)
{
- UpdateUI(backpack.Owner, backpack.Comp);
+ UpdateUI(backpack.Owner, args.Actor, backpack.Comp);
}
private void OnApprove(Entity backpack, ref ThiefBackpackApproveMessage args)
@@ -57,10 +63,10 @@ private void OnChangeSet(Entity backpack, re
if (!backpack.Comp.SelectedSets.Remove(args.SetNumber))
backpack.Comp.SelectedSets.Add(args.SetNumber);
- UpdateUI(backpack.Owner, backpack.Comp);
+ UpdateUI(backpack.Owner, args.Actor, backpack.Comp);
}
- private void UpdateUI(EntityUid uid, ThiefUndeterminedBackpackComponent? component = null)
+ private void UpdateUI(EntityUid uid, EntityUid user, ThiefUndeterminedBackpackComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
@@ -70,6 +76,15 @@ private void UpdateUI(EntityUid uid, ThiefUndeterminedBackpackComponent? compone
for (int i = 0; i < component.PossibleSets.Count; i++)
{
var set = _proto.Index(component.PossibleSets[i]);
+
+ if (set.Requirements.Count != 0 &&
+ TryComp(user, out var appearance) &&
+ appearance.LastProfileLoaded != null &&
+ !_characterRequirements.CheckRequirementsValid(
+ set.Requirements, new JobPrototype() /* not gonna bother with jobs */,
+ appearance.LastProfileLoaded, new(), false, set, EntityManager, _proto, _config, out _))
+ continue;
+
var selected = component.SelectedSets.Contains(i);
var info = new ThiefBackpackSetInfo(
set.Name,
diff --git a/Content.Server/Traits/TraitSystem.Functions.cs b/Content.Server/Traits/TraitSystem.Functions.cs
index 8306105b936d..deb3102d4ba6 100644
--- a/Content.Server/Traits/TraitSystem.Functions.cs
+++ b/Content.Server/Traits/TraitSystem.Functions.cs
@@ -673,5 +673,7 @@ public override void OnPlayerSpawn(EntityUid uid,
if (AttackRateModifier != null)
melee.AttackRate *= AttackRateModifier.Value;
+
+ entityManager.Dirty(uid, melee);
}
}
diff --git a/Content.Server/_DV/Abilities/Chitinid/BlockInjectionComponent.cs b/Content.Server/_DV/Abilities/Chitinid/BlockInjectionComponent.cs
new file mode 100644
index 000000000000..8ba332ce765f
--- /dev/null
+++ b/Content.Server/_DV/Abilities/Chitinid/BlockInjectionComponent.cs
@@ -0,0 +1,9 @@
+namespace Content.Server.Abilities.Chitinid;
+
+
+[RegisterComponent]
+public sealed partial class BlockInjectionComponent : Component
+{
+ [DataField]
+ public string BlockReason { get; set; } = string.Empty;
+}
diff --git a/Content.Server/_DV/Abilities/Chitinid/ChitinidComponent.cs b/Content.Server/_DV/Abilities/Chitinid/ChitinidComponent.cs
new file mode 100644
index 000000000000..871d10a7c275
--- /dev/null
+++ b/Content.Server/_DV/Abilities/Chitinid/ChitinidComponent.cs
@@ -0,0 +1,41 @@
+using Content.Shared.Damage;
+using Content.Shared.Damage.Prototypes;
+using Content.Shared.FixedPoint;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
+
+namespace Content.Server.Abilities.Chitinid;
+
+[RegisterComponent]
+public sealed partial class ChitinidComponent : Component
+{
+ [DataField]
+ public EntProtoId ChitzitePrototype = "Chitzite";
+
+ [DataField]
+ public EntProtoId ChitziteActionId = "ActionChitzite";
+
+ [DataField]
+ public EntityUid? ChitziteAction;
+
+ [DataField]
+ public FixedPoint2 AmountAbsorbed = 0f;
+
+ [DataField]
+ public DamageSpecifier Healing = new()
+ {
+ DamageDict = new()
+ {
+ { "Radiation", -0.5 },
+ }
+ };
+
+ [DataField]
+ public FixedPoint2 MaximumAbsorbed = 30f;
+
+ [DataField]
+ public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1);
+
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
+ public TimeSpan NextUpdate;
+}
diff --git a/Content.Server/_DV/Abilities/Chitinid/ChitinidSystem.cs b/Content.Server/_DV/Abilities/Chitinid/ChitinidSystem.cs
new file mode 100644
index 000000000000..34d8244d5c9b
--- /dev/null
+++ b/Content.Server/_DV/Abilities/Chitinid/ChitinidSystem.cs
@@ -0,0 +1,97 @@
+using Content.Server.Nutrition.Components;
+using Content.Shared.Actions;
+using Content.Shared.Actions.Events;
+using Content.Shared.Audio;
+using Content.Shared.Damage;
+using Content.Shared.IdentityManagement;
+using Content.Shared.Inventory;
+using Content.Shared.Mobs.Systems;
+using Content.Shared.Popups;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Timing;
+
+namespace Content.Server.Abilities.Chitinid;
+
+public sealed partial class ChitinidSystem : EntitySystem
+{
+ [Dependency] private readonly SharedActionsSystem _actions = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly IPrototypeManager _proto = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly InventorySystem _inventory = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly DamageableSystem _damageable = default!;
+ [Dependency] private readonly MobStateSystem _mobState = default!;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnChitzite);
+ SubscribeLocalEvent(OnMapInit);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out var uid, out var chitinid, out var damageable))
+ {
+ if (_timing.CurTime < chitinid.NextUpdate)
+ continue;
+
+ chitinid.NextUpdate += chitinid.UpdateInterval;
+
+ if (chitinid.AmountAbsorbed >= chitinid.MaximumAbsorbed || _mobState.IsDead(uid))
+ continue;
+
+ if (_damageable.TryChangeDamage(uid, chitinid.Healing, damageable: damageable) is {} delta)
+ {
+ chitinid.AmountAbsorbed += -delta.GetTotal().Float();
+ if (chitinid.ChitziteAction != null && chitinid.AmountAbsorbed >= chitinid.MaximumAbsorbed)
+ {
+ _actions.SetCharges(chitinid.ChitziteAction, 1); // You get the charge back and that's it. Tough.
+ _actions.SetEnabled(chitinid.ChitziteAction, true);
+ }
+ }
+ }
+
+ var entQuery = EntityQueryEnumerator();
+ while (entQuery.MoveNext(out var ent, out var chitzite, out var chitinid))
+ {
+ if (_timing.CurTime < chitzite.NextCough)
+ continue;
+
+ Spawn(chitinid.ChitzitePrototype, Transform(ent).Coordinates);
+ chitinid.AmountAbsorbed = 0f;
+ RemCompDeferred(ent, chitzite);
+ }
+ }
+
+ private void OnMapInit(Entity ent, ref MapInitEvent args)
+ {
+ if (ent.Comp.ChitziteAction != null)
+ return;
+
+ ent.Comp.NextUpdate = _timing.CurTime + ent.Comp.UpdateInterval;
+
+ _actions.AddAction(ent, ref ent.Comp.ChitziteAction, ent.Comp.ChitziteActionId);
+ }
+
+ private void OnChitzite(Entity ent, ref ChitziteActionEvent args)
+ {
+ if (_inventory.TryGetSlotEntity(ent, "mask", out var maskUid) &&
+ TryComp(maskUid, out var blocker) &&
+ blocker.Enabled)
+ {
+ _popup.PopupEntity(Loc.GetString("chitzite-mask", ("mask", maskUid)), ent, ent);
+ return;
+ }
+
+ _popup.PopupEntity(Loc.GetString("chitzite-cough", ("name", Identity.Entity(ent, EntityManager))), ent);
+ _audio.PlayPvs("/Audio/Animals/cat_hiss.ogg", ent, AudioHelpers.WithVariation(0.15f));
+
+ var chitzite = EnsureComp(ent);
+ chitzite.NextCough = _timing.CurTime + chitzite.CoughUpTime;
+ args.Handled = true;
+ }
+}
diff --git a/Content.Server/_DV/Abilities/Chitinid/CoughingUpChitziteComponent.cs b/Content.Server/_DV/Abilities/Chitinid/CoughingUpChitziteComponent.cs
new file mode 100644
index 000000000000..1dae46b9437a
--- /dev/null
+++ b/Content.Server/_DV/Abilities/Chitinid/CoughingUpChitziteComponent.cs
@@ -0,0 +1,14 @@
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
+
+namespace Content.Server.Abilities.Chitinid;
+
+[RegisterComponent, AutoGenerateComponentPause]
+public sealed partial class CoughingUpChitziteComponent : Component
+{
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
+ [AutoPausedField]
+ public TimeSpan NextCough;
+
+ [DataField]
+ public TimeSpan CoughUpTime = TimeSpan.FromSeconds(2.15);
+}
diff --git a/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs
new file mode 100644
index 000000000000..5af24b34d85e
--- /dev/null
+++ b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs
@@ -0,0 +1,14 @@
+using Content.Shared.Storage;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._EstacaoPirata.OpenTriggeredStorageFill;
+
+///
+/// This is used for storing an item prototype to be inserted into a container when the trigger is activated. This is deleted from the entity after the item is inserted.
+///
+[RegisterComponent]
+public sealed partial class OpenTriggeredStorageFillComponent : Component
+{
+ [DataField]
+ public List Contents = new();
+}
diff --git a/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs
new file mode 100644
index 000000000000..bb2123cc899b
--- /dev/null
+++ b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs
@@ -0,0 +1,67 @@
+using Content.Server.Popups;
+using Content.Server.Spawners.Components;
+using Content.Shared.Examine;
+using Content.Shared.Interaction;
+using Content.Shared.Item;
+using Content.Shared.Localizations;
+using Content.Shared.Prototypes;
+using Content.Shared.Storage;
+using Content.Shared.Storage.EntitySystems;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+
+namespace Content.Server._EstacaoPirata.OpenTriggeredStorageFill;
+
+///
+/// This handles...
+///
+public sealed class OpenTriggeredStorageFillSystem : EntitySystem
+{
+
+ [Dependency] private readonly SharedStorageSystem _storage = default!;
+ [Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly IPrototypeManager _prototype = default!;
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnOpenEvent);
+ SubscribeLocalEvent(OnExamineEvent);
+ }
+
+ private void OnExamineEvent(EntityUid uid, OpenTriggeredStorageFillComponent component, ExaminedEvent args)
+ {
+ args.PushText(Loc.GetString("container-sealed"));
+ }
+
+ //Yes, that's a copy of StorageSystem StorageFill method
+ private void OnOpenEvent(EntityUid uid, OpenTriggeredStorageFillComponent comp, ActivateInWorldEvent args)
+ {
+ Log.Debug($"Processing storage fill trigger for entity {ToPrettyString(uid)}");
+
+ var coordinates = Transform(uid).Coordinates;
+
+ var spawnItems = EntitySpawnCollection.GetSpawns(comp.Contents);
+ foreach (var item in spawnItems)
+ {
+ DebugTools.Assert(!_prototype.Index(item)
+ .HasComponent(typeof(RandomSpawnerComponent)));
+ var ent = Spawn(item, coordinates);
+
+ if (!TryComp(ent, out var itemComp))
+ {
+ Log.Error($"Tried to fill {ToPrettyString(uid)} with non-item {item}.");
+ Del(ent);
+ continue;
+ }
+ if (!_storage.Insert(uid, ent, out var remainingEnt, out var reason, playSound: false))
+ {
+ Log.Error($"Failed to fill {ToPrettyString(uid)} with {ToPrettyString(ent)}. Reason: {reason}");
+ // Clean up the spawned entity if insertion fails
+ Del(ent);
+ }
+ }
+ _popup.PopupEntity(Loc.GetString("container-unsealed"), args.Target);
+ RemComp(uid, comp);
+ }
+}
diff --git a/Content.Shared/Actions/BaseActionComponent.cs b/Content.Shared/Actions/BaseActionComponent.cs
index 720900b78400..481c4e80753d 100644
--- a/Content.Shared/Actions/BaseActionComponent.cs
+++ b/Content.Shared/Actions/BaseActionComponent.cs
@@ -1,4 +1,4 @@
-using Robust.Shared.Audio;
+using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
@@ -26,6 +26,16 @@ public abstract partial class BaseActionComponent : Component
///
[DataField("iconOn")] public SpriteSpecifier? IconOn;
+ ///
+ /// For actions with a cooldown, icon to show when the action is on cooldown.
+ ///
+ [DataField] public SpriteSpecifier? IconCooldown;
+
+ ///
+ /// For actions with a cooldown, icon to show when the action is disabled.
+ ///
+ [DataField] public SpriteSpecifier? IconDisabled;
+
///
/// For toggle actions only, background to show when toggled on.
///
diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs
index 8cede391a809..3181635e4160 100644
--- a/Content.Shared/Actions/SharedActionsSystem.cs
+++ b/Content.Shared/Actions/SharedActionsSystem.cs
@@ -340,6 +340,17 @@ public void ResetCharges(EntityUid? actionId)
Dirty(actionId.Value, action);
}
+ public void SetMaxCharges(EntityUid? actionId, int? maxCharges)
+ {
+ if (!TryGetActionData(actionId, out var action) ||
+ action.MaxCharges == maxCharges)
+ return;
+
+ action.MaxCharges = maxCharges;
+ UpdateAction(actionId, action);
+ Dirty(actionId.Value, action);
+ }
+
private void OnActionsGetState(EntityUid uid, ActionsComponent component, ref ComponentGetState args)
{
args.State = new ActionsComponentState(GetNetEntitySet(component.Actions));
diff --git a/Content.Shared/Charges/Systems/SharedChargesSystem.cs b/Content.Shared/Charges/Systems/SharedChargesSystem.cs
index 7f95ef184e49..ce47fee4f46a 100644
--- a/Content.Shared/Charges/Systems/SharedChargesSystem.cs
+++ b/Content.Shared/Charges/Systems/SharedChargesSystem.cs
@@ -80,6 +80,23 @@ public bool TryUseCharge(Entity ent)
return true;
}
+ ///
+ /// Sets the charges and max charges.
+ ///
+ public void SetCharges(Entity ent, int? charges, int? maxCharges)
+ {
+ if (!Query.Resolve(ent, ref ent.Comp, false))
+ return;
+
+ if (charges != null)
+ ent.Comp.Charges = charges.Value;
+
+ if (maxCharges != null)
+ ent.Comp.MaxCharges = maxCharges.Value;
+
+ Dirty(ent, ent.Comp);
+ }
+
///
/// Gets the limited charges component and returns true if the number of charges remaining is less than the specified value.
/// Will return false if there is no limited charges component.
diff --git a/Content.Shared/Chemistry/SharedChemMaster.cs b/Content.Shared/Chemistry/SharedChemMaster.cs
index b98a337204d0..c79a362a9d1e 100644
--- a/Content.Shared/Chemistry/SharedChemMaster.cs
+++ b/Content.Shared/Chemistry/SharedChemMaster.cs
@@ -11,6 +11,7 @@ public sealed class SharedChemMaster
{
public const uint PillTypes = 20;
public const string BufferSolutionName = "buffer";
+ public const string PillBufferSolutionName = "pillBuffer";
public const string InputSlotName = "beakerSlot";
public const string OutputSlotName = "outputSlot";
public const string PillSolutionName = "food";
@@ -46,12 +47,14 @@ public sealed class ChemMasterReagentAmountButtonMessage : BoundUserInterfaceMes
public readonly ReagentId ReagentId;
public readonly int Amount;
public readonly bool FromBuffer;
+ public readonly bool IsOutput;
- public ChemMasterReagentAmountButtonMessage(ReagentId reagentId, int amount, bool fromBuffer)
+ public ChemMasterReagentAmountButtonMessage(ReagentId reagentId, int amount, bool fromBuffer, bool isOutput)
{
ReagentId = reagentId;
Amount = amount;
FromBuffer = fromBuffer;
+ IsOutput = isOutput;
}
}
@@ -101,34 +104,6 @@ public enum ChemMasterMode
Discard,
}
- public enum ChemMasterReagentAmount
- {
- U1 = 1,
- U5 = 5,
- U10 = 10,
- U15 = 15,
- U20 = 20,
- U25 = 25,
- U30 = 30,
- U45 = 45,
- U50 = 50,
- U75 = 75,
- U90 = 90,
- U100 = 100,
- All,
- }
-
- public static class ChemMasterReagentAmountToFixedPoint
- {
- public static FixedPoint2 GetFixedPoint(this ChemMasterReagentAmount amount)
- {
- if (amount == ChemMasterReagentAmount.All)
- return FixedPoint2.MaxValue;
- else
- return FixedPoint2.New((int)amount);
- }
- }
-
///
/// Information about the capacity and contents of a container for display in the UI
///
@@ -166,44 +141,44 @@ public ContainerInfo(string displayName, FixedPoint2 currentVolume, FixedPoint2
}
[Serializable, NetSerializable]
- public sealed class ChemMasterBoundUserInterfaceState : BoundUserInterfaceState
+ public sealed class ChemMasterBoundUserInterfaceState(
+ ChemMasterMode mode,
+ ContainerInfo? containerInfo,
+ IReadOnlyList bufferReagents,
+ IReadOnlyList pillBufferReagents,
+ FixedPoint2 bufferCurrentVolume,
+ FixedPoint2 pillBufferCurrentVolume,
+ uint selectedPillType,
+ uint pillDosageLimit,
+ bool updateLabel,
+ int sortMethod,
+ int transferringAmount)
+ : BoundUserInterfaceState
{
- public readonly ContainerInfo? InputContainerInfo;
- public readonly ContainerInfo? OutputContainerInfo;
+ public readonly ContainerInfo? ContainerInfo = containerInfo;
///
/// A list of the reagents and their amounts within the buffer, if applicable.
///
- public readonly IReadOnlyList BufferReagents;
+ public readonly IReadOnlyList BufferReagents = bufferReagents;
- public readonly ChemMasterMode Mode;
+ ///
+ /// A list of the reagents and their amounts within the buffer, if applicable.
+ ///
+ public readonly IReadOnlyList PillBufferReagents = pillBufferReagents;
- public readonly FixedPoint2? BufferCurrentVolume;
- public readonly uint SelectedPillType;
+ public readonly ChemMasterMode Mode = mode;
- public readonly uint PillDosageLimit;
+ public readonly FixedPoint2? BufferCurrentVolume = bufferCurrentVolume;
+ public readonly FixedPoint2? PillBufferCurrentVolume = pillBufferCurrentVolume;
+ public readonly uint SelectedPillType = selectedPillType;
- public readonly bool UpdateLabel;
+ public readonly uint PillDosageLimit = pillDosageLimit;
- public readonly int SortMethod;
- public readonly int TransferringAmount;
+ public readonly bool UpdateLabel = updateLabel;
- public ChemMasterBoundUserInterfaceState(
- ChemMasterMode mode, ContainerInfo? inputContainerInfo, ContainerInfo? outputContainerInfo,
- IReadOnlyList bufferReagents, FixedPoint2 bufferCurrentVolume,
- uint selectedPillType, uint pillDosageLimit, bool updateLabel, int sortMethod, int transferringAmount)
- {
- InputContainerInfo = inputContainerInfo;
- OutputContainerInfo = outputContainerInfo;
- BufferReagents = bufferReagents;
- Mode = mode;
- BufferCurrentVolume = bufferCurrentVolume;
- SelectedPillType = selectedPillType;
- PillDosageLimit = pillDosageLimit;
- UpdateLabel = updateLabel;
- SortMethod = sortMethod;
- TransferringAmount = transferringAmount;
- }
+ public readonly int SortMethod = sortMethod;
+ public readonly int TransferringAmount = transferringAmount;
}
[Serializable, NetSerializable]
diff --git a/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs b/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs
index c76214f13189..304dd2a3e847 100644
--- a/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs
+++ b/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs
@@ -16,6 +16,12 @@ public sealed partial class HideLayerClothingComponent : Component
[DataField]
public HashSet Slots = new();
+ ///
+ /// The clothing layers to hide.
+ ///
+ [DataField]
+ public HashSet? ClothingSlots = new();
+
///
/// If true, the layer will only hide when the item is in a toggled state (e.g. masks)
///
diff --git a/Content.Shared/Clothing/Loadouts/Systems/SharedLoadoutSystem.cs b/Content.Shared/Clothing/Loadouts/Systems/SharedLoadoutSystem.cs
index 67aabbd1ed1d..12466dcf8980 100644
--- a/Content.Shared/Clothing/Loadouts/Systems/SharedLoadoutSystem.cs
+++ b/Content.Shared/Clothing/Loadouts/Systems/SharedLoadoutSystem.cs
@@ -1,4 +1,5 @@
using System.Linq;
+using Content.Shared.Body.Systems;
using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.Loadouts.Prototypes;
using Content.Shared.Customization.Systems;
@@ -32,7 +33,8 @@ public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnMapInit);
+ // Wait until the character has all their organs before we give them their loadout to activate internals
+ SubscribeLocalEvent(OnMapInit, after: [typeof(SharedBodySystem)]);
_sawmill = _log.GetSawmill("loadouts");
}
@@ -112,7 +114,7 @@ private void OnMapInit(EntityUid uid, LoadoutComponent component, MapInitEvent a
}
allLoadouts.Add((item, loadout, i));
- if (loadout.CustomHeirloom == true)
+ if (i == 0 && loadout.CustomHeirloom == true) // Only the first item can be an heirloom
heirlooms.Add((item, loadout));
// Equip it
diff --git a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs
index 586fc139a023..533975f7409f 100644
--- a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs
+++ b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs
@@ -92,6 +92,6 @@ public bool CanEntityWearItem(EntityUid dummy, EntityUid clothing, bool bypassAc
{
return _inventory.TryGetSlots(dummy, out var slots)
&& slots.Where(slot => !slot.SlotFlags.HasFlag(SlotFlags.POCKET))
- .Any(slot => _inventory.CanEquip(dummy, clothing, slot.Name, out _, bypassAccessCheck: bypassAccessCheck));
+ .Any(slot => _inventory.CanEquip(dummy, clothing, slot.Name, out _, onSpawn: true, bypassAccessCheck: bypassAccessCheck));
}
}
diff --git a/Content.Shared/Effects/ColorFlashEffectEvent.cs b/Content.Shared/Effects/ColorFlashEffectEvent.cs
index 06043d3c000a..0a4e2c1812d4 100644
--- a/Content.Shared/Effects/ColorFlashEffectEvent.cs
+++ b/Content.Shared/Effects/ColorFlashEffectEvent.cs
@@ -15,9 +15,15 @@ public sealed class ColorFlashEffectEvent : EntityEventArgs
public List Entities;
- public ColorFlashEffectEvent(Color color, List entities)
+ ///
+ /// The length of the flash animation.
+ ///
+ public float? AnimationLength;
+
+ public ColorFlashEffectEvent(Color color, List entities, float? animationLength = null)
{
Color = color;
Entities = entities;
+ AnimationLength = animationLength;
}
}
diff --git a/Content.Shared/Effects/SharedColorFlashEffectSystem.cs b/Content.Shared/Effects/SharedColorFlashEffectSystem.cs
index e1d5735550ee..3b5940b677c8 100644
--- a/Content.Shared/Effects/SharedColorFlashEffectSystem.cs
+++ b/Content.Shared/Effects/SharedColorFlashEffectSystem.cs
@@ -4,5 +4,5 @@ namespace Content.Shared.Effects;
public abstract class SharedColorFlashEffectSystem : EntitySystem
{
- public abstract void RaiseEffect(Color color, List entities, Filter filter);
+ public abstract void RaiseEffect(Color color, List entities, Filter filter, float? animationLength = null);
}
diff --git a/Content.Shared/Humanoid/NamingSystem.Roman.cs b/Content.Shared/Humanoid/NamingSystem.Roman.cs
new file mode 100644
index 000000000000..2c254fff9034
--- /dev/null
+++ b/Content.Shared/Humanoid/NamingSystem.Roman.cs
@@ -0,0 +1,70 @@
+using System.Text;
+using Robust.Shared.Random;
+
+namespace Content.Shared.Humanoid;
+
+public sealed partial class NamingSystem : EntitySystem
+{
+ private static readonly Dictionary RomanMap = new()
+ {
+ { "M", 1000 },
+ { "CM", 900 },
+ { "D", 500 },
+ { "CD", 400 },
+ { "C", 100 },
+ { "XC", 90 },
+ { "L", 50 },
+ { "XL", 40 },
+ { "X", 10 },
+ { "IX", 9 },
+ { "V", 5 },
+ { "IV", 4 },
+ { "I", 1 }
+ };
+
+ //
+ // Generates a random Roman numeral with a length not exceeding 8 characters.
+ // All possible Roman numerals from 1 to 3,999 can be generated,
+ // but numbers from 1 to 100 have a higher chance of being rolled.
+ //
+ private string GenerateRomanNumeral()
+ {
+ (int, int) range;
+ while (true)
+ {
+ if (_random.Prob(0.8f)) // 80% chance for 1-100
+ range = (1, 101);
+ else if (_random.Prob(0.6f)) // 12% chance for 101-500
+ range = (101, 501);
+ else if (_random.Prob(0.75f)) // 6% chance for 501-1,000
+ range = (501, 1001);
+ else // 2% chance for 1,001-3,999
+ range = (1001, 4000);
+
+ var numeral = IntToRomanNumeral(_random.Next(range.Item1, range.Item2));
+
+ // Reroll when the numeral length is greater than 8 to prevent lengthy Roman numerals
+ if (numeral.Length > 8)
+ continue;
+
+ return numeral;
+ }
+ }
+
+ //
+ // Converts an integer to a Roman numeral.
+ //
+ private static string IntToRomanNumeral(int number)
+ {
+ var sb = new StringBuilder();
+ foreach (var (letters, equivalentNumber) in RomanMap)
+ {
+ while (number >= equivalentNumber)
+ {
+ sb.Append(letters);
+ number -= equivalentNumber;
+ }
+ }
+ return sb.ToString();
+ }
+}
diff --git a/Content.Shared/Humanoid/NamingSystem.cs b/Content.Shared/Humanoid/NamingSystem.cs
index c1e861c0d684..d27411852bfc 100644
--- a/Content.Shared/Humanoid/NamingSystem.cs
+++ b/Content.Shared/Humanoid/NamingSystem.cs
@@ -9,7 +9,7 @@ namespace Content.Shared.Humanoid
///
/// Figure out how to name a humanoid with these extensions.
///
- public sealed class NamingSystem : EntitySystem
+ public sealed partial class NamingSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
@@ -43,6 +43,9 @@ public string GetName(string species, Gender? gender = null)
case SpeciesNaming.FirstDashLast:
return Loc.GetString("namepreset-firstdashlast",
("first", GetFirstName(speciesProto, gender)), ("last", GetLastName(speciesProto)));
+ case SpeciesNaming.FirstRoman:
+ return Loc.GetString("namepreset-firstlast",
+ ("first", GetFirstName(speciesProto, gender)), ("last", GenerateRomanNumeral()));
case SpeciesNaming.FirstLast:
default:
return Loc.GetString("namepreset-firstlast",
diff --git a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs
index 36b1e2387b72..fb44c2904db5 100644
--- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs
+++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs
@@ -192,4 +192,5 @@ public enum SpeciesNaming : byte
//End of Nyano - Summary: for Oni naming
TheFirstofLast,
FirstDashLast,
+ FirstRoman,
}
diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs
index 9e45547beeda..cfcb156455b8 100644
--- a/Content.Shared/Inventory/InventorySystem.Equip.cs
+++ b/Content.Shared/Inventory/InventorySystem.Equip.cs
@@ -228,11 +228,11 @@ public bool CanAccess(EntityUid actor, EntityUid target, EntityUid itemUid)
public bool CanEquip(EntityUid uid, EntityUid itemUid, string slot, [NotNullWhen(false)] out string? reason,
SlotDefinition? slotDefinition = null, InventoryComponent? inventory = null,
- ClothingComponent? clothing = null, ItemComponent? item = null, bool bypassAccessCheck = false) =>
- CanEquip(uid, uid, itemUid, slot, out reason, slotDefinition, inventory, clothing, item, bypassAccessCheck);
+ ClothingComponent? clothing = null, ItemComponent? item = null, bool onSpawn = false, bool bypassAccessCheck = false) =>
+ CanEquip(uid, uid, itemUid, slot, out reason, slotDefinition, inventory, clothing, item, onSpawn, bypassAccessCheck);
public bool CanEquip(EntityUid actor, EntityUid target, EntityUid itemUid, string slot, [NotNullWhen(false)] out string? reason, SlotDefinition? slotDefinition = null,
- InventoryComponent? inventory = null, ClothingComponent? clothing = null, ItemComponent? item = null, bool bypassAccessCheck = false)
+ InventoryComponent? inventory = null, ClothingComponent? clothing = null, ItemComponent? item = null, bool onSpawn = false, bool bypassAccessCheck = false)
{
reason = "inventory-component-can-equip-cannot";
if (!Resolve(target, ref inventory, false))
@@ -278,6 +278,11 @@ public bool CanEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin
return false;
}
+ if (onSpawn &&
+ (_whitelistSystem.IsWhitelistFail(slotDefinition.SpawnWhitelist, itemUid) ||
+ _whitelistSystem.IsBlacklistPass(slotDefinition.SpawnBlacklist, itemUid)))
+ return false;
+
var attemptEvent = new IsEquippingAttemptEvent(actor, target, itemUid, slotDefinition);
RaiseLocalEvent(target, attemptEvent, true);
if (attemptEvent.Cancelled)
diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs
index 91accec8c93e..ae1269cbd0ba 100644
--- a/Content.Shared/Inventory/InventoryTemplatePrototype.cs
+++ b/Content.Shared/Inventory/InventoryTemplatePrototype.cs
@@ -60,4 +60,19 @@ public sealed partial class SlotDefinition
/// Entity blacklist for CanEquip checks.
///
[DataField("blacklist")] public EntityWhitelist? Blacklist = null;
+
+ ///
+ /// Entity whitelist for CanEquip checks, on spawn only.
+ ///
+ [DataField("spawnWhitelist")] public EntityWhitelist? SpawnWhitelist = null;
+
+ ///
+ /// Entity blacklist for CanEquip checks, on spawn only.
+ ///
+ [DataField("spawnBlacklist")] public EntityWhitelist? SpawnBlacklist = null;
+
+ ///
+ /// Is this slot disabled? Could be due to severing or other reasons.
+ ///
+ [DataField] public bool Disabled;
}
diff --git a/Content.Shared/Mind/Components/MindContainerComponent.cs b/Content.Shared/Mind/Components/MindContainerComponent.cs
index 62b26cbd3535..be6ad6b125ac 100644
--- a/Content.Shared/Mind/Components/MindContainerComponent.cs
+++ b/Content.Shared/Mind/Components/MindContainerComponent.cs
@@ -37,6 +37,12 @@ public sealed partial class MindContainerComponent : Component
[DataField("ghostOnShutdown")]
[Access(typeof(SharedMindSystem), Other = AccessPermissions.ReadWriteExecute)] // FIXME Friends
public bool GhostOnShutdown { get; set; } = true;
+
+ ///
+ /// DeltaV: The first mind to control this mob. Will only be null if the mob never had a mind at all.
+ ///
+ [DataField, AutoNetworkedField]
+ public EntityUid? OriginalMind;
}
public abstract class MindEvent : EntityEventArgs
diff --git a/Content.Shared/Roles/JobPrototype.cs b/Content.Shared/Roles/JobPrototype.cs
index 5ea9da02247b..54889a3c30ee 100644
--- a/Content.Shared/Roles/JobPrototype.cs
+++ b/Content.Shared/Roles/JobPrototype.cs
@@ -106,6 +106,12 @@ public sealed partial class JobPrototype : IPrototype
[DataField]
public ProtoId? NameDataset;
+ ///
+ /// A list of requirements that when satisfied, add or replace from the base starting gear.
+ ///
+ [DataField("conditionalStartingGear")]
+ public List? ConditionalStartingGears { get; private set; }
+
///
/// Use this to spawn in as a non-humanoid (borg, test subject, etc.)
/// Starting gear will be ignored.
@@ -120,6 +126,9 @@ public sealed partial class JobPrototype : IPrototype
[DataField("special", serverOnly: true)]
public JobSpecial[] Special { get; private set; } = Array.Empty();
+ [DataField("afterLoadoutSpecial", serverOnly: true)]
+ public JobSpecial[] AfterLoadoutSpecial { get; private set; } = [];
+
[DataField("access")]
public IReadOnlyCollection> Access { get; private set; } = Array.Empty>();
@@ -142,6 +151,25 @@ public sealed partial class JobPrototype : IPrototype
public bool ApplyTraits = true;
}
+ ///
+ /// Starting gear that will only be applied upon satisfying requirements.
+ ///
+ [DataDefinition]
+ public sealed partial class ConditionalStartingGear
+ {
+ ///
+ /// The requirements to check.
+ ///
+ [DataField(required: true)]
+ public List Requirements;
+
+ ///
+ /// The starting gear to apply, replacing the equivalent slots.
+ ///
+ [DataField(required: true)]
+ public ProtoId Id { get; private set; }
+ }
+
///
/// Sorts s appropriately for display in the UI,
/// respecting their .
diff --git a/Content.Shared/Roles/StartingGearPrototype.cs b/Content.Shared/Roles/StartingGearPrototype.cs
index 61ad7940d711..fca4849467dd 100644
--- a/Content.Shared/Roles/StartingGearPrototype.cs
+++ b/Content.Shared/Roles/StartingGearPrototype.cs
@@ -1,3 +1,4 @@
+using Content.Shared.Customization.Systems;
using Content.Shared.Preferences;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array;
@@ -8,6 +9,7 @@ namespace Content.Shared.Roles;
public sealed partial class StartingGearPrototype : IPrototype, IInheritingPrototype
{
[DataField]
+ [AlwaysPushInheritance]
public Dictionary Equipment = new();
///
@@ -23,14 +25,32 @@ public sealed partial class StartingGearPrototype : IPrototype, IInheritingProto
public EntProtoId? Duffelbag;
[DataField]
+ [AlwaysPushInheritance]
public List Inhand = new(0);
///
/// Inserts entities into the specified slot's storage (if it does have storage).
///
[DataField]
+ [AlwaysPushInheritance]
public Dictionary> Storage = new();
+ ///
+ /// The list of starting gears that overwrite the entries on this starting gear
+ /// if their requirements are satisfied.
+ ///
+ [DataField("subGear")]
+ [AlwaysPushInheritance]
+ public List> SubGears = new();
+
+ ///
+ /// The requirements of this starting gear.
+ /// Only used if this starting gear is a sub-gear of another starting gear.
+ ///
+ [DataField]
+ [AlwaysPushInheritance]
+ public List Requirements = new();
+
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = string.Empty;
@@ -41,6 +61,7 @@ public sealed partial class StartingGearPrototype : IPrototype, IInheritingProto
///
[AbstractDataField]
+ [NeverPushInheritance]
public bool Abstract { get; }
public string GetGear(string slot, HumanoidCharacterProfile? profile)
diff --git a/Content.Shared/SelfExtinguisher/SelfExtinguisherComponent.cs b/Content.Shared/SelfExtinguisher/SelfExtinguisherComponent.cs
new file mode 100644
index 000000000000..ef60622f3269
--- /dev/null
+++ b/Content.Shared/SelfExtinguisher/SelfExtinguisherComponent.cs
@@ -0,0 +1,66 @@
+using Robust.Shared.Audio;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
+
+namespace Content.Shared.SelfExtinguisher;
+
+///
+/// When equipped, the SelfExtinguisherComponent will give an action to its wearer to self-extinguish when set on fire.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause]
+public sealed partial class SelfExtinguisherComponent : Component
+{
+ ///
+ /// Action used to self-extinguish.
+ ///
+ [DataField, AutoNetworkedField]
+ public EntProtoId Action = "ActionSelfExtinguish";
+
+ [DataField, AutoNetworkedField]
+ public EntityUid? ActionEntity;
+
+ ///
+ /// Cooldown before the self-extinguisher can be used again.
+ ///
+ [DataField(required: true)]
+ public TimeSpan Cooldown;
+
+ ///
+ /// Time before the self-extinguisher can be used again.
+ ///
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField, AutoPausedField]
+ public TimeSpan NextExtinguish = TimeSpan.Zero;
+
+ ///
+ /// When failing self-extinguish attempts,
+ /// don't spam popups every frame and instead have a cooldown.
+ ///
+ [DataField]
+ public TimeSpan PopupCooldown = TimeSpan.FromSeconds(1);
+
+ ///
+ /// Time before the next popup can be shown.
+ ///
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
+ [AutoPausedField]
+ public TimeSpan? NextPopup = null;
+
+ ///
+ /// If true, requires the wearer to be immune to gas ignition.
+ ///
+ [DataField]
+ public bool RequiresIgniteFromGasImmune = false;
+
+ ///
+ /// The sound effect that plays upon an extinguish.
+ ///
+ [DataField(required: true)]
+ public SoundSpecifier Sound { get; private set; } = default!;
+
+ ///
+ /// The sound effect that plays upon getting refilled.
+ ///
+ [DataField]
+ public SoundSpecifier RefillSound = new SoundPathSpecifier("/Audio/Weapons/Guns/MagIn/revolver_magin.ogg");
+}
diff --git a/Content.Shared/SelfExtinguisher/SelfExtinguisherRefillComponent.cs b/Content.Shared/SelfExtinguisher/SelfExtinguisherRefillComponent.cs
new file mode 100644
index 000000000000..30cea16e570b
--- /dev/null
+++ b/Content.Shared/SelfExtinguisher/SelfExtinguisherRefillComponent.cs
@@ -0,0 +1,14 @@
+namespace Content.Shared.SelfExtinguisher;
+
+///
+/// Used to refill the charges of self-extinguishers.
+///
+[RegisterComponent]
+public sealed partial class SelfExtinguisherRefillComponent : Component
+{
+ //
+ // The amount of charges to refill.
+ //
+ [DataField(required: true)]
+ public int RefillAmount;
+}
diff --git a/Content.Shared/SelfExtinguisher/SharedSelfExtinguisherSystem.cs b/Content.Shared/SelfExtinguisher/SharedSelfExtinguisherSystem.cs
new file mode 100644
index 000000000000..2aee19202aa5
--- /dev/null
+++ b/Content.Shared/SelfExtinguisher/SharedSelfExtinguisherSystem.cs
@@ -0,0 +1,167 @@
+using Content.Shared.Actions;
+using Content.Shared.Charges.Components;
+using Content.Shared.Charges.Systems;
+using Content.Shared.Examine;
+using Content.Shared.Interaction;
+using Content.Shared.Inventory;
+using Content.Shared.Popups;
+using Content.Shared.Verbs;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Timing;
+using Robust.Shared.Utility;
+
+namespace Content.Shared.SelfExtinguisher;
+
+public abstract partial class SharedSelfExtinguisherSystem : EntitySystem
+{
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly SharedActionsSystem _actions = default!;
+ [Dependency] private readonly ActionContainerSystem _actionContainer = default!;
+ [Dependency] private readonly InventorySystem _inventory = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly SharedChargesSystem _charges = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnMapInit);
+
+ SubscribeLocalEvent>>(GetRelayedVerbs);
+ SubscribeLocalEvent(OnGetActions);
+ SubscribeLocalEvent>(OnGetVerbs);
+
+ SubscribeLocalEvent(OnInteractUsing);
+
+ SubscribeLocalEvent(OnExamined);
+ }
+
+ private void OnMapInit(EntityUid uid, SelfExtinguisherComponent component, MapInitEvent args)
+ {
+ if (!_actionContainer.EnsureAction(uid, ref component.ActionEntity, out _, component.Action))
+ return;
+
+ // The components SelfExtinguisherComponent and LimitedChargesComponent will be the source of truth
+ // regarding the cooldowns and charges, and the action component will just mirror any changes.
+ _actions.SetUseDelay(component.ActionEntity, component.Cooldown);
+ if (TryComp(uid, out var charges))
+ {
+ _actions.SetCharges(component.ActionEntity, charges.Charges);
+ _actions.SetMaxCharges(component.ActionEntity, charges.MaxCharges);
+ }
+ }
+
+ public void SetCharges(EntityUid uid, int? charges, int? maxCharges, SelfExtinguisherComponent? component = null)
+ {
+ if (!Resolve(uid, ref component) ||
+ !TryComp(uid, out var chargeComp))
+ return;
+
+ _charges.SetCharges((uid, chargeComp), charges, maxCharges);
+ _actions.SetCharges(component.ActionEntity, chargeComp.Charges);
+ _actions.SetMaxCharges(component.ActionEntity, chargeComp.MaxCharges);
+
+ _actions.SetEnabled(component.ActionEntity, chargeComp.Charges != 0);
+ }
+
+ private void GetRelayedVerbs(EntityUid uid, SelfExtinguisherComponent component, InventoryRelayedEvent> args)
+ {
+ OnGetVerbs(uid, component, args.Args);
+ }
+
+ private void OnGetVerbs(EntityUid uid, SelfExtinguisherComponent component, GetVerbsEvent args)
+ {
+ if (!_inventory.TryGetContainingSlot(uid, out var _))
+ return;
+
+ var verb = new EquipmentVerb()
+ {
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/extinguisher.svg.192dpi.png")),
+ Text = Loc.GetString("self-extinguisher-verb"),
+ EventTarget = uid,
+ ExecutionEventArgs = new SelfExtinguishEvent() { Performer = args.User }
+ };
+
+ args.Verbs.Add(verb);
+ }
+
+ private void OnGetActions(EntityUid uid, SelfExtinguisherComponent component, GetItemActionsEvent args)
+ {
+ if (component.ActionEntity == null || args.InHands)
+ return;
+
+ args.AddAction(component.ActionEntity.Value);
+ }
+
+ private void OnInteractUsing(EntityUid uid, SelfExtinguisherComponent component, InteractUsingEvent args)
+ {
+ if (!TryComp(args.Used, out var refill) ||
+ !TryComp(uid, out var charges))
+ return;
+
+ if (charges.Charges >= charges.MaxCharges)
+ {
+ if (!SetPopupCooldown((uid, component)))
+ return;
+
+ _popup.PopupClient(Loc.GetString("self-extinguisher-refill-full"), args.User, args.User);
+ return;
+ }
+
+ // Add charges
+ _charges.AddCharges(uid, refill.RefillAmount, charges);
+ _actions.SetCharges(component.ActionEntity, charges.Charges);
+
+ // Reenable action
+ _actions.SetEnabled(component.ActionEntity, charges.Charges != 0);
+
+ // Reset cooldown
+ _actions.ClearCooldown(component.ActionEntity);
+ component.NextExtinguish = TimeSpan.Zero;
+
+ Dirty(uid, component);
+
+ _popup.PopupClient(Loc.GetString("self-extinguisher-refill"), args.User, args.User);
+ _audio.PlayPredicted(component.RefillSound, uid, args.User);
+
+ QueueDel(args.Used);
+ }
+
+ private void OnExamined(EntityUid uid, SelfExtinguisherComponent component, ExaminedEvent args)
+ {
+ if (TryComp(uid, out var charges) && charges.Charges == 0)
+ return;
+
+ var curTime = _timing.CurTime;
+ if (component.NextExtinguish > curTime)
+ {
+ args.PushMarkup(Loc.GetString("self-extinguisher-examine-cooldown-recharging",
+ ("cooldown", Math.Ceiling((component.NextExtinguish - curTime).TotalSeconds))));
+ return;
+ }
+
+ args.PushMarkup(Loc.GetString("self-extinguisher-examine-cooldown-ready"));
+ }
+
+ //
+ // Returns:
+ // - true if a popup is ready to be shown. The popup cooldown is also set.
+ // - false if popups are still on cooldown
+ //
+ protected bool SetPopupCooldown(Entity ent, TimeSpan? curTime = null)
+ {
+ curTime ??= _timing.CurTime;
+
+ if (curTime < ent.Comp.NextPopup)
+ return false;
+
+ ent.Comp.NextPopup = curTime + ent.Comp.PopupCooldown;
+ return true;
+ }
+}
+
+//
+// Raised on an attempt to self-extinguish.
+//
+public sealed partial class SelfExtinguishEvent : InstantActionEvent { }
diff --git a/Content.Shared/Station/SharedStationSpawningSystem.cs b/Content.Shared/Station/SharedStationSpawningSystem.cs
index c433cc1d4fe8..9af87376b060 100644
--- a/Content.Shared/Station/SharedStationSpawningSystem.cs
+++ b/Content.Shared/Station/SharedStationSpawningSystem.cs
@@ -1,13 +1,18 @@
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared.Dataset;
+using Content.Shared.Customization.Systems;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Humanoid;
using Content.Shared.Inventory;
+using Content.Shared.Preferences;
using Content.Shared.Preferences.Loadouts;
using Content.Shared.Roles;
using Content.Shared.Storage;
using Content.Shared.Storage.EntitySystems;
using Robust.Shared.Collections;
+using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
@@ -23,6 +28,8 @@ public abstract class SharedStationSpawningSystem : EntitySystem
[Dependency] private readonly SharedStorageSystem _storage = default!;
[Dependency] private readonly SharedTransformSystem _xformSystem = default!;
[Dependency] private readonly MetaDataSystem _metadata = default!;
+ [Dependency] private readonly IConfigurationManager _configurationManager = default!;
+ [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!;
private EntityQuery _handsQuery;
private EntityQuery _inventoryQuery;
@@ -78,6 +85,10 @@ public void EquipStartingGear(EntityUid entity, StartingGearPrototype? startingG
if (startingGear == null)
return;
+ if (GetProfile(entity, out var profile))
+ // Equip any sub-gears of this starting gear.
+ startingGear = ApplySubGear(startingGear, profile);
+
var xform = _xformQuery.GetComponent(entity);
if (InventorySystem.TryGetSlots(entity, out var slotDefinitions))
@@ -143,4 +154,108 @@ public void EquipStartingGear(EntityUid entity, StartingGearPrototype? startingG
RaiseLocalEvent(entity, ref ev);
}
}
+
+ public bool GetProfile(EntityUid? uid, [NotNullWhen(true)] out HumanoidCharacterProfile? profile)
+ {
+ if (!TryComp(uid, out HumanoidAppearanceComponent? appearance))
+ {
+ profile = null;
+ return false;
+ }
+
+ if (appearance.LastProfileLoaded is { } lastProfileLoaded)
+ {
+ profile = lastProfileLoaded;
+ return true;
+ }
+
+ profile = HumanoidCharacterProfile.DefaultWithSpecies(appearance.Species);
+ return true;
+ }
+
+ //
+ // Apply a starting gear's sub-gears to itself, returning a new starting gear prototype with
+ // replaced equipment.
+ //
+ public StartingGearPrototype ApplySubGear(StartingGearPrototype startingGear, HumanoidCharacterProfile profile, JobPrototype? job = null)
+ {
+ if (startingGear.SubGears.Count == 0)
+ return startingGear;
+
+ // Job can be null for cases like ghost roles' starting gear which do not have a job definition.
+ job ??= new JobPrototype();
+
+ var newStartingGear = startingGear;
+ var foundConditionalMatch = false;
+
+ foreach (var subGear in startingGear.SubGears)
+ {
+ if (!PrototypeManager.TryIndex(subGear.Id, out var subGearProto) ||
+ !_characterRequirements.CheckRequirementsValid(
+ subGearProto.Requirements, job, profile, new Dictionary(), false, job,
+ EntityManager, PrototypeManager, _configurationManager,
+ out _))
+ continue;
+
+ // Apply the sub-gear's sub-gears if there are any
+ subGearProto = ApplySubGear(subGearProto, profile, job);
+
+ if (!foundConditionalMatch)
+ {
+ foundConditionalMatch = true;
+ // Lazy init on making a new starting gear prototype for performance reasons.
+ // We can't just modify the original prototype or it will be modified for everyone.
+ newStartingGear = new StartingGearPrototype()
+ {
+ Equipment = startingGear.Equipment.ToDictionary(static entry => entry.Key, static entry => entry.Value),
+ InnerClothingSkirt = startingGear.InnerClothingSkirt,
+ Satchel = startingGear.Satchel,
+ Duffelbag = startingGear.Duffelbag,
+ Inhand = new List(startingGear.Inhand),
+ Storage = startingGear.Storage.ToDictionary(
+ static entry => entry.Key,
+ static entry => new List(entry.Value)
+ ),
+ };
+ }
+
+ // Apply the sub-gear's equipment to this starting gear
+ if (subGearProto.InnerClothingSkirt != null)
+ newStartingGear.InnerClothingSkirt = subGearProto.InnerClothingSkirt;
+
+ if (subGearProto.Satchel != null)
+ newStartingGear.Satchel = subGearProto.Satchel;
+
+ if (subGearProto.Duffelbag != null)
+ newStartingGear.Duffelbag = subGearProto.Duffelbag;
+
+ foreach (var (slot, entProtoId) in subGearProto.Equipment)
+ {
+ // Don't remove items in pockets, instead put them in the backpack or hands
+ if (slot == "pocket1" && newStartingGear.Equipment.TryGetValue("pocket1", out var pocket1) ||
+ slot == "pocket2" && newStartingGear.Equipment.TryGetValue("pocket2", out var pocket2))
+ {
+ var pocketProtoId = slot == "pocket1" ? pocket1 : pocket2;
+
+ if (string.IsNullOrEmpty(newStartingGear.GetGear("back", null)))
+ newStartingGear.Inhand.Add(pocketProtoId);
+ else
+ {
+ if (!newStartingGear.Storage.ContainsKey("back"))
+ newStartingGear.Storage["back"] = new();
+ newStartingGear.Storage["back"].Add(pocketProtoId);
+ }
+ }
+
+ newStartingGear.Equipment[slot] = entProtoId;
+ }
+
+ newStartingGear.Inhand.AddRange(subGearProto.Inhand);
+
+ foreach (var (slot, entProtoIds) in subGearProto.Storage)
+ newStartingGear.Storage[slot].AddRange(entProtoIds);
+ }
+
+ return newStartingGear;
+ }
}
diff --git a/Content.Shared/Strip/Components/StripMenuHiddenComponent.cs b/Content.Shared/Strip/Components/StripMenuHiddenComponent.cs
new file mode 100644
index 000000000000..d13b8bdc7a79
--- /dev/null
+++ b/Content.Shared/Strip/Components/StripMenuHiddenComponent.cs
@@ -0,0 +1,10 @@
+using Robust.Shared.GameStates;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Strip.Components;
+
+///
+/// An item with this component is always hidden in the strip menu, regardless of other circumstances.
+///
+[RegisterComponent, NetworkedComponent]
+public sealed partial class StripMenuHiddenComponent : Component;
diff --git a/Content.Shared/Temperature/Components/TemperatureSpeedComponent.cs b/Content.Shared/Temperature/Components/TemperatureSpeedComponent.cs
new file mode 100644
index 000000000000..74ba2a027490
--- /dev/null
+++ b/Content.Shared/Temperature/Components/TemperatureSpeedComponent.cs
@@ -0,0 +1,30 @@
+using Content.Shared.Temperature.Systems;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Temperature.Components;
+
+///
+/// This is used for an entity that varies in speed based on current temperature.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedTemperatureSystem)), AutoGenerateComponentState, AutoGenerateComponentPause]
+public sealed partial class TemperatureSpeedComponent : Component
+{
+ ///
+ /// Pairs of temperature thresholds to applied slowdown values.
+ ///
+ [DataField]
+ public Dictionary Thresholds = new();
+
+ ///
+ /// The current speed modifier from we reached.
+ /// Stored and networked so that the client doesn't mispredict temperature
+ ///
+ [DataField, AutoNetworkedField]
+ public float? CurrentSpeedModifier;
+
+ ///
+ /// The time at which the temperature slowdown is updated.
+ ///
+ [DataField, AutoNetworkedField, AutoPausedField]
+ public TimeSpan? NextSlowdownUpdate;
+}
diff --git a/Content.Shared/Temperature/Systems/SharedTemperatureSystem.cs b/Content.Shared/Temperature/Systems/SharedTemperatureSystem.cs
new file mode 100644
index 000000000000..efea2df5affa
--- /dev/null
+++ b/Content.Shared/Temperature/Systems/SharedTemperatureSystem.cs
@@ -0,0 +1,80 @@
+using System.Linq;
+using Content.Shared.Movement.Components;
+using Content.Shared.Movement.Systems;
+using Content.Shared.Temperature.Components;
+using Robust.Shared.Timing;
+
+namespace Content.Shared.Temperature.Systems;
+
+///
+/// This handles predicting temperature based speedup.
+///
+public sealed class SharedTemperatureSystem : EntitySystem
+{
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
+
+ ///
+ /// Band-aid for unpredicted atmos. Delays the application for a short period so that laggy clients can get the replicated temperature.
+ ///
+ private static readonly TimeSpan SlowdownApplicationDelay = TimeSpan.FromSeconds(1f);
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnTemperatureChanged);
+ SubscribeLocalEvent(OnRefreshMovementSpeedModifiers);
+ }
+
+ private void OnTemperatureChanged(Entity ent, ref OnTemperatureChangeEvent args)
+ {
+ foreach (var (threshold, modifier) in ent.Comp.Thresholds)
+ {
+ if (args.CurrentTemperature < threshold && args.LastTemperature > threshold ||
+ args.CurrentTemperature > threshold && args.LastTemperature < threshold)
+ {
+ ent.Comp.NextSlowdownUpdate = _timing.CurTime + SlowdownApplicationDelay;
+ ent.Comp.CurrentSpeedModifier = modifier;
+ Dirty(ent);
+ break;
+ }
+ }
+
+ var maxThreshold = ent.Comp.Thresholds.Max(p => p.Key);
+ if (args.CurrentTemperature > maxThreshold && args.LastTemperature < maxThreshold)
+ {
+ ent.Comp.NextSlowdownUpdate = _timing.CurTime + SlowdownApplicationDelay;
+ ent.Comp.CurrentSpeedModifier = null;
+ Dirty(ent);
+ }
+ }
+
+ private void OnRefreshMovementSpeedModifiers(Entity ent, ref RefreshMovementSpeedModifiersEvent args)
+ {
+ // Don't update speed and mispredict while we're compensating for lag.
+ if (ent.Comp.NextSlowdownUpdate != null || ent.Comp.CurrentSpeedModifier == null)
+ return;
+
+ args.ModifySpeed(ent.Comp.CurrentSpeedModifier.Value, ent.Comp.CurrentSpeedModifier.Value);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out var uid, out var temp, out var movement))
+ {
+ if (temp.NextSlowdownUpdate == null)
+ continue;
+
+ if (_timing.CurTime < temp.NextSlowdownUpdate)
+ continue;
+
+ temp.NextSlowdownUpdate = null;
+ _movementSpeedModifier.RefreshMovementSpeedModifiers(uid, movement);
+ Dirty(uid, temp);
+ }
+ }
+}
diff --git a/Content.Shared/Temperature/TemperatureEvents.cs b/Content.Shared/Temperature/TemperatureEvents.cs
index ac12224868f4..7a26d07e306d 100644
--- a/Content.Shared/Temperature/TemperatureEvents.cs
+++ b/Content.Shared/Temperature/TemperatureEvents.cs
@@ -13,3 +13,18 @@ public ModifyChangedTemperatureEvent(float temperature)
TemperatureDelta = temperature;
}
}
+
+public sealed class OnTemperatureChangeEvent : EntityEventArgs
+{
+ public readonly float CurrentTemperature;
+ public readonly float LastTemperature;
+ public readonly float TemperatureDelta;
+
+ public OnTemperatureChangeEvent(float current, float last, float delta)
+ {
+ CurrentTemperature = current;
+ LastTemperature = last;
+ TemperatureDelta = delta;
+ }
+}
+
diff --git a/Content.Shared/Thief/Prototypes/ThiefBackpackSetPrototype.cs b/Content.Shared/Thief/Prototypes/ThiefBackpackSetPrototype.cs
index 571db09ebea3..8f87633eb68d 100644
--- a/Content.Shared/Thief/Prototypes/ThiefBackpackSetPrototype.cs
+++ b/Content.Shared/Thief/Prototypes/ThiefBackpackSetPrototype.cs
@@ -1,3 +1,4 @@
+using Content.Shared.Customization.Systems;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -13,6 +14,7 @@ public sealed partial class ThiefBackpackSetPrototype : IPrototype
[DataField] public string Name { get; private set; } = string.Empty;
[DataField] public string Description { get; private set; } = string.Empty;
[DataField] public SpriteSpecifier Sprite { get; private set; } = SpriteSpecifier.Invalid;
+ [DataField] public List Requirements { get; private set; } = [];
[DataField] public List Content = new();
}
diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs
index ce2228ff66b1..4e59ff32feee 100644
--- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs
+++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs
@@ -53,16 +53,6 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque);
- ///
- /// Maximum amount of targets allowed for a wide-attack.
- ///
- public const int MaxTargets = 5;
-
- ///
- /// If an attack is released within this buffer it's assumed to be full damage.
- ///
- public const float GracePeriod = 0.05f;
-
public override void Initialize()
{
base.Initialize();
@@ -105,7 +95,7 @@ private void OnMeleeSelected(EntityUid uid, MeleeWeaponComponent component, Hand
// If someone swaps to this weapon then reset its cd.
var curTime = Timing.CurTime;
- var minimum = curTime + TimeSpan.FromSeconds(GetAttackRate(uid, args.User, component));
+ var minimum = curTime + TimeSpan.FromSeconds(attackRate);
if (minimum < component.NextAttack)
return;
diff --git a/Content.Shared/_DV/Actions/Events/ChitziteActionEvent.cs b/Content.Shared/_DV/Actions/Events/ChitziteActionEvent.cs
new file mode 100644
index 000000000000..a36bd148d611
--- /dev/null
+++ b/Content.Shared/_DV/Actions/Events/ChitziteActionEvent.cs
@@ -0,0 +1,3 @@
+namespace Content.Shared.Actions.Events;
+
+public sealed partial class ChitziteActionEvent : InstantActionEvent {}
diff --git a/Content.Shared/_EstacaoPirata/Cards/Card/CardComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Card/CardComponent.cs
new file mode 100644
index 000000000000..6ccf7f5b216e
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Card/CardComponent.cs
@@ -0,0 +1,44 @@
+using Robust.Shared.GameStates;
+using Robust.Shared.Serialization;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._EstacaoPirata.Cards.Card;
+
+///
+/// This is used for...
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class CardComponent : Component
+{
+ ///
+ /// The back of the card
+ ///
+ [DataField(readOnly: true)]
+ public List BackSprite = [];
+
+ ///
+ /// The front of the card
+ ///
+ [DataField(readOnly: true)]
+ public List FrontSprite = [];
+
+ ///
+ /// If it is currently flipped. This is used to update sprite and name.
+ ///
+ [DataField(readOnly: true), AutoNetworkedField]
+ public bool Flipped = false;
+
+
+ ///
+ /// The name of the card.
+ ///
+ [DataField(readOnly: true), AutoNetworkedField]
+ public string Name = "";
+
+}
+
+[Serializable, NetSerializable]
+public sealed class CardFlipUpdatedEvent(NetEntity card) : EntityEventArgs
+{
+ public NetEntity Card = card;
+}
diff --git a/Content.Shared/_EstacaoPirata/Cards/Card/CardSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Card/CardSystem.cs
new file mode 100644
index 000000000000..68766eda2a86
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Card/CardSystem.cs
@@ -0,0 +1,223 @@
+using Content.Shared._EstacaoPirata.Cards.Deck;
+using Content.Shared._EstacaoPirata.Cards.Hand;
+using Content.Shared._EstacaoPirata.Cards.Stack;
+using Content.Shared.Examine;
+using Content.Shared.Hands.Components;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Interaction.Events;
+using Content.Shared.Verbs;
+using Robust.Shared.Containers;
+using Robust.Shared.Network;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._EstacaoPirata.Cards.Card;
+
+///
+/// This handles...
+///
+public sealed class CardSystem : EntitySystem
+{
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly CardStackSystem _cardStack = default!;
+ [Dependency] private readonly CardDeckSystem _cardDeck = default!;
+ [Dependency] private readonly CardHandSystem _cardHand = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent>(AddTurnOnVerb);
+ SubscribeLocalEvent>(OnActivationVerb);
+ SubscribeLocalEvent(OnExamined);
+ SubscribeLocalEvent(OnUse);
+ SubscribeLocalEvent(OnActivate);
+ }
+ private void OnExamined(EntityUid uid, CardComponent component, ExaminedEvent args)
+ {
+ if (args.IsInDetailsRange && !component.Flipped)
+ {
+ args.PushMarkup(Loc.GetString("card-examined", ("target", Loc.GetString(component.Name))));
+ }
+ }
+
+ private void AddTurnOnVerb(EntityUid uid, CardComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => FlipCard(uid, component),
+ Text = Loc.GetString("cards-verb-flip"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 1
+ });
+
+ if (args.Using == null || args.Using == args.Target)
+ return;
+
+ if (TryComp(args.Using, out var usingStack))
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => JoinCards(args.User, args.Target, component, (EntityUid)args.Using, usingStack),
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 2
+ });
+ }
+ else if (TryComp(args.Using, out var usingCard))
+ {
+ var pickup = _hands.IsHolding(args.User, args.Target);
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => _cardHand.TrySetupHandOfCards(args.User, args.Target, component, args.Using.Value, usingCard, pickup),
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 2
+ });
+ }
+ }
+
+ private void OnUse(EntityUid uid, CardComponent comp, UseInHandEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ FlipCard(uid, comp);
+ args.Handled = true;
+ }
+
+ ///
+ /// Server-Side only method to flip card. This starts CardFlipUpdatedEvent event
+ ///
+ ///
+ ///
+ private void FlipCard(EntityUid uid, CardComponent component)
+ {
+ if (_net.IsClient)
+ return;
+ component.Flipped = !component.Flipped;
+ Dirty(uid, component);
+ RaiseNetworkEvent(new CardFlipUpdatedEvent(GetNetEntity(uid)));
+ }
+
+ private void JoinCards(EntityUid user, EntityUid first, CardComponent firstComp, EntityUid second, CardStackComponent secondStack)
+ {
+ if (_net.IsClient)
+ return;
+ bool pickup = _hands.IsHolding(user, first);
+ EntityUid cardStack;
+ bool? flip = null;
+ if (HasComp(second))
+ {
+ cardStack = SpawnInSameParent(_cardDeck.CardDeckBaseName, first);
+ }
+ else if (HasComp(second))
+ {
+ cardStack = SpawnInSameParent(_cardHand.CardHandBaseName, first);
+ if(TryComp(cardStack, out var stackHand))
+ stackHand.Flipped = firstComp.Flipped;
+ flip = firstComp.Flipped;
+ }
+ else
+ return;
+
+ if (!TryComp(cardStack, out CardStackComponent? stack))
+ return;
+ if (!_cardStack.TryInsertCard(cardStack, first, stack))
+ return;
+ _cardStack.TransferNLastCardFromStacks(user, secondStack.Cards.Count, second, secondStack, cardStack, stack);
+ if (flip != null)
+ _cardStack.FlipAllCards(cardStack, stack, flip); //???
+ if(pickup)
+ _hands.TryPickupAnyHand(user, cardStack);
+ }
+
+ // Frontier: tries to spawn an entity with the same parent as another given entity.
+ // Useful when spawning decks/hands in a backpack, for example.
+ private EntityUid SpawnInSameParent(EntProtoId prototype, EntityUid uid)
+ {
+ if (_container.IsEntityOrParentInContainer(uid) &&
+ _container.TryGetOuterContainer(uid, Transform(uid), out var container))
+ {
+ return SpawnInContainerOrDrop(prototype, container.Owner, container.ID);
+ }
+ return Spawn(prototype, Transform(uid).Coordinates);
+ }
+
+ // Frontier: hacky misuse of the activation verb, but allows us a separate way to draw cards without needing additional buttons and event fiddling
+ private void OnActivationVerb(EntityUid uid, CardComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ if (args.Using == args.Target)
+ return;
+
+ if (HasComp(uid))
+ return;
+
+ if (args.Using == null)
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _hands.TryPickupAnyHand(args.User, args.Target),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var cardStack))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _cardStack.InsertCardOnStack(args.User, args.Using.Value, cardStack, args.Target),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var card))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _cardHand.TrySetupHandOfCards(args.User, args.Using.Value, card, args.Target, component, true),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ }
+ // End Frontier
+
+ private void OnActivate(EntityUid uid, CardComponent component, ActivateInWorldEvent args)
+ {
+ if (!args.Complex || args.Handled)
+ return;
+
+ if (!TryComp(args.User, out var hands))
+ return;
+
+ // Card stacks are handled differently
+ if (HasComp(args.Target))
+ return;
+
+ var activeItem = _hands.GetActiveItem((args.User, hands));
+
+ if (activeItem == null)
+ {
+ _hands.TryPickupAnyHand(args.User, args.Target);
+ }
+ else if (TryComp(activeItem, out var cardStack))
+ {
+ _cardStack.InsertCardOnStack(args.User, activeItem.Value, cardStack, args.Target);
+ }
+ else if (TryComp(activeItem, out var card))
+ {
+ _cardHand.TrySetupHandOfCards(args.User, activeItem.Value, card, args.Target, component, true);
+ }
+ }
+}
diff --git a/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckComponent.cs
new file mode 100644
index 000000000000..f695eab8d9c7
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckComponent.cs
@@ -0,0 +1,28 @@
+using Robust.Shared.Audio;
+
+namespace Content.Shared._EstacaoPirata.Cards.Deck;
+
+///
+/// This is used for...
+///
+[RegisterComponent]
+public sealed partial class CardDeckComponent : Component
+{
+ [DataField]
+ public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier("cardFan");
+
+ [DataField]
+ public SoundSpecifier PickUpSound = new SoundCollectionSpecifier("cardSlide");
+
+ [DataField]
+ public SoundSpecifier PlaceDownSound = new SoundCollectionSpecifier("cardShove");
+
+ [DataField]
+ public float YOffset = 0.02f;
+
+ [DataField]
+ public float Scale = 1;
+
+ [DataField]
+ public int CardLimit = 5;
+}
diff --git a/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs
new file mode 100644
index 000000000000..dc5096c81021
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs
@@ -0,0 +1,123 @@
+using Content.Shared._EstacaoPirata.Cards.Card;
+using Content.Shared._EstacaoPirata.Cards.Stack;
+using Content.Shared.Audio;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Item;
+using Content.Shared.Popups;
+using Content.Shared.Verbs;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Containers;
+using Robust.Shared.Network;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._EstacaoPirata.Cards.Deck;
+
+///
+/// This handles card decks
+///
+public sealed class CardDeckSystem : EntitySystem
+{
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly CardStackSystem _cardStackSystem = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ public readonly EntProtoId CardDeckBaseName = "CardDeckBase";
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent>(AddTurnOnVerb);
+ }
+
+ private void AddTurnOnVerb(EntityUid uid, CardDeckComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ if (!TryComp(uid, out CardStackComponent? comp))
+ return;
+
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TryShuffle(uid, component, comp),
+ Text = Loc.GetString("cards-verb-shuffle"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")),
+ Priority = 4
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TrySplit(args.Target, component, comp, args.User),
+ Text = Loc.GetString("cards-verb-split"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/dot.svg.192dpi.png")),
+ Priority = 3
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TryOrganize(uid, component, comp, true),
+ Text = Loc.GetString("cards-verb-organize-down"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 2
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TryOrganize(uid, component, comp, false),
+ Text = Loc.GetString("cards-verb-organize-up"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 1
+ });
+ }
+
+ private void TrySplit(EntityUid uid, CardDeckComponent deck, CardStackComponent stack, EntityUid user)
+ {
+ if (stack.Cards.Count <= 1)
+ return;
+
+ _audio.PlayPredicted(deck.PickUpSound, Transform(uid).Coordinates, user);
+
+ if (!_net.IsServer)
+ return;
+
+ var cardDeck = SpawnInSameParent(CardDeckBaseName, uid);
+
+ EnsureComp(cardDeck, out var deckStack);
+
+ _cardStackSystem.TransferNLastCardFromStacks(user, stack.Cards.Count / 2, uid, stack, cardDeck, deckStack);
+ _hands.PickupOrDrop(user, cardDeck);
+ }
+
+ private void TryShuffle(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack)
+ {
+ _cardStackSystem.ShuffleCards(deck, stack);
+ if (_net.IsClient)
+ return;
+
+ _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
+ _popup.PopupEntity(Loc.GetString("card-verb-shuffle-success", ("target", MetaData(deck).EntityName)), deck);
+ }
+
+ private void TryOrganize(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack, bool isFlipped)
+ {
+ if (_net.IsClient)
+ return;
+ _cardStackSystem.FlipAllCards(deck, stack, isFlipped: isFlipped);
+
+ _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
+ _popup.PopupEntity(Loc.GetString("card-verb-organize-success", ("target", MetaData(deck).EntityName), ("facedown", isFlipped)), deck);
+ }
+
+ private EntityUid SpawnInSameParent(string prototype, EntityUid uid)
+ {
+ if (_container.IsEntityOrParentInContainer(uid) &&
+ _container.TryGetOuterContainer(uid, Transform(uid), out var container))
+ {
+ return SpawnInContainerOrDrop(prototype, container.Owner, container.ID);
+ }
+ return Spawn(prototype, Transform(uid).Coordinates);
+ }
+}
diff --git a/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs
new file mode 100644
index 000000000000..39e0c4ac45e7
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs
@@ -0,0 +1,38 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._EstacaoPirata.Cards.Hand;
+
+///
+/// This is used for...
+///
+[RegisterComponent]
+public sealed partial class CardHandComponent : Component
+{
+ [DataField]
+ public float Angle = 120f;
+
+ [DataField]
+ public float XOffset = 0.5f;
+
+ [DataField]
+ public float Scale = 1;
+
+ [DataField]
+ public int CardLimit = 10;
+
+ [DataField]
+ public bool Flipped = false;
+}
+
+
+[Serializable, NetSerializable]
+public enum CardUiKey : byte
+{
+ Key
+}
+
+[Serializable, NetSerializable]
+public sealed class CardHandDrawMessage(NetEntity card) : BoundUserInterfaceMessage
+{
+ public NetEntity Card = card;
+}
diff --git a/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandSystem.cs
new file mode 100644
index 000000000000..98d089dfe924
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandSystem.cs
@@ -0,0 +1,237 @@
+using System.Linq;
+using Content.Shared._EstacaoPirata.Cards.Card;
+using Content.Shared._EstacaoPirata.Cards.Deck;
+using Content.Shared._EstacaoPirata.Cards.Stack;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Popups;
+using Content.Shared.Storage.EntitySystems;
+using Content.Shared.Verbs;
+using Robust.Shared.Containers;
+using Robust.Shared.Network;
+using Robust.Shared.Player;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._EstacaoPirata.Cards.Hand;
+
+///
+/// This handles...
+///
+
+public sealed class CardHandSystem : EntitySystem
+{
+ [ValidatePrototypeId]
+ public readonly EntProtoId CardHandBaseName = "CardHandBase";
+ [ValidatePrototypeId]
+ public readonly EntProtoId CardDeckBaseName = "CardDeckBase";
+
+ [Dependency] private readonly CardStackSystem _cardStack = default!;
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly SharedStorageSystem _storage = default!; // Frontier
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnInteractUsing);
+ SubscribeLocalEvent(OnCardDraw);
+ SubscribeLocalEvent(OnStackQuantityChange);
+ SubscribeLocalEvent>(OnAlternativeVerb);
+ }
+
+ private void OnStackQuantityChange(EntityUid uid, CardHandComponent comp, CardStackQuantityChangeEvent args)
+ {
+ if (_net.IsClient)
+ return;
+
+ if (!TryComp(uid, out CardStackComponent? stack))
+ return;
+
+ if (stack.Cards.Count < 0)
+ {
+ Log.Warning($"Invalid negative card count {stack.Cards.Count} detected in stack {ToPrettyString(uid)}");
+ return;
+ }
+
+ var text = args.Type switch
+ {
+ StackQuantityChangeType.Added => "cards-stackquantitychange-added",
+ StackQuantityChangeType.Removed => "cards-stackquantitychange-removed",
+ StackQuantityChangeType.Joined => "cards-stackquantitychange-joined",
+ StackQuantityChangeType.Split => "cards-stackquantitychange-split",
+ _ => "cards-stackquantitychange-unknown"
+ };
+
+ _popupSystem.PopupEntity(Loc.GetString(text, ("quantity", stack.Cards.Count)), uid);
+
+ _cardStack.FlipAllCards(uid, stack, comp.Flipped);
+ }
+
+ private void OnCardDraw(EntityUid uid, CardHandComponent comp, CardHandDrawMessage args)
+ {
+ if (!TryComp(uid, out CardStackComponent? stack))
+ return;
+ var pickup = _hands.IsHolding(args.Actor, uid);
+ EntityUid? leftover = null;
+ var cardEnt = GetEntity(args.Card);
+
+ if (stack.Cards.Count == 2 && pickup)
+ {
+ leftover = stack.Cards[0] != cardEnt ? stack.Cards[0] : stack.Cards[1];
+ }
+ if (!_cardStack.TryRemoveCard(uid, cardEnt, stack))
+ return;
+
+ if (_net.IsServer)
+ _storage.PlayPickupAnimation(cardEnt, Transform(cardEnt).Coordinates, Transform(args.Actor).Coordinates, 0);
+
+ _hands.TryPickupAnyHand(args.Actor, cardEnt);
+ if (pickup && leftover != null)
+ {
+ _hands.TryPickupAnyHand(args.Actor, leftover.Value);
+ }
+ }
+
+ private void OpenHandMenu(EntityUid user, EntityUid hand)
+ {
+ if (!TryComp(user, out var actor))
+ return;
+
+ _ui.OpenUi(hand, CardUiKey.Key, actor.PlayerSession);
+
+ }
+
+ private void OnAlternativeVerb(EntityUid uid, CardHandComponent comp, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => OpenHandMenu(args.User, uid),
+ Text = Loc.GetString("cards-verb-pickcard"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")),
+ Priority = 4
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => _cardStack.ShuffleCards(uid),
+ Text = Loc.GetString("cards-verb-shuffle"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")),
+ Priority = 3
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => FlipCards(uid, comp),
+ Text = Loc.GetString("cards-verb-flip"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 2
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => ConvertToDeck(args.User, uid),
+ Text = Loc.GetString("cards-verb-convert-to-deck"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/rotate_cw.svg.192dpi.png")),
+ Priority = 1
+ });
+ }
+
+ private void OnInteractUsing(EntityUid uid, CardComponent comp, InteractUsingEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ if (HasComp(args.Used) ||
+ !TryComp(args.Used, out CardComponent? usedComp))
+ return;
+
+ if (!HasComp(args.Target) &&
+ TryComp(args.Target, out CardComponent? targetCardComp))
+ {
+ TrySetupHandOfCards(args.User, args.Used, usedComp, args.Target, targetCardComp, true);
+ args.Handled = true;
+ }
+ }
+
+ private void ConvertToDeck(EntityUid user, EntityUid hand)
+ {
+ if (_net.IsClient)
+ return;
+
+ var cardDeck = SpawnInSameParent(CardDeckBaseName, hand);
+ bool isHoldingCards = _hands.IsHolding(user, hand);
+
+ EnsureComp(cardDeck, out var deckStack);
+ if (!TryComp(hand, out CardStackComponent? handStack))
+ return;
+ _cardStack.TryJoinStacks(cardDeck, hand, deckStack, handStack, null);
+
+ if (isHoldingCards)
+ _hands.TryPickupAnyHand(user, cardDeck);
+ }
+ public void TrySetupHandOfCards(EntityUid user, EntityUid card, CardComponent comp, EntityUid target, CardComponent targetComp, bool pickup)
+ {
+ if (card == target || _net.IsClient)
+ return;
+ var cardHand = SpawnInSameParent(CardHandBaseName, card);
+ if (TryComp(cardHand, out var handComp))
+ handComp.Flipped = targetComp.Flipped;
+ if (!TryComp(cardHand, out CardStackComponent? stack))
+ return;
+ if (!_cardStack.TryInsertCard(cardHand, card, stack) || !_cardStack.TryInsertCard(cardHand, target, stack))
+ return;
+ if (_net.IsServer)
+ _storage.PlayPickupAnimation(card, Transform(card).Coordinates, Transform(cardHand).Coordinates, 0);
+ if (pickup && !_hands.TryPickupAnyHand(user, cardHand))
+ return;
+ _cardStack.FlipAllCards(cardHand, stack, targetComp.Flipped);
+ }
+
+ public void TrySetupHandFromStack(EntityUid user, EntityUid card, CardComponent comp, EntityUid target, CardStackComponent targetComp, bool pickup)
+ {
+ if (_net.IsClient)
+ return;
+ var cardHand = SpawnInSameParent(CardHandBaseName, card);
+ if (TryComp(cardHand, out var handComp))
+ handComp.Flipped = comp.Flipped;
+ if (!TryComp(cardHand, out CardStackComponent? stack))
+ return;
+ if (!_cardStack.TryInsertCard(cardHand, card, stack))
+ return;
+ _cardStack.TransferNLastCardFromStacks(user, 1, target, targetComp, cardHand, stack);
+ if (pickup && !_hands.TryPickupAnyHand(user, cardHand))
+ return;
+ _cardStack.FlipAllCards(cardHand, stack, comp.Flipped);
+ }
+
+ private void FlipCards(EntityUid hand, CardHandComponent comp)
+ {
+ comp.Flipped = !comp.Flipped;
+ _cardStack.FlipAllCards(hand, null, comp.Flipped);
+ }
+
+ // Frontier: tries to spawn an entity with the same parent as another given entity.
+ // Useful when spawning decks/hands in a backpack, for example.
+ private EntityUid SpawnInSameParent(EntProtoId prototype, EntityUid uid)
+ {
+ if (prototype == default)
+ throw new ArgumentException("Cannot spawn with null prototype", nameof(prototype));
+
+ if (_container.IsEntityOrParentInContainer(uid) &&
+ _container.TryGetOuterContainer(uid, Transform(uid), out var container))
+ {
+ var entity = SpawnInContainerOrDrop(prototype, container.Owner, container.ID);
+ if (!Exists(entity))
+ Log.Error($"Failed to spawn {prototype} in container {container.ID}");
+ return entity;
+ }
+ var worldEntity = Spawn(prototype, Transform(uid).Coordinates);
+ if (!Exists(worldEntity))
+ Log.Error($"Failed to spawn {prototype} at coordinates {Transform(uid).Coordinates}");
+ return worldEntity;
+ }
+}
diff --git a/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackComponent.cs
new file mode 100644
index 000000000000..3247e0752b21
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackComponent.cs
@@ -0,0 +1,83 @@
+using Robust.Shared.Audio;
+using Robust.Shared.Containers;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._EstacaoPirata.Cards.Stack;
+
+///
+/// This is used for holding the prototype ids of the cards in the stack or hand.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+
+public sealed partial class CardStackComponent : Component
+{
+ [DataField]
+ public List InitialContent = [];
+
+ [DataField]
+ public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier("cardFan");
+
+ [DataField]
+ public SoundSpecifier PickUpSound = new SoundCollectionSpecifier("cardSlide");
+
+ [DataField]
+ public SoundSpecifier PlaceDownSound = new SoundCollectionSpecifier("cardShove");
+
+
+ ///
+ /// The containers that contain the items held in the stack
+ ///
+ [ViewVariables]
+ public Container ItemContainer = default!;
+
+ ///
+ /// The list EntityUIds of Cards
+ ///
+ [DataField, AutoNetworkedField]
+ public List Cards = [];
+}
+
+[Serializable, NetSerializable]
+public sealed class CardStackInitiatedEvent(NetEntity cardStack) : EntityEventArgs
+{
+ public NetEntity CardStack = cardStack;
+}
+
+///
+/// This gets Updated when new cards are added or removed from the stack
+///
+[Serializable, NetSerializable]
+public sealed class CardStackQuantityChangeEvent(NetEntity stack, NetEntity? card, StackQuantityChangeType type) : EntityEventArgs
+{
+ public NetEntity Stack = stack;
+ public NetEntity? Card = card;
+ public StackQuantityChangeType Type = type;
+}
+
+[Serializable, NetSerializable]
+public enum StackQuantityChangeType : sbyte
+{
+ Added,
+ Removed,
+ Joined,
+ Split
+}
+
+
+
+[Serializable, NetSerializable]
+public sealed class CardStackReorderedEvent(NetEntity stack) : EntityEventArgs
+{
+ public NetEntity Stack = stack;
+}
+
+[Serializable, NetSerializable]
+public sealed class CardStackFlippedEvent(NetEntity cardStack) : EntityEventArgs
+{
+ public NetEntity CardStack = cardStack;
+}
+
+
+
diff --git a/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackSystem.cs
new file mode 100644
index 000000000000..ca09056bb761
--- /dev/null
+++ b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackSystem.cs
@@ -0,0 +1,482 @@
+using System.Linq;
+using Content.Shared._EstacaoPirata.Cards.Card;
+using Content.Shared._EstacaoPirata.Cards.Deck;
+using Content.Shared._EstacaoPirata.Cards.Hand;
+using Content.Shared.Examine;
+using Content.Shared.Hands.Components;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Storage.EntitySystems;
+using Content.Shared.Verbs;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Containers;
+using Robust.Shared.Map;
+using Robust.Shared.Network;
+using Robust.Shared.Random;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._EstacaoPirata.Cards.Stack;
+
+///
+/// This handles stack of cards.
+/// It is used to shuffle, flip, insert, remove, and join stacks of cards.
+/// It also handles the events related to the stack of cards.
+///
+public sealed class CardStackSystem : EntitySystem
+{
+ public const string ContainerId = "cardstack-container";
+ public const int MaxCardsInStack = 212; // Frontier: four 53-card decks.
+
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly EntityManager _entityManager = default!;
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly SharedStorageSystem _storage = default!;
+ [Dependency] private readonly CardHandSystem _cardHandSystem = default!; // Frontier
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+
+ ///
+ public override void Initialize()
+ {
+ // Pretty much a rip-off of the BinSystem
+ SubscribeLocalEvent(OnStartup);
+ SubscribeLocalEvent(OnMapInit);
+ SubscribeLocalEvent(OnEntRemoved);
+ SubscribeLocalEvent>(OnAlternativeVerb);
+ SubscribeLocalEvent>(OnActivationVerb);
+ SubscribeLocalEvent(OnActivate);
+ SubscribeLocalEvent(OnExamine);
+ SubscribeLocalEvent(OnInteractUsing);
+ }
+
+ public bool TryRemoveCard(EntityUid uid, EntityUid card, CardStackComponent? comp = null)
+ {
+ if (!Resolve(uid, ref comp))
+ return false;
+
+ if (!TryComp(card, out CardComponent? _))
+ return false;
+
+ _container.Remove(card, comp.ItemContainer);
+ comp.Cards.Remove(card);
+
+ // If there is a final card left over, remove that card from the container and delete the stack alltogether
+ if (comp.Cards.Count == 1)
+ {
+
+ _container.Remove(comp.Cards.First(), comp.ItemContainer);
+ comp.Cards.Clear();
+ }
+
+ Dirty(uid, comp);
+
+ RaiseLocalEvent(uid, new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Removed));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Removed));
+ // Prevents prediction ruining things
+ if (_net.IsServer && comp.Cards.Count <= 0)
+ {
+ _entityManager.DeleteEntity(uid);
+ }
+ return true;
+ }
+
+ public bool TryInsertCard(EntityUid uid, EntityUid card, CardStackComponent? comp = null)
+ {
+ if (!Resolve(uid, ref comp))
+ return false;
+
+ if (!TryComp(card, out CardComponent? _))
+ return false;
+
+ if (comp.Cards.Count >= MaxCardsInStack)
+ return false;
+
+ _container.Insert(card, comp.ItemContainer);
+ comp.Cards.Add(card);
+
+ Dirty(uid, comp);
+ RaiseLocalEvent(uid, new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Added));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Added));
+ return true;
+ }
+
+ public bool ShuffleCards(EntityUid uid, CardStackComponent? comp = null)
+ {
+ if (!Resolve(uid, ref comp))
+ return false;
+
+ _random.Shuffle(comp.Cards);
+
+ Dirty(uid, comp);
+ RaiseLocalEvent(uid, new CardStackReorderedEvent(GetNetEntity(uid)));
+ RaiseNetworkEvent(new CardStackReorderedEvent(GetNetEntity(uid)));
+ return true;
+ }
+
+ ///
+ /// Server-Side only method to flip all cards within a stack. This starts CardFlipUpdatedEvent and CardStackFlippedEvent event
+ ///
+ ///
+ ///
+ /// If null, all cards will just invert direction, if it contains a value, then all cards will receive that value
+ ///
+ public bool FlipAllCards(EntityUid uid, CardStackComponent? comp = null, bool? isFlipped = null)
+ {
+ if (_net.IsClient)
+ return false;
+ if (!Resolve(uid, ref comp))
+ return false;
+ foreach (var card in comp.Cards)
+ {
+ if (!TryComp(card, out CardComponent? cardComponent))
+ continue;
+
+ cardComponent.Flipped = isFlipped ?? !cardComponent.Flipped;
+
+ Dirty(card, cardComponent);
+ RaiseNetworkEvent(new CardFlipUpdatedEvent(GetNetEntity(card)));
+ }
+
+ RaiseNetworkEvent(new CardStackFlippedEvent(GetNetEntity(uid)));
+ return true;
+ }
+
+ public bool TryJoinStacks(EntityUid firstStack, EntityUid secondStack, CardStackComponent? firstComp = null, CardStackComponent? secondComp = null, EntityUid? soundUser = null)
+ {
+ if (firstStack == secondStack)
+ return false;
+ if (!Resolve(firstStack, ref firstComp) || !Resolve(secondStack, ref secondComp))
+ return false;
+
+ bool changed = false;
+ var cardList = secondComp.Cards.ToList();
+ EntityUid? firstCard = secondComp.Cards.Count > 0 ? cardList[0] : null; // Cache the first card transferred for animations (better to have something moving than nothing, and we destroy the other stack)
+
+ foreach (var card in cardList)
+ {
+ if (firstComp.Cards.Count >= MaxCardsInStack)
+ break;
+ _container.Remove(card, secondComp.ItemContainer);
+ secondComp.Cards.Remove(card);
+ firstComp.Cards.Add(card);
+ _container.Insert(card, firstComp.ItemContainer);
+ changed = true;
+ }
+ if (changed)
+ {
+ if (soundUser != null)
+ {
+ _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(firstStack).Coordinates, soundUser.Value);
+ if(_net.IsServer)
+ _storage.PlayPickupAnimation(firstCard!.Value, Transform(secondStack).Coordinates, Transform(firstStack).Coordinates, 0);
+ }
+
+ if (_net.IsClient)
+ return changed;
+
+ Dirty(firstStack, firstComp);
+ if (secondComp.Cards.Count <= 0)
+ {
+ _entityManager.DeleteEntity(secondStack);
+ }
+ else
+ {
+ Dirty(secondStack, secondComp);
+ RaiseLocalEvent(secondStack, new CardStackQuantityChangeEvent(GetNetEntity(secondStack), null, StackQuantityChangeType.Split));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(secondStack), null, StackQuantityChangeType.Split));
+ }
+ RaiseLocalEvent(firstStack, new CardStackQuantityChangeEvent(GetNetEntity(firstStack), null, StackQuantityChangeType.Joined));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(firstStack), null, StackQuantityChangeType.Joined));
+ }
+
+ return changed;
+ }
+
+ #region EventHandling
+
+ private void OnStartup(EntityUid uid, CardStackComponent component, ComponentStartup args)
+ {
+ component.ItemContainer = _container.EnsureContainer(uid, ContainerId);
+ }
+
+ private void OnMapInit(EntityUid uid, CardStackComponent comp, MapInitEvent args)
+ {
+ if (_net.IsClient)
+ return;
+
+ var coordinates = Transform(uid).Coordinates;
+ var spawnedEntities = new List();
+ foreach (var id in comp.InitialContent)
+ {
+ var ent = Spawn(id, coordinates);
+ spawnedEntities.Add(ent);
+ if (TryInsertCard(uid, ent, comp))
+ continue;
+ Log.Error($"Entity {ToPrettyString(ent)} was unable to be initialized into stack {ToPrettyString(uid)}");
+ foreach (var spawned in spawnedEntities)
+ _entityManager.DeleteEntity(spawned);
+ return;
+ }
+ RaiseNetworkEvent(new CardStackInitiatedEvent(GetNetEntity(uid)));
+ }
+
+ // It seems the cards don't get removed if this event is not subscribed... strange right? thanks again bin system
+ private void OnEntRemoved(EntityUid uid, CardStackComponent component, EntRemovedFromContainerMessage args)
+ {
+ component.Cards.Remove(args.Entity);
+ }
+
+ private void OnExamine(EntityUid uid, CardStackComponent component, ExaminedEvent args)
+ {
+ args.PushText(Loc.GetString("card-stack-examine", ("count", component.Cards.Count)));
+ }
+
+ private void OnAlternativeVerb(EntityUid uid, CardStackComponent component, GetVerbsEvent args)
+ {
+ if (args.Using == args.Target)
+ return;
+ if (!TryComp(args.Target, out CardStackComponent? targetStack))
+ return;
+
+ if (TryComp(args.Using, out CardStackComponent? usingStack))
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 8,
+ Act = () => JoinStacks(args.User, args.Target, targetStack, (EntityUid)args.Using, usingStack)
+ });
+ }
+ else if (TryComp(args.Using, out CardComponent? usingCard)) // Frontier: single card interaction
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 8,
+ Act = () => InsertCardOnStack(args.User, args.Target, targetStack, (EntityUid)args.Using)
+ });
+ } // End Frontier: single card interaction
+ }
+
+ // Frontier: hacky misuse of the activation verb, but allows us a separate way to draw cards without needing additional buttons and event fiddling
+ private void OnActivationVerb(EntityUid uid, CardStackComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ if (args.Using == args.Target)
+ return;
+
+ if (args.Using == null)
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => OnInteractHand(args.Target, component, args.User),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var cardStack))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => TransferNLastCardFromStacks(args.User, 1, args.Target, component, args.Using.Value, cardStack),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var card))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _cardHandSystem.TrySetupHandFromStack(args.User, args.Using.Value, card, args.Target, component, true),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ }
+ // End Frontier
+
+ private void JoinStacks(EntityUid user, EntityUid first, CardStackComponent firstComp, EntityUid second, CardStackComponent secondComp)
+ {
+ TryJoinStacks(first, second, firstComp, secondComp, user);
+ }
+
+ public void InsertCardOnStack(EntityUid user, EntityUid stack, CardStackComponent stackComponent, EntityUid card)
+ {
+ if (!TryInsertCard(stack, card))
+ return;
+
+ _audio.PlayPredicted(stackComponent.PlaceDownSound, Transform(stack).Coordinates, user);
+ if (_net.IsClient)
+ return;
+ _storage.PlayPickupAnimation(card, Transform(user).Coordinates, Transform(stack).Coordinates, 0);
+ }
+
+ ///
+ /// This takes the last card from the first stack and inserts it into the second stack
+ ///
+ public void TransferNLastCardFromStacks(EntityUid user, int n, EntityUid first, CardStackComponent firstComp, EntityUid second, CardStackComponent secondComp)
+ {
+ if (firstComp.Cards.Count <= 0)
+ return;
+
+ var cards = firstComp.Cards.TakeLast(n).ToList(); // Frontier: make a copy we don't munge during iteration
+
+ var firstCard = cards.First(); // Cache first card for animation - enumerable changes in foreach
+
+ bool changed = false;
+ foreach (var card in cards)
+ {
+ if (secondComp.Cards.Count >= MaxCardsInStack)
+ break;
+ _container.Remove(card, firstComp.ItemContainer);
+ firstComp.Cards.Remove(card);
+ secondComp.Cards.Add(card);
+ _container.Insert(card, secondComp.ItemContainer);
+ changed = true;
+ }
+
+ if (changed)
+ {
+ _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(second).Coordinates, user);
+ if (_net.IsClient)
+ return;
+
+ _storage.PlayPickupAnimation(firstCard, Transform(first).Coordinates, Transform(second).Coordinates, 0);
+
+ Dirty(second, secondComp);
+ if (firstComp.Cards.Count == 1)
+ {
+ var card = firstComp.Cards.First();
+ _container.Remove(card, firstComp.ItemContainer);
+ if (_hands.IsHolding(user, first))
+ {
+ _hands.TryDrop(user, first);
+ _hands.TryPickupAnyHand(user, card);
+ }
+ firstComp.Cards.Clear();
+ }
+ if (firstComp.Cards.Count <= 0)
+ {
+ _entityManager.DeleteEntity(first);
+ }
+ else
+ {
+ Dirty(first, firstComp);
+ RaiseLocalEvent(first, new CardStackQuantityChangeEvent(GetNetEntity(first), null, StackQuantityChangeType.Removed));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(first), null, StackQuantityChangeType.Removed));
+ }
+ RaiseLocalEvent(second, new CardStackQuantityChangeEvent(GetNetEntity(second), null, StackQuantityChangeType.Added));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(second), null, StackQuantityChangeType.Added));
+ }
+ }
+
+ private void OnInteractUsing(InteractUsingEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ if (args.Target == args.Used)
+ return;
+
+ // This checks if the user is using an item with Stack component
+ if (TryComp(args.Used, out CardStackComponent? usedStack))
+ {
+ // If the target is a card, then it will insert the card into the stack
+ if (TryComp(args.Target, out CardComponent? _))
+ {
+ InsertCardOnStack(args.User, args.Used, usedStack, args.Target);
+ args.Handled = true;
+ return;
+ }
+
+ // If instead, the target is a stack, then it will join the two stacks
+ if (!TryComp(args.Target, out CardStackComponent? targetStack))
+ return;
+
+ TransferNLastCardFromStacks(args.User, 1, args.Target, targetStack, args.Used, usedStack);
+ args.Handled = true;
+ }
+
+ // This handles the reverse case, where the user is using a card and inserting it to a stack
+ else if (TryComp(args.Target, out CardStackComponent? stack))
+ {
+ //InsertCardOnStack(args.User, args.Target, stack, args.Used); // Frontier: old version
+ if (TryComp(args.Used, out CardComponent? card))
+ {
+ _cardHandSystem.TrySetupHandFromStack(args.User, args.Used, card, args.Target, stack, true);
+ args.Handled = true;
+ }
+ }
+ }
+
+ private void OnInteractHand(EntityUid uid, CardStackComponent component, EntityUid user)
+ {
+ var pickup = _hands.IsHolding(user, uid);
+ if (component.Cards.Count <= 0)
+ return;
+
+ if (!component.Cards.TryGetValue(component.Cards.Count - 1, out var card))
+ return;
+ if (!component.Cards.TryGetValue(component.Cards.Count - 2, out var under))
+ return;
+
+ if (!TryRemoveCard(uid, card, component))
+ return;
+
+ _hands.TryPickupAnyHand(user, card);
+ if (!Exists(uid) && pickup)
+ _hands.TryPickupAnyHand(user, under);
+
+ if (TryComp(uid, out var deck))
+ _audio.PlayPredicted(deck.PickUpSound, Transform(card).Coordinates, user);
+ else
+ _audio.PlayPredicted(component.PickUpSound, Transform(card).Coordinates, user);
+ }
+
+ private void OnActivate(EntityUid uid, CardStackComponent component, ActivateInWorldEvent args)
+ {
+ if (!args.Complex || args.Handled)
+ return;
+
+ if (!TryComp(args.User, out var hands))
+ {
+ args.Handled = true;
+ return;
+ }
+
+ var activeItem = _hands.GetActiveItem((args.User, hands));
+
+ if (activeItem == null)
+ {
+ // Runs if active item is nothing
+ // behavior is to draw one card from this target onto active hand as a standalone card
+ OnInteractHand(args.Target, component, args.User);
+ }
+ else if (activeItem == args.Target)
+ {
+ // Added from a Frontier PR. Don't want to draw a card from a stack onto itself.
+ args.Handled = true;
+ return;
+ }
+ else if (TryComp(activeItem, out var cardStack))
+ {
+ // If the active item contains a card stack, behavior is to draw from Target and place onto activeHand.
+ TransferNLastCardFromStacks(args.User, 1, args.Target, component, activeItem.Value, cardStack);
+ }
+ else if (TryComp(activeItem, out var card))
+ {
+ _cardHandSystem.TrySetupHandFromStack(args.User, activeItem.Value, card, args.Target, component, true);
+ }
+ args.Handled = true;
+ }
+
+ #endregion
+}
diff --git a/Resources/Audio/DeltaV/Voice/Chitinid/attributions.yml b/Resources/Audio/DeltaV/Voice/Chitinid/attributions.yml
new file mode 100644
index 000000000000..5d6386b81d6f
--- /dev/null
+++ b/Resources/Audio/DeltaV/Voice/Chitinid/attributions.yml
@@ -0,0 +1,9 @@
+- files: ["moth_scream.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from https://github.com/tgstation/tgstation/commit/31c19654e0f641166ecd80c672ea05362fd19488"
+ source: "https://github.com/tgstation/tgstation/commits/master/sound/voice/moth/scream_moth.ogg"
+
+- files: ["moth_laugh.ogg, moth_chitter.ogg, moth_squeak.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from https://github.com/BeeStation/BeeStation-Hornet/commit/11ba3fa04105c93dd96a63ad4afaef4b20c02d0d"
+ source: "https://github.com/BeeStation/BeeStation-Hornet/blob/11ba3fa04105c93dd96a63ad4afaef4b20c02d0d/sound/emotes/"
diff --git a/Resources/Audio/DeltaV/Voice/Chitinid/male_cough_1.ogg b/Resources/Audio/DeltaV/Voice/Chitinid/male_cough_1.ogg
new file mode 100644
index 000000000000..8ddc42024474
Binary files /dev/null and b/Resources/Audio/DeltaV/Voice/Chitinid/male_cough_1.ogg differ
diff --git a/Resources/Audio/DeltaV/Voice/Chitinid/moth_chitter.ogg b/Resources/Audio/DeltaV/Voice/Chitinid/moth_chitter.ogg
new file mode 100644
index 000000000000..b7240a565361
Binary files /dev/null and b/Resources/Audio/DeltaV/Voice/Chitinid/moth_chitter.ogg differ
diff --git a/Resources/Audio/DeltaV/Voice/Chitinid/moth_laugh.ogg b/Resources/Audio/DeltaV/Voice/Chitinid/moth_laugh.ogg
new file mode 100644
index 000000000000..d3c2865ab642
Binary files /dev/null and b/Resources/Audio/DeltaV/Voice/Chitinid/moth_laugh.ogg differ
diff --git a/Resources/Audio/DeltaV/Voice/Chitinid/moth_scream.ogg b/Resources/Audio/DeltaV/Voice/Chitinid/moth_scream.ogg
new file mode 100644
index 000000000000..482086fb630d
Binary files /dev/null and b/Resources/Audio/DeltaV/Voice/Chitinid/moth_scream.ogg differ
diff --git a/Resources/Audio/DeltaV/Voice/Chitinid/moth_squeak.ogg b/Resources/Audio/DeltaV/Voice/Chitinid/moth_squeak.ogg
new file mode 100644
index 000000000000..5b77d98e5654
Binary files /dev/null and b/Resources/Audio/DeltaV/Voice/Chitinid/moth_squeak.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/attributions.yml b/Resources/Audio/EstacaoPirata/Effects/Cards/attributions.yml
new file mode 100644
index 000000000000..879bb3bc0445
--- /dev/null
+++ b/Resources/Audio/EstacaoPirata/Effects/Cards/attributions.yml
@@ -0,0 +1,6 @@
+- files: [ "cardFan1.ogg", "cardFan2.ogg", "cardOpenPackage1.ogg", "cardOpenPackage2.ogg", "cardPlace1.ogg", "cardPlace2.ogg", "cardPlace3.ogg", "cardPlace4.ogg", "cardShove1.ogg", "cardShove2.ogg", "cardShove3.ogg", "cardShove4.ogg", "cardShuffle.ogg", "cardSlide1.ogg", "cardSlide2.ogg", "cardSlide3.ogg", "cardSlide4.ogg", "cardSlide5.ogg", "cardSlide6.ogg", "cardSlide7.ogg", "cardSlide8.ogg", "cardTakeOutPackage1.ogg", "cardTakeOutPackage2.ogg"]
+ license: "CC0-1.0"
+ copyright: "Kenney.nl"
+ source: "https://opengameart.org/content/54-casino-sound-effects-cards-dice-chips"
+
+
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan1.ogg
new file mode 100644
index 000000000000..6d059e204b84
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan1.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan2.ogg
new file mode 100644
index 000000000000..b744067444a3
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan2.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage1.ogg
new file mode 100644
index 000000000000..9d04ade0be61
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage1.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage2.ogg
new file mode 100644
index 000000000000..32afa72eb7b2
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage2.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace1.ogg
new file mode 100644
index 000000000000..61d8b7170f78
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace1.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace2.ogg
new file mode 100644
index 000000000000..827baa8dfd68
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace2.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace3.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace3.ogg
new file mode 100644
index 000000000000..7f1b11ce4c91
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace3.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace4.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace4.ogg
new file mode 100644
index 000000000000..088455b47db8
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace4.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove1.ogg
new file mode 100644
index 000000000000..89fb73a9a55c
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove1.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove2.ogg
new file mode 100644
index 000000000000..5b625d301245
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove2.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove3.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove3.ogg
new file mode 100644
index 000000000000..282d1a870eae
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove3.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove4.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove4.ogg
new file mode 100644
index 000000000000..cc10d9248d57
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove4.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShuffle.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShuffle.ogg
new file mode 100644
index 000000000000..6b2724fe5ea1
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShuffle.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide1.ogg
new file mode 100644
index 000000000000..9545e2448504
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide1.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide2.ogg
new file mode 100644
index 000000000000..d41969c20b8f
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide2.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide3.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide3.ogg
new file mode 100644
index 000000000000..4e2295221761
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide3.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide4.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide4.ogg
new file mode 100644
index 000000000000..47dd7e9032f0
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide4.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide5.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide5.ogg
new file mode 100644
index 000000000000..281d89da0af4
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide5.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide6.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide6.ogg
new file mode 100644
index 000000000000..b11d1b909276
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide6.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide7.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide7.ogg
new file mode 100644
index 000000000000..700e64b893bb
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide7.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide8.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide8.ogg
new file mode 100644
index 000000000000..8aff3ea887bf
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide8.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage1.ogg
new file mode 100644
index 000000000000..cc90ece15846
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage1.ogg differ
diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg
new file mode 100644
index 000000000000..95755e661440
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg differ
diff --git a/Resources/Audio/Voice/Plasmaman/attributions.yml b/Resources/Audio/Voice/Plasmaman/attributions.yml
new file mode 100644
index 000000000000..c2baecc2b674
--- /dev/null
+++ b/Resources/Audio/Voice/Plasmaman/attributions.yml
@@ -0,0 +1,7 @@
+- files:
+ - plasmaman_scream_1.ogg
+ - plasmaman_scream_2.ogg
+ - plasmaman_scream_3.ogg
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from https://github.com/tgstation/tgstation/commit/436ba869ebcd0b60b63973fb7562f447ee655205 and volume reduced by Skubman"
+ source: "https://github.com/tgstation/tgstation"
diff --git a/Resources/Audio/Voice/Plasmaman/plasmaman_scream_1.ogg b/Resources/Audio/Voice/Plasmaman/plasmaman_scream_1.ogg
new file mode 100644
index 000000000000..f0687945060f
Binary files /dev/null and b/Resources/Audio/Voice/Plasmaman/plasmaman_scream_1.ogg differ
diff --git a/Resources/Audio/Voice/Plasmaman/plasmaman_scream_2.ogg b/Resources/Audio/Voice/Plasmaman/plasmaman_scream_2.ogg
new file mode 100644
index 000000000000..e61619c02766
Binary files /dev/null and b/Resources/Audio/Voice/Plasmaman/plasmaman_scream_2.ogg differ
diff --git a/Resources/Audio/Voice/Plasmaman/plasmaman_scream_3.ogg b/Resources/Audio/Voice/Plasmaman/plasmaman_scream_3.ogg
new file mode 100644
index 000000000000..ac8b8ec21f32
Binary files /dev/null and b/Resources/Audio/Voice/Plasmaman/plasmaman_scream_3.ogg differ
diff --git a/Resources/Audio/Weapons/attributions.yml b/Resources/Audio/Weapons/attributions.yml
index 310b01b7280a..11e8199c87a1 100644
--- a/Resources/Audio/Weapons/attributions.yml
+++ b/Resources/Audio/Weapons/attributions.yml
@@ -82,8 +82,13 @@
license: "CC0-1.0"
copyright: "Taken from ScreamStudio on freesound.org"
source: "https://freesound.org/people/ScreamStudio/sounds/392617/"
-
+
- files: ["pop.ogg"]
license: "CC0-1.0"
copyright: "Taken from 0ne_one111yt on freesound.org"
source: "https://freesound.org/people/0ne_one111yt/sounds/478213/"
+
+- files: ["firepunch1.ogg", "firepunch2.ogg", "firepunch3.ogg", "firepunch4.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from Citadel Station 13. Remixed to mono where it was stereo by metalgearsloth then added punch sound effects by Skubman"
+ source: "https://github.com/Citadel-Station-13/Citadel-Station-13-RP/tree/cc701aedb633d83eae8339a8b3712ad8ad99cca0/sound"
diff --git a/Resources/Audio/Weapons/firepunch1.ogg b/Resources/Audio/Weapons/firepunch1.ogg
new file mode 100644
index 000000000000..6f13ff9cef59
Binary files /dev/null and b/Resources/Audio/Weapons/firepunch1.ogg differ
diff --git a/Resources/Audio/Weapons/firepunch2.ogg b/Resources/Audio/Weapons/firepunch2.ogg
new file mode 100644
index 000000000000..fe4e7ef41b44
Binary files /dev/null and b/Resources/Audio/Weapons/firepunch2.ogg differ
diff --git a/Resources/Audio/Weapons/firepunch3.ogg b/Resources/Audio/Weapons/firepunch3.ogg
new file mode 100644
index 000000000000..2503a66583ad
Binary files /dev/null and b/Resources/Audio/Weapons/firepunch3.ogg differ
diff --git a/Resources/Audio/Weapons/firepunch4.ogg b/Resources/Audio/Weapons/firepunch4.ogg
new file mode 100644
index 000000000000..c656d6c8ca1f
Binary files /dev/null and b/Resources/Audio/Weapons/firepunch4.ogg differ
diff --git a/Resources/Audio/_DV/Voice/Chitinid/attributions.yml b/Resources/Audio/_DV/Voice/Chitinid/attributions.yml
new file mode 100644
index 000000000000..5d6386b81d6f
--- /dev/null
+++ b/Resources/Audio/_DV/Voice/Chitinid/attributions.yml
@@ -0,0 +1,9 @@
+- files: ["moth_scream.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from https://github.com/tgstation/tgstation/commit/31c19654e0f641166ecd80c672ea05362fd19488"
+ source: "https://github.com/tgstation/tgstation/commits/master/sound/voice/moth/scream_moth.ogg"
+
+- files: ["moth_laugh.ogg, moth_chitter.ogg, moth_squeak.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from https://github.com/BeeStation/BeeStation-Hornet/commit/11ba3fa04105c93dd96a63ad4afaef4b20c02d0d"
+ source: "https://github.com/BeeStation/BeeStation-Hornet/blob/11ba3fa04105c93dd96a63ad4afaef4b20c02d0d/sound/emotes/"
diff --git a/Resources/Audio/_DV/Voice/Chitinid/male_cough_1.ogg b/Resources/Audio/_DV/Voice/Chitinid/male_cough_1.ogg
new file mode 100644
index 000000000000..8ddc42024474
Binary files /dev/null and b/Resources/Audio/_DV/Voice/Chitinid/male_cough_1.ogg differ
diff --git a/Resources/Audio/_DV/Voice/Chitinid/moth_chitter.ogg b/Resources/Audio/_DV/Voice/Chitinid/moth_chitter.ogg
new file mode 100644
index 000000000000..b7240a565361
Binary files /dev/null and b/Resources/Audio/_DV/Voice/Chitinid/moth_chitter.ogg differ
diff --git a/Resources/Audio/_DV/Voice/Chitinid/moth_laugh.ogg b/Resources/Audio/_DV/Voice/Chitinid/moth_laugh.ogg
new file mode 100644
index 000000000000..d3c2865ab642
Binary files /dev/null and b/Resources/Audio/_DV/Voice/Chitinid/moth_laugh.ogg differ
diff --git a/Resources/Audio/_DV/Voice/Chitinid/moth_scream.ogg b/Resources/Audio/_DV/Voice/Chitinid/moth_scream.ogg
new file mode 100644
index 000000000000..482086fb630d
Binary files /dev/null and b/Resources/Audio/_DV/Voice/Chitinid/moth_scream.ogg differ
diff --git a/Resources/Audio/_DV/Voice/Chitinid/moth_squeak.ogg b/Resources/Audio/_DV/Voice/Chitinid/moth_squeak.ogg
new file mode 100644
index 000000000000..5b77d98e5654
Binary files /dev/null and b/Resources/Audio/_DV/Voice/Chitinid/moth_squeak.ogg differ
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 0beca7051982..590cf158a8a5 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -10692,3 +10692,79 @@ Entries:
id: 6758
time: '2025-01-25T17:17:45.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1640
+- author: sleepyyapril
+ changes:
+ - type: Add
+ message: >-
+ A new ChemMaster experience has been granted to the people of Einstein
+ Engines. Includes a pill buffer!
+ id: 6759
+ time: '2025-01-25T17:29:37.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1650
+- author: VMSolidus
+ changes:
+ - type: Add
+ message: >-
+ Engineering Hardsuits, Maxim Hardsuit, and Cybersun's Elite Tacsuit now
+ all make the wearer immune to atmos fires. Have fun walking directly
+ into the supermatter engine. Play out your heroic engineer fantasy by
+ dragging the supermatter crystal to space in order to save the station.
+ id: 6760
+ time: '2025-01-25T17:31:35.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1445
+- author: RadsammyT
+ changes:
+ - type: Add
+ message: >-
+ Playing Cards. You may get one in the Games Vendor or as an item in your
+ loadout.
+ id: 6761
+ time: '2025-01-25T18:34:15.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1451
+- author: ElusiveCoin
+ changes:
+ - type: Add
+ message: Added a new species, the Chitinid.
+ id: 6762
+ time: '2025-01-25T20:12:52.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1644
+- author: sleepyyapril
+ changes:
+ - type: Tweak
+ message: >-
+ Kill random person objective has been replaced by teaching them a
+ lesson, removing the need to RR a random person.
+ id: 6763
+ time: '2025-01-25T20:38:25.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1654
+- author: VMSolidus
+ changes:
+ - type: Fix
+ message: Fixed melee weapons having the wrong attack speed calculations(again)
+ id: 6764
+ time: '2025-01-25T20:39:09.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1653
+- author: Skubman
+ changes:
+ - type: Add
+ message: >-
+ The Plasmaman species has arrived! They need to breathe plasma to live,
+ and a special jumpsuit to prevent oxygen from igniting them. In
+ exchange, they deal formidable unarmed Heat damage, are never hungry nor
+ thirsty, and are immune to cold and radiation damage. Read more about
+ Plasmamen in their Guidebook entry.
+ - type: Tweak
+ message: >-
+ Internals are no longer toggled off if you take your helmet off but
+ still have a gas mask on and vice versa.
+ - type: Tweak
+ message: >-
+ Paradox Anomalies will now spawn with the original person's Loadout
+ items.
+ - type: Fix
+ message: >-
+ Fixed prisoners not being able to have custom Loadout names and
+ descriptions, and heirlooms if they didn't have a backpack when joining.
+ id: 6765
+ time: '2025-01-25T21:13:19.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1291
diff --git a/Resources/Fonts/LDFComicSans/LDFComicSans-Bold.ttf b/Resources/Fonts/LDFComicSans/LDFComicSans-Bold.ttf
new file mode 100644
index 000000000000..5bd2ad387d6c
Binary files /dev/null and b/Resources/Fonts/LDFComicSans/LDFComicSans-Bold.ttf differ
diff --git a/Resources/Fonts/LDFComicSans/LDFComicSans-HairlineMedium.ttf b/Resources/Fonts/LDFComicSans/LDFComicSans-HairlineMedium.ttf
new file mode 100644
index 000000000000..4da200d1541b
Binary files /dev/null and b/Resources/Fonts/LDFComicSans/LDFComicSans-HairlineMedium.ttf differ
diff --git a/Resources/Fonts/LDFComicSans/LDFComicSans-Light.ttf b/Resources/Fonts/LDFComicSans/LDFComicSans-Light.ttf
new file mode 100644
index 000000000000..d041f189811f
Binary files /dev/null and b/Resources/Fonts/LDFComicSans/LDFComicSans-Light.ttf differ
diff --git a/Resources/Fonts/LDFComicSans/LDFComicSans-Medium.ttf b/Resources/Fonts/LDFComicSans/LDFComicSans-Medium.ttf
new file mode 100644
index 000000000000..38b3abf939e0
Binary files /dev/null and b/Resources/Fonts/LDFComicSans/LDFComicSans-Medium.ttf differ
diff --git a/Resources/Fonts/LDFComicSans/LICENSE.txt b/Resources/Fonts/LDFComicSans/LICENSE.txt
new file mode 100644
index 000000000000..f979389d95ee
--- /dev/null
+++ b/Resources/Fonts/LDFComicSans/LICENSE.txt
@@ -0,0 +1,2 @@
+license: Freeware
+link: https://www.fontspace.com/ldfcomicsans-font-f16951
\ No newline at end of file
diff --git a/Resources/Fonts/Only_You.otf b/Resources/Fonts/Only_You.otf
new file mode 100644
index 000000000000..cd7f3547e0bd
Binary files /dev/null and b/Resources/Fonts/Only_You.otf differ
diff --git a/Resources/Locale/en-US/abilities/chitinid.ftl b/Resources/Locale/en-US/abilities/chitinid.ftl
new file mode 100644
index 000000000000..e2e10c0eb4e5
--- /dev/null
+++ b/Resources/Locale/en-US/abilities/chitinid.ftl
@@ -0,0 +1,2 @@
+chitzite-mask = Take off your {$mask} first.
+chitzite-cough = {CAPITALIZE(THE($name))} starts coughing up a hunk of Chitzite!
diff --git a/Resources/Locale/en-US/alerts/alerts.ftl b/Resources/Locale/en-US/alerts/alerts.ftl
index 7522784713d9..3babbb6c1a5a 100644
--- a/Resources/Locale/en-US/alerts/alerts.ftl
+++ b/Resources/Locale/en-US/alerts/alerts.ftl
@@ -4,6 +4,12 @@ alerts-low-oxygen-desc = There is [color=red]not enough oxygen[/color] in the ai
alerts-low-nitrogen-name = [color=red]Low Nitrogen[/color]
alerts-low-nitrogen-desc = There is [color=red]not enough nitrogen[/color] in the air you are breathing. Put on [color=green]internals[/color].
+alerts-low-plasma-name = [color=red]Low Plasma[/color]
+alerts-low-plasma-desc = There is [color=red]not enough plasma[/color] in the air you are breathing. Put on [color=green]internals[/color].
+
+alerts-high-oxygen-name = [color=red]High Oxygen[/color]
+alerts-high-oxygen-desc = There is [color=red]too much oxygen[/color] in the air you are breathing. Put on [color=green]internals[/color].
+
alerts-high-toxin-name = [color=red]High Toxin Level[/color]
alerts-high-toxin-desc = There are [color=red]too many toxins[/color] in the air you are breathing. Put on [color=green]internals[/color] or get away.
diff --git a/Resources/Locale/en-US/chat/managers/chat-language.ftl b/Resources/Locale/en-US/chat/managers/chat-language.ftl
index 00c41130eaa3..67762441e7de 100644
--- a/Resources/Locale/en-US/chat/managers/chat-language.ftl
+++ b/Resources/Locale/en-US/chat/managers/chat-language.ftl
@@ -12,9 +12,11 @@ chat-language-Elyran-name = Elyran
chat-language-Canilunzt-name = Canilunzt
chat-language-Moffic-name = Moffic
chat-language-RobotTalk-name = Binary
+chat-language-Calcic-name = Calcic
chat-language-ValyrianStandard-name = Valyrian
chat-language-Sign-name = Sign
chat-language-Marish-name = Marish
+chat-language-Chittin-name = Chittin
# Animal Languages
diff --git a/Resources/Locale/en-US/chat/managers/chat-manager.ftl b/Resources/Locale/en-US/chat/managers/chat-manager.ftl
index 7f2242568548..d8356dfa2de1 100644
--- a/Resources/Locale/en-US/chat/managers/chat-manager.ftl
+++ b/Resources/Locale/en-US/chat/managers/chat-manager.ftl
@@ -112,10 +112,12 @@ chat-speech-verb-reptilian-1 = hisses
chat-speech-verb-reptilian-2 = snorts
chat-speech-verb-reptilian-3 = huffs
-chat-speech-verb-name-skeleton = Skeleton
+chat-speech-verb-name-skeleton = Skeleton / Plasmaman
chat-speech-verb-skeleton-1 = rattles
-chat-speech-verb-skeleton-2 = clacks
-chat-speech-verb-skeleton-3 = gnashes
+chat-speech-verb-skeleton-2 = ribs
+chat-speech-verb-skeleton-3 = bones
+chat-speech-verb-skeleton-4 = clacks
+chat-speech-verb-skeleton-5 = cracks
chat-speech-verb-name-vox = Vox
chat-speech-verb-vox-1 = screeches
diff --git a/Resources/Locale/en-US/chemistry/components/chem-master-component.ftl b/Resources/Locale/en-US/chemistry/components/chem-master-component.ftl
index aff0cfac66ce..9631801a448d 100644
--- a/Resources/Locale/en-US/chemistry/components/chem-master-component.ftl
+++ b/Resources/Locale/en-US/chemistry/components/chem-master-component.ftl
@@ -10,22 +10,26 @@ chem-master-bound-user-interface-title = ChemMaster 4000
chem-master-window-input-tab = Input
chem-master-window-output-tab = Output
-chem-master-window-container-label = Container
+chem-master-window-pill-buffer-tab = Pill Buffer
+chem-master-window-container-label = Container
chem-master-window-amount-placeholder = Transfer Amount
chem-master-window-eject-button = Eject
chem-master-window-no-container-loaded-text = No container loaded.
chem-master-window-buffer-text = Buffer
chem-master-window-buffer-label = buffer:
-chem-master-window-buffer-all-amount = All
chem-master-window-buffer-empty-text = Buffer empty.
chem-master-window-buffer-low-text = Not enough solution in buffer
+chem-master-window-pill-buffer-text = Pill Buffer
+chem-master-window-pill-buffer-label = pill buffer:
+chem-master-window-pill-buffer-empty-text = Pill buffer empty.
+chem-master-window-pill-buffer-low-text = Not enough solution in pill buffer
chem-master-window-transfer-button = Transfer
chem-master-window-sort-method-tooltip = Choose your buffer's sort method.
chem-master-window-sort-method-Time-text = Last Added
chem-master-window-sort-method-Alphabetical-text = Alphabetical Order
chem-master-window-sort-method-Amount-text = Quantity
-chem-master-window-transferring-label = Transferring: [color={$color}]{$quantity}[/color]
-chem-master-window-transferring-default-label = Transferring: [color=#ffa500]50[/color]
+chem-master-window-transferring-label = Transferring: [color={$color}]{$quantity}[/color]
+chem-master-window-transferring-default-label = Transferring: [color=#ffffff]50[/color]
chem-master-window-reagent-move-button = Move
chem-master-window-discard-button = Discard
chem-master-window-packaging-text = Packaging
diff --git a/Resources/Locale/en-US/chemistry/components/injector-component.ftl b/Resources/Locale/en-US/chemistry/components/injector-component.ftl
index 24f524081e0d..0b7d485daf52 100644
--- a/Resources/Locale/en-US/chemistry/components/injector-component.ftl
+++ b/Resources/Locale/en-US/chemistry/components/injector-component.ftl
@@ -27,3 +27,4 @@ injector-component-drawing-user = You start drawing the needle.
injector-component-injecting-user = You start injecting the needle.
injector-component-drawing-target = {CAPITALIZE(THE($user))} is trying to use a needle to draw from you!
injector-component-injecting-target = {CAPITALIZE(THE($user))} is trying to inject a needle into you!
+injector-component-deny-chitinid = {CAPITALIZE(THE($target))}'s exoskeleton is too thick for the needle to pierce.
diff --git a/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl b/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl
index 22cc34b2714f..7602189d5cc4 100644
--- a/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl
+++ b/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl
@@ -15,3 +15,9 @@ chat-speech-verb-harpy-1 = chirps
chat-speech-verb-harpy-2 = tweets
chat-speech-verb-harpy-3 = caws
chat-speech-verb-harpy-4 = trills
+
+chat-speech-verb-name-chitinid = Chitinid
+chat-speech-verb-chitinid-1 = clicks
+chat-speech-verb-chitinid-2 = chitters
+chat-speech-verb-chitinid-3 = hisses
+chat-speech-verb-chitinid-4 = buzzes
diff --git a/Resources/Locale/en-US/deltav/markings/chitinid.ftl b/Resources/Locale/en-US/deltav/markings/chitinid.ftl
new file mode 100644
index 000000000000..be5ae5896a71
--- /dev/null
+++ b/Resources/Locale/en-US/deltav/markings/chitinid.ftl
@@ -0,0 +1,164 @@
+marking-ChitinidAntennasDefault-default = Antennae
+marking-ChitinidAntennasDefault = Antennae (Default)
+
+marking-ChitinidAntennasCurly-curly = Antennae
+marking-ChitinidAntennasCurly = Antennae (Curly)
+
+marking-ChitinidAntennasGray-gray = Antennae
+marking-ChitinidAntennasGray = Antennae (Gray)
+
+marking-ChitinidAntennasSlick-slick = Antennae
+marking-ChitinidAntennasSlick = Antennae (Slick)
+
+marking-ChitinidAntennasShort-short = Antennae
+marking-ChitinidAntennasShort = Antennae (short)
+
+marking-ChitinidAntennasLong-long = Antennae
+marking-ChitinidAntennasLong = Antennae (Long)
+
+marking-ChitinidAntennasBee-bee = Antennae
+marking-ChitinidAntennasBee = Antennae (Bee)
+
+marking-ChitinidAntennasFirefly-firefly_primary = Primary
+marking-ChitinidAntennasFirefly-firefly_secondary = Secondary
+marking-ChitinidAntennasFirefly = Antennae (Firefly)
+
+marking-ChitinidAntennasRadar-radar = Antennae
+marking-ChitinidAntennasRadar = Antennae (Radar)
+
+marking-ChitinidAntennasSpeed-speed = Antennae
+marking-ChitinidAntennasSpeed = Antennae (Speed)
+
+
+
+marking-ChitinidWingsDefault-default = Wing
+marking-ChitinidWingsDefault = Tail (Default)
+
+marking-ChitinidWingsSmooth-smooth = Wing
+marking-ChitinidWingsSmooth = Tail (Smooth)
+
+marking-ChitinidWingsHoneypot-honeypot_primary = Primary
+marking-ChitinidWingsHoneypot-honeypot_secondary = Secondary
+marking-ChitinidWingsHoneypot = Tail (Honeypot)
+
+marking-ChitinidWingsStubby-stubby = Wing
+marking-ChitinidWingsStubby = Tail (Stubby)
+
+marking-ChitinidWingsBee-bee_primary = Primary
+marking-ChitinidWingsBee-bee_secondary = Secondary
+marking-ChitinidWingsBee = Tail (Bee)
+
+marking-ChitinidWingsFirefly-firefly_primary = Primary
+marking-ChitinidWingsFirefly-firefly_secondary = Secondary
+marking-ChitinidWingsFirefly = Tail (Firefly)
+
+
+
+marking-ChitinidChestCharred-charred_chest = Chest
+marking-ChitinidChestCharred = Chitinid Chest (Charred)
+
+marking-ChitinidHeadCharred-charred_head = Head
+marking-ChitinidHeadCharred = Chitinid Head (Charred)
+
+marking-ChitinidLLegCharred-charred_l_leg = Left Leg
+marking-ChitinidLLegCharred = Chitinid Left Leg (Charred)
+
+marking-ChitinidRLegCharred-charred_r_leg = Right Leg
+marking-ChitinidRLegCharred = Chitinid Right Leg (Charred)
+
+marking-ChitinidLArmCharred-charred_l_arm = Left Arm
+marking-ChitinidLArmCharred = Chitinid Left Arm (Charred)
+
+marking-ChitinidRArmCharred-charred_r_arm = Right Arm
+marking-ChitinidRArmCharred = Chitinid Right Arm (Charred)
+
+
+
+marking-ChitinidChestPlated-plated_chest = Chest
+marking-ChitinidChestPlated = Chitinid Chest (Plated)
+
+marking-ChitinidLArmPlated-plated_l_arm = Left Arm
+marking-ChitinidLArmPlated = Chitinid Left Arm (Plated)
+
+marking-ChitinidRArmPlated-plated_r_arm = Right Arm
+marking-ChitinidRArmPlated = Chitinid Right Arm (Plated)
+
+
+
+marking-ChitinidChestStripes-stripes_chest = Chest
+marking-ChitinidChestStripes = Chitinid Chest (Stripes)
+
+marking-ChitinidHeadStripes-stripes_head = Head
+marking-ChitinidHeadStripes = Chitinid Head (Stripes)
+
+marking-ChitinidLLegStripes-stripes_l_leg = Left Leg
+marking-ChitinidLLegStripes = Chitinid Left Leg (Stripes)
+
+marking-ChitinidRLegStripes-stripes_r_leg = Right Leg
+marking-ChitinidRLegStripes = Chitinid Right Leg (Stripes)
+
+marking-ChitinidLArmStripes-stripes_l_arm = Left Arm
+marking-ChitinidLArmStripes = Chitinid Left Arm (Stripes)
+
+marking-ChitinidRArmStripes-stripes_r_arm = Right Arm
+marking-ChitinidRArmStripes = Chitinid Right Arm (Stripes)
+
+
+
+marking-ChitinidChestRadiant-radiant_chest = Chest
+marking-ChitinidChestRadiant = Chitinid Chest (Radiant)
+
+marking-ChitinidHeadRadiant-radiant_head = Head
+marking-ChitinidHeadRadiant = Chitinid Head (Radiant)
+
+marking-ChitinidLLegRadiant-radiant_l_leg = Left Leg
+marking-ChitinidLLegRadiant = Chitinid Left Leg (Radiant)
+
+marking-ChitinidRLegRadiant-radiant_r_leg = Right Leg
+marking-ChitinidRLegRadiant = Chitinid Right Leg (Radiant)
+
+marking-ChitinidLArmRadiant-radiant_l_arm = Left Arm
+marking-ChitinidLArmRadiant = Chitinid Left Arm (Radiant)
+
+marking-ChitinidRArmRadiant-radiant_r_arm = Right Arm
+marking-ChitinidRArmRadiant = Chitinid Right Arm (Radiant)
+
+
+
+marking-ChitinidChestToxic-toxic_chest = Chest
+marking-ChitinidChestToxic = Chitinid Chest (Toxic)
+
+marking-ChitinidHeadToxic-toxic_head = Head
+marking-ChitinidHeadToxic = Chitinid Head (Toxic)
+
+marking-ChitinidLLegToxic-toxic_l_leg = Left Leg
+marking-ChitinidLLegToxic = Chitinid Left Leg (Toxic)
+
+marking-ChitinidRLegToxic-toxic_r_leg = Right Leg
+marking-ChitinidRLegToxic = Chitinid Right Leg (Toxic)
+
+marking-ChitinidLArmToxic-toxic_l_arm = Left Arm
+marking-ChitinidLArmToxic = Chitinid Left Arm (Toxic)
+
+marking-ChitinidRArmToxic-toxic_r_arm = Right Arm
+marking-ChitinidRArmToxic = Chitinid Right Arm (Toxic)
+
+
+
+marking-ChitinidChestSpotted-spotted_chest = Chest
+marking-ChitinidChestSpotted = Chitinid Chest (Spotted)
+
+marking-ChitinidHeadSpotted-spotted_head = Head
+marking-ChitinidHeadSpotted = Chitinid Head (Spotted)
+
+marking-ChitinidLLegSpotted-spotted_l_leg = Left Leg
+marking-ChitinidLLegSpotted = Chitinid Left Leg (Spotted)
+
+marking-ChitinidRLegSpotted-spotted_r_leg = Right Leg
+marking-ChitinidRLegSpotted = Chitinid Right Leg (Spotted)
+
+marking-ChitinidLArmSpotted-spotted_l_arm = Left Arm
+marking-ChitinidLArmSpotted = Chitinid Left Arm (Spotted)
+
+marking-ChitinidRArmSpotted-spotted_r_arm = Right Arm
+marking-ChitinidRArmSpotted = Chitinid Right Arm (Spotted)
diff --git a/Resources/Locale/en-US/deltav/objectives/conditions/teach-person.ftl b/Resources/Locale/en-US/deltav/objectives/conditions/teach-person.ftl
new file mode 100644
index 000000000000..0c557dbb0c1a
--- /dev/null
+++ b/Resources/Locale/en-US/deltav/objectives/conditions/teach-person.ftl
@@ -0,0 +1 @@
+objective-condition-teach-person-title = Teach {$targetName}, {CAPITALIZE($job)} a lesson. You need to be within 30 meters of the target, otherwise the syndicate can't take credit for the job.
diff --git a/Resources/Locale/en-US/deltav/species/species.ftl b/Resources/Locale/en-US/deltav/species/species.ftl
index 83437bd651f0..9f3c8a5ffe86 100644
--- a/Resources/Locale/en-US/deltav/species/species.ftl
+++ b/Resources/Locale/en-US/deltav/species/species.ftl
@@ -2,3 +2,4 @@
species-name-vulpkanin = Vulpkanin
species-name-harpy = Harpy
+species-name-chitinid = Chitinid
diff --git a/Resources/Locale/en-US/envirosuit/envirosuit.ftl b/Resources/Locale/en-US/envirosuit/envirosuit.ftl
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/Resources/Locale/en-US/estacao-pirata/cards/cards.ftl b/Resources/Locale/en-US/estacao-pirata/cards/cards.ftl
new file mode 100644
index 000000000000..f721e3ff01f3
--- /dev/null
+++ b/Resources/Locale/en-US/estacao-pirata/cards/cards.ftl
@@ -0,0 +1,89 @@
+card-examined = This is the {$target}.
+cards-verb-shuffle = Shuffle
+card-verb-shuffle-success = Cards shuffled
+cards-verb-draw = Draw card
+cards-verb-flip = Flip cards
+card-verb-join = Join cards
+card-verb-organize-success = Cards flipped face { $facedown ->
+ [true] down
+ *[false] up
+}
+cards-verb-organize-up = Flip cards face up
+cards-verb-organize-down = Flip cards face down
+cards-verb-pickcard = Pick a card
+card-stack-examine = { $count ->
+ [one] There is {$count} card in this stack.
+ *[other] There are {$count} cards in this stack.
+}
+cards-stackquantitychange-added = Card was added (Total cards: {$quantity})
+cards-stackquantitychange-removed = Card was removed (Total cards: {$quantity})
+cards-stackquantitychange-joined = Stack was merged (Total cards: {$quantity})
+cards-stackquantitychange-split = Stack was split (Total cards: {$quantity})
+cards-stackquantitychange-unknown = Stack count changed (Total cards: {$quantity})
+cards-verb-convert-to-deck = Convert to deck
+cards-verb-split = Split in half
+
+card-base-name = card
+card-deck-name = deck of cards
+
+card-sc-2-clubs = 2 of clubs
+card-sc-3-clubs = 3 of clubs
+card-sc-4-clubs = 4 of clubs
+card-sc-5-clubs = 5 of clubs
+card-sc-6-clubs = 6 of clubs
+card-sc-7-clubs = 7 of clubs
+card-sc-8-clubs = 8 of clubs
+card-sc-9-clubs = 9 of clubs
+card-sc-10-clubs = 10 of clubs
+card-sc-ace-clubs = ace of clubs
+card-sc-jack-clubs = jack of clubs
+card-sc-king-clubs = king of clubs
+card-sc-queen-clubs = queen of clubs
+
+card-sc-2-diamonds = 2 of diamonds
+card-sc-3-diamonds = 3 of diamonds
+card-sc-4-diamonds = 4 of diamonds
+card-sc-5-diamonds = 5 of diamonds
+card-sc-6-diamonds = 6 of diamonds
+card-sc-7-diamonds = 7 of diamonds
+card-sc-8-diamonds = 8 of diamonds
+card-sc-9-diamonds = 9 of diamonds
+card-sc-10-diamonds = 10 of diamonds
+card-sc-ace-diamonds = ace of diamonds
+card-sc-jack-diamonds = jack of diamonds
+card-sc-king-diamonds = king of diamonds
+card-sc-queen-diamonds = queen of diamonds
+
+card-sc-2-hearts = 2 of hearts
+card-sc-3-hearts = 3 of hearts
+card-sc-4-hearts = 4 of hearts
+card-sc-5-hearts = 5 of hearts
+card-sc-6-hearts = 6 of hearts
+card-sc-7-hearts = 7 of hearts
+card-sc-8-hearts = 8 of hearts
+card-sc-9-hearts = 9 of hearts
+card-sc-10-hearts = 10 of hearts
+card-sc-ace-hearts = ace of hearts
+card-sc-jack-hearts = jack of hearts
+card-sc-king-hearts = king of hearts
+card-sc-queen-hearts = queen of hearts
+
+card-sc-2-spades = 2 of spades
+card-sc-3-spades = 3 of spades
+card-sc-4-spades = 4 of spades
+card-sc-5-spades = 5 of spades
+card-sc-6-spades = 6 of spades
+card-sc-7-spades = 7 of spades
+card-sc-8-spades = 8 of spades
+card-sc-9-spades = 9 of spades
+card-sc-10-spades = 10 of spades
+card-sc-ace-spades = ace of spades
+card-sc-jack-spades = jack of spades
+card-sc-king-spades = king of spades
+card-sc-queen-spades = queen of spades
+
+card-sc-joker = joker
+
+container-sealed = A holographic security seal is on it. Opening it will have the seal dissipate.
+container-unsealed = The seal attached to it dissipates.
+
diff --git a/Resources/Locale/en-US/estacao-pirata/store/uplink-catalog.ftl b/Resources/Locale/en-US/estacao-pirata/store/uplink-catalog.ftl
new file mode 100644
index 000000000000..c94ffdba1676
--- /dev/null
+++ b/Resources/Locale/en-US/estacao-pirata/store/uplink-catalog.ftl
@@ -0,0 +1,2 @@
+uplink-syndicate-deck-name = Syndicate Deck Box
+uplink-syndicate-deck-desc = A deck box with the standard 53 playing cards with syndicate branding. Please gamble responsibly.
diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl
index 543e9be50d0c..2fb0aef07c29 100644
--- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl
+++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl
@@ -177,6 +177,7 @@ flavor-complex-true-nature = like the true nature of reality
flavor-complex-false-meat = not entirely unlike meat
flavor-complex-paper = like mushy pulp
flavor-complex-compressed-meat = like compressed meat
+flavor-complex-plasma = like plasma
# Drink-specific flavors.
diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl
index fb3b1a1d0465..33a3f9b52b67 100644
--- a/Resources/Locale/en-US/language/languages.ftl
+++ b/Resources/Locale/en-US/language/languages.ftl
@@ -58,6 +58,9 @@ language-Moffic-description = The language of the mothpeople borders on complete
language-RobotTalk-name = RobotTalk
language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators.
+language-Calcic-name = Calcic
+language-Calcic-description = The bone-rattling language of skeletons and Plasmamen. It sounds like a harmonic trousle of bones with a humerus tone, sans any off-tune ribbing.
+
language-Sign-name = Tau-Ceti Basic Sign Language
language-Sign-description = TCB-SL for short, this sign language is prevalent among mute and deaf people.
@@ -70,6 +73,11 @@ language-ValyrianStandard-description =
It is rarely spoken outside of the worlds of its native speakers, and has in modern times been supplanted by the 'Conlangs of the Sol Alliance.
Its speakers are those who wish to uphold the traditions and beliefs of ancient peoples from before the colonial era.
+language-Chittin-name = Chittin
+language-Chittin-description =
+ A language consisting of clicks, buzzes, and some variety of harsh insect sounds.
+ Most of what makes up their speech comes from their antennae, making it a near-impossible language for those without to learn.
+
# Animal Languages
language-Cat-name = Cat
diff --git a/Resources/Locale/en-US/loadouts/generic/hands.ftl b/Resources/Locale/en-US/loadouts/generic/hands.ftl
index 409691f57760..69c7a9e7be57 100644
--- a/Resources/Locale/en-US/loadouts/generic/hands.ftl
+++ b/Resources/Locale/en-US/loadouts/generic/hands.ftl
@@ -1,3 +1,5 @@
loadout-name-LoadoutHandsColorWhite = gloves (colorable)
loadout-name-LoadoutHandsGlovesFingerlessWhite = fingerless gloves (colorable)
loadout-name-LoadoutHandsGlovesEvening = evening gloves (colorable)
+loadout-name-LoadoutHandsGlovesEnviroglovesColor = envirogloves (colorable)
+loadout-name-LoadoutHandsGlovesEnviroglovesEvening = evening envirogloves (colorable)
diff --git a/Resources/Locale/en-US/loadouts/generic/items.ftl b/Resources/Locale/en-US/loadouts/generic/items.ftl
index f10782344760..72d8275022fb 100644
--- a/Resources/Locale/en-US/loadouts/generic/items.ftl
+++ b/Resources/Locale/en-US/loadouts/generic/items.ftl
@@ -1,3 +1,5 @@
+loadout-description-LoadoutItemBlackDeck = A black box containing the standard 53 playing cards. Please gamble responsibly.
+loadout-description-LoadoutItemNTDeck = A Nanotrasen-branded box containing the standard 53 playing cards. Please gamble responsibly.
loadout-description-LoadoutItemCig = Cool guys always have one.
loadout-description-LoadoutItemCigsGreen = A pack a day keeps the doctor well-paid!
loadout-description-LoadoutItemCigsRed = A pack a day keeps the doctor well-paid!
diff --git a/Resources/Locale/en-US/loadouts/generic/species.ftl b/Resources/Locale/en-US/loadouts/generic/species.ftl
new file mode 100644
index 000000000000..943ddbf3c24b
--- /dev/null
+++ b/Resources/Locale/en-US/loadouts/generic/species.ftl
@@ -0,0 +1,5 @@
+loadout-name-LoadoutSpeciesDoubleEmergencyPlasmaTank = extra plasma internals tank
+loadout-description-LoadoutSpeciesDoubleEmergencyPlasmaTank = An extra plasma tank to extend your plasma supply for about another hour.
+
+loadout-name-LoadoutSpeciesDrinkMilkCartonAndSyringe = milk carton and syringe
+loadout-description-LoadoutSpeciesDrinkMilkCartonAndSyringe = A milk carton full of nutritious calcium to heal your bones, and a syringe to inject the milk directly.
diff --git a/Resources/Locale/en-US/loadouts/generic/uniform.ftl b/Resources/Locale/en-US/loadouts/generic/uniform.ftl
index b05a9269357f..1fcf270f298b 100644
--- a/Resources/Locale/en-US/loadouts/generic/uniform.ftl
+++ b/Resources/Locale/en-US/loadouts/generic/uniform.ftl
@@ -43,3 +43,5 @@ loadout-name-LoadoutUniformJumpsuitSailor = sailor suit (colorable)
loadout-name-LoadoutUniformJumpsuitTrackpants = track pants (colorable)
loadout-name-LoadoutUniformJumpsuitTurtleneckGrey = grey turtleneck (colorable)
loadout-name-LoadoutUniformJumpsuitYogaGymBra = yoga gym bra (colorable)
+loadout-name-LoadoutUniformEnvirosuitBlackPinkAlt = black pink envirosuit, alternative
+loadout-name-LoadoutUniformEnvirosuitEnviroslacksMNKAlt = MNK enviroslacks, alternative
diff --git a/Resources/Locale/en-US/loadouts/itemgroups.ftl b/Resources/Locale/en-US/loadouts/itemgroups.ftl
index 6250fbcb891b..8ccbbdbebfb0 100644
--- a/Resources/Locale/en-US/loadouts/itemgroups.ftl
+++ b/Resources/Locale/en-US/loadouts/itemgroups.ftl
@@ -19,6 +19,7 @@ character-item-group-LoadoutSmokes = Smokeables
character-item-group-LoadoutBoxKits = Survival Kits
character-item-group-LoadoutWritables = Writing Tools
character-item-group-LoadoutPets = Pets
+character-item-group-LoadoutCards = Playing Cards
# Job Specific Template
character-item-group-LoadoutJOBBackpacks = JOB Backpacks
diff --git a/Resources/Locale/en-US/metabolism/metabolizer-types.ftl b/Resources/Locale/en-US/metabolism/metabolizer-types.ftl
index d0f57e2bc0b0..97d5c068c417 100644
--- a/Resources/Locale/en-US/metabolism/metabolizer-types.ftl
+++ b/Resources/Locale/en-US/metabolism/metabolizer-types.ftl
@@ -12,3 +12,4 @@ metabolizer-type-arachnid = Arachnid
metabolizer-type-vampiric = Vampiric
metabolizer-type-liquorlifeline = Liquor Lifeline
metabolizer-type-shadowkin = Shadowkin
+metabolizer-type-plasmaman = Plasmaman
diff --git a/Resources/Locale/en-US/mood/mood.ftl b/Resources/Locale/en-US/mood/mood.ftl
index aa348ce62744..213fbb744319 100644
--- a/Resources/Locale/en-US/mood/mood.ftl
+++ b/Resources/Locale/en-US/mood/mood.ftl
@@ -1,4 +1,4 @@
-mood-show-effects-start = [font size=12]Mood:[/font]
+mood-show-effects-start = [font size=12]Mood:[/font]
mood-effect-HungerOverfed = I ate so much, I feel as though I'm about to burst!
mood-effect-HungerOkay = I am feeling full.
@@ -78,3 +78,10 @@ mood-effect-EthanolBenefit =
I feel so relaxed from drinking.
mood-effect-SpaceDrugsBenefit =
Woaaaah, such pretty colors maaaaan. It's like I can hear color and taste sound maaan.
+
+# Plasmaman
+mood-effect-PlasmamanIngestPlasma =
+ My body is rejuvenated by the fresh plasma coursing through my body.
+
+mood-effect-PlasmamanIngestMilk =
+ I can feel the milk's calcium repairing my bones. This is dairy-lightful!
diff --git a/Resources/Locale/en-US/self-extinguisher/self-extinguisher.ftl b/Resources/Locale/en-US/self-extinguisher/self-extinguisher.ftl
new file mode 100644
index 000000000000..04d705ae49f1
--- /dev/null
+++ b/Resources/Locale/en-US/self-extinguisher/self-extinguisher.ftl
@@ -0,0 +1,18 @@
+self-extinguisher-verb = Self-Extinguish
+
+self-extinguisher-examine-cooldown-ready = The self-extinguisher is ready to be used.
+self-extinguisher-examine-cooldown-recharging = The self-extinguisher is recharging for [color=teal]{$cooldown}[/color] seconds.
+self-extinguisher-examine-no-charges = The self-extinguisher is recharging for [color=teal]{$cooldown}[/color] seconds.
+
+self-extinguisher-no-charges = The {$item} has no charges left!
+self-extinguisher-on-cooldown = The {$item}'s extinguisher is recharging!
+self-extinguisher-not-on-fire-self = You are not on fire!
+self-extinguisher-not-on-fire-other = {$target} {CONJUGATE-BE($target)} not on fire!
+self-extinguisher-not-immune-to-fire-self = You are not insulated against fire!
+self-extinguisher-not-immune-to-fire-other = {$target} {CONJUGATE-BE($target)} not insulated against fire!
+
+self-extinguisher-extinguish-self = The {$item} extinguishes you!
+self-extinguisher-extinguish-other = The {$item} extinguishes {$target}!
+
+self-extinguisher-refill = You refill the suit's self-extinguisher, using up the cartridge.
+self-extinguisher-refill-full = The self-extinguisher is full.
diff --git a/Resources/Locale/en-US/species/species.ftl b/Resources/Locale/en-US/species/species.ftl
index bfebc705c56b..6ffc9ac2bd54 100644
--- a/Resources/Locale/en-US/species/species.ftl
+++ b/Resources/Locale/en-US/species/species.ftl
@@ -1,4 +1,4 @@
-## Species Names
+## Species Names
species-name-human = Human
species-name-dwarf = Dwarf
@@ -12,7 +12,8 @@ species-name-skeleton = Skeleton
species-name-vox = Vox
species-name-ipc = IPC
species-name-shadowkin = Shadowkin
+species-name-plasmaman = Plasmaman
## Misc species things
-snail-hurt-by-salt-popup = The salty solution burns like acid!
\ No newline at end of file
+snail-hurt-by-salt-popup = The salty solution burns like acid!
diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl
index 0dcbc1ba663b..523d37c839a0 100644
--- a/Resources/Locale/en-US/store/uplink-catalog.ftl
+++ b/Resources/Locale/en-US/store/uplink-catalog.ftl
@@ -436,6 +436,9 @@ uplink-syndicate-pai-desc = A Syndicate variant of the pAI with access to the Sy
uplink-bribe-name = Lobbying Bundle
uplink-bribe-desc = A heartfelt gift that can help you sway someone's opinion. Real or counterfeit? Yes.
+uplink-bribe-plasmaman-name = Lobbying Bundle
+uplink-bribe-plasmaman-desc = A heartfelt gift that can help you sway someone's opinion. Real or counterfeit? Yes. Includes a tacticool envirosuit for a tacticool plasmaman like you.
+
uplink-hypodart-name = Hypodart
uplink-hypodart-desc = A seemingly unremarkable dart with an enlarged reservoir for chemicals. It can store up to 7u reagents in itself, and instantly inject when it hits the target. Starts empty.
diff --git a/Resources/Locale/en-US/thief/backpack.ftl b/Resources/Locale/en-US/thief/backpack.ftl
index 90cb0031fb89..b779bded0b08 100644
--- a/Resources/Locale/en-US/thief/backpack.ftl
+++ b/Resources/Locale/en-US/thief/backpack.ftl
@@ -54,6 +54,13 @@ thief-backpack-category-communicator-description =
for all station channels, a cybersun pen, a portable
crew monitor, a voice chameleon mask and lots of money for business deals.
+thief-backpack-category-communicator-plasmaman-name = communicator's kit
+thief-backpack-category-communicator-plasmaman-description =
+ A communication enthusiast's kit. Includes a master key
+ for all station channels, a cybersun pen, a portable
+ crew monitor, a voice chameleon mask, a tacticool envirosuit
+ and lots of money for business deals.
+
thief-backpack-category-smuggler-name = smuggler's kit
thief-backpack-category-smuggler-description =
A kit for those who like to have big pockets.
diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl
index 77fc0f5431ed..fb6e9f9bd5ba 100644
--- a/Resources/Locale/en-US/traits/traits.ftl
+++ b/Resources/Locale/en-US/traits/traits.ftl
@@ -95,6 +95,9 @@ trait-description-NormalVisionHarpy =
Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue.
You do not have the usual vision anomaly that your species may possess.
+trait-name-SkeletonAccent = Skeleton Accent
+trait-description-SkeletonAccent = You have a humerus skeleton accent that will rattle others to the bone!
+
trait-name-NormalVision = Trichromat Modification
trait-description-NormalVision =
Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue.
diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml
index 0a57157f1b2e..5014263a81b8 100644
--- a/Resources/Prototypes/Actions/types.yml
+++ b/Resources/Prototypes/Actions/types.yml
@@ -444,3 +444,19 @@
- type: InstantAction
useDelay: 4
+- type: entity
+ id: ActionSelfExtinguish
+ name: Self-Extinguish
+ description: Extinguishes you if you are on fire and insulated against self-ignition.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: InstantAction
+ itemIconStyle: BigItem
+ icon:
+ sprite: Objects/Misc/fire_extinguisher.rsi
+ state: fire_extinguisher_open
+ iconCooldown:
+ sprite: Objects/Misc/fire_extinguisher.rsi
+ state: fire_extinguisher_closed
+ iconDisabled: Interface/Default/blocked.png
+ event: !type:SelfExtinguishEvent
diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml
index c5703820dab3..759fe704238d 100644
--- a/Resources/Prototypes/Alerts/alerts.yml
+++ b/Resources/Prototypes/Alerts/alerts.yml
@@ -55,6 +55,24 @@
name: alerts-low-nitrogen-name
description: alerts-low-nitrogen-desc
+- type: alert
+ id: LowPlasma
+ category: Breathing
+ icons:
+ - sprite: /Textures/Interface/Alerts/breathing.rsi
+ state: not_enough_tox
+ name: alerts-low-plasma-name
+ description: alerts-low-plasma-desc
+
+- type: alert
+ id: HighOxygen
+ category: Breathing
+ icons:
+ - sprite: /Textures/Interface/Alerts/breathing.rsi
+ state: too_much_oxy
+ name: alerts-high-oxygen-name
+ description: alerts-high-oxygen-desc
+
- type: alert
id: Toxins
category: Toxins
diff --git a/Resources/Prototypes/Body/Organs/plasmaman.yml b/Resources/Prototypes/Body/Organs/plasmaman.yml
new file mode 100644
index 000000000000..fa69a490eacd
--- /dev/null
+++ b/Resources/Prototypes/Body/Organs/plasmaman.yml
@@ -0,0 +1,150 @@
+- type: entity
+ id: BasePlasmamanOrgan
+ abstract: true
+ components:
+ - type: Sprite
+ sprite: Mobs/Species/Plasmaman/organs.rsi
+ - type: SolutionContainerManager
+ solutions:
+ organ:
+ reagents:
+ - ReagentId: Nutriment
+ Quantity: 5 # Not very nutritious
+ - ReagentId: Plasma
+ Quantity: 2.5
+ food:
+ maxVol: 5
+ reagents:
+ - ReagentId: Plasma
+ Quantity: 5
+ - type: Extractable
+ grindableSolutionName: food
+ juiceSolution:
+ reagents:
+ - ReagentId: Plasma
+ Quantity: 5
+ - type: FlavorProfile
+ flavors:
+ - plasma
+
+- type: entity
+ id: OrganPlasmamanLungs
+ parent: [ BasePlasmamanOrgan, OrganHumanLungs ]
+ name: plasmaman lungs
+ description: The lungs yearn for the plasma. Only plasma gas can satiate these lungs, and oxygen is lethally toxic.
+ components:
+ - type: Sprite
+ layers:
+ - state: lungs
+ - type: Metabolizer
+ metabolizerTypes: [ Plasmaman ]
+ - type: Lung
+ alert: LowPlasma
+ - type: SolutionContainerManager
+ solutions:
+ organ:
+ reagents:
+ - ReagentId: Nutriment
+ Quantity: 5
+ - ReagentId: Plasma
+ Quantity: 2.5
+ Lung:
+ maxVol: 100.0
+ canReact: false
+ food:
+ maxVol: 5
+ reagents:
+ - ReagentId: Plasma
+ Quantity: 5
+
+- type: entity
+ id: OrganPlasmamanStomach
+ parent: [ BasePlasmamanOrgan, OrganHumanStomach ]
+ name: plasmaman stomach
+ description: Why do plasmamen have stomachs if they don't need to eat?
+ components:
+ - type: Metabolizer
+ metabolizerTypes: [ Plasmaman ]
+ - type: SolutionContainerManager
+ solutions:
+ organ:
+ reagents:
+ - ReagentId: Nutriment
+ Quantity: 8
+ - ReagentId: Plasma
+ Quantity: 4
+ stomach:
+ maxVol: 50
+ food:
+ maxVol: 8
+ reagents:
+ - ReagentId: Plasma
+ Quantity: 8
+ - type: Extractable
+ juiceSolution:
+ reagents:
+ - ReagentId: Plasma
+ Quantity: 8
+
+- type: entity
+ id: OrganPlasmamanEyes
+ parent: [ BasePlasmamanOrgan, OrganHumanEyes ]
+ name: plasmaman eyes
+ components:
+ - type: Sprite
+ layers:
+ - state: eyes
+
+- type: entity
+ id: OrganPlasmamanLiver
+ parent: [ BasePlasmamanOrgan, OrganHumanLiver ]
+ name: plasmaman liver
+ components:
+ - type: Metabolizer
+ metabolizerTypes: [ Plasmaman ]
+
+- type: entity
+ id: OrganPlasmamanTongue
+ parent: [ BasePlasmamanOrgan, OrganHumanTongue ]
+ name: plasmaman tongue
+
+- type: entity
+ id: OrganPlasmamanKidneys
+ parent: [ BasePlasmamanOrgan, OrganHumanKidneys ]
+ name: plasmaman kidneys
+ components:
+ - type: Sprite
+ layers:
+ - state: kidneys
+ - type: Metabolizer
+ metabolizerTypes: [ Plasmaman ]
+
+- type: entity
+ id: OrganPlasmamanHeart
+ parent: [ BasePlasmamanOrgan, OrganHumanHeart ]
+ name: plasmaman heart
+ description: It pulses with plasma even outside the body.
+ components:
+ - type: Metabolizer
+ metabolizerTypes: [ Plasmaman ]
+
+- type: entity
+ id: OrganPlasmamanBrain
+ parent: [ BasePlasmamanOrgan, OrganHumanBrain ]
+ name: plasmaman brain
+ components:
+ - type: SolutionContainerManager
+ solutions:
+ organ:
+ reagents:
+ - ReagentId: Nutriment
+ Quantity: 5
+ - ReagentId: Plasma
+ Quantity: 2.5
+ food:
+ maxVol: 10
+ reagents:
+ - ReagentId: GreyMatter
+ Quantity: 5
+ - ReagentId: Plasma
+ Quantity: 5
diff --git a/Resources/Prototypes/Body/Parts/plasmaman.yml b/Resources/Prototypes/Body/Parts/plasmaman.yml
new file mode 100644
index 000000000000..2fdec5308571
--- /dev/null
+++ b/Resources/Prototypes/Body/Parts/plasmaman.yml
@@ -0,0 +1,133 @@
+# TODO: Add descriptions (many)
+# TODO BODY: Part damage
+- type: entity
+ id: PartPlasmaman
+ parent: [BaseItem, BasePart]
+ name: plasmaman body part
+ abstract: true
+ components:
+ - type: Sprite
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ - type: Butcherable
+ butcheringType: Knife
+ butcherDelay: 4.0
+ spawned:
+ - id: SheetPlasma1
+ amount: 1
+ - type: IgniteFromGasPart
+ gas: Oxygen
+
+- type: entity
+ id: TorsoPlasmaman
+ name: plasmaman torso
+ parent: [PartPlasmaman, BaseTorso]
+ components:
+ - type: Sprite
+ state: torso_m
+ - type: Butcherable
+ butcherDelay: 6.0
+ spawned:
+ - id: SheetPlasma1
+ amount: 3
+ - type: IgniteFromGasPart
+ fireStacks: 0.06
+
+- type: entity
+ id: HeadPlasmaman
+ name: plasmaman head
+ parent: [PartPlasmaman, BaseHead]
+ components:
+ - type: Sprite
+ state: head_m
+ - type: Butcherable
+ butcherDelay: 5.0
+ - type: IgniteFromGasPart
+ fireStacks: 0.02
+
+- type: entity
+ id: LeftArmPlasmaman
+ name: left plasmaman arm
+ parent: [PartPlasmaman, BaseLeftArm]
+ components:
+ - type: Sprite
+ state: l_arm
+ - type: IgniteFromGasPart
+ fireStacks: 0.02
+
+- type: entity
+ id: RightArmPlasmaman
+ name: right plasmaman arm
+ parent: [PartPlasmaman, BaseRightArm]
+ components:
+ - type: Sprite
+ state: r_arm
+ - type: IgniteFromGasPart
+ fireStacks: 0.02
+
+- type: entity
+ id: LeftHandPlasmaman
+ name: left plasmaman hand
+ parent: [PartPlasmaman, BaseLeftHand]
+ components:
+ - type: Sprite
+ state: l_hand
+ - type: Butcherable
+ butcherDelay: 3.0
+ - type: IgniteFromGasPart
+ fireStacks: 0.01
+
+- type: entity
+ id: RightHandPlasmaman
+ name: right plasmaman hand
+ parent: [PartPlasmaman, BaseRightHand]
+ components:
+ - type: Sprite
+ state: r_hand
+ - type: Butcherable
+ butcherDelay: 3.0
+ - type: IgniteFromGasPart
+ fireStacks: 0.01
+
+- type: entity
+ id: LeftLegPlasmaman
+ name: left plasmaman leg
+ parent: [PartPlasmaman, BaseLeftLeg]
+ components:
+ - type: Sprite
+ state: l_leg
+ - type: IgniteFromGasPart
+ fireStacks: 0.02
+
+- type: entity
+ id: RightLegPlasmaman
+ name: right plasmaman leg
+ parent: [PartPlasmaman, BaseRightLeg]
+ components:
+ - type: Sprite
+ state: r_leg
+ - type: IgniteFromGasPart
+ fireStacks: 0.02
+
+- type: entity
+ id: LeftFootPlasmaman
+ name: left plasmaman foot
+ parent: [PartPlasmaman, BaseLeftFoot]
+ components:
+ - type: Sprite
+ state: l_foot
+ - type: Butcherable
+ butcherDelay: 3.0
+ - type: IgniteFromGasPart
+ fireStacks: 0.01
+
+- type: entity
+ id: RightFootPlasmaman
+ name: right plasmaman foot
+ parent: [PartPlasmaman, BaseRightFoot]
+ components:
+ - type: Sprite
+ state: r_foot
+ - type: Butcherable
+ butcherDelay: 3.0
+ - type: IgniteFromGasPart
+ fireStacks: 0.01
diff --git a/Resources/Prototypes/Body/Prototypes/plasmaman.yml b/Resources/Prototypes/Body/Prototypes/plasmaman.yml
new file mode 100644
index 000000000000..a41ad0802a97
--- /dev/null
+++ b/Resources/Prototypes/Body/Prototypes/plasmaman.yml
@@ -0,0 +1,50 @@
+- type: body
+ id: Plasmaman
+ name: "plasmaman"
+ root: torso
+ slots:
+ head:
+ part: HeadPlasmaman
+ connections:
+ - torso
+ organs:
+ brain: OrganPlasmamanBrain
+ eyes: OrganPlasmamanEyes
+ torso:
+ part: TorsoPlasmaman
+ connections:
+ - right arm
+ - left arm
+ - right leg
+ - left leg
+ - head
+ organs:
+ heart: OrganPlasmamanHeart
+ lungs: OrganPlasmamanLungs
+ stomach: OrganPlasmamanStomach
+ liver: OrganPlasmamanLiver
+ kidneys: OrganPlasmamanKidneys
+ right arm:
+ part: RightArmPlasmaman
+ connections:
+ - right hand
+ left arm:
+ part: LeftArmPlasmaman
+ connections:
+ - left hand
+ right hand:
+ part: RightHandPlasmaman
+ left hand:
+ part: LeftHandPlasmaman
+ right leg:
+ part: RightLegPlasmaman
+ connections:
+ - right foot
+ left leg:
+ part: LeftLegPlasmaman
+ connections:
+ - left foot
+ right foot:
+ part: RightFootPlasmaman
+ left foot:
+ part: LeftFootPlasmaman
diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml
index c04e49f413cc..55645819c259 100644
--- a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml
+++ b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml
@@ -68,6 +68,26 @@
category: cargoproduct-category-name-emergency
group: market
+- type: cargoProduct
+ id: EmergencyPlasmaInternals
+ icon:
+ sprite: Objects/Tanks/plasmaman.rsi
+ state: icon
+ product: CratePlasmaInternals
+ cost: 750 # Plasma is expensive!
+ category: cargoproduct-category-name-emergency
+ group: market
+
+- type: cargoProduct
+ id: EmergencyPlasmamanEnvirosuit
+ icon:
+ sprite: Clothing/Uniforms/Envirosuits/plain.rsi
+ state: icon
+ product: CratePlasmamanEnvirosuit
+ cost: 600
+ category: cargoproduct-category-name-emergency
+ group: market
+
- type: cargoProduct
id: EmergencyBiosuit
icon:
diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml
index d267ddb2ed21..73801981830f 100644
--- a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml
+++ b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml
@@ -265,6 +265,7 @@
- id: ClothingHandsGlovesColorYellowBudget
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
+ - id: DoubleEmergencyPlasmaTankFilled
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
@@ -279,6 +280,7 @@
- id: ClothingHandsGlovesCombat
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
+ - id: DoubleEmergencyPlasmaTankFilled
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
@@ -293,6 +295,7 @@
- id: ClothingHandsGlovesCombat
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
+ - id: DoubleEmergencyPlasmaTankFilled
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
@@ -306,6 +309,7 @@
- id: ClothingHandsGlovesCombat
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
+ - id: DoubleEmergencyPlasmaTankFilled
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml b/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml
index 9532fbf74e68..1d9d92da0155 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml
@@ -87,6 +87,40 @@
- id: NitrogenTankFilled
amount: 4
+- type: entity
+ id: CratePlasmaInternals
+ parent: CrateInternals
+ name: internals crate (plasma)
+ description: Contains four breath masks and four plasma internals tanks. Intended for Plasmamen.
+ components:
+ - type: StorageFill
+ contents:
+ - id: ClothingMaskGas
+ amount: 2
+ - id: ClothingMaskBreath
+ amount: 2
+ - id: DoubleEmergencyPlasmaTankFilled
+ amount: 4
+
+- type: entity
+ id: CratePlasmamanEnvirosuit
+ parent: CrateInternals
+ name: plasma envirosuit crate
+ description: Contains two full sets of envirosuits, two breath masks, and two plasma internals tanks. Intended for Plasmamen.
+ components:
+ - type: StorageFill
+ contents:
+ - id: ClothingUniformEnvirosuit
+ amount: 2
+ - id: ClothingHeadEnvirohelmEmpty
+ amount: 2
+ - id: ClothingHandsGlovesEnvirogloves
+ amount: 2
+ - id: ClothingMaskBreath
+ amount: 2
+ - id: DoubleEmergencyPlasmaTankFilled
+ amount: 2
+
- type: entity
id: CrateEmergencyRadiation
parent: CrateRadiation
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml b/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml
index ba97af392507..82f5bd6aa693 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml
@@ -21,6 +21,7 @@
- id: ClothingHandsGlovesCombat
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
+ - id: DoubleEmergencyPlasmaTankFilled
- type: entity
id: CrateSyndicateSuperSurplusBundle
diff --git a/Resources/Prototypes/Catalog/Fills/Items/briefcases.yml b/Resources/Prototypes/Catalog/Fills/Items/briefcases.yml
index 58a49aa6e957..5b96ba96d860 100644
--- a/Resources/Prototypes/Catalog/Fills/Items/briefcases.yml
+++ b/Resources/Prototypes/Catalog/Fills/Items/briefcases.yml
@@ -47,6 +47,33 @@
- id: ClothingMaskNeckGaiter
- id: SyndieHandyFlag
+- type: entity
+ id: BriefcaseSyndieLobbyingBundlePlasmamanFilled
+ parent: BriefcaseSyndie
+ suffix: Syndicate, Spesos, Plasmaman
+ components:
+ - type: StorageFill
+ contents:
+ - id: ClothingEyesGlassesSunglasses
+ - id: SpaceCash30000
+ amount: 1
+ - id: EncryptionKeySyndie
+ - id: RubberStampTrader
+ - id: PhoneInstrumentSyndicate
+ - id: ClothingUniformEnvirosuitTacticool
+ - id: ClothingHeadEnvirohelmTacticool
+ - id: ClothingOuterCoatJensenFilled
+ - id: ClothingHandsGlovesCombat
+
+- type: entity # No more space in briefcase due to envirohelm so put the syndicate flag in the jensen coat
+ id: ClothingOuterCoatJensenFilled
+ parent: ClothingOuterCoatJensen
+ suffix: Syndicate Flag Inside
+ components:
+ - type: StorageFill
+ contents:
+ - id: SyndieHandyFlag
+
- type: entity
id: BriefcaseThiefBribingBundleFilled
parent: BriefcaseSyndie
@@ -62,3 +89,19 @@
- id: ClothingHandsGlovesCombat
- id: ClothingMaskNeckGaiter
- id: ToyFigurineThief
+
+- type: entity
+ id: BriefcaseThiefBribingBundlePlasmamanFilled
+ parent: BriefcaseSyndie
+ suffix: Thief, Spesos, Plasmaman
+ components:
+ - type: StorageFill
+ contents:
+ - id: ClothingEyesGlassesSunglasses
+ - id: SpaceCash20000
+ amount: 1
+ - id: ClothingUniformEnvirosuitTacticool
+ - id: ClothingHeadEnvirohelmTacticool
+ - id: ClothingOuterCoatJensen
+ - id: ClothingHandsGlovesCombat
+ - id: ToyFigurineThief
diff --git a/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml b/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml
index 2cf1354c143c..379de235fca6 100644
--- a/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml
+++ b/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml
@@ -63,6 +63,22 @@
- 0.270782035 # nitrogen
temperature: 293.15
+- type: entity
+ id: EmergencyPlasmaTankFilled
+ parent: EmergencyPlasmaTank
+ suffix: Filled
+ components:
+ - type: GasTank
+ outputPressure: 5.325
+ air:
+ # 16 minutes with Plasmaman lungs
+ volume: 0.66
+ moles:
+ - 0 # oxygen
+ - 0 # nitrogen
+ - 0 # CO2
+ - 0.270782035 # nitrogen
+ temperature: 293.15
- type: entity
id: ExtendedEmergencyOxygenTankFilled
@@ -93,6 +109,22 @@
- 0.615413715 # nitrogen
temperature: 293.15
+- type: entity
+ id: ExtendedEmergencyPlasmaTankFilled
+ parent: ExtendedEmergencyPlasmaTank
+ suffix: Filled
+ components:
+ - type: GasTank
+ outputPressure: 5.325
+ air:
+ # 36 minutes with Plasmaman lungs
+ volume: 1.5
+ moles:
+ - 0 # oxygen
+ - 0 # nitrogen
+ - 0 # CO2
+ - 0.615413715 # plasma
+ temperature: 293.15
- type: entity
id: DoubleEmergencyOxygenTankFilled
@@ -123,6 +155,23 @@
- 1.025689525 # nitrogen
temperature: 293.15
+- type: entity
+ id: DoubleEmergencyPlasmaTankFilled
+ parent: DoubleEmergencyPlasmaTank
+ suffix: Filled
+ components:
+ - type: GasTank
+ outputPressure: 5.325
+ air:
+ # 60 minutes with Plasmaman lungs
+ volume: 1.5
+ moles:
+ - 0 # oxygen
+ - 0 # nitrogen
+ - 0 # CO2
+ - 1.025689525 # plasma
+ temperature: 293.15
+
- type: entity
id: EmergencyFunnyOxygenTankFilled
parent: EmergencyFunnyOxygenTank
@@ -142,7 +191,7 @@
- 0 # water vapor
- 0 # ammonia
- 0.014251686 # 5% N2O
- # 0.285033721 total
+ # 0.285033721 total
temperature: 293.15
- type: entity
@@ -211,7 +260,7 @@
suffix: Filled
components:
- type: GasTank
- outputPressure: 101.3
+ outputPressure: 21.3
air:
# 6 minutes of agony
volume: 5
@@ -221,3 +270,13 @@
- 0 # CO2
- 2.051379050 # plasma
temperature: 293.15
+
+- type: entity
+ id: PlasmaTankFilledInternals
+ parent: PlasmaTankFilled
+ name: plasma tank
+ suffix: Filled, Plasmaman Internals
+ components:
+ - type: GasTank
+ # 120 minutes with Plasmaman lungs
+ outputPressure: 5.325
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
index f022b4b9a59a..239fa324b5a9 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
@@ -16,3 +16,4 @@
PaperCNCSheet: 6
MysteryFigureBox: 2
BooksBag: 3
+ CardBoxBlack: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml
index fce18024a7ef..7dbcce131b0e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml
@@ -3,6 +3,7 @@
startingInventory:
OxygenTankFilled: 10
NitrogenTankFilled: 10
+ PlasmaTankFilled: 10
- type: vendingMachineInventory
id: TankDispenserEngineeringInventory
diff --git a/Resources/Prototypes/Catalog/thief_toolbox_sets.yml b/Resources/Prototypes/Catalog/thief_toolbox_sets.yml
index e70e93732f3b..b0b7810e19be 100644
--- a/Resources/Prototypes/Catalog/thief_toolbox_sets.yml
+++ b/Resources/Prototypes/Catalog/thief_toolbox_sets.yml
@@ -2,7 +2,7 @@
id: ChameleonSet
name: thief-backpack-category-chameleon-name
description: thief-backpack-category-chameleon-description
- sprite:
+ sprite:
sprite: /Textures/Clothing/OuterClothing/Misc/black_hoodie.rsi
state: icon
content:
@@ -20,7 +20,7 @@
id: ToolsSet
name: thief-backpack-category-tools-name
description: thief-backpack-category-tools-description
- sprite:
+ sprite:
sprite: Objects/Tools/jaws_of_life.rsi
state: jaws_pry
content:
@@ -67,7 +67,7 @@
id: SleeperSet
name: thief-backpack-category-sleeper-name
description: thief-backpack-category-sleeper-description
- sprite:
+ sprite:
sprite: Objects/Tanks/anesthetic.rsi
state: icon
content:
@@ -84,9 +84,14 @@
id: CommunicatorSet
name: thief-backpack-category-communicator-name
description: thief-backpack-category-communicator-description
- sprite:
+ sprite:
sprite: Objects/Tools/spy_device.rsi
state: icon
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
content:
- EncryptionKeyStationMaster
- CyberPen
@@ -94,12 +99,30 @@
- BriefcaseThiefBribingBundleFilled
- ClothingMaskGasVoiceChameleon
#- todo Chameleon Stamp
-
+
+- type: thiefBackpackSet
+ id: CommunicatorSetPlasmaman
+ name: thief-backpack-category-communicator-plasmaman-name
+ description: thief-backpack-category-communicator-plasmaman-description
+ sprite:
+ sprite: Objects/Tools/spy_device.rsi
+ state: icon
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ content:
+ - EncryptionKeyStationMaster
+ - CyberPen
+ - SpyCrewMonitor
+ - BriefcaseThiefBribingBundlePlasmamanFilled
+ - ClothingMaskGasVoiceChameleon
+
- type: thiefBackpackSet
id: SmugglerSet
name: thief-backpack-category-smuggler-name
description: thief-backpack-category-smuggler-description
- sprite:
+ sprite:
sprite: Clothing/Neck/Cloaks/void.rsi
state: icon
content:
diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml
index ca196b3ec05f..64e3eba5aa6d 100644
--- a/Resources/Prototypes/Catalog/uplink_catalog.yml
+++ b/Resources/Prototypes/Catalog/uplink_catalog.yml
@@ -815,6 +815,27 @@
Telecrystal: 4
categories:
- UplinkDeception
+ conditions:
+ - !type:BuyerSpeciesCondition
+ blacklist:
+ - Plasmaman
+
+- type: listing
+ id: UplinkBribePlasmaman
+ name: uplink-bribe-plasmaman-name
+ description: uplink-bribe-plasmaman-desc
+ productEntity: BriefcaseSyndieLobbyingBundlePlasmamanFilled
+ discountCategory: usualDiscounts
+ discountDownTo:
+ Telecrystal: 2
+ cost:
+ Telecrystal: 4
+ categories:
+ - UplinkDeception
+ conditions:
+ - !type:BuyerSpeciesCondition
+ whitelist:
+ - Plasmaman
# - type: listing
# id: UplinkGigacancerScanner
@@ -833,8 +854,6 @@
icon: { sprite: /Textures/Objects/Tools/Decoys/operative_decoy.rsi, state: folded }
productEntity: ClothingBackpackDuffelSyndicateDecoyKitFilled
discountCategory: usualDiscounts
- discountDownTo:
- Telecrystal: 3
cost:
Telecrystal: 1
categories:
@@ -1612,8 +1631,6 @@
description: uplink-syndicate-stamp-desc
productEntity: RubberStampSyndicate
discountCategory: rareDiscounts
- discountDownTo:
- Telecrystal: 1
cost:
Telecrystal: 1
categories:
diff --git a/Resources/Prototypes/CharacterItemGroups/Generic/gloveGroup.yml b/Resources/Prototypes/CharacterItemGroups/Generic/gloveGroup.yml
index 134d4605402f..802590accd23 100644
--- a/Resources/Prototypes/CharacterItemGroups/Generic/gloveGroup.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Generic/gloveGroup.yml
@@ -15,3 +15,7 @@
id: LoadoutHandsGlovesFingerlessWhite
- type: loadout
id: LoadoutHandsGlovesEvening
+ - type: loadout
+ id: LoadoutHandsGlovesEnviroglovesColor
+ - type: loadout
+ id: LoadoutHandsGlovesEnviroglovesEvening
diff --git a/Resources/Prototypes/CharacterItemGroups/Generic/itemGroups.yml b/Resources/Prototypes/CharacterItemGroups/Generic/itemGroups.yml
index 16d145a041ca..caf1880711d5 100644
--- a/Resources/Prototypes/CharacterItemGroups/Generic/itemGroups.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Generic/itemGroups.yml
@@ -305,3 +305,67 @@
id: LoadoutUniformJumpsuitFlannelKhakis
- type: loadout
id: LoadoutUniformJumpsuitFlannelBlackKhakis
+ - type: loadout
+ id: LoadoutUniformEnvirosuit
+ - type: loadout
+ id: LoadoutUniformEnvirosuitBlackPink
+ - type: loadout
+ id: LoadoutUniformEnvirosuitBlackPinkAlt
+ - type: loadout
+ id: LoadoutUniformEnvirosuitMartialGi
+ - type: loadout
+ id: LoadoutUniformEnvirosuitSafari
+ - type: loadout
+ id: LoadoutUniformEnvirosuitTrans
+ - type: loadout
+ id: LoadoutUniformEnvirosuitAncientVoid
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorWhite
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorGrey
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorBlack
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorRed
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorGreen
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorDarkGreen
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorBlue
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorDarkBlue
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorTeal
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorMaroon
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorPink
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorYellow
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorPurple
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorOrange
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorLightBrown
+ - type: loadout
+ id: LoadoutUniformEnvirosuitColorBrown
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacks
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksNegative
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorRed
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorOrange
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorGreen
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorBlue
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorBrown
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksMNK
+ - type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksMNKAlt
diff --git a/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml b/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml
index cc1e82ceb698..b08afa92523c 100644
--- a/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml
@@ -134,3 +134,12 @@
id: LoadoutItemPetMothroach
- type: loadout
id: LoadoutItemPetCockroach
+
+- type: characterItemGroup
+ id: LoadoutCards
+ maxItems: 1
+ items:
+ - type: loadout
+ id: LoadoutItemBlackDeck
+ - type: loadout
+ id: LoadoutItemNTDeck
diff --git a/Resources/Prototypes/CharacterItemGroups/Jobs/Logistics/courier.yml b/Resources/Prototypes/CharacterItemGroups/Jobs/Logistics/courier.yml
index 3bd4172dd22b..aca3f2e5fc06 100644
--- a/Resources/Prototypes/CharacterItemGroups/Jobs/Logistics/courier.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Jobs/Logistics/courier.yml
@@ -75,3 +75,5 @@
id: LoadoutCourierUniformMailSuit
- type: loadout
id: LoadoutCourierUniformMailSkirt
+ - type: loadout
+ id: LoadoutCourierUniformEnvirosuitMailCarrier
diff --git a/Resources/Prototypes/CharacterItemGroups/Jobs/Security/uncategorized.yml b/Resources/Prototypes/CharacterItemGroups/Jobs/Security/uncategorized.yml
index 398d67f032dc..ef718f2093f8 100644
--- a/Resources/Prototypes/CharacterItemGroups/Jobs/Security/uncategorized.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Jobs/Security/uncategorized.yml
@@ -226,3 +226,7 @@
id: LoadoutUniformJumpsuitSecFormal
- type: loadout
id: LoadoutUniformJumpsuitSecSummer
+ - type: loadout
+ id: LoadoutSecurityUniformEnvirosuitBlue
+ - type: loadout
+ id: LoadoutSecurityUniformEnvirosuitGrey
diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml
index 80f69893c6ea..381261358497 100644
--- a/Resources/Prototypes/Chemistry/metabolizer_types.yml
+++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml
@@ -56,3 +56,7 @@
- type: metabolizerType
id: Shadowkin
name: metabolizer-type-shadowkin
+
+- type: metabolizerType
+ id: Plasmaman
+ name: metabolizer-type-plasmaman
diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml
index 3cc2bb4fd7dc..86a6fab9c558 100644
--- a/Resources/Prototypes/Damage/modifier_sets.yml
+++ b/Resources/Prototypes/Damage/modifier_sets.yml
@@ -372,6 +372,18 @@
Shock: 1.25
Radiation: 1.3
+- type: damageModifierSet
+ id: Plasmaman
+ coefficients:
+ Blunt: 1.5
+ Slash: 0.85
+ Piercing: 0.75
+ Cold: 0
+ Heat: 1.5
+ Poison: 0.8
+ Radiation: 0
+ Bloodloss: 0.0 # Immune to weapons that directly deal bloodloss damage
+
- type: damageModifierSet
id: DermalArmor
coefficients:
diff --git a/Resources/Prototypes/Datasets/Names/plasmaman.yml b/Resources/Prototypes/Datasets/Names/plasmaman.yml
new file mode 100644
index 000000000000..3e12b9e379fd
--- /dev/null
+++ b/Resources/Prototypes/Datasets/Names/plasmaman.yml
@@ -0,0 +1,326 @@
+- type: dataset
+ id: names_plasmaman
+ values:
+ # Periodic table elements
+ - Actinium
+ - Aluminium
+ - Americium
+ - Antimony
+ - Argon
+ - Arsenic
+ - Astatine
+ - Barium
+ - Berkelium
+ - Beryllium
+ - Bismuth
+ - Bohrium
+ - Boron
+ - Bromine
+ - Cadmium
+ - Caesium
+ - Calcium
+ - Californium
+ - Carbon
+ - Cerium
+ - Chlorine
+ - Chromium
+ - Cobalt
+ - Copernicium
+ - Copper
+ - Curium
+ - Darmstadtium
+ - Dubnium
+ - Dysprosium
+ - Einsteinium
+ - Erbium
+ - Europium
+ - Fermium
+ - Flerovium
+ - Fluorine
+ - Francium
+ - Gadolinium
+ - Gallium
+ - Germanium
+ - Gold
+ - Hafnium
+ - Hassium
+ - Helium
+ - Holmium
+ - Hydrogen
+ - Indium
+ - Iodine
+ - Iridium
+ - Iron
+ - Krypton
+ - Lanthanum
+ - Lawrencium
+ - Lead
+ - Lithium
+ - Livermorium
+ - Lutetium
+ - Magnesium
+ - Manganese
+ - Meitnerium
+ - Mendelevium
+ - Mercury
+ - Molybdenum
+ - Moscovium
+ - Neodymium
+ - Neon
+ - Neptunium
+ - Nickel
+ - Nihonium
+ - Niobium
+ - Nitrogen
+ - Nobelium
+ - Oganesson
+ - Osmium
+ - Oxygen
+ - Palladium
+ - Phosphorus
+ - Platinum
+ - Plutonium
+ - Polonium
+ - Potassium
+ - Praseodymium
+ - Promethium
+ - Protactinium
+ - Radium
+ - Radon
+ - Rhenium
+ - Rhodium
+ - Roentgenium
+ - Rubidium
+ - Ruthenium
+ - Rutherfordium
+ - Samarium
+ - Scandium
+ - Seaborgium
+ - Selenium
+ - Silicon
+ - Silver
+ - Sodium
+ - Strontium
+ - Sulfur
+ - Tantalum
+ - Technetium
+ - Tellurium
+ - Tennessine
+ - Terbium
+ - Thallium
+ - Thorium
+ - Thulium
+ - Tin
+ - Titanium
+ - Tungsten
+ - Uranium
+ - Vanadium
+ - Xenon
+ - Ytterbium
+ - Yttrium
+ - Zinc
+ - Zirconium
+ # Periodic table groups
+ - Metalloid
+ - Alkali
+ - Alkaline
+ - Triel
+ - Tetrel
+ - Chalcogen
+ - Pnictogen
+ - Halogen
+ - Noble
+ # Periodic table series
+ - Lanthanide
+ - Actinide
+ # Polyatomic cations
+ - Ammonium
+ - Hydronium
+ - Nitronium
+ - Pyrylium
+ # Anions
+ - Hydride
+ - Oxide
+ - Fluoride
+ - Sulfide
+ - Selenide
+ - Telluride
+ - Chloride
+ - Nitride
+ - Phospide
+ - Arsenide
+ - Bromide
+ - Iodide
+ - Azide
+ - Bisulfide
+ - Hydroxide
+ - Acetylide
+ - Ethoxide
+ - Cyanide
+ - Amide
+ - Phenoxide
+ - Peroxide
+ - Superoxide
+ - Acetylide
+ # Oxoanions
+ - Sulfate
+ - Sulfite
+ - Phosphate
+ - Phospite
+ - Arsenate
+ - Arsenite
+ - Nitrate
+ - Nitrite
+ - Thiosulfate
+ - Perchlorate
+ - Iodate
+ - Chlorate
+ - Bromate
+ - Perbromate
+ - Chlorite
+ - Hypochlorite
+ - Hypobromite
+ - Carbonate
+ - Chromate
+ - Bicarbonate
+ - Dichromate
+ - Persulfate
+ - Pyrosulfite
+ - Pyrosulfate
+ - Pyrophosphite
+ - Pyrophosphate
+ - Pyroarsenate
+ - Dicarbonate
+ - Pyrocarbonate
+ - Pyroselenite
+ - Ethanolate
+ - Benzoate
+ - Citrate
+ - Manganate
+ - Zincate
+ - Aluminate
+ - Tungstate
+ - Orthosilicate
+ - Metasilicate
+ - Silicate
+ - Cyanate
+ - Thiocyanate
+ - Permanganate
+ - Sulfonate
+ - Isocyanate
+ - Carbamate
+ # Anions from organic acids
+ - Acetate
+ - Formate
+ - Oxalate
+ - Propionate
+ - Butyrate
+ - Malate
+ # Isotopes
+ - Protium
+ - Deuterium
+ - Tritium
+ - Uranium-235
+ - Uranium-238
+ - Radon-222
+ - Thorium-232
+ # Compounds
+ - Ammonia
+ - Methane
+ - Glucose
+ - Ethanol
+ - Formaldehyde
+ - Acetylene
+ - Toluene
+ # SS14 chemicals
+ - Bananium
+ - Fresium
+ - Carpetium
+ - Razorium
+ - Artifexium
+ - Barozine
+ - Frezon
+ - Phlogiston
+ - Licoxide
+ - Lipolicide
+ - Tazinide
+ - Lotophagoi
+ - Vestine
+ - Thermite
+ - Saxoite
+ - Sigynate
+ - Nocturine
+ - Impedrezene
+ - Ephedrine
+ # Skeleton names from skeleton_first.yml - double weight
+ - Sternum
+ - Sternum
+ - Ribs
+ - Ribs
+ - Vertebrae
+ - Vertebrae
+ - Sacrum
+ - Sacrum
+ - Mandible
+ - Mandible
+ - Clavicle
+ - Clavicle
+ - Scapula
+ - Scapula
+ - Humerus
+ - Humerus
+ - Radius
+ - Radius
+ - Ulna
+ - Ulna
+ - Carpals
+ - Carpals
+ - Phalanges
+ - Phalanges
+ - Pelvis
+ - Pelvis
+ - Femur
+ - Femur
+ - Tibia
+ - Tibia
+ - Fibula
+ - Fibula
+ - Marrow
+ - Marrow
+ - Tarsals
+ - Tarsals
+ - Patella
+ - Patella
+ - Tailbone
+ - Tailbone
+ - Rib
+ - Rib
+ - Hyoid
+ - Hyoid
+ - Coccyx
+ - Coccyx
+ - Tarsus
+ - Tarsus
+ - Lacrimal
+ - Lacrimal
+ - Bone
+ - Bone
+ # Bonus Skeleton names
+ - Skull
+ - Skull
+ - Maxilla
+ - Maxilla
+ - Zygomatic
+ - Zygomatic
+ - Malleus
+ - Malleus
+ - Incus
+ - Incus
+ - Stapes
+ - Stapes
+ - Metacarpals
+ - Metacarpals
+ - Metatarsals
+ - Metatarsals
+ - Ribs
+ - Ribs
diff --git a/Resources/Prototypes/DeltaV/Actions/types.yml b/Resources/Prototypes/DeltaV/Actions/types.yml
new file mode 100644
index 000000000000..831763df5105
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Actions/types.yml
@@ -0,0 +1,12 @@
+- type: entity
+ id: ActionChitzite
+ name: Cough Up Chitzite
+ description: Purge the excess radiation build-up from your body by expelling it as a mass of toxic material.
+ components:
+ - type: InstantAction
+ charges: 0
+ enabled: false
+ maxCharges: 1
+ icon: { sprite: DeltaV/Objects/Specific/Species/chitinid.rsi, state: chitzite }
+ useDelay: 300
+ event: !type:ChitziteActionEvent
\ No newline at end of file
diff --git a/Resources/Prototypes/DeltaV/Body/Organs/chitinid.yml b/Resources/Prototypes/DeltaV/Body/Organs/chitinid.yml
new file mode 100644
index 000000000000..38a0e0b22191
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Body/Organs/chitinid.yml
@@ -0,0 +1,33 @@
+- type: entity
+ id: OrganChitinidStomach
+ parent: [OrganAnimalStomach, OrganHumanStomach]
+ name: stomach
+ description: "Gross. This is hard to stomach."
+ components:
+ - type: Organ # Shitmed Change
+ slotId: stomach # Shitmed Change
+ - type: Sprite
+ state: stomach
+ - type: Item
+ size: Small
+ heldPrefix: stomach
+ - type: SolutionContainerManager
+ solutions:
+ stomach:
+ maxVol: 50
+ food:
+ maxVol: 5
+ reagents:
+ - ReagentId: UncookedAnimalProteins
+ Quantity: 5
+ - type: Stomach
+ # The stomach metabolizes stuff like foods and drinks.
+ # TODO: Have it work off of the ent's solution container, and move this
+ # to intestines instead.
+ - type: Metabolizer
+ # mm yummy
+ maxReagents: 3
+ metabolizerTypes: [Human]
+ groups:
+ - id: Food
+ - id: Drink
diff --git a/Resources/Prototypes/DeltaV/Body/Parts/chitinid.yml b/Resources/Prototypes/DeltaV/Body/Parts/chitinid.yml
new file mode 100644
index 000000000000..507ba70f487e
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Body/Parts/chitinid.yml
@@ -0,0 +1,112 @@
+# TODO: Add descriptions (many)
+# TODO BODY: Part damage
+- type: entity
+ id: PartChitinidBase
+ parent: [BaseItem, BasePart]
+ name: "Chitinid body part"
+ abstract: true
+ components:
+ - type: Sprite
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ - type: Extractable
+ juiceSolution:
+ reagents:
+ - ReagentId: Fat
+ Quantity: 3
+ - ReagentId: Blood
+ Quantity: 10
+
+- type: entity
+ id: TorsoChitinid
+ name: "chitinid torso"
+ parent: [PartChitinidBase, BaseTorso]
+ components:
+ - type: Sprite
+ state: "torso_m"
+ - type: Extractable
+ juiceSolution:
+ reagents:
+ - ReagentId: Fat
+ Quantity: 10
+ - ReagentId: Blood
+ Quantity: 20
+
+
+- type: entity
+ id: HeadChitinid
+ name: "chitinid head"
+ parent: [PartChitinidBase, BaseHead]
+ components:
+ - type: Sprite
+ state: "head_m"
+ - type: Extractable
+ juiceSolution:
+ reagents:
+ - ReagentId: Fat
+ Quantity: 5
+ - ReagentId: Blood
+ Quantity: 10
+
+- type: entity
+ id: LeftArmChitinid
+ name: "left chitinid arm"
+ parent: [PartChitinidBase, BaseLeftArm]
+ components:
+ - type: Sprite
+ state: "l_arm"
+
+- type: entity
+ id: RightArmChitinid
+ name: "right chitinid arm"
+ parent: [PartChitinidBase, BaseRightArm]
+ components:
+ - type: Sprite
+ state: "r_arm"
+
+- type: entity
+ id: LeftHandChitinid
+ name: "left chitinid hand"
+ parent: [PartChitinidBase, BaseLeftHand]
+ components:
+ - type: Sprite
+ state: "l_hand"
+
+- type: entity
+ id: RightHandChitinid
+ name: "right chitinid hand"
+ parent: [PartChitinidBase, BaseRightHand]
+ components:
+ - type: Sprite
+ state: "r_hand"
+
+- type: entity
+ id: LeftLegChitinid
+ name: "left chitinid leg"
+ parent: [PartChitinidBase, BaseLeftLeg]
+ components:
+ - type: Sprite
+ state: "l_leg"
+
+- type: entity
+ id: RightLegChitinid
+ name: "right chitinid leg"
+ parent: [PartChitinidBase, BaseRightLeg]
+ components:
+ - type: Sprite
+ state: "r_leg"
+
+- type: entity
+ id: LeftFootChitinid
+ name: "left chitinid foot"
+ parent: [PartChitinidBase, BaseLeftFoot]
+ components:
+ - type: Sprite
+ state: "l_foot"
+
+- type: entity
+ id: RightFootChitinid
+ name: "right chitinid foot"
+ parent: [PartChitinidBase, BaseRightFoot]
+ components:
+ - type: Sprite
+ state: "r_foot"
diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/chitinid.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/chitinid.yml
new file mode 100644
index 000000000000..18428a67a6c4
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Body/Prototypes/chitinid.yml
@@ -0,0 +1,49 @@
+- type: body
+ id: Chitinid
+ name: "chitinid"
+ root: torso
+ slots:
+ head:
+ part: HeadChitinid
+ connections:
+ - torso
+ organs:
+ brain: OrganHumanBrain
+ eyes: OrganHumanEyes
+ torso:
+ part: TorsoChitinid
+ organs:
+ heart: OrganAnimalHeart
+ lungs: OrganHumanLungs
+ stomach: OrganChitinidStomach
+ liver: OrganAnimalLiver
+ kidneys: OrganHumanKidneys
+ connections:
+ - right arm
+ - left arm
+ - right leg
+ - left leg
+ right arm:
+ part: RightArmChitinid
+ connections:
+ - right hand
+ left arm:
+ part: LeftArmChitinid
+ connections:
+ - left hand
+ right hand:
+ part: RightHandChitinid
+ left hand:
+ part: LeftHandChitinid
+ right leg:
+ part: RightLegChitinid
+ connections:
+ - right foot
+ left leg:
+ part: LeftLegChitinid
+ connections:
+ - left foot
+ right foot:
+ part: RightFootChitinid
+ left foot:
+ part: LeftFootChitinid
diff --git a/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml b/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml
index b389378eb01d..2dbfe44d87f0 100644
--- a/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml
+++ b/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml
@@ -10,3 +10,12 @@
Blunt: 1.15
Slash: 1.15
Piercing: 1.15
+
+- type: damageModifierSet
+ id: Chitinid
+ coefficients:
+ Blunt: 1.15
+ Piercing: 1.25
+ Slash: 0.9
+ Cold: 1.1
+ Radiation: 0.2
\ No newline at end of file
diff --git a/Resources/Prototypes/DeltaV/Datasets/Names/chitinid_first_female.yml b/Resources/Prototypes/DeltaV/Datasets/Names/chitinid_first_female.yml
new file mode 100644
index 000000000000..be91ea315096
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Datasets/Names/chitinid_first_female.yml
@@ -0,0 +1,34 @@
+- type: dataset
+ id: NamesChitinidFirstFemale
+ values:
+ - Amer'ix
+ - An'bela
+ - An'ora
+ - Aza'ran
+ - Be'riah
+ - Bel'os
+ - Da'lrah
+ - Di'azo
+ - E'nzo
+ - Em'era
+ - Fi'n'rah
+ - He'teka
+ - Ir'iska
+ - Ish'kar
+ - Isha'ba
+ - Jes'sri'ka
+ - Kalz'za
+ - Kaz'zek
+ - Lot'tikz
+ - Ral'zol
+ - Ri'isano
+ - Talzz'ark
+ - Tess'ara
+ - Tez'mal'zar
+ - Thri'kis
+ - Vani'si'kar
+ - Ve'rai
+ - Vish'ra
+ - Zan'ova
+ - Zen'ofi
+ - Zzer'ak
diff --git a/Resources/Prototypes/DeltaV/Datasets/Names/chitinid_first_male.yml b/Resources/Prototypes/DeltaV/Datasets/Names/chitinid_first_male.yml
new file mode 100644
index 000000000000..355f5cffb9bc
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Datasets/Names/chitinid_first_male.yml
@@ -0,0 +1,36 @@
+- type: dataset
+ id: NamesChitinidFirstMale
+ values:
+ - Al'vos
+ - Amue'val
+ - Barma'tos
+ - Ben'idar
+ - Bil'verrok
+ - Crik'xis
+ - Daru'nta
+ - Dee'aldas
+ - Drx'var
+ - Hen'sra
+ - Hux'von
+ - Ilv'imon
+ - Is'irax
+ - Ish'nax
+ - Jax'zaril'va
+ - L'ofa
+ - Lo'zok
+ - Lu'vurx
+ - Luc'irax
+ - Mer'tex
+ - Od'dalis
+ - Si'ley
+ - Sim'sker
+ - Tal'vos
+ - Ti'ril
+ - Vir'lker
+ - Vir'muel
+ - Vix'vol
+ - Von'draz
+ - Vu'lta'voss
+ - Xixa'ba
+ - Yarr'wat
+ - Zay'zz
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/chitinid.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/chitinid.yml
new file mode 100644
index 000000000000..a8644a4e0790
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/chitinid.yml
@@ -0,0 +1,458 @@
+# Antennas
+- type: marking
+ id: ChitinidAntennasDefault
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: default
+
+- type: marking
+ id: ChitinidAntennasCurly
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: curly
+
+- type: marking
+ id: ChitinidAntennasGray
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: gray
+
+- type: marking
+ id: ChitinidAntennasSlick
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: slick
+
+- type: marking
+ id: ChitinidAntennasLong
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: long
+
+- type: marking
+ id: ChitinidAntennasBee
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: bee
+
+- type: marking
+ id: ChitinidAntennasShort
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: short
+
+- type: marking
+ id: ChitinidAntennasFirefly
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: firefly_primary
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: firefly_secondary
+
+- type: marking
+ id: ChitinidAntennasRadar
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: radar
+
+- type: marking
+ id: ChitinidAntennasSpeed
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi
+ state: speed
+
+
+# Wings
+- type: marking
+ id: ChitinidWingsDefault
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: default
+
+- type: marking
+ id: ChitinidWingsSmooth
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: smooth
+
+- type: marking
+ id: ChitinidWingsHoneypot
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: honeypot_primary
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: honeypot_secondary
+
+- type: marking
+ id: ChitinidWingsStubby
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: stubby
+
+- type: marking
+ id: ChitinidWingsBee
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: bee_primary
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: bee_secondary
+
+- type: marking
+ id: ChitinidWingsFirefly
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: firefly_primary
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi
+ state: firefly_secondary
+
+# Body markings:
+# Charred
+- type: marking
+ id: ChitinidChestCharred
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: charred_chest
+
+- type: marking
+ id: ChitinidHeadCharred
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: charred_head
+
+- type: marking
+ id: ChitinidLLegCharred
+ bodyPart: LLeg
+ markingCategory: LeftLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: charred_l_leg
+
+- type: marking
+ id: ChitinidRLegCharred
+ bodyPart: RLeg
+ markingCategory: RightLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: charred_r_leg
+
+- type: marking
+ id: ChitinidLArmCharred
+ bodyPart: LArm
+ markingCategory: LeftArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: charred_l_arm
+
+- type: marking
+ id: ChitinidRArmCharred
+ bodyPart: RArm
+ markingCategory: RightArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: charred_r_arm
+
+# Plated
+- type: marking
+ id: ChitinidChestPlated
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: plated_chest
+
+- type: marking
+ id: ChitinidLArmPlated
+ bodyPart: LArm
+ markingCategory: LeftArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: plated_l_arm
+
+- type: marking
+ id: ChitinidRArmPlated
+ bodyPart: RArm
+ markingCategory: RightArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: plated_r_arm
+
+# Stripes
+- type: marking
+ id: ChitinidChestStripes
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: stripes_chest
+
+- type: marking
+ id: ChitinidHeadStripes
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: stripes_head
+
+- type: marking
+ id: ChitinidLLegStripes
+ bodyPart: LLeg
+ markingCategory: LeftLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: stripes_l_leg
+
+- type: marking
+ id: ChitinidRLegStripes
+ bodyPart: RLeg
+ markingCategory: RightLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: stripes_r_leg
+
+- type: marking
+ id: ChitinidLArmStripes
+ bodyPart: LArm
+ markingCategory: LeftArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: stripes_l_arm
+
+- type: marking
+ id: ChitinidRArmStripes
+ bodyPart: RArm
+ markingCategory: RightArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: stripes_r_arm
+
+# Radiant
+- type: marking
+ id: ChitinidChestRadiant
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: radiant_chest
+
+- type: marking
+ id: ChitinidHeadRadiant
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: radiant_head
+
+- type: marking
+ id: ChitinidLLegRadiant
+ bodyPart: LLeg
+ markingCategory: LeftLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: radiant_l_leg
+
+- type: marking
+ id: ChitinidRLegRadiant
+ bodyPart: RLeg
+ markingCategory: RightLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: radiant_r_leg
+
+- type: marking
+ id: ChitinidLArmRadiant
+ bodyPart: LArm
+ markingCategory: LeftArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: radiant_l_arm
+
+- type: marking
+ id: ChitinidRArmRadiant
+ bodyPart: RArm
+ markingCategory: RightArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: radiant_r_arm
+
+# Toxic
+- type: marking
+ id: ChitinidChestToxic
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: toxic_chest
+
+- type: marking
+ id: ChitinidHeadToxic
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: toxic_head
+
+- type: marking
+ id: ChitinidLLegToxic
+ bodyPart: LLeg
+ markingCategory: LeftLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: toxic_l_leg
+
+- type: marking
+ id: ChitinidRLegToxic
+ bodyPart: RLeg
+ markingCategory: RightLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: toxic_r_leg
+
+- type: marking
+ id: ChitinidLArmToxic
+ bodyPart: LArm
+ markingCategory: LeftArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: toxic_l_arm
+
+- type: marking
+ id: ChitinidRArmToxic
+ bodyPart: RArm
+ markingCategory: RightArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: toxic_r_arm
+
+# Spotted
+- type: marking
+ id: ChitinidChestSpotted
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: spotted_chest
+
+- type: marking
+ id: ChitinidHeadSpotted
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: spotted_head
+
+- type: marking
+ id: ChitinidLLegSpotted
+ bodyPart: LLeg
+ markingCategory: LeftLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: spotted_l_leg
+
+- type: marking
+ id: ChitinidRLegSpotted
+ bodyPart: RLeg
+ markingCategory: RightLeg
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: spotted_r_leg
+
+- type: marking
+ id: ChitinidLArmSpotted
+ bodyPart: LArm
+ markingCategory: LeftArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: spotted_l_arm
+
+- type: marking
+ id: ChitinidRArmSpotted
+ bodyPart: RArm
+ markingCategory: RightArm
+ speciesRestriction: [Chitinid]
+ sprites:
+ - sprite: DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi
+ state: spotted_r_arm
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/chitinid.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/chitinid.yml
new file mode 100644
index 000000000000..4c8a78473152
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/chitinid.yml
@@ -0,0 +1,5 @@
+- type: entity
+ save: false
+ name: Urist McAnt
+ parent: BaseMobChitinid
+ id: MobChitinid
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/chitinid.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/chitinid.yml
new file mode 100644
index 000000000000..2dfd11018442
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/chitinid.yml
@@ -0,0 +1,169 @@
+- type: entity
+ save: false
+ name: Urist McAnt
+ parent: BaseMobSpeciesOrganic
+ id: BaseMobChitinid
+ abstract: true
+ components:
+ - type: HumanoidAppearance
+ species: Chitinid
+ hideLayersOnEquip:
+ - HeadTop
+
+ - type: Hunger
+ baseDecayRate: 0.0467 #needs to eat more to survive
+ - type: Thirst
+
+ - type: UnpoweredFlashlight
+ - type: PointLight
+ enabled: false
+ radius: 3
+ softness: 5
+ color: "#2CFA1F"
+ autoRot: true
+
+ - type: Carriable
+
+ - type: Icon
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: full
+
+ - type: Body
+ prototype: Chitinid
+ requiredLegs: 2
+
+ - type: Damageable
+ damageContainer: Biological
+ damageModifierSet: Chitinid
+
+ - type: Speech
+ speechVerb: Chitinid
+ allowedEmotes: ['Chitter', 'Click', 'Hiss']
+
+ - type: MeleeWeapon
+ animation: WeaponArcBite
+ soundHit:
+ path: /Audio/Effects/bite.ogg
+ damage:
+ types:
+ Piercing: 5
+
+
+ - type: TypingIndicator
+ proto: Chitinid
+
+ - type: Butcherable
+ butcheringType: Spike
+ spawned:
+ - id: FoodMeat
+ amount: 5
+
+ - type: Bloodstream
+ bloodReagent: InsectBlood
+
+ - type: DamageVisuals
+ damageOverlayGroups:
+ Brute:
+ sprite: Mobs/Effects/brute_damage.rsi
+ color: "#808A51"
+ Burn:
+ sprite: Mobs/Effects/burn_damage.rsi
+
+ - type: Vocal
+ sounds:
+ Male: UnisexChitinid
+ Female: UnisexChitinid
+ Unsexed: UnisexChitinid
+
+ - type: Fixtures
+ fixtures: # TODO: This needs a second fixture just for mob collisions.
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 0.42
+ density: 220
+ restitution: 0.0
+ mask:
+ - MobMask
+ layer:
+ - MobLayer
+
+ - type: Temperature # Ants hate the cold
+ heatDamageThreshold: 320
+ coldDamageThreshold: 230
+ currentTemperature: 310.15
+ specificHeat: 46
+ coldDamage:
+ types:
+ Cold : 1.25 #per second, scales with temperature & other constants
+ heatDamage:
+ types:
+ Heat : 1.0 #per second, scales with temperature & other constants
+ - type: TemperatureSpeed
+ thresholds:
+ 289: 0.6
+ 275: 0.4
+ 250: 0.3
+
+ - type: Sprite # sprite again because we want different layer ordering
+ noRot: true
+ drawdepth: Mobs
+ layers:
+ - map: [ "enum.HumanoidVisualLayers.Chest" ]
+ - map: [ "enum.HumanoidVisualLayers.Head" ]
+ - map: [ "enum.HumanoidVisualLayers.Snout" ]
+ - map: [ "enum.HumanoidVisualLayers.Eyes" ]
+ - map: [ "enum.HumanoidVisualLayers.RArm" ]
+ - map: [ "enum.HumanoidVisualLayers.LArm" ]
+ - map: [ "enum.HumanoidVisualLayers.RLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - map: [ "jumpsuit" ]
+ - map: [ "enum.HumanoidVisualLayers.LHand" ]
+ - map: [ "enum.HumanoidVisualLayers.RHand" ]
+ - map: [ "enum.HumanoidVisualLayers.LFoot" ]
+ - map: [ "enum.HumanoidVisualLayers.RFoot" ]
+ - map: [ "enum.HumanoidVisualLayers.Handcuffs" ]
+ color: "#ffffff"
+ sprite: Objects/Misc/handcuffs.rsi
+ state: body-overlay-2
+ visible: false
+ - map: [ "gloves" ]
+ - map: [ "shoes" ]
+ - map: [ "ears" ]
+ - map: [ "outerClothing" ]
+ - map: [ "eyes" ]
+ - map: [ "belt" ]
+ - map: [ "id" ]
+ - map: [ "back" ]
+ - map: [ "neck" ]
+ - map: [ "enum.HumanoidVisualLayers.Tail" ] #in the utopian future we should probably have a wings enum inserted here so everyhting doesn't break
+ - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
+ - map: [ "enum.HumanoidVisualLayers.Hair" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
+ - map: [ "mask" ]
+ - map: [ "head" ]
+ - map: [ "pocket1" ]
+ - map: [ "pocket2" ]
+ - map: [ "clownedon" ] # Dynamically generated
+ sprite: "Effects/creampie.rsi"
+ state: "creampie_moth"
+ visible: false
+ - type: Chitinid
+ - type: BlockInjection
+ blockReason: chitinid
+ - type: LanguageKnowledge
+ speaks:
+ - TauCetiBasic
+ - Chittin
+ understands:
+ - TauCetiBasic
+ - Chittin
+
+- type: entity
+ parent: BaseSpeciesDummy
+ id: MobChitinidDummy
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: HumanoidAppearance
+ species: Chitinid
diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/chitinid.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/chitinid.yml
new file mode 100644
index 000000000000..1e66d4295c03
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/chitinid.yml
@@ -0,0 +1,33 @@
+- type: entity
+ parent: BaseItem
+ id: Chitzite
+ name: chitzite
+ description: A small radioactive stone formed in the chest cavity of a radioactive chitinid, gross.... but kinda pretty?
+ components:
+ - type: Sprite
+ sprite: DeltaV/Objects/Specific/Species/chitinid.rsi
+ layers:
+ - state: chitzite
+ - state: chitzite_glow
+ - type: RadiationSource
+ intensity: 0.5
+ - type: Extractable
+ grindableSolutionName: chitzite
+ - type: SolutionContainerManager
+ solutions:
+ chitzite:
+ maxVol: 5
+ reagents:
+ - ReagentId: Uranium
+ Quantity: 2.5
+ - ReagentId: Radium
+ Quantity: 2.5
+ - type: MeleeWeapon
+ damage:
+ types:
+ Blunt: 3
+ Radiation: 3
+ - type: Tag
+ tags:
+ - Recyclable
+ - Trash
diff --git a/Resources/Prototypes/DeltaV/Guidebook/species.yml b/Resources/Prototypes/DeltaV/Guidebook/species.yml
new file mode 100644
index 000000000000..d64204e0a76f
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Guidebook/species.yml
@@ -0,0 +1,4 @@
+- type: guideEntry
+ id: Chitinid
+ name: species-name-chitinid
+ text: "/ServerInfo/Guidebook/Mobs/DeltaV/Chitinid.xml"
\ No newline at end of file
diff --git a/Resources/Prototypes/DeltaV/Objectives/traitor.yml b/Resources/Prototypes/DeltaV/Objectives/traitor.yml
index 828142cdfa77..b4fced2c61f7 100644
--- a/Resources/Prototypes/DeltaV/Objectives/traitor.yml
+++ b/Resources/Prototypes/DeltaV/Objectives/traitor.yml
@@ -33,3 +33,34 @@
stealGroup: RubberStampNotary
verifyMapExistence: true
owner: job-name-clerk
+
+# teach lesson
+- type: entity
+ abstract: true
+ parent: BaseTargetObjective
+ id: BaseTeachLessonObjective
+ components:
+ - type: Objective
+ unique: false
+ icon:
+ sprite: Objects/Weapons/Guns/Pistols/viper.rsi
+ state: icon
+ - type: TeachLessonCondition
+ - type: CodeCondition
+ - type: ObjectiveBlacklistRequirement
+ blacklist:
+ components:
+ - SocialObjective
+
+- type: entity
+ parent: [BaseTraitorObjective, BaseTeachLessonObjective]
+ id: TeachLessonRandomPersonObjective
+ description: Kill them, and show everyone we mean business. They only need to die once.
+ components:
+ - type: Objective
+ difficulty: 1.75
+ unique: false
+ - type: TargetObjective
+ title: objective-condition-teach-person-title
+ - type: PickRandomPerson
+ - type: TeachLessonCondition
\ No newline at end of file
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Cargo/courier.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Cargo/courier.yml
index 6785e74acb2d..0b8a4bd11f00 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Cargo/courier.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Cargo/courier.yml
@@ -1,5 +1,7 @@
- type: startingGear
id: CourierGear
+ subGear:
+ - CourierPlasmamanGear
equipment:
head: ClothingHeadCourier
jumpsuit: ClothingUniformCourier
@@ -11,3 +13,11 @@
innerClothingSkirt: ClothingUniformSkirtCourier
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: CourierPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitCourier
+ head: ClothingHeadEnvirohelmCourier
+ gloves: ClothingHandsGlovesEnviroglovesCargo
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Command/administrative_assistant.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Command/administrative_assistant.yml
index d07a1b44979d..03efbd17557d 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Command/administrative_assistant.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Command/administrative_assistant.yml
@@ -38,9 +38,19 @@
- type: startingGear
id: AdminAssistantGear
+ subGear:
+ - AdminAssistantPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitAdminAssistant
id: AdminAssistantPDA
ears: ClothingHeadsetAdminAssist
shoes: ClothingShoesLeather
- innerClothingSkirt: ClothingUniformJumpskirtAdminAssistant
\ No newline at end of file
+ innerClothingSkirt: ClothingUniformJumpskirtAdminAssistant
+
+- type: startingGear
+ id: AdminAssistantPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitAdminAssistant
+ head: ClothingHeadEnvirohelmAdminAssistant
+ gloves: ClothingHandsGlovesEnviroglovesAdminAssistant
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml
index db5e717a011f..af0bca2ea0a5 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml
@@ -55,6 +55,8 @@
- type: startingGear
id: SyndicateListenerGear
+ subGear:
+ - SyndicatePlasmamanGear # TODO: syndicate listener enviropyjamas
equipment:
jumpsuit: ClothingUniformJumpsuitPyjamaSyndicateBlack
head: ClothingHeadPyjamaSyndicateBlack
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml
index 8f76050d8829..effd10d2c68e 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml
@@ -38,6 +38,8 @@
- type: startingGear
id: CJGear
+ subGear:
+ - PassengerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitChiefJustice
back: ClothingBackpackFilled # TODO- make Justice department bags
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml
index c2032b67ebea..7e4a2ebff0d0 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml
@@ -28,6 +28,8 @@
- type: startingGear
id: ClerkGear
+ subGear:
+ - PassengerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitClerk
back: ClothingBackpackFilled
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml
index e0cebc4417a0..5aed73bcbf79 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml
@@ -17,6 +17,8 @@
- type: startingGear
id: ProsecutorGear
+ subGear:
+ - PassengerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitProsecutor
neck: ClothingNeckProsecutorbadge
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml
index 802ef248f2c8..ea2bbe305aad 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml
@@ -31,9 +31,16 @@
- type: CPRTraining
- type: SurgerySpeedModifier
speedModifier: 2.0
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 6
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: CorpsmanGear # see Prototypes/Roles/Jobs/Fun/misc_startinggear.yml for "BrigmedicGear"
+ subGear:
+ - CorpsmanPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitBrigmedic
outerClothing: ClothingOuterArmorPlateCarrier
@@ -48,3 +55,11 @@
innerClothingSkirt: ClothingUniformJumpskirtBrigmedic
satchel: ClothingBackpackSatchelBrigmedicFilled
duffelbag: ClothingBackpackDuffelBrigmedicFilled
+
+- type: startingGear
+ id: CorpsmanPlasmamanGear
+ parent: BasePlasmamanSecurityGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitBrigmedic
+ head: ClothingHeadEnvirohelmBrigmedic
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/DeltaV/Species/chitinid.yml b/Resources/Prototypes/DeltaV/Species/chitinid.yml
new file mode 100644
index 000000000000..6fa19aa9feac
--- /dev/null
+++ b/Resources/Prototypes/DeltaV/Species/chitinid.yml
@@ -0,0 +1,165 @@
+- type: species
+ id: Chitinid
+ name: species-name-chitinid
+ roundStart: true
+ prototype: MobChitinid
+ sprites: MobChitinidSprites
+ defaultSkinTone: "#ffda93"
+ markingLimits: MobChitinidMarkingLimits
+ dollPrototype: MobChitinidDummy
+ skinColoration: Hues
+ maleFirstNames: NamesChitinidFirstMale
+ femaleFirstNames: NamesChitinidFirstFemale
+ naming: First
+
+- type: speciesBaseSprites
+ id: MobChitinidSprites
+ sprites:
+ Head: MobChitinidHead
+ Snout: MobHumanoidAnyMarking
+ Chest: MobChitinidTorso
+ HeadTop: MobHumanoidAnyMarking
+ HeadSide: MobHumanoidAnyMarking
+ Tail: MobHumanoidAnyMarking
+ Eyes: MobChitinidEyes
+ LArm: MobChitinidLArm
+ RArm: MobChitinidRArm
+ LHand: MobChitinidLHand
+ RHand: MobChitinidRHand
+ LLeg: MobChitinidLLeg
+ RLeg: MobChitinidRLeg
+ LFoot: MobChitinidLFoot
+ RFoot: MobChitinidRFoot
+
+- type: humanoidBaseSprite
+ id: MobChitinidEyes
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: eyes
+
+- type: markingPoints
+ id: MobChitinidMarkingLimits
+ onlyWhitelisted: true
+ points:
+ Hair:
+ points: 0
+ required: false
+ FacialHair:
+ points: 0
+ required: false
+ Tail:
+ points: 1
+ required: true
+ defaultMarkings: [ ChitinidWingsDefault ]
+ Snout:
+ points: 1
+ required: false
+ HeadTop:
+ points: 1
+ required: true
+ defaultMarkings: [ ChitinidAntennasDefault ]
+ HeadSide:
+ points: 1
+ required: false
+ Head:
+ points: 1
+ required: false
+ Chest:
+ points: 1
+ required: false
+ LeftLeg:
+ points: 2
+ required: false
+ RightLeg:
+ points: 2
+ required: false
+ LeftArm:
+ points: 2
+ required: false
+ RightArm:
+ points: 2
+ required: false
+
+- type: humanoidBaseSprite
+ id: MobChitinidHead
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: head_m
+
+- type: humanoidBaseSprite
+ id: MobChitinidHeadMale
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: head_m
+
+- type: humanoidBaseSprite
+ id: MobChitinidHeadFemale
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: head_f
+
+- type: humanoidBaseSprite
+ id: MobChitinidTorso
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: torso_m
+
+- type: humanoidBaseSprite
+ id: MobChitinidTorsoMale
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: torso_m
+
+- type: humanoidBaseSprite
+ id: MobChitinidTorsoFemale
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: torso_f
+
+- type: humanoidBaseSprite
+ id: MobChitinidLLeg
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: l_leg
+
+- type: humanoidBaseSprite
+ id: MobChitinidLHand
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: l_hand
+
+- type: humanoidBaseSprite
+ id: MobChitinidLArm
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: l_arm
+
+- type: humanoidBaseSprite
+ id: MobChitinidLFoot
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: l_foot
+
+- type: humanoidBaseSprite
+ id: MobChitinidRLeg
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: r_leg
+
+- type: humanoidBaseSprite
+ id: MobChitinidRHand
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: r_hand
+
+- type: humanoidBaseSprite
+ id: MobChitinidRArm
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: r_arm
+
+- type: humanoidBaseSprite
+ id: MobChitinidRFoot
+ baseSprite:
+ sprite: DeltaV/Mobs/Species/Chitinid/parts.rsi
+ state: r_foot
diff --git a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml
index dc725b547e01..18f4258ba7f2 100644
--- a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml
+++ b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml
@@ -154,3 +154,31 @@
collection: VulpkaninWhines
Howl:
collection: VulpkaninHowls
+
+- type: emoteSounds
+ id: UnisexChitinid
+ params:
+ variation: 0.125
+ sounds:
+ Buzz:
+ path: /Audio/DeltaV/Voice/Chitinid/moth_scream.ogg
+ Scream:
+ path: /Audio/Voice/Arachnid/arachnid_scream.ogg
+ Laugh:
+ path: /Audio/DeltaV/Voice/Chitinid/moth_laugh.ogg
+ Chitter:
+ path: /Audio/Voice/Arachnid/arachnid_chitter.ogg
+ Click:
+ path: /Audio/Voice/Arachnid/arachnid_click.ogg
+ Crying:
+ collection: FemaleCry
+ Weh:
+ collection: Weh
+ Sneeze:
+ collection: MaleSneezes
+ Cough:
+ collection: MaleCoughs
+ Yawn:
+ collection: MaleYawn
+ Hiss:
+ path: /Audio/Animals/snake_hiss.ogg
\ No newline at end of file
diff --git a/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml b/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml
index 89db03d2fcc6..0d6a3b7e0eaf 100644
--- a/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml
+++ b/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml
@@ -15,3 +15,12 @@
path: /Audio/DeltaV/Voice/Harpy/chirp1.ogg
exclaimSound:
path: /Audio/DeltaV/Voice/Harpy/chirp1.ogg
+
+- type: speechSounds
+ id: Chitinid
+ saySound:
+ path: /Audio/Voice/Talk/speak_1.ogg
+ askSound:
+ path: /Audio/Voice/Talk/speak_1_ask.ogg
+ exclaimSound:
+ path: /Audio/Voice/Talk/speak_1_exclaim.ogg
\ No newline at end of file
diff --git a/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml b/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml
index 26156fb82db5..61750216b635 100644
--- a/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml
+++ b/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml
@@ -24,3 +24,12 @@
- chat-speech-verb-harpy-2
- chat-speech-verb-harpy-3
- chat-speech-verb-harpy-4
+
+- type: speechVerb
+ id: Chitinid
+ name: chat-speech-verb-name-chitinid
+ speechVerbStrings:
+ - chat-speech-verb-chitinid-1
+ - chat-speech-verb-chitinid-2
+ - chat-speech-verb-chitinid-3
+ - chat-speech-verb-chitinid-4
\ No newline at end of file
diff --git a/Resources/Prototypes/DeltaV/typing_indicator.yml b/Resources/Prototypes/DeltaV/typing_indicator.yml
index 7cfca9cc95f5..e36394581de4 100644
--- a/Resources/Prototypes/DeltaV/typing_indicator.yml
+++ b/Resources/Prototypes/DeltaV/typing_indicator.yml
@@ -4,3 +4,14 @@
typingState: felinid0
offset: 0, 0.2 # 0625
+- type: typingIndicator
+ id: rodentia
+ spritePath: /Textures/DeltaV/Effects/speech.rsi
+ typingState: rodentia0
+ offset: 0, 0.2 # 0625
+
+- type: typingIndicator
+ id: Chitinid
+ spritePath: /Textures/DeltaV/Effects/speech.rsi
+ typingState: chitinid0
+ offset: -0.2, 0.1 # 0625
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml b/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml
index 02cf0ab6f67d..a00bab327d6f 100644
--- a/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml
+++ b/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml
@@ -44,3 +44,17 @@
- type: Fiber
fiberMaterial: fibers-synthetic
- type: FingerprintMask
+
+- type: entity
+ parent: ClothingHandsGlovesSyntheticBase
+ abstract: true
+ id: ClothingHandsGlovesEnviroglovesBase
+ components:
+ - type: Armor
+ modifiers:
+ coefficients:
+ Caustic: 0.95
+ - type: IgniteFromGasImmunity
+ parts:
+ - LeftHand
+ - RightHand
diff --git a/Resources/Prototypes/Entities/Clothing/Hands/envirogloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/envirogloves.yml
new file mode 100644
index 000000000000..656bae9e9526
--- /dev/null
+++ b/Resources/Prototypes/Entities/Clothing/Hands/envirogloves.yml
@@ -0,0 +1,655 @@
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnvirogloves
+ name: plasma envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#913b00"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#913b00"
+ right:
+ - state: inhand-right
+ color: "#913b00"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#913b00"
+ - type: Fiber
+ fiberColor: fibers-orange
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesBlack
+ name: black envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#2f2e31"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#2f2e31"
+ right:
+ - state: inhand-right
+ color: "#2f2e31"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#2f2e31"
+ - type: Fiber
+ fiberColor: fibers-black
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesNitrile
+ name: nitrile envirogloves
+ description: Pricy nitrile gloves made for Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#234f60"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#234f60"
+ right:
+ - state: inhand-right
+ color: "#234f60"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#234f60"
+ - type: Fiber
+ fiberMaterial: fibers-nitrile
+ - type: FingerprintMask
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesWhite
+ name: white envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#ffffff"
+ - type: Fiber
+ fiberColor: fibers-white
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesWhite
+ id: ClothingHandsGlovesEnviroglovesColor
+ name: envirogloves
+ description: Covers up those scandalous boney hands.
+ suffix: Loadouts, Colorable
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesEvening
+ name: evening envirogloves
+ description: Who said Plasmamen can't serve elegance and looks?
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/evening_gloves.rsi
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/evening_gloves.rsi
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesRoboticist
+ name: roboticist envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#932500"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#932500"
+ right:
+ - state: inhand-right
+ color: "#932500"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#932500"
+ - type: Fiber
+ fiberColor: fibers-orange
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesJanitor
+ name: janitor envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#883391"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#883391"
+ right:
+ - state: inhand-right
+ color: "#883391"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#883391"
+ - type: Fiber
+ fiberColor: fibers-purple
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesCargo
+ name: logistics envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#bb9042"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#bb9042"
+ right:
+ - state: inhand-right
+ color: "#bb9042"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#bb9042"
+ - type: Fiber
+ fiberColor: fibers-orange
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesEngineering
+ name: engineering envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#d75600"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#d75600"
+ right:
+ - state: inhand-right
+ color: "#d75600"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#d75600"
+ - type: Fiber
+ fiberColor: fibers-orange
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesAtmos
+ name: atmos envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#00a5ff"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#00a5ff"
+ right:
+ - state: inhand-right
+ color: "#00a5ff"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#00a5ff"
+ - type: Fiber
+ fiberColor: fibers-blue
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesSalvage
+ name: salvage envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#47453d"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#47453d"
+ right:
+ - state: inhand-right
+ color: "#47453d"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#47453d"
+ - type: Fiber
+ fiberColor: fibers-olive
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesLeather
+ name: hydroponics envirogloves
+ description: These leather gloves protect your boney hands against thorns, barbs, prickles, and spikes.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#3164ff"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3164ff"
+ right:
+ - state: inhand-right
+ color: "#3164ff"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#3164ff"
+ - type: GloveHeatResistance
+ heatResistance: 1400
+ - type: Fiber
+ fiberMaterial: fibers-leather
+ fiberColor: fibers-blue
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesPrototype
+ name: prototype envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#911801"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#911801"
+ right:
+ - state: inhand-right
+ color: "#911801"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#911801"
+ - type: Fiber
+ fiberColor: fibers-red
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesClown
+ name: clown envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#ff0000"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ff0000"
+ right:
+ - state: inhand-right
+ color: "#ff0000"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#ff0000"
+ - type: Fiber
+ fiberColor: fibers-red
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesHoP
+ name: head of personnel's envirogloves
+ description: Covers up those scandalous, bony hands. Appears to be an attempt at making a replica of the captain's gloves.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Envirogloves/hop.rsi
+ layers:
+ - state: icon
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Envirogloves/hop.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ right:
+ - state: inhand-right
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Envirogloves/hop.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ - type: Fiber
+ fiberColor: fibers-blue
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesChiefEngineer
+ name: chief engineer's envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#45ff00"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#45ff00"
+ right:
+ - state: inhand-right
+ color: "#45ff00"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#45ff00"
+ - type: Fiber
+ fiberColor: fibers-green
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesResearchDirector
+ name: research director's envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#64008a"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#64008a"
+ right:
+ - state: inhand-right
+ color: "#64008a"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#64008a"
+ - type: Fiber
+ fiberColor: fibers-purple
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesPurple
+ name: purple envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#a349a4"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#a349a4"
+ - type: Fiber
+ fiberColor: fibers-purple
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesAdminAssistant
+ name: administrative assistant's envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#315266"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#315266"
+ right:
+ - state: inhand-right
+ color: "#315266"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#315266"
+ - type: Fiber
+ fiberColor: fibers-blue
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesColorDarkGreen
+ name: dark green envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#79CC26"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#79CC26"
+ right:
+ - state: inhand-right
+ color: "#79CC26"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#79CC26"
+ - type: Fiber
+ fiberColor: fibers-green
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesColorDarkGrey
+ name: dark grey envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#616161"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#616161"
+ right:
+ - state: inhand-right
+ color: "#616161"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#616161"
+ - type: Fiber
+ fiberColor: fibers-grey
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesGladiator
+ name: gladiator envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#dab13b"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#dab13b"
+ right:
+ - state: inhand-right
+ color: "#dab13b"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#dab13b"
+ - type: Fiber
+ fiberColor: fibers-yellow
+
+- type: entity
+ parent: ClothingHandsGlovesEnviroglovesBase
+ id: ClothingHandsGlovesEnviroglovesReporter
+ name: reporter envirogloves
+ description: Covers up those scandalous boney hands.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ layers:
+ - state: icon
+ color: "#79121b"
+ - type: Item
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#79121b"
+ right:
+ - state: inhand-right
+ color: "#79121b"
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/color.rsi
+ clothingVisuals:
+ gloves:
+ - state: equipped-HAND
+ color: "#79121b"
+ - type: Fiber
+ fiberColor: fibers-red
diff --git a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml
index 08a3eb568fe8..4d791e018e0d 100644
--- a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml
+++ b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml
@@ -126,6 +126,9 @@
lowPressureMultiplier: 1000
- type: TemperatureProtection
coefficient: 0.2
+ - type: IgniteFromGasImmunity
+ parts:
+ - Head
- type: IngestionBlocker
- type: Clothing
#Copies ClothingHeadHardsuitBase behavior
@@ -135,6 +138,7 @@
tags:
- WhitelistChameleon
- HelmetEVA
+ - PlasmamanSafe
- type: IdentityBlocker
- type: HideLayerClothing
slots:
@@ -165,6 +169,9 @@
coefficient: 0.1
- type: FireProtection
reduction: 0.2
+ - type: IgniteFromGasImmunity
+ parts:
+ - Head
- type: Armor
modifiers:
coefficients:
@@ -178,12 +185,174 @@
- type: Tag
tags:
- WhitelistChameleon
+ - PlasmamanSafe
- type: IdentityBlocker
- type: HideLayerClothing
slots:
- Hair
- Snout
+- type: entity
+ abstract: true
+ parent: ClothingHeadBase
+ id: ClothingHeadEnvirohelmBase
+ name: base envirosuit helmet
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ size: Normal
+ heldPrefix: off
+ - type: Clothing
+ equipDelay: 0.4
+ unequipDelay: 0.6 # Slightly higher delay to protect against accidental unequips
+ equippedPrefix: off
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ - type: IgniteFromGasImmunity
+ parts:
+ - Head
+ - type: Armor
+ modifiers:
+ coefficients:
+ Caustic: 0.90
+ - type: EyeProtection
+ - type: BreathMask
+ - type: PressureProtection # Same as EVA helmet
+ highPressureMultiplier: 0.6
+ lowPressureMultiplier: 1000
+ - type: TemperatureProtection
+ coefficient: 0.2
+ - type: IngestionBlocker
+ - type: Tag
+ tags:
+ - WhitelistChameleon
+ - Envirohelm
+ - PlasmamanSafe
+ - type: HideLayerClothing
+ slots:
+ - Hair
+ - Snout
+ clothingSlots:
+ - mask
+ - type: ToggleableLightVisuals
+ clothingVisuals:
+ head:
+ - state: on-equipped-HELMET
+ shader: unshaded
+ - type: PointLight
+ enabled: false
+ color: "#ffa1ff"
+ radius: 4
+ energy: 3
+ mask: /Textures/Effects/LightMasks/cone.png
+ autoRot: true
+ netsync: false
+ - type: Appearance
+ - type: HandheldLight
+ addPrefix: true
+ blinkingBehaviourId: blinking
+ radiatingBehaviourId: radiating
+ - type: LightBehaviour
+ behaviours:
+ - !type:FadeBehaviour
+ id: radiating
+ interpolate: Linear
+ maxDuration: 2.0
+ startValue: 3.0
+ endValue: 2.0
+ isLooped: true
+ reverseWhenFinished: true
+ - !type:PulseBehaviour
+ id: blinking
+ interpolate: Nearest
+ maxDuration: 1.0
+ minValue: 0.1
+ maxValue: 2.0
+ isLooped: true
+ - type: PowerCellSlot
+ cellSlotId: cell_slot
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ startingItem: PowerCellMedium
+ - type: ContainerContainer
+ containers:
+ cell_slot: !type:ContainerSlot {}
+ - type: GuideHelp # While the playerbase is getting introduced to Plasmamen, add their guidebook here
+ guides: [ Plasmaman ]
+
+# When making new custom envirohelms, inherit from this entity and
+# replace the color fields on the layers
+- type: entity
+ abstract: true
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmCustomBase
+ name: base custom envirosuit helmet
+ components:
+ - type: ToggleableLightVisuals
+ inhandVisuals:
+ left:
+ - state: on-inhand-left
+ shader: unshaded
+ right:
+ - state: on-inhand-right
+ shader: unshaded
+ clothingVisuals:
+ head:
+ - state: on-equipped-HELMET
+ shader: unshaded
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/custom.rsi
+ layers:
+ - state: icon
+ color: "#FFFFFF"
+ - state: accent-icon
+ color: "#FF0000"
+ # - state: midaccent-icon
+ # color: "#0000FF"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#FFFFFF"
+ - state: accent-inhand-left
+ color: "#FF0000"
+ # - state: midaccent-inhand-left
+ # color: "#0000FF"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#FFFFFF"
+ - state: accent-inhand-right
+ color: "#FF0000"
+ # - state: midaccent-inhand-right
+ # color: "#0000FF"
+ - state: visor-inhand-right
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/custom.rsi
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#FFFFFF"
+ - state: accent-equipped-HELMET
+ color: "#FF0000"
+ # - state: midaccent-equipped-HELMET
+ # color: "#0000FF"
+ - state: visor-equipped-HELMET
+
- type: entity
abstract: true
parent: ClothingHeadHardsuitBase
diff --git a/Resources/Prototypes/Entities/Clothing/Head/envirohelms.yml b/Resources/Prototypes/Entities/Clothing/Head/envirohelms.yml
new file mode 100644
index 000000000000..e05101895082
--- /dev/null
+++ b/Resources/Prototypes/Entities/Clothing/Head/envirohelms.yml
@@ -0,0 +1,2192 @@
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelm
+ name: plasma envirosuit helmet
+ description: A special containment helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/plain.rsi
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ right:
+ - state: inhand-right
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/plain.rsi
+ - type: ToggleableLightVisuals
+ inhandVisuals:
+ left:
+ - state: on-inhand-left
+ shader: unshaded
+ right:
+ - state: on-inhand-right
+ shader: unshaded
+
+- type: entity
+ parent: ClothingHeadEnvirohelm
+ id: ClothingHeadEnvirohelmEmpty
+ suffix: Empty
+ components:
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmAtmos
+ name: atmospherics envirosuit helmet
+ description: A space-worthy helmet specially designed for atmos technician Plasmamen, the usual purple stripes being replaced by atmos' blue.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/atmos.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/atmos.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmCargo
+ name: logistics envirosuit helmet
+ description: A Plasmaman envirohelmet designed for cargo technicians.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/cargo.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/cargo.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmCaptain
+ name: captain's envirosuit helmet
+ description: A special containment helmet designed for the Captain.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/captain.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/captain.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmChiefEngineer
+ name: chief engineer's envirosuit helmet
+ description: A special containment helmet designed for the Chief Engineer, the usual purple stripes being replaced by the chief's green.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/ce.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/ce.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmChaplain
+ name: chaplain's envirosuit helmet
+ description: An envirohelm specially designed for only the most pious of Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/chaplain.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/chaplain.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmEnviroslacksColorOrange
+ id: ClothingHeadEnvirohelmDetective
+ name: detective's envirosuit helmet
+ description: A special containment helmet designed for detectives, protecting them from burning alive, alongside other undesirables.
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmChemist
+ name: chemistry envirosuit helmet
+ description: A Plasmaman envirosuit designed for chemists, two orange stripes going down its face.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/chemist.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/chemist.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmClown
+ name: clown envirosuit helmet
+ description: The make-up is painted on, it's a miracle it doesn't chip. HONK!
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/clown.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/clown.rsi
+ - type: PointLight
+ color: "#a777ff"
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmCMO
+ name: chief medical officer's envirosuit helmet
+ description: A special containment helmet designed for the Chief Medical Officer. The gold stripe differentiates them from other medical staff.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/cmo.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/cmo.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmEngineering
+ name: engineering envirosuit helmet
+ description: A space-worthy helmet specially designed for engineer Plasmamen, the usual purple stripes being replaced by engineering's orange.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/engineering.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/engineering.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmHoP
+ name: head of personnel's envirosuit helmet
+ description: A special containment helmet designed for the Head of Personnel.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/hop.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/hop.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmHoS
+ name: head of security's envirosuit helmet
+ description: A special containment helmet designed for the Head of Security. The pair of gold stripes differentiates them from other members of security.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/hos.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/hos.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmHydroponics
+ name: hydroponics envirosuit helmet
+ description: A green and blue envirohelmet designating its wearer as a botanist.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/hydroponics.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/hydroponics.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmJanitor
+ name: janitor envirosuit helmet
+ description: A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/janitor.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/janitor.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmAncientVoid
+ name: NTSRA envirosuit helmet
+ description: Made out of a modified NTSRA vacsuit, this helmet was Nanotrasen's first-designed envirohelmet for Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/ancientvoid.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/ancientvoid.rsi
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ - state: visor-equipped-HELMET
+ - type: ToggleableLightVisuals
+ clothingVisuals:
+ head:
+ - state: visor-equipped-HELMET
+ shader: unshaded
+ - type: PointLight
+ color: "#ffffff"
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmMedicalDoctor
+ name: medical envirosuit helmet
+ description: An envirohelmet designed for Plasmaman Medical personnel, having two stripes down its length to denote as much.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/medical.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/medical.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmGenitcs
+ name: genetics envirosuit helmet
+ description: A Plasmaman envirohelmet designed for geneticists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/genetics.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/genetics.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmMime
+ name: mime envirosuit helmet
+ description: The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/mime.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/mime.rsi
+ - type: PointLight
+ color: "#ffffff"
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmParamedic
+ name: paramedic envirosuit helmet
+ description: An envirohelmet designed for Plasmaman paramedics, with darker blue stripes compared to the medical model.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/paramedic.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/paramedic.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmPrisoner
+ name: prisoner envirosuit helmet
+ description: A Plasmaman containment helmet for prisoners.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ff8300"
+ - state: accent-icon
+ color: "#3c3c3c"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ff8300"
+ - state: accent-inhand-left
+ color: "#3c3c3c"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ff8300"
+ - state: accent-inhand-right
+ color: "#3c3c3c"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ff8300"
+ - state: accent-equipped-HELMET
+ color: "#3c3c3c"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmResearchDirector
+ name: mystagogue's envirosuit helmet
+ description: A special containment helmet designed for the Mystagogue. A light brown design is applied to differentiate them from other scientists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/rd.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/rd.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmRoboticist
+ name: roboticist envirosuit helmet
+ description: A Plasmaman envirohelmet designed for roboticists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/roboticist.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/roboticist.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmSalvage
+ name: salvage envirosuit helmet
+ description: A khaki helmet given to Plasmamen salvage technicians.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/salvage.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/salvage.rsi
+ - type: PointLight
+ color: "#c77eff"
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmScientist
+ name: science envirosuit helmet
+ description: A Plasmaman envirohelmet designed for scientists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/scientist.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/scientist.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmSec
+ name: security envirosuit helmet
+ description: A Plasmaman containment helmet designed for security officers, protecting them from burning alive, alongside other undesirables.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#8f3132"
+ - state: accent-icon
+ color: "#2e2e2e"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#8f3132"
+ - state: accent-inhand-left
+ color: "#2e2e2e"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#8f3132"
+ - state: accent-inhand-right
+ color: "#2e2e2e"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#8f3132"
+ - state: accent-equipped-HELMET
+ color: "#2e2e2e"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmSecBlue
+ name: blue security envirosuit helmet
+ description: A cool blue envirosuit helmet for Plasmaman Security personnel.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#b9c1d9"
+ - state: accent-icon
+ color: "#36476b"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#b9c1d9"
+ - state: accent-inhand-left
+ color: "#36476b"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#b9c1d9"
+ - state: accent-inhand-right
+ color: "#36476b"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#b9c1d9"
+ - state: accent-equipped-HELMET
+ color: "#36476b"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmSecGrey
+ name: grey security envirosuit helmet
+ description: A light grey envirosuit helmet with bright red highlights for Plasmamen Security personnel.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#7e7e7e"
+ - state: accent-icon
+ color: "#a61d1d"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#7e7e7e"
+ - state: accent-inhand-left
+ color: "#a61d1d"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#7e7e7e"
+ - state: accent-inhand-right
+ color: "#a61d1d"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#7e7e7e"
+ - state: accent-equipped-HELMET
+ color: "#a61d1d"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmVirology
+ name: virology envirosuit helmet
+ description: The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/virology.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/virology.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmWarden
+ name: warden's envirosuit helmet
+ description: A Plasmaman containment helmet designed for the warden. A pair of white stripes being added to differeciate them from other members of security.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/warden.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/warden.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmOperative
+ name: operative envirosuit helmet
+ description: Anyone wearing this is badass and deserves at least a cursory nod of respect.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/tacticool.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/tacticool.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmTacticool
+ name: tacticool envirosuit helmet
+ description: There's no doubt about it, this helmet puts you above ALL of the other Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/tacticool.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/tacticool.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmCentcomAgent
+ name: CentCom agent's envirosuit helmet
+ description: A special containment helmet designed for CentCom's legal team. You know, so any coffee spills don't kill the poor sod.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/centcom_agent.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/centcom_agent.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmCentcomOfficial
+ name: CentCom official's envirosuit helmet
+ description: A special containment helmet designed for CentCom Staff. They sure do love their green.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/centcom_official.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/centcom_official.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmCentcomOfficer
+ name: CentCom officer's envirosuit helmet
+ description: A special containment helmet designed for CentCom Officers.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/centcom_officer.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/centcom_officer.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmCourier
+ name: courier's envirosuit helmet
+ description: An envirosuit helmet for the courier.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#4a281f"
+ - state: accent-icon
+ color: "#c2911e"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#4a281f"
+ - state: accent-inhand-left
+ color: "#c2911e"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#4a281f"
+ - state: accent-inhand-right
+ color: "#c2911e"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#4a281f"
+ - state: accent-equipped-HELMET
+ color: "#c2911e"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmMailCarrier
+ name: mail carrier's envirosuit helmet
+ description: Smells like a good pension.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#394dc6"
+ - state: accent-icon
+ color: "#dcdcdc"
+ - state: midaccent-icon
+ color: "#d82927"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#394dc6"
+ - state: accent-inhand-left
+ color: "#dcdcdc"
+ - state: midaccent-inhand-left
+ color: "#d82927"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#394dc6"
+ - state: accent-inhand-right
+ color: "#dcdcdc"
+ - state: midaccent-inhand-right
+ color: "#d82927"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#394dc6"
+ - state: accent-equipped-HELMET
+ color: "#dcdcdc"
+ - state: midaccent-equipped-HELMET
+ color: "#d82927"
+ - state: visor-equipped-HELMET
+ - type: ClothingAddFaction
+ faction: Mailman
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmMusician
+ name: musician's envirosuit helmet
+ description: Experts are perplexed as to how Plasmamen can still play the trumpet with this helmet on.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3c335b"
+ - state: accent-icon
+ color: "#f3f5f4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3c335b"
+ - state: accent-inhand-left
+ color: "#f3f5f4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#3c335b"
+ - state: accent-inhand-right
+ color: "#f3f5f4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#3c335b"
+ - state: accent-equipped-HELMET
+ color: "#f3f5f4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmReporter
+ name: reporter envirosuit helmet
+ description: An envirosuit helmet for the reporter.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#112334"
+ - state: accent-icon
+ color: "#79121b"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#112334"
+ - state: accent-inhand-left
+ color: "#79121b"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#112334"
+ - state: accent-inhand-right
+ color: "#79121b"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#112334"
+ - state: accent-equipped-HELMET
+ color: "#79121b"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmGladiator
+ name: gladiator envirosuit helmet
+ description: Protects the head from toy spears and poisonous oxygen.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#dab13b"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#dab13b"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#dab13b"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#dab13b"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmMantis
+ name: mantis' envirosuit helmet
+ description: An envirosuit helmet for the forensic mantis with a fancy gold stripe.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#46566d"
+ - state: accent-icon
+ color: "#7d2322"
+ - state: midaccent-icon
+ color: "#d4af48"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#46566d"
+ - state: accent-inhand-left
+ color: "#7d2322"
+ - state: midaccent-inhand-left
+ color: "#d4af48"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#46566d"
+ - state: accent-inhand-right
+ color: "#7d2322"
+ - state: midaccent-inhand-right
+ color: "#d4af48"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#46566d"
+ - state: accent-equipped-HELMET
+ color: "#7d2322"
+ - state: midaccent-equipped-HELMET
+ color: "#d4af48"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmSafari
+ name: safari envirosuit helmet
+ description: Makes you a target for the locals.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#d3b986"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#d3b986"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#d3b986"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#d3b986"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmMartialGi
+ name: gi envirosuit helmet
+ description: A white envirosuit helmet with black stripes used for martial arts.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#3b3b3b"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#3b3b3b"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#3b3b3b"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffffff"
+ - state: accent-equipped-HELMET
+ color: "#3b3b3b"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmQM
+ name: logistics officer's envirosuit helmet
+ description: A special containment helmet designed for the Logistics Officer.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#bb934b"
+ - state: accent-icon
+ color: "#ffc000"
+ - state: midaccent-icon
+ color: "#d08200"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#bb934b"
+ - state: accent-inhand-left
+ color: "#ffc000"
+ - state: midaccent-inhand-left
+ color: "#d08200"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#bb934b"
+ - state: accent-inhand-right
+ color: "#ffc000"
+ - state: midaccent-inhand-right
+ color: "#d08200"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#bb934b"
+ - state: accent-equipped-HELMET
+ color: "#ffc000"
+ - state: midaccent-equipped-HELMET
+ color: "#d08200"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmBoxing
+ name: boxing envirosuit helmet
+ description: A white envirosuit helmet with red stripes.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#eeeeee"
+ - state: accent-icon
+ color: "#a81818"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#eeeeee"
+ - state: accent-inhand-left
+ color: "#a81818"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#eeeeee"
+ - state: accent-inhand-right
+ color: "#a81818"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#eeeeee"
+ - state: accent-equipped-HELMET
+ color: "#a81818"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmAdminAssistant
+ name: administrative assistant's envirosuit helmet
+ description: A white envirosuit helmet with dark blue stripes.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#315266"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#315266"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#315266"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffffff"
+ - state: accent-equipped-HELMET
+ color: "#315266"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmBlackPink
+ name: black pink envirosuit helmet
+ description: How you like that envirosuit helmet?
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#292929"
+ - state: accent-icon
+ color: "#f4a1b7"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#292929"
+ - state: accent-inhand-left
+ color: "#f4a1b7"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#292929"
+ - state: accent-inhand-right
+ color: "#f4a1b7"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#292929"
+ - state: accent-equipped-HELMET
+ color: "#f4a1b7"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmBlackPinkAlt
+ name: black pink envirosuit helmet
+ suffix: Alternative
+ description: This envirosuit helmet makes you want to kill this love.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#f4a1b7"
+ - state: accent-icon
+ color: "#292929"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#f4a1b7"
+ - state: accent-inhand-left
+ color: "#292929"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#f4a1b7"
+ - state: accent-inhand-right
+ color: "#292929"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#f4a1b7"
+ - state: accent-equipped-HELMET
+ color: "#292929"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmBlueshield
+ name: blueshield's envirosuit helmet
+ description: A Plasmaman envirosuit helmet designed for the blueshield.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#535353"
+ - state: accent-icon
+ color: "#0044d4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#535353"
+ - state: accent-inhand-left
+ color: "#0044d4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#535353"
+ - state: accent-inhand-right
+ color: "#0044d4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#535353"
+ - state: accent-equipped-HELMET
+ color: "#0044d4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmTrans
+ name: trans envirosuit helmet
+ description: The preferred headgear of Transylvanian Plasmamen to prevent burning from oxygen.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#FFFFFF"
+ - state: accent-icon
+ color: "#ffb0c0"
+ - state: sideaccent-icon
+ color: "#5dd2ff"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#FFFFFF"
+ - state: accent-inhand-left
+ color: "#ffb0c0"
+ - state: sideaccent-inhand-left
+ color: "#5dd2ff"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#FFFFFF"
+ - state: accent-inhand-right
+ color: "#ffb0c0"
+ - state: sideaccent-inhand-right
+ color: "#5dd2ff"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#FFFFFF"
+ - state: accent-equipped-HELMET
+ color: "#ffb0c0"
+ - state: sideaccent-equipped-HELMET
+ color: "#5dd2ff"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmPrisonGuard
+ name: prison guard's envirosuit helmet
+ description: Hope a prisoner doesn't snatch this away from you!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#d76b00"
+ - state: accent-icon
+ color: "#363636"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#d76b00"
+ - state: accent-inhand-left
+ color: "#363636"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#d76b00"
+ - state: accent-inhand-right
+ color: "#363636"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#d76b00"
+ - state: accent-equipped-HELMET
+ color: "#363636"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmBrigmedic
+ name: corpsman envirosuit helmet
+ description: A helmet provided to Corpsmen Plasmamen.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#486782"
+ - state: accent-icon
+ color: "#2e2e2e"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#486782"
+ - state: accent-inhand-left
+ color: "#2e2e2e"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#486782"
+ - state: accent-inhand-right
+ color: "#2e2e2e"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#486782"
+ - state: accent-equipped-HELMET
+ color: "#2e2e2e"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmNanotrasenRepresentative
+ name: nanotrasen representative envirosuit helmet
+ description: A black envirosuit helmet worn by the NanoTrasen Representative, with black and gold accents.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#292929"
+ - state: accent-icon
+ color: "#ffce5b"
+ - state: midaccent-icon
+ color: "#266199"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#292929"
+ - state: accent-inhand-left
+ color: "#ffce5b"
+ - state: midaccent-inhand-left
+ color: "#266199"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#292929"
+ - state: accent-inhand-right
+ color: "#ffce5b"
+ - state: midaccent-inhand-right
+ color: "#266199"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#292929"
+ - state: accent-equipped-HELMET
+ color: "#ffce5b"
+ - state: midaccent-equipped-HELMET
+ color: "#266199"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmMagistrate
+ name: magistrate envirosuit helmet
+ description: A plain white envirosuit with yellow stripes.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ebebeb"
+ - state: accent-icon
+ color: "#ffce5b"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ebebeb"
+ - state: accent-inhand-left
+ color: "#ffce5b"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ebebeb"
+ - state: accent-inhand-right
+ color: "#ffce5b"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ebebeb"
+ - state: accent-equipped-HELMET
+ color: "#ffce5b"
+ - state: visor-equipped-HELMET
+
+# Color envirohelms
+- type: entity
+ parent: ClothingHeadEnvirohelmBase
+ id: ClothingHeadEnvirohelmColorWhite
+ name: white envirosuit helmet
+ description: A generic white envirohelm.
+ components:
+ - type: Sprite
+ sprite: Clothing/Head/Envirohelms/white.rsi
+ - type: Clothing
+ sprite: Clothing/Head/Envirohelms/white.rsi
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorGrey
+ name: grey envirosuit helmet
+ description: A grey envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#b3b3b3"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#b3b3b3"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#b3b3b3"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#b3b3b3"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorBlack
+ name: black envirosuit helmet
+ description: A black envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3f3f3f"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3f3f3f"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#3f3f3f"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#3f3f3f"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorRed
+ name: red envirosuit helmet
+ description: A red envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#d1423f"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#d1423f"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#d1423f"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#d1423f"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorGreen
+ name: green envirosuit helmet
+ description: A green envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#9ed63a"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#9ed63a"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#9ed63a"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#9ed63a"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorDarkGreen
+ name: dark green envirosuit helmet
+ description: A dark green envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#79CC26"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#79CC26"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#79CC26"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#79CC26"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorBlue
+ name: blue envirosuit helmet
+ description: A blue envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#52aecc"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#52aecc"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#52aecc"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#52aecc"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorDarkBlue
+ name: dark blue envirosuit helmet
+ description: A dark blue envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3285ba"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3285ba"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#3285ba"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#3285ba"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorTeal
+ name: teal envirosuit helmet
+ description: A teal envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#77f3b7"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#77f3b7"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#77f3b7"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#77f3b7"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorMaroon
+ name: maroon envirosuit helmet
+ description: A maroon envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#cc295f"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#cc295f"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#cc295f"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#cc295f"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorPink
+ name: pink envirosuit helmet
+ description: A pink envirosuit helmet. So fetch!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ff8cff"
+ - state: accent-icon
+ color: "#8b3e8c"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ff8cff"
+ - state: accent-inhand-left
+ color: "#8b3e8c"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ff8cff"
+ - state: accent-inhand-right
+ color: "#8b3e8c"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ff8cff"
+ - state: accent-equipped-HELMET
+ color: "#8b3e8c"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorYellow
+ name: yellow envirosuit helmet
+ description: A yellow envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffe14d"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffe14d"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffe14d"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffe14d"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorPurple
+ name: purple envirosuit helmet
+ description: A purple envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#9f70cc"
+ - state: accent-icon
+ color: "#843b85"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#9f70cc"
+ - state: accent-inhand-left
+ color: "#843b85"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#9f70cc"
+ - state: accent-inhand-right
+ color: "#843b85"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#9f70cc"
+ - state: accent-equipped-HELMET
+ color: "#843b85"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorOrange
+ name: orange envirosuit helmet
+ description: An orange envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ff8c19"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ff8c19"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ff8c19"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ff8c19"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorLightBrown
+ name: light brown envirosuit helmet
+ description: A light brown envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#a17229"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#a349a4"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#a17229"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#a17229"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmColorBrown
+ name: brown envirosuit helmet
+ description: A brown envirosuit helmet.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#543e1b"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#543e1b"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#543e1b"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#543e1b"
+ - state: accent-equipped-HELMET
+ color: "#a349a4"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmEnviroslacksColorRed
+ name: red enviroslacks helmet
+ description: The pet project of a particularly posh Plasmaman, this envirohelm comes with red accents. Fancy!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#99211f"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#99211f"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#99211f"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffffff"
+ - state: accent-equipped-HELMET
+ color: "#99211f"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmEnviroslacksColorOrange
+ name: orange enviroslacks helmet
+ description: The pet project of a particularly posh Plasmaman, this envirohelm comes with orange accents. Zesty!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#c2680f"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#c2680f"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#c2680f"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffffff"
+ - state: accent-equipped-HELMET
+ color: "#c2680f"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmEnviroslacksColorGreen
+ name: green enviroslacks helmet
+ description: The pet project of a particularly posh Plasmaman, this envirohelm comes with green accents. Leafy!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#5b991f"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#5b991f"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#5b991f"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffffff"
+ - state: accent-equipped-HELMET
+ color: "#5b991f"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmEnviroslacksColorBlue
+ name: blue enviroslacks helmet
+ description: The pet project of a particularly posh Plasmaman, this envirohelm comes with blue accents. Cool!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#2b5c99"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#2b5c99"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#2b5c99"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffffff"
+ - state: accent-equipped-HELMET
+ color: "#2b5c99"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmEnviroslacksMNK
+ name: MNK enviroslacks helmet
+ description: A sleek envirohelm brought to you by MNK. Classic!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#363636"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#363636"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#363636"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#ffffff"
+ - state: accent-equipped-HELMET
+ color: "#363636"
+ - state: visor-equipped-HELMET
+
+- type: entity
+ parent: ClothingHeadEnvirohelmCustomBase
+ id: ClothingHeadEnvirohelmEnviroslacksMNKAlt
+ name: monochrome enviroslacks helmet
+ description: A sleek envirohelm brought to you by MNK. Noir!
+ suffix: Alternative
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3b3b3b"
+ - state: accent-icon
+ color: "#d6d6d6"
+ - state: visor-icon
+ - state: icon-flash
+ visible: false
+ shader: unshaded
+ map: [ "light" ]
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3b3b3b"
+ - state: accent-inhand-left
+ color: "#d6d6d6"
+ - state: visor-inhand-left
+ right:
+ - state: inhand-right
+ color: "#3b3b3b"
+ - state: accent-inhand-right
+ color: "#d6d6d6"
+ - state: visor-inhand-right
+ - type: Clothing
+ clothingVisuals:
+ head:
+ - state: equipped-HELMET
+ color: "#3b3b3b"
+ - state: accent-equipped-HELMET
+ color: "#d6d6d6"
+ - state: visor-equipped-HELMET
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml
index 1b350a97674e..74561ef19755 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml
@@ -137,6 +137,18 @@
coefficient: 0.01
- type: FireProtection
reduction: 0.75 # almost perfectly sealed, atmos firesuit is better
+ - type: IgniteFromGasImmunity
+ parts:
+ - Torso
+ - Groin
+ - LeftArm
+ - LeftHand
+ - RightArm
+ - RightHand
+ - LeftLeg
+ - LeftFoot
+ - RightLeg
+ - RightFoot
- type: ClothingSpeedModifier
walkModifier: 0.4
sprintModifier: 0.6
@@ -164,6 +176,7 @@
- HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites
- AllowLamiaHardsuit
- FullBodyOuter
+ - PlasmamanSafe
- type: Clothing
equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off.
unequipDelay: 2.5
@@ -204,6 +217,18 @@
lowPressureMultiplier: 1000
- type: TemperatureProtection
coefficient: 0.01 # Not complete protection from fire
+ - type: IgniteFromGasImmunity
+ parts:
+ - Torso
+ - Groin
+ - LeftArm
+ - LeftHand
+ - RightArm
+ - RightHand
+ - LeftLeg
+ - LeftFoot
+ - RightLeg
+ - RightFoot
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
@@ -214,6 +239,7 @@
tags:
- AllowLamiaHardsuit #DeltaV: Used by Lamia to render snek hardsuits
- HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites
+ - PlasmamanSafe
- type: Clothing
equipDelay: 1.25 # Softsuits are easier to put on and off
unequipDelay: 1
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
index a9bb8f1dc772..4696e6d8e308 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
@@ -44,6 +44,8 @@
lowPressureMultiplier: 1000
- type: TemperatureProtection
coefficient: 0.001
+ - type: FireProtection
+ reduction: 1
- type: ExplosionResistance
damageCoefficient: 0.5
- type: Armor
@@ -98,6 +100,10 @@
coefficient: 0.75 # 25%
- type: GuideHelp
guides: [ HephaestusIndustries ]
+ - type: TemperatureProtection
+ coefficient: 0.001
+ - type: FireProtection
+ reduction: 1
#Spationaut Hardsuit
- type: entity
@@ -225,6 +231,8 @@
damageCoefficient: 0.2
- type: TemperatureProtection
coefficient: 0.001
+ - type: FireProtection
+ reduction: 1
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitMaxim
- type: GuideHelp
@@ -397,6 +405,10 @@
coefficient: 0.65 # 35%
- type: GuideHelp
guides: [ HephaestusIndustries ]
+ - type: TemperatureProtection
+ coefficient: 0.001
+ - type: FireProtection
+ reduction: 1
#Chief Medical Officer's Hardsuit
- type: entity
@@ -622,7 +634,7 @@
- type: ExplosionResistance
damageCoefficient: 0.2
- type: FireProtection
- reduction: 0.8 # perfect protection like atmos firesuit for pyro tf2 ops
+ reduction: 1 # perfect protection like atmos firesuit for pyro tf2 ops
- type: Armor
modifiers:
coefficients:
@@ -890,6 +902,10 @@
clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer
- type: StaminaDamageResistance
coefficient: 0.5 # 50%
+ - type: TemperatureProtection
+ coefficient: 0.001
+ - type: FireProtection
+ reduction: 1
#ERT Medic Hardsuit
- type: entity
diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml
index cea803d104f0..b10a1c95e670 100644
--- a/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml
+++ b/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml
@@ -153,3 +153,108 @@
- state: icon_flipped
map: ["foldedLayer"]
visible: true
+
+- type: entity
+ abstract: true
+ parent: UnsensoredClothingUniformBase
+ id: UnsensoredClothingUniformEnvirosuitBase
+ components:
+ - type: IgniteFromGasImmunity
+ parts:
+ - Torso
+ - Groin
+ - LeftArm
+ - LeftHand
+ - RightArm
+ - RightHand
+ - LeftLeg
+ - LeftFoot
+ - RightLeg
+ - RightFoot
+ - type: Clothing
+ equipDelay: 0.4
+ unequipDelay: 0.6 # Slightly higher delay to protect against accidental unequips
+ femaleMask: NoMask
+ - type: SelfExtinguisher
+ cooldown: 100
+ requiresIgniteFromGasImmune: true
+ sound:
+ path: /Audio/Effects/extinguish.ogg
+ - type: LimitedCharges
+ maxCharges: 4
+ charges: 4
+ - type: Armor
+ modifiers:
+ coefficients:
+ Caustic: 0.85
+ - type: Tag
+ tags:
+ - WhitelistChameleon
+ - PlasmamanSafe
+ - type: ClothingRequiredStepTriggerImmune
+ slots: WITHOUT_POCKET
+ - type: GuideHelp # While the playerbase is getting introduced to Plasmamen, add their guidebook here
+ guides: [ Plasmaman ]
+
+- type: entity
+ abstract: true
+ parent: UnsensoredClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitBase
+ components:
+ - type: SuitSensor
+ - type: DeviceNetwork
+ deviceNetId: Wireless
+ transmitFrequencyId: SuitSensor
+ - type: WirelessNetworkConnection
+ range: 1200
+ - type: StationLimitedNetwork
+
+- type: entity
+ abstract: true
+ parent: UnsensoredClothingUniformEnvirosuitBase
+ id: UnsensoredClothingUniformEnvirosuitCustomBase
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/custom.rsi
+ layers:
+ - state: icon
+ color: "#FFFFFF"
+ - state: accent-icon
+ color: "#FF0000"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#FFFFFF"
+ - state: accent-inhand-left
+ color: "#FF0000"
+ right:
+ - state: inhand-right
+ color: "#FFFFFF"
+ - state: accent-inhand-right
+ color: "#FF0000"
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/custom.rsi
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#FFFFFF"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#FF0000"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#FF0000"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa" # Recommended default soles color
+
+- type: entity
+ abstract: true
+ parent: UnsensoredClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitCustomBase
+ components:
+ - type: SuitSensor
+ - type: DeviceNetwork
+ deviceNetId: Wireless
+ transmitFrequencyId: SuitSensor
+ - type: WirelessNetworkConnection
+ range: 1200
+ - type: StationLimitedNetwork
diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/envirosuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/envirosuits.yml
new file mode 100644
index 000000000000..04fae7ee00ad
--- /dev/null
+++ b/Resources/Prototypes/Entities/Clothing/Uniforms/envirosuits.yml
@@ -0,0 +1,3091 @@
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuit
+ name: plasma envirosuit
+ description: A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/plain.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/plain.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitAtmos
+ name: atmospherics envirosuit
+ description: An air-tight suit designed to be used by Plasmamen employed as atmos technicians.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/atmos.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/atmos.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitCargo
+ name: cargo tech envirosuit
+ description: An envirosuit used by Plasmamen cargo technicians.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/cargo.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/cargo.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitCaptain
+ name: captain's envirosuit
+ description: It's a blue envirosuit with some gold markings denoting the rank of "Captain".
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/captain.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/captain.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitChiefEngineer
+ name: chief engineer's envirosuit
+ description: An air-tight suit designed to be used by Plasmamen insane enough to achieve the rank of "Chief Engineer".
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/ce.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/ce.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitChaplain
+ name: chaplain's envirosuit
+ description: An envirosuit specially designed for only the most pious of Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/chaplain.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/chaplain.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitChef
+ name: chef's envirosuit
+ description: A white Plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/chef.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/chef.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitChemist
+ name: chemistry envirosuit
+ description: A Plasmaman envirosuit designed for chemists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/chemist.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/chemist.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitClown
+ name: clown envirosuit
+ description: HONK!
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/clown.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/clown.rsi
+ - type: Tag
+ tags:
+ - ClownSuit
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitCMO
+ name: chief medical officer's envirosuit
+ description: It's an envirosuit worn by those with the experience to be "Chief Medical Officer".
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/cmo.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/cmo.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitEngineering
+ name: engineering envirosuit
+ description: An air-tight suit designed to be used by Plasmamen employed as engineers, the usual purple stripes being replaced by engineering's orange.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/engineering.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/engineering.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitEnviroslacksColorOrange
+ id: ClothingUniformEnvirosuitDetective
+ name: detective envirosuit
+ description: The pet project of a particularly posh Plasmaman, this custom suit was modified by Nanotrasen for its detectives.
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitHoP
+ name: head of personnel's envirosuit
+ description: It's an envirosuit worn by someone who works in the position of "Head of Personnel".
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/hop.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/hop.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitHoS
+ name: head of security's envirosuit
+ description: A Plasmaman containment suit decorated for those few with the dedication to achieve the position of Head of Security.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/hos.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/hos.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitHydroponics
+ name: hydroponics envirosuit
+ description: A green and blue envirosuit designed to protect Plasmamen from minor plant-related injuries.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/hydroponics.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/hydroponics.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitJanitor
+ name: janitor envirosuit
+ description: A grey and purple envirosuit designated for Plasmamen janitors.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/janitor.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/janitor.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitAncientVoid
+ name: NTSRA envirosuit
+ description: Made out of a modified NTSRA vacsuit, this non-spaceworthy suit was NanoTrasen's first designed envirosuit for Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/ancientvoid.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/ancientvoid.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitMedicalDoctor
+ name: medical doctor's envirosuit
+ description: A suit designed for the station's more plasma-based doctors.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/medical.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/medical.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitGenetics
+ name: genetics envirosuit
+ description: A Plasmaman envirosuit designed for geneticists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/genetics.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/genetics.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitMime
+ name: mime envirosuit
+ description: It's not very colourful.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/mime.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/mime.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitParamedic
+ name: paramedic envirosuit
+ description: A suit designed for the station's Plasmaman paramedics.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/paramedic.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/paramedic.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitPrisoner
+ name: prisoner envirosuit
+ description: An orange envirosuit identifying and protecting a criminal Plasmaman.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ff8300"
+ - state: plaintop-icon
+ color: "#ff8300"
+ - state: accentprisoner-icon
+ color: "#404040"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ff8300"
+ - state: plaintop-inhand-left
+ color: "#ff8300"
+ - state: accentprisoner-inhand-left
+ color: "#404040"
+ right:
+ - state: inhand-right
+ color: "#ff8300"
+ - state: plaintop-inhand-right
+ color: "#ff8300"
+ - state: accentprisoner-inhand-right
+ color: "#404040"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ff8300"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ff8300"
+ - state: accentprisoner-equipped-INNERCLOTHING
+ color: "#404040"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#404040"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+ - type: SuitSensor
+ controlsLocked: true
+ randomMode: false
+ mode: SensorCords
+ - type: Tag
+ tags:
+ - ClothMade
+ - WhitelistChameleon
+ - PlasmamanSafe
+ - PrisonUniform
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitResearchDirector
+ name: mystagogue's envirosuit
+ description: It's an envirosuit worn by those with the know-how to achieve the position of "Mystagogue".
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/rd.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/rd.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitRoboticist
+ name: roboticist envirosuit
+ description: A Plasmaman envirosuit designed for roboticists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/roboticist.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/roboticist.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitSalvage
+ name: salvage envirosuit
+ description: An air-tight khaki suit designed for salvage operations by Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/salvage.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/salvage.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitScientist
+ name: science envirosuit
+ description: A Plasmaman envirosuit designed for scientists.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/scientist.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/scientist.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitSec
+ name: security envirosuit
+ description: A Plasmaman containment suit designed for security officers.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#8f3132"
+ - state: accent2-icon
+ color: "#2e2e2e"
+ - state: accenthighlight-icon
+ color: "#313e5a"
+ - state: clip-icon
+ color: "#730000"
+ - state: clip_right-icon
+ color: "#313e5a"
+ - state: pants-icon
+ color: "#2e2e2e"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#8f3132"
+ - state: accent2-inhand-left
+ color: "#2e2e2e"
+ - state: accenthighlight-inhand-left
+ color: "#313e5a"
+ - state: clip-inhand-left
+ color: "#730000"
+ - state: clip_right-inhand-left
+ color: "#313e5a"
+ - state: pants-inhand-left
+ color: "#2e2e2e"
+ right:
+ - state: inhand-right
+ color: "#8f3132"
+ - state: accent2-inhand-right
+ color: "#2e2e2e"
+ - state: accenthighlight-inhand-right
+ color: "#313e5a"
+ - state: clip-inhand-right
+ color: "#730000"
+ - state: clip_right-inhand-right
+ color: "#313e5a"
+ - state: pants-inhand-right
+ color: "#2e2e2e"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#8f3132"
+ - state: accent2-equipped-INNERCLOTHING
+ color: "#2e2e2e"
+ - state: accenthighlight-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#730000"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#2e2e2e"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#732829"
+ - state: shoesdark-equipped-INNERCLOTHING
+ color: "#2e2e2e"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#7a7a7a"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitSecBlue
+ name: blue security envirosuit
+ description: A cool blue enviroshirt over charcoal trousers, for the calm and collected Plasmaman officer.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#b9c1d9"
+ - state: accent-icon
+ color: "#2e2e2e"
+ - state: accent3_chestonly-icon
+ color: "#36476b"
+ - state: accenthighlight-icon
+ color: "#313e5a"
+ - state: clip-icon
+ color: "#860000"
+ - state: clip_right-icon
+ color: "#313e5a"
+ - state: pants-icon
+ color: "#232938"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#b9c1d9"
+ - state: accent-inhand-left
+ color: "#2e2e2e"
+ - state: accent3_chestonly-inhand-left
+ color: "#36476b"
+ - state: accenthighlight-inhand-left
+ color: "#313e5a"
+ - state: clip-inhand-left
+ color: "#860000"
+ - state: clip_right-inhand-left
+ color: "#313e5a"
+ - state: pants-inhand-left
+ color: "#232938"
+ right:
+ - state: inhand-right
+ color: "#b9c1d9"
+ - state: accent-inhand-right
+ color: "#2e2e2e"
+ - state: accent3_chestonly-inhand-right
+ color: "#36476b"
+ - state: accenthighlight-inhand-right
+ color: "#313e5a"
+ - state: clip-inhand-right
+ color: "#860000"
+ - state: clip_right-inhand-right
+ color: "#313e5a"
+ - state: pants-inhand-right
+ color: "#232938"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#b9c1d9"
+ - state: accentalt_noback-equipped-INNERCLOTHING
+ color: "#2e2e2e"
+ - state: accent3_chestonly-equipped-INNERCLOTHING
+ color: "#36476b"
+ - state: accenthighlight-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#860000"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#232938"
+ - state: backaccent-equipped-INNERCLOTHING
+ color: "#36476b"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#36476b"
+ - state: shoesdark-equipped-INNERCLOTHING
+ color: "#2e2e2e"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#7a7a7a"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitSecGrey
+ name: grey security envirosuit
+ description: Light grey enviroslacks with bright red highlights, for dedicated and responsive security officers.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#7e7e7e"
+ - state: plaintop-icon
+ color: "#7e7e7e"
+ - state: accent-icon
+ color: "#333333"
+ - state: accenthighlight-icon
+ color: "#313e5a"
+ - state: tie-icon
+ color: "#a61d1d"
+ - state: clip-icon
+ color: "#860000"
+ - state: clip_right-icon
+ color: "#313e5a"
+ - state: pants-icon
+ color: "#333333"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#7e7e7e"
+ - state: plaintop-inhand-left
+ color: "#7e7e7e"
+ - state: accent-inhand-left
+ color: "#333333"
+ - state: accenthighlight-inhand-left
+ color: "#313e5a"
+ - state: tie-inhand-left
+ color: "#a61d1d"
+ - state: clip-inhand-left
+ color: "#860000"
+ - state: clip_right-inhand-left
+ color: "#313e5a"
+ - state: pants-inhand-left
+ color: "#333333"
+ right:
+ - state: inhand-right
+ color: "#7e7e7e"
+ - state: plaintop-inhand-right
+ color: "#7e7e7e"
+ - state: accent-inhand-right
+ color: "#333333"
+ - state: accenthighlight-inhand-right
+ color: "#313e5a"
+ - state: tie-inhand-right
+ color: "#a61d1d"
+ - state: clip-inhand-right
+ color: "#860000"
+ - state: clip_right-inhand-right
+ color: "#313e5a"
+ - state: pants-inhand-right
+ color: "#333333"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#7e7e7e"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#7e7e7e"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#333333"
+ - state: accenthighlight-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#a61d1d"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#860000"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: cuffs-equipped-INNERCLOTHING
+ color: "#a11a1a"
+ - state: cuffs_upper-equipped-INNERCLOTHING
+ color: "#c92323"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#333333"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a61d1d"
+ - state: shoesdark-equipped-INNERCLOTHING
+ color: "#333333"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#7a7a7a"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitVirology
+ name: virology envirosuit
+ description: The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/virology.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/virology.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitWarden
+ name: warden's envirosuit
+ description: A Plasmaman containment suit designed for the warden, white stripes being added to differentiate them from other members of security.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/warden.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/warden.rsi
+
+- type: entity
+ parent: UnsensoredClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitOperative
+ name: operative envirosuit
+ description: A sinister looking envirosuit, for the most elite of bony operatives.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/tacticool.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/tacticool.rsi
+ - type: LimitedCharges
+ maxCharges: 6
+ charges: 6
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitTacticool
+ name: tacticool envirosuit
+ description: A sinister looking envirosuit, for the boniest of operatives.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/tacticool.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/tacticool.rsi
+ # Too cool for sensors to be on
+ - type: SuitSensor
+ randomMode: false
+ mode: SensorOff
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitCentcomAgent
+ name: CentCom agent's envirosuit
+ description: An envirosuit tailored for CentCom's legal team. Smells of burnt coffee.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/centcom_agent.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/centcom_agent.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitCentcomOfficial
+ name: CentCom official's envirosuit
+ description: It's an envirosuit worn by CentCom's officials.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/centcom_official.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/centcom_official.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitCentcomOfficer
+ name: CentCom officer's envirosuit
+ description: It's an envirosuit worn by CentCom Officers.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/centcom_officer.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/centcom_officer.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitBlueshield
+ name: blueshield's envirosuit
+ description: An envirosuit designed for Plasmamen employed as the Blueshield.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/blueshield_officer.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/blueshield_officer.rsi
+ - type: Armor
+ modifiers:
+ coefficients:
+ Blunt: 0.95
+ Heat: 0.95
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitCourier
+ name: courier's envirosuit
+ description: An envirosuit tailored for the courier.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#4a281f"
+ - state: accent2-icon
+ color: "#c2911e"
+ - state: clip-icon
+ color: "#c2911e"
+ - state: clip_right-icon
+ color: "#c2911e"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#4a281f"
+ - state: accent2-inhand-left
+ color: "#c2911e"
+ - state: clip-inhand-left
+ color: "#c2911e"
+ - state: clip_right-inhand-left
+ color: "#c2911e"
+ right:
+ - state: inhand-right
+ color: "#4a281f"
+ - state: accent2-inhand-right
+ color: "#c2911e"
+ - state: clip-inhand-right
+ color: "#c2911e"
+ - state: clip_right-inhand-right
+ color: "#c2911e"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#4a281f"
+ - state: accent2-equipped-INNERCLOTHING
+ color: "#c2911e"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#c2911e"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#c2911e"
+ - state: loweraccent2-equipped-INNERCLOTHING
+ color: "#c2911e"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#c2911e"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitMailCarrier
+ name: mail carrier's envirosuit
+ description: An envirosuit tailored for the mail carrier. The color pattern makes pitbulls go wild.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#394dc6"
+ - state: accent-icon
+ color: "#d82927"
+ - state: accent2_chestonly-icon
+ color: "#dcdcdc"
+ - state: clip-icon
+ color: "#dcdcdc"
+ - state: clip_right-icon
+ color: "#c2c2c2"
+ - state: belt-icon
+ color: "#cfcfcf"
+ - state: beltbuckle_small-icon
+ color: "#f0990c"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#394dc6"
+ - state: accent-inhand-left
+ color: "#d82927"
+ - state: accent2_chestonly-inhand-left
+ color: "#dcdcdc"
+ - state: clip-inhand-left
+ color: "#dcdcdc"
+ - state: clip_right-inhand-left
+ color: "#c2c2c2"
+ - state: belt-inhand-left
+ color: "#cfcfcf"
+ - state: beltbuckle_small-inhand-left
+ color: "#f0990c"
+ right:
+ - state: inhand-right
+ color: "#394dc6"
+ - state: accent-inhand-right
+ color: "#d82927"
+ - state: accent2_chestonly-inhand-right
+ color: "#dcdcdc"
+ - state: clip-inhand-right
+ color: "#dcdcdc"
+ - state: clip_right-inhand-right
+ color: "#c2c2c2"
+ - state: belt-inhand-right
+ color: "#cfcfcf"
+ - state: beltbuckle_small-inhand-right
+ color: "#f0990c"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#394dc6"
+ - state: accentalt_noback-equipped-INNERCLOTHING
+ color: "#d82927"
+ - state: accent2_chestonly-equipped-INNERCLOTHING
+ color: "#dcdcdc"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#dcdcdc"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#c2c2c2"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#cfcfcf"
+ - state: beltbuckle_small-equipped-INNERCLOTHING
+ color: "#f0990c"
+ - state: backaccent-equipped-INNERCLOTHING
+ color: "#dcdcdc"
+ - state: loweraccent2-equipped-INNERCLOTHING
+ color: "#dcdcdc"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#dcdcdc"
+ - type: ClothingAddFaction
+ faction: Mailman
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitMusician
+ name: musician's envirosuit
+ description: An envirosuit to play music with.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3c335b"
+ - state: plaintop-icon
+ color: "#3c335b"
+ - state: accent2-icon
+ color: "#f3f5f4"
+ - state: pin-icon
+ color: "#db2525"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3c335b"
+ - state: accent2-inhand-left
+ color: "#f3f5f4"
+ - state: pin-inhand-left
+ color: "#db2525"
+ right:
+ - state: inhand-right
+ color: "#3c335b"
+ - state: accent2-inhand-right
+ color: "#f3f5f4"
+ - state: pin-inhand-right
+ color: "#db2525"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#3c335b"
+ - state: accent2-equipped-INNERCLOTHING
+ color: "#f3f5f4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#f3f5f4"
+ - state: pin-equipped-INNERCLOTHING
+ color: "#db2525"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitReporter
+ name: reporter envirosuit
+ description: An envirosuit for the news-oriented Plasmamen.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#112334"
+ - state: accent2-icon
+ color: "#79121b"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#112334"
+ - state: accent2-inhand-left
+ color: "#79121b"
+ right:
+ - state: inhand-right
+ color: "#112334"
+ - state: accent2-inhand-right
+ color: "#79121b"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#112334"
+ - state: accent2-equipped-INNERCLOTHING
+ color: "#79121b"
+ - state: loweraccent2-equipped-INNERCLOTHING
+ color: "#79121b"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitGladiator
+ name: gladiator envirosuit
+ description: Made for bloodthirsty Plasmamen.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#dab13b"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#dab13b"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#dab13b"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#dab13b"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent2-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#a349a4"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitMantis
+ name: mantis' envirosuit
+ description: Hunting down psionics in the safety of this envirosuit.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#46566d"
+ - state: pants-icon
+ color: "#7d2322"
+ - state: belt-icon
+ color: "#51321a"
+ - state: beltbuckle-icon
+ color: "#dcbb60"
+ - state: accent-icon
+ color: "#d4af48"
+ - state: buttons-icon
+ color: "#997d30"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#46566d"
+ - state: pants-inhand-left
+ color: "#7d2322"
+ - state: belt-inhand-left
+ color: "#51321a"
+ - state: beltbuckle-inhand-left
+ color: "#dcbb60"
+ - state: accent-inhand-left
+ color: "#d4af48"
+ - state: buttons-inhand-left
+ color: "#997d30"
+ right:
+ - state: inhand-right
+ color: "#46566d"
+ - state: pants-inhand-right
+ color: "#7d2322"
+ - state: belt-inhand-right
+ color: "#51321a"
+ - state: beltbuckle-inhand-right
+ color: "#dcbb60"
+ - state: accent-inhand-right
+ color: "#d4af48"
+ - state: buttons-inhand-right
+ color: "#997d30"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#46566d"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#7d2322"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#51321a"
+ - state: beltbuckle-equipped-INNERCLOTHING
+ color: "#dcbb60"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#d4af48"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#d4af48"
+ - state: buttons-equipped-INNERCLOTHING
+ color: "#997d30"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#d4af48"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitSafari
+ name: safari envirosuit
+ description: Perfect for a jungle excursion.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#d3b986"
+ - state: accent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#d3b986"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#d3b986"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#d3b986"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitMartialGi
+ name: gi envirosuit
+ description: A flowy envirosuit tailor-made for martial arts that doesn't restrict your mobility.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#3b3b3b"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#3b3b3b"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#3b3b3b"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#3b3b3b"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#3b3b3b"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitQM
+ name: logistics officer's envirosuit
+ description: An air-tight suit designed to be used by Plasmamen insane enough to achieve the rank of "Logistics Officer".
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#bb934b"
+ - state: accent-icon
+ color: "#ffc000"
+ - state: accent3_chestonly-icon
+ color: "#d08200"
+ - state: clip-icon
+ color: "#c0c0c0"
+ - state: clip_right-icon
+ color: "#a7a7a7"
+ - state: pants-icon
+ color: "#8a8a8a"
+ - state: belt-icon
+ color: "#6f6f6f"
+ - state: beltbuckle-icon
+ color: "#bfbfbf"
+ - state: buttons-icon
+ color: "#535353"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#bb934b"
+ - state: accent-inhand-left
+ color: "#ffc000"
+ - state: accent3_chestonly-inhand-left
+ color: "#d08200"
+ - state: clip-inhand-left
+ color: "#c0c0c0"
+ - state: clip_right-inhand-left
+ color: "#a7a7a7"
+ - state: pants-inhand-left
+ color: "#8a8a8a"
+ - state: belt-inhand-left
+ color: "#6f6f6f"
+ - state: beltbuckle-inhand-left
+ color: "#bfbfbf"
+ - state: buttons-inhand-left
+ color: "#535353"
+ right:
+ - state: inhand-right
+ color: "#bb934b"
+ - state: accent-inhand-right
+ color: "#ffc000"
+ - state: accent3_chestonly-inhand-right
+ color: "#d08200"
+ - state: clip-inhand-right
+ color: "#c0c0c0"
+ - state: clip_right-inhand-right
+ color: "#a7a7a7"
+ - state: pants-inhand-right
+ color: "#8a8a8a"
+ - state: belt-inhand-right
+ color: "#6f6f6f"
+ - state: beltbuckle-inhand-right
+ color: "#bfbfbf"
+ - state: buttons-inhand-right
+ color: "#535353"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#bb934b"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#ffc000"
+ - state: accent3_chestonly-equipped-INNERCLOTHING
+ color: "#d08200"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#c0c0c0"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#a7a7a7"
+ - state: cuffs-equipped-INNERCLOTHING
+ color: "#d08200"
+ - state: cuffs_upper-equipped-INNERCLOTHING
+ color: "#6e6e6e"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#8a8a8a"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#6f6f6f"
+ - state: beltbuckle-equipped-INNERCLOTHING
+ color: "#bfbfbf"
+ - state: buttons-equipped-INNERCLOTHING
+ color: "#535353"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#ffc000"
+ - state: shoesdark-equipped-INNERCLOTHING
+ color: "#828282"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#ffc000"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitBoxing
+ name: boxing envirosuit
+ description: Used by Plasmamen boxers.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#eeeeee"
+ - state: accent3-icon
+ color: "#a81818"
+ - state: pants-icon
+ color: "#a81818"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#eeeeee"
+ - state: accent3-inhand-left
+ color: "#a81818"
+ - state: pants-inhand-left
+ color: "#a81818"
+ right:
+ - state: inhand-right
+ color: "#eeeeee"
+ - state: accent3-inhand-right
+ color: "#a81818"
+ - state: pants-inhand-right
+ color: "#a81818"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#eeeeee"
+ - state: accent3-equipped-INNERCLOTHING
+ color: "#a81818"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#a81818"
+ - state: loweraccent2-equipped-INNERCLOTHING
+ color: "#eeeeee"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#eeeeee"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitAdminAssistant
+ name: administrative assistant's envirosuit
+ description: An envirosuit worn by the Administrative Assistant. Smells of burnt coffee.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: pants-icon
+ color: "#313131"
+ - state: belt-icon
+ color: "#4d4d4d"
+ - state: accent-icon
+ color: "#315266"
+ - state: tie-icon
+ color: "#315266"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: pants-inhand-left
+ color: "#313131"
+ - state: belt-inhand-left
+ color: "#4d4d4d"
+ - state: accent-inhand-left
+ color: "#315266"
+ - state: tie-inhand-left
+ color: "#315266"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: pants-inhand-right
+ color: "#313131"
+ - state: belt-inhand-right
+ color: "#4d4d4d"
+ - state: accent-inhand-right
+ color: "#315266"
+ - state: tie-inhand-right
+ color: "#315266"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#313131"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#4d4d4d"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#315266"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#315266"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#315266"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitBlackPink
+ name: black pink envirosuit
+ description: Black pink envirosuit in your area!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#292929"
+ - state: plaintop-icon
+ color: "#292929"
+ - state: accent-icon
+ color: "#f4a1b7"
+ - state: heart-icon
+ color: "#f4a1b7"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#292929"
+ - state: plaintop-inhand-left
+ color: "#292929"
+ - state: accent-inhand-left
+ color: "#f4a1b7"
+ - state: heart-inhand-left
+ color: "#f4a1b7"
+ right:
+ - state: inhand-right
+ color: "#292929"
+ - state: plaintop-inhand-right
+ color: "#292929"
+ - state: accent-inhand-right
+ color: "#f4a1b7"
+ - state: heart-inhand-right
+ color: "#f4a1b7"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#292929"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#f4a1b7"
+ - state: heart-equipped-INNERCLOTHING
+ color: "#f4a1b7"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#f4a1b7"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#f4a1b7"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitBlackPinkAlt
+ name: black pink envirosuit
+ suffix: Alternative
+ description: Black pink envirosuit in your area!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#f4a1b7"
+ - state: plaintop-icon
+ color: "#f4a1b7"
+ - state: accent-icon
+ color: "#292929"
+ - state: heart-icon
+ color: "#292929"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#f4a1b7"
+ - state: plaintop-inhand-left
+ color: "#f4a1b7"
+ - state: accent-inhand-left
+ color: "#292929"
+ - state: heart-inhand-left
+ color: "#292929"
+ right:
+ - state: inhand-right
+ color: "#f4a1b7"
+ - state: plaintop-inhand-right
+ color: "#f4a1b7"
+ - state: accent-inhand-right
+ color: "#292929"
+ - state: heart-inhand-right
+ color: "#292929"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#f4a1b7"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#f4a1b7"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: heart-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#292929"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitTrans
+ name: trans envirosuit
+ description: The signature envirosuit of Transylvanian Plasmamen.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#5dd2ff"
+ - state: heart-icon
+ color: "#ffb0c0"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#5dd2ff"
+ - state: heart-inhand-left
+ color: "#ffb0c0"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#5dd2ff"
+ - state: heart-inhand-right
+ color: "#ffb0c0"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#5dd2ff"
+ - state: heart-equipped-INNERCLOTHING
+ color: "#ffb0c0"
+ - state: cuffs-equipped-INNERCLOTHING
+ color: "#ffb0c0"
+ - state: loweraccent2_top-equipped-INNERCLOTHING
+ color: "#5dd2ff"
+ - state: loweraccent2_bottom-equipped-INNERCLOTHING
+ color: "#ffb0c0"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#5dd2ff"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitPrisonGuard
+ name: prison guard's envirosuit
+ description: A comfortable, durable, envirosuit made to keep Plasmamen prison staff comfortable and safe.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#d76b00"
+ - state: accent3-icon
+ color: "#363636"
+ - state: accenthighlight-icon
+ color: "#313e5a"
+ - state: clip-icon
+ color: "#860000"
+ - state: clip_right-icon
+ color: "#313e5a"
+ - state: pants-icon
+ color: "#363636"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#d76b00"
+ - state: accent3-inhand-left
+ color: "#363636"
+ - state: accenthighlight-inhand-left
+ color: "#313e5a"
+ - state: clip-inhand-left
+ color: "#860000"
+ - state: clip_right-inhand-left
+ color: "#313e5a"
+ - state: pants-inhand-left
+ color: "#363636"
+ right:
+ - state: inhand-right
+ color: "#d76b00"
+ - state: accent3-inhand-right
+ color: "#363636"
+ - state: accenthighlight-inhand-right
+ color: "#313e5a"
+ - state: clip-inhand-right
+ color: "#860000"
+ - state: clip_right-inhand-right
+ color: "#313e5a"
+ - state: pants-inhand-right
+ color: "#363636"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#d76b00"
+ - state: accent3-equipped-INNERCLOTHING
+ color: "#363636"
+ - state: accenthighlight-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#860000"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#363636"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#d76b00"
+ - state: shoesdark-equipped-INNERCLOTHING
+ color: "#363636"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitBrigmedic
+ name: corpsman envirosuit
+ description: An envirosuit assigned to corpsmen Plasmamen.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#486782"
+ - state: accent-icon
+ color: "#333333"
+ - state: accent2_chestonly-icon
+ color: "#3b3b3b"
+ - state: accenthighlight-icon
+ color: "#2f74b8"
+ - state: buttons-icon
+ color: "#b0bdca"
+ - state: clip-icon
+ color: "#860000"
+ - state: clip_right-icon
+ color: "#313e5a"
+ - state: pants-icon
+ color: "#3b3b3b"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#486782"
+ - state: accent-inhand-left
+ color: "#333333"
+ - state: accent2_chestonly-inhand-left
+ color: "#3b3b3b"
+ - state: accenthighlight-inhand-left
+ color: "#2f74b8"
+ - state: buttons-inhand-left
+ color: "#b0bdca"
+ - state: clip-inhand-left
+ color: "#860000"
+ - state: clip_right-inhand-left
+ color: "#313e5a"
+ - state: pants-inhand-left
+ color: "#3b3b3b"
+ right:
+ - state: inhand-right
+ color: "#486782"
+ - state: accent-inhand-right
+ color: "#333333"
+ - state: accent2_chestonly-inhand-right
+ color: "#3b3b3b"
+ - state: accenthighlight-inhand-right
+ color: "#2f74b8"
+ - state: buttons-inhand-right
+ color: "#b0bdca"
+ - state: clip-inhand-right
+ color: "#860000"
+ - state: clip_right-inhand-right
+ color: "#313e5a"
+ - state: pants-inhand-right
+ color: "#3b3b3b"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#486782"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#333333"
+ - state: accent2_chestonly-equipped-INNERCLOTHING
+ color: "#3b3b3b"
+ - state: accenthighlight-equipped-INNERCLOTHING
+ color: "#2f74b8"
+ - state: buttons-equipped-INNERCLOTHING
+ color: "#b0bdca"
+ - state: clip-equipped-INNERCLOTHING
+ color: "#860000"
+ - state: clip_right-equipped-INNERCLOTHING
+ color: "#313e5a"
+ - state: cuffs-equipped-INNERCLOTHING
+ color: "#bfcddb"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#3b3b3b"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#9ca7b3"
+ - state: shoesdark-equipped-INNERCLOTHING
+ color: "#3b3b3b"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bfcddb"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitNanotrasenRepresentative
+ name: nanotrasen representative envirosuit
+ description: A black envirosuit worn by officials.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#292929"
+ - state: accent3_chestonly-icon
+ color: "#266199"
+ - state: accent2-icon
+ color: "#ffce5b"
+ - state: buttons-icon
+ color: "#f3f5f4"
+ - state: belt-icon
+ color: "#87511b"
+ - state: beltbuckle-icon
+ color: "#969696"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#292929"
+ - state: accent3_chestonly-inhand-left
+ color: "#266199"
+ - state: accent2-inhand-left
+ color: "#ffce5b"
+ - state: buttons-inhand-left
+ color: "#f3f5f4"
+ - state: belt-inhand-left
+ color: "#87511b"
+ - state: beltbuckle-inhand-left
+ color: "#969696"
+ right:
+ - state: inhand-right
+ color: "#292929"
+ - state: accent3_chestonly-inhand-right
+ color: "#266199"
+ - state: accent2-inhand-right
+ color: "#ffce5b"
+ - state: buttons-inhand-right
+ color: "#f3f5f4"
+ - state: belt-inhand-right
+ color: "#87511b"
+ - state: beltbuckle-inhand-right
+ color: "#969696"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#292929"
+ - state: accent3_chestonly-equipped-INNERCLOTHING
+ color: "#266199"
+ - state: accent2-equipped-INNERCLOTHING
+ color: "#ffce5b"
+ - state: buttons-equipped-INNERCLOTHING
+ color: "#f3f5f4"
+ - state: cuffs-equipped-INNERCLOTHING
+ color: "#ffce5b"
+ - state: cuffs_upper-equipped-INNERCLOTHING
+ color: "#0057a8"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#87511b"
+ - state: beltbuckle-equipped-INNERCLOTHING
+ color: "#969696"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#266199"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#ffce5b"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitMagistrate
+ name: magistrate envirosuit
+ description: The envirosuit that doles out justice.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ebebeb"
+ - state: plaintop-icon
+ color: "#ebebeb"
+ - state: tie-icon
+ color: "#333333"
+ - state: tieclip-icon
+ color: "#e6b952"
+ - state: accent-icon
+ color: "#ffce5b"
+ - state: pants-icon
+ color: "#292929"
+ - state: belt-icon
+ color: "#634737"
+ - state: beltbuckle-icon
+ color: "#ffce5b"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ebebeb"
+ - state: plaintop-inhand-left
+ color: "#ebebeb"
+ - state: tie-inhand-left
+ color: "#333333"
+ - state: tieclip-inhand-left
+ color: "#e6b952"
+ - state: accent-inhand-left
+ color: "#ffce5b"
+ - state: pants-inhand-left
+ color: "#292929"
+ - state: belt-inhand-left
+ color: "#634737"
+ - state: beltbuckle-inhand-left
+ color: "#ffce5b"
+ right:
+ - state: inhand-right
+ color: "#ebebeb"
+ - state: plaintop-inhand-right
+ color: "#ebebeb"
+ - state: tie-inhand-right
+ color: "#333333"
+ - state: tieclip-inhand-right
+ color: "#e6b952"
+ - state: accent-inhand-right
+ color: "#ffce5b"
+ - state: pants-inhand-right
+ color: "#292929"
+ - state: belt-inhand-right
+ color: "#634737"
+ - state: beltbuckle-inhand-right
+ color: "#ffce5b"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ebebeb"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ebebeb"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#333333"
+ - state: tieclip-equipped-INNERCLOTHING
+ color: "#e6b952"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#ffce5b"
+ - state: cuffs-equipped-INNERCLOTHING
+ color: "#634737"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#634737"
+ - state: beltbuckle-equipped-INNERCLOTHING
+ color: "#ffce5b"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#ffce5b"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#634737"
+
+
+# The Tortured Enviroslacks Department (Skubman's Version)
+- type: entity
+ parent: ClothingUniformEnvirosuitBase
+ id: ClothingUniformEnvirosuitEnviroslacks
+ name: enviroslacks
+ description: The pet project of a particularly posh Plasmaman. Professional!
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Envirosuits/enviroslacks.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Envirosuits/enviroslacks.rsi
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksNegative
+ name: negative enviroslacks
+ description: The pet project of a particularly posh Plasmaman, this variant has inverted colors. Dapper!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3f3f3f"
+ - state: plaintop-icon
+ color: "#3f3f3f"
+ - state: tie-icon
+ color: "#a349a4"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: pants-icon
+ color: "#f2f2f2"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3f3f3f"
+ - state: plaintop-inhand-left
+ color: "#3f3f3f"
+ - state: tie-inhand-left
+ color: "#a349a4"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: pants-inhand-left
+ color: "#f2f2f2"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#3f3f3f"
+ - state: plaintop-inhand-right
+ color: "#3f3f3f"
+ - state: tie-inhand-right
+ color: "#a349a4"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: pants-inhand-right
+ color: "#f2f2f2"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#3f3f3f"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#3f3f3f"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#f2f2f2"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksColorRed
+ name: red enviroslacks
+ description: The pet project of a particularly posh Plasmaman, this variant comes with red accents. Fancy!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: tie-icon
+ color: "#99211f"
+ - state: accent-icon
+ color: "#99211f"
+ - state: pants-icon
+ color: "#292929"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: tie-inhand-left
+ color: "#99211f"
+ - state: accent-inhand-left
+ color: "#99211f"
+ - state: pants-inhand-left
+ color: "#292929"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: tie-inhand-right
+ color: "#99211f"
+ - state: accent-inhand-right
+ color: "#99211f"
+ - state: pants-inhand-right
+ color: "#292929"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#99211f"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#99211f"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#99211f"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksColorOrange
+ name: orange enviroslacks
+ description: The pet project of a particularly posh Plasmaman, this variant comes with orange accents. Zesty!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: tie-icon
+ color: "#c2680f"
+ - state: accent-icon
+ color: "#c2680f"
+ - state: pants-icon
+ color: "#292929"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: tie-inhand-left
+ color: "#c2680f"
+ - state: accent-inhand-left
+ color: "#c2680f"
+ - state: pants-inhand-left
+ color: "#292929"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: tie-inhand-right
+ color: "#c2680f"
+ - state: accent-inhand-right
+ color: "#c2680f"
+ - state: pants-inhand-right
+ color: "#292929"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#c2680f"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#c2680f"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#c2680f"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksColorGreen
+ name: green enviroslacks
+ description: The pet project of a particularly posh Plasmaman, this variant comes with green accents. Leafy!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: tie-icon
+ color: "#5b991f"
+ - state: accent-icon
+ color: "#5b991f"
+ - state: pants-icon
+ color: "#292929"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: tie-inhand-left
+ color: "#5b991f"
+ - state: accent-inhand-left
+ color: "#5b991f"
+ - state: pants-inhand-left
+ color: "#292929"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: tie-inhand-right
+ color: "#5b991f"
+ - state: accent-inhand-right
+ color: "#5b991f"
+ - state: pants-inhand-right
+ color: "#292929"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#5b991f"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#5b991f"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#5b991f"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksColorBlue
+ name: blue enviroslacks
+ description: The pet project of a particularly posh Plasmaman, this variant comes with blue accents. Cool!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: tie-icon
+ color: "#2b5c99"
+ - state: accent-icon
+ color: "#2b5c99"
+ - state: pants-icon
+ color: "#292929"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: tie-inhand-left
+ color: "#2b5c99"
+ - state: accent-inhand-left
+ color: "#2b5c99"
+ - state: pants-inhand-left
+ color: "#292929"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: tie-inhand-right
+ color: "#2b5c99"
+ - state: accent-inhand-right
+ color: "#2b5c99"
+ - state: pants-inhand-right
+ color: "#292929"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#2b5c99"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#2b5c99"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#2b5c99"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksColorBrown
+ name: brown enviroslacks
+ description: The pet project of a particularly posh Plasmaman, this variant has brown pants. Reminds you of dusty offices.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: tie-icon
+ color: "#a349a4"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: pants-icon
+ color: "#583f20"
+ - state: belt-icon
+ color: "#363636"
+ - state: beltbuckle_small-icon
+ color: "#3e3e3e"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: tie-inhand-left
+ color: "#a349a4"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: pants-inhand-left
+ color: "#583f20"
+ - state: belt-inhand-left
+ color: "#363636"
+ - state: beltbuckle_small-inhand-left
+ color: "#3e3e3e"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: tie-inhand-right
+ color: "#a349a4"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: pants-inhand-right
+ color: "#583f20"
+ - state: belt-inhand-right
+ color: "#363636"
+ - state: beltbuckle_small-inhand-right
+ color: "#3e3e3e"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#583f20"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#363636"
+ - state: beltbuckle_small-equipped-INNERCLOTHING
+ color: "#3e3e3e"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksMNK
+ name: MNK enviroslacks
+ description: The iconic enviroslacks, with MNK's signature monochrome aesthetic. Classic!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: tie-icon
+ color: "#363636"
+ - state: accent-icon
+ color: "#363636"
+ - state: pants-icon
+ color: "#292929"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: tie-inhand-left
+ color: "#363636"
+ - state: accent-inhand-left
+ color: "#363636"
+ - state: pants-inhand-left
+ color: "#292929"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: tie-inhand-right
+ color: "#363636"
+ - state: accent-inhand-right
+ color: "#363636"
+ - state: pants-inhand-right
+ color: "#292929"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#363636"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#363636"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#d6d6d6"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksMNKAlt
+ name: MNK enviroslacks
+ description: The iconic enviroslacks, with MNK's signature monochrome aesthetic. Noir!
+ suffix: Alternative
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3b3b3b"
+ - state: plaintop-icon
+ color: "#3b3b3b"
+ - state: tie-icon
+ color: "#d6d6d6"
+ - state: accent-icon
+ color: "#d6d6d6"
+ - state: pants-icon
+ color: "#f2f2f2"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3b3b3b"
+ - state: plaintop-inhand-left
+ color: "#3b3b3b"
+ - state: tie-inhand-left
+ color: "#d6d6d6"
+ - state: accent-inhand-left
+ color: "#d6d6d6"
+ - state: pants-inhand-left
+ color: "#f2f2f2"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#3b3b3b"
+ - state: plaintop-inhand-right
+ color: "#3b3b3b"
+ - state: tie-inhand-right
+ color: "#d6d6d6"
+ - state: accent-inhand-right
+ color: "#d6d6d6"
+ - state: pants-inhand-right
+ color: "#f2f2f2"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#3b3b3b"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#3b3b3b"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#d6d6d6"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#d6d6d6"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#f2f2f2"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#424242"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitEnviroslacksPsychologist
+ name: psychologist enviroslacks
+ description: The pet project of a particularly posh Plasmaman, this variant was made for the psychologist. Mind-boggling!
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: plaintop-icon
+ color: "#ffffff"
+ - state: tie-icon
+ color: "#5ba0cf"
+ - state: accent-icon
+ color: "#5ba0cf"
+ - state: pants-icon
+ color: "#292929"
+ - state: belt-icon
+ color: "#737373"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: plaintop-inhand-left
+ color: "#ffffff"
+ - state: tie-inhand-left
+ color: "#5ba0cf"
+ - state: accent-inhand-left
+ color: "#5ba0cf"
+ - state: pants-inhand-left
+ color: "#292929"
+ - state: belt-inhand-left
+ color: "#737373"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: plaintop-inhand-right
+ color: "#ffffff"
+ - state: tie-inhand-right
+ color: "#5ba0cf"
+ - state: accent-inhand-right
+ color: "#5ba0cf"
+ - state: pants-inhand-right
+ color: "#292929"
+ - state: belt-inhand-right
+ color: "#737373"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: plaintop-equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: tie-equipped-INNERCLOTHING
+ color: "#5ba0cf"
+ - state: accentalt-equipped-INNERCLOTHING
+ color: "#5ba0cf"
+ - state: pants-equipped-INNERCLOTHING
+ color: "#292929"
+ - state: belt-equipped-INNERCLOTHING
+ color: "#737373"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#5ba0cf"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+# Color envirosuits
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorWhite
+ name: white envirosuit
+ description: A generic white jumpsuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffffff"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffffff"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#ffffff"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffffff"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorGrey
+ name: grey envirosuit
+ description: A tasteful grey envirosuit that reminds you of the good old days.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#b3b3b3"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#b3b3b3"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#b3b3b3"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#b3b3b3"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorBlack
+ name: black envirosuit
+ description: A generic black envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3f3f3f"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3f3f3f"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#3f3f3f"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#3f3f3f"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorRed
+ name: red envirosuit
+ description: A dark green envirosuit.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#d1423f"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#d1423f"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#d1423f"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#d1423f"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorGreen
+ name: green envirosuit
+ description: A generic green envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#9ed63a"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#9ed63a"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#9ed63a"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#9ed63a"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorDarkGreen
+ name: dark green envirosuit
+ description: A generic dark green envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#79CC26"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#79CC26"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#79CC26"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#79CC26"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorBlue
+ name: blue envirosuit
+ description: A generic blue envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#52aecc"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#52aecc"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#52aecc"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#52aecc"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorDarkBlue
+ name: dark blue envirosuit
+ description: A generic dark blue envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#3285ba"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#3285ba"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#3285ba"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#3285ba"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorTeal
+ name: teal envirosuit
+ description: A generic teal envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#77f3b7"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#77f3b7"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#77f3b7"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#77f3b7"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorMaroon
+ name: maroon envirosuit
+ description: A generic maroon envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#cc295f"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#cc295f"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#cc295f"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#cc295f"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorPink
+ name: pink envirosuit
+ description: >-
+ "Plasmamen can't slay" and other jokes you can tell yourself.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ff8cff"
+ - state: accent-icon
+ color: "#8b3e8c"
+ - state: corneraccent-icon
+ color: "#8b3e8c"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ff8cff"
+ - state: accent-inhand-left
+ color: "#8b3e8c"
+ - state: corneraccent-inhand-left
+ color: "#8b3e8c"
+ right:
+ - state: inhand-right
+ color: "#ff8cff"
+ - state: accent-inhand-right
+ color: "#8b3e8c"
+ - state: corneraccent-inhand-right
+ color: "#8b3e8c"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ff8cff"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#8b3e8c"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#8b3e8c"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#8b3e8c"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorYellow
+ name: yellow envirosuit
+ description: A generic yellow envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ffe14d"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ffe14d"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#ffe14d"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ffe14d"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorPurple
+ name: purple envirosuit
+ description: A generic purple envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#9f70cc"
+ - state: accent-icon
+ color: "#843b85"
+ - state: corneraccent-icon
+ color: "#843b85"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#9f70cc"
+ - state: accent-inhand-left
+ color: "#843b85"
+ - state: corneraccent-inhand-left
+ color: "#843b85"
+ right:
+ - state: inhand-right
+ color: "#9f70cc"
+ - state: accent-inhand-right
+ color: "#843b85"
+ - state: corneraccent-inhand-right
+ color: "#843b85"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#9f70cc"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#843b85"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#843b85"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#843b85"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorOrange
+ name: orange envirosuit
+ description: Don't wear this near paranoid security officers.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#ff8c19"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#ff8c19"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#ff8c19"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#ff8c19"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorLightBrown
+ name: light brown envirosuit
+ description: A generic light brown envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#a17229"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#a17229"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#a17229"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#a17229"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
+
+- type: entity
+ parent: ClothingUniformEnvirosuitCustomBase
+ id: ClothingUniformEnvirosuitColorBrown
+ name: brown envirosuit
+ description: A generic brown envirosuit with no rank markings.
+ components:
+ - type: Sprite
+ layers:
+ - state: icon
+ color: "#543e1b"
+ - state: accent-icon
+ color: "#a349a4"
+ - state: corneraccent-icon
+ color: "#a349a4"
+ - type: Item
+ inhandVisuals:
+ left:
+ - state: inhand-left
+ color: "#543e1b"
+ - state: accent-inhand-left
+ color: "#a349a4"
+ - state: corneraccent-inhand-left
+ color: "#a349a4"
+ right:
+ - state: inhand-right
+ color: "#543e1b"
+ - state: accent-inhand-right
+ color: "#a349a4"
+ - state: corneraccent-inhand-right
+ color: "#a349a4"
+ - type: Clothing
+ clothingVisuals:
+ jumpsuit:
+ - state: equipped-INNERCLOTHING
+ color: "#543e1b"
+ - state: accent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: loweraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: corneraccent-equipped-INNERCLOTHING
+ color: "#a349a4"
+ - state: soles-equipped-INNERCLOTHING
+ color: "#bababa"
diff --git a/Resources/Prototypes/Entities/Effects/weapon_arc.yml b/Resources/Prototypes/Entities/Effects/weapon_arc.yml
index 0f3fab0e8789..556347f0d9c9 100644
--- a/Resources/Prototypes/Entities/Effects/weapon_arc.yml
+++ b/Resources/Prototypes/Entities/Effects/weapon_arc.yml
@@ -127,3 +127,29 @@
state: smash
- type: TimedDespawn
lifetime: 0.299
+
+- type: entity
+ id: WeaponArcPurplePunch # Not inheriting so we don't have EffectVisuals to delete the entity
+ categories: [ HideSpawnMenu ] # on LightFade animation complete, which causes a
+ components: # "Predicting the queued deletion of a networked entity" error on tests.
+ - type: Sprite
+ sprite: Effects/arcs.rsi
+ layers:
+ - state: punch
+ color: "#ff80f4"
+ drawdepth: Effects
+ - type: WeaponArcVisuals
+ fadeOut: false
+ - type: TimedDespawn
+ lifetime: 0.549
+ - type: PointLight
+ radius: 1.13
+ energy: 50
+ color: "#ff11d5"
+ netsync: false
+ - type: LightFade
+ rampUpDuration: 0.1
+ duration: 0.449
+ - type: Tag
+ tags:
+ - HideContextMenu
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml
index 794d0fb90c71..90ea582271bc 100644
--- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml
+++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml
@@ -319,6 +319,12 @@
id: NitrogenTankFilled
- !type:EntSelector
id: DoubleEmergencyNitrogenTankFilled
+ - !type:GroupSelector
+ children:
+ - !type:EntSelector
+ id: PlasmaTankFilled
+ - !type:EntSelector
+ id: DoubleEmergencyPlasmaTankFilled
- !type:EntSelector
id: EmergencyFunnyOxygenTankFilled
weight: 0.5
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml
index c304e9c53140..7ecca4c59ad8 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml
@@ -298,7 +298,7 @@
id: GauzeMothBlindfold
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -312,7 +312,7 @@
id: GauzeMothShoulder
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -326,7 +326,7 @@
id: GauzeMothStomach
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -340,7 +340,7 @@
id: GauzeMothLeftEyePatch
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -354,7 +354,7 @@
id: GauzeMothLeftEyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -368,7 +368,7 @@
id: GauzeMothRightEyePatch
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -382,7 +382,7 @@
id: GauzeMothRightEyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -396,7 +396,7 @@
id: GauzeMothUpperArmRight
bodyPart: RArm
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -410,7 +410,7 @@
id: GauzeMothUpperArmLeft
bodyPart: LArm
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -424,7 +424,7 @@
id: GauzeMothUpperLegRight
bodyPart: RLeg
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -438,7 +438,7 @@
id: GauzeMothUpperLegLeft
bodyPart: LLeg
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -452,7 +452,7 @@
id: GauzeMothLowerLegRight
bodyPart: RFoot
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -466,7 +466,7 @@
id: GauzeMothLowerLegLeft
bodyPart: LFoot
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml
index 5aaf5d4870fb..304726411b1b 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml
@@ -114,7 +114,7 @@
id: TattooEyeRight
bodyPart: Eyes
markingCategory: Head
- speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Lamia] # Delta V - Felinid, Oni, Harpy
+ speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Lamia, Plasmaman] # Delta V - Felinid, Oni, Harpy
coloring:
default:
type:
@@ -128,7 +128,7 @@
id: TattooEyeLeft
bodyPart: Eyes
markingCategory: Head
- speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Lamia] # Delta V - Felinid, Oni, Harpy
+ speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Lamia, Plasmaman] # Delta V - Felinid, Oni, Harpy
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Player/plasmaman.yml b/Resources/Prototypes/Entities/Mobs/Player/plasmaman.yml
new file mode 100644
index 000000000000..7fa3bf2f8692
--- /dev/null
+++ b/Resources/Prototypes/Entities/Mobs/Player/plasmaman.yml
@@ -0,0 +1,5 @@
+- type: entity
+ save: false
+ name: Urist McPlasma
+ parent: BaseMobPlasmaman
+ id: MobPlasmaman
diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml
index bb27e46ba472..b799482b5d0d 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -312,6 +312,11 @@
heatDamage:
types:
Heat: 1.5 #per second, scales with temperature & other constants
+ - type: TemperatureSpeed
+ thresholds:
+ 293: 0.8
+ 280: 0.6
+ 260: 0.4
- type: ThermalRegulator
metabolismHeat: 800
radiatedHeat: 100
diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml
index 721724460cb6..86d8872e3ca8 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml
@@ -68,6 +68,11 @@
heatDamage:
types:
Heat : 3 #per second, scales with temperature & other constants
+ - type: TemperatureSpeed
+ thresholds:
+ 289: 0.8
+ 275: 0.6
+ 250: 0.4
- type: Sprite # sprite again because we want different layer ordering
noRot: true
drawdepth: Mobs
diff --git a/Resources/Prototypes/Entities/Mobs/Species/plasmaman.yml b/Resources/Prototypes/Entities/Mobs/Species/plasmaman.yml
new file mode 100644
index 000000000000..a79ec0bd10d9
--- /dev/null
+++ b/Resources/Prototypes/Entities/Mobs/Species/plasmaman.yml
@@ -0,0 +1,156 @@
+- type: entity
+ parent: BaseMobSpeciesOrganic
+ id: BaseMobPlasmaman
+ name: Urist McPlasma
+ abstract: true
+ components:
+ - type: Icon
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: full
+ - type: Sprite
+ layers:
+ - map: [ "enum.HumanoidVisualLayers.Chest" ]
+ - map: [ "enum.HumanoidVisualLayers.Head" ]
+ - map: [ "enum.HumanoidVisualLayers.Snout" ]
+ - map: [ "enum.HumanoidVisualLayers.Eyes" ]
+ - map: [ "enum.HumanoidVisualLayers.Face" ]
+ - map: [ "enum.HumanoidVisualLayers.RArm" ]
+ - map: [ "enum.HumanoidVisualLayers.LArm" ]
+ - map: [ "enum.HumanoidVisualLayers.RLeg" ]
+ - map: [ "enum.HumanoidVisualLayers.LLeg" ]
+ - shader: StencilClear
+ sprite: Mobs/Species/Human/parts.rsi
+ state: l_leg
+ - shader: StencilMask
+ map: ["enum.HumanoidVisualLayers.StencilMask"]
+ sprite: Mobs/Customization/masking_helpers.rsi
+ state: unisex_full
+ visible: false
+ - map: ["enum.HumanoidVisualLayers.LFoot"]
+ - map: ["enum.HumanoidVisualLayers.RFoot"]
+ - map: ["jumpsuit"] # jumpsuit after foot to show envirosuit shoes
+ - map: ["enum.HumanoidVisualLayers.LHand"]
+ - map: ["enum.HumanoidVisualLayers.RHand"]
+ - map: [ "gloves" ]
+ - map: [ "shoes" ]
+ - map: [ "ears" ]
+ - map: [ "innerBelt" ]
+ - map: [ "innerNeck" ]
+ - map: [ "outerClothing" ]
+ - map: [ "eyes" ]
+ - map: [ "belt" ]
+ - map: [ "id" ]
+ - map: [ "neck" ]
+ - map: [ "back" ]
+ - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
+ - map: [ "enum.HumanoidVisualLayers.Hair" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
+ - map: [ "enum.HumanoidVisualLayers.Tail" ]
+ - map: [ "mask" ]
+ - map: [ "head" ]
+ - map: [ "pocket1" ]
+ - map: [ "pocket2" ]
+ - map: ["enum.HumanoidVisualLayers.Handcuffs"]
+ color: "#ffffff"
+ sprite: Objects/Misc/handcuffs.rsi
+ state: body-overlay-2
+ visible: false
+ - map: [ "clownedon" ] # Dynamically generated
+ sprite: "Effects/creampie.rsi"
+ state: "creampie_human"
+ visible: false
+ - type: Carriable
+ - type: Body
+ prototype: Plasmaman
+ requiredLegs: 2
+ gibSound: /Audio/Effects/bone_rattle.ogg
+ - type: Bloodstream
+ bloodlossThreshold: 0
+ bleedReductionAmount: 0
+ maxBleedAmount: 0
+ bloodlossDamage:
+ types:
+ Blunt: 0
+ bloodlossHealDamage:
+ types:
+ Blunt: 0
+ bloodRefreshAmount: 0
+ bloodRegenerationHunger: 0
+ bloodRegenerationThirst: 0
+ bloodMaxVolume: 0
+ - type: Damageable
+ damageModifierSet: Plasmaman
+ - type: DamageVisuals
+ damageOverlayGroups:
+ Brute:
+ sprite: Mobs/Effects/brute_damage.rsi
+ color: "#555555AA"
+ Burn:
+ sprite: Mobs/Effects/burn_damage.rsi
+ - type: MeleeWeapon
+ soundHit:
+ collection: FirePunch
+ animation: WeaponArcPurplePunch
+ damage:
+ types: # oooh scarier extra damage~
+ Heat: 5
+ Blunt: 2.25
+ - type: DamageOnHit
+ damage:
+ types:
+ Heat: 1
+ targetParts: [ RightHand, LeftHand ]
+ - type: Speech
+ speechVerb: Skeleton
+ - type: Vocal
+ sounds:
+ Male: UnisexPlasmaman
+ Female: UnisexPlasmaman
+ Unsexed: UnisexPlasmaman
+ - type: Butcherable
+ butcheringType: Spike
+ spawned:
+ - id: SheetPlasma1
+ amount: 8
+ - type: Inventory
+ templateId: plasmaman
+ - type: Temperature
+ heatDamageThreshold: 313 # 40 celsius, -12 from base heat damage threshold
+ currentTemperature: 270.15 # -3 celsius
+ specificHeat: 46
+ coldDamage:
+ types:
+ Cold: 0
+ heatDamage:
+ types:
+ Heat: 3
+ - type: ThermalRegulator
+ normalBodyTemperature: 270.15
+ - type: Flammable
+ firestackFade: -0.05
+ - type: HumanoidAppearance
+ species: Plasmaman
+ hideLayersOnEquip:
+ - Hair
+ - Snout
+ - type: TypingIndicator
+ proto: plasmaman
+ - type: LanguageKnowledge
+ speaks:
+ - TauCetiBasic
+ - Calcic
+ understands:
+ - TauCetiBasic
+ - Calcic
+ - type: FootPrints
+
+- type: entity
+ parent: BaseSpeciesDummy
+ id: MobPlasmamanDummy
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: HumanoidAppearance
+ species: Plasmaman
+ - type: Inventory
+ templateId: plasmaman
diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
index 49716a058039..1564fc78ecf7 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
@@ -58,6 +58,11 @@
heatDamage:
types:
Heat : 1.5 #per second, scales with temperature & other constants
+ - type: TemperatureSpeed
+ thresholds:
+ 301: 0.8
+ 295: 0.6
+ 285: 0.4
- type: Wagging
- type: LanguageKnowledge
speaks:
diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml
index 5f9812f4909a..60606a92fc9c 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml
@@ -103,6 +103,15 @@
probability: 0.5
- type: FireVisuals
alternateState: Standing
+ - type: TypingIndicator
+ proto: skeleton
+ - type: LanguageKnowledge
+ speaks:
+ - TauCetiBasic
+ - Calcic
+ understands:
+ - TauCetiBasic
+ - Calcic
- type: FootPrints
- type: LayingDown
diff --git a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml
index db9d155db108..9bca76581569 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml
@@ -169,3 +169,18 @@
- Universal
spoken:
- Universal
+
+- type: entity
+ parent: BaseSubdermalImplant
+ id: ChittinTranslatorImplant
+ name: chittin translator implant
+ description: An implant giving the ability to understand and speak Chittin.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: TranslatorImplant
+ understood:
+ - Chittin
+ spoken:
+ - Chittin
+ requires:
+ - TauCetiBasic
diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml
index 87e8078aa1d7..04b999315325 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/translators.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml
@@ -254,4 +254,21 @@
- Azaziba
requires:
- Draconic
- - Azaziba
\ No newline at end of file
+ - Azaziba
+
+- type: entity
+ id: ChittinTranslator
+ parent: [ TranslatorPoweredBase ]
+ name: Chittin translator
+ description: Translates speech between Chittin and Tau-Ceti Basic. For talking to Chitinids!
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - TauCetiBasic
+ - Chittin
+ understood:
+ - TauCetiBasic
+ - Chittin
+ requires:
+ - TauCetiBasic
+ - Chittin
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Objects/Misc/extinguisher_refill.yml b/Resources/Prototypes/Entities/Objects/Misc/extinguisher_refill.yml
new file mode 100644
index 000000000000..b595862628cd
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Misc/extinguisher_refill.yml
@@ -0,0 +1,34 @@
+- type: entity
+ parent: BaseItem
+ id: EnvirosuitExtinguisherRefill
+ name: envirosuit extinguisher refill
+ description: A cartridge loaded with a compressed extinguisher mix, used to refill the self-extinguisher on plasma envirosuits.
+ components:
+ - type: Sprite
+ sprite: Objects/Misc/extinguisher_refill.rsi
+ layers:
+ - state: icon
+ - type: Item
+ sprite: Objects/Misc/extinguisher_refill.rsi
+ size: Small
+ - type: SelfExtinguisherRefill
+ refillAmount: 10
+ - type: GuideHelp
+ guides: [ Plasmaman ]
+ - type: MeleeWeapon # Same values as double emergency tank
+ attackRate: 0.9
+ wideAnimationRotation: 45
+ range: 1.75
+ damage:
+ types:
+ Blunt: 7.5
+ bluntStaminaDamageFactor: 2.5
+ heavyRateModifier: 1.25
+ heavyDamageBaseModifier: 1.5
+ heavyStaminaCost: 10
+ maxTargets: 3
+ angle: 100
+ soundHit:
+ path: /Audio/Weapons/smash.ogg
+ - type: DamageOtherOnHit
+ staminaCost: 5
diff --git a/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml
index c0a1432688d1..5202719d1339 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml
@@ -98,4 +98,12 @@
name: universal translator implant
components:
- type: Implanter
- implant: UniversalTranslatorImplant
\ No newline at end of file
+ implant: UniversalTranslatorImplant
+
+- type: entity
+ id: ChittinTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: chittin translator implant
+ components:
+ - type: Implanter
+ implant: ChittinTranslatorImplant
diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml
index 4db76a979689..0edf59065e61 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml
@@ -134,6 +134,19 @@
- type: Clothing
sprite: Objects/Tanks/emergency_red.rsi
+- type: entity
+ parent: EmergencyOxygenTank
+ id: EmergencyPlasmaTank
+ name: emergency plasma tank
+ description: An easily portable tank for emergencies. Contains very little plasma, rated for survival use only.
+ components:
+ - type: Sprite
+ sprite: Objects/Tanks/emergency_red.rsi # TODO: emergency plasma tank sprite
+ - type: Item
+ sprite: Objects/Tanks/emergency_red.rsi
+ - type: Clothing
+ sprite: Objects/Tanks/emergency_red.rsi
+
- type: entity
parent: EmergencyOxygenTank
id: ExtendedEmergencyOxygenTank
@@ -164,6 +177,19 @@
- type: Clothing
sprite: Objects/Tanks/emergency_extended_red.rsi
+- type: entity
+ parent: ExtendedEmergencyOxygenTank
+ id: ExtendedEmergencyPlasmaTank
+ name: extended-capacity emergency plasma tank
+ description: An emergency tank with extended capacity. Technically rated for prolonged use.
+ components:
+ - type: Sprite
+ sprite: Objects/Tanks/emergency_extended_red.rsi # TODO: extended-capacity emergency plasma tank sprite
+ - type: Item
+ sprite: Objects/Tanks/emergency_extended_red.rsi
+ - type: Clothing
+ sprite: Objects/Tanks/emergency_extended_red.rsi
+
- type: entity
parent: ExtendedEmergencyOxygenTank
id: DoubleEmergencyOxygenTank
@@ -201,6 +227,19 @@
- type: Clothing
sprite: Objects/Tanks/emergency_double_red.rsi
+- type: entity
+ parent: DoubleEmergencyOxygenTank
+ id: DoubleEmergencyPlasmaTank
+ name: plasma internals tank
+ description: A tank of plasma designed to be internals for Plasmamen.
+ components:
+ - type: Sprite
+ sprite: Objects/Tanks/plasmaman.rsi
+ - type: Item
+ sprite: Objects/Tanks/plasmaman.rsi
+ - type: Clothing
+ sprite: Objects/Tanks/plasmaman.rsi
+
- type: entity
parent: EmergencyOxygenTank
id: EmergencyFunnyOxygenTank
@@ -243,7 +282,7 @@
parent: GasTankBase
id: PlasmaTank
name: plasma tank
- description: Contains dangerous plasma. Do not inhale. Extremely flammable.
+ description: Contains dangerous plasma. Do not inhale, unless you're a plasmaman. Extremely flammable.
components:
- type: Sprite
sprite: Objects/Tanks/plasma.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
index fcb41ceef39b..4cea55becfc5 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
@@ -187,6 +187,7 @@
- SyndieSet
- SleeperSet
- CommunicatorSet
+ - CommunicatorSetPlasmaman
- SmugglerSet
- type: ActivatableUI
key: enum.ThiefBackpackUIKey.Key
diff --git a/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml b/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml
index d78ed1182cd7..e3c740cf95e8 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml
@@ -86,6 +86,7 @@
- type: SolutionContainerManager
solutions:
buffer: {}
+ pillBuffer: {}
- type: DumpableSolution
solution: buffer
unlimited: true
diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
index c40f913a586a..eba09008baec 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -1202,6 +1202,7 @@
- ChemicalPayload # Nyano
- SyringeCryostasis
- ClothingEyesNightVisionMedicalGoggles
+ - EnvirosuitExtinguisherRefill
# Shitmed Change
- EnergyScalpel
- EnergyCautery
diff --git a/Resources/Prototypes/EstacaoPirata/Catalog/uplink_catalog.yml b/Resources/Prototypes/EstacaoPirata/Catalog/uplink_catalog.yml
new file mode 100644
index 000000000000..c972f35f383a
--- /dev/null
+++ b/Resources/Prototypes/EstacaoPirata/Catalog/uplink_catalog.yml
@@ -0,0 +1,9 @@
+- type: listing
+ id: UplinkSyndicateDeck
+ name: uplink-syndicate-deck-name
+ description: uplink-syndicate-deck-desc
+ productEntity: CardBoxSyndicate
+ cost:
+ Telecrystal: 1
+ categories:
+ - UplinkPointless
diff --git a/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/black_cards.yml b/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/black_cards.yml
new file mode 100644
index 000000000000..eddc820e2140
--- /dev/null
+++ b/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/black_cards.yml
@@ -0,0 +1,780 @@
+- type: entity
+ parent: [ BoxCardboard, BaseBagOpenClose ]
+ id: CardBoxBase
+ name: deck box
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Item
+ size: Small
+ shape:
+ - 0,0,1,1
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ layers:
+ - state: black_box
+ - state: black_box_open
+ map: [ "openLayer" ]
+ visible: false
+ - type: Storage
+ maxItemSize: Normal
+ grid:
+ - 0,0,1,1
+ whitelist:
+ components:
+ - CardDeck
+ - type: OpenTriggeredStorageFill
+ contents:
+ - id: CardDeckBase
+ amount: 1
+ - type: Appearance
+
+# Frontier: base stack for card stack component
+- type: entity
+ parent: [BaseItem]
+ id: CardStackBase
+ name: stack of cards
+ abstract: true
+ components:
+ - type: Item
+ size: Small
+ - type: CardStack
+ - type: StripMenuHidden
+ - type: ContainerContainer # Frontier
+ containers: # Frontier
+ cardstack-container: !type:Container # Frontier
+# End Frontier
+
+- type: entity
+ parent: CardStackBase
+ id: CardHandBase
+ categories: [ HideSpawnMenu ]
+ name: hand of cards
+ components:
+ - type: CardHand
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: singlecard_down_black
+ - type: UserInterface
+ interfaces:
+ enum.CardUiKey.Key:
+ type: CardHandMenuBoundUserInterface
+ # - type: ActivatableUI # Frontier
+ # key: enum.CardUiKey.Key # Frontier
+
+- type: entity
+ parent: CardStackBase
+ id: CardDeckBase
+ categories: [ HideSpawnMenu ]
+ name: deck of cards
+ components:
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: deck_black_full
+ - type: Item
+ size: Normal
+ - type: CardDeck
+
+
+- type: entity
+ parent: CardBoxBase
+ id: CardBoxBlack
+ name: black deck box
+ components:
+ - type: Item
+ size: Small
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ layers:
+ - state: black_box
+ - state: black_box_open
+ map: [ "openLayer" ]
+ visible: false
+ - type: OpenTriggeredStorageFill
+ contents:
+ - id: CardDeckBlack
+ amount: 1
+
+- type: entity
+ parent: CardDeckBase
+ id: CardDeckBlack
+ name: deck of cards
+ components:
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: deck_black_full
+ - type: CardStack
+ initialContent:
+ # Clubs
+ - CardScAceOfClubsBlack
+ - CardSc2OfClubsBlack
+ - CardSc3OfClubsBlack
+ - CardSc4OfClubsBlack
+ - CardSc5OfClubsBlack
+ - CardSc6OfClubsBlack
+ - CardSc7OfClubsBlack
+ - CardSc8OfClubsBlack
+ - CardSc9OfClubsBlack
+ - CardSc10OfClubsBlack
+ - CardScJackOfClubsBlack
+ - CardScQueenOfClubsBlack
+ - CardScKingOfClubsBlack
+ # Diamonds
+ - CardScAceOfDiamondsBlack
+ - CardSc2OfDiamondsBlack
+ - CardSc3OfDiamondsBlack
+ - CardSc4OfDiamondsBlack
+ - CardSc5OfDiamondsBlack
+ - CardSc6OfDiamondsBlack
+ - CardSc7OfDiamondsBlack
+ - CardSc8OfDiamondsBlack
+ - CardSc9OfDiamondsBlack
+ - CardSc10OfDiamondsBlack
+ - CardScJackOfDiamondsBlack
+ - CardScQueenOfDiamondsBlack
+ - CardScKingOfDiamondsBlack
+ # Hearts
+ - CardScAceOfHeartsBlack
+ - CardSc2OfHeartsBlack
+ - CardSc3OfHeartsBlack
+ - CardSc4OfHeartsBlack
+ - CardSc5OfHeartsBlack
+ - CardSc6OfHeartsBlack
+ - CardSc7OfHeartsBlack
+ - CardSc8OfHeartsBlack
+ - CardSc9OfHeartsBlack
+ - CardSc10OfHeartsBlack
+ - CardScJackOfHeartsBlack
+ - CardScQueenOfHeartsBlack
+ - CardScKingOfHeartsBlack
+ # Spades
+ - CardScAceOfSpadesBlack
+ - CardSc2OfSpadesBlack
+ - CardSc3OfSpadesBlack
+ - CardSc4OfSpadesBlack
+ - CardSc5OfSpadesBlack
+ - CardSc6OfSpadesBlack
+ - CardSc7OfSpadesBlack
+ - CardSc8OfSpadesBlack
+ - CardSc9OfSpadesBlack
+ - CardSc10OfSpadesBlack
+ - CardScJackOfSpadesBlack
+ - CardScQueenOfSpadesBlack
+ - CardScKingOfSpadesBlack
+ # Joker
+ - CardScJokerBlack
+
+- type: entity
+ parent: BaseItem
+ id: CardBase
+ name: card
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: EmitSoundOnLand
+ sound:
+ collection: cardShove
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: singlecard_down_black
+ - type: Rotatable
+ - type: Item
+ size: Small
+ - type: UseDelay
+ delay: 0.5
+ - type: Card
+ backSprite:
+ - sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: singlecard_down_black
+ flipped: true
+ - type: StripMenuHidden
+
+# region Black Cards
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-2-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-3-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-4-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-5-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-6-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-7-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-8-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-9-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-10-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-ace-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Clubs_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-jack-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-king-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-queen-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Clubs_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-jack-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-queen-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-king-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-ace-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-2-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-3-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-4-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-5-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-6-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-7-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-8-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-9-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-10-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Diamonds_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-2-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-3-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-4-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-5-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-6-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-7-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-8-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-9-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-10-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-king-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-queen-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-jack-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-ace-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Hearts_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-2-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-3-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-4-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-5-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-6-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-7-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-8-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-9-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Spades_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-10-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-king-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-queen-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-jack-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-ace-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJokerBlack
+ components:
+ - type: Card
+ name: card-sc-joker
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: black_joker
+
+# endregion Black Cards
diff --git a/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/nt_cards.yml b/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/nt_cards.yml
new file mode 100644
index 000000000000..be802ea5ee3c
--- /dev/null
+++ b/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/nt_cards.yml
@@ -0,0 +1,690 @@
+
+- type: entity
+ parent: CardBase
+ id: CardBaseNanotrasen
+ name: card
+ components:
+ - type: Card
+ backSprite:
+ - sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: singlecard_down_nanotrasen
+
+- type: entity
+ parent: CardBoxBase
+ id: CardBoxNanotrasen
+ name: nanotrasen deck box
+ components:
+ - type: Item
+ size: Small
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ layers:
+ - state: nanotrasen_box
+ - state: nanotrasen_box_open
+ map: [ "openLayer" ]
+ visible: false
+ - type: OpenTriggeredStorageFill
+ contents:
+ - id: CardDeckNanotrasen
+ amount: 1
+
+- type: entity
+ parent: CardDeckBase
+ id: CardDeckNanotrasen
+ name: deck of cards
+ components:
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: deck_nanotrasen_full
+ - type: CardStack
+ initialContent:
+ # Clubs
+ - CardScAceOfClubsNanotrasen
+ - CardSc2OfClubsNanotrasen
+ - CardSc3OfClubsNanotrasen
+ - CardSc4OfClubsNanotrasen
+ - CardSc5OfClubsNanotrasen
+ - CardSc6OfClubsNanotrasen
+ - CardSc7OfClubsNanotrasen
+ - CardSc8OfClubsNanotrasen
+ - CardSc9OfClubsNanotrasen
+ - CardSc10OfClubsNanotrasen
+ - CardScJackOfClubsNanotrasen
+ - CardScQueenOfClubsNanotrasen
+ - CardScKingOfClubsNanotrasen
+ # Diamonds
+ - CardScAceOfDiamondsNanotrasen
+ - CardSc2OfDiamondsNanotrasen
+ - CardSc3OfDiamondsNanotrasen
+ - CardSc4OfDiamondsNanotrasen
+ - CardSc5OfDiamondsNanotrasen
+ - CardSc6OfDiamondsNanotrasen
+ - CardSc7OfDiamondsNanotrasen
+ - CardSc8OfDiamondsNanotrasen
+ - CardSc9OfDiamondsNanotrasen
+ - CardSc10OfDiamondsNanotrasen
+ - CardScJackOfDiamondsNanotrasen
+ - CardScQueenOfDiamondsNanotrasen
+ - CardScKingOfDiamondsNanotrasen
+ # Hearts
+ - CardScAceOfHeartsNanotrasen
+ - CardSc2OfHeartsNanotrasen
+ - CardSc3OfHeartsNanotrasen
+ - CardSc4OfHeartsNanotrasen
+ - CardSc5OfHeartsNanotrasen
+ - CardSc6OfHeartsNanotrasen
+ - CardSc7OfHeartsNanotrasen
+ - CardSc8OfHeartsNanotrasen
+ - CardSc9OfHeartsNanotrasen
+ - CardSc10OfHeartsNanotrasen
+ - CardScJackOfHeartsNanotrasen
+ - CardScQueenOfHeartsNanotrasen
+ - CardScKingOfHeartsNanotrasen
+ # Spades
+ - CardScAceOfSpadesNanotrasen
+ - CardSc2OfSpadesNanotrasen
+ - CardSc3OfSpadesNanotrasen
+ - CardSc4OfSpadesNanotrasen
+ - CardSc5OfSpadesNanotrasen
+ - CardSc6OfSpadesNanotrasen
+ - CardSc7OfSpadesNanotrasen
+ - CardSc8OfSpadesNanotrasen
+ - CardSc9OfSpadesNanotrasen
+ - CardSc10OfSpadesNanotrasen
+ - CardScJackOfSpadesNanotrasen
+ - CardScQueenOfSpadesNanotrasen
+ - CardScKingOfSpadesNanotrasen
+ # Joker
+ - CardScJokerNanotrasen
+
+# region Nanotrasen Cards
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-2-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-3-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-4-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-5-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-6-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-7-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-8-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-9-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-10-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-ace-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Clubs_nanotrasen
+
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-jack-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-king-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Clubs_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfClubsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-queen-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Clubs_nanotrasen
+
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-jack-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-queen-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-king-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-ace-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-2-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-3-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-4-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-5-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-6-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-7-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-8-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-9-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Diamonds_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfDiamondsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-10-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Diamonds_nanotrasen
+
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-2-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-3-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-4-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-5-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-6-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-7-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-8-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-9-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-10-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-king-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-queen-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-jack-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Hearts_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfHeartsNanotrasen
+ components:
+ - type: Card
+ name: card-sc-ace-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Hearts_nanotrasen
+
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-2-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-3-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-4-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-5-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-6-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-7-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-8-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-9-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Spades_nanotrasen
+
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-10-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-king-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-queen-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-jack-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfSpadesNanotrasen
+ components:
+ - type: Card
+ name: card-sc-ace-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Spades_nanotrasen
+
+- type: entity
+ parent: CardBaseNanotrasen
+ categories: [ HideSpawnMenu ]
+ id: CardScJokerNanotrasen
+ components:
+ - type: Card
+ name: card-sc-joker
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: nanotrasen_joker
+
+# endregion Nanotrasen Cards
diff --git a/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/syndicate_cards.yml b/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/syndicate_cards.yml
new file mode 100644
index 000000000000..9f8f93cb6a1c
--- /dev/null
+++ b/Resources/Prototypes/EstacaoPirata/Entities/Objects/Misc/syndicate_cards.yml
@@ -0,0 +1,690 @@
+
+- type: entity
+ parent: CardBase
+ id: CardBaseSyndicate
+ name: card
+ components:
+ - type: Card
+ backSprite:
+ - sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: singlecard_down_syndicate
+
+- type: entity
+ parent: CardBoxBase
+ id: CardBoxSyndicate
+ name: syndicate deck box
+ components:
+ - type: Item
+ size: Small
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ layers:
+ - state: syndicate_box
+ - state: syndicate_box_open
+ map: [ "openLayer" ]
+ visible: false
+ - type: OpenTriggeredStorageFill
+ contents:
+ - id: CardDeckSyndicate
+ amount: 1
+
+- type: entity
+ parent: CardDeckBase
+ id: CardDeckSyndicate
+ name: deck of cards
+ components:
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: deck_syndicate_full
+ - type: CardStack
+ initialContent:
+ # Clubs
+ - CardScAceOfClubsSyndicate
+ - CardSc2OfClubsSyndicate
+ - CardSc3OfClubsSyndicate
+ - CardSc4OfClubsSyndicate
+ - CardSc5OfClubsSyndicate
+ - CardSc6OfClubsSyndicate
+ - CardSc7OfClubsSyndicate
+ - CardSc8OfClubsSyndicate
+ - CardSc9OfClubsSyndicate
+ - CardSc10OfClubsSyndicate
+ - CardScJackOfClubsSyndicate
+ - CardScQueenOfClubsSyndicate
+ - CardScKingOfClubsSyndicate
+ # Diamonds
+ - CardScAceOfDiamondsSyndicate
+ - CardSc2OfDiamondsSyndicate
+ - CardSc3OfDiamondsSyndicate
+ - CardSc4OfDiamondsSyndicate
+ - CardSc5OfDiamondsSyndicate
+ - CardSc6OfDiamondsSyndicate
+ - CardSc7OfDiamondsSyndicate
+ - CardSc8OfDiamondsSyndicate
+ - CardSc9OfDiamondsSyndicate
+ - CardSc10OfDiamondsSyndicate
+ - CardScJackOfDiamondsSyndicate
+ - CardScQueenOfDiamondsSyndicate
+ - CardScKingOfDiamondsSyndicate
+ # Hearts
+ - CardScAceOfHeartsSyndicate
+ - CardSc2OfHeartsSyndicate
+ - CardSc3OfHeartsSyndicate
+ - CardSc4OfHeartsSyndicate
+ - CardSc5OfHeartsSyndicate
+ - CardSc6OfHeartsSyndicate
+ - CardSc7OfHeartsSyndicate
+ - CardSc8OfHeartsSyndicate
+ - CardSc9OfHeartsSyndicate
+ - CardSc10OfHeartsSyndicate
+ - CardScJackOfHeartsSyndicate
+ - CardScQueenOfHeartsSyndicate
+ - CardScKingOfHeartsSyndicate
+ # Spades
+ - CardScAceOfSpadesSyndicate
+ - CardSc2OfSpadesSyndicate
+ - CardSc3OfSpadesSyndicate
+ - CardSc4OfSpadesSyndicate
+ - CardSc5OfSpadesSyndicate
+ - CardSc6OfSpadesSyndicate
+ - CardSc7OfSpadesSyndicate
+ - CardSc8OfSpadesSyndicate
+ - CardSc9OfSpadesSyndicate
+ - CardSc10OfSpadesSyndicate
+ - CardScJackOfSpadesSyndicate
+ - CardScQueenOfSpadesSyndicate
+ - CardScKingOfSpadesSyndicate
+ # Joker
+ - CardScJokerSyndicate
+
+# region Syndicate Cards
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-2-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-3-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-4-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-5-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-6-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-7-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-8-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-9-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-10-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-ace-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Clubs_syndicate
+
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-jack-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-king-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Clubs_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfClubsSyndicate
+ components:
+ - type: Card
+ name: card-sc-queen-clubs
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Clubs_syndicate
+
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-jack-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-queen-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-king-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-ace-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-2-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-3-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-4-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-5-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-6-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-7-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-8-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-9-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Diamonds_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfDiamondsSyndicate
+ components:
+ - type: Card
+ name: card-sc-10-diamonds
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Diamonds_syndicate
+
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-2-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-3-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-4-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-5-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-6-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-7-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-8-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-9-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-10-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-king-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-queen-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-jack-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Hearts_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfHeartsSyndicate
+ components:
+ - type: Card
+ name: card-sc-ace-hearts
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Hearts_syndicate
+
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-2-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_2_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-3-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_3_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-4-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_4_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-5-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_5_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-6-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_6_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-7-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_7_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-8-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_8_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-9-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_9_of_Spades_syndicate
+
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-10-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_10_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-king-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_King_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-queen-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-jack-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfSpadesSyndicate
+ components:
+ - type: Card
+ name: card-sc-ace-spades
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Spades_syndicate
+
+- type: entity
+ parent: CardBaseSyndicate
+ categories: [ HideSpawnMenu ]
+ id: CardScJokerSyndicate
+ components:
+ - type: Card
+ name: card-sc-joker
+ - type: Sprite
+ sprite: EstacaoPirata/Objects/Misc/cards.rsi
+ state: syndicate_joker
+
+# endregion Syndicate Cards
diff --git a/Resources/Prototypes/EstacaoPirata/SoundCollections/cards.yml b/Resources/Prototypes/EstacaoPirata/SoundCollections/cards.yml
new file mode 100644
index 000000000000..5a7084630c08
--- /dev/null
+++ b/Resources/Prototypes/EstacaoPirata/SoundCollections/cards.yml
@@ -0,0 +1,50 @@
+- type: soundCollection
+ id: cardFan
+ files:
+ - /Audio/EstacaoPirata/Effects/Cards/cardFan1.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardFan2.ogg
+
+- type: soundCollection
+ id: cardOpenPackage
+ files:
+ - /Audio/EstacaoPirata/Effects/Cards/cardOpenPackage1.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardOpenPackage2.ogg
+
+- type: soundCollection
+ id: cardPlace
+ files:
+ - /Audio/EstacaoPirata/Effects/Cards/cardPlace1.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardPlace2.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardPlace3.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardPlace4.ogg
+
+- type: soundCollection
+ id: cardShove
+ files:
+ - /Audio/EstacaoPirata/Effects/Cards/cardShove1.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardShove2.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardShove3.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardShove4.ogg
+
+- type: soundCollection
+ id: cardShuffle
+ files:
+ - /Audio/EstacaoPirata/Effects/Cards/cardShuffle.ogg
+
+- type: soundCollection
+ id: cardSlide
+ files:
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide1.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide2.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide3.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide4.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide5.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide6.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide7.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardSlide8.ogg
+
+- type: soundCollection
+ id: cardTakeOutPackage
+ files:
+ - /Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage1.ogg
+ - /Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg
diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml
index 7534a8cdc683..bebc40fcc1ee 100644
--- a/Resources/Prototypes/Flavors/flavors.yml
+++ b/Resources/Prototypes/Flavors/flavors.yml
@@ -1133,3 +1133,8 @@
id: compressed-meat
flavorType: Complex
description: flavor-complex-compressed-meat
+
+- type: flavor
+ id: plasma
+ flavorType: Complex
+ description: flavor-complex-plasma
diff --git a/Resources/Prototypes/Guidebook/species.yml b/Resources/Prototypes/Guidebook/species.yml
index f7b77b7ec6fa..e6d10810a564 100644
--- a/Resources/Prototypes/Guidebook/species.yml
+++ b/Resources/Prototypes/Guidebook/species.yml
@@ -13,6 +13,8 @@
- IPCs
- Harpy
- Shadowkin
+ - Plasmaman
+ - Chitinid
- type: guideEntry
id: Arachnid
@@ -58,8 +60,13 @@
id: Harpy
name: species-name-harpy
text: "/ServerInfo/Guidebook/Mobs/Harpy.xml"
-
+
- type: guideEntry
id: Shadowkin
name: species-name-shadowkin
text: "/ServerInfo/Guidebook/Mobs/Shadowkin.xml"
+
+- type: guideEntry
+ id: Plasmaman
+ name: species-name-plasmaman
+ text: "/ServerInfo/Guidebook/Mobs/Plasmaman.xml"
diff --git a/Resources/Prototypes/InventoryTemplates/plasmaman_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/plasmaman_inventory_template.yml
new file mode 100644
index 000000000000..c295cf120b1b
--- /dev/null
+++ b/Resources/Prototypes/InventoryTemplates/plasmaman_inventory_template.yml
@@ -0,0 +1,129 @@
+- type: inventoryTemplate
+ id: plasmaman
+ slots:
+ - name: shoes
+ slotTexture: shoes
+ slotFlags: FEET
+ stripTime: 3
+ uiWindowPos: 1,0
+ strippingWindowPos: 1,3
+ displayName: Shoes
+ - name: jumpsuit
+ slotTexture: uniform
+ slotFlags: INNERCLOTHING
+ stripTime: 6
+ uiWindowPos: 0,1
+ strippingWindowPos: 0,2
+ displayName: Jumpsuit
+ spawnWhitelist:
+ tags:
+ - PlasmamanSafe
+ - name: outerClothing
+ slotTexture: suit
+ slotFlags: OUTERCLOTHING
+ stripTime: 6
+ uiWindowPos: 1,1
+ strippingWindowPos: 1,2
+ displayName: Suit
+ - name: gloves
+ slotTexture: gloves
+ slotFlags: GLOVES
+ uiWindowPos: 2,1
+ strippingWindowPos: 2,2
+ displayName: Gloves
+ - name: neck
+ slotTexture: neck
+ slotFlags: NECK
+ uiWindowPos: 0,2
+ strippingWindowPos: 0,1
+ displayName: Neck
+ - name: mask
+ slotTexture: mask
+ slotFlags: MASK
+ uiWindowPos: 1,2
+ strippingWindowPos: 1,1
+ displayName: Mask
+ - name: eyes
+ slotTexture: glasses
+ slotFlags: EYES
+ stripTime: 3
+ uiWindowPos: 0,3
+ strippingWindowPos: 0,0
+ displayName: Eyes
+ - name: ears
+ slotTexture: ears
+ slotFlags: EARS
+ stripTime: 3
+ uiWindowPos: 2,2
+ strippingWindowPos: 2,0
+ displayName: Ears
+ - name: head
+ slotTexture: head
+ slotFlags: HEAD
+ uiWindowPos: 1,3
+ strippingWindowPos: 1,0
+ displayName: Head
+ spawnWhitelist:
+ tags:
+ - PlasmamanSafe
+ - name: pocket1
+ slotTexture: pocket
+ fullTextureName: template_small
+ slotFlags: POCKET
+ slotGroup: MainHotbar
+ stripTime: 3
+ uiWindowPos: 0,3
+ strippingWindowPos: 0,4
+ dependsOn: jumpsuit
+ displayName: Pocket 1
+ stripHidden: true
+ - name: pocket2
+ slotTexture: pocket
+ fullTextureName: template_small
+ slotFlags: POCKET
+ slotGroup: MainHotbar
+ stripTime: 3
+ uiWindowPos: 2,3
+ strippingWindowPos: 1,4
+ dependsOn: jumpsuit
+ displayName: Pocket 2
+ stripHidden: true
+ - name: suitstorage
+ slotTexture: suit_storage
+ slotFlags: SUITSTORAGE
+ slotGroup: MainHotbar
+ stripTime: 3
+ uiWindowPos: 2,0
+ strippingWindowPos: 2,5
+ dependsOn: outerClothing
+ dependsOnComponents:
+ - type: AllowSuitStorage
+ displayName: Suit Storage
+ - name: id
+ slotTexture: id
+ fullTextureName: template_small
+ slotFlags: IDCARD
+ slotGroup: SecondHotbar
+ stripTime: 6
+ uiWindowPos: 2,1
+ strippingWindowPos: 2,4
+ dependsOn: jumpsuit
+ displayName: ID
+ - name: belt
+ slotTexture: belt
+ fullTextureName: template_small
+ slotFlags: BELT
+ slotGroup: SecondHotbar
+ stripTime: 6
+ uiWindowPos: 3,1
+ strippingWindowPos: 1,5
+ displayName: Belt
+ - name: back
+ slotTexture: back
+ fullTextureName: template_small
+ slotFlags: BACK
+ slotGroup: SecondHotbar
+ stripTime: 6
+ uiWindowPos: 3,0
+ strippingWindowPos: 0,5
+ displayName: Back
diff --git a/Resources/Prototypes/Language/Species-Specific/chittin.yml b/Resources/Prototypes/Language/Species-Specific/chittin.yml
new file mode 100644
index 000000000000..e6de43d5a3ca
--- /dev/null
+++ b/Resources/Prototypes/Language/Species-Specific/chittin.yml
@@ -0,0 +1,16 @@
+# Spoken by Chitinids.
+- type: language
+ id: Chittin
+ isVisibleLanguage: true
+ speech:
+ color: "#7d7d7d"
+ fontId: Only_You
+ obfuscation:
+ !type:SyllableObfuscation
+ minSyllables: 1 # Replacements are really short
+ maxSyllables: 2
+ replacement:
+ - click
+ - clack
+ - buzz
+ - bizz
\ No newline at end of file
diff --git a/Resources/Prototypes/Language/Species-Specific/skeleton.yml b/Resources/Prototypes/Language/Species-Specific/skeleton.yml
new file mode 100644
index 000000000000..840f00850e8d
--- /dev/null
+++ b/Resources/Prototypes/Language/Species-Specific/skeleton.yml
@@ -0,0 +1,59 @@
+- type: language
+ id: Calcic
+ isVisibleLanguage: true
+ speech:
+ fontId: LDFComicSans
+ color: "#e3dac9"
+ obfuscation:
+ !type:SyllableObfuscation
+ minSyllables: 1
+ maxSyllables: 4
+ replacement:
+ - k
+ - ck
+ - ack
+ - ick
+ - cl
+ - tk
+ - sk
+ - isk
+ - tak
+ - kl
+ - hs
+ - ss
+ - ks
+ - lk
+ - dk
+ - gk
+ - ka
+ - ska
+ - la
+ - pk
+ - wk
+ - ak
+ - ik
+ - ip
+ - ski
+ - bk
+ - kb
+ - ta
+ - is
+ - it
+ - li
+ - di
+ - ds
+ - ya
+ - sck
+ - crk
+ - hs
+ - ws
+ - mk
+ - aaa
+ - skraa
+ - skee
+ - hss
+ - raa
+ - klk
+ - tk
+ - stk
+ - clk
diff --git a/Resources/Prototypes/Loadouts/Generic/hands.yml b/Resources/Prototypes/Loadouts/Generic/hands.yml
index af5559ee3b87..ec2aec9070ae 100644
--- a/Resources/Prototypes/Loadouts/Generic/hands.yml
+++ b/Resources/Prototypes/Loadouts/Generic/hands.yml
@@ -10,6 +10,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutGloves
+ - !type:CharacterSpeciesRequirement # Use the envirogloves that use the same sprite instead.
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutHandsColorYellowBudget
@@ -71,6 +75,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutGloves
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutHandsGlovesEvening
@@ -83,3 +91,7 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutGloves
+ - !type:CharacterSpeciesRequirement # Use the evening envirogloves that use the same sprite instead.
+ inverted: true
+ species:
+ - Plasmaman
diff --git a/Resources/Prototypes/Loadouts/Generic/items.yml b/Resources/Prototypes/Loadouts/Generic/items.yml
index 24d343c2395b..84889d7ca9ba 100644
--- a/Resources/Prototypes/Loadouts/Generic/items.yml
+++ b/Resources/Prototypes/Loadouts/Generic/items.yml
@@ -311,6 +311,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutAirTank
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutItemsExtendedEmergencyOxygenTank
@@ -321,6 +325,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutAirTank
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutItemsDoubleEmergencyOxygenTank
@@ -331,6 +339,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutAirTank
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutItemClothingMaskBreath
@@ -433,6 +445,11 @@
cost: 1
items:
- DrinkWaterBottleFull
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutItemLunchboxGenericFilledRandom
@@ -440,6 +457,11 @@
cost: 3
items:
- LunchboxGenericFilledRandom
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutItemDrinkMREFlask
@@ -447,6 +469,11 @@
cost: 2
items:
- DrinkMREFlask
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
# Survival boxes
- type: loadout
@@ -818,3 +845,28 @@
group: LoadoutPets
functions:
- !type:LoadoutMakeFollower
+
+- type: loadout
+ id: LoadoutItemBlackDeck
+ category: Items
+ cost: 3
+ canBeHeirloom: false
+ items:
+ - CardBoxBlack
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutCards
+
+- type: loadout
+ id: LoadoutItemNTDeck
+ category: Items
+ cost: 3
+ canBeHeirloom: false
+ items:
+ - CardBoxNanotrasen
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutCards
+ - !type:CharacterDepartmentRequirement
+ departments:
+ - Command
diff --git a/Resources/Prototypes/Loadouts/Generic/plasmaman.yml b/Resources/Prototypes/Loadouts/Generic/plasmaman.yml
new file mode 100644
index 000000000000..a3dbd169f8a9
--- /dev/null
+++ b/Resources/Prototypes/Loadouts/Generic/plasmaman.yml
@@ -0,0 +1,723 @@
+# Equipment
+
+- type: loadout
+ id: LoadoutSpeciesEnvirosuitExtinguisherRefill
+ category: Species
+ cost: 5
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - EnvirosuitExtinguisherRefill
+
+- type: loadout
+ id: LoadoutSpeciesDoubleEmergencyPlasmaTank
+ category: Species
+ cost: 6
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - DoubleEmergencyPlasmaTankFilled
+
+- type: loadout
+ id: LoadoutSpeciesDrinkMilkCartonAndSyringe
+ category: Species
+ cost: 3
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - DrinkMilkCarton
+ - Syringe
+
+# Envirogloves
+
+- type: loadout
+ id: LoadoutHandsGlovesEnviroglovesColor
+ category: Hands
+ cost: 0
+ exclusive: true
+ customColorTint: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutGloves
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - ClothingHandsGlovesEnviroglovesColor
+
+- type: loadout
+ id: LoadoutHandsGlovesEnviroglovesEvening
+ category: Hands
+ cost: 0
+ exclusive: true
+ customColorTint: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutGloves
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - ClothingHandsGlovesEnviroglovesEvening
+
+# Envirosuits with paired envirohelms
+
+- type: loadout
+ id: LoadoutUniformEnvirosuit
+ category: Uniform
+ cost: 0
+ exclusive: true
+ canBeHeirloom: true
+ guideEntry: Plasmaman
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuit
+ - ClothingHeadEnvirohelm
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitBlackPink
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitBlackPink
+ - ClothingHeadEnvirohelmBlackPink
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitBlackPinkAlt
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitBlackPinkAlt
+ - ClothingHeadEnvirohelmBlackPinkAlt
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitMartialGi
+ category: Uniform
+ cost: 1
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitMartialGi
+ - ClothingHeadEnvirohelmMartialGi
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitSafari
+ category: Uniform
+ cost: 1
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitSafari
+ - ClothingHeadEnvirohelmSafari
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitTrans
+ category: Uniform
+ cost: 0
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitTrans
+ - ClothingHeadEnvirohelmTrans
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitAncientVoid
+ category: Uniform
+ cost: 2
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ - !type:CharacterJobRequirement
+ inverted: true
+ jobs:
+ - Librarian # Librarian already starts with this envirosuit
+ items:
+ - ClothingUniformEnvirosuitAncientVoid
+ - ClothingHeadEnvirohelmAncientVoid
+
+# Colored envirosuits
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorWhite
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorWhite
+ - ClothingHeadEnvirohelmColorWhite
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorGrey
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorGrey
+ - ClothingHeadEnvirohelmColorGrey
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorBlack
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorBlack
+ - ClothingHeadEnvirohelmColorBlack
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorRed
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorRed
+ - ClothingHeadEnvirohelmColorRed
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorGreen
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorGreen
+ - ClothingHeadEnvirohelmColorGreen
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorDarkGreen
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorDarkGreen
+ - ClothingHeadEnvirohelmColorDarkGreen
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorBlue
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorBlue
+ - ClothingHeadEnvirohelmColorBlue
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorDarkBlue
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorDarkBlue
+ - ClothingHeadEnvirohelmColorDarkBlue
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorTeal
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorTeal
+ - ClothingHeadEnvirohelmColorTeal
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorMaroon
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorMaroon
+ - ClothingHeadEnvirohelmColorMaroon
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorPink
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorPink
+ - ClothingHeadEnvirohelmColorPink
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorYellow
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorYellow
+ - ClothingHeadEnvirohelmColorYellow
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorPurple
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorPurple
+ - ClothingHeadEnvirohelmColorPurple
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorOrange
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorOrange
+ - ClothingHeadEnvirohelmColorOrange
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorLightBrown
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorLightBrown
+ - ClothingHeadEnvirohelmColorLightBrown
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitColorBrown
+ category: Uniform
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitColorBrown
+ - ClothingHeadEnvirohelmColorBrown
+
+# Enviroslacks
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacks
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacks
+ - ClothingHeadEnvirohelmColorWhite
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksNegative
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksNegative
+ - ClothingHeadEnvirohelmColorBlack
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorRed
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksColorRed
+ - ClothingHeadEnvirohelmEnviroslacksColorRed
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorOrange
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksColorOrange
+ - ClothingHeadEnvirohelmEnviroslacksColorOrange
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorGreen
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Security
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksColorGreen
+ - ClothingHeadEnvirohelmEnviroslacksColorGreen
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorBlue
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksColorBlue
+ - ClothingHeadEnvirohelmEnviroslacksColorBlue
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksColorBrown
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksColorBrown
+ - ClothingHeadEnvirohelmColorWhite
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksMNK
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksMNK
+ - ClothingHeadEnvirohelmEnviroslacksMNK
+
+- type: loadout
+ id: LoadoutUniformEnvirosuitEnviroslacksMNKAlt
+ category: Uniform
+ cost: 1
+ exclusive: true
+ canBeHeirloom: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutUniformsCivilian
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ - !type:CharacterDepartmentRequirement
+ inverted: true
+ departments:
+ - Command
+ items:
+ - ClothingUniformEnvirosuitEnviroslacksMNKAlt
+ - ClothingHeadEnvirohelmEnviroslacksMNKAlt
diff --git a/Resources/Prototypes/Loadouts/Generic/shoes.yml b/Resources/Prototypes/Loadouts/Generic/shoes.yml
index cf3cbfb074a5..22e18c2527be 100644
--- a/Resources/Prototypes/Loadouts/Generic/shoes.yml
+++ b/Resources/Prototypes/Loadouts/Generic/shoes.yml
@@ -248,6 +248,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutShoes
+ - !type:CharacterSpeciesRequirement # Due to a visual bug with envirosuits and heels they are disabled for now.
+ inverted: true
+ species:
+ - Plasmaman
items:
- ClothingShoesHighheelBoots
# Socks
@@ -295,6 +299,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutShoes
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
items:
- ClothingShoesHighHeels
@@ -308,6 +316,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutShoes
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
items:
- ClothingShoesHighHeelsLong
diff --git a/Resources/Prototypes/Loadouts/Generic/uniform.yml b/Resources/Prototypes/Loadouts/Generic/uniform.yml
index 3af5f79d8fdb..ea4287b0b19c 100644
--- a/Resources/Prototypes/Loadouts/Generic/uniform.yml
+++ b/Resources/Prototypes/Loadouts/Generic/uniform.yml
@@ -551,6 +551,7 @@
- Command
# Kimono
+
- type: loadout
id: LoadoutClothingJumpsuitKimono
category: Uniform
diff --git a/Resources/Prototypes/Loadouts/Jobs/Logistics/courier.yml b/Resources/Prototypes/Loadouts/Jobs/Logistics/courier.yml
index 2af937ef1a12..ae89a2f422fe 100644
--- a/Resources/Prototypes/Loadouts/Jobs/Logistics/courier.yml
+++ b/Resources/Prototypes/Loadouts/Jobs/Logistics/courier.yml
@@ -105,3 +105,21 @@
- MailCarrier
items:
- ClothingUniformSkirtMailCarrier
+
+- type: loadout
+ id: LoadoutCourierUniformEnvirosuitMailCarrier
+ category: JobsLogisticsCourier
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutCourierUniforms
+ - !type:CharacterJobRequirement
+ jobs:
+ - MailCarrier
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - ClothingUniformEnvirosuitMailCarrier
+ - ClothingHeadEnvirohelmMailCarrier
diff --git a/Resources/Prototypes/Loadouts/Jobs/Security/uncategorized.yml b/Resources/Prototypes/Loadouts/Jobs/Security/uncategorized.yml
index c193b8887210..bba1e6d06499 100644
--- a/Resources/Prototypes/Loadouts/Jobs/Security/uncategorized.yml
+++ b/Resources/Prototypes/Loadouts/Jobs/Security/uncategorized.yml
@@ -1329,3 +1329,39 @@
- Security
items:
- ClothingUniformJumpsuitSecSummer
+
+- type: loadout
+ id: LoadoutSecurityUniformEnvirosuitBlue
+ category: JobsSecurityAUncategorized
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutSecurityUniforms
+ - !type:CharacterDepartmentRequirement
+ departments:
+ - Security
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - ClothingUniformEnvirosuitSecBlue
+ - ClothingHeadEnvirohelmSecBlue
+
+- type: loadout
+ id: LoadoutSecurityUniformEnvirosuitGrey
+ category: JobsSecurityAUncategorized
+ cost: 0
+ exclusive: true
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: LoadoutSecurityUniforms
+ - !type:CharacterDepartmentRequirement
+ departments:
+ - Security
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ items:
+ - ClothingUniformEnvirosuitSecGrey
+ - ClothingHeadEnvirohelmSecGrey
diff --git a/Resources/Prototypes/Mood/genericPositiveEffects.yml b/Resources/Prototypes/Mood/genericPositiveEffects.yml
index c3d3acc8a5d0..4b30007611a0 100644
--- a/Resources/Prototypes/Mood/genericPositiveEffects.yml
+++ b/Resources/Prototypes/Mood/genericPositiveEffects.yml
@@ -1,4 +1,4 @@
-- type: moodEffect
+- type: moodEffect
id: BeingHugged
moodChange: 3
timeout: 120
@@ -52,3 +52,13 @@
moodChange: 5
timeout: 60 # A bit of time before they realize it's gone
moodletOnEnd: HeirloomNeutral
+
+- type: moodEffect
+ id: PlasmamanIngestMilk
+ moodChange: 7
+ timeout: 60
+
+- type: moodEffect
+ id: PlasmamanIngestPlasma
+ moodChange: 14
+ timeout: 60
diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail_carrier.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail_carrier.yml
index 5a90e77a58af..ca4d55c2f863 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail_carrier.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail_carrier.yml
@@ -13,6 +13,8 @@
- type: startingGear
id: MailCarrierGear
+ subGear:
+ - MailCarrierPlasmamanGear
equipment:
head: ClothingHeadMailCarrier
jumpsuit: ClothingUniformMailCarrier
@@ -24,3 +26,11 @@
innerClothingSkirt: ClothingUniformSkirtMailCarrier
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: MailCarrierPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitMailCarrier
+ head: ClothingHeadEnvirohelmMailCarrier
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml
index 6a143a78b116..03958bab5293 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml
@@ -43,6 +43,8 @@
- type: startingGear
id: ForensicMantisGear
+ subGear:
+ - ForensicMantisPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMantis
back: ClothingBackpackMantisFilled
@@ -58,3 +60,11 @@
innerClothingSkirt: ClothingUniformSkirtMantis
satchel: ClothingBackpackSatchelMantisFilled
duffelbag: ClothingBackpackDuffelMantisFilled
+
+- type: startingGear
+ id: ForensicMantisPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitMantis
+ head: ClothingHeadEnvirohelmMantis
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml
index b82178a936ff..7edfc3644159 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml
@@ -23,10 +23,16 @@
special:
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
-
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 6
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: PrisonGuardGear
+ subGear:
+ - PrisonGuardPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitPrisonGuard
back: ClothingBackpackSecurityFilled
@@ -39,3 +45,11 @@
innerClothingSkirt: ClothingUniformJumpsuitPrisonGuard
satchel: ClothingBackpackSatchelSecurityFilled
duffelbag: ClothingBackpackDuffelSecurityFilled
+
+- type: startingGear
+ id: PrisonGuardPlasmamanGear
+ parent: BasePlasmamanSecurityGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitPrisonGuard
+ head: ClothingHeadEnvirohelmPrisonGuard
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml
index b2d54651e478..6b1c809c461e 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml
@@ -18,9 +18,16 @@
- !type:AddTraitSpecial
traits:
- MartialArtist
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 3
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellPotato
- type: startingGear
id: NyanoGladiatorGear
+ subGear:
+ - GladiatorPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitGladiator
outerClothing: ClothingOuterArmorGladiator
@@ -28,3 +35,11 @@
ears: ClothingHeadsetGrey
innerClothingSkirt: UniformShortsRedWithTop
#any other possessions, spawn in cell
+
+- type: startingGear
+ id: GladiatorPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitGladiator
+ head: ClothingHeadEnvirohelmGladiator
+ gloves: ClothingHandsGlovesEnviroglovesGladiator
diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml
index de6212dacf94..7f336d8a7c9a 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml
@@ -22,6 +22,8 @@
- type: startingGear
id: MartialArtistGear
+ subGear:
+ - MartialArtistPlasmamanGear
equipment:
jumpsuit: ClothingUniformMartialGi
belt: ClothingBeltMartialBlack
@@ -32,3 +34,12 @@
gloves: ClothingHandsGlovesBoxingRed
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: MartialArtistPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitMartialGi
+ head: ClothingHeadEnvirohelmMartialGi
+ # No envirogloves, use the boxing gloves instead
+ shoes: ClothingShoesColorBlack
diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml
index e892a480413a..de1e8fc39acb 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml
@@ -17,12 +17,27 @@
- !type:AddComponentSpecial
components:
- type: Pacified
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 3 # Poor prisoners with not a lot of self-extinguishes.
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellPotato
- type: startingGear
id: PrisonerGear
+ subGear:
+ - PrisonerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitPrisoner
shoes: ClothingShoesColorBlack
id: PrisonerPDA
ears: ClothingHeadsetPrison #deltaV
innerClothingSkirt: ClothingUniformJumpsuitPrisoner
+
+- type: startingGear
+ id: PrisonerPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitPrisoner
+ head: ClothingHeadEnvirohelmPrisoner
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml b/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml
index 891067b1c1fb..2502441d6c26 100644
--- a/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml
+++ b/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml
@@ -11,3 +11,4 @@
Reptilian: 0.5
SlimePerson: 0.5
Vulpkanin: 0.5
+ Plasmaman: 0.25
diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml
index 16dc7c6d310a..68deacd78471 100644
--- a/Resources/Prototypes/Objectives/objectiveGroups.yml
+++ b/Resources/Prototypes/Objectives/objectiveGroups.yml
@@ -31,7 +31,8 @@
- type: weightedRandom
id: TraitorObjectiveGroupKill
weights:
- KillRandomPersonObjective: 1
+ # KillRandomPersonObjective: 1 # DeltaV Replaced for Teach Lesson
+ TeachLessonRandomPersonObjective: 1
KillRandomHeadObjective: 0.25
- type: weightedRandom
diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml
index 3f9fb7b53d28..52b653315340 100644
--- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml
+++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml
@@ -266,6 +266,25 @@
effects:
- !type:SatiateThirst
factor: 4
+ - !type:HealthChange
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ damage:
+ groups:
+ Brute: -0.90
+ types:
+ Heat: -0.30
+ Shock: -0.30
+ Caustic: -0.30
+ - !type:ChemAddMoodlet
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ - !type:ReagentThreshold
+ reagent: Milk
+ min: 4
+ moodPrototype: PlasmamanIngestMilk
- type: reagent
id: MilkGoat
diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml
index caa2e5acdc6d..b81b639b8bdf 100644
--- a/Resources/Prototypes/Reagents/gases.yml
+++ b/Resources/Prototypes/Reagents/gases.yml
@@ -32,6 +32,9 @@
- !type:OrganType
type: Vox
shouldHave: false
+ - !type:OrganType
+ type: Plasmaman
+ shouldHave: false
ratios:
CarbonDioxide: 1.0
Oxygen: -1.0
@@ -46,7 +49,7 @@
Poison:
7
- !type:AdjustAlert
- alertType: Toxins
+ alertType: HighOxygen
conditions:
- !type:ReagentThreshold
min: 0.5
@@ -54,6 +57,25 @@
type: Vox
clear: true
time: 5
+ - !type:HealthChange
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ scaleByQuantity: true
+ ignoreResistances: true
+ damage:
+ types:
+ Poison:
+ 7
+ - !type:AdjustAlert
+ alertType: HighOxygen
+ conditions:
+ - !type:ReagentThreshold
+ min: 0.5
+ - !type:OrganType
+ type: Plasmaman
+ clear: true
+ time: 5
- type: reagent
id: Plasma
@@ -72,15 +94,27 @@
Poison:
effects:
- !type:HealthChange
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ shouldHave: false
damage:
types:
Poison: 3
- !type:AdjustReagent
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ shouldHave: false
reagent: Inaprovaline
amount: -2.0
Gas:
effects:
- !type:HealthChange
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ shouldHave: false
scaleByQuantity: true
ignoreResistances: true
damage:
@@ -91,10 +125,48 @@
- !type:AdjustAlert
alertType: Toxins
conditions:
+ - !type:OrganType
+ type: Plasmaman
+ shouldHave: false
- !type:ReagentThreshold
min: 1.5
clear: True
time: 5
+ - !type:Oxygenate
+ factor: 4
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ - !type:ModifyLungGas
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ ratios:
+ Nitrogen: 1.0 # Interesting exhale for plasmamen
+ Plasma: -1.0
+ Medicine:
+ effects:
+ - !type:HealthChange
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ damage:
+ groups:
+ Brute: -2
+ types:
+ Heat: -0.66
+ Shock: -0.66
+ Caustic: -0.66
+ Asphyxiation: -0.66
+ Poison: -0.66
+ - !type:ChemAddMoodlet
+ conditions:
+ - !type:OrganType
+ type: Plasmaman
+ - !type:ReagentThreshold
+ reagent: Plasma
+ min: 4
+ moodPrototype: PlasmamanIngestPlasma
reactiveEffects:
Flammable:
methods: [ Touch ]
diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml
index 29f3fed247bb..37b400802c5a 100644
--- a/Resources/Prototypes/Recipes/Lathes/medical.yml
+++ b/Resources/Prototypes/Recipes/Lathes/medical.yml
@@ -262,3 +262,11 @@
Silver: 100
Gold: 100
Plasma: 200
+
+- type: latheRecipe
+ id: EnvirosuitExtinguisherRefill
+ result: EnvirosuitExtinguisherRefill
+ completetime: 3
+ materials:
+ Steel: 200
+ Plasma: 50
diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml
index 0aa31a5f6e0d..dd4ea9f163fe 100644
--- a/Resources/Prototypes/Research/civilianservices.yml
+++ b/Resources/Prototypes/Research/civilianservices.yml
@@ -105,6 +105,7 @@
- CloningConsoleComputerCircuitboard
- MedicalScannerMachineCircuitboard
- MetempsychoticMachineCircuitboard
+ - EnvirosuitExtinguisherRefill
- type: technology
id: HONKMech
diff --git a/Resources/Prototypes/Roles/Antags/nukeops.yml b/Resources/Prototypes/Roles/Antags/nukeops.yml
index 7b2d9893b606..2490243c83ea 100644
--- a/Resources/Prototypes/Roles/Antags/nukeops.yml
+++ b/Resources/Prototypes/Roles/Antags/nukeops.yml
@@ -44,6 +44,8 @@
#Lone Operative Gear
- type: startingGear
id: SyndicateLoneOperativeGearFull
+ subGear:
+ - SyndicatePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitOperative
back: ClothingBackpackDuffelSyndicateOperative
diff --git a/Resources/Prototypes/Roles/Antags/traitor.yml b/Resources/Prototypes/Roles/Antags/traitor.yml
index 504b6384835c..f7d4a784019f 100644
--- a/Resources/Prototypes/Roles/Antags/traitor.yml
+++ b/Resources/Prototypes/Roles/Antags/traitor.yml
@@ -23,6 +23,8 @@
# Syndicate Operative Outfit - Barratry
- type: startingGear
id: SyndicateOperativeGearExtremelyBasic
+ subGear:
+ - SyndicatePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitOperative
back: ClothingBackpackSyndicate
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
index f79a30e5fd6e..7b5c19bcf812 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: CargoTechGear
+ subGear:
+ - CargoTechPlasmamanGear
equipment:
head: ClothingHeadHatCargosoft
jumpsuit: ClothingUniformJumpsuitCargo
@@ -27,3 +29,11 @@
innerClothingSkirt: ClothingUniformJumpskirtCargo
satchel: ClothingBackpackSatchelCargoFilled
duffelbag: ClothingBackpackDuffelCargoFilled
+
+- type: startingGear
+ id: CargoTechPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitCargo
+ head: ClothingHeadEnvirohelmCargo
+ gloves: ClothingHandsGlovesEnviroglovesCargo
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
index bea527623b25..f27c384c6a64 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
@@ -40,9 +40,14 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
- type: startingGear
id: QuartermasterGear
+ subGear:
+ - QuartermasterPlasmamanGear
equipment:
head: ClothingHeadHatBeretLogi
jumpsuit: ClothingUniformJumpsuitQM
@@ -55,3 +60,11 @@
innerClothingSkirt: ClothingUniformJumpskirtQM
satchel: ClothingBackpackSatchelQuartermasterFilled
duffelbag: ClothingBackpackDuffelQuartermasterFilled
+
+- type: startingGear
+ id: QuartermasterPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitQM
+ head: ClothingHeadEnvirohelmQM
+ gloves: ClothingHandsGlovesEnviroglovesCargo
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml
index 8b806009ef83..4d55f6183bab 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml
@@ -21,6 +21,8 @@
- type: startingGear
id: SalvageSpecialistGear
+ subGear:
+ - SalvageSpecialistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSalvageSpecialist
back: ClothingBackpackSalvageFilled
@@ -29,3 +31,12 @@
ears: ClothingHeadsetCargo
satchel: ClothingBackpackSatchelSalvageFilled
duffelbag: ClothingBackpackDuffelSalvageFilled
+
+- type: startingGear
+ id: SalvageSpecialistPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitSalvage
+ head: ClothingHeadEnvirohelmSalvage
+ gloves: ClothingHandsGlovesEnviroglovesSalvage
+ mask: ClothingMaskGasExplorer
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml b/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml
index 5cf4fd9449bb..dce796968212 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml
@@ -11,6 +11,8 @@
- type: startingGear
id: PassengerGear
+ subGear:
+ - PassengerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorGrey
back: ClothingBackpackFilled
@@ -20,3 +22,11 @@
innerClothingSkirt: ClothingUniformJumpskirtColorGrey
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: PassengerPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitColorGrey
+ head: ClothingHeadEnvirohelmColorGrey
+ gloves: ClothingHandsGlovesEnviroglovesColorDarkGrey
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
index 85a86dabce38..74d5560b8e39 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
@@ -20,6 +20,8 @@
- type: startingGear
id: BartenderGear
+ subGear:
+ - BartenderPlasmamanGear
equipment:
head: ClothingHeadHatTophat
jumpsuit: ClothingUniformJumpsuitBartender
@@ -31,3 +33,11 @@
innerClothingSkirt: ClothingUniformJumpskirtBartender
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: BartenderPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitEnviroslacks
+ head: ClothingHeadEnvirohelmColorWhite
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
index 35b858fb388a..77e9ec491b9f 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: BotanistGear
+ subGear:
+ - BotanistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitHydroponics
back: ClothingBackpackHydroponicsFilled
@@ -27,3 +29,11 @@
innerClothingSkirt: ClothingUniformJumpskirtHydroponics
satchel: ClothingBackpackSatchelHydroponicsFilled
duffelbag: ClothingBackpackDuffelHydroponicsFilled
+
+- type: startingGear
+ id: BotanistPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitHydroponics
+ head: ClothingHeadEnvirohelmHydroponics
+ gloves: ClothingHandsGlovesEnviroglovesLeather
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
index b2c88fe212a0..c3261bea60f9 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
@@ -43,6 +43,8 @@
- type: startingGear
id: ChaplainGear
+ subGear:
+ - ChaplainPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitChaplain
back: ClothingBackpack
@@ -53,3 +55,11 @@
innerClothingSkirt: ClothingUniformJumpskirtChaplain
satchel: ClothingBackpackSatchelChaplainFilled
duffelbag: ClothingBackpackDuffelChaplainFilled
+
+- type: startingGear
+ id: ChaplainPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitChaplain
+ head: ClothingHeadEnvirohelmChaplain
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
index 0837f1f39077..f4e44be33e0f 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
@@ -24,6 +24,8 @@
- type: startingGear
id: ChefGear
+ subGear:
+ - ChefPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitChef
head: ClothingHeadHatChef
@@ -37,3 +39,11 @@
innerClothingSkirt: ClothingUniformJumpskirtChef
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: ChefPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitChef
+ head: ClothingHeadEnvirohelmColorWhite
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
index 8cc8f5c6a727..67aaddaea2d3 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
@@ -32,6 +32,8 @@
- type: startingGear
id: ClownGear
+ subGear:
+ - ClownPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitClown
back: ClothingBackpackClownFilled
@@ -43,3 +45,12 @@
ears: ClothingHeadsetService
satchel: ClothingBackpackSatchelClownFilled
duffelbag: ClothingBackpackDuffelClownFilled
+
+- type: startingGear
+ id: ClownPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitClown
+ head: ClothingHeadEnvirohelmClown
+ gloves: ClothingHandsGlovesEnviroglovesClown
+ mask: ClothingMaskClown # Parent sets mask to breath mask so set it again here
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
index bf11532ddbf3..ac097e7e3063 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
@@ -17,6 +17,8 @@
- type: startingGear
id: JanitorGear
+ subGear:
+ - JanitorPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitJanitor
back: ClothingBackpackFilled
@@ -30,6 +32,14 @@
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+- type: startingGear
+ id: JanitorPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitJanitor
+ head: ClothingHeadEnvirohelmJanitor
+ gloves: ClothingHandsGlovesEnviroglovesJanitor
+
- type: startingGear
id: JanitorMaidGear
equipment:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml
index b8e37c2bebf0..3a3c88157fb0 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml
@@ -20,6 +20,8 @@
- type: startingGear
id: LawyerGear
+ subGear:
+ - LawyerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitLawyerBlack # TODO change jumpsuit to randomiser of the 4 variants
back: ClothingBackpackLawyerFilled #DeltaV - stamp included
@@ -32,3 +34,11 @@
innerClothingSkirt: ClothingUniformJumpskirtLawyerBlack
satchel: ClothingBackpackSatchelLawyerFilled #DeltaV - stamp included
duffelbag: ClothingBackpackDuffelLawyerFilled #DeltaV - stamp included
+
+- type: startingGear
+ id: LawyerPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitEnviroslacks
+ head: ClothingHeadEnvirohelmColorWhite
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml
index f2928c6b917c..b8e65f2d9805 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml
@@ -41,6 +41,8 @@
- type: startingGear
id: LibrarianGear
+ subGear:
+ - LibrarianPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitLibrarian
back: ClothingBackpackLibrarianFilled
@@ -53,3 +55,11 @@
innerClothingSkirt: ClothingUniformJumpskirtLibrarian
satchel: ClothingBackpackSatchelLibrarianFilled
duffelbag: ClothingBackpackDuffelLibrarianFilled
+
+- type: startingGear
+ id: LibrarianPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitAncientVoid
+ head: ClothingHeadEnvirohelmAncientVoid
+ gloves: ClothingHandsGlovesEnviroglovesPrototype
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
index 6aa6d02aecb2..cc0dcce714ae 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
@@ -21,6 +21,8 @@
- type: startingGear
id: MimeGear
+ subGear:
+ - MimePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMime
back: ClothingBackpackMimeFilled
@@ -37,6 +39,15 @@
satchel: ClothingBackpackSatchelMimeFilled
duffelbag: ClothingBackpackDuffelMimeFilled
+- type: startingGear
+ id: MimePlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitMime
+ head: ClothingHeadEnvirohelmMime
+ gloves: ClothingHandsGlovesEnviroglovesWhite
+ mask: ClothingMaskMime # Parent sets mask to breath mask so set it again here
+
- type: entity
id: ActionMimeInvisibleWall
name: Create Invisible Wall
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
index 28f9c597e585..c556585f9c5a 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
@@ -20,6 +20,8 @@
- type: startingGear
id: MusicianGear
+ subGear:
+ - MusicianPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMusician
back: ClothingBackpackMusicianFilled
@@ -29,3 +31,11 @@
ears: ClothingHeadsetService
satchel: ClothingBackpackSatchelMusicianFilled
duffelbag: ClothingBackpackDuffelMusicianFilled
+
+- type: startingGear
+ id: MusicianPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitMusician
+ head: ClothingHeadEnvirohelmMusician
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml
index 8bfd05ad0148..34a96b909ccf 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml
@@ -1,4 +1,4 @@
-- type: job
+- type: job
id: ServiceWorker
name: job-name-serviceworker
description: job-description-serviceworker
@@ -21,6 +21,8 @@
- type: startingGear
id: ServiceWorkerGear
+ subGear:
+ - ServiceWorkerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorDarkGreen # DeltaV
back: ClothingBackpackFilled
@@ -30,3 +32,11 @@
innerClothingSkirt: ClothingUniformJumpskirtColorDarkGreen # DeltaV
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: ServiceWorkerPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitColorDarkGreen
+ head: ClothingHeadEnvirohelmColorDarkGreen
+ gloves: ClothingHandsGlovesEnviroglovesColorDarkGreen
diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml
index 30b9a69d12fc..c4af21357d2e 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml
@@ -27,7 +27,7 @@
- !type:CharacterWhitelistRequirement
weight: 20
startingGear: CaptainGear
- icon: JobIconCaptain
+ icon: "JobIconCaptain"
requireAdminNotify: true
joinNotifyCrew: true
supervisors: job-supervisors-centcom
@@ -40,9 +40,16 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: CaptainGear
+ subGear:
+ - CaptainPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitCaptain
back: ClothingBackpackCaptainFilled
@@ -52,3 +59,11 @@
innerClothingSkirt: ClothingUniformJumpskirtCaptain
satchel: ClothingBackpackSatchelCaptainFilled
duffelbag: ClothingBackpackDuffelCaptainFilled
+
+- type: startingGear
+ id: CaptainPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitCaptain
+ head: ClothingHeadEnvirohelmCaptain
+ gloves: ClothingHandsGlovesCaptain
diff --git a/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml b/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml
index a1a6ed930b3a..6067cf907305 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml
@@ -12,9 +12,16 @@
- AllAccess
access:
- CentralCommand
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 10
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: CentcomGear
+ subGear:
+ - CentcomPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitCentcomOfficial
shoes: ClothingShoesBootsCombatFilled
@@ -27,3 +34,11 @@
belt: WeaponPistolN1984
pocket1: BoxFolderBlack
pocket2: PenCentcom
+
+- type: startingGear
+ id: CentcomPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitCentcomOfficial
+ head: ClothingHeadEnvirohelmCentcomOfficial
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
index 4911da82a1ff..b4e59270076a 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
@@ -67,9 +67,16 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: HoPGear
+ subGear:
+ - HoPPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitHoP
back: ClothingBackpackHOPFilled
@@ -79,3 +86,11 @@
innerClothingSkirt: ClothingUniformJumpskirtHoP
satchel: ClothingBackpackSatchelHOPFilled
duffelbag: ClothingBackpackDuffelHOPFilled
+
+- type: startingGear
+ id: HoPPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitHoP
+ head: ClothingHeadEnvirohelmHoP
+ gloves: ClothingHandsGlovesEnviroglovesHoP
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml
index a3bba1547a4e..b271a3d93584 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml
@@ -18,7 +18,9 @@
- Atmospherics
- type: startingGear
- id: AtmosphericTechnicianGear
+ id: AtmosphericTechnicianGear
+ subGear:
+ - AtmosphericTechnicianPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitAtmos
back: ClothingBackpackAtmospherics
@@ -28,3 +30,11 @@
innerClothingSkirt: ClothingUniformJumpskirtAtmos
satchel: ClothingBackpackSatchelEngineeringFilled
duffelbag: ClothingBackpackDuffelEngineeringFilled
+
+- type: startingGear
+ id: AtmosphericTechnicianPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitAtmos
+ head: ClothingHeadEnvirohelmAtmos
+ gloves: ClothingHandsGlovesEnviroglovesAtmos
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
index ea3cd532562a..494bbcfde19c 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
@@ -35,9 +35,16 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellPotato
- type: startingGear
id: ChiefEngineerGear
+ subGear:
+ - ChiefEngineerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitChiefEngineer
back: ClothingBackpackChiefEngineerFilled
@@ -47,3 +54,11 @@
innerClothingSkirt: ClothingUniformJumpskirtChiefEngineer
satchel: ClothingBackpackSatchelChiefEngineerFilled
duffelbag: ClothingBackpackDuffelChiefEngineerFilled
+
+- type: startingGear
+ id: ChiefEngineerPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitChiefEngineer
+ head: ClothingHeadEnvirohelmChiefEngineer
+ gloves: ClothingHandsGlovesEnviroglovesChiefEngineer
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
index 128779db94d9..20798178fa1a 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
@@ -24,6 +24,8 @@
- type: startingGear
id: SeniorEngineerGear
+ subGear:
+ - StationEngineerPlasmamanGear
equipment:
head: ClothingHeadHatBeretEngineering
jumpsuit: ClothingUniformJumpsuitSeniorEngineer
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
index dc5900451912..8169ff0e9c6d 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
@@ -20,6 +20,8 @@
- type: startingGear
id: StationEngineerGear
+ subGear:
+ - StationEngineerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitEngineering
back: ClothingBackpackEngineeringFilled
@@ -31,3 +33,11 @@
innerClothingSkirt: ClothingUniformJumpskirtEngineering
satchel: ClothingBackpackSatchelEngineeringFilled
duffelbag: ClothingBackpackDuffelEngineeringFilled
+
+- type: startingGear
+ id: StationEngineerPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitEngineering
+ head: ClothingHeadEnvirohelmEngineering
+ gloves: ClothingHandsGlovesEnviroglovesEngineering
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
index 668af727519a..ac472d9fc7b2 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
@@ -22,6 +22,8 @@
- type: startingGear
id: TechnicalAssistantGear
+ subGear:
+ - StationEngineerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorYellow
back: ClothingBackpackEngineeringFilled
diff --git a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml
index f1e8fc9cf877..7dd2aa1e92a7 100644
--- a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml
+++ b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: ERTLeaderGear
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTLeader
back: ClothingBackpackERTLeaderFilled
@@ -32,6 +34,8 @@
- type: startingGear
id: ERTLeaderGearEVA
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTLeader
back: ClothingBackpackERTLeaderFilled
@@ -49,6 +53,9 @@
- type: startingGear
id: ERTLeaderGearEVALecter
+ subGear:
+ - InhandTankGear
+ - ERTPlasmamanGearNoTank
equipment:
jumpsuit: ClothingUniformJumpsuitERTLeader
back: ClothingBackpackERTLeaderFilled
@@ -63,8 +70,6 @@
belt: ClothingBeltSecurityFilled
pocket1: MagazineRifle
pocket2: MagazineRifle
- inhand:
- - AirTankFilled
# Chaplain
- type: job
@@ -88,6 +93,8 @@
- type: startingGear
id: ERTChaplainGear
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTChaplain
back: ClothingBackpackERTChaplainFilled
@@ -105,6 +112,8 @@
- type: startingGear
id: ERTChaplainGearEVA
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTChaplain
back: ClothingBackpackERTChaplainFilled
@@ -139,6 +148,8 @@
- type: startingGear
id: ERTEngineerGear
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTEngineer
back: ClothingBackpackERTEngineerFilled
@@ -155,6 +166,8 @@
- type: startingGear
id: ERTEngineerGearEVA
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTEngineer
back: ClothingBackpackERTEngineerFilled
@@ -188,6 +201,8 @@
- type: startingGear
id: ERTSecurityGear
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTSecurity
back: ClothingBackpackERTSecurityFilled
@@ -204,6 +219,8 @@
- type: startingGear
id: ERTSecurityGearEVA
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTSecurity
back: ClothingBackpackERTSecurityFilled
@@ -221,6 +238,9 @@
- type: startingGear
id: ERTSecurityGearEVALecter
+ subGear:
+ - InhandTankGear
+ - ERTPlasmamanGearNoTank
equipment:
jumpsuit: ClothingUniformJumpsuitERTSecurity
back: ClothingBackpackERTSecurityFilled
@@ -235,8 +255,6 @@
belt: ClothingBeltSecurityFilled
pocket1: MagazineRifle
pocket2: MagazineRifle
- inhand:
- - AirTankFilled
# Medical
- type: job
@@ -256,6 +274,8 @@
- type: startingGear
id: ERTMedicalGear
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTMedic
back: ClothingBackpackERTMedicalFilled
@@ -271,6 +291,8 @@
- type: startingGear
id: ERTMedicalGearEVA
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTMedic
back: ClothingBackpackERTMedicalFilled
@@ -303,6 +325,8 @@
- type: startingGear
id: ERTJanitorGear
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTJanitor
back: ClothingBackpackERTJanitorFilled
@@ -317,6 +341,8 @@
- type: startingGear
id: ERTJanitorGearEVA
+ subGear:
+ - ERTPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitERTJanitor
back: ClothingBackpackERTJanitorFilled
diff --git a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
index b2cf3b879300..31e35077047c 100644
--- a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
+++ b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
@@ -20,6 +20,8 @@
# Syndicate Operative Outfit - Civilian
- type: startingGear
id: SyndicateOperativeGearCivilian
+ subGear:
+ - SyndicatePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSyndieFormal
back: ClothingBackpackDuffelSyndicate
@@ -31,6 +33,8 @@
#Space Ninja Outfit
- type: startingGear
id: SpaceNinjaGear
+ subGear:
+ - SpaceNinjaPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitNinja
# belt holds katana so satchel has the tools for sabotaging things
@@ -53,6 +57,8 @@
#Deathsquad Outfit
- type: startingGear
id: DeathSquadGear
+ subGear:
+ - ERTPlasmamanGear # TODO: death squad envirosuit
equipment:
jumpsuit: ClothingUniformJumpsuitDeathSquad
back: ClothingBackpackDeathSquadFilled
@@ -72,6 +78,8 @@
#Syndicate Operative Outfit - Full Kit
- type: startingGear
id: SyndicateOperativeGearFull
+ subGear:
+ - SyndicateOperativePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitOperative
back: ClothingBackpackDuffelSyndicateOperative
@@ -92,6 +100,8 @@
#Nuclear Operative Commander Gear
- type: startingGear
id: SyndicateCommanderGearFull
+ subGear:
+ - SyndicateOperativePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitOperative
back: ClothingBackpackDuffelSyndicateOperative
@@ -115,6 +125,8 @@
#Nuclear Operative Medic Gear
- type: startingGear
id: SyndicateOperativeMedicFull
+ subGear:
+ - SyndicateOperativePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitOperative
back: ClothingBackpackDuffelSyndicateOperativeMedic
@@ -135,6 +147,8 @@
# Syndicate Footsoldier Gear
- type: startingGear
id: SyndicateFootsoldierGear
+ subGear:
+ - SyndicateOperativePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitOperative
head: ClothingHeadHelmetSwatSyndicate
@@ -152,6 +166,8 @@
# Syndicate Footsoldier Gear - No Headset
- type: startingGear
id: SyndicateFootsoldierGearRuin
+ subGear:
+ - SyndicateOperativePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitOperative
head: ClothingHeadHelmetSwatSyndicate
@@ -168,6 +184,8 @@
# Nanotrasen Paramilitary Unit Gear
- type: startingGear
id: NanotrasenParamilitaryGear
+ subGear:
+ - SecurityOfficerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSec
back: ClothingBackpackSecurityFilled
@@ -185,6 +203,8 @@
#CBURN Unit Gear - Full Kit
- type: startingGear
id: CBURNGear
+ subGear:
+ - CBURNPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorBrown
back: ClothingBackpackDuffelCBURNFilled
@@ -220,6 +240,8 @@
- type: startingGear
id: LimitedPassengerGear
+ subGear:
+ - PassengerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorGrey
shoes: ClothingShoesColorBlack
@@ -229,6 +251,8 @@
- type: startingGear
id: DeathMatchGear
+ subGear:
+ - DeathMatchPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorWhite
shoes: ClothingShoesBootsJack
@@ -303,6 +327,8 @@
#Banana Clown
- type: startingGear
id: BananaClown
+ subGear:
+ - ClownPlasmamanGear # TODO: Banana clown plasmaman starting gear
equipment:
shoes: ClothingShoesClownBanana
jumpsuit: ClothingUniformJumpsuitClownBanana
diff --git a/Resources/Prototypes/Roles/Jobs/Fun/plasmaman_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/plasmaman_startinggear.yml
new file mode 100644
index 000000000000..bec0c1eb4599
--- /dev/null
+++ b/Resources/Prototypes/Roles/Jobs/Fun/plasmaman_startinggear.yml
@@ -0,0 +1,109 @@
+# Base Plasmaman starting gear that all plasmaman starting gears should inherit from
+- type: startingGear
+ abstract: true
+ id: BasePlasmamanGear
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species: [ Plasmaman ]
+ equipment:
+ mask: ClothingMaskBreath
+ pocket2: DoubleEmergencyPlasmaTankFilled
+
+- type: startingGear
+ abstract: true
+ parent: BasePlasmamanGear
+ id: BasePlasmamanSecurityGear
+ equipment:
+ mask: ClothingMaskGasSecurity
+
+# Syndicate Operative Plasmaman outfit
+- type: startingGear
+ abstract: true
+ id: BaseSyndicatePlasmamanGear
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species: [ Plasmaman ]
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitOperative
+ head: ClothingHeadEnvirohelmOperative
+ mask: ClothingMaskGasSyndicate
+ # No envirogloves, some starting gear might have combat gloves
+
+- type: startingGear
+ id: SyndicatePlasmamanGear
+ parent: BaseSyndicatePlasmamanGear
+ equipment:
+ pocket2: DoubleEmergencyPlasmaTankFilled
+
+- type: startingGear
+ id: SyndicateOperativePlasmamanGear
+ parent: BaseSyndicatePlasmamanGear
+ equipment:
+ pocket1: DoubleEmergencyPlasmaTankFilled
+
+- type: startingGear
+ id: SpaceNinjaPlasmamanGear
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species: [ Plasmaman ]
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitColorBlack # TODO: actual ninja envirosuit
+ suitstorage: PlasmaTankFilledInternals
+
+# ERT starting gear
+- type: startingGear
+ id: ERTPlasmamanGearNoTank
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species: [ Plasmaman ]
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitColorBlack # TODO: ERT envirosuit
+ head: ClothingHeadEnvirohelmColorBlack # TODO: ERT envirohelm
+ mask: ClothingMaskGasERT
+
+- type: startingGear
+ id: ERTPlasmamanGear
+ parent: ERTPlasmamanGearNoTank
+ equipment:
+ suitstorage: PlasmaTankFilledInternals
+
+- type: startingGear
+ id: CBURNPlasmamanGear
+ parent: ERTPlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitColorLightBrown
+ head: ClothingHeadEnvirohelmColorLightBrown
+
+- type: startingGear
+ id: InhandTankGear
+ subGear:
+ - InhandOxygenTankGear
+ - InhandPlasmaTankGear
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species: [ Plasmaman ]
+
+- type: startingGear
+ id: InhandOxygenTankGear
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species: [ Plasmaman ]
+ inhand:
+ - AirTankFilled
+
+- type: startingGear
+ id: InhandPlasmaTankGear
+ requirements:
+ - !type:CharacterSpeciesRequirement
+ species: [ Plasmaman ]
+ inhand:
+ - PlasmaTankFilledInternals
+
+- type: startingGear
+ id: DeathMatchPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitColorWhite
+ head: ClothingHeadEnvirohelmColorWhite
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml
index 12e457ac2e11..50fceea45145 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml
@@ -23,6 +23,8 @@
- type: startingGear
id: ChemistGear
+ subGear:
+ - ChemistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitChemistry
back: ClothingBackpackChemistryFilled
@@ -32,3 +34,11 @@
innerClothingSkirt: ClothingUniformJumpskirtChemistry
satchel: ClothingBackpackSatchelChemistryFilled
duffelbag: ClothingBackpackDuffelChemistryFilled
+
+- type: startingGear
+ id: ChemistPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitChemist
+ head: ClothingHeadEnvirohelmChemist
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
index 6a1e16bccc2e..1c9536eab543 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
@@ -45,9 +45,16 @@
- type: CPRTraining
- type: SurgerySpeedModifier
speedModifier: 2.5
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: CMOGear
+ subGear:
+ - CMOPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitCMO
back: ClothingBackpackCMOFilled
@@ -57,3 +64,11 @@
innerClothingSkirt: ClothingUniformJumpskirtCMO
satchel: ClothingBackpackSatchelCMOFilled
duffelbag: ClothingBackpackDuffelCMOFilled
+
+- type: startingGear
+ id: CMOPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitCMO
+ head: ClothingHeadEnvirohelmCMO
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
index 8d37afdc51a2..427771575dd5 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
@@ -25,6 +25,8 @@
- type: startingGear
id: DoctorGear
+ subGear:
+ - DoctorPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMedicalDoctor
back: ClothingBackpackMedicalFilled
@@ -34,3 +36,11 @@
innerClothingSkirt: ClothingUniformJumpskirtMedicalDoctor
satchel: ClothingBackpackSatchelMedicalFilled
duffelbag: ClothingBackpackDuffelMedicalFilled
+
+- type: startingGear
+ id: DoctorPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitMedicalDoctor
+ head: ClothingHeadEnvirohelmMedicalDoctor
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml
index 5492d02e09ee..a6b0ae543f33 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml
@@ -1,4 +1,4 @@
-- type: job
+- type: job
id: MedicalIntern
name: job-name-intern
description: job-description-intern
@@ -24,6 +24,8 @@
- type: startingGear
id: MedicalInternGear
+ subGear:
+ - DoctorPlasmamanGear
equipment:
jumpsuit: UniformScrubsColorBlue # DeltaV - Intern starts with blue scrubs
back: ClothingBackpackMedicalFilled
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
index 92c5b1857c5f..454322a92cb6 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
@@ -32,6 +32,8 @@
- type: startingGear
id: ParamedicGear
+ subGear:
+ - ParamedicPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitParamedic
back: ClothingBackpackParamedicFilledDV
@@ -44,3 +46,12 @@
innerClothingSkirt: ClothingUniformJumpskirtParamedic
satchel: ClothingBackpackSatchelParamedicFilledDV
duffelbag: ClothingBackpackDuffelParamedicFilledDV
+
+- type: startingGear
+ id: ParamedicPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitParamedic
+ head: ClothingHeadEnvirohelmParamedic
+ gloves: ClothingHandsGlovesEnviroglovesNitrile
+ shoes: ClothingShoesColorBlue
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
index 4ff52e14490b..1c5eba7a1142 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
@@ -29,6 +29,8 @@
- type: startingGear
id: SeniorPhysicianGear
+ subGear:
+ - DoctorPlasmamanGear
equipment:
head: ClothingHeadHatBeretSeniorPhysician
jumpsuit: ClothingUniformJumpsuitSeniorPhysician
diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml b/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml
index 5bcc71854650..64c007b05748 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml
@@ -1,4 +1,4 @@
-- type: job
+- type: job
id: ResearchAssistant
name: job-name-research-assistant
description: job-description-research-assistant
@@ -18,6 +18,8 @@
- type: startingGear
id: ResearchAssistantGear
+ subGear:
+ - ScientistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorWhite
back: ClothingBackpackScienceFilled
diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
index 0db869e3b3b5..a6f0dd7a6392 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
@@ -55,9 +55,16 @@
- DispelPower
- MetapsionicPower
- TelepathyPower
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: ResearchDirectorGear
+ subGear:
+ - ResearchDirectorPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitResearchDirector
back: ClothingBackpackResearchDirectorFilled
@@ -69,3 +76,11 @@
innerClothingSkirt: ClothingUniformJumpskirtResearchDirector
satchel: ClothingBackpackSatchelResearchDirectorFilled
duffelbag: ClothingBackpackDuffelResearchDirectorFilled
+
+- type: startingGear
+ id: ResearchDirectorPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitResearchDirector
+ head: ClothingHeadEnvirohelmResearchDirector
+ gloves: ClothingHandsGlovesEnviroglovesResearchDirector
diff --git a/Resources/Prototypes/Roles/Jobs/Science/roboticist.yml b/Resources/Prototypes/Roles/Jobs/Science/roboticist.yml
index 8b7611e7a4c5..1aff597566de 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/roboticist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/roboticist.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: RoboticistGear
+ subGear:
+ - RoboticistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitRoboticist
back: ClothingBackpackRoboticsFilled
@@ -27,3 +29,11 @@
innerClothingSkirt: ClothingUniformJumpskirtRoboticist
satchel: ClothingBackpackSatchelRoboticsFilled
duffelbag: ClothingBackpackDuffelRoboticsFilled
+
+- type: startingGear
+ id: RoboticistPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitRoboticist
+ head: ClothingHeadEnvirohelmRoboticist
+ gloves: ClothingHandsGlovesEnviroglovesRoboticist
diff --git a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
index ea4af6a6fbc7..40dc7926b83e 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: ScientistGear
+ subGear:
+ - ScientistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitScientist
back: ClothingBackpackScienceFilled
@@ -27,3 +29,11 @@
innerClothingSkirt: ClothingUniformJumpskirtScientist
satchel: ClothingBackpackSatchelScienceFilled
duffelbag: ClothingBackpackDuffelScienceFilled
+
+- type: startingGear
+ id: ScientistPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitScientist
+ head: ClothingHeadEnvirohelmScientist
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml
index 8984fe79ff9b..5ca5ccb1d8c4 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: SeniorResearcherGear
+ subGear:
+ - ScientistPlasmamanGear
equipment:
head: ClothingHeadHatBeretRND
jumpsuit: ClothingUniformJumpsuitSeniorResearcher
diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml
index 04dc55bc1f08..5a4b24b60b12 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml
@@ -22,9 +22,16 @@
special:
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 6
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
- id: DetectiveGear
+ id: DetectiveGear
+ subGear:
+ - DetectivePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitDetective
back: ClothingBackpackSecurity
@@ -38,3 +45,11 @@
innerClothingSkirt: ClothingUniformJumpskirtDetective
satchel: ClothingBackpackSatchelSecurity
duffelbag: ClothingBackpackDuffelSecurity
+
+- type: startingGear
+ id: DetectivePlasmamanGear
+ parent: BasePlasmamanSecurityGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitDetective
+ head: ClothingHeadEnvirohelmDetective
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
index a815ed32e6d6..e27233da9772 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
@@ -40,9 +40,16 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: HoSGear
+ subGear:
+ - HoSPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitHoS
back: ClothingBackpackHOSFilled
@@ -55,3 +62,11 @@
innerClothingSkirt: ClothingUniformJumpskirtHoS
satchel: ClothingBackpackSatchelHOSFilled
duffelbag: ClothingBackpackDuffelHOSFilled
+
+- type: startingGear
+ id: HoSPlasmamanGear
+ parent: BasePlasmamanSecurityGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitHoS
+ head: ClothingHeadEnvirohelmHoS
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml
index 6596c2142d0c..a99f24b2b6f6 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml
@@ -24,9 +24,16 @@
special:
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 6
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: SecurityCadetGear
+ subGear:
+ - SecurityOfficerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorRed
back: ClothingBackpackSecurity
diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
index 2fd44505b82c..066a592845b6 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
@@ -21,9 +21,16 @@
special:
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 6
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: SecurityOfficerGear
+ subGear:
+ - SecurityOfficerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSec
back: ClothingBackpackSecurity
@@ -37,3 +44,11 @@
innerClothingSkirt: ClothingUniformJumpskirtSec
satchel: ClothingBackpackSatchelSecurity
duffelbag: ClothingBackpackDuffelSecurity
+
+- type: startingGear
+ id: SecurityOfficerPlasmamanGear
+ parent: BasePlasmamanSecurityGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitSec
+ head: ClothingHeadEnvirohelmSec
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
index 041e063f7a02..584132d0bc1a 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
@@ -30,9 +30,16 @@
special:
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 6
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: SeniorOfficerGear
+ subGear:
+ - SecurityOfficerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSeniorOfficer
back: ClothingBackpackSecurity
diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml
index 5f68518b084e..8533f9cc3482 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml
@@ -27,9 +27,16 @@
special:
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 6
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: WardenGear
+ subGear:
+ - WardenPlasmamanGear
equipment:
head: ClothingHeadHatWarden
jumpsuit: ClothingUniformJumpsuitWarden
@@ -43,3 +50,11 @@
innerClothingSkirt: ClothingUniformJumpskirtWarden
satchel: ClothingBackpackSatchelSecurity
duffelbag: ClothingBackpackDuffelSecurity
+
+- type: startingGear
+ id: WardenPlasmamanGear
+ parent: BasePlasmamanSecurityGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitWarden
+ head: ClothingHeadEnvirohelmWarden
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml
index 65739809da00..89c5c0f1e602 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml
@@ -20,6 +20,8 @@
- type: startingGear
id: BoxerGear
+ subGear:
+ - BoxerPlasmamanGear
equipment:
jumpsuit: UniformShortsRed
back: ClothingBackpackFilled
@@ -31,3 +33,11 @@
innerClothingSkirt: UniformShortsRedWithTop
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: BoxerPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitBoxing
+ head: ClothingHeadEnvirohelmBoxing
+ # No envirogloves, use the boxing gloves instead
diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml
index a2974c6eb7a3..1391bd0cba7f 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml
@@ -21,6 +21,8 @@
- type: startingGear
id: PsychologistGear
+ subGear:
+ - PsychologistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitPsychologist
back: ClothingBackpackPsychologistFilled #DeltaV - stamp included
@@ -30,3 +32,11 @@
innerClothingSkirt: ClothingUniformJumpsuitPsychologist
satchel: ClothingBackpackSatchelPsychologistFilled #DeltaV - stamp included
duffelbag: ClothingBackpackDuffelPsychologistFilled #DeltaV - stamp included
+
+- type: startingGear
+ id: PsychologistPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitEnviroslacksPsychologist
+ head: ClothingHeadEnvirohelmMedicalDoctor
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml
index ad810e970e97..f6118ff3488a 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml
@@ -17,6 +17,8 @@
- type: startingGear
id: ReporterGear
+ subGear:
+ - ReporterPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitReporter
back: ClothingBackpackFilled
@@ -26,3 +28,11 @@
innerClothingSkirt: ClothingUniformJumpsuitJournalist
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: ReporterPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitReporter
+ head: ClothingHeadEnvirohelmReporter
+ gloves: ClothingHandsGlovesEnviroglovesReporter
diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml
index 1686e3290faf..d1d1b2c6e935 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: ZookeeperGear
+ subGear:
+ - ZookeeperPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSafari
back: ClothingBackpackFilled
@@ -26,3 +28,11 @@
innerClothingSkirt: ClothingUniformJumpsuitSafari
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
+
+- type: startingGear
+ id: ZookeeperPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitSafari
+ head: ClothingHeadEnvirohelmSafari
+ gloves: ClothingHandsGlovesEnviroglovesPurple
diff --git a/Resources/Prototypes/SoundCollections/punching.yml b/Resources/Prototypes/SoundCollections/punching.yml
index e17afd09789d..8d57114c0cea 100644
--- a/Resources/Prototypes/SoundCollections/punching.yml
+++ b/Resources/Prototypes/SoundCollections/punching.yml
@@ -5,3 +5,11 @@
- /Audio/Weapons/punch2.ogg
- /Audio/Weapons/punch3.ogg
- /Audio/Weapons/punch4.ogg
+
+- type: soundCollection
+ id: FirePunch
+ files:
+ - /Audio/Weapons/firepunch1.ogg
+ - /Audio/Weapons/firepunch2.ogg
+ - /Audio/Weapons/firepunch3.ogg
+ - /Audio/Weapons/firepunch4.ogg
diff --git a/Resources/Prototypes/SoundCollections/screams.yml b/Resources/Prototypes/SoundCollections/screams.yml
index 518bbf72bb7e..99a0d343d553 100644
--- a/Resources/Prototypes/SoundCollections/screams.yml
+++ b/Resources/Prototypes/SoundCollections/screams.yml
@@ -68,3 +68,10 @@
- /Audio/Voice/Slime/slime_scream_m2.ogg
- /Audio/Voice/Slime/slime_scream_f1.ogg
- /Audio/Voice/Slime/slime_scream_f2.ogg
+
+- type: soundCollection
+ id: PlasmamanUnisexScreams
+ files:
+ - /Audio/Voice/Plasmaman/plasmaman_scream_1.ogg
+ - /Audio/Voice/Plasmaman/plasmaman_scream_2.ogg
+ - /Audio/Voice/Plasmaman/plasmaman_scream_3.ogg
diff --git a/Resources/Prototypes/Species/plasmaman.yml b/Resources/Prototypes/Species/plasmaman.yml
new file mode 100644
index 000000000000..5ff96babaf7c
--- /dev/null
+++ b/Resources/Prototypes/Species/plasmaman.yml
@@ -0,0 +1,171 @@
+- type: species
+ id: Plasmaman
+ name: species-name-plasmaman
+ roundStart: true
+ prototype: MobPlasmaman
+ sprites: MobPlasmamanSprites
+ defaultSkinTone: "#a349a4"
+ markingLimits: MobPlasmamanMarkingLimits
+ dollPrototype: MobPlasmamanDummy
+ skinColoration: Hues
+ youngAge: 60
+ oldAge: 120
+ maxAge: 180
+ maleFirstNames: names_plasmaman
+ femaleFirstNames: names_plasmaman
+ naming: FirstRoman
+ sexes:
+ - Unsexed
+
+- type: speciesBaseSprites
+ id: MobPlasmamanSprites
+ sprites:
+ Head: MobPlasmamanHead
+ Face: MobHumanoidAnyMarking
+ Chest: MobPlasmamanTorso
+ Eyes: MobPlasmamanEyes
+ LArm: MobPlasmamanLArm
+ RArm: MobPlasmamanRArm
+ LHand: MobPlasmamanLHand
+ RHand: MobPlasmamanRHand
+ LLeg: MobPlasmamanLLeg
+ RLeg: MobPlasmamanRLeg
+ LFoot: MobPlasmamanLFoot
+ RFoot: MobPlasmamanRFoot
+
+- type: markingPoints
+ id: MobPlasmamanMarkingLimits
+ onlyWhitelisted: true # Hides the hair and facial hair options
+ points:
+ Hair:
+ points: 0
+ required: false
+ FacialHair:
+ points: 0
+ required: false
+ Snout:
+ points: 0
+ required: false
+ Tail:
+ points: 0
+ required: false
+ HeadTop:
+ points: 1
+ required: false
+ Chest:
+ points: 1
+ required: false
+ RightLeg:
+ points: 2
+ required: false
+ RightFoot:
+ points: 2
+ required: false
+ LeftLeg:
+ points: 2
+ required: false
+ LeftFoot:
+ points: 2
+ required: false
+ RightArm:
+ points: 2
+ required: false
+ RightHand:
+ points: 2
+ required: false
+ LeftArm:
+ points: 2
+ required: false
+ LeftHand:
+ points: 2
+ required: false
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanHead
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: head_m
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanHeadMale
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: head_m
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanHeadFemale
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: head_f
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanEyes
+ baseSprite:
+ sprite: Mobs/Customization/plasmaman.rsi
+ state: eyes
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanTorso
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: torso_m
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanTorsoMale
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: torso_m
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanTorsoFemale
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: torso_f
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanLLeg
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: l_leg
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanLArm
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: l_arm
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanLHand
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: l_hand
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanLFoot
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: l_foot
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanRLeg
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: r_leg
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanRArm
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: r_arm
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanRHand
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: r_hand
+
+- type: humanoidBaseSprite
+ id: MobPlasmamanRFoot
+ baseSprite:
+ sprite: Mobs/Species/Plasmaman/parts.rsi
+ state: r_foot
diff --git a/Resources/Prototypes/Species/species_weights.yml b/Resources/Prototypes/Species/species_weights.yml
index d158862d38ba..cc342f7b1bf7 100644
--- a/Resources/Prototypes/Species/species_weights.yml
+++ b/Resources/Prototypes/Species/species_weights.yml
@@ -10,3 +10,4 @@
Vulpkanin: 4 # DeltaV - Vulpkanin, see Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml
Diona: 2
Shadowkin: 0
+ Chitinid: 3 # DeltaV - Chitinid, see Prototypes/DeltaV/Entities/Mobs/Species/chitinid.yml
diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml
index ede5deb89747..9c3c21e19f01 100644
--- a/Resources/Prototypes/Traits/disabilities.yml
+++ b/Resources/Prototypes/Traits/disabilities.yml
@@ -236,6 +236,7 @@
species:
- IPC
- Lamia
+ - Plasmaman
functions:
- !type:TraitAddComponent
components:
@@ -257,6 +258,7 @@
species:
- IPC
- Lamia
+ - Plasmaman
functions:
- !type:TraitAddComponent
components:
diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml
index 8ea7006c0c8e..a13e8ee10e5d 100644
--- a/Resources/Prototypes/Traits/neutral.yml
+++ b/Resources/Prototypes/Traits/neutral.yml
@@ -42,6 +42,20 @@
components:
- type: SouthernAccent
+- type: trait
+ id: SkeletonAccent
+ category: TraitsSpeechAccents
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: TraitsAccents
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Plasmaman
+ functions:
+ - !type:TraitAddComponent
+ components:
+ - type: SkeletonAccent
+
- type: trait
id: NormalVision
category: Visual
diff --git a/Resources/Prototypes/Traits/physical.yml b/Resources/Prototypes/Traits/physical.yml
index 812765702e18..a324af4d74fc 100644
--- a/Resources/Prototypes/Traits/physical.yml
+++ b/Resources/Prototypes/Traits/physical.yml
@@ -307,6 +307,7 @@
Blunt: 1.2
Slash: 1.2
Piercing: 1.2
+ Heat: 1.2
Poison: 1.2
Asphyxiation: 1.2
# An attack rate of 1.25 hits per second (1 / 0.8 = 1.25) multiplied by 20% extra damage
@@ -377,6 +378,13 @@
types:
Piercing: 5 # No, this isn't "OP", this is literally the worst brute damage type in the game.
# Same deal as Slash, except that a majority of all armor provides Piercing resistance.
+ - !type:TraitRemoveComponent # Plasmamen have self-damage on melee attacks
+ components:
+ - type: DamageOnHit
+ damage:
+ types:
+ Blunt: 0
+
- type: trait
id: Claws
@@ -403,6 +411,12 @@
types:
Slash: 5 # Trade stamina damage on hit for a very minor amount of extra bleed.
# Blunt also deals bleed damage, so this is more of a sidegrade.
+ - !type:TraitRemoveComponent
+ components:
+ - type: DamageOnHit
+ damage:
+ types:
+ Blunt: 0
- type: trait
id: NaturalWeaponRemoval
@@ -433,6 +447,12 @@
damage:
types:
Blunt: 5
+ - !type:TraitRemoveComponent
+ components:
+ - type: DamageOnHit
+ damage:
+ types:
+ Blunt: 0
- type: trait
id: StrikingCalluses
diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml
index 04845764adac..3402b0b72482 100644
--- a/Resources/Prototypes/Voice/speech_emote_sounds.yml
+++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml
@@ -770,3 +770,13 @@
path: /Audio/Animals/parrot_raught.ogg
params:
variation: 0.125
+
+- type: emoteSounds
+ id: UnisexPlasmaman
+ params:
+ variation: 0.125
+ sounds:
+ Scream:
+ collection: PlasmamanUnisexScreams
+ sound:
+ path: /Audio/Voice/Skeleton/skeleton_scream.ogg
diff --git a/Resources/Prototypes/Voice/speech_verbs.yml b/Resources/Prototypes/Voice/speech_verbs.yml
index 3f0a4c10fce1..6f9db71a5f12 100644
--- a/Resources/Prototypes/Voice/speech_verbs.yml
+++ b/Resources/Prototypes/Voice/speech_verbs.yml
@@ -77,6 +77,8 @@
- chat-speech-verb-skeleton-1
- chat-speech-verb-skeleton-2
- chat-speech-verb-skeleton-3
+ - chat-speech-verb-skeleton-4
+ - chat-speech-verb-skeleton-5
- type: speechVerb
id: Slime
diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Mech/Weapons/Melee/combat.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Mech/Weapons/Melee/combat.yml
index dcb7ecfb45cd..85a5aeea01c7 100644
--- a/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Mech/Weapons/Melee/combat.yml
+++ b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Mech/Weapons/Melee/combat.yml
@@ -13,7 +13,7 @@
wideAnimationRotation: -90
soundHit:
path: "/Audio/Weapons/chainsaw.ogg"
- attackRate: 3.5
+ attackRate: 0.3
damage:
types:
Structural: 35
diff --git a/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/blueshield_officer.yml b/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/blueshield_officer.yml
index cfd728a2a11f..9c1a50f9e4c7 100644
--- a/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/blueshield_officer.yml
+++ b/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/blueshield_officer.yml
@@ -39,9 +39,16 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: BlueshieldOfficerGear
+ subGear:
+ - BlueshieldPlasmamanGear
equipment:
back: ClothingBackpackBlueshield
jumpsuit: ClothingUniformJumpsuitBlueshieldOfficer
@@ -57,3 +64,11 @@
#belt: ClothingBeltSecurityFilled
#pocket1: WeaponPistolMk58
#pocket2: DeathAcidifierImplanter
+
+- type: startingGear
+ id: BlueshieldPlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitBlueshield
+ head: ClothingHeadEnvirohelmBlueshield
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/magistrate.yml b/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/magistrate.yml
index 1e97aee0d324..13f74d3dfd5a 100644
--- a/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/magistrate.yml
+++ b/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/magistrate.yml
@@ -34,9 +34,16 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: MagistrateGear
+ subGear:
+ - MagistratePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMagistrate
shoes: ClothingShoesLeather
@@ -44,3 +51,11 @@
id: CentcomPDA
ears: ClothingHeadsetMagistrate
pocket1: UniqueMagistrateLockerTeleporter
+
+- type: startingGear
+ id: MagistratePlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitMagistrate
+ head: ClothingHeadEnvirohelmMagistrate
+ gloves: ClothingHandsGlovesEnviroglovesWhite
diff --git a/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/nanotrasen_representative.yml b/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/nanotrasen_representative.yml
index 290a73e392c7..515828560866 100644
--- a/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/nanotrasen_representative.yml
+++ b/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/nanotrasen_representative.yml
@@ -33,12 +33,27 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: NanotrasenRepresentativeGear
+ subGear:
+ - NanotrasenRepresentativePlasmamanGear
equipment:
shoes: ClothingShoesColorBlack
id: CentcomPDA
jumpsuit: ClothingUniformJumpsuitNanotrasenRepresentative
ears: ClothingHeadsetCentCom
pocket1: UniqueNanorepLockerTeleporter
+
+- type: startingGear
+ id: NanotrasenRepresentativePlasmamanGear
+ parent: BasePlasmamanGear
+ equipment:
+ jumpsuit: ClothingUniformEnvirosuitNanotrasenRepresentative
+ head: ClothingHeadEnvirohelmNanotrasenRepresentative
+ gloves: ClothingHandsGlovesEnviroglovesBlack
diff --git a/Resources/Prototypes/fonts.yml b/Resources/Prototypes/fonts.yml
index c61a5fb8041d..231c551e4dcd 100644
--- a/Resources/Prototypes/fonts.yml
+++ b/Resources/Prototypes/fonts.yml
@@ -69,3 +69,12 @@
- type: font
id: Cambria
path: /Fonts/Cambria.ttf
+
+- type: font
+ id: LDFComicSans
+ path: /Fonts/LDFComicSans/LDFComicSans-Medium.ttf
+
+- type: font
+ id: OnlyYou
+ path: /Fonts/Only_You.otf
+
diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml
index 759c6eefe5df..83fc9bd23112 100644
--- a/Resources/Prototypes/tags.yml
+++ b/Resources/Prototypes/tags.yml
@@ -600,6 +600,9 @@
- type: Tag
id: EmitterBolt
+- type: Tag
+ id: Envirohelm
+
- type: Tag
id: Enzyme
@@ -1073,6 +1076,9 @@
- type: Tag
id: PlasmaGlassShard
+- type: Tag
+ id: PlasmamanSafe
+
- type: Tag
id: Plastic
diff --git a/Resources/Prototypes/typing_indicator.yml b/Resources/Prototypes/typing_indicator.yml
index 7e8c92787feb..11f339454f2a 100644
--- a/Resources/Prototypes/typing_indicator.yml
+++ b/Resources/Prototypes/typing_indicator.yml
@@ -53,3 +53,11 @@
id: oni
typingState: oni0
offset: 0, 0.0625
+
+- type: typingIndicator
+ id: plasmaman
+ typingState: plasmaman0
+
+- type: typingIndicator
+ id: skeleton
+ typingState: skeleton0
diff --git a/Resources/ServerInfo/Guidebook/Mobs/DeltaV/Chitinid.xml b/Resources/ServerInfo/Guidebook/Mobs/DeltaV/Chitinid.xml
new file mode 100644
index 000000000000..29dde13c0f72
--- /dev/null
+++ b/Resources/ServerInfo/Guidebook/Mobs/DeltaV/Chitinid.xml
@@ -0,0 +1,28 @@
+
+ # Chitinid
+
+
+
+
+
+ An industrious worker drone species, the Chitinid are strong diligent workers. Thanks to their homeworld's enviroment, they have grown an acute resistance to radiation, but not without its side effects.
+
+ ## Diet
+ - Nothing special.
+
+ ## Benefits
+ - Takes 80% less Radiation, 10% less Slash.
+ - Their bodies naturally recover from light radiation damage up to a point, once they accumulate enough radiation they must purge it from their systems in the form of a small rock.
+ - Due to their worker drone nature they are Better at pulling and carrying things.
+ - Due to their radioactive homeworld they possess a bio light.
+
+ ## Drawbacks
+ - Built for work rather than combat their hard shells are weaker to Blunt and piercing damage, they take 25% more piercing and 15% more Blunt damage.
+ - Due to their hard shells normal syringes can not pierce them, requiring hypos to bypass the toughness.
+ - Thanks to their overactive systems they get hungry 33% faster.
+ - The cold does not agree with their biology and makes their movement sluggish, the cold also harms them more than others.
+ - They are deceptivly heavy due to their lifestyle and diet.
+ - The Chitzite they expel is slightly radioactive.
+ - Bug Blood.
+
+
diff --git a/Resources/ServerInfo/Guidebook/Mobs/Plasmaman.xml b/Resources/ServerInfo/Guidebook/Mobs/Plasmaman.xml
new file mode 100644
index 000000000000..d0c41a3100ca
--- /dev/null
+++ b/Resources/ServerInfo/Guidebook/Mobs/Plasmaman.xml
@@ -0,0 +1,73 @@
+
+ # Plasmamen
+
+
+
+
+
+ They breathe plasma, and oxygen is highly toxic to them when inhaled.
+ Being exposed to oxygen sets them on fire.
+
+ To prevent ignition, they wear sealed suits made up of an envirosuit (in the jumpsuit slot) and a [bold]spaceworthy[/bold] envirosuit helmet.
+ Other suits like EVA suits, vacsuits, tacsuits and hardsuits will also seal them from oxygen exposure.
+
+ They don't experience hunger nor thirst.
+ They don't have blood and cannot bleed out.
+
+ Due to their skeleton body, they can consume Milk to gain a positive moodlet and slowly heal Brute, Heat, Shock, and Caustic damage.
+ They can also consume Plasma to gain a bigger positive moodlet and heal every damage type faster, except for Cellular damage.
+
+
+
+
+
+
+ They infuse their fists with plasma dust that combusts when they punch, dealing [color=orange]5 Heat[/color] and [color=red]2.25 Blunt[/color] damage. However, each successful punch deals [color=orange]1 Heat[/color] damage to their hands.
+
+ Plasmamen with the traits [bold]Claws[/bold], [bold]Talons[/bold] or [bold]Natural Weapons Removal[/bold] have less unarmed damage but don't take self-damage from unarmed attacks.
+
+ They take [color=#1e90ff]25% less Piercing, 20% less Poison, and 15% less Slash damage[/color],
+ and are [color=#8658fc]immune to Radiation and Cold damage[/color],
+ but take [color=#ffa500]50% more Blunt and 50% more Heat damage[/color].
+
+ Due to their [color=#8658fc]Cold immunity[/color], they can live in cold environments such as Glacier Station without the need of a winter coat.
+
+ ## Equipment
+
+
+
+
+
+
+ All Plasmamen start with an envirosuit, an envirosuit helmet, and a plasma internals tank.
+
+ Their envirosuits contain a [color=#1e90ff]self-extinguisher[/color] with limited charges, which they can activate when they are on fire
+ and wearing their envirosuit helmet. The self-extinguisher needs to recharge between uses.
+
+
+ Cartridge refills of the envirosuit's self-extinguisher can be bought in [bold]Loadouts[/bold], or printed at the medical techfab after research.
+ A refill makes a recharging self-extinguisher immediately usable again.
+
+
+
+ Their envirosuit helmets are [bold]spaceworthy[/bold] and provide welding protection. The helmet's visor can be lit up like a flashlight, using the inserted power cell as a battery.
+ They cannot eat nor drink without taking off their envirosuit helmet.
+
+ The plasma internals tank lasts roughly an hour before needing to be replaced or refilled.
+
+ ## Medical Treatment
+
+
+
+
+ Before performing surgery on a Plasmaman, their envirosuit needs to be unequipped first, which is disastrous in an oxygenated environment.
+
+ To get around this, the Plasmaman can be buckled to a [bold]stasis bed[/bold] before removing their envirosuit
+ to prevent them from self-igniting throughout the surgical procedure.
+
+
+ Their envirosuit helmets prevents them from eating pills, but their envirosuits allow chemicals to be injected through them.
+
+
+
+
diff --git a/Resources/ServerInfo/Guidebook/Mobs/Species.xml b/Resources/ServerInfo/Guidebook/Mobs/Species.xml
index cb74fd50c941..261fc666f199 100644
--- a/Resources/ServerInfo/Guidebook/Mobs/Species.xml
+++ b/Resources/ServerInfo/Guidebook/Mobs/Species.xml
@@ -13,6 +13,7 @@
+
# Parkstation specific species
diff --git a/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/equipped-HAND.png
new file mode 100644
index 000000000000..9dc8e63a7371
Binary files /dev/null and b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/equipped-HAND.png differ
diff --git a/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/icon.png
new file mode 100644
index 000000000000..1906b6b59540
Binary files /dev/null and b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/inhand-left.png
new file mode 100644
index 000000000000..2016841f044d
Binary files /dev/null and b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/inhand-right.png
new file mode 100644
index 000000000000..7bf0e1e75a6e
Binary files /dev/null and b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/meta.json
new file mode 100644
index 000000000000..e28954bcefa1
--- /dev/null
+++ b/Resources/Textures/Clothing/Hands/Gloves/Envirogloves/hop.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Inhand and equipped taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e and modified by Flareguy for Space Station 14 and modified by Skubman | Icon taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c77c50ae3d19e763c60c44e75c7bf9d61e333875",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-HAND",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..873fa47b2be3
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/icon-flash.png
new file mode 100644
index 000000000000..edc62605aed1
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/icon.png
new file mode 100644
index 000000000000..982f4081023c
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/meta.json
new file mode 100644
index 000000000000..21fd8d52aae6
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "visor-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/visor-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/visor-equipped-HELMET.png
new file mode 100644
index 000000000000..6c86bc9ecb99
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ancientvoid.rsi/visor-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..6c3e99f1114f
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/icon.png
new file mode 100644
index 000000000000..1abcea97c4dd
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/atmos.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..2988ab5d966a
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/icon.png
new file mode 100644
index 000000000000..4e39d2d54bb2
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/meta.json
new file mode 100644
index 000000000000..efe0ef824eaf
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/captain.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..b33768989818
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/icon.png
new file mode 100644
index 000000000000..e7a4d554b277
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cargo.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..baf8c4a5ed05
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/icon.png
new file mode 100644
index 000000000000..2644d0774c8d
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/ce.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..43ced855d888
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/icon.png
new file mode 100644
index 000000000000..ebf672af7a91
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_agent.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..1786d88729fc
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/icon.png
new file mode 100644
index 000000000000..6f7c4bdc549e
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_officer.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..ff26b7a61c9b
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/icon.png
new file mode 100644
index 000000000000..2d8f37ab002f
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/centcom_official.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..51e2292e5fcf
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/icon.png
new file mode 100644
index 000000000000..216c812a2378
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chaplain.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..3c845ae012f7
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/icon.png
new file mode 100644
index 000000000000..17b1b704af00
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/chemist.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..bbe11f6c75d0
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/icon-flash.png
new file mode 100644
index 000000000000..a59d97aca614
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/icon.png
new file mode 100644
index 000000000000..f5ad4ede171a
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..ba076ac70046
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/clown.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..3a6e85f8a9fa
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/icon.png
new file mode 100644
index 000000000000..0dd662f8b18f
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/cmo.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..1ed81414a259
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/icon.png
new file mode 100644
index 000000000000..b2f56d60032a
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/coroner.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-equipped-HELMET.png
new file mode 100644
index 000000000000..f89fa545ab98
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-icon.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-icon.png
new file mode 100644
index 000000000000..c596f992100d
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-inhand-left.png
new file mode 100644
index 000000000000..dc1f29bb64bc
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-inhand-right.png
new file mode 100644
index 000000000000..c480d547c138
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/accent-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..cd9f53385108
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/icon.png
new file mode 100644
index 000000000000..3340f25bf7cd
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/inhand-left.png
new file mode 100644
index 000000000000..a3075b2ec661
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/inhand-right.png
new file mode 100644
index 000000000000..1875428f9e54
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/meta.json
new file mode 100644
index 000000000000..4d255a09c225
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/meta.json
@@ -0,0 +1,101 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef modified by Skubman for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accent-icon"
+ },
+ {
+ "name": "accent-equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "accent-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accent-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "midaccent-icon"
+ },
+ {
+ "name": "midaccent-equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "midaccent-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "midaccent-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "sideaccent-icon"
+ },
+ {
+ "name": "sideaccent-equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "sideaccent-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "sideaccent-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "visor-icon"
+ },
+ {
+ "name": "visor-equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "visor-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "visor-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "on-inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-equipped-HELMET.png
new file mode 100644
index 000000000000..b771b180ec0a
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-icon.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-icon.png
new file mode 100644
index 000000000000..47539bdc2d06
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-inhand-left.png
new file mode 100644
index 000000000000..5b3c26d83fb3
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-inhand-right.png
new file mode 100644
index 000000000000..6b115e076180
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/midaccent-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-inhand-left.png
new file mode 100644
index 000000000000..4a8eb60ec93b
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-inhand-right.png
new file mode 100644
index 000000000000..873df838b63b
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/on-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-equipped-HELMET.png
new file mode 100644
index 000000000000..82667eae9583
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-icon.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-icon.png
new file mode 100644
index 000000000000..9bd507ef7284
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-inhand-left.png
new file mode 100644
index 000000000000..92cedcaf6051
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-inhand-right.png
new file mode 100644
index 000000000000..5e1ba883a240
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/sideaccent-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-equipped-HELMET.png
new file mode 100644
index 000000000000..24d3d7be8938
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-icon.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-icon.png
new file mode 100644
index 000000000000..57ce267b03f7
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-inhand-left.png
new file mode 100644
index 000000000000..f6588ba8003e
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-inhand-right.png
new file mode 100644
index 000000000000..907076897a8a
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/custom.rsi/visor-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..5c947d4bbde8
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/icon.png
new file mode 100644
index 000000000000..a3eb92f19a68
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/engineering.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..10a0987784c4
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/icon.png
new file mode 100644
index 000000000000..8677f71e46e2
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/genetics.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..9ed1e3eb7993
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/icon.png
new file mode 100644
index 000000000000..fe9eeb318872
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hop.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..1d55bd52700c
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/icon.png
new file mode 100644
index 000000000000..9c39ef411ce5
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hos.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..350de2ebc73b
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/icon.png
new file mode 100644
index 000000000000..2a4b193b2bfb
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/hydroponics.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..4a05589b5f2a
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/icon.png
new file mode 100644
index 000000000000..0236e6542fbd
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/janitor.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..f826d404a9bd
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/icon.png
new file mode 100644
index 000000000000..b0461d149351
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/medical.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..06e5cb09fbb3
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/icon-flash.png
new file mode 100644
index 000000000000..f3ccec3bf6ba
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/icon.png
new file mode 100644
index 000000000000..f1b689db8c7c
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..2ea6a40eacfd
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/mime.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..ee7ed6095801
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/icon.png
new file mode 100644
index 000000000000..0c95650ed030
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/paramedic.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..59f1e4f8ea89
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/icon.png
new file mode 100644
index 000000000000..474e3fba57ce
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/inhand-left.png
new file mode 100644
index 000000000000..d5202b806821
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/inhand-right.png
new file mode 100644
index 000000000000..7446843492a0
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/meta.json
new file mode 100644
index 000000000000..62bc618b9f3d
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/meta.json
@@ -0,0 +1,41 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "on-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "on-inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-inhand-left.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-inhand-left.png
new file mode 100644
index 000000000000..4a8eb60ec93b
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-inhand-right.png b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-inhand-right.png
new file mode 100644
index 000000000000..873df838b63b
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/plain.rsi/on-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..5af3beb5a409
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/icon.png
new file mode 100644
index 000000000000..2d5d6c394a52
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/rd.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..8ed2259d5f78
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/icon.png
new file mode 100644
index 000000000000..4a39bcf7c6f4
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/roboticist.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..a826d42142de
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/icon-flash.png
new file mode 100644
index 000000000000..698c4ff6e4b1
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/icon.png
new file mode 100644
index 000000000000..ce4c2d0022c8
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..b28f42716d2b
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/salvage.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..63154766a73a
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/icon.png
new file mode 100644
index 000000000000..7e08f6d19dae
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/scientist.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..bb70ade7054e
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/icon.png
new file mode 100644
index 000000000000..13dc3f467991
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/meta.json
new file mode 100644
index 000000000000..86ae56f226a4
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef modified by Skubman for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/tacticool.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..db8cc9f83514
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/icon.png
new file mode 100644
index 000000000000..2cba69dd88b0
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/virology.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..c18f183d46da
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/icon.png
new file mode 100644
index 000000000000..dae944c5ef9f
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/warden.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/equipped-HELMET.png
new file mode 100644
index 000000000000..e73142d46f82
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/icon-flash.png
new file mode 100644
index 000000000000..3580b91f5999
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/icon-flash.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/icon.png b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/icon.png
new file mode 100644
index 000000000000..3c2f355d66ff
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/meta.json b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/meta.json
new file mode 100644
index 000000000000..83a0683d0e81
--- /dev/null
+++ b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-flash"
+ },
+ {
+ "name": "equipped-HELMET",
+ "directions": 4
+ },
+ {
+ "name": "on-equipped-HELMET",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/on-equipped-HELMET.png
new file mode 100644
index 000000000000..adfa03a3d104
Binary files /dev/null and b/Resources/Textures/Clothing/Head/Envirohelms/white.rsi/on-equipped-HELMET.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..16d3ec02c5f7
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/icon.png
new file mode 100644
index 000000000000..92774231518d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/ancientvoid.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..43ddf4a57816
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/icon.png
new file mode 100644
index 000000000000..08a25d0bce61
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/atmos.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..26258a7006f8
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/icon.png
new file mode 100644
index 000000000000..2cb5f54b77ce
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/meta.json
new file mode 100644
index 000000000000..a730d09891c8
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/blueshield_officer.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from Paradise Station at commit https://github.com/ParadiseSS13/Paradise/commit/b55bef2ed28b8bde30883fb14311b221ab0dc977 and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..933293942213
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/icon.png
new file mode 100644
index 000000000000..594ba5a9e416
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/meta.json
new file mode 100644
index 000000000000..e669a6403e68
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/captain.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..d31317d5e5ed
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/icon.png
new file mode 100644
index 000000000000..465c819c206b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/cargo.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..d71154821f09
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/icon.png
new file mode 100644
index 000000000000..759670ef07dd
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/ce.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..c74fe2b80021
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/icon.png
new file mode 100644
index 000000000000..6a9940326d74
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_agent.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..c57ecfe5eb23
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/icon.png
new file mode 100644
index 000000000000..4a7e1f31bd7c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_officer.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..2b169155c901
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/icon.png
new file mode 100644
index 000000000000..c8f010a368b6
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/centcom_official.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..6cae82165fa3
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/icon.png
new file mode 100644
index 000000000000..7f6c7ee109ad
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/chaplain.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..7810f37d2cde
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/icon.png
new file mode 100644
index 000000000000..c9d6114ea7e9
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/chef.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..b9c4c0327e54
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/icon.png
new file mode 100644
index 000000000000..8e0dad6a3b90
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/chemist.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..5b1d0f39d51b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/icon.png
new file mode 100644
index 000000000000..f28976a3dafd
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/clown.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..4e8be768c7d9
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/icon.png
new file mode 100644
index 000000000000..7eb85c8dd2bc
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/cmo.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..c48495a6d50f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/icon.png
new file mode 100644
index 000000000000..dc5dc934c591
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/coroner.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..89e252f7d45d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-icon.png
new file mode 100644
index 000000000000..21d362fa6a10
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-inhand-left.png
new file mode 100644
index 000000000000..2ff08cc2378e
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-inhand-right.png
new file mode 100644
index 000000000000..9e11e06718cc
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..eb13f68b9ec0
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-icon.png
new file mode 100644
index 000000000000..8b5586b03f2a
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-inhand-left.png
new file mode 100644
index 000000000000..53e2eaa86709
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-inhand-right.png
new file mode 100644
index 000000000000..c3aadd5b8644
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..e1b24b41cc9f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-icon.png
new file mode 100644
index 000000000000..bbc3d21aaea5
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-inhand-left.png
new file mode 100644
index 000000000000..bd8a0e7cadf9
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-inhand-right.png
new file mode 100644
index 000000000000..b000ed7ec76c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent2_chestonly-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..93bee36bd5e1
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-icon.png
new file mode 100644
index 000000000000..384286f395c7
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-inhand-left.png
new file mode 100644
index 000000000000..0c0017dde5c0
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-inhand-right.png
new file mode 100644
index 000000000000..c7b68db12c09
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..fff2774616a9
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-icon.png
new file mode 100644
index 000000000000..2cb85e632fa8
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-inhand-left.png
new file mode 100644
index 000000000000..e1975815e251
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-inhand-right.png
new file mode 100644
index 000000000000..fea004b30b69
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accent3_chestonly-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentalt-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentalt-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..3fa4884328ab
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentalt-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentalt_noback-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentalt_noback-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..01a3666be1f8
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentalt_noback-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..a7a23ec3c930
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-icon.png
new file mode 100644
index 000000000000..4b3249fe200e
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-inhand-left.png
new file mode 100644
index 000000000000..987cbdb7334c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-inhand-right.png
new file mode 100644
index 000000000000..ff81d2d0b3a6
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accenthighlight-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..64b70260c7c8
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-icon.png
new file mode 100644
index 000000000000..9a49ad2d09c9
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-inhand-left.png
new file mode 100644
index 000000000000..afdd7622c7a4
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-inhand-right.png
new file mode 100644
index 000000000000..a39028577598
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/accentprisoner-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/backaccent-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/backaccent-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..e6776137d5ea
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/backaccent-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..7351de7e2168
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-icon.png
new file mode 100644
index 000000000000..473510a86f5d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-inhand-left.png
new file mode 100644
index 000000000000..a5ece79a5cb5
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-inhand-right.png
new file mode 100644
index 000000000000..363fceada4ee
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/belt-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..fc98cadb9083
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-icon.png
new file mode 100644
index 000000000000..f70ea45de95d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-inhand-left.png
new file mode 100644
index 000000000000..a95ce7137409
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-inhand-right.png
new file mode 100644
index 000000000000..e091c455043e
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..c50769249b44
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-icon.png
new file mode 100644
index 000000000000..0091012bb94b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-inhand-left.png
new file mode 100644
index 000000000000..83664d14867f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-inhand-right.png
new file mode 100644
index 000000000000..fe8b1bf9706b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/beltbuckle_small-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..8060fdd544b8
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-icon.png
new file mode 100644
index 000000000000..f09673433cac
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-inhand-left.png
new file mode 100644
index 000000000000..aa90e95dc578
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-inhand-right.png
new file mode 100644
index 000000000000..9be9ecbf60b7
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/buttons-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..7b84f544dac5
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-icon.png
new file mode 100644
index 000000000000..5cb2a361c011
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-inhand-left.png
new file mode 100644
index 000000000000..c8461c2d9259
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-inhand-right.png
new file mode 100644
index 000000000000..226a8167749e
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..026af9dc7eb4
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-icon.png
new file mode 100644
index 000000000000..090bf7274d8a
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-inhand-left.png
new file mode 100644
index 000000000000..29c74bdf8321
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-inhand-right.png
new file mode 100644
index 000000000000..c45549adf332
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/clip_right-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..e787a2c9f6ea
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-icon.png
new file mode 100644
index 000000000000..ad3624500d02
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-inhand-left.png
new file mode 100644
index 000000000000..ae6c4e786106
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-inhand-right.png
new file mode 100644
index 000000000000..104a6b2a0641
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/corneraccent-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/cuffs-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/cuffs-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..12b2750942b2
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/cuffs-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/cuffs_upper-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/cuffs_upper-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..9567633b9bba
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/cuffs_upper-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..69ff51e10306
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..4cec655e6476
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-icon.png
new file mode 100644
index 000000000000..95251ce244df
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-inhand-left.png
new file mode 100644
index 000000000000..a4fcf07fb91b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-inhand-right.png
new file mode 100644
index 000000000000..32f62714ce3c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/heart-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/icon.png
new file mode 100644
index 000000000000..a42baf390d4c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/inhand-left.png
new file mode 100644
index 000000000000..1f2a705a58f3
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/inhand-right.png
new file mode 100644
index 000000000000..41e57d61493c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..33ff060a92d5
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..d25487ab7cb4
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2_bottom-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2_bottom-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..c066a4909256
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2_bottom-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2_top-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2_top-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..f9bbed406801
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/loweraccent2_top-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/meta.json
new file mode 100644
index 000000000000..576d5c219b35
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/meta.json
@@ -0,0 +1,374 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef modified by Skubman for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accent-icon"
+ },
+ {
+ "name": "accent-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accent-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accent-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accent2-icon"
+ },
+ {
+ "name": "accent2-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accent2-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accent2-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accent2_chestonly-icon"
+ },
+ {
+ "name": "accent2_chestonly-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accent2_chestonly-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accent2_chestonly-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accent3-icon"
+ },
+ {
+ "name": "accent3-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accent3-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accent3-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accent3_chestonly-icon"
+ },
+ {
+ "name": "accent3_chestonly-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accent3_chestonly-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accent3_chestonly-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accentprisoner-icon"
+ },
+ {
+ "name": "accentprisoner-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accentprisoner-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accentprisoner-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accenthighlight-icon"
+ },
+ {
+ "name": "accenthighlight-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accenthighlight-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "accenthighlight-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "accentalt-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "accentalt_noback-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "backaccent-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "loweraccent-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "loweraccent2-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "loweraccent2_bottom-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "loweraccent2_top-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "pin-icon"
+ },
+ {
+ "name": "pin-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "pin-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "pin-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "buttons-icon"
+ },
+ {
+ "name": "buttons-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "buttons-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "buttons-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "plaintop-icon"
+ },
+ {
+ "name": "plaintop-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "plaintop-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "plaintop-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "tie-icon"
+ },
+ {
+ "name": "tie-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "tie-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "tie-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "tieclip-icon"
+ },
+ {
+ "name": "tieclip-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "tieclip-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "tieclip-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "clip-icon"
+ },
+ {
+ "name": "clip-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "clip-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "clip-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "clip_right-icon"
+ },
+ {
+ "name": "clip_right-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "clip_right-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "clip_right-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "heart-icon"
+ },
+ {
+ "name": "heart-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "heart-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "heart-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "corneraccent-icon"
+ },
+ {
+ "name": "corneraccent-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "corneraccent-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "corneraccent-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "pants-icon"
+ },
+ {
+ "name": "pants-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "pants-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "pants-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "belt-icon"
+ },
+ {
+ "name": "belt-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "belt-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "belt-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "beltbuckle-icon"
+ },
+ {
+ "name": "beltbuckle-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "beltbuckle-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "beltbuckle-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "beltbuckle_small-icon"
+ },
+ {
+ "name": "beltbuckle_small-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "beltbuckle_small-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "beltbuckle_small-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "cuffs-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "cuffs_upper-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "shoes-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "shoesdark-equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "soles-equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..9c11f765ef6d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-icon.png
new file mode 100644
index 000000000000..9afac6d69d8e
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-inhand-left.png
new file mode 100644
index 000000000000..b654f960f473
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-inhand-right.png
new file mode 100644
index 000000000000..92749caa932d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pants-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..693cfd5087cf
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-icon.png
new file mode 100644
index 000000000000..117d83e93ebb
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-inhand-left.png
new file mode 100644
index 000000000000..72e6a885cb02
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-inhand-right.png
new file mode 100644
index 000000000000..f8f8ae4f79a3
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/pin-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..0c0ee90b946b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-icon.png
new file mode 100644
index 000000000000..bbc2d4dc2cf9
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-inhand-left.png
new file mode 100644
index 000000000000..c468d7db6b05
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-inhand-right.png
new file mode 100644
index 000000000000..b7e5ec47d6c2
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/plaintop-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/shoes-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/shoes-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..9e95afa55630
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/shoes-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/shoesdark-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/shoesdark-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..d24fb9e4e7d2
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/shoesdark-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/soles-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/soles-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..8e08e9402d3f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/soles-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..3dc73d2aa0a4
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-icon.png
new file mode 100644
index 000000000000..ff5be6f5ff11
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-inhand-left.png
new file mode 100644
index 000000000000..704f78512006
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-inhand-right.png
new file mode 100644
index 000000000000..a60a89348c89
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tie-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..cb628a3e5952
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-icon.png
new file mode 100644
index 000000000000..4591a086b478
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-inhand-left.png
new file mode 100644
index 000000000000..3c740668758b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-inhand-right.png
new file mode 100644
index 000000000000..88e26c3ac1de
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/custom.rsi/tieclip-inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..2a8940060319
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/icon.png
new file mode 100644
index 000000000000..144ee7b63972
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/engineering.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..7d9aa8981bc6
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/icon.png
new file mode 100644
index 000000000000..7b4a2760e258
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/enviroslacks.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..1db56bb0c690
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/icon.png
new file mode 100644
index 000000000000..a6bf5e770484
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/genetics.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..6599aa9df8de
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/icon.png
new file mode 100644
index 000000000000..897b70669b47
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/hop.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..51a9fdac333b
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/icon.png
new file mode 100644
index 000000000000..b0a96449895c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/hos.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..8d6ac5e7fab2
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/icon.png
new file mode 100644
index 000000000000..e7bf4945f990
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/hydroponics.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..ad1c6cbbc185
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/icon.png
new file mode 100644
index 000000000000..18a829b6555d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/janitor.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..cdac28060734
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/icon.png
new file mode 100644
index 000000000000..933083422d93
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/medical.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..37c444117063
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/icon.png
new file mode 100644
index 000000000000..eb0d90d7c655
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/mime.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..711f6fe61bd9
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/icon.png
new file mode 100644
index 000000000000..4ef99e18f517
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/paramedic.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..f9a9cf185489
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/icon.png
new file mode 100644
index 000000000000..7cbe2a556d9c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/inhand-left.png
new file mode 100644
index 000000000000..5ca9cdac9a1f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/inhand-right.png
new file mode 100644
index 000000000000..63796271186f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/meta.json
new file mode 100644
index 000000000000..e46e83577905
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/plain.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..53028a197d42
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/icon.png
new file mode 100644
index 000000000000..3a6456688092
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/meta.json
new file mode 100644
index 000000000000..d4c04394efc4
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/rd.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..d3ba77708000
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/icon.png
new file mode 100644
index 000000000000..8e38f72012c4
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/meta.json
new file mode 100644
index 000000000000..e669a6403e68
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/roboticist.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef and modified by Skubman for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..726b862a5680
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/icon.png
new file mode 100644
index 000000000000..8775c1a3e053
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/salvage.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..7199bf41fb9e
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/icon.png
new file mode 100644
index 000000000000..4d3dcb91ea17
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/scientist.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..9caeea98ab9d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/icon.png
new file mode 100644
index 000000000000..6370d1483d48
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/tacticool.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..7f5881cd5701
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/icon.png
new file mode 100644
index 000000000000..f2a1071bc563
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/virology.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 000000000000..5482b7a4dd97
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/icon.png
new file mode 100644
index 000000000000..d48c2be0fa8d
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/meta.json
new file mode 100644
index 000000000000..7881ed5501f5
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Envirosuits/warden.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/a3849062b8756e3c2176fa0b9bd80aef9facc3ef",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid0.png b/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid0.png
new file mode 100644
index 000000000000..dc37e2d63bdb
Binary files /dev/null and b/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid0.png differ
diff --git a/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid1.png b/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid1.png
new file mode 100644
index 000000000000..a8adc694b0a8
Binary files /dev/null and b/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid1.png differ
diff --git a/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid2.png b/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid2.png
new file mode 100644
index 000000000000..91bcf88fe5ee
Binary files /dev/null and b/Resources/Textures/DeltaV/Effects/speech.rsi/chitinid2.png differ
diff --git a/Resources/Textures/DeltaV/Effects/speech.rsi/meta.json b/Resources/Textures/DeltaV/Effects/speech.rsi/meta.json
index 1d4b09fbffef..d91b201f0b8a 100644
--- a/Resources/Textures/DeltaV/Effects/speech.rsi/meta.json
+++ b/Resources/Textures/DeltaV/Effects/speech.rsi/meta.json
@@ -23,6 +23,23 @@
},
{
"name": "felinid2"
+ },
+ {
+ "name": "chitinid0",
+ "delays": [
+ [
+ 0.2,
+ 0.3,
+ 0.3,
+ 0.3
+ ]
+ ]
+ },
+ {
+ "name": "chitinid1"
+ },
+ {
+ "name": "chitinid2"
}
]
}
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/bee.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/bee.png
new file mode 100644
index 000000000000..3c5faa4aa259
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/bee.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/curly.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/curly.png
new file mode 100644
index 000000000000..7d7dd45da04b
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/curly.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/default.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/default.png
new file mode 100644
index 000000000000..f3d291ebdc1f
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/default.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/firefly_primary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/firefly_primary.png
new file mode 100644
index 000000000000..32aeb03d3c6b
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/firefly_primary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/firefly_secondary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/firefly_secondary.png
new file mode 100644
index 000000000000..ce6864cb060e
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/firefly_secondary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/gray.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/gray.png
new file mode 100644
index 000000000000..e215684cf9bd
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/gray.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/long.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/long.png
new file mode 100644
index 000000000000..9ff75a10104a
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/long.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/meta.json
new file mode 100644
index 000000000000..52bc240973ec
--- /dev/null
+++ b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/meta.json
@@ -0,0 +1,55 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Concepts by: https://github.com/ElusiveCoin",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "default",
+ "directions": 4
+ },
+ {
+ "name": "curly",
+ "directions": 4
+ },
+ {
+ "name": "gray",
+ "directions": 4
+ },
+ {
+ "name": "slick",
+ "directions": 4
+ },
+ {
+ "name": "short",
+ "directions": 4
+ },
+ {
+ "name": "long",
+ "directions": 4
+ },
+ {
+ "name": "bee",
+ "directions": 4
+ },
+ {
+ "name": "firefly_primary",
+ "directions": 4
+ },
+ {
+ "name": "firefly_secondary",
+ "directions": 4
+ },
+ {
+ "name": "radar",
+ "directions": 4
+ },
+ {
+ "name": "speed",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/radar.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/radar.png
new file mode 100644
index 000000000000..41ec7d99233b
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/radar.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/short.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/short.png
new file mode 100644
index 000000000000..1dde872b7854
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/short.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/slick.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/slick.png
new file mode 100644
index 000000000000..f1e856667cdb
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/slick.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/speed.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/speed.png
new file mode 100644
index 000000000000..f3dda4c68710
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_antennas.rsi/speed.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_chest.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_chest.png
new file mode 100644
index 000000000000..8981bd797e80
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_chest.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_head.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_head.png
new file mode 100644
index 000000000000..98c698e90589
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_head.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_l_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_l_arm.png
new file mode 100644
index 000000000000..14709b0c31a9
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_l_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_l_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_l_leg.png
new file mode 100644
index 000000000000..5be58a196c58
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_l_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_r_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_r_arm.png
new file mode 100644
index 000000000000..7a83b33619fd
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_r_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_r_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_r_leg.png
new file mode 100644
index 000000000000..0ebd96c5dd8d
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/charred_r_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/meta.json
new file mode 100644
index 000000000000..6667bbc2b36a
--- /dev/null
+++ b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/meta.json
@@ -0,0 +1,143 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commits https://github.com/tgstation/tgstation/commit/b30e2934e7585bad901dd12a35d0635f1fc292c1 and https://github.com/tgstation/tgstation/commit/6b0af0febe578f47ae280781682ea7a3d77f508a, modified by https://github.com/MilenVolf, Charred further modified and new assets by https://github.com/ElusiveCoin",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "toxic_head",
+ "directions": 4
+ },
+ {
+ "name": "toxic_chest",
+ "directions": 4
+ },
+ {
+ "name": "toxic_r_arm",
+ "directions": 4
+ },
+ {
+ "name": "toxic_l_arm",
+ "directions": 4
+ },
+ {
+ "name": "toxic_r_leg",
+ "directions": 4
+ },
+ {
+ "name": "toxic_l_leg",
+ "directions": 4
+ },
+ {
+ "name": "charred_head",
+ "directions": 4
+ },
+ {
+ "name": "charred_chest",
+ "directions": 4
+ },
+ {
+ "name": "charred_r_arm",
+ "directions": 4
+ },
+ {
+ "name": "charred_l_arm",
+ "directions": 4
+ },
+ {
+ "name": "charred_r_leg",
+ "directions": 4
+ },
+ {
+ "name": "charred_l_leg",
+ "directions": 4
+ },
+ {
+ "name": "radiant_head",
+ "directions": 4
+ },
+ {
+ "name": "radiant_chest",
+ "directions": 4
+ },
+ {
+ "name": "radiant_r_arm",
+ "directions": 4
+ },
+ {
+ "name": "radiant_l_arm",
+ "directions": 4
+ },
+ {
+ "name": "radiant_r_leg",
+ "directions": 4
+ },
+ {
+ "name": "radiant_l_leg",
+ "directions": 4
+ },
+ {
+ "name": "plated_chest",
+ "directions": 4
+ },
+ {
+ "name": "plated_r_arm",
+ "directions": 4
+ },
+ {
+ "name": "plated_l_arm",
+ "directions": 4
+ },
+ {
+ "name": "stripes_head",
+ "directions": 4
+ },
+ {
+ "name": "stripes_chest",
+ "directions": 4
+ },
+ {
+ "name": "stripes_r_arm",
+ "directions": 4
+ },
+ {
+ "name": "stripes_l_arm",
+ "directions": 4
+ },
+ {
+ "name": "stripes_r_leg",
+ "directions": 4
+ },
+ {
+ "name": "stripes_l_leg",
+ "directions": 4
+ },
+ {
+ "name": "spotted_head",
+ "directions": 4
+ },
+ {
+ "name": "spotted_chest",
+ "directions": 4
+ },
+ {
+ "name": "spotted_r_arm",
+ "directions": 4
+ },
+ {
+ "name": "spotted_l_arm",
+ "directions": 4
+ },
+ {
+ "name": "spotted_r_leg",
+ "directions": 4
+ },
+ {
+ "name": "spotted_l_leg",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_chest.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_chest.png
new file mode 100644
index 000000000000..f32f5d317c1d
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_chest.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_l_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_l_arm.png
new file mode 100644
index 000000000000..5e1061d9316d
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_l_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_r_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_r_arm.png
new file mode 100644
index 000000000000..b24897986d97
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/plated_r_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_chest.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_chest.png
new file mode 100644
index 000000000000..214caa4c9711
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_chest.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_head.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_head.png
new file mode 100644
index 000000000000..5a19d265775b
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_head.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_l_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_l_arm.png
new file mode 100644
index 000000000000..272177404ae5
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_l_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_l_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_l_leg.png
new file mode 100644
index 000000000000..16f0616a247c
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_l_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_r_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_r_arm.png
new file mode 100644
index 000000000000..72dfcfde064c
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_r_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_r_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_r_leg.png
new file mode 100644
index 000000000000..9c4d8173e9f1
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/radiant_r_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_chest.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_chest.png
new file mode 100644
index 000000000000..90a8539d735e
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_chest.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_head.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_head.png
new file mode 100644
index 000000000000..c7301de38184
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_head.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_l_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_l_arm.png
new file mode 100644
index 000000000000..4c6f3c1ce4ca
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_l_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_l_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_l_leg.png
new file mode 100644
index 000000000000..f78e45889f43
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_l_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_r_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_r_arm.png
new file mode 100644
index 000000000000..a83a50ec9799
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_r_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_r_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_r_leg.png
new file mode 100644
index 000000000000..27e6854260f9
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/spotted_r_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_chest.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_chest.png
new file mode 100644
index 000000000000..29b41970dce8
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_chest.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_head.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_head.png
new file mode 100644
index 000000000000..8bcda1cbe6e8
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_head.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_l_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_l_arm.png
new file mode 100644
index 000000000000..521352f9d49a
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_l_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_l_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_l_leg.png
new file mode 100644
index 000000000000..6b19d5237f93
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_l_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_r_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_r_arm.png
new file mode 100644
index 000000000000..51b1f0d370d9
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_r_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_r_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_r_leg.png
new file mode 100644
index 000000000000..e149af3795ff
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/stripes_r_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_chest.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_chest.png
new file mode 100644
index 000000000000..ad53da7165df
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_chest.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_head.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_head.png
new file mode 100644
index 000000000000..d3400bf0e1d0
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_head.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_l_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_l_arm.png
new file mode 100644
index 000000000000..f74ffaae9d48
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_l_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_l_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_l_leg.png
new file mode 100644
index 000000000000..fbcd1237d799
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_l_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_r_arm.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_r_arm.png
new file mode 100644
index 000000000000..31ef8726fc20
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_r_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_r_leg.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_r_leg.png
new file mode 100644
index 000000000000..bd772bfc0bbc
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_parts.rsi/toxic_r_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/bee_primary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/bee_primary.png
new file mode 100644
index 000000000000..d8f46c8e70ba
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/bee_primary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/bee_secondary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/bee_secondary.png
new file mode 100644
index 000000000000..82a14ba3e5cd
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/bee_secondary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/default.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/default.png
new file mode 100644
index 000000000000..c01f5a4ba483
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/default.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/firefly_primary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/firefly_primary.png
new file mode 100644
index 000000000000..1f74656812f6
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/firefly_primary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/firefly_secondary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/firefly_secondary.png
new file mode 100644
index 000000000000..3386aa45839f
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/firefly_secondary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/honeypot_primary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/honeypot_primary.png
new file mode 100644
index 000000000000..d8428597262e
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/honeypot_primary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/honeypot_secondary.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/honeypot_secondary.png
new file mode 100644
index 000000000000..587a5a1f75e0
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/honeypot_secondary.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/meta.json
new file mode 100644
index 000000000000..b7f59a8231af
--- /dev/null
+++ b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/meta.json
@@ -0,0 +1,47 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Concepts by: https://github.com/ElusiveCoin",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "default",
+ "directions": 4
+ },
+ {
+ "name": "smooth",
+ "directions": 4
+ },
+ {
+ "name": "honeypot_primary",
+ "directions": 4
+ },
+ {
+ "name": "honeypot_secondary",
+ "directions": 4
+ },
+ {
+ "name": "stubby",
+ "directions": 4
+ },
+ {
+ "name": "bee_primary",
+ "directions": 4
+ },
+ {
+ "name": "bee_secondary",
+ "directions": 4
+ },
+ {
+ "name": "firefly_primary",
+ "directions": 4
+ },
+ {
+ "name": "firefly_secondary",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/smooth.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/smooth.png
new file mode 100644
index 000000000000..bd0bbec36f34
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/smooth.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/stubby.png b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/stubby.png
new file mode 100644
index 000000000000..028676d9f4d5
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Chitinid/chitinid_wings.rsi/stubby.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/eyes.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/eyes.png
new file mode 100644
index 000000000000..e35b5717d2f5
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/eyes.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/full.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/full.png
new file mode 100644
index 000000000000..6d5e167c553e
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/full.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/head_f.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/head_f.png
new file mode 100644
index 000000000000..fe85b753450c
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/head_f.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/head_m.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/head_m.png
new file mode 100644
index 000000000000..c9b9cbb1979d
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/head_m.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_arm.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_arm.png
new file mode 100644
index 000000000000..48c0a2ee062c
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_foot.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_foot.png
new file mode 100644
index 000000000000..02c9335b20e3
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_foot.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_hand.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_hand.png
new file mode 100644
index 000000000000..b02e2317bef7
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_hand.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_leg.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_leg.png
new file mode 100644
index 000000000000..54efa6db7862
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/l_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/meta.json
new file mode 100644
index 000000000000..ed5dfd514502
--- /dev/null
+++ b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/meta.json
@@ -0,0 +1,66 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "https://github.com/tgstation/tgstation/commit/1d0eadcb126fc3581eed33490f4be2a88157af58, modified by https://github.com/PixelTheKermit",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "full"
+ },
+ {
+ "name": "head_f",
+ "directions": 4
+ },
+ {
+ "name": "head_m",
+ "directions": 4
+ },
+ {
+ "name": "l_arm",
+ "directions": 4
+ },
+ {
+ "name": "l_foot",
+ "directions": 4
+ },
+ {
+ "name": "l_hand",
+ "directions": 4
+ },
+ {
+ "name": "l_leg",
+ "directions": 4
+ },
+ {
+ "name": "r_arm",
+ "directions": 4
+ },
+ {
+ "name": "r_foot",
+ "directions": 4
+ },
+ {
+ "name": "r_hand",
+ "directions": 4
+ },
+ {
+ "name": "r_leg",
+ "directions": 4
+ },
+ {
+ "name": "torso_f",
+ "directions": 4
+ },
+ {
+ "name": "torso_m",
+ "directions": 4
+ },
+ {
+ "name": "eyes",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_arm.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_arm.png
new file mode 100644
index 000000000000..703756e5c477
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_arm.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_foot.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_foot.png
new file mode 100644
index 000000000000..e6610763011b
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_foot.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_hand.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_hand.png
new file mode 100644
index 000000000000..b9f02aa59760
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_hand.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_leg.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_leg.png
new file mode 100644
index 000000000000..6f45ae18950c
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/r_leg.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/torso_f.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/torso_f.png
new file mode 100644
index 000000000000..71d346600158
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/torso_f.png differ
diff --git a/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/torso_m.png b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/torso_m.png
new file mode 100644
index 000000000000..9f08874e16b3
Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Chitinid/parts.rsi/torso_m.png differ
diff --git a/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/chitzite.png b/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/chitzite.png
new file mode 100644
index 000000000000..8983e82b36a1
Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/chitzite.png differ
diff --git a/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/chitzite_glow.png b/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/chitzite_glow.png
new file mode 100644
index 000000000000..5a77b238e84f
Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/chitzite_glow.png differ
diff --git a/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/meta.json
new file mode 100644
index 000000000000..e55e488f4d56
--- /dev/null
+++ b/Resources/Textures/DeltaV/Objects/Specific/Species/chitinid.rsi/meta.json
@@ -0,0 +1,33 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Concepts by: https://github.com/ElusiveCoin",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "chitzite",
+ "delays": [
+ [
+ 0.3,
+ 0.3,
+ 0.3,
+ 0.3
+ ]
+ ]
+ },
+ {
+ "name": "chitzite_glow",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Effects/speech.rsi/meta.json b/Resources/Textures/Effects/speech.rsi/meta.json
index 1ec1219b0f82..e3644f147b08 100644
--- a/Resources/Textures/Effects/speech.rsi/meta.json
+++ b/Resources/Textures/Effects/speech.rsi/meta.json
@@ -5,7 +5,7 @@
"y": 32
},
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github) | Spider sprites made by PixelTheKermit (Github) | Lizard sprites made by AmalgoMyte (Github) | Oni sprites made by angelofallars and leonardo-dabepis (Github)",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github) | Spider sprites made by PixelTheKermit (Github) | Lizard sprites made by AmalgoMyte (Github) | Oni sprites made by angelofallars and leonardo-dabepis (Github) | Skeleton/Plasmaman sprites made by Skubman (github: angelofallars)",
"states": [
{
"name": "alien0",
@@ -28,7 +28,6 @@
},
{
"name": "alienroyal0",
-
"delays": [
[
0.2,
@@ -412,7 +411,7 @@
{
"name": "spider2"
},
- {
+ {
"name": "vox0",
"delays": [
[
@@ -439,6 +438,54 @@
},
{
"name": "oni2"
+ },
+ {
+ "name": "plasmaman0",
+ "delays": [
+ [
+ 0.15,
+ 0.25,
+ 0.25,
+ 0.5,
+ 0.1,
+ 0.15,
+ 0.1,
+ 0.7,
+ 0.25,
+ 0.25,
+ 0.1
+ ]
+ ]
+ },
+ {
+ "name": "plasmaman1"
+ },
+ {
+ "name": "plasmaman2"
+ },
+ {
+ "name": "skeleton0",
+ "delays": [
+ [
+ 0.15,
+ 0.25,
+ 0.25,
+ 0.5,
+ 0.1,
+ 0.15,
+ 0.1,
+ 0.7,
+ 0.25,
+ 0.25,
+ 0.1
+ ]
+ ]
+ },
+ {
+ "name": "skeleton1"
+ },
+ {
+ "name": "skeleton2"
}
]
}
diff --git a/Resources/Textures/Effects/speech.rsi/plasmaman0.png b/Resources/Textures/Effects/speech.rsi/plasmaman0.png
new file mode 100644
index 000000000000..fb6cf1ad2528
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/plasmaman0.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/plasmaman1.png b/Resources/Textures/Effects/speech.rsi/plasmaman1.png
new file mode 100644
index 000000000000..4a3cb354ff53
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/plasmaman1.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/plasmaman2.png b/Resources/Textures/Effects/speech.rsi/plasmaman2.png
new file mode 100644
index 000000000000..9f86cb268c3f
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/plasmaman2.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/skeleton0.png b/Resources/Textures/Effects/speech.rsi/skeleton0.png
new file mode 100644
index 000000000000..8695d90baf69
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/skeleton0.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/skeleton1.png b/Resources/Textures/Effects/speech.rsi/skeleton1.png
new file mode 100644
index 000000000000..3943f5976711
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/skeleton1.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/skeleton2.png b/Resources/Textures/Effects/speech.rsi/skeleton2.png
new file mode 100644
index 000000000000..64bb33c7137d
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/skeleton2.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_box.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_box.png
new file mode 100644
index 000000000000..5145216bf3d4
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_box.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_box_open.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_box_open.png
new file mode 100644
index 000000000000..8b3c3fbe05c7
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_box_open.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand1.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand1.png
new file mode 100644
index 000000000000..8797bc9b52b2
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand1.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand2.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand2.png
new file mode 100644
index 000000000000..7d217388d0a0
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand2.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand3.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand3.png
new file mode 100644
index 000000000000..646ec3241b59
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand3.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand4.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand4.png
new file mode 100644
index 000000000000..a10b441e1c68
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand4.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand5.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand5.png
new file mode 100644
index 000000000000..b348eef2cac3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_hand5.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_joker.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_joker.png
new file mode 100644
index 000000000000..dcb21b4f8c07
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/black_joker.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_empty.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_empty.png
new file mode 100644
index 000000000000..666e33a6eff2
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_empty.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_full.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_full.png
new file mode 100644
index 000000000000..e475aea4f255
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_full.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_half.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_half.png
new file mode 100644
index 000000000000..6121837e3117
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_half.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_low.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_low.png
new file mode 100644
index 000000000000..812fa134de5e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_black_low.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_empty.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_empty.png
new file mode 100644
index 000000000000..3eab35d483aa
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_empty.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_full.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_full.png
new file mode 100644
index 000000000000..b68e72fad5bf
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_full.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_half.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_half.png
new file mode 100644
index 000000000000..aaf8d07645ac
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_half.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_low.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_low.png
new file mode 100644
index 000000000000..22f8db3c7068
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_nanotrasen_low.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_empty.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_empty.png
new file mode 100644
index 000000000000..df0f80a270c4
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_empty.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_full.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_full.png
new file mode 100644
index 000000000000..fd54e580a4fa
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_full.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_half.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_half.png
new file mode 100644
index 000000000000..45e53d99e057
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_half.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_low.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_low.png
new file mode 100644
index 000000000000..364885508c55
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/deck_syndicate_low.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/meta.json b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/meta.json
new file mode 100644
index 000000000000..b5035a33bf2a
--- /dev/null
+++ b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/meta.json
@@ -0,0 +1,614 @@
+{
+ "version": 1,
+ "copyright": "Cards, Decks and Hands Sprites were originally from Paradise Station (https://github.com/ParadiseSS13/Paradise) and modified by VictorJob. Boxes are from VictorJob.",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "black_hand1"
+ },
+ {
+ "name": "black_hand2"
+ },
+ {
+ "name": "black_hand3"
+ },
+ {
+ "name": "black_hand4"
+ },
+ {
+ "name": "black_hand5"
+ },
+ {
+ "name": "deck_black_empty"
+ },
+ {
+ "name": "deck_black_full"
+ },
+ {
+ "name": "deck_black_half"
+ },
+ {
+ "name": "deck_black_low"
+ },
+ {
+ "name": "deck_nanotrasen_empty"
+ },
+ {
+ "name": "deck_nanotrasen_full"
+ },
+ {
+ "name": "deck_nanotrasen_half"
+ },
+ {
+ "name": "deck_nanotrasen_low"
+ },
+ {
+ "name": "deck_syndicate_empty"
+ },
+ {
+ "name": "deck_syndicate_full"
+ },
+ {
+ "name": "deck_syndicate_half"
+ },
+ {
+ "name": "deck_syndicate_low"
+ },
+ {
+ "name": "nanotrasen_hand1"
+ },
+ {
+ "name": "nanotrasen_hand2"
+ },
+ {
+ "name": "nanotrasen_hand3"
+ },
+ {
+ "name": "nanotrasen_hand4"
+ },
+ {
+ "name": "nanotrasen_hand5"
+ },
+ {
+ "name": "sc_10_of_Clubs_black"
+ },
+ {
+ "name": "sc_10_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_10_of_Diamonds_black"
+ },
+ {
+ "name": "sc_10_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_10_of_Hearts_black"
+ },
+ {
+ "name": "sc_10_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_10_of_Spades_black"
+ },
+ {
+ "name": "sc_10_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_2_of_Clubs_black"
+ },
+ {
+ "name": "sc_2_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_2_of_Diamonds_black"
+ },
+ {
+ "name": "sc_2_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_2_of_Hearts_black"
+ },
+ {
+ "name": "sc_2_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_2_of_Spades_black"
+ },
+ {
+ "name": "sc_2_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_3_of_Clubs_black"
+ },
+ {
+ "name": "sc_3_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_3_of_Diamonds_black"
+ },
+ {
+ "name": "sc_3_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_3_of_Hearts_black"
+ },
+ {
+ "name": "sc_3_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_3_of_Spades_black"
+ },
+ {
+ "name": "sc_3_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_4_of_Clubs_black"
+ },
+ {
+ "name": "sc_4_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_4_of_Diamonds_black"
+ },
+ {
+ "name": "sc_4_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_4_of_Hearts_black"
+ },
+ {
+ "name": "sc_4_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_4_of_Spades_black"
+ },
+ {
+ "name": "sc_4_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_5_of_Clubs_black"
+ },
+ {
+ "name": "sc_5_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_5_of_Diamonds_black"
+ },
+ {
+ "name": "sc_5_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_5_of_Hearts_black"
+ },
+ {
+ "name": "sc_5_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_5_of_Spades_black"
+ },
+ {
+ "name": "sc_5_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_6_of_Clubs_black"
+ },
+ {
+ "name": "sc_6_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_6_of_Diamonds_black"
+ },
+ {
+ "name": "sc_6_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_6_of_Hearts_black"
+ },
+ {
+ "name": "sc_6_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_6_of_Spades_black"
+ },
+ {
+ "name": "sc_6_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_7_of_Clubs_black"
+ },
+ {
+ "name": "sc_7_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_7_of_Diamonds_black"
+ },
+ {
+ "name": "sc_7_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_7_of_Hearts_black"
+ },
+ {
+ "name": "sc_7_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_7_of_Spades_black"
+ },
+ {
+ "name": "sc_7_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_8_of_Clubs_black"
+ },
+ {
+ "name": "sc_8_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_8_of_Diamonds_black"
+ },
+ {
+ "name": "sc_8_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_8_of_Hearts_black"
+ },
+ {
+ "name": "sc_8_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_8_of_Spades_black"
+ },
+ {
+ "name": "sc_8_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_9_of_Clubs_black"
+ },
+ {
+ "name": "sc_9_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_9_of_Diamonds_black"
+ },
+ {
+ "name": "sc_9_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_9_of_Hearts_black"
+ },
+ {
+ "name": "sc_9_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_9_of_Spades_black"
+ },
+ {
+ "name": "sc_9_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Clubs_black"
+ },
+ {
+ "name": "sc_Ace_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Diamonds_black"
+ },
+ {
+ "name": "sc_Ace_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Hearts_black"
+ },
+ {
+ "name": "sc_Ace_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Spades_black"
+ },
+ {
+ "name": "sc_Ace_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Clubs_black"
+ },
+ {
+ "name": "sc_Jack_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Diamonds_black"
+ },
+ {
+ "name": "sc_Jack_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Hearts_black"
+ },
+ {
+ "name": "sc_Jack_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Spades_black"
+ },
+ {
+ "name": "sc_Jack_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_King_of_Clubs_black"
+ },
+ {
+ "name": "sc_King_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_King_of_Diamonds_black"
+ },
+ {
+ "name": "sc_King_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_King_of_Hearts_black"
+ },
+ {
+ "name": "sc_King_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_King_of_Spades_black"
+ },
+ {
+ "name": "sc_King_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Clubs_black"
+ },
+ {
+ "name": "sc_Queen_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Diamonds_black"
+ },
+ {
+ "name": "sc_Queen_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Hearts_black"
+ },
+ {
+ "name": "sc_Queen_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Spades_black"
+ },
+ {
+ "name": "sc_Queen_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Spades_syndicate"
+ },
+ {
+ "name": "singlecard_down_black"
+ },
+ {
+ "name": "singlecard_down_nanotrasen"
+ },
+ {
+ "name": "singlecard_down_syndicate"
+ },
+ {
+ "name": "syndicate_hand1"
+ },
+ {
+ "name": "syndicate_hand2"
+ },
+ {
+ "name": "syndicate_hand3"
+ },
+ {
+ "name": "syndicate_hand4"
+ },
+ {
+ "name": "syndicate_hand5"
+ },
+ {
+ "name": "syndicate_joker",
+ "delays": [
+ [
+ 0.5,
+ 0.5
+ ]
+ ]
+ },
+ {
+ "name": "nanotrasen_joker",
+ "delays": [
+ [
+ 0.5,
+ 0.5
+ ]
+ ]
+ },
+ {
+ "name": "black_joker",
+ "delays": [
+ [
+ 0.5,
+ 0.5
+ ]
+ ]
+ },
+ {
+ "name": "syndicate_box"
+ },
+ {
+ "name": "syndicate_box_open"
+ },
+ {
+ "name": "black_box"
+ },
+ {
+ "name": "black_box_open"
+ },
+ {
+ "name": "nanotrasen_box"
+ },
+ {
+ "name": "nanotrasen_box_open"
+ }
+ ]
+}
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_box.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_box.png
new file mode 100644
index 000000000000..b80b2ccd71f5
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_box.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_box_open.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_box_open.png
new file mode 100644
index 000000000000..b86bfb1c2d0e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_box_open.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand1.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand1.png
new file mode 100644
index 000000000000..2c532c3148a3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand1.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand2.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand2.png
new file mode 100644
index 000000000000..073d79718c4e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand2.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand3.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand3.png
new file mode 100644
index 000000000000..1edfe42011da
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand3.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand4.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand4.png
new file mode 100644
index 000000000000..b788969f0f35
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand4.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand5.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand5.png
new file mode 100644
index 000000000000..8836dc110bfc
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_hand5.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_joker.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_joker.png
new file mode 100644
index 000000000000..c7c5c9e06159
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/nanotrasen_joker.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_black.png
new file mode 100644
index 000000000000..1c45b9f176b4
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..23f499fe81b0
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..ae4d73c1a652
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_black.png
new file mode 100644
index 000000000000..17a7cb99d2e3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..afad380277d0
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..100b213afc8c
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_black.png
new file mode 100644
index 000000000000..0a179f78eed7
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..eca6193c86a6
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..b9a846748541
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_black.png
new file mode 100644
index 000000000000..5fc75d0bce81
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..01187507f6ec
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_syndicate.png
new file mode 100644
index 000000000000..b4ac829a2419
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_10_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_black.png
new file mode 100644
index 000000000000..ba33f6b6a7a1
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..2067145ca032
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..1a057ecf79cb
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_black.png
new file mode 100644
index 000000000000..e5e5afcbf30e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..f0ee45883dd6
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..8f6549e8d3d9
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_black.png
new file mode 100644
index 000000000000..b16deb15ae86
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..af710d071114
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..7f99d786cfe5
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_black.png
new file mode 100644
index 000000000000..4ff15e413685
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..c8c01eb2d55a
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_syndicate.png
new file mode 100644
index 000000000000..bea976dc1b9e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_2_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_black.png
new file mode 100644
index 000000000000..36fcb2d65414
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..b64b1a6650a4
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..feeefb7bccf8
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_black.png
new file mode 100644
index 000000000000..a100b460580d
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..34e8feae6f19
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..1cf21d7723ef
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_black.png
new file mode 100644
index 000000000000..50be1e655a09
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..20cf0ab74e7e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..8d62899fe298
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_black.png
new file mode 100644
index 000000000000..d43b828a4993
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..dd9ba51947d8
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_syndicate.png
new file mode 100644
index 000000000000..6a51db9b7ebf
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_3_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_black.png
new file mode 100644
index 000000000000..67f25777ea14
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..fb1266f39102
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..2b14b3777d43
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_black.png
new file mode 100644
index 000000000000..653109f088dc
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..93d00aa65e89
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..1b63837065fc
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_black.png
new file mode 100644
index 000000000000..30e3525c7ea0
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..8d55ea1df9cc
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..2fb582d56987
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_black.png
new file mode 100644
index 000000000000..cb82281e4065
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..6bd780f25049
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_syndicate.png
new file mode 100644
index 000000000000..e6d0a439eeaa
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_4_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_black.png
new file mode 100644
index 000000000000..61c3ad81f1bd
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..bf156aceb7e3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..8183e0defab5
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_black.png
new file mode 100644
index 000000000000..3dd9f7c95b2e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..66032a9ddde3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..eef3d3322d6c
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_black.png
new file mode 100644
index 000000000000..f1fa1b4f34ce
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..95d5ed72a20f
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..b9a25077a1f3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_black.png
new file mode 100644
index 000000000000..48290bd26c41
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..5f557f6f1164
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_syndicate.png
new file mode 100644
index 000000000000..22f74e05357c
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_5_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_black.png
new file mode 100644
index 000000000000..7b4eb021bf68
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..f94cc8607717
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..7b7905bd38f3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_black.png
new file mode 100644
index 000000000000..c44ddd87e6d1
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..970bef60e4a0
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..729c0def3f42
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_black.png
new file mode 100644
index 000000000000..23697e2f9a46
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..e099806d233b
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..fabd88049a17
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_black.png
new file mode 100644
index 000000000000..429b9c9dcf36
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..7fc01c72b523
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_syndicate.png
new file mode 100644
index 000000000000..b1021e01bc39
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_6_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_black.png
new file mode 100644
index 000000000000..444a83394ef0
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..8d795e524e24
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..6f786cca2a43
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_black.png
new file mode 100644
index 000000000000..2308d43d4f24
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..efbe7248ecb8
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..7954748eab38
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_black.png
new file mode 100644
index 000000000000..e466ae712058
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..452bd851e4f1
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..7beeded17362
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_black.png
new file mode 100644
index 000000000000..b72505fb8783
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..c9923e0c89e1
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_syndicate.png
new file mode 100644
index 000000000000..07f4d96f75d9
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_7_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_black.png
new file mode 100644
index 000000000000..3367fa0d2e65
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..83eafee6c794
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..76d30fab1a60
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_black.png
new file mode 100644
index 000000000000..58a1130c4a8c
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..6204855e3c85
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..e1b2aba48e3c
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_black.png
new file mode 100644
index 000000000000..2ce9b69f164e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..86b3c37cd0ef
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..1ad0852935b1
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_black.png
new file mode 100644
index 000000000000..69154bbc3b1e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..587025d064ea
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_syndicate.png
new file mode 100644
index 000000000000..ec1158a360de
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_8_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_black.png
new file mode 100644
index 000000000000..59686360af8b
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..9c88a1a275a7
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..4ef37da096e3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_black.png
new file mode 100644
index 000000000000..7104afcd64bd
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..35aba68cfeb7
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..f6bad8382599
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_black.png
new file mode 100644
index 000000000000..43341bb1f8ca
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..389004ac91b6
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..c3b7cc614295
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_black.png
new file mode 100644
index 000000000000..ab89960ba014
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..dbdff6554ec2
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_syndicate.png
new file mode 100644
index 000000000000..1a68d32b7c0d
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_9_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_black.png
new file mode 100644
index 000000000000..5c524bad6483
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..4aab2f09d478
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..47fe7da11d21
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_black.png
new file mode 100644
index 000000000000..eff87dcb5629
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..bc1f38c11ee4
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..f3bb83907bb6
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_black.png
new file mode 100644
index 000000000000..da4360e0e50d
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..d5823c0fb7c2
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..e17eaab8cf6b
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_black.png
new file mode 100644
index 000000000000..4be96b088aa9
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..11bea7d14b3e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_syndicate.png
new file mode 100644
index 000000000000..94d9ce9f9d9a
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Ace_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_black.png
new file mode 100644
index 000000000000..83e604757ba6
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..5aa923cba29c
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..9b1a9ee48c1d
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_black.png
new file mode 100644
index 000000000000..0e79933147c7
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..8b9d7cb53f4b
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..c11bda0bf3e3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_black.png
new file mode 100644
index 000000000000..e9ab75342fe1
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..bfeaa7d8d2e5
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..6b07df352005
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_black.png
new file mode 100644
index 000000000000..df5447723106
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..5fa983d5e193
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_syndicate.png
new file mode 100644
index 000000000000..1da0de75ba54
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Jack_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_black.png
new file mode 100644
index 000000000000..2ec99fc8dd8b
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..28488799a0a0
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..446c79e0b39b
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_black.png
new file mode 100644
index 000000000000..0c561befb992
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..b6af7d621855
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..b6f8e32cc265
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_black.png
new file mode 100644
index 000000000000..fe38670021ee
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..c53d7fe5d0fd
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..7ebf4ce24ff7
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_black.png
new file mode 100644
index 000000000000..6fc8241b115a
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..adb48697f988
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_syndicate.png
new file mode 100644
index 000000000000..5da2adf32a2d
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_King_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_black.png
new file mode 100644
index 000000000000..de3cf80db964
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_nanotrasen.png
new file mode 100644
index 000000000000..c22d142b63e3
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_syndicate.png
new file mode 100644
index 000000000000..e234569093ca
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_black.png
new file mode 100644
index 000000000000..7a529a19159e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_nanotrasen.png
new file mode 100644
index 000000000000..537de98404ba
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_syndicate.png
new file mode 100644
index 000000000000..184f90b5de3e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_black.png
new file mode 100644
index 000000000000..1b190bd9342e
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_nanotrasen.png
new file mode 100644
index 000000000000..74a5fe35c465
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_syndicate.png
new file mode 100644
index 000000000000..30c4271fc963
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_black.png
new file mode 100644
index 000000000000..40edb50caab2
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_nanotrasen.png
new file mode 100644
index 000000000000..613f4e81ca6a
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_syndicate.png
new file mode 100644
index 000000000000..0106a46014bf
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/sc_Queen_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_black.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_black.png
new file mode 100644
index 000000000000..e634a9f8a0aa
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_black.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_nanotrasen.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_nanotrasen.png
new file mode 100644
index 000000000000..a219d0595415
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_nanotrasen.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_syndicate.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_syndicate.png
new file mode 100644
index 000000000000..03b7154520d7
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/singlecard_down_syndicate.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_box.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_box.png
new file mode 100644
index 000000000000..24d143e40dc6
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_box.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_box_open.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_box_open.png
new file mode 100644
index 000000000000..a8edb3d5cd69
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_box_open.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand1.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand1.png
new file mode 100644
index 000000000000..a0c5cf0e1392
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand1.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand2.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand2.png
new file mode 100644
index 000000000000..88a445a27ae8
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand2.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand3.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand3.png
new file mode 100644
index 000000000000..c30454d2b514
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand3.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand4.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand4.png
new file mode 100644
index 000000000000..7a9eb2d197ae
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand4.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand5.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand5.png
new file mode 100644
index 000000000000..3dc0f71ddc2a
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_hand5.png differ
diff --git a/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_joker.png b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_joker.png
new file mode 100644
index 000000000000..2e282d0c7d19
Binary files /dev/null and b/Resources/Textures/EstacaoPirata/Objects/Misc/cards.rsi/syndicate_joker.png differ
diff --git a/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt b/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt
index bd63121b9880..6e9491704ee0 100644
--- a/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt
+++ b/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt
@@ -18,3 +18,6 @@ bubbles.svg by Lorc under CC BY 3.0
https://game-icons.net/1x1/lorc/bubbles.html
oxygen.svg, collapse.svg by varttist (discord)
+
+extinguisher.svg by Smarticons under Attribution CC BY
+https://www.svgrepo.com/svg/394932/extinguisher
diff --git a/Resources/Textures/Interface/VerbIcons/extinguisher.svg b/Resources/Textures/Interface/VerbIcons/extinguisher.svg
new file mode 100644
index 000000000000..2c158154307e
--- /dev/null
+++ b/Resources/Textures/Interface/VerbIcons/extinguisher.svg
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/Resources/Textures/Interface/VerbIcons/extinguisher.svg.192dpi.png b/Resources/Textures/Interface/VerbIcons/extinguisher.svg.192dpi.png
new file mode 100644
index 000000000000..cea01249e75f
Binary files /dev/null and b/Resources/Textures/Interface/VerbIcons/extinguisher.svg.192dpi.png differ
diff --git a/Resources/Textures/Mobs/Customization/plasmaman.rsi/eyes.png b/Resources/Textures/Mobs/Customization/plasmaman.rsi/eyes.png
new file mode 100644
index 000000000000..28ce6d9e9e96
Binary files /dev/null and b/Resources/Textures/Mobs/Customization/plasmaman.rsi/eyes.png differ
diff --git a/Resources/Textures/Mobs/Customization/plasmaman.rsi/meta.json b/Resources/Textures/Mobs/Customization/plasmaman.rsi/meta.json
new file mode 100644
index 000000000000..f0bed207c094
--- /dev/null
+++ b/Resources/Textures/Mobs/Customization/plasmaman.rsi/meta.json
@@ -0,0 +1,15 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Skubman (github: angelofallars)",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "eyes",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/brain.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/brain.png
new file mode 100644
index 000000000000..06fb867f8071
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/brain.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/eyes.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/eyes.png
new file mode 100644
index 000000000000..b12859f24705
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/eyes.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/heart-off.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/heart-off.png
new file mode 100644
index 000000000000..5205aa647430
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/heart-off.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/heart-on.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/heart-on.png
new file mode 100644
index 000000000000..99c5641d5b1f
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/heart-on.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/kidneys.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/kidneys.png
new file mode 100644
index 000000000000..bf117e4d55ef
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/kidneys.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/liver.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/liver.png
new file mode 100644
index 000000000000..453945a519f5
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/liver.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/lungs.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/lungs.png
new file mode 100644
index 000000000000..6982b741c2a7
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/lungs.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/meta.json b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/meta.json
new file mode 100644
index 000000000000..f5b37bb53f12
--- /dev/null
+++ b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/meta.json
@@ -0,0 +1,65 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "stomach/tongue taken from TG station at commit https://github.com/tgstation/tgstation/commit/df00d853564efc80a8d10528bbf77ca6960742c4, liver/lungs/kidneys/heart/brain/eyes taken from Paradise Station at commit https://github.com/ParadiseSS13/Paradise/commit/bd91a1b962fe9bd38e346e9fafd4ebb10784fcb3",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "stomach"
+ },
+ {
+ "name": "tongue"
+ },
+ {
+ "name": "liver"
+ },
+ {
+ "name": "lungs"
+ },
+ {
+ "name": "kidneys"
+ },
+ {
+ "name": "heart-off"
+ },
+ {
+ "name": "heart-on",
+ "delays": [
+ [
+ 0.6,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1
+ ]
+ ]
+ },
+ {
+ "name": "brain",
+ "delays": [
+ [
+ 3,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1
+ ]
+ ]
+ },
+ {
+ "name": "eyes"
+ }
+ ]
+}
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/stomach.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/stomach.png
new file mode 100644
index 000000000000..de6fbbe192be
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/stomach.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/tongue.png b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/tongue.png
new file mode 100644
index 000000000000..fd246dbfda9a
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/organs.rsi/tongue.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/full.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/full.png
new file mode 100644
index 000000000000..a00035648e7e
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/full.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/head_f.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/head_f.png
new file mode 100644
index 000000000000..1c861e1d9f02
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/head_f.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/head_m.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/head_m.png
new file mode 100644
index 000000000000..1c861e1d9f02
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/head_m.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_arm.png
new file mode 100644
index 000000000000..785150c0422a
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_arm.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_foot.png
new file mode 100644
index 000000000000..06be449f0b8b
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_foot.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_hand.png
new file mode 100644
index 000000000000..6849df79dfdb
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_hand.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_leg.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_leg.png
new file mode 100644
index 000000000000..e80de98dffbd
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/l_leg.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/meta.json
new file mode 100644
index 000000000000..db0b13c9206d
--- /dev/null
+++ b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/meta.json
@@ -0,0 +1,62 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/fc4de530ce208ad6d91ad85cf241b094e64b2ae5 and modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "full"
+ },
+ {
+ "name": "head_f",
+ "directions": 4
+ },
+ {
+ "name": "head_m",
+ "directions": 4
+ },
+ {
+ "name": "l_arm",
+ "directions": 4
+ },
+ {
+ "name": "l_foot",
+ "directions": 4
+ },
+ {
+ "name": "l_hand",
+ "directions": 4
+ },
+ {
+ "name": "l_leg",
+ "directions": 4
+ },
+ {
+ "name": "r_arm",
+ "directions": 4
+ },
+ {
+ "name": "r_foot",
+ "directions": 4
+ },
+ {
+ "name": "r_hand",
+ "directions": 4
+ },
+ {
+ "name": "r_leg",
+ "directions": 4
+ },
+ {
+ "name": "torso_f",
+ "directions": 4
+ },
+ {
+ "name": "torso_m",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_arm.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_arm.png
new file mode 100644
index 000000000000..c2e942d0d537
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_arm.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_foot.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_foot.png
new file mode 100644
index 000000000000..10819174300f
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_foot.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_hand.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_hand.png
new file mode 100644
index 000000000000..bba548419bc7
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_hand.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_leg.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_leg.png
new file mode 100644
index 000000000000..b10d70ab948e
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/r_leg.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/torso_f.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/torso_f.png
new file mode 100644
index 000000000000..878dd9ed62ac
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/torso_f.png differ
diff --git a/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/torso_m.png b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/torso_m.png
new file mode 100644
index 000000000000..878dd9ed62ac
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Plasmaman/parts.rsi/torso_m.png differ
diff --git a/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/icon.png b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/icon.png
new file mode 100644
index 000000000000..b61d2ae7604a
Binary files /dev/null and b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/inhand-left.png b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/inhand-left.png
new file mode 100644
index 000000000000..a4c38e93fc34
Binary files /dev/null and b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/inhand-right.png b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/inhand-right.png
new file mode 100644
index 000000000000..c2b3b59e25aa
Binary files /dev/null and b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/meta.json b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/meta.json
new file mode 100644
index 000000000000..ce34667b41f1
--- /dev/null
+++ b/Resources/Textures/Objects/Misc/extinguisher_refill.rsi/meta.json
@@ -0,0 +1,22 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Icon taken from TG station at commit https://github.com/tgstation/tgstation/commit/8337d99a131ce67fcb53dff18af957eefc06bc5e | Inhands taken from TG station at commit https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432 then modified by Skubman",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}