From b2e88bccf63545d950f4cbf47a0466321c614245 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 8 Mar 2017 15:25:30 -0500 Subject: add dictionary/image content helpers for more intuitive usage (#173) --- .../IContentEventHelperForDictionary.cs | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/StardewModdingAPI/IContentEventHelperForDictionary.cs (limited to 'src/StardewModdingAPI/IContentEventHelperForDictionary.cs') diff --git a/src/StardewModdingAPI/IContentEventHelperForDictionary.cs b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs new file mode 100644 index 00000000..1f259920 --- /dev/null +++ b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; + +namespace StardewModdingAPI +{ + /// Encapsulates access and changes to dictionary content being read from a data file. + public interface IContentEventHelperForDictionary + { + /********* + ** Accessors + *********/ + /// The content's locale code, if the content is localised. + string Locale { get; } + + /// The normalised asset name being read. The format may change between platforms; see to compare with a known path. + string AssetName { get; } + + /// The content data being read. + IDictionary Data { get; } + + + /********* + ** Public methods + *********/ + /// Get whether the asset name being loaded matches a given name after normalisation. + /// The expected asset path, relative to the game's content folder and without the .xnb extension or locale suffix (like 'Data\ObjectInformation'). + bool IsAssetName(string path); + + /// Add or replace an entry in the dictionary data. + /// The entry key. + /// The entry value. + void SetEntry(TKey key, TValue value); + + /// Add or replace an entry in the dictionary data. + /// The entry key. + /// A callback which accepts the current value and returns the new value. + void SetEntry(TKey key, Func value); + + /// Replace the entire content value with the given value. This is generally not recommended, since it may break compatibility with other mods or different versions of the game. + /// The new content value. + /// The is null. + void ReplaceWith(IDictionary value); + } +} -- cgit From 28c78e8f25a0d062d0dda49bc089ebebef8bfa20 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 8 Mar 2017 15:30:27 -0500 Subject: add dict content helper method to replace values based on a lambda (#173) --- .../Framework/Content/ContentEventHelperForDictionary.cs | 9 +++++++++ src/StardewModdingAPI/IContentEventHelperForDictionary.cs | 4 ++++ 2 files changed, 13 insertions(+) (limited to 'src/StardewModdingAPI/IContentEventHelperForDictionary.cs') diff --git a/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs b/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs index 8fcaae3c..9bfc16d8 100644 --- a/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs +++ b/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; namespace StardewModdingAPI.Framework.Content { @@ -32,5 +33,13 @@ namespace StardewModdingAPI.Framework.Content { this.Data[key] = value(this.Data[key]); } + + /// Dynamically replace values in the dictionary. + /// A lambda which takes the current key and value for an entry, and returns the new value. + public void Replace(Func replacer) + { + foreach (var pair in this.Data.ToArray()) + this.Data[pair.Key] = replacer(pair.Key, pair.Value); + } } } diff --git a/src/StardewModdingAPI/IContentEventHelperForDictionary.cs b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs index 1f259920..34796d5c 100644 --- a/src/StardewModdingAPI/IContentEventHelperForDictionary.cs +++ b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs @@ -36,6 +36,10 @@ namespace StardewModdingAPI /// A callback which accepts the current value and returns the new value. void SetEntry(TKey key, Func value); + /// Dynamically replace values in the dictionary. + /// A lambda which takes the current key and value for an entry, and returns the new value. + void Replace(Func replacer); + /// Replace the entire content value with the given value. This is generally not recommended, since it may break compatibility with other mods or different versions of the game. /// The new content value. /// The is null. -- cgit From d47cf433f39ddfa77c7903bca676f725052a2592 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 8 Mar 2017 15:34:38 -0500 Subject: use consistent dict helper method naming (#173) --- .../Framework/Content/ContentEventHelperForDictionary.cs | 10 +++++----- src/StardewModdingAPI/IContentEventHelperForDictionary.cs | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src/StardewModdingAPI/IContentEventHelperForDictionary.cs') diff --git a/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs b/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs index 9bfc16d8..8a8a4845 100644 --- a/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs +++ b/src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs @@ -18,25 +18,25 @@ namespace StardewModdingAPI.Framework.Content public ContentEventHelperForDictionary(string locale, string assetName, IDictionary data, Func getNormalisedPath) : base(locale, assetName, data, getNormalisedPath) { } - /// Add or replace an entry in the dictionary data. + /// Add or replace an entry in the dictionary. /// The entry key. /// The entry value. - public void SetEntry(TKey key, TValue value) + public void Set(TKey key, TValue value) { this.Data[key] = value; } - /// Add or replace an entry in the dictionary data. + /// Add or replace an entry in the dictionary. /// The entry key. /// A callback which accepts the current value and returns the new value. - public void SetEntry(TKey key, Func value) + public void Set(TKey key, Func value) { this.Data[key] = value(this.Data[key]); } /// Dynamically replace values in the dictionary. /// A lambda which takes the current key and value for an entry, and returns the new value. - public void Replace(Func replacer) + public void Set(Func replacer) { foreach (var pair in this.Data.ToArray()) this.Data[pair.Key] = replacer(pair.Key, pair.Value); diff --git a/src/StardewModdingAPI/IContentEventHelperForDictionary.cs b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs index 34796d5c..34e69d42 100644 --- a/src/StardewModdingAPI/IContentEventHelperForDictionary.cs +++ b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs @@ -26,19 +26,19 @@ namespace StardewModdingAPI /// The expected asset path, relative to the game's content folder and without the .xnb extension or locale suffix (like 'Data\ObjectInformation'). bool IsAssetName(string path); - /// Add or replace an entry in the dictionary data. + /// Add or replace an entry in the dictionary. /// The entry key. /// The entry value. - void SetEntry(TKey key, TValue value); + void Set(TKey key, TValue value); - /// Add or replace an entry in the dictionary data. + /// Add or replace an entry in the dictionary. /// The entry key. /// A callback which accepts the current value and returns the new value. - void SetEntry(TKey key, Func value); + void Set(TKey key, Func value); /// Dynamically replace values in the dictionary. /// A lambda which takes the current key and value for an entry, and returns the new value. - void Replace(Func replacer); + void Set(Func replacer); /// Replace the entire content value with the given value. This is generally not recommended, since it may break compatibility with other mods or different versions of the game. /// The new content value. -- cgit From ff39e9b1716104e02c92dfd56bb919887873bd3d Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Fri, 10 Mar 2017 11:05:17 -0500 Subject: move generic content properties & methods into separate interface (#173) --- .../Framework/Content/ContentEventBaseHelper.cs | 2 +- src/StardewModdingAPI/IContentEventData.cs | 35 ++++++++++++++++++++++ src/StardewModdingAPI/IContentEventHelper.cs | 25 +--------------- .../IContentEventHelperForDictionary.cs | 24 +-------------- .../IContentEventHelperForImage.cs | 24 +-------------- src/StardewModdingAPI/StardewModdingAPI.csproj | 1 + 6 files changed, 40 insertions(+), 71 deletions(-) create mode 100644 src/StardewModdingAPI/IContentEventData.cs (limited to 'src/StardewModdingAPI/IContentEventHelperForDictionary.cs') diff --git a/src/StardewModdingAPI/Framework/Content/ContentEventBaseHelper.cs b/src/StardewModdingAPI/Framework/Content/ContentEventBaseHelper.cs index 736cdc70..a89fe337 100644 --- a/src/StardewModdingAPI/Framework/Content/ContentEventBaseHelper.cs +++ b/src/StardewModdingAPI/Framework/Content/ContentEventBaseHelper.cs @@ -6,7 +6,7 @@ namespace StardewModdingAPI.Framework.Content { /// Base implementation for a content helper which encapsulates access and changes to content being read from a data file. /// The interface value type. - internal class ContentEventBaseHelper : EventArgs + internal class ContentEventBaseHelper : EventArgs, IContentEventData { /********* ** Properties diff --git a/src/StardewModdingAPI/IContentEventData.cs b/src/StardewModdingAPI/IContentEventData.cs new file mode 100644 index 00000000..a21861d2 --- /dev/null +++ b/src/StardewModdingAPI/IContentEventData.cs @@ -0,0 +1,35 @@ +using System; + +namespace StardewModdingAPI +{ + /// Generic metadata and methods for a content asset being loaded. + /// The expected data type. + public interface IContentEventData + { + /********* + ** Accessors + *********/ + /// The content's locale code, if the content is localised. + string Locale { get; } + + /// The normalised asset name being read. The format may change between platforms; see to compare with a known path. + string AssetName { get; } + + /// The content data being read. + TValue Data { get; } + + + /********* + ** Public methods + *********/ + /// Get whether the asset name being loaded matches a given name after normalisation. + /// The expected asset path, relative to the game's content folder and without the .xnb extension or locale suffix (like 'Data\ObjectInformation'). + bool IsAssetName(string path); + + /// Replace the entire content value with the given value. This is generally not recommended, since it may break compatibility with other mods or different versions of the game. + /// The new content value. + /// The is null. + /// The 's type is not compatible with the loaded asset's type. + void ReplaceWith(TValue value); + } +} diff --git a/src/StardewModdingAPI/IContentEventHelper.cs b/src/StardewModdingAPI/IContentEventHelper.cs index 341778b4..421a1e06 100644 --- a/src/StardewModdingAPI/IContentEventHelper.cs +++ b/src/StardewModdingAPI/IContentEventHelper.cs @@ -3,28 +3,11 @@ namespace StardewModdingAPI { /// Encapsulates access and changes to content being read from a data file. - public interface IContentEventHelper + public interface IContentEventHelper : IContentEventData { - /********* - ** Accessors - *********/ - /// The content's locale code, if the content is localised. - string Locale { get; } - - /// The normalised asset name being read. The format may change between platforms; see to compare with a known path. - string AssetName { get; } - - /// The content data being read. - object Data { get; } - - /********* ** Public methods *********/ - /// Get whether the asset name being loaded matches a given name after normalisation. - /// The expected asset path, relative to the game's content folder and without the .xnb extension or locale suffix (like 'Data\ObjectInformation'). - bool IsAssetName(string path); - /// Get a helper to manipulate the data as a dictionary. /// The expected dictionary key. /// The expected dictionary balue. @@ -39,11 +22,5 @@ namespace StardewModdingAPI /// The expected data type. /// The data can't be converted to . TData GetData(); - - /// Replace the entire content value with the given value. This is generally not recommended, since it may break compatibility with other mods or different versions of the game. - /// The new content value. - /// The is null. - /// The 's type is not compatible with the loaded asset's type. - void ReplaceWith(object value); } } diff --git a/src/StardewModdingAPI/IContentEventHelperForDictionary.cs b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs index 34e69d42..2f9d5a65 100644 --- a/src/StardewModdingAPI/IContentEventHelperForDictionary.cs +++ b/src/StardewModdingAPI/IContentEventHelperForDictionary.cs @@ -4,28 +4,11 @@ using System.Collections.Generic; namespace StardewModdingAPI { /// Encapsulates access and changes to dictionary content being read from a data file. - public interface IContentEventHelperForDictionary + public interface IContentEventHelperForDictionary : IContentEventData> { - /********* - ** Accessors - *********/ - /// The content's locale code, if the content is localised. - string Locale { get; } - - /// The normalised asset name being read. The format may change between platforms; see to compare with a known path. - string AssetName { get; } - - /// The content data being read. - IDictionary Data { get; } - - /********* ** Public methods *********/ - /// Get whether the asset name being loaded matches a given name after normalisation. - /// The expected asset path, relative to the game's content folder and without the .xnb extension or locale suffix (like 'Data\ObjectInformation'). - bool IsAssetName(string path); - /// Add or replace an entry in the dictionary. /// The entry key. /// The entry value. @@ -39,10 +22,5 @@ namespace StardewModdingAPI /// Dynamically replace values in the dictionary. /// A lambda which takes the current key and value for an entry, and returns the new value. void Set(Func replacer); - - /// Replace the entire content value with the given value. This is generally not recommended, since it may break compatibility with other mods or different versions of the game. - /// The new content value. - /// The is null. - void ReplaceWith(IDictionary value); } } diff --git a/src/StardewModdingAPI/IContentEventHelperForImage.cs b/src/StardewModdingAPI/IContentEventHelperForImage.cs index 14bc23a4..1158c868 100644 --- a/src/StardewModdingAPI/IContentEventHelperForImage.cs +++ b/src/StardewModdingAPI/IContentEventHelperForImage.cs @@ -5,28 +5,11 @@ using Microsoft.Xna.Framework.Graphics; namespace StardewModdingAPI { /// Encapsulates access and changes to dictionary content being read from a data file. - public interface IContentEventHelperForImage + public interface IContentEventHelperForImage : IContentEventData { - /********* - ** Accessors - *********/ - /// The content's locale code, if the content is localised. - string Locale { get; } - - /// The normalised asset name being read. The format may change between platforms; see to compare with a known path. - string AssetName { get; } - - /// The content data being read. - Texture2D Data { get; } - - /********* ** Public methods *********/ - /// Get whether the asset name being loaded matches a given name after normalisation. - /// The expected asset path, relative to the game's content folder and without the .xnb extension or locale suffix (like 'Data\ObjectInformation'). - bool IsAssetName(string path); - /// Overwrite part of the image. /// The image to patch into the content. /// The part of the to copy (or null to take the whole texture). This must be within the bounds of the texture. @@ -36,10 +19,5 @@ namespace StardewModdingAPI /// The is outside the bounds of the spritesheet. /// The content being read isn't an image. void PatchImage(Texture2D source, Rectangle? sourceArea = null, Rectangle? targetArea = null, PatchMode patchMode = PatchMode.Replace); - - /// Replace the entire content value with the given value. This is generally not recommended, since it may break compatibility with other mods or different versions of the game. - /// The new content value. - /// The is null. - void ReplaceWith(Texture2D value); } } diff --git a/src/StardewModdingAPI/StardewModdingAPI.csproj b/src/StardewModdingAPI/StardewModdingAPI.csproj index 478d1af0..445f6f37 100644 --- a/src/StardewModdingAPI/StardewModdingAPI.csproj +++ b/src/StardewModdingAPI/StardewModdingAPI.csproj @@ -168,6 +168,7 @@ + -- cgit