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