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.