diff --git a/Content.Client/Chemistry/UI/ChemMasterBoundUserInterface.cs b/Content.Client/Chemistry/UI/ChemMasterBoundUserInterface.cs
index 57bd34ed06..ff4bd0b710 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 94e7a0e84b..99dee58735 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 522098ceef..6144a586dc 100644
--- a/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
+++ b/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
@@ -25,18 +25,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";
@@ -50,12 +50,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.
@@ -110,12 +107,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 cfed1cb099..12ea7f1d25 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/Content.Client.csproj b/Content.Client/Content.Client.csproj
index c1958acba7..c53ac32fbd 100644
--- a/Content.Client/Content.Client.csproj
+++ b/Content.Client/Content.Client.csproj
@@ -15,6 +15,7 @@
+
diff --git a/Content.Client/DoAfter/DoAfterOverlay.cs b/Content.Client/DoAfter/DoAfterOverlay.cs
index dfbbf10891..f8e7564eda 100644
--- a/Content.Client/DoAfter/DoAfterOverlay.cs
+++ b/Content.Client/DoAfter/DoAfterOverlay.cs
@@ -8,6 +8,8 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
+using Robust.Shared.Configuration;
+using Content.Shared.CCVar;
namespace Content.Client.DoAfter;
@@ -16,6 +18,7 @@ public sealed class DoAfterOverlay : Overlay
private readonly IEntityManager _entManager;
private readonly IGameTiming _timing;
private readonly IPlayerManager _player;
+ private readonly IConfigurationManager _cfg;
private readonly SharedTransformSystem _transform;
private readonly MetaDataSystem _meta;
private readonly ProgressColorSystem _progressColor;
@@ -32,6 +35,8 @@ public sealed class DoAfterOverlay : Overlay
private const float StartX = 2;
private const float EndX = 22f;
+ private bool _useModernHUD = false;
+
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
public DoAfterOverlay(IEntityManager entManager, IPrototypeManager protoManager, IGameTiming timing, IPlayerManager player)
@@ -39,6 +44,7 @@ public DoAfterOverlay(IEntityManager entManager, IPrototypeManager protoManager,
_entManager = entManager;
_timing = timing;
_player = player;
+ _cfg = IoCManager.Resolve();
_transform = _entManager.EntitySysManager.GetEntitySystem();
_meta = _entManager.EntitySysManager.GetEntitySystem();
_progressColor = _entManager.System();
@@ -46,6 +52,8 @@ public DoAfterOverlay(IEntityManager entManager, IPrototypeManager protoManager,
_barTexture = _entManager.EntitySysManager.GetEntitySystem().Frame0(sprite);
_unshadedShader = protoManager.Index("unshaded").Instance();
+ _useModernHUD = _cfg.GetCVar(CCVars.ModernProgressBar);
+ _cfg.OnValueChanged(CCVars.ModernProgressBar, (newValue) => { _useModernHUD = newValue; } );
}
protected override void Draw(in OverlayDrawArgs args)
@@ -104,7 +112,8 @@ protected override void Draw(in OverlayDrawArgs args)
var alpha = 1f;
if (doAfter.Args.Hidden)
{
- if (uid != localEnt)
+ // Goobstation - Show doAfter progress bar to another entity
+ if (uid != localEnt && localEnt != doAfter.Args.ShowTo)
continue;
// Hints to the local player that this do-after is not visible to other players.
@@ -139,13 +148,41 @@ protected override void Draw(in OverlayDrawArgs args)
{
var elapsed = time - doAfter.StartTime;
elapsedRatio = (float) Math.Min(1, elapsed.TotalSeconds / doAfter.Args.Delay.TotalSeconds);
- color = GetProgressColor(elapsedRatio, alpha);
+
+ if (_useModernHUD)
+ {
+ if (elapsedRatio < 1.0f)
+ color = GetProgressColor(elapsedRatio, alpha);
+ else
+ color = GetProgressColor(0.35f, alpha); // Make orange/yellow color
+ }
+ else
+ {
+ color = GetProgressColor(elapsedRatio, alpha);
+ }
}
var xProgress = (EndX - StartX) * elapsedRatio + StartX;
- var box = new Box2(new Vector2(StartX, 3f) / EyeManager.PixelsPerMeter, new Vector2(xProgress, 4f) / EyeManager.PixelsPerMeter);
- box = box.Translated(position);
- handle.DrawRect(box, color);
+
+ if (_useModernHUD)
+ {
+ var box = new Box2(new Vector2(StartX, 2f) / EyeManager.PixelsPerMeter, new Vector2(xProgress, 5f) / EyeManager.PixelsPerMeter);
+ box = box.Translated(position);
+ // Brighter line, like /tg/station bar
+ var boxInner = new Box2(new Vector2(StartX, 3f) / EyeManager.PixelsPerMeter, new Vector2(xProgress, 4f) / EyeManager.PixelsPerMeter);
+ boxInner = boxInner.Translated(position);
+
+ handle.DrawRect(box, color);
+ handle.DrawRect(boxInner, Color.InterpolateBetween(color, Color.White, 0.5f));
+ }
+ else
+ {
+ var box = new Box2(new Vector2(StartX, 3f) / EyeManager.PixelsPerMeter, new Vector2(xProgress, 4f) / EyeManager.PixelsPerMeter);
+ box = box.Translated(position);
+
+ handle.DrawRect(box, color);
+ }
+
offset += _barTexture.Height / scale;
}
}
diff --git a/Content.Client/Effects/ColorFlashEffectSystem.cs b/Content.Client/Effects/ColorFlashEffectSystem.cs
index 3a66cb72e9..764059b4b0 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)
@@ -50,7 +50,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;
@@ -58,7 +58,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
@@ -69,7 +69,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)
}
}
}
@@ -115,7 +115,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 84bc7d5439..089551c778 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 58883d0ac8..feddc074dc 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 de31dd90e5..e79693c368 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 c4e4fff5fb..eb32125006 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 a300e8c054..2c63c2aa6b 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 8cadcdcbad..ef7c78baf3 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()
{
@@ -1164,6 +1178,20 @@ private void OnSkinColorOnValueChanged()
Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color));
break;
}
+ case HumanoidSkinColor.AnimalFur: // Einstein Engines - Tajaran
+ {
+ if (!RgbSkinColorContainer.Visible)
+ {
+ Skin.Visible = false;
+ RgbSkinColorContainer.Visible = true;
+ }
+
+ var color = SkinColor.ClosestAnimalFurColor(_rgbSkinColorSelector.Color);
+
+ Markings.CurrentSkinColor = color;
+ Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color));
+ break;
+ }
}
SetDirty();
@@ -1265,6 +1293,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)
@@ -1429,6 +1458,18 @@ private void UpdateSkinColor()
break;
}
+ case HumanoidSkinColor.AnimalFur: // Einstein Engines - Tajaran
+ {
+ if (!RgbSkinColorContainer.Visible)
+ {
+ Skin.Visible = false;
+ RgbSkinColorContainer.Visible = true;
+ }
+
+ _rgbSkinColorSelector.Color = SkinColor.ClosestAnimalFurColor(Profile.Appearance.SkinColor);
+
+ break;
+ }
}
}
diff --git a/Content.Client/Options/UI/Tabs/MiscTab.xaml b/Content.Client/Options/UI/Tabs/MiscTab.xaml
index f34f9f71db..8ac28d6d6c 100644
--- a/Content.Client/Options/UI/Tabs/MiscTab.xaml
+++ b/Content.Client/Options/UI/Tabs/MiscTab.xaml
@@ -70,6 +70,10 @@
StyleClasses="LabelKeyText"/>
+
+
diff --git a/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs b/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
index 65714f8fc5..6261a7307b 100644
--- a/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
+++ b/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
@@ -92,6 +92,7 @@ public MiscTab()
ScreenShakeIntensitySlider.OnValueChanged += OnScreenShakeIntensitySliderChanged;
// ToggleWalk.OnToggled += OnCheckBoxToggled;
StaticStorageUI.OnToggled += OnCheckBoxToggled;
+ ModernProgressBar.OnToggled += OnCheckBoxToggled;
DisableFiltersCheckBox.OnToggled += OnCheckBoxToggled;
HudThemeOption.SelectId(_hudThemeIdToIndex.GetValueOrDefault(_cfg.GetCVar(CVars.InterfaceTheme), 0));
@@ -111,6 +112,7 @@ public MiscTab()
ScreenShakeIntensitySlider.Value = _cfg.GetCVar(CCVars.ScreenShakeIntensity) * 100f;
// ToggleWalk.Pressed = _cfg.GetCVar(CCVars.ToggleWalk);
StaticStorageUI.Pressed = _cfg.GetCVar(CCVars.StaticStorageUI);
+ ModernProgressBar.Pressed = _cfg.GetCVar(CCVars.ModernProgressBar);
DisableFiltersCheckBox.Pressed = _cfg.GetCVar(CCVars.NoVisionFilters);
@@ -168,6 +170,7 @@ private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args)
_cfg.SetCVar(CCVars.ScreenShakeIntensity, ScreenShakeIntensitySlider.Value / 100f);
// _cfg.SetCVar(CCVars.ToggleWalk, ToggleWalk.Pressed);
_cfg.SetCVar(CCVars.StaticStorageUI, StaticStorageUI.Pressed);
+ _cfg.SetCVar(CCVars.ModernProgressBar, ModernProgressBar.Pressed);
_cfg.SetCVar(CCVars.NoVisionFilters, DisableFiltersCheckBox.Pressed);
_cfg.SetCVar(CCVars.ChatStackLastLines, ChatStackOption.SelectedId);
@@ -200,6 +203,7 @@ private void UpdateApplyButton()
var isScreenShakeIntensitySame = Math.Abs(ScreenShakeIntensitySlider.Value / 100f - _cfg.GetCVar(CCVars.ScreenShakeIntensity)) < 0.01f;
// var isToggleWalkSame = ToggleWalk.Pressed == _cfg.GetCVar(CCVars.ToggleWalk);
var isStaticStorageUISame = StaticStorageUI.Pressed == _cfg.GetCVar(CCVars.StaticStorageUI);
+ var isModernProgressBarSame = ModernProgressBar.Pressed == _cfg.GetCVar(CCVars.ModernProgressBar);
var isNoVisionFiltersSame = DisableFiltersCheckBox.Pressed == _cfg.GetCVar(CCVars.NoVisionFilters);
var isChatStackTheSame = ChatStackOption.SelectedId == _cfg.GetCVar(CCVars.ChatStackLastLines);
@@ -221,6 +225,7 @@ private void UpdateApplyButton()
isScreenShakeIntensitySame &&
// isToggleWalkSame &&
isStaticStorageUISame &&
+ isModernProgressBarSame &&
isNoVisionFiltersSame &&
isChatStackTheSame;
}
diff --git a/Content.Client/SelfExtinguisher/SelfExtinguisherSystem.cs b/Content.Client/SelfExtinguisher/SelfExtinguisherSystem.cs
new file mode 100644
index 0000000000..0329cd487c
--- /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 6be41af0d8..40f6bd9bb3 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 0000000000..ef14b87317
--- /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 0000000000..581e517b04
--- /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 0000000000..c03888bba8
--- /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 0000000000..99b0019ea6
--- /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 0000000000..76cd424730
--- /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 0000000000..b63a28c3d1
--- /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 0000000000..e93d983e51
--- /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.Client/_Goobstation/Clothing/Components/SealableClothingVisualsComponent.cs b/Content.Client/_Goobstation/Clothing/Components/SealableClothingVisualsComponent.cs
new file mode 100644
index 0000000000..813adb9b9b
--- /dev/null
+++ b/Content.Client/_Goobstation/Clothing/Components/SealableClothingVisualsComponent.cs
@@ -0,0 +1,11 @@
+namespace Content.Client._Goobstation.Clothing.Components;
+
+[RegisterComponent]
+public sealed partial class SealableClothingVisualsComponent : Component
+{
+ [DataField]
+ public string SpriteLayer = "sealed";
+
+ [DataField]
+ public Dictionary> VisualLayers = new();
+}
diff --git a/Content.Client/_Goobstation/Clothing/EntitySystems/PoweredSealableClothingSystem.cs b/Content.Client/_Goobstation/Clothing/EntitySystems/PoweredSealableClothingSystem.cs
new file mode 100644
index 0000000000..2be336e109
--- /dev/null
+++ b/Content.Client/_Goobstation/Clothing/EntitySystems/PoweredSealableClothingSystem.cs
@@ -0,0 +1,7 @@
+using Content.Shared._Goobstation.Clothing.Systems;
+
+namespace Content.Client._Goobstation.Clothing.EntitySystems;
+
+public sealed class PoweredSealableClothingSystem : SharedPoweredSealableClothingSystem
+{
+}
diff --git a/Content.Client/_Goobstation/Clothing/EntitySystems/SealableClothingSystem.cs b/Content.Client/_Goobstation/Clothing/EntitySystems/SealableClothingSystem.cs
new file mode 100644
index 0000000000..e12774db8e
--- /dev/null
+++ b/Content.Client/_Goobstation/Clothing/EntitySystems/SealableClothingSystem.cs
@@ -0,0 +1,7 @@
+using Content.Shared._Goobstation.Clothing.Systems;
+
+namespace Content.Client._Goobstation.Clothing.EntitySystems;
+
+public sealed partial class SealableClothingSystem : SharedSealableClothingSystem
+{
+}
diff --git a/Content.Client/_Goobstation/Clothing/EntitySystems/SealableClothingVisualizerSystem.cs b/Content.Client/_Goobstation/Clothing/EntitySystems/SealableClothingVisualizerSystem.cs
new file mode 100644
index 0000000000..235982e3a8
--- /dev/null
+++ b/Content.Client/_Goobstation/Clothing/EntitySystems/SealableClothingVisualizerSystem.cs
@@ -0,0 +1,57 @@
+using Content.Client._Goobstation.Clothing.Components;
+using Content.Client.Clothing;
+using Content.Shared._Goobstation.Clothing;
+using Content.Shared.Clothing;
+using Content.Shared.Item;
+using Robust.Client.GameObjects;
+using System.Linq;
+
+namespace Content.Client._Goobstation.Clothing.EntitySystems;
+
+public sealed class SealableClothingVisualizerSystem : VisualizerSystem
+{
+ [Dependency] private readonly SharedItemSystem _itemSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnGetEquipmentVisuals, after: new[] { typeof(ClientClothingSystem) });
+ }
+
+ protected override void OnAppearanceChange(EntityUid uid, SealableClothingVisualsComponent component, ref AppearanceChangeEvent args)
+ {
+ if (!AppearanceSystem.TryGetData(uid, SealableClothingVisuals.Sealed, out var isSealed, args.Component))
+ return;
+
+ if (args.Sprite != null && component.SpriteLayer != null && args.Sprite.LayerMapTryGet(component.SpriteLayer, out var layer))
+ args.Sprite.LayerSetVisible(layer, isSealed);
+
+ _itemSystem.VisualsChanged(uid);
+ }
+
+ private void OnGetEquipmentVisuals(Entity sealable, ref GetEquipmentVisualsEvent args)
+ {
+ var (uid, comp) = sealable;
+
+ if (!TryComp(uid, out AppearanceComponent? appearance)
+ || !AppearanceSystem.TryGetData(uid, SealableClothingVisuals.Sealed, out var isSealed, appearance)
+ || !isSealed)
+ return;
+
+ if (!comp.VisualLayers.TryGetValue(args.Slot, out var layers))
+ return;
+
+ var i = 0;
+ foreach (var layer in layers)
+ {
+ var key = layer.MapKeys?.FirstOrDefault();
+ if (key == null)
+ {
+ key = i == 0 ? $"{args.Slot}-sealed" : $"{args.Slot}-sealed-{i}";
+ i++;
+ }
+
+ args.Layers.Add((key, layer));
+ }
+ }
+}
diff --git a/Content.Client/_Goobstation/Clothing/ToggleableClothingBoundUserInterface.cs b/Content.Client/_Goobstation/Clothing/ToggleableClothingBoundUserInterface.cs
new file mode 100644
index 0000000000..55407f7834
--- /dev/null
+++ b/Content.Client/_Goobstation/Clothing/ToggleableClothingBoundUserInterface.cs
@@ -0,0 +1,39 @@
+using Content.Shared.Clothing.Components;
+using Robust.Client.Graphics;
+using Robust.Client.Input;
+using Robust.Client.UserInterface;
+
+namespace Content.Client._Goobstation.Clothing;
+
+public sealed class ToggleableClothingBoundUserInterface : BoundUserInterface
+{
+ [Dependency] private readonly IClyde _displayManager = default!;
+ [Dependency] private readonly IInputManager _inputManager = default!;
+
+ private IEntityManager _entityManager;
+ private ToggleableClothingRadialMenu? _menu;
+
+ public ToggleableClothingBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
+ {
+ IoCManager.InjectDependencies(this);
+ _entityManager = IoCManager.Resolve();
+ }
+
+ protected override void Open()
+ {
+ base.Open();
+
+ _menu = this.CreateWindow();
+ _menu.SetEntity(Owner);
+ _menu.SendToggleClothingMessageAction += SendToggleableClothingMessage;
+
+ var vpSize = _displayManager.ScreenSize;
+ _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize);
+ }
+
+ private void SendToggleableClothingMessage(EntityUid uid)
+ {
+ var message = new ToggleableClothingUiMessage(_entityManager.GetNetEntity(uid));
+ SendPredictedMessage(message);
+ }
+}
diff --git a/Content.Client/_Goobstation/Clothing/ToggleableClothingRadialMenu.xaml b/Content.Client/_Goobstation/Clothing/ToggleableClothingRadialMenu.xaml
new file mode 100644
index 0000000000..b1e27528a6
--- /dev/null
+++ b/Content.Client/_Goobstation/Clothing/ToggleableClothingRadialMenu.xaml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/Content.Client/_Goobstation/Clothing/ToggleableClothingRadialMenu.xaml.cs b/Content.Client/_Goobstation/Clothing/ToggleableClothingRadialMenu.xaml.cs
new file mode 100644
index 0000000000..ee5fae16b0
--- /dev/null
+++ b/Content.Client/_Goobstation/Clothing/ToggleableClothingRadialMenu.xaml.cs
@@ -0,0 +1,96 @@
+using Content.Client.UserInterface.Controls;
+using Content.Shared.Clothing.Components;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Prototypes;
+using System.Numerics;
+
+namespace Content.Client._Goobstation.Clothing;
+
+public sealed partial class ToggleableClothingRadialMenu : RadialMenu
+{
+ [Dependency] private readonly EntityManager _entityManager = default!;
+
+ public event Action? SendToggleClothingMessageAction;
+
+ public EntityUid Entity { get; set; }
+
+ public ToggleableClothingRadialMenu()
+ {
+ IoCManager.InjectDependencies(this);
+ RobustXamlLoader.Load(this);
+ }
+
+ public void SetEntity(EntityUid uid)
+ {
+ Entity = uid;
+ RefreshUI();
+ }
+
+ public void RefreshUI()
+ {
+ // Even EmotesMenu has to call this, I'm assuming it's essential.
+ var main = FindControl("Main");
+
+ if (!_entityManager.TryGetComponent(Entity, out var clothing)
+ || clothing.Container is not { } clothingContainer)
+ return;
+
+ foreach (var attached in clothing.ClothingUids)
+ {
+ // Change tooltip text if attached clothing is toggle/untoggled
+ var tooltipText = Loc.GetString(clothing.UnattachTooltip);
+
+ if (clothingContainer.Contains(attached.Key))
+ tooltipText = Loc.GetString(clothing.AttachTooltip);
+
+ var button = new ToggleableClothingRadialMenuButton()
+ {
+ StyleClasses = { "RadialMenuButton" },
+ SetSize = new Vector2(64, 64),
+ ToolTip = tooltipText,
+ AttachedClothingId = attached.Key
+ };
+
+ var spriteView = new SpriteView()
+ {
+ SetSize = new Vector2(48, 48),
+ VerticalAlignment = VAlignment.Center,
+ HorizontalAlignment = HAlignment.Center,
+ Stretch = SpriteView.StretchMode.Fill
+ };
+
+ spriteView.SetEntity(attached.Key);
+
+ button.AddChild(spriteView);
+ main.AddChild(button);
+ }
+
+ AddToggleableClothingMenuButtonOnClickAction(main);
+ }
+
+ private void AddToggleableClothingMenuButtonOnClickAction(Control control)
+ {
+ if (control is not RadialContainer mainControl)
+ return;
+
+ foreach (var child in mainControl.Children)
+ {
+ if (child is not ToggleableClothingRadialMenuButton castChild)
+ continue;
+
+ castChild.OnButtonDown += _ =>
+ {
+ SendToggleClothingMessageAction?.Invoke(castChild.AttachedClothingId);
+ mainControl.DisposeAllChildren();
+ RefreshUI();
+ };
+ }
+ }
+}
+
+public sealed class ToggleableClothingRadialMenuButton : RadialMenuTextureButton
+{
+ public EntityUid AttachedClothingId { get; set; }
+}
diff --git a/Content.IntegrationTests/Tests/StoreTests.cs b/Content.IntegrationTests/Tests/StoreTests.cs
index 877db1d9a0..6bb4344315 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 a7427d708c..4df38344ed 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/Administration/Systems/AdminSystem.cs b/Content.Server/Administration/Systems/AdminSystem.cs
index 8d6e2fa374..aa126b3384 100644
--- a/Content.Server/Administration/Systems/AdminSystem.cs
+++ b/Content.Server/Administration/Systems/AdminSystem.cs
@@ -105,13 +105,11 @@ private void OnRoundRestartCleanup(RoundRestartCleanupEvent ev)
foreach (var (id, data) in _playerList)
{
- if (!data.ActiveThisRound)
+ if (!data.ActiveThisRound
+ || !_playerManager.TryGetPlayerData(id, out var playerData)
+ || !_playerManager.TryGetSessionById(id, out var session))
continue;
- if (!_playerManager.TryGetPlayerData(id, out var playerData))
- return;
-
- _playerManager.TryGetSessionById(id, out var session);
_playerList[id] = GetPlayerInfo(playerData, session);
}
@@ -218,7 +216,7 @@ private void SendFullPlayerList(ICommonSession playerSession)
RaiseNetworkEvent(ev, playerSession.Channel);
}
- private PlayerInfo GetPlayerInfo(SessionData data, ICommonSession? session)
+ private PlayerInfo GetPlayerInfo(SessionData data, ICommonSession session)
{
var name = data.UserName;
var entityName = string.Empty;
diff --git a/Content.Server/Atmos/Components/FlammableComponent.cs b/Content.Server/Atmos/Components/FlammableComponent.cs
index e1c7974307..1ca436d165 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 0000000000..0d20d8553b
--- /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 0000000000..16b286c820
--- /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 0000000000..099322b5a5
--- /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 741a9341e7..327804f39a 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/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs
index 87111aad4a..df6a812e10 100644
--- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs
@@ -18,21 +18,27 @@ public sealed class BarotraumaSystem : EntitySystem
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
- [Dependency] private readonly IAdminLogManager _adminLogger= default!;
+ [Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
+ [Dependency] private readonly ILogManager _logManager = default!;
+
private const float UpdateTimer = 1f;
+
+ private ISawmill _sawmill = default!;
private float _timer;
public override void Initialize()
{
SubscribeLocalEvent(OnPressureProtectionEquipped);
SubscribeLocalEvent(OnPressureProtectionUnequipped);
- SubscribeLocalEvent(OnUpdateResistance);
- SubscribeLocalEvent(OnUpdateResistance);
+ SubscribeLocalEvent(OnPressureProtectionChanged); // Goobstation - Update component state on toggle
+ SubscribeLocalEvent(OnPressureProtectionChanged); // Goobstation - Update component state on toggle
SubscribeLocalEvent(OnPressureImmuneInit);
SubscribeLocalEvent(OnPressureImmuneRemove);
+
+ // _sawmill = _logManager.GetSawmill("barotrauma");
}
private void OnPressureImmuneInit(EntityUid uid, PressureImmunityComponent pressureImmunity, ComponentInit args)
@@ -51,6 +57,27 @@ private void OnPressureImmuneRemove(EntityUid uid, PressureImmunityComponent pre
}
}
+ // Goobstation - Modsuits - Update component state on toggle
+ private void OnPressureProtectionChanged(EntityUid uid, PressureProtectionComponent pressureProtection, EntityEventArgs args)
+ {
+ var protectionTarget = uid;
+ string? slotTarget = null;
+
+ if (_inventorySystem.TryGetContainingEntity(uid, out var entity) && _inventorySystem.TryGetContainingSlot(uid, out var slot))
+ {
+ protectionTarget = entity.Value;
+ slotTarget = slot.Name;
+ }
+
+ if (!TryComp(protectionTarget, out var barotrauma))
+ return;
+
+ if (slotTarget != null && !barotrauma.ProtectionSlots.Contains(slotTarget))
+ return;
+
+ UpdateCachedResistances(protectionTarget, barotrauma);
+ }
+
///
/// Generic method for updating resistance on component Lifestage events
///
diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs
index 0f6ce0780e..db2b7888c1 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 07594820fc..baad739804 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 0000000000..253238db63
--- /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 7220c04ea8..b09609a86f 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 0000000000..d7c0272f5a
--- /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 098f178921..ef908f9655 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/Components/LungComponent.cs b/Content.Server/Body/Components/LungComponent.cs
index 4fb769d670..a2c73ebf40 100644
--- a/Content.Server/Body/Components/LungComponent.cs
+++ b/Content.Server/Body/Components/LungComponent.cs
@@ -34,4 +34,10 @@ public sealed partial class LungComponent : Component
///
[DataField]
public ProtoId Alert = "LowOxygen";
+
+ [DataField]
+ public float MaxVolume = 100f;
+
+ [DataField]
+ public bool CanReact = false; // No Dexalin lungs... right?
}
diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs
index 56fc981a0f..260c2e3e96 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/Body/Systems/LungSystem.cs b/Content.Server/Body/Systems/LungSystem.cs
index 7e58c24f7e..5919d958c9 100644
--- a/Content.Server/Body/Systems/LungSystem.cs
+++ b/Content.Server/Body/Systems/LungSystem.cs
@@ -1,20 +1,25 @@
using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
-using Content.Server.Chemistry.Containers.EntitySystems;
+using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Chemistry.Components;
using Content.Shared.Clothing;
using Content.Shared.Inventory.Events;
+using Content.Shared.Inventory;
+using Content.Server.Power.EntitySystems;
+using Robust.Server.Containers;
namespace Content.Server.Body.Systems;
public sealed class LungSystem : EntitySystem
{
- [Dependency] private readonly AtmosphereSystem _atmos = default!;
- [Dependency] private readonly InternalsSystem _internals = default!;
- [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
+ [Dependency] private readonly InternalsSystem _internals = default!;
+ [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
+ [Dependency] private readonly InventorySystem _inventory = default!; // Goobstation
+
+
public static string LungSolutionName = "Lung";
@@ -22,6 +27,7 @@ public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnComponentInit);
+ SubscribeLocalEvent(OnBreathToolInit); // Goobstation - Modsuits - Update on component toggle
SubscribeLocalEvent(OnGotEquipped);
SubscribeLocalEvent(OnGotUnequipped);
SubscribeLocalEvent(OnMaskToggled);
@@ -50,16 +56,36 @@ private void OnGotEquipped(Entity ent, ref GotEquippedEvent
private void OnComponentInit(Entity entity, ref ComponentInit args)
{
- var solution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.SolutionName);
- solution.MaxVolume = 100.0f;
- solution.CanReact = false; // No dexalin lungs
+ if (_solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.SolutionName, out var solution))
+ {
+ solution.MaxVolume = entity.Comp.MaxVolume;
+ solution.CanReact = entity.Comp.CanReact;
+ }
+ }
+
+ // Goobstation - Update component state on component toggle
+ private void OnBreathToolInit(Entity ent, ref ComponentInit args)
+ {
+ var comp = ent.Comp;
+
+ comp.IsFunctional = true;
+
+ if (!_inventory.TryGetContainingEntity(ent.Owner, out var parent)
+ || !_inventory.TryGetContainingSlot(ent.Owner, out var slot)
+ || (slot.SlotFlags & comp.AllowedSlots) == 0
+ || !TryComp(parent, out InternalsComponent? internals))
+ return;
+
+ ent.Comp.ConnectedInternalsEntity = parent;
+ _internals.ConnectBreathTool((parent.Value, internals), ent);
}
+
private void OnMaskToggled(Entity ent, ref ItemMaskToggledEvent args)
{
if (args.IsToggled || args.IsEquip)
{
- _atmos.DisconnectInternals(ent.Comp);
+ _atmosphereSystem.DisconnectInternals(ent);
}
else
{
diff --git a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs
index 09a8f3562d..50c63bff6e 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 77c8620ea4..39ddca3412 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 9182618899..b27f33c954 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 ad7b2a11b0..c844dd2c9a 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/Content.Server.csproj b/Content.Server/Content.Server.csproj
index 70e404fdef..e276965d43 100644
--- a/Content.Server/Content.Server.csproj
+++ b/Content.Server/Content.Server.csproj
@@ -15,6 +15,7 @@
+
diff --git a/Content.Server/Damage/Components/DamageOnHitComponent.cs b/Content.Server/Damage/Components/DamageOnHitComponent.cs
index 3580e9a8d5..31b3ea730a 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 f129a14f79..3626796dcd 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 0000000000..d6c57129d5
--- /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 0000000000..4beff20fef
--- /dev/null
+++ b/Content.Server/DeltaV/Objectives/Systems/TeachLessonConditionSystem.cs
@@ -0,0 +1,60 @@
+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);
+ }
+
+ private void OnMobStateChanged(MobStateChangedEvent args)
+ {
+ if (args.NewMobState != MobState.Critical || args.OldMobState >= args.NewMobState
+ || !TryComp(args.Target, out var mc) || mc.OriginalMind is not { } mindId)
+ return;
+
+ // If the attacker actually has the objective, we can just skip any enumeration outright.
+ if (args.Origin is not null
+ && HasComp(args.Origin)
+ && TryComp(args.Origin, out var targetComp)
+ && targetComp.Target == mindId)
+ {
+ _codeCondition.SetCompleted(args.Origin!.Value);
+ return;
+ }
+
+ // Get all TeachLessonConditionComponent entities
+ var query = EntityQueryEnumerator();
+
+ while (query.MoveNext(out var ent, 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(ent);
+ var targetWorldPos = _transform.GetWorldPosition(args.Target);
+
+ var distance = (userWorldPos - targetWorldPos).Length();
+ if (distance > conditionComp.MaxDistance
+ || Transform(ent).MapID != Transform(args.Target).MapID)
+ continue;
+
+ _codeCondition.SetCompleted(ent);
+ }
+ }
+}
diff --git a/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs b/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs
index f05297039d..0b6d41242e 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;
@@ -40,6 +41,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()
{
@@ -153,6 +155,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 2d29134657..40e7060a1a 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 9ba0ee4b00..2a494ca211 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/IdentityManagement/IdentitySystem.cs b/Content.Server/IdentityManagement/IdentitySystem.cs
index e2f57b648a..65b951dadf 100644
--- a/Content.Server/IdentityManagement/IdentitySystem.cs
+++ b/Content.Server/IdentityManagement/IdentitySystem.cs
@@ -29,6 +29,7 @@ public sealed class IdentitySystem : SharedIdentitySystem
[Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!;
[Dependency] private readonly CriminalRecordsConsoleSystem _criminalRecordsConsole = default!;
[Dependency] private readonly PsionicsRecordsConsoleSystem _psionicsRecordsConsole = default!;
+ [Dependency] private readonly InventorySystem _inventorySystem = default!; // Goobstation - Update component state on component toggle
private HashSet _queuedIdentityUpdates = new();
@@ -41,7 +42,11 @@ public override void Initialize()
SubscribeLocalEvent((uid, _, _) => QueueIdentityUpdate(uid));
SubscribeLocalEvent((uid, _, _) => QueueIdentityUpdate(uid));
SubscribeLocalEvent((uid, _, _) => QueueIdentityUpdate(uid));
+ SubscribeLocalEvent((uid, _, _) => QueueIdentityUpdate(uid));
SubscribeLocalEvent(OnMapInit);
+
+ SubscribeLocalEvent(BlockerUpdateIdentity); // Goobstation - Update component state on component toggle
+ SubscribeLocalEvent(BlockerUpdateIdentity); // Goobstation - Update component state on component toggle
}
public override void Update(float frameTime)
@@ -175,5 +180,16 @@ private IdentityRepresentation GetIdentityRepresentation(EntityUid target,
return new(trueName, gender, ageString, presumedName, presumedJob);
}
+ // Goobstation - Update component state on component toggle
+ private void BlockerUpdateIdentity(EntityUid uid, IdentityBlockerComponent component, EntityEventArgs args)
+ {
+ var target = uid;
+
+ if (_inventorySystem.TryGetContainingEntity(uid, out var containing))
+ target = containing.Value;
+
+ QueueIdentityUpdate(target);
+ }
+
#endregion
}
diff --git a/Content.Server/Jobs/ModifyEnvirohelmSpecial.cs b/Content.Server/Jobs/ModifyEnvirohelmSpecial.cs
new file mode 100644
index 0000000000..28ad9db094
--- /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 0000000000..ff03f5debd
--- /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 91e8b2bf98..07c1140f16 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 2e7c31ec7a..4934fb8bcc 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 83bef4f0f0..dd043d03b6 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/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs
index 40b998a95d..c686906f4e 100644
--- a/Content.Server/Power/EntitySystems/ChargerSystem.cs
+++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs
@@ -11,6 +11,8 @@
using Content.Shared.Storage.Components;
using Robust.Server.Containers;
using Content.Shared.Whitelist;
+using Content.Shared.Inventory;
+using Content.Shared._Goobstation.Clothing.Systems;
namespace Content.Server.Power.EntitySystems;
@@ -22,6 +24,7 @@ internal sealed class ChargerSystem : EntitySystem
[Dependency] private readonly BatterySystem _battery = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
+ [Dependency] private readonly InventorySystem _inventorySystem = default!;
public override void Initialize()
{
@@ -256,15 +259,45 @@ private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerCompone
UpdateStatus(uid, component);
}
+ // Goobstation - Modsuits - Changed charger logic to work with suits in cyborg charger
private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out EntityUid? batteryUid, [NotNullWhen(true)] out BatteryComponent? component)
{
+ batteryUid = null;
+ component = null;
+
// try get a battery directly on the inserted entity
- if (!TryComp(uid, out component))
+ if (TryComp(uid, out component))
{
- // or by checking for a power cell slot on the inserted entity
- return _powerCell.TryGetBatteryFromSlot(uid, out batteryUid, out component);
+ batteryUid = uid;
+ return true;
}
- batteryUid = uid;
- return true;
+
+ // Try to get the battery by checking for a power cell slot on the inserted entity
+ if (_powerCell.TryGetBatteryFromSlot(uid, out batteryUid, out component))
+ return true;
+
+ if (TryComp(uid, out var inventory))
+ {
+ var relayEv = new FindInventoryBatteryEvent();
+ _inventorySystem.RelayEvent((uid, inventory), ref relayEv);
+
+ if (relayEv.FoundBattery != null)
+ {
+ batteryUid = relayEv.FoundBattery.Value.Owner;
+ component = relayEv.FoundBattery.Value.Comp;
+ return true;
+ }
+ }
+
+ return false;
}
}
+
+// Goobstation - Modsuits stuff
+[ByRefEvent]
+public record struct FindInventoryBatteryEvent() : IInventoryRelayEvent
+{
+ public SlotFlags TargetSlots { get; } = SlotFlags.WITHOUT_POCKET;
+
+ public Entity? FoundBattery { get; set; }
+}
diff --git a/Content.Server/SelfExtinguisher/SelfExtinguisherSystem.cs b/Content.Server/SelfExtinguisher/SelfExtinguisherSystem.cs
new file mode 100644
index 0000000000..b4d5a63c72
--- /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 d143c25fdb..d832629530 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 85f5662b42..f44416d0c9 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/Supermatter/Systems/SupermatterSystem.Processing.cs b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs
index 160bb48ba5..36ae2646b8 100644
--- a/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs
+++ b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs
@@ -195,6 +195,9 @@ private void HandleDamage(EntityUid uid, SupermatterComponent sm)
totalDamage += healHeatDamage;
}
+ // Return the manipulated gas back to the mix
+ _atmosphere.Merge(mix, absorbedGas);
+
// Check for space tiles next to SM
//TODO: Change moles out for checking if adjacent tiles exist
var enumerator = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices, false, false);
diff --git a/Content.Server/Temperature/Components/TemperatureComponent.cs b/Content.Server/Temperature/Components/TemperatureComponent.cs
index 3bfa12f269..ae2c373b14 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 ee13cb96a5..be6dc78240 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 133876bd75..8ff49b4d10 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 8306105b93..deb3102d4b 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 0000000000..8ba332ce76
--- /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 0000000000..871d10a7c2
--- /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 0000000000..34d8244d5c
--- /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 0000000000..1dae46b943
--- /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 0000000000..5af24b34d8
--- /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 0000000000..bb2123cc89
--- /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.Server/_Goobstation/Clothing/Systems/PoweredSealableClothingSystem.cs b/Content.Server/_Goobstation/Clothing/Systems/PoweredSealableClothingSystem.cs
new file mode 100644
index 0000000000..3e7a9d7d9f
--- /dev/null
+++ b/Content.Server/_Goobstation/Clothing/Systems/PoweredSealableClothingSystem.cs
@@ -0,0 +1,112 @@
+using Content.Server.Power.EntitySystems;
+using Content.Server.PowerCell;
+using Content.Shared._Goobstation.Clothing.Components;
+using Content.Shared._Goobstation.Clothing.Systems;
+using Content.Shared.Alert;
+using Content.Shared.Inventory;
+using Content.Shared.Movement.Systems;
+using Content.Shared.PowerCell;
+using Content.Shared.PowerCell.Components;
+using Content.Shared.Rounding;
+
+namespace Content.Server._Goobstation.Clothing.Systems;
+
+public sealed partial class PoweredSealableClothingSystem : SharedPoweredSealableClothingSystem
+{
+ [Dependency] private readonly AlertsSystem _alertsSystem = default!;
+ [Dependency] private readonly PowerCellSystem _powerCellSystem = default!;
+ [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent>(OnMovementSpeedChange);
+ SubscribeLocalEvent(OnPowerCellChanged);
+ SubscribeLocalEvent(OnPowerCellEmpty);
+ SubscribeLocalEvent(OnRequiresPowerSealCompleteEvent);
+ SubscribeLocalEvent>(OnFindInventoryBatteryEvent);
+ }
+
+ private void OnPowerCellChanged(Entity entity, ref PowerCellChangedEvent args)
+ {
+ if (!entity.Comp.IsPowered && _powerCellSystem.HasDrawCharge(entity))
+ {
+ entity.Comp.IsPowered = true;
+ Dirty(entity);
+
+ ModifySpeed(entity);
+ }
+
+ UpdateClothingPowerAlert(entity);
+ }
+
+ private void OnPowerCellEmpty(Entity entity, ref PowerCellSlotEmptyEvent args)
+ {
+ entity.Comp.IsPowered = false;
+ Dirty(entity);
+
+ ModifySpeed(entity);
+ }
+
+ /// Enables or disables power cell draw on seal/unseal complete
+ private void OnRequiresPowerSealCompleteEvent(Entity entity, ref ClothingControlSealCompleteEvent args)
+ {
+ if (!TryComp(entity, out PowerCellDrawComponent? drawComp))
+ return;
+
+ _powerCellSystem.SetDrawEnabled((entity.Owner, drawComp), args.IsSealed);
+
+ UpdateClothingPowerAlert(entity);
+ ModifySpeed(entity);
+ }
+
+ private void OnMovementSpeedChange(Entity entity, ref InventoryRelayedEvent args)
+ {
+ if (!TryComp(entity, out SealableClothingControlComponent? controlComp))
+ return;
+
+ // If suit is unsealed - don't care about penalty
+ if (!controlComp.IsCurrentlySealed)
+ return;
+
+ if (!entity.Comp.IsPowered)
+ args.Args.ModifySpeed(entity.Comp.MovementSpeedPenalty);
+ }
+
+ private void ModifySpeed(EntityUid uid)
+ {
+ if (!TryComp(uid, out SealableClothingControlComponent? controlComp) || controlComp.WearerEntity == null)
+ return;
+
+ _movementSpeed.RefreshMovementSpeedModifiers(controlComp.WearerEntity.Value);
+ }
+
+ /// Sets power alert to wearer when clothing is sealed
+ private void UpdateClothingPowerAlert(Entity entity)
+ {
+ var (uid, comp) = entity;
+
+ if (!TryComp(uid, out var controlComp) || controlComp.WearerEntity == null)
+ return;
+
+ if (!_powerCellSystem.TryGetBatteryFromSlot(entity, out var battery) || !controlComp.IsCurrentlySealed)
+ {
+ _alertsSystem.ClearAlert(controlComp.WearerEntity.Value, comp.SuitPowerAlert);
+ return;
+ }
+
+ var severity = ContentHelpers.RoundToLevels(MathF.Max(0f, battery.CurrentCharge), battery.MaxCharge, 6);
+ _alertsSystem.ShowAlert(controlComp.WearerEntity.Value, comp.SuitPowerAlert, (short) severity);
+ }
+
+ /// Tries to find battery for charger
+ private void OnFindInventoryBatteryEvent(Entity entity, ref InventoryRelayedEvent args)
+ {
+ if (args.Args.FoundBattery != null)
+ return;
+
+ if (_powerCellSystem.TryGetBatteryFromSlot(entity, out var batteryEnt, out var battery))
+ args.Args.FoundBattery = (batteryEnt.Value, battery);
+ }
+}
diff --git a/Content.Server/_Goobstation/Clothing/Systems/SealableClothingSystem.cs b/Content.Server/_Goobstation/Clothing/Systems/SealableClothingSystem.cs
new file mode 100644
index 0000000000..09f0d9dbfc
--- /dev/null
+++ b/Content.Server/_Goobstation/Clothing/Systems/SealableClothingSystem.cs
@@ -0,0 +1,5 @@
+using Content.Shared._Goobstation.Clothing.Systems;
+
+namespace Content.Server._Goobstation.Clothing.Systems;
+
+public sealed partial class SealableClothingSystem : SharedSealableClothingSystem { }
diff --git a/Content.Shared/Actions/BaseActionComponent.cs b/Content.Shared/Actions/BaseActionComponent.cs
index 720900b784..481c4e8075 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/ConfirmableActionComponent.cs b/Content.Shared/Actions/ConfirmableActionComponent.cs
index 6c208f47c6..ca7a15eb5a 100644
--- a/Content.Shared/Actions/ConfirmableActionComponent.cs
+++ b/Content.Shared/Actions/ConfirmableActionComponent.cs
@@ -1,3 +1,4 @@
+using Content.Shared.Popups;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
@@ -15,8 +16,15 @@ public sealed partial class ConfirmableActionComponent : Component
///
/// Warning popup shown when priming the action.
///
- [DataField(required: true)]
- public LocId Popup = string.Empty;
+ // Goobstation - Modsuits - Removed required string
+ [DataField]
+ public LocId? Popup = null;
+
+ ///
+ /// Type of warning popup - Goobstaiton - Modsuits
+ ///
+ [DataField("popupType")]
+ public PopupType PopupFontType = PopupType.LargeCaution;
///
/// If not null, this is when the action can be confirmed at.
diff --git a/Content.Shared/Actions/ConfirmableActionSystem.cs b/Content.Shared/Actions/ConfirmableActionSystem.cs
index 26cc7111d2..8a567fa971 100644
--- a/Content.Shared/Actions/ConfirmableActionSystem.cs
+++ b/Content.Shared/Actions/ConfirmableActionSystem.cs
@@ -10,6 +10,7 @@ namespace Content.Shared.Actions;
public sealed class ConfirmableActionSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly SharedActionsSystem _actions = default!; // Goobstation
[Dependency] private readonly SharedPopupSystem _popup = default!;
public override void Initialize()
@@ -67,7 +68,12 @@ private void Prime(Entity ent, EntityUid user)
comp.NextUnprime = comp.NextConfirm + comp.PrimeTime;
Dirty(uid, comp);
- _popup.PopupClient(Loc.GetString(comp.Popup), user, user, PopupType.LargeCaution);
+ // Goobstation - Confirmable action with changed icon - Start
+ if (!string.IsNullOrEmpty(comp.Popup))
+ _popup.PopupClient(Loc.GetString(comp.Popup), user, user, comp.PopupFontType);
+
+ _actions.SetToggled(ent, true);
+ // Goobstation - Confirmable action with changed icon - End
}
private void Unprime(Entity ent)
@@ -75,6 +81,9 @@ private void Unprime(Entity ent)
var (uid, comp) = ent;
comp.NextConfirm = null;
comp.NextUnprime = null;
+
+ _actions.SetToggled(ent, false); // Goobstation - Confirmable action with changed icon
+
Dirty(uid, comp);
}
}
diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs
index 8cede391a8..3181635e41 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/Armor/ArmorComponent.cs b/Content.Shared/Armor/ArmorComponent.cs
index fd04c5d29c..06e4c48e87 100644
--- a/Content.Shared/Armor/ArmorComponent.cs
+++ b/Content.Shared/Armor/ArmorComponent.cs
@@ -1,5 +1,6 @@
using Content.Shared.Damage;
using Robust.Shared.GameStates;
+using Robust.Shared.Serialization;
using Robust.Shared.Utility;
namespace Content.Shared.Armor;
@@ -7,20 +8,20 @@ namespace Content.Shared.Armor;
///
/// Used for clothing that reduces damage when worn.
///
-[RegisterComponent, NetworkedComponent, Access(typeof(SharedArmorSystem))]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] // Goobstation - remove access restrictions
public sealed partial class ArmorComponent : Component
{
///
/// The damage reduction
///
- [DataField(required: true)]
+ [DataField(required: true), AutoNetworkedField]
public DamageModifierSet Modifiers = default!;
///
/// A multiplier applied to the calculated point value
/// to determine the monetary value of the armor
///
- [DataField]
+ [DataField, AutoNetworkedField]
public float PriceMultiplier = 1;
}
diff --git a/Content.Shared/CCVar/CCVars.Hud.cs b/Content.Shared/CCVar/CCVars.Hud.cs
index f1adbb1851..cf3a8e995f 100644
--- a/Content.Shared/CCVar/CCVars.Hud.cs
+++ b/Content.Shared/CCVar/CCVars.Hud.cs
@@ -24,4 +24,7 @@ public sealed partial class CCVars
public static readonly CVarDef HudFpsCounterVisible =
CVarDef.Create("hud.fps_counter_visible", false, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ public static readonly CVarDef ModernProgressBar =
+ CVarDef.Create("hud.modern_progress_bar", true, CVar.CLIENTONLY | CVar.ARCHIVE);
}
diff --git a/Content.Shared/Charges/Systems/SharedChargesSystem.cs b/Content.Shared/Charges/Systems/SharedChargesSystem.cs
index 7f95ef184e..ce47fee4f4 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 b98a337204..c79a362a9d 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/AttachedClothingComponent.cs b/Content.Shared/Clothing/Components/AttachedClothingComponent.cs
index c52c875952..fbe462ed42 100644
--- a/Content.Shared/Clothing/Components/AttachedClothingComponent.cs
+++ b/Content.Shared/Clothing/Components/AttachedClothingComponent.cs
@@ -1,4 +1,5 @@
using Content.Shared.Clothing.EntitySystems;
+using Robust.Shared.Containers;
using Robust.Shared.GameStates;
namespace Content.Shared.Clothing.Components;
@@ -13,9 +14,21 @@ namespace Content.Shared.Clothing.Components;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class AttachedClothingComponent : Component
{
+ // Goobstation - Modsuits changes this system entirely
+ public const string DefaultClothingContainerId = "replaced-clothing";
+
///
/// The Id of the piece of clothing that this entity belongs to.
///
[DataField, AutoNetworkedField]
public EntityUid AttachedUid;
+
+ ///
+ /// Container ID for clothing that will be replaced with this one
+ ///
+ [DataField, AutoNetworkedField]
+ public string ClothingContainerId = DefaultClothingContainerId;
+
+ [ViewVariables, NonSerialized]
+ public ContainerSlot? ClothingContainer;
}
diff --git a/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs b/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs
index c76214f131..304dd2a3e8 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/Components/ToggleableClothingComponent.cs b/Content.Shared/Clothing/Components/ToggleableClothingComponent.cs
index 3053efe89a..4e9dd91e38 100644
--- a/Content.Shared/Clothing/Components/ToggleableClothingComponent.cs
+++ b/Content.Shared/Clothing/Components/ToggleableClothingComponent.cs
@@ -3,7 +3,7 @@
using Robust.Shared.Containers;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+using Robust.Shared.Serialization;
namespace Content.Shared.Clothing.Components;
@@ -25,18 +25,31 @@ public sealed partial class ToggleableClothingComponent : Component
[DataField, AutoNetworkedField]
public EntityUid? ActionEntity;
+ // Goobstation - ClothingPrototype and Slot Fields saved for compatibility with old prototype
///
/// Default clothing entity prototype to spawn into the clothing container.
///
- [DataField(required: true), AutoNetworkedField]
- public EntProtoId ClothingPrototype = default!;
+ [DataField, AutoNetworkedField]
+ public EntProtoId? ClothingPrototype;
///
/// The inventory slot that the clothing is equipped to.
///
[ViewVariables(VVAccess.ReadWrite)]
[DataField, AutoNetworkedField]
- public string Slot = "head";
+ public string Slot = string.Empty;
+
+ ///
+ /// Dictionary of inventory slots and entity prototypes to spawn into the clothing container.
+ ///
+ [DataField, AutoNetworkedField]
+ public Dictionary ClothingPrototypes = new();
+
+ ///
+ /// Dictionary of clothing uids and slots
+ ///
+ [DataField, AutoNetworkedField]
+ public Dictionary ClothingUids = new();
///
/// The inventory slot flags required for this component to function.
@@ -51,14 +64,7 @@ public sealed partial class ToggleableClothingComponent : Component
public string ContainerId = DefaultClothingContainerId;
[ViewVariables]
- public ContainerSlot? Container;
-
- ///
- /// The Id of the piece of clothing that belongs to this component. Required for map-saving if the clothing is
- /// currently not inside of the container.
- ///
- [DataField, AutoNetworkedField]
- public EntityUid? ClothingUid;
+ public Container? Container;
///
/// Time it takes for this clothing to be toggled via the stripping menu verbs. Null prevents the verb from even showing up.
@@ -71,4 +77,39 @@ public sealed partial class ToggleableClothingComponent : Component
///
[DataField, AutoNetworkedField]
public string? VerbText;
+
+ ///
+ /// If true it will block unequip of this entity until all attached clothing are removed
+ ///
+ [DataField, AutoNetworkedField]
+ public bool BlockUnequipWhenAttached = false;
+
+ ///
+ /// If true all attached will replace already equipped clothing on equip attempt
+ ///
+ [DataField, AutoNetworkedField]
+ public bool ReplaceCurrentClothing = false;
+
+ [DataField, AutoNetworkedField]
+ public string AttachTooltip = "toggleable-clothing-attach-tooltip";
+
+ [DataField, AutoNetworkedField]
+ public string UnattachTooltip = "toggleable-clothing-unattach-tooltip";
+}
+
+[Serializable, NetSerializable]
+public enum ToggleClothingUiKey : byte
+{
+ Key
+}
+
+[Serializable, NetSerializable]
+public sealed class ToggleableClothingUiMessage : BoundUserInterfaceMessage
+{
+ public NetEntity AttachedClothingUid;
+
+ public ToggleableClothingUiMessage(NetEntity attachedClothingUid)
+ {
+ AttachedClothingUid = attachedClothingUid;
+ }
}
diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs
index 4cb127bb10..63f817f9bb 100644
--- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs
+++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs
@@ -13,9 +13,11 @@
using Robust.Shared.Serialization;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
+using System.Linq;
namespace Content.Shared.Clothing.EntitySystems;
+// GOOBSTATION - MODSUITS - THIS SYSTEM FULLY CHANGED
public sealed class ToggleableClothingSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
@@ -27,19 +29,22 @@ public sealed class ToggleableClothingSystem : EntitySystem
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly SharedStrippableSystem _strippable = default!;
- [Dependency] private readonly ThievingSystem _thieving = default!;
+ [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!;
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnInit);
+ SubscribeLocalEvent(OnToggleableInit);
SubscribeLocalEvent(OnMapInit);
- SubscribeLocalEvent(OnToggleClothing);
+ SubscribeLocalEvent(OnToggleClothingAction);
SubscribeLocalEvent(OnGetActions);
SubscribeLocalEvent(OnRemoveToggleable);
SubscribeLocalEvent(OnToggleableUnequip);
+ SubscribeLocalEvent(OnToggleClothingMessage);
+ SubscribeLocalEvent(OnToggleableUnequipAttempt);
+ SubscribeLocalEvent(OnAttachedInit);
SubscribeLocalEvent(OnInteractHand);
SubscribeLocalEvent(OnAttachedUnequip);
SubscribeLocalEvent(OnRemoveAttached);
@@ -51,62 +56,64 @@ public override void Initialize()
SubscribeLocalEvent(OnDoAfterComplete);
}
- private void GetRelayedVerbs(EntityUid uid, ToggleableClothingComponent component, InventoryRelayedEvent> args)
+ private void GetRelayedVerbs(Entity toggleable, ref InventoryRelayedEvent> args)
{
- OnGetVerbs(uid, component, args.Args);
+ OnGetVerbs(toggleable, ref args.Args);
}
- private void OnGetVerbs(EntityUid uid, ToggleableClothingComponent component, GetVerbsEvent args)
+ private void OnGetVerbs(Entity toggleable, ref GetVerbsEvent args)
{
- if (!args.CanAccess || !args.CanInteract || component.ClothingUid == null || component.Container == null)
+ var comp = toggleable.Comp;
+
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null || comp.ClothingUids.Count == 0 || comp.Container == null)
return;
- var text = component.VerbText ?? (component.ActionEntity == null ? null : Name(component.ActionEntity.Value));
+ var text = comp.VerbText ?? (comp.ActionEntity == null ? null : Name(comp.ActionEntity.Value));
if (text == null)
return;
- if (!_inventorySystem.InSlotWithFlags(uid, component.RequiredFlags))
+ if (!_inventorySystem.InSlotWithFlags(toggleable.Owner, comp.RequiredFlags))
return;
- var wearer = Transform(uid).ParentUid;
- if (args.User != wearer && component.StripDelay == null)
+ var wearer = Transform(toggleable).ParentUid;
+ if (args.User != wearer && comp.StripDelay == null)
return;
+ var user = args.User;
+
var verb = new EquipmentVerb()
{
Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")),
Text = Loc.GetString(text),
};
- if (args.User == wearer)
+ if (user == wearer)
{
- verb.EventTarget = uid;
- verb.ExecutionEventArgs = new ToggleClothingEvent() { Performer = args.User };
+ verb.Act = () => ToggleClothing(user, toggleable);
}
else
{
- verb.Act = () => StartDoAfter(args.User, uid, Transform(uid).ParentUid, component);
+ verb.Act = () => StartDoAfter(user, toggleable, wearer);
}
args.Verbs.Add(verb);
}
- private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, ToggleableClothingComponent component)
+ private void StartDoAfter(EntityUid user, Entity toggleable, EntityUid wearer)
{
- if (component.StripDelay == null)
+ var comp = toggleable.Comp;
+
+ if (comp.StripDelay == null)
return;
- var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, component.StripDelay.Value);
+ var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, comp.StripDelay.Value);
- bool hidden = (stealth == ThievingStealth.Hidden);
+ bool hidden = stealth == ThievingStealth.Hidden;
- var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), item, wearer, item)
+ var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), toggleable, wearer, toggleable)
{
BreakOnDamage = true,
BreakOnMove = true,
- // This should just re-use the BUI range checks & cancel the do after if the BUI closes. But that is all
- // server-side at the moment.
- // TODO BUI REFACTOR.
DistanceThreshold = 2,
};
@@ -114,189 +121,404 @@ private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, Togg
return;
if (!hidden)
- _strippable.StripPopup("strippable-component-alert-owner-interact", stealth, wearer, user: Identity.Entity(user, EntityManager), item: item);
+ {
+ var popup = Loc.GetString("strippable-component-alert-owner-interact", ("user", Identity.Entity(user, EntityManager)), ("item", toggleable));
+ _popupSystem.PopupEntity(popup, wearer, wearer, PopupType.Large);
+ }
}
- private void OnGetAttachedStripVerbsEvent(EntityUid uid, AttachedClothingComponent component, GetVerbsEvent args)
+ private void OnGetAttachedStripVerbsEvent(Entity attached, ref GetVerbsEvent args)
{
+ var comp = attached.Comp;
+
+ if (!TryComp(comp.AttachedUid, out var toggleableComp))
+ return;
+
// redirect to the attached entity.
- OnGetVerbs(component.AttachedUid, Comp(component.AttachedUid), args);
+ OnGetVerbs((comp.AttachedUid, toggleableComp), ref args);
}
- private void OnDoAfterComplete(EntityUid uid, ToggleableClothingComponent component, ToggleClothingDoAfterEvent args)
+ private void OnDoAfterComplete(Entity toggleable, ref ToggleClothingDoAfterEvent args)
{
if (args.Cancelled)
return;
- ToggleClothing(args.User, uid, component);
+ ToggleClothing(args.User, toggleable);
}
- private void OnInteractHand(EntityUid uid, AttachedClothingComponent component, InteractHandEvent args)
+ private void OnInteractHand(Entity attached, ref InteractHandEvent args)
{
+ var comp = attached.Comp;
+
if (args.Handled)
return;
- if (!TryComp(component.AttachedUid, out ToggleableClothingComponent? toggleCom)
- || toggleCom.Container == null)
+ if (!TryComp(comp.AttachedUid, out ToggleableClothingComponent? toggleableComp)
+ || toggleableComp.Container == null)
return;
- if (!_inventorySystem.TryUnequip(Transform(uid).ParentUid, toggleCom.Slot, force: true))
+ // Get slot from dictionary of uid-slot
+ if (!toggleableComp.ClothingUids.TryGetValue(attached.Owner, out var attachedSlot))
return;
- _containerSystem.Insert(uid, toggleCom.Container);
+ if (!_inventorySystem.TryUnequip(Transform(attached.Owner).ParentUid, attachedSlot, force: true))
+ return;
+
+ _containerSystem.Insert(attached.Owner, toggleableComp.Container);
args.Handled = true;
}
+ ///
+ /// Prevents from unequipping entity if all attached not unequipped
+ ///
+ private void OnToggleableUnequipAttempt(Entity toggleable, ref BeingUnequippedAttemptEvent args)
+ {
+ var comp = toggleable.Comp;
+
+ if (!comp.BlockUnequipWhenAttached)
+ return;
+
+ if (GetAttachedToggleStatus(toggleable) == ToggleableClothingAttachedStatus.NoneToggled)
+ return;
+
+ _popupSystem.PopupClient(Loc.GetString("toggleable-clothing-remove-all-attached-first"), args.Unequipee, args.Unequipee);
+
+ args.Cancel();
+ }
+
///
/// Called when the suit is unequipped, to ensure that the helmet also gets unequipped.
///
- private void OnToggleableUnequip(EntityUid uid, ToggleableClothingComponent component, GotUnequippedEvent args)
+ private void OnToggleableUnequip(Entity toggleable, ref GotUnequippedEvent args)
{
+ var comp = toggleable.Comp;
+
// If it's a part of PVS departure then don't handle it.
if (_timing.ApplyingState)
return;
- // If the attached clothing is not currently in the container, this just assumes that it is currently equipped.
- // This should maybe double check that the entity currently in the slot is actually the attached clothing, but
- // if its not, then something else has gone wrong already...
- if (component.Container != null && component.Container.ContainedEntity == null && component.ClothingUid != null)
- _inventorySystem.TryUnequip(args.Equipee, component.Slot, force: true);
+ // Check if container exists and we have linked clothings
+ if (comp.Container == null || comp.ClothingUids.Count == 0)
+ return;
+
+ var parts = comp.ClothingUids;
+
+ foreach (var part in parts)
+ {
+ // Check if entity in container what means it already unequipped
+ if (comp.Container.Contains(part.Key) || part.Value == null)
+ continue;
+
+ _inventorySystem.TryUnequip(args.Equipee, part.Value, force: true);
+ }
}
- private void OnRemoveToggleable(EntityUid uid, ToggleableClothingComponent component, ComponentRemove args)
+ private void OnRemoveToggleable(Entity toggleable, ref ComponentRemove args)
{
// If the parent/owner component of the attached clothing is being removed (entity getting deleted?) we will
// delete the attached entity. We do this regardless of whether or not the attached entity is currently
// "outside" of the container or not. This means that if a hardsuit takes too much damage, the helmet will also
// automatically be deleted.
- _actionsSystem.RemoveAction(component.ActionEntity);
+ var comp = toggleable.Comp;
+
+ _actionsSystem.RemoveAction(comp.ActionEntity);
+
+ if (comp.ClothingUids == null || _netMan.IsClient)
+ return;
- if (component.ClothingUid != null && !_netMan.IsClient)
- QueueDel(component.ClothingUid.Value);
+ foreach (var clothing in comp.ClothingUids.Keys)
+ QueueDel(clothing);
}
- private void OnAttachedUnequipAttempt(EntityUid uid, AttachedClothingComponent component, BeingUnequippedAttemptEvent args)
+ private void OnAttachedUnequipAttempt(Entity attached, ref BeingUnequippedAttemptEvent args)
{
args.Cancel();
}
- private void OnRemoveAttached(EntityUid uid, AttachedClothingComponent component, ComponentRemove args)
+ private void OnRemoveAttached(Entity attached, ref ComponentRemove args)
{
// if the attached component is being removed (maybe entity is being deleted?) we will just remove the
// toggleable clothing component. This means if you had a hard-suit helmet that took too much damage, you would
// still be left with a suit that was simply missing a helmet. There is currently no way to fix a partially
// broken suit like this.
- if (!TryComp(component.AttachedUid, out ToggleableClothingComponent? toggleComp))
+ var comp = attached.Comp;
+
+ if (!TryComp(comp.AttachedUid, out ToggleableClothingComponent? toggleableComp)
+ || toggleableComp.LifeStage > ComponentLifeStage.Running)
+ return;
+
+ var clothingUids = toggleableComp.ClothingUids;
+
+ if (!clothingUids.Remove(attached.Owner) || clothingUids.Count > 0)
return;
- if (toggleComp.LifeStage > ComponentLifeStage.Running)
+ // If no attached clothing left - remove component and action
+ if (clothingUids.Count > 0)
return;
- _actionsSystem.RemoveAction(toggleComp.ActionEntity);
- RemComp(component.AttachedUid, toggleComp);
+ _actionsSystem.RemoveAction(toggleableComp.ActionEntity);
+ RemComp(comp.AttachedUid, toggleableComp);
}
///
- /// Called if the helmet was unequipped, to ensure that it gets moved into the suit's container.
+ /// Called if the clothing was unequipped, to ensure that it gets moved into the suit's container.
///
- private void OnAttachedUnequip(EntityUid uid, AttachedClothingComponent component, GotUnequippedEvent args)
+ private void OnAttachedUnequip(Entity attached, ref GotUnequippedEvent args)
{
- // Let containers worry about it.
- if (_timing.ApplyingState)
- return;
-
- if (component.LifeStage > ComponentLifeStage.Running)
+ var comp = attached.Comp;
+
+ // Death told me to do this- if you need to figure out why each of these are here, idk, figure it out.
+ if (_timing.ApplyingState
+ || comp.LifeStage > ComponentLifeStage.Running
+ || !TryComp(comp.AttachedUid, out ToggleableClothingComponent? toggleableComp)
+ || toggleableComp.LifeStage > ComponentLifeStage.Running
+ || !toggleableComp.ClothingUids.ContainsKey(attached.Owner))
return;
- if (!TryComp(component.AttachedUid, out ToggleableClothingComponent? toggleComp))
- return;
+ if (toggleableComp.Container != null)
+ _containerSystem.Insert(attached.Owner, toggleableComp.Container);
+ }
- if (toggleComp.LifeStage > ComponentLifeStage.Running)
- return;
+ ///
+ /// Equip or unequip toggle clothing with ui message
+ ///
+ private void OnToggleClothingMessage(Entity toggleable, ref ToggleableClothingUiMessage args)
+ {
+ var attachedUid = GetEntity(args.AttachedClothingUid);
- // As unequipped gets called in the middle of container removal, we cannot call a container-insert without causing issues.
- // So we delay it and process it during a system update:
- if (toggleComp.ClothingUid != null && toggleComp.Container != null)
- _containerSystem.Insert(toggleComp.ClothingUid.Value, toggleComp.Container);
+ ToggleClothing(args.Actor, toggleable, attachedUid);
}
///
/// Equip or unequip the toggleable clothing.
///
- private void OnToggleClothing(EntityUid uid, ToggleableClothingComponent component, ToggleClothingEvent args)
+ private void OnToggleClothingAction(Entity toggleable, ref ToggleClothingEvent args)
{
+ var comp = toggleable.Comp;
+
if (args.Handled)
return;
+ if (comp.Container == null || comp.ClothingUids.Count == 0)
+ return;
+
args.Handled = true;
- ToggleClothing(args.Performer, uid, component);
+
+ // If clothing have only one attached clothing (like helmets) action will just toggle it
+ // If it have more attached clothings, it'll open radial menu
+ if (comp.ClothingUids.Count == 1)
+ ToggleClothing(args.Performer, toggleable, comp.ClothingUids.First().Key);
+ else
+ _uiSystem.OpenUi(toggleable.Owner, ToggleClothingUiKey.Key, args.Performer);
}
- private void ToggleClothing(EntityUid user, EntityUid target, ToggleableClothingComponent component)
+ ///
+ /// Toggle function for single clothing
+ ///
+ private void ToggleClothing(EntityUid user, Entity toggleable, EntityUid attachedUid)
{
- if (component.Container == null || component.ClothingUid == null)
+ var comp = toggleable.Comp;
+ var attachedClothings = comp.ClothingUids;
+ var container = comp.Container;
+
+ if (!CanToggleClothing(user, toggleable))
return;
- var parent = Transform(target).ParentUid;
- if (component.Container.ContainedEntity == null)
- _inventorySystem.TryUnequip(user, parent, component.Slot, force: true);
- else if (_inventorySystem.TryGetSlotEntity(parent, component.Slot, out var existing))
- {
- _popupSystem.PopupClient(Loc.GetString("toggleable-clothing-remove-first", ("entity", existing)),
- user, user);
- }
+ if (!attachedClothings.TryGetValue(attachedUid, out var slot) || string.IsNullOrEmpty(slot))
+ return;
+
+ if (!container!.Contains(attachedUid))
+ UnequipClothing(user, toggleable, attachedUid, slot!);
+ else
+ EquipClothing(user, toggleable, attachedUid, slot!);
+ }
+
+ ///
+ /// Toggle function for toggling multiple clothings at once
+ ///
+ private void ToggleClothing(EntityUid user, Entity toggleable)
+ {
+ var comp = toggleable.Comp;
+ var attachedClothings = comp.ClothingUids;
+ var container = comp.Container;
+
+ if (!CanToggleClothing(user, toggleable))
+ return;
+
+ if (GetAttachedToggleStatus(toggleable, comp) == ToggleableClothingAttachedStatus.NoneToggled)
+ foreach (var clothing in attachedClothings)
+ EquipClothing(user, toggleable, clothing.Key, clothing.Value);
else
- _inventorySystem.TryEquip(user, parent, component.ClothingUid.Value, component.Slot);
+ foreach (var clothing in attachedClothings)
+ if (!container!.Contains(clothing.Key))
+ UnequipClothing(user, toggleable, clothing.Key, clothing.Value);
}
- private void OnGetActions(EntityUid uid, ToggleableClothingComponent component, GetItemActionsEvent args)
+ private bool CanToggleClothing(EntityUid user, Entity toggleable)
{
- if (component.ClothingUid != null
- && component.ActionEntity != null
- && (args.SlotFlags & component.RequiredFlags) == component.RequiredFlags)
+ var comp = toggleable.Comp;
+ var attachedClothings = comp.ClothingUids;
+ var container = comp.Container;
+
+ if (container == null || attachedClothings.Count == 0)
+ return false;
+
+ var ev = new ToggleClothingAttemptEvent(user, toggleable);
+ RaiseLocalEvent(toggleable, ev);
+
+ return !ev.Cancelled;
+ }
+
+ private void UnequipClothing(EntityUid user, Entity toggleable, EntityUid clothing, string slot)
+ {
+ var parent = Transform(toggleable.Owner).ParentUid;
+
+ _inventorySystem.TryUnequip(user, parent, slot, force: true);
+
+ // If attached have clothing in container - equip it
+ if (!TryComp(clothing, out var attachedComp) || attachedComp.ClothingContainer == null)
+ return;
+
+ var storedClothing = attachedComp.ClothingContainer.ContainedEntity;
+
+ if (storedClothing != null)
+ _inventorySystem.TryEquip(parent, storedClothing.Value, slot, force: true);
+ }
+ private void EquipClothing(EntityUid user, Entity toggleable, EntityUid clothing, string slot)
+ {
+ var parent = Transform(toggleable.Owner).ParentUid;
+ var comp = toggleable.Comp;
+
+ if (_inventorySystem.TryGetSlotEntity(parent, slot, out var currentClothing))
{
- args.AddAction(component.ActionEntity.Value);
+ // Check if we need to replace current clothing
+ if (!TryComp(clothing, out var attachedComp) || !comp.ReplaceCurrentClothing)
+ {
+ _popupSystem.PopupClient(Loc.GetString("toggleable-clothing-remove-first", ("entity", currentClothing)), user, user);
+ return;
+ }
+
+ // Check if attached clothing have container or this container not empty
+ if (attachedComp.ClothingContainer == null || attachedComp.ClothingContainer.ContainedEntity != null)
+ return;
+
+ if (_inventorySystem.TryUnequip(user, parent, slot))
+ _containerSystem.Insert(currentClothing.Value, attachedComp.ClothingContainer);
}
+
+ _inventorySystem.TryEquip(user, parent, clothing, slot);
}
- private void OnInit(EntityUid uid, ToggleableClothingComponent component, ComponentInit args)
+ private void OnGetActions(Entity toggleable, ref GetItemActionsEvent args)
{
- component.Container = _containerSystem.EnsureContainer(uid, component.ContainerId);
+ var comp = toggleable.Comp;
+
+ if (comp.ClothingUids.Count == 0 || comp.ActionEntity == null || args.SlotFlags != comp.RequiredFlags)
+ return;
+
+ args.AddAction(comp.ActionEntity.Value);
+ }
+
+ private void OnToggleableInit(Entity toggleable, ref ComponentInit args)
+ {
+ var comp = toggleable.Comp;
+
+ comp.Container = _containerSystem.EnsureContainer(toggleable, comp.ContainerId);
+ }
+
+ private void OnAttachedInit(Entity attached, ref ComponentInit args)
+ {
+ var comp = attached.Comp;
+
+ comp.ClothingContainer = _containerSystem.EnsureContainer(attached, comp.ClothingContainerId);
}
///
/// On map init, either spawn the appropriate entity into the suit slot, or if it already exists, perform some
/// sanity checks. Also updates the action icon to show the toggled-entity.
///
- private void OnMapInit(EntityUid uid, ToggleableClothingComponent component, MapInitEvent args)
+ private void OnMapInit(Entity toggleable, ref MapInitEvent args)
{
- if (component.Container!.ContainedEntity is {} ent)
+ var comp = toggleable.Comp;
+
+ if (comp.Container!.Count != 0)
{
- DebugTools.Assert(component.ClothingUid == ent, "Unexpected entity present inside of a toggleable clothing container.");
+ DebugTools.Assert(comp.ClothingUids.Count != 0, "Unexpected entity present inside of a toggleable clothing container.");
return;
}
- if (component.ClothingUid != null && component.ActionEntity != null)
+ if (comp.ClothingUids.Count != 0 && comp.ActionEntity != null)
+ return;
+
+ // Add prototype from ClothingPrototype and Slot field to ClothingPrototypes dictionary
+ if (comp.ClothingPrototype != null && !string.IsNullOrEmpty(comp.Slot) && !comp.ClothingPrototypes.ContainsKey(comp.Slot))
{
- DebugTools.Assert(Exists(component.ClothingUid), "Toggleable clothing is missing expected entity.");
- DebugTools.Assert(TryComp(component.ClothingUid, out AttachedClothingComponent? comp), "Toggleable clothing is missing an attached component");
- DebugTools.Assert(comp?.AttachedUid == uid, "Toggleable clothing uid mismatch");
+ comp.ClothingPrototypes.Add(comp.Slot, comp.ClothingPrototype.Value);
}
- else
+
+ var xform = Transform(toggleable.Owner);
+
+ if (comp.ClothingPrototypes == null)
+ return;
+
+ var prototypes = comp.ClothingPrototypes;
+
+ foreach (var prototype in prototypes)
{
- var xform = Transform(uid);
- component.ClothingUid = Spawn(component.ClothingPrototype, xform.Coordinates);
- var attachedClothing = EnsureComp(component.ClothingUid.Value);
- attachedClothing.AttachedUid = uid;
- Dirty(component.ClothingUid.Value, attachedClothing);
- _containerSystem.Insert(component.ClothingUid.Value, component.Container, containerXform: xform);
- Dirty(uid, component);
+ var spawned = Spawn(prototype.Value, xform.Coordinates);
+ var attachedClothing = EnsureComp(spawned);
+ attachedClothing.AttachedUid = toggleable;
+ EnsureComp(spawned);
+
+ comp.ClothingUids.Add(spawned, prototype.Key);
+ _containerSystem.Insert(spawned, comp.Container, containerXform: xform);
+
+ Dirty(spawned, attachedClothing);
}
- if (_actionContainer.EnsureAction(uid, ref component.ActionEntity, out var action, component.Action))
- _actionsSystem.SetEntityIcon(component.ActionEntity.Value, component.ClothingUid, action);
+ Dirty(toggleable, comp);
+
+ if (_actionContainer.EnsureAction(toggleable, ref comp.ActionEntity, out var action, comp.Action))
+ _actionsSystem.SetEntityIcon(comp.ActionEntity.Value, toggleable, action);
+ }
+
+ // Checks status of all attached clothings toggle status
+ public ToggleableClothingAttachedStatus GetAttachedToggleStatus(EntityUid toggleable, ToggleableClothingComponent? component = null)
+ {
+ if (!Resolve(toggleable, ref component))
+ return ToggleableClothingAttachedStatus.NoneToggled;
+
+ var container = component.Container;
+ var attachedClothings = component.ClothingUids;
+
+ // If entity don't have any attached clothings it means none toggled
+ if (container == null || attachedClothings.Count == 0)
+ return ToggleableClothingAttachedStatus.NoneToggled;
+
+ var toggledCount = attachedClothings.Count(c => !container.Contains(c.Key));
+
+ if (toggledCount == 0)
+ return ToggleableClothingAttachedStatus.NoneToggled;
+
+ if (toggledCount < attachedClothings.Count)
+ return ToggleableClothingAttachedStatus.PartlyToggled;
+
+ return ToggleableClothingAttachedStatus.AllToggled;
+ }
+
+ public List? GetAttachedClothingsList(EntityUid toggleable, ToggleableClothingComponent? component = null)
+ {
+ if (!Resolve(toggleable, ref component) || component.ClothingUids.Count == 0)
+ return null;
+
+ var newList = new List();
+
+ foreach (var attachee in component.ClothingUids)
+ newList.Add(attachee.Key);
+
+ return newList;
}
}
@@ -308,3 +530,29 @@ public sealed partial class ToggleClothingEvent : InstantActionEvent
public sealed partial class ToggleClothingDoAfterEvent : SimpleDoAfterEvent
{
}
+
+///
+/// Event raises on toggleable clothing when someone trying to toggle it
+///
+public sealed class ToggleClothingAttemptEvent : CancellableEntityEventArgs
+{
+ public EntityUid User { get; }
+ public EntityUid Target { get; }
+
+ public ToggleClothingAttemptEvent(EntityUid user, EntityUid target)
+ {
+ User = user;
+ Target = target;
+ }
+}
+
+///
+/// Status of toggleable clothing attachee
+///
+[Serializable, NetSerializable]
+public enum ToggleableClothingAttachedStatus : byte
+{
+ NoneToggled,
+ PartlyToggled,
+ AllToggled
+}
diff --git a/Content.Shared/Clothing/Loadouts/Systems/SharedLoadoutSystem.cs b/Content.Shared/Clothing/Loadouts/Systems/SharedLoadoutSystem.cs
index 67aabbd1ed..12466dcf89 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/Content.Shared.csproj b/Content.Shared/Content.Shared.csproj
index 4cca399b28..c7f779f1c2 100644
--- a/Content.Shared/Content.Shared.csproj
+++ b/Content.Shared/Content.Shared.csproj
@@ -10,6 +10,7 @@
+
diff --git a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs
index 586fc139a0..533975f740 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/DoAfter/DoAfterArgs.cs b/Content.Shared/DoAfter/DoAfterArgs.cs
index d88f72c965..97d9e42d74 100644
--- a/Content.Shared/DoAfter/DoAfterArgs.cs
+++ b/Content.Shared/DoAfter/DoAfterArgs.cs
@@ -19,14 +19,14 @@ public sealed partial class DoAfterArgs
///
/// How long does the do_after require to complete
///
- [DataField("delay", required: true)]
+ [DataField(required: true)]
public TimeSpan Delay;
///
/// Applicable target (if relevant)
///
[NonSerialized]
- [DataField("target")]
+ [DataField]
public EntityUid? Target;
public NetEntity? NetTarget;
@@ -40,17 +40,28 @@ public sealed partial class DoAfterArgs
public NetEntity? NetUsed;
+ // Goobstation - Show doAfter progress bar to another entity
+ [NonSerialized]
+ [DataField]
+ public EntityUid? ShowTo;
+
+ public NetEntity? NetShowTo;
+
///
/// Whether the progress bar for this DoAfter should be hidden from other players.
///
[DataField]
public bool Hidden;
+ /// Whether the delay multiplier event should be raised
+ [DataField]
+ public bool MultiplyDelay = true;
+
#region Event options
///
/// The event that will get raised when the DoAfter has finished. If null, this will simply raise a
///
- [DataField("event", required: true)]
+ [DataField(required: true)]
public DoAfterEvent Event = default!;
///
@@ -64,7 +75,7 @@ public sealed partial class DoAfterArgs
/// Entity which will receive the directed event. If null, no directed event will be raised.
///
[NonSerialized]
- [DataField("eventTarget")]
+ [DataField]
public EntityUid? EventTarget;
public NetEntity? NetEventTarget;
@@ -72,7 +83,7 @@ public sealed partial class DoAfterArgs
///
/// Should the DoAfter event broadcast? If this is false, then should be a valid entity.
///
- [DataField("broadcast")]
+ [DataField]
public bool Broadcast;
#endregion
@@ -81,16 +92,24 @@ public sealed partial class DoAfterArgs
///
/// Whether or not this do after requires the user to have hands.
///
- [DataField("needHand")]
+ [DataField]
public bool NeedHand;
///
/// Whether we need to keep our active hand as is (i.e. can't change hand or change item). This also covers
/// requiring the hand to be free (if applicable). This does nothing if is false.
///
- [DataField("breakOnHandChange")]
+ [DataField]
public bool BreakOnHandChange = true;
+ ///
+ /// Whether the do-after should get interrupted if we drop the
+ /// active item we started the do-after with
+ /// This does nothing if is false.
+ ///
+ [DataField]
+ public bool BreakOnDropItem = true;
+
///
/// If do_after stops when the user or target moves
///
@@ -107,31 +126,31 @@ public sealed partial class DoAfterArgs
///
/// Threshold for user and target movement
///
- [DataField("movementThreshold")]
+ [DataField]
public float MovementThreshold = 0.3f;
///
/// Threshold for distance user from the used OR target entities.
///
- [DataField("distanceThreshold")]
+ [DataField]
public float? DistanceThreshold;
///
/// Whether damage will cancel the DoAfter. See also .
///
- [DataField("breakOnDamage")]
+ [DataField]
public bool BreakOnDamage;
///
/// Threshold for user damage. This damage has to be dealt in a single event, not over time.
///
- [DataField("damageThreshold")]
+ [DataField]
public FixedPoint2 DamageThreshold = 1;
///
/// If true, this DoAfter will be canceled if the user can no longer interact with the target.
///
- [DataField("requireCanInteract")]
+ [DataField]
public bool RequireCanInteract = true;
#endregion
@@ -143,7 +162,7 @@ public sealed partial class DoAfterArgs
/// Note that this will block even if the duplicate is cancelled because either DoAfter had
/// enabled.
///
- [DataField("blockDuplicate")]
+ [DataField]
public bool BlockDuplicate = true;
//TODO: User pref to not cancel on second use on specific doafters
@@ -151,7 +170,7 @@ public sealed partial class DoAfterArgs
/// If true, this will cancel any duplicate DoAfters when attempting to add a new DoAfter. See also
/// .
///
- [DataField("cancelDuplicate")]
+ [DataField]
public bool CancelDuplicate = true;
///
@@ -162,7 +181,7 @@ public sealed partial class DoAfterArgs
/// Note that both DoAfters may have their own conditions, and they will be considered duplicated if either set
/// of conditions is satisfied.
///
- [DataField("duplicateCondition")]
+ [DataField]
public DuplicateConditions DuplicateCondition = DuplicateConditions.All;
#endregion
@@ -184,6 +203,7 @@ public sealed partial class DoAfterArgs
/// The entity at which the event will be directed. If null, the event will not be directed.
/// The entity being targeted by the DoAFter. Not the same as .
/// The entity being used during the DoAfter. E.g., a tool
+ /// Goobstation - The entity that should see doafter progress bar except doAfter entity
public DoAfterArgs(
IEntityManager entManager,
EntityUid user,
@@ -191,7 +211,8 @@ public DoAfterArgs(
DoAfterEvent @event,
EntityUid? eventTarget,
EntityUid? target = null,
- EntityUid? used = null)
+ EntityUid? used = null,
+ EntityUid? showTo = null) // Goobstation - Show doAfter popup to another entity
{
User = user;
Delay = delay;
@@ -199,18 +220,12 @@ public DoAfterArgs(
Used = used;
EventTarget = eventTarget;
Event = @event;
+ ShowTo = showTo; // Goobstation
NetUser = entManager.GetNetEntity(User);
NetTarget = entManager.GetNetEntity(Target);
NetUsed = entManager.GetNetEntity(Used);
- }
-
- ///
- /// An empty do-after constructor. This WILL cause runtime errors if used to create a do-after. Only use this if you really know what you're doing!
- ///
- [Obsolete("Use the other constructors if possible.")]
- public DoAfterArgs()
- {
+ NetShowTo = entManager.GetNetEntity(ShowTo); // Goobstation - Show doAfter popup to another entity
}
///
@@ -248,6 +263,7 @@ public DoAfterArgs(DoAfterArgs other)
Broadcast = other.Broadcast;
NeedHand = other.NeedHand;
BreakOnHandChange = other.BreakOnHandChange;
+ BreakOnDropItem = other.BreakOnDropItem;
BreakOnMove = other.BreakOnMove;
BreakOnWeightlessMove = other.BreakOnWeightlessMove;
MovementThreshold = other.MovementThreshold;
@@ -259,12 +275,16 @@ public DoAfterArgs(DoAfterArgs other)
BlockDuplicate = other.BlockDuplicate;
CancelDuplicate = other.CancelDuplicate;
DuplicateCondition = other.DuplicateCondition;
+ ShowTo = other.ShowTo; // Goobstation - Show doAfter popup to another entity
+
+ MultiplyDelay = other.MultiplyDelay; // Goobstation
// Networked
NetUser = other.NetUser;
NetTarget = other.NetTarget;
NetUsed = other.NetUsed;
NetEventTarget = other.NetEventTarget;
+ NetShowTo = other.NetShowTo; // Goobstation - Show doAfter popup to another entity
Event = other.Event.Clone();
}
diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.cs
index ed8be1ad65..48051e0a30 100644
--- a/Content.Shared/DoAfter/SharedDoAfterSystem.cs
+++ b/Content.Shared/DoAfter/SharedDoAfterSystem.cs
@@ -130,6 +130,7 @@ private void OnDoAfterHandleState(EntityUid uid, DoAfterComponent comp, ref Comp
doAfterArgs.Used = EnsureEntity(doAfterArgs.NetUsed, uid);
doAfterArgs.User = EnsureEntity(doAfterArgs.NetUser, uid);
doAfterArgs.EventTarget = EnsureEntity(doAfterArgs.NetEventTarget, uid);
+ doAfterArgs.ShowTo = EnsureEntity(doAfterArgs.NetShowTo, uid); // Goobstation - Show doAfter popup to another entity
}
comp.NextId = state.NextId;
diff --git a/Content.Shared/Effects/ColorFlashEffectEvent.cs b/Content.Shared/Effects/ColorFlashEffectEvent.cs
index 06043d3c00..0a4e2c1812 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 e1d5735550..3b5940b677 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/HumanoidCharacterAppearance.cs b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs
index 8c1ecf833c..86b7d3b44c 100644
--- a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs
+++ b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs
@@ -1,4 +1,4 @@
-using System.Linq;
+using System.Linq;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Humanoid.Prototypes;
using Robust.Shared.Prototypes;
@@ -106,6 +106,7 @@ public static HumanoidCharacterAppearance DefaultWithSpecies(string species)
HumanoidSkinColor.Hues => speciesPrototype.DefaultSkinTone,
HumanoidSkinColor.TintedHues => Humanoid.SkinColor.TintedHues(speciesPrototype.DefaultSkinTone),
HumanoidSkinColor.VoxFeathers => Humanoid.SkinColor.ClosestVoxColor(speciesPrototype.DefaultSkinTone),
+ HumanoidSkinColor.AnimalFur => Humanoid.SkinColor.ClosestAnimalFurColor(speciesPrototype.DefaultSkinTone), // Einstein Engines - Tajaran
HumanoidSkinColor.TintedHuesSkin => Humanoid.SkinColor.TintedHuesSkin(speciesPrototype.DefaultSkinTone, speciesPrototype.DefaultSkinTone),
_ => Humanoid.SkinColor.ValidHumanSkinTone,
};
@@ -176,6 +177,9 @@ public static HumanoidCharacterAppearance Random(string species, Sex sex)
case HumanoidSkinColor.VoxFeathers:
newSkinColor = Humanoid.SkinColor.ProportionalVoxColor(newSkinColor);
break;
+ case HumanoidSkinColor.AnimalFur: // Einstein Engines - Tajaran
+ newSkinColor = Humanoid.SkinColor.ProportionalAnimalFurColor(newSkinColor);
+ break;
}
return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ());
diff --git a/Content.Shared/Humanoid/HumanoidVisualLayers.cs b/Content.Shared/Humanoid/HumanoidVisualLayers.cs
index bda75c12c2..2a2e67e922 100644
--- a/Content.Shared/Humanoid/HumanoidVisualLayers.cs
+++ b/Content.Shared/Humanoid/HumanoidVisualLayers.cs
@@ -1,4 +1,4 @@
-using Content.Shared.Humanoid.Markings;
+using Content.Shared.Humanoid.Markings;
using Robust.Shared.Serialization;
namespace Content.Shared.Humanoid
@@ -8,6 +8,7 @@ public enum HumanoidVisualLayers : byte
{
Face,
Tail,
+ Wings,
Hair,
FacialHair,
Chest,
diff --git a/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs b/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs
index 17912e400a..de5509f932 100644
--- a/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs
+++ b/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs
@@ -73,6 +73,7 @@ public static IEnumerable Sublayers(HumanoidVisualLayers l
break;
case HumanoidVisualLayers.Chest:
yield return HumanoidVisualLayers.Chest;
+ yield return HumanoidVisualLayers.Wings;
yield return HumanoidVisualLayers.Tail;
break;
default:
diff --git a/Content.Shared/Humanoid/Markings/MarkingCategories.cs b/Content.Shared/Humanoid/Markings/MarkingCategories.cs
index 77e1ebb305..3bddcb8522 100644
--- a/Content.Shared/Humanoid/Markings/MarkingCategories.cs
+++ b/Content.Shared/Humanoid/Markings/MarkingCategories.cs
@@ -21,6 +21,7 @@ public enum MarkingCategories : byte
RightFoot,
LeftLeg,
LeftFoot,
+ Wings,
Tail,
Overlay
}
@@ -47,6 +48,7 @@ public static MarkingCategories FromHumanoidVisualLayers(HumanoidVisualLayers la
HumanoidVisualLayers.RLeg => MarkingCategories.RightLeg,
HumanoidVisualLayers.LFoot => MarkingCategories.LeftFoot,
HumanoidVisualLayers.RFoot => MarkingCategories.RightFoot,
+ HumanoidVisualLayers.Wings => MarkingCategories.Wings,
HumanoidVisualLayers.Tail => MarkingCategories.Tail,
_ => MarkingCategories.Overlay
};
diff --git a/Content.Shared/Humanoid/NamingSystem.Roman.cs b/Content.Shared/Humanoid/NamingSystem.Roman.cs
new file mode 100644
index 0000000000..2c254fff90
--- /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 4800292598..6b40af22e1 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!;
@@ -46,6 +46,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 76fb6e6cd6..eccfad43fc 100644
--- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs
+++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs
@@ -193,4 +193,5 @@ public enum SpeciesNaming : byte
TheFirstofLast,
FirstDashLast,
LastFirst, // DeltaV
+ FirstRoman,
}
diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs
index 64ad82ac98..023f80bfe1 100644
--- a/Content.Shared/Humanoid/SkinColor.cs
+++ b/Content.Shared/Humanoid/SkinColor.cs
@@ -17,6 +17,14 @@ public static class SkinColor
public const float MinFeathersValue = 36f / 100;
public const float MaxFeathersValue = 55f / 100;
+ // Einstein Engines - Tajaran
+ public const float MinAnimalFurHue = 20f / 360;
+ public const float MaxAnimalFurHue = 60f / 360;
+ public const float MinAnimalFurSaturation = 0f / 100;
+ public const float MaxAnimalFurSaturation = 100f / 100;
+ public const float MinAnimalFurValue = 0f / 100;
+ public const float MaxAnimalFurValue = 100f / 100;
+
public static Color ValidHumanSkinTone => Color.FromHsv(new Vector4(0.07f, 0.2f, 1f, 1f));
///
@@ -223,6 +231,60 @@ public static bool VerifyVoxFeathers(Color color)
return true;
}
+ ///
+ /// Converts a Color proportionally to the allowed animal fur color range.
+ /// Will NOT preserve the specific input color even if it is within the allowed animal fur color range.
+ ///
+ /// Color to convert
+ /// Vox feather coloration
+ public static Color ProportionalAnimalFurColor(Color color)
+ {
+ var newColor = Color.ToHsv(color);
+
+ newColor.X = newColor.X * (MaxAnimalFurHue - MinAnimalFurHue) + MinAnimalFurHue;
+ newColor.Y = newColor.Y * (MaxAnimalFurSaturation - MinAnimalFurSaturation) + MinAnimalFurSaturation;
+ newColor.Z = newColor.Z * (MaxAnimalFurValue - MinAnimalFurValue) + MinAnimalFurValue;
+
+ return Color.FromHsv(newColor);
+ }
+
+ // ///
+ // /// Ensures the input Color is within the allowed animal fur color range.
+ // ///
+ // /// Color to convert
+ // /// The same Color if it was within the allowed range, or the closest matching Color otherwise
+ public static Color ClosestAnimalFurColor(Color color)
+ {
+ var hsv = Color.ToHsv(color);
+
+ hsv.X = Math.Clamp(hsv.X, MinAnimalFurHue, MaxAnimalFurHue);
+ hsv.Y = Math.Clamp(hsv.Y, MinAnimalFurSaturation, MaxAnimalFurSaturation);
+ hsv.Z = Math.Clamp(hsv.Z, MinAnimalFurValue, MaxAnimalFurValue);
+
+ return Color.FromHsv(hsv);
+ }
+
+ ///
+ /// Verify if this color is a valid animal fur coloration, or not.
+ ///
+ /// The color to verify
+ /// True if valid, false otherwise
+ public static bool VerifyAnimalFur(Color color)
+ {
+ var colorHsv = Color.ToHsv(color);
+
+ if (colorHsv.X < MinAnimalFurHue || colorHsv.X > MaxAnimalFurHue)
+ return false;
+
+ if (colorHsv.Y < MinAnimalFurSaturation || colorHsv.Y > MaxAnimalFurSaturation)
+ return false;
+
+ if (colorHsv.Z < MinAnimalFurValue || colorHsv.Z > MaxAnimalFurValue)
+ return false;
+
+ return true;
+ }
+
///
/// This takes in a color, and returns a color guaranteed to be above MinHuesLightness
///
@@ -254,6 +316,7 @@ public static bool VerifySkinColor(HumanoidSkinColor type, Color color)
HumanoidSkinColor.TintedHuesSkin => true, // DeltaV - Tone blending
HumanoidSkinColor.Hues => VerifyHues(color),
HumanoidSkinColor.VoxFeathers => VerifyVoxFeathers(color),
+ HumanoidSkinColor.AnimalFur => VerifyAnimalFur(color), // Einsetin Engines - Tajaran
_ => false,
};
}
@@ -267,6 +330,7 @@ public static Color ValidSkinTone(HumanoidSkinColor type, Color color)
HumanoidSkinColor.TintedHuesSkin => ValidTintedHuesSkinTone(color), // DeltaV - Tone blending
HumanoidSkinColor.Hues => MakeHueValid(color),
HumanoidSkinColor.VoxFeathers => ClosestVoxColor(color),
+ HumanoidSkinColor.AnimalFur => ClosestAnimalFurColor(color), // Einsetin Engines - Tajaran
_ => color
};
}
@@ -279,4 +343,5 @@ public enum HumanoidSkinColor : byte
VoxFeathers, // Vox feathers are limited to a specific color range
TintedHues, //This gives a color tint to a humanoid's skin (10% saturation with full hue range).
TintedHuesSkin, // DeltaV - Default TintedHues assumes the texture will have the proper skin color, but moths dont
+ AnimalFur, // Einstein Engines - limits coloration to more or less what earthen animals might have
}
diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs
index 2b554651f1..2a5ea1e0c5 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/InventorySystem.Helpers.cs b/Content.Shared/Inventory/InventorySystem.Helpers.cs
index 7e325abe21..8bb4cf8897 100644
--- a/Content.Shared/Inventory/InventorySystem.Helpers.cs
+++ b/Content.Shared/Inventory/InventorySystem.Helpers.cs
@@ -139,4 +139,17 @@ public void SpawnItemOnEntity(EntityUid entity, EntProtoId item)
//Try insert into hands, or drop on the floor
_handsSystem.PickupOrDrop(entity, itemToSpawn, false);
}
+
+ // Goobstation
+ public bool TryGetContainingEntity(Entity entity, [NotNullWhen(true)] out EntityUid? containingEntity)
+ {
+ if (!_containerSystem.TryGetContainingContainer(entity, out var container) || !HasComp(container.Owner))
+ {
+ containingEntity = null;
+ return false;
+ }
+
+ containingEntity = container.Owner;
+ return true;
+ }
}
diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs
index ccda898df9..dfeeea1c25 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/Item/ItemToggle/ComponentTogglerSystem.cs b/Content.Shared/Item/ItemToggle/ComponentTogglerSystem.cs
index 760cefe27d..f483b8a2ee 100644
--- a/Content.Shared/Item/ItemToggle/ComponentTogglerSystem.cs
+++ b/Content.Shared/Item/ItemToggle/ComponentTogglerSystem.cs
@@ -16,11 +16,20 @@ public override void Initialize()
private void OnToggled(Entity ent, ref ItemToggledEvent args)
{
- var target = ent.Comp.Parent ? Transform(ent).ParentUid : ent.Owner;
+ ToggleComponent(ent, args.Activated);
+ }
+
+ // Goobstation - Make this system more flexible
+ public void ToggleComponent(EntityUid uid, bool activate)
+ {
+ if (!TryComp(uid, out var component))
+ return;
+
+ var target = component.Parent ? Transform(uid).ParentUid : uid;
- if (args.Activated)
- EntityManager.AddComponents(target, ent.Comp.Components);
+ if (activate)
+ EntityManager.AddComponents(target, component.Components);
else
- EntityManager.RemoveComponents(target, ent.Comp.RemoveComponents ?? ent.Comp.Components);
+ EntityManager.RemoveComponents(target, component.RemoveComponents ?? component.Components);
}
}
diff --git a/Content.Shared/Mind/Components/MindContainerComponent.cs b/Content.Shared/Mind/Components/MindContainerComponent.cs
index 62b26cbd35..be6ad6b125 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 91a7ce19ce..b94e64b505 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>();
@@ -145,6 +154,25 @@ public sealed partial class JobPrototype : IPrototype
public bool CanBeAntagTarget = true; // Floofstation Edit
}
+ ///
+ /// 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 7e47b9a74c..20b4aa9277 100644
--- a/Content.Shared/Roles/StartingGearPrototype.cs
+++ b/Content.Shared/Roles/StartingGearPrototype.cs
@@ -1,4 +1,5 @@
using System.Linq;
+using Content.Shared.Customization.Systems;
using Content.Shared.Preferences;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array;
@@ -9,6 +10,7 @@ namespace Content.Shared.Roles;
public sealed partial class StartingGearPrototype : IPrototype, IInheritingPrototype
{
[DataField]
+ [AlwaysPushInheritance]
public Dictionary Equipment = new();
///
@@ -24,14 +26,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;
@@ -42,6 +62,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 0000000000..ef60622f32
--- /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 0000000000..30cea16e57
--- /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 0000000000..2aee19202a
--- /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/Species/Components/ReformComponent.cs b/Content.Shared/Species/Components/ReformComponent.cs
index 724c9dc330..23afce58ec 100644
--- a/Content.Shared/Species/Components/ReformComponent.cs
+++ b/Content.Shared/Species/Components/ReformComponent.cs
@@ -1,3 +1,4 @@
+ using Content.Shared.Humanoid;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.GameStates;
@@ -13,7 +14,7 @@ public sealed partial class ReformComponent : Component
[DataField(required: true)]
public EntProtoId ActionPrototype = default!;
- [DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public EntityUid? ActionEntity;
///
@@ -45,4 +46,10 @@ public sealed partial class ReformComponent : Component
///
[DataField(required: true)]
public EntProtoId ReformPrototype { get; private set; }
+
+ ///
+ /// The humanoid appearance that the Diona reform will take on.
+ ///
+ [DataField]
+ public HumanoidAppearanceComponent Appearance;
}
diff --git a/Content.Shared/Species/Systems/ReformSystem.cs b/Content.Shared/Species/Systems/ReformSystem.cs
index d2ceecf28e..d5ba263bc2 100644
--- a/Content.Shared/Species/Systems/ReformSystem.cs
+++ b/Content.Shared/Species/Systems/ReformSystem.cs
@@ -1,6 +1,7 @@
using Content.Shared.Species.Components;
using Content.Shared.Actions;
using Content.Shared.DoAfter;
+using Content.Shared.Humanoid;
using Content.Shared.Popups;
using Content.Shared.Stunnable;
using Content.Shared.Mind;
@@ -22,6 +23,7 @@ public sealed partial class ReformSystem : EntitySystem
[Dependency] private readonly SharedStunSystem _stunSystem = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly SharedMindSystem _mindSystem = default!;
+ [Dependency] private readonly IEntityManager _ent = default!;
public override void Initialize()
{
@@ -44,6 +46,9 @@ private void OnMapInit(EntityUid uid, ReformComponent comp, MapInitEvent args)
_actionsSystem.AddAction(uid, ref comp.ActionEntity, out var reformAction, comp.ActionPrototype);
+ if (TryComp(uid, out var appearance))
+ comp.Appearance = appearance;
+
// See if the action should start with a delay, and give it that starting delay if so.
if (comp.StartDelayed && reformAction != null && reformAction.UseDelay != null)
{
@@ -90,7 +95,31 @@ private void OnDoAfter(EntityUid uid, ReformComponent comp, ReformDoAfterEvent a
// Spawn a new entity
// This is, to an extent, taken from polymorph. I don't use polymorph for various reasons- most notably that this is permanent.
+ var appearance = comp.Appearance;
var child = Spawn(comp.ReformPrototype, Transform(uid).Coordinates);
+ var childAppearance = EnsureComp(child);
+ childAppearance.Species = appearance.Species;
+ childAppearance.Age = appearance.Age;
+ childAppearance.Height = appearance.Height;
+ childAppearance.DisplayPronouns = appearance.DisplayPronouns;
+ childAppearance.Width = appearance.Width;
+ childAppearance.Height = appearance.Height;
+ childAppearance.Gender = appearance.Gender;
+ childAppearance.CyborgName = appearance.CyborgName;
+ childAppearance.StationAiName = appearance.StationAiName;
+ childAppearance.DisplayPronouns = appearance.DisplayPronouns;
+ childAppearance.BaseLayers = appearance.BaseLayers;
+ childAppearance.HiddenLayers = appearance.HiddenLayers;
+ childAppearance.EyeColor = appearance.EyeColor;
+ childAppearance.CachedFacialHairColor = appearance.CachedFacialHairColor;
+ childAppearance.MarkingSet = appearance.MarkingSet;
+ childAppearance.PermanentlyHidden = appearance.PermanentlyHidden;
+ childAppearance.ClientOldMarkings = appearance.ClientOldMarkings;
+ childAppearance.SkinColor = appearance.SkinColor;
+ childAppearance.CustomSpecieName = appearance.CustomSpecieName;
+ childAppearance.LastProfileLoaded = appearance.LastProfileLoaded;
+ childAppearance.CustomBaseLayers = appearance.CustomBaseLayers;
+ Dirty(uid, childAppearance);
// This transfers the mind to the new entity
if (_mindSystem.TryGetMind(uid, out var mindId, out var mind))
@@ -106,7 +135,7 @@ private void OnZombified(EntityUid uid, ReformComponent comp, ref EntityZombifie
}
public sealed partial class ReformEvent : InstantActionEvent { }
-
+
[Serializable, NetSerializable]
public sealed partial class ReformDoAfterEvent : SimpleDoAfterEvent { }
}
diff --git a/Content.Shared/Station/SharedStationSpawningSystem.cs b/Content.Shared/Station/SharedStationSpawningSystem.cs
index c433cc1d4f..9af87376b0 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 0000000000..d13b8bdc7a
--- /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 0000000000..74ba2a0274
--- /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 0000000000..efea2df5af
--- /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 ac12224868..7a26d07e30 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 571db09ebe..8f87633eb6 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 ce2228ff66..4e59ff32fe 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/_Arcadis/Computer/DiskBurnerSystem.cs b/Content.Shared/_Arcadis/Computer/DiskBurnerSystem.cs
index 0856b2fbe6..4c368186ef 100644
--- a/Content.Shared/_Arcadis/Computer/DiskBurnerSystem.cs
+++ b/Content.Shared/_Arcadis/Computer/DiskBurnerSystem.cs
@@ -87,7 +87,7 @@ private void OnExamined(EntityUid uid, DiskBurnerComponent component, ExaminedEv
missing.Add("disk");
if (boardSlot.Item is null)
- missing.Add("or");
+ missing.Add("board");
args.PushMarkup(Loc.GetString("disk-burner-missing", ("missing", string.Join(", or ", missing))));
return;
diff --git a/Content.Shared/_DV/Actions/Events/ChitziteActionEvent.cs b/Content.Shared/_DV/Actions/Events/ChitziteActionEvent.cs
new file mode 100644
index 0000000000..a36bd148d6
--- /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 0000000000..6ccf7f5b21
--- /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 0000000000..68766eda2a
--- /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 0000000000..f695eab8d9
--- /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 0000000000..dc5096c810
--- /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 0000000000..39e0c4ac45
--- /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 0000000000..98d089dfe9
--- /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 0000000000..3247e0752b
--- /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 0000000000..ca09056bb7
--- /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/Content.Shared/_Goobstation/Clothing/Components/SealableClothingComponent.cs b/Content.Shared/_Goobstation/Clothing/Components/SealableClothingComponent.cs
new file mode 100644
index 0000000000..1a550d6c8b
--- /dev/null
+++ b/Content.Shared/_Goobstation/Clothing/Components/SealableClothingComponent.cs
@@ -0,0 +1,30 @@
+using Content.Shared._Goobstation.Clothing.Systems;
+using Robust.Shared.Audio;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Goobstation.Clothing.Components;
+
+/// Defines the clothing entity that can be sealed by
+[RegisterComponent]
+[NetworkedComponent, AutoGenerateComponentState]
+[Access(typeof(SharedSealableClothingSystem))]
+public sealed partial class SealableClothingComponent : Component
+{
+ [DataField, AutoNetworkedField]
+ public bool IsSealed = false;
+
+ [DataField, AutoNetworkedField]
+ public TimeSpan SealingTime = TimeSpan.FromSeconds(1.75);
+
+ [DataField]
+ public LocId SealUpPopup = "sealable-clothing-seal-up";
+
+ [DataField]
+ public LocId SealDownPopup = "sealable-clothing-seal-down";
+
+ [DataField]
+ public SoundSpecifier SealUpSound = new SoundPathSpecifier("/Audio/Mecha/mechmove03.ogg");
+
+ [DataField]
+ public SoundSpecifier SealDownSound = new SoundPathSpecifier("/Audio/Mecha/mechmove03.ogg");
+}
diff --git a/Content.Shared/_Goobstation/Clothing/Components/SealableClothingControlComponent.cs b/Content.Shared/_Goobstation/Clothing/Components/SealableClothingControlComponent.cs
new file mode 100644
index 0000000000..7ddb19cfbd
--- /dev/null
+++ b/Content.Shared/_Goobstation/Clothing/Components/SealableClothingControlComponent.cs
@@ -0,0 +1,75 @@
+using Content.Shared._Goobstation.Clothing.Systems;
+using Content.Shared.Inventory;
+using Robust.Shared.Audio;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._Goobstation.Clothing.Components;
+
+/// Component used to designate contol of sealable clothing. It'll contain action to seal clothing
+[RegisterComponent]
+[NetworkedComponent, AutoGenerateComponentState]
+[Access(typeof(SharedSealableClothingSystem))]
+public sealed partial class SealableClothingControlComponent : Component
+{
+ /// Action that used to start sealing
+ [DataField, AutoNetworkedField]
+ public EntProtoId SealAction = "ActionClothingSeal";
+
+ [DataField, AutoNetworkedField]
+ public EntityUid? SealActionEntity;
+
+ /// Slot required for control to show action
+ [DataField("requiredSlot"), AutoNetworkedField]
+ public SlotFlags RequiredControlSlot = SlotFlags.BACK;
+
+ /// True if clothing in sealing/unsealing process, false if not
+ [DataField, AutoNetworkedField]
+ public bool IsInProcess = false;
+
+ /// True if clothing is currently sealed and need to start unsealing process. False if opposite
+ [DataField, AutoNetworkedField]
+ public bool IsCurrentlySealed = false;
+
+ /// Queue of attached parts that should be sealed/unsealed
+ [DataField, AutoNetworkedField]
+ public Queue ProcessQueue = new();
+
+ /// Uid of entity that currently wear seal control
+ [DataField, AutoNetworkedField]
+ public EntityUid? WearerEntity;
+
+ /// Doafter time for other players to start sealing via stripping menu
+ [DataField, AutoNetworkedField]
+ public TimeSpan NonWearerSealingTime = TimeSpan.FromSeconds(4);
+
+ #region Popups & Sounds
+
+ [DataField]
+ public LocId ToggleFailedPopup = "sealable-clothing-equipment-not-toggled";
+
+ [DataField]
+ public LocId SealFailedPopup = "sealable-clothing-equipment-seal-failed";
+
+ [DataField]
+ public LocId SealedInProcessToggleFailPopup = "sealable-clothing-sealed-process-toggle-fail";
+
+ [DataField]
+ public LocId UnsealedInProcessToggleFailPopup = "sealable-clothing-unsealed-process-toggle-fail";
+
+ [DataField]
+ public LocId CurrentlySealedToggleFailPopup = "sealable-clothing-sealed-toggle-fail";
+
+ [DataField]
+ public LocId VerbText = "sealable-clothing-seal-verb";
+
+ [DataField]
+ public SoundSpecifier FailSound = new SoundPathSpecifier("/Audio/Machines/scanbuzz.ogg");
+
+ [DataField]
+ public SoundSpecifier SealCompleteSound = new SoundPathSpecifier("/Audio/_Goobstation/Mecha/nominal.ogg");
+
+ [DataField]
+ public SoundSpecifier UnsealCompleteSound = new SoundPathSpecifier("/Audio/_Goobstation/Machines/computer_end.ogg");
+ #endregion
+}
diff --git a/Content.Shared/_Goobstation/Clothing/Components/SealableClothingRequiresPowerComponent.cs b/Content.Shared/_Goobstation/Clothing/Components/SealableClothingRequiresPowerComponent.cs
new file mode 100644
index 0000000000..784adb9fd8
--- /dev/null
+++ b/Content.Shared/_Goobstation/Clothing/Components/SealableClothingRequiresPowerComponent.cs
@@ -0,0 +1,30 @@
+using Content.Shared.Alert;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._Goobstation.Clothing.Components;
+
+[RegisterComponent]
+[NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class SealableClothingRequiresPowerComponent : Component
+{
+ [DataField]
+ public LocId NotPoweredPopup = "sealable-clothing-not-powered";
+
+ [DataField]
+ public LocId OpenSealedPanelFailPopup = "sealable-clothing-open-sealed-panel-fail";
+
+ [DataField]
+ public LocId ClosePanelFirstPopup = "sealable-clothing-close-panel-first";
+
+ /// Movement speed when without power
+ [DataField]
+ public float MovementSpeedPenalty = 0.3f;
+
+ [DataField, AutoNetworkedField]
+ public bool IsPowered = false;
+
+ /// Alert to show for the suit's power
+ [DataField]
+ public ProtoId SuitPowerAlert = "ModsuitPower";
+}
diff --git a/Content.Shared/_Goobstation/Clothing/SealableClothingVisuals.cs b/Content.Shared/_Goobstation/Clothing/SealableClothingVisuals.cs
new file mode 100644
index 0000000000..ea4897b6ef
--- /dev/null
+++ b/Content.Shared/_Goobstation/Clothing/SealableClothingVisuals.cs
@@ -0,0 +1,9 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._Goobstation.Clothing;
+
+[Serializable, NetSerializable]
+public enum SealableClothingVisuals : byte
+{
+ Sealed
+}
diff --git a/Content.Shared/_Goobstation/Clothing/Systems/SharedPoweredSealableClothingSystem.cs b/Content.Shared/_Goobstation/Clothing/Systems/SharedPoweredSealableClothingSystem.cs
new file mode 100644
index 0000000000..5902688e1b
--- /dev/null
+++ b/Content.Shared/_Goobstation/Clothing/Systems/SharedPoweredSealableClothingSystem.cs
@@ -0,0 +1,73 @@
+using Content.Shared._Goobstation.Clothing.Components;
+using Content.Shared.Inventory;
+using Content.Shared.Popups;
+using Content.Shared.PowerCell;
+using Content.Shared.Wires;
+
+namespace Content.Shared._Goobstation.Clothing.Systems;
+
+/// Used for sealable clothing that requires power to work
+public abstract class SharedPoweredSealableClothingSystem : EntitySystem
+{
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
+ [Dependency] private readonly SharedPowerCellSystem _powerCellSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnRequiresPowerMapInit);
+ SubscribeLocalEvent(OnRequiresPowerSealAttempt);
+ SubscribeLocalEvent(OnRequiresPowerChangePanelAttempt);
+ }
+
+ private void OnRequiresPowerMapInit(Entity entity, ref MapInitEvent args)
+ {
+ if (!TryComp(entity, out SealableClothingControlComponent? control) || !TryComp(entity, out PowerCellDrawComponent? draw))
+ return;
+
+ draw.Enabled = control.IsCurrentlySealed;
+ }
+
+ /// Checks if control have enough power to seal
+ private void OnRequiresPowerSealAttempt(Entity entity, ref ClothingSealAttemptEvent args)
+ {
+ if (!TryComp(entity, out SealableClothingControlComponent? controlComp)
+ || !TryComp(entity, out PowerCellDrawComponent? cellDrawComp)
+ || args.Cancelled)
+ return;
+
+ // Prevents sealing if wires panel is opened
+ if (TryComp(entity, out WiresPanelComponent? panel) && panel.Open)
+ {
+ _popupSystem.PopupClient(Loc.GetString(entity.Comp.ClosePanelFirstPopup), entity, args.User);
+ args.Cancel();
+ return;
+ }
+
+ // Control shouldn't use charge on unsealing
+ if (controlComp.IsCurrentlySealed)
+ return;
+
+ if (!_powerCellSystem.HasDrawCharge(entity, cellDrawComp) || !_powerCellSystem.HasActivatableCharge(entity, cellDrawComp))
+ {
+ _popupSystem.PopupClient(Loc.GetString(entity.Comp.NotPoweredPopup), entity, args.User);
+ args.Cancel();
+ }
+ }
+
+ /// Prevents wires panel from opening if clothing is sealed
+ private void OnRequiresPowerChangePanelAttempt(Entity entity, ref AttemptChangePanelEvent args)
+ {
+ if (args.Cancelled || !TryComp(entity, out SealableClothingControlComponent? controlComp))
+ return;
+
+ if (controlComp.IsCurrentlySealed || controlComp.IsInProcess)
+ {
+ _popupSystem.PopupClient(Loc.GetString(entity.Comp.OpenSealedPanelFailPopup), entity, args.User);
+ args.Cancelled = true;
+ }
+ }
+}
+
+
diff --git a/Content.Shared/_Goobstation/Clothing/Systems/SharedSealableClothingSystem.cs b/Content.Shared/_Goobstation/Clothing/Systems/SharedSealableClothingSystem.cs
new file mode 100644
index 0000000000..98d18e740d
--- /dev/null
+++ b/Content.Shared/_Goobstation/Clothing/Systems/SharedSealableClothingSystem.cs
@@ -0,0 +1,392 @@
+using Content.Shared._Goobstation.Clothing.Components;
+using Content.Shared.ActionBlocker;
+using Content.Shared.Actions;
+using Content.Shared.Clothing;
+using Content.Shared.Clothing.EntitySystems;
+using Content.Shared.DoAfter;
+using Content.Shared.IdentityManagement;
+using Content.Shared.Interaction;
+using Content.Shared.Item.ItemToggle;
+using Content.Shared.Popups;
+using Content.Shared.PowerCell;
+using Content.Shared.Verbs;
+using Content.Shared.Wires;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Network;
+using Robust.Shared.Serialization;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._Goobstation.Clothing.Systems;
+
+/// System used for sealable clothing
+public abstract class SharedSealableClothingSystem : EntitySystem
+{
+ [Dependency] private readonly INetManager _netManager = default!;
+ [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!;
+ [Dependency] private readonly ActionContainerSystem _actionContainerSystem = default!;
+ [Dependency] private readonly ComponentTogglerSystem _componentTogglerSystem = default!;
+ [Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
+ [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
+ [Dependency] private readonly SharedAudioSystem _audioSystem = default!;
+ [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
+ [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
+ [Dependency] private readonly SharedPowerCellSystem _powerCellSystem = default!;
+ [Dependency] private readonly ToggleableClothingSystem _toggleableSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnPartSealingComplete);
+
+ SubscribeLocalEvent(OnControlSealingComplete);
+ SubscribeLocalEvent(OnControlEquip);
+ SubscribeLocalEvent(OnControlUnequip);
+ SubscribeLocalEvent(OnControlRemove);
+ SubscribeLocalEvent(OnControlGetItemActions);
+ SubscribeLocalEvent>(OnEquipmentVerb);
+ SubscribeLocalEvent(OnControlMapInit);
+ SubscribeLocalEvent(OnSealClothingDoAfter);
+ SubscribeLocalEvent(OnControlSealEvent);
+ //SubscribeLocalEvent(OnStartSealingDoAfter);
+ SubscribeLocalEvent(OnToggleClothingAttempt);
+ }
+
+ #region Events
+
+ /// Toggles components on part when suit complete sealing process
+ private void OnPartSealingComplete(Entity part, ref ClothingPartSealCompleteEvent args)
+ => _componentTogglerSystem.ToggleComponent(part, args.IsSealed);
+
+ /// Toggles components on control when suit complete sealing process
+ private void OnControlSealingComplete(Entity control, ref ClothingControlSealCompleteEvent args)
+ => _componentTogglerSystem.ToggleComponent(control, args.IsSealed);
+
+ /// Add/Remove wearer on clothing equip/unequip
+ private void OnControlEquip(Entity control, ref ClothingGotEquippedEvent args)
+ {
+ control.Comp.WearerEntity = args.Wearer;
+ Dirty(control);
+ }
+
+ private void OnControlUnequip(Entity control, ref ClothingGotUnequippedEvent args)
+ {
+ control.Comp.WearerEntity = null;
+ Dirty(control);
+ }
+
+ /// Removes seal action on component remove
+ private void OnControlRemove(Entity control, ref ComponentRemove args)
+ {
+ var comp = control.Comp;
+
+ _actionsSystem.RemoveAction(comp.SealActionEntity);
+ }
+
+ /// Ensures seal action to wearer when it equip the seal control
+ private void OnControlGetItemActions(Entity control, ref GetItemActionsEvent args)
+ {
+ var (uid, comp) = control;
+
+ if (comp.SealActionEntity == null || args.SlotFlags != comp.RequiredControlSlot)
+ return;
+
+ args.AddAction(comp.SealActionEntity.Value);
+ }
+
+ /// Adds unsealing verbs to sealing control allowing other users to unseal/seal clothing via stripping
+ private void OnEquipmentVerb(Entity control, ref GetVerbsEvent args)
+ {
+ var (uid, comp) = control;
+ var user = args.User;
+
+ if (!args.CanComplexInteract
+ // Since sealing control in wearer's container system just won't show verb on args.CanAccess
+ || !_interactionSystem.InRangeUnobstructed(user, uid)
+ || comp.WearerEntity == null
+ || comp.WearerEntity != user
+ && _actionBlockerSystem.CanInteract(comp.WearerEntity.Value, null))
+ return;
+
+ var verbIcon = comp.IsCurrentlySealed ?
+ new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/unlock.svg.192dpi.png")) :
+ new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/lock.svg.192dpi.png"));
+
+ var verb = new Verb()
+ {
+ Icon = verbIcon,
+ Priority = 5,
+ Text = Loc.GetString(comp.VerbText),
+ Act = () => TryStartSealToggleProcess(control, user)
+ };
+
+ /* This should make as do after to start unsealing of suit with verb, but, for some reason i couldn't figure out, it ends with doAfter enumerator change exception
+ * Would be nice if some can fix this, yet unsealing will be possible only on incapacitated wearers
+ if (args.User == comp.WearerEntity)
+ {
+ verb.Act = () => TryStartSealToggleProcess(control);
+ }
+ else
+ {
+ var doAfterArgs = new DoAfterArgs(EntityManager, args.User, comp.NonWearerSealingTime, new StartSealingProcessDoAfterEvent(), uid)
+ {
+ RequireCanInteract = true,
+ BreakOnMove = true,
+ BlockDuplicate = true
+ };
+ verb.Act = () => _doAfterSystem.TryStartDoAfter(doAfterArgs);
+ }*/
+
+ args.Verbs.Add(verb);
+ }
+
+ /// Ensure actionEntity on map init
+ private void OnControlMapInit(Entity control, ref MapInitEvent args)
+ {
+ var (uid, comp) = control;
+ _actionContainerSystem.EnsureAction(uid, ref comp.SealActionEntity, comp.SealAction);
+ }
+
+ /* This should make as do after to start unsealing of suit with verb, but, for some reason i couldn't figure out, it ends with doAfter enumerator change exception
+ * Would be nice if some can fix this, yet unsealing will be possible only on incapacitated wearers
+ private void OnStartSealingDoAfter(Entity control, ref StartSealingProcessDoAfterEvent args)
+ {
+ if (args.Cancelled)
+ return;
+
+ TryStartSealToggleProcess(control);
+ }*/
+
+ /// Trying to start sealing on action. It'll notify wearer if process already started
+ private void OnControlSealEvent(Entity control, ref SealClothingEvent args)
+ {
+ var (uid, comp) = control;
+
+ if (!_actionBlockerSystem.CanInteract(args.Performer, null))
+ return;
+
+ if (comp.IsInProcess)
+ {
+ if (comp.IsCurrentlySealed)
+ {
+ _popupSystem.PopupClient(Loc.GetString(comp.SealedInProcessToggleFailPopup), uid, args.Performer);
+ _audioSystem.PlayPredicted(comp.FailSound, uid, args.Performer);
+ }
+ else
+ {
+ _popupSystem.PopupClient(Loc.GetString(comp.UnsealedInProcessToggleFailPopup), uid, args.Performer);
+ _audioSystem.PlayPredicted(comp.FailSound, uid, args.Performer);
+ }
+
+ return;
+ }
+
+ TryStartSealToggleProcess(control, args.Performer);
+ }
+
+ /// Toggle seal on one part and starts same process on next part
+ private void OnSealClothingDoAfter(Entity control, ref SealClothingDoAfterEvent args)
+ {
+ var (uid, comp) = control;
+
+ if (args.Cancelled || args.Handled || args.Target == null)
+ return;
+
+ var part = args.Target;
+
+ if (!TryComp(part, out var sealableComponent))
+ return;
+
+ sealableComponent.IsSealed = !comp.IsCurrentlySealed;
+
+ Dirty(part.Value, sealableComponent);
+
+ _audioSystem.PlayPvs(sealableComponent.SealUpSound, uid);
+
+ _appearanceSystem.SetData(part.Value, SealableClothingVisuals.Sealed, sealableComponent.IsSealed);
+
+ var ev = new ClothingPartSealCompleteEvent(sealableComponent.IsSealed);
+ RaiseLocalEvent(part.Value, ref ev);
+
+ NextSealProcess(control);
+ }
+
+ /// Prevents clothing from toggling if it's sealed or in sealing process
+ private void OnToggleClothingAttempt(Entity control, ref ToggleClothingAttemptEvent args)
+ {
+ var (uid, comp) = control;
+
+ // Popup if currently sealing
+ if (comp.IsInProcess)
+ {
+ _popupSystem.PopupClient(Loc.GetString(comp.UnsealedInProcessToggleFailPopup), uid, args.User);
+ _audioSystem.PlayPredicted(comp.FailSound, uid, args.User);
+ args.Cancel();
+
+ return;
+ }
+
+ // Popup if sealed, but not in process
+ if (comp.IsCurrentlySealed)
+ {
+ _popupSystem.PopupClient(Loc.GetString(comp.CurrentlySealedToggleFailPopup), uid, args.User);
+ _audioSystem.PlayPredicted(comp.FailSound, uid, args.User);
+ args.Cancel();
+
+ return;
+ }
+
+ return;
+ }
+ #endregion
+
+ /// Tries to start sealing process
+ public bool TryStartSealToggleProcess(Entity control, EntityUid? user = null)
+ {
+ var (uid, comp) = control;
+
+ // Prevent sealing/unsealing if modsuit don't have wearer or already started process
+ if (comp.WearerEntity == null || comp.IsInProcess)
+ return false;
+
+ if (user == null)
+ user = comp.WearerEntity;
+
+ var ev = new ClothingSealAttemptEvent(user.Value);
+ RaiseLocalEvent(control, ev);
+
+ if (ev.Cancelled)
+ return false;
+
+ // All parts required to be toggled to perform sealing
+ if (_toggleableSystem.GetAttachedToggleStatus(uid) != ToggleableClothingAttachedStatus.AllToggled)
+ {
+ _popupSystem.PopupClient(Loc.GetString(comp.ToggleFailedPopup), uid, user);
+ _audioSystem.PlayPredicted(comp.FailSound, uid, user);
+ return false;
+ }
+
+ // Trying to get all clothing to seal
+ var sealeableList = _toggleableSystem.GetAttachedClothingsList(uid);
+ if (sealeableList == null)
+ return false;
+
+ foreach (var sealeable in sealeableList)
+ {
+ if (!HasComp(sealeable))
+ {
+ _popupSystem.PopupEntity(Loc.GetString(comp.ToggleFailedPopup), uid);
+ _audioSystem.PlayPredicted(comp.FailSound, uid, user);
+
+ comp.ProcessQueue.Clear();
+ Dirty(control);
+
+ return false;
+ }
+
+ comp.ProcessQueue.Enqueue(EntityManager.GetNetEntity(sealeable));
+ }
+
+ comp.IsInProcess = true;
+ Dirty(control);
+
+ NextSealProcess(control);
+
+ return true;
+ }
+
+ /// Recursively seals/unseals all parts of sealable clothing
+ private void NextSealProcess(Entity control)
+ {
+ var (uid, comp) = control;
+
+ // Finish sealing process
+ if (comp.ProcessQueue.Count == 0)
+ {
+ comp.IsInProcess = false;
+ comp.IsCurrentlySealed = !comp.IsCurrentlySealed;
+
+ _audioSystem.PlayEntity(comp.IsCurrentlySealed ? comp.SealCompleteSound : comp.UnsealCompleteSound, comp.WearerEntity!.Value, uid);
+
+ var ev = new ClothingControlSealCompleteEvent(comp.IsCurrentlySealed);
+ RaiseLocalEvent(control, ref ev);
+
+ _appearanceSystem.SetData(uid, SealableClothingVisuals.Sealed, comp.IsCurrentlySealed);
+
+ Dirty(control);
+ return;
+ }
+
+ var processingPart = EntityManager.GetEntity(comp.ProcessQueue.Dequeue());
+ Dirty(control);
+
+ if (!TryComp(processingPart, out var sealableComponent) || !comp.IsInProcess)
+ {
+ _popupSystem.PopupClient(Loc.GetString(comp.ToggleFailedPopup), uid, comp.WearerEntity);
+ _audioSystem.PlayPredicted(comp.FailSound, uid, comp.WearerEntity);
+
+ NextSealProcess(control);
+ return;
+ }
+
+ // If part is sealed when control trying to seal - it should just skip this part
+ if (sealableComponent.IsSealed != comp.IsCurrentlySealed)
+ {
+ NextSealProcess(control);
+ return;
+ }
+
+ var doAfterArgs = new DoAfterArgs(EntityManager, uid, sealableComponent.SealingTime, new SealClothingDoAfterEvent(), uid, target: processingPart, showTo: comp.WearerEntity)
+ {
+ NeedHand = false,
+ RequireCanInteract = false,
+ };
+
+ // Checking for client here to skip first process popup spam that happens. Predicted popups don't work here because doafter starts on sealable control, not on player.
+ if (!_doAfterSystem.TryStartDoAfter(doAfterArgs) || _netManager.IsClient)
+ return;
+
+ if (comp.IsCurrentlySealed)
+
+ _popupSystem.PopupEntity(Loc.GetString(sealableComponent.SealDownPopup,
+ ("partName", Identity.Name(processingPart, EntityManager))),
+ uid, comp.WearerEntity!.Value);
+ else
+ _popupSystem.PopupEntity(Loc.GetString(sealableComponent.SealUpPopup,
+ ("partName", Identity.Name(processingPart, EntityManager))),
+ uid, comp.WearerEntity!.Value);
+ }
+}
+
+[Serializable, NetSerializable]
+public sealed partial class SealClothingDoAfterEvent : SimpleDoAfterEvent { }
+
+[Serializable, NetSerializable]
+public sealed partial class StartSealingProcessDoAfterEvent : SimpleDoAfterEvent { }
+
+public sealed partial class SealClothingEvent : InstantActionEvent { }
+
+/// Raises on control when clothing finishes it's sealing or unsealing process
+[ByRefEvent]
+public readonly record struct ClothingControlSealCompleteEvent(bool IsSealed)
+{
+ public readonly bool IsSealed = IsSealed;
+}
+
+/// Raises on part when clothing finishes it's sealing or unsealing process
+[ByRefEvent]
+public readonly record struct ClothingPartSealCompleteEvent(bool IsSealed)
+{
+ public readonly bool IsSealed = IsSealed;
+}
+
+public sealed partial class ClothingSealAttemptEvent : CancellableEntityEventArgs
+{
+ public EntityUid User;
+
+ public ClothingSealAttemptEvent(EntityUid user)
+ {
+ User = user;
+ }
+}
diff --git a/Content.Shared/_Goobstation/Wires/Components/ItemSlotsRequirePanelComponent.cs b/Content.Shared/_Goobstation/Wires/Components/ItemSlotsRequirePanelComponent.cs
new file mode 100644
index 0000000000..dea1445bff
--- /dev/null
+++ b/Content.Shared/_Goobstation/Wires/Components/ItemSlotsRequirePanelComponent.cs
@@ -0,0 +1,14 @@
+using Content.Shared.Containers.ItemSlots;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Goobstation.Wires.Components;
+
+/// This is used for items slots that require entity to have wire panel for interactions
+[RegisterComponent]
+[NetworkedComponent]
+public sealed partial class ItemSlotsRequirePanelComponent : Component
+{
+ /// For each slot: true - slot require opened panel for interaction, false - slot require closed panel for interaction
+ [DataField]
+ public Dictionary Slots = new();
+}
diff --git a/Content.Shared/_Goobstation/Wires/Systems/RequirePanelSystem.cs b/Content.Shared/_Goobstation/Wires/Systems/RequirePanelSystem.cs
new file mode 100644
index 0000000000..10c48f419a
--- /dev/null
+++ b/Content.Shared/_Goobstation/Wires/Systems/RequirePanelSystem.cs
@@ -0,0 +1,37 @@
+using Content.Shared._Goobstation.Wires.Components;
+using Content.Shared.Containers.ItemSlots;
+using Content.Shared.Wires;
+
+namespace Content.Shared._Goobstation.Wires.Systems;
+
+public sealed partial class RequirePanelSystem : EntitySystem
+{
+ [Dependency] private readonly ItemSlotsSystem _itemSlots = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(ItemSlotInsertAttempt);
+ SubscribeLocalEvent(ItemSlotEjectAttempt);
+ }
+
+ private void ItemSlotInsertAttempt(Entity entity, ref ItemSlotInsertAttemptEvent args)
+ => args.Cancelled = !CheckPanelStateForItemSlot(entity, args.Slot.ID);
+
+ private void ItemSlotEjectAttempt(Entity entity, ref ItemSlotEjectAttemptEvent args)
+ => args.Cancelled = !CheckPanelStateForItemSlot(entity, args.Slot.ID);
+
+ public bool CheckPanelStateForItemSlot(Entity entity, string? slot)
+ {
+ var (uid, comp) = entity;
+
+ if (slot == null
+ // If slot doesn't require a wire panel - don't cancel interaction
+ || !comp.Slots.TryGetValue(slot, out var isRequireOpen)
+ || !TryComp(uid, out var wiresPanel))
+ return false;
+
+ return wiresPanel.Open == isRequireOpen;
+ }
+}
diff --git a/Directory.Packages.props b/Directory.Packages.props
index eee8c65f9a..b5643d476a 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -15,5 +15,6 @@
+
diff --git a/Resources/Audio/DeltaV/Voice/Chitinid/attributions.yml b/Resources/Audio/DeltaV/Voice/Chitinid/attributions.yml
new file mode 100644
index 0000000000..5d6386b81d
--- /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 0000000000..8ddc420244
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 0000000000..b7240a5653
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 0000000000..d3c2865ab6
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 0000000000..482086fb63
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 0000000000..5b77d98e56
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 0000000000..879bb3bc04
--- /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 0000000000..6d059e204b
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 0000000000..b744067444
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 0000000000..9d04ade0be
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 0000000000..32afa72eb7
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 0000000000..61d8b7170f
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 0000000000..827baa8dfd
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 0000000000..7f1b11ce4c
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 0000000000..088455b47d
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 0000000000..89fb73a9a5
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 0000000000..5b625d3012
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 0000000000..282d1a870e
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 0000000000..cc10d9248d
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 0000000000..6b2724fe5e
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 0000000000..9545e24485
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 0000000000..d41969c20b
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 0000000000..4e22952217
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 0000000000..47dd7e9032
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 0000000000..281d89da0a
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 0000000000..b11d1b9092
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 0000000000..700e64b893
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 0000000000..8aff3ea887
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 0000000000..cc90ece158
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 0000000000..95755e6614
Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg differ
diff --git a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg
new file mode 100644
index 0000000000..b4b710b38c
Binary files /dev/null and b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg differ
diff --git a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg
deleted file mode 100644
index 9a2b994ead..0000000000
Binary files a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg and /dev/null differ
diff --git a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow2.ogg b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow2.ogg
deleted file mode 100644
index 000f397ee8..0000000000
Binary files a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow2.ogg and /dev/null differ
diff --git a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse.ogg b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse.ogg
new file mode 100644
index 0000000000..ef1d1298c2
Binary files /dev/null and b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse.ogg differ
diff --git a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse1.ogg b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse1.ogg
deleted file mode 100644
index c1cd4c6c29..0000000000
Binary files a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse1.ogg and /dev/null differ
diff --git a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse2.ogg b/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse2.ogg
deleted file mode 100644
index 5bd44cfb6c..0000000000
Binary files a/Resources/Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse2.ogg and /dev/null differ
diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml
index cd257ada22..be04c55c64 100644
--- a/Resources/Audio/Machines/attributions.yml
+++ b/Resources/Audio/Machines/attributions.yml
@@ -166,7 +166,7 @@
license: "CC0-1.0"
copyright: "by Ko4erga"
source: "https://github.com/space-wizards/space-station-14/pull/30431"
-
+
- files: ["double_ring.ogg"]
license: "CC0-1.0"
copyright: "Created by fspera, converted to OGG and modified by chromiumboy."
@@ -180,3 +180,8 @@
license: "CC0-1.0"
copyright: "by ScarKy0"
source: "https://github.com/space-wizards/space-station-14/pull/32012"
+
+- files: ["scanbuzz.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from TG station"
+ source: "https://github.com/tgstation/tgstation/pull/39986"
diff --git a/Resources/Audio/Machines/scanbuzz.ogg b/Resources/Audio/Machines/scanbuzz.ogg
new file mode 100644
index 0000000000..d3422bc8f4
Binary files /dev/null and b/Resources/Audio/Machines/scanbuzz.ogg differ
diff --git a/Resources/Audio/Voice/Plasmaman/attributions.yml b/Resources/Audio/Voice/Plasmaman/attributions.yml
new file mode 100644
index 0000000000..c2baecc2b6
--- /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 0000000000..f068794506
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 0000000000..e61619c027
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 0000000000..ac8b8ec21f
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 310b01b728..11e8199c87 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 0000000000..6f13ff9cef
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 0000000000..fe4e7ef41b
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 0000000000..2503a66583
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 0000000000..c656d6c8ca
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 0000000000..5d6386b81d
--- /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 0000000000..8ddc420244
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 0000000000..b7240a5653
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 0000000000..d3c2865ab6
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 0000000000..482086fb63
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 0000000000..5b77d98e56
Binary files /dev/null and b/Resources/Audio/_DV/Voice/Chitinid/moth_squeak.ogg differ
diff --git a/Resources/Audio/_Goobstation/Machines/attributions.yml b/Resources/Audio/_Goobstation/Machines/attributions.yml
new file mode 100644
index 0000000000..7623347dab
--- /dev/null
+++ b/Resources/Audio/_Goobstation/Machines/attributions.yml
@@ -0,0 +1,4 @@
+- files: ["computer_end.ogg"]
+ license: "CC-BY-NC-SA-3.0"
+ copyright: "Taken from TG station."
+ source: "https://github.com/tgstation/tgstation/pull/32336"
diff --git a/Resources/Audio/_Goobstation/Machines/computer_end.ogg b/Resources/Audio/_Goobstation/Machines/computer_end.ogg
new file mode 100644
index 0000000000..9294405573
Binary files /dev/null and b/Resources/Audio/_Goobstation/Machines/computer_end.ogg differ
diff --git a/Resources/Audio/_Goobstation/Mecha/attributions.yml b/Resources/Audio/_Goobstation/Mecha/attributions.yml
new file mode 100644
index 0000000000..0caf2522fc
--- /dev/null
+++ b/Resources/Audio/_Goobstation/Mecha/attributions.yml
@@ -0,0 +1,4 @@
+- files: ["nominal.ogg"]
+ license: "CC-BY-NC-SA-3.0"
+ copyright: "Taken from TG station."
+ source: "https://github.com/tgstation/tgstation/commit/3517810d119fcb5eeb9d477c87cda3eb3cd2048c"
diff --git a/Resources/Audio/_Goobstation/Mecha/nominal.ogg b/Resources/Audio/_Goobstation/Mecha/nominal.ogg
new file mode 100644
index 0000000000..b89bd39616
Binary files /dev/null and b/Resources/Audio/_Goobstation/Mecha/nominal.ogg differ
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 0e8e285d37..4c32e789ec 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -10644,3 +10644,163 @@ Entries:
id: 6753
time: '2025-01-23T01:11:05.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1615
+- author: VMSolidus
+ changes:
+ - type: Add
+ message: >-
+ (For Developers): Added the MathNet.Numerics library. It contains a
+ great number of scientific and engineering math related functions. For
+ more information, its documentation can be found here,
+ https://numerics.mathdotnet.com/api/MathNet.Numerics/index.htm
+ id: 6754
+ time: '2025-01-23T03:45:53.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1641
+- author: BlueHNT
+ changes:
+ - type: Tweak
+ message: Tweaked lamia bite
+ id: 6755
+ time: '2025-01-24T22:29:08.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1645
+- author: CerberusWolfie
+ changes:
+ - type: Tweak
+ message: >-
+ Logistics Officer now has 30 hours instead of 40 hours of time
+ requirement overall.
+ - type: Tweak
+ message: >-
+ Chief Engineer and CMO have 25 hours instead of 30 hours of time
+ requirement.
+ - type: Tweak
+ message: Mystagogue now has 5 hours of time requirement as Mantis and Cataloguer.
+ id: 6756
+ time: '2025-01-25T00:53:51.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1649
+- author: Timfa
+ changes:
+ - type: Add
+ message: Add Batonbot
+ - type: Add
+ message: Add Disablerbot
+ id: 6757
+ time: '2025-01-25T16:58:46.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1631
+- author: Erisfiregamer1
+ changes:
+ - type: Add
+ message: Modsuits have been ported from Goobstation!
+ 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
+- author: SX-7
+ changes:
+ - type: Add
+ message: Added Tajara and related content
+ id: 6766
+ time: '2025-01-26T00:53:00.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1647
+- author: Skubman
+ changes:
+ - type: Add
+ message: >-
+ New hairstyles have arrived, including all Goob LRP-original hairstyles,
+ Pulato, new facial hair and more!
+ - type: Add
+ message: 'Added epic IPC wings and Plasmaman wings. '
+ - type: Add
+ message: Added the Iron Jaw face marking.
+ - type: Tweak
+ message: Increased the maximum number of Reptilian chest markings to 3.
+ - type: Fix
+ message: >-
+ Harpy, Arachne and Lamia can no longer pick the "No Ears" marking which
+ had no effect as they had no default ear markings.
+ id: 6767
+ time: '2025-01-26T01:14:42.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1658
+- author: VMSolidus
+ changes:
+ - type: Remove
+ message: >-
+ Removed almost all of the EE DEFAULT playtime requirements. If you're a
+ downstream, set these yourself.
+ id: 6768
+ time: '2025-01-26T02:13:32.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1660
diff --git a/Resources/Changelog/Den.yml b/Resources/Changelog/Den.yml
index a428d0d596..1832dfb84f 100644
--- a/Resources/Changelog/Den.yml
+++ b/Resources/Changelog/Den.yml
@@ -1518,3 +1518,55 @@ Entries:
id: 126
time: '2025-01-25T06:37:38.0000000+00:00'
url: https://github.com/TheDenSS14/TheDen/pull/197
+- author: Rosycup
+ changes:
+ - type: Add
+ message: Added the Jenn Plushie for everyone to have!
+ id: 127
+ time: '2025-01-26T01:24:51.0000000+00:00'
+ url: https://github.com/TheDenSS14/TheDen/pull/199
+- author: EE Contributors
+ changes:
+ - type: Add
+ message: Added Tajara and related content
+ - type: Add
+ message: Add Batonbot
+ - type: Add
+ message: Add Disablerbot
+ - type: Add
+ message: Modsuits have been ported from Goobstation!
+ - type: Add
+ message: A new ChemMaster experience has been granted to the people of
+ - type: Add
+ message: Added a new species, the Chitinid.
+ - type: Tweak
+ message: Kill random person objective has been replaced by teaching them
+ - type: Add
+ message: Added playing cards. You may get one in the Games Vendor or as an item
+ - type: Add
+ message: Engineering Hardsuits, Maxim Hardsuit, and Cybersun's Elite
+ - type: Add
+ message: The Plasmaman species has arrived! They need to breathe plasma to
+ - type: Tweak
+ message: Internals are no longer toggled off if you take your helmet off
+ - type: Tweak
+ message: Paradox Anomalies will now spawn with the original person's
+ - type: Fix
+ message: Fixed prisoners not being able to have custom Loadout names and
+ - type: Add
+ message: New hairstyles have arrived, including all Goob LRP-original
+ - type: Add
+ message: 'Added epic IPC wings and Plasmaman wings. '
+ - type: Add
+ message: Added the Iron Jaw face marking.
+ - type: Tweak
+ message: Increased the maximum number of Reptilian chest markings to 3.
+ - type: Tweak
+ message: Vox is now playable again.
+ - type: Fix
+ message: Harpy, Arachne and Lamia can no longer pick the "No Ears" marking
+ - type: Add
+ message: Ported Goob mechs
+ id: 128
+ time: '2025-01-26T04:06:46.0000000+00:00'
+ url: https://github.com/TheDenSS14/TheDen/pull/200
diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt
index 264019de61..07acfebfdb 100644
--- a/Resources/Credits/GitHub.txt
+++ b/Resources/Credits/GitHub.txt
@@ -1 +1 @@
-0x6273, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 2digitman, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, AeraAuling, Aerocrux, Aexolott, Aexxie, africalimedrop, afrokada, Agoichi, Ahion, Aidenkrz, Aikakakah, aitorlogedo, ajcm, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, angelofallars, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, armoks, Arteben, ArthurMousatov, artur, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, aspiringlich, astriloqua, avghdev, azzy, AzzyIsNotHere, BananaFlambe, BasedPugilist, BasedUser, beck-thompson, benev0, BGare, bhespiritu, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blazlovich, bloodrizer, Bloody2372, blueDev2, BlueHNT, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, byondfuckery, c0rigin, c4llv07e, CaasGit, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, CatTheSystem, Centronias, CerberusWolfie, chairbender, Charlese2, chavonadelal, Cheackraze, cheesePizza2, Chief-Engineer, christhirtle, chromiumboy, Chronophylos, Chubbygummibear, CilliePaint, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, CodedCrow, Cohnway, cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, CormosLemming, CrafterKolyan, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, Cyberboss, cynical24, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DakoDemon, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, DarkenedSynergy, Darkenson, DawBla, Daxxi3, dch-GH, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DeltaV-Bot, DerbyX, derek, dersheppard, dexlerxd, dffdff2423, dge21, digitalic, DinoWattz, DJB1gYAPPA, DjfjdfofdjfjD, dmitri, DocNITE, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, dootythefrooty, Dorragon, Doru991, DoubleRiceEddiedd, DoutorWhite, drakewill-CRL, Drayff, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, Dutch-VanDerLinde, dvir001, dylanstrategie, Dynexust, Eagle0600, Easypoller, eclips_e, eden077, EEASAS, Efruit, efzapa, ElectroSR, elsie, elthundercloud, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, ErhardSteinhauer, eris, ERORR404V1, Errant-4, esguard, estacaoespacialpirata, eugene, Evgencheg, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, Fansana, Feluk6174, fenndragon, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, fl-oz, Flareguy, Floof-Station-Bot, FluffiestFloof, FluffMe, FluidRock, flybik, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxcumberland, foxfoxthepirate, foxhorn, FoxxoTrystan, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, GalacticChimp, gamer3107, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, ghost581x, Git-Nivrak, gituhabu, GlassEclipse, gluesniffler, GNF54, goet, Golinth, GoodWheatley, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, greggthefather, GreyMario, GTRsound, Guess-My-Name, gusxyz, h3half, Haltell, Hanzdegloker, Hardly3D, harikattar, Hebi, Henry, HerCoyote23, hiucko, Hmeister-fake, Hmeister-real, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, i-justuser-i, iacore, IamVelcroboy, icekot8, icesickleone, Ichaie, iczero, iglov, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, ItsMeThom, Itzbenz, Jackal298, Jackrost, jacksonzck, Jackw2As, jamessimo, janekvap, Jark255, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, JIPDawg, jjtParadox, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, Jrpl, juliangiebel, juniwoofs, justart1m, JustCone14, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, komunre, KonstantinAngelov, koteq, Krunklehorn, Kukutis96513, Kupie, kxvvv, Kyoth25f, KyuPolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, lizelive, lleftTheDragon, localcc, Lomcastar, lonoferars, LordCarve, LordEclipse, LovelyLophi, luckyshotpictures, LudwigVonChesterfield, Lukasz825700516, Lumminal, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, MehimoNemo, MeltedPixel, Memeji, MemeProof, MendaxxDev, Menshin, Mephisto72, Mervill, metalgearsloth, mhamsterr, michaelcu, micheel665, Mike32oz, MilenVolf, milon, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, MLGTASTICa, Mnemotechnician, moderatelyaware, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, musicmanvr, MWKane, Myakot, Myctai, Myzumi, N3X15, nails-n-tape, Nairodian, Naive817, namespace-Memory, Nannek, NeLepus, neuPanda, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, nok-ko, NonchalantNoob, NoobyLegion, not-gavnaed, notafet, notquitehadouken, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OCOtheOmega, OctoRocket, OldDanceJacket, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Phantom-Lily, PHCodes, Phill101, phunnyguy, pigeonpeas, PilgrimViis, Pill-U, Piras314, Pireax, pissdemon, PixelTheKermit, PJB3005, Plasmaguy, PlasmaRaptor, plinyvic, Plykiya, pofitlo, pointer-to-null, poklj, PolterTzi, PoorMansDreams, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, RadsammyT, Rainbeon, Rainfey, Raitononai, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, RedFoxIV, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, Remuchi, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, Rinkashikachi, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Rosycup, router, RumiTiger, S1ss3l, Saakra, saga3152, Salex08, sam, Samsterious, SaphireLattice, SapphicOverload, sapphirescript, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, ShadowCommander, shadowtheprotogen546, shadowwailker, shaeone, shampunj, shariathotpatrol, ShatteredSwords, Shiro69420, SignalWalker, siigiil, SimpleStation14, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, SleepyScarecrow, sleepyyapril, Slyfox333, snebl, sniperchance, Snowni, snowsignal, SnowyFoxxo, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, SpaceManiac, SpaceRox1244, SpaceyLady, spartak, SpartanKadence, Spatison, SpeltIncorrectyl, spess-empyrean, SphiraI, SplinterGP, spoogemonster, sporekto, squirrelanna, Squishy77, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, suraru, Sushiburger, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, TadJohnson00, takemysoult, TaralGit, Taran, Tayrtahn, tday93, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGRCdev, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, TheCze, TheDarkElites, TheDen-Bot, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TherapyGoth, TheShuEd, thevinter, ThunderBear2006, Timemaster99, timothyteakettle, TimrodDX, tin-man-tim, Tirochora, Titian3, tk-a369, tkdrg, Tmanzxd, tmtmtl30, toasterpm87, TokenStyle, Tollhouse, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, Tornado-Technology, tosatur, TotallyLemon, truepaintgit, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, twoducksonnaplane, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, unusualcrow, Uriende, UristMcDorf, user424242420, v0idRift, Vaaankas, valentfingerov, Varen, Vasilis, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, Veritius, Vermidia, vero5123, Verslebas, vigersray, violet754, Visne, VividPups, vlados1408, VMSolidus, volotomite, volundr-, Vonsant, Voomra, Vordenburg, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, XavierSomething, xkreksx, xqzpop7, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, zelezniciar1, ZelteHonor, zero, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zymem, zzylex
+0x6273, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 2digitman, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, AeraAuling, Aerocrux, Aexolott, Aexxie, africalimedrop, afrokada, Agoichi, Ahion, Aidenkrz, Aikakakah, aitorlogedo, ajcm, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, angelofallars, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, aspiringlich, astriloqua, avghdev, azzy, AzzyIsNotHere, BananaFlambe, BasedPugilist, BasedUser, beck-thompson, benev0, BGare, bhespiritu, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blazlovich, bloodrizer, Bloody2372, blueDev2, BlueHNT, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, byondfuckery, c0rigin, c4llv07e, CaasGit, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, CatTheSystem, Centronias, CerberusWolfie, chairbender, Charlese2, chavonadelal, Cheackraze, cheesePizza2, Chief-Engineer, christhirtle, chromiumboy, Chronophylos, Chubbygummibear, CilliePaint, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, CodedCrow, Cohnway, cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, CormosLemming, CrafterKolyan, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, Cyberboss, cynical24, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DakoDemon, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, DarkenedSynergy, Darkenson, DawBla, Daxxi3, dch-GH, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DeltaV-Bot, DerbyX, derek, dersheppard, dexlerxd, dffdff2423, dge21, digitalic, DinoWattz, DJB1gYAPPA, DjfjdfofdjfjD, dmitri, DocNITE, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, dootythefrooty, Dorragon, Doru991, DoubleRiceEddiedd, DoutorWhite, drakewill-CRL, Drayff, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, Dutch-VanDerLinde, dvir001, dylanstrategie, Dynexust, Eagle0600, Easypoller, eclips_e, eden077, EEASAS, Efruit, efzapa, ElectroSR, elsie, elthundercloud, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, ErhardSteinhauer, eris, ERORR404V1, Errant-4, esguard, estacaoespacialpirata, eugene, Evgencheg, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, Fansana, Feluk6174, fenndragon, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, fl-oz, Flareguy, Floof-Station-Bot, FluffiestFloof, FluffMe, FluidRock, flybik, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxcumberland, foxfoxthepirate, foxhorn, FoxxoTrystan, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, GalacticChimp, gamer3107, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, ghost581x, Git-Nivrak, gituhabu, GlassEclipse, gluesniffler, GNF54, goet, Golinth, GoodWheatley, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, greggthefather, GreyMario, GTRsound, Guess-My-Name, gusxyz, h3half, Haltell, Hanzdegloker, Hardly3D, harikattar, Hebi, Henry, HerCoyote23, hiucko, Hmeister-fake, Hmeister-real, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, i-justuser-i, iacore, IamVelcroboy, icekot8, icesickleone, Ichaie, iczero, iglov, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, Jackal298, Jackrost, jacksonzck, Jackw2As, jamessimo, janekvap, Jark255, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, JIPDawg, jjtParadox, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, Jrpl, juliangiebel, juniwoofs, justart1m, JustCone14, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, komunre, KonstantinAngelov, koteq, Krunklehorn, Kukutis96513, Kupie, kxvvv, Kyoth25f, KyuPolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, lizelive, lleftTheDragon, localcc, Lomcastar, lonoferars, LordCarve, LordEclipse, LovelyLophi, luckyshotpictures, LudwigVonChesterfield, Lukasz825700516, Lumminal, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, MehimoNemo, MeltedPixel, Memeji, MemeProof, MendaxxDev, Menshin, Mephisto72, Mervill, metalgearsloth, mhamsterr, michaelcu, micheel665, Mike32oz, MilenVolf, milon, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, MLGTASTICa, Mnemotechnician, moderatelyaware, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, musicmanvr, MWKane, Myakot, Myctai, Myzumi, N3X15, nails-n-tape, Nairodian, Naive817, namespace-Memory, Nannek, NeLepus, neuPanda, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, nok-ko, NonchalantNoob, NoobyLegion, not-gavnaed, notafet, notquitehadouken, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OCOtheOmega, OctoRocket, OldDanceJacket, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Phantom-Lily, PHCodes, Phill101, phunnyguy, pigeonpeas, PilgrimViis, Pill-U, Piras314, Pireax, pissdemon, PixelTheKermit, PJB3005, Plasmaguy, PlasmaRaptor, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, poklj, PolterTzi, PoorMansDreams, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, RadsammyT, Rainbeon, Rainfey, Raitononai, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, RedFoxIV, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, Remuchi, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, Rinkashikachi, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Rosycup, router, RumiTiger, S1ss3l, Saakra, saga3152, Salex08, sam, Samsterious, SaphireLattice, SapphicOverload, sapphirescript, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, ShadowCommander, shadowtheprotogen546, shadowwailker, shaeone, shampunj, shariathotpatrol, ShatteredSwords, Shiro69420, SignalWalker, siigiil, SimpleStation14, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, SleepyScarecrow, sleepyyapril, Slyfox333, snebl, sniperchance, Snowni, snowsignal, SnowyFoxxo, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, SpaceManiac, SpaceRox1244, SpaceyLady, Spanky, spartak, SpartanKadence, Spatison, SpeltIncorrectyl, spess-empyrean, sphirai, SplinterGP, spoogemonster, sporekto, squirrelanna, Squishy77, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, suraru, Sushiburger, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, TadJohnson00, takemysoult, tap, TaralGit, Taran, Tayrtahn, tday93, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGRCdev, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, TheCze, TheDarkElites, TheDen-Bot, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TherapyGoth, TheShuEd, thevinter, ThunderBear2006, Timemaster99, timothyteakettle, TimrodDX, tin-man-tim, Tirochora, Titian3, tk-a369, tkdrg, Tmanzxd, tmtmtl30, toasterpm87, token, Tollhouse, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, Tornado-Technology, tosatur, TotallyLemon, truepaintgit, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, twoducksonnaplane, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, unusualcrow, Uriende, UristMcDorf, user424242420, v0idRift, Vaaankas, valentfingerov, Varen, Vasilis, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, Veritius, Vermidia, vero5123, Verslebas, vigersray, violet754, Visne, VividPups, vlados1408, VMSolidus, volotomite, volundr-, Vonsant, Voomra, Vordenburg, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, XavierSomething, xkreksx, xqzpop7, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, zelezniciar1, ZelteHonor, zero, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zymem, zzylex
diff --git a/Resources/Fonts/Grenze_Gotisch/GrenzeGotisch.ttf b/Resources/Fonts/Grenze_Gotisch/GrenzeGotisch.ttf
new file mode 100644
index 0000000000..3f93ccf31a
Binary files /dev/null and b/Resources/Fonts/Grenze_Gotisch/GrenzeGotisch.ttf differ
diff --git a/Resources/Fonts/Grenze_Gotisch/OFL.txt b/Resources/Fonts/Grenze_Gotisch/OFL.txt
new file mode 100644
index 0000000000..a726762d01
--- /dev/null
+++ b/Resources/Fonts/Grenze_Gotisch/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The Grenze Gotisch Project Authors (https://github.com/Omnibus-Type/Grenze-Gotisch)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/Resources/Fonts/LDFComicSans/LDFComicSans-Bold.ttf b/Resources/Fonts/LDFComicSans/LDFComicSans-Bold.ttf
new file mode 100644
index 0000000000..5bd2ad387d
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 0000000000..4da200d154
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 0000000000..d041f18981
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 0000000000..38b3abf939
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 0000000000..f979389d95
--- /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 0000000000..cd7f3547e0
Binary files /dev/null and b/Resources/Fonts/Only_You.otf differ
diff --git a/Resources/Fonts/Rubik_Dirt/OFL.txt b/Resources/Fonts/Rubik_Dirt/OFL.txt
new file mode 100644
index 0000000000..1a69de2a23
--- /dev/null
+++ b/Resources/Fonts/Rubik_Dirt/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The Rubik Filtered Project Authors (https://https://github.com/NaN-xyz/Rubik-Filtered)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/Resources/Fonts/Rubik_Dirt/RubikDirt.ttf b/Resources/Fonts/Rubik_Dirt/RubikDirt.ttf
new file mode 100644
index 0000000000..d3308a7f63
Binary files /dev/null and b/Resources/Fonts/Rubik_Dirt/RubikDirt.ttf differ
diff --git a/Resources/Fonts/Sriracha/OFL.txt b/Resources/Fonts/Sriracha/OFL.txt
new file mode 100644
index 0000000000..ca4dd03916
--- /dev/null
+++ b/Resources/Fonts/Sriracha/OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2015, Cadson Demak (info@cadsondemak.com), Copyright (c) 2014, Pablo Impallari (www.impallari.com|impallari@gmail.com)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/Resources/Fonts/Sriracha/Sriracha.ttf b/Resources/Fonts/Sriracha/Sriracha.ttf
new file mode 100644
index 0000000000..c74f555d3f
Binary files /dev/null and b/Resources/Fonts/Sriracha/Sriracha.ttf differ
diff --git a/Resources/Locale/en-US/_EE/accessories/human-facial-hair.ftl b/Resources/Locale/en-US/_EE/accessories/human-facial-hair.ftl
new file mode 100644
index 0000000000..8a031819bf
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/accessories/human-facial-hair.ftl
@@ -0,0 +1,10 @@
+marking-HumanFacialHairChin2 = Beard (Chinstrap 2)
+marking-HumanFacialHairSuperLong = Beard (Super Long)
+marking-HumanFacialHairShort = Beard (Short)
+marking-HumanFacialHairThick = Beard (Thick)
+marking-HumanFacialHairViking = Beard (Viking)
+marking-HumanFacialHairBristle = Beard (Bristle)
+marking-HumanFacialHairMoustacheWithStubble = Moustache (Stubble)
+marking-HumanFacialHairThickBristle = Beard (Thick Bristle)
+marking-HumanFacialHairHandlebar = Moustache (Handlebar 1)
+marking-HumanFacialHairHandlebar2 = Moustache (Handlebar 2)
diff --git a/Resources/Locale/en-US/_EE/accessories/human-hair.ftl b/Resources/Locale/en-US/_EE/accessories/human-hair.ftl
new file mode 100644
index 0000000000..65425ef753
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/accessories/human-hair.ftl
@@ -0,0 +1,13 @@
+marking-HumanHairArabicGathered = Arabic Gathered
+marking-HumanHairClassicHair = Classic Hair
+marking-HumanHairSideComb = Side Comb
+marking-HumanHairLong4 = Long Four
+marking-HumanHairManbun2 = Bun (Manbun 2)
+marking-HumanHairPigtailTajaran = Tajaran Pigtails
+marking-HumanHairShavedSide = Shaved Side
+marking-HumanHairShorthair8 = Short Hair 8
+marking-HumanFembun = Fembun
+marking-HumanHairAfricanPigtails = African Pigtails
+marking-HumanHairAfropuffDouble = Afropuff (Double)
+marking-HumanHairAfropuffLeft = Afropuff (Left)
+marking-HumanHairAfropuffRight = Afropuff (Right)
diff --git a/Resources/Locale/en-US/_EE/chat/chat-language.ftl b/Resources/Locale/en-US/_EE/chat/chat-language.ftl
new file mode 100644
index 0000000000..b4fdb10e1f
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/chat/chat-language.ftl
@@ -0,0 +1,3 @@
+chat-language-SiikMaas-name = Siik'maas
+chat-language-YaSsa-name = Ya'ssa
+chat-language-Delvahii-name = Delvahii
diff --git a/Resources/Locale/en-US/_EE/language/languages-sign.ftl b/Resources/Locale/en-US/_EE/language/languages-sign.ftl
new file mode 100644
index 0000000000..3beb2c37f1
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/language/languages-sign.ftl
@@ -0,0 +1,39 @@
+chat-sign-tajaran-language-message-wrap = [italic][BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] [BubbleContent]{$verb} [font="{$fontType}" size={$fontSize}][color={$color}]{$message}[/color][/font][/italic][/BubbleContent]
+chat-sign-tajaran-language-whisper-wrap = [italic][BubbleHeader][Name]{$entityName}[/Name][/BubbleHeader] [BubbleContent]subtly {$verb} [font="{$fontType}" size={$fontSize}][color={$color}]{$message}[/color][/font][/italic][/BubbleContent]
+
+# Did I ever tell you the definition of insanity?
+# Basically we have to get around the message formatter, and unless we decide to make an entire new system just for this language, we can't do anything else.
+chat-speech-verb-sign-nalrasan-1 = moves their tail
+chat-speech-verb-sign-nalrasan-2 = moves their tail briefly
+chat-speech-verb-sign-nalrasan-3 = moves their tail several times in quick succession
+
+chat-speech-verb-sign-nalrasan-4 = flicks their ears
+chat-speech-verb-sign-nalrasan-5 = flicks their ears a few times
+chat-speech-verb-sign-nalrasan-6 = flicks their ears several times in quick succession
+
+chat-speech-verb-sign-nalrasan-7 = swivels their ears
+chat-speech-verb-sign-nalrasan-8 = swivels their ears a few times
+chat-speech-verb-sign-nalrasan-9 = swivels their ears several times in quick succession
+chat-speech-verb-sign-nalrasan-10 = swivels their ears for a while
+
+chat-speech-verb-sign-nalrasan-11 = flicks their tail
+chat-speech-verb-sign-nalrasan-12 = flicks their tail a few times
+chat-speech-verb-sign-nalrasan-13 = flicks their tail several times in quick succession
+
+chat-speech-verb-sign-nalrasan-14 = shifts their ears and tail
+chat-speech-verb-sign-nalrasan-15 = shifts their ears and tail briefly
+chat-speech-verb-sign-nalrasan-16 = shifts their ears and tail for a while
+chat-speech-verb-sign-nalrasan-17 = shifts their ears and tail several times in quick succession
+
+# There has to be a better way
+
+chat-speech-verb-sign-siiktajr-1 = moves their tail and purrs out
+chat-speech-verb-sign-siiktajr-2 = moves their tail and mews
+chat-speech-verb-sign-siiktajr-3 = flicks their ears and meows
+chat-speech-verb-sign-siiktajr-4 = flicks their ears and mraows
+chat-speech-verb-sign-siiktajr-5 = swivels their ears and purrs out
+chat-speech-verb-sign-siiktajr-6 = swivels their ears and mews
+chat-speech-verb-sign-siiktajr-7 = flicks their tail and meows
+chat-speech-verb-sign-siiktajr-8 = flicks their tail and mraows
+chat-speech-verb-sign-siiktajr-9 = shifts their ears and tail and purrs out
+chat-speech-verb-sign-siiktajr-10 = shifts their ears and tail and mews
diff --git a/Resources/Locale/en-US/_EE/language/languages.ftl b/Resources/Locale/en-US/_EE/language/languages.ftl
new file mode 100644
index 0000000000..5d478b8562
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/language/languages.ftl
@@ -0,0 +1,19 @@
+language-SiikMaas-name = Siik'maas
+language-SiikMaas-description =
+ The ancient religious tongue of the Tajara, now the most widely spoken and taught language on Adhomai.
+
+language-NalRasan-name = Nal'rasan
+language-NalRasan-description =
+ A body-language-heavy dialect created by M'sai hunters for stealth, later adopted by rebels for covert communication during the Great War.
+
+language-SiikTajr-name = Siik'tajr
+language-SiikTajr-description =
+ A revolutionary language blending Siik'maas and Nal'rasan, designed for secrecy during the overthrow of the plutocracy and used heavily in the Great War.
+
+language-YaSsa-name = Ya'ssa
+language-YaSsa-description =
+ A refined Siik'maas dialect once spoken by Njarir nobility, revived by the New Kingdom of Adhomai after centuries of disuse.
+
+language-Delvahii-name = Delvahii
+language-Delvahii-description =
+ A Zhan-Khazan language tied to Ma'take worship, still used in religious rites and favored by farmers resisting government control.
diff --git a/Resources/Locale/en-US/_EE/markings/tajaran.ftl b/Resources/Locale/en-US/_EE/markings/tajaran.ftl
new file mode 100644
index 0000000000..ad787ea180
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/markings/tajaran.ftl
@@ -0,0 +1,69 @@
+marking-TajaranTorsoBelly = Chest Fur
+marking-TajaranTorsoBelly-belly = Fur
+marking-TajaranTorsoCrest = Chest Fur (Crest)
+marking-TajaranTorsoCrest-crest = Fur
+marking-TajaranTorsoFullBelly = Chest Fur (Full)
+marking-TajaranTorsoFullBelly-fullbelly = Fur
+marking-TajaranHeadMuzzle = Muzzle
+marking-TajaranHeadMuzzle-muzzle = Muzzle
+marking-TajaranHeadMuzzleLarge = Muzzle (Large)
+marking-TajaranHeadMuzzleLarge-muzzle_large = Muzzle
+marking-TajaranHeadNose = Nose
+marking-TajaranHeadNose-nose = Nose
+marking-TajaranHeadPatches = Patches
+marking-TajaranHeadPatches-patch = Patches
+marking-TajaranHeadPoints = Points
+marking-TajaranHeadPoints-points = Points
+marking-TajaranHeadTiger = Tiger
+marking-TajaranHeadTiger-tiger_face = Stripes
+marking-TajaranHeadTigerAlt = Tiger (Alternative)
+marking-TajaranHeadTigerAlt-tiger_head = Stripes
+marking-TajaranEarsRetro = Classic Ears
+marking-TajaranEarsRetro-ears = Ears
+marking-TajaranEarsRetroNear = Classic Ears (Alternative)
+marking-TajaranEarsRetroNear-ears_near = Ears
+marking-TajaranEarsSeparate = Classic Ears (Separated)
+marking-TajaranEarsSeparate-outears = Outer
+marking-TajaranEarsSeparate-inears = Inner
+marking-TajaranEarsSeparateNear = Classic Ears (Alternative, Separated)
+marking-TajaranEarsSeparateNear-outears_near = Outer
+marking-TajaranEarsSeparateNear-inears_near = Inner
+marking-TajaranTailAnim = Classic Tail (Animated)
+marking-TajaranTailAnim-tail_anim = Tail
+marking-TajaranTailAnimRings = Classic Tail (Animated, Rings)
+marking-TajaranTailAnimRings-tail_anim = Tail
+marking-TajaranTailAnimRings-tail_anim_rings = Rings
+marking-TajaranTailRetro = Classic Tail
+marking-TajaranTailRetro-tail = Tail
+marking-TajaranTailRetroRings = Classic Tail (Rings)
+marking-TajaranTailRetroRings-tail = Tail
+marking-TajaranTailRetroRings-tail_rings = Rings
+marking-TajaranOverlayPatch = Patches
+marking-TajaranOverlayPatch-patch = Patches
+marking-TajaranOverlayPoints = Points
+marking-TajaranOverlayPoints-points = Points
+marking-TajaranEarsBasic = Basic Ears
+marking-TajaranEarsBasic-basic_outer = Outer ear
+marking-TajaranEarsBasic-basic_inner = Inner ear
+marking-TajaranEarsCurled = Curled Ears
+marking-TajaranEarsCurled-curled_outer = Outer ear
+marking-TajaranEarsCurled-curled_inner = Inner ear
+marking-TajaranEarsDroopy = Droopy Ears
+marking-TajaranEarsDroopy-droopy_outer = Outer ear
+marking-TajaranEarsDroopy-droopy_inner = Inner ear
+marking-TajaranEarsFuzzy = Fuzzy Ears
+marking-TajaranEarsFuzzy-basic_outer = Outer ear
+marking-TajaranEarsFuzzy-fuzzy_inner = Ear fuzz
+marking-TajaranEarsStubby = Stubby Ears
+marking-TajaranEarsStubby-stubby_outer = Outer ear
+marking-TajaranEarsStubby-stubby_inner = Inner ear
+marking-TajaranEarsTall = Tall Ears
+marking-TajaranEarsTall-tall_outer = Outer ear
+marking-TajaranEarsTall-tall_inner = Inner ear
+marking-TajaranEarsTall-tall_fuzz = Ear fuzz
+marking-TajaranEarsTorn = Torn Ears
+marking-TajaranEarsTorn-torn_outer = Outer ear
+marking-TajaranEarsTorn-torn_inner = Inner ear
+marking-TajaranEarsWide = Wide Ears
+marking-TajaranEarsWide-wide_outer = Outer ear
+marking-TajaranEarsWide-wide_inner = Inner ear
diff --git a/Resources/Locale/en-US/_EE/species/species.ftl b/Resources/Locale/en-US/_EE/species/species.ftl
new file mode 100644
index 0000000000..a2433c2399
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/species/species.ftl
@@ -0,0 +1 @@
+species-name-tajaran = Tajaran
diff --git a/Resources/Locale/en-US/_EE/traits/traits.ftl b/Resources/Locale/en-US/_EE/traits/traits.ftl
new file mode 100644
index 0000000000..6a7fd47b2a
--- /dev/null
+++ b/Resources/Locale/en-US/_EE/traits/traits.ftl
@@ -0,0 +1,29 @@
+trait-name-SiikMaas = Siik'maas
+trait-description-SiikMaas =
+ Siik'maas is theorized to be the ancient religious tongue of the Tajara, once universally shared among them.
+ Though religious devotion waned over time, it became the lingua franca and remains the primary educational and most widely spoken language on Adhomai since the Migration Age.
+ Humans can learn to speak Siik'maas, as it relies less on body language than other Tajaran languages, but biological differences make certain inflections and subtle movements challenging, often resulting in slower, imprecise speech.
+
+trait-name-NalRasan = Nal'rasan (Tajara Sign Language)
+trait-description-NalRasan =
+ A body-focused language created by M'sai, Nal'rasan was developed to communicate discreetly between parties.
+ Because the mrowling and vocal expressions of Siik'maas could sometimes alert prey to hunter presence and drive them away, hunting parties adopted this language to prevent such a thing from occurring.
+ Rebel sects saw the use of this language and made use of it for covert discussions and the transmission of highly classified information before and during the Great War.
+
+trait-name-SiikTajr = Siik'tajr
+trait-description-SiikTajr =
+ Siik’tajr, unlike Siik’maas, is a modern language developed during the overthrow of the plutocracy to allow revolutionaries to communicate secretly.
+ Combining Siik’maas with the body-language-heavy Nal’rasan, it gained prominence during the Great War for covert operations.
+ While not commonly used in daily life due to its complexity, it remains a secondary language for many families with ties to the war.
+
+trait-name-YaSsa = Ya'ssa
+trait-description-YaSsa =
+ Ya'ssa is a dialect of Siik'maas, widely spoken by Njarir Tajara.
+ Presumed to be the traditional tongue of the nobility, it uses a more refined alphabet and speech pattern believed to have evolved from a less-used ancient dialect.
+ Hadii members have been recorded to still use Ya'ssa, though ultimately with the widespread annihilation of noble families, this language has fallen into disuse until its revival by the New Kingdom of Adhomai.
+
+trait-name-Delvahii = Delvahii
+trait-description-Delvahii =
+ Delvahhi is a language closely related to the Zhan-Khazan Tajara.
+ It is still widely used in religious ceremonies dedicated to Ma'take and amongst settlements comprised mostly of Zhan-Khazan.
+ It is also the favored language of farmers, who have adopted it in the wake of government intrusions into the agricultural industry of Adhomai.
diff --git a/Resources/Locale/en-US/_Goobstation/accessories/human-hair.ftl b/Resources/Locale/en-US/_Goobstation/accessories/human-hair.ftl
new file mode 100644
index 0000000000..fd1a3f05aa
--- /dev/null
+++ b/Resources/Locale/en-US/_Goobstation/accessories/human-hair.ftl
@@ -0,0 +1,33 @@
+marking-HumanHairBraidedExtension = Braided Extension
+marking-HumanHairCometTail = Comet Tail
+marking-HumanHairFantasyHair = Fantasy Hair
+marking-HumanHairFlatTwistsUpdo = Flat Twists Updo
+marking-HumanHairFloorlengthBraid = Floorlength Braid
+marking-HumanHairFloorlengthWavy = Floorlength Wavy
+marking-HumanHairFrizzyBraid = Frizzy Braid
+marking-HumanHairFrontBraidsLong = Front Braids Long
+marking-HumanHairFrontBraidsMedium = Front Braids Medium
+marking-HumanHairFrontBraidsShort = Front Braids Short
+marking-HumanHairHairnet = Hairnet
+marking-HumanHairJellyfish = Jellyfish
+marking-HumanHairKazuyaMishima = Kazuya Mishima
+marking-HumanHairLongBraids = Long Braids
+marking-HumanHairLongCurvy = Long Curvy
+marking-HumanHairLongPompadour = Long Pompadour
+marking-HumanHairMediumCurls = Medium Curls
+marking-HumanHairMullet = Mullet
+marking-HumanHairPelvicLengthBraid = Pelvic Length Braid
+marking-HumanHairPlateau = Plateau
+marking-HumanHairQueenBee = Queen Bee
+marking-HumanHairSaggedMohawk = Sagged Mohawk
+marking-HumanHairSharpMohawk = Sharp Mohawk
+marking-HumanHairShortAndPoofy = Short & Poofy
+marking-HumanHairShortCurls = Short Curls
+marking-HumanHairShoulderLengthBraid = Shoulder Length Braid
+marking-HumanHairSideSpike = Side Spike
+marking-HumanHairSpaceLoops = Space Loops
+marking-HumanHairStar = Star
+marking-HumanHairStarFro = Star Fro
+marking-HumanHairStyledCurls = Styled Curls
+marking-HumanHairUnkemptScientist = Unkempt Scientist
+marking-HumanHairWispy = Wispy
diff --git a/Resources/Locale/en-US/_Goobstation/alert-levels/alerts.ftl b/Resources/Locale/en-US/_Goobstation/alert-levels/alerts.ftl
new file mode 100644
index 0000000000..9c1b0c121f
--- /dev/null
+++ b/Resources/Locale/en-US/_Goobstation/alert-levels/alerts.ftl
@@ -0,0 +1,2 @@
+alerts-modsuit-power-name = [color=yellow]Modsuit Power[/color]
+alerts-modsuit-power-desc = Displays the current power level of your modsuit. Low power may affect suit functionality.
diff --git a/Resources/Locale/en-US/_Goobstation/clothing/sealable-clothing-component.ftl b/Resources/Locale/en-US/_Goobstation/clothing/sealable-clothing-component.ftl
new file mode 100644
index 0000000000..e9c7ffe84b
--- /dev/null
+++ b/Resources/Locale/en-US/_Goobstation/clothing/sealable-clothing-component.ftl
@@ -0,0 +1,23 @@
+sealable-clothing-equipment-not-toggled = Deploy all parts first!
+sealable-clothing-equipment-seal-failed = Sealing failed!
+sealable-clothing-seal-verb = Toggle Seals
+
+sealable-clothing-seal-up = The {$partName} is sealing
+sealable-clothing-seal-up-helmet = The {$partName} hisses as it closes.
+sealable-clothing-seal-up-gauntlets = The {$partName} tightens around your fingers and wrists.
+sealable-clothing-seal-up-chestplate = The {$partName} clenches tightly around your chest.
+sealable-clothing-seal-up-boots = The {$partName} seals around your feet.
+
+sealable-clothing-seal-down = The {$partName} is unsealing
+sealable-clothing-seal-down-helmet = The {$partName} hisses open.
+sealable-clothing-seal-down-gauntlets = The {$partName} become loose around your fingers.
+sealable-clothing-seal-down-chestplate = The {$partName} releases your chest.
+sealable-clothing-seal-down-boots= The {$partName} relaxes its grip on your legs.
+
+sealable-clothing-sealed-process-toggle-fail = Suit is already shutting down!
+sealable-clothing-unsealed-process-toggle-fail = Suit is already starting up!
+sealable-clothing-sealed-toggle-fail = Deactivate the suit first!
+
+sealable-clothing-not-powered = Suit is not powered!
+sealable-clothing-open-sealed-panel-fail = Wiring panel is too tightly sealed!
+sealable-clothing-close-panel-first = Close the wiring panel first!
diff --git a/Resources/Locale/en-US/_Goobstation/forensics/fibers.ftl b/Resources/Locale/en-US/_Goobstation/forensics/fibers.ftl
new file mode 100644
index 0000000000..e3cc656b7c
--- /dev/null
+++ b/Resources/Locale/en-US/_Goobstation/forensics/fibers.ftl
@@ -0,0 +1 @@
+fibers-modular = modular
diff --git a/Resources/Locale/en-US/_Goobstation/lathe/lathe-categories.ftl b/Resources/Locale/en-US/_Goobstation/lathe/lathe-categories.ftl
index c72f9b46fe..8d7f0f63b3 100644
--- a/Resources/Locale/en-US/_Goobstation/lathe/lathe-categories.ftl
+++ b/Resources/Locale/en-US/_Goobstation/lathe/lathe-categories.ftl
@@ -8,3 +8,4 @@ lathe-category-mechs-gygax = Gygax
lathe-category-mechs-durand = Durand
lathe-category-mechs-equipment = Mech equipment
lathe-category-mechs-weapons = Mech weapons
+lathe-category-modsuit = MOD Suits
diff --git a/Resources/Locale/en-US/_Goobstation/markings/wings.ftl b/Resources/Locale/en-US/_Goobstation/markings/wings.ftl
new file mode 100644
index 0000000000..52ca1c8855
--- /dev/null
+++ b/Resources/Locale/en-US/_Goobstation/markings/wings.ftl
@@ -0,0 +1,4 @@
+markings-category-Wings = Wings
+
+marking-WingsRobotic = Robotic Wings
+marking-WingsRobotic-robotic = Robotic Wings
diff --git a/Resources/Locale/en-US/_Goobstation/research/technologies.ftl b/Resources/Locale/en-US/_Goobstation/research/technologies.ftl
index 31a8640b24..ba68b2494c 100644
--- a/Resources/Locale/en-US/_Goobstation/research/technologies.ftl
+++ b/Resources/Locale/en-US/_Goobstation/research/technologies.ftl
@@ -6,3 +6,4 @@ research-technology-gygax = Gygax
research-technology-durand = Durand
research-technology-explosive-mech-ammunition = Explosive Mech Ammunition
research-technology-honk-weapons = Bananium Weapons
+research-technology-modsuits = Modular Technologies
diff --git a/Resources/Locale/en-US/abilities/chitinid.ftl b/Resources/Locale/en-US/abilities/chitinid.ftl
new file mode 100644
index 0000000000..e2e10c0eb4
--- /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/accessories/human-facial-hair.ftl b/Resources/Locale/en-US/accessories/human-facial-hair.ftl
index cd8865d02f..7b94d45503 100644
--- a/Resources/Locale/en-US/accessories/human-facial-hair.ftl
+++ b/Resources/Locale/en-US/accessories/human-facial-hair.ftl
@@ -1,6 +1,6 @@
marking-HumanFacialHairAbe = Beard (Abraham Lincoln)
marking-HumanFacialHairBrokenman = Beard (Broken Man)
-marking-HumanFacialHairChin = Beard (Chinstrap)
+marking-HumanFacialHairChin = Beard (Chinstrap 1)
marking-HumanFacialHairDwarf = Beard (Dwarf)
marking-HumanFacialHairFullbeard = Beard (Full)
marking-HumanFacialHairCroppedfullbeard = Beard (Cropped Fullbeard)
diff --git a/Resources/Locale/en-US/accessories/human-hair.ftl b/Resources/Locale/en-US/accessories/human-hair.ftl
index c327356da2..3b2f00f288 100644
--- a/Resources/Locale/en-US/accessories/human-hair.ftl
+++ b/Resources/Locale/en-US/accessories/human-hair.ftl
@@ -31,7 +31,7 @@ marking-HumanHairBun = Bun Head
marking-HumanHairBunhead2 = Bun Head 2
marking-HumanHairBun3 = Bun Head 3
marking-HumanHairLargebun = Bun (Large)
-marking-HumanHairManbun = Bun (Manbun)
+marking-HumanHairManbun = Bun (Manbun 1)
marking-HumanHairTightbun = Bun (Tight)
marking-HumanHairBusiness = Business Hair
marking-HumanHairBusiness2 = Business Hair 2
@@ -45,6 +45,8 @@ marking-HumanHairClassicBusiness = Classic Business Hair
marking-HumanHairClassicCia = Classic CIA
marking-HumanHairClassicCornrows2 = Classic Cornrows 2
marking-HumanHairClassicFloorlengthBedhead = Classic Floorlength Bedhead
+marking-HumanHairClassicLong2 = Classic Long Hair 2
+marking-HumanHairClassicLong3 = Classic Long Hair 3
marking-HumanHairClassicModern = Classic Modern
marking-HumanHairClassicMulder = Classic Mulder
marking-HumanHairClassicWisp = Classic Wisp
@@ -95,10 +97,10 @@ marking-HumanHairJensen = Jensen Hair
marking-HumanHairJoestar = Joestar
marking-HumanHairKeanu = Keanu Hair
marking-HumanHairKusanagi = Kusanagi Hair
+marking-HumanHairLongBow = Long Bow
marking-HumanHairLong = Long Hair 1
marking-HumanHairLong2 = Long Hair 2
marking-HumanHairLong3 = Long Hair 3
-marking-HumanHairLongBow = Long (Bow)
marking-HumanHairLongWithBundles = Long With Bundles
marking-HumanHairLongovereye = Long Over Eye
marking-HumanHairLbangs = Long Bangs
@@ -144,8 +146,10 @@ marking-HumanHairSidetail3 = Ponytail (Side) 3
marking-HumanHairSidetail4 = Ponytail (Side) 4
marking-HumanHairSpikyponytail = Ponytail (Spiky)
marking-HumanHairPoofy = Poofy
+marking-HumanHairPulato = Pulato
marking-HumanHairQuiff = Quiff
marking-HumanHairRonin = Ronin
+marking-HumanHairShaped = Shaped
marking-HumanHairShaved = Shaved
marking-HumanHairShavedpart = Shaved Part
marking-HumanHairShortbangs = Short Bangs
diff --git a/Resources/Locale/en-US/alerts/alerts.ftl b/Resources/Locale/en-US/alerts/alerts.ftl
index 7522784713..3babbb6c1a 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/emotes.ftl b/Resources/Locale/en-US/chat/emotes.ftl
index 44fca6a006..d3f423af43 100644
--- a/Resources/Locale/en-US/chat/emotes.ftl
+++ b/Resources/Locale/en-US/chat/emotes.ftl
@@ -45,7 +45,7 @@ chat-emote-name-vulpbark = Bark
chat-emote-name-vulpsnarl = Snarl
chat-emote-name-vulpwhine = Whine
chat-emote-name-vulphowl = Howl
-# Felinid
+# Felinid / Tajaran
chat-emote-name-meow = Meow
chat-emote-name-mew = Mew
chat-emote-name-purr = Purr
diff --git a/Resources/Locale/en-US/chat/managers/chat-language.ftl b/Resources/Locale/en-US/chat/managers/chat-language.ftl
index e7801a30c9..aeab804d1b 100644
--- a/Resources/Locale/en-US/chat/managers/chat-language.ftl
+++ b/Resources/Locale/en-US/chat/managers/chat-language.ftl
@@ -12,11 +12,13 @@ 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-ScugSign-name = Scug Sign
chat-language-Arachnic-name = Arachnic
+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 1513f56942..a1868316c2 100644
--- a/Resources/Locale/en-US/chat/managers/chat-manager.ftl
+++ b/Resources/Locale/en-US/chat/managers/chat-manager.ftl
@@ -117,10 +117,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 aff0cfac66..9631801a44 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 24f524081e..0b7d485daf 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/clothing/components/toggleable-clothing-component.ftl b/Resources/Locale/en-US/clothing/components/toggleable-clothing-component.ftl
index 746eea4a28..a7d08623f4 100644
--- a/Resources/Locale/en-US/clothing/components/toggleable-clothing-component.ftl
+++ b/Resources/Locale/en-US/clothing/components/toggleable-clothing-component.ftl
@@ -1,3 +1,6 @@
toggle-clothing-verb-text = Toggle {CAPITALIZE($entity)}
toggleable-clothing-remove-first = You have to unequip {$entity} first.
+toggleable-clothing-remove-all-attached-first = You have to unequip all toggled clothing first.
+toggleable-clothing-attach-tooltip = Equip
+toggleable-clothing-unattach-tooltip = Unequip
diff --git a/Resources/Locale/en-US/deltav/accessories/hair.ftl b/Resources/Locale/en-US/deltav/accessories/hair.ftl
index 7fbfc78629..024606ea44 100644
--- a/Resources/Locale/en-US/deltav/accessories/hair.ftl
+++ b/Resources/Locale/en-US/deltav/accessories/hair.ftl
@@ -7,6 +7,4 @@ marking-HumanHairClassicLowFade = Fade (Low, Classic)
marking-HumanHairClassicMedFade = Fade (Medium, Classic)
marking-HumanHairClassicOmbre = Ombre Classic
marking-HumanHairClassicCrewcut = Crewcut Classic
-marking-HumanHairClassicLong = Long 1 (Classic)
-marking-HumanHairClassicLong2 = Long 2 (Classic)
-marking-HumanHairClassicLong3 = Long 3 (Classic)
+marking-HumanHairClassicLong = Classic Long Hair 1
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 b1ff73f9a8..f58ade59f6 100644
--- a/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl
+++ b/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl
@@ -21,3 +21,9 @@ chat-speech-verb-rodentia-1 = squeaks
chat-speech-verb-rodentia-2 = pieps
chat-speech-verb-rodentia-3 = chatters
chat-speech-verb-rodentia-4 = squeals
+
+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 0000000000..be5ae5896a
--- /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 0000000000..0c557dbb0c
--- /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 439f76f040..db6529ec65 100644
--- a/Resources/Locale/en-US/deltav/species/species.ftl
+++ b/Resources/Locale/en-US/deltav/species/species.ftl
@@ -3,3 +3,4 @@
species-name-vulpkanin = Vulpkanin
species-name-harpy = Harpy
species-name-rodentia = Rodentia
+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 0000000000..e69de29bb2
diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
index 0971159f50..66cf2d9429 100644
--- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
+++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
@@ -19,6 +19,7 @@ ui-options-general-discord = Discord
ui-options-general-cursor = Cursor
ui-options-general-speech = Speech
ui-options-general-storage = Storage
+ui-options-general-other = Other
ui-options-general-accessibility = Accessibility
ui-options-chatstack = Automatically merge identical chat messages
ui-options-chatstack-off = Off
@@ -159,6 +160,7 @@ ui-options-function-save-item-location = Save item location
ui-options-function-toggle-standing = Toggle standing
ui-options-function-toggle-crawling-under = Toggle crawling under furniture
ui-options-static-storage-ui = Lock storage window to hotbar
+ui-options-modern-progress-bar = Modern progress bar
ui-options-function-smart-equip-backpack = Smart-equip to backpack
ui-options-function-smart-equip-belt = Smart-equip to belt
@@ -295,4 +297,4 @@ cmd-options-help = Usage: options [tab]
## Combat Options
ui-options-function-look-up = Look up/Take aim
ui-options-function-auto-get-up = Automatically get up after falling
-ui-options-function-hold-look-up = Hold down the key to aim
\ No newline at end of file
+ui-options-function-hold-look-up = Hold down the key to aim
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 0000000000..f721e3ff01
--- /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 0000000000..c94ffdba16
--- /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 c22e245562..4819b03ff8 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/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl
index aced542aaf..bf7cd7c1a7 100644
--- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl
+++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl
@@ -73,6 +73,8 @@ petting-success-derelict-cyborg = You pet {THE($target)} on {POSS-ADJ($target)}
petting-success-recycler = You pet {THE($target)} on {POSS-ADJ($target)} mildly threatening steel exterior.
petting-success-station-ai = You pet {THE($target)} on {POSS-ADJ($target)} cold, square screen.
petting-success-gladiabot = You pet {THE($target)} on {POSS-ADJ($target)} vicious cardboard head.
+petting-success-batonbot = You pet {THE($target)} on {POSS-ADJ($target)} protective metal head.
+petting-success-disablerbot = You pet {THE($target)} on {POSS-ADJ($target)} protective metal head.
petting-failure-honkbot = You reach out to pet {THE($target)}, but {SUBJECT($target)} honks in refusal!
petting-failure-cleanbot = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy mopping!
@@ -89,6 +91,8 @@ petting-failure-syndicate-cyborg = You reach out to pet {THE($target)}, but {POS
petting-failure-derelict-cyborg = You reach out to pet {THE($target)}, but {POSS-ADJ($target)} rusty and jagged exterior makes you reconsider.
petting-failure-station-ai = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BASIC($target, "zap", "zaps")} your hand away.
petting-failure-gladiabot = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} only wants to fight!
+petting-failure-batonbot = You reach out to pet {THE($target)}, but {SUBJECT($target)} nearly prods you with its baton!
+petting-failure-disablerbot = You reach out to pet {THE($target)}, but {SUBJECT($target)} angrily waves its weapon at you!
petting-success-station-ai-others = { CAPITALIZE(THE($user)) } pets {THE($target)} on {POSS-ADJ($target)} cold, square screen.
diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl
index 4564708e4e..78ffaf19ca 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 409691f577..69c7a9e7be 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/species.ftl b/Resources/Locale/en-US/loadouts/generic/species.ftl
new file mode 100644
index 0000000000..943ddbf3c2
--- /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 b05a926935..1fcf270f29 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 eda9f3b898..e6041a1b7a 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/loadouts/items.ftl b/Resources/Locale/en-US/loadouts/items.ftl
index f107823447..72d8275022 100644
--- a/Resources/Locale/en-US/loadouts/items.ftl
+++ b/Resources/Locale/en-US/loadouts/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/markings/face.ftl b/Resources/Locale/en-US/markings/face.ftl
index 50fb935bef..e50803dffd 100644
--- a/Resources/Locale/en-US/markings/face.ftl
+++ b/Resources/Locale/en-US/markings/face.ftl
@@ -90,3 +90,6 @@ marking-FaceNeckSlimThick-neck_thick_f = Neck Cover (Slim Thick)
marking-FaceNeckWideThick = Neck Cover (Wide Thick)
marking-FaceNeckWideThick-neck_thick_m = Neck Cover (Wide Thick)
+
+marking-IronJaw = Iron Jaw
+marking-IronJaw-iron_jaw = Iron Jaw
diff --git a/Resources/Locale/en-US/markings/gauze.ftl b/Resources/Locale/en-US/markings/gauze.ftl
index f8bedc3195..7ed35a90ba 100644
--- a/Resources/Locale/en-US/markings/gauze.ftl
+++ b/Resources/Locale/en-US/markings/gauze.ftl
@@ -46,6 +46,9 @@ marking-GauzeUpperLegRight = Gauze Thigh Wrap (Right)
marking-GauzeBlindfold-gauze_blindfold = Gauze Blindfold
marking-GauzeBlindfold = Gauze Blindfold
+marking-GauzeHead-gauze_head = Gauze Head Wrap
+marking-GauzeHead = Gauze Head Wrap
+
marking-GauzeLizardBlindfold-gauze_lizard_blindfold = Gauze Blindfold
marking-GauzeLizardBlindfold = Gauze Blindfold
diff --git a/Resources/Locale/en-US/markings/plasmaman_wings.ftl b/Resources/Locale/en-US/markings/plasmaman_wings.ftl
new file mode 100644
index 0000000000..af5b56b28c
--- /dev/null
+++ b/Resources/Locale/en-US/markings/plasmaman_wings.ftl
@@ -0,0 +1,2 @@
+marking-WingsSkeleton = Skeleton Wings
+marking-WingsSkeleton-skeleton = Skeleton Wings
diff --git a/Resources/Locale/en-US/metabolism/metabolizer-types.ftl b/Resources/Locale/en-US/metabolism/metabolizer-types.ftl
index d0f57e2bc0..97d5c068c4 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 aa348ce627..213fbb7443 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 0000000000..04d705ae49
--- /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 bfebc705c5..6ffc9ac2bd 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 0dcbc1ba66..523d37c839 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 90cb0031fb..b779bded0b 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 00abe7bea6..b0cbf85773 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.
@@ -328,7 +331,7 @@ trait-description-Clumsy =
trait-name-Small = Small
trait-description-Small =
You are much smaller than a typical person, and can climb into spaces others would not normally be able to fit into, such as duffel bags.
- This trait does not in any way modify your character's size, it merely requires that your character be at most the size of a standard Felinid.
+ This trait does not in any way modify your character's size, it merely requires that your character be at most the size of a standard Tajaran.
trait-name-TemperatureTolerance = Temperature Tolerance
trait-description-TemperatureTolerance =
diff --git a/Resources/Maps/glacier.yml b/Resources/Maps/glacier.yml
index b19e3c64f4..caa8e3c48f 100644
--- a/Resources/Maps/glacier.yml
+++ b/Resources/Maps/glacier.yml
@@ -46154,7 +46154,7 @@ entities:
occludes: True
ents:
- 6158
- toggleable-clothing: !type:ContainerSlot
+ toggleable-clothing: !type:Container
showEnts: False
occludes: True
ent: null
diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml
index 0a57157f1b..5014263a81 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 f391a3cf22..759fe70423 100644
--- a/Resources/Prototypes/Alerts/alerts.yml
+++ b/Resources/Prototypes/Alerts/alerts.yml
@@ -8,6 +8,7 @@
- category: Mood
- category: Stamina
- alertType: SuitPower
+ - alertType: ModsuitPower # Goobstation - Modsuits
- category: Internals
- alertType: Fire
- alertType: Handcuffed
@@ -54,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
@@ -617,4 +636,4 @@
- sprite: /Textures/Interface/Alerts/deflecting.rsi
state: deflecting0
name: alerts-deflecting-name
- description: alerts-deflecting-desc
\ No newline at end of file
+ description: alerts-deflecting-desc
diff --git a/Resources/Prototypes/Body/Organs/plasmaman.yml b/Resources/Prototypes/Body/Organs/plasmaman.yml
new file mode 100644
index 0000000000..fa69a490ea
--- /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 0000000000..2fdec53085
--- /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 0000000000..a41ad0802a
--- /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 c04e49f413..55645819c2 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 d267ddb2ed..7380198183 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/cargo.yml b/Resources/Prototypes/Catalog/Fills/Crates/cargo.yml
index 29de9f67a4..0af3bba5ae 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/cargo.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/cargo.yml
@@ -331,6 +331,9 @@
- id: PlushieTabi # TheDen
prob: 0.01
orGroup: Plushies
+ - id: PlushieJenn # TheDen
+ prob: 0.01
+ orGroup: Plushies
#useful
- id: AmeJar
prob: 0.01
@@ -440,4 +443,4 @@
orGroup: NotUseful
- id: WeakKudzu
prob: 0.01
- orGroup: NotUseful
\ No newline at end of file
+ orGroup: NotUseful
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml b/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml
index 9532fbf74e..1d9d92da01 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/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml
index c4e59f452f..f9b92a77f8 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml
@@ -73,6 +73,8 @@
id: PlushieAlice
- !type:EntSelector
id: PlushieTabi
+ - !type:EntSelector
+ id: PlushieJenn
- type: entity
id: CrateFunPlushie
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml b/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml
index ba97af3925..82f5bd6aa6 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 58a49aa6e9..5b96ba96d8 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 2cf1354c14..379de235fc 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 f022b4b9a5..239fa324b5 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 fce18024a7..7dbcce131b 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 e70e93732f..b0b7810e19 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 ca196b3ec0..64e3eba5aa 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 d679deee4c..0554567366 100644
--- a/Resources/Prototypes/CharacterItemGroups/Generic/gloveGroup.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Generic/gloveGroup.yml
@@ -33,3 +33,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 73dc17449b..4c8527858a 100644
--- a/Resources/Prototypes/CharacterItemGroups/Generic/itemGroups.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Generic/itemGroups.yml
@@ -361,3 +361,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/languageGroups.yml b/Resources/Prototypes/CharacterItemGroups/Generic/languageGroups.yml
index c8beb22b39..05267c4e1a 100644
--- a/Resources/Prototypes/CharacterItemGroups/Generic/languageGroups.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Generic/languageGroups.yml
@@ -41,6 +41,18 @@
id: Marish
- type: trait
id: Mouse
+ - type: trait
+ id: Azaziba
+ - type: trait
+ id: SiikMaas
+ - type: trait
+ id: NalRasan
+ - type: trait
+ id: SiikTajr
+ - type: trait
+ id: YaSsa
+ - type: trait
+ id: Delvahii
- type: characterItemGroup
id: TraitsAccents
diff --git a/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml b/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml
index cc1e82ceb6..b08afa9252 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 3bd4172dd2..aca3f2e5fc 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 c2aa975be5..4912033f6d 100644
--- a/Resources/Prototypes/CharacterItemGroups/Jobs/Security/uncategorized.yml
+++ b/Resources/Prototypes/CharacterItemGroups/Jobs/Security/uncategorized.yml
@@ -234,3 +234,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 80f69893c6..3812613584 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 3cc2bb4fd7..86a6fab9c5 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 0000000000..3e12b9e379
--- /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
index 560b6020dc..3be0c99023 100644
--- a/Resources/Prototypes/DeltaV/Actions/types.yml
+++ b/Resources/Prototypes/DeltaV/Actions/types.yml
@@ -9,3 +9,15 @@
icon: DeltaV/Interface/Actions/mouthStorageOpen.png
event: !type:OpenStorageImplantEvent
+- 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
diff --git a/Resources/Prototypes/DeltaV/Body/Organs/chitinid.yml b/Resources/Prototypes/DeltaV/Body/Organs/chitinid.yml
new file mode 100644
index 0000000000..38a0e0b221
--- /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 0000000000..507ba70f48
--- /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 0000000000..18428a67a6
--- /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 4e1cfaeec0..22cdd202d1 100644
--- a/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml
+++ b/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml
@@ -17,3 +17,12 @@
Blunt: 1.3
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
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 0000000000..be91ea3150
--- /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 0000000000..355f5cffb9
--- /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/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml
index 6e9913aa11..f39a0598f2 100644
--- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml
@@ -28,17 +28,9 @@
description: ghost-role-information-listeningop-description
rules: ghost-role-information-listeningop-rules
requirements: # Worth considering these numbers for the goal of making sure someone willing to MRP takes this.
- - !type:CharacterOverallTimeRequirement
- min: 259200 # 72 hours
- !type:CharacterDepartmentTimeRequirement
department: Security
min: 40000 # 11.1 hours
- - !type:CharacterDepartmentTimeRequirement
- department: Civilian
- min: 40000 # 11.1 hours
- - !type:CharacterDepartmentTimeRequirement
- department: Command
- min: 40000 # 11.1 hours
- type: GhostRoleMobSpawner
prototype: MobHumanSyndicateListener
- type: Sprite
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 0000000000..a8644a4e07
--- /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/Customization/Markings/felinid.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/felinid.yml
index f11b7f04d4..b50ca1d77e 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/felinid.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/felinid.yml
@@ -2,7 +2,7 @@
id: FelinidFluffyTailRings
bodyPart: Tail
markingCategory: Tail
- speciesRestriction: [Felinid, Human, IPC]
+ speciesRestriction: [Felinid, Human, IPC, Tajaran]
sprites:
- sprite: DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi
state: Felinid_fluffy_tail_full
@@ -13,7 +13,7 @@
id: FelinidFluffyTail
bodyPart: Tail
markingCategory: Tail
- speciesRestriction: [Felinid, Human, IPC]
+ speciesRestriction: [Felinid, Human, IPC, Tajaran]
sprites:
- sprite: DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi
state: Felinid_fluffy_tail_full
@@ -22,7 +22,7 @@
id: FelinidAlternativeTail
bodyPart: Tail
markingCategory: Tail
- speciesRestriction: [Felinid, Human, IPC]
+ speciesRestriction: [Felinid, Human, IPC, Tajaran]
sprites:
- sprite: DeltaV/Mobs/Customization/Felinid/alternative_tail.rsi
state: m_waggingtail_cat_FRONT
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/hair.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/hair.yml
index 51cba35429..c929b854ff 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/hair.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/hair.yml
@@ -77,19 +77,3 @@
sprites:
- sprite: DeltaV/Mobs/Customization/hair.rsi
state: classic_long
-
-- type: marking
- id: HumanHairClassicLong2
- bodyPart: Hair
- markingCategory: Hair
- sprites:
- - sprite: DeltaV/Mobs/Customization/hair.rsi
- state: classic_long2
-
-- type: marking
- id: HumanHairClassicLong3
- bodyPart: Hair
- markingCategory: Hair
- sprites:
- - sprite: DeltaV/Mobs/Customization/hair.rsi
- state: classic_long3
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 0000000000..4c8a784731
--- /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 0000000000..2dfd110184
--- /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/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
index 8f031b05f8..824171e99a 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
@@ -167,9 +167,8 @@
animation: WeaponArcBite
damage:
types:
- Piercing: 1
- Poison: 2
- Asphyxiation: 2
+ Piercing: 2
+ Poison: 3
- type: SolutionContainerManager
solutions:
melee:
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 0000000000..1e66d4295c
--- /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
index 6e797ce715..7c8ac56c9b 100644
--- a/Resources/Prototypes/DeltaV/Guidebook/species.yml
+++ b/Resources/Prototypes/DeltaV/Guidebook/species.yml
@@ -2,3 +2,8 @@
id: Rodentia
name: species-name-rodentia
text: "/ServerInfo/Guidebook/Mobs/DeltaV/Rodentia.xml"
+
+- type: guideEntry
+ id: Chitinid
+ name: species-name-chitinid
+ text: "/ServerInfo/Guidebook/Mobs/DeltaV/Chitinid.xml"
diff --git a/Resources/Prototypes/DeltaV/Objectives/traitor.yml b/Resources/Prototypes/DeltaV/Objectives/traitor.yml
index 1ad03ea98f..7b7c81f153 100644
--- a/Resources/Prototypes/DeltaV/Objectives/traitor.yml
+++ b/Resources/Prototypes/DeltaV/Objectives/traitor.yml
@@ -43,3 +43,34 @@
- type: StealCondition
stealGroup: BoxFolderRdClipboard
# owner: job-name-rd
+
+# 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
diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Cargo/courier.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Cargo/courier.yml
index 6785e74acb..0b8a4bd11f 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 a69af3353d..03efbd1755 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
+
+- 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 db5e717a01..af0bca2ea0 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 448c6542bb..2f6a0ca578 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml
@@ -37,6 +37,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 c2032b67eb..7e4a2ebff0 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 7dab2af005..48c18b8457 100644
--- a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml
+++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml
@@ -18,6 +18,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 802ef248f2..ea2bbe305a 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 0000000000..6fa19aa9fe
--- /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 0692dbebc8..134d5b5b02 100644
--- a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml
+++ b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml
@@ -218,3 +218,33 @@
collection: Weh
Squeak:
path: /Audio/Animals/mouse_squeak.ogg
+ Hiss:
+ path: /Audio/Animals/snake_hiss.ogg
+
+- 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
diff --git a/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml b/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml
index 89db03d2fc..0d6a3b7e0e 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 a712223b1d..e5c4b72724 100644
--- a/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml
+++ b/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml
@@ -33,3 +33,12 @@
- chat-speech-verb-rodentia-2
- chat-speech-verb-rodentia-3
- chat-speech-verb-rodentia-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
diff --git a/Resources/Prototypes/DeltaV/typing_indicator.yml b/Resources/Prototypes/DeltaV/typing_indicator.yml
index 42cf895bd6..7085e0fcb4 100644
--- a/Resources/Prototypes/DeltaV/typing_indicator.yml
+++ b/Resources/Prototypes/DeltaV/typing_indicator.yml
@@ -9,3 +9,9 @@
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
diff --git a/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml b/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml
index 02cf0ab6f6..a00bab327d 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 0000000000..656bae9e95
--- /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 08a3eb568f..4d791e018e 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 0000000000..e051018950
--- /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/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml
index 795984bb45..20c42b5a43 100644
--- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml
+++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml
@@ -22,6 +22,7 @@
- type: Tag
tags:
- WhitelistChameleon
+ - ClothingHeadHelmetBasic
#Mercenary Helmet
- type: entity
diff --git a/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml b/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml
index f02dc068da..84b3df4590 100644
--- a/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml
+++ b/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml
@@ -8,7 +8,7 @@
sprite: Clothing/Neck/Cloaks/centcomcloakformal.rsi
- type: StealTarget
stealGroup: HeadCloak # leaving this here because I suppose it might be interesting?
-
+
- type: entity
parent: ClothingNeckBase
id: ClothingNeckCloakCap
@@ -159,7 +159,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
- type: entity
parent: ClothingNeckBase
@@ -185,7 +185,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
- type: TypingIndicatorClothing
proto: moth
@@ -287,4 +287,4 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
\ No newline at end of file
+ toggleable-clothing: !type:Container {}
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml
index 1d938911a1..74561ef197 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml
@@ -120,7 +120,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
storagebase: !type:Container
ents: []
@@ -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
@@ -155,7 +167,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
- type: GroupExamine
- type: Tag
tags:
@@ -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
@@ -242,7 +268,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
storagebase: !type:Container
ents: []
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
index a9bb8f1dc7..4696e6d8e3 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/OuterClothing/softsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml
index 66718d519b..bc3a8c84ff 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml
@@ -58,7 +58,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
#Prisoner EVA
- type: entity
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml
index 96caf94717..9bbd9008a2 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml
@@ -144,7 +144,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
- type: ClothingRequiredStepTriggerImmune
slots: WITHOUT_POCKET
- type: Tag
@@ -251,7 +251,7 @@
sprite: Clothing/OuterClothing/Suits/monkey.rsi
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
- type: ClothingRequiredStepTriggerImmune
slots: WITHOUT_POCKET
- type: Tag
@@ -274,7 +274,7 @@
clothingPrototype: ClothingHeadHatHoodIan
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
- type: Construction
graph: ClothingOuterSuitIan
node: suit
@@ -297,7 +297,7 @@
clothingPrototype: ClothingHeadHatHoodCarp
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
- type: entity
parent: ClothingOuterSuitCarp
@@ -321,4 +321,4 @@
- type: Sprite
sprite: Clothing/OuterClothing/Suits/witchrobe.rsi
- type: Clothing
- sprite: Clothing/OuterClothing/Suits/witchrobe.rsi
\ No newline at end of file
+ sprite: Clothing/OuterClothing/Suits/witchrobe.rsi
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml
index 199ce2d056..d932427a50 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml
@@ -45,7 +45,7 @@
slot: head
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot {}
+ toggleable-clothing: !type:Container {}
storagebase: !type:Container
ents: []
diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml
index cea803d104..b10a1c95e6 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 0000000000..04fae7ee00
--- /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 0f3fab0e87..556347f0d9 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 794d0fb90c..90ea582271 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/Markers/Spawners/bots.yml b/Resources/Prototypes/Entities/Markers/Spawners/bots.yml
index 9f0823f48e..c5241673a1 100644
--- a/Resources/Prototypes/Entities/Markers/Spawners/bots.yml
+++ b/Resources/Prototypes/Entities/Markers/Spawners/bots.yml
@@ -26,3 +26,30 @@
prototypes:
- MobCleanBot
+- type: entity
+ name: disablerbot spawner
+ id: SpawnMobDisablerBot
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: green
+ - sprite: Mobs/Silicon/Bots/disablerbot.rsi
+ state: disablerbot
+ - type: ConditionalSpawner
+ prototypes:
+ - MobDisablerBot
+
+- type: entity
+ name: batonbot spawner
+ id: SpawnMobBatonBot
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: green
+ - sprite: Mobs/Silicon/Bots/batonbot.rsi
+ state: batonbot
+ - type: ConditionalSpawner
+ prototypes:
+ - MobBatonBot
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml
index eb1723eb23..042726ad11 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml
@@ -418,3 +418,17 @@
sprites:
- sprite: Mobs/Customization/face.rsi
state: neck_thick_m
+
+- type: marking
+ id: IronJaw
+ bodyPart: Face
+ markingCategory: Face
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
+ coloring:
+ default:
+ type:
+ !type:EyeColoring
+ negative: true
+ sprites:
+ - sprite: _ADT/Mobs/Customization/augments/headaugs.rsi
+ state: iron_jaw
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml
index b5219e0ab7..ae8da472ce 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml
@@ -2,7 +2,7 @@
id: GauzeLefteyePatch
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Harpy, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -16,7 +16,7 @@
id: GauzeLefteyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Harpy, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -30,7 +30,7 @@
id: GauzeRighteyePatch
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Harpy, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -44,7 +44,7 @@
id: GauzeRighteyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Harpy, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -58,7 +58,7 @@
id: GauzeBlindfold
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Harpy, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Harpy, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -72,7 +72,7 @@
id: GauzeShoulder
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -86,7 +86,7 @@
id: GauzeStomach
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -100,7 +100,7 @@
id: GauzeUpperArmRight
bodyPart: RArm
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -114,7 +114,7 @@
id: GauzeLowerArmRight
bodyPart: RArm, RHand
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia, Tajaran, Harpy, Rodentia] # Delta V - Felinid, Oni, Vulpkanin; Einstein Engines - Tajaran
coloring:
default:
type:
@@ -128,7 +128,7 @@
id: GauzeLeftArm
bodyPart: LArm, LHand
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Tajaran] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
coloring:
default:
type:
@@ -142,7 +142,7 @@
id: GauzeLowerLegLeft
bodyPart: LFoot
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Tajaran] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
coloring:
default:
type:
@@ -156,7 +156,7 @@
id: GauzeUpperLegLeft
bodyPart: LLeg
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Tajaran] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
coloring:
default:
type:
@@ -170,7 +170,7 @@
id: GauzeUpperLegRight
bodyPart: RLeg
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Tajaran] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
coloring:
default:
type:
@@ -184,7 +184,7 @@
id: GauzeLowerLegRight
bodyPart: RFoot
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Tajaran] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
coloring:
default:
type:
@@ -198,7 +198,7 @@
id: GauzeBoxerWrapRight
bodyPart: RHand
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia, Tajaran] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
coloring:
default:
type:
@@ -212,7 +212,7 @@
id: GauzeBoxerWrapLeft
bodyPart: LHand
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Rodentia, Lamia, Tajaran] # Delta V - Felinid, Oni, Vulpkanin, Rodentia
coloring:
default:
type:
@@ -222,6 +222,20 @@
- sprite: Mobs/Customization/gauze.rsi
state: gauze_boxerwrap_l
+- type: marking
+ id: GauzeHead
+ bodyPart: Head
+ markingCategory: Overlay
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin # EE - Arachne, Lamia
+ coloring:
+ default:
+ type:
+ !type:SimpleColoring
+ color: "#FFFFFF"
+ sprites:
+ - sprite: Mobs/Customization/gauze.rsi
+ state: gauze_head
+
# Lizard Specific Markings
- type: marking
id: GauzeLizardLefteyePatch
@@ -298,7 +312,7 @@
id: GauzeMothBlindfold
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -312,7 +326,7 @@
id: GauzeMothShoulder
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -326,7 +340,7 @@
id: GauzeMothStomach
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -340,7 +354,7 @@
id: GauzeMothLeftEyePatch
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -354,7 +368,7 @@
id: GauzeMothLeftEyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -368,7 +382,7 @@
id: GauzeMothRightEyePatch
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -382,7 +396,7 @@
id: GauzeMothRightEyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -396,7 +410,7 @@
id: GauzeMothUpperArmRight
bodyPart: RArm
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -410,7 +424,7 @@
id: GauzeMothUpperArmLeft
bodyPart: LArm
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -424,7 +438,7 @@
id: GauzeMothUpperLegRight
bodyPart: RLeg
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -438,7 +452,7 @@
id: GauzeMothUpperLegLeft
bodyPart: LLeg
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -452,7 +466,7 @@
id: GauzeMothLowerLegRight
bodyPart: RFoot
markingCategory: Overlay
- speciesRestriction: [Moth]
+ speciesRestriction: [Moth, Chitinid] # Delta V - Chitinid
coloring:
default:
type:
@@ -466,7 +480,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/human_hair.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml
index 75406202df..af0674eb76 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml
@@ -54,6 +54,13 @@
sprites:
- sprite: Mobs/Customization/human_hair.rsi
state: bedheadv3
+- type: marking
+ id: HumanHairPulato
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: Mobs/Customization/human_hair.rsi
+ state: pulato
- type: marking
id: HumanHairLongBedhead
bodyPart: Hair
@@ -1349,6 +1356,27 @@
sprites:
- sprite: Mobs/Customization/human_hair.rsi
state: tailed
+- type: marking
+ id: HumanHairClassicLong2
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: Mobs/Customization/human_hair.rsi
+ state: classiclong2
+- type: marking
+ id: HumanHairClassicLong3
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: Mobs/Customization/human_hair.rsi
+ state: classiclong3
+- type: marking
+ id: HumanHairShaped
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: Mobs/Customization/human_hair.rsi
+ state: shaped
- type: marking
id: HumanHairLongBow
bodyPart: Hair
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/plasmaman_wings.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/plasmaman_wings.yml
new file mode 100644
index 0000000000..a66528a75a
--- /dev/null
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/plasmaman_wings.yml
@@ -0,0 +1,8 @@
+- type: marking
+ id: WingsSkeleton
+ bodyPart: Wings
+ markingCategory: Wings
+ speciesRestriction: [Plasmaman]
+ sprites:
+ - sprite: _SimpleStation/Mobs/Customization/wings64x34.rsi
+ state: skeleton
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml
index 53a0beac3f..9f58b1aa08 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml
@@ -83,7 +83,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne, Lamia]
+ speciesRestriction: [Oni]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_none
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml
index 41d104e1f7..1c8848f276 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml
@@ -2,7 +2,7 @@
id: ScarEyeRight
bodyPart: Head
markingCategory: Head
- speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Harpy, Rodentia
+ speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Arachne, Rodentia, Lamia, Tajaran] # Delta V - Felinid, Oni, Harpy, Rodentia
followSkinColor: true
sprites:
- sprite: Mobs/Customization/scars.rsi
@@ -12,7 +12,7 @@
id: ScarEyeLeft
bodyPart: Head
markingCategory: Head
- speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Arachne, Rodentia, Lamia] # Delta V - Felinid, Oni, Harpy, Rodentia
+ speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Arachne, Rodentia, Lamia, Tajaran] # Delta V - Felinid, Oni, Harpy, Rodentia
followSkinColor: true
sprites:
- sprite: Mobs/Customization/scars.rsi
@@ -22,7 +22,7 @@
id: ScarTopSurgeryShort
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sexRestriction: [Male]
followSkinColor: true
sprites:
@@ -33,7 +33,7 @@
id: ScarTopSurgeryLong
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia, Tajaran]
sexRestriction: [Male]
followSkinColor: true
sprites:
@@ -44,7 +44,7 @@
id: ScarChest
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
followSkinColor: true
sprites:
- sprite: Mobs/Customization/scars.rsi
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml
index a8cf08e837..c5245337e0 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, Rodentia, Lamia] # Delta V - Felinid, Oni, Harpy, Rodentia
+ speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Rodentia, Lamia, Plasmaman] # Delta V - Felinid, Oni, Harpy, Rodentia
coloring:
default:
type:
@@ -128,7 +128,7 @@
id: TattooEyeLeft
bodyPart: Eyes
markingCategory: Head
- speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Rodentia, Lamia] # Delta V - Felinid, Oni, Harpy, Rodentia
+ speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Rodentia, Lamia, Plasmaman] # Delta V - Felinid, Oni, Harpy, Rodentia
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml
index b491d9b918..bd416eb7fb 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml
@@ -42,7 +42,7 @@
id: CyberLimbsMarkingBishopLArm
bodyPart: LArm
markingCategory: LeftArm
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: l_arm-primary
@@ -55,7 +55,7 @@
id: CyberLimbsMarkingBishopLHand
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: l_hand
@@ -64,7 +64,7 @@
id: CyberLimbsMarkingBishopLLeg
bodyPart: LLeg
markingCategory: LeftLeg
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: l_leg-primary
@@ -76,7 +76,7 @@
id: CyberLimbsMarkingBishopLFoot
bodyPart: LFoot
markingCategory: LeftFoot
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: l_foot
@@ -87,7 +87,7 @@
id: CyberLimbsMarkingBishopRArm
bodyPart: RArm
markingCategory: RightArm
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: r_arm-primary
@@ -101,7 +101,7 @@
id: CyberLimbsMarkingBishopRHand
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: r_hand
@@ -110,7 +110,7 @@
id: CyberLimbsMarkingBishopRLeg
bodyPart: RLeg
markingCategory: RightLeg
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: r_leg-primary
@@ -122,7 +122,7 @@
id: CyberLimbsMarkingBishopRFoot
bodyPart: RFoot
markingCategory: RightFoot
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: r_foot
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml
index e907975116..abac4e6d53 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml
@@ -37,7 +37,7 @@
id: CyberLimbsMarkingHesphiastosLArm
bodyPart: LArm
markingCategory: LeftArm
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: l_arm-1
@@ -48,7 +48,7 @@
id: CyberLimbsMarkingHesphiastosLHand
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: l_hand-1
@@ -59,7 +59,7 @@
id: CyberLimbsMarkingHesphiastosLLeg
bodyPart: LLeg
markingCategory: LeftLeg
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: l_leg-1
@@ -71,7 +71,7 @@
id: CyberLimbsMarkingHesphiastosLFoot
bodyPart: LFoot
markingCategory: LeftFoot
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: l_foot-1
@@ -84,7 +84,7 @@
id: CyberLimbsMarkingHesphiastosRArm
bodyPart: RArm
markingCategory: RightArm
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: r_arm-1
@@ -96,7 +96,7 @@
id: CyberLimbsMarkingHesphiastosRHand
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: r_hand-1
@@ -108,7 +108,7 @@
id: CyberLimbsMarkingHesphiastosRLeg
bodyPart: RLeg
markingCategory: RightLeg
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: r_leg-1
@@ -120,7 +120,7 @@
id: CyberLimbsMarkingHesphiastosRFoot
bodyPart: RFoot
markingCategory: RightFoot
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Tajaran] # Einstein Engines - Tajaran
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: r_foot-1
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/batonbot.yml b/Resources/Prototypes/Entities/Mobs/NPCs/batonbot.yml
new file mode 100644
index 0000000000..0e85f7538e
--- /dev/null
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/batonbot.yml
@@ -0,0 +1,75 @@
+- type: entity
+ parent: MobSiliconBase
+ id: MobBatonBot
+ name: batonbot
+ description: Defends the station from hostile wildlife.
+ components:
+ - type: Sprite
+ sprite: Mobs/Silicon/Bots/batonbot.rsi
+ state: batonbot
+ - type: Construction
+ graph: BatonBot
+ node: bot
+ - type: SentienceTarget
+ flavorKind: station-event-random-sentience-flavor-mechanical
+ - type: UseDelay
+ delay: 1
+ - type: NpcFactionMember
+ factions:
+ - NanoTrasen
+ - type: CombatMode
+ - type: Stunbaton
+ energyPerUse: 0
+ - type: MeleeWeapon
+ altDisarm: false
+ soundHit:
+ path: /Audio/Weapons/egloves.ogg
+ angle: 0
+ animation: WeaponArcPunch
+ damage:
+ types:
+ Shock: 4
+ - type: StaminaDamageOnHit
+ damage: 20
+ sound: /Audio/Weapons/egloves.ogg
+ - type: MobThresholds
+ thresholds:
+ 0: Alive
+ 60: Dead
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 50
+ behaviors:
+ - !type:TriggerBehavior
+ - trigger:
+ !type:DamageTrigger
+ damage: 60
+ behaviors:
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ ProximitySensor:
+ min: 1
+ max: 1
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ Stunbaton:
+ min: 1
+ max: 1
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - type: MovementSpeedModifier
+ baseWalkSpeed: 2
+ baseSprintSpeed: 3
+ - type: HTN
+ rootTask:
+ task: BatonbotCompound
+ blackboard:
+ AttackDelayDeviation: !type:Single
+ 0.3
+ - type: InteractionPopup
+ interactSuccessString: petting-success-batonbot
+ interactFailureString: petting-failure-batonbot
+ interactSuccessSound:
+ path: /Audio/Ambience/Objects/periodic_beep.ogg
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/disablerbot.yml b/Resources/Prototypes/Entities/Mobs/NPCs/disablerbot.yml
new file mode 100644
index 0000000000..d0470e09b3
--- /dev/null
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/disablerbot.yml
@@ -0,0 +1,80 @@
+- type: entity
+ parent: MobSiliconBase
+ id: MobDisablerBot
+ name: disablerbot
+ description: Defends the station from hostile wildlife.
+ components:
+ - type: StaticPrice
+ price: 545
+ - type: Sprite
+ sprite: Mobs/Silicon/Bots/disablerbot.rsi
+ state: disablerbot
+ - type: Construction
+ graph: DisablerBot
+ node: bot
+ - type: SentienceTarget
+ flavorKind: station-event-random-sentience-flavor-mechanical
+ - type: UseDelay
+ delay: 1
+ - type: NpcFactionMember
+ factions:
+ - NanoTrasen
+ - type: CombatMode
+ - type: BatterySelfRecharger
+ autoRecharge: true
+ autoRechargeRate: 300
+ - type: Battery
+ maxCharge: 10000
+ startingCharge: 10000
+ - type: Gun
+ fireRate: 1
+ minAngle: 2
+ maxAngle: 10
+ angleIncrease: 2
+ angleDecay: 5
+ soundGunshot:
+ path: /Audio/Weapons/Guns/Gunshots/taser2.ogg
+ - type: ProjectileBatteryAmmoProvider
+ proto: BulletDisablerSmg
+ fireCost: 1
+ - type: MobThresholds
+ thresholds:
+ 0: Alive
+ 60: Dead
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 50
+ behaviors:
+ - !type:TriggerBehavior
+ - trigger:
+ !type:DamageTrigger
+ damage: 60
+ behaviors:
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ ProximitySensor:
+ min: 1
+ max: 1
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ WeaponDisabler:
+ min: 1
+ max: 1
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - type: MovementSpeedModifier
+ baseWalkSpeed: 2
+ baseSprintSpeed: 3
+ - type: HTN
+ rootTask:
+ task: DisablerbotCompound
+ blackboard:
+ AttackDelayDeviation: !type:Single
+ 0.3
+ - type: InteractionPopup
+ interactSuccessString: petting-success-disablerbot
+ interactFailureString: petting-failure-disablerbot
+ interactSuccessSound:
+ path: /Audio/Ambience/Objects/periodic_beep.ogg
diff --git a/Resources/Prototypes/Entities/Mobs/Player/diona.yml b/Resources/Prototypes/Entities/Mobs/Player/diona.yml
index 85c5631de7..afd8e9c043 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/diona.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/diona.yml
@@ -20,4 +20,3 @@
name: Reformed Diona
components:
- type: IsDeadIC
- - type: RandomHumanoidAppearance
diff --git a/Resources/Prototypes/Entities/Mobs/Player/plasmaman.yml b/Resources/Prototypes/Entities/Mobs/Player/plasmaman.yml
new file mode 100644
index 0000000000..7fa3bf2f86
--- /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 0b350b2280..93f7826466 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -50,6 +50,7 @@
- map: [ "enum.HumanoidVisualLayers.HeadSide" ]
- map: [ "enum.HumanoidVisualLayers.HeadTop" ]
- map: [ "enum.HumanoidVisualLayers.Tail" ]
+ - map: [ "enum.HumanoidVisualLayers.Wings" ]
- map: [ "mask" ]
- map: [ "head" ]
- map: [ "pocket1" ]
@@ -313,6 +314,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/harpy.yml b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml
index 4ed815ef31..3650e23814 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml
@@ -143,6 +143,7 @@
- type: entity
save: false
+ categories: [ HideSpawnMenu ]
name: Urist McBirb
parent: MobHumanDummy
id: MobHarpyDummy
diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml
index 721724460c..86d8872e3c 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 0000000000..a79ec0bd10
--- /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 0eff3c1fc2..1d1768bb37 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
@@ -61,6 +61,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 5f9812f490..60606a92fc 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 97e244798b..4c1b14e751 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml
@@ -156,3 +156,33 @@
- Azaziba
requires:
- Draconic
+
+- 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
+
+- type: entity
+ parent: BaseSubdermalImplant
+ id: SiikMaasTranslatorImplant
+ name: siik'maas translator implant
+ description: An implant giving the ability to understand and speak Siik'maas.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: TranslatorImplant
+ understood:
+ - SiikMaas
+ spoken:
+ - SiikMaas
+ requires:
+ - TauCetiBasic
diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml
index 384e58d3d4..dfbd51a3b3 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/translators.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml
@@ -254,4 +254,38 @@
- 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
+
+- type: entity
+ id: SiikMaasTranslator
+ parent: [ TranslatorPoweredBase ]
+ name: Siik'maas translator
+ description: Translates speech between Siik'maas and Tau-Ceti Basic. For talking to Tajara!
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - TauCetiBasic
+ - SiikMaas
+ understood:
+ - TauCetiBasic
+ - SiikMaas
+ requires:
+ - TauCetiBasic
+ - SiikMaas
diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
index eb8804504c..1d413c772b 100644
--- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml
+++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
@@ -2165,16 +2165,16 @@
damage: 0.8
- type: EmitSoundOnActivate
sound:
- path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse1.ogg
+ path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse.ogg
- type: EmitSoundOnUse
sound:
- path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse1.ogg
+ path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushuse.ogg
- type: EmitSoundOnCollide
sound:
- path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg
+ path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg
- type: EmitSoundOnLand
sound:
- path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg
+ path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg
- type: UseDelay
delay: 1.5
- type: MeleeWeapon
@@ -2184,8 +2184,8 @@
types:
Blunt: 0
soundHit:
- path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg
+ path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg
soundSwing:
- path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg
+ path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg
soundNoDamage:
- path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow1.ogg
+ path: /Audio/Items/Toys/Plushie/PlushieJenn/jennplushthrow.ogg
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 0000000000..b595862628
--- /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 53da8e72a5..6c4b84c1f8 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml
@@ -90,4 +90,20 @@
name: azaziba translator implant
components:
- type: Implanter
- implant: AzazibaTranslatorImplant
\ No newline at end of file
+ implant: AzazibaTranslatorImplant
+
+- type: entity
+ id: ChittinTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: chittin translator implant
+ components:
+ - type: Implanter
+ implant: ChittinTranslatorImplant
+
+- type: entity
+ id: SiikMaasTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: siik'maas translator implant
+ components:
+ - type: Implanter
+ implant: SiikMaasTranslatorImplant
diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml
index 4db76a9796..0edf59065e 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 fcb41ceef3..4cea55becf 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/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
index 2200d6bb22..df4641827b 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
@@ -529,6 +529,7 @@
tags:
- Taser
- Sidearm
+ - WeaponDisabler
- type: Sprite
sprite: Objects/Weapons/Guns/Battery/disabler.rsi
layers:
@@ -913,4 +914,4 @@
autoRecharge: true
autoRechargeRate: 24
autoRechargePause: true
- autoRechargePauseTime: 10
\ No newline at end of file
+ autoRechargePauseTime: 10
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml
index 561af78a56..1a63aa5a4d 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml
@@ -9,6 +9,9 @@
layers:
- state: stunbaton_off
map: [ "enum.ToggleVisuals.Layer" ]
+ - type: Tag
+ tags:
+ - Stunbaton
- type: Stunbaton
energyPerUse: 50
- type: ItemToggle
diff --git a/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml b/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml
index d78ed1182c..e3c740cf95 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 7a8611bb70..4630a57f13 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -698,6 +698,8 @@
- TorsoBorgService
- MechAirTank # Goobstation
- MechThruster # Goobstation
+ - PowerCageMedium # Goobstation - Powercell to exosuit fab
+ - PowerCageSmall # Goobstation - Powercell to exosuit fab
dynamicRecipes:
- ProximitySensor
- BorgModuleLightReplacer
@@ -773,6 +775,14 @@
- MechEquipmentKineticAccelerator
- MechEquipmentHonkerBananaMortar
- MechEquipmentHonkerMousetrapMortar
+ # Goobstation - Modsuits
+ - ModsuitChestplate
+ - ModsuitBoots
+ - ModsuitHelmet
+ - ModsuitGauntlets
+ - ModsuitShell
+ - ModsuitPlatingExternal
+ - PowerCageHigh # Goobstation - Powercell to exosuit fab
- type: EmagLatheRecipes
emagDynamicRecipes:
- WeaponMechCombatImmolationGun
@@ -1211,6 +1221,7 @@
- ChemicalPayload # Nyano
- SyringeCryostasis
- ClothingEyesNightVisionMedicalGoggles
+ - EnvirosuitExtinguisherRefill
# Shitmed Change
- EnergyScalpel
- EnergyCautery
diff --git a/Resources/Prototypes/Entities/Structures/Power/chargers.yml b/Resources/Prototypes/Entities/Structures/Power/chargers.yml
index ae8689bead..3ffe6d0ac4 100644
--- a/Resources/Prototypes/Entities/Structures/Power/chargers.yml
+++ b/Resources/Prototypes/Entities/Structures/Power/chargers.yml
@@ -246,6 +246,7 @@
components:
- BorgChassis
- Silicon # Parkstation IPCs
+ - Inventory # Goobstation - Modsuits
- type: Construction
containers:
- machine_parts
diff --git a/Resources/Prototypes/EstacaoPirata/Catalog/uplink_catalog.yml b/Resources/Prototypes/EstacaoPirata/Catalog/uplink_catalog.yml
new file mode 100644
index 0000000000..c972f35f38
--- /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 0000000000..eddc820e21
--- /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 0000000000..be802ea5ee
--- /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 0000000000..9f8f93cb6a
--- /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 0000000000..5a7084630c
--- /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 7534a8cdc6..bebc40fcc1 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 77bc15dcc5..c739da7c2d 100644
--- a/Resources/Prototypes/Guidebook/species.yml
+++ b/Resources/Prototypes/Guidebook/species.yml
@@ -14,6 +14,9 @@
- Harpy
- Rodentia # Floofstation
- Shadowkin
+ - Plasmaman
+ - Chitinid
+ - Tajaran
- type: guideEntry
id: Arachnid
@@ -64,3 +67,13 @@
id: Shadowkin
name: species-name-shadowkin
text: "/ServerInfo/Guidebook/Mobs/Shadowkin.xml"
+
+- type: guideEntry
+ id: Tajaran
+ name: species-name-tajaran
+ text: "/ServerInfo/Guidebook/Mobs/Tajaran.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 0000000000..c295cf120b
--- /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 0000000000..e6de43d5a3
--- /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 0000000000..840f00850e
--- /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 4afc2f0513..21e37d82aa 100644
--- a/Resources/Prototypes/Loadouts/Generic/hands.yml
+++ b/Resources/Prototypes/Loadouts/Generic/hands.yml
@@ -108,7 +108,11 @@
- ClothingHandsGlovesColorWhite
requirements:
- !type:CharacterItemGroupRequirement
- group: LoadoutGloves2
+ group: LoadoutGloves
+ - !type:CharacterSpeciesRequirement # Use the envirogloves that use the same sprite instead.
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutHandsColorYellowBudget
@@ -168,7 +172,11 @@
- ClothingHandsGlovesFingerless
requirements:
- !type:CharacterItemGroupRequirement
- group: LoadoutGloves2
+ group: LoadoutGloves
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
- type: loadout
id: LoadoutHandsGlovesEvening
@@ -180,4 +188,8 @@
- ClothingHandsGlovesEvening
requirements:
- !type:CharacterItemGroupRequirement
- group: LoadoutGloves
\ No newline at end of file
+ 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 24d343c239..84889d7ca9 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 0000000000..a3dbd169f8
--- /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 2c44aea2c3..5b8dfee70c 100644
--- a/Resources/Prototypes/Loadouts/Generic/shoes.yml
+++ b/Resources/Prototypes/Loadouts/Generic/shoes.yml
@@ -360,6 +360,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutShoes2
+ - !type:CharacterSpeciesRequirement # Due to a visual bug with envirosuits and heels they are disabled for now.
+ inverted: true
+ species:
+ - Plasmaman
items:
- ClothingShoesHighheelBoots
# Socks
@@ -413,6 +417,10 @@
requirements:
- !type:CharacterItemGroupRequirement
group: LoadoutShoes
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Plasmaman
items:
- ClothingShoesHighHeels
@@ -426,6 +434,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 cc3036fa07..97d8abfd8d 100644
--- a/Resources/Prototypes/Loadouts/Generic/uniform.yml
+++ b/Resources/Prototypes/Loadouts/Generic/uniform.yml
@@ -1066,6 +1066,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 2af937ef1a..ae89a2f422 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 3a80d1e155..e208232e80 100644
--- a/Resources/Prototypes/Loadouts/Jobs/Security/uncategorized.yml
+++ b/Resources/Prototypes/Loadouts/Jobs/Security/uncategorized.yml
@@ -1331,3 +1331,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 c3d3acc8a5..4b30007611 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/NPCs/batonbot.yml b/Resources/Prototypes/NPCs/batonbot.yml
new file mode 100644
index 0000000000..9169f2a324
--- /dev/null
+++ b/Resources/Prototypes/NPCs/batonbot.yml
@@ -0,0 +1,12 @@
+- type: htnCompound
+ id: BatonbotCompound
+ branches:
+ - tasks:
+ - !type:HTNPrimitiveTask
+ operator: !type:UtilityOperator
+ proto: NearbyMeleeTargets
+ - !type:HTNCompoundTask
+ task: MeleeAttackTargetCompound
+ - tasks:
+ - !type:HTNCompoundTask
+ task: IdleCompound
diff --git a/Resources/Prototypes/NPCs/disablerbot.yml b/Resources/Prototypes/NPCs/disablerbot.yml
new file mode 100644
index 0000000000..6e0ce231d2
--- /dev/null
+++ b/Resources/Prototypes/NPCs/disablerbot.yml
@@ -0,0 +1,9 @@
+- type: htnCompound
+ id: DisablerbotCompound
+ branches:
+ - tasks:
+ - !type:HTNCompoundTask
+ task: InnateRangedCombatCompound
+ - tasks:
+ - !type:HTNCompoundTask
+ task: IdleCompound
diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/felinid.yml
index e27a7f8be1..33e45980da 100644
--- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/felinid.yml
+++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/felinid.yml
@@ -4,7 +4,7 @@
id: FelinidEarsBasic
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: basic_outer
@@ -15,7 +15,7 @@
id: FelinidEarsCurled
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: curled_outer
@@ -26,7 +26,7 @@
id: FelinidEarsDroopy
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: droopy_outer
@@ -37,7 +37,7 @@
id: FelinidEarsFuzzy
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: basic_outer
@@ -48,7 +48,7 @@
id: FelinidEarsStubby
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: stubby_outer
@@ -59,7 +59,7 @@
id: FelinidEarsTall
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: tall_outer
@@ -72,7 +72,7 @@
id: FelinidEarsTorn
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: torn_outer
@@ -83,7 +83,7 @@
id: FelinidEarsWide
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human, Tajaran] # Einstein Engines - Humans get felinid markings, Tajaran directly use felinid tails
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_ears.rsi
state: wide_outer
@@ -96,7 +96,7 @@
id: FelinidTailBasic
bodyPart: Tail
markingCategory: Tail
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human, Tajaran] # Einstein Engines - Humans get felinid markings
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
@@ -109,7 +109,7 @@
id: FelinidTailBasicWithBow
bodyPart: Tail
markingCategory: Tail
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human, Tajaran] # Einstein Engines - Humans get felinid markings, Tajaran directly use felinid tails
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
@@ -124,7 +124,7 @@
id: FelinidTailBasicWithBell
bodyPart: Tail
markingCategory: Tail
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human, Tajaran] # Einstein Engines - Humans get felinid markings, Tajaran directly use felinid tails
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
@@ -139,7 +139,7 @@
id: FelinidTailBasicWithBowAndBell
bodyPart: Tail
markingCategory: Tail
- speciesRestriction: [Felinid]
+ speciesRestriction: [Felinid, Human, Tajaran] # Einstein Engines - Humans get felinid markings, Tajaran directly use felinid tails
sprites:
- sprite: Nyanotrasen/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail_carrier.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail_carrier.yml
index 5a90e77a58..ca4d55c2f8 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 da420fdfad..f76fd1d88b 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml
@@ -42,6 +42,8 @@
- type: startingGear
id: ForensicMantisGear
+ subGear:
+ - ForensicMantisPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMantis
back: ClothingBackpackMantisFilled
@@ -57,3 +59,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 f93fc24dd2..4e6f8a54b3 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 b2d54651e4..6b1c809c46 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 8615f4af58..9f1bbc24e9 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml
@@ -19,6 +19,8 @@
- type: startingGear
id: MartialArtistGear
+ subGear:
+ - MartialArtistPlasmamanGear
equipment:
jumpsuit: ClothingUniformMartialGi
belt: ClothingBeltMartialBlack
@@ -29,3 +31,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 23c9fa1c80..1bf2b891b3 100644
--- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml
+++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml
@@ -16,12 +16,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 a4d96c109e..de4dc15768 100644
--- a/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml
+++ b/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml
@@ -7,8 +7,10 @@
Arachnid: 1
Harpy: 1
Moth: 1
+ Tajaran: 1 # Einstein Engines
Diona: 0.5
Reptilian: 0.5
SlimePerson: 0.5
Vulpkanin: 0.5
Rodentia: 0.5
+ Plasmaman: 0.25
diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml
index 15fcdb28e9..980f13b744 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 3f9fb7b53d..52b6533153 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 caa2e5acdc..b81b639b8b 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/Crafting/Graphs/bots/batonbot.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/bots/batonbot.yml
new file mode 100644
index 0000000000..a5bbdc322f
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Crafting/Graphs/bots/batonbot.yml
@@ -0,0 +1,28 @@
+- type: constructionGraph
+ id: BatonBot
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: bot
+ steps:
+ - tag: ProximitySensor
+ icon:
+ sprite: Objects/Misc/proximity_sensor.rsi
+ state: icon
+ name: proximity sensor
+ doAfter: 2
+ - tag: Stunbaton
+ icon:
+ sprite: Objects/Weapons/Melee/stunbaton.rsi
+ state: stunbaton_on
+ name: stunbaton
+ doAfter: 2
+ - tag: ClothingHeadHelmetBasic
+ icon:
+ sprite: DeltaV/Clothing/Head/Helmets/security.rsi
+ state: icon
+ name: Security Helmet
+ doAfter: 2
+ - node: bot
+ entity: MobBatonBot
diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/bots/disablerbot.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/bots/disablerbot.yml
new file mode 100644
index 0000000000..e56c37d31f
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Crafting/Graphs/bots/disablerbot.yml
@@ -0,0 +1,28 @@
+- type: constructionGraph
+ id: DisablerBot
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: bot
+ steps:
+ - tag: ProximitySensor
+ icon:
+ sprite: Objects/Misc/proximity_sensor.rsi
+ state: icon
+ name: Proximity sensor
+ doAfter: 2
+ - tag: WeaponDisabler
+ icon:
+ sprite: Objects/Weapons/Guns/Battery/disabler.rsi
+ state: base
+ name: Disabler
+ doAfter: 2
+ - tag: ClothingHeadHelmetBasic
+ icon:
+ sprite: DeltaV/Clothing/Head/Helmets/security.rsi
+ state: icon
+ name: Security Helmet
+ doAfter: 2
+ - node: bot
+ entity: MobDisablerBot
diff --git a/Resources/Prototypes/Recipes/Crafting/bots.yml b/Resources/Prototypes/Recipes/Crafting/bots.yml
index 8f67905b85..26c0a44e33 100644
--- a/Resources/Prototypes/Recipes/Crafting/bots.yml
+++ b/Resources/Prototypes/Recipes/Crafting/bots.yml
@@ -88,3 +88,29 @@
icon:
sprite: Mobs/Silicon/Bots/gladiabot.rsi
state: GladiabotFFA
+
+- type: construction
+ name: batonbot
+ id: batonbot
+ graph: BatonBot
+ startNode: start
+ targetNode: bot
+ category: construction-category-utilities
+ objectType: Item
+ description: Defends the station from hostile wildlife.
+ icon:
+ sprite: Mobs/Silicon/Bots/batonbot.rsi
+ state: batonbot
+
+- type: construction
+ name: disablerbot
+ id: disablerbot
+ graph: DisablerBot
+ startNode: start
+ targetNode: bot
+ category: construction-category-utilities
+ objectType: Item
+ description: Defends the station from hostile wildlife.
+ icon:
+ sprite: Mobs/Silicon/Bots/disablerbot.rsi
+ state: disablerbot
diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml
index f489fc2eb5..37b400802c 100644
--- a/Resources/Prototypes/Recipes/Lathes/medical.yml
+++ b/Resources/Prototypes/Recipes/Lathes/medical.yml
@@ -261,4 +261,12 @@
Glass: 300
Silver: 100
Gold: 100
- Plasma: 200
\ No newline at end of file
+ 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 458e359e40..18944189fa 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 cb6cb02030..189d3c24ab 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 504b638483..f7d4a78401 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 f79a30e5fd..7b5c19bcf8 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 bda5289e8e..a1c5e4f0fc 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
@@ -9,8 +9,14 @@
# role: JobCargoTechnician
# time: 21600 #6 hrs
- !type:CharacterPlaytimeRequirement
- tracker: JobSalvageSpecialist # DeltaV - Logistics Department replacing Cargo
- min: 7200 # The Den - 2 hour
+ tracker: JobSalvageSpecialist
+ min: 10800 #3 hrs
+ - !type:CharacterPlaytimeRequirement # DeltaV - Courier role time requirement
+ tracker: JobMailCarrier
+ min: 7200 # 2 hours
+ - !type:CharacterDepartmentTimeRequirement
+ department: Logistics # DeltaV - Logistics Department replacing Cargo
+ min: 43200 #DeltaV 12 hours
weight: 10
startingGear: QuartermasterGear
icon: "JobIconQuarterMaster"
@@ -32,9 +38,14 @@
- !type:AddComponentSpecial
components:
- type: CommandStaff
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
- type: startingGear
id: QuartermasterGear
+ subGear:
+ - QuartermasterPlasmamanGear
equipment:
head: ClothingHeadHatBeretLogi
jumpsuit: ClothingUniformJumpsuitQM
@@ -47,3 +58,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 56b54a843a..e7ba0b8285 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml
@@ -19,6 +19,8 @@
- type: startingGear
id: SalvageSpecialistGear
+ subGear:
+ - SalvageSpecialistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSalvageSpecialist
back: ClothingBackpackSalvageFilled
@@ -27,3 +29,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 5cf4fd9449..dce7969682 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 8af3f2ee92..265925ef3e 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
@@ -16,6 +16,8 @@
- type: startingGear
id: BartenderGear
+ subGear:
+ - BartenderPlasmamanGear
equipment:
head: ClothingHeadHatTophat
jumpsuit: ClothingUniformJumpsuitBartender
@@ -27,3 +29,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 35b858fb38..77e9ec491b 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 f73f9565bc..a91f98ccff 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
@@ -40,6 +40,8 @@
- type: startingGear
id: ChaplainGear
+ subGear:
+ - ChaplainPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitChaplain
back: ClothingBackpack
@@ -50,3 +52,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 4188970105..7938fad093 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
@@ -20,6 +20,8 @@
- type: startingGear
id: ChefGear
+ subGear:
+ - ChefPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitChef
head: ClothingHeadHatChef
@@ -33,3 +35,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 5bf14c23ed..e9c7551433 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
@@ -29,6 +29,8 @@
- type: startingGear
id: ClownGear
+ subGear:
+ - ClownPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitClown
back: ClothingBackpackClownFilled
@@ -40,3 +42,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 bf11532ddb..ac097e7e30 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 c05d861280..d093361569 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml
@@ -14,6 +14,8 @@
- type: startingGear
id: LawyerGear
+ subGear:
+ - LawyerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitLawyerBlack # TODO change jumpsuit to randomiser of the 4 variants
back: ClothingBackpackLawyerFilled #DeltaV - stamp included
@@ -26,3 +28,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 0f2a7d39b8..a5aa92bc02 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 ab576c78e2..b71660c1a0 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
@@ -18,6 +18,8 @@
- type: startingGear
id: MimeGear
+ subGear:
+ - MimePlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMime
back: ClothingBackpackMimeFilled
@@ -34,6 +36,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 36d8839529..113b0fccac 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
@@ -17,6 +17,8 @@
- type: startingGear
id: MusicianGear
+ subGear:
+ - MusicianPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitMusician
back: ClothingBackpackMusicianFilled
@@ -26,3 +28,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 7ee1076a8b..ca7c796283 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
@@ -18,6 +18,8 @@
- type: startingGear
id: ServiceWorkerGear
+ subGear:
+ - ServiceWorkerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitColorDarkGreen # DeltaV
back: ClothingBackpackFilled
@@ -27,3 +29,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 376a59e021..fa009bb570 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml
@@ -26,7 +26,7 @@
min: 144000 # The Den - 40 hour
weight: 20
startingGear: CaptainGear
- icon: JobIconCaptain
+ icon: "JobIconCaptain"
requireAdminNotify: true
joinNotifyCrew: true
supervisors: job-supervisors-centcom
@@ -39,9 +39,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
@@ -51,3 +58,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 37c73f38e0..c14ee7e283 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 fe3e4986b0..57378f7422 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
@@ -61,9 +61,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
@@ -73,3 +80,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 fc32d069d7..40ca0121c8 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 14e35afee6..19f2aee7f3 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
@@ -29,9 +29,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
@@ -41,3 +48,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 35c3444598..df81edc443 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
@@ -18,6 +18,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 5e905f59bf..c394a85017 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
@@ -19,6 +19,8 @@
- type: startingGear
id: StationEngineerGear
+ subGear:
+ - StationEngineerPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitEngineering
back: ClothingBackpackEngineeringFilled
@@ -30,3 +32,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 ea44156658..f563e8b8ee 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
@@ -18,6 +18,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 f1e8fc9cf8..7dd2aa1e92 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 b2cf3b8793..31e3507704 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 0000000000..bec0c1eb45
--- /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 69e82831ba..4f08ba756b 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 e14d5d269c..3b8af1c926 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
@@ -37,9 +37,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
@@ -49,3 +56,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 f23672ff8d..c309cda65e 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 4d39d8fcb5..e603fc27e1 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
@@ -19,6 +19,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 f32952abbc..d6cdc7eaf5 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
@@ -27,6 +27,8 @@
- type: startingGear
id: ParamedicGear
+ subGear:
+ - ParamedicPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitParamedic
back: ClothingBackpackParamedicFilledDV
@@ -39,3 +41,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 f3dea9245d..fcfea757e8 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
@@ -23,6 +23,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 fc7a5486eb..7efcf3435b 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
@@ -13,6 +13,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 28b8a7c6c2..1893e11e0a 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
@@ -53,9 +53,16 @@
- DispelPower
- MetapsionicPower
- TelepathyPower
+ afterLoadoutSpecial:
+ - !type:ModifyEnvirosuitSpecial
+ charges: 8
+ - !type:ModifyEnvirohelmSpecial
+ powerCell: PowerCellHigh
- type: startingGear
id: ResearchDirectorGear
+ subGear:
+ - ResearchDirectorPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitResearchDirector
back: ClothingBackpackResearchDirectorFilled
@@ -67,3 +74,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 8b7611e7a4..1aff597566 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 62d5fcfe9b..4b457bf10c 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
@@ -12,6 +12,8 @@
- type: startingGear
id: ScientistGear
+ subGear:
+ - ScientistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitScientist
back: ClothingBackpackScienceFilled
@@ -23,3 +25,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 d01c1ca61a..0b63f531db 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 6571df861a..e4efe09637 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 0a2f06b71c..c4f4025708 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
@@ -31,9 +31,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
@@ -46,3 +53,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 39ff609ba3..356c1b6a77 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 2fd44505b8..066a592845 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 24ee1994f6..04d1c5f592 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
@@ -21,9 +21,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 04ffe70dc8..b6e7409fb3 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml
@@ -23,9 +23,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
@@ -39,3 +46,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 3dc18bc857..fac4207501 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml
@@ -17,6 +17,8 @@
- type: startingGear
id: BoxerGear
+ subGear:
+ - BoxerPlasmamanGear
equipment:
jumpsuit: UniformShortsRed
back: ClothingBackpackFilled
@@ -28,3 +30,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 064f40f937..583ce1df0a 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml
@@ -19,6 +19,8 @@
- type: startingGear
id: PsychologistGear
+ subGear:
+ - PsychologistPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitPsychologist
back: ClothingBackpackPsychologistFilled #DeltaV - stamp included
@@ -28,3 +30,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 603c0a7608..8e5c4812db 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml
@@ -14,6 +14,8 @@
- type: startingGear
id: ReporterGear
+ subGear:
+ - ReporterPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitReporter
back: ClothingBackpackFilled
@@ -23,3 +25,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 7bf1ff772a..4593397bdc 100644
--- a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml
+++ b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml
@@ -13,6 +13,8 @@
- type: startingGear
id: ZookeeperGear
+ subGear:
+ - ZookeeperPlasmamanGear
equipment:
jumpsuit: ClothingUniformJumpsuitSafari
back: ClothingBackpackFilled
@@ -23,3 +25,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 e17afd0978..8d57114c0c 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 518bbf72bb..99a0d343d5 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/ipc.yml b/Resources/Prototypes/Species/ipc.yml
index f2f99b56ff..bd6d72443a 100644
--- a/Resources/Prototypes/Species/ipc.yml
+++ b/Resources/Prototypes/Species/ipc.yml
@@ -45,6 +45,7 @@
RLeg: MobIPCRLeg
LFoot: MobIPCLFoot
RFoot: MobIPCRFoot
+ Wings: MobHumanoidAnyMarking
- type: markingPoints
id: MobIPCMarkingLimits
@@ -95,6 +96,9 @@
points: 1
required: false
defaultMarkings: [ MobIPCLHandDefault ]
+ Wings:
+ points: 1
+ required: false
- type: humanoidBaseSprite
id: MobIPCMarkingFollowSkin
diff --git a/Resources/Prototypes/Species/plasmaman.yml b/Resources/Prototypes/Species/plasmaman.yml
new file mode 100644
index 0000000000..9ac9a2cd6a
--- /dev/null
+++ b/Resources/Prototypes/Species/plasmaman.yml
@@ -0,0 +1,172 @@
+- 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
+ Wings: MobHumanoidAnyMarking
+
+- 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/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml
index 83e6e61bf3..5e7a00357a 100644
--- a/Resources/Prototypes/Species/reptilian.yml
+++ b/Resources/Prototypes/Species/reptilian.yml
@@ -66,7 +66,7 @@
points: 3
required: false
Chest:
- points: 1
+ points: 3
required: false
RightLeg:
points: 2
diff --git a/Resources/Prototypes/Species/species_weights.yml b/Resources/Prototypes/Species/species_weights.yml
index 0653498af1..e4d88483fb 100644
--- a/Resources/Prototypes/Species/species_weights.yml
+++ b/Resources/Prototypes/Species/species_weights.yml
@@ -11,3 +11,5 @@
Rodentia: 3 # DeltaV - Rodentia, see Prototypes/DeltaV/Entities/Mobs/Species/rodentia.yml
Diona: 2
Shadowkin: 0
+ Tajaran: 3 # Einstein Engines - Tajaran, see Prototypes/_EE/Entities/Mobs/Species/tajaran.yml
+ 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 ede5deb897..9c3c21e19f 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 8ea7006c0c..a13e8ee10e 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 9e60b9a43d..b011f8ae2a 100644
--- a/Resources/Prototypes/Traits/physical.yml
+++ b/Resources/Prototypes/Traits/physical.yml
@@ -141,6 +141,7 @@
inverted: true
species:
- Felinid
+ - Tajaran
functions:
- !type:TraitModifyStamina
staminaModifier: -15
@@ -251,6 +252,7 @@
inverted: true
species:
- Felinid
+ - Tajaran
- !type:CharacterTraitRequirement
inverted: true
traits:
@@ -274,6 +276,7 @@
inverted: true
species:
- Felinid
+ - Tajaran
- !type:CharacterTraitRequirement
inverted: true
traits:
@@ -309,6 +312,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
@@ -323,8 +327,9 @@
- !type:CharacterSpeciesRequirement
inverted: true
species:
- - Felinid # Felinids already have this feature by default.
+ - Felinid # Felinids/Tajaran already have this feature by default.
- Rodentia # Floof - Rodentia
+ - Tajaran
- !type:CharacterHeightRequirement
max: 150
- !type:CharacterWidthRequirement
@@ -381,6 +386,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
@@ -391,6 +403,7 @@
inverted: true
species:
- Felinid # Felinids already have cat claws.
+ - Tajaran # Tajaran also have cat claws
- Reptilian # Reptilians also have cat claws.
- Shadowkin # Shadowkins also have claws.
# - Vulpkanin # Vulpkanin have "Blunt" claws. One could argue this trait "Sharpens" their claws.
@@ -409,6 +422,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
@@ -439,6 +458,12 @@
damage:
types:
Blunt: 5
+ - !type:TraitRemoveComponent
+ components:
+ - type: DamageOnHit
+ damage:
+ types:
+ Blunt: 0
- type: trait
id: StrikingCalluses
diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml
index 1b9390d035..8442ecdc94 100644
--- a/Resources/Prototypes/Traits/skills.yml
+++ b/Resources/Prototypes/Traits/skills.yml
@@ -167,6 +167,7 @@
inverted: true
species:
- Felinid
+ - Tajaran
- type: trait
id: Singer
@@ -312,6 +313,7 @@
inverted: true
species:
- Felinid
+ - Tajaran
- Harpy
- Rodentia # Floof - Rodentia
diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml
index d18b438c8c..2ae9831996 100644
--- a/Resources/Prototypes/Voice/speech_emote_sounds.yml
+++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml
@@ -798,3 +798,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 3f0a4c10fc..6f9db71a5f 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/WhiteDream/Entities/Clothing/Cult/armor.yml b/Resources/Prototypes/WhiteDream/Entities/Clothing/Cult/armor.yml
index 88b578cb5f..fdaca46eee 100644
--- a/Resources/Prototypes/WhiteDream/Entities/Clothing/Cult/armor.yml
+++ b/Resources/Prototypes/WhiteDream/Entities/Clothing/Cult/armor.yml
@@ -74,7 +74,7 @@
clothingPrototype: ClothingHeadHatHoodCultHoodTrue
- type: ContainerContainer
containers:
- toggleable-clothing: !type:ContainerSlot { }
+ toggleable-clothing: !type:Container { }
- type: entity
parent: ClothingHeadHatHoodCulthood
diff --git a/Resources/Prototypes/_DEN/Loadouts/items.yml b/Resources/Prototypes/_DEN/Loadouts/items.yml
index 671dc6de2a..22d1ffc50d 100644
--- a/Resources/Prototypes/_DEN/Loadouts/items.yml
+++ b/Resources/Prototypes/_DEN/Loadouts/items.yml
@@ -115,3 +115,11 @@
canBeHeirloom: true
items:
- PlushieTabi
+
+- type: loadout
+ id: LoadoutPlushieJenn
+ category: Items
+ cost: 0
+ canBeHeirloom: true
+ items:
+ - PlushieJenn
diff --git a/Resources/Prototypes/_EE/Body/Parts/tajaran.yml b/Resources/Prototypes/_EE/Body/Parts/tajaran.yml
new file mode 100644
index 0000000000..4115f2bf98
--- /dev/null
+++ b/Resources/Prototypes/_EE/Body/Parts/tajaran.yml
@@ -0,0 +1,118 @@
+- type: entity
+ id: PartTajaran
+ parent: [BaseItem, BasePart]
+ name: "tajaran body part"
+ abstract: true
+ components:
+ - type: Extractable
+ juiceSolution:
+ reagents:
+ - ReagentId: Fat
+ Quantity: 3
+ - ReagentId: Blood
+ Quantity: 10
+
+- type: entity
+ id: TorsoTajaran
+ name: "Tajaran torso"
+ parent: [PartTajaran, BaseTorso]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "torso_m"
+ - type: Extractable
+ juiceSolution:
+ reagents:
+ - ReagentId: Fat
+ Quantity: 10
+ - ReagentId: Blood
+ Quantity: 20
+
+
+- type: entity
+ id: HeadTajaran
+ name: "Tajaran head"
+ parent: [PartTajaran, BaseHead]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "head_m"
+ - type: Extractable
+ juiceSolution:
+ reagents:
+ - ReagentId: Fat
+ Quantity: 5
+ - ReagentId: Blood
+ Quantity: 10
+
+- type: entity
+ id: LeftArmTajaran
+ name: "left Tajaran arm"
+ parent: [PartTajaran, BaseLeftArm]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "l_arm"
+
+- type: entity
+ id: RightArmTajaran
+ name: "right Tajaran arm"
+ parent: [PartTajaran, BaseRightArm]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "r_arm"
+
+- type: entity
+ id: LeftHandTajaran
+ name: "left Tajaran hand"
+ parent: [PartTajaran, BaseLeftHand]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "l_hand"
+
+- type: entity
+ id: RightHandTajaran
+ name: "right Tajaran hand"
+ parent: [PartTajaran, BaseRightHand]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "r_hand"
+
+- type: entity
+ id: LeftLegTajaran
+ name: "left Tajaran leg"
+ parent: [PartTajaran, BaseLeftLeg]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "l_leg"
+
+- type: entity
+ id: RightLegTajaran
+ name: "right Tajaran leg"
+ parent: [PartTajaran, BaseRightLeg]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "r_leg"
+
+- type: entity
+ id: LeftFootTajaran
+ name: "left Tajaran foot"
+ parent: [PartTajaran, BaseLeftFoot]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "l_foot"
+
+- type: entity
+ id: RightFootTajaran
+ name: "right Tajaran foot"
+ parent: [PartTajaran, BaseRightFoot]
+ components:
+ - type: Sprite
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: "r_foot"
diff --git a/Resources/Prototypes/_EE/Body/Prototypes/tajaran.yml b/Resources/Prototypes/_EE/Body/Prototypes/tajaran.yml
new file mode 100644
index 0000000000..1b5c919e83
--- /dev/null
+++ b/Resources/Prototypes/_EE/Body/Prototypes/tajaran.yml
@@ -0,0 +1,50 @@
+- type: body
+ id: Tajaran
+ name: tajaran
+ root: torso
+ slots:
+ head:
+ part: HeadTajaran
+ connections:
+ - torso
+ organs:
+ brain: OrganHumanBrain
+ eyes: OrganHumanEyes
+ torso:
+ part: TorsoTajaran
+ connections:
+ - right arm
+ - left arm
+ - right leg
+ - left leg
+ - head # Shitmed Change
+ organs:
+ heart: OrganAnimalHeart
+ lungs: OrganHumanLungs
+ stomach: OrganVulpkaninStomach
+ liver: OrganAnimalLiver
+ kidneys: OrganHumanKidneys
+ right arm:
+ part: RightArmTajaran
+ connections:
+ - right hand
+ left arm:
+ part: LeftArmTajaran
+ connections:
+ - left hand
+ right hand:
+ part: RightHandTajaran
+ left hand:
+ part: LeftHandTajaran
+ right leg:
+ part: RightLegTajaran
+ connections:
+ - right foot
+ left leg:
+ part: LeftLegTajaran
+ connections:
+ - left foot
+ right foot:
+ part: RightFootTajaran
+ left foot:
+ part: LeftFootTajaran
diff --git a/Resources/Prototypes/_EE/Damage/modifier_sets.yml b/Resources/Prototypes/_EE/Damage/modifier_sets.yml
new file mode 100644
index 0000000000..2060a66428
--- /dev/null
+++ b/Resources/Prototypes/_EE/Damage/modifier_sets.yml
@@ -0,0 +1,8 @@
+- type: damageModifierSet
+ id: Tajaran
+ coefficients:
+ Blunt: 1.15
+ Slash: 1.15
+ Piercing: 1.15
+ Heat: 1.35
+ Cold: 0.65
diff --git a/Resources/Prototypes/_EE/Datasets/Names/tajaran_first.yml b/Resources/Prototypes/_EE/Datasets/Names/tajaran_first.yml
new file mode 100644
index 0000000000..14e8581c67
--- /dev/null
+++ b/Resources/Prototypes/_EE/Datasets/Names/tajaran_first.yml
@@ -0,0 +1,103 @@
+- type: dataset
+ id: names_tajaran_first
+ values: # Randomly generated based on https://github.com/ParadiseSS13/Paradise/blob/5b516c3166a07cd10d035be1616248ba126e31a1/code/modules/mob/language.dm
+ - Ahkazuzir
+ - Ahknal
+ - Ahkrhejurlzar
+ - Ahkwaketdar
+ - Arazirrrhazhal
+ - Azukhaztul
+ - Azutulsanurik
+ - Baqka
+ - Baqmirrfar
+ - Churdra
+ - Darkir
+ - Darrkiraasitajr
+ - Darrvahahkkii
+ - Dradra
+ - Draii'rrikrik
+ - Drarrzir
+ - Dratulara
+ - Dynhhalaasiraj
+ - Dynhmak
+ - Eechthaa
+ - Farcreshjurl
+ - Fardradra
+ - Farkraraghjurl
+ - Farrheii'rdar
+ - Haljun
+ - Halmahthaa
+ - Halrheeech
+ - Halrikdynh
+ - Halthaa
+ - Ii'rdarrajmi
+ - Ii'rdynhrr
+ - Ii'rkhanmi
+ - Ii'rvahmiran
+ - Jijunmahaasi
+ - Jjrika
+ - Jrikaahksanu
+ - Junaasi
+ - Jundradarrjri
+ - Junkradareech
+ - Junrrwajurl
+ - Jurlfar
+ - Jurlhalrr
+ - Jurlmahnja
+ - Jurlrhetul
+ - Jurlrik
+ - Jurlzirkalmanq
+ - Kahaasi
+ - Kahara
+ - Kahdar
+ - Kahketdrarhe
+ - Kahmakbaq
+ - Kahrajrr
+ - Kalnalketkal
+ - Kalrhe
+ - Kalwamak
+ - Ketjri
+ - Khankal
+ - Khantulmi
+ - Khazaasikhaz
+ - Khazkirdynheech
+ - Khazrr
+ - Kiiara
+ - Kiihrarjurl
+ - Kiirajthaakii
+ - Kirjri
+ - Kirjriraghtul
+ - Kirkhankhan
+ - Kirmidradarr
+ - Krahaljurlqara
+ - Krakra
+ - Mahhrar
+ - Mahkalkalket
+ - Mahzirzarjurl
+ - Manqjri
+ - Mikra
+ - Mirthaa
+ - Nalchurvah
+ - Njaazukal
+ - Raghdarr
+ - Raghrrhazrhe
+ - Rhejurlcresh
+ - Rhetajrcreshmir
+ - Rikvah
+ - Rirrirbaq
+ - Rirrr
+ - Rirsam
+ - Rirvahrrzar
+ - Rrarahalsanu
+ - Rrhazbaq
+ - Rrhazdarr
+ - Rrjunjurlazu
+ - Rrkhaz
+ - Rrmiarachur
+ - Samrrhazhrarrhe
+ - Tajrara
+ - Tajrjri
+ - Tajrqaramahkhaz
+ - Tajrrirrirjri
+ - Tulmahii'rtajr
+ - Tulrhejri
diff --git a/Resources/Prototypes/_EE/Datasets/Names/tajaran_last.yml b/Resources/Prototypes/_EE/Datasets/Names/tajaran_last.yml
new file mode 100644
index 0000000000..0355c60452
--- /dev/null
+++ b/Resources/Prototypes/_EE/Datasets/Names/tajaran_last.yml
@@ -0,0 +1,38 @@
+- type: dataset
+ id: names_tajaran_last
+ values: # Randomly generated based on https://github.com/ParadiseSS13/Paradise/blob/5b516c3166a07cd10d035be1616248ba126e31a1/code/modules/mob/language.dm
+ - Aasirirrhe
+ - Aravah
+ - Azufarjri
+ - Baqhaljurl
+ - Churmir
+ - Darnal
+ - Dradarrjri
+ - Drahrardra
+ - Farsam
+ - Jridrajriara
+ - Jrirhe
+ - Junsanu
+ - Ketwami
+ - Khandradar
+ - Kiimah
+ - Krajunmirr
+ - Krajurlcresh
+ - Krakhazeech
+ - Kravah
+ - Mirrirkii
+ - Ranmirjri
+ - Rirrikvahrir
+ - Rraasi
+ - Rrhazka
+ - Tulchurnjarrhaz
+ - Tulkahhrar
+ - Vahjunkra
+ - Wami
+ - Zarranmakjri
+ - Zirtajrzar
+ - Hadii # These 5 surnames technically should appear way more
+ - Kaytam
+ - Zhan-Khazan
+ - Hharar
+ - Njarir'Akhan
diff --git a/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/human_facial_hair.yml b/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/human_facial_hair.yml
new file mode 100644
index 0000000000..ef78a10646
--- /dev/null
+++ b/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/human_facial_hair.yml
@@ -0,0 +1,70 @@
+- type: marking
+ id: HumanFacialHairChin2
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-beardchin
+- type: marking
+ id: HumanFacialHairSuperLong
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-beardlong
+- type: marking
+ id: HumanFacialHairShort
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-beardshort
+- type: marking
+ id: HumanFacialHairThick
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-beardthick
+- type: marking
+ id: HumanFacialHairViking
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-beardviking
+- type: marking
+ id: HumanFacialHairBristle
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-bristle
+- type: marking
+ id: HumanFacialHairMoustacheWithStubble
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-mustachewithstubble
+- type: marking
+ id: HumanFacialHairThickBristle
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: beard-thickbristle
+- type: marking
+ id: HumanFacialHairHandlebar
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _Corvax/Mobs/Customization/human_facial_hair.rsi
+ state: handlebar
+- type: marking
+ id: HumanFacialHairHandlebar2
+ bodyPart: FacialHair
+ markingCategory: FacialHair
+ sprites:
+ - sprite: _Corvax/Mobs/Customization/human_facial_hair.rsi
+ state: handlebar2
diff --git a/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/human_hair.yml b/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/human_hair.yml
new file mode 100644
index 0000000000..93d917d973
--- /dev/null
+++ b/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/human_hair.yml
@@ -0,0 +1,91 @@
+- type: marking
+ id: HumanHairArabicGathered
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-arabicgatheredhair
+- type: marking
+ id: HumanHairClassicHair
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-classichairmale
+- type: marking
+ id: HumanHairSideComb
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-combedfromside
+- type: marking
+ id: HumanHairLong4
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-longhair
+- type: marking
+ id: HumanHairManbun2
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-manbunold
+- type: marking
+ id: HumanHairPigtailTajaran
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-pigtailtajaran
+- type: marking
+ id: HumanHairShavedSide
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-shavedside
+- type: marking
+ id: HumanHairShorthair8
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-shorthaired
+- type: marking
+ id: HumanFembun
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _ADT/Mobs/Customization/Human/custom.rsi
+ state: hair-womenbun
+- type: marking
+ id: HumanHairAfricanPigtails
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Corvax/Mobs/Customization/human_hair.rsi
+ state: africanpigtails
+- type: marking
+ id: HumanHairAfropuffDouble
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Corvax/Mobs/Customization/human_hair.rsi
+ state: afropuffdouble
+- type: marking
+ id: HumanHairAfropuffLeft
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Corvax/Mobs/Customization/human_hair.rsi
+ state: afropuffleft
+- type: marking
+ id: HumanHairAfropuffRight
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Corvax/Mobs/Customization/human_hair.rsi
+ state: afropuffright
diff --git a/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/tajaran.yml b/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/tajaran.yml
new file mode 100644
index 0000000000..fe5d556929
--- /dev/null
+++ b/Resources/Prototypes/_EE/Entities/Mobs/Customization/Markings/tajaran.yml
@@ -0,0 +1,289 @@
+# Tajaran Tails
+
+- type: marking
+ id: TajaranTailRetro
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/tails.rsi
+ state: tail
+
+- type: marking
+ id: TajaranTailAnim
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/tails.rsi
+ state: tail_anim
+
+- type: marking
+ id: TajaranTailRetroRings
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/tails.rsi
+ state: tail
+ - sprite: _EE/Mobs/Customization/Tajaran/tail_markings.rsi
+ state: tail_rings
+
+- type: marking
+ id: TajaranTailAnimRings
+ bodyPart: Tail
+ markingCategory: Tail
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/tails.rsi
+ state: tail_anim
+ - sprite: _EE/Mobs/Customization/Tajaran/tail_markings.rsi
+ state: tail_anim_rings
+
+# Tajaran Ears
+
+- type: marking
+ id: TajaranEarsRetro
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/ears.rsi
+ state: ears
+
+- type: marking
+ id: TajaranEarsSeparate
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/ears.rsi
+ state: outears
+ - sprite: _EE/Mobs/Customization/Tajaran/ears.rsi
+ state: inears
+
+- type: marking
+ id: TajaranEarsRetroNear
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/ears.rsi
+ state: ears_near
+
+- type: marking
+ id: TajaranEarsSeparateNear
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/ears.rsi
+ state: outears_near
+ - sprite: _EE/Mobs/Customization/Tajaran/ears.rsi
+ state: inears_near
+
+# Tajaran Head/Face
+
+- type: marking
+ id: TajaranHeadNose
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/head.rsi
+ state: nose
+
+- type: marking
+ id: TajaranHeadMuzzle
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/head.rsi
+ state: muzzle
+
+- type: marking
+ id: TajaranHeadMuzzleLarge
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/head.rsi
+ state: muzzle_large
+
+- type: marking
+ id: TajaranHeadPoints
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/head.rsi
+ state: points
+
+- type: marking
+ id: TajaranHeadTiger
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/head.rsi
+ state: tiger_face
+
+- type: marking
+ id: TajaranHeadTigerAlt
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/head.rsi
+ state: tiger_head
+
+- type: marking
+ id: TajaranHeadPatches
+ bodyPart: Head
+ markingCategory: Head
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/head.rsi
+ state: patch
+
+# Tajaran Torso
+
+- type: marking
+ id: TajaranTorsoBelly
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/torso.rsi
+ state: belly
+
+- type: marking
+ id: TajaranTorsoCrest
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/torso.rsi
+ state: crest
+
+- type: marking
+ id: TajaranTorsoFullBelly
+ bodyPart: Chest
+ markingCategory: Chest
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/torso.rsi
+ state: fullbelly
+
+# Overlays
+
+- type: marking
+ id: TajaranOverlayPatch
+ bodyPart: LLeg
+ markingCategory: Overlay
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/overlays.rsi
+ state: patch
+
+- type: marking
+ id: TajaranOverlayPoints
+ bodyPart: LLeg
+ markingCategory: Overlay
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/overlays.rsi
+ state: points
+
+# Felinid Ears, adapted for tajaran (all needed to be higher up and/or modified to fit better)
+
+- type: marking
+ id: TajaranEarsBasic
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: basic_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: basic_inner
+
+- type: marking
+ id: TajaranEarsCurled
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: curled_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: curled_inner
+
+- type: marking
+ id: TajaranEarsDroopy
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: droopy_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: droopy_inner
+
+- type: marking
+ id: TajaranEarsFuzzy
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: basic_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: fuzzy_inner
+
+- type: marking
+ id: TajaranEarsStubby
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: stubby_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: stubby_inner
+
+- type: marking
+ id: TajaranEarsTall
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: tall_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: tall_inner
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: tall_fuzz
+
+- type: marking
+ id: TajaranEarsTorn
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: torn_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: torn_inner
+
+- type: marking
+ id: TajaranEarsWide
+ bodyPart: HeadTop
+ markingCategory: HeadTop
+ speciesRestriction: [Tajaran]
+ sprites:
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: wide_outer
+ - sprite: _EE/Mobs/Customization/Tajaran/felinid_ears.rsi
+ state: wide_inner
diff --git a/Resources/Prototypes/_EE/Entities/Mobs/Player/tajaran.yml b/Resources/Prototypes/_EE/Entities/Mobs/Player/tajaran.yml
new file mode 100644
index 0000000000..780545fa97
--- /dev/null
+++ b/Resources/Prototypes/_EE/Entities/Mobs/Player/tajaran.yml
@@ -0,0 +1,25 @@
+- type: entity
+ save: false
+ name: Urist McTajaran
+ parent: MobTajaranBase
+ id: MobTajaran
+ components:
+ - type: CombatMode
+ - type: MindContainer
+ showExamineInfo: true
+ - type: Input
+ context: "human"
+ - type: Speech
+ speechVerb: Felinid
+ - type: MobMover
+ - type: InputMover
+ - type: Alerts
+ - type: Actions
+ - type: Eye
+ - type: CameraRecoil
+ - type: Examiner
+ - type: CanHostGuardian
+ - type: NpcFactionMember
+ factions:
+ - NanoTrasen
+ - Cat
diff --git a/Resources/Prototypes/_EE/Entities/Mobs/Species/tajaran.yml b/Resources/Prototypes/_EE/Entities/Mobs/Species/tajaran.yml
new file mode 100644
index 0000000000..af50ad604c
--- /dev/null
+++ b/Resources/Prototypes/_EE/Entities/Mobs/Species/tajaran.yml
@@ -0,0 +1,129 @@
+- type: entity
+ name: Urist McTajaran
+ parent: BaseMobSpeciesOrganic
+ id: MobTajaranBase
+ abstract: true
+ components:
+ - type: Hunger
+ baseDecayRate: 0.02083333332 # 25% more than default
+ - type: Thirst
+ - type: Sprite
+ scale: 0.8, 0.8
+ - type: HumanoidAppearance
+ species: Tajaran
+ - type: Fixtures
+ fixtures: # TODO: This needs a second fixture just for mob collisions.
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 0.28
+ density: 140
+ restitution: 0.0
+ mask:
+ - MobMask
+ layer:
+ - MobLayer
+ - type: Body
+ prototype: Tajaran
+ requiredLegs: 2
+ - type: Damageable
+ damageModifierSet: Tajaran
+ - type: SlowOnDamage
+ speedModifierThresholds:
+ 60: 0.85 # 0.7 is base speed.
+ 80: 0.75 # 0.5 is base speed.
+ - type: Carriable # Carrying system from nyanotrasen.
+ - type: Butcherable
+ butcheringType: Spike
+ spawned:
+ - id: FoodMeatHuman
+ amount: 5
+ - type: TemperatureProtection # fur is a good insulator, actually
+ coefficient: 0.1
+ - type: Flammable
+ fireStackIncreaseMultiplier: 1.35 # until you light it up, cuz it's oily too
+ - type: NightVision
+ color: "#808080"
+ activateSound: null
+ deactivateSound: null
+ - type: Flashable
+ eyeDamageChance: 0.3
+ eyeDamage: 1
+ durationMultiplier: 1.5
+ - type: MeleeWeapon
+ soundHit:
+ collection: Punch
+ animation: WeaponArcClaw
+ damage:
+ types:
+ Slash: 4
+ Piercing: 1
+ - type: Speech
+ speechSounds: Alto
+ - type: DamageOnHighSpeedImpact # Landing on all fours!
+ damage:
+ types:
+ Blunt: 1
+ - type: Stamina
+ critThreshold: 85
+ decay: 2.55 # 3 base decay multiplied by 0.85 = 2.55
+ - type: TypingIndicator
+ proto: felinid
+ - type: PseudoItem
+ storedOffset: 0,17
+ shape:
+ - 0,0,1,4
+ - 0,2,3,4
+ - 4,0,5,4
+ - type: Vocal
+ wilhelm: "/Audio/Nyanotrasen/Voice/Felinid/cat_wilhelm.ogg"
+ sounds:
+ Male: MaleFelinid
+ Female: FemaleFelinid
+ Unsexed: MaleFelinid
+ - type: Felinid # real
+ - type: NoShoesSilentFootsteps
+ - type: StepTriggerImmune
+ whitelist:
+ types:
+ - Shard
+ - Landmine
+ - Mousetrap
+ - SlipEntity
+ - type: LanguageKnowledge
+ speaks:
+ - TauCetiBasic
+ - SiikMaas
+ understands:
+ - TauCetiBasic
+ - SiikMaas
+ - type: Tag
+ tags:
+ - CanPilot
+ - FootstepSound
+ - DoorBumpOpener
+ - FelinidEmotes
+ - type: FootPrints
+ - type: Temperature
+ coldDamageThreshold: 248.15 # -25 degrees centigrade, like 12 degrees below normal
+ currentTemperature: 311.76 # Body temperature of cat
+ heatDamage:
+ types:
+ Cold: 0.65 # in line with cold resist
+ coldDamage:
+ types:
+ Heat: 2 # poor kitty
+ - type: ThermalRegulator
+ normalBodyTemperature: 311.76
+
+
+- type: entity
+ save: false
+ name: Urist McHands
+ parent: MobHumanDummy
+ id: MobTajaranDummy
+ categories: [ HideSpawnMenu ]
+ description: A dummy tajaran meant to be used in character setup.
+ components:
+ - type: HumanoidAppearance
+ species: Tajaran
diff --git a/Resources/Prototypes/_EE/Language/Species-Specific/tajaran.yml b/Resources/Prototypes/_EE/Language/Species-Specific/tajaran.yml
new file mode 100644
index 0000000000..2612c841c8
--- /dev/null
+++ b/Resources/Prototypes/_EE/Language/Species-Specific/tajaran.yml
@@ -0,0 +1,360 @@
+# One of 5 languages that Tajara could speak, lore-wise best choice since others (lore wise) rely on gesticulation too
+# Short name is Maas
+# To quote: "The traditionally employed tongue of Adhomai, comprised of expressive yowls and chirps. Native to the Tajara"
+- type: language
+ id: SiikMaas
+ isVisibleLanguage: true
+ speech:
+ color: "#da954bee"
+ fontId: Noganas # Rugged, like the people and the land
+ obfuscation:
+ !type:SyllableObfuscation
+ minSyllables: 2 # this is mostly based on the name generator, 2-4 is there so it goes here too
+ maxSyllables: 4
+ replacement:
+ - mrr
+ - rr
+ - tajr
+ - kir
+ - raj
+ - kii
+ - mir
+ - kra
+ - ahk
+ - nal
+ - vah
+ - khaz
+ - jri
+ - ran
+ - darr
+ - mi
+ - jri
+ - dynh
+ - manq
+ - rhe
+ - zar
+ - rrhaz
+ - kal
+ - chur
+ - eech
+ - thaa
+ - dra
+ - jurl
+ - mah
+ - sanu
+ - dra
+ - ii'r
+ - ka
+ - aasi
+ - far
+ - wa
+ - baq
+ - ara
+ - qara
+ - zir
+ - sam
+ - mak
+ - hrar
+ - nja
+ - rir
+ - khan
+ - jun
+ - dar
+ - rik
+ - kah
+ - hal
+ - ket
+ - jurl
+ - mah
+ - tul
+ - cresh
+ - azu
+ - ragh
+ - mro
+ - mra
+ - mrro
+ - mrra
+
+# Tajaran sign language. Crucially, only tajara can "speak" it, due to need for tajara body language
+# (if they cut off your tail or ears you shouldn't be able to speak it, but well)
+- type: language
+ id: NalRasan
+ speech:
+ allowRadio: false
+ requireSpeech: false
+ color: "#dddddd"
+ messageWrapOverrides:
+ Speak: chat-sign-tajaran-language-message-wrap
+ Whisper: chat-sign-tajaran-language-whisper-wrap
+ speechVerbOverrides:
+ - chat-speech-verb-sign-nalrasan-1
+ - chat-speech-verb-sign-nalrasan-2
+ - chat-speech-verb-sign-nalrasan-3
+ - chat-speech-verb-sign-nalrasan-4
+ - chat-speech-verb-sign-nalrasan-5
+ - chat-speech-verb-sign-nalrasan-6
+ - chat-speech-verb-sign-nalrasan-7
+ - chat-speech-verb-sign-nalrasan-8
+ - chat-speech-verb-sign-nalrasan-9
+ - chat-speech-verb-sign-nalrasan-10
+ - chat-speech-verb-sign-nalrasan-11
+ - chat-speech-verb-sign-nalrasan-12
+ - chat-speech-verb-sign-nalrasan-13
+ - chat-speech-verb-sign-nalrasan-14
+ - chat-speech-verb-sign-nalrasan-15
+ - chat-speech-verb-sign-nalrasan-16
+ - chat-speech-verb-sign-nalrasan-17
+ obfuscation:
+ !type:ReplacementObfuscation
+ replacement:
+ - "" # basically we can't get around this, so let's pretend that it's alright while crying
+
+# One of 5 languages that Tajara could speak, this one is Tajara exclusive, and get some cool stuff thanks to that (non-verbal element)
+# Short name is Tajr
+# To quote: "Language native to the Tajara, it employs both verbal and non-verbal elements"
+- type: language
+ id: SiikTajr
+ isVisibleLanguage: true
+ speech:
+ color: "#f58c9aee" # Bright red, to push this energy through
+ fontId: Sriracha # relatively energetic, portraying the body movement I suppose
+ allowRadio: true # It's actually ok, since message wrap overrides are broken for radio, yipee?
+ requireSpeech: false
+ messageWrapOverrides:
+ Speak: chat-sign-tajaran-language-message-wrap
+ Whisper: chat-sign-tajaran-language-whisper-wrap
+ speechVerbOverrides:
+ - chat-speech-verb-sign-siiktajr-1
+ - chat-speech-verb-sign-siiktajr-2
+ - chat-speech-verb-sign-siiktajr-3
+ - chat-speech-verb-sign-siiktajr-4
+ - chat-speech-verb-sign-siiktajr-5
+ - chat-speech-verb-sign-siiktajr-6
+ - chat-speech-verb-sign-siiktajr-7
+ - chat-speech-verb-sign-siiktajr-8
+ - chat-speech-verb-sign-siiktajr-9
+ - chat-speech-verb-sign-siiktajr-10
+ obfuscation:
+ !type:SyllableObfuscation
+ minSyllables: 2
+ maxSyllables: 3 # shorter cuz dual lingo i suppose
+ replacement:
+ - mrr
+ - rr
+ - tajr
+ - kir
+ - raj
+ - kii
+ - mir
+ - kra
+ - ahk
+ - nal
+ - vah
+ - khaz
+ - jri
+ - ran
+ - darr
+ - mi
+ - jri
+ - dynh
+ - manq
+ - rhe
+ - zar
+ - rrhaz
+ - kal
+ - chur
+ - eech
+ - thaa
+ - dra
+ - jurl
+ - mah
+ - sanu
+ - dra
+ - ii'r
+ - ka
+ - aasi
+ - far
+ - wa
+ - baq
+ - ara
+ - qara
+ - zir
+ - sam
+ - mak
+ - hrar
+ - nja
+ - rir
+ - khan
+ - jun
+ - dar
+ - rik
+ - kah
+ - hal
+ - ket
+ - jurl
+ - mah
+ - tul
+ - cresh
+ - azu
+ - ragh
+ - mro
+ - mra
+ - mrro
+ - mrra
+
+
+# One of 5 languages that Tajara could speak, this one is your classic "The Nobility Language", also should have no translators availible
+# Short name is Yas
+# To quote: "The traditional language of the tajaran nobility"
+- type: language
+ id: YaSsa
+ isVisibleLanguage: true
+ speech:
+ color: "#9a69f5ee" # More or less the color of nobility
+ fontId: GrenzeGotisch # Old and distinguished, but not unreadable
+ obfuscation:
+ !type:SyllableObfuscation
+ minSyllables: 3
+ maxSyllables: 5 # since it's for nobility, we can make it a lil longer
+ replacement:
+ - hrr
+ - rhr
+ - tarj
+ - khir
+ - rajh
+ - kir
+ - mier
+ - kre
+ - ahek
+ - nlhal
+ - veh
+ - khaz
+ - dri
+ - rhan
+ - darrer
+ - mi
+ - jhri
+ - dynher
+ - manqi
+ - rhas
+ - shar
+ - drhaz
+ - kalh
+ - shur
+ - echi
+ - tha
+ - draer
+ - jurl
+ - maher
+ - sanii
+ - dra
+ - ii'r
+ - kan
+ - aesi
+ - fare
+ - we
+ - bash
+ - arha
+ - quara
+ - zhir
+ - sem
+ - make
+ - hrer
+ - nja
+ - rir
+ - can
+ - jhun
+ - dar
+ - rik
+ - kah
+ - hal
+ - kete
+ - juril
+ - mah
+ - tul
+ - cresh
+ - azu
+ - ragh
+ - miro
+ - mara
+ - mrero
+ - mrara
+
+
+# One of 5 languages that Tajara could speak, this one is the dialect lingo
+# Short name is Del
+# To quote: "A dialect developed by the Zhan-Khazan communities, commonly used in religious
+# ceremonies dedicated to the Snow God and amongst settlements comprised mostly of Zhan-Khazan"
+- type: language
+ id: Delvahii
+ isVisibleLanguage: true
+ speech:
+ color: "#b1c472ee" # Green, color of grass, of change, and of spring
+ fontId: RubikDirt # Aptly named
+ obfuscation:
+ !type:SyllableObfuscation
+ minSyllables: 2
+ maxSyllables: 4 # again, normal length
+ replacement:
+ - mrr
+ - rr
+ - tajr
+ - kir
+ - raj
+ - kii
+ - mir
+ - kra
+ - ahk
+ - nal
+ - vah
+ - khaz
+ - jri
+ - ran
+ - darr
+ - mi
+ - jri
+ - dynh
+ - manq
+ - rhe
+ - zar
+ - rrhaz
+ - kal
+ - chur
+ - eech
+ - thaa
+ - dra
+ - jurl
+ - mah
+ - sanu
+ - dra
+ - ii'r
+ - ka
+ - aasi
+ - far
+ - wa
+ - baq
+ - ara
+ - qara
+ - zir
+ - sam
+ - mak
+ - hrar
+ - nja
+ - rir
+ - khan
+ - jun
+ - dar
+ - rik
+ - kah
+ - hal
+ - ket
+ - jurl
+ - mah
+ - tul
+ - cresh
+ - azu
+ - ragh
+ - mro
+ - mra
+ - mrro
+ - mrra
diff --git a/Resources/Prototypes/_EE/Species/tajaran.yml b/Resources/Prototypes/_EE/Species/tajaran.yml
new file mode 100644
index 0000000000..d7029f67fe
--- /dev/null
+++ b/Resources/Prototypes/_EE/Species/tajaran.yml
@@ -0,0 +1,175 @@
+- type: species
+ id: Tajaran
+ name: species-name-tajaran
+ roundStart: true
+ prototype: MobTajaran
+ sprites: MobTajaranSprites
+ markingLimits: MobTajaranMarkingLimits
+ dollPrototype: MobTajaranDummy
+ skinColoration: AnimalFur
+ minHeight: 0.65
+ defaultHeight: 0.8
+ maxHeight: 1.1
+ minWidth: 0.6
+ defaultWidth: 0.8
+ maxWidth: 1.15
+ maleFirstNames: names_tajaran_first
+ femaleFirstNames: names_tajaran_first
+ lastNames: names_tajaran_last
+
+
+- type: markingPoints
+ id: MobTajaranMarkingLimits
+ points:
+ Hair:
+ points: 1
+ required: false
+ FacialHair:
+ points: 1
+ required: false
+ Tail:
+ points: 1
+ required: true
+ defaultMarkings: [ TajaranTailRetro ]
+ HeadTop:
+ points: 1
+ required: true
+ defaultMarkings: [ TajaranEarsBasic ]
+ 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: 3
+ required: false
+ LeftArm:
+ points: 2
+ required: false
+ LeftHand:
+ points: 3
+ required: false
+
+- type: speciesBaseSprites
+ id: MobTajaranSprites
+ sprites:
+ Head: MobTajaranHead
+ HeadTop: MobHumanoidAnyMarking
+ HeadSide: MobHumanoidAnyMarking
+ Hair: MobHumanoidAnyMarking
+ FacialHair: MobHumanoidAnyMarking
+ Snout: MobHumanoidAnyMarking
+ Chest: MobTajaranTorso
+ Eyes: MobTajaranEyes
+ LArm: MobTajaranLArm
+ RArm: MobTajaranRArm
+ LHand: MobTajaranLHand
+ RHand: MobTajaranRHand
+ LLeg: MobTajaranLLeg
+ RLeg: MobTajaranRLeg
+ Tail: MobHumanoidAnyMarking
+ LFoot: MobTajaranLFoot
+ RFoot: MobTajaranRFoot
+
+- type: humanoidBaseSprite
+ id: MobTajaranEyes
+ baseSprite:
+ sprite: Mobs/Customization/eyes.rsi
+ state: eyes
+
+- type: humanoidBaseSprite
+ id: MobTajaranHead
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: head_m
+
+- type: humanoidBaseSprite
+ id: MobTajaranHeadMale
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: head_m
+
+- type: humanoidBaseSprite
+ id: MobTajaranHeadFemale
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: head_f
+
+- type: humanoidBaseSprite
+ id: MobTajaranTorso
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: torso_m
+
+- type: humanoidBaseSprite
+ id: MobTajaranTorsoMale
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: torso_m
+
+- type: humanoidBaseSprite
+ id: MobTajaranTorsoFemale
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: torso_f
+
+- type: humanoidBaseSprite
+ id: MobTajaranLLeg
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: l_leg
+
+- type: humanoidBaseSprite
+ id: MobTajaranLArm
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: l_arm
+
+- type: humanoidBaseSprite
+ id: MobTajaranLHand
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: l_hand
+
+- type: humanoidBaseSprite
+ id: MobTajaranLFoot
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: l_foot
+
+- type: humanoidBaseSprite
+ id: MobTajaranRLeg
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: r_leg
+
+- type: humanoidBaseSprite
+ id: MobTajaranRArm
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: r_arm
+
+- type: humanoidBaseSprite
+ id: MobTajaranRHand
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: r_hand
+
+- type: humanoidBaseSprite
+ id: MobTajaranRFoot
+ baseSprite:
+ sprite: _EE/Mobs/Species/Tajaran/parts.rsi
+ state: r_foot
diff --git a/Resources/Prototypes/_EE/Traits/languages.yml b/Resources/Prototypes/_EE/Traits/languages.yml
new file mode 100644
index 0000000000..7996f96da4
--- /dev/null
+++ b/Resources/Prototypes/_EE/Traits/languages.yml
@@ -0,0 +1,85 @@
+- type: trait
+ id: SiikMaas
+ category: TraitsSpeechLanguages
+ points: -1
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: TraitsLanguagesBasic
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Tajaran
+ functions:
+ - !type:TraitModifyLanguages
+ languagesSpoken:
+ - SiikMaas
+ languagesUnderstood:
+ - SiikMaas
+
+- type: trait
+ id: NalRasan
+ category: TraitsSpeechLanguages
+ points: -1
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: TraitsLanguagesBasic
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Tajaran
+ functions:
+ - !type:TraitModifyLanguages
+ languagesSpoken:
+ - NalRasan
+ languagesUnderstood:
+ - NalRasan
+
+- type: trait
+ id: SiikTajr
+ category: TraitsSpeechLanguages
+ points: -2
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: TraitsLanguagesBasic
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Tajaran
+ functions:
+ - !type:TraitModifyLanguages
+ languagesSpoken:
+ - SiikTajr
+ languagesUnderstood:
+ - SiikTajr
+
+- type: trait
+ id: YaSsa
+ category: TraitsSpeechLanguages
+ points: -2
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: TraitsLanguagesBasic
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Tajaran
+ functions:
+ - !type:TraitModifyLanguages
+ languagesSpoken:
+ - YaSsa
+ languagesUnderstood:
+ - YaSsa
+
+- type: trait
+ id: Delvahii
+ category: TraitsSpeechLanguages
+ points: -2
+ requirements:
+ - !type:CharacterItemGroupRequirement
+ group: TraitsLanguagesBasic
+ - !type:CharacterSpeciesRequirement
+ species:
+ - Tajaran
+ functions:
+ - !type:TraitModifyLanguages
+ languagesSpoken:
+ - Delvahii
+ languagesUnderstood:
+ - Delvahii
diff --git a/Resources/Prototypes/_Goobstation/Actions/clothing.yml b/Resources/Prototypes/_Goobstation/Actions/clothing.yml
new file mode 100644
index 0000000000..d82ab2718f
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Actions/clothing.yml
@@ -0,0 +1,20 @@
+- type: entity
+ id: ActionClothingSeal
+ name: Seal/Unseal Clothing
+ description: Seals or unseals your current clothing.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: ConfirmableAction
+ confirmDelay: 0
+ primeTime: 2
+ - type: InstantAction
+ checkCanInteract: true
+ checkConsciousness: true
+ itemIconStyle: NoItem
+ icon:
+ sprite: _Goobstation/Actions/modsuit.rsi
+ state: activate
+ iconOn:
+ sprite: _Goobstation/Actions/modsuit.rsi
+ state: activate-ready
+ event: !type:SealClothingEvent {}
diff --git a/Resources/Prototypes/_Goobstation/Alerts/alerts.yml b/Resources/Prototypes/_Goobstation/Alerts/alerts.yml
new file mode 100644
index 0000000000..efacd4a096
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Alerts/alerts.yml
@@ -0,0 +1,19 @@
+- type: alert
+ id: ModsuitPower
+ icons:
+ - sprite: /Textures/_Goobstation/Interface/Alerts/modpower.rsi
+ state: modpower0
+ - sprite: /Textures/_Goobstation/Interface/Alerts/modpower.rsi
+ state: modpower1
+ - sprite: /Textures/_Goobstation/Interface/Alerts/modpower.rsi
+ state: modpower2
+ - sprite: /Textures/_Goobstation/Interface/Alerts/modpower.rsi
+ state: modpower3
+ - sprite: /Textures/_Goobstation/Interface/Alerts/modpower.rsi
+ state: modpower4
+ - sprite: /Textures/_Goobstation/Interface/Alerts/modpower.rsi
+ state: modpower5
+ name: alerts-modsuit-power-name
+ description: alerts-modsuit-power-desc
+ minSeverity: 0
+ maxSeverity: 5
diff --git a/Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_science.yml b/Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_science.yml
new file mode 100644
index 0000000000..56d703b1ab
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_science.yml
@@ -0,0 +1,9 @@
+- type: cargoProduct
+ id: ScienceModsuitCores
+ icon:
+ sprite: _Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi
+ state: mod-core-standard
+ product: CrateScienceModsuitCoresFilled
+ cost: 3000
+ category: cargoproduct-category-name-science
+ group: market
diff --git a/Resources/Prototypes/_Goobstation/Catalog/Fills/Crates/science.yml b/Resources/Prototypes/_Goobstation/Catalog/Fills/Crates/science.yml
new file mode 100644
index 0000000000..f6d85c39b6
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Catalog/Fills/Crates/science.yml
@@ -0,0 +1,10 @@
+- type: entity
+ id: CrateScienceModsuitCoresFilled
+ parent: CrateScienceSecure
+ name: MOD cores crate
+ description: Contains three MOD cores inside.
+ components:
+ - type: StorageFill
+ contents:
+ - id: ModsuitCoreStandard
+ amount: 3
diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Back/modsuit.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Back/modsuit.yml
new file mode 100644
index 0000000000..7d0b625839
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Back/modsuit.yml
@@ -0,0 +1,92 @@
+- type: entity
+ parent: [Clothing, ContentsExplosionResistanceBase]
+ id: ClothingModsuitStandard
+ name: standard modsuit control
+ description: A special modular suit contol containing all modular suit parts.
+ components:
+ - type: Appearance
+ - type: Sprite
+ sprite: _Goobstation/Clothing/Back/Modsuits/standard.rsi
+ layers:
+ - state: control
+ - state: control-sealed
+ visible: false
+ shader: unshaded
+ map: [ "sealed" ]
+ - type: Item
+ size: Huge
+ - type: Clothing
+ quickEquip: false
+ slots:
+ - back
+ - type: Storage
+ grid:
+ - 0,0,6,3
+ maxItemSize: Huge
+ - type: ContainerContainer
+ containers:
+ storagebase: !type:Container
+ ents: []
+ toggleable-clothing: !type:Container
+ cell_slot: !type:ContainerSlot
+ - type: UserInterface
+ interfaces:
+ enum.StorageUiKey.Key:
+ type: StorageBoundUserInterface
+ enum.ToggleClothingUiKey.Key:
+ type: ToggleableClothingBoundUserInterface
+ - type: UseDelay
+ delay: 0.5
+ - type: ExplosionResistance
+ damageCoefficient: 0.9
+ - type: ToggleableClothing
+ requiredSlot: back
+ blockUnequipWhenAttached: true
+ replaceCurrentClothing: true
+ clothingPrototypes:
+ head: ClothingModsuitHelmetStandard
+ gloves: ClothingModsuitGauntletsStandard
+ outerClothing: ClothingModsuitChestplateStandard
+ shoes: ClothingModsuitBootsStandard
+ - type: WiresPanel
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ whitelist:
+ components:
+ - PowerCell
+ - type: ItemSlotsRequirePanel
+ slots:
+ cell_slot: true
+ - type: PowerCellDraw
+ drawRate: 1 # Sealed draw rate
+ useRate: 5 # Draw rate for sealing
+ - type: PowerCellSlot
+ cellSlotId: cell_slot
+ fitsInCharger: false
+ - type: DoAfter
+ - type: SealableClothingControl
+ - type: SealableClothingRequiresPower
+ - type: SealableClothingVisuals
+ visualLayers:
+ back:
+ - state: equipped-BACKPACK-sealed
+ shader: unshaded
+ - type: Construction
+ graph: Modsuit
+ node: standard
+
+- type: entity
+ parent: ClothingModsuitStandard
+ id: ClothingModsuitStandardPowerCell
+ suffix: High-Capacity Battery
+ components:
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ startingItem: PowerCellHigh
+ whitelist:
+ components:
+ - PowerCell
diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Hands/modsuit.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Hands/modsuit.yml
new file mode 100644
index 0000000000..a6b5eb3b0e
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Hands/modsuit.yml
@@ -0,0 +1,32 @@
+- type: entity
+ parent: ClothingHandsBase
+ id: ClothingModsuitGauntletsStandard
+ name: standard modsuit gauntlets
+ description: A special modular suit gloves that protect wearer from electric shock.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Appearance
+ - type: Sprite
+ sprite: _Goobstation/Clothing/Hands/Modsuits/standard.rsi
+ layers:
+ - state: gauntlets
+ - state: gauntlets-sealed
+ visible: false
+ map: [ "sealed" ]
+ - type: Clothing
+ equipSound: /Audio/Mecha/mechmove03.ogg
+ unequipSound: /Audio/Mecha/mechmove03.ogg
+ slots: [ gloves ]
+ - type: Insulated
+ - type: Fiber
+ fiberMaterial: fibers-modular
+ fiberColor: fibers-black
+ - type: FingerprintMask
+ - type: SealableClothing
+ sealUpPopup: sealable-clothing-seal-up-gauntlets
+ sealDownPopup: sealable-clothing-seal-down-gauntlets
+ - type: SealableClothingVisuals
+ visualLayers:
+ gloves:
+ - state: equipped-HAND-sealed
+ shader: unshaded
diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Head/modsuit.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Head/modsuit.yml
new file mode 100644
index 0000000000..09be4262a8
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Head/modsuit.yml
@@ -0,0 +1,128 @@
+- type: entity
+ abstract: true
+ # Used to put pressureProtection, layers blocker and etc components into ComponentToggler
+ id: BaseClothingModsuitHelmet
+ name: base modsuit helmet
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Sprite
+ state: icon
+ - type: Clickable
+ - type: InteractionOutline
+ - type: GroupExamine
+ - type: Clothing
+ equippedPrefix: off
+ equipSound: /Audio/Mecha/mechmove03.ogg
+ unequipSound: /Audio/Mecha/mechmove03.ogg
+ quickEquip: false
+ slots: [ HEAD ]
+ clothingVisuals:
+ head:
+ - state: equipped-HEAD
+ - type: Tag
+ tags:
+ - WhitelistChameleon
+
+- type: entity
+ abstract: true
+ parent: BaseClothingModsuitHelmet
+ # Used for helmets that hide your identity even if it's not sealed
+ id: BaseClothingModsuitHelmetHideIdentity
+ name: base modsuit helmet
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: IdentityBlocker
+ - type: IngestionBlocker
+ - type: HideLayerClothing
+ slots:
+ - Hair
+ - Snout
+ - HeadTop
+ - HeadSide
+
+- type: entity
+ parent: BaseClothingModsuitHelmet
+ id: ClothingModsuitHelmetStandard
+ name: standard modsuit helmet
+ description: A special modular suit spaceproof helmet designed for compact folding inside modular suit control.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Appearance
+ - type: Sprite
+ sprite: _Goobstation/Clothing/Head/Modsuits/standard.rsi
+ layers:
+ - state: helmet
+ - state: helmet-sealed
+ visible: false
+ map: [ "sealed" ]
+ - type: HideLayerClothing # This helmet don't have sprite on unsealed state
+ slots:
+ - Snout
+ - type: SealableClothing
+ sealUpPopup: sealable-clothing-seal-up-helmet
+ sealDownPopup: sealable-clothing-seal-down-helmet
+ - type: SealableClothingVisuals
+ visualLayers:
+ head:
+ - state: equipped-HEAD-sealed
+ - type: Armor
+ modifiers:
+ coefficients:
+ Blunt: 0.90
+ Slash: 0.90
+ Piercing: 0.95
+ Heat: 0.90
+ Radiation: 0.75
+ - type: ComponentToggler
+ components:
+ - type: BreathMask
+ - type: PressureProtection
+ highPressureMultiplier: 0.3
+ lowPressureMultiplier: 1000
+ - type: TemperatureProtection
+ coefficient: 0.1
+ - type: IdentityBlocker
+ - type: IngestionBlocker
+ - type: HideLayerClothing
+ slots:
+ - Hair
+ - Snout
+ - HeadTop
+ - HeadSide
+ # This will all be replaced by modules later
+ - type: ToggleableLightVisuals
+ - type: PointLight
+ enabled: false
+ radius: 3
+ energy: 2
+ mask: /Textures/Effects/LightMasks/cone.png
+ autoRot: true
+ netsync: false
+ - 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: Battery
+ maxCharge: 600 # Lights drain 3/s but recharge of 2 makes this 1/s, therefore 600 is 10 minutes of light
+ startingCharge: 600
+ - type: BatterySelfRecharger
+ autoRecharge: true
+ autoRechargeRate: 2
+
diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/OuterClothing/modsuit.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/OuterClothing/modsuit.yml
new file mode 100644
index 0000000000..c8cca76bad
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/OuterClothing/modsuit.yml
@@ -0,0 +1,47 @@
+- type: entity
+ parent: ClothingOuterBase
+ id: ClothingModsuitChestplateStandard
+ name: standard modsuit chestplate
+ description: A special modular suit spaceproof cover designed for compact folding inside modular suit control.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Appearance
+ - type: AllowSuitStorage
+ - type: Sprite
+ sprite: _Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi
+ layers:
+ - state: chestplate
+ - state: chestplate-sealed
+ visible: false
+ map: [ "sealed" ]
+ - type: Clothing
+ equipSound: /Audio/Mecha/mechmove03.ogg
+ unequipSound: /Audio/Mecha/mechmove03.ogg
+ slots: [ outerClothing ]
+ - type: ClothingSpeedModifier
+ walkModifier: 0.9
+ sprintModifier: 0.9
+ - type: SealableClothing
+ sealUpPopup: sealable-clothing-seal-up-chestplate
+ sealDownPopup: sealable-clothing-seal-down-chestplate
+ - type: SealableClothingVisuals
+ visualLayers:
+ outerClothing:
+ - state: equipped-OUTERCLOTHING-sealed
+ shader: unshaded
+ - type: Armor
+ modifiers:
+ coefficients:
+ Blunt: 0.85
+ Slash: 0.85
+ Piercing: 0.85
+ Heat: 0.85
+ Radiation: 0.6
+ - type: ComponentToggler
+ components:
+ - type: PressureProtection
+ highPressureMultiplier: 0.3
+ lowPressureMultiplier: 1000
+ - type: TemperatureProtection
+ coefficient: 0.1
+
diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Shoes/modsuit.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Shoes/modsuit.yml
new file mode 100644
index 0000000000..4f192c6a23
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Shoes/modsuit.yml
@@ -0,0 +1,33 @@
+- type: entity
+ parent: ClothingShoesBase
+ id: ClothingModsuitBootsStandard
+ name: standard modsuit boots
+ description: A special modular suit boots designed for compact folding inside modular suit control.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Appearance
+ - type: Sprite
+ sprite: _Goobstation/Clothing/Shoes/Modsuits/standard.rsi
+ layers:
+ - state: boots
+ - state: boots-sealed
+ visible: false
+ map: [ "sealed" ]
+ - type: Clothing
+ equipSound: /Audio/Mecha/mechmove03.ogg
+ unequipSound: /Audio/Mecha/mechmove03.ogg
+ slots: [ feet ]
+ - type: Tag
+ tags:
+ - WhitelistChameleon
+ - type: SealableClothing
+ sealUpPopup: sealable-clothing-seal-up-boots
+ sealDownPopup: sealable-clothing-seal-down-boots
+ - type: ClothingSpeedModifier
+ walkModifier: 0.9
+ sprintModifier: 0.9
+ - type: SealableClothingVisuals
+ visualLayers:
+ shoes:
+ - state: equipped-FEET-sealed
+ shader: unshaded
diff --git a/Resources/Prototypes/_Goobstation/Entities/Mobs/Customization/Markings/human_hair.yml b/Resources/Prototypes/_Goobstation/Entities/Mobs/Customization/Markings/human_hair.yml
new file mode 100644
index 0000000000..96abc2dfd4
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Entities/Mobs/Customization/Markings/human_hair.yml
@@ -0,0 +1,264 @@
+# Goobstation TODO: this should be in a goobstation folder
+- type: marking
+ id: HumanHairBraidedExtension
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: braidedExtensions
+
+- type: marking
+ id: HumanHairCometTail
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: cometTail
+
+- type: marking
+ id: HumanHairFantasyHair
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: fantasyHair
+
+- type: marking
+ id: HumanHairFlatTwistsUpdo
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: flatTwistsUpdo
+
+- type: marking
+ id: HumanHairFloorlengthBraid
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: floorlengthBraid
+
+- type: marking
+ id: HumanHairFloorlengthWavy
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: floorlengthWavy
+
+- type: marking
+ id: HumanHairFrontBraidsLong
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: frontBraidsLong
+
+- type: marking
+ id: HumanHairFrontBraidsMedium
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: frontBraidsMedium
+
+- type: marking
+ id: HumanHairFrontBraidsShort
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: frontBraidsShort
+
+- type: marking
+ id: HumanHairHairnet
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: hairnet
+
+- type: marking
+ id: HumanHairJellyfish
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: jellyfish
+
+- type: marking
+ id: HumanHairKazuyaMishima
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: kazuyaMishima
+
+- type: marking
+ id: HumanHairLongBraids
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: longBraids
+
+- type: marking
+ id: HumanHairLongCurvy
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: longCurvy
+
+- type: marking
+ id: HumanHairLongPompadour
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: longPompadour
+
+- type: marking
+ id: HumanHairMediumCurls
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: mediumCurls
+
+- type: marking
+ id: HumanHairMullet
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: mullet
+
+- type: marking
+ id: HumanHairPelvicLengthBraid
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: pelvicLengthBraid
+
+- type: marking
+ id: HumanHairPlateau
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: plateau
+
+- type: marking
+ id: HumanHairQueenBee
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: queenBee
+
+- type: marking
+ id: HumanHairSaggedMohawk
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: saggedMohawk
+
+- type: marking
+ id: HumanHairSharpMohawk
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: sharpMohawk
+
+- type: marking
+ id: HumanHairShortAndPoofy
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: shortAndPoofy
+
+- type: marking
+ id: HumanHairShortCurls
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: shortCurls
+
+- type: marking
+ id: HumanHairShoulderLengthBraid
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: shoulderLengthBraid
+
+- type: marking
+ id: HumanHairSideSpike
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: sideSpike
+
+- type: marking
+ id: HumanHairSpaceLoops
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: spaceLoops
+
+- type: marking
+ id: HumanHairStar
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: star
+
+- type: marking
+ id: HumanHairStarFro
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: starFro
+
+- type: marking
+ id: HumanHairStyledCurls
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: styledCurls
+
+- type: marking
+ id: HumanHairUnkemptScientist
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: unkemptScientist
+
+- type: marking
+ id: HumanHairFrizzyBraid
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: frizzyBraid
+
+- type: marking
+ id: HumanHairWispy
+ bodyPart: Hair
+ markingCategory: Hair
+ sprites:
+ - sprite: _Goobstation/Mobs/Customization/human_hair.rsi
+ state: wispy
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 dcb7ecfb45..85a5aeea01 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/Entities/Objects/Specific/Robotics/modsuit_parts.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Robotics/modsuit_parts.yml
new file mode 100644
index 0000000000..47ab0265e1
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Robotics/modsuit_parts.yml
@@ -0,0 +1,162 @@
+- type: entity
+ id: PartModsuit
+ parent: BaseItem
+ name: MOD part
+ description: A part used in MOD construction.
+ abstract: true
+ components:
+ - type: Sprite
+ sprite: _Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi
+ - type: Icon
+ sprite: _Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi
+ - type: Item
+ size: Normal
+ - type: ContainerContainer
+ containers:
+ bodypart: !type:Container
+ ents: []
+ #- type: GuideHelp TODO: Guide
+
+- type: entity
+ id: ModsuitChestplate
+ parent: PartModsuit
+ name: MOD chestplate
+ components:
+ - type: Sprite
+ state: chestplate
+ - type: Icon
+ state: chestplate
+ - type: PhysicalComposition
+ materialComposition:
+ Steel: 62
+ - type: Tag
+ tags:
+ - ModsuitPart
+ - ModsuitChestplate
+
+- type: entity
+ id: ModsuitBoots
+ parent: PartModsuit
+ name: MOD boots
+ components:
+ - type: Sprite
+ state: boots
+ - type: Icon
+ state: boots
+ - type: PhysicalComposition
+ materialComposition:
+ Steel: 62
+ - type: Tag
+ tags:
+ - ModsuitPart
+ - ModsuitBoots
+
+- type: entity
+ id: ModsuitHelmet
+ parent: PartModsuit
+ name: MOD helmet
+ components:
+ - type: Sprite
+ state: helmet
+ - type: Icon
+ state: helmet
+ - type: PhysicalComposition
+ materialComposition:
+ Steel: 62
+ - type: Tag
+ tags:
+ - ModsuitPart
+ - ModsuitHelmet
+
+- type: entity
+ id: ModsuitGauntlets
+ parent: PartModsuit
+ name: MOD gauntlets
+ components:
+ - type: Sprite
+ state: gauntlets
+ - type: Icon
+ state: gauntlets
+ - type: PhysicalComposition
+ materialComposition:
+ Steel: 62
+ - type: Tag
+ tags:
+ - ModsuitPart
+ - ModsuitGauntlets
+
+- type: entity
+ id: ModsuitShell
+ parent: PartModsuit
+ name: MOD shell
+ components:
+ - type: Appearance
+ - type: Sprite
+ state: shell
+ - type: Icon
+ state: shell
+ - type: PhysicalComposition
+ materialComposition:
+ Steel: 125
+ Plasma: 62
+ - type: ContainerContainer
+ containers:
+ cell_slot: !type:Container
+ core-container: !type:Container
+ - type: Construction
+ graph: Modsuit
+ node: start
+ defaultTarget: standard
+ containers:
+ - cell_slot
+ - core-container
+ - type: GenericVisualizer
+ visuals:
+ enum.ConstructionVisuals.Key:
+ enum.ConstructionVisuals.Layer:
+ shell-core: { state: shell-core }
+ shell-core-secured: { state: shell-core-secured }
+ shell-helmet: { state: shell-helmet }
+ shell-chestplate: { state: shell-chestplate }
+ shell-gauntlets: { state: shell-gauntlets }
+ shell-boots: { state: shell-boots }
+ shell-secured: { state: shell-secured }
+
+- type: entity
+ id: ModsuitPlatingExternal
+ parent: PartModsuit
+ name: MOD standard external plating
+ description: A part used in MOD construction.
+ components:
+ - type: Sprite
+ state: standard-plating
+ - type: Icon
+ state: standard-plating
+ - type: PhysicalComposition
+ materialComposition:
+ Steel: 75
+ Glass: 37
+ Plasma: 12
+ - type: Tag
+ tags:
+ - ModsuitPart
+ - ModsuitPlatingExternal
+
+- type: entity
+ id: ModsuitCoreStandard
+ parent: PartModsuit
+ name: MOD standard core
+ description: Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, owing to their appearance; which is exactly similar to that of an Ethereal's heart. Which one you have in your suit is unclear, but either way, it's been repurposed to be an internal power source for a Modular Outerwear Device.
+ components:
+ - type: Sprite
+ state: mod-core-standard
+ - type: Icon
+ state: mod-core-standard
+ - type: Tag
+ tags:
+ - ModsuitPart
+ - ModsuitCore
+ - type: PhysicalComposition
+ materialComposition:
+ Plasma: 50
+ Glass: 25
diff --git a/Resources/Prototypes/_Goobstation/Recipes/Construction/Graphs/clothing/modsuit.yml b/Resources/Prototypes/_Goobstation/Recipes/Construction/Graphs/clothing/modsuit.yml
new file mode 100644
index 0000000000..22357a98f7
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Recipes/Construction/Graphs/clothing/modsuit.yml
@@ -0,0 +1,113 @@
+- type: constructionGraph
+ id: Modsuit
+ start: start
+ graph:
+ - node: start
+ entity: ModsuitShell
+ edges:
+ - to: shell-core
+ steps:
+ - tag: ModsuitCore
+ name: MOD core
+ store: core-container
+ completed:
+ - !type:PlaySound
+ sound: /Audio/Items/screwdriver2.ogg
+
+ - node: shell-core
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: start
+ steps:
+ - tool: Prying
+ completed:
+ - !type:EmptyContainer
+ container: core-container
+ - to: shell-core-secured
+ steps:
+ - tool: Screwing
+ doAfter: 1
+
+ - node: shell-core-secured
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: shell-helmet
+ steps:
+ - tag: ModsuitHelmet
+ name: MOD helmet
+ doAfter: 1
+ completed:
+ - !type:PlaySound
+ sound: /Audio/Items/screwdriver2.ogg
+
+ - node: shell-helmet
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: shell-chestplate
+ steps:
+ - tag: ModsuitChestplate
+ name: MOD chestplate
+ doAfter: 1
+ completed:
+ - !type:PlaySound
+ sound: /Audio/Items/screwdriver2.ogg
+
+ - node: shell-chestplate
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: shell-gauntlets
+ steps:
+ - tag: ModsuitGauntlets
+ name: MOD gauntlets
+ doAfter: 1
+ completed:
+ - !type:PlaySound
+ sound: /Audio/Items/screwdriver2.ogg
+
+ - node: shell-gauntlets
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: shell-boots
+ steps:
+ - tag: ModsuitBoots
+ name: MOD boots
+ doAfter: 1
+ completed:
+ - !type:PlaySound
+ sound: /Audio/Items/screwdriver2.ogg
+
+ - node: shell-boots
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: shell-secured
+ steps:
+ - tool: Anchoring
+ doAfter: 1
+
+ - tool: Screwing
+ doAfter: 1
+
+ - node: shell-secured
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: standard
+ steps:
+ - tag: ModsuitPlatingExternal
+ name: any MOD plating
+ doAfter: 1
+ completed:
+ - !type:PlaySound
+ sound: /Audio/Items/screwdriver2.ogg
+
+ - tool: Anchoring
+ doAfter: 1
+
+ - node: standard
+ entity: ClothingModsuitStandard
diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/categories.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/categories.yml
index 42e63aaf24..a8107f0c2c 100644
--- a/Resources/Prototypes/_Goobstation/Recipes/Lathes/categories.yml
+++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/categories.yml
@@ -38,3 +38,7 @@
- type: latheCategory
id: MechWeapons
name: lathe-category-mechs-weapons
+
+- type: latheCategory
+ id: Modsuit
+ name: lathe-category-modsuit
diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/robotics.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/robotics.yml
new file mode 100644
index 0000000000..66c23c1fbc
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/robotics.yml
@@ -0,0 +1,50 @@
+- type: latheRecipe
+ id: ModsuitChestplate
+ result: ModsuitChestplate
+ category: Modsuit
+ completetime: 5
+ materials:
+ Steel: 250
+
+- type: latheRecipe
+ id: ModsuitBoots
+ result: ModsuitBoots
+ category: Modsuit
+ completetime: 5
+ materials:
+ Steel: 250
+
+- type: latheRecipe
+ id: ModsuitHelmet
+ result: ModsuitHelmet
+ category: Modsuit
+ completetime: 5
+ materials:
+ Steel: 250
+
+- type: latheRecipe
+ id: ModsuitGauntlets
+ result: ModsuitGauntlets
+ category: Modsuit
+ completetime: 5
+ materials:
+ Steel: 250
+
+- type: latheRecipe
+ id: ModsuitShell
+ result: ModsuitShell
+ category: Modsuit
+ completetime: 5
+ materials:
+ Steel: 500
+ Plasma: 250
+
+- type: latheRecipe
+ id: ModsuitPlatingExternal
+ result: ModsuitPlatingExternal
+ category: Modsuit
+ completetime: 5
+ materials:
+ Steel: 300
+ Glass: 150
+ Plasma: 50
diff --git a/Resources/Prototypes/_Goobstation/Research/experimental.yml b/Resources/Prototypes/_Goobstation/Research/experimental.yml
new file mode 100644
index 0000000000..732c337016
--- /dev/null
+++ b/Resources/Prototypes/_Goobstation/Research/experimental.yml
@@ -0,0 +1,19 @@
+- type: technology
+ id: ModsuitsTech
+ name: research-technology-modsuits
+ icon:
+ sprite: _Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi
+ state: mod-core-standard
+ discipline: Experimental
+ tier: 3
+ cost: 5000
+ technologyPrerequisites:
+ - AdvancedTacsuits
+ softCapContribution: 1.5
+ recipeUnlocks:
+ - ModsuitChestplate
+ - ModsuitBoots
+ - ModsuitHelmet
+ - ModsuitGauntlets
+ - ModsuitShell
+ - ModsuitPlatingExternal
diff --git a/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/blueshield_officer.yml b/Resources/Prototypes/_Goobstation/Roles/Jobs/Command/blueshield_officer.yml
index cfd728a2a1..9c1a50f9e4 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 1e97aee0d3..13f74d3dfd 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 290a73e392..5158285608 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/_Goobstation/tags.yml b/Resources/Prototypes/_Goobstation/tags.yml
index 27c98e1ad8..2f3f918967 100644
--- a/Resources/Prototypes/_Goobstation/tags.yml
+++ b/Resources/Prototypes/_Goobstation/tags.yml
@@ -96,7 +96,7 @@
- type: Tag
id: RipleyMkII
-
+
- type: Tag
id: Clarke
@@ -104,4 +104,30 @@
id: Durand
- type: Tag
- id: Gygax
\ No newline at end of file
+ id: Gygax
+
+ # MODsuits
+
+- type: Tag
+ id: ModsuitPart
+
+- type: Tag
+ id: ModsuitShell
+
+- type: Tag
+ id: ModsuitGauntlets
+
+- type: Tag
+ id: ModsuitHelmet
+
+- type: Tag
+ id: ModsuitBoots
+
+- type: Tag
+ id: ModsuitChestplate
+
+- type: Tag
+ id: ModsuitCore
+
+- type: Tag
+ id: ModsuitPlatingExternal
diff --git a/Resources/Prototypes/_SimpleStation/Entities/Mobs/Customization/IPCwings.yml b/Resources/Prototypes/_SimpleStation/Entities/Mobs/Customization/IPCwings.yml
new file mode 100644
index 0000000000..16360d6304
--- /dev/null
+++ b/Resources/Prototypes/_SimpleStation/Entities/Mobs/Customization/IPCwings.yml
@@ -0,0 +1,8 @@
+- type: marking
+ id: WingsRobotic
+ bodyPart: Wings
+ markingCategory: Wings
+ speciesRestriction: [IPC]
+ sprites:
+ - sprite: _SimpleStation/Mobs/Customization/wings64x34.rsi
+ state: robotic
diff --git a/Resources/Prototypes/fonts.yml b/Resources/Prototypes/fonts.yml
index 6b5ebca189..e8135ed045 100644
--- a/Resources/Prototypes/fonts.yml
+++ b/Resources/Prototypes/fonts.yml
@@ -73,3 +73,23 @@
- 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
+
+- type: font
+ id: Sriracha
+ path: /Fonts/Sriracha/Sriracha.ttf
+
+- type: font
+ id: GrenzeGotisch
+ path: /Fonts/Grenze_Gotisch/GrenzeGotisch.ttf
+
+- type: font
+ id: RubikDirt
+ path: /Fonts/Rubik_Dirt/RubikDirt.ttf
\ No newline at end of file
diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml
index 047470e293..9bdce9227d 100644
--- a/Resources/Prototypes/tags.yml
+++ b/Resources/Prototypes/tags.yml
@@ -417,6 +417,9 @@
- type: Tag
id: ClothMade
+- type: Tag
+ id: ClothingHeadHelmetBasic
+
- type: Tag
id: ClownMask
@@ -597,6 +600,9 @@
- type: Tag
id: EmitterBolt
+- type: Tag
+ id: Envirohelm
+
- type: Tag
id: Enzyme
@@ -1076,6 +1082,9 @@
- type: Tag
id: PlasmaGlassShard
+- type: Tag
+ id: PlasmamanSafe
+
- type: Tag
id: Plastic
@@ -1275,6 +1284,9 @@
- type: Tag
id: Steak
+- type: Tag
+ id: Stunbaton
+
- type: Tag
id: SubdermalImplant
@@ -1374,6 +1386,9 @@
- type: Tag
id: WeaponAntiqueLaser
+- type: Tag
+ id: WeaponDisabler
+
- type: Tag
id: WeaponPistolCHIMPUpgradeKit
@@ -1446,4 +1461,4 @@
id: SiliconEmotes
- type: Tag
- id: UnathiEmotes
\ No newline at end of file
+ id: UnathiEmotes
diff --git a/Resources/Prototypes/typing_indicator.yml b/Resources/Prototypes/typing_indicator.yml
index 7e8c92787f..11f339454f 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 0000000000..29dde13c0f
--- /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 0000000000..d0c41a3100
--- /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 6820cd1c80..4b747b5797 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/ServerInfo/Guidebook/Mobs/Tajaran.xml b/Resources/ServerInfo/Guidebook/Mobs/Tajaran.xml
new file mode 100644
index 0000000000..07d9a999df
--- /dev/null
+++ b/Resources/ServerInfo/Guidebook/Mobs/Tajaran.xml
@@ -0,0 +1,127 @@
+
+ # Tajaran
+ All Information included in this document is licensed under CC BY-SA 4.0, and is taken from https://wiki.aurorastation.org/index.php?title=Tajaran with some modifications by SX-7(Github).
+
+
+
+ The Tajara (direct plural: Tajara – Tah-jaw-rah both singular and multiple) (adjective: Tajaran - Tah-jaw-ran) are a race of humanoids that possess markedly felinoid traits that include a semi-prehensile tail, a body covered in fur of varying shades, and padded, digitigrade feet.
+ Tajaran history and society is deeply entrenched in the conflict between its caste system and ruling governments.
+ The species currently finds itself involved in a cold war between the three powers that control its homeworld, Adhomai.
+
+ # Biology
+
+ To the average human, the Tajara share many similarities with Earth's felines; however, when looked at from a purely scientific perspective, this description is largely superficial.
+ Unlike terrestrial felines, the Tajara are both omnivorous and bipedal.
+ Their bodies are almost entirely covered in a thick coat of fur that is extremely good at insulating them from the extreme cold of Adhomai.
+ The layer of body fat and fur is designed to trap body heat efficiently.
+ There are only a handful of areas where fur is not present, those being on the palm of their hands, the soles of their feet, and a number of various orifices as well as a small area around their eyes.
+ Tajara have nictitating membranes, a transparent eyelid layer that assists in preventing snow blindness and keeping their eyes moist against the wind.
+
+ Occasionally, the fur around a Tajara's neck is known to grow into a shaggy 'mane' of sorts, giving them a distinct look, not unlike a terran lion.
+ This hair tends to be much stronger and a great deal wirier than the rest of the fur on a Tajara's body.
+ Some Tajara tend towards monochromatic bodies while others have multicolor or even calico fur patterns.
+ These designs depend heavily on the genetics of the individual's parents, much like hair and eye color.
+ Because of this, some parents are utterly incapable of producing multicolor children.
+ Designs including flat colors, stripes, spots, and most conceivable combinations have been recorded by scientists both Tajaran and human.
+ A male Tajara is somewhere between 150 cm and 185 cm in height, while the mean body mass is between 65 kg and 100 kg.
+ Females tend to range between 150 cm and 175 cm in height, with their own weight somewhere around 45 kg to 85kg.
+ As such, both their body weight and height are roughly comparable to the average human.
+ Height depends on a Tajara's ethnicity.
+ Njarir'akhran were bred to be taller, M'sai are a more middle height, Hharar are typically shorter or of middle height, and Zhan-Khazan are usually the tallest of the races.
+ Any Tajara who falls out of this range is unusually tall or short which typically stems from a medical condition.
+ A Tajaran fetus only takes six months to mature, and Tajaran children likewise mature rapidly, reaching the full extent of their growth by 15 or 16.
+ This rapid maturation has a profound effect on the lifespan of Tajara, as only with modern medicine have Tajara reached ages above 70, with the oldest living Tajara being 84 years old.
+ Most Tajara retire at age 60 when they are too old to work in any capacity.
+
+ ## Ethnicities
+
+ There are four races of Tajara: the Hharar, the Zhan-Khazan, the Njarir’Akhran, and the M'sai.
+ Each race has a common role that they play in a society to which their biological inclinations make them more suited, as well as their own cultures which have formed from long histories of performing these roles in society.
+ Tajara heavily stereotype each other based on race which is often a cause for conflict.
+ As a result of these differences, there is a lot of racial tension between these various types of Tajara which was further exacerbated by differences in socioeconomic classes.
+
+ ### Hharar
+
+ The first Tajaran ethnicity that Humanity came in contact with is generally viewed as the 'typical Tajara', which is reinforced by their numerical superiority over the other groups.
+ Additionally, given their large numbers and capabilities, they most often serve in governmental positions and as ambassadors to other races; this leads to them being taken as the 'face' of the Tajaran race, as it were. Hharar trend towards being the most intellectual of all Tajaran groups, and as such their physical prowess is significantly reduced.
+ The Hharar are the stereotypical 'worker' Tajara, commonly described as loyal employees who are passionate and not afraid to voice their opinions.
+
+ ### Zhan-Khazan
+
+ The second most populous of Tajaran ethnicities, and are considered to be the backbone of the Tajaran workforce.
+ Because of their history of hard work and the way they adapted to harsh mountain life, Zhan-Khazan are more physically intimidating than other Tajara.
+ Featuring more toned, muscular bodies, thicker fur coats, and heavier body weight, they are well-suited to tasks requiring brute strength and heavy lifting.
+ Due to their status as laborer they suffer discrimination and are usually regarded as less intelligent.
+
+ ### M'sai
+
+ The third most populous Tajaran ethnic group, the M'sai were at one point the hunters for ancient Tajara and evolved to have lithe, slender forms, and light fur that hid them in the blizzards on Adhomai.
+ As Tajaran society advanced, M'sai could be found in many roles related to combat, including law enforcement and military service.
+ They are very loyal to their friends and family but aren't as overt about it as the Zhan-Khazan.
+ With wide eyes and acute senses, they make great soldiers, with a vision adapted to compensate for the heavy blizzards that plague their home planet.
+ They are also great survivalists and are capable of scrounging food for themselves via hunting.
+
+ ### Njarir’Akhran
+
+ The ethnic group that made up the majority of the plutocracy before the Great War.
+ Their lineage can be traced from careful breeding between Hharar and M'sai, leading to where they currently are today.
+ Following recent events on Adhomai, Njarir make up less than ten percent of the population.
+ Easily identifiable by their large ears, fluffy tails, luxurious fur, and slender, elegant features.
+ Njarir suffer persecution and rejection from certain proponents of Tajaran society because of their bloodline.
+ As the most learned of all Tajaran ethnic groups, they boast high intelligence and have a propensity towards the arts and sciences.
+
+ # History
+
+ Adhomai, the Tajaran homeworld, has long been ruled by a deeply entrenched nobility.
+ Historical records dating back 3,000 years describe monarchies supported by religious authorities, where rulers claimed divine origins.
+ These local monarchies evolved into feudal systems where peasants lived under oppressive conditions, enforced by M’sai enforcers.
+ Over centuries, noble families like the Njarir’Akhran solidified their control, hoarding technological and scientific advancements while imposing harsh laws.
+ Tensions between nobility and peasants escalated with industrialization in the 18th and 19th centuries.
+ The invention of the printing press in 1756 CE spread anti-monarchist sentiments despite strict censorship.
+ By the mid-20th century, industrialization exacerbated inequalities, with peasants laboring in mines and on railways for the nobles' benefit.
+ Resentment reached a peak, paving the way for revolution.
+
+ Human discovery in 2418 CE introduced new ideas of equality and freedom, fueling Tajaran uprisings.
+ The First Revolution began in 2421 CE after a public execution incited armed rebellion.
+ By 2431 CE, the rebels, aided by defecting nobles like the Hadii family, overthrew the old order at the cost of over 92 million lives.
+
+ The People's Republic of Adhomai was established under Hadii leadership in 2432 CE, backed by human corporations like NanoTrasen.
+ However, disagreements over resource control led to the Second Revolution in 2451 CE, resulting in a decade-long conflict.
+ By 2461 CE, a cold war emerged among three factions: the People's Republic, the Democratic People's Republic, and the New Kingdom of Adhomai.
+
+ Today, Adhomai remains divided, marked by ongoing tensions, proxy wars, and an uneven modernization process.
+ While urban centers thrive, rural areas struggle, and foreign influence continues to shape the Tajaran future.
+ The species navigates a precarious path, torn between progress and the scars of its feudal past.
+
+
+ # Species Traits
+
+ - [color=#1e90ff]Animal diet[/color]: Tajara are poisoned by theobromine, but can process uncooked animal protein.
+
+ - [color=#1e90ff]Cold Resistance[/color]: Tajara fare better against cold than humans, receiveing [color=#1e90ff]35% less cold damage[/color] and [color=#1e90ff]tolerating lower temperatures[/color].
+
+ - [color=#1e90ff]Hairballs[/color]: Tajara can spit out hairballs, which make other vomit when held.
+
+ - [color=#1e90ff]Claws[/color]: Tajara unarmed attacks deal Slash damage instead of Blunt.
+
+ - [color=#1e90ff]Reflexes[/color]: Tajara take less damage from high speed impacts.
+
+ - [color=#1e90ff]Small Body[/color]: Tajara can fit in duffelbags.
+
+ - [color=#1e90ff]Night Vision[/color]: Tajara can see in darkness.
+
+ - [color=#1e90ff]Light Step[/color]: Thanks to their furred paw pads, tajara can walk silently without shoes
+
+ - [color=#ffa500]Heat Intolerance[/color]: Tajara take [color=#ffa500]35% more Heat damage and burn more easily. [/color]They also [color=#ffa500]receive more damage from overheating[/color].
+
+ - [color=#ffa500]Light Build[/color]: Their small posture makes Tajara receive 15% more Brute damage, and they are lighter than humans.
+
+ - [color=#ffa500]Weak Body[/color]: Tajara receive 15% more stamina damage.
+
+ - [color=#ffa500]Sensitive Eyes[/color]: Tajara receive more damage from flashes.
+
+ - [color=#ffa500]Fast Metabolism[/color]: Tajara need more food to sustain themselves.
+
+
+
+
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 0000000000..9dc8e63a73
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 0000000000..1906b6b595
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 0000000000..2016841f04
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 0000000000..7bf0e1e75a
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 0000000000..e28954bcef
--- /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 0000000000..873fa47b2b
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 0000000000..edc62605ae
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 0000000000..982f408102
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 0000000000..21fd8d52aa
--- /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 0000000000..6c86bc9ecb
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 0000000000..6c3e99f111
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 0000000000..3580b91f59
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 0000000000..1abcea97c4
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..2988ab5d96
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 0000000000..3580b91f59
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 0000000000..4e39d2d54b
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 0000000000..efe0ef824e
--- /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 0000000000..adfa03a3d1
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 0000000000..b337689898
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 0000000000..3580b91f59
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 0000000000..e7a4d554b2
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..baf8c4a5ed
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 0000000000..3580b91f59
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 0000000000..2644d0774c
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..43ced855d8
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 0000000000..3580b91f59
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 0000000000..ebf672af7a
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..1786d88729
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 0000000000..3580b91f59
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 0000000000..6f7c4bdc54
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..ff26b7a61c
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 0000000000..3580b91f59
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 0000000000..2d8f37ab00
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..51e2292e5f
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 0000000000..3580b91f59
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 0000000000..216c812a23
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..3c845ae012
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 0000000000..3580b91f59
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 0000000000..17b1b704af
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..bbe11f6c75
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 0000000000..a59d97aca6
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 0000000000..f5ad4ede17
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 0000000000..83a0683d0e
--- /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 0000000000..ba076ac700
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 0000000000..3a6e85f8a9
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 0000000000..3580b91f59
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 0000000000..0dd662f8b1
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..1ed81414a2
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 0000000000..3580b91f59
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 0000000000..b2f56d6003
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..f89fa545ab
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 0000000000..c596f99210
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 0000000000..dc1f29bb64
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 0000000000..c480d547c1
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 0000000000..cd9f533851
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 0000000000..3580b91f59
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 0000000000..3340f25bf7
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 0000000000..a3075b2ec6
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 0000000000..1875428f9e
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 0000000000..4d255a09c2
--- /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 0000000000..b771b180ec
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 0000000000..47539bdc2d
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 0000000000..5b3c26d83f
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 0000000000..6b115e0761
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 0000000000..adfa03a3d1
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 0000000000..4a8eb60ec9
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 0000000000..873df838b6
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 0000000000..82667eae95
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 0000000000..9bd507ef72
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 0000000000..92cedcaf60
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 0000000000..5e1ba883a2
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 0000000000..24d3d7be89
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 0000000000..57ce267b03
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 0000000000..f6588ba800
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 0000000000..907076897a
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 0000000000..5c947d4bbd
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 0000000000..3580b91f59
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 0000000000..a3eb92f19a
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..10a0987784
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 0000000000..3580b91f59
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 0000000000..8677f71e46
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..9ed1e3eb79
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 0000000000..3580b91f59
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 0000000000..fe9eeb3188
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..1d55bd5270
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 0000000000..3580b91f59
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 0000000000..9c39ef411c
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..350de2ebc7
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 0000000000..3580b91f59
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 0000000000..2a4b193b2b
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..4a05589b5f
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 0000000000..3580b91f59
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 0000000000..0236e6542f
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..f826d404a9
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 0000000000..3580b91f59
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 0000000000..b0461d1493
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..06e5cb09fb
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 0000000000..f3ccec3bf6
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 0000000000..f1b689db8c
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 0000000000..83a0683d0e
--- /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 0000000000..2ea6a40eac
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 0000000000..ee7ed60958
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 0000000000..3580b91f59
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 0000000000..0c95650ed0
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..59f1e4f8ea
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 0000000000..3580b91f59
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 0000000000..474e3fba57
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 0000000000..d5202b8068
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 0000000000..7446843492
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 0000000000..62bc618b9f
--- /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 0000000000..adfa03a3d1
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 0000000000..4a8eb60ec9
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 0000000000..873df838b6
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 0000000000..5af3beb5a4
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 0000000000..3580b91f59
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 0000000000..2d5d6c394a
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..8ed2259d5f
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 0000000000..3580b91f59
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 0000000000..4a39bcf7c6
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..a826d42142
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 0000000000..698c4ff6e4
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 0000000000..ce4c2d0022
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 0000000000..83a0683d0e
--- /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 0000000000..b28f42716d
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 0000000000..63154766a7
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 0000000000..3580b91f59
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 0000000000..7e08f6d19d
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..bb70ade705
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 0000000000..3580b91f59
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 0000000000..13dc3f4679
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 0000000000..86ae56f226
--- /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 0000000000..adfa03a3d1
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 0000000000..db8cc9f835
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 0000000000..3580b91f59
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 0000000000..2cba69dd88
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..c18f183d46
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 0000000000..3580b91f59
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 0000000000..dae944c5ef
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..e73142d46f
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 0000000000..3580b91f59
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 0000000000..3c2f355d66
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 0000000000..83a0683d0e
--- /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 0000000000..adfa03a3d1
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 0000000000..16d3ec02c5
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 0000000000..9277423151
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 0000000000..7881ed5501
--- /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 0000000000..43ddf4a578
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 0000000000..08a25d0bce
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 0000000000..7881ed5501
--- /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 0000000000..26258a7006
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 0000000000..2cb5f54b77
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 0000000000..a730d09891
--- /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 0000000000..9332939422
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 0000000000..594ba5a9e4
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 0000000000..e669a6403e
--- /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 0000000000..d31317d5e5
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 0000000000..465c819c20
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 0000000000..7881ed5501
--- /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 0000000000..d71154821f
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 0000000000..759670ef07
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 0000000000..7881ed5501
--- /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 0000000000..c74fe2b800
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 0000000000..6a9940326d
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 0000000000..7881ed5501
--- /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 0000000000..c57ecfe5eb
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 0000000000..4a7e1f31bd
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 0000000000..7881ed5501
--- /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 0000000000..2b169155c9
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 0000000000..c8f010a368
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 0000000000..7881ed5501
--- /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 0000000000..6cae82165f
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 0000000000..7f6c7ee109
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 0000000000..7881ed5501
--- /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 0000000000..7810f37d2c
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 0000000000..c9d6114ea7
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 0000000000..7881ed5501
--- /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 0000000000..b9c4c0327e
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 0000000000..8e0dad6a3b
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 0000000000..7881ed5501
--- /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 0000000000..5b1d0f39d5
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 0000000000..f28976a3da
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 0000000000..7881ed5501
--- /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 0000000000..4e8be768c7
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 0000000000..7eb85c8dd2
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 0000000000..7881ed5501
--- /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 0000000000..c48495a6d5
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 0000000000..dc5dc934c5
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 0000000000..7881ed5501
--- /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 0000000000..89e252f7d4
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 0000000000..21d362fa6a
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 0000000000..2ff08cc237
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 0000000000..9e11e06718
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 0000000000..eb13f68b9e
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 0000000000..8b5586b03f
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 0000000000..53e2eaa867
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 0000000000..c3aadd5b86
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 0000000000..e1b24b41cc
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 0000000000..bbc3d21aae
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 0000000000..bd8a0e7cad
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 0000000000..b000ed7ec7
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 0000000000..93bee36bd5
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 0000000000..384286f395
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 0000000000..0c0017dde5
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 0000000000..c7b68db12c
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 0000000000..fff2774616
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 0000000000..2cb85e632f
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 0000000000..e1975815e2
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 0000000000..fea004b30b
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 0000000000..3fa4884328
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 0000000000..01a3666be1
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 0000000000..a7a23ec3c9
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 0000000000..4b3249fe20
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 0000000000..987cbdb733
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 0000000000..ff81d2d0b3
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 0000000000..64b70260c7
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 0000000000..9a49ad2d09
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 0000000000..afdd7622c7
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 0000000000..a390285775
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 0000000000..e6776137d5
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 0000000000..7351de7e21
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 0000000000..473510a86f
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 0000000000..a5ece79a5c
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 0000000000..363fceada4
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 0000000000..fc98cadb90
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 0000000000..f70ea45de9
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 0000000000..a95ce71374
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 0000000000..e091c45504
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 0000000000..c50769249b
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 0000000000..0091012bb9
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 0000000000..83664d1486
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 0000000000..fe8b1bf970
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 0000000000..8060fdd544
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 0000000000..f09673433c
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 0000000000..aa90e95dc5
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 0000000000..9be9ecbf60
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 0000000000..7b84f544da
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 0000000000..5cb2a361c0
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 0000000000..c8461c2d92
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 0000000000..226a816774
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 0000000000..026af9dc7e
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 0000000000..090bf7274d
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 0000000000..29c74bdf83
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 0000000000..c45549adf3
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 0000000000..e787a2c9f6
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 0000000000..ad3624500d
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 0000000000..ae6c4e7861
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 0000000000..104a6b2a06
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 0000000000..12b2750942
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 0000000000..9567633b9b
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 0000000000..69ff51e103
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 0000000000..4cec655e64
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 0000000000..95251ce244
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 0000000000..a4fcf07fb9
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 0000000000..32f62714ce
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 0000000000..a42baf390d
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 0000000000..1f2a705a58
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 0000000000..41e57d6149
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 0000000000..33ff060a92
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 0000000000..d25487ab7c
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 0000000000..c066a49092
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 0000000000..f9bbed4068
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 0000000000..576d5c219b
--- /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 0000000000..9c11f765ef
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 0000000000..9afac6d69d
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 0000000000..b654f960f4
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 0000000000..92749caa93
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 0000000000..693cfd5087
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 0000000000..117d83e93e
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 0000000000..72e6a885cb
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 0000000000..f8f8ae4f79
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 0000000000..0c0ee90b94
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 0000000000..bbc2d4dc2c
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 0000000000..c468d7db6b
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 0000000000..b7e5ec47d6
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 0000000000..9e95afa556
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 0000000000..d24fb9e4e7
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 0000000000..8e08e9402d
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 0000000000..3dc73d2aa0
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 0000000000..ff5be6f5ff
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 0000000000..704f785120
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 0000000000..a60a89348c
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 0000000000..cb628a3e59
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 0000000000..4591a086b4
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 0000000000..3c74066875
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 0000000000..88e26c3ac1
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 0000000000..2a89400603
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 0000000000..144ee7b639
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 0000000000..7881ed5501
--- /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 0000000000..7d9aa8981b
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 0000000000..7b4a2760e2
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 0000000000..7881ed5501
--- /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 0000000000..1db56bb0c6
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 0000000000..a6bf5e7704
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 0000000000..7881ed5501
--- /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 0000000000..6599aa9df8
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 0000000000..897b70669b
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 0000000000..7881ed5501
--- /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 0000000000..51a9fdac33
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 0000000000..b0a9644989
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 0000000000..7881ed5501
--- /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 0000000000..8d6ac5e7fa
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 0000000000..e7bf4945f9
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 0000000000..7881ed5501
--- /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 0000000000..ad1c6cbbc1
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 0000000000..18a829b655
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 0000000000..7881ed5501
--- /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 0000000000..cdac280607
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 0000000000..933083422d
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 0000000000..7881ed5501
--- /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 0000000000..37c4441170
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 0000000000..eb0d90d7c6
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 0000000000..7881ed5501
--- /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 0000000000..711f6fe61b
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 0000000000..4ef99e18f5
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 0000000000..7881ed5501
--- /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 0000000000..f9a9cf1854
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 0000000000..7cbe2a556d
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 0000000000..5ca9cdac9a
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 0000000000..6379627118
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 0000000000..e46e835779
--- /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 0000000000..53028a197d
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 0000000000..3a64566880
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 0000000000..d4c04394ef
--- /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 0000000000..d3ba777080
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 0000000000..8e38f72012
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 0000000000..e669a6403e
--- /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 0000000000..726b862a56
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 0000000000..8775c1a3e0
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 0000000000..7881ed5501
--- /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 0000000000..7199bf41fb
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 0000000000..4d3dcb91ea
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 0000000000..7881ed5501
--- /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 0000000000..9caeea98ab
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 0000000000..6370d1483d
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 0000000000..7881ed5501
--- /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 0000000000..7f5881cd57
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 0000000000..f2a1071bc5
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 0000000000..7881ed5501
--- /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 0000000000..5482b7a4dd
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 0000000000..d48c2be0fa
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 0000000000..7881ed5501
--- /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 0000000000..dc37e2d63b
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 0000000000..a8adc694b0
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 0000000000..91bcf88fe5
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 b630e99de6..e621532251 100644
--- a/Resources/Textures/DeltaV/Effects/speech.rsi/meta.json
+++ b/Resources/Textures/DeltaV/Effects/speech.rsi/meta.json
@@ -25,7 +25,10 @@
"name": "felinid2"
},
{
- "name": "rodentia0",
+ "name": "rodentia0"
+ },
+ {
+ "name": "chitinid0",
"delays": [
[
0.2,
@@ -40,6 +43,12 @@
},
{
"name": "rodentia2"
+ },
+ {
+ "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 0000000000..3c5faa4aa2
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 0000000000..7d7dd45da0
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 0000000000..f3d291ebdc
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 0000000000..32aeb03d3c
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 0000000000..ce6864cb06
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 0000000000..e215684cf9
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 0000000000..9ff75a1010
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 0000000000..52bc240973
--- /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 0000000000..41ec7d9923
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 0000000000..1dde872b78
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 0000000000..f1e856667c
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 0000000000..f3dda4c687
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 0000000000..8981bd797e
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 0000000000..98c698e905
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 0000000000..14709b0c31
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 0000000000..5be58a196c
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 0000000000..7a83b33619
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 0000000000..0ebd96c5dd
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 0000000000..6667bbc2b3
--- /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 0000000000..f32f5d317c
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 0000000000..5e1061d931
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 0000000000..b24897986d
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 0000000000..214caa4c97
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 0000000000..5a19d26577
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 0000000000..272177404a
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 0000000000..16f0616a24
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 0000000000..72dfcfde06
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 0000000000..9c4d8173e9
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 0000000000..90a8539d73
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 0000000000..c7301de381
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 0000000000..4c6f3c1ce4
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 0000000000..f78e45889f
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 0000000000..a83a50ec97
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 0000000000..27e6854260
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 0000000000..29b41970dc
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 0000000000..8bcda1cbe6
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 0000000000..521352f9d4
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 0000000000..6b19d5237f
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 0000000000..51b1f0d370
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 0000000000..e149af3795
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 0000000000..ad53da7165
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 0000000000..d3400bf0e1
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 0000000000..f74ffaae9d
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 0000000000..fbcd1237d7
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 0000000000..31ef8726fc
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 0000000000..bd772bfc0b
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 0000000000..d8f46c8e70
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 0000000000..82a14ba3e5
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 0000000000..c01f5a4ba4
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 0000000000..1f74656812
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 0000000000..3386aa4583
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 0000000000..d842859726
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 0000000000..587a5a1f75
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 0000000000..b7f59a8231
--- /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 0000000000..bd0bbec36f
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 0000000000..028676d9f4
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/Customization/hair.rsi/classic_long2.png b/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/classic_long2.png
deleted file mode 100644
index 950bc1430b..0000000000
Binary files a/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/classic_long2.png and /dev/null differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/classic_long3.png b/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/classic_long3.png
deleted file mode 100644
index bc7eb6ea06..0000000000
Binary files a/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/classic_long3.png and /dev/null differ
diff --git a/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/meta.json
index 387949d4b3..ca3709fda9 100644
--- a/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/meta.json
+++ b/Resources/Textures/DeltaV/Mobs/Customization/hair.rsi/meta.json
@@ -43,14 +43,6 @@
{
"name":"classic_long",
"directions": 4
- },
- {
- "name":"classic_long2",
- "directions": 4
- },
- {
- "name":"classic_long3",
- "directions": 4
}
]
}
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 0000000000..e35b5717d2
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 0000000000..6d5e167c55
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 0000000000..fe85b75345
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 0000000000..c9b9cbb197
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 0000000000..48c0a2ee06
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 0000000000..02c9335b20
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 0000000000..b02e2317be
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 0000000000..54efa6db78
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 0000000000..ed5dfd5145
--- /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 0000000000..703756e5c4
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 0000000000..e661076301
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 0000000000..b9f02aa597
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 0000000000..6f45ae1895
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 0000000000..71d3466001
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 0000000000..9f08874e16
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 0000000000..8983e82b36
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 0000000000..5a77b238e8
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 0000000000..e55e488f4d
--- /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 1ec1219b0f..e3644f147b 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 0000000000..fb6cf1ad25
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 0000000000..4a3cb354ff
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 0000000000..9f86cb268c
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 0000000000..8695d90baf
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 0000000000..3943f59767
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 0000000000..64bb33c713
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 0000000000..5145216bf3
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 0000000000..8b3c3fbe05
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 0000000000..8797bc9b52
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 0000000000..7d217388d0
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 0000000000..646ec3241b
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 0000000000..a10b441e1c
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 0000000000..b348eef2ca
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 0000000000..dcb21b4f8c
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 0000000000..666e33a6ef
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 0000000000..e475aea4f2
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 0000000000..6121837e31
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 0000000000..812fa134de
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 0000000000..3eab35d483
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 0000000000..b68e72fad5
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 0000000000..aaf8d07645
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 0000000000..22f8db3c70
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 0000000000..df0f80a270
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 0000000000..fd54e580a4
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 0000000000..45e53d99e0
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 0000000000..364885508c
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 0000000000..b5035a33bf
--- /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 0000000000..b80b2ccd71
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 0000000000..b86bfb1c2d
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 0000000000..2c532c3148
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 0000000000..073d79718c
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 0000000000..1edfe42011
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 0000000000..b788969f0f
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 0000000000..8836dc110b
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 0000000000..c7c5c9e061
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 0000000000..1c45b9f176
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 0000000000..23f499fe81
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 0000000000..ae4d73c1a6
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 0000000000..17a7cb99d2
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 0000000000..afad380277
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 0000000000..100b213afc
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 0000000000..0a179f78ee
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 0000000000..eca6193c86
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 0000000000..b9a8467485
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 0000000000..5fc75d0bce
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 0000000000..01187507f6
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 0000000000..b4ac829a24
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 0000000000..ba33f6b6a7
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 0000000000..2067145ca0
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 0000000000..1a057ecf79
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 0000000000..e5e5afcbf3
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 0000000000..f0ee45883d
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 0000000000..8f6549e8d3
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 0000000000..b16deb15ae
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 0000000000..af710d0711
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 0000000000..7f99d786cf
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 0000000000..4ff15e4136
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 0000000000..c8c01eb2d5
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 0000000000..bea976dc1b
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 0000000000..36fcb2d654
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 0000000000..b64b1a6650
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 0000000000..feeefb7bcc
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 0000000000..a100b46058
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 0000000000..34e8feae6f
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 0000000000..1cf21d7723
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 0000000000..50be1e655a
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 0000000000..20cf0ab74e
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 0000000000..8d62899fe2
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 0000000000..d43b828a49
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 0000000000..dd9ba51947
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 0000000000..6a51db9b7e
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 0000000000..67f25777ea
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 0000000000..fb1266f391
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 0000000000..2b14b3777d
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 0000000000..653109f088
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 0000000000..93d00aa65e
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 0000000000..1b63837065
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 0000000000..30e3525c7e
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 0000000000..8d55ea1df9
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 0000000000..2fb582d569
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 0000000000..cb82281e40
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 0000000000..6bd780f250
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 0000000000..e6d0a439ee
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 0000000000..61c3ad81f1
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 0000000000..bf156aceb7
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 0000000000..8183e0defa
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 0000000000..3dd9f7c95b
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 0000000000..66032a9ddd
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 0000000000..eef3d3322d
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 0000000000..f1fa1b4f34
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 0000000000..95d5ed72a2
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 0000000000..b9a25077a1
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 0000000000..48290bd26c
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 0000000000..5f557f6f11
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 0000000000..22f74e0535
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 0000000000..7b4eb021bf
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 0000000000..f94cc86077
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 0000000000..7b7905bd38
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 0000000000..c44ddd87e6
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 0000000000..970bef60e4
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 0000000000..729c0def3f
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 0000000000..23697e2f9a
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 0000000000..e099806d23
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 0000000000..fabd88049a
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 0000000000..429b9c9dcf
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 0000000000..7fc01c72b5
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 0000000000..b1021e01bc
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 0000000000..444a83394e
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 0000000000..8d795e524e
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 0000000000..6f786cca2a
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 0000000000..2308d43d4f
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 0000000000..efbe7248ec
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 0000000000..7954748eab
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 0000000000..e466ae7120
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 0000000000..452bd851e4
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 0000000000..7beeded173
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 0000000000..b72505fb87
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 0000000000..c9923e0c89
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 0000000000..07f4d96f75
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 0000000000..3367fa0d2e
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 0000000000..83eafee6c7
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 0000000000..76d30fab1a
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 0000000000..58a1130c4a
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 0000000000..6204855e3c
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 0000000000..e1b2aba48e
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 0000000000..2ce9b69f16
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 0000000000..86b3c37cd0
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 0000000000..1ad0852935
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 0000000000..69154bbc3b
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 0000000000..587025d064
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 0000000000..ec1158a360
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 0000000000..59686360af
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 0000000000..9c88a1a275
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 0000000000..4ef37da096
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 0000000000..7104afcd64
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 0000000000..35aba68cfe
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 0000000000..f6bad83825
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 0000000000..43341bb1f8
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 0000000000..389004ac91
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 0000000000..c3b7cc6142
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 0000000000..ab89960ba0
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 0000000000..dbdff6554e
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 0000000000..1a68d32b7c
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 0000000000..5c524bad64
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 0000000000..4aab2f09d4
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 0000000000..47fe7da11d
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 0000000000..eff87dcb56
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 0000000000..bc1f38c11e
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 0000000000..f3bb83907b
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 0000000000..da4360e0e5
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 0000000000..d5823c0fb7
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 0000000000..e17eaab8cf
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 0000000000..4be96b088a
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 0000000000..11bea7d14b
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 0000000000..94d9ce9f9d
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 0000000000..83e604757b
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 0000000000..5aa923cba2
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 0000000000..9b1a9ee48c
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 0000000000..0e79933147
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 0000000000..8b9d7cb53f
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 0000000000..c11bda0bf3
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 0000000000..e9ab75342f
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 0000000000..bfeaa7d8d2
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 0000000000..6b07df3520
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 0000000000..df54477231
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 0000000000..5fa983d5e1
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 0000000000..1da0de75ba
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 0000000000..2ec99fc8dd
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 0000000000..28488799a0
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 0000000000..446c79e0b3
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 0000000000..0c561befb9
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 0000000000..b6af7d6218
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 0000000000..b6f8e32cc2
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 0000000000..fe38670021
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 0000000000..c53d7fe5d0
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 0000000000..7ebf4ce24f
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 0000000000..6fc8241b11
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 0000000000..adb48697f9
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 0000000000..5da2adf32a
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 0000000000..de3cf80db9
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 0000000000..c22d142b63
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 0000000000..e234569093
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 0000000000..7a529a1915
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 0000000000..537de98404
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 0000000000..184f90b5de
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 0000000000..1b190bd934
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 0000000000..74a5fe35c4
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 0000000000..30c4271fc9
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 0000000000..40edb50caa
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 0000000000..613f4e81ca
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 0000000000..0106a46014
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 0000000000..e634a9f8a0
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 0000000000..a219d05954
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 0000000000..03b7154520
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 0000000000..24d143e40d
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 0000000000..a8edb3d5cd
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 0000000000..a0c5cf0e13
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 0000000000..88a445a27a
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 0000000000..c30454d2b5
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 0000000000..7a9eb2d197
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 0000000000..3dc0f71ddc
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 0000000000..2e282d0c7d
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 bd63121b98..6e9491704e 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 0000000000..2c15815430
--- /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 0000000000..cea01249e7
Binary files /dev/null and b/Resources/Textures/Interface/VerbIcons/extinguisher.svg.192dpi.png differ
diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_head.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_head.png
new file mode 100644
index 0000000000..713ae3d4bc
Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_head.png differ
diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json b/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json
index 8d82ccab51..bd7d1ed4eb 100644
--- a/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json
+++ b/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Gauze sprites by Github KittenColony / Discord kittencolony (297865728374210561)",
+ "copyright": "Gauze sprites by Github KittenColony / Discord kittencolony (297865728374210561), gauze_head by github:DreamlyJack(624946166152298517)",
"size": {
"x": 32,
"y": 32
@@ -142,6 +142,10 @@
{
"name": "gauze_moth_lowerleg_l",
"directions": 4
+ },
+ {
+ "name": "gauze_head",
+ "directions": 4
}
]
}
\ No newline at end of file
diff --git a/Resources/Textures/Mobs/Customization/human_hair.rsi/classiclong2.png b/Resources/Textures/Mobs/Customization/human_hair.rsi/classiclong2.png
new file mode 100644
index 0000000000..4bf29c6c3c
Binary files /dev/null and b/Resources/Textures/Mobs/Customization/human_hair.rsi/classiclong2.png differ
diff --git a/Resources/Textures/Mobs/Customization/human_hair.rsi/classiclong3.png b/Resources/Textures/Mobs/Customization/human_hair.rsi/classiclong3.png
new file mode 100644
index 0000000000..6597c3a3d0
Binary files /dev/null and b/Resources/Textures/Mobs/Customization/human_hair.rsi/classiclong3.png differ
diff --git a/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json b/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json
index 97a4b9c80e..90b1d8ee34 100644
--- a/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json
+++ b/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json
@@ -4,7 +4,7 @@
"x": 32,
"y": 32
},
- "copyright": "Taken from https://github.com/tgstation/tgstation/blob/05ec94e46349c35e29ca91e5e97d0c88ae26ad44/icons/mob/species/human/human_face.dmi ,resprited by Alekshhh, a modified by potato1234x, uneven and tailed is drawn by Ubaser, doublebun_long by Emisse, longbundled and bob5 sprited by github:DreamlyJack(624946166152298517)",
+ "copyright": "Taken from https://github.com/tgstation/tgstation/blob/05ec94e46349c35e29ca91e5e97d0c88ae26ad44/icons/mob/species/human/human_face.dmi ,resprited by Alekshhh, a modified by potato1234x, uneven and tailed is drawn by Ubaser, doublebun_long by Emisse, longbundled and bob5 sprited by github:DreamlyJack(624946166152298517), pulato.png made by DreamlyJack for SS14",
"license": "CC-BY-SA-3.0",
"states": [
{
@@ -571,6 +571,10 @@
"name": "protagonist",
"directions": 4
},
+ {
+ "name": "pulato",
+ "directions": 4
+ },
{
"name": "quiff",
"directions": 4
@@ -786,6 +790,18 @@
{
"name": "tailed",
"directions": 4
+ },
+ {
+ "name": "classiclong2",
+ "directions": 4
+ },
+ {
+ "name": "classiclong3",
+ "directions": 4
+ },
+ {
+ "name": "shaped",
+ "directions": 4
}
]
}
diff --git a/Resources/Textures/Mobs/Customization/human_hair.rsi/pulato.png b/Resources/Textures/Mobs/Customization/human_hair.rsi/pulato.png
new file mode 100644
index 0000000000..7fd30556fe
Binary files /dev/null and b/Resources/Textures/Mobs/Customization/human_hair.rsi/pulato.png differ
diff --git a/Resources/Textures/Mobs/Customization/human_hair.rsi/shaped.png b/Resources/Textures/Mobs/Customization/human_hair.rsi/shaped.png
new file mode 100644
index 0000000000..f65d7cf444
Binary files /dev/null and b/Resources/Textures/Mobs/Customization/human_hair.rsi/shaped.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 0000000000..28ce6d9e9e
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 0000000000..f0bed207c0
--- /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/Silicon/Bots/batonbot.rsi/batonbot.png b/Resources/Textures/Mobs/Silicon/Bots/batonbot.rsi/batonbot.png
new file mode 100644
index 0000000000..b063645cd1
Binary files /dev/null and b/Resources/Textures/Mobs/Silicon/Bots/batonbot.rsi/batonbot.png differ
diff --git a/Resources/Textures/Mobs/Silicon/Bots/batonbot.rsi/meta.json b/Resources/Textures/Mobs/Silicon/Bots/batonbot.rsi/meta.json
new file mode 100644
index 0000000000..cb9bb6358b
--- /dev/null
+++ b/Resources/Textures/Mobs/Silicon/Bots/batonbot.rsi/meta.json
@@ -0,0 +1,20 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Tim Falken",
+ "states": [
+ {
+ "name": "batonbot",
+ "delays": [
+ [
+ 0.5,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Mobs/Silicon/Bots/disablerbot.rsi/disablerbot.png b/Resources/Textures/Mobs/Silicon/Bots/disablerbot.rsi/disablerbot.png
new file mode 100644
index 0000000000..6cebd2767f
Binary files /dev/null and b/Resources/Textures/Mobs/Silicon/Bots/disablerbot.rsi/disablerbot.png differ
diff --git a/Resources/Textures/Mobs/Silicon/Bots/disablerbot.rsi/meta.json b/Resources/Textures/Mobs/Silicon/Bots/disablerbot.rsi/meta.json
new file mode 100644
index 0000000000..11518dd793
--- /dev/null
+++ b/Resources/Textures/Mobs/Silicon/Bots/disablerbot.rsi/meta.json
@@ -0,0 +1,20 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Tim Falken",
+ "states": [
+ {
+ "name": "disablerbot",
+ "delays": [
+ [
+ 0.5,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
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 0000000000..06fb867f80
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 0000000000..b12859f247
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 0000000000..5205aa6474
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 0000000000..99c5641d5b
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 0000000000..bf117e4d55
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 0000000000..453945a519
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 0000000000..6982b741c2
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 0000000000..f5b37bb53f
--- /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 0000000000..de6fbbe192
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 0000000000..fd246dbfda
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 0000000000..a00035648e
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 0000000000..1c861e1d9f
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 0000000000..1c861e1d9f
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 0000000000..785150c042
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 0000000000..06be449f0b
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 0000000000..6849df79df
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 0000000000..e80de98dff
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 0000000000..db0b13c920
--- /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 0000000000..c2e942d0d5
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 0000000000..1081917430
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 0000000000..bba548419b
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 0000000000..b10d70ab94
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 0000000000..878dd9ed62
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 0000000000..878dd9ed62
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 0000000000..b61d2ae760
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 0000000000..a4c38e93fc
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 0000000000..c2b3b59e25
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 0000000000..ce34667b41
--- /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
+ }
+ ]
+}
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardchin.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardchin.png
new file mode 100644
index 0000000000..3a8d1ed155
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardchin.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardlong.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardlong.png
new file mode 100644
index 0000000000..d7b1aad864
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardlong.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardshort.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardshort.png
new file mode 100644
index 0000000000..bf28dc5904
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardshort.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardthick.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardthick.png
new file mode 100644
index 0000000000..a1d455d6a1
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardthick.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardviking.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardviking.png
new file mode 100644
index 0000000000..90ae0f344c
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-beardviking.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-bristle.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-bristle.png
new file mode 100644
index 0000000000..5a33fecac6
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-bristle.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-mustachewithstubble.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-mustachewithstubble.png
new file mode 100644
index 0000000000..ee0c8e7f65
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-mustachewithstubble.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-thickbristle.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-thickbristle.png
new file mode 100644
index 0000000000..2e80975282
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/beard-thickbristle.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-arabicgatheredhair.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-arabicgatheredhair.png
new file mode 100644
index 0000000000..a602671345
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-arabicgatheredhair.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-classichairmale.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-classichairmale.png
new file mode 100644
index 0000000000..7f0d6e3d38
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-classichairmale.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-combedfromside.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-combedfromside.png
new file mode 100644
index 0000000000..0f37dd7aee
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-combedfromside.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-longhair.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-longhair.png
new file mode 100644
index 0000000000..fc0f54241a
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-longhair.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-manbunold.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-manbunold.png
new file mode 100644
index 0000000000..277d00c46e
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-manbunold.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-pigtailtajaran.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-pigtailtajaran.png
new file mode 100644
index 0000000000..5b01ffe5cc
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-pigtailtajaran.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-shavedside.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-shavedside.png
new file mode 100644
index 0000000000..abe48a688d
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-shavedside.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-shorthaired.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-shorthaired.png
new file mode 100644
index 0000000000..13b7700554
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-shorthaired.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-womenbun.png b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-womenbun.png
new file mode 100644
index 0000000000..11a31465c5
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/hair-womenbun.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/meta.json b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/meta.json
new file mode 100644
index 0000000000..bcaf1ccde9
--- /dev/null
+++ b/Resources/Textures/_ADT/Mobs/Customization/Human/custom.rsi/meta.json
@@ -0,0 +1,79 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by discord:prazat911",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "beard-beardchin",
+ "directions": 4
+ },
+ {
+ "name": "beard-beardlong",
+ "directions": 4
+ },
+ {
+ "name": "beard-beardshort",
+ "directions": 4
+ },
+ {
+ "name": "beard-beardthick",
+ "directions": 4
+ },
+ {
+ "name": "beard-beardviking",
+ "directions": 4
+ },
+ {
+ "name": "beard-bristle",
+ "directions": 4
+ },
+ {
+ "name": "beard-mustachewithstubble",
+ "directions": 4
+ },
+ {
+ "name": "beard-thickbristle",
+ "directions": 4
+ },
+ {
+ "name": "hair-arabicgatheredhair",
+ "directions": 4
+ },
+ {
+ "name": "hair-classichairmale",
+ "directions": 4
+ },
+ {
+ "name": "hair-combedfromside",
+ "directions": 4
+ },
+ {
+ "name": "hair-longhair",
+ "directions": 4
+ },
+ {
+ "name": "hair-manbunold",
+ "directions": 4
+ },
+ {
+ "name": "hair-pigtailtajaran",
+ "directions": 4
+ },
+ {
+ "name": "hair-shavedside",
+ "directions": 4
+ },
+ {
+ "name": "hair-shorthaired",
+ "directions": 4
+ },
+ {
+ "name": "hair-womenbun",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_ADT/Mobs/Customization/augments/headaugs.rsi/iron_jaw.png b/Resources/Textures/_ADT/Mobs/Customization/augments/headaugs.rsi/iron_jaw.png
new file mode 100644
index 0000000000..9acadb7170
Binary files /dev/null and b/Resources/Textures/_ADT/Mobs/Customization/augments/headaugs.rsi/iron_jaw.png differ
diff --git a/Resources/Textures/_ADT/Mobs/Customization/augments/headaugs.rsi/meta.json b/Resources/Textures/_ADT/Mobs/Customization/augments/headaugs.rsi/meta.json
new file mode 100644
index 0000000000..d9336b88fc
--- /dev/null
+++ b/Resources/Textures/_ADT/Mobs/Customization/augments/headaugs.rsi/meta.json
@@ -0,0 +1,15 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "made by nope_ingeneer",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "directions": 4,
+ "name": "iron_jaw"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/handlebar.png b/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/handlebar.png
new file mode 100644
index 0000000000..3032455e18
Binary files /dev/null and b/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/handlebar.png differ
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/handlebar2.png b/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/handlebar2.png
new file mode 100644
index 0000000000..c0acfbf346
Binary files /dev/null and b/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/handlebar2.png differ
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/meta.json b/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/meta.json
new file mode 100644
index 0000000000..ce68ba9113
--- /dev/null
+++ b/Resources/Textures/_Corvax/Mobs/Customization/human_facial_hair.rsi/meta.json
@@ -0,0 +1,19 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from Skyrat-tg at https://github.com/Skyrat-SS13/Skyrat-tg/commit/ad654e76b4c5dd3972cd2a07eb2d4f9658965807",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "handlebar",
+ "directions": 4
+ },
+ {
+ "name": "handlebar2",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/africanpigtails.png b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/africanpigtails.png
new file mode 100644
index 0000000000..75afa8079f
Binary files /dev/null and b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/africanpigtails.png differ
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffdouble.png b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffdouble.png
new file mode 100644
index 0000000000..8132ba10b8
Binary files /dev/null and b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffdouble.png differ
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffleft.png b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffleft.png
new file mode 100644
index 0000000000..617d78c8aa
Binary files /dev/null and b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffleft.png differ
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffright.png b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffright.png
new file mode 100644
index 0000000000..7c66dc74ac
Binary files /dev/null and b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/afropuffright.png differ
diff --git a/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/meta.json b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/meta.json
new file mode 100644
index 0000000000..281d4f86c0
--- /dev/null
+++ b/Resources/Textures/_Corvax/Mobs/Customization/human_hair.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from Skyrat-tg at https://github.com/Skyrat-SS13/Skyrat-tg/commit/ad654e76b4c5dd3972cd2a07eb2d4f9658965807",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "africanpigtails",
+ "directions": 4
+ },
+ {
+ "name": "afropuffdouble",
+ "directions": 4
+ },
+ {
+ "name": "afropuffleft",
+ "directions": 4
+ },
+ {
+ "name": "afropuffright",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/ears.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/ears.png
new file mode 100644
index 0000000000..7444faecf0
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/ears.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/ears_near.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/ears_near.png
new file mode 100644
index 0000000000..c069ac4ab4
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/ears_near.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/inears.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/inears.png
new file mode 100644
index 0000000000..c335e704e2
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/inears.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/inears_near.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/inears_near.png
new file mode 100644
index 0000000000..e7af318b33
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/inears_near.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/meta.json
new file mode 100644
index 0000000000..34b9f717da
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/meta.json
@@ -0,0 +1,43 @@
+{
+ "version": 1,
+ "copyright": "Creator was not supplied, oldest reference to markings ('patch') tracked to KasparoVy @ https://github.com/ParadiseSS13/Paradise/commit/3610cfd4ea7e9bffc804320851f0b0a625db1dba, meanwhile ears are made by Cael Aislinn in commit https://github.com/ParadiseSS13/Paradise/commit/9e4539fdce01f00ed7e47ca1174a1470ac5fe77c. Minor tweaks and '_near' versions by SX-7",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "ears",
+ "directions": 4
+ },
+ {
+ "name": "inears",
+ "directions": 4
+ },
+ {
+ "name": "outears",
+ "directions": 4
+ },
+ {
+ "name": "patch",
+ "directions": 4
+ },
+ {
+ "name": "ears_near",
+ "directions": 4
+ },
+ {
+ "name": "inears_near",
+ "directions": 4
+ },
+ {
+ "name": "outears_near",
+ "directions": 4
+ },
+ {
+ "name": "patch_near",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/outears.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/outears.png
new file mode 100644
index 0000000000..4f5041880b
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/outears.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/outears_near.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/outears_near.png
new file mode 100644
index 0000000000..54583699fd
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/outears_near.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/patch.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/patch.png
new file mode 100644
index 0000000000..591dde13ee
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/patch.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/patch_near.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/patch_near.png
new file mode 100644
index 0000000000..1595303ac9
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/ears.rsi/patch_near.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/basic_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/basic_inner.png
new file mode 100644
index 0000000000..57bcdaa8b9
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/basic_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/basic_outer.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/basic_outer.png
new file mode 100644
index 0000000000..24fe753ebd
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/basic_outer.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/curled_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/curled_inner.png
new file mode 100644
index 0000000000..b447625e18
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/curled_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/curled_outer.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/curled_outer.png
new file mode 100644
index 0000000000..3590520cda
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/curled_outer.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/droopy_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/droopy_inner.png
new file mode 100644
index 0000000000..b87d5560ce
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/droopy_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/droopy_outer.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/droopy_outer.png
new file mode 100644
index 0000000000..7b3e947430
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/droopy_outer.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/fuzzy_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/fuzzy_inner.png
new file mode 100644
index 0000000000..2656ff2a99
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/fuzzy_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/meta.json
new file mode 100644
index 0000000000..45e8f84702
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/meta.json
@@ -0,0 +1,75 @@
+{
+ "version": 1,
+ "copyright": "Felinid ears made by @Vordenburg for Nyanotrasen @ https://github.com/Nyanotrasen/Nyanotrasen/pull/581/commits/77fe4c38589516ceef533de17cde56665ce970c7, modified by SX-7.",
+ "license": "CC-BY-SA-4.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "basic_inner",
+ "directions": 4
+ },
+ {
+ "name": "basic_outer",
+ "directions": 4
+ },
+ {
+ "name": "curled_inner",
+ "directions": 4
+ },
+ {
+ "name": "curled_outer",
+ "directions": 4
+ },
+ {
+ "name": "fuzzy_inner",
+ "directions": 4
+ },
+ {
+ "name": "tall_outer",
+ "directions": 4
+ },
+ {
+ "name": "tall_inner",
+ "directions": 4
+ },
+ {
+ "name": "tall_fuzz",
+ "directions": 4
+ },
+ {
+ "name": "torn_outer",
+ "directions": 4
+ },
+ {
+ "name": "torn_inner",
+ "directions": 4
+ },
+ {
+ "name": "stubby_outer",
+ "directions": 4
+ },
+ {
+ "name": "stubby_inner",
+ "directions": 4
+ },
+ {
+ "name": "droopy_outer",
+ "directions": 4
+ },
+ {
+ "name": "droopy_inner",
+ "directions": 4
+ },
+ {
+ "name": "wide_inner",
+ "directions": 4
+ },
+ {
+ "name": "wide_outer",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/stubby_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/stubby_inner.png
new file mode 100644
index 0000000000..2cb7d1093d
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/stubby_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/stubby_outer.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/stubby_outer.png
new file mode 100644
index 0000000000..57e8c8f375
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/stubby_outer.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_fuzz.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_fuzz.png
new file mode 100644
index 0000000000..c6e610549a
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_fuzz.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_inner.png
new file mode 100644
index 0000000000..6755edeec1
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_outer.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_outer.png
new file mode 100644
index 0000000000..5ea6dbbaa5
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/tall_outer.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/torn_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/torn_inner.png
new file mode 100644
index 0000000000..abdb77c487
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/torn_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/torn_outer.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/torn_outer.png
new file mode 100644
index 0000000000..d5242590cf
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/torn_outer.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/wide_inner.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/wide_inner.png
new file mode 100644
index 0000000000..eaa1ff64a5
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/wide_inner.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/wide_outer.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/wide_outer.png
new file mode 100644
index 0000000000..ae964a487d
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/felinid_ears.rsi/wide_outer.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/base_fox_tail.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/base_fox_tail.png
new file mode 100644
index 0000000000..afd2c8384c
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/base_fox_tail.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/base_fox_tail_tip.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/base_fox_tail_tip.png
new file mode 100644
index 0000000000..cbfe070e29
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/base_fox_tail_tip.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/meta.json
new file mode 100644
index 0000000000..a85e714e7a
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/foxtail.rsi/meta.json
@@ -0,0 +1,19 @@
+{
+ "version": 1,
+ "copyright": "apparently splurt-station https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/96703f76bccd8fe6a96b78524efb97a9af661767",
+ "license": "CC-BY-SA-4.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "base_fox_tail",
+ "directions": 4
+ },
+ {
+ "name": "base_fox_tail_tip",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/meta.json
new file mode 100644
index 0000000000..a6d17cb0dd
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/meta.json
@@ -0,0 +1,39 @@
+{
+ "version": 1,
+ "copyright": "Creator was not supplied, oldest reference tracked to KasparoVy @ https://github.com/ParadiseSS13/Paradise/commit/3610cfd4ea7e9bffc804320851f0b0a625db1dba. Minor tweaks by SX-7",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "muzzle",
+ "directions": 4
+ },
+ {
+ "name": "muzzle_large",
+ "directions": 4
+ },
+ {
+ "name": "nose",
+ "directions": 4
+ },
+ {
+ "name": "patch",
+ "directions": 4
+ },
+ {
+ "name": "points",
+ "directions": 4
+ },
+ {
+ "name": "tiger_face",
+ "directions": 4
+ },
+ {
+ "name": "tiger_head",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/muzzle.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/muzzle.png
new file mode 100644
index 0000000000..67030feac8
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/muzzle.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/muzzle_large.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/muzzle_large.png
new file mode 100644
index 0000000000..f96ed03537
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/muzzle_large.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/nose.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/nose.png
new file mode 100644
index 0000000000..31bc5f06d8
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/nose.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/patch.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/patch.png
new file mode 100644
index 0000000000..64f3effae9
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/patch.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/points.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/points.png
new file mode 100644
index 0000000000..dff01d78ae
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/points.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/tiger_face.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/tiger_face.png
new file mode 100644
index 0000000000..36d8617fab
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/tiger_face.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/tiger_head.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/tiger_head.png
new file mode 100644
index 0000000000..8ee160777b
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/head.rsi/tiger_head.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/meta.json
new file mode 100644
index 0000000000..5f23a51818
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/meta.json
@@ -0,0 +1,19 @@
+{
+ "version": 1,
+ "copyright": "Creator was not supplied, oldest reference tracked to KasparoVy @ https://github.com/ParadiseSS13/Paradise/commit/3610cfd4ea7e9bffc804320851f0b0a625db1dba. Minor tweaks by SX-7",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "patch",
+ "directions": 4
+ },
+ {
+ "name": "points",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/patch.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/patch.png
new file mode 100644
index 0000000000..835270a15b
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/patch.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/points.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/points.png
new file mode 100644
index 0000000000..c38d3d2e3a
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/overlays.rsi/points.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/meta.json
new file mode 100644
index 0000000000..f61cbf5e37
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "copyright": "Creator was not supplied, oldest reference tracked to Cael Aislinn in commit https://github.com/ParadiseSS13/Paradise/commit/9e4539fdce01f00ed7e47ca1174a1470ac5fe77c. Sprite reorganization by SX-7, but no changes to sprites themselves",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "tail_anim_rings",
+ "directions": 4,
+ "delays": [
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ],
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ],
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ],
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ]
+ ]
+ },
+ {
+ "name": "tail_rings",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/tail_anim_rings.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/tail_anim_rings.png
new file mode 100644
index 0000000000..b60ffd8620
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/tail_anim_rings.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/tail_rings.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/tail_rings.png
new file mode 100644
index 0000000000..84f6b2542c
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tail_markings.rsi/tail_rings.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/meta.json
new file mode 100644
index 0000000000..39050cb344
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "copyright": "Creator was not supplied, oldest reference tracked to Cael Aislinn in commit https://github.com/ParadiseSS13/Paradise/commit/9e4539fdce01f00ed7e47ca1174a1470ac5fe77c. Sprite reorganization by SX-7, but no changes to sprites themselves",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "tail",
+ "directions": 4
+ },
+ {
+ "name": "tail_anim",
+ "directions": 4,
+ "delays": [
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ],
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ],
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ],
+ [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/tail.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/tail.png
new file mode 100644
index 0000000000..cbdeebb613
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/tail.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/tail_anim.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/tail_anim.png
new file mode 100644
index 0000000000..a849bf7cbb
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/tails.rsi/tail_anim.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/belly.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/belly.png
new file mode 100644
index 0000000000..c7f9e78255
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/belly.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/crest.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/crest.png
new file mode 100644
index 0000000000..ccb52f0883
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/crest.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/fullbelly.png b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/fullbelly.png
new file mode 100644
index 0000000000..bcb6dc67ac
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/fullbelly.png differ
diff --git a/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/meta.json
new file mode 100644
index 0000000000..66d6f47649
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Customization/Tajaran/torso.rsi/meta.json
@@ -0,0 +1,23 @@
+{
+ "version": 1,
+ "copyright": "Creator was not supplied, oldest reference tracked to KasparoVy @ https://github.com/ParadiseSS13/Paradise/commit/38717e3b034550b3c0a9f3c5f3c78a957dcad0d9. Minor tweaks by SX-7",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "belly",
+ "directions": 4
+ },
+ {
+ "name": "crest",
+ "directions": 4
+ },
+ {
+ "name": "fullbelly",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/head_f.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/head_f.png
new file mode 100644
index 0000000000..a89cf12a1f
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/head_f.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/head_m.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/head_m.png
new file mode 100644
index 0000000000..1d01e03523
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/head_m.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_arm.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_arm.png
new file mode 100644
index 0000000000..7873edd652
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_arm.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_foot.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_foot.png
new file mode 100644
index 0000000000..4fcc3ea79c
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_foot.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_hand.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_hand.png
new file mode 100644
index 0000000000..dc9c2b6422
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_hand.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_leg.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_leg.png
new file mode 100644
index 0000000000..fd0008474c
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/l_leg.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/meta.json b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/meta.json
new file mode 100644
index 0000000000..13e804ad54
--- /dev/null
+++ b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/meta.json
@@ -0,0 +1,59 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Creator was not supplied, oldest reference tracked to Cael Aislinn in commit https://github.com/ParadiseSS13/Paradise/commit/9e4539fdce01f00ed7e47ca1174a1470ac5fe77c. Small changes made by SX-7. Names are as provided, sans torso_f front which is a combined version of modified torso_m front, and modified torso_f",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "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/_EE/Mobs/Species/Tajaran/parts.rsi/r_arm.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_arm.png
new file mode 100644
index 0000000000..f0449da695
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_arm.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_foot.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_foot.png
new file mode 100644
index 0000000000..5d5d6ce77e
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_foot.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_hand.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_hand.png
new file mode 100644
index 0000000000..e11a7ad5e9
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_hand.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_leg.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_leg.png
new file mode 100644
index 0000000000..80b4a864d7
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/r_leg.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/torso_f.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/torso_f.png
new file mode 100644
index 0000000000..c18fc1458c
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/torso_f.png differ
diff --git a/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/torso_m.png b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/torso_m.png
new file mode 100644
index 0000000000..f5650c6f52
Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Species/Tajaran/parts.rsi/torso_m.png differ
diff --git a/Resources/Textures/_Goobstation/Actions/modsuit.rsi/activate-ready.png b/Resources/Textures/_Goobstation/Actions/modsuit.rsi/activate-ready.png
new file mode 100644
index 0000000000..c604a291a5
Binary files /dev/null and b/Resources/Textures/_Goobstation/Actions/modsuit.rsi/activate-ready.png differ
diff --git a/Resources/Textures/_Goobstation/Actions/modsuit.rsi/activate.png b/Resources/Textures/_Goobstation/Actions/modsuit.rsi/activate.png
new file mode 100644
index 0000000000..aafa86494e
Binary files /dev/null and b/Resources/Textures/_Goobstation/Actions/modsuit.rsi/activate.png differ
diff --git a/Resources/Textures/_Goobstation/Actions/modsuit.rsi/meta.json b/Resources/Textures/_Goobstation/Actions/modsuit.rsi/meta.json
new file mode 100644
index 0000000000..86935425a0
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Actions/modsuit.rsi/meta.json
@@ -0,0 +1,17 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "From tgstation - https://github.com/tgstation/tgstation/pull/59109",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "activate"
+ },
+ {
+ "name": "activate-ready"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/control-sealed.png b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/control-sealed.png
new file mode 100644
index 0000000000..b6623346a2
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/control-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/control.png b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/control.png
new file mode 100644
index 0000000000..3c697a6408
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/control.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/equipped-BACKPACK-sealed.png b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/equipped-BACKPACK-sealed.png
new file mode 100644
index 0000000000..8c9541f32f
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/equipped-BACKPACK-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/equipped-BACKPACK.png b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/equipped-BACKPACK.png
new file mode 100644
index 0000000000..4f1b124080
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/equipped-BACKPACK.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/meta.json b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/meta.json
new file mode 100644
index 0000000000..ad0319fbe8
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Clothing/Back/Modsuits/standard.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "From tgstation - https://github.com/tgstation/tgstation/pull/59109",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "control"
+ },
+ {
+ "name": "control-sealed",
+ "delays": [[ 0.1, 0.1, 0.1, 0.1 ]]
+ },
+ {
+ "name": "equipped-BACKPACK",
+ "directions": 4
+ },
+ {
+ "name": "equipped-BACKPACK-sealed",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/equipped-HAND-sealed.png b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/equipped-HAND-sealed.png
new file mode 100644
index 0000000000..bbe4c7db6f
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/equipped-HAND-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/equipped-HAND.png b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/equipped-HAND.png
new file mode 100644
index 0000000000..6cf7712099
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/equipped-HAND.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/gauntlets-sealed.png b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/gauntlets-sealed.png
new file mode 100644
index 0000000000..c118476a06
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/gauntlets-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/gauntlets.png b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/gauntlets.png
new file mode 100644
index 0000000000..8657069573
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/gauntlets.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/meta.json b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/meta.json
new file mode 100644
index 0000000000..c89900d9aa
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Clothing/Hands/Modsuits/standard.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "From tgstation - https://github.com/tgstation/tgstation/pull/59109",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "gauntlets"
+ },
+ {
+ "name": "gauntlets-sealed"
+ },
+ {
+ "name": "equipped-HAND",
+ "directions": 4
+ },
+ {
+ "name": "equipped-HAND-sealed",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/equipped-HEAD-sealed.png b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/equipped-HEAD-sealed.png
new file mode 100644
index 0000000000..bfb719e985
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/equipped-HEAD-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/equipped-HEAD.png b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/equipped-HEAD.png
new file mode 100644
index 0000000000..b9f66137b8
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/equipped-HEAD.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/helmet-sealed.png b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/helmet-sealed.png
new file mode 100644
index 0000000000..0031e63fb3
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/helmet-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/helmet.png b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/helmet.png
new file mode 100644
index 0000000000..968c155414
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/helmet.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/meta.json b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/meta.json
new file mode 100644
index 0000000000..77303d7be4
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Clothing/Head/Modsuits/standard.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "From tgstation - https://github.com/tgstation/tgstation/pull/59109",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "helmet"
+ },
+ {
+ "name": "helmet-sealed"
+ },
+ {
+ "name": "equipped-HEAD",
+ "directions": 4
+ },
+ {
+ "name": "equipped-HEAD-sealed",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/chestplate-sealed.png b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/chestplate-sealed.png
new file mode 100644
index 0000000000..5f374eecd9
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/chestplate-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/chestplate.png b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/chestplate.png
new file mode 100644
index 0000000000..404383a236
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/chestplate.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/equipped-OUTERCLOTHING-sealed.png b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/equipped-OUTERCLOTHING-sealed.png
new file mode 100644
index 0000000000..41ec1315e4
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/equipped-OUTERCLOTHING-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/equipped-OUTERCLOTHING.png
new file mode 100644
index 0000000000..708d97c92a
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/meta.json b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/meta.json
new file mode 100644
index 0000000000..0f10810f22
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Clothing/OuterClothing/Modsuits/standard.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "From tgstation - https://github.com/tgstation/tgstation/pull/59109",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "chestplate"
+ },
+ {
+ "name": "chestplate-sealed"
+ },
+ {
+ "name": "equipped-OUTERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "equipped-OUTERCLOTHING-sealed",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/boots-sealed.png b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/boots-sealed.png
new file mode 100644
index 0000000000..4d141b313f
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/boots-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/boots.png b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/boots.png
new file mode 100644
index 0000000000..7dcd0cf6e5
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/boots.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/equipped-FEET-sealed.png b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/equipped-FEET-sealed.png
new file mode 100644
index 0000000000..5ad67b6efa
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/equipped-FEET-sealed.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/equipped-FEET.png b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/equipped-FEET.png
new file mode 100644
index 0000000000..a95a4bb37d
Binary files /dev/null and b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/equipped-FEET.png differ
diff --git a/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/meta.json b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/meta.json
new file mode 100644
index 0000000000..136eede0ec
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Clothing/Shoes/Modsuits/standard.rsi/meta.json
@@ -0,0 +1,25 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "From tgstation - https://github.com/tgstation/tgstation/pull/59109",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "boots"
+ },
+ {
+ "name": "boots-sealed"
+ },
+ {
+ "name": "equipped-FEET",
+ "directions": 4
+ },
+ {
+ "name": "equipped-FEET-sealed",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/meta.json b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/meta.json
new file mode 100644
index 0000000000..2687b6079d
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/meta.json
@@ -0,0 +1,29 @@
+{
+ "version": 1,
+ "license": "CC0-1.0",
+ "copyright": "Taken from TG",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "modpower0"
+ },
+ {
+ "name": "modpower1"
+ },
+ {
+ "name": "modpower2"
+ },
+ {
+ "name": "modpower3"
+ },
+ {
+ "name": "modpower4"
+ },
+ {
+ "name": "modpower5"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower0.png b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower0.png
new file mode 100644
index 0000000000..2e738ca7e7
Binary files /dev/null and b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower0.png differ
diff --git a/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower1.png b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower1.png
new file mode 100644
index 0000000000..62780521b7
Binary files /dev/null and b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower1.png differ
diff --git a/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower2.png b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower2.png
new file mode 100644
index 0000000000..21d8e7f6e7
Binary files /dev/null and b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower2.png differ
diff --git a/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower3.png b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower3.png
new file mode 100644
index 0000000000..80c0d1dcfc
Binary files /dev/null and b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower3.png differ
diff --git a/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower4.png b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower4.png
new file mode 100644
index 0000000000..d6b47c7577
Binary files /dev/null and b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower4.png differ
diff --git a/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower5.png b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower5.png
new file mode 100644
index 0000000000..d6b47c7577
Binary files /dev/null and b/Resources/Textures/_Goobstation/Interface/Alerts/modpower.rsi/modpower5.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/braidedExtensions.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/braidedExtensions.png
new file mode 100644
index 0000000000..9df64362f5
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/braidedExtensions.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/cometTail.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/cometTail.png
new file mode 100644
index 0000000000..1dfb6e85a0
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/cometTail.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/fantasyHair.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/fantasyHair.png
new file mode 100644
index 0000000000..71beae1358
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/fantasyHair.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/flatTwistsUpdo.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/flatTwistsUpdo.png
new file mode 100644
index 0000000000..c23886cf8f
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/flatTwistsUpdo.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/floorlengthBraid.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/floorlengthBraid.png
new file mode 100644
index 0000000000..74649ba09e
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/floorlengthBraid.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/floorlengthWavy.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/floorlengthWavy.png
new file mode 100644
index 0000000000..bd0d638c17
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/floorlengthWavy.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frizzyBraid.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frizzyBraid.png
new file mode 100644
index 0000000000..3f8cfd65f8
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frizzyBraid.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsLong.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsLong.png
new file mode 100644
index 0000000000..008f09d744
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsLong.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsMedium.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsMedium.png
new file mode 100644
index 0000000000..6c423a7746
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsMedium.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsShort.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsShort.png
new file mode 100644
index 0000000000..a99d8fb497
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/frontBraidsShort.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/hairnet.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/hairnet.png
new file mode 100644
index 0000000000..d46f40eb06
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/hairnet.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/jellyfish.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/jellyfish.png
new file mode 100644
index 0000000000..bf9401a861
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/jellyfish.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/kazuyaMishima.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/kazuyaMishima.png
new file mode 100644
index 0000000000..eafcda2482
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/kazuyaMishima.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longBraids.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longBraids.png
new file mode 100644
index 0000000000..5a8a963452
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longBraids.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longCurvy.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longCurvy.png
new file mode 100644
index 0000000000..f8ba2d8cac
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longCurvy.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longPompadour.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longPompadour.png
new file mode 100644
index 0000000000..613b19a114
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/longPompadour.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/mediumCurls.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/mediumCurls.png
new file mode 100644
index 0000000000..d0960ba875
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/mediumCurls.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/meta.json b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/meta.json
new file mode 100644
index 0000000000..c3074508a6
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/meta.json
@@ -0,0 +1,143 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "copyright": "Sprited by Bloomyex and implemented by RobynTheWarcrime, FrizzyBraid by Renee - https://discord.com/channels/1202734573247795300/1288192265319223387/1288887697917607936 | flatTwistsUpdo edited by Skubman",
+ "license": "CC-BY-SA-3.0",
+ "states": [
+ {
+ "name": "braidedExtensions",
+ "directions": 4
+ },
+ {
+ "name": "cometTail",
+ "directions": 4
+ },
+ {
+ "name": "fantasyHair",
+ "directions": 4
+ },
+ {
+ "name": "flatTwistsUpdo",
+ "directions": 4
+ },
+ {
+ "name": "floorlengthBraid",
+ "directions": 4
+ },
+ {
+ "name": "floorlengthWavy",
+ "directions": 4
+ },
+ {
+ "name": "frizzyBraid",
+ "directions": 4
+ },
+ {
+ "name": "frontBraidsLong",
+ "directions": 4
+ },
+ {
+ "name": "frontBraidsMedium",
+ "directions": 4
+ },
+ {
+ "name": "frontBraidsShort",
+ "directions": 4
+ },
+ {
+ "name": "hairnet",
+ "directions": 4
+ },
+ {
+ "name": "jellyfish",
+ "directions": 4
+ },
+ {
+ "name": "kazuyaMishima",
+ "directions": 4
+ },
+ {
+ "name": "longBraids",
+ "directions": 4
+ },
+ {
+ "name": "longCurvy",
+ "directions": 4
+ },
+ {
+ "name": "longPompadour",
+ "directions": 4
+ },
+ {
+ "name": "mediumCurls",
+ "directions": 4
+ },
+ {
+ "name": "mullet",
+ "directions": 4
+ },
+ {
+ "name": "pelvicLengthBraid",
+ "directions": 4
+ },
+ {
+ "name": "plateau",
+ "directions": 4
+ },
+ {
+ "name": "queenBee",
+ "directions": 4
+ },
+ {
+ "name": "saggedMohawk",
+ "directions": 4
+ },
+ {
+ "name": "sharpMohawk",
+ "directions": 4
+ },
+ {
+ "name": "shortAndPoofy",
+ "directions": 4
+ },
+ {
+ "name": "shortCurls",
+ "directions": 4
+ },
+ {
+ "name": "shoulderLengthBraid",
+ "directions": 4
+ },
+ {
+ "name": "sideSpike",
+ "directions": 4
+ },
+ {
+ "name": "spaceLoops",
+ "directions": 4
+ },
+ {
+ "name": "star",
+ "directions": 4
+ },
+ {
+ "name": "starFro",
+ "directions": 4
+ },
+ {
+ "name": "styledCurls",
+ "directions": 4
+ },
+ {
+ "name": "unkemptScientist",
+ "directions": 4
+ },
+ {
+ "name": "wispy",
+ "directions": 4
+ }
+ ]
+ }
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/mullet.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/mullet.png
new file mode 100644
index 0000000000..1e76c07a9c
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/mullet.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/pelvicLengthBraid.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/pelvicLengthBraid.png
new file mode 100644
index 0000000000..171ec69f5c
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/pelvicLengthBraid.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/plateau.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/plateau.png
new file mode 100644
index 0000000000..04edf9cdd9
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/plateau.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/queenBee.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/queenBee.png
new file mode 100644
index 0000000000..54d50924d4
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/queenBee.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/saggedMohawk.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/saggedMohawk.png
new file mode 100644
index 0000000000..c895dc5699
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/saggedMohawk.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/sharpMohawk.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/sharpMohawk.png
new file mode 100644
index 0000000000..54a01f213d
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/sharpMohawk.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shortAndPoofy.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shortAndPoofy.png
new file mode 100644
index 0000000000..9badee4ad3
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shortAndPoofy.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shortCurls.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shortCurls.png
new file mode 100644
index 0000000000..e11e4a8576
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shortCurls.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shoulderLengthBraid.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shoulderLengthBraid.png
new file mode 100644
index 0000000000..49dc670def
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/shoulderLengthBraid.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/sideSpike.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/sideSpike.png
new file mode 100644
index 0000000000..e1424eb941
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/sideSpike.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/spaceLoops.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/spaceLoops.png
new file mode 100644
index 0000000000..940dc18938
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/spaceLoops.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/star.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/star.png
new file mode 100644
index 0000000000..c6f91e1564
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/star.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/starFro.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/starFro.png
new file mode 100644
index 0000000000..702167f80b
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/starFro.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/styledCurls.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/styledCurls.png
new file mode 100644
index 0000000000..2f2038cc64
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/styledCurls.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/unkemptScientist.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/unkemptScientist.png
new file mode 100644
index 0000000000..088fe4da17
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/unkemptScientist.png differ
diff --git a/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/wispy.png b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/wispy.png
new file mode 100644
index 0000000000..5f0d1773ec
Binary files /dev/null and b/Resources/Textures/_Goobstation/Mobs/Customization/human_hair.rsi/wispy.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/boots.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/boots.png
new file mode 100644
index 0000000000..0b0ada9e58
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/boots.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/chestplate.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/chestplate.png
new file mode 100644
index 0000000000..a499fcf230
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/chestplate.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/gauntlets.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/gauntlets.png
new file mode 100644
index 0000000000..f242f4db40
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/gauntlets.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/helmet.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/helmet.png
new file mode 100644
index 0000000000..5385dcb9fa
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/helmet.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/meta.json b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/meta.json
new file mode 100644
index 0000000000..1d59db7f79
--- /dev/null
+++ b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/meta.json
@@ -0,0 +1,56 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "From tgstation - https://github.com/tgstation/tgstation/pull/59109",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "chestplate"
+ },
+ {
+ "name": "gauntlets"
+ },
+ {
+ "name": "helmet"
+ },
+ {
+ "name": "standard-plating"
+ },
+ {
+ "name": "boots"
+ },
+ {
+ "name": "shell"
+ },
+ {
+ "name": "mod-core-standard",
+ "delays": [[0.1, 0.1, 0.1, 0.1]]
+ },
+ {
+ "name": "shell-core",
+ "delays": [[0.1, 0.1, 0.1, 0.1]]
+ },
+ {
+ "name": "shell-core-secured",
+ "delays": [[0.1, 0.1, 0.1, 0.1]]
+ },
+ {
+ "name": "shell-helmet"
+ },
+ {
+ "name": "shell-chestplate"
+ },
+ {
+ "name": "shell-gauntlets"
+ },
+ {
+ "name": "shell-boots"
+ },
+ {
+ "name": "shell-secured"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/mod-core-standard.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/mod-core-standard.png
new file mode 100644
index 0000000000..437079c540
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/mod-core-standard.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-boots.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-boots.png
new file mode 100644
index 0000000000..f825bb5c40
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-boots.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-chestplate.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-chestplate.png
new file mode 100644
index 0000000000..25384dabf4
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-chestplate.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-core-secured.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-core-secured.png
new file mode 100644
index 0000000000..f03323b100
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-core-secured.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-core.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-core.png
new file mode 100644
index 0000000000..1957741c8d
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-core.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-gauntlets.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-gauntlets.png
new file mode 100644
index 0000000000..02b9c2824b
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-gauntlets.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-helmet.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-helmet.png
new file mode 100644
index 0000000000..9417be1ef6
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-helmet.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-secured.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-secured.png
new file mode 100644
index 0000000000..4152554390
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell-secured.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell.png
new file mode 100644
index 0000000000..0f9665700a
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/shell.png differ
diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/standard-plating.png b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/standard-plating.png
new file mode 100644
index 0000000000..ff521088cb
Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Robotics/modsuit_parts.rsi/standard-plating.png differ
diff --git a/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/dragon.png b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/dragon.png
new file mode 100644
index 0000000000..39e32610d7
Binary files /dev/null and b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/dragon.png differ
diff --git a/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/fly.png b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/fly.png
new file mode 100644
index 0000000000..cb6e4a0423
Binary files /dev/null and b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/fly.png differ
diff --git a/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/meta.json b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/meta.json
new file mode 100644
index 0000000000..8b7c597c2d
--- /dev/null
+++ b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/meta.json
@@ -0,0 +1,24 @@
+{
+ "version": 1,
+ "size": { "x": 64, "y": 34 },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from TGStation at commit https://github.com/tgstation/tgstation/commit/e9cc620e9f908e18949031c6e1b5811e3fc5af4e | skeleton modified by Skubman",
+ "states": [
+ {
+ "name": "dragon",
+ "directions": 4
+ },
+ {
+ "name": "fly",
+ "directions": 4
+ },
+ {
+ "name": "robotic",
+ "directions": 4
+ },
+ {
+ "name": "skeleton",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/robotic.png b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/robotic.png
new file mode 100644
index 0000000000..0663a6be4a
Binary files /dev/null and b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/robotic.png differ
diff --git a/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/skeleton.png b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/skeleton.png
new file mode 100644
index 0000000000..22b76c2e31
Binary files /dev/null and b/Resources/Textures/_SimpleStation/Mobs/Customization/wings64x34.rsi/skeleton.png differ