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.
@@ -0,0 +1,15 @@
|
|||||||
|
namespace Content.Server.Chemistry.Components.DeleteOnSolutionEmptyComponent
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Component that removes an item when a specific solution in it becomes empty.
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed partial class DeleteOnSolutionEmptyComponent : Component
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the solution of which to check emptiness
|
||||||
|
/// </summary>
|
||||||
|
[DataField("solution")]
|
||||||
|
public string Solution = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<DeleteOnSolutionEmptyComponent, ComponentStartup>(OnStartup);
|
||||||
|
SubscribeLocalEvent<DeleteOnSolutionEmptyComponent, SolutionChangedEvent>(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<SolutionContainerManagerComponent>(uid))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_solutionContainerSystem.TryGetSolution(uid, component.Solution, out var solution))
|
||||||
|
if (solution.Volume <= 0)
|
||||||
|
EntityManager.QueueDeleteEntity(uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,11 +44,11 @@ public sealed partial class CleanDecalsReaction : ITileReaction
|
|||||||
if (!decal.Decal.Cleanable)
|
if (!decal.Decal.Cleanable)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (amount + CleanCost > reactVolume)
|
||||||
|
break;
|
||||||
|
|
||||||
decalSystem.RemoveDecal(tile.GridUid, decal.Index, decalGrid);
|
decalSystem.RemoveDecal(tile.GridUid, decal.Index, decalGrid);
|
||||||
amount += CleanCost;
|
amount += CleanCost;
|
||||||
|
|
||||||
if (amount > reactVolume)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return amount;
|
return amount;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Content.Server.Popups;
|
using Content.Server.Popups;
|
||||||
using Content.Shared.Chemistry.Components;
|
using Content.Shared.Chemistry.Components;
|
||||||
using Content.Shared.Chemistry.EntitySystems;
|
using Content.Shared.Chemistry.EntitySystems;
|
||||||
using Content.Shared.Chemistry.Reagent;
|
|
||||||
using Content.Shared.FixedPoint;
|
using Content.Shared.FixedPoint;
|
||||||
using Content.Shared.Fluids;
|
using Content.Shared.Fluids;
|
||||||
using Content.Shared.Fluids.Components;
|
using Content.Shared.Fluids.Components;
|
||||||
@@ -9,6 +8,7 @@ using Content.Shared.Interaction;
|
|||||||
using Content.Shared.Timing;
|
using Content.Shared.Timing;
|
||||||
using Content.Shared.Weapons.Melee;
|
using Content.Shared.Weapons.Melee;
|
||||||
using Robust.Server.GameObjects;
|
using Robust.Server.GameObjects;
|
||||||
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
@@ -17,6 +17,7 @@ namespace Content.Server.Fluids.EntitySystems;
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public sealed class AbsorbentSystem : SharedAbsorbentSystem
|
public sealed class AbsorbentSystem : SharedAbsorbentSystem
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||||
[Dependency] private readonly AudioSystem _audio = default!;
|
[Dependency] private readonly AudioSystem _audio = default!;
|
||||||
[Dependency] private readonly PopupSystem _popups = default!;
|
[Dependency] private readonly PopupSystem _popups = default!;
|
||||||
@@ -55,13 +56,13 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
|
|||||||
var oldProgress = component.Progress.ShallowClone();
|
var oldProgress = component.Progress.ShallowClone();
|
||||||
component.Progress.Clear();
|
component.Progress.Clear();
|
||||||
|
|
||||||
var water = solution.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagent);
|
var water = solution.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagents);
|
||||||
if (water > FixedPoint2.Zero)
|
if (water > FixedPoint2.Zero)
|
||||||
{
|
{
|
||||||
component.Progress[_prototype.Index<ReagentPrototype>(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();
|
var other = (solution.Volume - water).Float();
|
||||||
|
|
||||||
if (other > 0f)
|
if (other > 0f)
|
||||||
@@ -140,7 +141,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
|
|||||||
// Remove the non-water reagents.
|
// Remove the non-water reagents.
|
||||||
// Remove water on target
|
// Remove water on target
|
||||||
// Then do the transfer.
|
// 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);
|
_solutionContainerSystem.UpdateChemicals(used, absorberSoln, true);
|
||||||
|
|
||||||
if (nonWater.Volume == FixedPoint2.Zero && absorberSoln.AvailableVolume == FixedPoint2.Zero)
|
if (nonWater.Volume == FixedPoint2.Zero && absorberSoln.AvailableVolume == FixedPoint2.Zero)
|
||||||
@@ -153,18 +154,16 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
|
|||||||
component.PickupAmount :
|
component.PickupAmount :
|
||||||
absorberSoln.AvailableVolume;
|
absorberSoln.AvailableVolume;
|
||||||
|
|
||||||
var water = refillableSolution.RemoveReagent(PuddleSystem.EvaporationReagent, transferAmount);
|
var water = refillableSolution.SplitSolutionWithOnly(transferAmount, PuddleSystem.EvaporationReagents);
|
||||||
_solutionContainerSystem.UpdateChemicals(target, refillableSolution);
|
_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);
|
_popups.PopupEntity(Loc.GetString("mopping-system-target-container-empty-water", ("target", target)), user, user);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (water.Volume > 0 && !_solutionContainerSystem.TryAddSolution(used, absorberSoln, water))
|
||||||
if (water > 0 && !_solutionContainerSystem.TryAddReagent(used, absorberSoln, PuddleSystem.EvaporationReagent, water,
|
|
||||||
out _))
|
|
||||||
{
|
{
|
||||||
_popups.PopupEntity(Loc.GetString("mopping-system-full", ("used", used)), used, user);
|
_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))
|
if (!TryComp(target, out PuddleComponent? puddle))
|
||||||
return false;
|
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;
|
return false;
|
||||||
|
|
||||||
// Check if the puddle has any non-evaporative reagents
|
// 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);
|
_popups.PopupEntity(Loc.GetString("mopping-system-puddle-evaporate", ("target", target)), user, user);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we have any evaporative reagents on our absorber to transfer
|
// 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
|
// No material
|
||||||
if (available == FixedPoint2.Zero)
|
if (available == FixedPoint2.Zero)
|
||||||
@@ -240,14 +239,21 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem
|
|||||||
var transferMax = absorber.PickupAmount;
|
var transferMax = absorber.PickupAmount;
|
||||||
var transferAmount = available > transferMax ? transferMax : available;
|
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);
|
||||||
|
|
||||||
absorberSoln.RemoveReagent(PuddleSystem.EvaporationReagent, split.Volume);
|
// Do tile reactions first
|
||||||
puddleSolution.AddReagent(PuddleSystem.EvaporationReagent, split.Volume);
|
var coordinates = Transform(target).Coordinates;
|
||||||
absorberSoln.AddSolution(split, _prototype);
|
if (_mapManager.TryGetGrid(coordinates.GetGridUid(EntityManager), out var mapGrid))
|
||||||
|
{
|
||||||
|
_puddleSystem.DoTileReactions(mapGrid.GetTileRef(coordinates), absorberSplit);
|
||||||
|
}
|
||||||
|
|
||||||
|
puddleSoln.AddSolution(absorberSplit, _prototype);
|
||||||
|
absorberSoln.AddSolution(puddleSplit, _prototype);
|
||||||
|
|
||||||
_solutionSystem.UpdateChemicals(used, absorberSoln);
|
_solutionSystem.UpdateChemicals(used, absorberSoln);
|
||||||
_solutionSystem.UpdateChemicals(target, puddleSolution);
|
_solutionSystem.UpdateChemicals(target, puddleSoln);
|
||||||
_audio.PlayPvs(absorber.PickupSound, target);
|
_audio.PlayPvs(absorber.PickupSound, target);
|
||||||
_useDelay.BeginDelay(used);
|
_useDelay.BeginDelay(used);
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,12 @@ public sealed partial class PuddleSystem
|
|||||||
private static readonly TimeSpan EvaporationCooldown = TimeSpan.FromSeconds(1);
|
private static readonly TimeSpan EvaporationCooldown = TimeSpan.FromSeconds(1);
|
||||||
|
|
||||||
[ValidatePrototypeId<ReagentPrototype>]
|
[ValidatePrototypeId<ReagentPrototype>]
|
||||||
public const string EvaporationReagent = "Water";
|
private const string Water = "Water";
|
||||||
|
|
||||||
|
[ValidatePrototypeId<ReagentPrototype>]
|
||||||
|
private const string SoapyWater = "SoapyWater";
|
||||||
|
|
||||||
|
public static string[] EvaporationReagents = new[] { Water, SoapyWater };
|
||||||
|
|
||||||
private void OnEvaporationMapInit(EntityUid uid, EvaporationComponent component, MapInitEvent args)
|
private void OnEvaporationMapInit(EntityUid uid, EvaporationComponent component, MapInitEvent args)
|
||||||
{
|
{
|
||||||
@@ -25,7 +30,7 @@ public sealed partial class PuddleSystem
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (solution.ContainsPrototype(EvaporationReagent))
|
if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero)
|
||||||
{
|
{
|
||||||
var evaporation = AddComp<EvaporationComponent>(uid);
|
var evaporation = AddComp<EvaporationComponent>(uid);
|
||||||
evaporation.NextTick = _timing.CurTime + EvaporationCooldown;
|
evaporation.NextTick = _timing.CurTime + EvaporationCooldown;
|
||||||
@@ -51,7 +56,7 @@ public sealed partial class PuddleSystem
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds;
|
var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds;
|
||||||
_solutionContainerSystem.RemoveReagent(uid, puddleSolution, EvaporationReagent, reagentTick);
|
puddleSolution.SplitSolutionWithOnly(reagentTick, EvaporationReagents);
|
||||||
|
|
||||||
// Despawn if we're done
|
// Despawn if we're done
|
||||||
if (puddleSolution.Volume == FixedPoint2.Zero)
|
if (puddleSolution.Volume == FixedPoint2.Zero)
|
||||||
@@ -65,6 +70,6 @@ public sealed partial class PuddleSystem
|
|||||||
|
|
||||||
public bool CanFullyEvaporate(Solution solution)
|
public bool CanFullyEvaporate(Solution solution)
|
||||||
{
|
{
|
||||||
return solution.Contents.Count == 1 && solution.ContainsPrototype(EvaporationReagent);
|
return solution.GetTotalPrototypeQuantity(EvaporationReagents) == solution.Volume;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -373,7 +373,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
|
|||||||
{
|
{
|
||||||
args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating"));
|
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"));
|
args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating-partial"));
|
||||||
}
|
}
|
||||||
@@ -602,16 +602,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
|
|||||||
if (tileReact)
|
if (tileReact)
|
||||||
{
|
{
|
||||||
// First, do all tile reactions
|
// First, do all tile reactions
|
||||||
for (var i = solution.Contents.Count - 1; i >= 0; i--)
|
DoTileReactions(tileRef, solution);
|
||||||
{
|
|
||||||
var (reagent, quantity) = solution.Contents[i];
|
|
||||||
var proto = _prototypeManager.Index<ReagentPrototype>(reagent.Prototype);
|
|
||||||
var removed = proto.ReactionTile(tileRef, quantity);
|
|
||||||
if (removed <= FixedPoint2.Zero)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
solution.RemoveReagent(reagent, removed);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tile reactions used up everything.
|
// Tile reactions used up everything.
|
||||||
@@ -660,6 +651,21 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
|
|||||||
|
|
||||||
#endregion
|
#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<ReagentPrototype>(reagent.Prototype);
|
||||||
|
var removed = proto.ReactionTile(tileRef, quantity);
|
||||||
|
if (removed <= FixedPoint2.Zero)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
solution.RemoveReagent(reagent, removed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to get the relevant puddle entity for a tile.
|
/// Tries to get the relevant puddle entity for a tile.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace Content.Server.Nutrition.Components
|
|||||||
/// Used for things like used ketchup packets or used syringes.
|
/// Used for things like used ketchup packets or used syringes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
public sealed partial class TrashOnEmptyComponent : Component
|
public sealed partial class TrashOnSolutionEmptyComponent : Component
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The name of the solution of which to check emptiness
|
/// The name of the solution of which to check emptiness
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
using Content.Server.Chemistry.EntitySystems;
|
|
||||||
using Content.Server.Nutrition.Components;
|
using Content.Server.Nutrition.Components;
|
||||||
using Content.Shared.Chemistry.Components;
|
using Content.Shared.Chemistry.Components;
|
||||||
using Content.Shared.Chemistry.Components.SolutionManager;
|
using Content.Shared.Chemistry.Components.SolutionManager;
|
||||||
@@ -7,7 +6,7 @@ using Content.Shared.Tag;
|
|||||||
|
|
||||||
namespace Content.Server.Nutrition.EntitySystems
|
namespace Content.Server.Nutrition.EntitySystems
|
||||||
{
|
{
|
||||||
public sealed class TrashOnEmptySystem : EntitySystem
|
public sealed class TrashOnSolutionEmptySystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
|
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
|
||||||
[Dependency] private readonly TagSystem _tagSystem = default!;
|
[Dependency] private readonly TagSystem _tagSystem = default!;
|
||||||
@@ -15,21 +14,21 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeLocalEvent<TrashOnEmptyComponent, ComponentStartup>(OnStartup);
|
SubscribeLocalEvent<TrashOnSolutionEmptyComponent, ComponentStartup>(OnStartup);
|
||||||
SubscribeLocalEvent<TrashOnEmptyComponent, SolutionChangedEvent>(OnSolutionChange);
|
SubscribeLocalEvent<TrashOnSolutionEmptyComponent, SolutionChangedEvent>(OnSolutionChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnStartup(EntityUid uid, TrashOnEmptyComponent component, ComponentStartup args)
|
public void OnStartup(EntityUid uid, TrashOnSolutionEmptyComponent component, ComponentStartup args)
|
||||||
{
|
{
|
||||||
CheckSolutions(component);
|
CheckSolutions(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnSolutionChange(EntityUid uid, TrashOnEmptyComponent component, SolutionChangedEvent args)
|
public void OnSolutionChange(EntityUid uid, TrashOnSolutionEmptyComponent component, SolutionChangedEvent args)
|
||||||
{
|
{
|
||||||
CheckSolutions(component);
|
CheckSolutions(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CheckSolutions(TrashOnEmptyComponent component)
|
public void CheckSolutions(TrashOnSolutionEmptyComponent component)
|
||||||
{
|
{
|
||||||
if (!EntityManager.HasComponent<SolutionContainerManagerComponent>((component).Owner))
|
if (!EntityManager.HasComponent<SolutionContainerManagerComponent>((component).Owner))
|
||||||
return;
|
return;
|
||||||
@@ -38,7 +37,7 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
UpdateTags(component, solution);
|
UpdateTags(component, solution);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateTags(TrashOnEmptyComponent component, Solution solution)
|
public void UpdateTags(TrashOnSolutionEmptyComponent component, Solution solution)
|
||||||
{
|
{
|
||||||
if (solution.Volume <= 0)
|
if (solution.Volume <= 0)
|
||||||
{
|
{
|
||||||
@@ -289,12 +289,12 @@ namespace Content.Shared.Chemistry.Components
|
|||||||
/// If you only want the volume of a single reagent, use <see cref="GetReagentQuantity"/>
|
/// If you only want the volume of a single reagent, use <see cref="GetReagentQuantity"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Pure]
|
[Pure]
|
||||||
public FixedPoint2 GetTotalPrototypeQuantity(string prototype)
|
public FixedPoint2 GetTotalPrototypeQuantity(params string[] prototypes)
|
||||||
{
|
{
|
||||||
var total = FixedPoint2.Zero;
|
var total = FixedPoint2.Zero;
|
||||||
foreach (var (reagent, quantity) in Contents)
|
foreach (var (reagent, quantity) in Contents)
|
||||||
{
|
{
|
||||||
if (reagent.Prototype == prototype)
|
if (prototypes.Contains(reagent.Prototype))
|
||||||
total += quantity;
|
total += quantity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,6 +546,34 @@ namespace Content.Shared.Chemistry.Components
|
|||||||
return sol;
|
return sol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Splits a solution without the specified reagent prototypes.
|
||||||
|
/// </summary>
|
||||||
|
public Solution SplitSolutionWithOnly(FixedPoint2 toTake, params string[] includedPrototypes)
|
||||||
|
{
|
||||||
|
// First remove the non-included prototypes
|
||||||
|
List<ReagentQuantity> 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)
|
public Solution SplitSolution(FixedPoint2 toTake)
|
||||||
{
|
{
|
||||||
if (toTake <= FixedPoint2.Zero)
|
if (toTake <= FixedPoint2.Zero)
|
||||||
@@ -756,6 +784,44 @@ namespace Content.Shared.Chemistry.Components
|
|||||||
return GetColorWithout(protoMan);
|
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
|
#region Enumeration
|
||||||
|
|
||||||
public IEnumerator<ReagentQuantity> GetEnumerator()
|
public IEnumerator<ReagentQuantity> GetEnumerator()
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ flavor-base-piquant = piquant
|
|||||||
flavor-base-sharp = sharp
|
flavor-base-sharp = sharp
|
||||||
flavor-base-syrupy = syrupy
|
flavor-base-syrupy = syrupy
|
||||||
flavor-base-spaceshroom = mysterious
|
flavor-base-spaceshroom = mysterious
|
||||||
|
flavor-base-clean = clean
|
||||||
|
|
||||||
# lmao
|
# lmao
|
||||||
flavor-base-terrible = terrible
|
flavor-base-terrible = terrible
|
||||||
@@ -213,3 +214,4 @@ flavor-complex-carpet = like a handful of fur
|
|||||||
flavor-complex-bee = unbeelievable
|
flavor-complex-bee = unbeelievable
|
||||||
flavor-complex-sax = like jazz
|
flavor-complex-sax = like jazz
|
||||||
flavor-complex-bottledlightning = like lightning in a bottle
|
flavor-complex-bottledlightning = like lightning in a bottle
|
||||||
|
flavor-complex-punishment = like punishment
|
||||||
|
|||||||
@@ -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-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-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-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).
|
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).
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ reagent-physical-desc-sticky = sticky
|
|||||||
reagent-physical-desc-bubbly = bubbly
|
reagent-physical-desc-bubbly = bubbly
|
||||||
reagent-physical-desc-rocky = rocky
|
reagent-physical-desc-rocky = rocky
|
||||||
reagent-physical-desc-lemony-fresh = lemony fresh
|
reagent-physical-desc-lemony-fresh = lemony fresh
|
||||||
|
reagent-physical-desc-soapy = soapy
|
||||||
reagent-physical-desc-crisp = crisp
|
reagent-physical-desc-crisp = crisp
|
||||||
reagent-physical-desc-citric = citric
|
reagent-physical-desc-citric = citric
|
||||||
reagent-physical-desc-acidic = acidic
|
reagent-physical-desc-acidic = acidic
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
layers:
|
layers:
|
||||||
- state: red
|
- state: red
|
||||||
- sprite: Objects/Specific/Janitorial/soap.rsi
|
- sprite: Objects/Specific/Janitorial/soap.rsi
|
||||||
state: soap
|
state: soap-4
|
||||||
- type: RandomSpawner
|
- type: RandomSpawner
|
||||||
prototypes:
|
prototypes:
|
||||||
- Soap
|
- Soap
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
qualities:
|
qualities:
|
||||||
- Rolling
|
- Rolling
|
||||||
speed: 0.75 # not as good as a rolling pin but does the job
|
speed: 0.75 # not as good as a rolling pin but does the job
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
speed: 0.25 # its small so takes longer to roll the entire dough flat
|
speed: 0.25 # its small so takes longer to roll the entire dough flat
|
||||||
- type: ItemCooldown
|
- type: ItemCooldown
|
||||||
- type: SpaceGarbage
|
- type: SpaceGarbage
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
|
|||||||
@@ -203,7 +203,7 @@
|
|||||||
- type: SolutionContainerVisuals
|
- type: SolutionContainerVisuals
|
||||||
maxFillLevels: 4
|
maxFillLevels: 4
|
||||||
fillBaseName: icon-
|
fillBaseName: icon-
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -221,7 +221,7 @@
|
|||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Consumable/Drinks/cafe_latte.rsi
|
sprite: Objects/Consumable/Drinks/cafe_latte.rsi
|
||||||
- type: Appearance
|
- type: Appearance
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -246,7 +246,7 @@
|
|||||||
- type: SolutionContainerVisuals
|
- type: SolutionContainerVisuals
|
||||||
maxFillLevels: 4
|
maxFillLevels: 4
|
||||||
fillBaseName: icon-
|
fillBaseName: icon-
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -271,7 +271,7 @@
|
|||||||
- type: SolutionContainerVisuals
|
- type: SolutionContainerVisuals
|
||||||
maxFillLevels: 4
|
maxFillLevels: 4
|
||||||
fillBaseName: icon-
|
fillBaseName: icon-
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -291,7 +291,7 @@
|
|||||||
state: icon
|
state: icon
|
||||||
- type: Item
|
- type: Item
|
||||||
sprite: Objects/Consumable/Drinks/lean.rsi
|
sprite: Objects/Consumable/Drinks/lean.rsi
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -317,5 +317,5 @@
|
|||||||
- type: SolutionContainerVisuals
|
- type: SolutionContainerVisuals
|
||||||
maxFillLevels: 1
|
maxFillLevels: 1
|
||||||
fillBaseName: icon-
|
fillBaseName: icon-
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
reagents:
|
reagents:
|
||||||
- ReagentId: Water
|
- ReagentId: Water
|
||||||
Quantity: 50
|
Quantity: 50
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
sprite: Objects/Consumable/Food/condiments.rsi
|
sprite: Objects/Consumable/Food/condiments.rsi
|
||||||
- type: Icon
|
- type: Icon
|
||||||
sprite: Objects/Consumable/Food/condiments.rsi
|
sprite: Objects/Consumable/Food/condiments.rsi
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: food
|
solution: food
|
||||||
- type: SpaceGarbage
|
- type: SpaceGarbage
|
||||||
- type: StaticPrice
|
- type: StaticPrice
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
damageContainer: Inorganic
|
damageContainer: Inorganic
|
||||||
- type: Spillable
|
- type: Spillable
|
||||||
solution: food
|
solution: food
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: food
|
solution: food
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
|
|||||||
@@ -9,7 +9,14 @@
|
|||||||
- Soap
|
- Soap
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Specific/Janitorial/soap.rsi
|
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
|
- type: Item
|
||||||
sprite: Objects/Specific/Janitorial/soap.rsi
|
sprite: Objects/Specific/Janitorial/soap.rsi
|
||||||
- type: Slippery
|
- type: Slippery
|
||||||
@@ -37,6 +44,29 @@
|
|||||||
density: 10
|
density: 10
|
||||||
mask:
|
mask:
|
||||||
- ItemMask
|
- 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
|
- type: entity
|
||||||
name: soap
|
name: soap
|
||||||
@@ -45,9 +75,20 @@
|
|||||||
description: A Nanotrasen brand bar of soap. Smells of plasma.
|
description: A Nanotrasen brand bar of soap. Smells of plasma.
|
||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: nt
|
layers:
|
||||||
|
- state: nt-4
|
||||||
|
map: ["enum.SolutionContainerLayers.Fill"]
|
||||||
|
- type: SolutionContainerVisuals
|
||||||
|
fillBaseName: nt-
|
||||||
- type: Item
|
- type: Item
|
||||||
heldPrefix: nt
|
heldPrefix: nt
|
||||||
|
- type: SolutionContainerManager
|
||||||
|
solutions:
|
||||||
|
soap:
|
||||||
|
maxVol: 100
|
||||||
|
reagents:
|
||||||
|
- ReagentId: SoapReagent
|
||||||
|
Quantity: 100
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: soap
|
name: soap
|
||||||
@@ -56,7 +97,11 @@
|
|||||||
description: A deluxe Waffle Co. brand bar of soap. Smells of condoms.
|
description: A deluxe Waffle Co. brand bar of soap. Smells of condoms.
|
||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: deluxe
|
layers:
|
||||||
|
- state: deluxe-4
|
||||||
|
map: ["enum.SolutionContainerLayers.Fill"]
|
||||||
|
- type: SolutionContainerVisuals
|
||||||
|
fillBaseName: deluxe-
|
||||||
- type: Item
|
- type: Item
|
||||||
heldPrefix: deluxe
|
heldPrefix: deluxe
|
||||||
|
|
||||||
@@ -67,12 +112,20 @@
|
|||||||
description: An untrustworthy bar of soap. Smells of fear.
|
description: An untrustworthy bar of soap. Smells of fear.
|
||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: syndie
|
layers:
|
||||||
|
- state: syndie-4
|
||||||
|
map: ["enum.SolutionContainerLayers.Fill"]
|
||||||
|
- type: SolutionContainerVisuals
|
||||||
|
fillBaseName: syndie-
|
||||||
- type: Slippery
|
- type: Slippery
|
||||||
paralyzeTime: 5
|
paralyzeTime: 5
|
||||||
launchForwardsMultiplier: 2.5
|
launchForwardsMultiplier: 2.5
|
||||||
- type: Item
|
- type: Item
|
||||||
heldPrefix: syndie
|
heldPrefix: syndie
|
||||||
|
- type: FlavorProfile
|
||||||
|
flavors:
|
||||||
|
- clean
|
||||||
|
- punishment
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: soap
|
name: soap
|
||||||
@@ -81,9 +134,20 @@
|
|||||||
description: A homemade bar of soap. Smells of... well....
|
description: A homemade bar of soap. Smells of... well....
|
||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: gibs
|
layers:
|
||||||
|
- state: gibs-4
|
||||||
|
map: ["enum.SolutionContainerLayers.Fill"]
|
||||||
|
- type: SolutionContainerVisuals
|
||||||
|
fillBaseName: gibs-
|
||||||
|
- type: Slippery
|
||||||
|
paralyzeTime: 2
|
||||||
|
- type: StepTrigger
|
||||||
- type: Item
|
- type: Item
|
||||||
heldPrefix: gibs
|
heldPrefix: gibs
|
||||||
|
- type: FlavorProfile
|
||||||
|
flavors:
|
||||||
|
- clean
|
||||||
|
- meaty
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: omega soap
|
name: omega soap
|
||||||
@@ -92,9 +156,20 @@
|
|||||||
description: The most advanced soap known to mankind. Smells of bluespace.
|
description: The most advanced soap known to mankind. Smells of bluespace.
|
||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: omega
|
layers:
|
||||||
|
- state: omega-4
|
||||||
|
map: ["enum.SolutionContainerLayers.Fill"]
|
||||||
|
- type: SolutionContainerVisuals
|
||||||
|
fillBaseName: omega-
|
||||||
- type: Slippery
|
- type: Slippery
|
||||||
paralyzeTime: 7
|
paralyzeTime: 7
|
||||||
launchForwardsMultiplier: 3
|
launchForwardsMultiplier: 3
|
||||||
- type: Item
|
- type: Item
|
||||||
heldPrefix: omega
|
heldPrefix: omega
|
||||||
|
- type: SolutionContainerManager
|
||||||
|
solutions:
|
||||||
|
soap:
|
||||||
|
maxVol: 240 #In the Greek alphabet, Omega is the 24th letter
|
||||||
|
reagents:
|
||||||
|
- ReagentId: SoapReagent
|
||||||
|
Quantity: 240
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
sprayVelocity: 2
|
sprayVelocity: 2
|
||||||
spraySound:
|
spraySound:
|
||||||
path: /Audio/Effects/spray2.ogg
|
path: /Audio/Effects/spray2.ogg
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: spray
|
solution: spray
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
|
|||||||
@@ -125,7 +125,7 @@
|
|||||||
- type: SpaceGarbage
|
- type: SpaceGarbage
|
||||||
- type: StaticPrice
|
- type: StaticPrice
|
||||||
price: 75 # These are limited supply items.
|
price: 75 # These are limited supply items.
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: pen
|
solution: pen
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
damage:
|
damage:
|
||||||
types:
|
types:
|
||||||
Blunt: 0
|
Blunt: 0
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: drink
|
solution: drink
|
||||||
- type: StaticPrice
|
- type: StaticPrice
|
||||||
price: 0
|
price: 0
|
||||||
|
|||||||
@@ -330,7 +330,7 @@
|
|||||||
solution: injector
|
solution: injector
|
||||||
- type: Spillable
|
- type: Spillable
|
||||||
solution: injector
|
solution: injector
|
||||||
- type: TrashOnEmpty
|
- type: TrashOnSolutionEmpty
|
||||||
solution: injector
|
solution: injector
|
||||||
- type: Appearance
|
- type: Appearance
|
||||||
- type: SolutionContainerVisuals
|
- type: SolutionContainerVisuals
|
||||||
|
|||||||
@@ -169,6 +169,11 @@
|
|||||||
flavorType: Base
|
flavorType: Base
|
||||||
description: flavor-base-syrupy
|
description: flavor-base-syrupy
|
||||||
|
|
||||||
|
- type: flavor
|
||||||
|
id: clean
|
||||||
|
flavorType: Base
|
||||||
|
description: flavor-base-clean
|
||||||
|
|
||||||
- type: flavor
|
- type: flavor
|
||||||
id: nothing
|
id: nothing
|
||||||
flavorType: Complex
|
flavorType: Complex
|
||||||
@@ -838,7 +843,7 @@
|
|||||||
id: spaceshroomcooked
|
id: spaceshroomcooked
|
||||||
flavorType: Complex
|
flavorType: Complex
|
||||||
description: flavor-complex-spaceshroom-cooked
|
description: flavor-complex-spaceshroom-cooked
|
||||||
|
|
||||||
- type: flavor
|
- type: flavor
|
||||||
id: lostfriendship
|
id: lostfriendship
|
||||||
flavorType: Complex
|
flavorType: Complex
|
||||||
@@ -847,4 +852,9 @@
|
|||||||
- type: flavor
|
- type: flavor
|
||||||
id: pumpkin
|
id: pumpkin
|
||||||
flavorType: Complex
|
flavorType: Complex
|
||||||
description: flavor-complex-pumpkin
|
description: flavor-complex-pumpkin
|
||||||
|
|
||||||
|
- type: flavor
|
||||||
|
id: punishment
|
||||||
|
flavorType: Complex
|
||||||
|
description: flavor-complex-punishment
|
||||||
|
|||||||
@@ -38,6 +38,50 @@
|
|||||||
- !type:CleanTileReaction {}
|
- !type:CleanTileReaction {}
|
||||||
- !type:CleanDecalsReaction {}
|
- !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
|
- type: reagent
|
||||||
id: SpaceLube
|
id: SpaceLube
|
||||||
name: reagent-name-space-lube
|
name: reagent-name-space-lube
|
||||||
|
|||||||
@@ -20,6 +20,16 @@
|
|||||||
products:
|
products:
|
||||||
SpaceCleaner: 2
|
SpaceCleaner: 2
|
||||||
|
|
||||||
|
- type: reaction
|
||||||
|
id: SoapyWater
|
||||||
|
reactants:
|
||||||
|
Water:
|
||||||
|
amount: 3
|
||||||
|
SoapReagent:
|
||||||
|
amount: 1
|
||||||
|
products:
|
||||||
|
SoapyWater: 4
|
||||||
|
|
||||||
- type: reaction
|
- type: reaction
|
||||||
id: SpaceLube
|
id: SpaceLube
|
||||||
impact: Medium
|
impact: Medium
|
||||||
|
|||||||
|
After Width: | Height: | Size: 274 B |
|
After Width: | Height: | Size: 312 B |
|
After Width: | Height: | Size: 342 B |
|
After Width: | Height: | Size: 357 B |
|
Before Width: | Height: | Size: 573 B |
|
After Width: | Height: | Size: 279 B |
|
After Width: | Height: | Size: 316 B |
|
After Width: | Height: | Size: 352 B |
|
After Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 773 B |
@@ -8,22 +8,76 @@
|
|||||||
},
|
},
|
||||||
"states": [
|
"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",
|
"name": "inhand-left",
|
||||||
|
|||||||
BIN
Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-1.png
Normal file
|
After Width: | Height: | Size: 266 B |
BIN
Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-2.png
Normal file
|
After Width: | Height: | Size: 303 B |
BIN
Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-3.png
Normal file
|
After Width: | Height: | Size: 334 B |
BIN
Resources/Textures/Objects/Specific/Janitorial/soap.rsi/nt-4.png
Normal file
|
After Width: | Height: | Size: 350 B |
|
Before Width: | Height: | Size: 630 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 356 B |
|
After Width: | Height: | Size: 415 B |
|
Before Width: | Height: | Size: 598 B After Width: | Height: | Size: 598 B |
|
After Width: | Height: | Size: 266 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 337 B |
|
After Width: | Height: | Size: 358 B |
|
Before Width: | Height: | Size: 688 B |
|
After Width: | Height: | Size: 256 B |
|
After Width: | Height: | Size: 287 B |
|
After Width: | Height: | Size: 307 B |
|
After Width: | Height: | Size: 317 B |
|
Before Width: | Height: | Size: 470 B |