Generalize ReagentUnit into FixedPoint2 and use it for damage calculations (#5151)

* Damage units

* sum ext method
This commit is contained in:
mirrorcult
2021-11-03 16:48:03 -07:00
committed by GitHub
parent 8165d8f38c
commit 3ab4a30a0f
100 changed files with 730 additions and 601 deletions

View File

@@ -1,6 +1,7 @@
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reaction;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using JetBrains.Annotations;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
@@ -21,14 +22,14 @@ namespace Content.Shared.Chemistry
}
}
public void ReactionEntity(IEntity entity, ReactionMethod method, string reagentId, ReagentUnit reactVolume, Solution? source)
public void ReactionEntity(IEntity entity, ReactionMethod method, string reagentId, FixedPoint2 reactVolume, Solution? source)
{
// We throw if the reagent specified doesn't exist.
ReactionEntity(entity, method, _prototypeManager.Index<ReagentPrototype>(reagentId), reactVolume, source);
}
public void ReactionEntity(IEntity entity, ReactionMethod method, ReagentPrototype reagent,
ReagentUnit reactVolume, Solution? source)
FixedPoint2 reactVolume, Solution? source)
{
if (entity == null || entity.Deleted || !entity.TryGetComponent(out ReactiveComponent? reactive))
return;

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Cloning;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
@@ -22,8 +23,8 @@ namespace Content.Shared.Chemistry.Components
{
public readonly bool HasPower;
public readonly bool HasBeaker;
public readonly ReagentUnit BeakerCurrentVolume;
public readonly ReagentUnit BeakerMaxVolume;
public readonly FixedPoint2 BeakerCurrentVolume;
public readonly FixedPoint2 BeakerMaxVolume;
public readonly string ContainerName;
/// <summary>
@@ -38,10 +39,10 @@ namespace Content.Shared.Chemistry.Components
public readonly bool BufferModeTransfer;
public readonly ReagentUnit BufferCurrentVolume;
public readonly FixedPoint2 BufferCurrentVolume;
public ChemMasterBoundUserInterfaceState(bool hasPower, bool hasBeaker, ReagentUnit beakerCurrentVolume, ReagentUnit beakerMaxVolume, string containerName,
string dispenserName, IReadOnlyList<Solution.ReagentQuantity> containerReagents, IReadOnlyList<Solution.ReagentQuantity> bufferReagents, bool bufferModeTransfer, ReagentUnit bufferCurrentVolume)
public ChemMasterBoundUserInterfaceState(bool hasPower, bool hasBeaker, FixedPoint2 beakerCurrentVolume, FixedPoint2 beakerMaxVolume, string containerName,
string dispenserName, IReadOnlyList<Solution.ReagentQuantity> containerReagents, IReadOnlyList<Solution.ReagentQuantity> bufferReagents, bool bufferModeTransfer, FixedPoint2 bufferCurrentVolume)
{
HasPower = hasPower;
HasBeaker = hasBeaker;
@@ -63,13 +64,13 @@ namespace Content.Shared.Chemistry.Components
public class UiActionMessage : BoundUserInterfaceMessage
{
public readonly UiAction action;
public readonly ReagentUnit amount;
public readonly FixedPoint2 amount;
public readonly string id = "";
public readonly bool isBuffer;
public readonly int pillAmount;
public readonly int bottleAmount;
public UiActionMessage(UiAction _action, ReagentUnit? _amount, string? _id, bool? _isBuffer, int? _pillAmount, int? _bottleAmount)
public UiActionMessage(UiAction _action, FixedPoint2? _amount, string? _id, bool? _isBuffer, int? _pillAmount, int? _bottleAmount)
{
action = _action;
if (action == UiAction.ChemButton)

View File

@@ -1,5 +1,6 @@
using System;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
@@ -15,10 +16,10 @@ namespace Content.Shared.Chemistry.Components
[Serializable, NetSerializable]
protected sealed class HyposprayComponentState : ComponentState
{
public ReagentUnit CurVolume { get; }
public ReagentUnit MaxVolume { get; }
public FixedPoint2 CurVolume { get; }
public FixedPoint2 MaxVolume { get; }
public HyposprayComponentState(ReagentUnit curVolume, ReagentUnit maxVolume)
public HyposprayComponentState(FixedPoint2 curVolume, FixedPoint2 maxVolume)
{
CurVolume = curVolume;
MaxVolume = maxVolume;

View File

@@ -1,5 +1,6 @@
using System;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
@@ -20,11 +21,11 @@ namespace Content.Shared.Chemistry.Components
[Serializable, NetSerializable]
protected sealed class InjectorComponentState : ComponentState
{
public ReagentUnit CurrentVolume { get; }
public ReagentUnit TotalVolume { get; }
public FixedPoint2 CurrentVolume { get; }
public FixedPoint2 TotalVolume { get; }
public InjectorToggleMode CurrentMode { get; }
public InjectorComponentState(ReagentUnit currentVolume, ReagentUnit totalVolume, InjectorToggleMode currentMode)
public InjectorComponentState(FixedPoint2 currentVolume, FixedPoint2 totalVolume, InjectorToggleMode currentMode)
{
CurrentVolume = currentVolume;
TotalVolume = totalVolume;

View File

@@ -1,4 +1,5 @@
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
@@ -18,10 +19,10 @@ namespace Content.Shared.Chemistry.Components
/// Volume needed to fill this container.
/// </summary>
[ViewVariables]
public ReagentUnit AvailableVolume => MaxVolume - CurrentVolume;
public FixedPoint2 AvailableVolume => MaxVolume - CurrentVolume;
public ReagentUnit DrawAvailable => CurrentVolume;
public ReagentUnit DrainAvailable => CurrentVolume;
public FixedPoint2 DrawAvailable => CurrentVolume;
public FixedPoint2 DrainAvailable => CurrentVolume;
/// <summary>
/// Checks if a solution can fit into the container.
@@ -34,18 +35,18 @@ namespace Content.Shared.Chemistry.Components
}
[DataField("maxSpillRefill")]
public ReagentUnit MaxSpillRefill { get; set; }
public FixedPoint2 MaxSpillRefill { get; set; }
/// <summary>
/// Initially set <see cref="MaxVolume"/>. If empty will be calculated based
/// on sum of <see cref="Contents"/> reagent units.
/// on sum of <see cref="Contents"/> fixed units.
/// </summary>
[DataField("maxVol")] public ReagentUnit InitialMaxVolume;
[DataField("maxVol")] public FixedPoint2 InitialMaxVolume;
[ViewVariables(VVAccess.ReadWrite)]
public ReagentUnit MaxVolume { get; set; } = ReagentUnit.Zero;
public FixedPoint2 MaxVolume { get; set; } = FixedPoint2.Zero;
[ViewVariables]
public ReagentUnit CurrentVolume => TotalVolume;
public FixedPoint2 CurrentVolume => TotalVolume;
}
}

View File

@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Maths;
@@ -32,7 +33,7 @@ namespace Content.Shared.Chemistry.Components
/// The calculated total volume of all reagents in the solution (ex. Total volume of liquid in beaker).
/// </summary>
[ViewVariables]
public ReagentUnit TotalVolume { get; set; }
public FixedPoint2 TotalVolume { get; set; }
public Color Color => GetColor();
@@ -46,14 +47,14 @@ namespace Content.Shared.Chemistry.Components
/// </summary>
/// <param name="reagentId">The prototype ID of the reagent to add.</param>
/// <param name="quantity">The quantity in milli-units.</param>
public Solution(string reagentId, ReagentUnit quantity)
public Solution(string reagentId, FixedPoint2 quantity)
{
AddReagent(reagentId, quantity);
}
void ISerializationHooks.AfterDeserialization()
{
TotalVolume = ReagentUnit.Zero;
TotalVolume = FixedPoint2.Zero;
Contents.ForEach(reagent => TotalVolume += reagent.Quantity);
}
@@ -62,7 +63,7 @@ namespace Content.Shared.Chemistry.Components
return ContainsReagent(reagentId, out _);
}
public bool ContainsReagent(string reagentId, out ReagentUnit quantity)
public bool ContainsReagent(string reagentId, out FixedPoint2 quantity)
{
foreach (var reagent in Contents)
{
@@ -73,7 +74,7 @@ namespace Content.Shared.Chemistry.Components
}
}
quantity = ReagentUnit.New(0);
quantity = FixedPoint2.New(0);
return false;
}
@@ -93,7 +94,7 @@ namespace Content.Shared.Chemistry.Components
/// </summary>
/// <param name="reagentId">The prototype ID of the reagent to add.</param>
/// <param name="quantity">The quantity in milli-units.</param>
public void AddReagent(string reagentId, ReagentUnit quantity)
public void AddReagent(string reagentId, FixedPoint2 quantity)
{
if (quantity <= 0)
return;
@@ -139,7 +140,7 @@ namespace Content.Shared.Chemistry.Components
/// </summary>
/// <param name="reagentId">The prototype ID of the reagent to add.</param>
/// <returns>The quantity in milli-units.</returns>
public ReagentUnit GetReagentQuantity(string reagentId)
public FixedPoint2 GetReagentQuantity(string reagentId)
{
for (var i = 0; i < Contents.Count; i++)
{
@@ -147,10 +148,10 @@ namespace Content.Shared.Chemistry.Components
return Contents[i].Quantity;
}
return ReagentUnit.New(0);
return FixedPoint2.New(0);
}
public void RemoveReagent(string reagentId, ReagentUnit quantity)
public void RemoveReagent(string reagentId, FixedPoint2 quantity)
{
if(quantity <= 0)
return;
@@ -183,7 +184,7 @@ namespace Content.Shared.Chemistry.Components
/// Remove the specified quantity from this solution.
/// </summary>
/// <param name="quantity">The quantity of this solution to remove</param>
public void RemoveSolution(ReagentUnit quantity)
public void RemoveSolution(FixedPoint2 quantity)
{
if(quantity <= 0)
return;
@@ -214,10 +215,10 @@ namespace Content.Shared.Chemistry.Components
public void RemoveAllSolution()
{
Contents.Clear();
TotalVolume = ReagentUnit.New(0);
TotalVolume = FixedPoint2.New(0);
}
public Solution SplitSolution(ReagentUnit quantity)
public Solution SplitSolution(FixedPoint2 quantity)
{
if (quantity <= 0)
return new Solution();
@@ -232,7 +233,7 @@ namespace Content.Shared.Chemistry.Components
}
newSolution = new Solution();
var newTotalVolume = ReagentUnit.New(0);
var newTotalVolume = FixedPoint2.New(0);
var remainingVolume = TotalVolume;
for (var i = 0; i < Contents.Count; i++)
@@ -291,7 +292,7 @@ namespace Content.Shared.Chemistry.Components
}
Color mixColor = default;
var runningTotalQuantity = ReagentUnit.New(0);
var runningTotalQuantity = FixedPoint2.New(0);
var protoManager = IoCManager.Resolve<IPrototypeManager>();
foreach (var reagent in Contents)
@@ -317,7 +318,7 @@ namespace Content.Shared.Chemistry.Components
public Solution Clone()
{
var volume = ReagentUnit.New(0);
var volume = FixedPoint2.New(0);
var newSolution = new Solution();
for (var i = 0; i < Contents.Count; i++)
@@ -348,9 +349,9 @@ namespace Content.Shared.Chemistry.Components
[DataField("ReagentId", customTypeSerializer:typeof(PrototypeIdSerializer<ReagentPrototype>))]
public readonly string ReagentId;
[DataField("Quantity")]
public readonly ReagentUnit Quantity;
public readonly FixedPoint2 Quantity;
public ReagentQuantity(string reagentId, ReagentUnit quantity)
public ReagentQuantity(string reagentId, FixedPoint2 quantity)
{
ReagentId = reagentId;
Quantity = quantity;
@@ -364,7 +365,7 @@ namespace Content.Shared.Chemistry.Components
public int CompareTo(ReagentQuantity other) { return Quantity.Float().CompareTo(other.Quantity.Float()); }
public void Deconstruct(out string reagentId, out ReagentUnit quantity)
public void Deconstruct(out string reagentId, out FixedPoint2 quantity)
{
reagentId = ReagentId;
quantity = Quantity;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
@@ -26,8 +27,8 @@ namespace Content.Shared.Chemistry.Dispenser
{
public readonly bool HasPower;
public readonly bool HasBeaker;
public readonly ReagentUnit BeakerCurrentVolume;
public readonly ReagentUnit BeakerMaxVolume;
public readonly FixedPoint2 BeakerCurrentVolume;
public readonly FixedPoint2 BeakerMaxVolume;
public readonly string ContainerName;
/// <summary>
/// A list of the reagents which this dispenser can dispense.
@@ -38,10 +39,10 @@ namespace Content.Shared.Chemistry.Dispenser
/// </summary>
public readonly List<Components.Solution.ReagentQuantity>? ContainerReagents;
public readonly string DispenserName;
public readonly ReagentUnit SelectedDispenseAmount;
public readonly FixedPoint2 SelectedDispenseAmount;
public ReagentDispenserBoundUserInterfaceState(bool hasPower, bool hasBeaker, ReagentUnit beakerCurrentVolume, ReagentUnit beakerMaxVolume, string containerName,
List<ReagentDispenserInventoryEntry> inventory, string dispenserName, List<Components.Solution.ReagentQuantity>? containerReagents, ReagentUnit selectedDispenseAmount)
public ReagentDispenserBoundUserInterfaceState(bool hasPower, bool hasBeaker, FixedPoint2 beakerCurrentVolume, FixedPoint2 beakerMaxVolume, string containerName,
List<ReagentDispenserInventoryEntry> inventory, string dispenserName, List<Components.Solution.ReagentQuantity>? containerReagents, FixedPoint2 selectedDispenseAmount)
{
HasPower = hasPower;
HasBeaker = hasBeaker;

View File

@@ -1,10 +1,11 @@
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.Map;
namespace Content.Shared.Chemistry.Reaction
{
public interface ITileReaction
{
ReagentUnit TileReact(TileRef tile, ReagentPrototype reagent, ReagentUnit reactVolume);
FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume);
}
}

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Content.Shared.Sound;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager.Attributes;
@@ -14,7 +15,7 @@ namespace Content.Shared.Chemistry.Reaction
public class ReactionPrototype : IPrototype
{
[DataField("reactants")] private Dictionary<string, ReactantPrototype> _reactants = new();
[DataField("products")] private Dictionary<string, ReagentUnit> _products = new();
[DataField("products")] private Dictionary<string, FixedPoint2> _products = new();
[DataField("effects", serverOnly: true)] private List<IReactionEffect> _effects = new();
[ViewVariables]
@@ -31,7 +32,7 @@ namespace Content.Shared.Chemistry.Reaction
/// <summary>
/// Reagents created when the reaction occurs.
/// </summary>
public IReadOnlyDictionary<string, ReagentUnit> Products => _products;
public IReadOnlyDictionary<string, FixedPoint2> Products => _products;
/// <summary>
/// Effects to be triggered when the reaction occurs.
/// </summary>
@@ -48,14 +49,14 @@ namespace Content.Shared.Chemistry.Reaction
public class ReactantPrototype
{
[DataField("amount")]
private ReagentUnit _amount = ReagentUnit.New(1);
private FixedPoint2 _amount = FixedPoint2.New(1);
[DataField("catalyst")]
private bool _catalyst;
/// <summary>
/// Minimum amount of the reactant needed for the reaction to occur.
/// </summary>
public ReagentUnit Amount => _amount;
public FixedPoint2 Amount => _amount;
/// <summary>
/// Whether or not the reactant is a catalyst. Catalysts aren't removed when a reaction occurs.
/// </summary>

View File

@@ -1,6 +1,7 @@
using System.Collections.Generic;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Log;
@@ -29,9 +30,9 @@ namespace Content.Shared.Chemistry.Reaction
/// <param name="reaction">The reaction to check.</param>
/// <param name="lowestUnitReactions">How many times this reaction can occur.</param>
/// <returns></returns>
private static bool CanReact(Solution solution, ReactionPrototype reaction, out ReagentUnit lowestUnitReactions)
private static bool CanReact(Solution solution, ReactionPrototype reaction, out FixedPoint2 lowestUnitReactions)
{
lowestUnitReactions = ReagentUnit.MaxValue;
lowestUnitReactions = FixedPoint2.MaxValue;
foreach (var reactantData in reaction.Reactants)
{
@@ -55,7 +56,7 @@ namespace Content.Shared.Chemistry.Reaction
/// Perform a reaction on a solution. This assumes all reaction criteria are met.
/// Removes the reactants from the solution, then returns a solution with all products.
/// </summary>
private Solution PerformReaction(Solution solution, IEntity owner, ReactionPrototype reaction, ReagentUnit unitReactions)
private Solution PerformReaction(Solution solution, IEntity owner, ReactionPrototype reaction, FixedPoint2 unitReactions)
{
//Remove reactants
foreach (var reactant in reaction.Reactants)
@@ -80,7 +81,7 @@ namespace Content.Shared.Chemistry.Reaction
return products;
}
protected virtual void OnReaction(Solution solution, ReactionPrototype reaction, IEntity owner, ReagentUnit unitReactions)
protected virtual void OnReaction(Solution solution, ReactionPrototype reaction, IEntity owner, FixedPoint2 unitReactions)
{
foreach (var effect in reaction.Effects)
{
@@ -130,7 +131,7 @@ namespace Content.Shared.Chemistry.Reaction
/// Continually react a solution until no more reactions occur, with a volume constraint.
/// If a reaction's products would exceed the max volume, some product is deleted.
/// </summary>
public void FullyReactSolution(Solution solution, IEntity owner, ReagentUnit maxVolume)
public void FullyReactSolution(Solution solution, IEntity owner, FixedPoint2 maxVolume)
{
for (var i = 0; i < MaxReactionIterations; i++)
{

View File

@@ -1,4 +1,5 @@
using System;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
@@ -27,7 +28,7 @@ namespace Content.Shared.Chemistry.Reagent
[DataField("ingestion")]
public bool Ingestion { get; } = false;
public void React(ReactionMethod method, IEntity entity, ReagentPrototype reagent, ReagentUnit volume, Components.Solution? source)
public void React(ReactionMethod method, IEntity entity, ReagentPrototype reagent, FixedPoint2 volume, Components.Solution? source)
{
switch (method)
{
@@ -50,6 +51,6 @@ namespace Content.Shared.Chemistry.Reagent
React(entity, reagent, volume, source);
}
protected abstract void React(IEntity entity, ReagentPrototype reagent, ReagentUnit volume, Components.Solution? source);
protected abstract void React(IEntity entity, ReagentPrototype reagent, FixedPoint2 volume, Components.Solution? source);
}
}

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using Content.Shared.Botany;
using Content.Shared.Chemistry.Reaction;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Maths;
@@ -77,9 +78,9 @@ namespace Content.Shared.Chemistry.Reagent
return SubstanceColor;
}
public ReagentUnit ReactionTile(TileRef tile, ReagentUnit reactVolume)
public FixedPoint2 ReactionTile(TileRef tile, FixedPoint2 reactVolume)
{
var removed = ReagentUnit.Zero;
var removed = FixedPoint2.Zero;
if (tile.Tile.IsEmpty)
return removed;

View File

@@ -1,249 +0,0 @@
using System;
using System.Globalization;
using System.Linq;
using Robust.Shared.Serialization;
namespace Content.Shared.Chemistry.Reagent
{
/// <summary>
/// Represents a quantity of reagent, to a precision of 0.01.
/// To enforce this level of precision, floats are shifted by 2 decimal points, rounded, and converted to an int.
/// </summary>
[Serializable]
public struct ReagentUnit : ISelfSerialize, IComparable<ReagentUnit>, IEquatable<ReagentUnit>
{
private int _value;
private static readonly int Shift = 2;
public static ReagentUnit MaxValue { get; } = new(int.MaxValue);
public static ReagentUnit Epsilon { get; } = new(1);
public static ReagentUnit Zero { get; } = new(0);
private readonly double ShiftDown()
{
return _value / Math.Pow(10, Shift);
}
private ReagentUnit(int value)
{
_value = value;
}
public static ReagentUnit New(int value)
{
return new(value * (int) Math.Pow(10, Shift));
}
public static ReagentUnit New(float value)
{
return new(FromFloat(value));
}
private static int FromFloat(float value)
{
return (int) MathF.Round(value * MathF.Pow(10, Shift), MidpointRounding.AwayFromZero);
}
public static ReagentUnit New(double value)
{
return new((int) Math.Round(value * Math.Pow(10, Shift), MidpointRounding.AwayFromZero));
}
public static ReagentUnit New(string value)
{
return New(FloatFromString(value));
}
private static float FloatFromString(string value)
{
return float.Parse(value, CultureInfo.InvariantCulture);
}
public static ReagentUnit operator +(ReagentUnit a) => a;
public static ReagentUnit operator -(ReagentUnit a) => new(-a._value);
public static ReagentUnit operator +(ReagentUnit a, ReagentUnit b)
=> new(a._value + b._value);
public static ReagentUnit operator -(ReagentUnit a, ReagentUnit b)
=> a + -b;
public static ReagentUnit operator *(ReagentUnit a, ReagentUnit b)
{
var aD = a.ShiftDown();
var bD = b.ShiftDown();
return New(aD * bD);
}
public static ReagentUnit operator *(ReagentUnit a, float b)
{
var aD = (float) a.ShiftDown();
return New(aD * b);
}
public static ReagentUnit operator *(ReagentUnit a, double b)
{
var aD = a.ShiftDown();
return New(aD * b);
}
public static ReagentUnit operator *(ReagentUnit a, int b)
{
return new(a._value * b);
}
public static ReagentUnit operator /(ReagentUnit a, ReagentUnit b)
{
if (b._value == 0)
{
throw new DivideByZeroException();
}
var aD = a.ShiftDown();
var bD = b.ShiftDown();
return New(aD / bD);
}
public static bool operator <=(ReagentUnit a, int b)
{
return a <= New(b);
}
public static bool operator >=(ReagentUnit a, int b)
{
return a >= New(b);
}
public static bool operator <(ReagentUnit a, int b)
{
return a < New(b);
}
public static bool operator >(ReagentUnit a, int b)
{
return a > New(b);
}
public static bool operator ==(ReagentUnit a, int b)
{
return a == New(b);
}
public static bool operator !=(ReagentUnit a, int b)
{
return a != New(b);
}
public static bool operator ==(ReagentUnit a, ReagentUnit b)
{
return a.Equals(b);
}
public static bool operator !=(ReagentUnit a, ReagentUnit b)
{
return !a.Equals(b);
}
public static bool operator <=(ReagentUnit a, ReagentUnit b)
{
return a._value <= b._value;
}
public static bool operator >=(ReagentUnit a, ReagentUnit b)
{
return a._value >= b._value;
}
public static bool operator <(ReagentUnit a, ReagentUnit b)
{
return a._value < b._value;
}
public static bool operator >(ReagentUnit a, ReagentUnit b)
{
return a._value > b._value;
}
public readonly float Float()
{
return (float) ShiftDown();
}
public readonly double Double()
{
return ShiftDown();
}
public readonly int Int()
{
return (int) ShiftDown();
}
public static ReagentUnit Min(params ReagentUnit[] reagentUnits)
{
return reagentUnits.Min();
}
public static ReagentUnit Min(ReagentUnit a, ReagentUnit b)
{
return a < b ? a : b;
}
public static ReagentUnit Max(ReagentUnit a, ReagentUnit b)
{
return a > b ? a : b;
}
public static ReagentUnit Clamp(ReagentUnit reagent, ReagentUnit min, ReagentUnit max)
{
if (min > max)
{
throw new ArgumentException($"{nameof(min)} {min} cannot be larger than {nameof(max)} {max}");
}
return reagent < min ? min : reagent > max ? max : reagent;
}
public override readonly bool Equals(object? obj)
{
return obj is ReagentUnit unit &&
_value == unit._value;
}
public override readonly int GetHashCode()
{
// ReSharper disable once NonReadonlyMemberInGetHashCode
return HashCode.Combine(_value);
}
public void Deserialize(string value)
{
_value = FromFloat(FloatFromString(value));
}
public override readonly string ToString() => $"{ShiftDown().ToString(CultureInfo.InvariantCulture)}";
public readonly string Serialize()
{
return ToString();
}
public readonly bool Equals(ReagentUnit other)
{
return _value == other._value;
}
public readonly int CompareTo(ReagentUnit other)
{
if(other._value > _value)
{
return -1;
}
if(other._value < _value)
{
return 1;
}
return 0;
}
}
}

View File

@@ -1,5 +1,6 @@
using System;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
@@ -8,10 +9,10 @@ namespace Content.Shared.Chemistry
[Serializable, NetSerializable]
public class TransferAmountBoundInterfaceState : BoundUserInterfaceState
{
public ReagentUnit Max;
public ReagentUnit Min;
public FixedPoint2 Max;
public FixedPoint2 Min;
public TransferAmountBoundInterfaceState(ReagentUnit max, ReagentUnit min)
public TransferAmountBoundInterfaceState(FixedPoint2 max, FixedPoint2 min)
{
Max = max;
Min = min;
@@ -21,9 +22,9 @@ namespace Content.Shared.Chemistry
[Serializable, NetSerializable]
public class TransferAmountSetValueMessage : BoundUserInterfaceMessage
{
public ReagentUnit Value;
public FixedPoint2 Value;
public TransferAmountSetValueMessage(ReagentUnit value)
public TransferAmountSetValueMessage(FixedPoint2 value)
{
Value = value;
}