From 915e6d22f199354ef69a20e47f13731379b46306 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Mon, 24 Aug 2020 22:23:02 -0400 Subject: [PATCH] minor tweaks --- src/SMAPI/Framework/SCore.cs | 31 +++++++++++++++--------------- src/SMAPI/Framework/SGame.cs | 14 ++++++++++++-- src/SMAPI/Framework/WatcherCore.cs | 5 +++-- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs index c4fb3b5d..a6067867 100644 --- a/src/SMAPI/Framework/SCore.cs +++ b/src/SMAPI/Framework/SCore.cs @@ -84,7 +84,7 @@ namespace StardewModdingAPI.Framework private readonly CommandManager CommandManager = new CommandManager(); /// The underlying game instance. - private SGame GameInstance; + private SGame Game; /// Manages input visible to the game. private SInputState Input => SGame.Input; @@ -249,7 +249,7 @@ namespace StardewModdingAPI.Framework var multiplayer = new SMultiplayer(this.Monitor, this.EventManager, this.Toolkit.JsonHelper, this.ModRegistry, this.Reflection, this.OnModMessageReceived, this.Settings.LogNetworkTraffic); var modHooks = new SModHooks(this.OnNewDayAfterFade); SGame.CreateContentManagerImpl = this.CreateContentManager; // must be static since the game accesses it before the SGame constructor is called - this.GameInstance = new SGame( + this.Game = new SGame( monitor: this.Monitor, reflection: this.Reflection, eventManager: this.EventManager, @@ -259,12 +259,12 @@ namespace StardewModdingAPI.Framework ); // hook game events - this.GameInstance.OnGameContentLoaded += this.OnLoadContent; - this.GameInstance.OnGameUpdating += this.OnGameUpdating; - this.GameInstance.OnGameExiting += this.OnGameExiting; + this.Game.OnGameContentLoaded += this.OnLoadContent; + this.Game.OnGameUpdating += this.OnGameUpdating; + this.Game.OnGameExiting += this.OnGameExiting; this.Translator.SetLocale(this.ContentCore.GetLocale(), this.ContentCore.Language); - StardewValley.Program.gamePtr = this.GameInstance; + StardewValley.Program.gamePtr = this.Game; // apply game patches new GamePatcher(this.Monitor).Apply( @@ -283,12 +283,12 @@ namespace StardewModdingAPI.Framework if (this.IsGameRunning) { this.LogManager.WriteCrashLog(); - this.GameInstance.Exit(); + this.Game.Exit(); } }).Start(); // set window titles - this.GameInstance.Window.Title = $"Stardew Valley {Constants.GameVersion} - running SMAPI {Constants.ApiVersion}"; + this.Game.Window.Title = $"Stardew Valley {Constants.GameVersion} - running SMAPI {Constants.ApiVersion}"; this.LogManager.SetConsoleTitle($"SMAPI {Constants.ApiVersion} - running Stardew Valley {Constants.GameVersion}"); } catch (Exception ex) @@ -303,7 +303,7 @@ namespace StardewModdingAPI.Framework this.LogManager.LogSettingsHeader(this.Settings.DeveloperMode, this.Settings.CheckForUpdates); // set window titles - this.GameInstance.Window.Title = $"Stardew Valley {Constants.GameVersion} - running SMAPI {Constants.ApiVersion}"; + this.Game.Window.Title = $"Stardew Valley {Constants.GameVersion} - running SMAPI {Constants.ApiVersion}"; this.LogManager.SetConsoleTitle($"SMAPI {Constants.ApiVersion} - running Stardew Valley {Constants.GameVersion}"); // start game @@ -312,7 +312,7 @@ namespace StardewModdingAPI.Framework { this.IsGameRunning = true; StardewValley.Program.releaseBuild = true; // game's debug logic interferes with SMAPI opening the game window - this.GameInstance.Run(); + this.Game.Run(); } catch (Exception ex) { @@ -351,7 +351,7 @@ namespace StardewModdingAPI.Framework this.IsGameRunning = false; this.ContentCore?.Dispose(); this.CancellationToken?.Dispose(); - this.GameInstance?.Dispose(); + this.Game?.Dispose(); this.LogManager?.Dispose(); // dispose last to allow for any last-second log messages // end game (moved from Game1.OnExiting to let us clean up first) @@ -409,7 +409,7 @@ namespace StardewModdingAPI.Framework // update window titles int modsLoaded = this.ModRegistry.GetAll().Count(); - this.GameInstance.Window.Title = $"Stardew Valley {Constants.GameVersion} - running SMAPI {Constants.ApiVersion} with {modsLoaded} mods"; + this.Game.Window.Title = $"Stardew Valley {Constants.GameVersion} - running SMAPI {Constants.ApiVersion} with {modsLoaded} mods"; this.LogManager.SetConsoleTitle($"SMAPI {Constants.ApiVersion} - running Stardew Valley {Constants.GameVersion} with {modsLoaded} mods"); } @@ -420,7 +420,7 @@ namespace StardewModdingAPI.Framework this.Input.TrueUpdate(); // init watchers - this.Watchers = new WatcherCore(this.Input); + this.Watchers = new WatcherCore(this.Input, this.Game.GetObservableLocations()); // validate XNB integrity if (!this.ValidateContentIntegrity()) @@ -477,7 +477,7 @@ namespace StardewModdingAPI.Framework // this too. For example, doing this after mod event suppression would prevent the // user from doing anything on the overnight shipping screen. SInputState inputState = this.Input; - if (this.GameInstance.IsActive) + if (this.Game.IsActive) inputState.TrueUpdate(); /********* @@ -760,7 +760,7 @@ namespace StardewModdingAPI.Framework /********* ** Input events (if window has focus) *********/ - if (this.GameInstance.IsActive) + if (this.Game.IsActive) { // raise events bool isChatInput = Game1.IsChatting || (Context.IsMultiplayer && Context.IsWorldReady && Game1.activeClickableMenu == null && Game1.currentMinigame == null && inputState.IsAnyDown(Game1.options.chatButton)); @@ -1071,7 +1071,6 @@ namespace StardewModdingAPI.Framework private LocalizedContentManager CreateContentManager(IServiceProvider serviceProvider, string rootDirectory) { // Game1._temporaryContent initializing from SGame constructor - // NOTE: this method is called before the SGame constructor runs. Don't depend on anything being initialized at this point. if (this.ContentCore == null) { this.ContentCore = new ContentCoordinator(serviceProvider, rootDirectory, Thread.CurrentThread.CurrentUICulture, this.Monitor, this.Reflection, this.Toolkit.JsonHelper, this.InitializeBeforeFirstAssetLoaded); diff --git a/src/SMAPI/Framework/SGame.cs b/src/SMAPI/Framework/SGame.cs index 966fbcdd..9f8a07e6 100644 --- a/src/SMAPI/Framework/SGame.cs +++ b/src/SMAPI/Framework/SGame.cs @@ -69,7 +69,7 @@ namespace StardewModdingAPI.Framework /********* - ** Protected methods + ** Public methods *********/ /// Construct an instance. /// Encapsulates monitoring and logging for SMAPI. @@ -78,7 +78,7 @@ namespace StardewModdingAPI.Framework /// Handles mod hooks provided by the game. /// The core multiplayer logic. /// Immediately exit the game without saving. This should only be invoked when an irrecoverable fatal error happens that risks save corruption or game-breaking bugs. - internal SGame(Monitor monitor, Reflector reflection, EventManager eventManager, SModHooks modHooks, SMultiplayer multiplayer, Action exitGameImmediately) + public SGame(Monitor monitor, Reflector reflection, EventManager eventManager, SModHooks modHooks, SMultiplayer multiplayer, Action exitGameImmediately) { // init XNA Game1.graphics.GraphicsProfile = GraphicsProfile.HiDef; @@ -96,6 +96,16 @@ namespace StardewModdingAPI.Framework this.ExitGameImmediately = exitGameImmediately; } + /// Get the observable location list. + public ObservableCollection GetObservableLocations() + { + return (ObservableCollection)Game1.locations; + } + + + /********* + ** Protected methods + *********/ /// Load content when the game is launched. protected override void LoadContent() { diff --git a/src/SMAPI/Framework/WatcherCore.cs b/src/SMAPI/Framework/WatcherCore.cs index c89efa44..2a5d1ee6 100644 --- a/src/SMAPI/Framework/WatcherCore.cs +++ b/src/SMAPI/Framework/WatcherCore.cs @@ -56,7 +56,8 @@ namespace StardewModdingAPI.Framework *********/ /// Construct an instance. /// Manages input visible to the game. - public WatcherCore(SInputState inputState) + /// The observable list of game locations. + public WatcherCore(SInputState inputState, ObservableCollection gameLocations) { // init watchers this.CursorWatcher = WatcherFactory.ForEquatable(() => inputState.CursorPosition); @@ -65,7 +66,7 @@ namespace StardewModdingAPI.Framework this.WindowSizeWatcher = WatcherFactory.ForEquatable(() => new Point(Game1.viewport.Width, Game1.viewport.Height)); this.TimeWatcher = WatcherFactory.ForEquatable(() => Game1.timeOfDay); this.ActiveMenuWatcher = WatcherFactory.ForReference(() => Game1.activeClickableMenu); - this.LocationsWatcher = new WorldLocationsTracker((ObservableCollection)Game1.locations, MineShaft.activeMines); + this.LocationsWatcher = new WorldLocationsTracker(gameLocations, MineShaft.activeMines); this.LocaleWatcher = WatcherFactory.ForGenericEquality(() => LocalizedContentManager.CurrentLanguageCode); this.Watchers.AddRange(new IWatcher[] {