using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using StardewModdingAPI.Events;
using StardewValley;
using StardewValley.Buildings;
using StardewValley.Objects;
using StardewValley.TerrainFeatures;
namespace StardewModdingAPI.Framework.StateTracking.Snapshots
{
/// A frozen snapshot of a tracked game location.
internal class LocationSnapshot
{
/*********
** Accessors
*********/
/// The tracked location.
public GameLocation Location { get; }
/// Tracks added or removed buildings.
public SnapshotListDiff Buildings { get; } = new SnapshotListDiff();
/// Tracks added or removed debris.
public SnapshotListDiff Debris { get; } = new SnapshotListDiff();
/// Tracks added or removed large terrain features.
public SnapshotListDiff LargeTerrainFeatures { get; } = new SnapshotListDiff();
/// Tracks added or removed NPCs.
public SnapshotListDiff Npcs { get; } = new SnapshotListDiff();
/// Tracks added or removed objects.
public SnapshotListDiff> Objects { get; } = new SnapshotListDiff>();
/// Tracks added or removed terrain features.
public SnapshotListDiff> TerrainFeatures { get; } = new SnapshotListDiff>();
/// Tracks changed chest inventories.
public IDictionary ChestItems { get; } = new Dictionary();
/*********
** Public methods
*********/
/// Construct an instance.
/// The tracked location.
public LocationSnapshot(GameLocation location)
{
this.Location = location;
}
/// Update the tracked values.
/// The watcher to snapshot.
public void Update(LocationTracker watcher)
{
// main lists
this.Buildings.Update(watcher.BuildingsWatcher);
this.Debris.Update(watcher.DebrisWatcher);
this.LargeTerrainFeatures.Update(watcher.LargeTerrainFeaturesWatcher);
this.Npcs.Update(watcher.NpcsWatcher);
this.Objects.Update(watcher.ObjectsWatcher);
this.TerrainFeatures.Update(watcher.TerrainFeaturesWatcher);
// chest inventories
this.ChestItems.Clear();
foreach (ChestTracker tracker in watcher.ChestWatchers.Values)
{
ItemStackChange[] changes = tracker.GetInventoryChanges().ToArray();
if (changes.Length > 0)
this.ChestItems[tracker.Chest] = changes;
}
}
}
}