Fix chemical fuel generator division by zero (#24793)

This would happen when they run out of fuel.
This commit is contained in:
Pieter-Jan Briers
2024-02-01 04:36:41 +01:00
committed by GitHub
parent 73d7837fab
commit b029d05620

View File

@@ -92,17 +92,28 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
return; return;
var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray()).Value; var totalReagent = 0f;
foreach (var (reagentId, _) in entity.Comp.Reagents)
{
totalReagent += solution.GetTotalPrototypeQuantity(reagentId).Float();
totalReagent += entity.Comp.FractionalReagents.GetValueOrDefault(reagentId);
}
if (totalReagent == 0)
return;
foreach (var (reagentId, multiplier) in entity.Comp.Reagents) 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 fractionalReagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId);
var availableReagent = solution.GetTotalPrototypeQuantity(reagentId);
var availForRatio = fractionalReagent + availableReagent.Float();
var removalPercentage = availForRatio / totalReagent;
var toRemove = RemoveFractionalFuel( var toRemove = RemoveFractionalFuel(
ref fractionalReagent, ref fractionalReagent,
args.FuelUsed * removalPercentage, args.FuelUsed * removalPercentage,
multiplier * FixedPoint2.Epsilon.Float(), multiplier * FixedPoint2.Epsilon.Float(),
availableReagent); availableReagent.Value);
entity.Comp.FractionalReagents[reagentId] = fractionalReagent; entity.Comp.FractionalReagents[reagentId] = fractionalReagent;
_solutionContainer.RemoveReagent(entity.Comp.Solution.Value, reagentId, FixedPoint2.FromCents(toRemove)); _solutionContainer.RemoveReagent(entity.Comp.Solution.Value, reagentId, FixedPoint2.FromCents(toRemove));
@@ -114,15 +125,12 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
return; return;
var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray());
var fuel = 0f; var fuel = 0f;
foreach (var (reagentId, multiplier) in entity.Comp.Reagents) foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
{ {
var availableReagent = solution.GetTotalPrototypeQuantity(reagentId); var reagent = solution.GetTotalPrototypeQuantity(reagentId).Float();
var percentage = availableReagent / totalAvailableReagents; reagent += entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float();
var fractionalReagent = (availableReagent * percentage).Float();
var reagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float() + fractionalReagent;
fuel += reagent * multiplier; fuel += reagent * multiplier;
} }
@@ -143,6 +151,10 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
private int RemoveFractionalFuel(ref float fractional, float fuelUsed, float multiplier, int availableQuantity) private int RemoveFractionalFuel(ref float fractional, float fuelUsed, float multiplier, int availableQuantity)
{ {
// Just a sanity thing since I got worried this might be possible.
if (!float.IsFinite(fractional))
fractional = 0;
fractional -= fuelUsed / multiplier; fractional -= fuelUsed / multiplier;
if (fractional >= 0) if (fractional >= 0)
return 0; return 0;