using System.Collections.Generic; using System.Linq; using StardewModdingAPI.Framework.StateTracking.Comparers; using StardewValley; namespace StardewModdingAPI.Framework.StateTracking.Snapshots { /// A frozen snapshot of the tracked game locations. internal class WorldLocationsSnapshot { /********* ** Fields *********/ /// A map of tracked locations. private readonly Dictionary LocationsDict = new(new ObjectReferenceComparer()); /********* ** Accessors *********/ /// Tracks changes to the location list. public SnapshotListDiff LocationList { get; } = new(); /// The tracked locations. public IEnumerable Locations => this.LocationsDict.Values; /********* ** Public methods *********/ /// Update the tracked values. /// The watcher to snapshot. public void Update(WorldLocationsTracker watcher) { // update location list this.LocationList.Update(watcher.IsLocationListChanged, watcher.Added, watcher.Removed); // remove missing locations foreach (var key in this.LocationsDict.Keys.Where(key => !watcher.HasLocationTracker(key)).ToArray()) this.LocationsDict.Remove(key); // update locations foreach (LocationTracker locationWatcher in watcher.Locations) { if (!this.LocationsDict.TryGetValue(locationWatcher.Location, out LocationSnapshot? snapshot)) this.LocationsDict[locationWatcher.Location] = snapshot = new LocationSnapshot(locationWatcher.Location); snapshot.Update(locationWatcher); } } } }