From 8747fd3751895b90b946fbaafcdc84ed592ead9f Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 9 May 2026 23:41:40 -0400 Subject: [PATCH] update rewriters for Stardew Valley 1.6.16 --- src/SMAPI/Constants.cs | 4 +- .../StardewValley_1_6/ArgUtilityFacade.cs | 68 +-- .../Rewriters/StardewValley_1_6/BuffFacade.cs | 2 +- .../Rewriters/StardewValley_1_6/BushFacade.cs | 9 +- .../StardewValley_1_6/DialogueFacade.cs | 4 +- .../StardewValley_1_6/FarmerFacade.cs | 5 +- .../StardewValley_1_6/ForestFacade.cs | 4 +- .../StardewValley_1_6/Game1Facade.cs | 4 +- .../StardewValley_1_6/GameLocationFacade.cs | 2 +- .../Internal/NetRefWrapperCache.cs | 2 +- .../LocalizedContentManagerFacade.cs | 4 +- .../Rewriters/StardewValley_1_6/NpcFacade.cs | 11 +- .../StardewValley_1_6/Stats_160_Facade.cs | 14 +- .../StardewValley_1_6/UtilityFacade.cs | 16 +- .../StardewValley_1_6/WallpaperFacade.cs | 5 +- .../AnimatedSpriteFacade.cs | 26 + .../StardewValley_1_6_16/ArgUtilityFacade.cs | 17 + .../StardewValley_1_6_16/BuffManagerFacade.cs | 27 + .../StardewValley_1_6_16/BushFacade.cs | 31 ++ .../StardewValley_1_6_16/DataLoaderFacade.cs | 488 ++++++++++++++++++ .../StardewValley_1_6_16/FarmerFacade.cs | 54 ++ .../StardewValley_1_6_16/ForestFacade.cs | 28 + .../StardewValley_1_6_16/Game1Facade.cs | 26 + .../ItemRegistryFacade.cs | 33 ++ .../LocalizedContentManagerFacade.cs | 82 +++ .../StardewValley_1_6_16/NpcFacade.cs | 47 ++ .../StardewValley_1_6_16/PetDataFacade.cs | 29 ++ .../StardewValley_1_6_16/ResponseFacade.cs | 31 ++ .../TemporaryAnimatedSpriteListFacade.cs | 27 + .../StardewValley_1_6_16/TextBoxFacade.cs | 35 ++ .../StardewValley_1_6_16/UtilityFacade.cs | 37 ++ src/SMAPI/Metadata/InstructionMetadata.cs | 68 ++- 32 files changed, 1152 insertions(+), 88 deletions(-) create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/AnimatedSpriteFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ArgUtilityFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BuffManagerFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BushFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/DataLoaderFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/FarmerFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ForestFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/Game1Facade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ItemRegistryFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/LocalizedContentManagerFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/NpcFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/PetDataFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ResponseFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TemporaryAnimatedSpriteListFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TextBoxFacade.cs create mode 100644 src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/UtilityFacade.cs diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs index 89012a19..0cfac5e3 100644 --- a/src/SMAPI/Constants.cs +++ b/src/SMAPI/Constants.cs @@ -65,10 +65,10 @@ public static class Constants public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion(EarlyConstants.RawApiVersion); /// The minimum supported version of Stardew Valley. - public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.6.14"); + public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.6.16"); /// The minimum supported Stardew Valley build number, or null for any build of . - public static int? MinimumGameBuild { get; } = null; + public static int? MinimumGameBuild { get; } = 25256; /// The maximum supported version of Stardew Valley, if any. public static ISemanticVersion? MaximumGameVersion { get; } = null; diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs index 27343059..82438be0 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs @@ -6,7 +6,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public class ArgUtilityFacade : IRewriteFacade +public class ArgUtilityFacade_1_6 : IRewriteFacade { /********* ** Fields @@ -19,108 +19,108 @@ public class ArgUtilityFacade : IRewriteFacade ** Public methods *********/ /// Changed in Stardew Valley 1.6.9. - public static bool TryGet(string[] array, int index, out string value, out string error, bool allowBlank = true) + public static bool TryGet(string[] array, int index, out string? value, out string? error, bool allowBlank = true) { - return ArgUtility.TryGet(array, index, out value, out error, allowBlank, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGet(array, index, out value, out error, allowBlank, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetOptional(string[] array, int index, out string value, out string error, string? defaultValue = null, bool allowBlank = true) + public static bool TryGetOptional(string[] array, int index, out string? value, out string? error, string? defaultValue = null, bool allowBlank = true) { - return ArgUtility.TryGetOptional(array, index, out value, out error, defaultValue, allowBlank, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetOptional(array, index, out value, out error, defaultValue, allowBlank, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetBool(string[] array, int index, out bool value, out string error) + public static bool TryGetBool(string[] array, int index, out bool value, out string? error) { - return ArgUtility.TryGetBool(array, index, out value, out error, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetBool(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetOptionalBool(string[] array, int index, out bool value, out string error, bool defaultValue = false) + public static bool TryGetOptionalBool(string[] array, int index, out bool value, out string? error, bool defaultValue = false) { - return ArgUtility.TryGetOptionalBool(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetOptionalBool(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetDirection(string[] array, int index, out int value, out string error) + public static bool TryGetDirection(string[] array, int index, out int value, out string? error) { - return ArgUtility.TryGetDirection(array, index, out value, out error, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetDirection(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetOptionalDirection(string[] array, int index, out int value, out string error, int defaultValue = Game1.up) + public static bool TryGetOptionalDirection(string[] array, int index, out int value, out string? error, int defaultValue = Game1.up) { - return ArgUtility.TryGetOptionalDirection(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetOptionalDirection(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetEnum(string[] array, int index, out TEnum value, out string error) + public static bool TryGetEnum(string[] array, int index, out TEnum value, out string? error) where TEnum : struct { - return ArgUtility.TryGetEnum(array, index, out value, out error, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetEnum(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetOptionalEnum(string[] array, int index, out TEnum value, out string error, TEnum defaultValue = default) + public static bool TryGetOptionalEnum(string[] array, int index, out TEnum value, out string? error, TEnum defaultValue = default) where TEnum : struct { - return ArgUtility.TryGetOptionalEnum(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetOptionalEnum(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetFloat(string[] array, int index, out float value, out string error) + public static bool TryGetFloat(string[] array, int index, out float value, out string? error) { - return ArgUtility.TryGetFloat(array, index, out value, out error, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetFloat(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetOptionalFloat(string[] array, int index, out float value, out string error, float defaultValue = 0) + public static bool TryGetOptionalFloat(string[] array, int index, out float value, out string? error, float defaultValue = 0) { - return ArgUtility.TryGetOptionalFloat(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetOptionalFloat(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetInt(string[] array, int index, out int value, out string error) + public static bool TryGetInt(string[] array, int index, out int value, out string? error) { - return ArgUtility.TryGetInt(array, index, out value, out error, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetInt(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetOptionalInt(string[] array, int index, out int value, out string error, int defaultValue = 0) + public static bool TryGetOptionalInt(string[] array, int index, out int value, out string? error, int defaultValue = 0) { - return ArgUtility.TryGetOptionalInt(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetOptionalInt(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetPoint(string[] array, int index, out Point value, out string error) + public static bool TryGetPoint(string[] array, int index, out Point value, out string? error) { - return ArgUtility.TryGetPoint(array, index, out value, out error, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetPoint(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetRectangle(string[] array, int index, out Rectangle value, out string error) + public static bool TryGetRectangle(string[] array, int index, out Rectangle value, out string? error) { - return ArgUtility.TryGetRectangle(array, index, out value, out error, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetRectangle(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetVector2(string[] array, int index, out Vector2 value, out string error, bool integerOnly = false) + public static bool TryGetVector2(string[] array, int index, out Vector2 value, out string? error, bool integerOnly = false) { - return ArgUtility.TryGetVector2(array, index, out value, out error, integerOnly, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetVector2(array, index, out value, out error, integerOnly, ArgUtilityFacade_1_6.DefaultName); } /// Changed in Stardew Valley 1.6.9. - public static bool TryGetRemainder(string[] array, int index, out string value, out string error, char delimiter = ' ') + public static bool TryGetRemainder(string[] array, int index, out string? value, out string? error, char delimiter = ' ') { - return ArgUtility.TryGetRemainder(array, index, out value, out error, delimiter, ArgUtilityFacade.DefaultName); + return ArgUtility.TryGetRemainder(array, index, out value, out error, delimiter, ArgUtilityFacade_1_6.DefaultName); } /********* ** Private methods *********/ - private ArgUtilityFacade() + private ArgUtilityFacade_1_6() { RewriteHelper.ThrowFakeConstructorCalled(); } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs index 009cada6..b476b6f9 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs @@ -34,7 +34,7 @@ public class BuffFacade : Buff, IRewriteFacade public void addBuff() { - Game1.player.buffs.Apply(this); + Game1.player.buffs.ApplyLocal(this); } public void removeBuff() diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs index 6bebafae..92ee2a8c 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs @@ -7,14 +7,17 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public class BushFacade : Bush, IRewriteFacade +public class BushFacade_1_6 : Bush, IRewriteFacade { /********* ** Public methods *********/ public void draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Vector2 tileLocation, float yDrawOffset) { - base.draw(spriteBatch, yDrawOffset); + if (this.drawOffset.Y != yDrawOffset) + this.drawOffset = new Point(this.drawOffset.X, this.drawOffset.Y); + + base.draw(spriteBatch); } public void draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Vector2 tileLocation) @@ -59,7 +62,7 @@ public class BushFacade : Bush, IRewriteFacade /********* ** Private methods *********/ - private BushFacade() + private BushFacade_1_6() { RewriteHelper.ThrowFakeConstructorCalled(); } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs index a27accbb..0bb16971 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs @@ -5,7 +5,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public class DialogueFacade : Dialogue, IRewriteFacade +public class DialogueFacade_1_6 : Dialogue, IRewriteFacade { /********* ** Public methods @@ -19,7 +19,7 @@ public class DialogueFacade : Dialogue, IRewriteFacade /********* ** Private methods *********/ - private DialogueFacade() + private DialogueFacade_1_6() : base(null, null) { RewriteHelper.ThrowFakeConstructorCalled(); diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs index ee6fbeed..477e0a1f 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs @@ -10,7 +10,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public class FarmerFacade : Farmer, IRewriteFacade +public class FarmerFacade_1_6 : Farmer, IRewriteFacade { /********* ** Accessors @@ -285,11 +285,10 @@ public class FarmerFacade : Farmer, IRewriteFacade } - /********* ** Private methods *********/ - private FarmerFacade() + private FarmerFacade_1_6() { RewriteHelper.ThrowFakeConstructorCalled(); } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs index 3b01dfba..06be04a2 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs @@ -6,7 +6,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public class ForestFacade : Forest, IRewriteFacade +public class ForestFacade_1_6 : Forest, IRewriteFacade { /********* ** Accessors @@ -40,7 +40,7 @@ public class ForestFacade : Forest, IRewriteFacade /********* ** Private methods *********/ - private ForestFacade() + private ForestFacade_1_6() { RewriteHelper.ThrowFakeConstructorCalled(); } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs index 4b11c202..023f28d1 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs @@ -9,7 +9,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public class Game1Facade : Game1, IRewriteFacade +public class Game1Facade_1_6 : Game1, IRewriteFacade { /********* ** Accessors @@ -179,7 +179,7 @@ public class Game1Facade : Game1, IRewriteFacade /********* ** Private methods *********/ - private Game1Facade() + private Game1Facade_1_6() { RewriteHelper.ThrowFakeConstructorCalled(); } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs index f7545f98..52e97ec5 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs @@ -48,7 +48,7 @@ public class GameLocationFacade : GameLocation, IRewriteFacade } /// Changed in Stardew Valley 1.6.9. - public LightSource getLightSource(int identifier) + public LightSource? getLightSource(int identifier) { return base.getLightSource(identifier.ToString()); } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs index 6ad67457..f9e166cb 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs @@ -20,7 +20,7 @@ internal static class NetRefWrapperCache *********/ /// Get a wrapper for a given value. /// The value to wrap. - public static NetRef GetCachedWrapperFor(T value) + public static NetRef GetCachedWrapperFor(T? value) { if (value is null) throw new InvalidOperationException($"{nameof(NetRefWrapperCache)} doesn't support wrapping null values."); diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs index 0b749fb9..b5ede96b 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs @@ -5,7 +5,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public class LocalizedContentManagerFacade : LocalizedContentManager, IRewriteFacade +public class LocalizedContentManagerFacade_1_6 : LocalizedContentManager, IRewriteFacade { /********* ** Public methods @@ -19,7 +19,7 @@ public class LocalizedContentManagerFacade : LocalizedContentManager, IRewriteFa /********* ** Private methods *********/ - private LocalizedContentManagerFacade() + private LocalizedContentManagerFacade_1_6() : base(null, null) { RewriteHelper.ThrowFakeConstructorCalled(); diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs index 88bed113..c2d263d2 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs @@ -10,7 +10,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; /// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods. /// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. -public abstract class NpcFacade : NPC, IRewriteFacade +public abstract class NpcFacade_1_6 : NPC, IRewriteFacade { /********* ** Accessors @@ -33,7 +33,7 @@ public abstract class NpcFacade : NPC, IRewriteFacade *********/ public static NPC Constructor(AnimatedSprite sprite, Vector2 position, string defaultMap, int facingDirection, string name, bool datable, Dictionary schedule, Texture2D portrait) { - return new NPC(sprite, position, defaultMap, facingDirection, name, datable, portrait); + return new NPC(sprite, position, defaultMap, facingDirection, name, portrait); } public static NPC Constructor(AnimatedSprite sprite, Vector2 position, string defaultMap, int facingDir, string name, Dictionary schedule, Texture2D portrait, bool eventActor, string? syncedPortraitPath = null) @@ -58,7 +58,8 @@ public abstract class NpcFacade : NPC, IRewriteFacade // else replicate old behavior return base.Birthday_Season != null - && base.Birthday_Season == season + && Utility.TryParseEnum(season, out Season parsedSeason) + && base.Birthday_Season.Value == parsedSeason && base.Birthday_Day == day; } @@ -67,7 +68,7 @@ public abstract class NpcFacade : NPC, IRewriteFacade WarpPathfindingCache.PopulateCache(); } - public void showTextAboveHead(string Text, int spriteTextColor = -1, int style = NPC.textStyle_none, int duration = 3000, int preTimer = 0) + public void showTextAboveHead(string Text, int spriteTextColor = -1, int style = SpeechBubble.textStyle_none, int duration = 3000, int preTimer = 0) { Color? color = spriteTextColor != -1 ? SpriteText.getColorFromIndex(spriteTextColor) : null; base.showTextAboveHead(Text, color, style, duration, preTimer); @@ -77,7 +78,7 @@ public abstract class NpcFacade : NPC, IRewriteFacade /********* ** Private methods *********/ - private NpcFacade() + private NpcFacade_1_6() { RewriteHelper.ThrowFakeConstructorCalled(); } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs index ed4d652a..1b1e6728 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs @@ -31,7 +31,7 @@ public class Stats_160_Facade : Stats, IRewriteFacade public uint averageBedtime { get => base.AverageBedtime; - set => base.AverageBedtime = value; + set => base.OnWentToBed((int)value); } public uint beveragesMade @@ -40,12 +40,6 @@ public class Stats_160_Facade : Stats, IRewriteFacade set => base.BeveragesMade = value; } - public uint caveCarrotsFound - { - get => base.CaveCarrotsFound; - set => base.CaveCarrotsFound = value; - } - public uint cheeseMade { get => base.CheeseMade; @@ -256,12 +250,6 @@ public class Stats_160_Facade : Stats, IRewriteFacade set => base.SheepWoolProduced = value; } - public uint slimesKilled - { - get => base.SlimesKilled; - set => base.SlimesKilled = value; - } - public uint stepsTaken { get => base.StepsTaken; diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs index 4c63ec7f..29864b6c 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs @@ -72,7 +72,7 @@ public class UtilityFacade : Utility, IRewriteFacade yield return 3; } - public static T GetRandom(List list, Random? random = null) + public static T? GetRandom(List list, Random? random = null) { return (random ?? Game1.random).ChooseFrom(list); } @@ -85,13 +85,17 @@ public class UtilityFacade : Utility, IRewriteFacade // else replicate old behavior NPC? found = null; - Utility.ForEachCharacter(npc => + if (Utility.TryParseEnum(season, out Season parsedSeason)) { - if (npc.birthday_Season.Value == season && npc.birthday_Day.Value == day) - found = npc; + Utility.ForEachCharacter(npc => + { + if (npc.Birthday_Season == parsedSeason && npc.Birthday_Day == day) + found = npc; + + return found is null; + }); + } - return found is null; - }); return found; } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs index 1cf71c33..7f682172 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs @@ -1,5 +1,6 @@ using Netcode; using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; using StardewValley.GameData; using StardewValley.Objects; @@ -18,9 +19,9 @@ public class WallpaperFacade : Wallpaper, IRewriteFacade /********* ** Public methods *********/ - public virtual ModWallpaperOrFlooring GetModData() + public virtual ModWallpaperOrFlooring? GetModData() { - return base.GetSetData(); + return ItemRegistry.GetData(base.QualifiedItemId)?.RawData as ModWallpaperOrFlooring; } diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/AnimatedSpriteFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/AnimatedSpriteFacade.cs new file mode 100644 index 00000000..3e601fed --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/AnimatedSpriteFacade.cs @@ -0,0 +1,26 @@ +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class AnimatedSpriteFacade : AnimatedSprite, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public new void LoadTexture(string textureName, bool syncTextureName = true) + { + base.LoadTexture(textureName, syncTextureName); + } + + + /********* + ** Private methods + *********/ + private AnimatedSpriteFacade() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ArgUtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ArgUtilityFacade.cs new file mode 100644 index 00000000..31c1d925 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ArgUtilityFacade.cs @@ -0,0 +1,17 @@ +using StardewValley; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class ArgUtilityFacade_1_6_16 : IRewriteFacade +{ + /********* + ** Public methods + *********/ + public static bool TryGetOptionalRemainder(string[]? array, int index, out string? value, string? defaultValue = null, char delimiter = ' ') + { + value = ArgUtility.GetRemainder(array, index, defaultValue, delimiter); + return true; + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BuffManagerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BuffManagerFacade.cs new file mode 100644 index 00000000..f32aa1f7 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BuffManagerFacade.cs @@ -0,0 +1,27 @@ +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.Buffs; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class BuffManagerFacade : BuffManager, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public void Apply(Buff buff) + { + base.ApplyLocal(buff); + } + + + /********* + ** Private methods + *********/ + private BuffManagerFacade() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BushFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BushFacade.cs new file mode 100644 index 00000000..10ae54b8 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BushFacade.cs @@ -0,0 +1,31 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley.TerrainFeatures; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class BushFacade_1_6_16 : Bush, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public void draw(SpriteBatch spriteBatch, float yDrawOffset) + { + if (this.drawOffset.Y != yDrawOffset) + this.drawOffset = new Point(this.drawOffset.X, this.drawOffset.Y); + + base.draw(spriteBatch); + } + + + /********* + ** Private methods + *********/ + private BushFacade_1_6_16() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/DataLoaderFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/DataLoaderFacade.cs new file mode 100644 index 00000000..6fd821ae --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/DataLoaderFacade.cs @@ -0,0 +1,488 @@ +using System.Collections.Generic; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.ContentManagement; +using StardewValley.GameData; +using StardewValley.GameData.BigCraftables; +using StardewValley.GameData.Buffs; +using StardewValley.GameData.Buildings; +using StardewValley.GameData.Bundles; +using StardewValley.GameData.Characters; +using StardewValley.GameData.Crafting; +using StardewValley.GameData.Crops; +using StardewValley.GameData.FarmAnimals; +using StardewValley.GameData.Fences; +using StardewValley.GameData.FishPonds; +using StardewValley.GameData.FloorsAndPaths; +using StardewValley.GameData.FruitTrees; +using StardewValley.GameData.GarbageCans; +using StardewValley.GameData.GiantCrops; +using StardewValley.GameData.HomeRenovations; +using StardewValley.GameData.LocationContexts; +using StardewValley.GameData.Locations; +using StardewValley.GameData.Machines; +using StardewValley.GameData.MakeoverOutfits; +using StardewValley.GameData.Minecarts; +using StardewValley.GameData.Movies; +using StardewValley.GameData.Museum; +using StardewValley.GameData.Objects; +using StardewValley.GameData.Pants; +using StardewValley.GameData.Pets; +using StardewValley.GameData.Powers; +using StardewValley.GameData.Shirts; +using StardewValley.GameData.Shops; +using StardewValley.GameData.SpecialOrders; +using StardewValley.GameData.Tools; +using StardewValley.GameData.Weapons; +using StardewValley.GameData.Weddings; +using StardewValley.GameData.WildTrees; +using StardewValley.GameData.WorldMaps; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class DataLoaderFacade : IRewriteFacade +{ + /********* + ** Public methods + *********/ + // return type changed too, which is a breaking change we can't easily rewrite + ///// + //public static Dictionary Achievements(LocalizedContentManager content) + //{ + // return DataLoader.Achievements(content); + //} + + /// + public static List AdditionalFarms(LocalizedContentManager content) + { + return DataLoader.AdditionalFarms(content); + } + + /// + public static List AdditionalLanguages(LocalizedContentManager content) + { + return DataLoader.AdditionalLanguages(content); + } + + /// + public static List AdditionalWallpaperFlooring(LocalizedContentManager content) + { + return DataLoader.AdditionalWallpaperFlooring(content); + } + + /// + public static Dictionary AnimationDescriptions(LocalizedContentManager content) + { + return DataLoader.AnimationDescriptions(content); + } + + /// + public static Dictionary AquariumFish(LocalizedContentManager content) + { + return DataLoader.AquariumFish(content); + } + + /// + public static Dictionary AudioChanges(LocalizedContentManager content) + { + return DataLoader.AudioChanges(content); + } + + /// + public static Dictionary BigCraftables(LocalizedContentManager content) + { + return DataLoader.BigCraftables(content); + } + + /// + public static Dictionary Boots(LocalizedContentManager content) + { + return DataLoader.Boots(content); + } + + /// + public static Dictionary Buffs(LocalizedContentManager content) + { + return DataLoader.Buffs(content); + } + + /// + public static Dictionary Buildings(LocalizedContentManager content) + { + return DataLoader.Buildings(content); + } + + /// + public static Dictionary Bundles(LocalizedContentManager content) + { + return DataLoader.Bundles(content); + } + + /// + public static Dictionary ChairTiles(LocalizedContentManager content) + { + return DataLoader.ChairTiles(content); + } + + /// + public static Dictionary Characters(LocalizedContentManager content) + { + return DataLoader.Characters(content); + } + + /// + public static List Concessions(LocalizedContentManager content) + { + return DataLoader.Concessions(content); + } + + /// + public static List ConcessionTastes(LocalizedContentManager content) + { + return DataLoader.ConcessionTastes(content); + } + + /// + public static Dictionary CookingRecipes(LocalizedContentManager content) + { + return DataLoader.CookingRecipes(content); + } + + /// + public static Dictionary CraftingRecipes(LocalizedContentManager content) + { + return DataLoader.CraftingRecipes(content); + } + + /// + public static Dictionary Crops(LocalizedContentManager content) + { + return DataLoader.Crops(content); + } + + /// + public static List LostItemsShop(LocalizedContentManager content) + { + return DataLoader.LostItemsShop(content); + } + + /// + public static Dictionary EngagementDialogue(LocalizedContentManager content) + { + return DataLoader.EngagementDialogue(content); + } + + /// + public static Dictionary FarmAnimals(LocalizedContentManager content) + { + return DataLoader.FarmAnimals(content); + } + + /// + public static Dictionary Fences(LocalizedContentManager content) + { + return DataLoader.Fences(content); + } + + /// + public static Dictionary Festivals_FestivalDates(LocalizedContentManager content) + { + return DataLoader.Festivals_FestivalDates(content); + } + + /// + public static Dictionary Fish(LocalizedContentManager content) + { + return DataLoader.Fish(content); + } + + /// + public static List FishPondData(LocalizedContentManager content) + { + return DataLoader.FishPondData(content); + } + + /// + public static Dictionary FloorsAndPaths(LocalizedContentManager content) + { + return DataLoader.FloorsAndPaths(content); + } + + /// + public static Dictionary FruitTrees(LocalizedContentManager content) + { + return DataLoader.FruitTrees(content); + } + + /// + public static Dictionary Furniture(LocalizedContentManager content) + { + return DataLoader.Furniture(content); + } + + /// + public static GarbageCanData GarbageCans(LocalizedContentManager content) + { + return DataLoader.GarbageCans(content); + } + + /// + public static Dictionary GiantCrops(LocalizedContentManager content) + { + return DataLoader.GiantCrops(content); + } + + /// + public static Dictionary HairData(LocalizedContentManager content) + { + return DataLoader.HairData(content); + } + + /// + public static Dictionary Hats(LocalizedContentManager content) + { + return DataLoader.Hats(content); + } + + /// + public static Dictionary HomeRenovations(LocalizedContentManager content) + { + return DataLoader.HomeRenovations(content); + } + + /// + public static Dictionary IncomingPhoneCalls(LocalizedContentManager content) + { + return DataLoader.IncomingPhoneCalls(content); + } + + /// + public static Dictionary JukeboxTracks(LocalizedContentManager content) + { + return DataLoader.JukeboxTracks(content); + } + + /// + public static Dictionary LocationContexts(LocalizedContentManager content) + { + return DataLoader.LocationContexts(content); + } + + /// + public static Dictionary Locations(LocalizedContentManager content) + { + return DataLoader.Locations(content); + } + + /// + public static Dictionary Machines(LocalizedContentManager content) + { + return DataLoader.Machines(content); + } + + /// + public static Dictionary Mail(LocalizedContentManager content) + { + return DataLoader.Mail(content); + } + + /// + public static List MakeoverOutfits(LocalizedContentManager content) + { + return content.Load>("Data/MakeoverOutfits"); + } + + /// + public static Dictionary Mannequins(LocalizedContentManager content) + { + return content.Load>("Data/Mannequins"); + } + + /// + public static Dictionary Minecarts(LocalizedContentManager content) + { + return DataLoader.Minecarts(content); + } + + /// + public static Dictionary Monsters(LocalizedContentManager content) + { + return DataLoader.Monsters(content); + } + + /// + public static Dictionary MonsterSlayerQuests(LocalizedContentManager content) + { + return DataLoader.MonsterSlayerQuests(content); + } + + /// + public static List Movies(LocalizedContentManager content) + { + return DataLoader.Movies(content); + } + + /// + public static List MoviesReactions(LocalizedContentManager content) + { + return DataLoader.MoviesReactions(content); + } + + /// + public static Dictionary MuseumRewards(LocalizedContentManager content) + { + return DataLoader.MuseumRewards(content); + } + + /// + public static Dictionary NpcGiftTastes(LocalizedContentManager content) + { + return DataLoader.NpcGiftTastes(content); + } + + /// + public static Dictionary Objects(LocalizedContentManager content) + { + return DataLoader.Objects(content); + } + + /// + public static Dictionary PaintData(LocalizedContentManager content) + { + return DataLoader.PaintData(content); + } + + /// + public static Dictionary Pants(LocalizedContentManager content) + { + return DataLoader.Pants(content); + } + + /// + public static Dictionary PassiveFestivals(LocalizedContentManager content) + { + return DataLoader.PassiveFestivals(content); + } + + /// + public static Dictionary Pets(LocalizedContentManager content) + { + return DataLoader.Pets(content); + } + + /// + public static Dictionary Powers(LocalizedContentManager content) + { + return content.Load>("Data/Powers"); + } + + /// + public static Dictionary Quests(LocalizedContentManager content) + { + return DataLoader.Quests(content); + } + + /// + public static List RandomBundles(LocalizedContentManager content) + { + return DataLoader.RandomBundles(content); + } + + /// + public static Dictionary SecretNotes(LocalizedContentManager content) + { + return DataLoader.SecretNotes(content); + } + + /// + public static Dictionary Shirts(LocalizedContentManager content) + { + return DataLoader.Shirts(content); + } + + /// + public static Dictionary Shops(LocalizedContentManager content) + { + return DataLoader.Shops(content); + } + + /// + public static Dictionary SpecialOrders(LocalizedContentManager content) + { + return DataLoader.SpecialOrders(content); + } + + /// + public static List TailoringRecipes(LocalizedContentManager content) + { + return DataLoader.TailoringRecipes(content); + } + + /// + public static Dictionary Tools(LocalizedContentManager content) + { + return DataLoader.Tools(content); + } + + /// + public static List TriggerActions(LocalizedContentManager content) + { + return DataLoader.TriggerActions(content); + } + + /// + public static Dictionary Trinkets(LocalizedContentManager content) + { + return content.Load>("Data/Trinkets"); + } + + /// + public static Dictionary Weapons(LocalizedContentManager content) + { + return DataLoader.Weapons(content); + } + + /// + public static WeddingData Weddings(LocalizedContentManager content) + { + return DataLoader.Weddings(content); + } + + /// + public static Dictionary WildTrees(LocalizedContentManager content) + { + return DataLoader.WildTrees(content); + } + + /// + public static Dictionary WorldMap(LocalizedContentManager content) + { + return DataLoader.WorldMap(content); + } + + /**** + ** TV assets + ****/ + /// + public static Dictionary Tv_CookingChannel(LocalizedContentManager content) + { + return DataLoader.Tv_CookingChannel(content); + } + + /// + public static Dictionary Tv_TipChannel(LocalizedContentManager content) + { + return DataLoader.Tv_TipChannel(content); + } + + + /********* + ** Private methods + *********/ + private DataLoaderFacade() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/FarmerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/FarmerFacade.cs new file mode 100644 index 00000000..d4aac5c4 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/FarmerFacade.cs @@ -0,0 +1,54 @@ +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.Inventories; +using StardewValley.Objects; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class FarmerFacade_1_6_16 : Farmer, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public bool addItemToInventoryBool(Item? item, bool makeActiveObject = false) + { + if (item is null || !this.IsLocalPlayer) + return false; + + AddToInventoryResult result = base.TryAddToInventory(item); + + if (makeActiveObject && result.AnyAdded && item is not SpecialItem && result.Remainder != null && item.Stack <= 1) + { + int newItemPosition = this.getIndexOfInventoryItem(item); + if (newItemPosition > -1) + (this.Items[this.CurrentToolIndex], this.Items[newItemPosition]) = (this.Items[newItemPosition], this.Items[this.CurrentToolIndex]); // swap into active position + } + + return result.AnyAdded; + } + + public void applyBuff(Buff buff) + { + base.applyLocalBuff(buff); + } + + public void dropItem(Item? i) + { + if (i is null || !i.canBeDropped()) + return; + + + this.DropItemAtFeet(i, direction: this.FacingDirection); + } + + + /********* + ** Private methods + *********/ + private FarmerFacade_1_6_16() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ForestFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ForestFacade.cs new file mode 100644 index 00000000..5bca037d --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ForestFacade.cs @@ -0,0 +1,28 @@ +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.Locations; +using StardewValley.TerrainFeatures; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class ForestFacade_1_6_16 : Forest, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public bool ShouldTravelingMerchantVisitToday() + { + return Forest.ShouldTravelingMerchantVisit(Game1.Date); + } + + + /********* + ** Private methods + *********/ + private ForestFacade_1_6_16() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/Game1Facade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/Game1Facade.cs new file mode 100644 index 00000000..d49247f5 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/Game1Facade.cs @@ -0,0 +1,26 @@ +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.ContentManagement; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class Game1Facade_1_6_16 : Game1, IRewriteFacade +{ + /********* + ** Accessors + *********/ + public new static LocalizedContentManager content => (LocalizedContentManager)Game1.content; + public new static LocalizedContentManager temporaryContent => (LocalizedContentManager)Game1.temporaryContent; + public new LocalizedContentManager? xTileContent => (LocalizedContentManager?)base.xTileContent; + + + /********* + ** Private methods + *********/ + private Game1Facade_1_6_16() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ItemRegistryFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ItemRegistryFacade.cs new file mode 100644 index 00000000..a05b8258 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ItemRegistryFacade.cs @@ -0,0 +1,33 @@ +using StardewValley; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class ItemRegistryFacade : IRewriteFacade +{ + /********* + ** Public methods + *********/ + public static Item? Create(string itemId, int amount = 1, int quality = 0, bool allowNull = false) + { + return allowNull + ? ItemRegistry.CreateOrNull(itemId, amount, quality) + : ItemRegistry.Create(itemId, amount, quality); + } + + public static TItem? Create(string itemId, int amount = 1, int quality = 0, bool allowNull = false) + where TItem : Item + { + return CreateGeneric(itemId, amount, quality, allowNull); + } + + // referenced from InstructionMetadata + public static TItem? CreateGeneric(string itemId, int amount = 1, int quality = 0, bool allowNull = false) + where TItem : Item + { + return allowNull + ? ItemRegistry.CreateOrNull(itemId, amount, quality) + : ItemRegistry.Create(itemId, amount, quality); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/LocalizedContentManagerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/LocalizedContentManagerFacade.cs new file mode 100644 index 00000000..3ce0c6a4 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/LocalizedContentManagerFacade.cs @@ -0,0 +1,82 @@ +using System; +using System.Reflection; +using StardewModdingAPI.Framework.ContentManagers; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.ContentManagement; +using StardewValley.GameData; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class LocalizedContentManagerFacade_1_6_16 : LocalizedContentManager, IRewriteFacade +{ + /********* + ** Accessors + *********/ + public static string CurrentLanguageString => Game1.content.LanguageString; + public static bool CurrentLanguageLatin => Game1.content.LanguageUsesLatinFont; + public static ModLanguage CurrentModLanguage => Game1.content.LanguageModData; + + public static LanguageCode CurrentLanguageCode + { + get => Game1.content.LanguageCode; + set => Game1.content.LanguageCode = value; + } + + public static event LanguageChangedHandler OnLanguageChange + { + add => Game1.content.OnGlobalLanguageChanged += value; + remove => Game1.content.OnGlobalLanguageChanged -= value; + } + + + /********* + ** Public methods + *********/ + public LanguageCode GetCurrentLanguage() + { + return this.LanguageCode; + } + + public new static LanguageCode GetDefaultLanguageCode() + { + return Game1.content.GetDefaultLanguageCode(); + } + + public new static void SetModLanguage(ModLanguage new_mod_language) + { + Game1.content.SetModLanguage(new_mod_language); + } + + public new LocalizedContentManager CreateTemporary() + { + // + // Note: since method calls are redirected to this implementation, the context doesn't work as you'd expect. + // In particular: + // - `base.CreateTemporary()` calls the vanilla base class (*not* the subclass we're rewriting). + // - `this is GameContentManager` is false even if `this.GetType() == typeof(GameContentManager)`. + // - Private fields (e.g. to cache the reflection) are shared between multiple instances, resulting in access + // violation exceptions. + // + + Type type = this.GetType(); + + if (type == typeof(GameContentManager)) + return (LocalizedContentManager)Game1.content.CreateTemporary(); // skip reflection if we can avoid it + + MethodInfo method = this.GetType().GetMethod(nameof(base.CreateTemporary))!; + return (LocalizedContentManager)method.Invoke(this, [])!; + } + + + /********* + ** Private methods + *********/ + private LocalizedContentManagerFacade_1_6_16() + : base(null, null) + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/NpcFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/NpcFacade.cs new file mode 100644 index 00000000..fae3142b --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/NpcFacade.cs @@ -0,0 +1,47 @@ +using Microsoft.Xna.Framework; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.ContentManagement; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public abstract class NpcFacade_1_6_16 : NPC, IRewriteFacade +{ + /********* + ** Accessors + *********/ + public string? Birthday_Season => + base.Birthday_Season != null + ? Utility.getSeasonNameFromNumber((int)base.Birthday_Season.Value) + : null; + + + /********* + ** Public methods + *********/ + public static NPC Constructor(AnimatedSprite sprite, Vector2 position, int facingDir, string name, LocalizedContentManager? content = null) + { + return new NPC(sprite, position, facingDir, name, content); + } + + public bool TryLoadPortraits(string assetName, out string error, LocalizedContentManager? content = null) + { + return this.TryLoadPortraits(assetName, out error, (IContentManager?)content); + } + + public bool TryLoadSprites(string assetName, out string error, LocalizedContentManager? content = null) + { + return this.TryLoadSprites(assetName, out error, (IContentManager?)content); + } + + + /********* + ** Private methods + *********/ + private NpcFacade_1_6_16() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/PetDataFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/PetDataFacade.cs new file mode 100644 index 00000000..1d1ddb90 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/PetDataFacade.cs @@ -0,0 +1,29 @@ +using System.Linq; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley.GameData.Pets; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public abstract class PetDataFacade : PetData, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public PetBreed? GetBreedById(string breedId, bool allowNull = false) + { + return allowNull + ? base.Breeds?.FirstOrDefault(p => p.Id == breedId) + : base.GetPreferredBreed(breedId); + } + + + /********* + ** Private methods + *********/ + private PetDataFacade() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ResponseFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ResponseFacade.cs new file mode 100644 index 00000000..5666c11c --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ResponseFacade.cs @@ -0,0 +1,31 @@ +using Microsoft.Xna.Framework.Input; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class ResponseFacade : Response, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public Response SetHotKey(Keys key) + { + // note: the original code mutated the instance *and* returned it. Changing the current instance is no longer + // possible since it's immutable, so this only really works for mods which used the return value correctly. + + return new Response(this.responseKey, this.responseText, key); + } + + + /********* + ** Private methods + *********/ + private ResponseFacade() + : base(null, null) + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TemporaryAnimatedSpriteListFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TemporaryAnimatedSpriteListFacade.cs new file mode 100644 index 00000000..b78fab4a --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TemporaryAnimatedSpriteListFacade.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public abstract class TemporaryAnimatedSpriteListFacade : TemporaryAnimatedSpriteList, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public new IEnumerator GetEnumerator() + { + return base.GetEnumerator(); + } + + + /********* + ** Private methods + *********/ + private TemporaryAnimatedSpriteListFacade() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TextBoxFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TextBoxFacade.cs new file mode 100644 index 00000000..1d0e4462 --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TextBoxFacade.cs @@ -0,0 +1,35 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; +using StardewValley.Menus; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public abstract class TextBoxFacade : TextBox, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public void RecieveCommandInput(char command) + { + base.RecieveCommandInput(command, KeyboardModifier.None); + } + + public void RecieveSpecialInput(Keys key) + { + base.RecieveSpecialInput(key, KeyboardModifier.None); + } + + + /********* + ** Private methods + *********/ + private TextBoxFacade() + : base(null, null, null, Color.Transparent) + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/UtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/UtilityFacade.cs new file mode 100644 index 00000000..9ffd929b --- /dev/null +++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/UtilityFacade.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using StardewModdingAPI.Framework.ModLoading.Framework; +using StardewValley; + +namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; + +/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods. +/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info. +public class UtilityFacade_1_6_16 : Utility, IRewriteFacade +{ + /********* + ** Public methods + *********/ + public static bool CollectOrDrop(Item item, int direction) + { + return Game1.player.CollectOrDrop(item, direction); + } + + public static bool CollectOrDrop(Item item) + { + return Game1.player.CollectOrDrop(item); + } + + public static List getDaysOfBooksellerThisSeason() + { + return Utility.getDaysOfBooksellerThisSeason(Game1.season, Game1.year); + } + + + /********* + ** Private methods + *********/ + private UtilityFacade_1_6_16() + { + RewriteHelper.ThrowFakeConstructorCalled(); + } +} diff --git a/src/SMAPI/Metadata/InstructionMetadata.cs b/src/SMAPI/Metadata/InstructionMetadata.cs index 5fbb51de..9928f153 100644 --- a/src/SMAPI/Metadata/InstructionMetadata.cs +++ b/src/SMAPI/Metadata/InstructionMetadata.cs @@ -10,9 +10,11 @@ using StardewModdingAPI.Framework.ModLoading.Finders; using StardewModdingAPI.Framework.ModLoading.Rewriters; using StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_5; using StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6; +using StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16; using StardewValley; using StardewValley.Audio; using StardewValley.BellsAndWhistles; +using StardewValley.Buffs; using StardewValley.Buildings; using StardewValley.ContentManagement; using StardewValley.Enchantments; @@ -20,6 +22,7 @@ using StardewValley.GameData; using StardewValley.GameData.FishPonds; using StardewValley.GameData.FloorsAndPaths; using StardewValley.GameData.Movies; +using StardewValley.GameData.Pets; using StardewValley.GameData.SpecialOrders; using StardewValley.Internal; using StardewValley.Locations; @@ -28,6 +31,7 @@ using StardewValley.Minigames; using StardewValley.Mods; using StardewValley.Network; using StardewValley.Objects; +using StardewValley.Objects.Trinkets; using StardewValley.Pathfinding; using StardewValley.Projectiles; using StardewValley.Quests; @@ -182,7 +186,7 @@ internal class InstructionMetadata // note: types are mapped before members, regardless of the order listed here .MapFacade() .MapFacade() - .MapFacade(typeof(ArgUtility).FullName!, typeof(ArgUtilityFacade)) + .MapFacade(typeof(ArgUtility).FullName!, typeof(ArgUtilityFacade_1_6)) .MapFacade() .MapFacade() .MapFacade() @@ -190,7 +194,7 @@ internal class InstructionMetadata .MapFacade() .MapFacade() .MapFacade() - .MapFacade() + .MapFacade() .MapFacade() .MapFacade() .MapFacade() @@ -204,23 +208,23 @@ internal class InstructionMetadata .MapFacade() .MapFacade() .MapFacade() - .MapFacade() + .MapFacade() .MapFacade() .MapFacade() .MapFacade() .MapFacade() .MapFacade() - .MapFacade() + .MapFacade() .MapFacade() .MapFacade() .MapFacade() .MapFacade() .MapFacade() .MapFacade() - .MapFacade() + .MapFacade() .MapFacade() .MapFacade() - .MapFacade() + .MapFacade() .MapFacade() .MapFacade() .MapFacade() @@ -235,14 +239,14 @@ internal class InstructionMetadata .MapFacade() .MapFacade() .MapFacade() - .MapFacade() + .MapFacade() .MapType("StardewValley.Buildings.Mill", typeof(Building)) .MapFacade() .MapFacade() .MapFacade() .MapFacade() .MapFacade() - .MapFacade() + .MapFacade() .MapFacade() .MapFacade() .MapFacade() @@ -294,7 +298,53 @@ internal class InstructionMetadata .MapMethod("System.Int32 Netcode.NetInt::op_Implicit(Netcode.NetInt)", typeof(ImplicitConversionOperatorsFacade), nameof(ImplicitConversionOperatorsFacade.NetInt_ToInt)) .MapMethod("System.String Netcode.NetString::op_Implicit(Netcode.NetString)", typeof(ImplicitConversionOperatorsFacade), nameof(ImplicitConversionOperatorsFacade.NetString_ToString)) .MapMethod("System.Int32 StardewValley.Network.NetDirection::op_Implicit(StardewValley.Network.NetDirection)", typeof(ImplicitConversionOperatorsFacade), nameof(ImplicitConversionOperatorsFacade.NetDirection_ToInt)) - .MapMethod("!0 StardewValley.Network.NetPausableField`3::op_Implicit(StardewValley.Network.NetPausableField`3)", typeof(NetPausableFieldFacade), nameof(NetPausableFieldFacade.op_Implicit)); + .MapMethod("!0 StardewValley.Network.NetPausableField`3::op_Implicit(StardewValley.Network.NetPausableField`3)", typeof(NetPausableFieldFacade), nameof(NetPausableFieldFacade.op_Implicit)) + + /**** + ** Stardew Valley 1.6.16 + ****/ + // moved types (FishTankFurniture) + .MapType("StardewValley.Objects.FishTankFurniture/FishTankCategories", typeof(StardewValley.Objects.FishTanks.FishTankCategories)) + .MapType("StardewValley.Objects.TankFish", typeof(StardewValley.Objects.FishTanks.TankFish)) + .MapType("StardewValley.Objects.TankFish/FishType", typeof(StardewValley.Objects.FishTanks.FishType)) + + // moved types (LocalizedContentManager) + .MapType("StardewValley.LocalizedContentManager", typeof(LocalizedContentManager)) + .MapType("StardewValley.LocalizedContentManager/LanguageChangedHandler", typeof(LanguageChangedHandler)) + .MapType("StardewValley.LocalizedContentManager/LanguageCode", typeof(LanguageCode)) + + // generic ItemRegistry.Create changes + // For some reason, these aren't handled by the ItemRegistryFacade. We can't list every possible item, + // but we can cover the main ones and add others as needed. + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Axe).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Boots).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Chest).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Clothing).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Furniture).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Hat).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Ring).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(SObject).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Tool).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Trinket).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric)) + + // general API changes + // note: types are mapped before members, regardless of the order listed here + .MapFacade("StardewValley.DataLoader", typeof(DataLoaderFacade)) + .MapFacade() + .MapFacade(typeof(ArgUtility).FullName!, typeof(ArgUtilityFacade_1_6_16)) + .MapFacade() + .MapFacade() + .MapFacade() + .MapFacade() + .MapFacade() + .MapFacade(typeof(ItemRegistry).FullName!, typeof(ItemRegistryFacade)) + .MapFacade() + .MapFacade() + .MapFacade() + .MapFacade() + .MapFacade() + .MapFacade() + .MapFacade(); // heuristic rewrites yield return new HeuristicFieldRewriter(this.ValidateReferencesToAssemblies);