Un-Hardcode water evaporation & mopping behavior (#33399)

* Un-harcode slipperiness

* Make it actually work

* Prettyfy

* Cleanup GetEvaporatingReagents

* Fix mopping with space lube + wrong solutions in absorbance

* Remove LINQ and rename parameters

* Change evaporation speed to fixedpoint2

* Add evaporating speed functionality

* Remove unused imports

* Swap around reagent evaporation speed and puddle evaporation speed.

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
This commit is contained in:
Jajsha
2025-04-18 20:11:28 -04:00
committed by GitHub
parent 181bb27797
commit a6741e42c1
7 changed files with 76 additions and 24 deletions

View File

@@ -18,8 +18,8 @@ public sealed partial class EvaporationComponent : Component
public TimeSpan NextTick = TimeSpan.Zero;
/// <summary>
/// How much evaporation per second.
/// Evaporation factor. Multiplied by the evaporating speed of the reagent.
/// </summary>
[DataField("evaporationAmount")]
public FixedPoint2 EvaporationAmount = FixedPoint2.New(0.3);
public FixedPoint2 EvaporationAmount = FixedPoint2.New(1);
}

View File

@@ -1,17 +1,52 @@
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
namespace Content.Shared.Fluids;
public abstract partial class SharedPuddleSystem
{
[ValidatePrototypeId<ReagentPrototype>]
private const string Water = "Water";
public string[] GetEvaporatingReagents(Solution solution)
{
var evaporatingReagents = new List<string>();
foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys)
{
if (solProto.EvaporationSpeed > FixedPoint2.Zero)
evaporatingReagents.Add(solProto.ID);
}
return evaporatingReagents.ToArray();
}
public static readonly string[] EvaporationReagents = [Water];
public string[] GetAbsorbentReagents(Solution solution)
{
var absorbentReagents = new List<string>();
foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys)
{
if (solProto.Absorbent)
absorbentReagents.Add(solProto.ID);
}
return absorbentReagents.ToArray();
}
public bool CanFullyEvaporate(Solution solution)
{
return solution.GetTotalPrototypeQuantity(EvaporationReagents) == solution.Volume;
return solution.GetTotalPrototypeQuantity(GetEvaporatingReagents(solution)) == solution.Volume;
}
/// <summary>
/// Gets the evaporating speed of the reagents within a solution.
/// The speed at which a solution evaporates is the sum of the speed of all evaporating reagents in it.
/// </summary>
public Dictionary<string, FixedPoint2> GetEvaporationSpeeds(Solution solution)
{
var evaporatingSpeeds = new Dictionary<string, FixedPoint2>();
foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys)
{
if (solProto.EvaporationSpeed > FixedPoint2.Zero)
{
evaporatingSpeeds.Add(solProto.ID, solProto.EvaporationSpeed);
}
}
return evaporatingSpeeds;
}
}

View File

@@ -100,7 +100,7 @@ public abstract partial class SharedPuddleSystem : EntitySystem
{
if (CanFullyEvaporate(solution))
args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating"));
else if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero)
else if (solution.GetTotalPrototypeQuantity(GetEvaporatingReagents(solution)) > FixedPoint2.Zero)
args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating-partial"));
else
args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating-no"));