summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/SMAPI.sln.DotSettings1
-rw-r--r--src/SMAPI/Framework/ContentManagers/BaseContentManager.cs22
-rw-r--r--src/SMAPI/Framework/ContentManagers/ModContentManager.cs15
-rw-r--r--src/SMAPI/Metadata/CoreAssetPropagator.cs2
4 files changed, 23 insertions, 17 deletions
diff --git a/src/SMAPI.sln.DotSettings b/src/SMAPI.sln.DotSettings
index 71cd7b82..b85185d5 100644
--- a/src/SMAPI.sln.DotSettings
+++ b/src/SMAPI.sln.DotSettings
@@ -53,6 +53,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pathoschild/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=premultiplied/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=premultiply/@EntryIndexedValue">True</s:Boolean>
+ <s:Boolean x:Key="/Default/UserDictionary/Words/=Prenormalize/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=prerelease/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=pufferchick/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rewriter/@EntryIndexedValue">True</s:Boolean>
diff --git a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs
index f41a9354..2d921cc3 100644
--- a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs
+++ b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs
@@ -104,20 +104,21 @@ namespace StardewModdingAPI.Framework.ContentManagers
/// <inheritdoc />
[Obsolete("This method is implemented for the base game and should not be used directly. To load an asset from the underlying content manager directly, use " + nameof(BaseContentManager.RawLoad) + " instead.")]
- public override T LoadBase<T>(string assetName)
+ public sealed override T LoadBase<T>(string assetName)
{
return this.Load<T>(assetName, LanguageCode.en);
}
/// <inheritdoc />
- public override T Load<T>(string assetName)
+ public sealed override T Load<T>(string assetName)
{
return this.Load<T>(assetName, this.Language);
}
/// <inheritdoc />
- public override T Load<T>(string assetName, LanguageCode language)
+ public sealed override T Load<T>(string assetName, LanguageCode language)
{
+ assetName = this.PrenormalizeRawAssetName(assetName);
IAssetName parsedName = this.Coordinator.ParseAssetName(assetName);
return this.LoadLocalized<T>(parsedName, language, useCache: true);
}
@@ -276,6 +277,21 @@ namespace StardewModdingAPI.Framework.ContentManagers
/*********
** Private methods
*********/
+ /// <summary>Apply initial normalization to a raw asset name before it's parsed.</summary>
+ /// <param name="assetName">The asset name to normalize.</param>
+ private string PrenormalizeRawAssetName(string assetName)
+ {
+ // trim
+ assetName = assetName?.Trim();
+
+ // For legacy reasons, mods can pass .xnb file extensions to the content pipeline which
+ // are then stripped. This will be re-added as needed when reading from raw files.
+ if (assetName?.EndsWith(".xnb") == true)
+ assetName = assetName[..^".xnb".Length];
+
+ return assetName;
+ }
+
/// <summary>Normalize path separators in a file path. For asset keys, see <see cref="AssertAndNormalizeAssetName"/> instead.</summary>
/// <param name="path">The file path to normalize.</param>
[Pure]
diff --git a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs
index 2a5a3f16..63b40d66 100644
--- a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs
+++ b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs
@@ -32,9 +32,6 @@ namespace StardewModdingAPI.Framework.ContentManagers
/// <summary>The game content manager used for map tilesheets not provided by the mod.</summary>
private readonly IContentManager GameContentManager;
- /// <summary>The language code for language-agnostic mod assets.</summary>
- private readonly LanguageCode DefaultLanguage = Constants.DefaultLanguage;
-
/// <summary>If a map tilesheet's image source has no file extensions, the file extensions to check for in the local mod folder.</summary>
private readonly string[] LocalTilesheetExtensions = { ".png", ".xnb" };
@@ -76,12 +73,6 @@ namespace StardewModdingAPI.Framework.ContentManagers
}
/// <inheritdoc />
- public override T Load<T>(string assetName)
- {
- return this.Load<T>(assetName, this.DefaultLanguage);
- }
-
- /// <inheritdoc />
public override T LoadExact<T>(IAssetName assetName, bool useCache)
{
// disable caching
@@ -222,14 +213,14 @@ namespace StardewModdingAPI.Framework.ContentManagers
private FileInfo GetModFile(string path)
{
// try exact match
- FileInfo file = new FileInfo(Path.Combine(this.FullRootDirectory, path));
+ FileInfo file = new(Path.Combine(this.FullRootDirectory, path));
// try with default extension
- if (!file.Exists && file.Extension == string.Empty)
+ if (!file.Exists)
{
foreach (string extension in this.LocalTilesheetExtensions)
{
- FileInfo result = new FileInfo(file.FullName + extension);
+ FileInfo result = new(file.FullName + extension);
if (result.Exists)
{
file = result;
diff --git a/src/SMAPI/Metadata/CoreAssetPropagator.cs b/src/SMAPI/Metadata/CoreAssetPropagator.cs
index 832148aa..424abc18 100644
--- a/src/SMAPI/Metadata/CoreAssetPropagator.cs
+++ b/src/SMAPI/Metadata/CoreAssetPropagator.cs
@@ -95,8 +95,6 @@ namespace StardewModdingAPI.Metadata
.Distinct()
.ToDictionary(name => name, _ => false);
- this.Monitor.Log($"Propagating: {propagatedAssets.Keys.OrderBy(p => p.Name, StringComparer.OrdinalIgnoreCase)}", LogLevel.Alert);
-
// group into optimized lists
var buckets = assets.GroupBy(p =>
{