diff --git a/docs/release-notes.md b/docs/release-notes.md index 3f7d5198..efab21d5 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -25,6 +25,10 @@ * For SMAPI developers: * The web API now returns an update alert in two new cases: any newer unofficial update (previously only shown if the mod was incompatible), and a newer prerelease version if the installed non-prerelease version is broken (previously only shown if the installed version was prerelease). + * Internal refactoring to simplify game updates: + * Reorganised SMAPI core to reduce coupling to `Game1` and make it easier to navigate. + * `FieldToPropertyRewriter` now auto-rewrites broken field references into properties if possible, so we no longer need to map fields manually. + * `FieldReplaceRewriter` now supports mapping to a different target type. * Internal refactoring to simplify future game updates. ## 3.6.2 diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/FieldReplaceRewriter.cs b/src/SMAPI/Framework/ModLoading/Rewriters/FieldReplaceRewriter.cs index 8043b13a..9166ab86 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/FieldReplaceRewriter.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/FieldReplaceRewriter.cs @@ -25,18 +25,28 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters /********* ** Public methods *********/ + /// Construct an instance. + /// The type whose field to rewrite. + /// The field name to rewrite. + /// The new type which will have the field. + /// The new field name to reference. + public FieldReplaceRewriter(Type fromType, string fromFieldName, Type toType, string toFieldName) + : base(defaultPhrase: $"{fromType.FullName}.{fromFieldName} field") + { + this.Type = fromType; + this.FromFieldName = fromFieldName; + this.ToField = toType.GetField(toFieldName); + if (this.ToField == null) + throw new InvalidOperationException($"The {toType.FullName} class doesn't have a {toFieldName} field."); + } + /// Construct an instance. /// The type whose field to rewrite. /// The field name to rewrite. /// The new field name to reference. public FieldReplaceRewriter(Type type, string fromFieldName, string toFieldName) - : base(defaultPhrase: $"{type.FullName}.{fromFieldName} field") + : this(type, fromFieldName, type, toFieldName) { - this.Type = type; - this.FromFieldName = fromFieldName; - this.ToField = type.GetField(toFieldName); - if (this.ToField == null) - throw new InvalidOperationException($"The {type.FullName} class doesn't have a {toFieldName} field."); } /// Rewrite a CIL instruction reference if needed.