Skip to content

Commit 0db8eb9

Browse files
committed
Merge branch 'develop' into stable
2 parents fd73446 + 72fae01 commit 0db8eb9

File tree

171 files changed

+1210
-999
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

171 files changed

+1210
-999
lines changed

build/common.targets

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ repo. It imports the other MSBuild files as needed.
77
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
88
<PropertyGroup>
99
<!--set general build properties -->
10-
<Version>4.1.10</Version>
10+
<Version>4.2.0</Version>
1111
<Product>SMAPI</Product>
1212
<LangVersion>latest</LangVersion>
1313
<AssemblySearchPaths>$(AssemblySearchPaths);{GAC}</AssemblySearchPaths>

docs/release-notes.md

+26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,32 @@
11
[README](README.md)
22

33
# Release notes
4+
## 4.2.0
5+
Released 24 March 2025 for Stardew Valley 1.6.14 or later. See [release highlights](https://www.patreon.com/posts/125017679).
6+
7+
* For players:
8+
* Fixed `log_context` command not disabling the extra logs when run again.
9+
* Fixed update alerts when using an unofficial port of SMAPI with a four-part version number.
10+
* Fixed installer on Linux not always opening a terminal as intended (thanks to HoodedDeath!).
11+
* Updated compatibility list.
12+
13+
* For mod authors:
14+
* Mod events are now raised on the shipping menu (except when it's actually saving).
15+
* Added translation API methods to query translation keys (`ContainsKey` and `GetKeys`).
16+
* Fixed the game's `Data/ChairTiles` logic not handling unique string IDs like `Maps/Author.ModName` correctly.
17+
* Fixed exception thrown if `modRegistry.GetApi<T>` can't proxy the API to the given interface. It now logs an error and returns null as intended.
18+
19+
* For external tools:
20+
* Added toolkit method to read the compatibility list from a local copy of its Git repo.
21+
22+
* For the web UI:
23+
* You can now link to a mod in the compatibility list by its unique ID, like [smapi.io/mods#Pathoschild.ContentPatcher](https://smapi.io/mods#Pathoschild.ContentPatcher).
24+
* Fixed search engines able to index uploaded logs and JSON files via the raw download option.
25+
* Improved Content Patcher JSON schema:
26+
* Updated for Content Patcher 2.5.0.
27+
* Added format validation for token names.
28+
* Fixed incorrect error when setting a config default to a boolean or number.
29+
430
## 4.1.10
531
Released 18 December 2024 for Stardew Valley 1.6.14 or later.
632

src/SMAPI.Installer/InteractiveInstaller.cs

+15-18
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,7 @@ internal class InteractiveInstaller
2727
private readonly string BundlePath;
2828

2929
/// <summary>The mod IDs which the installer should allow as bundled mods.</summary>
30-
private readonly string[] BundledModIDs = {
31-
"SMAPI.SaveBackup",
32-
"SMAPI.ConsoleCommands"
33-
};
30+
private readonly string[] BundledModIds = ["SMAPI.SaveBackup", "SMAPI.ConsoleCommands"];
3431

3532
/// <summary>Get the absolute file or folder paths to remove when uninstalling SMAPI.</summary>
3633
/// <param name="installDir">The folder for Stardew Valley and SMAPI.</param>
@@ -207,7 +204,7 @@ public void Run(string[] args)
207204
Console.WriteLine();
208205

209206
// handle choice
210-
string choice = this.InteractivelyChoose("Type 1 or 2, then press enter.", new[] { "1", "2" }, printLine: Console.WriteLine);
207+
string choice = this.InteractivelyChoose("Type 1 or 2, then press enter.", ["1", "2"], printLine: Console.WriteLine);
211208
switch (choice)
212209
{
213210
case "1":
@@ -298,7 +295,7 @@ public void Run(string[] args)
298295
this.PrintInfo("[2] Uninstall SMAPI.");
299296
Console.WriteLine();
300297

301-
string choice = this.InteractivelyChoose("Type 1 or 2, then press enter.", new[] { "1", "2" });
298+
string choice = this.InteractivelyChoose("Type 1 or 2, then press enter.", ["1", "2"]);
302299
switch (choice)
303300
{
304301
case "1":
@@ -447,7 +444,7 @@ public void Run(string[] args)
447444
this.PrintWarning($" ignored invalid bundled mod {sourceMod.DisplayName}: {sourceMod.ManifestParseError}");
448445
continue;
449446
}
450-
if (!this.BundledModIDs.Contains(sourceMod.Manifest.UniqueID))
447+
if (!this.BundledModIds.Contains(sourceMod.Manifest.UniqueID))
451448
{
452449
this.PrintWarning($" ignored unknown '{sourceMod.DisplayName}' mod in the installer folder. To add mods, put them here instead: {paths.ModsPath}");
453450
continue;
@@ -709,7 +706,7 @@ private string InteractivelyChoose(string message, string[] options, string inde
709706
}
710707

711708
// get valid install paths & log invalid ones
712-
List<DirectoryInfo> defaultPaths = new();
709+
List<DirectoryInfo> defaultPaths = [];
713710
foreach ((DirectoryInfo dir, GameFolderType type) in this.DetectGameFolders(toolkit, context))
714711
{
715712
if (type is GameFolderType.Valid)
@@ -799,7 +796,7 @@ private string InteractivelyChoose(string message, string[] options, string inde
799796
/// <param name="context">The installer context.</param>
800797
private IEnumerable<(DirectoryInfo, GameFolderType)> DetectGameFolders(ModToolkit toolkit, InstallerContext context)
801798
{
802-
HashSet<string> foundPaths = new HashSet<string>();
799+
HashSet<string> foundPaths = [];
803800

804801
// game folder which contains the installer, if any
805802
{
@@ -830,28 +827,28 @@ private string[] GetInvalidFolderWarning(GameFolderType type)
830827
switch (type)
831828
{
832829
case GameFolderType.Valid:
833-
return new[] { "OK!" }; // should never happen
830+
return ["OK!"]; // should never happen
834831

835832
case GameFolderType.LegacyVersion:
836-
return new[]
837-
{
833+
return
834+
[
838835
"That directory seems to have Stardew Valley 1.5.6 or earlier.",
839836
"Please update your game to the latest version to use SMAPI."
840-
};
837+
];
841838

842839
case GameFolderType.LegacyCompatibilityBranch:
843-
return new[]
844-
{
840+
return
841+
[
845842
"That directory seems to have the Stardew Valley legacy 'compatibility' branch.",
846843
"Unfortunately SMAPI is only compatible with the modern version of the game.",
847844
"Please update your game to the main branch to use SMAPI."
848-
};
845+
];
849846

850847
case GameFolderType.NoGameFound:
851-
return new[] { "That directory doesn't contain a Stardew Valley executable." };
848+
return ["That directory doesn't contain a Stardew Valley executable."];
852849

853850
default:
854-
return new[] { "That directory doesn't seem to contain a valid game install." };
851+
return ["That directory doesn't seem to contain a valid game install."];
855852
}
856853
}
857854

src/SMAPI.Installer/assets/install on Linux.sh

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#!/usr/bin/env bash
22

33
function open_in_terminal { # Checks for a few different terminal emulators to launch the installer through
4-
if which konsole 2&>1 >/dev/null; then # KDE Konsole
4+
if which konsole 2>&1 >/dev/null; then # KDE Konsole
55
konsole -e $1
6-
elif which alacritty 2&>1 >/dev/null; then # Alacritty
6+
elif which alacritty 2>&1 >/dev/null; then # Alacritty
77
alacritty -e $1
8-
elif which gnome-terminal 2&>1 >/dev/null; then # GNOME Terminal
8+
elif which gnome-terminal 2>&1 >/dev/null; then # GNOME Terminal
99
gnome-terminal -- $1
10-
elif which xterm 2&>1 >/dev/null; then # Xterm
10+
elif which xterm 2>&1 >/dev/null; then # Xterm
1111
xterm -e $1
1212
else # Use notify-send to send a message that none of these terminals were found installed and instruct the user to manually invoke this script through a terminal
1313
notify-send --app-name="SMAPI Installer" --urgency=critical "Failed to find a terminal to open installer with. Please use a terminal program to open the 'install on Linux.sh' script"

src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,18 @@ private bool TestColorSupport()
126126
private IDictionary<ConsoleLogLevel, ConsoleColor> GetConsoleColorScheme(Platform platform, ColorSchemeConfig colorConfig)
127127
{
128128
// get color scheme ID
129-
MonitorColorScheme schemeID = colorConfig.UseScheme;
130-
if (schemeID == MonitorColorScheme.AutoDetect)
129+
MonitorColorScheme schemeId = colorConfig.UseScheme;
130+
if (schemeId == MonitorColorScheme.AutoDetect)
131131
{
132-
schemeID = platform == Platform.Mac
132+
schemeId = platform == Platform.Mac
133133
? MonitorColorScheme.LightBackground // macOS doesn't provide console background color info, but it's usually white.
134134
: ColorfulConsoleWriter.IsDark(Console.BackgroundColor) ? MonitorColorScheme.DarkBackground : MonitorColorScheme.LightBackground;
135135
}
136136

137137
// get colors for scheme
138-
return colorConfig.Schemes.TryGetValue(schemeID, out IDictionary<ConsoleLogLevel, ConsoleColor>? scheme)
138+
return colorConfig.Schemes.TryGetValue(schemeId, out IDictionary<ConsoleLogLevel, ConsoleColor>? scheme)
139139
? scheme
140-
: throw new NotSupportedException($"Unknown color scheme '{schemeID}'.");
140+
: throw new NotSupportedException($"Unknown color scheme '{schemeId}'.");
141141
}
142142

143143
/// <summary>Get whether a console color should be considered dark, which is subjectively defined as 'white looks better than black on this text'.</summary>

src/SMAPI.ModBuildConfig.Analyzer.Tests/Mock/Netcode/NetCollection.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
namespace Netcode;
55

66
/// <summary>A simplified version of Stardew Valley's <c>Netcode.NetCollection</c> for unit testing.</summary>
7-
public class NetCollection<T> : Collection<T> { }
7+
public class NetCollection<T> : Collection<T>;

src/SMAPI.ModBuildConfig.Analyzer.Tests/Mock/Netcode/NetInt.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
namespace Netcode;
33

44
/// <summary>A simplified version of Stardew Valley's <c>Netcode.NetInt</c> for unit testing.</summary>
5-
public class NetInt : NetFieldBase<int, NetInt> { }
5+
public class NetInt : NetFieldBase<int, NetInt>;

src/SMAPI.ModBuildConfig.Analyzer.Tests/Mock/Netcode/NetList.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
namespace Netcode;
55

66
/// <summary>A simplified version of Stardew Valley's <c>Netcode.NetObjectList</c> for unit testing.</summary>
7-
public class NetList<T> : List<T> { }
7+
public class NetList<T> : List<T>;

src/SMAPI.ModBuildConfig.Analyzer.Tests/Mock/Netcode/NetObjectList.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
namespace Netcode;
33

44
/// <summary>A simplified version of Stardew Valley's <c>Netcode.NetObjectList</c> for unit testing.</summary>
5-
public class NetObjectList<T> : NetList<T> { }
5+
public class NetObjectList<T> : NetList<T>;

src/SMAPI.ModBuildConfig.Analyzer.Tests/Mock/Netcode/NetRef.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
namespace Netcode;
33

44
/// <summary>A simplified version of Stardew Valley's <c>Netcode.NetRef</c> for unit testing.</summary>
5-
public class NetRef<T> : NetFieldBase<T, NetRef<T>> where T : class { }
5+
public class NetRef<T> : NetFieldBase<T, NetRef<T>> where T : class;

src/SMAPI.ModBuildConfig.Analyzer.Tests/Mock/StardewValley/Item.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ public class Item
2323
public NetRef<object> netRefProperty { get; } = new();
2424

2525
/// <summary>A sample net list.</summary>
26-
public readonly NetList<int> netList = new();
26+
public readonly NetList<int> netList = [];
2727

2828
/// <summary>A sample net object list.</summary>
29-
public readonly NetObjectList<int> netObjectList = new();
29+
public readonly NetObjectList<int> netObjectList = [];
3030

3131
/// <summary>A sample net collection.</summary>
32-
public readonly NetCollection<int> netCollection = new();
32+
public readonly NetCollection<int> netCollection = [];
3333
}

src/SMAPI.ModBuildConfig.Analyzer.Tests/NetFieldAnalyzerTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public void AvoidNetFields_RaisesDiagnostic(string codeText, int column, string
8888
Id = "AvoidNetField",
8989
Message = $"'{expression}' is a {netType} field; consider using the {suggestedProperty} property instead. See https://smapi.io/package/avoid-net-field for details.",
9090
Severity = DiagnosticSeverity.Warning,
91-
Locations = new[] { new DiagnosticResultLocation("Test0.cs", NetFieldAnalyzerTests.SampleCodeLine, NetFieldAnalyzerTests.SampleCodeColumn + column) }
91+
Locations = [new DiagnosticResultLocation("Test0.cs", NetFieldAnalyzerTests.SampleCodeLine, NetFieldAnalyzerTests.SampleCodeColumn + column)]
9292
};
9393

9494
// assert

src/SMAPI.ModBuildConfig.Analyzer.Tests/ObsoleteFieldAnalyzerTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void AvoidObsoleteField_RaisesDiagnostic(string codeText, int column, str
6969
Id = "AvoidObsoleteField",
7070
Message = $"The '{oldName}' field is obsolete and should be replaced with '{newName}'. See https://smapi.io/package/avoid-obsolete-field for details.",
7171
Severity = DiagnosticSeverity.Warning,
72-
Locations = new[] { new DiagnosticResultLocation("Test0.cs", ObsoleteFieldAnalyzerTests.SampleCodeLine, ObsoleteFieldAnalyzerTests.SampleCodeColumn + column) }
72+
Locations = [new DiagnosticResultLocation("Test0.cs", ObsoleteFieldAnalyzerTests.SampleCodeLine, ObsoleteFieldAnalyzerTests.SampleCodeColumn + column)]
7373
};
7474

7575
// assert

src/SMAPI.ModBuildConfig.Analyzer/NetFieldAnalyzer.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public class NetFieldAnalyzer : DiagnosticAnalyzer
154154
/// <summary>Construct an instance.</summary>
155155
public NetFieldAnalyzer()
156156
{
157-
this.SupportedDiagnostics = ImmutableArray.Create(this.AvoidNetFieldRule);
157+
this.SupportedDiagnostics = [this.AvoidNetFieldRule];
158158
}
159159

160160
/// <summary>Called once at session start to register actions in the analysis context.</summary>

src/SMAPI.ModBuildConfig.Analyzer/ObsoleteFieldAnalyzer.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class ObsoleteFieldAnalyzer : DiagnosticAnalyzer
4949
/// <summary>Construct an instance.</summary>
5050
public ObsoleteFieldAnalyzer()
5151
{
52-
this.SupportedDiagnostics = ImmutableArray.CreateRange(this.Rules.Values);
52+
this.SupportedDiagnostics = [.. this.Rules.Values];
5353
}
5454

5555
/// <summary>Called once at session start to register actions in the analysis context.</summary>

src/SMAPI.ModBuildConfig/Framework/ContentPackFileManager.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ internal class ContentPackFileManager : IModFileManager
3939
public ContentPackFileManager(string projectDir, string contentPackDir, string version, string[] ignoreFilePaths, Regex[] ignoreFilePatterns, bool validateManifest)
4040
{
4141
// get folders
42-
DirectoryInfo projectDirInfo = new DirectoryInfo(Path.Combine(projectDir, contentPackDir));
42+
DirectoryInfo projectDirInfo = new(Path.Combine(projectDir, contentPackDir));
4343
if (!projectDirInfo.Exists)
4444
throw GetError($"that folder doesn't exist at {projectDirInfo.FullName}");
4545

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Other/ApplySaveFixCommand.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public override void Handle(IMonitor monitor, string command, ArgumentParser arg
6868
/// <summary>Get all item instances in the world.</summary>
6969
private List<Item> GetLoadedItems()
7070
{
71-
List<Item> loadedItems = new();
71+
List<Item> loadedItems = [];
7272
Utility.ForEachItem(item =>
7373
{
7474
loadedItems.Add(item);

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Other/LogContextCommand.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public LogContextCommand()
2020
/// <param name="args">The command arguments.</param>
2121
public override void Handle(IMonitor monitor, string command, ArgumentParser args)
2222
{
23-
Monitor.ForceLogContext = true;
23+
Monitor.ForceLogContext = !Monitor.ForceLogContext;
2424

2525
monitor.Log(
2626
Monitor.ForceLogContext ? "OK, logging contextual info until you run this command again." : "OK, no longer logging contextual info.",

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Other/RegenerateBundles.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public override void Handle(IMonitor monitor, string command, ArgumentParser arg
5050
{
5151
monitor.Log($"WARNING: this may have unintended consequences (type 'help {command}' for details). Are you sure?", LogLevel.Warn);
5252

53-
string[] newArgs = args.Concat(new[] { "confirm" }).ToArray();
53+
string[] newArgs = args.Concat(["confirm"]).ToArray();
5454
monitor.Log($"To confirm, enter this command: '{command} {string.Join(" ", newArgs)}'.", LogLevel.Info);
5555
return;
5656
}

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/AddCommand.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public override void Handle(IMonitor monitor, string command, ArgumentParser arg
4141

4242
// find matching item
4343
SearchableItem? match = id != null
44-
? this.FindItemByID(monitor, id)
44+
? this.FindItemById(monitor, id)
4545
: this.FindItemByName(monitor, name);
4646
if (match == null)
4747
return;
@@ -119,7 +119,7 @@ private bool TryReadArguments(ArgumentParser args, out string? id, out string? n
119119
/// <summary>Get a matching item by its ID.</summary>
120120
/// <param name="monitor">Writes messages to the console and log file.</param>
121121
/// <param name="id">The qualified item ID.</param>
122-
private SearchableItem? FindItemByID(IMonitor monitor, string id)
122+
private SearchableItem? FindItemById(IMonitor monitor, string id)
123123
{
124124
SearchableItem? item = this.Items
125125
.GetAll()
@@ -156,8 +156,8 @@ private bool TryReadArguments(ArgumentParser args, out string? id, out string? n
156156
// handle ambiguous results
157157
string options = this.GetTableString(
158158
data: matches,
159-
header: new[] { "type", "name", "command" },
160-
getRow: item => new[] { item.Type.ToString(), item.DisplayName, $"player_add {item.QualifiedItemId}" }
159+
header: ["type", "name", "command"],
160+
getRow: item => [item.Type.ToString(), item.DisplayName, $"player_add {item.QualifiedItemId}"]
161161
);
162162
monitor.Log($"Multiple items have a name containing '{name}'. Do you mean one of these?\n\n{options}", LogLevel.Info);
163163
return null;

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/ListItemsCommand.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ public override void Handle(IMonitor monitor, string command, ArgumentParser arg
4040
SearchableItem[] matches =
4141
(
4242
from item in this.GetItems(args.ToArray())
43-
orderby item.Type.ToString(), item.Name
43+
orderby item.Type, item.Name
4444
select item
4545
)
4646
.ToArray();
4747
string summary = "Searching...\n";
4848
if (matches.Any())
49-
monitor.Log(summary + this.GetTableString(matches, new[] { "name", "id" }, val => new[] { val.Name, val.QualifiedItemId }), LogLevel.Info);
49+
monitor.Log(summary + this.GetTableString(matches, ["name", "id"], val => [val.Name, val.QualifiedItemId]), LogLevel.Info);
5050
else
5151
monitor.Log(summary + "No items found", LogLevel.Info);
5252
}

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetColorCommand.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public SetColorCommand()
2222
public override void Handle(IMonitor monitor, string command, ArgumentParser args)
2323
{
2424
// parse arguments
25-
if (!args.TryGet(0, "target", out string? target, oneOf: new[] { "hair", "eyes", "pants" }))
25+
if (!args.TryGet(0, "target", out string? target, oneOf: ["hair", "eyes", "pants"]))
2626
return;
2727
if (!args.TryGet(1, "color", out string? rawColor))
2828
return;

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetNameCommand.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public SetNameCommand()
2121
public override void Handle(IMonitor monitor, string command, ArgumentParser args)
2222
{
2323
// parse arguments
24-
if (!args.TryGet(0, "target", out string? target, oneOf: new[] { "player", "farm" }))
24+
if (!args.TryGet(0, "target", out string? target, oneOf: ["player", "farm"]))
2525
return;
2626
args.TryGet(1, "name", out string? name, required: false);
2727

src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Player/SetStyleCommand.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ public SetStyleCommand()
2121
public override void Handle(IMonitor monitor, string command, ArgumentParser args)
2222
{
2323
// parse arguments
24-
if (!args.TryGet(0, "target", out string? target, oneOf: new[] { "hair", "shirt", "acc", "skin", "shoe", "swim", "gender" }))
24+
if (!args.TryGet(0, "target", out string? target, oneOf: ["hair", "shirt", "acc", "skin", "shoe", "swim", "gender"]))
2525
return;
26-
if (!args.TryGet(1, "style ID", out string? styleID))
26+
if (!args.TryGet(1, "style ID", out string? styleId))
2727
return;
2828

2929
bool AssertIntStyle(out int id)
3030
{
31-
if (int.TryParse(styleID, out id))
31+
if (int.TryParse(styleId, out id))
3232
return true;
3333

3434
monitor.Log($"The style ID must be a numeric integer for the '{target}' target.", LogLevel.Error);
@@ -47,7 +47,7 @@ bool AssertIntStyle(out int id)
4747
break;
4848

4949
case "shirt":
50-
Game1.player.changeShirt(styleID);
50+
Game1.player.changeShirt(styleId);
5151
monitor.Log("OK, your shirt style is updated.", LogLevel.Info);
5252
break;
5353

@@ -68,7 +68,7 @@ bool AssertIntStyle(out int id)
6868
break;
6969

7070
case "shoe":
71-
Game1.player.changeShoeColor(styleID);
71+
Game1.player.changeShoeColor(styleId);
7272
monitor.Log("OK, your shoe style is updated.", LogLevel.Info);
7373
break;
7474

0 commit comments

Comments
 (0)