summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/SMAPI.Installer/StardewModdingAPI.Installer.csproj75
-rw-r--r--src/SMAPI.ModBuildConfig.Analyzer.Tests/SMAPI.ModBuildConfig.Analyzer.Tests.csproj2
-rw-r--r--src/SMAPI.ModBuildConfig.Analyzer/StardewModdingAPI.ModBuildConfig.Analyzer.csproj6
-rw-r--r--src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj79
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/ModEntry.cs1
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj92
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/manifest.json14
-rw-r--r--src/SMAPI.Mods.SaveBackup/ModEntry.cs6
-rw-r--r--src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj63
-rw-r--r--src/SMAPI.Mods.SaveBackup/manifest.json14
-rw-r--r--src/SMAPI.Tests/StardewModdingAPI.Tests.csproj74
-rw-r--r--src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs (renamed from src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifest.cs)0
-rw-r--r--src/SMAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs (renamed from src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs)0
-rw-r--r--src/SMAPI.Toolkit.CoreInterfaces/IManifestDependency.cs (renamed from src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestDependency.cs)0
-rw-r--r--src/SMAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs (renamed from src/StardewModdingAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs)0
-rw-r--r--src/SMAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs (renamed from src/StardewModdingAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs)0
-rw-r--r--src/SMAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj (renamed from src/StardewModdingAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj)2
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs)19
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs)6
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs)6
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/MetadataModel.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataField.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataModel.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecord.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModDatabase.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModStatus.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModStatus.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModWarning.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModData/ModWarning.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModScanning/ModFolder.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModFolder.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModScanner.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs)0
-rw-r--r--src/SMAPI.Toolkit/Framework/UpdateData/UpdateKey.cs (renamed from src/StardewModdingAPI.Toolkit/Framework/UpdateData/UpdateKey.cs)0
-rw-r--r--src/SMAPI.Toolkit/ModToolkit.cs (renamed from src/StardewModdingAPI.Toolkit/ModToolkit.cs)0
-rw-r--r--src/SMAPI.Toolkit/Properties/AssemblyInfo.cs (renamed from src/StardewModdingAPI.Toolkit/Properties/AssemblyInfo.cs)0
-rw-r--r--src/SMAPI.Toolkit/SemanticVersion.cs (renamed from src/StardewModdingAPI.Toolkit/SemanticVersion.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/InternalExtensions.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/InternalExtensions.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/JsonHelper.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/JsonHelper.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/Models/Manifest.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/Models/Manifest.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/Models/ManifestDependency.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestDependency.cs)0
-rw-r--r--src/SMAPI.Toolkit/Serialisation/SParseException.cs (renamed from src/StardewModdingAPI.Toolkit/Serialisation/SParseException.cs)0
-rw-r--r--src/SMAPI.Toolkit/StardewModdingAPI.Toolkit.csproj (renamed from src/StardewModdingAPI.Toolkit/StardewModdingAPI.Toolkit.csproj)5
-rw-r--r--src/SMAPI.Toolkit/Utilities/FileUtilities.cs (renamed from src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs)0
-rw-r--r--src/SMAPI.Toolkit/Utilities/PathUtilities.cs (renamed from src/StardewModdingAPI.Toolkit/Utilities/PathUtilities.cs)0
-rw-r--r--src/SMAPI.Web/Controllers/IndexController.cs2
-rw-r--r--src/SMAPI.Web/Framework/LogParsing/LogParser.cs2
-rw-r--r--src/SMAPI.Web/Properties/launchSettings.json34
-rw-r--r--src/SMAPI.Web/StardewModdingAPI.Web.csproj8
-rw-r--r--src/SMAPI.Web/ViewModels/ModModel.cs8
-rw-r--r--src/SMAPI.Web/Views/Index/Index.cshtml33
-rw-r--r--src/SMAPI.Web/Views/LogParser/Index.cshtml14
-rw-r--r--src/SMAPI.Web/Views/Mods/Index.cshtml34
-rw-r--r--src/SMAPI.Web/appsettings.Development.json46
-rw-r--r--src/SMAPI.Web/appsettings.json98
-rw-r--r--src/SMAPI.Web/wwwroot/Content/css/index.css24
-rw-r--r--src/SMAPI.Web/wwwroot/Content/images/ko-fi.pngbin0 -> 2435 bytes
-rw-r--r--src/SMAPI.Web/wwwroot/Content/images/patreon.pngbin0 -> 4180 bytes
-rw-r--r--src/SMAPI.Web/wwwroot/Content/images/paypal.pngbin0 -> 2013 bytes
-rw-r--r--src/SMAPI.Web/wwwroot/Content/js/mods.js48
-rw-r--r--src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json862
-rw-r--r--src/SMAPI.sln87
-rw-r--r--src/SMAPI/Constants.cs2
-rw-r--r--src/SMAPI/Framework/ContentManagers/ModContentManager.cs2
-rw-r--r--src/SMAPI/Framework/DeprecationManager.cs2
-rw-r--r--src/SMAPI/Framework/Monitor.cs2
-rw-r--r--src/SMAPI/Framework/SCore.cs13
-rw-r--r--src/SMAPI/Framework/SGame.cs4
-rw-r--r--src/SMAPI/IMonitor.cs2
-rw-r--r--src/SMAPI/Patches/DialogueErrorPatch.cs49
-rw-r--r--src/SMAPI/Patches/EventErrorPatch.cs84
-rw-r--r--src/SMAPI/Patches/LoadContextPatch.cs (renamed from src/SMAPI/Patches/LoadForNewGamePatch.cs)49
-rw-r--r--src/SMAPI/Patches/ObjectErrorPatch.cs32
-rw-r--r--src/SMAPI/Program.cs16
-rw-r--r--src/SMAPI/StardewModdingAPI.config.json114
-rw-r--r--src/SMAPI/StardewModdingAPI.csproj380
-rw-r--r--src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiSmapi3Status.cs18
89 files changed, 1050 insertions, 1483 deletions
diff --git a/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj b/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj
index 083044fb..ac64a774 100644
--- a/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj
+++ b/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj
@@ -1,62 +1,32 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+<Project Sdk="Microsoft.NET.Sdk">
+
<PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
- <ProjectGuid>{443DDF81-6AAF-420A-A610-3459F37E5575}</ProjectGuid>
- <OutputType>Exe</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StardewModdingAPI.Installer</RootNamespace>
<AssemblyName>StardewModdingAPI.Installer</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
- <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+ <TargetFramework>net45</TargetFramework>
+ <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
- <PlatformTarget>x86</PlatformTarget>
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>$(SolutionDir)\..\bin\Debug\Installer</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+ <OutputType>Exe</OutputType>
<PlatformTarget>x86</PlatformTarget>
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>$(SolutionDir)\..\bin\Release\Installer</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
+ <OutputPath>$(SolutionDir)\..\bin\$(Configuration)\Installer</OutputPath>
+ <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
+
<ItemGroup>
- <Reference Include="System" />
- <Reference Include="System.IO.Compression" />
- <Reference Include="System.IO.Compression.FileSystem" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="..\..\build\GlobalAssemblyInfo.cs">
- <Link>Properties\GlobalAssemblyInfo.cs</Link>
- </Compile>
- <Compile Include="Enums\ScriptAction.cs" />
- <Compile Include="Framework\InstallerPaths.cs" />
- <Compile Include="InteractiveInstaller.cs" />
- <Compile Include="Program.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="..\..\build\GlobalAssemblyInfo.cs" Link="Properties\GlobalAssemblyInfo.cs" />
</ItemGroup>
+
<ItemGroup>
- <Content Include="README.txt">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </Content>
+ <ProjectReference Include="..\SMAPI.Toolkit\StardewModdingAPI.Toolkit.csproj" />
</ItemGroup>
+
<ItemGroup>
- <Content Include="windows-exe-config.xml">
+ <None Update="README.txt">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="windows-exe-config.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
+ </None>
<None Include="windows-install.bat">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
@@ -67,14 +37,9 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit\StardewModdingAPI.Toolkit.csproj">
- <Project>{ea5cfd2e-9453-4d29-b80f-8e0ea23f4ac6}</Project>
- <Name>StardewModdingAPI.Toolkit</Name>
- </ProjectReference>
- </ItemGroup>
+
<Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\..\build\common.targets" />
<Import Project="..\..\build\prepare-install-package.targets" />
-</Project> \ No newline at end of file
+
+</Project>
diff --git a/src/SMAPI.ModBuildConfig.Analyzer.Tests/SMAPI.ModBuildConfig.Analyzer.Tests.csproj b/src/SMAPI.ModBuildConfig.Analyzer.Tests/SMAPI.ModBuildConfig.Analyzer.Tests.csproj
index 26065ec2..45953eec 100644
--- a/src/SMAPI.ModBuildConfig.Analyzer.Tests/SMAPI.ModBuildConfig.Analyzer.Tests.csproj
+++ b/src/SMAPI.ModBuildConfig.Analyzer.Tests/SMAPI.ModBuildConfig.Analyzer.Tests.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
diff --git a/src/SMAPI.ModBuildConfig.Analyzer/StardewModdingAPI.ModBuildConfig.Analyzer.csproj b/src/SMAPI.ModBuildConfig.Analyzer/StardewModdingAPI.ModBuildConfig.Analyzer.csproj
index 9d646e8f..1d8d7227 100644
--- a/src/SMAPI.ModBuildConfig.Analyzer/StardewModdingAPI.ModBuildConfig.Analyzer.csproj
+++ b/src/SMAPI.ModBuildConfig.Analyzer/StardewModdingAPI.ModBuildConfig.Analyzer.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
@@ -11,12 +11,12 @@
<ItemGroup>
<Compile Include="..\..\build\GlobalAssemblyInfo.cs" Link="Properties\GlobalAssemblyInfo.cs" />
</ItemGroup>
-
+
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="2.8.2" PrivateAssets="all" />
<PackageReference Update="NETStandard.Library" PrivateAssets="all" />
</ItemGroup>
-
+
<ItemGroup>
<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
diff --git a/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj b/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj
index 9118b043..44f0a3e7 100644
--- a/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj
+++ b/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj
@@ -1,73 +1,34 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+<Project Sdk="Microsoft.NET.Sdk">
+
<PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
- <ProjectGuid>{EA4F1E80-743F-4A1D-9757-AE66904A196A}</ProjectGuid>
- <OutputType>Library</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StardewModdingAPI.ModBuildConfig</RootNamespace>
<AssemblyName>StardewModdingAPI.ModBuildConfig</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
+ <TargetFramework>net45</TargetFramework>
+ <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
+ <PlatformTarget>x86</PlatformTarget>
+ <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>bin\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="Microsoft.Build" />
- <Reference Include="Microsoft.Build.Framework" />
- <Reference Include="Microsoft.Build.Utilities.v4.0" />
- <Reference Include="System" />
- <Reference Include="System.IO.Compression" />
- <Reference Include="System.Web.Extensions" />
- </ItemGroup>
+
<ItemGroup>
- <Compile Include="DeployModTask.cs" />
- <Compile Include="Framework\UserErrorException.cs" />
- <Compile Include="Framework\ModFileManager.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
+ <ProjectReference Include="..\SMAPI.Toolkit\StardewModdingAPI.Toolkit.csproj" />
</ItemGroup>
+
<ItemGroup>
- <None Include="assets\nuget-icon.pdn" />
- <None Include="build\smapi.targets">
- <SubType>Designer</SubType>
+ <None Include="..\..\docs\mod-build-config.md">
+ <Link>mod-build-config.md</Link>
</None>
- <None Include="package.nuspec">
- <SubType>Designer</SubType>
- </None>
- </ItemGroup>
- <ItemGroup>
- <Content Include="assets\nuget-icon.png" />
</ItemGroup>
+
<ItemGroup>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj">
- <Project>{d5cfd923-37f1-4bc3-9be8-e506e202ac28}</Project>
- <Name>StardewModdingAPI.Toolkit.CoreInterfaces</Name>
- </ProjectReference>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit\StardewModdingAPI.Toolkit.csproj">
- <Project>{ea5cfd2e-9453-4d29-b80f-8e0ea23f4ac6}</Project>
- <Name>StardewModdingAPI.Toolkit</Name>
- </ProjectReference>
+ <Reference Include="Microsoft.Build" />
+ <Reference Include="Microsoft.Build.Framework" />
+ <Reference Include="Microsoft.Build.Utilities.v4.0" />
+ <Reference Include="System.IO.Compression" />
+ <Reference Include="System.Web.Extensions" />
</ItemGroup>
+
<Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\..\build\common.targets" />
- <Import Project="..\..\build\prepare-nuget-package.targets" />
-</Project> \ No newline at end of file
+
+</Project>
diff --git a/src/SMAPI.Mods.ConsoleCommands/ModEntry.cs b/src/SMAPI.Mods.ConsoleCommands/ModEntry.cs
index 77dace26..4807c46d 100644
--- a/src/SMAPI.Mods.ConsoleCommands/ModEntry.cs
+++ b/src/SMAPI.Mods.ConsoleCommands/ModEntry.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using StardewModdingAPI.Events;
using StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands;
namespace StardewModdingAPI.Mods.ConsoleCommands
diff --git a/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj b/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj
index 2c958dbc..b535e2fd 100644
--- a/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj
+++ b/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj
@@ -1,93 +1,35 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+<Project Sdk="Microsoft.NET.Sdk">
+
<PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
- <ProjectGuid>{28480467-1A48-46A7-99F8-236D95225359}</ProjectGuid>
- <OutputType>Library</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StardewModdingAPI.Mods.ConsoleCommands</RootNamespace>
<AssemblyName>ConsoleCommands</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
+ <TargetFramework>net45</TargetFramework>
+ <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>$(SolutionDir)\..\bin\Debug\Mods\ConsoleCommands\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <PlatformTarget>x86</PlatformTarget>
- <Prefer32Bit>false</Prefer32Bit>
- <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>$(SolutionDir)\..\bin\Release\Mods\ConsoleCommands\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <Prefer32Bit>false</Prefer32Bit>
- <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+ <OutputPath>$(SolutionDir)\..\bin\$(Configuration)\Mods\ConsoleCommands</OutputPath>
+ <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
+
<ItemGroup>
- <Reference Include="System" />
- <Reference Include="System.Xml" />
+ <ProjectReference Include="..\SMAPI\StardewModdingAPI.csproj">
+ <Private>False</Private>
+ </ProjectReference>
</ItemGroup>
+
<ItemGroup>
<Compile Include="..\..\build\GlobalAssemblyInfo.cs">
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
- <Compile Include="Framework\Commands\ArgumentParser.cs" />
- <Compile Include="Framework\Commands\Other\ShowDataFilesCommand.cs" />
- <Compile Include="Framework\Commands\Other\ShowGameFilesCommand.cs" />
- <Compile Include="Framework\Commands\Other\DebugCommand.cs" />
- <Compile Include="Framework\Commands\Player\ListItemTypesCommand.cs" />
- <Compile Include="Framework\Commands\Player\ListItemsCommand.cs" />
- <Compile Include="Framework\Commands\Player\AddCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetStyleCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetColorCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetMaxHealthCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetMaxStaminaCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetHealthCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetImmunityCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetStaminaCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetNameCommand.cs" />
- <Compile Include="Framework\Commands\Player\SetMoneyCommand.cs" />
- <Compile Include="Framework\Commands\TrainerCommand.cs" />
- <Compile Include="Framework\Commands\World\SetMineLevelCommand.cs" />
- <Compile Include="Framework\Commands\World\DownMineLevelCommand.cs" />
- <Compile Include="Framework\Commands\World\ClearCommand.cs" />
- <Compile Include="Framework\Commands\World\SetYearCommand.cs" />
- <Compile Include="Framework\Commands\World\SetSeasonCommand.cs" />
- <Compile Include="Framework\Commands\World\SetDayCommand.cs" />
- <Compile Include="Framework\Commands\World\SetTimeCommand.cs" />
- <Compile Include="Framework\Commands\World\FreezeTimeCommand.cs" />
- <Compile Include="Framework\ItemData\ItemType.cs" />
- <Compile Include="Framework\Commands\ITrainerCommand.cs" />
- <Compile Include="Framework\ItemData\SearchableItem.cs" />
- <Compile Include="Framework\ItemRepository.cs" />
- <Compile Include="ModEntry.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\SMAPI\StardewModdingAPI.csproj">
- <Project>{f1a573b0-f436-472c-ae29-0b91ea6b9f8f}</Project>
- <Name>StardewModdingAPI</Name>
- <Private>False</Private>
- </ProjectReference>
</ItemGroup>
+
<ItemGroup>
- <None Include="manifest.json">
+ <None Update="manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+
+ <Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
<Import Project="..\..\build\common.targets" />
-</Project> \ No newline at end of file
+
+</Project>
diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json
index c1aabe48..74295410 100644
--- a/src/SMAPI.Mods.ConsoleCommands/manifest.json
+++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json
@@ -1,9 +1,9 @@
{
- "Name": "Console Commands",
- "Author": "SMAPI",
- "Version": "2.11.2",
- "Description": "Adds SMAPI console commands that let you manipulate the game.",
- "UniqueID": "SMAPI.ConsoleCommands",
- "EntryDll": "ConsoleCommands.dll",
- "MinimumApiVersion": "2.11.2"
+ "Name": "Console Commands",
+ "Author": "SMAPI",
+ "Version": "2.11.3",
+ "Description": "Adds SMAPI console commands that let you manipulate the game.",
+ "UniqueID": "SMAPI.ConsoleCommands",
+ "EntryDll": "ConsoleCommands.dll",
+ "MinimumApiVersion": "2.11.3"
}
diff --git a/src/SMAPI.Mods.SaveBackup/ModEntry.cs b/src/SMAPI.Mods.SaveBackup/ModEntry.cs
index d10131b3..30dbfbe6 100644
--- a/src/SMAPI.Mods.SaveBackup/ModEntry.cs
+++ b/src/SMAPI.Mods.SaveBackup/ModEntry.cs
@@ -46,7 +46,7 @@ namespace StardewModdingAPI.Mods.SaveBackup
}
catch (Exception ex)
{
- this.Monitor.Log($"Error backing up saves: {ex}");
+ this.Monitor.Log($"Error backing up saves: {ex}", LogLevel.Error);
}
}
@@ -87,7 +87,7 @@ namespace StardewModdingAPI.Mods.SaveBackup
catch (Exception ex) when (ex is TypeLoadException || ex.InnerException is TypeLoadException)
{
// create uncompressed backup if compression fails
- this.Monitor.Log("Couldn't zip the save backup, creating uncompressed backup instead.");
+ this.Monitor.Log("Couldn't zip the save backup, creating uncompressed backup instead.", LogLevel.Debug);
this.Monitor.Log(ex.ToString(), LogLevel.Trace);
this.RecursiveCopy(new DirectoryInfo(Constants.SavesPath), fallbackDir, copyRoot: false);
}
@@ -137,7 +137,7 @@ namespace StardewModdingAPI.Mods.SaveBackup
}
catch (Exception ex)
{
- this.Monitor.Log($"Error deleting old save backup '{file.Name}': {ex}");
+ this.Monitor.Log($"Error deleting old save backup '{file.Name}': {ex}", LogLevel.Error);
}
}
}
diff --git a/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj b/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj
index 56b6b7f4..460f3c93 100644
--- a/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj
+++ b/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj
@@ -1,62 +1,35 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+<Project Sdk="Microsoft.NET.Sdk">
+
<PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
- <ProjectGuid>{E272EB5D-8C57-417E-8E60-C1079D3F53C4}</ProjectGuid>
- <OutputType>Library</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StardewModdingAPI.Mods.SaveBackup</RootNamespace>
<AssemblyName>SaveBackup</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
+ <TargetFramework>net45</TargetFramework>
+ <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
+ <OutputPath>$(SolutionDir)\..\bin\$(Configuration)\Mods\SaveBackup</OutputPath>
+ <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+ <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>$(SolutionDir)\..\bin\Debug\Mods\SaveBackup\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>$(SolutionDir)\..\bin\Release\Mods\SaveBackup\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
+
<ItemGroup>
- <Reference Include="System" />
+ <ProjectReference Include="..\SMAPI\StardewModdingAPI.csproj">
+ <Private>False</Private>
+ </ProjectReference>
</ItemGroup>
+
<ItemGroup>
<Compile Include="..\..\build\GlobalAssemblyInfo.cs">
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
- <Compile Include="ModEntry.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
+
<ItemGroup>
- <None Include="manifest.json">
+ <None Update="manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\SMAPI\StardewModdingAPI.csproj">
- <Project>{f1a573b0-f436-472c-ae29-0b91ea6b9f8f}</Project>
- <Name>StardewModdingAPI</Name>
- <Private>False</Private>
- </ProjectReference>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj">
- <Project>{d5cfd923-37f1-4bc3-9be8-e506e202ac28}</Project>
- <Name>StardewModdingAPI.Toolkit.CoreInterfaces</Name>
- <Private>False</Private>
- </ProjectReference>
- </ItemGroup>
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+
+ <Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
<Import Project="..\..\build\common.targets" />
-</Project> \ No newline at end of file
+
+</Project>
diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json
index 1581d139..e147bd39 100644
--- a/src/SMAPI.Mods.SaveBackup/manifest.json
+++ b/src/SMAPI.Mods.SaveBackup/manifest.json
@@ -1,9 +1,9 @@
{
- "Name": "Save Backup",
- "Author": "SMAPI",
- "Version": "2.11.2",
- "Description": "Automatically backs up all your saves once per day into its folder.",
- "UniqueID": "SMAPI.SaveBackup",
- "EntryDll": "SaveBackup.dll",
- "MinimumApiVersion": "2.11.2"
+ "Name": "Save Backup",
+ "Author": "SMAPI",
+ "Version": "2.11.3",
+ "Description": "Automatically backs up all your saves once per day into its folder.",
+ "UniqueID": "SMAPI.SaveBackup",
+ "EntryDll": "SaveBackup.dll",
+ "MinimumApiVersion": "2.11.3"
}
diff --git a/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj b/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj
index 83bd92af..1cb2d1e6 100644
--- a/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj
+++ b/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj
@@ -1,35 +1,20 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+<Project Sdk="Microsoft.NET.Sdk">
+
<PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
- <ProjectGuid>{36CCB19E-92EB-48C7-9615-98EEFD45109B}</ProjectGuid>
- <OutputType>Library</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StardewModdingAPI.Tests</RootNamespace>
<AssemblyName>StardewModdingAPI.Tests</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
+ <TargetFramework>net45</TargetFramework>
+ <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
+ <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>bin\Debug\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\SMAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj" />
+ <ProjectReference Include="..\SMAPI.Toolkit\StardewModdingAPI.Toolkit.csproj" />
+ <ProjectReference Include="..\SMAPI\StardewModdingAPI.csproj" />
+ </ItemGroup>
+
<ItemGroup>
<PackageReference Include="Castle.Core" Version="4.3.1" />
<PackageReference Include="Moq" Version="4.10.0" />
@@ -39,42 +24,17 @@
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.1" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
</ItemGroup>
- <ItemGroup>
- <Reference Include="System" />
- <Reference Include="System.Configuration" />
- </ItemGroup>
+
<ItemGroup>
<Compile Include="..\..\build\GlobalAssemblyInfo.cs">
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
- <Compile Include="Toolkit\PathUtilitiesTests.cs" />
- <Compile Include="Utilities\SemanticVersionTests.cs" />
- <Compile Include="Utilities\SDateTests.cs" />
- <Compile Include="Core\TranslationTests.cs" />
- <Compile Include="Core\ModResolverTests.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
- <Compile Include="Sample.cs" />
- </ItemGroup>
- <ItemGroup>
- <None Include="app.config" />
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\SMAPI\StardewModdingAPI.csproj">
- <Project>{f1a573b0-f436-472c-ae29-0b91ea6b9f8f}</Project>
- <Name>StardewModdingAPI</Name>
- </ProjectReference>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj">
- <Project>{d5cfd923-37f1-4bc3-9be8-e506e202ac28}</Project>
- <Name>StardewModdingAPI.Toolkit.CoreInterfaces</Name>
- </ProjectReference>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit\StardewModdingAPI.Toolkit.csproj">
- <Project>{ea5cfd2e-9453-4d29-b80f-8e0ea23f4ac6}</Project>
- <Name>StardewModdingAPI.Toolkit</Name>
- </ProjectReference>
</ItemGroup>
+
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+
<Import Project="..\..\build\common.targets" />
-</Project> \ No newline at end of file
+
+</Project>
diff --git a/src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifest.cs b/src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs
index 7375f005..7375f005 100644
--- a/src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifest.cs
+++ b/src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs
diff --git a/src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs b/src/SMAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs
index f05a3873..f05a3873 100644
--- a/src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs
+++ b/src/SMAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs
diff --git a/src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestDependency.cs b/src/SMAPI.Toolkit.CoreInterfaces/IManifestDependency.cs
index e86cd1f4..e86cd1f4 100644
--- a/src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestDependency.cs
+++ b/src/SMAPI.Toolkit.CoreInterfaces/IManifestDependency.cs
diff --git a/src/StardewModdingAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs b/src/SMAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs
index 0a6e5758..0a6e5758 100644
--- a/src/StardewModdingAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs
+++ b/src/SMAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs
diff --git a/src/StardewModdingAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs b/src/SMAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs
index a29ba6cf..a29ba6cf 100644
--- a/src/StardewModdingAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs
+++ b/src/SMAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs
diff --git a/src/StardewModdingAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj b/src/SMAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj
index 67adbd67..cbbb7fc9 100644
--- a/src/StardewModdingAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj
+++ b/src/SMAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net4.5;netstandard2.0</TargetFrameworks>
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs
index 8a9c0a25..8a9c0a25 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs
index dadb8c10..dadb8c10 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs
index 45b46ea6..989c18b0 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs
@@ -40,14 +40,6 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
/// <summary>The custom mod page URL (if applicable).</summary>
public string CustomUrl { get; set; }
- /****
- ** SMAPI 3.0 readiness
- ****/
- /// <summary>Whether the mod is ready for the upcoming SMAPI 3.0.</summary>
- public WikiSmapi3Status Smapi3Status { get; set; }
-
- /// <summary>A URL related to the <see cref="Smapi3Status"/>.</summary>
- public string Smapi3Url { get; set; }
/****
** Stable compatibility
@@ -59,6 +51,9 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
/// <summary>The human-readable summary of the compatibility status or workaround, without HTML formatitng.</summary>
public string CompatibilitySummary { get; set; }
+ /// <summary>The game or SMAPI version which broke this mod, if applicable.</summary>
+ public string BrokeIn { get; set; }
+
/****
** Beta compatibility
@@ -70,6 +65,9 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
/// <summary>The human-readable summary of the compatibility status or workaround for the Stardew Valley beta (if any), without HTML formatitng.</summary>
public string BetaCompatibilitySummary { get; set; }
+ /// <summary>The beta game or SMAPI version which broke this mod, if applicable.</summary>
+ public string BetaBrokeIn { get; set; }
+
/*********
** Public methods
@@ -94,14 +92,13 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
this.CustomSourceUrl = wiki.CustomSourceUrl;
this.CustomUrl = wiki.CustomUrl;
- this.Smapi3Status = wiki.Smapi3Status;
- this.Smapi3Url = wiki.Smapi3Url;
-
this.CompatibilityStatus = wiki.Compatibility.Status;
this.CompatibilitySummary = wiki.Compatibility.Summary;
+ this.BrokeIn = wiki.Compatibility.BrokeIn;
this.BetaCompatibilityStatus = wiki.BetaCompatibility?.Status;
this.BetaCompatibilitySummary = wiki.BetaCompatibility?.Summary;
+ this.BetaBrokeIn = wiki.BetaCompatibility?.BrokeIn;
}
// internal DB data
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs
index e352e1cc..e352e1cc 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs
index bca47647..bca47647 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs
index 7c3df384..7c3df384 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs
index ac279d88..3e9b8ea6 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs
@@ -127,10 +127,6 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
}
}
- // parse SMAPI 3.0 readiness status
- WikiSmapi3Status smapi3Status = this.GetAttributeAsEnum<WikiSmapi3Status>(node, "data-smapi-3-status") ?? WikiSmapi3Status.Unknown;
- string smapi3Url = this.GetAttribute(node, "data-smapi-3-url");
-
// yield model
yield return new WikiModEntry
{
@@ -146,8 +142,6 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
ContentPackFor = contentPackFor,
Compatibility = compatibility,
BetaCompatibility = betaCompatibility,
- Smapi3Status = smapi3Status,
- Smapi3Url = smapi3Url,
Warnings = warnings,
Anchor = anchor
};
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs
index 204acd2b..204acd2b 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs
index a1d2dfae..a1d2dfae 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs
index 35d43758..cf416cc6 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs
@@ -42,12 +42,6 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
/// <summary>The mod's compatibility with the latest beta version of the game (if any).</summary>
public WikiCompatibilityInfo BetaCompatibility { get; set; }
- /// <summary>Whether the mod is ready for the upcoming SMAPI 3.0.</summary>
- public WikiSmapi3Status Smapi3Status { get; set; }
-
- /// <summary>A URL related to the <see cref="Smapi3Status"/>.</summary>
- public string Smapi3Url { get; set; }
-
/// <summary>Whether a Stardew Valley or SMAPI beta which affects mod compatibility is in progress. If this is true, <see cref="BetaCompatibility"/> should be used for beta versions of SMAPI instead of <see cref="Compatibility"/>.</summary>
public bool HasBetaInfo => this.BetaCompatibility != null;
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs
index 0d614f28..0d614f28 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/MetadataModel.cs b/src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs
index ef6d4dd9..ef6d4dd9 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/MetadataModel.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataField.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs
index b3954693..b3954693 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataField.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs
index 09dd0cc5..09dd0cc5 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataModel.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs
index 18039762..18039762 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataModel.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecord.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs
index 794ad2e4..794ad2e4 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecord.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs
index 237f2c66..237f2c66 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDatabase.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs
index a9da884a..a9da884a 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModDatabase.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModStatus.cs b/src/SMAPI.Toolkit/Framework/ModData/ModStatus.cs
index 09da74bf..09da74bf 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModStatus.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModStatus.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModWarning.cs b/src/SMAPI.Toolkit/Framework/ModData/ModWarning.cs
index d61c427f..d61c427f 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModData/ModWarning.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModWarning.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModFolder.cs b/src/SMAPI.Toolkit/Framework/ModScanning/ModFolder.cs
index bb467b36..bb467b36 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModFolder.cs
+++ b/src/SMAPI.Toolkit/Framework/ModScanning/ModFolder.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModScanner.cs b/src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs
index 0ab73d56..0ab73d56 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModScanner.cs
+++ b/src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs b/src/SMAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs
index f6c402d5..f6c402d5 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs
+++ b/src/SMAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs
diff --git a/src/StardewModdingAPI.Toolkit/Framework/UpdateData/UpdateKey.cs b/src/SMAPI.Toolkit/Framework/UpdateData/UpdateKey.cs
index 865ebcf7..865ebcf7 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/UpdateData/UpdateKey.cs
+++ b/src/SMAPI.Toolkit/Framework/UpdateData/UpdateKey.cs
diff --git a/src/StardewModdingAPI.Toolkit/ModToolkit.cs b/src/SMAPI.Toolkit/ModToolkit.cs
index 1b53e59e..1b53e59e 100644
--- a/src/StardewModdingAPI.Toolkit/ModToolkit.cs
+++ b/src/SMAPI.Toolkit/ModToolkit.cs
diff --git a/src/StardewModdingAPI.Toolkit/Properties/AssemblyInfo.cs b/src/SMAPI.Toolkit/Properties/AssemblyInfo.cs
index 1bb19e8c..1bb19e8c 100644
--- a/src/StardewModdingAPI.Toolkit/Properties/AssemblyInfo.cs
+++ b/src/SMAPI.Toolkit/Properties/AssemblyInfo.cs
diff --git a/src/StardewModdingAPI.Toolkit/SemanticVersion.cs b/src/SMAPI.Toolkit/SemanticVersion.cs
index ba9ca6c6..ba9ca6c6 100644
--- a/src/StardewModdingAPI.Toolkit/SemanticVersion.cs
+++ b/src/SMAPI.Toolkit/SemanticVersion.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs b/src/SMAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs
index 232c22a7..232c22a7 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs
+++ b/src/SMAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs b/src/SMAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs
index 0a304ee3..0a304ee3 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs
+++ b/src/SMAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs b/src/SMAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs
index aca06849..aca06849 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs
+++ b/src/SMAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs b/src/SMAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs
index 5e0b0f4a..5e0b0f4a 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs
+++ b/src/SMAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/InternalExtensions.cs b/src/SMAPI.Toolkit/Serialisation/InternalExtensions.cs
index 12b2c933..12b2c933 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/InternalExtensions.cs
+++ b/src/SMAPI.Toolkit/Serialisation/InternalExtensions.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/JsonHelper.cs b/src/SMAPI.Toolkit/Serialisation/JsonHelper.cs
index cf2ce0d1..cf2ce0d1 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/JsonHelper.cs
+++ b/src/SMAPI.Toolkit/Serialisation/JsonHelper.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/Models/Manifest.cs b/src/SMAPI.Toolkit/Serialisation/Models/Manifest.cs
index 6cb9496b..6cb9496b 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/Models/Manifest.cs
+++ b/src/SMAPI.Toolkit/Serialisation/Models/Manifest.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs b/src/SMAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs
index d0e42216..d0e42216 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs
+++ b/src/SMAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestDependency.cs b/src/SMAPI.Toolkit/Serialisation/Models/ManifestDependency.cs
index 8db58d5d..8db58d5d 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestDependency.cs
+++ b/src/SMAPI.Toolkit/Serialisation/Models/ManifestDependency.cs
diff --git a/src/StardewModdingAPI.Toolkit/Serialisation/SParseException.cs b/src/SMAPI.Toolkit/Serialisation/SParseException.cs
index 61a7b305..61a7b305 100644
--- a/src/StardewModdingAPI.Toolkit/Serialisation/SParseException.cs
+++ b/src/SMAPI.Toolkit/Serialisation/SParseException.cs
diff --git a/src/StardewModdingAPI.Toolkit/StardewModdingAPI.Toolkit.csproj b/src/SMAPI.Toolkit/StardewModdingAPI.Toolkit.csproj
index 351b36b6..46d38f17 100644
--- a/src/StardewModdingAPI.Toolkit/StardewModdingAPI.Toolkit.csproj
+++ b/src/SMAPI.Toolkit/StardewModdingAPI.Toolkit.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net4.5;netstandard2.0</TargetFrameworks>
@@ -6,6 +6,7 @@
<OutputPath>..\..\bin\$(Configuration)\SMAPI.Toolkit</OutputPath>
<DocumentationFile>..\..\bin\$(Configuration)\SMAPI.Toolkit\$(TargetFramework)\StardewModdingAPI.Toolkit.xml</DocumentationFile>
<LangVersion>latest</LangVersion>
+ <PlatformTarget Condition="'$(TargetFramework)' == 'net4.5'">x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
@@ -19,7 +20,7 @@
</ItemGroup>
<ItemGroup>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj" />
+ <ProjectReference Include="..\SMAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj" />
</ItemGroup>
<Import Project="..\..\build\common.targets" />
diff --git a/src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs b/src/SMAPI.Toolkit/Utilities/FileUtilities.cs
index 7856fdb1..7856fdb1 100644
--- a/src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs
+++ b/src/SMAPI.Toolkit/Utilities/FileUtilities.cs
diff --git a/src/StardewModdingAPI.Toolkit/Utilities/PathUtilities.cs b/src/SMAPI.Toolkit/Utilities/PathUtilities.cs
index 8a3c2b03..8a3c2b03 100644
--- a/src/StardewModdingAPI.Toolkit/Utilities/PathUtilities.cs
+++ b/src/SMAPI.Toolkit/Utilities/PathUtilities.cs
diff --git a/src/SMAPI.Web/Controllers/IndexController.cs b/src/SMAPI.Web/Controllers/IndexController.cs
index ea1a52b2..4e3602d5 100644
--- a/src/SMAPI.Web/Controllers/IndexController.cs
+++ b/src/SMAPI.Web/Controllers/IndexController.cs
@@ -141,7 +141,7 @@ namespace StardewModdingAPI.Web.Controllers
foreach (GitAsset asset in release.Assets)
{
- if (asset.FileName.StartsWith("Z_OLD"))
+ if (asset.FileName.StartsWith("Z_"))
continue;
Match match = Regex.Match(asset.FileName, @"SMAPI-(?<version>[\d\.]+(?:-.+)?)-installer(?<forDevs>-for-developers)?.zip");
diff --git a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
index 3f33c0c1..595e6b49 100644
--- a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
+++ b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
@@ -15,7 +15,7 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
** Fields
*********/
/// <summary>A regex pattern matching the start of a SMAPI message.</summary>
- private readonly Regex MessageHeaderPattern = new Regex(@"^\[(?<time>\d\d:\d\d:\d\d) (?<level>[a-z]+) +(?<modName>[^\]]+)\] ", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+ private readonly Regex MessageHeaderPattern = new Regex(@"^\[(?<time>\d\d[:\.]\d\d[:\.]\d\d) (?<level>[a-z]+) +(?<modName>[^\]]+)\] ", RegexOptions.Compiled | RegexOptions.IgnoreCase);
/// <summary>A regex pattern matching SMAPI's initial platform info message.</summary>
private readonly Regex InfoLinePattern = new Regex(@"^SMAPI (?<apiVersion>.+) with Stardew Valley (?<gameVersion>.+) on (?<os>.+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
diff --git a/src/SMAPI.Web/Properties/launchSettings.json b/src/SMAPI.Web/Properties/launchSettings.json
index 88179044..45eb4780 100644
--- a/src/SMAPI.Web/Properties/launchSettings.json
+++ b/src/SMAPI.Web/Properties/launchSettings.json
@@ -1,20 +1,20 @@
{
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:59482/",
- "sslPort": 0
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:59482/",
+ "sslPort": 0
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
}
- },
- "profiles": {
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "launchUrl": "",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
- }
}
diff --git a/src/SMAPI.Web/StardewModdingAPI.Web.csproj b/src/SMAPI.Web/StardewModdingAPI.Web.csproj
index 32fdf135..d47361bd 100644
--- a/src/SMAPI.Web/StardewModdingAPI.Web.csproj
+++ b/src/SMAPI.Web/StardewModdingAPI.Web.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
@@ -7,6 +7,10 @@
</PropertyGroup>
<ItemGroup>
+ <Content Remove="aws-beanstalk-tools-defaults.json" />
+ </ItemGroup>
+
+ <ItemGroup>
<Compile Include="..\..\build\GlobalAssemblyInfo.cs" Link="Properties\GlobalAssemblyInfo.cs" />
</ItemGroup>
@@ -25,7 +29,7 @@
</ItemGroup>
<Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
<ItemGroup>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit\StardewModdingAPI.Toolkit.csproj" />
+ <ProjectReference Include="..\SMAPI.Toolkit\StardewModdingAPI.Toolkit.csproj" />
</ItemGroup>
<ItemGroup>
<Content Update="Views\Index\Privacy.cshtml">
diff --git a/src/SMAPI.Web/ViewModels/ModModel.cs b/src/SMAPI.Web/ViewModels/ModModel.cs
index ae81acf5..8668f67b 100644
--- a/src/SMAPI.Web/ViewModels/ModModel.cs
+++ b/src/SMAPI.Web/ViewModels/ModModel.cs
@@ -31,12 +31,6 @@ namespace StardewModdingAPI.Web.ViewModels
/// <summary>The compatibility status for the beta version of the game.</summary>
public ModCompatibilityModel BetaCompatibility { get; set; }
- /// <summary>Whether the mod is ready for the upcoming SMAPI 3.0.</summary>
- public string Smapi3Status { get; set; }
-
- /// <summary>A URL related to the <see cref="Smapi3Status"/>.</summary>
- public string Smapi3Url { get; set; }
-
/// <summary>Links to the available mod pages.</summary>
public ModLinkModel[] ModPages { get; set; }
@@ -65,8 +59,6 @@ namespace StardewModdingAPI.Web.ViewModels
this.SourceUrl = this.GetSourceUrl(entry);
this.Compatibility = new ModCompatibilityModel(entry.Compatibility);
this.BetaCompatibility = entry.BetaCompatibility != null ? new ModCompatibilityModel(entry.BetaCompatibility) : null;
- this.Smapi3Status = entry.Smapi3Status.ToString().ToLower();
- this.Smapi3Url = entry.Smapi3Url;
this.ModPages = this.GetModPageUrls(entry).ToArray();
this.Warnings = entry.Warnings;
this.Slug = entry.Anchor;
diff --git a/src/SMAPI.Web/Views/Index/Index.cshtml b/src/SMAPI.Web/Views/Index/Index.cshtml
index 24b42e09..249dc9d1 100644
--- a/src/SMAPI.Web/Views/Index/Index.cshtml
+++ b/src/SMAPI.Web/Views/Index/Index.cshtml
@@ -6,9 +6,9 @@
ViewData["Title"] = "SMAPI";
}
@section Head {
- <link rel="stylesheet" href="~/Content/css/index.css?r=20180615" />
+ <link rel="stylesheet" href="~/Content/css/index.css?r=20190620" />
<script src="https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js" crossorigin="anonymous"></script>
- <script src="~/Content/js/index.js?r=20180615"></script>
+ <script src="~/Content/js/index.js?r=20190620"></script>
}
<p id="blurb">
@@ -79,27 +79,32 @@ else
<p>See the <a href="https://github.com/Pathoschild/SMAPI/blob/develop/docs/release-notes.md#release-notes">release notes</a> and <a href="@SiteConfig.Value.ModListUrl">mod compatibility list</a> for more info.</p>
}
-<h2 id="donate">Donate to support SMAPI ♥</h2>
+<h2 id="donate">Support SMAPI ♥</h2>
<p>
SMAPI is an open-source project by Pathoschild. It will always be free, but donations
are much appreciated to help pay for development, server hosting, domain fees, coffee, etc.
</p>
-<ul id="support-links">
- <li><a href="https://www.paypal.me/pathoschild">Donate once</a></li>
+
+<ul id="donate-links">
+ <li>
+ <a href="https://www.patreon.com/pathoschild" class="donate-button">
+ <img src="Content/images/patreon.png" /> Become a patron
+ </a>
+ </li>
+ <li>
+ <a href="https://ko-fi.com/pathoschild" class="donate-button">
+ <img src="Content/images/ko-fi.png"/> Buy me a coffee
+ </a>
+ </li>
<li>
- <a href="https://www.patreon.com/pathoschild">Donate $1 per month (or more)</a><br />
- <small>
- You can cancel anytime. You'll have access to all private posts with behind-the-scenes
- info, upcoming features, and early previews of SMAPI updates. You can optionally
- provide early feedback on SMAPI features to influence development. Donate $5/month and
- you'll be publicly credited (with optional link) below!
- </small>
+ <a href="https://www.paypal.me/pathoschild" class="donate-button">
+ <img src="Content/images/paypal.png"/> Donate via PayPal
+ </a>
</li>
</ul>
<p>
Special thanks to
- acerbicon,
<a href="https://www.nexusmods.com/stardewvalley/users/31393530">ChefRude</a>,
<a href="https://github.com/dittusch">dittusch</a>,
hawkfalcon,
@@ -108,7 +113,7 @@ else
<a href="https://www.nexusmods.com/users/12252523">Karmylla</a>,
Pucklynn,
Robby LaFarge,
- and a few anonymous users for their ongoing support; you're awesome! 🏅
+ and a few anonymous users for their ongoing support on Patreon; you're awesome!
</p>
<h2 id="modcreators">For mod creators</h2>
diff --git a/src/SMAPI.Web/Views/LogParser/Index.cshtml b/src/SMAPI.Web/Views/LogParser/Index.cshtml
index babd0bd3..1b40cfa9 100644
--- a/src/SMAPI.Web/Views/LogParser/Index.cshtml
+++ b/src/SMAPI.Web/Views/LogParser/Index.cshtml
@@ -17,10 +17,10 @@
{
<meta name="robots" content="noindex" />
}
- <link rel="stylesheet" href="~/Content/css/log-parser.css?r=20190314" />
+ <link rel="stylesheet" href="~/Content/css/log-parser.css?r=20190515" />
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js" crossorigin="anonymous"></script>
- <script src="~/Content/js/log-parser.js?r=20190310"></script>
+ <script src="~/Content/js/log-parser.js?r=20190515"></script>
<script>
$(function() {
smapi.logParser({
@@ -67,10 +67,20 @@ else if (Model.ParsedLog?.IsValid == true)
<h2>Where do I find my SMAPI log?</h2>
<div>What system do you use?</div>
<ul id="os-list">
+ <li><input type="radio" name="os" value="android" id="os-android" /> <label for="os-android">Android</label></li>
<li><input type="radio" name="os" value="linux" id="os-linux" /> <label for="os-linux">Linux</label></li>
<li><input type="radio" name="os" value="mac" id="os-mac" /> <label for="os-mac">Mac</label></li>
<li><input type="radio" name="os" value="windows" id="os-windows" /> <label for="os-windows">Windows</label></li>
</ul>
+ <div data-os="android">
+ On Android:
+ <ol>
+ <li>Open a file app (like My Files or MT Manager).</li>
+ <li>Find the <code>StardewValley</code> folder on your internal storage.</li>
+ <li>Open the <code>ErrorLogs</code> subfolder.</li>
+ <li>The log file is <code>SMAPI-crash.txt</code> if it exists, otherwise <code>SMAPI-latest.txt</code>.</li>
+ </ol>
+ </div>
<div data-os="linux">
On Linux:
<ol>
diff --git a/src/SMAPI.Web/Views/Mods/Index.cshtml b/src/SMAPI.Web/Views/Mods/Index.cshtml
index 5592078c..8293fbe2 100644
--- a/src/SMAPI.Web/Views/Mods/Index.cshtml
+++ b/src/SMAPI.Web/Views/Mods/Index.cshtml
@@ -18,18 +18,18 @@
</script>
}
-<div id="intro">
- <p>This page shows all known SMAPI mods and (incompatible) content packs, whether they work with the latest versions of Stardew Valley and SMAPI, and how to fix them if not. If a mod doesn't work after following the instructions below, check <a href="https://stardewvalleywiki.com/Modding:Player_Guide/Troubleshooting">the troubleshooting guide</a> or <a href="https://stardewvalleywiki.com/Modding:Player_Guide/Troubleshooting#Ask_for_help">ask for help</a>.</p>
+<div id="app">
+ <div id="intro">
+ <p>This page shows all known SMAPI mods and (incompatible) content packs, whether they work with the latest versions of Stardew Valley and SMAPI, and how to fix them if not. If a mod doesn't work after following the instructions below, check <a href="https://stardewvalleywiki.com/Modding:Player_Guide/Troubleshooting">the troubleshooting guide</a> or <a href="https://stardewvalleywiki.com/Modding:Player_Guide/Troubleshooting#Ask_for_help">ask for help</a>.</p>
- <p>The list is updated every few days (you can help <a href="https://stardewvalleywiki.com/Modding:Mod_compatibility">update it</a>!). It doesn't include XNB mods (see <a href="https://stardewvalleywiki.com/Modding:Using_XNB_mods"><em>using XNB mods</em> on the wiki</a> instead) or compatible content packs.</p>
+ <p>The list is updated every few days (you can help <a href="https://stardewvalleywiki.com/Modding:Mod_compatibility">update it</a>!). It doesn't include XNB mods (see <a href="https://stardewvalleywiki.com/Modding:Using_XNB_mods"><em>using XNB mods</em> on the wiki</a> instead) or compatible content packs.</p>
- @if (Model.BetaVersion != null)
- {
- <p id="beta-blurb"><strong>Note:</strong> "SDV beta only" means Stardew Valley @Model.BetaVersion-beta; if you didn't opt in to the beta, you have the stable version and can ignore that line. If a mod doesn't have a "SDV beta only" line, the compatibility applies to both versions of the game.</p>
- }
-</div>
+ @if (Model.BetaVersion != null)
+ {
+ <p id="beta-blurb" v-show="showAdvanced"><strong>Note:</strong> "SDV @Model.BetaVersion only" lines are for an unreleased version of the game, not the stable version most players have. If a mod doesn't have that line, the info applies to both versions of the game.</p>
+ }
+ </div>
-<div id="app">
<div id="options">
<div>
<label for="search-box">Search: </label>
@@ -47,8 +47,7 @@
</div>
<div id="mod-count" v-show="showAdvanced">
<div v-if="visibleStats.total > 0">
- {{visibleStats.total}} mods shown ({{Math.round((visibleStats.compatible + visibleStats.workaround) / visibleStats.total * 100)}}% compatible or have a workaround, {{Math.round((visibleStats.soon + visibleStats.broken) / visibleStats.total * 100)}}% broken, {{Math.round(visibleStats.abandoned / visibleStats.total * 100)}}% obsolete).<br />
- SMAPI 3.0 (upcoming): {{Math.round(visibleStats.smapi3_ok / visibleStats.total * 100)}}% ready, {{Math.round(visibleStats.smapi3_soon / visibleStats.total * 100)}}% soon, {{Math.round(visibleStats.smapi3_broken / visibleStats.total * 100)}}% broken, {{Math.round(visibleStats.smapi3_unknown / visibleStats.total * 100)}}% unknown.
+ {{visibleStats.total}} mods shown ({{Math.round((visibleStats.compatible + visibleStats.workaround) / visibleStats.total * 100)}}% compatible or have a workaround, {{Math.round((visibleStats.soon + visibleStats.broken) / visibleStats.total * 100)}}% broken, {{Math.round(visibleStats.abandoned / visibleStats.total * 100)}}% obsolete).
</div>
<span v-else>No matching mods found.</span>
</div>
@@ -61,12 +60,11 @@
<th>compatibility</th>
<th v-show="showAdvanced">broke in</th>
<th v-show="showAdvanced">code</th>
- <th><small><a href="http://smapi.io/3.0">3.0 ready</a></small></th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
- <tr v-for="mod in mods" :key="mod.Name" v-bind:id="mod.Slug" :key="mod.Slug" v-bind:data-status="mod.LatestCompatibility.Status" v-show="mod.Visible">
+ <tr v-for="mod in mods" :key="mod.Name" v-bind:id="mod.Slug" :key="mod.Slug" v-bind:data-status="mod.Compatibility.Status" v-show="mod.Visible">
<td>
{{mod.Name}}
<small class="mod-alt-names" v-if="mod.AlternateNames">(aka {{mod.AlternateNames}})</small>
@@ -82,8 +80,8 @@
</td>
<td>
<div v-html="mod.Compatibility.Summary"></div>
- <div v-if="mod.BetaCompatibility">
- <strong v-if="mod.BetaCompatibility">SDV beta only:</strong>
+ <div v-if="mod.BetaCompatibility" v-show="showAdvanced">
+ <strong v-if="mod.BetaCompatibility">SDV @Model.BetaVersion only:</strong>
<span v-html="mod.BetaCompatibility.Summary"></span>
</div>
<div v-for="(warning, i) in mod.Warnings">⚠ {{warning}}</div>
@@ -93,12 +91,6 @@
<span v-if="mod.SourceUrl"><a v-bind:href="mod.SourceUrl">source</a></span>
<span v-else class="mod-closed-source">no source</span>
</td>
- <td class="smapi-3-col">
- <small v-if="mod.LatestCompatibility.Status == 'ok' || mod.LatestCompatibility.Status == 'unofficial' || mod.LatestCompatibility.Status == 'optional' || mod.Smapi3Status == 'ok' || mod.Smapi3Status == 'soon' || mod.Smapi3Url">
- <a v-if="mod.Smapi3Url" v-bind:href="mod.Smapi3Url" v-bind:title="mod.Smapi3Tooltip">{{mod.Smapi3DisplayText}}</a>
- <span v-else v-bind:title="mod.Smapi3Tooltip">{{mod.Smapi3DisplayText}}</span>
- </small>
- </td>
<td>
<small><a v-bind:href="'#' + mod.Slug">#</a></small>
</td>
diff --git a/src/SMAPI.Web/appsettings.Development.json b/src/SMAPI.Web/appsettings.Development.json
index db90a3de..49234a3b 100644
--- a/src/SMAPI.Web/appsettings.Development.json
+++ b/src/SMAPI.Web/appsettings.Development.json
@@ -8,28 +8,28 @@
*/
{
- "Logging": {
- "IncludeScopes": false,
- "LogLevel": {
- "Default": "Debug",
- "System": "Information",
- "Microsoft": "Information"
+ "Logging": {
+ "IncludeScopes": false,
+ "LogLevel": {
+ "Default": "Debug",
+ "System": "Information",
+ "Microsoft": "Information"
+ }
+ },
+
+ "Site": {
+ "RootUrl": "http://localhost:59482/",
+ "ModListUrl": "http://localhost:59482/mods/",
+ "LogParserUrl": "http://localhost:59482/log/",
+ "BetaEnabled": false,
+ "BetaBlurb": null
+ },
+
+ "ApiClients": {
+ "GitHubUsername": null,
+ "GitHubPassword": null,
+
+ "PastebinUserKey": null,
+ "PastebinDevKey": null
}
- },
-
- "Site": {
- "RootUrl": "http://localhost:59482/",
- "ModListUrl": "http://localhost:59482/mods/",
- "LogParserUrl": "http://localhost:59482/log/",
- "BetaEnabled": false,
- "BetaBlurb": null
- },
-
- "ApiClients": {
- "GitHubUsername": null,
- "GitHubPassword": null,
-
- "PastebinUserKey": null,
- "PastebinDevKey": null
- }
}
diff --git a/src/SMAPI.Web/appsettings.json b/src/SMAPI.Web/appsettings.json
index e97b2339..9e15aa97 100644
--- a/src/SMAPI.Web/appsettings.json
+++ b/src/SMAPI.Web/appsettings.json
@@ -7,54 +7,54 @@
*/
{
- "Logging": {
- "IncludeScopes": false,
- "LogLevel": {
- "Default": "Warning"
+ "Logging": {
+ "IncludeScopes": false,
+ "LogLevel": {
+ "Default": "Warning"
+ }
+ },
+
+ "Site": {
+ "RootUrl": null, // see top note
+ "ModListUrl": null, // see top note
+ "LogParserUrl": null, // see top note
+ "BetaEnabled": null, // see top note
+ "BetaBlurb": null // see top note
+ },
+
+ "ApiClients": {
+ "UserAgent": "SMAPI/{0} (+https://smapi.io)",
+
+ "ChucklefishBaseUrl": "https://community.playstarbound.com",
+ "ChucklefishModPageUrlFormat": "resources/{0}",
+
+ "GitHubBaseUrl": "https://api.github.com",
+ "GitHubStableReleaseUrlFormat": "repos/{0}/releases/latest",
+ "GitHubAnyReleaseUrlFormat": "repos/{0}/releases?per_page=2", // allow for draft release (only visible if GitHub repo is owned by same account as the update check credentials)
+ "GitHubAcceptHeader": "application/vnd.github.v3+json",
+ "GitHubUsername": null, // see top note
+ "GitHubPassword": null, // see top note
+
+ "ModDropApiUrl": "https://www.moddrop.com/api/mods/data",
+ "ModDropModPageUrl": "https://www.moddrop.com/sdv/mod/{0}",
+
+ "NexusBaseUrl": "https://www.nexusmods.com/stardewvalley/",
+ "NexusModUrlFormat": "mods/{0}",
+ "NexusModScrapeUrlFormat": "mods/{0}?tab=files",
+
+ "PastebinBaseUrl": "https://pastebin.com/",
+ "PastebinUserKey": null, // see top note
+ "PastebinDevKey": null // see top note
+ },
+
+ "ModCompatibilityList": {
+ "CacheMinutes": 10
+ },
+
+ "ModUpdateCheck": {
+ "SuccessCacheMinutes": 60,
+ "ErrorCacheMinutes": 5,
+ "SemanticVersionRegex": "^(?>(?<major>0|[1-9]\\d*))\\.(?>(?<minor>0|[1-9]\\d*))(?>(?:\\.(?<patch>0|[1-9]\\d*))?)(?:-(?<prerelease>(?>[a-z0-9]+[\\-\\.]?)+))?$",
+ "CompatibilityPageUrl": "https://mods.smapi.io"
}
- },
-
- "Site": {
- "RootUrl": null, // see top note
- "ModListUrl": null, // see top note
- "LogParserUrl": null, // see top note
- "BetaEnabled": null, // see top note
- "BetaBlurb": null // see top note
- },
-
- "ApiClients": {
- "UserAgent": "SMAPI/{0} (+https://smapi.io)",
-
- "ChucklefishBaseUrl": "https://community.playstarbound.com",
- "ChucklefishModPageUrlFormat": "resources/{0}",
-
- "GitHubBaseUrl": "https://api.github.com",
- "GitHubStableReleaseUrlFormat": "repos/{0}/releases/latest",
- "GitHubAnyReleaseUrlFormat": "repos/{0}/releases?per_page=2", // allow for draft release (only visible if GitHub repo is owned by same account as the update check credentials)
- "GitHubAcceptHeader": "application/vnd.github.v3+json",
- "GitHubUsername": null, // see top note
- "GitHubPassword": null, // see top note
-
- "ModDropApiUrl": "https://www.moddrop.com/api/mods/data",
- "ModDropModPageUrl": "https://www.moddrop.com/sdv/mod/{0}",
-
- "NexusBaseUrl": "https://www.nexusmods.com/stardewvalley/",
- "NexusModUrlFormat": "mods/{0}",
- "NexusModScrapeUrlFormat": "mods/{0}?tab=files",
-
- "PastebinBaseUrl": "https://pastebin.com/",
- "PastebinUserKey": null, // see top note
- "PastebinDevKey": null // see top note
- },
-
- "ModCompatibilityList": {
- "WikiCacheMinutes": 10
- },
-
- "ModUpdateCheck": {
- "SuccessCacheMinutes": 60,
- "ErrorCacheMinutes": 5,
- "SemanticVersionRegex": "^(?>(?<major>0|[1-9]\\d*))\\.(?>(?<minor>0|[1-9]\\d*))(?>(?:\\.(?<patch>0|[1-9]\\d*))?)(?:-(?<prerelease>(?>[a-z0-9]+[\\-\\.]?)+))?$",
- "CompatibilityPageUrl": "https://mods.smapi.io"
- }
}
diff --git a/src/SMAPI.Web/wwwroot/Content/css/index.css b/src/SMAPI.Web/wwwroot/Content/css/index.css
index 979af4af..93a85bed 100644
--- a/src/SMAPI.Web/wwwroot/Content/css/index.css
+++ b/src/SMAPI.Web/wwwroot/Content/css/index.css
@@ -106,7 +106,25 @@ h1 {
padding-left: 1em;
}
-#support-links li small {
- display: block;
- width: 50em;
+#donate-links li {
+ list-style: none;
+ margin-bottom: 5px;
+}
+
+#donate-links .donate-button {
+ display: inline-block;
+ min-width: 10em;
+ background: #2A413B;
+ padding: 6px 12px;
+ font-family: Quicksand, Helvetica, Century Gothic, sans-serif;
+ text-decoration: none;
+ font-weight: 700;
+ color: #FFF;
+ border-radius: 8px;
+}
+
+#donate-links .donate-button img {
+ vertical-align: middle;
+ max-height: 15px;
+ max-width: 15px;
}
diff --git a/src/SMAPI.Web/wwwroot/Content/images/ko-fi.png b/src/SMAPI.Web/wwwroot/Content/images/ko-fi.png
new file mode 100644
index 00000000..a483f452
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/images/ko-fi.png
Binary files differ
diff --git a/src/SMAPI.Web/wwwroot/Content/images/patreon.png b/src/SMAPI.Web/wwwroot/Content/images/patreon.png
new file mode 100644
index 00000000..d589fedc
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/images/patreon.png
Binary files differ
diff --git a/src/SMAPI.Web/wwwroot/Content/images/paypal.png b/src/SMAPI.Web/wwwroot/Content/images/paypal.png
new file mode 100644
index 00000000..225c9d7b
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/images/paypal.png
Binary files differ
diff --git a/src/SMAPI.Web/wwwroot/Content/js/mods.js b/src/SMAPI.Web/wwwroot/Content/js/mods.js
index 874fbf25..130f60be 100644
--- a/src/SMAPI.Web/wwwroot/Content/js/mods.js
+++ b/src/SMAPI.Web/wwwroot/Content/js/mods.js
@@ -11,11 +11,7 @@ smapi.modList = function (mods, enableBeta) {
soon: 0,
broken: 0,
abandoned: 0,
- invalid: 0,
- smapi3_unknown: 0,
- smapi3_ok: 0,
- smapi3_broken: 0,
- smapi3_soon: 0
+ invalid: 0
};
var data = {
mods: mods,
@@ -52,16 +48,6 @@ smapi.modList = function (mods, enableBeta) {
nexus: { value: true, label: "Nexus" },
custom: { value: true }
}
- },
- smapi3: {
- label: "SMAPI 3.0",
- value: {
- // note: keys must match status returned by the API
- ok: { value: true, label: "ready" },
- soon: { value: true },
- broken: { value: true },
- unknown: { value: true }
- }
}
},
search: ""
@@ -87,8 +73,6 @@ smapi.modList = function (mods, enableBeta) {
else
delete data.filters.betaStatus;
- window.boop = data.filters;
-
// init mods
for (var i = 0; i < data.mods.length; i++) {
var mod = mods[i];
@@ -99,24 +83,6 @@ smapi.modList = function (mods, enableBeta) {
// set overall compatibility
mod.LatestCompatibility = mod.BetaCompatibility || mod.Compatibility;
- // set SMAPI 3.0 display text
- switch (mod.Smapi3Status) {
- case "ok":
- mod.Smapi3DisplayText = "✓ yes";
- mod.Smapi3Tooltip = "The latest version of this mod is compatible with SMAPI 3.0.";
- break;
-
- case "broken":
- mod.Smapi3DisplayText = "✖ no";
- mod.Smapi3Tooltip = "This mod will break in SMAPI 3.0; consider notifying the author.";
- break;
-
- default:
- mod.Smapi3DisplayText = "↻ " + mod.Smapi3Status;
- mod.Smapi3Tooltip = "This mod has a pending update for SMAPI 3.0 which hasn't been released yet.";
- break;
- }
-
// concatenate searchable text
mod.SearchableText = [mod.Name, mod.AlternateNames, mod.Author, mod.AlternateAuthors, mod.Compatibility.Summary, mod.BrokeIn];
if (mod.Compatibility.UnofficialVersion)
@@ -173,7 +139,6 @@ smapi.modList = function (mods, enableBeta) {
if (mod.Visible) {
stats.total++;
stats[this.getCompatibilityGroup(mod)]++;
- stats["smapi3_" + mod.Smapi3Status]++;
}
}
},
@@ -188,6 +153,10 @@ smapi.modList = function (mods, enableBeta) {
matchesFilters: function(mod, searchWords) {
var filters = data.filters;
+ // check hash
+ if (location.hash === "#" + mod.Slug)
+ return true;
+
// check source
if (!filters.source.value.open.value && mod.SourceUrl)
return false;
@@ -206,10 +175,6 @@ smapi.modList = function (mods, enableBeta) {
return false;
}
- // check SMAPI 3.0 compatibility
- if (filters.smapi3.value[mod.Smapi3Status] && !filters.smapi3.value[mod.Smapi3Status].value)
- return false;
-
// check download sites
var ignoreSites = [];
@@ -281,4 +246,7 @@ smapi.modList = function (mods, enableBeta) {
}
});
app.applyFilters();
+ window.addEventListener("hashchange", function () {
+ app.applyFilters();
+ });
};
diff --git a/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json b/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
index 9de692fe..d0c55552 100644
--- a/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
+++ b/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
@@ -1,434 +1,434 @@
{
- /**
- * Metadata about some SMAPI mods used in compatibility, update, and dependency checks. This
- * field shouldn't be edited by players in most cases.
- *
- * Standard fields
- * ===============
- * The predefined fields are documented below (only 'ID' is required). Each entry's key is the
- * default display name for the mod if one isn't available (e.g. in dependency checks).
- *
- * - ID: the mod's latest unique ID (if any).
- *
- * - FormerIDs: uniquely identifies the mod across multiple versions, and supports matching
- * other fields if no ID was specified. This doesn't include the latest ID, if any. Multiple
- * variants can be separated with '|'.
- *
- * - MapLocalVersions and MapRemoteVersions correct local manifest versions and remote versions
- * during update checks. For example, if the API returns version '1.1-1078' where '1078' is
- * intended to be a build number, MapRemoteVersions can map it to '1.1' when comparing to the
- * mod's current version. This is only meant to support legacy mods with injected update keys.
- *
- * Versioned metadata
- * ==================
- * Each record can also specify extra metadata using the field keys below.
- *
- * Each key consists of a field name prefixed with any combination of version range and 'Default',
- * separated by pipes (whitespace trimmed). For example, 'UpdateKey' will always override,
- * 'Default | UpdateKey' will only override if the mod has no update keys, and
- * '~1.1 | Default | Name' will do the same up to version 1.1.
- *
- * The version format is 'min~max' (where either side can be blank for unbounded), or a single
- * version number.
- *
- * These are the valid field names:
- *
- * - UpdateKey: the update key to set in the mod's manifest. This is used to enable update
- * checks for older mods that haven't been updated to use it yet.
- *
- * - Status: overrides compatibility checks. The possible values are Obsolete (SMAPI won't load
- * it because the mod should no longer be used), AssumeBroken (SMAPI won't load it because
- * the specified version isn't compatible), or AssumeCompatible (SMAPI will try to load it
- * even if it detects incompatible code).
- *
- * Note that this shouldn't be set to 'AssumeBroken' if SMAPI can detect the incompatibility
- * automatically, since that hides the details from trace logs.
- *
- * - StatusReasonPhrase: a message to show to the player explaining why the mod can't be loaded
- * (if applicable). If blank, will default to a generic not-compatible message.
- *
- * - AlternativeUrl: a URL where the player can find an unofficial update or alternative if the
- * mod is no longer compatible.
- */
- "ModData": {
- /*********
- ** Common dependencies for friendly errors
- *********/
- "Advanced Location Loader": {
- "ID": "Entoarox.AdvancedLocationLoader",
- "Default | UpdateKey": "Nexus:2270"
- },
-
- "Content Patcher": {
- "ID": "Pathoschild.ContentPatcher",
- "Default | UpdateKey": "Nexus:1915"
- },
-
- "Custom Farming Redux": {
- "ID": "Platonymous.CustomFarming",
- "Default | UpdateKey": "Nexus:991"
- },
-
- "Custom Shirts": {
- "ID": "Platonymous.CustomShirts",
- "Default | UpdateKey": "Nexus:2416"
- },
-
- "Entoarox Framework": {
- "ID": "Entoarox.EntoaroxFramework",
- "Default | UpdateKey": "Nexus:2269"
- },
-
- "JSON Assets": {
- "ID": "spacechase0.JsonAssets",
- "Default | UpdateKey": "Nexus:1720",
- "1.3.1 | Status": "AssumeBroken" // causes runtime crashes
- },
-
- "Mail Framework": {
- "ID": "DIGUS.MailFrameworkMod",
- "Default | UpdateKey": "Nexus:1536"
- },
-
- "MTN": {
- "ID": "SgtPickles.MTN",
- "Default | UpdateKey": "Nexus:2256",
- "~1.2.6 | Status": "AssumeBroken" // replaces Game1.multiplayer, which breaks SMAPI's multiplayer API.
- },
-
- "PyTK": {
- "ID": "Platonymous.Toolkit",
- "Default | UpdateKey": "Nexus:1726"
- },
-
- "Rubydew": {
- "ID": "bwdy.rubydew",
- "SuppressWarnings": "UsesDynamic", // mod explicitly loads DLLs for Linux/Mac compatibility
- "Default | UpdateKey": "Nexus:3656"
- },
-
- "SpaceCore": {
- "ID": "spacechase0.SpaceCore",
- "Default | UpdateKey": "Nexus:1348"
- },
-
- "Stardust Core": {
- "ID": "Omegasis.StardustCore",
- "Default | UpdateKey": "Nexus:2341"
- },
-
- "TMX Loader": {
- "ID": "Platonymous.TMXLoader",
- "Default | UpdateKey": "Nexus:1820"
- },
-
-
- /*********
- ** Map versions
- *********/
- "Adjust Artisan Prices": {
- "ID": "ThatNorthernMonkey.AdjustArtisanPrices",
- "FormerIDs": "1e36d4ca-c7ef-4dfb-9927-d27a6c3c8bdc", // changed in 0.0.2-pathoschild-update
- "MapRemoteVersions": { "0.01": "0.0.1" }
- },
-
- "Almighty Farming Tool": {
- "ID": "439",
- "MapRemoteVersions": {
- "1.21": "1.2.1",
- "1.22-unofficial.3.mizzion": "1.2.2-unofficial.3.mizzion"
- }
- },
-
- "Basic Sprinkler Improved": {
- "ID": "lrsk_sdvm_bsi.0117171308",
- "MapRemoteVersions": { "1.0.2": "1.0.1-release" } // manifest not updated
- },
-
- "Better Shipping Box": {
- "ID": "Kithio:BetterShippingBox",
- "MapLocalVersions": { "1.0.1": "1.0.2" }
- },
-
- "Chefs Closet": {
- "ID": "Duder.ChefsCloset",
- "MapLocalVersions": { "1.3-1": "1.3" }
- },
-
- "Configurable Machines": {
- "ID": "21da6619-dc03-4660-9794-8e5b498f5b97",
- "MapLocalVersions": { "1.2-beta": "1.2" }
- },
-
- "Crafting Counter": {
- "ID": "lolpcgaming.CraftingCounter",
- "MapRemoteVersions": { "1.1": "1.0" } // not updated in manifest
- },
-
- "Custom Linens": {
- "ID": "Mevima.CustomLinens",
- "MapRemoteVersions": { "1.1": "1.0" } // manifest not updated
- },
-
- "Dynamic Horses": {
- "ID": "Bpendragon-DynamicHorses",
- "MapRemoteVersions": { "1.2": "1.1-release" } // manifest not updated
- },
-
- "Dynamic Machines": {
- "ID": "DynamicMachines",
- "MapLocalVersions": { "1.1": "1.1.1" }
- },
-
- "Multiple Sprites and Portraits On Rotation (File Loading)": {
- "ID": "FileLoading",
- "MapLocalVersions": { "1.1": "1.12" }
- },
-
- "Relationship Status": {
- "ID": "relationshipstatus",
- "MapRemoteVersions": { "1.0.5": "1.0.4" } // not updated in manifest
- },
-
- "ReRegeneration": {
- "ID": "lrsk_sdvm_rerg.0925160827",
- "MapLocalVersions": { "1.1.2-release": "1.1.2" }
- },
-
- "Showcase Mod": {
- "ID": "Igorious.Showcase",
- "MapLocalVersions": { "0.9-500": "0.9" }
- },
-
- "Siv's Marriage Mod": {
- "ID": "6266959802", // official version
- "FormerIDs": "Siv.MarriageMod | medoli900.Siv's Marriage Mod", // 1.2.3-unofficial versions
- "MapLocalVersions": { "0.0": "1.4" }
- },
-
-
- /*********
- ** Obsolete
- *********/
- "Animal Mood Fix": {
- "ID": "GPeters-AnimalMoodFix",
- "~ | Status": "Obsolete",
- "~ | StatusReasonPhrase": "the animal mood bugs were fixed in Stardew Valley 1.2."
- },
-
- "Colored Chests": {
- "ID": "4befde5c-731c-4853-8e4b-c5cdf946805f",
- "~ | Status": "Obsolete",
- "~ | StatusReasonPhrase": "colored chests were added in Stardew Valley 1.1."
- },
-
- "Modder Serialization Utility": {
- "ID": "SerializerUtils-0-1",
- "~ | Status": "Obsolete",
- "~ | StatusReasonPhrase": "it's no longer maintained or used."
- },
-
- "No Debug Mode": {
- "ID": "NoDebugMode",
- "~ | Status": "Obsolete",
- "~ | StatusReasonPhrase": "debug mode was removed in SMAPI 1.0."
- },
-
- /*********
- ** Broke in SDV 1.3.36
- *********/
- "2cute FarmCave": {
- "ID": "taintedwheat.2CuteFarmCave",
- "Default | UpdateKey": "Nexus:843",
- "~2.0 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- "Ace's Expanded Caves - Default Cave": {
- "ID": "Acerbicon.AECdefault",
- "Default | UpdateKey": "Nexus:2131",
- "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- "Ace's Expanded Caves - Desert Cave": {
- "ID": "Acerbicon.AECdesert",
- "Default | UpdateKey": "Nexus:2131",
- "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- "Ace's Expanded Caves - Ice Cave": {
- "ID": "Acerbicon.AECice",
- "Default | UpdateKey": "Nexus:2131",
- "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- "Ace's Expanded Caves - Lava Cave": {
- "ID": "Acerbicon.AEClava",
- "Default | UpdateKey": "Nexus:2131",
- "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- "Ace's Expanded Caves - Slime Cave": {
- "ID": "Acerbicon.AECslime",
- "Default | UpdateKey": "Nexus:2131",
- "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- "Green Pastures Farm": {
- "ID": "bugbuddy.GreenPasturesFarm",
- "Default | UpdateKey": "Nexus:2326",
- "~1.0 | Status": "AssumeBroken" // references deleted Content/weapons.xnb
- },
-
- "Immersive Farm 2": {
- "ID": "zander.immersivefarm2",
- "~2.0.1 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- "Karmylla's Immersive Map Edits": {
- "ID": "Karmylla.ImmersiveMapEdits",
- "Default | UpdateKey": "Nexus:1149",
- "~2.4 | Status": "AssumeBroken" // references deleted Content/weapons.xnb
- },
-
- "Secret Gardens Greenhouse": {
- "ID": "jessebot.secretgardens",
- "Default | UpdateKey": "Nexus:3067",
- "~2.0.1 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
- },
-
- /*********
- ** Broke circa SDV 1.3
- *********/
- "Canon-Friendly Dialogue Expansion": {
- "ID": "gizzymo.canonfriendlyexpansion",
- "~1.1.1 | Status": "AssumeBroken" // causes a save crash on certain dates
- },
-
- "Everytime Submarine": {
- "ID": "MustafaDemirel.EverytimeSubmarine",
- "~1.0.0 | Status": "AssumeBroken" // breaks player saves if their beach bridge is fixed
- },
-
- "Always Scroll Map": {
- "ID": "bcmpinc.AlwaysScrollMap",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "Arcade Pong": {
- "ID": "Platonymous.ArcadePong",
- "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
- },
-
- "BJS Night Sounds": {
- "ID": "BunnyJumps.BJSNightSounds",
- "~1.0.0 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
- },
-
- "Craft Counter": {
- "ID": "bcmpinc.CraftCounter",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "Fishing Adjust": {
- "ID": "shuaiz.FishingAdjustMod",
- "~2.0.1 | Status": "AssumeBroken" // Method not found: 'Void Harmony.HarmonyInstance.Patch(System.Reflection.MethodBase, Harmony.HarmonyMethod, Harmony.HarmonyMethod, Harmony.HarmonyMethod)'
- },
-
- "Fishing Automaton": {
- "ID": "Drynwynn.FishingAutomaton",
- "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
- },
-
- "Fix Animal Tools": {
- "ID": "bcmpinc.FixAnimalTools",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "Fix Scythe Exp": {
- "ID": "bcmpinc.FixScytheExp",
- "~0.3 | Status": "AssumeBroken" // broke in 1.3: Exception from HarmonyInstance "bcmpinc.FixScytheExp" [...] Bad label content in ILGenerator.
- },
-
- "Grass Growth": {
- "ID": "bcmpinc.GrassGrowth",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "More Silo Storage": {
- "ID": "OrneryWalrus.MoreSiloStorage",
- "~1.0.1 | Status": "AssumeBroken" // broke in SDV 1.3
- },
-
- "Movement Speed": {
- "ID": "bcmpinc.MovementSpeed",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "No Added Flying Mine Monsters": {
- "ID": "Drynwynn.NoAddedFlyingMineMonsters",
- "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
- },
-
- "Server Bookmarker": {
- "ID": "Ilyaki.ServerBookmarker",
- "~1.0.0 | Status": "AssumeBroken" // broke in Stardew Valley 1.3.29 (runtime errors)
- },
-
- "Skill Prestige: Cooking Adapter": {
- "ID": "Alphablackwolf.CookingSkillPrestigeAdapter",
- "FormerIDs": "20d6b8a3-b6e7-460b-a6e4-07c2b0cb6c63", // changed circa 1.1
- "MapRemoteVersions": { "1.2.3": "1.1" } // manifest not updated
- },
-
- "Skull Cave Saver": {
- "ID": "cantorsdust.SkullCaveSaver",
- "FormerIDs": "8ac06349-26f7-4394-806c-95d48fd35774 | community.SkullCaveSaver", // changed in 1.1 and 1.2.2
- "1.3-beta | Status": "AssumeBroken" // doesn't work in multiplayer, no longer maintained
- },
-
- "Split Screen": {
- "ID": "Ilyaki.SplitScreen",
- "~3.0.1 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
- },
-
- "Stardew Hack": {
- "ID": "bcmpinc.StardewHack",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "Stephan's Lots of Crops": {
- "ID": "stephansstardewcrops",
- "MapRemoteVersions": { "1.41": "1.1" }, // manifest not updated
- "~1.1 | Status": "AssumeBroken" // broke in SDV 1.3 (overwrites vanilla items)
- },
-
- "Summit Reborn": {
- "ID": "KoihimeNakamura.summitreborn",
- "FormerIDs": "emissaryofinfinity.summitreborn", // changed in 1.0.2
- "~1.0.2 | Status": "AssumeBroken" // broke in SDV 1.3 (runtime errors)
- },
-
- "Tilled Soil Decay": {
- "ID": "bcmpinc.TilledSoilDecay",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "Tree Spread": {
- "ID": "bcmpinc.TreeSpread",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- "Yet Another Harvest With Scythe Mod": {
- "ID": "bcmpinc.HarvestWithScythe",
- "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
- },
-
- /*********
- ** Broke circa SDV 1.2
- *********/
- "Move Faster": {
- "ID": "shuaiz.MoveFasterMod",
- "~1.0.1 | Status": "AssumeBroken" // doesn't do anything as of SDV 1.2.33 (bad Harmony patch?)
+ /**
+ * Metadata about some SMAPI mods used in compatibility, update, and dependency checks. This
+ * field shouldn't be edited by players in most cases.
+ *
+ * Standard fields
+ * ===============
+ * The predefined fields are documented below (only 'ID' is required). Each entry's key is the
+ * default display name for the mod if one isn't available (e.g. in dependency checks).
+ *
+ * - ID: the mod's latest unique ID (if any).
+ *
+ * - FormerIDs: uniquely identifies the mod across multiple versions, and supports matching
+ * other fields if no ID was specified. This doesn't include the latest ID, if any. Multiple
+ * variants can be separated with '|'.
+ *
+ * - MapLocalVersions and MapRemoteVersions correct local manifest versions and remote versions
+ * during update checks. For example, if the API returns version '1.1-1078' where '1078' is
+ * intended to be a build number, MapRemoteVersions can map it to '1.1' when comparing to the
+ * mod's current version. This is only meant to support legacy mods with injected update keys.
+ *
+ * Versioned metadata
+ * ==================
+ * Each record can also specify extra metadata using the field keys below.
+ *
+ * Each key consists of a field name prefixed with any combination of version range and 'Default',
+ * separated by pipes (whitespace trimmed). For example, 'UpdateKey' will always override,
+ * 'Default | UpdateKey' will only override if the mod has no update keys, and
+ * '~1.1 | Default | Name' will do the same up to version 1.1.
+ *
+ * The version format is 'min~max' (where either side can be blank for unbounded), or a single
+ * version number.
+ *
+ * These are the valid field names:
+ *
+ * - UpdateKey: the update key to set in the mod's manifest. This is used to enable update
+ * checks for older mods that haven't been updated to use it yet.
+ *
+ * - Status: overrides compatibility checks. The possible values are Obsolete (SMAPI won't load
+ * it because the mod should no longer be used), AssumeBroken (SMAPI won't load it because
+ * the specified version isn't compatible), or AssumeCompatible (SMAPI will try to load it
+ * even if it detects incompatible code).
+ *
+ * Note that this shouldn't be set to 'AssumeBroken' if SMAPI can detect the incompatibility
+ * automatically, since that hides the details from trace logs.
+ *
+ * - StatusReasonPhrase: a message to show to the player explaining why the mod can't be loaded
+ * (if applicable). If blank, will default to a generic not-compatible message.
+ *
+ * - AlternativeUrl: a URL where the player can find an unofficial update or alternative if the
+ * mod is no longer compatible.
+ */
+ "ModData": {
+ /*********
+ ** Common dependencies for friendly errors
+ *********/
+ "Advanced Location Loader": {
+ "ID": "Entoarox.AdvancedLocationLoader",
+ "Default | UpdateKey": "Nexus:2270"
+ },
+
+ "Content Patcher": {
+ "ID": "Pathoschild.ContentPatcher",
+ "Default | UpdateKey": "Nexus:1915"
+ },
+
+ "Custom Farming Redux": {
+ "ID": "Platonymous.CustomFarming",
+ "Default | UpdateKey": "Nexus:991"
+ },
+
+ "Custom Shirts": {
+ "ID": "Platonymous.CustomShirts",
+ "Default | UpdateKey": "Nexus:2416"
+ },
+
+ "Entoarox Framework": {
+ "ID": "Entoarox.EntoaroxFramework",
+ "Default | UpdateKey": "Nexus:2269"
+ },
+
+ "JSON Assets": {
+ "ID": "spacechase0.JsonAssets",
+ "Default | UpdateKey": "Nexus:1720",
+ "1.3.1 | Status": "AssumeBroken" // causes runtime crashes
+ },
+
+ "Mail Framework": {
+ "ID": "DIGUS.MailFrameworkMod",
+ "Default | UpdateKey": "Nexus:1536"
+ },
+
+ "MTN": {
+ "ID": "SgtPickles.MTN",
+ "Default | UpdateKey": "Nexus:2256",
+ "~1.2.6 | Status": "AssumeBroken" // replaces Game1.multiplayer, which breaks SMAPI's multiplayer API.
+ },
+
+ "PyTK": {
+ "ID": "Platonymous.Toolkit",
+ "Default | UpdateKey": "Nexus:1726"
+ },
+
+ "Rubydew": {
+ "ID": "bwdy.rubydew",
+ "SuppressWarnings": "UsesDynamic", // mod explicitly loads DLLs for Linux/Mac compatibility
+ "Default | UpdateKey": "Nexus:3656"
+ },
+
+ "SpaceCore": {
+ "ID": "spacechase0.SpaceCore",
+ "Default | UpdateKey": "Nexus:1348"
+ },
+
+ "Stardust Core": {
+ "ID": "Omegasis.StardustCore",
+ "Default | UpdateKey": "Nexus:2341"
+ },
+
+ "TMX Loader": {
+ "ID": "Platonymous.TMXLoader",
+ "Default | UpdateKey": "Nexus:1820"
+ },
+
+
+ /*********
+ ** Map versions
+ *********/
+ "Adjust Artisan Prices": {
+ "ID": "ThatNorthernMonkey.AdjustArtisanPrices",
+ "FormerIDs": "1e36d4ca-c7ef-4dfb-9927-d27a6c3c8bdc", // changed in 0.0.2-pathoschild-update
+ "MapRemoteVersions": { "0.01": "0.0.1" }
+ },
+
+ "Almighty Farming Tool": {
+ "ID": "439",
+ "MapRemoteVersions": {
+ "1.21": "1.2.1",
+ "1.22-unofficial.3.mizzion": "1.2.2-unofficial.3.mizzion"
+ }
+ },
+
+ "Basic Sprinkler Improved": {
+ "ID": "lrsk_sdvm_bsi.0117171308",
+ "MapRemoteVersions": { "1.0.2": "1.0.1-release" } // manifest not updated
+ },
+
+ "Better Shipping Box": {
+ "ID": "Kithio:BetterShippingBox",
+ "MapLocalVersions": { "1.0.1": "1.0.2" }
+ },
+
+ "Chefs Closet": {
+ "ID": "Duder.ChefsCloset",
+ "MapLocalVersions": { "1.3-1": "1.3" }
+ },
+
+ "Configurable Machines": {
+ "ID": "21da6619-dc03-4660-9794-8e5b498f5b97",
+ "MapLocalVersions": { "1.2-beta": "1.2" }
+ },
+
+ "Crafting Counter": {
+ "ID": "lolpcgaming.CraftingCounter",
+ "MapRemoteVersions": { "1.1": "1.0" } // not updated in manifest
+ },
+
+ "Custom Linens": {
+ "ID": "Mevima.CustomLinens",
+ "MapRemoteVersions": { "1.1": "1.0" } // manifest not updated
+ },
+
+ "Dynamic Horses": {
+ "ID": "Bpendragon-DynamicHorses",
+ "MapRemoteVersions": { "1.2": "1.1-release" } // manifest not updated
+ },
+
+ "Dynamic Machines": {
+ "ID": "DynamicMachines",
+ "MapLocalVersions": { "1.1": "1.1.1" }
+ },
+
+ "Multiple Sprites and Portraits On Rotation (File Loading)": {
+ "ID": "FileLoading",
+ "MapLocalVersions": { "1.1": "1.12" }
+ },
+
+ "Relationship Status": {
+ "ID": "relationshipstatus",
+ "MapRemoteVersions": { "1.0.5": "1.0.4" } // not updated in manifest
+ },
+
+ "ReRegeneration": {
+ "ID": "lrsk_sdvm_rerg.0925160827",
+ "MapLocalVersions": { "1.1.2-release": "1.1.2" }
+ },
+
+ "Showcase Mod": {
+ "ID": "Igorious.Showcase",
+ "MapLocalVersions": { "0.9-500": "0.9" }
+ },
+
+ "Siv's Marriage Mod": {
+ "ID": "6266959802", // official version
+ "FormerIDs": "Siv.MarriageMod | medoli900.Siv's Marriage Mod", // 1.2.3-unofficial versions
+ "MapLocalVersions": { "0.0": "1.4" }
+ },
+
+
+ /*********
+ ** Obsolete
+ *********/
+ "Animal Mood Fix": {
+ "ID": "GPeters-AnimalMoodFix",
+ "~ | Status": "Obsolete",
+ "~ | StatusReasonPhrase": "the animal mood bugs were fixed in Stardew Valley 1.2."
+ },
+
+ "Colored Chests": {
+ "ID": "4befde5c-731c-4853-8e4b-c5cdf946805f",
+ "~ | Status": "Obsolete",
+ "~ | StatusReasonPhrase": "colored chests were added in Stardew Valley 1.1."
+ },
+
+ "Modder Serialization Utility": {
+ "ID": "SerializerUtils-0-1",
+ "~ | Status": "Obsolete",
+ "~ | StatusReasonPhrase": "it's no longer maintained or used."
+ },
+
+ "No Debug Mode": {
+ "ID": "NoDebugMode",
+ "~ | Status": "Obsolete",
+ "~ | StatusReasonPhrase": "debug mode was removed in SMAPI 1.0."
+ },
+
+ /*********
+ ** Broke in SDV 1.3.36
+ *********/
+ "2cute FarmCave": {
+ "ID": "taintedwheat.2CuteFarmCave",
+ "Default | UpdateKey": "Nexus:843",
+ "~2.0 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ "Ace's Expanded Caves - Default Cave": {
+ "ID": "Acerbicon.AECdefault",
+ "Default | UpdateKey": "Nexus:2131",
+ "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ "Ace's Expanded Caves - Desert Cave": {
+ "ID": "Acerbicon.AECdesert",
+ "Default | UpdateKey": "Nexus:2131",
+ "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ "Ace's Expanded Caves - Ice Cave": {
+ "ID": "Acerbicon.AECice",
+ "Default | UpdateKey": "Nexus:2131",
+ "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ "Ace's Expanded Caves - Lava Cave": {
+ "ID": "Acerbicon.AEClava",
+ "Default | UpdateKey": "Nexus:2131",
+ "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ "Ace's Expanded Caves - Slime Cave": {
+ "ID": "Acerbicon.AECslime",
+ "Default | UpdateKey": "Nexus:2131",
+ "~1.2.2 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ "Green Pastures Farm": {
+ "ID": "bugbuddy.GreenPasturesFarm",
+ "Default | UpdateKey": "Nexus:2326",
+ "~1.0 | Status": "AssumeBroken" // references deleted Content/weapons.xnb
+ },
+
+ "Immersive Farm 2": {
+ "ID": "zander.immersivefarm2",
+ "~2.0.1 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ "Karmylla's Immersive Map Edits": {
+ "ID": "Karmylla.ImmersiveMapEdits",
+ "Default | UpdateKey": "Nexus:1149",
+ "~2.4 | Status": "AssumeBroken" // references deleted Content/weapons.xnb
+ },
+
+ "Secret Gardens Greenhouse": {
+ "ID": "jessebot.secretgardens",
+ "Default | UpdateKey": "Nexus:3067",
+ "~2.0.1 | Status": "AssumeBroken" // references deleted Content/Mine.xnb
+ },
+
+ /*********
+ ** Broke circa SDV 1.3
+ *********/
+ "Canon-Friendly Dialogue Expansion": {
+ "ID": "gizzymo.canonfriendlyexpansion",
+ "~1.1.1 | Status": "AssumeBroken" // causes a save crash on certain dates
+ },
+
+ "Everytime Submarine": {
+ "ID": "MustafaDemirel.EverytimeSubmarine",
+ "~1.0.0 | Status": "AssumeBroken" // breaks player saves if their beach bridge is fixed
+ },
+
+ "Always Scroll Map": {
+ "ID": "bcmpinc.AlwaysScrollMap",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "Arcade Pong": {
+ "ID": "Platonymous.ArcadePong",
+ "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
+ },
+
+ "BJS Night Sounds": {
+ "ID": "BunnyJumps.BJSNightSounds",
+ "~1.0.0 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
+ },
+
+ "Craft Counter": {
+ "ID": "bcmpinc.CraftCounter",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "Fishing Adjust": {
+ "ID": "shuaiz.FishingAdjustMod",
+ "~2.0.1 | Status": "AssumeBroken" // Method not found: 'Void Harmony.HarmonyInstance.Patch(System.Reflection.MethodBase, Harmony.HarmonyMethod, Harmony.HarmonyMethod, Harmony.HarmonyMethod)'
+ },
+
+ "Fishing Automaton": {
+ "ID": "Drynwynn.FishingAutomaton",
+ "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
+ },
+
+ "Fix Animal Tools": {
+ "ID": "bcmpinc.FixAnimalTools",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "Fix Scythe Exp": {
+ "ID": "bcmpinc.FixScytheExp",
+ "~0.3 | Status": "AssumeBroken" // broke in 1.3: Exception from HarmonyInstance "bcmpinc.FixScytheExp" [...] Bad label content in ILGenerator.
+ },
+
+ "Grass Growth": {
+ "ID": "bcmpinc.GrassGrowth",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "More Silo Storage": {
+ "ID": "OrneryWalrus.MoreSiloStorage",
+ "~1.0.1 | Status": "AssumeBroken" // broke in SDV 1.3
+ },
+
+ "Movement Speed": {
+ "ID": "bcmpinc.MovementSpeed",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "No Added Flying Mine Monsters": {
+ "ID": "Drynwynn.NoAddedFlyingMineMonsters",
+ "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
+ },
+
+ "Server Bookmarker": {
+ "ID": "Ilyaki.ServerBookmarker",
+ "~1.0.0 | Status": "AssumeBroken" // broke in Stardew Valley 1.3.29 (runtime errors)
+ },
+
+ "Skill Prestige: Cooking Adapter": {
+ "ID": "Alphablackwolf.CookingSkillPrestigeAdapter",
+ "FormerIDs": "20d6b8a3-b6e7-460b-a6e4-07c2b0cb6c63", // changed circa 1.1
+ "MapRemoteVersions": { "1.2.3": "1.1" } // manifest not updated
+ },
+
+ "Skull Cave Saver": {
+ "ID": "cantorsdust.SkullCaveSaver",
+ "FormerIDs": "8ac06349-26f7-4394-806c-95d48fd35774 | community.SkullCaveSaver", // changed in 1.1 and 1.2.2
+ "1.3-beta | Status": "AssumeBroken" // doesn't work in multiplayer, no longer maintained
+ },
+
+ "Split Screen": {
+ "ID": "Ilyaki.SplitScreen",
+ "~3.0.1 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
+ },
+
+ "Stardew Hack": {
+ "ID": "bcmpinc.StardewHack",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "Stephan's Lots of Crops": {
+ "ID": "stephansstardewcrops",
+ "MapRemoteVersions": { "1.41": "1.1" }, // manifest not updated
+ "~1.1 | Status": "AssumeBroken" // broke in SDV 1.3 (overwrites vanilla items)
+ },
+
+ "Summit Reborn": {
+ "ID": "KoihimeNakamura.summitreborn",
+ "FormerIDs": "emissaryofinfinity.summitreborn", // changed in 1.0.2
+ "~1.0.2 | Status": "AssumeBroken" // broke in SDV 1.3 (runtime errors)
+ },
+
+ "Tilled Soil Decay": {
+ "ID": "bcmpinc.TilledSoilDecay",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "Tree Spread": {
+ "ID": "bcmpinc.TreeSpread",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ "Yet Another Harvest With Scythe Mod": {
+ "ID": "bcmpinc.HarvestWithScythe",
+ "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+ },
+
+ /*********
+ ** Broke circa SDV 1.2
+ *********/
+ "Move Faster": {
+ "ID": "shuaiz.MoveFasterMod",
+ "~1.0.1 | Status": "AssumeBroken" // doesn't do anything as of SDV 1.2.33 (bad Harmony patch?)
+ }
}
- }
}
diff --git a/src/SMAPI.sln b/src/SMAPI.sln
index e01a69ba..ffd50455 100644
--- a/src/SMAPI.sln
+++ b/src/SMAPI.sln
@@ -1,14 +1,9 @@

Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27130.2036
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.28729.10
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StardewModdingAPI.Mods.ConsoleCommands", "SMAPI.Mods.ConsoleCommands\StardewModdingAPI.Mods.ConsoleCommands.csproj", "{28480467-1A48-46A7-99F8-236D95225359}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StardewModdingAPI", "SMAPI\StardewModdingAPI.csproj", "{F1A573B0-F436-472C-AE29-0B91EA6B9F8F}"
- ProjectSection(ProjectDependencies) = postProject
- {80AD8528-AA49-4731-B4A6-C691845815A1} = {80AD8528-AA49-4731-B4A6-C691845815A1}
- EndProjectSection
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI", "SMAPI\StardewModdingAPI.csproj", "{1298F2B2-57BD-4647-AF70-1FCBBEE500B6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".root", ".root", "{86C452BE-D2D8-45B4-B63F-E329EB06CEDA}"
ProjectSection(SolutionItems) = preProject
@@ -18,14 +13,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".root", ".root", "{86C452BE
..\LICENSE.txt = ..\LICENSE.txt
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StardewModdingAPI.Installer", "SMAPI.Installer\StardewModdingAPI.Installer.csproj", "{443DDF81-6AAF-420A-A610-3459F37E5575}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Installer", "SMAPI.Installer\StardewModdingAPI.Installer.csproj", "{0ED5EAD8-5D85-420D-8101-6D8CCCE29C9B}"
ProjectSection(ProjectDependencies) = postProject
- {E272EB5D-8C57-417E-8E60-C1079D3F53C4} = {E272EB5D-8C57-417E-8E60-C1079D3F53C4}
- {28480467-1A48-46A7-99F8-236D95225359} = {28480467-1A48-46A7-99F8-236D95225359}
- {F1A573B0-F436-472C-AE29-0B91EA6B9F8F} = {F1A573B0-F436-472C-AE29-0B91EA6B9F8F}
+ {E4113F3E-3CAA-4288-9378-39A77BA625DB} = {E4113F3E-3CAA-4288-9378-39A77BA625DB}
+ {8C2CA4AB-BA8A-446A-B59E-9D6502E145F7} = {8C2CA4AB-BA8A-446A-B59E-9D6502E145F7}
+ {1298F2B2-57BD-4647-AF70-1FCBBEE500B6} = {1298F2B2-57BD-4647-AF70-1FCBBEE500B6}
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StardewModdingAPI.Tests", "SMAPI.Tests\StardewModdingAPI.Tests.csproj", "{36CCB19E-92EB-48C7-9615-98EEFD45109B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Tests", "SMAPI.Tests\StardewModdingAPI.Tests.csproj", "{E023DA12-5960-4101-80B9-A7DCE955725C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Web", "SMAPI.Web\StardewModdingAPI.Web.csproj", "{A308F679-51A3-4006-92D5-BAEC7EBD01A1}"
EndProject
@@ -47,10 +42,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{09CF91E5
..\build\prepare-nuget-package.targets = ..\build\prepare-nuget-package.targets
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StardewModdingAPI.ModBuildConfig", "SMAPI.ModBuildConfig\StardewModdingAPI.ModBuildConfig.csproj", "{EA4F1E80-743F-4A1D-9757-AE66904A196A}"
- ProjectSection(ProjectDependencies) = postProject
- {80AD8528-AA49-4731-B4A6-C691845815A1} = {80AD8528-AA49-4731-B4A6-C691845815A1}
- EndProjectSection
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.ModBuildConfig", "SMAPI.ModBuildConfig\StardewModdingAPI.ModBuildConfig.csproj", "{C11D0AFB-2893-41A9-AD55-D002F032D6AD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.ModBuildConfig.Analyzer", "SMAPI.ModBuildConfig.Analyzer\StardewModdingAPI.ModBuildConfig.Analyzer.csproj", "{80AD8528-AA49-4731-B4A6-C691845815A1}"
EndProject
@@ -58,11 +50,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.ModBuildConfig.Analyz
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "StardewModdingAPI.Internal", "SMAPI.Internal\StardewModdingAPI.Internal.shproj", "{85208F8D-6FD1-4531-BE05-7142490F59FE}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StardewModdingAPI.Mods.SaveBackup", "SMAPI.Mods.SaveBackup\StardewModdingAPI.Mods.SaveBackup.csproj", "{E272EB5D-8C57-417E-8E60-C1079D3F53C4}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Mods.ConsoleCommands", "SMAPI.Mods.ConsoleCommands\StardewModdingAPI.Mods.ConsoleCommands.csproj", "{8C2CA4AB-BA8A-446A-B59E-9D6502E145F7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Mods.SaveBackup", "SMAPI.Mods.SaveBackup\StardewModdingAPI.Mods.SaveBackup.csproj", "{E4113F3E-3CAA-4288-9378-39A77BA625DB}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Toolkit", "StardewModdingAPI.Toolkit\StardewModdingAPI.Toolkit.csproj", "{EA5CFD2E-9453-4D29-B80F-8E0EA23F4AC6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Toolkit", "SMAPI.Toolkit\StardewModdingAPI.Toolkit.csproj", "{EA5CFD2E-9453-4D29-B80F-8E0EA23F4AC6}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Toolkit.CoreInterfaces", "StardewModdingAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj", "{D5CFD923-37F1-4BC3-9BE8-E506E202AC28}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StardewModdingAPI.Toolkit.CoreInterfaces", "SMAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj", "{D5CFD923-37F1-4BC3-9BE8-E506E202AC28}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{4B1CEB70-F756-4A57-AAE8-8CD78C475F25}"
ProjectSection(SolutionItems) = preProject
@@ -79,40 +73,33 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ISSUE_TEMPLATE", "ISSUE_TEM
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
- SMAPI.Internal\SMAPI.Internal.projitems*{443ddf81-6aaf-420a-a610-3459f37e5575}*SharedItemsImports = 4
SMAPI.Internal\SMAPI.Internal.projitems*{85208f8d-6fd1-4531-be05-7142490f59fe}*SharedItemsImports = 13
- SMAPI.Internal\SMAPI.Internal.projitems*{ea4f1e80-743f-4a1d-9757-ae66904a196a}*SharedItemsImports = 4
- SMAPI.Internal\SMAPI.Internal.projitems*{f1a573b0-f436-472c-ae29-0b91ea6b9f8f}*SharedItemsImports = 4
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {28480467-1A48-46A7-99F8-236D95225359}.Debug|Any CPU.ActiveCfg = Debug|x86
- {28480467-1A48-46A7-99F8-236D95225359}.Debug|Any CPU.Build.0 = Debug|x86
- {28480467-1A48-46A7-99F8-236D95225359}.Release|Any CPU.ActiveCfg = Release|x86
- {28480467-1A48-46A7-99F8-236D95225359}.Release|Any CPU.Build.0 = Release|x86
- {F1A573B0-F436-472C-AE29-0B91EA6B9F8F}.Debug|Any CPU.ActiveCfg = Debug|x86
- {F1A573B0-F436-472C-AE29-0B91EA6B9F8F}.Debug|Any CPU.Build.0 = Debug|x86
- {F1A573B0-F436-472C-AE29-0B91EA6B9F8F}.Release|Any CPU.ActiveCfg = Release|x86
- {F1A573B0-F436-472C-AE29-0B91EA6B9F8F}.Release|Any CPU.Build.0 = Release|x86
- {443DDF81-6AAF-420A-A610-3459F37E5575}.Debug|Any CPU.ActiveCfg = Debug|x86
- {443DDF81-6AAF-420A-A610-3459F37E5575}.Debug|Any CPU.Build.0 = Debug|x86
- {443DDF81-6AAF-420A-A610-3459F37E5575}.Release|Any CPU.ActiveCfg = Release|x86
- {443DDF81-6AAF-420A-A610-3459F37E5575}.Release|Any CPU.Build.0 = Release|x86
- {36CCB19E-92EB-48C7-9615-98EEFD45109B}.Debug|Any CPU.ActiveCfg = Debug|x86
- {36CCB19E-92EB-48C7-9615-98EEFD45109B}.Debug|Any CPU.Build.0 = Debug|x86
- {36CCB19E-92EB-48C7-9615-98EEFD45109B}.Release|Any CPU.ActiveCfg = Release|x86
- {36CCB19E-92EB-48C7-9615-98EEFD45109B}.Release|Any CPU.Build.0 = Release|x86
+ {1298F2B2-57BD-4647-AF70-1FCBBEE500B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1298F2B2-57BD-4647-AF70-1FCBBEE500B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1298F2B2-57BD-4647-AF70-1FCBBEE500B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1298F2B2-57BD-4647-AF70-1FCBBEE500B6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0ED5EAD8-5D85-420D-8101-6D8CCCE29C9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0ED5EAD8-5D85-420D-8101-6D8CCCE29C9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0ED5EAD8-5D85-420D-8101-6D8CCCE29C9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0ED5EAD8-5D85-420D-8101-6D8CCCE29C9B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E023DA12-5960-4101-80B9-A7DCE955725C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E023DA12-5960-4101-80B9-A7DCE955725C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E023DA12-5960-4101-80B9-A7DCE955725C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E023DA12-5960-4101-80B9-A7DCE955725C}.Release|Any CPU.Build.0 = Release|Any CPU
{A308F679-51A3-4006-92D5-BAEC7EBD01A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A308F679-51A3-4006-92D5-BAEC7EBD01A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A308F679-51A3-4006-92D5-BAEC7EBD01A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A308F679-51A3-4006-92D5-BAEC7EBD01A1}.Release|Any CPU.Build.0 = Release|Any CPU
- {EA4F1E80-743F-4A1D-9757-AE66904A196A}.Debug|Any CPU.ActiveCfg = Debug|x86
- {EA4F1E80-743F-4A1D-9757-AE66904A196A}.Debug|Any CPU.Build.0 = Debug|x86
- {EA4F1E80-743F-4A1D-9757-AE66904A196A}.Release|Any CPU.ActiveCfg = Release|x86
- {EA4F1E80-743F-4A1D-9757-AE66904A196A}.Release|Any CPU.Build.0 = Release|x86
+ {C11D0AFB-2893-41A9-AD55-D002F032D6AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C11D0AFB-2893-41A9-AD55-D002F032D6AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C11D0AFB-2893-41A9-AD55-D002F032D6AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C11D0AFB-2893-41A9-AD55-D002F032D6AD}.Release|Any CPU.Build.0 = Release|Any CPU
{80AD8528-AA49-4731-B4A6-C691845815A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{80AD8528-AA49-4731-B4A6-C691845815A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{80AD8528-AA49-4731-B4A6-C691845815A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -121,10 +108,6 @@ Global
{0CF97929-B0D0-4D73-B7BF-4FF7191035F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0CF97929-B0D0-4D73-B7BF-4FF7191035F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0CF97929-B0D0-4D73-B7BF-4FF7191035F9}.Release|Any CPU.Build.0 = Release|Any CPU
- {E272EB5D-8C57-417E-8E60-C1079D3F53C4}.Debug|Any CPU.ActiveCfg = Debug|x86
- {E272EB5D-8C57-417E-8E60-C1079D3F53C4}.Debug|Any CPU.Build.0 = Debug|x86
- {E272EB5D-8C57-417E-8E60-C1079D3F53C4}.Release|Any CPU.ActiveCfg = Release|x86
- {E272EB5D-8C57-417E-8E60-C1079D3F53C4}.Release|Any CPU.Build.0 = Release|x86
{EA5CFD2E-9453-4D29-B80F-8E0EA23F4AC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EA5CFD2E-9453-4D29-B80F-8E0EA23F4AC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA5CFD2E-9453-4D29-B80F-8E0EA23F4AC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -133,12 +116,20 @@ Global
{D5CFD923-37F1-4BC3-9BE8-E506E202AC28}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5CFD923-37F1-4BC3-9BE8-E506E202AC28}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D5CFD923-37F1-4BC3-9BE8-E506E202AC28}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8C2CA4AB-BA8A-446A-B59E-9D6502E145F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8C2CA4AB-BA8A-446A-B59E-9D6502E145F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8C2CA4AB-BA8A-446A-B59E-9D6502E145F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8C2CA4AB-BA8A-446A-B59E-9D6502E145F7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E4113F3E-3CAA-4288-9378-39A77BA625DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E4113F3E-3CAA-4288-9378-39A77BA625DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E4113F3E-3CAA-4288-9378-39A77BA625DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E4113F3E-3CAA-4288-9378-39A77BA625DB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {36CCB19E-92EB-48C7-9615-98EEFD45109B} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}
+ {E023DA12-5960-4101-80B9-A7DCE955725C} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}
{EB35A917-67B9-4EFA-8DFC-4FB49B3949BB} = {86C452BE-D2D8-45B4-B63F-E329EB06CEDA}
{09CF91E5-5BAB-4650-A200-E5EA9A633046} = {86C452BE-D2D8-45B4-B63F-E329EB06CEDA}
{0CF97929-B0D0-4D73-B7BF-4FF7191035F9} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}
diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index cb3aa26e..9d686e2f 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -20,7 +20,7 @@ namespace StardewModdingAPI
** Public
****/
/// <summary>SMAPI's current semantic version.</summary>
- public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.11.2");
+ public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.11.3");
/// <summary>The minimum supported version of Stardew Valley.</summary>
public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.3.36");
diff --git a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs
index 6485b3d4..2c50ec04 100644
--- a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs
+++ b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs
@@ -136,7 +136,7 @@ namespace StardewModdingAPI.Framework.ContentManagers
throw GetContentError($"can't read unpacked map file directly from the underlying content manager. It must be loaded through the mod's {typeof(IModHelper)}.{nameof(IModHelper.Content)} helper.");
default:
- throw GetContentError($"unknown file extension '{file.Extension}'; must be one of '.png', '.tbin', or '.xnb'.");
+ throw GetContentError($"unknown file extension '{file.Extension}'; must be one of '.json', '.png', '.tbin', or '.xnb'.");
}
}
catch (Exception ex) when (!(ex is SContentLoadException))
diff --git a/src/SMAPI/Framework/DeprecationManager.cs b/src/SMAPI/Framework/DeprecationManager.cs
index 3153bbb4..984bb487 100644
--- a/src/SMAPI/Framework/DeprecationManager.cs
+++ b/src/SMAPI/Framework/DeprecationManager.cs
@@ -132,7 +132,7 @@ namespace StardewModdingAPI.Framework
else
{
this.Monitor.Log(message, level);
- this.Monitor.Log(warning.StackTrace);
+ this.Monitor.Log(warning.StackTrace, LogLevel.Debug);
}
}
}
diff --git a/src/SMAPI/Framework/Monitor.cs b/src/SMAPI/Framework/Monitor.cs
index 47ebc2d7..617bfd85 100644
--- a/src/SMAPI/Framework/Monitor.cs
+++ b/src/SMAPI/Framework/Monitor.cs
@@ -78,7 +78,7 @@ namespace StardewModdingAPI.Framework
/// <summary>Log a message for the player or developer.</summary>
/// <param name="message">The message to log.</param>
/// <param name="level">The log severity level.</param>
- public void Log(string message, LogLevel level = LogLevel.Debug)
+ public void Log(string message, LogLevel level = LogLevel.Trace)
{
this.LogImpl(this.Source, message, (ConsoleLogLevel)level);
}
diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs
index 9ffa46a5..5dd52992 100644
--- a/src/SMAPI/Framework/SCore.cs
+++ b/src/SMAPI/Framework/SCore.cs
@@ -160,7 +160,7 @@ namespace StardewModdingAPI.Framework
// init logging
this.Monitor.Log($"SMAPI {Constants.ApiVersion} with Stardew Valley {Constants.GameVersion} on {EnvironmentUtility.GetFriendlyPlatformName(Constants.Platform)}", LogLevel.Info);
- this.Monitor.Log($"Mods go here: {modsPath}");
+ this.Monitor.Log($"Mods go here: {modsPath}", LogLevel.Info);
if (modsPath != Constants.DefaultModsPath)
this.Monitor.Log("(Using custom --mods-path argument.)", LogLevel.Trace);
this.Monitor.Log($"Log started at {DateTime.UtcNow:s} UTC", LogLevel.Trace);
@@ -233,9 +233,10 @@ namespace StardewModdingAPI.Framework
// apply game patches
new GamePatcher(this.Monitor).Apply(
+ new EventErrorPatch(this.MonitorForGame),
new DialogueErrorPatch(this.MonitorForGame, this.Reflection),
new ObjectErrorPatch(),
- new LoadForNewGamePatch(this.Reflection, this.GameInstance.OnLoadStageChanged)
+ new LoadContextPatch(this.Reflection, this.GameInstance.OnLoadStageChanged)
);
// add exit handler
@@ -251,7 +252,7 @@ namespace StardewModdingAPI.Framework
}
catch (Exception ex)
{
- this.Monitor.Log($"SMAPI failed trying to track the crash details: {ex.GetLogSummary()}");
+ this.Monitor.Log($"SMAPI failed trying to track the crash details: {ex.GetLogSummary()}", LogLevel.Error);
}
this.GameInstance.Exit();
@@ -576,7 +577,7 @@ namespace StardewModdingAPI.Framework
if (latestStable == null && response.Errors.Any())
{
this.Monitor.Log("Couldn't check for a new version of SMAPI. This won't affect your game, but you may not be notified of new versions if this keeps happening.", LogLevel.Warn);
- this.Monitor.Log($"Error: {string.Join("\n", response.Errors)}");
+ this.Monitor.Log($"Error: {string.Join("\n", response.Errors)}", LogLevel.Trace);
}
else if (this.IsValidUpdate(Constants.ApiVersion, latestBeta, this.Settings.UseBetaChannel))
{
@@ -596,7 +597,7 @@ namespace StardewModdingAPI.Framework
this.Monitor.Log("Couldn't check for a new version of SMAPI. This won't affect your game, but you won't be notified of new versions if this keeps happening.", LogLevel.Warn);
this.Monitor.Log(ex is WebException && ex.InnerException == null
? $"Error: {ex.Message}"
- : $"Error: {ex.GetLogSummary()}"
+ : $"Error: {ex.GetLogSummary()}", LogLevel.Trace
);
}
@@ -689,7 +690,7 @@ namespace StardewModdingAPI.Framework
this.Monitor.Log("Couldn't check for new mod versions. This won't affect your game, but you won't be notified of mod updates if this keeps happening.", LogLevel.Warn);
this.Monitor.Log(ex is WebException && ex.InnerException == null
? ex.Message
- : ex.ToString()
+ : ex.ToString(), LogLevel.Trace
);
}
}
diff --git a/src/SMAPI/Framework/SGame.cs b/src/SMAPI/Framework/SGame.cs
index 9818314a..704eb6bc 100644
--- a/src/SMAPI/Framework/SGame.cs
+++ b/src/SMAPI/Framework/SGame.cs
@@ -705,8 +705,8 @@ namespace StardewModdingAPI.Framework
if (this.Monitor.IsVerbose)
{
- string addedText = this.Watchers.LocationsWatcher.Added.Any() ? string.Join(", ", added.Select(p => p.Name)) : "none";
- string removedText = this.Watchers.LocationsWatcher.Removed.Any() ? string.Join(", ", removed.Select(p => p.Name)) : "none";
+ string addedText = added.Any() ? string.Join(", ", added.Select(p => p.Name)) : "none";
+ string removedText = removed.Any() ? string.Join(", ", removed.Select(p => p.Name)) : "none";
this.Monitor.Log($"Context: location list changed (added {addedText}; removed {removedText}).", LogLevel.Trace);
}
diff --git a/src/SMAPI/IMonitor.cs b/src/SMAPI/IMonitor.cs
index 0f153e10..943c1c59 100644
--- a/src/SMAPI/IMonitor.cs
+++ b/src/SMAPI/IMonitor.cs
@@ -19,7 +19,7 @@ namespace StardewModdingAPI
/// <summary>Log a message for the player or developer.</summary>
/// <param name="message">The message to log.</param>
/// <param name="level">The log severity level.</param>
- void Log(string message, LogLevel level = LogLevel.Debug);
+ void Log(string message, LogLevel level = LogLevel.Trace);
/// <summary>Log a message that only appears when <see cref="IsVerbose"/> is enabled.</summary>
/// <param name="message">The message to log.</param>
diff --git a/src/SMAPI/Patches/DialogueErrorPatch.cs b/src/SMAPI/Patches/DialogueErrorPatch.cs
index d8905fd1..f1c25c05 100644
--- a/src/SMAPI/Patches/DialogueErrorPatch.cs
+++ b/src/SMAPI/Patches/DialogueErrorPatch.cs
@@ -13,7 +13,7 @@ namespace StardewModdingAPI.Patches
internal class DialogueErrorPatch : IHarmonyPatch
{
/*********
- ** Private methods
+ ** Fields
*********/
/// <summary>Writes messages to the console and log file on behalf of the game.</summary>
private static IMonitor MonitorForGame;
@@ -21,6 +21,9 @@ namespace StardewModdingAPI.Patches
/// <summary>Simplifies access to private code.</summary>
private static Reflector Reflection;
+ /// <summary>Whether the <see cref="NPC.CurrentDialogue"/> getter is currently being intercepted.</summary>
+ private static bool IsInterceptingCurrentDialogue;
+
/*********
** Accessors
@@ -46,10 +49,14 @@ namespace StardewModdingAPI.Patches
/// <param name="harmony">The Harmony instance.</param>
public void Apply(HarmonyInstance harmony)
{
- ConstructorInfo constructor = AccessTools.Constructor(typeof(Dialogue), new[] { typeof(string), typeof(NPC) });
- MethodInfo prefix = AccessTools.Method(this.GetType(), nameof(DialogueErrorPatch.Prefix));
-
- harmony.Patch(constructor, new HarmonyMethod(prefix), null);
+ harmony.Patch(
+ original: AccessTools.Constructor(typeof(Dialogue), new[] { typeof(string), typeof(NPC) }),
+ prefix: new HarmonyMethod(this.GetType(), nameof(DialogueErrorPatch.Before_Dialogue_Constructor))
+ );
+ harmony.Patch(
+ original: AccessTools.Property(typeof(NPC), nameof(NPC.CurrentDialogue)).GetMethod,
+ prefix: new HarmonyMethod(this.GetType(), nameof(DialogueErrorPatch.Before_NPC_CurrentDialogue))
+ );
}
@@ -63,7 +70,7 @@ namespace StardewModdingAPI.Patches
/// <returns>Returns whether to execute the original method.</returns>
/// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks>
[SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")]
- private static bool Prefix(Dialogue __instance, string masterDialogue, NPC speaker)
+ private static bool Before_Dialogue_Constructor(Dialogue __instance, string masterDialogue, NPC speaker)
{
// get private members
bool nameArraysTranslated = DialogueErrorPatch.Reflection.GetField<bool>(typeof(Dialogue), "nameArraysTranslated").GetValue();
@@ -96,5 +103,35 @@ namespace StardewModdingAPI.Patches
return false;
}
+
+ /// <summary>The method to call instead of <see cref="NPC.CurrentDialogue"/>.</summary>
+ /// <param name="__instance">The instance being patched.</param>
+ /// <param name="__result">The return value of the original method.</param>
+ /// <param name="__originalMethod">The method being wrapped.</param>
+ /// <returns>Returns whether to execute the original method.</returns>
+ /// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks>
+ [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")]
+ private static bool Before_NPC_CurrentDialogue(NPC __instance, ref Stack<Dialogue> __result, MethodInfo __originalMethod)
+ {
+ if (DialogueErrorPatch.IsInterceptingCurrentDialogue)
+ return true;
+
+ try
+ {
+ DialogueErrorPatch.IsInterceptingCurrentDialogue = true;
+ __result = (Stack<Dialogue>)__originalMethod.Invoke(__instance, new object[0]);
+ return false;
+ }
+ catch (TargetInvocationException ex)
+ {
+ DialogueErrorPatch.MonitorForGame.Log($"Failed loading current dialogue for NPC {__instance.Name}:\n{ex.InnerException ?? ex}", LogLevel.Error);
+ __result = new Stack<Dialogue>();
+ return false;
+ }
+ finally
+ {
+ DialogueErrorPatch.IsInterceptingCurrentDialogue = false;
+ }
+ }
}
}
diff --git a/src/SMAPI/Patches/EventErrorPatch.cs b/src/SMAPI/Patches/EventErrorPatch.cs
new file mode 100644
index 00000000..cd530616
--- /dev/null
+++ b/src/SMAPI/Patches/EventErrorPatch.cs
@@ -0,0 +1,84 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Reflection;
+using Harmony;
+using StardewModdingAPI.Framework.Patching;
+using StardewValley;
+
+namespace StardewModdingAPI.Patches
+{
+ /// <summary>A Harmony patch for the <see cref="Dialogue"/> constructor which intercepts invalid dialogue lines and logs an error instead of crashing.</summary>
+ internal class EventErrorPatch : IHarmonyPatch
+ {
+ /*********
+ ** Fields
+ *********/
+ /// <summary>Writes messages to the console and log file on behalf of the game.</summary>
+ private static IMonitor MonitorForGame;
+
+ /// <summary>Whether the method is currently being intercepted.</summary>
+ private static bool IsIntercepted;
+
+
+ /*********
+ ** Accessors
+ *********/
+ /// <summary>A unique name for this patch.</summary>
+ public string Name => $"{nameof(EventErrorPatch)}";
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="monitorForGame">Writes messages to the console and log file on behalf of the game.</param>
+ public EventErrorPatch(IMonitor monitorForGame)
+ {
+ EventErrorPatch.MonitorForGame = monitorForGame;
+ }
+
+ /// <summary>Apply the Harmony patch.</summary>
+ /// <param name="harmony">The Harmony instance.</param>
+ public void Apply(HarmonyInstance harmony)
+ {
+ harmony.Patch(
+ original: AccessTools.Method(typeof(GameLocation), "checkEventPrecondition"),
+ prefix: new HarmonyMethod(this.GetType(), nameof(EventErrorPatch.Before_GameLocation_CheckEventPrecondition))
+ );
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ /// <summary>The method to call instead of the GameLocation.CheckEventPrecondition.</summary>
+ /// <param name="__instance">The instance being patched.</param>
+ /// <param name="__result">The return value of the original method.</param>
+ /// <param name="precondition">The precondition to be parsed.</param>
+ /// <param name="__originalMethod">The method being wrapped.</param>
+ /// <returns>Returns whether to execute the original method.</returns>
+ /// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks>
+ [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")]
+ private static bool Before_GameLocation_CheckEventPrecondition(GameLocation __instance, ref int __result, string precondition, MethodInfo __originalMethod)
+ {
+ if (EventErrorPatch.IsIntercepted)
+ return true;
+
+ try
+ {
+ EventErrorPatch.IsIntercepted = true;
+ __result = (int)__originalMethod.Invoke(__instance, new object[] { precondition });
+ return false;
+ }
+ catch (TargetInvocationException ex)
+ {
+ __result = -1;
+ EventErrorPatch.MonitorForGame.Log($"Failed parsing event precondition ({precondition}):\n{ex.InnerException}", LogLevel.Error);
+ return false;
+ }
+ finally
+ {
+ EventErrorPatch.IsIntercepted = false;
+ }
+ }
+ }
+}
diff --git a/src/SMAPI/Patches/LoadForNewGamePatch.cs b/src/SMAPI/Patches/LoadContextPatch.cs
index 9e788e84..3f86c9a9 100644
--- a/src/SMAPI/Patches/LoadForNewGamePatch.cs
+++ b/src/SMAPI/Patches/LoadContextPatch.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
-using System.Reflection;
using Harmony;
using StardewModdingAPI.Enums;
using StardewModdingAPI.Framework.Patching;
@@ -13,10 +12,10 @@ namespace StardewModdingAPI.Patches
{
/// <summary>A Harmony patch for <see cref="Game1.loadForNewGame"/> which notifies SMAPI for save creation load stages.</summary>
/// <remarks>This patch hooks into <see cref="Game1.loadForNewGame"/>, checks if <c>TitleMenu.transitioningCharacterCreationMenu</c> is true (which means the player is creating a new save file), then raises <see cref="LoadStage.CreatedBasicInfo"/> after the location list is cleared twice (the second clear happens right before locations are created), and <see cref="LoadStage.CreatedLocations"/> when the method ends.</remarks>
- internal class LoadForNewGamePatch : IHarmonyPatch
+ internal class LoadContextPatch : IHarmonyPatch
{
/*********
- ** Accessors
+ ** Fields
*********/
/// <summary>Simplifies access to private code.</summary>
private static Reflector Reflection;
@@ -28,14 +27,14 @@ namespace StardewModdingAPI.Patches
private static bool IsCreating;
/// <summary>The number of times that <see cref="Game1.locations"/> has been cleared since <see cref="Game1.loadForNewGame"/> started.</summary>
- private static int TimesLocationsCleared = 0;
+ private static int TimesLocationsCleared;
/*********
** Accessors
*********/
/// <summary>A unique name for this patch.</summary>
- public string Name => $"{nameof(LoadForNewGamePatch)}";
+ public string Name => $"{nameof(LoadContextPatch)}";
/*********
@@ -44,21 +43,21 @@ namespace StardewModdingAPI.Patches
/// <summary>Construct an instance.</summary>
/// <param name="reflection">Simplifies access to private code.</param>
/// <param name="onStageChanged">A callback to invoke when the load stage changes.</param>
- public LoadForNewGamePatch(Reflector reflection, Action<LoadStage> onStageChanged)
+ public LoadContextPatch(Reflector reflection, Action<LoadStage> onStageChanged)
{
- LoadForNewGamePatch.Reflection = reflection;
- LoadForNewGamePatch.OnStageChanged = onStageChanged;
+ LoadContextPatch.Reflection = reflection;
+ LoadContextPatch.OnStageChanged = onStageChanged;
}
/// <summary>Apply the Harmony patch.</summary>
/// <param name="harmony">The Harmony instance.</param>
public void Apply(HarmonyInstance harmony)
{
- MethodInfo method = AccessTools.Method(typeof(Game1), nameof(Game1.loadForNewGame));
- MethodInfo prefix = AccessTools.Method(this.GetType(), nameof(LoadForNewGamePatch.Prefix));
- MethodInfo postfix = AccessTools.Method(this.GetType(), nameof(LoadForNewGamePatch.Postfix));
-
- harmony.Patch(method, new HarmonyMethod(prefix), new HarmonyMethod(postfix));
+ harmony.Patch(
+ original: AccessTools.Method(typeof(Game1), nameof(Game1.loadForNewGame)),
+ prefix: new HarmonyMethod(this.GetType(), nameof(LoadContextPatch.Before_Game1_LoadForNewGame)),
+ postfix: new HarmonyMethod(this.GetType(), nameof(LoadContextPatch.After_Game1_LoadForNewGame))
+ );
}
@@ -68,15 +67,15 @@ namespace StardewModdingAPI.Patches
/// <summary>The method to call instead of <see cref="Game1.loadForNewGame"/>.</summary>
/// <returns>Returns whether to execute the original method.</returns>
/// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks>
- private static bool Prefix()
+ private static bool Before_Game1_LoadForNewGame()
{
- LoadForNewGamePatch.IsCreating = Game1.activeClickableMenu is TitleMenu menu && LoadForNewGamePatch.Reflection.GetField<bool>(menu, "transitioningCharacterCreationMenu").GetValue();
- LoadForNewGamePatch.TimesLocationsCleared = 0;
- if (LoadForNewGamePatch.IsCreating)
+ LoadContextPatch.IsCreating = Game1.activeClickableMenu is TitleMenu menu && LoadContextPatch.Reflection.GetField<bool>(menu, "transitioningCharacterCreationMenu").GetValue();
+ LoadContextPatch.TimesLocationsCleared = 0;
+ if (LoadContextPatch.IsCreating)
{
// raise CreatedBasicInfo after locations are cleared twice
ObservableCollection<GameLocation> locations = (ObservableCollection<GameLocation>)Game1.locations;
- locations.CollectionChanged += LoadForNewGamePatch.OnLocationListChanged;
+ locations.CollectionChanged += LoadContextPatch.OnLocationListChanged;
}
return true;
@@ -84,16 +83,16 @@ namespace StardewModdingAPI.Patches
/// <summary>The method to call instead after <see cref="Game1.loadForNewGame"/>.</summary>
/// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks>
- private static void Postfix()
+ private static void After_Game1_LoadForNewGame()
{
- if (LoadForNewGamePatch.IsCreating)
+ if (LoadContextPatch.IsCreating)
{
// clean up
- ObservableCollection<GameLocation> locations = (ObservableCollection<GameLocation>) Game1.locations;
- locations.CollectionChanged -= LoadForNewGamePatch.OnLocationListChanged;
+ ObservableCollection<GameLocation> locations = (ObservableCollection<GameLocation>)Game1.locations;
+ locations.CollectionChanged -= LoadContextPatch.OnLocationListChanged;
// raise stage changed
- LoadForNewGamePatch.OnStageChanged(LoadStage.CreatedLocations);
+ LoadContextPatch.OnStageChanged(LoadStage.CreatedLocations);
}
}
@@ -102,8 +101,8 @@ namespace StardewModdingAPI.Patches
/// <param name="e">The event arguments.</param>
private static void OnLocationListChanged(object sender, NotifyCollectionChangedEventArgs e)
{
- if (++LoadForNewGamePatch.TimesLocationsCleared == 2)
- LoadForNewGamePatch.OnStageChanged(LoadStage.CreatedBasicInfo);
+ if (++LoadContextPatch.TimesLocationsCleared == 2)
+ LoadContextPatch.OnStageChanged(LoadStage.CreatedBasicInfo);
}
}
}
diff --git a/src/SMAPI/Patches/ObjectErrorPatch.cs b/src/SMAPI/Patches/ObjectErrorPatch.cs
index 0481259d..5b918d39 100644
--- a/src/SMAPI/Patches/ObjectErrorPatch.cs
+++ b/src/SMAPI/Patches/ObjectErrorPatch.cs
@@ -1,8 +1,8 @@
using System.Diagnostics.CodeAnalysis;
-using System.Reflection;
using Harmony;
using StardewModdingAPI.Framework.Patching;
using StardewValley;
+using StardewValley.Menus;
using SObject = StardewValley.Object;
namespace StardewModdingAPI.Patches
@@ -24,10 +24,17 @@ namespace StardewModdingAPI.Patches
/// <param name="harmony">The Harmony instance.</param>
public void Apply(HarmonyInstance harmony)
{
- MethodInfo method = AccessTools.Method(typeof(SObject), nameof(SObject.getDescription));
- MethodInfo prefix = AccessTools.Method(this.GetType(), nameof(ObjectErrorPatch.Prefix));
+ // object.getDescription
+ harmony.Patch(
+ original: AccessTools.Method(typeof(SObject), nameof(SObject.getDescription)),
+ prefix: new HarmonyMethod(this.GetType(), nameof(ObjectErrorPatch.Before_Object_GetDescription))
+ );
- harmony.Patch(method, new HarmonyMethod(prefix), null);
+ // IClickableMenu.drawToolTip
+ harmony.Patch(
+ original: AccessTools.Method(typeof(IClickableMenu), nameof(IClickableMenu.drawToolTip)),
+ prefix: new HarmonyMethod(this.GetType(), nameof(ObjectErrorPatch.Before_IClickableMenu_DrawTooltip))
+ );
}
@@ -40,7 +47,7 @@ namespace StardewModdingAPI.Patches
/// <returns>Returns whether to execute the original method.</returns>
/// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks>
[SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")]
- private static bool Prefix(SObject __instance, ref string __result)
+ private static bool Before_Object_GetDescription(SObject __instance, ref string __result)
{
// invalid bigcraftables crash instead of showing '???' like invalid non-bigcraftables
if (!__instance.IsRecipe && __instance.bigCraftable.Value && !Game1.bigCraftablesInformation.ContainsKey(__instance.ParentSheetIndex))
@@ -51,5 +58,20 @@ namespace StardewModdingAPI.Patches
return true;
}
+
+ /// <summary>The method to call instead of <see cref="IClickableMenu.drawToolTip"/>.</summary>
+ /// <param name="__instance">The instance being patched.</param>
+ /// <param name="hoveredItem">The item for which to draw a tooltip.</param>
+ /// <returns>Returns whether to execute the original method.</returns>
+ /// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks>
+ [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")]
+ private static bool Before_IClickableMenu_DrawTooltip(IClickableMenu __instance, Item hoveredItem)
+ {
+ // invalid edible item cause crash when drawing tooltips
+ if (hoveredItem is SObject obj && obj.Edibility != -300 && !Game1.objectInformation.ContainsKey(obj.ParentSheetIndex))
+ return false;
+
+ return true;
+ }
}
}
diff --git a/src/SMAPI/Program.cs b/src/SMAPI/Program.cs
index 2eec371c..3a34872a 100644
--- a/src/SMAPI/Program.cs
+++ b/src/SMAPI/Program.cs
@@ -30,10 +30,18 @@ namespace StardewModdingAPI
/// <param name="args">The command-line arguments.</param>
public static void Main(string[] args)
{
- AppDomain.CurrentDomain.AssemblyResolve += Program.CurrentDomain_AssemblyResolve;
- Program.AssertGamePresent();
- Program.AssertGameVersion();
- Program.Start(args);
+ try
+ {
+ AppDomain.CurrentDomain.AssemblyResolve += Program.CurrentDomain_AssemblyResolve;
+ Program.AssertGamePresent();
+ Program.AssertGameVersion();
+ Program.Start(args);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"SMAPI failed to initialise: {ex}");
+ Program.PressAnyKeyToExit(true);
+ }
}
diff --git a/src/SMAPI/StardewModdingAPI.config.json b/src/SMAPI/StardewModdingAPI.config.json
index ad908fc0..c04cceee 100644
--- a/src/SMAPI/StardewModdingAPI.config.json
+++ b/src/SMAPI/StardewModdingAPI.config.json
@@ -8,70 +8,70 @@ This file contains advanced configuration for SMAPI. You generally shouldn't cha
*/
{
- /**
- * The console color theme to use. The possible values are:
- * - AutoDetect: SMAPI will assume a light background on Mac, and detect the background color automatically on Linux or Windows.
- * - LightBackground: use darker text colors that look better on a white or light background.
- * - DarkBackground: use lighter text colors that look better on a black or dark background.
- */
- "ColorScheme": "AutoDetect",
+ /**
+ * The console color theme to use. The possible values are:
+ * - AutoDetect: SMAPI will assume a light background on Mac, and detect the background color automatically on Linux or Windows.
+ * - LightBackground: use darker text colors that look better on a white or light background.
+ * - DarkBackground: use lighter text colors that look better on a black or dark background.
+ */
+ "ColorScheme": "AutoDetect",
- /**
- * Whether SMAPI should check for newer versions of SMAPI and mods when you load the game. If new
- * versions are available, an alert will be shown in the console. This doesn't affect the load
- * time even if your connection is offline or slow, because it happens in the background.
- */
- "CheckForUpdates": true,
+ /**
+ * Whether SMAPI should check for newer versions of SMAPI and mods when you load the game. If new
+ * versions are available, an alert will be shown in the console. This doesn't affect the load
+ * time even if your connection is offline or slow, because it happens in the background.
+ */
+ "CheckForUpdates": true,
- /**
- * Whether to enable features intended for mod developers. Currently this only makes TRACE-level
- * messages appear in the console.
- */
- "DeveloperMode": true,
+ /**
+ * Whether to enable features intended for mod developers. Currently this only makes TRACE-level
+ * messages appear in the console.
+ */
+ "DeveloperMode": true,
- /**
- * Whether to add a section to the 'mod issues' list for mods which directly use potentially
- * sensitive .NET APIs like file or shell access. Note that many mods do this legitimately as
- * part of their normal functionality, so these warnings are meaningless without further
- * investigation. When this is commented out, it'll be true for local debug builds and false
- * otherwise.
- */
- //"ParanoidWarnings": true,
+ /**
+ * Whether to add a section to the 'mod issues' list for mods which directly use potentially
+ * sensitive .NET APIs like file or shell access. Note that many mods do this legitimately as
+ * part of their normal functionality, so these warnings are meaningless without further
+ * investigation. When this is commented out, it'll be true for local debug builds and false
+ * otherwise.
+ */
+ //"ParanoidWarnings": true,
- /**
- * Whether SMAPI should show newer beta versions as an available update. When this is commented
- * out, it'll be true if the current SMAPI version is beta, and false otherwise.
- */
- //"UseBetaChannel": true,
+ /**
+ * Whether SMAPI should show newer beta versions as an available update. When this is commented
+ * out, it'll be true if the current SMAPI version is beta, and false otherwise.
+ */
+ //"UseBetaChannel": true,
- /**
- * SMAPI's GitHub project name, used to perform update checks.
- */
- "GitHubProjectName": "Pathoschild/SMAPI",
+ /**
+ * SMAPI's GitHub project name, used to perform update checks.
+ */
+ "GitHubProjectName": "Pathoschild/SMAPI",
- /**
- * The base URL for SMAPI's web API, used to perform update checks.
- * Note: the protocol will be changed to http:// on Linux/Mac due to OpenSSL issues with the
- * game's bundled Mono.
- */
- "WebApiBaseUrl": "https://api.smapi.io",
+ /**
+ * The base URL for SMAPI's web API, used to perform update checks.
+ * Note: the protocol will be changed to http:// on Linux/Mac due to OpenSSL issues with the
+ * game's bundled Mono.
+ */
+ "WebApiBaseUrl": "https://api.smapi.io",
- /**
- * Whether SMAPI should log more information about the game context.
- */
- "VerboseLogging": false,
+ /**
+ * Whether SMAPI should log more information about the game context.
+ */
+ "VerboseLogging": false,
- /**
- * Whether to generate a 'SMAPI-latest.metadata-dump.json' file in the logs folder with the full mod
- * metadata for detected mods. This is only needed when troubleshooting some cases.
- */
- "DumpMetadata": false,
+ /**
+ * Whether to generate a 'SMAPI-latest.metadata-dump.json' file in the logs folder with the full mod
+ * metadata for detected mods. This is only needed when troubleshooting some cases.
+ */
+ "DumpMetadata": false,
- /**
- * The mod IDs SMAPI should ignore when performing update checks or validating update keys.
- */
- "SuppressUpdateChecks": [
- "SMAPI.ConsoleCommands",
- "SMAPI.SaveBackup"
- ]
+ /**
+ * The mod IDs SMAPI should ignore when performing update checks or validating update keys.
+ */
+ "SuppressUpdateChecks": [
+ "SMAPI.ConsoleCommands",
+ "SMAPI.SaveBackup"
+ ]
}
diff --git a/src/SMAPI/StardewModdingAPI.csproj b/src/SMAPI/StardewModdingAPI.csproj
index b6562eca..eda53025 100644
--- a/src/SMAPI/StardewModdingAPI.csproj
+++ b/src/SMAPI/StardewModdingAPI.csproj
@@ -1,69 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+<Project Sdk="Microsoft.NET.Sdk">
+
<PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
- <ProjectGuid>{F1A573B0-F436-472C-AE29-0B91EA6B9F8F}</ProjectGuid>
- <OutputType>Exe</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StardewModdingAPI</RootNamespace>
<AssemblyName>StardewModdingAPI</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
- <IsWebBootstrapper>false</IsWebBootstrapper>
- <TargetFrameworkProfile />
- <PublishUrl>publish\</PublishUrl>
- <Install>true</Install>
- <InstallFrom>Disk</InstallFrom>
- <UpdateEnabled>false</UpdateEnabled>
- <UpdateMode>Foreground</UpdateMode>
- <UpdateInterval>7</UpdateInterval>
- <UpdateIntervalUnits>Days</UpdateIntervalUnits>
- <UpdatePeriodically>false</UpdatePeriodically>
- <UpdateRequired>false</UpdateRequired>
- <MapFileExtensions>true</MapFileExtensions>
- <ApplicationRevision>0</ApplicationRevision>
- <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
- <UseApplicationTrust>false</UseApplicationTrust>
- <BootstrapperEnabled>true</BootstrapperEnabled>
+ <TargetFramework>net45</TargetFramework>
+ <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
- <LargeAddressAware Condition="'$(OS)' == 'Windows_NT'">true</LargeAddressAware>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
- <PlatformTarget>x86</PlatformTarget>
- <Prefer32Bit>false</Prefer32Bit>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <UseVSHostingProcess>true</UseVSHostingProcess>
- <Optimize>false</Optimize>
- <OutputPath>$(SolutionDir)\..\bin\Debug\SMAPI</OutputPath>
- <DocumentationFile>$(SolutionDir)\..\bin\Debug\SMAPI\StardewModdingAPI.xml</DocumentationFile>
- <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<PlatformTarget>x86</PlatformTarget>
- <Prefer32Bit>false</Prefer32Bit>
- <OutputPath>$(SolutionDir)\..\bin\Release\SMAPI</OutputPath>
- <DocumentationFile>$(SolutionDir)\..\bin\Release\SMAPI\StardewModdingAPI.xml</DocumentationFile>
- <DefineConstants>TRACE</DefineConstants>
- <Optimize>true</Optimize>
- <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
- <DebugType>pdbonly</DebugType>
- <DebugSymbols>true</DebugSymbols>
- </PropertyGroup>
- <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <OutputPath>$(SolutionDir)\..\bin\$(Configuration)\SMAPI</OutputPath>
+ <DocumentationFile>$(SolutionDir)\..\bin\$(Configuration)\SMAPI\StardewModdingAPI.xml</DocumentationFile>
+ <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+ <LargeAddressAware Condition="'$(OS)' == 'Windows_NT'">true</LargeAddressAware>
<ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
+
<ItemGroup>
<PackageReference Include="LargeAddressAware" Version="1.0.3" />
<PackageReference Include="Lib.Harmony" Version="1.2.0.1" />
<PackageReference Include="Mono.Cecil" Version="0.10.1" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup>
+
<ItemGroup>
- <Reference Include="System" />
- <Reference Include="System.Core" />
- <Reference Include="System.Drawing" />
<Reference Include="System.Numerics">
<Private>True</Private>
</Reference>
@@ -71,281 +30,17 @@
<Private>True</Private>
</Reference>
<Reference Include="System.Windows.Forms" Condition="$(OS) == 'Windows_NT'" />
- <Reference Include="System.Xml" />
</ItemGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\SMAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj" />
+ <ProjectReference Include="..\SMAPI.Toolkit\StardewModdingAPI.Toolkit.csproj" />
+ </ItemGroup>
+
<ItemGroup>
- <Compile Include="..\..\build\GlobalAssemblyInfo.cs">
- <Link>Properties\GlobalAssemblyInfo.cs</Link>
- </Compile>
- <Compile Include="Enums\LoadStage.cs" />
- <Compile Include="Enums\SkillType.cs" />
- <Compile Include="Events\BuildingListChangedEventArgs.cs" />
- <Compile Include="Events\ButtonPressedEventArgs.cs" />
- <Compile Include="Events\ButtonReleasedEventArgs.cs" />
- <Compile Include="Events\ChangeType.cs" />
- <Compile Include="Events\ContentEvents.cs" />
- <Compile Include="Events\ControlEvents.cs" />
- <Compile Include="Events\CursorMovedEventArgs.cs" />
- <Compile Include="Events\DayEndingEventArgs.cs" />
- <Compile Include="Events\DayStartedEventArgs.cs" />
- <Compile Include="Events\DebrisListChangedEventArgs.cs" />
- <Compile Include="Events\EventArgsClickableMenuChanged.cs" />
- <Compile Include="Events\EventArgsClickableMenuClosed.cs" />
- <Compile Include="Events\EventArgsControllerButtonPressed.cs" />
- <Compile Include="Events\EventArgsControllerButtonReleased.cs" />
- <Compile Include="Events\EventArgsControllerTriggerPressed.cs" />
- <Compile Include="Events\EventArgsControllerTriggerReleased.cs" />
- <Compile Include="Events\EventArgsInput.cs" />
- <Compile Include="Events\EventArgsIntChanged.cs" />
- <Compile Include="Events\EventArgsInventoryChanged.cs" />
- <Compile Include="Events\EventArgsKeyboardStateChanged.cs" />
- <Compile Include="Events\EventArgsKeyPressed.cs" />
- <Compile Include="Events\EventArgsLevelUp.cs" />
- <Compile Include="Events\EventArgsLocationBuildingsChanged.cs" />
- <Compile Include="Events\EventArgsLocationObjectsChanged.cs" />
- <Compile Include="Events\EventArgsLocationsChanged.cs" />
- <Compile Include="Events\EventArgsMineLevelChanged.cs" />
- <Compile Include="Events\EventArgsMouseStateChanged.cs" />
- <Compile Include="Events\EventArgsPlayerWarped.cs" />
- <Compile Include="Events\EventArgsValueChanged.cs" />
- <Compile Include="Events\GameEvents.cs" />
- <Compile Include="Events\GameLaunchedEventArgs.cs" />
- <Compile Include="Events\GraphicsEvents.cs" />
- <Compile Include="Events\IDisplayEvents.cs" />
- <Compile Include="Events\IGameLoopEvents.cs" />
- <Compile Include="Events\IInputEvents.cs" />
- <Compile Include="Events\IModEvents.cs" />
- <Compile Include="Events\IMultiplayerEvents.cs" />
- <Compile Include="Events\InputEvents.cs" />
- <Compile Include="Events\InventoryChangedEventArgs.cs" />
- <Compile Include="Events\IPlayerEvents.cs" />
- <Compile Include="Events\ISpecialisedEvents.cs" />
- <Compile Include="Events\ItemStackChange.cs" />
- <Compile Include="Events\ItemStackSizeChange.cs" />
- <Compile Include="Events\IWorldEvents.cs" />
- <Compile Include="Events\LargeTerrainFeatureListChangedEventArgs.cs" />
- <Compile Include="Events\LevelChangedEventArgs.cs" />
- <Compile Include="Events\LoadStageChangedEventArgs.cs" />
- <Compile Include="Events\LocationEvents.cs" />
- <Compile Include="Events\LocationListChangedEventArgs.cs" />
- <Compile Include="Events\MenuChangedEventArgs.cs" />
- <Compile Include="Events\MenuEvents.cs" />
- <Compile Include="Events\MineEvents.cs" />
- <Compile Include="Events\ModMessageReceivedEventArgs.cs" />
- <Compile Include="Events\MouseWheelScrolledEventArgs.cs" />
- <Compile Include="Events\MultiplayerEvents.cs" />
- <Compile Include="Events\NpcListChangedEventArgs.cs" />
- <Compile Include="Events\ObjectListChangedEventArgs.cs" />
- <Compile Include="Events\OneSecondUpdateTickedEventArgs.cs" />
- <Compile Include="Events\OneSecondUpdateTickingEventArgs.cs" />
- <Compile Include="Events\PeerContextReceivedEventArgs.cs" />
- <Compile Include="Events\PeerDisconnectedEventArgs.cs" />
- <Compile Include="Events\PlayerEvents.cs" />
- <Compile Include="Events\RenderedActiveMenuEventArgs.cs" />
- <Compile Include="Events\RenderedEventArgs.cs" />
- <Compile Include="Events\RenderedHudEventArgs.cs" />
- <Compile Include="Events\RenderedWorldEventArgs.cs" />
- <Compile Include="Events\RenderingActiveMenuEventArgs.cs" />
- <Compile Include="Events\RenderingEventArgs.cs" />
- <Compile Include="Events\RenderingHudEventArgs.cs" />
- <Compile Include="Events\RenderingWorldEventArgs.cs" />
- <Compile Include="Events\ReturnedToTitleEventArgs.cs" />
- <Compile Include="Events\SaveCreatedEventArgs.cs" />
- <Compile Include="Events\SaveCreatingEventArgs.cs" />
- <Compile Include="Events\SavedEventArgs.cs" />
- <Compile Include="Events\SaveEvents.cs" />
- <Compile Include="Events\SaveLoadedEventArgs.cs" />
- <Compile Include="Events\SavingEventArgs.cs" />
- <Compile Include="Events\SpecialisedEvents.cs" />
- <Compile Include="Events\TerrainFeatureListChangedEventArgs.cs" />
- <Compile Include="Events\TimeChangedEventArgs.cs" />
- <Compile Include="Events\TimeEvents.cs" />
- <Compile Include="Events\UnvalidatedUpdateTickedEventArgs.cs" />
- <Compile Include="Events\UnvalidatedUpdateTickingEventArgs.cs" />
- <Compile Include="Events\UpdateTickedEventArgs.cs" />
- <Compile Include="Events\UpdateTickingEventArgs.cs" />
- <Compile Include="Events\WarpedEventArgs.cs" />
- <Compile Include="Events\WindowResizedEventArgs.cs" />
- <Compile Include="Framework\DeprecationWarning.cs" />
- <Compile Include="Framework\Events\EventManager.cs" />
- <Compile Include="Framework\Events\ManagedEvent.cs" />
- <Compile Include="Framework\Events\ManagedEventBase.cs" />
- <Compile Include="Framework\Events\ModDisplayEvents.cs" />
- <Compile Include="Framework\Events\ModEvents.cs" />
- <Compile Include="Framework\Events\ModEventsBase.cs" />
- <Compile Include="Framework\Events\ModGameLoopEvents.cs" />
- <Compile Include="Framework\Events\ModInputEvents.cs" />
- <Compile Include="Framework\Events\ModMultiplayerEvents.cs" />
- <Compile Include="Framework\Events\ModPlayerEvents.cs" />
- <Compile Include="Framework\Events\ModSpecialisedEvents.cs" />
- <Compile Include="Framework\Events\ModWorldEvents.cs" />
- <Compile Include="Framework\ModHelpers\ContentPackHelper.cs" />
- <Compile Include="Framework\ModHelpers\DataHelper.cs" />
- <Compile Include="Framework\Networking\MessageType.cs" />
- <Compile Include="Framework\Networking\ModMessageModel.cs" />
- <Compile Include="Framework\Networking\MultiplayerPeer.cs" />
- <Compile Include="Framework\Networking\MultiplayerPeerMod.cs" />
- <Compile Include="Framework\Networking\RemoteContextModel.cs" />
- <Compile Include="Framework\Networking\RemoteContextModModel.cs" />
- <Compile Include="Framework\Networking\SGalaxyNetClient.cs" />
- <Compile Include="Framework\Networking\SGalaxyNetServer.cs" />
- <Compile Include="Framework\Networking\SLidgrenClient.cs" />
- <Compile Include="Framework\Networking\SLidgrenServer.cs" />
- <Compile Include="Framework\SCore.cs" />
- <Compile Include="Framework\SGameConstructorHack.cs" />
- <Compile Include="Framework\ContentManagers\BaseContentManager.cs" />
- <Compile Include="Framework\ContentManagers\GameContentManager.cs" />
- <Compile Include="Framework\ContentManagers\IContentManager.cs" />
- <Compile Include="Framework\ContentManagers\ModContentManager.cs" />
- <Compile Include="Framework\Models\ModFolderExport.cs" />
- <Compile Include="Framework\ModLoading\TypeReferenceComparer.cs" />
- <Compile Include="Framework\Patching\GamePatcher.cs" />
- <Compile Include="Framework\Patching\IHarmonyPatch.cs" />
- <Compile Include="Framework\Serialisation\ColorConverter.cs" />
- <Compile Include="Framework\Serialisation\PointConverter.cs" />
- <Compile Include="Framework\Serialisation\RectangleConverter.cs" />
- <Compile Include="Framework\ContentPack.cs" />
- <Compile Include="Framework\Content\ContentCache.cs" />
- <Compile Include="Framework\Input\GamePadStateBuilder.cs" />
- <Compile Include="Framework\ModHelpers\InputHelper.cs" />
- <Compile Include="Framework\SModHooks.cs" />
- <Compile Include="Framework\Singleton.cs" />
- <Compile Include="Framework\StateTracking\Comparers\GenericEqualsComparer.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\ComparableListWatcher.cs" />
- <Compile Include="Framework\WatcherCore.cs" />
- <Compile Include="IContentPackHelper.cs" />
- <Compile Include="IDataHelper.cs" />
- <Compile Include="IInputHelper.cs" />
- <Compile Include="Framework\Input\SInputState.cs" />
- <Compile Include="Framework\Input\InputStatus.cs" />
- <Compile Include="Framework\ModHelpers\MultiplayerHelper.cs" />
- <Compile Include="Framework\ModLoading\Finders\EventFinder.cs" />
- <Compile Include="Framework\ModLoading\Finders\FieldFinder.cs" />
- <Compile Include="Framework\ModLoading\Finders\MethodFinder.cs" />
- <Compile Include="Framework\ModLoading\Finders\PropertyFinder.cs" />
- <Compile Include="Framework\ModLoading\Finders\ReferenceToMissingMemberFinder.cs" />
- <Compile Include="Framework\ModLoading\Finders\TypeFinder.cs" />
- <Compile Include="Framework\ModLoading\IInstructionHandler.cs" />
- <Compile Include="Framework\ModLoading\IncompatibleInstructionException.cs" />
- <Compile Include="Framework\ModLoading\InstructionHandleResult.cs" />
- <Compile Include="Framework\ModLoading\PlatformAssemblyMap.cs" />
- <Compile Include="Framework\ModLoading\RewriteHelper.cs" />
- <Compile Include="Framework\ModLoading\Rewriters\FieldReplaceRewriter.cs" />
- <Compile Include="Framework\ModLoading\Rewriters\StaticFieldToConstantRewriter.cs" />
- <Compile Include="Framework\ModLoading\Rewriters\FieldToPropertyRewriter.cs" />
- <Compile Include="Framework\ModLoading\Finders\ReferenceToMemberWithUnexpectedTypeFinder.cs" />
- <Compile Include="Framework\ModLoading\Rewriters\MethodParentRewriter.cs" />
- <Compile Include="Framework\ModLoading\Rewriters\TypeReferenceRewriter.cs" />
- <Compile Include="Framework\Exceptions\SAssemblyLoadFailedException.cs" />
- <Compile Include="Framework\ModLoading\AssemblyLoadStatus.cs" />
- <Compile Include="Framework\Reflection\InterfaceProxyBuilder.cs" />
- <Compile Include="Framework\Reflection\InterfaceProxyFactory.cs" />
- <Compile Include="Framework\RewriteFacades\SpriteBatchMethods.cs" />
- <Compile Include="Framework\SMultiplayer.cs" />
- <Compile Include="Framework\StateTracking\Comparers\EquatableComparer.cs" />
- <Compile Include="Framework\StateTracking\Comparers\ObjectReferenceComparer.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\BaseDisposableWatcher.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\ComparableWatcher.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\NetDictionaryWatcher.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\NetValueWatcher.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\NetCollectionWatcher.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\ObservableCollectionWatcher.cs" />
- <Compile Include="Framework\StateTracking\FieldWatchers\WatcherFactory.cs" />
- <Compile Include="Framework\StateTracking\ICollectionWatcher.cs" />
- <Compile Include="Framework\StateTracking\IDictionaryWatcher.cs" />
- <Compile Include="Framework\StateTracking\IValueWatcher.cs" />
- <Compile Include="Framework\StateTracking\IWatcher.cs" />
- <Compile Include="Framework\StateTracking\WorldLocationsTracker.cs" />
- <Compile Include="Framework\StateTracking\LocationTracker.cs" />
- <Compile Include="Framework\StateTracking\PlayerTracker.cs" />
- <Compile Include="Framework\Utilities\ContextHash.cs" />
- <Compile Include="IContentPack.cs" />
- <Compile Include="IModInfo.cs" />
- <Compile Include="IMultiplayerHelper.cs" />
- <Compile Include="IMultiplayerPeer.cs" />
- <Compile Include="IReflectedField.cs" />
- <Compile Include="IReflectedMethod.cs" />
- <Compile Include="IReflectedProperty.cs" />
- <Compile Include="IMultiplayerPeerMod.cs" />
- <Compile Include="Metadata\CoreAssetPropagator.cs" />
- <Compile Include="ContentSource.cs" />
- <Compile Include="Framework\Content\AssetInfo.cs" />
- <Compile Include="Framework\Exceptions\SContentLoadException.cs" />
- <Compile Include="Framework\Command.cs" />
- <Compile Include="Constants.cs" />
- <Compile Include="Framework\Utilities\Countdown.cs" />
- <Compile Include="Framework\GameVersion.cs" />
- <Compile Include="Framework\IModMetadata.cs" />
- <Compile Include="Framework\ModHelpers\BaseHelper.cs" />
- <Compile Include="Framework\ModHelpers\CommandHelper.cs" />
- <Compile Include="Framework\ModHelpers\ContentHelper.cs" />
- <Compile Include="Framework\ModHelpers\ModHelper.cs" />
- <Compile Include="Framework\ModHelpers\ModRegistryHelper.cs" />
- <Compile Include="Framework\ModHelpers\ReflectionHelper.cs" />
- <Compile Include="Framework\ModHelpers\TranslationHelper.cs" />
- <Compile Include="Framework\ModLoading\InvalidModStateException.cs" />
- <Compile Include="Framework\ModLoading\ModDependencyStatus.cs" />
- <Compile Include="Framework\ModLoading\ModMetadataStatus.cs" />
- <Compile Include="Framework\ModLoading\ModResolver.cs" />
- <Compile Include="Framework\ModLoading\AssemblyDefinitionResolver.cs" />
- <Compile Include="Framework\ModLoading\AssemblyParseResult.cs" />
- <Compile Include="Framework\CommandManager.cs" />
- <Compile Include="Framework\Content\AssetData.cs" />
- <Compile Include="Framework\Content\AssetDataForObject.cs" />
- <Compile Include="Framework\Content\AssetDataForDictionary.cs" />
- <Compile Include="Framework\Content\AssetDataForImage.cs" />
- <Compile Include="Context.cs" />
- <Compile Include="Framework\Logging\ConsoleInterceptionManager.cs" />
- <Compile Include="Framework\Logging\InterceptingTextWriter.cs" />
- <Compile Include="Framework\Models\SConfig.cs" />
- <Compile Include="Framework\ModLoading\ModMetadata.cs" />
- <Compile Include="Framework\Reflection\ReflectedProperty.cs" />
- <Compile Include="Framework\RequestExitDelegate.cs" />
- <Compile Include="Framework\ContentCoordinator.cs" />
- <Compile Include="IAssetEditor.cs" />
- <Compile Include="IAssetInfo.cs" />
- <Compile Include="IAssetLoader.cs" />
- <Compile Include="ICommandHelper.cs" />
- <Compile Include="IAssetData.cs" />
- <Compile Include="IAssetDataForDictionary.cs" />
- <Compile Include="IAssetDataForImage.cs" />
- <Compile Include="IContentHelper.cs" />
- <Compile Include="IModRegistry.cs" />
- <Compile Include="Framework\DeprecationLevel.cs" />
- <Compile Include="Framework\DeprecationManager.cs" />
- <Compile Include="Framework\InternalExtensions.cs" />
- <Compile Include="Framework\ModLoading\AssemblyLoader.cs" />
- <Compile Include="Framework\Reflection\CacheEntry.cs" />
- <Compile Include="Framework\Reflection\ReflectedField.cs" />
- <Compile Include="Framework\Reflection\ReflectedMethod.cs" />
- <Compile Include="Framework\Reflection\Reflector.cs" />
- <Compile Include="IMod.cs" />
- <Compile Include="IModHelper.cs" />
- <Compile Include="IModLinked.cs" />
- <Compile Include="Framework\Logging\LogFileManager.cs" />
- <Compile Include="ITranslationHelper.cs" />
- <Compile Include="LogLevel.cs" />
- <Compile Include="Framework\ModRegistry.cs" />
- <Compile Include="IMonitor.cs" />
- <Compile Include="Framework\Monitor.cs" />
- <Compile Include="Metadata\InstructionMetadata.cs" />
- <Compile Include="Mod.cs" />
- <Compile Include="Patches\LoadForNewGamePatch.cs" />
- <Compile Include="Patches\ObjectErrorPatch.cs" />
- <Compile Include="Patches\DialogueErrorPatch.cs" />
- <Compile Include="PatchMode.cs" />
- <Compile Include="GamePlatform.cs" />
- <Compile Include="Program.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
- <Compile Include="Framework\SGame.cs" />
- <Compile Include="IReflectionHelper.cs" />
- <Compile Include="SemanticVersion.cs" />
- <Compile Include="Translation.cs" />
- <Compile Include="ICursorPosition.cs" />
- <Compile Include="Utilities\SDate.cs" />
- <Compile Include="SButton.cs" />
- <Compile Include="Framework\CursorPosition.cs" />
+ <Compile Include="..\..\build\GlobalAssemblyInfo.cs" Link="Properties\GlobalAssemblyInfo.cs" />
</ItemGroup>
+
<ItemGroup>
<Content Include="StardewModdingAPI.config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -354,39 +49,12 @@
<Link>StardewModdingAPI.metadata.json</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- </ItemGroup>
- <ItemGroup>
- <Content Include="icon.ico" />
- <Content Include="steam_appid.txt">
+ <None Update="steam_appid.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- </ItemGroup>
- <ItemGroup>
- <BootstrapperPackage Include=".NETFramework,Version=v4.5">
- <Visible>False</Visible>
- <ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>
- <Install>true</Install>
- </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
- <Visible>False</Visible>
- <ProductName>.NET Framework 3.5 SP1</ProductName>
- <Install>false</Install>
- </BootstrapperPackage>
- </ItemGroup>
- <ItemGroup>
- <Analyzer Include="..\SMAPI.ModBuildConfig.Analyzer\bin\netstandard1.3\StardewModdingAPI.ModBuildConfig.Analyzer.dll" />
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit.CoreInterfaces\StardewModdingAPI.Toolkit.CoreInterfaces.csproj">
- <Project>{d5cfd923-37f1-4bc3-9be8-e506e202ac28}</Project>
- <Name>StardewModdingAPI.Toolkit.CoreInterfaces</Name>
- </ProjectReference>
- <ProjectReference Include="..\StardewModdingAPI.Toolkit\StardewModdingAPI.Toolkit.csproj">
- <Project>{ea5cfd2e-9453-4d29-b80f-8e0ea23f4ac6}</Project>
- <Name>StardewModdingAPI.Toolkit</Name>
- </ProjectReference>
+ </None>
</ItemGroup>
+
<Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\..\build\common.targets" />
-</Project> \ No newline at end of file
+
+</Project>
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiSmapi3Status.cs b/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiSmapi3Status.cs
deleted file mode 100644
index 879cfd8a..00000000
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiSmapi3Status.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
-{
- /// <summary>Whether a mod is ready for the upcoming SMAPI 3.0.</summary>
- public enum WikiSmapi3Status
- {
- /// <summary>The mod's compatibility status is unknown.</summary>
- Unknown = 0,
-
- /// <summary>The mod is compatible with the upcoming SMAPI 3.0.</summary>
- Ok = 1,
-
- /// <summary>The mod will break in SMAPI 3.0.</summary>
- Broken = 2,
-
- /// <summary>The mod has a pull request submitted for SMAPI 3.0 compatibility.</summary>
- Soon = 3
- }
-}