args.Sprite.LayerSetState(0, $"{smooth.StateBase}a");
_smooth.SetEnabled(uid, false, smooth);
}
- else if (volume < 0.6f)
+ else if (volume < MediumThreshold)
{
args.Sprite.LayerSetState(0, $"{smooth.StateBase}b");
_smooth.SetEnabled(uid, false, smooth);
continue;
}
- var remaining = neighborSolution.Volume - puddle.OverflowVolume;
+ var remaining = puddle.OverflowVolume - neighborSolution.Volume;
if (remaining <= FixedPoint2.Zero)
continue;
}
}
- // Then we go to free tiles -> only overflow if we can go up to capacity at least.
+ // Then we go to free tiles.
+ // Need to go even if we have a little remainder to avoid solution sploshing around internally
+ // for ages.
if (args.NeighborFreeTiles.Count > 0 && args.Updates > 0)
{
- // We'll only spill if we have the minimum threshold per tile.
- var spillCount = (int) Math.Floor(overflow.Volume.Float() / component.OverflowVolume.Float());
-
- if (spillCount == 0)
- {
- return;
- }
-
_random.Shuffle(args.NeighborFreeTiles);
- spillCount = Math.Min(args.NeighborFreeTiles.Count, spillCount);
- var spillAmount = overflow.Volume / spillCount;
+ var spillAmount = overflow.Volume / args.NeighborFreeTiles.Count;
foreach (var neighbor in args.NeighborFreeTiles)
{
foreach (var neighbor in args.Neighbors)
{
- // Overflow to neighbours but not if they're already at the cap
- // This is to avoid diluting solutions too much.
+ // Overflow to neighbours (unless it's pure water)
if (!puddleQuery.TryGetComponent(neighbor, out var puddle) ||
!_solutionContainerSystem.TryGetSolution(neighbor, puddle.SolutionName, out var neighborSolution) ||
- CanFullyEvaporate(neighborSolution) ||
- neighborSolution.Volume >= puddle.OverflowVolume)
+ CanFullyEvaporate(neighborSolution))
{
continue;
}