From: Psychpsyo <60073468+Psychpsyo@users.noreply.github.com>
Date: Tue, 31 Oct 2023 20:39:12 +0000 (+0100)
Subject: Soapy Water & Edible Soap (#20364)
X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=6a18bdc023df332c769e4624ac9d71a830d1aea8;p=space-station-14.git
Soapy Water & Edible Soap (#20364)
* soap reagent and soapy water
* make soapy water recognizable
* Fix tile cleaning bug
CleanDecalsReaction was able to take more than the reactVolume it was given.
* make soapy water an evaporating reagent
* Tile reactions when mopping
* Fix indescribably soap flavor
* Adjust soap flavours
Soap and soapy water now taste clean and syndie soap tastes like punishment.
* Better soap numbers & DeleteOnSolutionEmpty
* Changed TrashOnEmpty to TrashOnSolutionEmpty
* Last TrashOnSolutionEmpty change
* Fix merged code not compiling
* Requested changes.
---
diff --git a/Content.Server/Chemistry/Components/DeleteOnSolutionEmptyComponent.cs b/Content.Server/Chemistry/Components/DeleteOnSolutionEmptyComponent.cs
new file mode 100644
index 0000000000..e53d10b55a
--- /dev/null
+++ b/Content.Server/Chemistry/Components/DeleteOnSolutionEmptyComponent.cs
@@ -0,0 +1,15 @@
+namespace Content.Server.Chemistry.Components.DeleteOnSolutionEmptyComponent
+{
+ ///
+ /// Component that removes an item when a specific solution in it becomes empty.
+ ///
+ [RegisterComponent]
+ public sealed partial class DeleteOnSolutionEmptyComponent : Component
+ {
+ ///
+ /// The name of the solution of which to check emptiness
+ ///
+ [DataField("solution")]
+ public string Solution = string.Empty;
+ }
+}
diff --git a/Content.Server/Chemistry/EntitySystems/DeleteOnSolutionEmptySystem.cs b/Content.Server/Chemistry/EntitySystems/DeleteOnSolutionEmptySystem.cs
new file mode 100644
index 0000000000..fd7933e66a
--- /dev/null
+++ b/Content.Server/Chemistry/EntitySystems/DeleteOnSolutionEmptySystem.cs
@@ -0,0 +1,38 @@
+using Content.Server.Chemistry.Components.DeleteOnSolutionEmptyComponent;
+using Content.Shared.Chemistry.Components.SolutionManager;
+using Content.Shared.Chemistry.EntitySystems;
+
+namespace Content.Server.Chemistry.EntitySystems.DeleteOnSolutionEmptySystem
+{
+ public sealed class DeleteOnSolutionEmptySystem : EntitySystem
+ {
+ [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnStartup);
+ SubscribeLocalEvent(OnSolutionChange);
+ }
+
+ public void OnStartup(EntityUid uid, DeleteOnSolutionEmptyComponent component, ComponentStartup args)
+ {
+ CheckSolutions(uid, component);
+ }
+
+ public void OnSolutionChange(EntityUid uid, DeleteOnSolutionEmptyComponent component, SolutionChangedEvent args)
+ {
+ CheckSolutions(uid, component);
+ }
+
+ public void CheckSolutions(EntityUid uid, DeleteOnSolutionEmptyComponent component)
+ {
+ if (!EntityManager.HasComponent(uid))
+ return;
+
+ if (_solutionContainerSystem.TryGetSolution(uid, component.Solution, out var solution))
+ if (solution.Volume <= 0)
+ EntityManager.QueueDeleteEntity(uid);
+ }
+ }
+}
diff --git a/Content.Server/Chemistry/TileReactions/CleanDecalsReaction.cs b/Content.Server/Chemistry/TileReactions/CleanDecalsReaction.cs
index b5d5862e6c..c23956760a 100644
--- a/Content.Server/Chemistry/TileReactions/CleanDecalsReaction.cs
+++ b/Content.Server/Chemistry/TileReactions/CleanDecalsReaction.cs
@@ -44,11 +44,11 @@ public sealed partial class CleanDecalsReaction : ITileReaction
if (!decal.Decal.Cleanable)
continue;
+ if (amount + CleanCost > reactVolume)
+ break;
+
decalSystem.RemoveDecal(tile.GridUid, decal.Index, decalGrid);
amount += CleanCost;
-
- if (amount > reactVolume)
- break;
}
return amount;
diff --git a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs
index facc39f146..7483199bc6 100644
--- a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs
+++ b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs
@@ -1,7 +1,6 @@
using Content.Server.Popups;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.EntitySystems;
-using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Content.Shared.Fluids;
using Content.Shared.Fluids.Components;
@@ -9,6 +8,7 @@ using Content.Shared.Interaction;
using Content.Shared.Timing;
using Content.Shared.Weapons.Melee;
using Robust.Server.GameObjects;
+using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -17,6 +17,7 @@ namespace Content.Server.Fluids.EntitySystems;
///
public sealed class AbsorbentSystem : SharedAbsorbentSystem
{
+ [Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly AudioSystem _audio = default!;
[Dependency] private readonly PopupSystem _popups = default!;
@@ -55,13 +56,13 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
var oldProgress = component.Progress.ShallowClone();
component.Progress.Clear();
- var water = solution.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagent);
+ var water = solution.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagents);
if (water > FixedPoint2.Zero)
{
- component.Progress[_prototype.Index(PuddleSystem.EvaporationReagent).SubstanceColor] = water.Float();
+ component.Progress[solution.GetColorWithOnly(_prototype, PuddleSystem.EvaporationReagents)] = water.Float();
}
- var otherColor = solution.GetColorWithout(_prototype, PuddleSystem.EvaporationReagent);
+ var otherColor = solution.GetColorWithout(_prototype, PuddleSystem.EvaporationReagents);
var other = (solution.Volume - water).Float();
if (other > 0f)
@@ -140,7 +141,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
// Remove the non-water reagents.
// Remove water on target
// Then do the transfer.
- var nonWater = absorberSoln.SplitSolutionWithout(component.PickupAmount, PuddleSystem.EvaporationReagent);
+ var nonWater = absorberSoln.SplitSolutionWithout(component.PickupAmount, PuddleSystem.EvaporationReagents);
_solutionContainerSystem.UpdateChemicals(used, absorberSoln, true);
if (nonWater.Volume == FixedPoint2.Zero && absorberSoln.AvailableVolume == FixedPoint2.Zero)
@@ -153,18 +154,16 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
component.PickupAmount :
absorberSoln.AvailableVolume;
- var water = refillableSolution.RemoveReagent(PuddleSystem.EvaporationReagent, transferAmount);
+ var water = refillableSolution.SplitSolutionWithOnly(transferAmount, PuddleSystem.EvaporationReagents);
_solutionContainerSystem.UpdateChemicals(target, refillableSolution);
- if (water == FixedPoint2.Zero && nonWater.Volume == FixedPoint2.Zero)
+ if (water.Volume == FixedPoint2.Zero && nonWater.Volume == FixedPoint2.Zero)
{
_popups.PopupEntity(Loc.GetString("mopping-system-target-container-empty-water", ("target", target)), user, user);
return false;
}
-
-
- if (water > 0 && !_solutionContainerSystem.TryAddReagent(used, absorberSoln, PuddleSystem.EvaporationReagent, water,
- out _))
+
+ if (water.Volume > 0 && !_solutionContainerSystem.TryAddSolution(used, absorberSoln, water))
{
_popups.PopupEntity(Loc.GetString("mopping-system-full", ("used", used)), used, user);
}
@@ -217,18 +216,18 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
if (!TryComp(target, out PuddleComponent? puddle))
return false;
- if (!_solutionSystem.TryGetSolution(target, puddle.SolutionName, out var puddleSolution) || puddleSolution.Volume <= 0)
+ if (!_solutionSystem.TryGetSolution(target, puddle.SolutionName, out var puddleSoln) || puddleSoln.Volume <= 0)
return false;
// Check if the puddle has any non-evaporative reagents
- if (_puddleSystem.CanFullyEvaporate(puddleSolution))
+ if (_puddleSystem.CanFullyEvaporate(puddleSoln))
{
_popups.PopupEntity(Loc.GetString("mopping-system-puddle-evaporate", ("target", target)), user, user);
return true;
}
// Check if we have any evaporative reagents on our absorber to transfer
- var available = absorberSoln.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagent);
+ var available = absorberSoln.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagents);
// No material
if (available == FixedPoint2.Zero)
@@ -240,14 +239,21 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
var transferMax = absorber.PickupAmount;
var transferAmount = available > transferMax ? transferMax : available;
- var split = puddleSolution.SplitSolutionWithout(transferAmount, PuddleSystem.EvaporationReagent);
+ var puddleSplit = puddleSoln.SplitSolutionWithout(transferAmount, PuddleSystem.EvaporationReagents);
+ var absorberSplit = absorberSoln.SplitSolutionWithOnly(puddleSplit.Volume, PuddleSystem.EvaporationReagents);
+
+ // Do tile reactions first
+ var coordinates = Transform(target).Coordinates;
+ if (_mapManager.TryGetGrid(coordinates.GetGridUid(EntityManager), out var mapGrid))
+ {
+ _puddleSystem.DoTileReactions(mapGrid.GetTileRef(coordinates), absorberSplit);
+ }
- absorberSoln.RemoveReagent(PuddleSystem.EvaporationReagent, split.Volume);
- puddleSolution.AddReagent(PuddleSystem.EvaporationReagent, split.Volume);
- absorberSoln.AddSolution(split, _prototype);
+ puddleSoln.AddSolution(absorberSplit, _prototype);
+ absorberSoln.AddSolution(puddleSplit, _prototype);
_solutionSystem.UpdateChemicals(used, absorberSoln);
- _solutionSystem.UpdateChemicals(target, puddleSolution);
+ _solutionSystem.UpdateChemicals(target, puddleSoln);
_audio.PlayPvs(absorber.PickupSound, target);
_useDelay.BeginDelay(used);
diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs
index 1392a23356..d0df5e0505 100644
--- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs
+++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs
@@ -11,7 +11,12 @@ public sealed partial class PuddleSystem
private static readonly TimeSpan EvaporationCooldown = TimeSpan.FromSeconds(1);
[ValidatePrototypeId]
- public const string EvaporationReagent = "Water";
+ private const string Water = "Water";
+
+ [ValidatePrototypeId]
+ private const string SoapyWater = "SoapyWater";
+
+ public static string[] EvaporationReagents = new[] { Water, SoapyWater };
private void OnEvaporationMapInit(EntityUid uid, EvaporationComponent component, MapInitEvent args)
{
@@ -25,7 +30,7 @@ public sealed partial class PuddleSystem
return;
}
- if (solution.ContainsPrototype(EvaporationReagent))
+ if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero)
{
var evaporation = AddComp(uid);
evaporation.NextTick = _timing.CurTime + EvaporationCooldown;
@@ -51,7 +56,7 @@ public sealed partial class PuddleSystem
continue;
var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds;
- _solutionContainerSystem.RemoveReagent(uid, puddleSolution, EvaporationReagent, reagentTick);
+ puddleSolution.SplitSolutionWithOnly(reagentTick, EvaporationReagents);
// Despawn if we're done
if (puddleSolution.Volume == FixedPoint2.Zero)
@@ -65,6 +70,6 @@ public sealed partial class PuddleSystem
public bool CanFullyEvaporate(Solution solution)
{
- return solution.Contents.Count == 1 && solution.ContainsPrototype(EvaporationReagent);
+ return solution.GetTotalPrototypeQuantity(EvaporationReagents) == solution.Volume;
}
}
diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs
index 886cb9eff1..9785fd8365 100644
--- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs
+++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs
@@ -373,7 +373,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
{
args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating"));
}
- else if (solution?.ContainsPrototype(EvaporationReagent) == true)
+ else if (solution?.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero)
{
args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating-partial"));
}
@@ -602,16 +602,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
if (tileReact)
{
// First, do all tile reactions
- for (var i = solution.Contents.Count - 1; i >= 0; i--)
- {
- var (reagent, quantity) = solution.Contents[i];
- var proto = _prototypeManager.Index(reagent.Prototype);
- var removed = proto.ReactionTile(tileRef, quantity);
- if (removed <= FixedPoint2.Zero)
- continue;
-
- solution.RemoveReagent(reagent, removed);
- }
+ DoTileReactions(tileRef, solution);
}
// Tile reactions used up everything.
@@ -660,6 +651,21 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
#endregion
+ public void DoTileReactions(TileRef tileRef, Solution solution)
+ {
+ for (var i = solution.Contents.Count - 1; i >= 0; i--)
+ {
+
+ var (reagent, quantity) = solution.Contents[i];
+ var proto = _prototypeManager.Index(reagent.Prototype);
+ var removed = proto.ReactionTile(tileRef, quantity);
+ if (removed <= FixedPoint2.Zero)
+ continue;
+
+ solution.RemoveReagent(reagent, removed);
+ }
+ }
+
///
/// Tries to get the relevant puddle entity for a tile.
///
diff --git a/Content.Server/Nutrition/Components/TrashOnEmptyComponent.cs b/Content.Server/Nutrition/Components/TrashOnSolutionEmptyComponent.cs
similarity index 86%
rename from Content.Server/Nutrition/Components/TrashOnEmptyComponent.cs
rename to Content.Server/Nutrition/Components/TrashOnSolutionEmptyComponent.cs
index b36bd172bf..4fac2a362b 100644
--- a/Content.Server/Nutrition/Components/TrashOnEmptyComponent.cs
+++ b/Content.Server/Nutrition/Components/TrashOnSolutionEmptyComponent.cs
@@ -5,7 +5,7 @@ namespace Content.Server.Nutrition.Components
/// Used for things like used ketchup packets or used syringes.
///
[RegisterComponent]
- public sealed partial class TrashOnEmptyComponent : Component
+ public sealed partial class TrashOnSolutionEmptyComponent : Component
{
///
/// The name of the solution of which to check emptiness
diff --git a/Content.Server/Nutrition/EntitySystems/TrashOnEmptySystem.cs b/Content.Server/Nutrition/EntitySystems/TrashOnSolutionEmptySystem.cs
similarity index 65%
rename from Content.Server/Nutrition/EntitySystems/TrashOnEmptySystem.cs
rename to Content.Server/Nutrition/EntitySystems/TrashOnSolutionEmptySystem.cs
index e702247900..22360b6492 100644
--- a/Content.Server/Nutrition/EntitySystems/TrashOnEmptySystem.cs
+++ b/Content.Server/Nutrition/EntitySystems/TrashOnSolutionEmptySystem.cs
@@ -1,4 +1,3 @@
-using Content.Server.Chemistry.EntitySystems;
using Content.Server.Nutrition.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Components.SolutionManager;
@@ -7,7 +6,7 @@ using Content.Shared.Tag;
namespace Content.Server.Nutrition.EntitySystems
{
- public sealed class TrashOnEmptySystem : EntitySystem
+ public sealed class TrashOnSolutionEmptySystem : EntitySystem
{
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
@@ -15,21 +14,21 @@ namespace Content.Server.Nutrition.EntitySystems
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnStartup);
- SubscribeLocalEvent(OnSolutionChange);
+ SubscribeLocalEvent(OnStartup);
+ SubscribeLocalEvent(OnSolutionChange);
}
- public void OnStartup(EntityUid uid, TrashOnEmptyComponent component, ComponentStartup args)
+ public void OnStartup(EntityUid uid, TrashOnSolutionEmptyComponent component, ComponentStartup args)
{
CheckSolutions(component);
}
- public void OnSolutionChange(EntityUid uid, TrashOnEmptyComponent component, SolutionChangedEvent args)
+ public void OnSolutionChange(EntityUid uid, TrashOnSolutionEmptyComponent component, SolutionChangedEvent args)
{
CheckSolutions(component);
}
- public void CheckSolutions(TrashOnEmptyComponent component)
+ public void CheckSolutions(TrashOnSolutionEmptyComponent component)
{
if (!EntityManager.HasComponent((component).Owner))
return;
@@ -38,7 +37,7 @@ namespace Content.Server.Nutrition.EntitySystems
UpdateTags(component, solution);
}
- public void UpdateTags(TrashOnEmptyComponent component, Solution solution)
+ public void UpdateTags(TrashOnSolutionEmptyComponent component, Solution solution)
{
if (solution.Volume <= 0)
{
diff --git a/Content.Shared/Chemistry/Components/Solution.cs b/Content.Shared/Chemistry/Components/Solution.cs
index 65fdcd62dd..d793d3f70c 100644
--- a/Content.Shared/Chemistry/Components/Solution.cs
+++ b/Content.Shared/Chemistry/Components/Solution.cs
@@ -289,12 +289,12 @@ namespace Content.Shared.Chemistry.Components
/// If you only want the volume of a single reagent, use
///
[Pure]
- public FixedPoint2 GetTotalPrototypeQuantity(string prototype)
+ public FixedPoint2 GetTotalPrototypeQuantity(params string[] prototypes)
{
var total = FixedPoint2.Zero;
foreach (var (reagent, quantity) in Contents)
{
- if (reagent.Prototype == prototype)
+ if (prototypes.Contains(reagent.Prototype))
total += quantity;
}
@@ -546,6 +546,34 @@ namespace Content.Shared.Chemistry.Components
return sol;
}
+ ///
+ /// Splits a solution without the specified reagent prototypes.
+ ///
+ public Solution SplitSolutionWithOnly(FixedPoint2 toTake, params string[] includedPrototypes)
+ {
+ // First remove the non-included prototypes
+ List excluded = new();
+ for (var i = Contents.Count - 1; i >= 0; i--)
+ {
+ if (includedPrototypes.Contains(Contents[i].Reagent.Prototype))
+ continue;
+
+ excluded.Add(Contents[i]);
+ RemoveReagent(Contents[i]);
+ }
+
+ // Then split the solution
+ var sol = SplitSolution(toTake);
+
+ // Then re-add the excluded reagents to the original solution.
+ foreach (var reagent in excluded)
+ {
+ AddReagent(reagent);
+ }
+
+ return sol;
+ }
+
public Solution SplitSolution(FixedPoint2 toTake)
{
if (toTake <= FixedPoint2.Zero)
@@ -756,6 +784,44 @@ namespace Content.Shared.Chemistry.Components
return GetColorWithout(protoMan);
}
+ public Color GetColorWithOnly(IPrototypeManager? protoMan, params string[] included)
+ {
+ if (Volume == FixedPoint2.Zero)
+ {
+ return Color.Transparent;
+ }
+
+ IoCManager.Resolve(ref protoMan);
+
+ Color mixColor = default;
+ var runningTotalQuantity = FixedPoint2.New(0);
+ bool first = true;
+
+ foreach (var (reagent, quantity) in Contents)
+ {
+ if (!included.Contains(reagent.Prototype))
+ continue;
+
+ runningTotalQuantity += quantity;
+
+ if (!protoMan.TryIndex(reagent.Prototype, out ReagentPrototype? proto))
+ {
+ continue;
+ }
+
+ if (first)
+ {
+ first = false;
+ mixColor = proto.SubstanceColor;
+ continue;
+ }
+
+ var interpolateValue = quantity.Float() / runningTotalQuantity.Float();
+ mixColor = Color.InterpolateBetween(mixColor, proto.SubstanceColor, interpolateValue);
+ }
+ return mixColor;
+ }
+
#region Enumeration
public IEnumerator GetEnumerator()
diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl
index 2a0c39a0e4..a17b9019d5 100644
--- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl
+++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl
@@ -43,6 +43,7 @@ flavor-base-piquant = piquant
flavor-base-sharp = sharp
flavor-base-syrupy = syrupy
flavor-base-spaceshroom = mysterious
+flavor-base-clean = clean
# lmao
flavor-base-terrible = terrible
@@ -213,3 +214,4 @@ flavor-complex-carpet = like a handful of fur
flavor-complex-bee = unbeelievable
flavor-complex-sax = like jazz
flavor-complex-bottledlightning = like lightning in a bottle
+flavor-complex-punishment = like punishment
diff --git a/Resources/Locale/en-US/reagents/meta/cleaning.ftl b/Resources/Locale/en-US/reagents/meta/cleaning.ftl
index 4c1ec87ddd..e770594956 100644
--- a/Resources/Locale/en-US/reagents/meta/cleaning.ftl
+++ b/Resources/Locale/en-US/reagents/meta/cleaning.ftl
@@ -4,6 +4,12 @@ reagent-desc-bleach = Heavy duty cleaner that can clean tiles the same as Space
reagent-name-space-cleaner = space cleaner
reagent-desc-space-cleaner = This is able to clean almost all surfaces of almost anything that may dirty them. The janitor is likely to appreciate refills.
+reagent-name-soap = soap
+reagent-desc-soap = Soap can be used to make soapy water.
+
+reagent-name-soapy-water = soapy water
+reagent-desc-soapy-water = It's just soap and water. Good for cleaning gunk off of surfaces and also slippier than regular water.
+
reagent-name-space-lube = space lube
reagent-desc-space-lube = Space Lube is a high performance lubricant intended for maintenance of extremely complex mechanical equipment (and certainly not used to make people slip).
diff --git a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl
index 9093e54810..14e6e18239 100644
--- a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl
+++ b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl
@@ -63,6 +63,7 @@ reagent-physical-desc-sticky = sticky
reagent-physical-desc-bubbly = bubbly
reagent-physical-desc-rocky = rocky
reagent-physical-desc-lemony-fresh = lemony fresh
+reagent-physical-desc-soapy = soapy
reagent-physical-desc-crisp = crisp
reagent-physical-desc-citric = citric
reagent-physical-desc-acidic = acidic
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/soap.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/soap.yml
index e06a2108d8..d3283522b2 100644
--- a/Resources/Prototypes/Entities/Markers/Spawners/Random/soap.yml
+++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/soap.yml
@@ -7,7 +7,7 @@
layers:
- state: red
- sprite: Objects/Specific/Janitorial/soap.rsi
- state: soap
+ state: soap-4
- type: RandomSpawner
prototypes:
- Soap
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml
index 2fa487fa2c..d6a0570e28 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml
@@ -43,7 +43,7 @@
qualities:
- Rolling
speed: 0.75 # not as good as a rolling pin but does the job
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml
index 11228d0ed6..3595d93ea0 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml
@@ -54,7 +54,7 @@
speed: 0.25 # its small so takes longer to roll the entire dough flat
- type: ItemCooldown
- type: SpaceGarbage
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: PhysicalComposition
materialComposition:
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml
index f9e41054f8..828ad3cca6 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml
@@ -203,7 +203,7 @@
- type: SolutionContainerVisuals
maxFillLevels: 4
fillBaseName: icon-
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: entity
@@ -221,7 +221,7 @@
- type: Sprite
sprite: Objects/Consumable/Drinks/cafe_latte.rsi
- type: Appearance
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: entity
@@ -246,7 +246,7 @@
- type: SolutionContainerVisuals
maxFillLevels: 4
fillBaseName: icon-
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: entity
@@ -271,7 +271,7 @@
- type: SolutionContainerVisuals
maxFillLevels: 4
fillBaseName: icon-
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: entity
@@ -291,7 +291,7 @@
state: icon
- type: Item
sprite: Objects/Consumable/Drinks/lean.rsi
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: entity
@@ -317,5 +317,5 @@
- type: SolutionContainerVisuals
maxFillLevels: 1
fillBaseName: icon-
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml
index c3d51b9d7e..cc8aba31e9 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml
@@ -31,7 +31,7 @@
reagents:
- ReagentId: Water
Quantity: 50
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml
index 03118bbf28..69e96e2981 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml
@@ -13,7 +13,7 @@
sprite: Objects/Consumable/Food/condiments.rsi
- type: Icon
sprite: Objects/Consumable/Food/condiments.rsi
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: food
- type: SpaceGarbage
- type: StaticPrice
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml
index 166a73e43e..0acb6ac0ec 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml
@@ -32,7 +32,7 @@
damageContainer: Inorganic
- type: Spillable
solution: food
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: food
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml
index 336a2a963f..07ca776207 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml
@@ -9,7 +9,14 @@
- Soap
- type: Sprite
sprite: Objects/Specific/Janitorial/soap.rsi
- state: soap
+ layers:
+ - state: soap-4
+ map: ["enum.SolutionContainerLayers.Fill"]
+ - type: SolutionContainerVisuals
+ maxFillLevels: 4
+ fillBaseName: soap-
+ changeColor: false
+ - type: Appearance
- type: Item
sprite: Objects/Specific/Janitorial/soap.rsi
- type: Slippery
@@ -37,6 +44,29 @@
density: 10
mask:
- ItemMask
+ - type: SolutionContainerManager
+ solutions:
+ soap:
+ maxVol: 50
+ reagents:
+ - ReagentId: SoapReagent
+ Quantity: 50
+ - type: SolutionTransfer
+ transferAmount: 10
+ minTransferAmount: 1
+ maxTransferAmount: 25
+ canReceive: false
+ canChangeTransferAmount: true
+ - type: DrainableSolution
+ solution: soap
+ - type: DeleteOnSolutionEmpty
+ solution: soap
+ - type: FlavorProfile
+ flavors:
+ - clean
+ - type: Food
+ solution: soap
+
- type: entity
name: soap
@@ -45,9 +75,20 @@
description: A Nanotrasen brand bar of soap. Smells of plasma.
components:
- type: Sprite
- state: nt
+ layers:
+ - state: nt-4
+ map: ["enum.SolutionContainerLayers.Fill"]
+ - type: SolutionContainerVisuals
+ fillBaseName: nt-
- type: Item
heldPrefix: nt
+ - type: SolutionContainerManager
+ solutions:
+ soap:
+ maxVol: 100
+ reagents:
+ - ReagentId: SoapReagent
+ Quantity: 100
- type: entity
name: soap
@@ -56,7 +97,11 @@
description: A deluxe Waffle Co. brand bar of soap. Smells of condoms.
components:
- type: Sprite
- state: deluxe
+ layers:
+ - state: deluxe-4
+ map: ["enum.SolutionContainerLayers.Fill"]
+ - type: SolutionContainerVisuals
+ fillBaseName: deluxe-
- type: Item
heldPrefix: deluxe
@@ -67,12 +112,20 @@
description: An untrustworthy bar of soap. Smells of fear.
components:
- type: Sprite
- state: syndie
+ layers:
+ - state: syndie-4
+ map: ["enum.SolutionContainerLayers.Fill"]
+ - type: SolutionContainerVisuals
+ fillBaseName: syndie-
- type: Slippery
paralyzeTime: 5
launchForwardsMultiplier: 2.5
- type: Item
heldPrefix: syndie
+ - type: FlavorProfile
+ flavors:
+ - clean
+ - punishment
- type: entity
name: soap
@@ -81,9 +134,20 @@
description: A homemade bar of soap. Smells of... well....
components:
- type: Sprite
- state: gibs
+ layers:
+ - state: gibs-4
+ map: ["enum.SolutionContainerLayers.Fill"]
+ - type: SolutionContainerVisuals
+ fillBaseName: gibs-
+ - type: Slippery
+ paralyzeTime: 2
+ - type: StepTrigger
- type: Item
heldPrefix: gibs
+ - type: FlavorProfile
+ flavors:
+ - clean
+ - meaty
- type: entity
name: omega soap
@@ -92,9 +156,20 @@
description: The most advanced soap known to mankind. Smells of bluespace.
components:
- type: Sprite
- state: omega
+ layers:
+ - state: omega-4
+ map: ["enum.SolutionContainerLayers.Fill"]
+ - type: SolutionContainerVisuals
+ fillBaseName: omega-
- type: Slippery
paralyzeTime: 7
launchForwardsMultiplier: 3
- type: Item
heldPrefix: omega
+ - type: SolutionContainerManager
+ solutions:
+ soap:
+ maxVol: 240 #In the Greek alphabet, Omega is the 24th letter
+ reagents:
+ - ReagentId: SoapReagent
+ Quantity: 240
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml
index f88dc4f6b2..ed55afea1d 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml
@@ -30,7 +30,7 @@
sprayVelocity: 2
spraySound:
path: /Audio/Effects/spray2.ogg
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: spray
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml
index 709bc751a4..47d3c77024 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml
@@ -125,7 +125,7 @@
- type: SpaceGarbage
- type: StaticPrice
price: 75 # These are limited supply items.
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: pen
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml
index b869a2008f..59bf0927aa 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml
@@ -56,7 +56,7 @@
damage:
types:
Blunt: 0
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: drink
- type: StaticPrice
price: 0
diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
index f3ed4f2284..d8924895df 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
@@ -330,7 +330,7 @@
solution: injector
- type: Spillable
solution: injector
- - type: TrashOnEmpty
+ - type: TrashOnSolutionEmpty
solution: injector
- type: Appearance
- type: SolutionContainerVisuals
diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml
index ba8f2c3476..c4c518ad89 100644
--- a/Resources/Prototypes/Flavors/flavors.yml
+++ b/Resources/Prototypes/Flavors/flavors.yml
@@ -169,6 +169,11 @@
flavorType: Base
description: flavor-base-syrupy
+- type: flavor
+ id: clean
+ flavorType: Base
+ description: flavor-base-clean
+
- type: flavor
id: nothing
flavorType: Complex
@@ -838,7 +843,7 @@
id: spaceshroomcooked
flavorType: Complex
description: flavor-complex-spaceshroom-cooked
-
+
- type: flavor
id: lostfriendship
flavorType: Complex
@@ -847,4 +852,9 @@
- type: flavor
id: pumpkin
flavorType: Complex
- description: flavor-complex-pumpkin
\ No newline at end of file
+ description: flavor-complex-pumpkin
+
+- type: flavor
+ id: punishment
+ flavorType: Complex
+ description: flavor-complex-punishment
diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml
index c1f8c2b352..e4ea12307d 100644
--- a/Resources/Prototypes/Reagents/cleaning.yml
+++ b/Resources/Prototypes/Reagents/cleaning.yml
@@ -38,6 +38,50 @@
- !type:CleanTileReaction {}
- !type:CleanDecalsReaction {}
+- type: reagent
+ id: SoapReagent
+ name: reagent-name-soap
+ desc: reagent-desc-soap
+ physicalDesc: reagent-physical-desc-soapy
+ flavor: clean
+ color: "#c8dfc9"
+ recognizable: true
+ boilingPoint: 100.0
+ meltingPoint: 60.0
+ metabolisms:
+ Food:
+ effects:
+ - !type:ChemVomit
+ Drink:
+ effects:
+ - !type:ChemVomit
+
+- type: reagent
+ id: SoapyWater
+ parent: Water
+ name: reagent-name-soapy-water
+ desc: reagent-desc-soapy-water
+ physicalDesc: reagent-physical-desc-soapy
+ flavor: clean
+ color: "#9ec8dc"
+ recognizable: true
+ metabolisms:
+ Drink:
+ effects:
+ - !type:SatiateThirst
+ factor: 3
+ - !type:ChemVomit
+ thirstAmount: -10.0
+ hungerAmount: -10.0
+ plantMetabolism:
+ - !type:PlantAdjustWater
+ amount: .8
+ tileReactions:
+ - !type:CleanDecalsReaction
+ cleanCost: 5
+ - !type:ExtinguishTileReaction { }
+ - !type:SpillIfPuddlePresentTileReaction { }
+
- type: reagent
id: SpaceLube
name: reagent-name-space-lube
diff --git a/Resources/Prototypes/Recipes/Reactions/cleaning.yml b/Resources/Prototypes/Recipes/Reactions/cleaning.yml
index 1c68aeb2e3..b8cda27a8b 100644
--- a/Resources/Prototypes/Recipes/Reactions/cleaning.yml
+++ b/Resources/Prototypes/Recipes/Reactions/cleaning.yml
@@ -20,6 +20,16 @@
products:
SpaceCleaner: 2
+- type: reaction
+ id: SoapyWater
+ reactants:
+ Water:
+ amount: 3
+ SoapReagent:
+ amount: 1
+ products:
+ SoapyWater: 4
+
- type: reaction
id: SpaceLube
impact: Medium
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-1.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-1.png
new file mode 100644
index 0000000000..74e3c29d22
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-1.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-2.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-2.png
new file mode 100644
index 0000000000..cf2eded81c
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-2.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-3.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-3.png
new file mode 100644
index 0000000000..4116fb276f
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-3.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-4.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-4.png
new file mode 100644
index 0000000000..a67f6e50c7
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe-4.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe.png
deleted file mode 100644
index f5e0a9c951..0000000000
Binary files a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/deluxe.png and /dev/null differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-1.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-1.png
new file mode 100644
index 0000000000..1afa3da7c5
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-1.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-2.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-2.png
new file mode 100644
index 0000000000..782c835f84
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-2.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-3.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-3.png
new file mode 100644
index 0000000000..8de6e87bab
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-3.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-4.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-4.png
new file mode 100644
index 0000000000..5347d4d70a
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs-4.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs.png
deleted file mode 100644
index 5640e0e836..0000000000
Binary files a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/gibs.png and /dev/null differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json
index c6cd1086d7..1b0c2eb436 100644
--- a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json
+++ b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json
@@ -8,22 +8,76 @@
},
"states": [
{
- "name": "soap"
+ "name": "soap-1"
},
{
- "name": "deluxe"
+ "name": "soap-2"
},
{
- "name": "gibs"
+ "name": "soap-3"
},
{
- "name": "nt"
+ "name": "soap-4"
},
{
- "name": "omega"
+ "name": "deluxe-1"
},
{
- "name": "syndie"
+ "name": "deluxe-2"
+ },
+ {
+ "name": "deluxe-3"
+ },
+ {
+ "name": "deluxe-4"
+ },
+ {
+ "name": "gibs-1"
+ },
+ {
+ "name": "gibs-2"
+ },
+ {
+ "name": "gibs-3"
+ },
+ {
+ "name": "gibs-4"
+ },
+ {
+ "name": "nt-1"
+ },
+ {
+ "name": "nt-2"
+ },
+ {
+ "name": "nt-3"
+ },
+ {
+ "name": "nt-4"
+ },
+ {
+ "name": "omega-1"
+ },
+ {
+ "name": "omega-2"
+ },
+ {
+ "name": "omega-3"
+ },
+ {
+ "name": "omega-4"
+ },
+ {
+ "name": "syndie-1"
+ },
+ {
+ "name": "syndie-2"
+ },
+ {
+ "name": "syndie-3"
+ },
+ {
+ "name": "syndie-4"
},
{
"name": "inhand-left",
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-1.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-1.png
new file mode 100644
index 0000000000..a75d5dffab
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-1.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-2.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-2.png
new file mode 100644
index 0000000000..515577e087
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-2.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-3.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-3.png
new file mode 100644
index 0000000000..3846f70fe3
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-3.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-4.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-4.png
new file mode 100644
index 0000000000..bdce46f675
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-4.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt.png
deleted file mode 100644
index 1f02e35820..0000000000
Binary files a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt.png and /dev/null differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-1.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-1.png
new file mode 100644
index 0000000000..173c995dee
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-1.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-2.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-2.png
new file mode 100644
index 0000000000..7f94298ce6
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-2.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-3.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-3.png
new file mode 100644
index 0000000000..90d8c0a0ca
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-3.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-4.png
similarity index 100%
rename from Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega.png
rename to Resources/Textures/Objects/Specific/Janitorial/soap.rsi/omega-4.png
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-1.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-1.png
new file mode 100644
index 0000000000..355354a494
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-1.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-2.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-2.png
new file mode 100644
index 0000000000..4f3dab8298
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-2.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-3.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-3.png
new file mode 100644
index 0000000000..cc0c26f4ca
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-3.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-4.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-4.png
new file mode 100644
index 0000000000..c97059af86
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap-4.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap.png
deleted file mode 100644
index 3f82c55990..0000000000
Binary files a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap.png and /dev/null differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-1.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-1.png
new file mode 100644
index 0000000000..cdb20008cc
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-1.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-2.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-2.png
new file mode 100644
index 0000000000..d769bffc81
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-2.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-3.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-3.png
new file mode 100644
index 0000000000..b1c4349685
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-3.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-4.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-4.png
new file mode 100644
index 0000000000..a254bef8c3
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie-4.png differ
diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie.png
deleted file mode 100644
index 1886ea2481..0000000000
Binary files a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/syndie.png and /dev/null differ