From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Date: Sun, 21 Jan 2024 01:25:52 +0000 (-0500)
Subject: Allow chemical-fueled generators to use multiple reagents (#24258)
X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=691c3d55b801026f268225355e9c28ccc53825a4;p=space-station-14.git
Allow chemical-fueled generators to use multiple reagents (#24258)
multi-reagent generators
---
diff --git a/Content.Server/Power/Generator/ChemicalFuelGeneratorAdapterComponent.cs b/Content.Server/Power/Generator/ChemicalFuelGeneratorAdapterComponent.cs
index 20d7149332..58e0e8b012 100644
--- a/Content.Server/Power/Generator/ChemicalFuelGeneratorAdapterComponent.cs
+++ b/Content.Server/Power/Generator/ChemicalFuelGeneratorAdapterComponent.cs
@@ -2,6 +2,7 @@
using Content.Shared.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
+using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Power.Generator;
@@ -13,11 +14,10 @@ namespace Content.Server.Power.Generator;
public sealed partial class ChemicalFuelGeneratorAdapterComponent : Component
{
///
- /// The reagent to accept as fuel.
+ /// A dictionary relating a reagent to accept as fuel to a value to multiply reagent amount by to get fuel amount.
///
- [DataField("reagent", customTypeSerializer: typeof(PrototypeIdSerializer))]
- [ViewVariables(VVAccess.ReadWrite)]
- public string Reagent = "WeldingFuel";
+ [DataField]
+ public Dictionary, float> Reagents = new();
///
/// The name of .
@@ -32,16 +32,10 @@ public sealed partial class ChemicalFuelGeneratorAdapterComponent : Component
[DataField("solutionRef")]
public Entity? Solution = null;
- ///
- /// Value to multiply reagent amount by to get fuel amount.
- ///
- [DataField("multiplier"), ViewVariables(VVAccess.ReadWrite)]
- public float Multiplier = 1f;
-
///
/// How much reagent (can be fractional) is left in the generator.
/// Stored in units of .
///
- [DataField("fractionalReagent"), ViewVariables(VVAccess.ReadWrite)]
- public float FractionalReagent;
+ [DataField]
+ public Dictionary, float> FractionalReagents = new();
}
diff --git a/Content.Server/Power/Generator/GeneratorSystem.cs b/Content.Server/Power/Generator/GeneratorSystem.cs
index a23b0b8eed..fc6ac07340 100644
--- a/Content.Server/Power/Generator/GeneratorSystem.cs
+++ b/Content.Server/Power/Generator/GeneratorSystem.cs
@@ -1,4 +1,5 @@
-using Content.Server.Audio;
+using System.Linq;
+using Content.Server.Audio;
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Fluids.EntitySystems;
using Content.Server.Materials;
@@ -81,7 +82,7 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
foreach (var reagentQuantity in solution)
{
- if (reagentQuantity.Reagent.Prototype != entity.Comp.Reagent)
+ if (!entity.Comp.Reagents.ContainsKey(reagentQuantity.Reagent.Prototype))
{
args.Clogged = true;
return;
@@ -94,14 +95,21 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
return;
- var availableReagent = solution.GetTotalPrototypeQuantity(entity.Comp.Reagent).Value;
- var toRemove = RemoveFractionalFuel(
- ref entity.Comp.FractionalReagent,
- args.FuelUsed,
- entity.Comp.Multiplier * FixedPoint2.Epsilon.Float(),
- availableReagent);
-
- _solutionContainer.RemoveReagent(entity.Comp.Solution.Value, entity.Comp.Reagent, FixedPoint2.FromCents(toRemove));
+ var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray()).Value;
+ foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
+ {
+ var availableReagent = solution.GetTotalPrototypeQuantity(reagentId).Value;
+ var removalPercentage = availableReagent / totalAvailableReagents;
+ var fractionalReagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId);
+ var toRemove = RemoveFractionalFuel(
+ ref fractionalReagent,
+ args.FuelUsed * removalPercentage,
+ multiplier * FixedPoint2.Epsilon.Float(),
+ availableReagent);
+
+ entity.Comp.FractionalReagents[reagentId] = fractionalReagent;
+ _solutionContainer.RemoveReagent(entity.Comp.Solution.Value, reagentId, FixedPoint2.FromCents(toRemove));
+ }
}
private void ChemicalGetFuel(Entity entity, ref GeneratorGetFuelEvent args)
@@ -109,9 +117,19 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
return;
- var availableReagent = solution.GetTotalPrototypeQuantity(entity.Comp.Reagent).Float();
- var reagent = entity.Comp.FractionalReagent * FixedPoint2.Epsilon.Float() + availableReagent;
- args.Fuel = reagent * entity.Comp.Multiplier;
+ var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray());
+ var fuel = 0f;
+ foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
+ {
+ var availableReagent = solution.GetTotalPrototypeQuantity(reagentId);
+ var percentage = availableReagent / totalAvailableReagents;
+ var fractionalReagent = (availableReagent * percentage).Float();
+
+ var reagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float() + fractionalReagent;
+ fuel += reagent * multiplier;
+ }
+
+ args.Fuel = fuel;
}
private void SolidUseFuel(EntityUid uid, SolidFuelGeneratorAdapterComponent component, GeneratorUseFuel args)
diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml
index d900d791d3..d1f84f5b6e 100644
--- a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml
+++ b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml
@@ -292,7 +292,8 @@
fuelEfficiencyConstant: 0.3
- type: ChemicalFuelGeneratorAdapter
solution: tank
- reagent: WeldingFuel
+ reagents:
+ WeldingFuel: 1
- type: SolutionContainerManager
solutions:
tank: