PreventRandom use WeakReference, reroll rand instead of changing list

This commit is contained in:
Diorik 2025-02-06 13:29:47 -06:00
parent 67fd65d366
commit 5ca151b675

View file

@ -6,19 +6,20 @@ namespace Glamourer.Designs.Special;
public class RandomDesignGenerator(DesignStorage designs, DesignFileSystem fileSystem, Configuration config) : IService public class RandomDesignGenerator(DesignStorage designs, DesignFileSystem fileSystem, Configuration config) : IService
{ {
private readonly Random _rng = new(); private readonly Random _rng = new();
private Guid? _lastDesignID = null; private WeakReference<Design?> _lastDesign = new(null, false);
public Design? Design(IList<Design> localDesigns) public Design? Design(IReadOnlyList<Design> localDesigns)
{ {
if (localDesigns.Count == 0) if (localDesigns.Count == 0)
return null; return null;
if (config.PreventRandomRepeats && _lastDesignID != null && localDesigns.Count > 1 && localDesigns.FindFirst(d => d.Identifier == _lastDesignID, out var found)) int idx;
localDesigns.Remove(found); do
idx = _rng.Next(0, localDesigns.Count);
var idx = _rng.Next(0, localDesigns.Count); while (config.PreventRandomRepeats && localDesigns.Count > 1 && _lastDesign.TryGetTarget(out var lastDesign) && lastDesign == localDesigns[idx]);
Glamourer.Log.Verbose($"[Random Design] Chose design {idx + 1} out of {localDesigns.Count}: {localDesigns[idx].Incognito}."); Glamourer.Log.Verbose($"[Random Design] Chose design {idx + 1} out of {localDesigns.Count}: {localDesigns[idx].Incognito}.");
_lastDesignID = localDesigns[idx].Identifier; _lastDesign.SetTarget(localDesigns[idx]);
return localDesigns[idx]; return localDesigns[idx];
} }