diff --git a/build/common.targets b/build/common.targets
index 804f1ed3..59d5bfd2 100644
--- a/build/common.targets
+++ b/build/common.targets
@@ -10,7 +10,7 @@
-
+
diff --git a/docs/README.md b/docs/README.md
index e4220de2..4b9c97a1 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -38,16 +38,16 @@ doesn't change any of your game files. It serves eight main purposes:
something goes wrong. (Via the bundled SaveBackup mod.)_
## Documentation
-Have questions? Come [chat on Discord](https://discord.gg/KCJHWhX) with SMAPI developers and other
-modders!
+Have questions? Come [chat on Discord](https://stardewvalleywiki.com/Modding:Community) with SMAPI
+developers and other modders!
### For players
* [Player guide](https://stardewvalleywiki.com/Modding:Player_Guide)
### For modders
* [Modding documentation](https://stardewvalleywiki.com/Modding:Index)
-* [Mod build configuration](mod-build-config.md)
+* [Mod build configuration](technical/mod-package.md)
* [Release notes](release-notes.md)
### For SMAPI developers
-* [Technical docs](technical-docs.md)
+* [Technical docs](technical/smapi.md)
diff --git a/docs/release-notes.md b/docs/release-notes.md
index efac8f41..3f955e78 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -1,3 +1,5 @@
+← [README](README.md)
+
# Release notes
## 3.0 (upcoming release)
These changes have not been released yet.
@@ -674,7 +676,7 @@ Released 14 October 2017 for Stardew Valley 1.2.30–1.2.33.
* **Command-line install**
For power users and mod managers, the SMAPI installer can now be scripted using command-line arguments
- (see [technical docs](technical-docs.md#command-line-arguments)).
+ (see [technical docs](technical/smapi.md#command-line-arguments)).
### Change log
For players:
diff --git a/docs/mod-build-config.md b/docs/technical/mod-package.md
similarity index 99%
rename from docs/mod-build-config.md
rename to docs/technical/mod-package.md
index 6c8ea2fa..43682bfb 100644
--- a/docs/mod-build-config.md
+++ b/docs/technical/mod-package.md
@@ -1,3 +1,5 @@
+← [SMAPI](../README.md)
+
The **mod build package** is an open-source NuGet package which automates the MSBuild configuration
for SMAPI mods and related tools. The package is fully compatible with Linux, Mac, and Windows.
diff --git a/docs/screenshots/code-analyzer-example.png b/docs/technical/screenshots/code-analyzer-example.png
similarity index 100%
rename from docs/screenshots/code-analyzer-example.png
rename to docs/technical/screenshots/code-analyzer-example.png
diff --git a/docs/technical-docs.md b/docs/technical/smapi.md
similarity index 97%
rename from docs/technical-docs.md
rename to docs/technical/smapi.md
index 5ef6dfb1..a006ff1a 100644
--- a/docs/technical-docs.md
+++ b/docs/technical/smapi.md
@@ -1,10 +1,10 @@
-← [README](README.md)
+← [README](../README.md)
This file provides more technical documentation about SMAPI. If you only want to use or create
mods, this section isn't relevant to you; see the main README to use or create mods.
-This document is about SMAPI itself; see also [mod build package](mod-build-config.md) and
-[web services](web-services.md).
+This document is about SMAPI itself; see also [mod build package](mod-package.md) and
+[web services](web.md).
# Contents
* [Customisation](#customisation)
@@ -102,4 +102,4 @@ on the wiki for the first-time setup.
4. Zip the two folders.
## Release notes
-See [release notes](release-notes.md).
+See [release notes](../release-notes.md).
diff --git a/docs/web-services.md b/docs/technical/web.md
similarity index 99%
rename from docs/web-services.md
rename to docs/technical/web.md
index 601152de..c8888623 100644
--- a/docs/web-services.md
+++ b/docs/technical/web.md
@@ -1,3 +1,5 @@
+← [README](../README.md)
+
**SMAPI.Web** contains the code for the `smapi.io` website, including the mod compatibility list
and update check API.
diff --git a/src/SMAPI.ModBuildConfig.Analyzer.Tests/NetFieldAnalyzerTests.cs b/src/SMAPI.ModBuildConfig.Analyzer.Tests/NetFieldAnalyzerTests.cs
index 85a77d15..89bd1be5 100644
--- a/src/SMAPI.ModBuildConfig.Analyzer.Tests/NetFieldAnalyzerTests.cs
+++ b/src/SMAPI.ModBuildConfig.Analyzer.Tests/NetFieldAnalyzerTests.cs
@@ -96,7 +96,7 @@ namespace SMAPI.ModBuildConfig.Analyzer.Tests
DiagnosticResult expected = new DiagnosticResult
{
Id = "AvoidImplicitNetFieldCast",
- Message = $"This implicitly converts '{expression}' from {fromType} to {toType}, but {fromType} has unintuitive implicit conversion rules. Consider comparing against the actual value instead to avoid bugs. See https://smapi.io/buildmsg/avoid-implicit-net-field-cast for details.",
+ Message = $"This implicitly converts '{expression}' from {fromType} to {toType}, but {fromType} has unintuitive implicit conversion rules. Consider comparing against the actual value instead to avoid bugs. See https://smapi.io/package/avoid-implicit-net-field-cast for details.",
Severity = DiagnosticSeverity.Warning,
Locations = new[] { new DiagnosticResultLocation("Test0.cs", NetFieldAnalyzerTests.SampleCodeLine, NetFieldAnalyzerTests.SampleCodeColumn + column) }
};
@@ -138,7 +138,7 @@ namespace SMAPI.ModBuildConfig.Analyzer.Tests
DiagnosticResult expected = new DiagnosticResult
{
Id = "AvoidNetField",
- Message = $"'{expression}' is a {netType} field; consider using the {suggestedProperty} property instead. See https://smapi.io/buildmsg/avoid-net-field for details.",
+ Message = $"'{expression}' is a {netType} field; consider using the {suggestedProperty} property instead. See https://smapi.io/package/avoid-net-field for details.",
Severity = DiagnosticSeverity.Warning,
Locations = new[] { new DiagnosticResultLocation("Test0.cs", NetFieldAnalyzerTests.SampleCodeLine, NetFieldAnalyzerTests.SampleCodeColumn + column) }
};
diff --git a/src/SMAPI.ModBuildConfig.Analyzer.Tests/ObsoleteFieldAnalyzerTests.cs b/src/SMAPI.ModBuildConfig.Analyzer.Tests/ObsoleteFieldAnalyzerTests.cs
index fa9235a3..12641e1a 100644
--- a/src/SMAPI.ModBuildConfig.Analyzer.Tests/ObsoleteFieldAnalyzerTests.cs
+++ b/src/SMAPI.ModBuildConfig.Analyzer.Tests/ObsoleteFieldAnalyzerTests.cs
@@ -67,7 +67,7 @@ namespace SMAPI.ModBuildConfig.Analyzer.Tests
DiagnosticResult expected = new DiagnosticResult
{
Id = "AvoidObsoleteField",
- Message = $"The '{oldName}' field is obsolete and should be replaced with '{newName}'. See https://smapi.io/buildmsg/avoid-obsolete-field for details.",
+ Message = $"The '{oldName}' field is obsolete and should be replaced with '{newName}'. See https://smapi.io/package/avoid-obsolete-field for details.",
Severity = DiagnosticSeverity.Warning,
Locations = new[] { new DiagnosticResultLocation("Test0.cs", ObsoleteFieldAnalyzerTests.SampleCodeLine, ObsoleteFieldAnalyzerTests.SampleCodeColumn + column) }
};
diff --git a/src/SMAPI.ModBuildConfig.Analyzer/NetFieldAnalyzer.cs b/src/SMAPI.ModBuildConfig.Analyzer/NetFieldAnalyzer.cs
index f2608348..70c01418 100644
--- a/src/SMAPI.ModBuildConfig.Analyzer/NetFieldAnalyzer.cs
+++ b/src/SMAPI.ModBuildConfig.Analyzer/NetFieldAnalyzer.cs
@@ -135,22 +135,22 @@ namespace StardewModdingAPI.ModBuildConfig.Analyzer
private readonly DiagnosticDescriptor AvoidImplicitNetFieldCastRule = new DiagnosticDescriptor(
id: "AvoidImplicitNetFieldCast",
title: "Netcode types shouldn't be implicitly converted",
- messageFormat: "This implicitly converts '{0}' from {1} to {2}, but {1} has unintuitive implicit conversion rules. Consider comparing against the actual value instead to avoid bugs. See https://smapi.io/buildmsg/avoid-implicit-net-field-cast for details.",
+ messageFormat: "This implicitly converts '{0}' from {1} to {2}, but {1} has unintuitive implicit conversion rules. Consider comparing against the actual value instead to avoid bugs. See https://smapi.io/package/avoid-implicit-net-field-cast for details.",
category: "SMAPI.CommonErrors",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true,
- helpLinkUri: "https://smapi.io/buildmsg/avoid-implicit-net-field-cast"
+ helpLinkUri: "https://smapi.io/package/avoid-implicit-net-field-cast"
);
/// The diagnostic info for an avoidable net field access.
private readonly DiagnosticDescriptor AvoidNetFieldRule = new DiagnosticDescriptor(
id: "AvoidNetField",
title: "Avoid Netcode types when possible",
- messageFormat: "'{0}' is a {1} field; consider using the {2} property instead. See https://smapi.io/buildmsg/avoid-net-field for details.",
+ messageFormat: "'{0}' is a {1} field; consider using the {2} property instead. See https://smapi.io/package/avoid-net-field for details.",
category: "SMAPI.CommonErrors",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true,
- helpLinkUri: "https://smapi.io/buildmsg/avoid-net-field"
+ helpLinkUri: "https://smapi.io/package/avoid-net-field"
);
diff --git a/src/SMAPI.ModBuildConfig.Analyzer/ObsoleteFieldAnalyzer.cs b/src/SMAPI.ModBuildConfig.Analyzer/ObsoleteFieldAnalyzer.cs
index f1a3ef75..6b935caa 100644
--- a/src/SMAPI.ModBuildConfig.Analyzer/ObsoleteFieldAnalyzer.cs
+++ b/src/SMAPI.ModBuildConfig.Analyzer/ObsoleteFieldAnalyzer.cs
@@ -27,11 +27,11 @@ namespace StardewModdingAPI.ModBuildConfig.Analyzer
["AvoidObsoleteField"] = new DiagnosticDescriptor(
id: "AvoidObsoleteField",
title: "Reference to obsolete field",
- messageFormat: "The '{0}' field is obsolete and should be replaced with '{1}'. See https://smapi.io/buildmsg/avoid-obsolete-field for details.",
+ messageFormat: "The '{0}' field is obsolete and should be replaced with '{1}'. See https://smapi.io/package/avoid-obsolete-field for details.",
category: "SMAPI.CommonErrors",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true,
- helpLinkUri: "https://smapi.io/buildmsg/avoid-obsolete-field"
+ helpLinkUri: "https://smapi.io/package/avoid-obsolete-field"
)
};
diff --git a/src/SMAPI.ModBuildConfig/SMAPI.ModBuildConfig.csproj b/src/SMAPI.ModBuildConfig/SMAPI.ModBuildConfig.csproj
index 70636937..e13526f9 100644
--- a/src/SMAPI.ModBuildConfig/SMAPI.ModBuildConfig.csproj
+++ b/src/SMAPI.ModBuildConfig/SMAPI.ModBuildConfig.csproj
@@ -16,9 +16,7 @@
-
- mod-build-config.md
-
+
diff --git a/src/SMAPI.ModBuildConfig/build/smapi.targets b/src/SMAPI.ModBuildConfig/build/smapi.targets
index 51432d96..5eeea91e 100644
--- a/src/SMAPI.ModBuildConfig/build/smapi.targets
+++ b/src/SMAPI.ModBuildConfig/build/smapi.targets
@@ -107,7 +107,7 @@
-
+
diff --git a/src/SMAPI.ModBuildConfig/package.nuspec b/src/SMAPI.ModBuildConfig/package.nuspec
index 6779798d..ffa47fdb 100644
--- a/src/SMAPI.ModBuildConfig/package.nuspec
+++ b/src/SMAPI.ModBuildConfig/package.nuspec
@@ -9,9 +9,9 @@
falseMIT
- https://github.com/Pathoschild/SMAPI/blob/develop/docs/mod-build-config.md#readme
+ https://smapi.io/package/readmehttps://raw.githubusercontent.com/Pathoschild/SMAPI/develop/src/SMAPI.ModBuildConfig/assets/nuget-icon.png
- Automates the build configuration for crossplatform Stardew Valley SMAPI mods. For SMAPI 2.11 or later.
+ Automates the build configuration for crossplatform Stardew Valley SMAPI mods. For SMAPI 3.0 or later.
3.0.0:
- Updated for SMAPI 3.0 and Stardew Valley 1.4.
diff --git a/src/SMAPI.Web/Startup.cs b/src/SMAPI.Web/Startup.cs
index a2e47482..b409a81d 100644
--- a/src/SMAPI.Web/Startup.cs
+++ b/src/SMAPI.Web/Startup.cs
@@ -162,7 +162,7 @@ namespace StardewModdingAPI.Web
// shortcut redirects
redirects.Add(new RedirectToUrlRule(@"^/3\.0\.?$", "https://stardewvalleywiki.com/Modding:Migrate_to_SMAPI_3.0"));
- redirects.Add(new RedirectToUrlRule(@"^/buildmsg(?:/?(.*))$", "https://github.com/Pathoschild/SMAPI/blob/develop/docs/mod-build-config.md#$1"));
+ redirects.Add(new RedirectToUrlRule(@"^/(?:buildmsg|package)(?:/?(.*))$", "https://github.com/Pathoschild/SMAPI/blob/develop/docs/technical/mod-package.md#$1")); // buildmsg deprecated, remove when SDV 1.4 is released
redirects.Add(new RedirectToUrlRule(@"^/compat\.?$", "https://mods.smapi.io"));
redirects.Add(new RedirectToUrlRule(@"^/docs\.?$", "https://stardewvalleywiki.com/Modding:Index"));
redirects.Add(new RedirectToUrlRule(@"^/install\.?$", "https://stardewvalleywiki.com/Modding:Player_Guide/Getting_Started#Install_SMAPI"));
diff --git a/src/SMAPI.sln b/src/SMAPI.sln
index 08a47a46..8ee91b11 100644
--- a/src/SMAPI.sln
+++ b/src/SMAPI.sln
@@ -35,11 +35,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{09CF91E5
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{EB35A917-67B9-4EFA-8DFC-4FB49B3949BB}"
ProjectSection(SolutionItems) = preProject
- ..\docs\mod-build-config.md = ..\docs\mod-build-config.md
..\docs\README.md = ..\docs\README.md
..\docs\release-notes.md = ..\docs\release-notes.md
- ..\docs\technical-docs.md = ..\docs\technical-docs.md
- ..\docs\web-services.md = ..\docs\web-services.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "technical", "technical", "{5947303D-3512-413A-9009-7AC43F5D3513}"
+ ProjectSection(SolutionItems) = preProject
+ ..\docs\technical\mod-package.md = ..\docs\technical\mod-package.md
+ ..\docs\technical\smapi.md = ..\docs\technical\smapi.md
+ ..\docs\technical\web.md = ..\docs\technical\web.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Internal", "Internal", "{82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}"
@@ -135,6 +139,7 @@ Global
{F4453AB6-D7D6-447F-A973-956CC777968F} = {4B1CEB70-F756-4A57-AAE8-8CD78C475F25}
{09CF91E5-5BAB-4650-A200-E5EA9A633046} = {86C452BE-D2D8-45B4-B63F-E329EB06CEDA}
{EB35A917-67B9-4EFA-8DFC-4FB49B3949BB} = {86C452BE-D2D8-45B4-B63F-E329EB06CEDA}
+ {5947303D-3512-413A-9009-7AC43F5D3513} = {EB35A917-67B9-4EFA-8DFC-4FB49B3949BB}
{85208F8D-6FD1-4531-BE05-7142490F59FE} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}
{680B2641-81EA-467C-86A5-0E81CDC57ED0} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}
{AA95884B-7097-476E-92C8-D0500DE9D6D1} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}