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