From 75bb8d3728441cd7ea57341ba020c80575f35bd9 Mon Sep 17 00:00:00 2001
From: John Willis <143434770+CerberusWolfie@users.noreply.github.com>
Date: Sun, 5 Jan 2025 11:01:33 -0500
Subject: [PATCH 01/22] [Port] Port Guidebook Tables From Wizden PR #28484
(#1427)
# Description
This ports the Guidebook Tables to allow \
and \
embeds in the Guidebook.
This just adds extra XML tags to use in rich-text.
---
# TODO
- [x] Cherry-Pick the PR.
- [x] Tested to make sure it works. It does actively work.
---
# Media
Guidebook Screenshot
![image](https://github.com/user-attachments/assets/289e4c72-dcef-4489-b89e-5a2d6367124f)
NOTE: This screenshot was taken in the dev-environment. I just
copy-pasted my SOP for Alert Levels to check it, since it uses both the
\ and \ identifiers.
---
# Changelog
:cl:
- add: Added and identifiers. Go wild in SOP!
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
---
Content.Client/Guidebook/Richtext/Box.cs | 3 +
Content.Client/Guidebook/Richtext/ColorBox.cs | 49 +++
Content.Client/Guidebook/Richtext/Table.cs | 27 ++
.../UserInterface/Controls/TableContainer.cs | 285 ++++++++++++++++++
4 files changed, 364 insertions(+)
create mode 100644 Content.Client/Guidebook/Richtext/ColorBox.cs
create mode 100644 Content.Client/Guidebook/Richtext/Table.cs
create mode 100644 Content.Client/UserInterface/Controls/TableContainer.cs
diff --git a/Content.Client/Guidebook/Richtext/Box.cs b/Content.Client/Guidebook/Richtext/Box.cs
index ecf6cb21f70..6e18ad9c575 100644
--- a/Content.Client/Guidebook/Richtext/Box.cs
+++ b/Content.Client/Guidebook/Richtext/Box.cs
@@ -11,6 +11,9 @@ public bool TryParseTag(Dictionary args, [NotNullWhen(true)] out
HorizontalExpand = true;
control = this;
+ if (args.TryGetValue("Margin", out var margin))
+ Margin = new Thickness(float.Parse(margin));
+
if (args.TryGetValue("Orientation", out var orientation))
Orientation = Enum.Parse(orientation);
else
diff --git a/Content.Client/Guidebook/Richtext/ColorBox.cs b/Content.Client/Guidebook/Richtext/ColorBox.cs
new file mode 100644
index 00000000000..84de300d6e0
--- /dev/null
+++ b/Content.Client/Guidebook/Richtext/ColorBox.cs
@@ -0,0 +1,49 @@
+using System.Diagnostics.CodeAnalysis;
+using JetBrains.Annotations;
+using Robust.Client.Graphics;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+
+namespace Content.Client.Guidebook.Richtext;
+
+[UsedImplicitly]
+public sealed class ColorBox : PanelContainer, IDocumentTag
+{
+ public bool TryParseTag(Dictionary args, [NotNullWhen(true)] out Control? control)
+ {
+ HorizontalExpand = true;
+ VerticalExpand = true;
+ control = this;
+
+ if (args.TryGetValue("Margin", out var margin))
+ Margin = new Thickness(float.Parse(margin));
+
+ if (args.TryGetValue("HorizontalAlignment", out var halign))
+ HorizontalAlignment = Enum.Parse(halign);
+ else
+ HorizontalAlignment = HAlignment.Stretch;
+
+ if (args.TryGetValue("VerticalAlignment", out var valign))
+ VerticalAlignment = Enum.Parse(valign);
+ else
+ VerticalAlignment = VAlignment.Stretch;
+
+ var styleBox = new StyleBoxFlat();
+ if (args.TryGetValue("Color", out var color))
+ styleBox.BackgroundColor = Color.FromHex(color);
+
+ if (args.TryGetValue("OutlineThickness", out var outlineThickness))
+ styleBox.BorderThickness = new Thickness(float.Parse(outlineThickness));
+ else
+ styleBox.BorderThickness = new Thickness(1);
+
+ if (args.TryGetValue("OutlineColor", out var outlineColor))
+ styleBox.BorderColor = Color.FromHex(outlineColor);
+ else
+ styleBox.BorderColor = Color.White;
+
+ PanelOverride = styleBox;
+
+ return true;
+ }
+}
diff --git a/Content.Client/Guidebook/Richtext/Table.cs b/Content.Client/Guidebook/Richtext/Table.cs
new file mode 100644
index 00000000000..b6923c3698e
--- /dev/null
+++ b/Content.Client/Guidebook/Richtext/Table.cs
@@ -0,0 +1,27 @@
+using System.Diagnostics.CodeAnalysis;
+using Content.Client.UserInterface.Controls;
+using JetBrains.Annotations;
+using Robust.Client.UserInterface;
+
+namespace Content.Client.Guidebook.Richtext;
+
+[UsedImplicitly]
+public sealed class Table : TableContainer, IDocumentTag
+{
+ public bool TryParseTag(Dictionary args, [NotNullWhen(true)] out Control? control)
+ {
+ HorizontalExpand = true;
+ control = this;
+
+ if (!args.TryGetValue("Columns", out var columns) || !int.TryParse(columns, out var columnsCount))
+ {
+ Logger.Error("Guidebook tag \"Table\" does not specify required property \"Columns.\"");
+ control = null;
+ return false;
+ }
+
+ Columns = columnsCount;
+
+ return true;
+ }
+}
diff --git a/Content.Client/UserInterface/Controls/TableContainer.cs b/Content.Client/UserInterface/Controls/TableContainer.cs
new file mode 100644
index 00000000000..3e8d4760015
--- /dev/null
+++ b/Content.Client/UserInterface/Controls/TableContainer.cs
@@ -0,0 +1,285 @@
+using System.Numerics;
+using Robust.Client.UserInterface.Controls;
+
+namespace Content.Client.UserInterface.Controls;
+
+// This control is not part of engine because I quickly wrote it in 2 hours at 2 AM and don't want to deal with
+// API stabilization and/or figuring out relation to GridContainer.
+// Grid layout is a complicated problem and I don't want to commit another half-baked thing into the engine.
+// It's probably sufficient for its use case (RichTextLabel tables for rules/guidebook).
+// Despite that, it's still better comment the shit half of you write on a regular basis.
+//
+// EMO: thank you PJB i was going to kill myself.
+
+///
+/// Displays children in a tabular grid. Unlike ,
+/// properly handles layout constraints so putting word-wrapping in it should work.
+///
+///
+/// All children are automatically laid out in columns.
+/// The first control is in the top left, laid out per row from there.
+///
+[Virtual]
+public class TableContainer : Container
+{
+ private int _columns = 1;
+
+ ///
+ /// The absolute minimum width a column can be forced to.
+ ///
+ ///
+ ///
+ /// If a column *asks* for less width than this (small contents), it can still be smaller.
+ /// But if it asks for more it cannot go below this width.
+ ///
+ ///
+ public float MinForcedColumnWidth { get; set; } = 50;
+
+ // Scratch space used while calculating layout, cached to avoid regular allocations during layout pass.
+ private ColumnData[] _columnDataCache = [];
+ private RowData[] _rowDataCache = [];
+
+ ///
+ /// How many columns should be displayed.
+ ///
+ public int Columns
+ {
+ get => _columns;
+ set
+ {
+ ArgumentOutOfRangeException.ThrowIfLessThan(value, 1, nameof(value));
+
+ _columns = value;
+ }
+ }
+
+ protected override Vector2 MeasureOverride(Vector2 availableSize)
+ {
+ ResetCachedArrays();
+
+ // Do a first pass measuring all child controls as if they're given infinite space.
+ // This gives us a maximum width the columns want, which we use to proportion them later.
+ var columnIdx = 0;
+ foreach (var child in Children)
+ {
+ ref var column = ref _columnDataCache[columnIdx];
+
+ child.Measure(new Vector2(float.PositiveInfinity, float.PositiveInfinity));
+ column.MaxWidth = Math.Max(column.MaxWidth, child.DesiredSize.X);
+
+ columnIdx += 1;
+ if (columnIdx == _columns)
+ columnIdx = 0;
+ }
+
+ // Calculate Slack and MinWidth for all columns. Also calculate sums for all columns.
+ var totalMinWidth = 0f;
+ var totalMaxWidth = 0f;
+ var totalSlack = 0f;
+
+ for (var c = 0; c < _columns; c++)
+ {
+ ref var column = ref _columnDataCache[c];
+ column.MinWidth = Math.Min(column.MaxWidth, MinForcedColumnWidth);
+ column.Slack = column.MaxWidth - column.MinWidth;
+
+ totalMinWidth += column.MinWidth;
+ totalMaxWidth += column.MaxWidth;
+ totalSlack += column.Slack;
+ }
+
+ if (totalMaxWidth <= availableSize.X)
+ {
+ // We want less horizontal space than we're given. Huh, that's convenient.
+ // Just set assigned width to be however much they asked for.
+ // We could probably skip the second measure pass in this scenario,
+ // but that's just an optimization, so I don't care right now.
+ //
+ // There's probably a very clever way to make this behavior work with the else block of logic,
+ // just by fiddling with the math.
+ // I'm dumb, it's 4:30 AM. Yeah, I *started* at 2 AM.
+ for (var c = 0; c < _columns; c++)
+ {
+ ref var column = ref _columnDataCache[c];
+
+ column.AssignedWidth = column.MaxWidth;
+ }
+ }
+ else
+ {
+ // We don't have enough horizontal space,
+ // at least without causing *some* sort of word wrapping (assuming text contents).
+ //
+ // Assign horizontal space proportional to the wanted maximum size of the columns.
+ var assignableWidth = Math.Max(0, availableSize.X - totalMinWidth);
+ for (var c = 0; c < _columns; c++)
+ {
+ ref var column = ref _columnDataCache[c];
+
+ var slackRatio = column.Slack / totalSlack;
+ column.AssignedWidth = column.MinWidth + slackRatio * assignableWidth;
+ }
+ }
+
+ // Go over controls for a second measuring pass, this time giving them their assigned measure width.
+ // This will give us a height to slot into per-row data.
+ // We still measure assuming infinite vertical space.
+ // This control can't properly handle being constrained on the Y axis.
+ columnIdx = 0;
+ var rowIdx = 0;
+ foreach (var child in Children)
+ {
+ ref var column = ref _columnDataCache[columnIdx];
+ ref var row = ref _rowDataCache[rowIdx];
+
+ child.Measure(new Vector2(column.AssignedWidth, float.PositiveInfinity));
+ row.MeasuredHeight = Math.Max(row.MeasuredHeight, child.DesiredSize.Y);
+
+ columnIdx += 1;
+ if (columnIdx == _columns)
+ {
+ columnIdx = 0;
+ rowIdx += 1;
+ }
+ }
+
+ // Sum up height of all rows to get final measured table height.
+ var totalHeight = 0f;
+ for (var r = 0; r < _rowDataCache.Length; r++)
+ {
+ ref var row = ref _rowDataCache[r];
+ totalHeight += row.MeasuredHeight;
+ }
+
+ return new Vector2(Math.Min(availableSize.X, totalMaxWidth), totalHeight);
+ }
+
+ protected override Vector2 ArrangeOverride(Vector2 finalSize)
+ {
+ // TODO: Expand to fit given vertical space.
+
+ // Calculate MinWidth and Slack sums again from column data.
+ // We could've cached these from measure but whatever.
+ var totalMinWidth = 0f;
+ var totalSlack = 0f;
+
+ for (var c = 0; c < _columns; c++)
+ {
+ ref var column = ref _columnDataCache[c];
+ totalMinWidth += column.MinWidth;
+ totalSlack += column.Slack;
+ }
+
+ // Calculate new width based on final given size, also assign horizontal positions of all columns.
+ var assignableWidth = Math.Max(0, finalSize.X - totalMinWidth);
+ var xPos = 0f;
+ for (var c = 0; c < _columns; c++)
+ {
+ ref var column = ref _columnDataCache[c];
+
+ var slackRatio = column.Slack / totalSlack;
+ column.ArrangedWidth = column.MinWidth + slackRatio * assignableWidth;
+ column.ArrangedX = xPos;
+
+ xPos += column.ArrangedWidth;
+ }
+
+ // Do actual arrangement row-by-row.
+ var arrangeY = 0f;
+ for (var r = 0; r < _rowDataCache.Length; r++)
+ {
+ ref var row = ref _rowDataCache[r];
+
+ for (var c = 0; c < _columns; c++)
+ {
+ ref var column = ref _columnDataCache[c];
+ var index = c + r * _columns;
+
+ if (index >= ChildCount) // Quit early if we don't actually fill out the row.
+ break;
+ var child = GetChild(c + r * _columns);
+
+ child.Arrange(UIBox2.FromDimensions(column.ArrangedX, arrangeY, column.ArrangedWidth, row.MeasuredHeight));
+ }
+
+ arrangeY += row.MeasuredHeight;
+ }
+
+ return finalSize with { Y = arrangeY };
+ }
+
+ ///
+ /// Ensure cached array space is allocated to correct size and is reset to a clean slate.
+ ///
+ private void ResetCachedArrays()
+ {
+ // 1-argument Array.Clear() is not currently available in sandbox (added in .NET 6).
+
+ if (_columnDataCache.Length != _columns)
+ _columnDataCache = new ColumnData[_columns];
+
+ Array.Clear(_columnDataCache, 0, _columnDataCache.Length);
+
+ var rowCount = ChildCount / _columns;
+ if (ChildCount % _columns != 0)
+ rowCount += 1;
+
+ if (rowCount != _rowDataCache.Length)
+ _rowDataCache = new RowData[rowCount];
+
+ Array.Clear(_rowDataCache, 0, _rowDataCache.Length);
+ }
+
+ ///
+ /// Per-column data used during layout.
+ ///
+ private struct ColumnData
+ {
+ // Measure data.
+
+ ///
+ /// The maximum width any control in this column wants, if given infinite space.
+ /// Maximum of all controls on the column.
+ ///
+ public float MaxWidth;
+
+ ///
+ /// The minimum width this column may be given.
+ /// This is either or .
+ ///
+ public float MinWidth;
+
+ ///
+ /// Difference between max and min width; how much this column can expand from its minimum.
+ ///
+ public float Slack;
+
+ ///
+ /// How much horizontal space this column was assigned at measure time.
+ ///
+ public float AssignedWidth;
+
+ // Arrange data.
+
+ ///
+ /// How much horizontal space this column was assigned at arrange time.
+ ///
+ public float ArrangedWidth;
+
+ ///
+ /// The horizontal position this column was assigned at arrange time.
+ ///
+ public float ArrangedX;
+ }
+
+ private struct RowData
+ {
+ // Measure data.
+
+ ///
+ /// How much height the tallest control on this row was measured at,
+ /// measuring for infinite vertical space but assigned column width.
+ ///
+ public float MeasuredHeight;
+ }
+}
From 026d5526559cc4f9c4787ee2e4a0f3a825c1187e Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 16:01:59 +0000
Subject: [PATCH 02/22] Automatic Changelog Update (#1427)
---
Resources/Changelog/Changelog.yml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index d0165af7f11..707e36d75f7 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9152,3 +9152,10 @@ Entries:
id: 6628
time: '2025-01-04T16:59:01.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1417
+- author: CerberusWolfie
+ changes:
+ - type: Add
+ message: Added and identifiers. Go wild in SOP!
+ id: 6629
+ time: '2025-01-05T16:01:33.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1427
From d17fe1a1c68ac53ad305c66cf64c2fd9ed47c9db Mon Sep 17 00:00:00 2001
From: John Willis <143434770+CerberusWolfie@users.noreply.github.com>
Date: Sun, 5 Jan 2025 13:08:43 -0500
Subject: [PATCH 03/22] Add Different Launch Types to VSCode (#1430)
# Description
This adds several different launch types to the VSCode. This allows you
to launch Client in Compatibility Mode for the Tools/Release versions as
well as launch the Server/Client at the same time in Tools/Release modes
and use the VSCode Terminal.
---
# TODO
- [x] Add different Build types in the tasks.json file.
- [x] Add different Launch types in the launch.json file.
---
![image](https://github.com/user-attachments/assets/c7ba1f8b-82e8-4f3c-9c19-cfc3d12cc978)
---
.vscode/launch.json | 84 +++++++++++++++++++++++++++++++++++++++++++--
.vscode/tasks.json | 42 ++++++++++++++++++++++-
2 files changed, 123 insertions(+), 3 deletions(-)
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 5390b914093..f849354936f 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -4,6 +4,7 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
+ // CLIENT CONFIGS
{
"name": "Client",
"type": "coreclr",
@@ -14,7 +15,28 @@
"stopAtEntry": false
},
{
- "name": "Client (Compatibility renderer)",
+ "name": "Client (Tools)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build (Tools)",
+ "program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
+ "args": [],
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ {
+ "name": "Client (Release)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build (Release)",
+ "program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
+ "args": [],
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ // COMPATABILITY RENDERERS
+ {
+ "name": "Client (Compatibility Renderer)",
"type": "coreclr",
"request": "launch",
"program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
@@ -22,6 +44,27 @@
"console": "internalConsole",
"stopAtEntry": false
},
+ {
+ "name": "Client (Tools) - (Compatability Renderer)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build (Tools)",
+ "program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
+ "args": ["--cvar display.compat=true"],
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ {
+ "name": "Client (Release) - (Compatability Renderer)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build (Release)",
+ "program": "${workspaceFolder}/bin/Debug/Content.Client/Content.Client.dll",
+ "args": ["--cvar display.compat=true"],
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ // SERVER CONFIGS
{
"name": "Server",
"type": "coreclr",
@@ -31,6 +74,27 @@
"console": "integratedTerminal",
"stopAtEntry": false
},
+ {
+ "name": "Server (Tools)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build (Tools)",
+ "program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
+ "args": [],
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ {
+ "name": "Server (Release)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build (Release)",
+ "program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
+ "args": [],
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ // LINTER
{
"name": "YAML Linter",
"type": "coreclr",
@@ -50,6 +114,22 @@
"Client"
],
"preLaunchTask": "build"
+ },
+ {
+ "name": "Server/Client (Tools)",
+ "configurations": [
+ "Server (Tools)",
+ "Client (Tools)"
+ ],
+ "preLaunchTask": "build (Tools)"
+ },
+ {
+ "name": "Server/Client (Release)",
+ "configurations": [
+ "Server (Release)",
+ "Client (Release)"
+ ],
+ "preLaunchTask": "build (Release)"
}
]
-}
\ No newline at end of file
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 2865cc0fbfa..f51933bac0e 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -21,6 +21,46 @@
},
"problemMatcher": "$msCompile"
},
+ {
+ "label": "build (Tools)",
+ "command": "dotnet",
+ "type": "shell",
+ "args": [
+ "build",
+ "--configuration",
+ "Tools",
+ "/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
+ "/consoleloggerparameters:NoSummary" // Do not generate summary otherwise it leads to duplicate errors in Problems panel
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": false
+ },
+ "presentation": {
+ "reveal": "silent"
+ },
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "build (Release)",
+ "command": "dotnet",
+ "type": "shell",
+ "args": [
+ "build",
+ "--configuration",
+ "Release",
+ "/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
+ "/consoleloggerparameters:NoSummary" // Do not generate summary otherwise it leads to duplicate errors in Problems panel
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": false
+ },
+ "presentation": {
+ "reveal": "silent"
+ },
+ "problemMatcher": "$msCompile"
+ },
{
"label": "build-yaml-linter",
"command": "dotnet",
@@ -34,4 +74,4 @@
"problemMatcher": "$msCompile"
}
]
-}
\ No newline at end of file
+}
From 1e1e36c2f95529eb2658d67ae51b6942a987f497 Mon Sep 17 00:00:00 2001
From: Skubman
Date: Mon, 6 Jan 2025 02:09:37 +0800
Subject: [PATCH 04/22] =?UTF-8?q?=F0=9F=92=85=F0=9F=8F=BB=20Lamia=20Markin?=
=?UTF-8?q?gs=20+=20=E2=99=82=EF=B8=8F=20Male=20Lamia=20(#1440)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# Description
Adds male Lamia with facial hair. Also makes dozens of markings
available to Lamiae, including reptilian markings and pointy ears.
Also adds locale strings for the Lamia tail marking.
## Media
**Mermaid**
![image](https://github.com/user-attachments/assets/83c03899-dc64-45fa-a694-f0d88f2ec136)
**Face:** Lips, Blush
**Head:** Left Eye
**Head (Top):** Lizard Horns (Ayrshire)
**Head (Side):** Thin Ears, Drop Earrings (Left/Right)
**Chest:** Lizard Chest (Tiger)
**Right Arm:** Right Arm Bracelet
**Right Hand:** Right Bracelet, Right Nail Polish
**Left Hand:** Left Bracelet, Left Nail Polish
**Male**
![image](https://github.com/user-attachments/assets/addb6a4d-30b6-49d6-9cb6-6b6979d8a6c0)
![image](https://github.com/user-attachments/assets/4f09943b-a025-4cfa-a87a-0dc885993e5c)
**Face:** Eyelash (Left/Right), Eye Corner (Left/Right)
**Head (Top):** Lizard Horns (Angler)
**Head (Side):** Lizard Frills (Short)
**Chest:** Lizard Chest (Tiger)
**Right Arm:** Lizard Right Arm (Tiger)
**Right Hand:** Right Watch (Colorable)
**Left Arm:** Lizard Right Arm (Tiger)
**Overlay:** Gauze Handwrap
**Red**
![image](https://github.com/user-attachments/assets/c288799c-c136-4aaa-97a0-78452c5cbfaa)
**Face:** Lips
**Head (Top):** Lizard Horns
**Head (Side):** Upward Ears
**Right Hand:** Right Robotic Hand from Bishop Cybernetics
**Left Hand:** Left Robotic Hand from Bishop Cybernetics, Left Gold
Watch
**Lamia locale**
![image](https://github.com/user-attachments/assets/122d223a-a5d3-4efe-baed-268115e5ecb2)
![image](https://github.com/user-attachments/assets/c8effc4b-499d-417e-bd91-54f4526fde57)
## Changelog
:cl: Skubman
- add: Lamiae can now be male, no longer being a female-only species.
They can now wear facial hair as well.
- add: The Lamia species can now select markings above the leg,
including cybernetics, makeup, tattoos, noses, earrings, heterochromia,
bracelets, reptilian horns and frills, pointy ears, and more!
- fix: Added text for the Lamia tail marking.
---
Resources/Locale/en-US/markings/lamia.ftl | 4 +
.../DeltaV/Entities/Mobs/Species/lamia.yml | 18 +++--
Resources/Prototypes/DeltaV/Species/lamia.yml | 34 ++++++++-
.../Mobs/Customization/Markings/earrings.yml | 76 +++++++++----------
.../Mobs/Customization/Markings/face.yml | 62 +++++++--------
.../Mobs/Customization/Markings/gauze.yml | 22 +++---
.../Customization/Markings/human_noses.yml | 10 +--
.../Mobs/Customization/Markings/makeup.yml | 8 +-
.../Customization/Markings/pointy_ears.yml | 18 ++---
.../Mobs/Customization/Markings/reptilian.yml | 30 ++++----
.../Mobs/Customization/Markings/scars.yml | 10 +--
.../Mobs/Customization/Markings/tattoos.yml | 12 +--
.../Mobs/Customization/Markings/wrist.yml | 32 ++++----
.../Mobs/Customization/cyberlimbs/bishop.yml | 8 +-
.../Customization/cyberlimbs/hesphiastos.yml | 8 +-
15 files changed, 196 insertions(+), 156 deletions(-)
create mode 100644 Resources/Locale/en-US/markings/lamia.ftl
diff --git a/Resources/Locale/en-US/markings/lamia.ftl b/Resources/Locale/en-US/markings/lamia.ftl
new file mode 100644
index 00000000000..6e32e2fe364
--- /dev/null
+++ b/Resources/Locale/en-US/markings/lamia.ftl
@@ -0,0 +1,4 @@
+marking-LamiaBottom = Lamia Tail
+marking-LamiaBottom-bottom3tone1 = Lamia Tail Bottom
+marking-LamiaBottom-bottom3tone2 = Lamia Tail Middle
+marking-LamiaBottom-bottom3tone3 = Lamia Tail Top
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
index 38601f21b54..0ac8d2231cc 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
@@ -106,14 +106,19 @@
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]
+ - map: [ "enum.HumanoidVisualLayers.Face" ]
+ - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
- map: [ "enum.HumanoidVisualLayers.Hair" ]
- state: bald
- sprite: Mobs/Customization/human_hair.rsi
+ - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
- map: [ "mask" ]
- map: [ "head" ]
- map: [ "pocket1" ]
- map: [ "pocket2" ]
- - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
+ - map: [ "clownedon" ] # Dynamically generated
+ sprite: "Effects/creampie.rsi"
+ state: "creampie_human"
+ visible: false
- type: Damageable
damageContainer: Biological
damageModifierSet: Scale #TODO: make a new damage modifier set
@@ -273,14 +278,15 @@
- map: [ "belt" ]
- map: [ "neck" ]
- map: [ "back" ]
+ - map: [ "enum.HumanoidVisualLayers.Face" ]
+ - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
- map: [ "enum.HumanoidVisualLayers.Hair" ]
- state: bald
- sprite: Mobs/Customization/human_hair.rsi
+ - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
+ - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
- map: [ "mask" ]
- map: [ "head" ]
- map: [ "pocket1" ]
- map: [ "pocket2" ]
- - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
- map: [ "enum.HumanoidVisualLayers.Tail" ]
- type: Inventory
templateId: lamia
diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml
index 1f7da8306d2..2e58a1681c2 100644
--- a/Resources/Prototypes/DeltaV/Species/lamia.yml
+++ b/Resources/Prototypes/DeltaV/Species/lamia.yml
@@ -10,8 +10,6 @@
maleFirstNames: names_cyno_male
femaleFirstNames: names_cyno_female
lastNames: names_cyno_last
- sexes:
- - Female
- type: markingPoints
id: MobLamiaMarkingLimits
@@ -19,17 +17,49 @@
Hair:
points: 1
required: false
+ FacialHair:
+ points: 1
+ required: false
+ Snout:
+ points: 1
+ required: false
+ HeadTop:
+ points: 2
+ required: false
+ HeadSide:
+ points: 3
+ required: false
Tail:
points: 1
required: true
defaultMarkings: [ LamiaBottom ]
+ Chest:
+ points: 1
+ 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: MobLamiaSprites
sprites:
Head: MobHumanHead
+ Face: MobHumanoidAnyMarking
+ HeadTop: MobHumanoidAnyMarking
+ HeadSide: MobHumanoidAnyMarking
Hair: MobHumanoidAnyMarking
+ FacialHair: MobHumanoidAnyMarking
+ Snout: MobHumanoidAnyMarking
Chest: MobHumanTorso
Eyes: MobHumanoidEyes
LArm: MobHumanLArm
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/earrings.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/earrings.yml
index cf98e96cff8..77b0ba3d0e9 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/earrings.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/earrings.yml
@@ -2,7 +2,7 @@
id: EarringsStudLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -16,7 +16,7 @@
id: EarringsStudRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -30,7 +30,7 @@
id: EarringsHeavyLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -44,7 +44,7 @@
id: EarringsHeavyRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -58,7 +58,7 @@
id: EarringsDropBasicLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -72,7 +72,7 @@
id: EarringsDropBasicRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -86,7 +86,7 @@
id: EarringsDropColoredLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -102,7 +102,7 @@
id: EarringsDropColoredRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -118,7 +118,7 @@
id: EarringsDropLongLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -134,7 +134,7 @@
id: EarringsDropLongRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -150,7 +150,7 @@
id: EarringsCrescentLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -164,7 +164,7 @@
id: EarringsCrescentRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -178,7 +178,7 @@
id: EarringsBangleLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -192,7 +192,7 @@
id: EarringsBangleRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -206,7 +206,7 @@
id: EarringsHoopBasicLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -220,7 +220,7 @@
id: EarringsHoopBasicRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -234,7 +234,7 @@
id: EarringsHoopMiniLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -248,7 +248,7 @@
id: EarringsHoopMiniRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -262,7 +262,7 @@
id: EarringsCrossBasicLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -276,7 +276,7 @@
id: EarringsCrossBasicRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -290,7 +290,7 @@
id: EarringsCrossSaintPeterLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -304,7 +304,7 @@
id: EarringsCrossSaintPeterRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -318,7 +318,7 @@
id: EarringsGemstoneBasicLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -334,7 +334,7 @@
id: EarringsGemstoneBasicRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -350,7 +350,7 @@
id: EarringsGemstoneLongLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -366,7 +366,7 @@
id: EarringsGemstoneLongRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -382,7 +382,7 @@
id: EarringsGemstoneDoubleLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -400,7 +400,7 @@
id: EarringsGemstoneDoubleRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -418,7 +418,7 @@
id: EarringsDangleBasicLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -434,7 +434,7 @@
id: EarringsDangleBasicRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -450,7 +450,7 @@
id: EarringsDangleLongLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -466,7 +466,7 @@
id: EarringsDangleLongRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -482,7 +482,7 @@
id: EarringsEightLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -496,7 +496,7 @@
id: EarringsEightRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -510,7 +510,7 @@
id: EarringsCrystalBasicLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -526,7 +526,7 @@
id: EarringsCrystalBasicRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -542,7 +542,7 @@
id: EarringsCrystalLongLeft
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -558,7 +558,7 @@
id: EarringsCrystalLongRight
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Arachnid, Reptilian, Diona, Oni, Felinid, Vulpkanin, Harpy, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml
index 2276c0a2378..eb1723eb23e 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/face.yml
@@ -2,7 +2,7 @@
id: FaceBindi
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -16,7 +16,7 @@
id: FaceFullblush
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -30,7 +30,7 @@
id: FaceCheekspotRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -44,7 +44,7 @@
id: FaceCheekspotLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -58,7 +58,7 @@
id: FaceChesireRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -72,7 +72,7 @@
id: FaceChesireLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -86,7 +86,7 @@
id: FaceCrowRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -100,7 +100,7 @@
id: FaceCrowLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -114,7 +114,7 @@
id: FaceEarRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -128,7 +128,7 @@
id: FaceEarLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -142,7 +142,7 @@
id: FaceEyebrowRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -157,7 +157,7 @@
id: FaceEyebrowLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -172,7 +172,7 @@
id: FaceEyebrows
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -186,7 +186,7 @@
id: FaceEyecornerRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -200,7 +200,7 @@
id: FaceEyecornerLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -214,7 +214,7 @@
id: FaceEyelashRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -228,7 +228,7 @@
id: FaceEyelashLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -242,7 +242,7 @@
id: FaceEyestripe
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -256,7 +256,7 @@
id: FaceLipcornerRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -270,7 +270,7 @@
id: FaceLipcornerLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -284,7 +284,7 @@
id: FaceGlabella
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -298,7 +298,7 @@
id: FaceLowercheekRight
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -312,7 +312,7 @@
id: FaceLowercheekLeft
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -326,7 +326,7 @@
id: FaceNosetape
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -340,7 +340,7 @@
id: FaceNosetip
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -355,7 +355,7 @@
id: FaceNosestripe
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia]
coloring:
default:
type:
@@ -369,7 +369,7 @@
id: FaceUnibrow
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
coloring:
default:
type:
@@ -383,7 +383,7 @@
id: FaceNeckSlim
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
followSkinColor: true
sprites:
- sprite: Mobs/Customization/face.rsi
@@ -393,7 +393,7 @@
id: FaceNeckWide
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
followSkinColor: true
sprites:
- sprite: Mobs/Customization/face.rsi
@@ -403,7 +403,7 @@
id: FaceNeckSlimThick
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
followSkinColor: true
sprites:
- sprite: Mobs/Customization/face.rsi
@@ -413,7 +413,7 @@
id: FaceNeckWideThick
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne]
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Reptilian, Vulpkanin, Arachne, Lamia]
followSkinColor: true
sprites:
- sprite: Mobs/Customization/face.rsi
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml
index 6e8f7dc8194..c304e9c5314 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] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -16,7 +16,7 @@
id: GauzeLefteyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -30,7 +30,7 @@
id: GauzeRighteyePatch
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -44,7 +44,7 @@
id: GauzeRighteyePad
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -58,7 +58,7 @@
id: GauzeBlindfold
bodyPart: Eyes
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Harpy, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Harpy, Vulpkanin
coloring:
default:
type:
@@ -72,7 +72,7 @@
id: GauzeShoulder
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -86,7 +86,7 @@
id: GauzeStomach
bodyPart: Chest
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -100,7 +100,7 @@
id: GauzeUpperArmRight
bodyPart: RArm
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -114,7 +114,7 @@
id: GauzeLowerArmRight
bodyPart: RArm, RHand
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -198,7 +198,7 @@
id: GauzeBoxerWrapRight
bodyPart: RHand
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -212,7 +212,7 @@
id: GauzeBoxerWrapLeft
bodyPart: LHand
markingCategory: Overlay
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml
index a6ea6a6a422..1319e4f539e 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml
@@ -4,7 +4,7 @@
markingCategory: Snout
followSkinColor: true
forcedColoring: true
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/human_noses.rsi
state: schnozz
@@ -15,7 +15,7 @@
markingCategory: Snout
followSkinColor: true
forcedColoring: true
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/human_noses.rsi
state: nubby
@@ -26,7 +26,7 @@
markingCategory: Snout
followSkinColor: true
forcedColoring: true
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/human_noses.rsi
state: droop
@@ -37,7 +37,7 @@
markingCategory: Snout
followSkinColor: true
forcedColoring: true
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/human_noses.rsi
state: blob
@@ -48,7 +48,7 @@
markingCategory: Snout
followSkinColor: true
forcedColoring: true
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/human_noses.rsi
state: uppie
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml
index 9ec2022b057..5fcb95b1d16 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml
@@ -2,7 +2,7 @@
id: MakeupLips
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne] # Delta V - Felinid, Oni, Harpy
+ speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne, Lamia] # Delta V - Felinid, Oni, Harpy
coloring:
default:
type:
@@ -16,7 +16,7 @@
id: MakeupBlush
bodyPart: Face
markingCategory: Face
- speciesRestriction: [Dwarf, Human, Reptilian, SlimePerson, Felinid, Oni, Vulpkanin, Harpy, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Harpy
+ speciesRestriction: [Dwarf, Human, Reptilian, SlimePerson, Felinid, Oni, Vulpkanin, Harpy, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin, Harpy
coloring:
default:
type:
@@ -30,7 +30,7 @@
id: MakeupNailPolishRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
@@ -44,7 +44,7 @@
id: MakeupNailPolishLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne] # Delta V - Felinid, Oni, Vulpkanin
+ speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Arachne, Lamia] # Delta V - Felinid, Oni, Vulpkanin
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml
index 237275e4193..53a0beac3f4 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/pointy_ears.yml
@@ -3,7 +3,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_standard
@@ -13,7 +13,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_wide
@@ -23,7 +23,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_small
@@ -33,7 +33,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_upwards
@@ -43,7 +43,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_tall
@@ -53,7 +53,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_slanted
@@ -63,7 +63,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_thin
@@ -73,7 +73,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_large
@@ -83,7 +83,7 @@
bodyPart: HeadSide
markingCategory: HeadSide
forcedColoring: true
- speciesRestriction: [Oni, Harpy, Arachne]
+ speciesRestriction: [Oni, Harpy, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/pointy_ears.rsi
state: pointy_ears_none
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml
index 7be52c11f0a..0ba3ecc695b 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml
@@ -67,7 +67,7 @@
id: LizardFrillsNeckfull
bodyPart: HeadSide
markingCategory: HeadSide
- speciesRestriction: [Reptilian]
+ speciesRestriction: [Reptilian, Lamia]
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: frills_neckfull
@@ -76,7 +76,7 @@
id: LizardHornsAngler
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_angler
@@ -85,7 +85,7 @@
id: LizardHornsCurled
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_curled
@@ -94,7 +94,7 @@
id: LizardHornsRam
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_ram
@@ -103,7 +103,7 @@
id: LizardHornsShort
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_short
@@ -112,7 +112,7 @@
id: LizardHornsSimple
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_simple
@@ -121,7 +121,7 @@
id: LizardHornsDouble
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_double
@@ -208,7 +208,7 @@
id: LizardChestTiger
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Reptilian, Shadowkin]
+ speciesRestriction: [Reptilian, Shadowkin, Lamia]
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: body_tiger
@@ -226,7 +226,7 @@
id: LizardLArmTiger
bodyPart: LArm
markingCategory: LeftArm
- speciesRestriction: [Reptilian]
+ speciesRestriction: [Reptilian, Lamia]
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: l_arm_tiger
@@ -244,7 +244,7 @@
id: LizardRArmTiger
bodyPart: RArm
markingCategory: RightArm
- speciesRestriction: [Reptilian]
+ speciesRestriction: [Reptilian, Lamia]
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: r_arm_tiger
@@ -262,7 +262,7 @@
id: LizardHornsArgali
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_argali
@@ -271,7 +271,7 @@
id: LizardHornsAyrshire
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_ayrshire
@@ -280,7 +280,7 @@
id: LizardHornsMyrsore
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_myrsore
@@ -289,7 +289,7 @@
id: LizardHornsBighorn
bodyPart: HeadTop
markingCategory: HeadTop
- speciesRestriction: [Reptilian, Human, Kobold] # Shitmed Change
+ speciesRestriction: [Reptilian, Human, Lamia, Kobold] # Shitmed Change
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: horns_bighorn
@@ -325,7 +325,7 @@
id: LizardChestBackspikes
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Reptilian]
+ speciesRestriction: [Reptilian, Lamia]
sprites:
- sprite: Mobs/Customization/reptilian_parts.rsi
state: body_backspikes
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml
index c9050975aa3..150c6278d00 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] # Delta V - Felinid, Oni, Harpy
+ speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Arachne, Lamia] # Delta V - Felinid, Oni, Harpy
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] # Delta V - Felinid, Oni, Harpy
+ speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Arachne, Lamia] # Delta V - Felinid, Oni, Harpy
followSkinColor: true
sprites:
- sprite: Mobs/Customization/scars.rsi
@@ -22,7 +22,7 @@
id: ScarTopSurgeryShort
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia]
sexRestriction: [Male]
followSkinColor: true
sprites:
@@ -33,7 +33,7 @@
id: ScarTopSurgeryLong
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia]
sexRestriction: [Male]
followSkinColor: true
sprites:
@@ -44,7 +44,7 @@
id: ScarChest
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne]
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne, Lamia]
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 8b659885669..5aaf5d4870f 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml
@@ -2,7 +2,7 @@
id: TattooHiveChest
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne] # Delta V - Felinid, Oni
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne, Lamia] # Delta V - Felinid, Oni
coloring:
default:
type:
@@ -16,7 +16,7 @@
id: TattooNightlingChest
bodyPart: Chest
markingCategory: Chest
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne] # Delta V - Felinid, Oni
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne, Lamia] # Delta V - Felinid, Oni
coloring:
default:
type:
@@ -58,7 +58,7 @@
id: TattooCampbellLeftArm
bodyPart: LArm
markingCategory: LeftArm
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne] # Delta V - Felinid, Oni
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne, Lamia] # Delta V - Felinid, Oni
coloring:
default:
type:
@@ -72,7 +72,7 @@
id: TattooCampbellRightArm
bodyPart: RArm
markingCategory: RightArm
- speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne] # Delta V - Felinid, Oni
+ speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin, Arachne, Lamia] # Delta V - Felinid, Oni
coloring:
default:
type:
@@ -114,7 +114,7 @@
id: TattooEyeRight
bodyPart: Eyes
markingCategory: Head
- speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy
+ speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Lamia] # Delta V - Felinid, Oni, Harpy
coloring:
default:
type:
@@ -128,7 +128,7 @@
id: TattooEyeLeft
bodyPart: Eyes
markingCategory: Head
- speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy
+ speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni, Harpy, Lamia] # Delta V - Felinid, Oni, Harpy
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/wrist.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/wrist.yml
index 0e2f9be912a..01bd1cf85a0 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/wrist.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/wrist.yml
@@ -2,7 +2,7 @@
id: WristBraceletRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -17,7 +17,7 @@
id: WristBraceletLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -31,7 +31,7 @@
id: WristBraceletArmRight
bodyPart: RArm
markingCategory: RightArm
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -45,7 +45,7 @@
id: WristBraceletArmLeft
bodyPart: LArm
markingCategory: LeftArm
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -59,7 +59,7 @@
id: WristWatchRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -73,7 +73,7 @@
id: WristWatchLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -87,7 +87,7 @@
id: WristWatchSilverRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -101,7 +101,7 @@
id: WristWatchSilverLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -115,7 +115,7 @@
id: WristWatchGoldRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -129,7 +129,7 @@
id: WristWatchGoldLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -143,7 +143,7 @@
id: WristWatchHoloRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -157,7 +157,7 @@
id: WristWatchHoloLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -171,7 +171,7 @@
id: WristWatchLeatherRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -185,7 +185,7 @@
id: WristWatchLeatherLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -199,7 +199,7 @@
id: WristWatchColorableRight
bodyPart: RHand
markingCategory: RightHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Diona, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
@@ -215,7 +215,7 @@
id: WristWatchColorableLeft
bodyPart: LHand
markingCategory: LeftHand
- speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne]
+ speciesRestriction: [Human, Dwarf, SlimePerson, Arachnid, Reptilian, Felinid, Oni, Vulpkanin, Gingerbread, Arachne, Lamia]
coloring:
default:
type:
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml
index 2ae4bc6d62f..b491d9b9188 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]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
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]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: l_hand
@@ -87,7 +87,7 @@
id: CyberLimbsMarkingBishopRArm
bodyPart: RArm
markingCategory: RightArm
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
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]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi
state: r_hand
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml
index d6e2194bf36..e9079751166 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]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
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]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: l_hand-1
@@ -84,7 +84,7 @@
id: CyberLimbsMarkingHesphiastosRArm
bodyPart: RArm
markingCategory: RightArm
- speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
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]
+ speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian, Arachne, Lamia]
sprites:
- sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi
state: r_hand-1
From 138048d002fbd8fc8c0eac65c6210954c38cf881 Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:10:04 +0000
Subject: [PATCH 05/22] Automatic Changelog Update (#1440)
---
Resources/Changelog/Changelog.yml | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 707e36d75f7..e3fdfd6611e 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9159,3 +9159,19 @@ Entries:
id: 6629
time: '2025-01-05T16:01:33.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1427
+- author: Skubman
+ changes:
+ - type: Add
+ message: >-
+ Lamiae can now be male, no longer being a female-only species. They can
+ now wear facial hair as well.
+ - type: Add
+ message: >-
+ The Lamia species can now select markings above the leg, including
+ cybernetics, makeup, tattoos, noses, earrings, heterochromia, bracelets,
+ reptilian horns and frills, pointy ears, and more!
+ - type: Fix
+ message: Added text for the Lamia tail marking.
+ id: 6630
+ time: '2025-01-05T18:09:37.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1440
From 6c70875882cb9435a6172ef103660e0fcf1d27fd Mon Sep 17 00:00:00 2001
From: Skubman
Date: Mon, 6 Jan 2025 02:10:29 +0800
Subject: [PATCH 06/22] Throwing Mini-Update 1 (#1434)
# Description
Bug fixes:
- Re-enable damage examine for embeddable passive damage after the
Wizmerge for Station AI wiped it
(https://github.com/Simple-Station/Einstein-Engines/pull/1351)
- Fixed a bug where emags did not have embed passive damage (due to
`DamageOtherOnHitStartupEvent` only raising when `MeleeWeaponComponent`
exists on the entity)
Tweaks:
- Added a stamina cost to spears, 6 stamina, and removed spears dealing
damage to itself when thrown
- Floor tiles will now break when thrown 10 times instead of 4 times
- Added the MetalThud sound effect for structures when thrown, and
increased the base thrown damage of structures slightly from 8 to 9
Damage examine is now sorted properly. From top to bottom:
- Gun damage
- Melee weapon damage
- Throwing weapon damage
- Embed passive damage
## Media
**Laser rifle sorted damage examine**
![image](https://github.com/user-attachments/assets/6fe2a47b-b354-415a-8835-8f0e33c6da00)
**Spear sorted damage examine**
![image](https://github.com/user-attachments/assets/0c93c125-08ce-4e5b-9af9-5c5ceddcd3b1)
**Emag stats**
![image](https://github.com/user-attachments/assets/ac9b1073-b209-4a44-badf-8f8ec9f8514a)
## Changelog
:cl: Skubman
- fix: Fixed embeddable damage over time not showing when examining an
item's damage values.
- fix: Fixed the emag not dealing passive damage when embedded on a
target.
- tweak: Examining an item's damage values now shows values in a sorted
order. From top to bottom: gun damage, melee damage, throwing damage,
embedded damage.
- tweak: Spears now have a 6 stamina cost when thrown, and they no
longer break when thrown enough times.
- tweak: Floor tiles now break when thrown 10 times instead of 4 times.
- tweak: Closets, lockers and crates now play the proper sound effect
when thrown (by Space Wind).
---
.../Damage/Systems/DamageOtherOnHitSystem.cs | 3 ++-
.../Projectiles/ProjectileSystem.cs | 21 ++++++++++++++++
.../Weapons/Melee/MeleeWeaponSystem.cs | 3 ++-
.../Systems/SharedDamageOtherOnHitSystem.cs | 24 +++++++++----------
.../Entities/Objects/Misc/tiles.yml | 2 +-
.../Entities/Objects/Weapons/Melee/spear.yml | 5 +---
.../Entities/Structures/base_structure.yml | 4 +++-
7 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs
index 2ffd66fe068..248562a44fc 100644
--- a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs
+++ b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs
@@ -11,6 +11,7 @@
using Content.Shared.Popups;
using Content.Shared.Throwing;
using Content.Shared.Weapons.Melee;
+using Content.Server.Weapons.Melee;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Physics.Components;
@@ -31,7 +32,7 @@ public override void Initialize()
base.Initialize();
SubscribeLocalEvent(OnBeforeThrow);
- SubscribeLocalEvent(OnDamageExamine);
+ SubscribeLocalEvent(OnDamageExamine, after: [typeof(MeleeWeaponSystem)]);
}
private void OnBeforeThrow(EntityUid uid, StaminaComponent component, ref BeforeThrowEvent args)
diff --git a/Content.Server/Projectiles/ProjectileSystem.cs b/Content.Server/Projectiles/ProjectileSystem.cs
index 436221103d2..28dbc32e05d 100644
--- a/Content.Server/Projectiles/ProjectileSystem.cs
+++ b/Content.Server/Projectiles/ProjectileSystem.cs
@@ -1,12 +1,15 @@
using Content.Server.Administration.Logs;
+using Content.Server.Damage.Systems;
using Content.Server.Effects;
using Content.Server.Weapons.Ranged.Systems;
using Content.Shared.Camera;
using Content.Shared.Damage;
+using Content.Shared.Damage.Events;
using Content.Shared.Database;
using Content.Shared.Projectiles;
using Robust.Shared.Physics.Events;
using Robust.Shared.Player;
+using Robust.Shared.Utility;
namespace Content.Server.Projectiles;
@@ -22,6 +25,7 @@ public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnStartCollide);
+ SubscribeLocalEvent(OnDamageExamine, after: [typeof(DamageOtherOnHitSystem)]);
}
private void OnStartCollide(EntityUid uid, ProjectileComponent component, ref StartCollideEvent args)
@@ -75,4 +79,21 @@ private void OnStartCollide(EntityUid uid, ProjectileComponent component, ref St
if (component.ImpactEffect != null && TryComp(uid, out TransformComponent? xform))
RaiseNetworkEvent(new ImpactEffectEvent(component.ImpactEffect, GetNetCoordinates(xform.Coordinates)), Filter.Pvs(xform.Coordinates, entityMan: EntityManager));
}
+
+ private void OnDamageExamine(EntityUid uid, EmbeddableProjectileComponent component, ref DamageExamineEvent args)
+ {
+ if (!component.EmbedOnThrow)
+ return;
+
+ if (!args.Message.IsEmpty)
+ args.Message.PushNewline();
+
+ var isHarmful = TryComp(uid, out var passiveDamage) && passiveDamage.Damage.AnyPositive();
+ var loc = isHarmful
+ ? "damage-examine-embeddable-harmful"
+ : "damage-examine-embeddable";
+
+ var staminaCostMarkup = FormattedMessage.FromMarkupOrThrow(Loc.GetString(loc));
+ args.Message.AddMessage(staminaCostMarkup);
+ }
}
diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs
index 26f0c20608e..3ed47945082 100644
--- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs
+++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs
@@ -1,6 +1,7 @@
using Content.Server.Chat.Systems;
using Content.Server.CombatMode.Disarm;
using Content.Server.Movement.Systems;
+using Content.Server.Weapons.Ranged.Systems;
using Content.Shared.Actions.Events;
using Content.Shared.Administration.Components;
using Content.Shared.CombatMode;
@@ -44,7 +45,7 @@ public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnSpeechHit);
- SubscribeLocalEvent(OnMeleeExamineDamage);
+ SubscribeLocalEvent(OnMeleeExamineDamage, after: [typeof(GunSystem)]);
}
private void OnMeleeExamineDamage(EntityUid uid, MeleeWeaponComponent component, ref DamageExamineEvent args)
diff --git a/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs b/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs
index 8b3d29d7349..1ea4c3ef0cf 100644
--- a/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs
+++ b/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs
@@ -49,19 +49,19 @@ public override void Initialize()
///
private void OnMapInit(EntityUid uid, DamageOtherOnHitComponent component, MapInitEvent args)
{
- if (!TryComp(uid, out var melee))
- return;
-
- if (component.Damage.Empty)
- component.Damage = melee.Damage * component.MeleeDamageMultiplier;
- if (component.SoundHit == null)
- component.SoundHit = melee.SoundHit;
- if (component.SoundNoDamage == null)
+ if (TryComp(uid, out var melee))
{
- if (melee.SoundNoDamage != null)
- component.SoundNoDamage = melee.SoundNoDamage;
- else
- component.SoundNoDamage = new SoundCollectionSpecifier("WeakHit");
+ if (component.Damage.Empty)
+ component.Damage = melee.Damage * component.MeleeDamageMultiplier;
+ if (component.SoundHit == null)
+ component.SoundHit = melee.SoundHit;
+ if (component.SoundNoDamage == null)
+ {
+ if (melee.SoundNoDamage != null)
+ component.SoundNoDamage = melee.SoundNoDamage;
+ else
+ component.SoundNoDamage = new SoundCollectionSpecifier("WeakHit");
+ }
}
RaiseLocalEvent(uid, new DamageOtherOnHitStartupEvent((uid, component)));
diff --git a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
index 3d3675dd33d..1eff8f9fc91 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml
@@ -45,7 +45,7 @@
- type: DamageOnLand
damage:
types:
- Blunt: 5
+ Blunt: 2
- type: entity
name: steel tile
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml
index dcfd1537c79..6321e5a0007 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml
@@ -55,6 +55,7 @@
damage:
types:
Piercing: 10
+ staminaCost: 6
- type: Item
size: Ginormous
- type: Clothing
@@ -112,10 +113,6 @@
max: 1
- !type:DoActsBehavior
acts: [ "Destruction" ]
- - type: DamageOnLand
- damage:
- types:
- Blunt: 5
- type: UseDelay
- type: Appearance
- type: SolutionContainerVisuals
diff --git a/Resources/Prototypes/Entities/Structures/base_structure.yml b/Resources/Prototypes/Entities/Structures/base_structure.yml
index 207881894b8..d143151deb4 100644
--- a/Resources/Prototypes/Entities/Structures/base_structure.yml
+++ b/Resources/Prototypes/Entities/Structures/base_structure.yml
@@ -28,8 +28,10 @@
- type: DamageOtherOnHit
damage:
types:
- Blunt: 8
+ Blunt: 9
staminaCost: 50
+ soundHit:
+ collection: MetalThud
- type: entity
# This means that it's not anchored on spawn.
From 5cb3d42aee9d4e36744eb10531f349723733d378 Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:11:04 +0000
Subject: [PATCH 07/22] Automatic Changelog Update (#1434)
---
Resources/Changelog/Changelog.yml | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index e3fdfd6611e..0f59a2f5f33 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9175,3 +9175,29 @@ Entries:
id: 6630
time: '2025-01-05T18:09:37.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1440
+- author: Skubman
+ changes:
+ - type: Fix
+ message: >-
+ Fixed embeddable damage over time not showing when examining an item's
+ damage values.
+ - type: Fix
+ message: 'Fixed the emag not dealing passive damage when embedded on a target. '
+ - type: Tweak
+ message: >-
+ Examining an item's damage values now shows values in a sorted order.
+ From top to bottom: gun damage, melee damage, throwing damage, embedded
+ damage.
+ - type: Tweak
+ message: >-
+ Spears now have a 6 stamina cost when thrown, and they no longer break
+ when thrown enough times.
+ - type: Tweak
+ message: Floor tiles now break when thrown 10 times instead of 4 times.
+ - type: Tweak
+ message: >-
+ Closets, lockers and crates now play the proper sound effect when thrown
+ (by Space Wind).
+ id: 6631
+ time: '2025-01-05T18:10:29.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1434
From 68a11dbd5928b3ca3672198c91165755b05b37cc Mon Sep 17 00:00:00 2001
From: Skubman
Date: Mon, 6 Jan 2025 02:24:29 +0800
Subject: [PATCH 08/22] New Traits: Steadfast And Feeble (#1431)
# Description
Adds two new traits, Steadfast and Feeble that modify how affected a
character is by injury slows.
Steadfast (-4 points)
- 25% slow at 60 damage -> 17% slow at 70 damage
- 45% slow at 80 damage -> 30% slow at 90 damage
Feeble (4 points)
- 25% slow at 60 damage -> 30% slow at 45 damage
- 45% slow at 80 damage -> 54% slow at 65 damage
Also *half-reverts* the reduction of injury slows from a Delta-V PR by
ODJ (https://github.com/DeltaV-Station/Delta-v/pull/741) from 30%/50% to
20%/40%, now 25%/45% to incentivize taking Steadfast.
The injury slow resists for jackboot and combat boots has been nerfed
from 50% to 20% to account for Steadfast.
IPCs' injury slow at 60 damage has been decreased from 30% to 25% to be
more consistent with other species.
## Technical details
No trait with jackboots:
- 25% slow -> 20% slow
- 45% slow -> 36% slow
Steadfast with jackboots:
- 17% slow -> 13.6% slow
- 30% slow -> 24.5% slow
Feeble with jackboots:
- 30% slow -> 24% slow
- 54% slow -> 43.2% slow
Although Feeble with jackboots has lower slow values than the base
slows, the slow damage thresholds (-15) are still lower, making the
slows occur with less damage.
## Media
**Steadfast**
![image](https://github.com/user-attachments/assets/8b804040-7f0f-4a49-b0cf-1a83efd4c790)
**Feeble**
![image](https://github.com/user-attachments/assets/a1759f49-f68c-4cc4-991b-b6864e67e016)
**Jackboots**
![image](https://github.com/user-attachments/assets/67132fd0-5a97-43f1-a714-a9deae26f825)
# Changelog
:cl: Skubman
- add: Added two new traits: Steadfast and Feeble that decrease or
increase the effect of slows from injuries.
- tweak: Injury slows for most species has been slightly increased, but
this can be mitigated with the Steadfast trait.
- tweak: The jackboots' injury slow resistance has been decreased from
50% to 20%.
- tweak: Combat boots now add resistance to injury slows like jackboots.
---------
Signed-off-by: Skubman
Co-authored-by: VMSolidus
---
.../Traits/TraitSystem.Functions.cs | 38 +++++++++++++++
.../Damage/Systems/SlowOnDamageSystem.cs | 8 +---
Resources/Locale/en-US/damage/stamina.ftl | 2 +-
Resources/Locale/en-US/traits/traits.ftl | 14 ++++++
.../Entities/Clothing/Shoes/boots.yml | 6 ++-
.../Entities/Clothing/Shoes/specific.yml | 2 +-
.../Prototypes/Entities/Mobs/Player/ipc.yml | 4 +-
.../Prototypes/Entities/Mobs/Species/base.yml | 4 +-
Resources/Prototypes/Traits/physical.yml | 46 +++++++++++++++++++
9 files changed, 111 insertions(+), 13 deletions(-)
diff --git a/Content.Server/Traits/TraitSystem.Functions.cs b/Content.Server/Traits/TraitSystem.Functions.cs
index 8e53ff69a55..29ab1512ae6 100644
--- a/Content.Server/Traits/TraitSystem.Functions.cs
+++ b/Content.Server/Traits/TraitSystem.Functions.cs
@@ -1,3 +1,4 @@
+using Content.Shared.FixedPoint;
using Content.Shared.Traits;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
@@ -11,6 +12,7 @@
using Content.Shared.Mood;
using Content.Shared.Traits.Assorted.Components;
using Content.Shared.Damage;
+using Content.Shared.Damage.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Mobs.Components;
@@ -547,3 +549,39 @@ public override void OnPlayerSpawn(EntityUid uid,
staminaComponent.Cooldown += CooldownModifier;
}
}
+
+///
+/// Used for traits that modify SlowOnDamageComponent.
+///
+[UsedImplicitly]
+public sealed partial class TraitModifySlowOnDamage : TraitFunction
+{
+ //
+ // A flat modifier to add to all damage threshold keys.
+ //
+ [DataField, AlwaysPushInheritance]
+ public float DamageThresholdsModifier;
+
+ //
+ // A multiplier applied to all speed modifier values.
+ // The higher the multiplier, the stronger the slowdown.
+ //
+ [DataField, AlwaysPushInheritance]
+ public float SpeedModifierMultiplier = 1f;
+
+ public override void OnPlayerSpawn(EntityUid uid,
+ IComponentFactory factory,
+ IEntityManager entityManager,
+ ISerializationManager serializationManager)
+ {
+ if (!entityManager.TryGetComponent(uid, out var slowOnDamage))
+ return;
+
+ var newSpeedModifierThresholds = new Dictionary();
+
+ foreach (var (damageThreshold, speedModifier) in slowOnDamage.SpeedModifierThresholds)
+ newSpeedModifierThresholds[damageThreshold + DamageThresholdsModifier] = 1 - (1 - speedModifier) * SpeedModifierMultiplier;
+
+ slowOnDamage.SpeedModifierThresholds = newSpeedModifierThresholds;
+ }
+}
diff --git a/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs b/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs
index 3e50ee35572..78650ec5cfb 100644
--- a/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs
+++ b/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs
@@ -61,17 +61,13 @@ private void OnDamageChanged(EntityUid uid, SlowOnDamageComponent component, Dam
private void OnModifySpeed(Entity ent, ref InventoryRelayedEvent args)
{
- var dif = 1 - args.Args.Speed;
- if (dif <= 0)
- return;
-
// reduces the slowness modifier by the given coefficient
- args.Args.Speed += dif * ent.Comp.Modifier;
+ args.Args.Speed = 1 - (1 - args.Args.Speed) * ent.Comp.Modifier;
}
private void OnExamined(Entity ent, ref ExaminedEvent args)
{
- var msg = Loc.GetString("slow-on-damage-modifier-examine", ("mod", (1 - ent.Comp.Modifier) * 100));
+ var msg = Loc.GetString("slow-on-damage-modifier-examine", ("mod", Math.Round((1 - ent.Comp.Modifier) * 100)));
args.PushMarkup(msg);
}
diff --git a/Resources/Locale/en-US/damage/stamina.ftl b/Resources/Locale/en-US/damage/stamina.ftl
index 09f9164497a..777101f93e4 100644
--- a/Resources/Locale/en-US/damage/stamina.ftl
+++ b/Resources/Locale/en-US/damage/stamina.ftl
@@ -1,5 +1,5 @@
melee-stamina = Not enough stamina
-slow-on-damage-modifier-examine = Slowness from injuries is reduced by [color=yellow]{$mod}%[/color]
+slow-on-damage-modifier-examine = Slowness from injuries is reduced by [color=yellow]{$mod}%[/color].
throw-no-stamina = You don't have enough stamina to throw the {$item}!
diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl
index 25188ca851b..d3b5f1eef3a 100644
--- a/Resources/Locale/en-US/traits/traits.ftl
+++ b/Resources/Locale/en-US/traits/traits.ftl
@@ -163,6 +163,20 @@ trait-description-LowPainTolerance =
Your tolerance for pain is far below average, and its effects are more inhibiting.
Your melee/throwing damage is penalized by up to an additional 15% when taking stamina damage.
+trait-name-Steadfast = Steadfast
+trait-description-Steadfast =
+ When others would buckle from the weight of your injuries, you still march forward unrelentingly.
+ For most species [color=gray](excluding IPC/Shadowkin)[/color], this trait modifies:
+ - [color=yellow]25%[/color] movement slow at [color=red]60[/color] damage âž” [color=yellow]17%[/color] movement slow at [color=red]70[/color] damage
+ - [color=yellow]45%[/color] movement slow at [color=red]80[/color] damage âž” [color=yellow]30%[/color] movement slow at [color=red]90[/color] damage
+
+trait-name-Feeble = Feeble
+trait-description-Feeble =
+ Your body responds poorly to injuries, making damage affect your movement more severely.
+ For most species [color=gray](excluding IPC/Shadowkin)[/color], this trait modifies:
+ - [color=yellow]25%[/color] movement slow at [color=red]60[/color] damage âž” [color=yellow]30%[/color] movement slow at [color=red]45[/color] damage
+ - [color=yellow]45%[/color] movement slow at [color=red]80[/color] damage âž” [color=yellow]54%[/color] movement slow at [color=red]65[/color] damage
+
trait-name-MartialArtist = Martial Artist
trait-description-MartialArtist =
You have received formal training in unarmed combat, whether with Fists, Feet, or Claws.
diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml
index 069555c836a..01576a1f932 100644
--- a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml
+++ b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml
@@ -21,7 +21,7 @@
- type: Clothing
sprite: Clothing/Shoes/Boots/jackboots.rsi
- type: ClothingSlowOnDamageModifier
- modifier: 0.5
+ modifier: 0.8
- type: entity
parent: ClothingShoesMilitaryBase
@@ -67,6 +67,8 @@
sprite: Clothing/Shoes/Boots/combatboots.rsi
- type: Clothing
sprite: Clothing/Shoes/Boots/combatboots.rsi
+ - type: ClothingSlowOnDamageModifier
+ modifier: 0.8
- type: entity
parent: ClothingShoesMilitaryBase
@@ -93,6 +95,8 @@
sprite: Clothing/Shoes/Boots/mercboots.rsi
- type: Clothing
sprite: Clothing/Shoes/Boots/mercboots.rsi
+ - type: ClothingSlowOnDamageModifier
+ modifier: 0.6
- type: entity
parent: ClothingShoesBaseButcherable
diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
index 3ec17e2bbe4..e9ea1239285 100644
--- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
+++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
@@ -137,7 +137,7 @@
- type: Clothing
sprite: Clothing/Shoes/Specific/swat.rsi
- type: ClothingSlowOnDamageModifier
- modifier: 0.5
+ modifier: 0.7
- type: entity
parent: ClothingShoesBaseButcherable
diff --git a/Resources/Prototypes/Entities/Mobs/Player/ipc.yml b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml
index 54c157cc3e0..816f6a6a3c7 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/ipc.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml
@@ -58,7 +58,7 @@
- !type:GibBehavior { }
- type: SlowOnDamage
speedModifierThresholds:
- 60: 0.7
+ 60: 0.75
90: 0.5
120: 0.3
- type: SiliconDownOnDead
@@ -142,4 +142,4 @@
- type: HumanoidAppearance
species: IPC
- type: Inventory
- templateId: ipc
\ No newline at end of file
+ templateId: ipc
diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml
index f740b89f424..a9d96ecde54 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -90,8 +90,8 @@
species: Human
- type: SlowOnDamage
speedModifierThresholds:
- 60: 0.8 # DV - Was 0.7
- 80: 0.6 # DV - Was 0.5
+ 60: 0.75
+ 80: 0.55
- type: Fixtures
fixtures: # TODO: This needs a second fixture just for mob collisions.
fix1:
diff --git a/Resources/Prototypes/Traits/physical.yml b/Resources/Prototypes/Traits/physical.yml
index f2f071a309d..3f3d460f999 100644
--- a/Resources/Prototypes/Traits/physical.yml
+++ b/Resources/Prototypes/Traits/physical.yml
@@ -235,6 +235,52 @@
- type: PainTolerance
rangeModifier: 0.6
+- type: trait
+ id: Steadfast
+ category: Physical
+ points: -4
+ requirements:
+ - !type:CharacterJobRequirement
+ inverted: true
+ jobs:
+ - Borg
+ - MedicalBorg
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Felinid
+ - !type:CharacterTraitRequirement
+ inverted: true
+ traits:
+ - Feeble
+ functions:
+ - !type:TraitModifySlowOnDamage
+ damageThresholdsModifier: 10
+ speedModifierMultiplier: 0.68
+
+- type: trait
+ id: Feeble
+ category: Physical
+ points: 3
+ requirements:
+ - !type:CharacterJobRequirement
+ inverted: true
+ jobs:
+ - Borg
+ - MedicalBorg
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Felinid
+ - !type:CharacterTraitRequirement
+ inverted: true
+ traits:
+ - Steadfast
+ functions:
+ - !type:TraitModifySlowOnDamage
+ damageThresholdsModifier: -15
+ speedModifierMultiplier: 1.2
+
- type: trait
id: MartialArtist
category: Physical
From 136be4e4cc4581548acfb959f5e958a6a4aa75c7 Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:24:54 +0000
Subject: [PATCH 09/22] Automatic Changelog Update (#1431)
---
Resources/Changelog/Changelog.yml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 0f59a2f5f33..a4486ded011 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9201,3 +9201,22 @@ Entries:
id: 6631
time: '2025-01-05T18:10:29.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1434
+- author: Skubman
+ changes:
+ - type: Add
+ message: >-
+ Added two new traits: Steadfast and Feeble that decrease or increase the
+ effect of slows from injuries.
+ - type: Tweak
+ message: >-
+ Injury slows for most species has been slightly increased, but this can
+ be mitigated with the Steadfast trait.
+ - type: Tweak
+ message: >-
+ The jackboots' injury slow resistance has been decreased from 50% to
+ 20%.
+ - type: Tweak
+ message: Combat boots now add resistance to injury slows like jackboots.
+ id: 6632
+ time: '2025-01-05T18:24:29.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1431
From 11678af96950f6af75f7effef40fc92a7af33350 Mon Sep 17 00:00:00 2001
From: VMSolidus
Date: Sun, 5 Jan 2025 12:27:12 -0600
Subject: [PATCH 10/22] Footprints Performance Updates (#1439)
# Description
This is a port of https://github.com/Fansana/floofstation1/pull/445
Except I despise that this wasn't upstreamed so much that I didn't even
cherrypick it.
# Changelog
:cl:
- add: Footprints are now cleaned in a small radius around the mouse
cursor when mopping them.
---
.../AbsorbentSystem.Footprints.cs | 41 +++++++++
.../Fluids/EntitySystems/AbsorbentSystem.cs | 7 +-
Content.Server/FootPrint/FootPrintsSystem.cs | 88 +++++++++++--------
.../FootPrint/PuddleFootPrintsSystem.cs | 48 +++++-----
Content.Shared/Fluids/AbsorbentComponent.cs | 9 ++
.../Footprint/FootPrintsComponent.cs | 61 ++++++-------
.../Footprint/PuddleFootPrintsComponent.cs | 11 ++-
.../Prototypes/Entities/Effects/puddle.yml | 10 +++
.../Objects/Specific/Janitorial/janitor.yml | 4 +
9 files changed, 171 insertions(+), 108 deletions(-)
create mode 100644 Content.Server/Fluids/EntitySystems/AbsorbentSystem.Footprints.cs
diff --git a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.Footprints.cs b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.Footprints.cs
new file mode 100644
index 00000000000..50b5b7a6601
--- /dev/null
+++ b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.Footprints.cs
@@ -0,0 +1,41 @@
+using System.Linq;
+using Content.Shared.Chemistry.Components;
+using Content.Shared.Fluids;
+using Content.Shared.FootPrint;
+
+namespace Content.Server.Fluids.EntitySystems;
+
+public sealed partial class AbsorbentSystem
+{
+ [Dependency] private readonly EntityLookupSystem _lookup = default!;
+
+ ///
+ /// Tries to clean a number of footprints in a range determined by the component. Returns the number of cleaned footprints.
+ ///
+ private int TryCleanNearbyFootprints(EntityUid user, EntityUid used, Entity target, Entity absorbentSoln)
+ {
+ var footprintQuery = GetEntityQuery();
+ var targetCoords = Transform(target).Coordinates;
+ var entities = _lookup.GetEntitiesInRange(targetCoords, target.Comp.FootprintCleaningRange, LookupFlags.Uncontained);
+
+ // Take up to [MaxCleanedFootprints] footprints closest to the target
+ var cleaned = entities.AsEnumerable()
+ .Select(uid => (uid, dst: Transform(uid).Coordinates.TryDistance(EntityManager, _transform, targetCoords, out var dst) ? dst : 0f))
+ .Where(ent => ent.dst > 0f)
+ .OrderBy(ent => ent.dst)
+ .Select(ent => (ent.uid, comp: footprintQuery.GetComponent(ent.uid)));
+
+ // And try to interact with each one of them, ignoring useDelay
+ var processed = 0;
+ foreach (var (uid, footprintComp) in cleaned)
+ {
+ if (TryPuddleInteract(user, used, uid, target.Comp, useDelay: null, absorbentSoln))
+ processed++;
+
+ if (processed >= target.Comp.MaxCleanedFootprints)
+ break;
+ }
+
+ return processed;
+ }
+}
diff --git a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs
index 52afdcf8b49..1f8c44a2409 100644
--- a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs
+++ b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs
@@ -1,5 +1,4 @@
using System.Numerics;
-using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Popups;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.EntitySystems;
@@ -18,7 +17,7 @@
namespace Content.Server.Fluids.EntitySystems;
///
-public sealed class AbsorbentSystem : SharedAbsorbentSystem
+public sealed partial class AbsorbentSystem : SharedAbsorbentSystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly AudioSystem _audio = default!;
@@ -26,7 +25,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
[Dependency] private readonly PuddleSystem _puddleSystem = default!;
[Dependency] private readonly SharedMeleeWeaponSystem _melee = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
- [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
+ [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly UseDelaySystem _useDelay = default!;
[Dependency] private readonly MapSystem _mapSystem = default!;
@@ -119,6 +118,8 @@ public void Mop(EntityUid user, EntityUid target, EntityUid used, AbsorbentCompo
if (!TryRefillableInteract(user, used, target, component, useDelay, absorberSoln.Value))
return;
}
+
+ TryCleanNearbyFootprints(user, used, (target, component), absorberSoln.Value);
}
///
diff --git a/Content.Server/FootPrint/FootPrintsSystem.cs b/Content.Server/FootPrint/FootPrintsSystem.cs
index 0e45acff5cc..524fcd1cec0 100644
--- a/Content.Server/FootPrint/FootPrintsSystem.cs
+++ b/Content.Server/FootPrint/FootPrintsSystem.cs
@@ -1,39 +1,39 @@
+using System.Linq;
using Content.Server.Atmos.Components;
using Content.Shared.Inventory;
-using Content.Shared.Mobs;
-using Content.Shared.Mobs.Components;
using Content.Shared.FootPrint;
using Content.Shared.Standing;
using Content.Shared.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.EntitySystems;
+using Content.Shared.Forensics;
using Robust.Shared.Map;
+using Robust.Shared.Physics.Components;
+using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server.FootPrint;
+
public sealed class FootPrintsSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
- [Dependency] private readonly InventorySystem _inventory = default!;
- [Dependency] private readonly IMapManager _map = default!;
+ [Dependency] private readonly IPrototypeManager _protoMan = default!;
+ [Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solution = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
+ [Dependency] private readonly EntityLookupSystem _lookup = default!;
- private EntityQuery _transformQuery;
- private EntityQuery _mobThresholdQuery;
private EntityQuery _appearanceQuery;
- private EntityQuery _layingQuery;
+ private EntityQuery _standingStateQuery;
public override void Initialize()
{
base.Initialize();
- _transformQuery = GetEntityQuery();
- _mobThresholdQuery = GetEntityQuery();
_appearanceQuery = GetEntityQuery();
- _layingQuery = GetEntityQuery();
+ _standingStateQuery = GetEntityQuery();
SubscribeLocalEvent(OnStartupComponent);
SubscribeLocalEvent(OnMove);
@@ -46,62 +46,72 @@ private void OnStartupComponent(EntityUid uid, FootPrintsComponent component, Co
private void OnMove(EntityUid uid, FootPrintsComponent component, ref MoveEvent args)
{
- if (component.PrintsColor.A <= 0f
- || !_transformQuery.TryComp(uid, out var transform)
- || !_mobThresholdQuery.TryComp(uid, out var mobThreshHolds)
- || !_map.TryFindGridAt(_transform.GetMapCoordinates((uid, transform)), out var gridUid, out _))
+ if (component.ContainedSolution.Volume <= 0
+ || TryComp(uid, out var physics) && physics.BodyStatus != BodyStatus.OnGround
+ || args.Entity.Comp1.GridUid is not {} gridUid)
return;
- var dragging = mobThreshHolds.CurrentThresholdState is MobState.Critical or MobState.Dead
- || _layingQuery.TryComp(uid, out var laying) && laying.IsCrawlingUnder;
- var distance = (transform.LocalPosition - component.StepPos).Length();
+ var newPos = _transform.ToMapCoordinates(args.NewPosition).Position;
+ var dragging = _standingStateQuery.TryComp(uid, out var standing) && standing.CurrentState == StandingState.Lying;
+ var distance = (newPos - component.LastStepPos).Length();
var stepSize = dragging ? component.DragSize : component.StepSize;
- if (!(distance > stepSize))
+ if (distance < stepSize)
return;
- component.RightStep = !component.RightStep;
+ // are we on a puddle? we exit, ideally we would exchange liquid and DNA with the puddle but meh, too lazy to do that now.
+ var entities = _lookup.GetEntitiesIntersecting(uid, LookupFlags.All);
+ if (entities.Any(HasComp))
+ return;
+
+ // Spawn the footprint
+ var footprintUid = Spawn(component.StepProtoId, CalcCoords(gridUid, component, args.Component, dragging));
+ var stepTransform = Transform(footprintUid);
+ var footPrintComponent = EnsureComp(footprintUid);
- var entity = Spawn(component.StepProtoId, CalcCoords(gridUid, component, transform, dragging));
- var footPrintComponent = EnsureComp(entity);
+ // transfer owner DNA into the footsteps
+ var forensics = EntityManager.EnsureComponent(footprintUid);
+ if (TryComp(uid, out var ownerForensics))
+ forensics.DNAs.UnionWith(ownerForensics.DNAs);
footPrintComponent.PrintOwner = uid;
- Dirty(entity, footPrintComponent);
+ Dirty(footprintUid, footPrintComponent);
- if (_appearanceQuery.TryComp(entity, out var appearance))
+ if (_appearanceQuery.TryComp(footprintUid, out var appearance))
{
- _appearance.SetData(entity, FootPrintVisualState.State, PickState(uid, dragging), appearance);
- _appearance.SetData(entity, FootPrintVisualState.Color, component.PrintsColor, appearance);
- }
+ var color = component.ContainedSolution.GetColor(_protoMan);
+ color.A = Math.Max(0.3f, component.ContainedSolution.FillFraction);
- if (!_transformQuery.TryComp(entity, out var stepTransform))
- return;
+ _appearance.SetData(footprintUid, FootPrintVisualState.State, PickState(uid, dragging), appearance);
+ _appearance.SetData(footprintUid, FootPrintVisualState.Color, color, appearance);
+ }
stepTransform.LocalRotation = dragging
- ? (transform.LocalPosition - component.StepPos).ToAngle() + Angle.FromDegrees(-90f)
- : transform.LocalRotation + Angle.FromDegrees(180f);
+ ? (newPos - component.LastStepPos).ToAngle() + Angle.FromDegrees(-90f)
+ : args.Component.LocalRotation + Angle.FromDegrees(180f);
- component.PrintsColor = component.PrintsColor.WithAlpha(Math.Max(0f, component.PrintsColor.A - component.ColorReduceAlpha));
- component.StepPos = transform.LocalPosition;
-
- if (!TryComp(entity, out var solutionContainer)
- || !_solution.ResolveSolution((entity, solutionContainer), footPrintComponent.SolutionName, ref footPrintComponent.Solution, out var solution)
- || string.IsNullOrWhiteSpace(component.ReagentToTransfer) || solution.Volume >= 1)
+ if (!TryComp(footprintUid, out var solutionContainer)
+ || !_solution.ResolveSolution((footprintUid, solutionContainer), footPrintComponent.SolutionName, ref footPrintComponent.Solution, out var solution))
return;
- _solution.TryAddReagent(footPrintComponent.Solution.Value, component.ReagentToTransfer, 1, out _);
+ // Transfer from the component to the footprint
+ var removedReagents = component.ContainedSolution.SplitSolution(component.FootprintVolume);
+ _solution.ForceAddSolution(footPrintComponent.Solution.Value, removedReagents);
+
+ component.RightStep = !component.RightStep;
+ component.LastStepPos = newPos;
}
private EntityCoordinates CalcCoords(EntityUid uid, FootPrintsComponent component, TransformComponent transform, bool state)
{
if (state)
- return new EntityCoordinates(uid, transform.LocalPosition);
+ return new(uid, transform.LocalPosition);
var offset = component.RightStep
? new Angle(Angle.FromDegrees(180f) + transform.LocalRotation).RotateVec(component.OffsetPrint)
: new Angle(transform.LocalRotation).RotateVec(component.OffsetPrint);
- return new EntityCoordinates(uid, transform.LocalPosition + offset);
+ return new(uid, transform.LocalPosition + offset);
}
private FootPrintVisuals PickState(EntityUid uid, bool dragging)
diff --git a/Content.Server/FootPrint/PuddleFootPrintsSystem.cs b/Content.Server/FootPrint/PuddleFootPrintsSystem.cs
index 706ba25359d..a778bcf2c7d 100644
--- a/Content.Server/FootPrint/PuddleFootPrintsSystem.cs
+++ b/Content.Server/FootPrint/PuddleFootPrintsSystem.cs
@@ -1,16 +1,17 @@
-using System.Linq;
using Content.Shared.FootPrint;
-using Content.Shared.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.EntitySystems;
-using Content.Shared.Fluids;
+using Content.Shared.FixedPoint;
using Content.Shared.Fluids.Components;
+using Content.Shared.Forensics;
using Robust.Shared.Physics.Events;
+using Robust.Shared.Prototypes;
+
namespace Content.Server.FootPrint;
public sealed class PuddleFootPrintsSystem : EntitySystem
{
- [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
+ [Dependency] private readonly IPrototypeManager _protoMan = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
public override void Initialize()
@@ -21,32 +22,27 @@ public override void Initialize()
private void OnStepTrigger(EntityUid uid, PuddleFootPrintsComponent component, ref EndCollideEvent args)
{
- if (!TryComp(uid, out var appearance)
- || !TryComp(uid, out var puddle)
- || !TryComp(args.OtherEntity, out var tripper)
- || !TryComp(uid, out var solutionManager)
- || !_solutionContainer.ResolveSolution((uid, solutionManager), puddle.SolutionName, ref puddle.Solution, out var solutions))
- return;
-
- var totalSolutionQuantity = solutions.Contents.Sum(sol => (float) sol.Quantity);
- var waterQuantity = (from sol in solutions.Contents where sol.Reagent.Prototype == "Water" select (float) sol.Quantity).FirstOrDefault();
-
- if (waterQuantity / (totalSolutionQuantity / 100f) > component.OffPercent || solutions.Contents.Count <= 0)
+ if (!TryComp(uid, out var puddle) || !TryComp(args.OtherEntity, out var tripper))
return;
- tripper.ReagentToTransfer =
- solutions.Contents.Aggregate((l, r) => l.Quantity > r.Quantity ? l : r).Reagent.Prototype;
+ // Transfer DNAs from the puddle to the tripper
+ if (TryComp(uid, out var puddleForensics))
+ {
+ tripper.DNAs.UnionWith(puddleForensics.DNAs);
+ if(TryComp(args.OtherEntity, out var tripperForensics))
+ tripperForensics.DNAs.UnionWith(puddleForensics.DNAs);
+ }
- if (_appearance.TryGetData(uid, PuddleVisuals.SolutionColor, out var color, appearance)
- && _appearance.TryGetData(uid, PuddleVisuals.CurrentVolume, out var volume, appearance))
- AddColor((Color) color, (float) volume * component.SizeRatio, tripper);
+ // Transfer reagents from the puddle to the tripper.
+ // Ideally it should be a two-way process, but that is too hard to simulate and will have very little effect outside of potassium-water spills.
+ var quantity = puddle.Solution?.Comp?.Solution?.Volume ?? 0;
+ var footprintsCapacity = tripper.ContainedSolution.AvailableVolume;
- _solutionContainer.RemoveEachReagent(puddle.Solution.Value, 1);
- }
+ if (quantity <= 0 || footprintsCapacity <= 0)
+ return;
- private void AddColor(Color col, float quantity, FootPrintsComponent component)
- {
- component.PrintsColor = component.ColorQuantity == 0f ? col : Color.InterpolateBetween(component.PrintsColor, col, component.ColorInterpolationFactor);
- component.ColorQuantity += quantity;
+ var transferAmount = FixedPoint2.Min(footprintsCapacity, quantity * component.SizeRatio);
+ var transferred = _solutionContainer.SplitSolution(puddle.Solution!.Value, transferAmount);
+ tripper.ContainedSolution.AddSolution(transferred, _protoMan);
}
}
diff --git a/Content.Shared/Fluids/AbsorbentComponent.cs b/Content.Shared/Fluids/AbsorbentComponent.cs
index 450ecc0df6d..6cda88a72d6 100644
--- a/Content.Shared/Fluids/AbsorbentComponent.cs
+++ b/Content.Shared/Fluids/AbsorbentComponent.cs
@@ -38,4 +38,13 @@ public sealed partial class AbsorbentComponent : Component
{
Params = AudioParams.Default.WithVariation(SharedContentAudioSystem.DefaultVariation).WithVolume(-3f),
};
+
+ [DataField]
+ public float FootprintCleaningRange = 0.2f;
+
+ ///
+ /// How many footprints within can be cleaned at once.
+ ///
+ [DataField]
+ public int MaxCleanedFootprints = 5;
}
diff --git a/Content.Shared/Footprint/FootPrintsComponent.cs b/Content.Shared/Footprint/FootPrintsComponent.cs
index 2b2c4ed66ed..99aa2106cf6 100644
--- a/Content.Shared/Footprint/FootPrintsComponent.cs
+++ b/Content.Shared/Footprint/FootPrintsComponent.cs
@@ -1,4 +1,6 @@
using System.Numerics;
+using Content.Shared.Chemistry.Components;
+using Content.Shared.FixedPoint;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -7,23 +9,17 @@ namespace Content.Shared.FootPrint;
[RegisterComponent]
public sealed partial class FootPrintsComponent : Component
{
- [ViewVariables(VVAccess.ReadOnly), DataField]
+ [DataField]
public ResPath RsiPath = new("/Textures/Effects/footprints.rsi");
- // all of those are set as a layer
- [ViewVariables(VVAccess.ReadOnly), DataField]
- public string LeftBarePrint = "footprint-left-bare-human";
-
- [ViewVariables(VVAccess.ReadOnly), DataField]
- public string RightBarePrint = "footprint-right-bare-human";
-
- [ViewVariables(VVAccess.ReadOnly), DataField]
- public string ShoesPrint = "footprint-shoes";
-
- [ViewVariables(VVAccess.ReadOnly), DataField]
- public string SuitPrint = "footprint-suit";
+ [DataField]
+ public string
+ LeftBarePrint = "footprint-left-bare-human",
+ RightBarePrint = "footprint-right-bare-human",
+ ShoesPrint = "footprint-shoes",
+ SuitPrint = "footprint-suit";
- [ViewVariables(VVAccess.ReadOnly), DataField]
+ [DataField]
public string[] DraggingPrint =
[
"dragging-1",
@@ -32,14 +28,10 @@ public sealed partial class FootPrintsComponent : Component
"dragging-4",
"dragging-5",
];
- // yea, those
- [ViewVariables(VVAccess.ReadOnly), DataField]
+ [DataField]
public EntProtoId StepProtoId = "Footstep";
- [ViewVariables(VVAccess.ReadOnly), DataField]
- public Color PrintsColor = Color.FromHex("#00000000");
-
///
/// The size scaling factor for footprint steps. Must be positive.
///
@@ -53,20 +45,8 @@ public sealed partial class FootPrintsComponent : Component
public float DragSize = 0.5f;
///
- /// The amount of color to transfer from the source (e.g., puddle) to the footprint.
- ///
- [DataField]
- public float ColorQuantity;
-
- ///
- /// The factor by which the alpha channel is reduced in subsequent footprints.
+ /// Horizontal offset of the created footprints relative to the center.
///
- [DataField]
- public float ColorReduceAlpha = 0.1f;
-
- [DataField]
- public string? ReagentToTransfer;
-
[DataField]
public Vector2 OffsetPrint = new(0.1f, 0f);
@@ -78,11 +58,20 @@ public sealed partial class FootPrintsComponent : Component
///
/// The position of the last footprint in world coordinates.
///
- public Vector2 StepPos = Vector2.Zero;
+ public Vector2 LastStepPos = Vector2.Zero;
+
+ [DataField]
+ public HashSet DNAs = new();
///
- /// Controls how quickly the footprint color transitions between steps.
- /// Value between 0 and 1, where higher values mean faster color changes.
+ /// Reagent volume used for footprints.
///
- public float ColorInterpolationFactor = 0.2f;
+ [DataField]
+ public Solution ContainedSolution = new(3) { CanReact = true, MaxVolume = 5f, };
+
+ ///
+ /// Amount of reagents used per footprint.
+ ///
+ [DataField]
+ public FixedPoint2 FootprintVolume = 1f;
}
diff --git a/Content.Shared/Footprint/PuddleFootPrintsComponent.cs b/Content.Shared/Footprint/PuddleFootPrintsComponent.cs
index 0e2ddfe3836..bea2b6b7a15 100644
--- a/Content.Shared/Footprint/PuddleFootPrintsComponent.cs
+++ b/Content.Shared/Footprint/PuddleFootPrintsComponent.cs
@@ -1,11 +1,14 @@
+using Content.Shared.FixedPoint;
+
+
namespace Content.Shared.FootPrint;
[RegisterComponent]
public sealed partial class PuddleFootPrintsComponent : Component
{
+ ///
+ /// Ratio between puddle volume and the amount of reagents that can be transferred from it.
+ ///
[ViewVariables(VVAccess.ReadWrite)]
- public float SizeRatio = 0.2f;
-
- [ViewVariables(VVAccess.ReadWrite)]
- public float OffPercent = 80f;
+ public FixedPoint2 SizeRatio = 0.15f;
}
diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml
index 7f6125e73d3..988b06de226 100644
--- a/Resources/Prototypes/Entities/Effects/puddle.yml
+++ b/Resources/Prototypes/Entities/Effects/puddle.yml
@@ -205,3 +205,13 @@
- type: Puddle
solution: step
- type: Appearance
+ - type: Drink
+ delay: 3
+ transferAmount: 1
+ solution: step
+ examinable: false
+ - type: ExaminableSolution
+ solution: step
+ - type: DrawableSolution
+ solution: step
+ - type: BadDrink
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml
index cb556c7d4d9..468acc38517 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml
@@ -37,6 +37,8 @@
size: Large
sprite: Objects/Specific/Janitorial/mop.rsi
- type: Absorbent
+ footprintCleaningRange: 0.45
+ maxCleanedFootprints: 25
- type: SolutionContainerManager
solutions:
absorbed:
@@ -94,6 +96,8 @@
sprite: Objects/Specific/Janitorial/advmop.rsi
- type: Absorbent
pickupAmount: 100
+ footprintCleaningRange: 0.75
+ maxCleanedFootprints: 25
- type: UseDelay
delay: 1.0
- type: SolutionRegeneration
From d2875c938eab921b0d705852af9383c849eb1ef4 Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:27:40 +0000
Subject: [PATCH 11/22] Automatic Changelog Update (#1439)
---
Resources/Changelog/Changelog.yml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index a4486ded011..45675b307b5 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9220,3 +9220,12 @@ Entries:
id: 6632
time: '2025-01-05T18:24:29.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1431
+- author: VMSolidus
+ changes:
+ - type: Add
+ message: >-
+ Footprints are now cleaned in a small radius around the mouse cursor
+ when mopping them.
+ id: 6633
+ time: '2025-01-05T18:27:12.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1439
From 71e3c031750db523f8fcccc4a36a61200b1028f2 Mon Sep 17 00:00:00 2001
From: Skubman
Date: Mon, 6 Jan 2025 02:30:14 +0800
Subject: [PATCH 12/22] Pacification Prevents Throwing Weapons (#1433)
# Description
Prevents entities who are Pacified (through the Pacifist trait or being
a thief) from throwing items that deal damage on hit or embed.
## Technical Details
Two components will prevent throwing if they deal any damage:
`DamageOtherOnHitComponent` and `EmbedPassiveComponent`.
The pacifist check on `EmbeddableProjectileComponent` has been removed,
because just because an item is embeddable does not mean they deal
damage.
## Media
**Throw attempt with the Pacifist trait**
![image](https://github.com/user-attachments/assets/6c439bb3-b41b-4f30-975d-4fa15c2cfa6d)
# Changelog
:cl: Skubman
- fix: Pacified characters (Pacifist trait and thieves) can no longer
throw items that deal throwing damage.
---------
Signed-off-by: VMSolidus
Co-authored-by: VMSolidus
---
.../Damage/Systems/DamageOtherOnHitSystem.cs | 5 +++--
.../Damage/Systems/SharedDamageOtherOnHitSystem.cs | 12 ++++++++++++
.../Projectiles/EmbedPassiveDamageSystem.cs | 12 ++++++++++++
Content.Shared/Projectiles/SharedProjectileSystem.cs | 10 ----------
4 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs
index 248562a44fc..0dc9808dc1d 100644
--- a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs
+++ b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs
@@ -1,4 +1,5 @@
using Content.Shared.Camera;
+using Content.Shared.CombatMode.Pacification;
using Content.Shared.Damage;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Events;
@@ -31,13 +32,13 @@ public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnBeforeThrow);
+ SubscribeLocalEvent(OnBeforeThrow, after: [typeof(PacificationSystem)]);
SubscribeLocalEvent(OnDamageExamine, after: [typeof(MeleeWeaponSystem)]);
}
private void OnBeforeThrow(EntityUid uid, StaminaComponent component, ref BeforeThrowEvent args)
{
- if (!TryComp(args.ItemUid, out var damage))
+ if (args.Cancelled || !TryComp(args.ItemUid, out var damage))
return;
if (component.CritThreshold - component.StaminaDamage <= damage.StaminaCost)
diff --git a/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs b/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs
index 1ea4c3ef0cf..e9e786a8179 100644
--- a/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs
+++ b/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs
@@ -1,5 +1,6 @@
using Content.Shared.Administration.Logs;
using Content.Shared.Camera;
+using Content.Shared.CombatMode.Pacification;
using Content.Shared.Contests;
using Content.Shared.Damage;
using Content.Shared.Damage.Components;
@@ -39,6 +40,7 @@ public override void Initialize()
SubscribeLocalEvent(OnMapInit);
SubscribeLocalEvent(OnDoHit);
SubscribeLocalEvent(OnThrown);
+ SubscribeLocalEvent(OnAttemptPacifiedThrow);
SubscribeLocalEvent(OnItemToggleMapInit);
SubscribeLocalEvent(OnItemToggle);
@@ -181,6 +183,16 @@ private void OnThrown(EntityUid uid, DamageOtherOnHitComponent component, Thrown
component.HitQuantity = 0;
}
+ ///
+ /// Prevent Pacified entities from throwing damaging items.
+ ///
+ private void OnAttemptPacifiedThrow(EntityUid uid, DamageOtherOnHitComponent comp, ref AttemptPacifiedThrowEvent args)
+ {
+ // Allow healing projectiles, forbid any that do damage
+ if (comp.Damage.AnyPositive())
+ args.Cancel("pacified-cannot-throw");
+ }
+
///
/// Gets the total damage a throwing weapon does.
///
diff --git a/Content.Shared/Projectiles/EmbedPassiveDamageSystem.cs b/Content.Shared/Projectiles/EmbedPassiveDamageSystem.cs
index 55733ac5bb3..589abf305c5 100644
--- a/Content.Shared/Projectiles/EmbedPassiveDamageSystem.cs
+++ b/Content.Shared/Projectiles/EmbedPassiveDamageSystem.cs
@@ -1,3 +1,4 @@
+using Content.Shared.CombatMode.Pacification;
using Content.Shared.Damage;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Events;
@@ -24,6 +25,7 @@ public override void Initialize()
SubscribeLocalEvent(OnEmbed);
SubscribeLocalEvent(OnRemoveEmbed);
SubscribeLocalEvent(OnItemToggle);
+ SubscribeLocalEvent(OnAttemptPacifiedThrow);
}
///
@@ -92,6 +94,16 @@ private void OnItemToggle(EntityUid uid, EmbedPassiveDamageComponent component,
component.Damage = deactivatedDamage;
}
+ ///
+ /// Prevent Pacified entities from throwing items that deal passive damage when embedded.
+ ///
+ private void OnAttemptPacifiedThrow(EntityUid uid, EmbedPassiveDamageComponent comp, ref AttemptPacifiedThrowEvent args)
+ {
+ // Allow healing projectiles, forbid any that do damage
+ if (comp.Damage.AnyPositive())
+ args.Cancel("pacified-cannot-throw");
+ }
+
public override void Update(float frameTime)
{
base.Update(frameTime);
diff --git a/Content.Shared/Projectiles/SharedProjectileSystem.cs b/Content.Shared/Projectiles/SharedProjectileSystem.cs
index f5d2a915dc7..a32575c0eea 100644
--- a/Content.Shared/Projectiles/SharedProjectileSystem.cs
+++ b/Content.Shared/Projectiles/SharedProjectileSystem.cs
@@ -1,6 +1,5 @@
using System.Numerics;
using Content.Shared.Body.Systems;
-using Content.Shared.CombatMode.Pacification;
using Content.Shared.Damage;
using Content.Shared.DoAfter;
using Content.Shared.Examine;
@@ -47,7 +46,6 @@ public override void Initialize()
SubscribeLocalEvent(OnEmbedThrowDoHit);
SubscribeLocalEvent(OnEmbedActivate);
SubscribeLocalEvent(OnEmbedRemove);
- SubscribeLocalEvent(OnAttemptPacifiedThrow);
SubscribeLocalEvent(OnExamined);
}
@@ -211,14 +209,6 @@ public void SetShooter(EntityUid id, ProjectileComponent component, EntityUid sh
Dirty(id, component);
}
- ///
- /// Prevent players with the Pacified status effect from throwing embeddable projectiles.
- ///
- private void OnAttemptPacifiedThrow(Entity ent, ref AttemptPacifiedThrowEvent args)
- {
- args.Cancel("pacified-cannot-throw-embed");
- }
-
private void OnExamined(EntityUid uid, EmbeddableProjectileComponent component, ExaminedEvent args)
{
if (!(component.Target is {} target))
From 06be5d35495271bebf75d8df7cfcb6c29937bcc8 Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:30:44 +0000
Subject: [PATCH 13/22] Automatic Changelog Update (#1433)
---
Resources/Changelog/Changelog.yml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 45675b307b5..ebaec65ae6f 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9229,3 +9229,12 @@ Entries:
id: 6633
time: '2025-01-05T18:27:12.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1439
+- author: Skubman
+ changes:
+ - type: Fix
+ message: >-
+ Pacified characters (Pacifist trait and thieves) can no longer throw
+ items that deal throwing damage.
+ id: 6634
+ time: '2025-01-05T18:30:15.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1433
From 89354922a0f6fb55111e0ce2b4b19e5f6d6ea0e2 Mon Sep 17 00:00:00 2001
From: Skubman
Date: Mon, 6 Jan 2025 02:31:20 +0800
Subject: [PATCH 14/22] Parkour Training Rework (#1432)
# Description
Parkour Training, Sluggish and Snail-Paced have been reworked to be more
impactful in everyday space life. A new trait has been added, Bad Knees.
**Parkour Training** (-5 points)
- No longer modifies laying down
- Climbing speed bonus reduced from 65% to 50%
- 30% shorter slip stuns
- 50% resistance against slows in difficult terrain
- Example: Spider webs inflict a 50% slow, reduced by 50% results in a
25% slow.
Notably, the reworked Parkour Training is much closer to the CDDA trait
[Parkour
Expert](https://cddawiki.danmakudan.com/wiki/index.php/Parkour_Expert).
Difficult terrain examples: Spider webs, slime/blood puddles, kudzu,
space glue
**(NEW)** **Bad Knees** (3 points)
- Designed to be the opposite of Parkour Training
- 50% climbing speed penalty
- 40% longer slip stuns
- 35% increased slows in difficult terrain
- Example: Spider webs inflict a 50% slow, increased by 35% results in a
67.5% slow.
Inspired by the CDDA trait of the same name [Bad
Knees](https://cddawiki.danmakudan.com/wiki/index.php/Bad_Knees).
The stun time for banana peels and puddles is 3 seconds. With Bad Knees,
the stun is increased to 4.2 seconds. The time it takes to handcuff
someone is 3.5 seconds. Go figure :trollface:
**Sluggish** (3 points)
- No longer increases the time for laying down and climbing tables
(given to Bad Knees instead)
- Speed penalty increased from 15% to 16%
**Snail-Paced** (5 points)
- No longer increases the time for laying down and climbing tables
- Speed penalty increased from 30% to 32%
- No longer prevents you from slipping when running due to how slow your
sprint speed is. Snail-Paced trait users must suffer.
## Media
**Parkour Training**
![image](https://github.com/user-attachments/assets/b320d18a-7ac8-419d-b783-28a4d3ac0bb5)
**Bad Knees**
![image](https://github.com/user-attachments/assets/caa64d6a-a58b-4378-a947-0a5f3f6e70a6)
**Sluggish**
![image](https://github.com/user-attachments/assets/7f9ac71f-475f-4aa9-8e36-b93aaad12670)
**Snail-Paced**
![image](https://github.com/user-attachments/assets/faf70f4b-2911-4d03-a72a-99972838b7f9)
## Changelog
:cl: Skubman
- tweak: The Parkour Training trait has been reworked. It no longer
makes you lie down or get up faster, but grants you 30% shorter slip
stuns and 50% resistance against slows in difficult terrain.
- tweak: The Sluggish and Snail-Paced traits now only reduce your
movement speed with no other effects. The speed reductions have been
slightly increased from 15% to 16% for Sluggish, and 30% to 32% for
Snail-Paced.
- add: Added a new 3-point negative trait called Bad Knees. It is the
opposite of Parkour Training and it makes you climb tables slower,
stunned for longer against slip stuns, and move more slowly in difficult
terrain.
- tweak: Snail-Paced no longer prevents you from slipping when running.
---
...SpeedModifiedByContactModifierComponent.cs | 37 ++++++++++++++++
.../Systems/SpeedModifierContactsSystem.cs | 10 +++++
.../Slippery/SlippableModifierComponent.cs | 15 +++++++
Content.Shared/Slippery/SlipperySystem.cs | 27 +++++++++++-
.../StepTrigger/Systems/StepTriggerSystem.cs | 7 +++-
.../Components/TraitSpeedModifierComponent.cs | 6 +++
Resources/Locale/en-US/traits/traits.ftl | 18 ++++++--
Resources/Prototypes/Traits/disabilities.yml | 42 +++++++++++++------
Resources/Prototypes/Traits/skills.yml | 11 +++--
9 files changed, 152 insertions(+), 21 deletions(-)
create mode 100644 Content.Shared/Movement/Components/SpeedModifiedByContactModifierComponent.cs
create mode 100644 Content.Shared/Slippery/SlippableModifierComponent.cs
diff --git a/Content.Shared/Movement/Components/SpeedModifiedByContactModifierComponent.cs b/Content.Shared/Movement/Components/SpeedModifiedByContactModifierComponent.cs
new file mode 100644
index 00000000000..9a32d3453d3
--- /dev/null
+++ b/Content.Shared/Movement/Components/SpeedModifiedByContactModifierComponent.cs
@@ -0,0 +1,37 @@
+using Content.Shared.Movement.Systems;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Movement.Components;
+
+//
+// This is used to modify how much an entity is affected by speed modifier contacts.
+//
+[NetworkedComponent, RegisterComponent]
+[AutoGenerateComponentState]
+[Access(typeof(SpeedModifierContactsSystem))]
+public sealed partial class SpeedModifiedByContactModifierComponent : Component
+{
+ //
+ // Numbers greater than 1 amplify the walk speed modifier, and lower numbers lessen the effect.
+ //
+ [DataField, AutoNetworkedField]
+ public float WalkModifierEffectiveness = 1.0f;
+
+ //
+ // Numbers greater than 1 amplify the sprint speed modifier, and lower numbers lessen the effect.
+ //
+ [DataField, AutoNetworkedField]
+ public float SprintModifierEffectiveness = 1.0f;
+
+ //
+ // The minimum walk speed multiplier.
+ //
+ [DataField, AutoNetworkedField]
+ public float MinWalkMultiplier = 0.1f;
+
+ //
+ // The minimum sprint speed multiplier.
+ //
+ [DataField, AutoNetworkedField]
+ public float MinSprintMultiplier = 0.1f;
+}
diff --git a/Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs b/Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs
index 6e1b3a29aec..94becab9d2a 100644
--- a/Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs
+++ b/Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs
@@ -102,6 +102,16 @@ private void MovementSpeedCheck(EntityUid uid, SpeedModifiedByContactComponent c
walkSpeed /= entries;
sprintSpeed /= entries;
+ if (TryComp(uid, out var modifier))
+ {
+ walkSpeed = Math.Max(Math.Min(modifier.MinWalkMultiplier, walkSpeed),
+ // Similar to the formula for movement slow resist in Deadlock
+ 1 - (1 - walkSpeed) * modifier.WalkModifierEffectiveness);
+
+ sprintSpeed = Math.Max(Math.Min(modifier.MinSprintMultiplier, sprintSpeed),
+ 1 - (1 - sprintSpeed) * modifier.SprintModifierEffectiveness);
+ }
+
args.ModifySpeed(walkSpeed, sprintSpeed);
}
diff --git a/Content.Shared/Slippery/SlippableModifierComponent.cs b/Content.Shared/Slippery/SlippableModifierComponent.cs
new file mode 100644
index 00000000000..9a5a22e3a2e
--- /dev/null
+++ b/Content.Shared/Slippery/SlippableModifierComponent.cs
@@ -0,0 +1,15 @@
+using Robust.Shared.GameStates;
+namespace Content.Shared.Slippery;
+
+///
+/// Modifies the duration of slip paralysis on an entity.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class SlippableModifierComponent : Component
+{
+ ///
+ /// What to multiply the paralyze time by.
+ ///
+ [DataField, AutoNetworkedField]
+ public float ParalyzeTimeMultiplier = 1f;
+}
diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs
index 0b52cdde92e..4d6c4fe342a 100644
--- a/Content.Shared/Slippery/SlipperySystem.cs
+++ b/Content.Shared/Slippery/SlipperySystem.cs
@@ -37,6 +37,7 @@ public override void Initialize()
SubscribeLocalEvent(OnThrownSlipAttempt);
// as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer).
SubscribeLocalEvent>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args));
+ SubscribeLocalEvent(OnSlippableModifierSlipped);
}
private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredOffEvent args)
@@ -62,6 +63,11 @@ private void OnThrownSlipAttempt(EntityUid uid, ThrownItemComponent comp, ref Sl
args.Cancelled = true;
}
+ private void OnSlippableModifierSlipped(EntityUid uid, SlippableModifierComponent comp, ref SlippedEvent args)
+ {
+ args.ParalyzeTime *= comp.ParalyzeTimeMultiplier;
+ }
+
private bool CanSlip(EntityUid uid, EntityUid toSlip)
{
return !_container.IsEntityInContainer(uid)
@@ -86,6 +92,9 @@ private void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other
var ev = new SlipEvent(other);
RaiseLocalEvent(uid, ref ev);
+ var slippedEv = new SlippedEvent(uid, component.ParalyzeTime);
+ RaiseLocalEvent(other, ref slippedEv);
+
if (TryComp(other, out PhysicsComponent? physics) && !HasComp(other))
{
_physics.SetLinearVelocity(other, physics.LinearVelocity * component.LaunchForwardsMultiplier, body: physics);
@@ -100,7 +109,7 @@ private void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other
var playSound = !_statusEffects.HasStatusEffect(other, "KnockedDown");
- _stun.TryParalyze(other, TimeSpan.FromSeconds(component.ParalyzeTime), true);
+ _stun.TryParalyze(other, TimeSpan.FromSeconds(slippedEv.ParalyzeTime), true);
RaiseLocalEvent(other, new MoodEffectEvent("MobSlipped"));
@@ -134,3 +143,19 @@ public record struct SlipCausingAttemptEvent (bool Cancelled);
/// The entity being slipped
[ByRefEvent]
public readonly record struct SlipEvent(EntityUid Slipped);
+
+/// Raised on an entity that slipped.
+/// The entity that caused the slip
+/// How many seconds the entity will be paralyzed for, modifiable with this event.
+[ByRefEvent]
+public record struct SlippedEvent
+{
+ public readonly EntityUid Slipper;
+ public float ParalyzeTime;
+
+ public SlippedEvent(EntityUid slipper, float paralyzeTime)
+ {
+ Slipper = slipper;
+ ParalyzeTime = paralyzeTime;
+ }
+}
diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs
index 5bb303cf517..6635e331b5c 100644
--- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs
+++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs
@@ -1,5 +1,6 @@
using Content.Shared.Gravity;
using Content.Shared.StepTrigger.Components;
+using Content.Shared.Traits.Assorted.Components;
using Content.Shared.Whitelist;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
@@ -97,7 +98,11 @@ private void UpdateColliding(EntityUid uid, StepTriggerComponent component, Tran
// this is hard to explain
var intersect = Box2.Area(otherAabb.Intersect(ourAabb));
var ratio = Math.Max(intersect / Box2.Area(otherAabb), intersect / Box2.Area(ourAabb));
- if (otherPhysics.LinearVelocity.Length() < component.RequiredTriggeredSpeed
+ var requiredTriggeredSpeed = component.RequiredTriggeredSpeed;
+ if (TryComp(otherUid, out var speedModifier))
+ requiredTriggeredSpeed *= speedModifier.RequiredTriggeredSpeedModifier;
+
+ if (otherPhysics.LinearVelocity.Length() < requiredTriggeredSpeed
|| component.CurrentlySteppedOn.Contains(otherUid)
|| ratio < component.IntersectRatio
|| !CanTrigger(uid, otherUid, component))
diff --git a/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs
index 85dc52a21f5..c0d79c83755 100644
--- a/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs
+++ b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs
@@ -13,4 +13,10 @@ public sealed partial class TraitSpeedModifierComponent : Component
[DataField, AutoNetworkedField]
public float SprintModifier = 1.0f;
+
+ //
+ // Multiplied with the required trigger speed for step triggers that this entity collides with.
+ //
+ [DataField, AutoNetworkedField]
+ public float RequiredTriggeredSpeedModifier = 1.0f;
}
diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl
index d3b5f1eef3a..37de6238d7e 100644
--- a/Resources/Locale/en-US/traits/traits.ftl
+++ b/Resources/Locale/en-US/traits/traits.ftl
@@ -224,20 +224,32 @@ trait-description-Voracious =
Nothing gets between you and your food.
Your endless consumption of food and drinks is twice as fast.
+-terrain-example = [color=gray](e.g. spider web, slime puddle, kudzu, space glue)[/color]
+-slippery-example = [color=gray](e.g. banana peel, water puddle, soap, space lube)[/color]
+
trait-name-ParkourTraining = Parkour Training
trait-description-ParkourTraining =
Whether as a hobby, lifestyle, or professional training, you are trained in the discipline of parkour.
- You're faster with climbing, crawling, lying down, and getting up.
+ You climb structures like tables [color=yellow]50%[/color] faster.
+ Slipping leaves you stunned for [color=yellow]30%[/color] shorter. { -slippery-example }
+ You gain a [color=yellow]50%[/color] resistance to slows from difficult terrain. { -terrain-example }
+
+trait-name-BadKnees = Bad Knees
+trait-description-BadKnees =
+ Whether due to injury, age, or wear and tear, your knees aren't particularly strong or flexible.
+ You climb structures like tables [color=yellow]50%[/color] slower.
+ Slipping leaves you stunned for [color=yellow]40%[/color] longer. { -slippery-example }
+ Difficult terrain slows you down [color=yellow]35%[/color] more. { -terrain-example }
trait-name-Sluggish = Sluggish
trait-description-Sluggish =
You navigate the world slower than others, perhaps due to a medical condition, inactivity, or age.
- You move slower, and it takes longer for you to climb, lie down and get up.
+ Your movement speed is decreased by [color=yellow]16%[/color].
trait-name-SnailPaced = Snail-Paced
trait-description-SnailPaced =
You walk at a snail's pace, perhaps due to a medical condition, mobility impairment, or age.
- You move substantially slower, and it takes far longer for you to climb, lie down and get up.
+ Your movement speed is decreased by [color=yellow]32%[/color].
trait-name-LightStep = Light Step
trait-description-LightStep =
diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml
index 68877b01d27..e2fb46bfc84 100644
--- a/Resources/Prototypes/Traits/disabilities.yml
+++ b/Resources/Prototypes/Traits/disabilities.yml
@@ -141,6 +141,30 @@
components:
- type: Snoring
+- type: trait
+ id: BadKnees
+ category: Physical
+ points: 3
+ requirements:
+ - !type:CharacterTraitRequirement
+ inverted: true
+ traits:
+ - ParkourTraining
+ - !type:CharacterSpeciesRequirement
+ inverted: true
+ species:
+ - Diona
+ functions:
+ - !type:TraitAddComponent
+ components:
+ - type: ClimbDelayModifier
+ climbDelayMultiplier: 1.5
+ - type: SlippableModifier
+ paralyzeTimeMultiplier: 1.4
+ - type: SpeedModifiedByContactModifier
+ walkModifierEffectiveness: 1.35
+ sprintModifierEffectiveness: 1.35
+
- type: trait
id: Sluggish
category: Physical
@@ -159,12 +183,9 @@
- !type:TraitAddComponent
components:
- type: TraitSpeedModifier
- sprintModifier: 0.85
- walkModifier: 0.85
- - type: ClimbDelayModifier
- climbDelayMultiplier: 1.35
- - type: LayingDownModifier
- layingDownCooldownMultiplier: 1.2
+ sprintModifier: 0.84
+ walkModifier: 0.84
+ requiredTriggeredSpeedModifier: 0.84
- type: trait
id: SnailPaced
@@ -184,12 +205,9 @@
- !type:TraitAddComponent
components:
- type: TraitSpeedModifier
- sprintModifier: 0.7
- walkModifier: 0.7
- - type: ClimbDelayModifier
- climbDelayMultiplier: 1.66
- - type: LayingDownModifier
- layingDownCooldownMultiplier: 1.6
+ sprintModifier: 0.68
+ walkModifier: 0.68
+ requiredTriggeredSpeedModifier: 0.68 # Still slip against normal slips with the new sprint speed
- type: trait
id: BloodDeficiency
diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml
index 25603c7347d..8a035d24f6d 100644
--- a/Resources/Prototypes/Traits/skills.yml
+++ b/Resources/Prototypes/Traits/skills.yml
@@ -135,6 +135,7 @@
traits:
- Sluggish
- SnailPaced
+ - BadKnees
- !type:CharacterSpeciesRequirement
inverted: true
species:
@@ -143,10 +144,12 @@
- !type:TraitReplaceComponent
components:
- type: ClimbDelayModifier
- climbDelayMultiplier: 0.35
- - type: LayingDownModifier
- layingDownCooldownMultiplier: 0.5
- downedSpeedMultiplierMultiplier: 1.65
+ climbDelayMultiplier: 0.5
+ - type: SlippableModifier
+ paralyzeTimeMultiplier: 0.7
+ - type: SpeedModifiedByContactModifier
+ walkModifierEffectiveness: 0.5
+ sprintModifierEffectiveness: 0.5
- type: trait
id: LightStep
From 72d63474ade4fc94571cb5606e05928b4b2c8fa2 Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:33:14 +0000
Subject: [PATCH 15/22] Automatic Changelog Update (#1432)
---
Resources/Changelog/Changelog.yml | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index ebaec65ae6f..1c5e0ee9302 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9238,3 +9238,25 @@ Entries:
id: 6634
time: '2025-01-05T18:30:15.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1433
+- author: Skubman
+ changes:
+ - type: Tweak
+ message: >-
+ The Parkour Training trait has been reworked. It no longer makes you lie
+ down or get up faster, but grants you 30% shorter slip stuns and 50%
+ resistance against slows in difficult terrain.
+ - type: Tweak
+ message: >-
+ The Sluggish and Snail-Paced traits now only reduce your movement speed
+ with no other effects. The speed reductions have been slightly increased
+ from 15% to 16% for Sluggish, and 30% to 32% for Snail-Paced.
+ - type: Add
+ message: >-
+ Added a new 3-point negative trait called Bad Knees. It is the opposite
+ of Parkour Training and it makes you climb tables slower, stunned for
+ longer against slip stuns, and move more slowly in difficult terrain.
+ - type: Tweak
+ message: Snail-Paced no longer prevents you from slipping when running.
+ id: 6635
+ time: '2025-01-05T18:31:21.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1432
From deecce39c00e0d2cb29de45b051621c967eb2f8b Mon Sep 17 00:00:00 2001
From: Skubman
Date: Mon, 6 Jan 2025 02:35:46 +0800
Subject: [PATCH 16/22] Unlimited Face Markings (#1435)
# Description
Removes the marking limits for the Face category (was limited to 1
marking) for all non-IPC species, now having unlimited markings as
designed.
Moth makeup (Moth Blush / Moth Lipstick) is now usable again in the Face
category.
## Media
**Markings without limits**
![image](https://github.com/user-attachments/assets/768c4d8b-d982-4836-a57c-1be17e48a33f)
**Lizard with frills and earrings**
![image](https://github.com/user-attachments/assets/1cd4902d-e187-496b-950f-2113655d02c3)
**Moth Makeup**
![image](https://github.com/user-attachments/assets/29236624-c417-4ee6-bf91-e9f80acf8216)
# Changelog
:cl: Skubman
- fix: The Face marking category now has unlimited markings for all
species apart from IPCs.
- fix: Moth People can now apply Moth makeup markings again in the Face
category.
- tweak: Unathi now have 3 'Head (Side)' marking points available, so
they can use frills and both left and right-side earrings.
---
Resources/Prototypes/DeltaV/Species/vulpkanin.yml | 3 ---
.../Entities/Mobs/Customization/Markings/makeup.yml | 2 +-
Resources/Prototypes/Nyanotrasen/Species/Oni.yml | 3 ---
Resources/Prototypes/Nyanotrasen/Species/felinid.yml | 3 ---
Resources/Prototypes/Species/arachne.yml | 3 ---
Resources/Prototypes/Species/harpy.yml | 3 ---
Resources/Prototypes/Species/human.yml | 3 ---
Resources/Prototypes/Species/moth.yml | 1 +
Resources/Prototypes/Species/reptilian.yml | 5 +----
Resources/Prototypes/Species/slime.yml | 3 ---
10 files changed, 3 insertions(+), 26 deletions(-)
diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml
index 4c276a3346a..0ad6519c764 100644
--- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml
+++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml
@@ -37,9 +37,6 @@
- type: markingPoints
id: MobVulpkaninMarkingLimits
points:
- Face:
- points: 1
- required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml
index 5fcb95b1d16..ec954a5655a 100644
--- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml
+++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml
@@ -73,7 +73,7 @@
- type: marking
id: MakeupMothBlush
bodyPart: Face
- markingCategory: Overlay
+ markingCategory: Face
speciesRestriction: [Moth]
coloring:
default:
diff --git a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml
index 160c1f3bec6..79d7e2b86f8 100644
--- a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml
+++ b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml
@@ -21,9 +21,6 @@
- type: markingPoints
id: MobOniMarkingLimits
points:
- Face:
- points: 1
- required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml
index 31c224b37a1..ad92ea8046f 100644
--- a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml
+++ b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml
@@ -17,9 +17,6 @@
- type: markingPoints
id: MobFelinidMarkingLimits
points:
- Face:
- points: 1
- required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Species/arachne.yml b/Resources/Prototypes/Species/arachne.yml
index 72e73fcf7f4..fff75454fcb 100644
--- a/Resources/Prototypes/Species/arachne.yml
+++ b/Resources/Prototypes/Species/arachne.yml
@@ -15,9 +15,6 @@
- type: markingPoints
id: MobArachneMarkingLimits
points:
- Face:
- points: 1
- required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Species/harpy.yml b/Resources/Prototypes/Species/harpy.yml
index a131b23a7aa..1b61ebdd76f 100644
--- a/Resources/Prototypes/Species/harpy.yml
+++ b/Resources/Prototypes/Species/harpy.yml
@@ -40,9 +40,6 @@
- type: markingPoints
id: MobHarpyMarkingLimits
points:
- Face:
- points: 1
- required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Species/human.yml b/Resources/Prototypes/Species/human.yml
index 6979bbcf91b..cc304a6eeb1 100644
--- a/Resources/Prototypes/Species/human.yml
+++ b/Resources/Prototypes/Species/human.yml
@@ -39,9 +39,6 @@
- type: markingPoints
id: MobHumanMarkingLimits
points:
- Face:
- points: 1
- required: false
Hair:
points: 1
required: false
diff --git a/Resources/Prototypes/Species/moth.yml b/Resources/Prototypes/Species/moth.yml
index 511f22394e0..5bba1b41d4b 100644
--- a/Resources/Prototypes/Species/moth.yml
+++ b/Resources/Prototypes/Species/moth.yml
@@ -16,6 +16,7 @@
id: MobMothSprites
sprites:
Head: MobMothHead
+ Face: MobHumanoidAnyMarking
Snout: MobHumanoidAnyMarking
Chest: MobMothTorso
HeadTop: MobHumanoidAnyMarking
diff --git a/Resources/Prototypes/Species/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml
index 99ea7f297a3..c4ed49401b0 100644
--- a/Resources/Prototypes/Species/reptilian.yml
+++ b/Resources/Prototypes/Species/reptilian.yml
@@ -42,9 +42,6 @@
id: MobReptilianMarkingLimits
onlyWhitelisted: true
points:
- Face:
- points: 1
- required: false
Hair:
points: 0
required: false
@@ -63,7 +60,7 @@
points: 2
required: false
HeadSide:
- points: 2
+ points: 3
required: false
Chest:
points: 1
diff --git a/Resources/Prototypes/Species/slime.yml b/Resources/Prototypes/Species/slime.yml
index ada69c7500e..f0f383e75a1 100644
--- a/Resources/Prototypes/Species/slime.yml
+++ b/Resources/Prototypes/Species/slime.yml
@@ -31,9 +31,6 @@
- type: markingPoints
id: MobSlimeMarkingLimits
points:
- Face:
- points: 1
- required: false
Hair:
points: 1
required: false
From e41e12ffea3675b22047d7f4f0fb21fd9df7081c Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:36:13 +0000
Subject: [PATCH 17/22] Automatic Changelog Update (#1435)
---
Resources/Changelog/Changelog.yml | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 1c5e0ee9302..70886ed0324 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9260,3 +9260,20 @@ Entries:
id: 6635
time: '2025-01-05T18:31:21.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1432
+- author: Skubman
+ changes:
+ - type: Fix
+ message: >-
+ The Face marking category now has unlimited markings for all species
+ apart from IPCs.
+ - type: Fix
+ message: >-
+ Moth People can now apply Moth makeup markings again in the Face
+ category.
+ - type: Tweak
+ message: >-
+ Unathi now have 3 'Head (Side)' marking points available, so they can
+ use frills and both left and right-side earrings.
+ id: 6636
+ time: '2025-01-05T18:35:46.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1435
From 9a2eac3fef3cfd8f981e31d37b68bc9926810eb1 Mon Sep 17 00:00:00 2001
From: VMSolidus
Date: Sun, 5 Jan 2025 12:37:43 -0600
Subject: [PATCH 18/22] Fix Lamia Footprints (#1425)
# Description
Lamia don't have feet, so they instead make huge drag marks when moving
through puddles. :)
# Changelog
:cl:
- fix: Lamia now make drag marks when moving through puddles instead of
regular footprints.
---
Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
index 0ac8d2231cc..9d7a85f97dd 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml
@@ -221,6 +221,11 @@
types:
Bloodloss: -1
- type: PortalExempt
+ - type: FootPrints
+ leftBarePrint: "dragging-1"
+ rightBarePrint: "dragging-1"
+ shoesPrint: "dragging-1"
+ suitPrint: "dragging-1"
- type: entity
save: false
From b2cf69c644f85f66ad400cb366aa2bfb37b5e241 Mon Sep 17 00:00:00 2001
From: VMSolidus
Date: Sun, 5 Jan 2025 12:37:51 -0600
Subject: [PATCH 19/22] Hotfix Material Arbitrage Test (#1392)
# Description
This is a pretty easy one line fix.
---
Resources/Prototypes/Entities/Structures/Furniture/chairs.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
index d65d652ff42..8c3eeab6fa6 100644
--- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
+++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
@@ -47,7 +47,7 @@
sound:
collection: MetalBreak
- type: StaticPrice
- price: 10
+ price: 25
- type: RequireProjectileTarget
#Starts unanchored, cannot be rotated while anchored
From d29149b5a26df28443edcef424ace3882c344f74 Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 18:38:10 +0000
Subject: [PATCH 20/22] Automatic Changelog Update (#1425)
---
Resources/Changelog/Changelog.yml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 70886ed0324..f09f78a36fd 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9277,3 +9277,12 @@ Entries:
id: 6636
time: '2025-01-05T18:35:46.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1435
+- author: VMSolidus
+ changes:
+ - type: Fix
+ message: >-
+ Lamia now make drag marks when moving through puddles instead of regular
+ footprints.
+ id: 6637
+ time: '2025-01-05T18:37:43.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1425
From 1c752991ed31d5b338b6eae0595b1b16321b100c Mon Sep 17 00:00:00 2001
From: VMSolidus
Date: Sun, 5 Jan 2025 13:21:08 -0600
Subject: [PATCH 21/22] Fixed Monkey Skin Color (#1437)
# Description
Apparently this bug was introduced by Shitmed. Pun Pun (And monkeys)
were appearing with completely black sprites. This led to numerous
situations where characters would ask, "WHY IS PUN PUN WEARING
BLACKFACE?"
Media
![image](https://github.com/user-attachments/assets/0ad92f9e-4102-43d2-8e42-f7c4320e6e03)
# Changelog
:cl:
- fix: Confiscated Pun Pun's blackface.
---
Resources/Prototypes/_Shitmed/Species/monkey.yml | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Resources/Prototypes/_Shitmed/Species/monkey.yml b/Resources/Prototypes/_Shitmed/Species/monkey.yml
index 280656c20d4..400db58094b 100644
--- a/Resources/Prototypes/_Shitmed/Species/monkey.yml
+++ b/Resources/Prototypes/_Shitmed/Species/monkey.yml
@@ -5,8 +5,7 @@
prototype: MobMonkey
sprites: MobMonkeySprites
dollPrototype: MobMonkeyDummy
- skinColoration: Hues
- defaultSkinTone: "#ffffff"
+ skinColoration: HumanToned
markingLimits: MobMonkeyMarkingLimits
- type: speciesBaseSprites
@@ -137,4 +136,4 @@
required: false
Chest:
points: 1
- required: false
\ No newline at end of file
+ required: false
From cd29b5ea88268d304201c3825a69196e27fcef2d Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 5 Jan 2025 19:24:17 +0000
Subject: [PATCH 22/22] Automatic Changelog Update (#1437)
---
Resources/Changelog/Changelog.yml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index f09f78a36fd..62d88d7f2c4 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9286,3 +9286,10 @@ Entries:
id: 6637
time: '2025-01-05T18:37:43.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1425
+- author: VMSolidus
+ changes:
+ - type: Fix
+ message: 'Confiscated Pun Pun''s blackface. '
+ id: 6638
+ time: '2025-01-05T19:21:08.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1437