summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/StateTracking/Snapshots/PlayerSnapshot.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI/Framework/StateTracking/Snapshots/PlayerSnapshot.cs')
-rw-r--r--src/SMAPI/Framework/StateTracking/Snapshots/PlayerSnapshot.cs53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/StateTracking/Snapshots/PlayerSnapshot.cs b/src/SMAPI/Framework/StateTracking/Snapshots/PlayerSnapshot.cs
new file mode 100644
index 00000000..7bcd9f82
--- /dev/null
+++ b/src/SMAPI/Framework/StateTracking/Snapshots/PlayerSnapshot.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using StardewModdingAPI.Enums;
+using StardewModdingAPI.Events;
+using StardewValley;
+
+namespace StardewModdingAPI.Framework.StateTracking.Snapshots
+{
+ /// <summary>A frozen snapshot of a tracked player.</summary>
+ internal class PlayerSnapshot
+ {
+ /*********
+ ** Accessors
+ *********/
+ /// <summary>The player being tracked.</summary>
+ public Farmer Player { get; }
+
+ /// <summary>The player's current location.</summary>
+ public SnapshotDiff<GameLocation> Location { get; } = new SnapshotDiff<GameLocation>();
+
+ /// <summary>Tracks changes to the player's skill levels.</summary>
+ public IDictionary<SkillType, SnapshotDiff<int>> Skills { get; } =
+ Enum
+ .GetValues(typeof(SkillType))
+ .Cast<SkillType>()
+ .ToDictionary(skill => skill, skill => new SnapshotDiff<int>());
+
+ /// <summary>Get a list of inventory changes.</summary>
+ public IEnumerable<ItemStackChange> InventoryChanges { get; private set; }
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="player">The player being tracked.</param>
+ public PlayerSnapshot(Farmer player)
+ {
+ this.Player = player;
+ }
+
+ /// <summary>Update the tracked values.</summary>
+ /// <param name="watcher">The player watcher to snapshot.</param>
+ public void Update(PlayerTracker watcher)
+ {
+ this.Location.Update(watcher.LocationWatcher);
+ foreach (var pair in this.Skills)
+ pair.Value.Update(watcher.SkillWatchers[pair.Key]);
+ this.InventoryChanges = watcher.GetInventoryChanges().ToArray();
+ }
+ }
+}