using Microsoft.Xna.Framework; using StardewValley; using StardewValley.Menus; namespace StardewModdingAPI.Framework.StateTracking.Snapshots { /// A frozen snapshot of the game state watchers. internal class WatcherSnapshot { /********* ** Accessors *********/ /// Tracks changes to the window size. public SnapshotDiff WindowSize { get; } = new(); /// Tracks changes to the current player. public PlayerSnapshot? CurrentPlayer { get; private set; } /// Tracks changes to the time of day (in 24-hour military format). public SnapshotDiff Time { get; } = new(); /// Tracks changes to the save ID. public SnapshotDiff SaveID { get; } = new(); /// Tracks changes to the game's locations. public WorldLocationsSnapshot Locations { get; } = new(); /// Tracks changes to . public SnapshotDiff ActiveMenu { get; } = new(); /// Tracks changes to the cursor position. public SnapshotDiff Cursor { get; } = new(); /// Tracks changes to the mouse wheel scroll. public SnapshotDiff MouseWheelScroll { get; } = new(); /// Tracks changes to the content locale. public SnapshotDiff Locale { get; } = new(); /********* ** Public methods *********/ /// Update the tracked values. /// The watchers to snapshot. public void Update(WatcherCore watchers) { // update player instance if (watchers.CurrentPlayerTracker == null) this.CurrentPlayer = null; else if (watchers.CurrentPlayerTracker.Player != this.CurrentPlayer?.Player) this.CurrentPlayer = new PlayerSnapshot(watchers.CurrentPlayerTracker.Player); // update snapshots this.WindowSize.Update(watchers.WindowSizeWatcher); this.Locale.Update(watchers.LocaleWatcher); this.CurrentPlayer?.Update(watchers.CurrentPlayerTracker!); this.Time.Update(watchers.TimeWatcher); this.SaveID.Update(watchers.SaveIdWatcher); this.Locations.Update(watchers.LocationsWatcher); this.ActiveMenu.Update(watchers.ActiveMenuWatcher); this.Cursor.Update(watchers.CursorWatcher); this.MouseWheelScroll.Update(watchers.MouseWheelScrollWatcher); } } }