summaryrefslogtreecommitdiff
path: root/src/SMAPI
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI')
-rw-r--r--src/SMAPI/Constants.cs3
-rw-r--r--src/SMAPI/Framework/Models/SConfig.cs6
-rw-r--r--src/SMAPI/Framework/Models/SMetadata.cs15
-rw-r--r--src/SMAPI/Program.cs23
-rw-r--r--src/SMAPI/StardewModdingAPI.config.json1837
-rw-r--r--src/SMAPI/StardewModdingAPI.csproj4
-rw-r--r--src/SMAPI/StardewModdingAPI.metadata.json1836
7 files changed, 1871 insertions, 1853 deletions
diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index e547dfa6..a098194b 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -72,6 +72,9 @@ namespace StardewModdingAPI
/// <summary>The file path for the SMAPI configuration file.</summary>
internal static string ApiConfigPath => Path.Combine(Constants.ExecutionPath, $"{typeof(Program).Assembly.GetName().Name}.config.json");
+ /// <summary>The file path for the SMAPI metadata file.</summary>
+ internal static string ApiMetadataPath => Path.Combine(Constants.ExecutionPath, $"{typeof(Program).Assembly.GetName().Name}.metadata.json");
+
/// <summary>The file path to the log where the latest output should be saved.</summary>
internal static string DefaultLogPath => Path.Combine(Constants.LogDir, "SMAPI-latest.txt");
diff --git a/src/SMAPI/Framework/Models/SConfig.cs b/src/SMAPI/Framework/Models/SConfig.cs
index 17169714..2d6da0fa 100644
--- a/src/SMAPI/Framework/Models/SConfig.cs
+++ b/src/SMAPI/Framework/Models/SConfig.cs
@@ -1,6 +1,3 @@
-using System.Collections.Generic;
-using StardewModdingAPI.Framework.ModData;
-
namespace StardewModdingAPI.Framework.Models
{
/// <summary>The SMAPI configuration settings.</summary>
@@ -23,8 +20,5 @@ namespace StardewModdingAPI.Framework.Models
/// <summary>Whether SMAPI should log more information about the game context.</summary>
public bool VerboseLogging { get; set; }
-
- /// <summary>Extra metadata about mods.</summary>
- public IDictionary<string, ModDataRecord> ModData { get; set; }
}
}
diff --git a/src/SMAPI/Framework/Models/SMetadata.cs b/src/SMAPI/Framework/Models/SMetadata.cs
new file mode 100644
index 00000000..9ff495e9
--- /dev/null
+++ b/src/SMAPI/Framework/Models/SMetadata.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using StardewModdingAPI.Framework.ModData;
+
+namespace StardewModdingAPI.Framework.Models
+{
+ /// <summary>The SMAPI predefined metadata.</summary>
+ internal class SMetadata
+ {
+ /********
+ ** Accessors
+ ********/
+ /// <summary>Extra metadata about mods.</summary>
+ public IDictionary<string, ModDataRecord> ModData { get; set; }
+ }
+}
diff --git a/src/SMAPI/Program.cs b/src/SMAPI/Program.cs
index ff4e9a50..da2c0e8e 100644
--- a/src/SMAPI/Program.cs
+++ b/src/SMAPI/Program.cs
@@ -54,16 +54,15 @@ namespace StardewModdingAPI
/// <summary>Simplifies access to private game code.</summary>
private readonly Reflector Reflection = new Reflector();
+ /// <summary>The SMAPI configuration settings.</summary>
+ private readonly SConfig Settings;
+
/// <summary>The underlying game instance.</summary>
private SGame GameInstance;
/// <summary>The underlying content manager.</summary>
private ContentCore ContentCore => this.GameInstance.ContentCore;
- /// <summary>The SMAPI configuration settings.</summary>
- /// <remarks>This is initialised after the game starts.</remarks>
- private SConfig Settings;
-
/// <summary>Tracks the installed mods.</summary>
/// <remarks>This is initialised after the game starts.</remarks>
private readonly ModRegistry ModRegistry = new ModRegistry();
@@ -133,8 +132,14 @@ namespace StardewModdingAPI
public Program(bool writeToConsole, string logPath)
{
// init basics
+ this.Settings = JsonConvert.DeserializeObject<SConfig>(File.ReadAllText(Constants.ApiConfigPath));
this.LogFile = new LogFileManager(logPath);
- this.Monitor = new Monitor("SMAPI", this.ConsoleManager, this.LogFile, this.CancellationTokenSource) { WriteToConsole = writeToConsole };
+ this.Monitor = new Monitor("SMAPI", this.ConsoleManager, this.LogFile, this.CancellationTokenSource)
+ {
+ WriteToConsole = writeToConsole,
+ ShowTraceInConsole = this.Settings.DeveloperMode,
+ ShowFullStampInConsole = this.Settings.DeveloperMode
+ };
this.EventManager = new EventManager(this.Monitor, this.ModRegistry);
// hook up events
@@ -345,7 +350,6 @@ namespace StardewModdingAPI
private void InitialiseAfterGameStart()
{
// load settings
- this.Settings = JsonConvert.DeserializeObject<SConfig>(File.ReadAllText(Constants.ApiConfigPath));
this.GameInstance.VerboseLogging = this.Settings.VerboseLogging;
// load core components
@@ -361,11 +365,7 @@ namespace StardewModdingAPI
// add headers
if (this.Settings.DeveloperMode)
- {
- this.Monitor.ShowTraceInConsole = true;
- this.Monitor.ShowFullStampInConsole = true;
this.Monitor.Log($"You configured SMAPI to run in developer mode. The console may be much more verbose. You can disable developer mode by installing the non-developer version of SMAPI, or by editing {Constants.ApiConfigPath}.", LogLevel.Info);
- }
if (!this.Settings.CheckForUpdates)
this.Monitor.Log($"You configured SMAPI to not check for updates. Running an old version of SMAPI is not recommended. You can enable update checks by reinstalling SMAPI or editing {Constants.ApiConfigPath}.", LogLevel.Warn);
if (!this.Monitor.WriteToConsole)
@@ -377,7 +377,8 @@ namespace StardewModdingAPI
this.Monitor.Log("SMAPI found problems in your game's content files which are likely to cause errors or crashes. Consider uninstalling XNB mods or reinstalling the game.", LogLevel.Error);
// load mod data
- ModDatabase modDatabase = new ModDatabase(this.Settings.ModData, Constants.GetUpdateUrl);
+ SMetadata metadata = JsonConvert.DeserializeObject<SMetadata>(File.ReadAllText(Constants.ApiMetadataPath));
+ ModDatabase modDatabase = new ModDatabase(metadata.ModData, Constants.GetUpdateUrl);
// load mods
{
diff --git a/src/SMAPI/StardewModdingAPI.config.json b/src/SMAPI/StardewModdingAPI.config.json
index f7082e96..9743894a 100644
--- a/src/SMAPI/StardewModdingAPI.config.json
+++ b/src/SMAPI/StardewModdingAPI.config.json
@@ -36,1840 +36,5 @@ This file contains advanced configuration for SMAPI. You generally shouldn't cha
/**
* Whether SMAPI should log more information about the game context.
*/
- "VerboseLogging": false,
-
- /**
- * 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.
- * Format rules:
- * 1. If the mod's ID changed over time, multiple variants can be separated by the '|'
- * character.
- * 2. Each variant can take one of two forms:
- * - A simple string matching the mod's UniqueID value.
- * - A JSON structure containing any of four manifest fields (ID, Name, Author, and
- * EntryDll) to match.
- *
- * - 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).
- *
- * - 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": {
- "AccessChestAnywhere": {
- "ID": "AccessChestAnywhere",
- "MapLocalVersions": { "1.1-1078": "1.1" },
- "Default | UpdateKey": "Nexus:257",
- "~1.1 | Status": "AssumeBroken"
- },
-
- "AdjustArtisanPrices": {
- "ID": "ThatNorthernMonkey.AdjustArtisanPrices",
- "FormerIDs": "1e36d4ca-c7ef-4dfb-9927-d27a6c3c8bdc", // changed in 0.0.2-pathoschild-update
- "MapRemoteVersions": { "0.01": "0.0.1" },
- "Default | UpdateKey": "Chucklefish:3532",
- "~0.0.1 | Status": "AssumeBroken"
- },
-
- "Adjust Monster": {
- "ID": "mmanlapat.AdjustMonster",
- "Default | UpdateKey": "Nexus:1161"
- },
-
- "Advanced Location Loader": {
- "ID": "Entoarox.AdvancedLocationLoader",
- "~1.3.7 | UpdateKey": "Chucklefish:3619", // only enable update checks up to 1.3.7 by request (has its own update-check feature)
- "~1.2.10 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Adventure Shop Inventory": {
- "ID": "HammurabiAdventureShopInventory",
- "Default | UpdateKey": "Chucklefish:4608"
- },
-
- "AgingMod": {
- "ID": "skn.AgingMod",
- "Default | UpdateKey": "Nexus:1129",
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "All Crops All Seasons": {
- "ID": "cantorsdust.AllCropsAllSeasons",
- "FormerIDs": "29ee8246-d67b-4242-a340-35a9ae0d5dd7 | community.AllCropsAllSeasons", // changed in 1.3 and 1.5
- "Default | UpdateKey": "Nexus:170"
- },
-
- "All Professions": {
- "ID": "cantorsdust.AllProfessions",
- "FormerIDs": "8c37b1a7-4bfb-4916-9d8a-9533e6363ea3 | community.AllProfessions", // changed in 1.2 and 1.3.1
- "Default | UpdateKey": "Nexus:174"
- },
-
- "Almighty Tool": {
- "ID": "439",
- "FormerIDs": "{EntryDll: 'AlmightyTool.dll'}", // changed in 1.2.1
- "MapRemoteVersions": { "1.21": "1.2.1" },
- "Default | UpdateKey": "Nexus:439",
- "~1.1.1 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Animal Husbandry": {
- "ID": "DIGUS.ANIMALHUSBANDRYMOD",
- "FormerIDs": "DIGUS.BUTCHER", // changed in 2.0.1
- "Default | UpdateKey": "Nexus:1538"
- },
-
- "Animal Mood Fix": {
- "ID": "GPeters-AnimalMoodFix",
- "~ | Status": "Obsolete",
- "~ | StatusReasonPhrase": "the animal mood bugs were fixed in Stardew Valley 1.2."
- },
-
- "Animal Sitter": {
- "ID": "jwdred.AnimalSitter",
- "FormerIDs": "{EntryDll: 'AnimalSitter.dll'}", // changed in 1.0.9
- "Default | UpdateKey": "Nexus:581",
- "~1.0.8 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Ashley Mod": {
- "FormerIDs": "{EntryDll: 'AshleyMod.dll'}",
- "~1.0.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "A Tapper's Dream": {
- "ID": "ddde5195-8f85-4061-90cc-0d4fd5459358",
- "Default | UpdateKey": "Nexus:260",
- "~1.4 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Auto Animal Doors": {
- "ID": "AaronTaggart.AutoAnimalDoors",
- "Default | UpdateKey": "Nexus:1019"
- },
-
- "Auto-Eat": {
- "ID": "Permamiss.AutoEat",
- "FormerIDs": "BALANCEMOD_AutoEat", // changed in 1.1.1
- "Default | UpdateKey": "Nexus:643"
- },
-
- "AutoFish": {
- "ID": "WhiteMind.AF",
- "Default | UpdateKey": "Nexus:1895"
- },
-
- "AutoGate": {
- "ID": "AutoGate",
- "Default | UpdateKey": "Nexus:820"
- },
-
- "Automate": {
- "ID": "Pathoschild.Automate",
- "Default | UpdateKey": "Nexus:1063"
- },
-
- "Automated Doors": {
- "ID": "azah.automated-doors",
- "FormerIDs": "1abcfa07-2cf4-4dc3-a6e9-6068b642112b", // changed in 1.4.1
- "Default | UpdateKey": "GitHub:azah/AutomatedDoors" // added in 1.4.2
- },
-
- "AutoSpeed": {
- "ID": "Omegasis.AutoSpeed",
- "FormerIDs": "{ID:'4be88c18-b6f3-49b0-ba96-f94b1a5be890', Name:'AutoSpeed'}", // changed in 1.4; disambiguate from other Alpha_Omegasis mods
- "Default | UpdateKey": "Nexus:443" // added in 1.4.1
- },
-
- "Basic Sprinklers Improved": {
- "ID": "lrsk_sdvm_bsi.0117171308",
- "MapRemoteVersions": { "1.0.2": "1.0.1-release" }, // manifest not updated
- "Default | UpdateKey": "Nexus:833"
- },
-
- "Better Hay": {
- "ID": "cat.betterhay",
- "Default | UpdateKey": "Nexus:1430"
- },
-
- "Better Quality More Seasons": {
- "ID": "SB_BQMS",
- "Default | UpdateKey": "Nexus:935"
- },
-
- "Better Quarry": {
- "ID": "BetterQuarry",
- "Default | UpdateKey": "Nexus:771"
- },
-
- "Better Ranching": {
- "ID": "BetterRanching",
- "Default | UpdateKey": "Nexus:859"
- },
-
- "Better Shipping Box": {
- "ID": "Kithio:BetterShippingBox",
- "MapLocalVersions": { "1.0.1": "1.0.2" },
- "Default | UpdateKey": "Chucklefish:4302",
- "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Better Sprinklers": {
- "ID": "Speeder.BetterSprinklers",
- "FormerIDs": "SPDSprinklersMod", // changed in 2.3
- "Default | UpdateKey": "Nexus:41",
- "~2.3.1-pathoschild-update | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Billboard Anywhere": {
- "ID": "Omegasis.BillboardAnywhere",
- "FormerIDs": "{ID:'7ad4f6f7-c3de-4729-a40f-7a11d2b2a358', Name:'Billboard Anywhere'}", // changed in 1.4; disambiguate from other mods by Alpha_Omegasis
- "Default | UpdateKey": "Nexus:492" // added in 1.4.1
- },
-
- "Birthday Mail": {
- "ID": "KathrynHazuka.BirthdayMail",
- "FormerIDs": "005e02dc-d900-425c-9c68-1ff55c5a295d", // changed in 1.2.3-pathoschild-update
- "Default | UpdateKey": "Nexus:276",
- "~1.2.2 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Breed Like Rabbits": {
- "ID": "dycedarger.breedlikerabbits",
- "Default | UpdateKey": "Nexus:948"
- },
-
- "Build Endurance": {
- "ID": "Omegasis.BuildEndurance",
- "FormerIDs": "{ID:'4be88c18-b6f3-49b0-ba96-f94b1a5be890', Name:'BuildEndurance'}", // changed in 1.4; disambiguate from other Alpha_Omegasis mods
- "Default | UpdateKey": "Nexus:445", // added in 1.4.1
- "~1.3 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Build Health": {
- "ID": "Omegasis.BuildHealth",
- "FormerIDs": "{ID:'4be88c18-b6f3-49b0-ba96-f94b1a5be890', Name:'BuildHealth'}", // changed in 1.4; disambiguate from other Alpha_Omegasis mods
- "Default | UpdateKey": "Nexus:446", // added in 1.4.1
- "~1.3 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Buy Cooking Recipes": {
- "ID": "Denifia.BuyRecipes",
- "Default | UpdateKey": "Nexus:1126", // added in 1.0.1 (2017-10-04)
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Buy Back Collectables": {
- "ID": "Omegasis.BuyBackCollectables",
- "FormerIDs": "BuyBackCollectables", // changed in 1.4
- "Default | UpdateKey": "Nexus:507", // added in 1.4.1
- "~1.3 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Carry Chest": {
- "ID": "spacechase0.CarryChest",
- "Default | UpdateKey": "Nexus:1333"
- },
-
- "Casks Anywhere": {
- "ID": "CasksAnywhere",
- "MapLocalVersions": { "1.1-alpha": "1.1" },
- "Default | UpdateKey": "Nexus:878"
- },
-
- "Categorize Chests": {
- "ID": "CategorizeChests",
- "Default | UpdateKey": "Nexus:1300"
- },
-
- "Chefs Closet": {
- "ID": "Duder.ChefsCloset",
- "MapLocalVersions": { "1.3-1": "1.3" },
- "Default | UpdateKey": "Nexus:1030"
- },
-
- "Chest Label System": {
- "ID": "Speeder.ChestLabel",
- "FormerIDs": "SPDChestLabel", // changed in 1.5.1-pathoschild-update
- "Default | UpdateKey": "Nexus:242",
- "~1.6 | Status": "AssumeBroken" // broke in SDV 1.1
- },
-
- "Chest Pooling": {
- "ID": "mralbobo.ChestPooling",
- "FormerIDs": "{EntryDll: 'ChestPooling.dll'}", // changed in 1.3
- "Default | UpdateKey": "GitHub:mralbobo/stardew-chest-pooling",
- "~1.2 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Chests Anywhere": {
- "ID": "Pathoschild.ChestsAnywhere",
- "FormerIDs": "ChestsAnywhere", // changed in 1.9
- "Default | UpdateKey": "Nexus:518",
- "~1.9-beta | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Choose Baby Gender": {
- "FormerIDs": "{EntryDll: 'ChooseBabyGender.dll'}",
- "Default | UpdateKey": "Nexus:590",
- "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "CJB Automation": {
- "ID": "CJBAutomation",
- "Default | UpdateKey": "Nexus:211",
- "~1.4 | Status": "AssumeBroken", // broke in SDV 1.2
- "~1.4 | AlternativeUrl": "http://www.nexusmods.com/stardewvalley/mods/1063"
- },
-
- "CJB Cheats Menu": {
- "ID": "CJBok.CheatsMenu",
- "FormerIDs": "CJBCheatsMenu", // changed in 1.14
- "Default | UpdateKey": "Nexus:4",
- "~1.12 | Status": "AssumeBroken" // broke in SDV 1.1
- },
-
- "CJB Item Spawner": {
- "ID": "CJBok.ItemSpawner",
- "FormerIDs": "CJBItemSpawner", // changed in 1.7
- "Default | UpdateKey": "Nexus:93",
- "~1.5 | Status": "AssumeBroken" // broke in SDV 1.1
- },
-
- "CJB Show Item Sell Price": {
- "ID": "CJBok.ShowItemSellPrice",
- "FormerIDs": "CJBShowItemSellPrice", // changed in 1.7
- "Default | UpdateKey": "Nexus:5",
- "~1.6 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Clean Farm": {
- "ID": "tstaples.CleanFarm",
- "Default | UpdateKey": "Nexus:794"
- },
-
- "Climates of Ferngill": {
- "ID": "KoihimeNakamura.ClimatesOfFerngill",
- "Default | UpdateKey": "Nexus:604",
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Coal Regen": {
- "ID": "Blucifer.CoalRegen",
- "Default | UpdateKey": "Nexus:1664"
- },
-
- "Cold Weather Haley": {
- "ID": "LordXamon.ColdWeatherHaleyPRO",
- "Default | UpdateKey": "Nexus:1169",
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Colored Chests": {
- "ID": "4befde5c-731c-4853-8e4b-c5cdf946805f",
- "~ | Status": "Obsolete",
- "~ | StatusReasonPhrase": "colored chests were added in Stardew Valley 1.1."
- },
-
- "Combat with Farm Implements": {
- "ID": "SPDFarmingImplementsInCombat",
- "Default | UpdateKey": "Nexus:313",
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Community Bundle Item Tooltip": {
- "ID": "musbah.bundleTooltip",
- "Default | UpdateKey": "Nexus:1329"
- },
-
- "Concentration on Farming": {
- "ID": "punyo.ConcentrationOnFarming",
- "Default | UpdateKey": "Nexus:1445"
- },
-
- "Configurable Machines": {
- "ID": "21da6619-dc03-4660-9794-8e5b498f5b97",
- "MapLocalVersions": { "1.2-beta": "1.2" },
- "Default | UpdateKey": "Nexus:280"
- },
-
- "Configurable Shipping Dates": {
- "ID": "ConfigurableShippingDates",
- "Default | UpdateKey": "Nexus:675",
- "~1.1.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Cooking Skill": {
- "ID": "spacechase0.CookingSkill",
- "FormerIDs": "CookingSkill", // changed in 1.0.4–6
- "Default | UpdateKey": "Nexus:522",
- "~1.0.6 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "CrabNet": {
- "ID": "jwdred.CrabNet",
- "FormerIDs": "{EntryDll: 'CrabNet.dll'}", // changed in 1.0.5
- "Default | UpdateKey": "Nexus:584",
- "~1.0.4 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Crafting Counter": {
- "ID": "lolpcgaming.CraftingCounter",
- "Default | UpdateKey": "Nexus:1585"
- },
-
- "Current Location": {
- "ID": "CurrentLocation102120161203",
- "Default | UpdateKey": "Nexus:638"
- },
-
- "Custom Asset Modifier": {
- "ID": "Omegasis.CustomAssetModifier",
- "Default | UpdateKey": "1836"
- },
-
- "Custom Critters": {
- "ID": "spacechase0.CustomCritters",
- "Default | UpdateKey": "Nexus:1255"
- },
-
- "Custom Crops": {
- "ID": "spacechase0.CustomCrops",
- "Default | UpdateKey": "Nexus:1592"
- },
-
- "Custom Element Handler": {
- "ID": "Platonymous.CustomElementHandler",
- "Default | UpdateKey": "Nexus:1068" // added in 1.3.1
- },
-
- "Custom Farming Redux": {
- "ID": "Platonymous.CustomFarming",
- "Default | UpdateKey": "Nexus:991" // added in 0.6.1
- },
-
- "Custom Farming Automate Bridge": {
- "ID": "Platonymous.CFAutomate",
- "~1.0.1 | Status": "AssumeBroken", // no longer compatible with Automate
- "~1.0.1 | AlternativeUrl": "https://www.nexusmods.com/stardewvalley/mods/991"
- },
-
- "Custom Farm Types": {
- "ID": "spacechase0.CustomFarmTypes",
- "Default | UpdateKey": "Nexus:1140"
- },
-
- "Custom Furniture": {
- "ID": "Platonymous.CustomFurniture",
- "Default | UpdateKey": "Nexus:1254" // added in 0.4.1
- },
-
- "Customize Exterior": {
- "ID": "spacechase0.CustomizeExterior",
- "FormerIDs": "CustomizeExterior", // changed in 1.0.3
- "Default | UpdateKey": "Nexus:1099",
- "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Customizable Cart Redux": {
- "ID": "KoihimeNakamura.CCR",
- "MapLocalVersions": { "1.1-20170917": "1.1" },
- "Default | UpdateKey": "Nexus:1402"
- },
-
- "Customizable Traveling Cart Days": {
- "ID": "TravelingCartYyeahdude",
- "Default | UpdateKey": "Nexus:567",
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Custom Linens": {
- "ID": "Mevima.CustomLinens",
- "MapRemoteVersions": { "1.1": "1.0" }, // manifest not updated
- "Default | UpdateKey": "Nexus:1027"
- },
-
- "Custom NPC": {
- "ID": "Platonymous.CustomNPC",
- "Default | UpdateKey": "Nexus:1607"
- },
-
- "Custom Shops Redux": {
- "ID": "Omegasis.CustomShopReduxGui",
- "Default | UpdateKey": "Nexus:1378" // added in 1.4.1
- },
-
- "Custom TV": {
- "ID": "Platonymous.CustomTV",
- "Default | UpdateKey": "Nexus:1139" // added in 1.0.6
- },
-
- "Daily Luck Message": {
- "ID": "Schematix.DailyLuckMessage",
- "Default | UpdateKey": "Nexus:1327"
- },
-
- "Daily News": {
- "ID": "bashNinja.DailyNews",
- "Default | UpdateKey": "Nexus:1141",
- "~1.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Daily Quest Anywhere": {
- "ID": "Omegasis.DailyQuestAnywhere",
- "FormerIDs": "DailyQuest", // changed in 1.4
- "Default | UpdateKey": "Nexus:513" // added in 1.4.1
- },
-
- "Debug Mode": {
- "ID": "Pathoschild.DebugMode",
- "FormerIDs": "Pathoschild.Stardew.DebugMode", // changed in 1.4
- "Default | UpdateKey": "Nexus:679"
- },
-
- "Did You Water Your Crops?": {
- "ID": "Nishtra.DidYouWaterYourCrops",
- "Default | UpdateKey": "Nexus:1583"
- },
-
- "Dynamic Checklist": {
- "ID": "gunnargolf.DynamicChecklist",
- "Default | UpdateKey": "Nexus:1145", // added in 1.0.1-pathoschild-update
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Dynamic Horses": {
- "ID": "Bpendragon-DynamicHorses",
- "MapRemoteVersions": { "1.2": "1.1-release" }, // manifest not updated
- "Default | UpdateKey": "Nexus:874"
- },
-
- "Dynamic Machines": {
- "ID": "DynamicMachines",
- "MapLocalVersions": { "1.1": "1.1.1" },
- "Default | UpdateKey": "Nexus:374",
- "~1.1.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Dynamic NPC Sprites": {
- "ID": "BashNinja.DynamicNPCSprites",
- "Default | UpdateKey": "Nexus:1183"
- },
-
- "Easier Farming": {
- "ID": "cautiouswafffle.EasierFarming",
- "Default | UpdateKey": "Nexus:1426"
- },
-
- "Empty Hands": {
- "ID": "QuicksilverFox.EmptyHands",
- "Default | UpdateKey": "Nexus:1176", // added in 1.0.1-pathoschild-update
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Enemy Health Bars": {
- "ID": "Speeder.HealthBars",
- "FormerIDs": "SPDHealthBar", // changed in 1.7.1-pathoschild-update
- "Default | UpdateKey": "Nexus:193",
- "~1.7 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Entoarox Framework": {
- "ID": "Entoarox.EntoaroxFramework",
- "FormerIDs": "eacdb74b-4080-4452-b16b-93773cda5cf9", // changed in ???
- "~2.0.6 | UpdateKey": "Chucklefish:4228", // only enable update checks up to 2.0.6 by request (has its own update-check feature)
- "~2.0.6 | Status": "AssumeBroken" // broke in SMAPI 2.5 (error reflecting into SMAPI internals)
- },
-
- "Expanded Fridge": {
- "ID": "Uwazouri.ExpandedFridge",
- "Default | UpdateKey": "Nexus:1191"
- },
-
- "Experience Bars": {
- "ID": "spacechase0.ExperienceBars",
- "FormerIDs": "ExperienceBars", // changed in 1.0.2
- "Default | UpdateKey": "Nexus:509"
- },
-
- "Extended Bus System": {
- "ID": "ExtendedBusSystem",
- "Default | UpdateKey": "Chucklefish:4373"
- },
-
- "Extended Fridge": {
- "ID": "Crystalmir.ExtendedFridge",
- "FormerIDs": "Mystra007ExtendedFridge", // changed in 1.0.1
- "Default | UpdateKey": "Nexus:485",
- "~1.0 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Extended Greenhouse": {
- "ID": "ExtendedGreenhouse",
- "Default | UpdateKey": "Chucklefish:4303",
- "~1.0.2 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Extended Minecart": {
- "ID": "Entoarox.ExtendedMinecart",
- "FormerIDs": "{ID:'EntoaroxFurnitureAnywhere', Name:'Extended Minecart'}", // changed in 1.6.1
- "~1.7.1 | UpdateKey": "Chucklefish:4359" // only enable update checks up to 1.7.1 by request (has its own update-check feature)
- },
-
- "Extended Reach": {
- "ID": "spacechase0.ExtendedReach",
- "Default | UpdateKey": "Nexus:1493"
- },
-
- "Fall 28 Snow Day": {
- "ID": "Omegasis.Fall28SnowDay",
- "FormerIDs": "{ID:'7ad4f6f7-c3de-4729-a40f-7a11d2b2a358', Name:'Fall28 Snow Day'}", // changed in 1.4; disambiguate from other mods by Alpha_Omegasis
- "Default | UpdateKey": "Nexus:486", // added in 1.4.1
- "~1.3 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Farm Automation: Barn Door Automation": {
- "FormerIDs": "{EntryDll: 'FarmAutomation.BarnDoorAutomation.dll'}",
- "~1.0 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Farm Automation: Item Collector": {
- "FormerIDs": "{EntryDll: 'FarmAutomation.ItemCollector.dll'}",
- "~1.0 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Farm Automation Unofficial: Item Collector": {
- "ID": "Maddy99.FarmAutomation.ItemCollector",
- "~0.5 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Farm Expansion": {
- "ID": "Advize.FarmExpansion",
- "FormerIDs": "3888bdfd-73f6-4776-8bb7-8ad45aea1915 | AdvizeFarmExpansionMod-2-0 | AdvizeFarmExpansionMod-2-0-5", // changed in 2.0, 2.0.5, and 3.0
- "Default | UpdateKey": "Nexus:130",
- "~2.0.5 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Farm Resource Generator": {
- "FormerIDs": "{EntryDll: 'FarmResourceGenerator.dll'}",
- "Default | UpdateKey": "Nexus:647",
- "~1.0.4 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Fast Animations": {
- "ID": "Pathoschild.FastAnimations",
- "Default | UpdateKey": "Nexus:1089"
- },
-
- "Faster Grass": {
- "ID": "IceGladiador.FasterGrass",
- "Default | UpdateKey": "Nexus:1772"
- },
-
- "Faster Paths": {
- "ID": "Entoarox.FasterPaths",
- "FormerIDs": "{ID:'821ce8f6-e629-41ad-9fde-03b54f68b0b6', Name:'Faster Paths'} | 615f85f8-5c89-44ee-aecc-c328f172e413", // changed in 1.2 and 1.3; disambiguate from Shop Expander
- "~1.3.3 | UpdateKey": "Chucklefish:3641" // only enable update checks up to 1.3.3 by request (has its own update-check feature)
- },
-
- "Faster Run": {
- "ID": "KathrynHazuka.FasterRun",
- "FormerIDs": "{EntryDll: 'FasterRun.dll'}", // changed in 1.1.1-pathoschild-update
- "Default | UpdateKey": "Nexus:733", // added in 1.1.1-pathoschild-update
- "~1.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Fishing Adjust": {
- "ID": "shuaiz.FishingAdjustMod",
- "Default | UpdateKey": "Nexus:1350"
- },
-
- "Fishing Tuner Redux": {
- "ID": "HammurabiFishingTunerRedux",
- "Default | UpdateKey": "Chucklefish:4578"
- },
-
- "Fixed Secret Woods Debris": {
- "ID": "f4iTh.WoodsDebrisFix",
- "Default | UpdateKey": "Nexus:1941"
- },
-
- "FlorenceMod": {
- "FormerIDs": "{EntryDll: 'FlorenceMod.dll'}",
- "MapLocalVersions": { "1.0.1": "1.1" },
- "Default | UpdateKey": "Nexus:591",
- "~1.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Flower Color Picker": {
- "ID": "spacechase0.FlowerColorPicker",
- "Default | UpdateKey": "Nexus:1229"
- },
-
- "Forage at the Farm": {
- "ID": "Nishtra.ForageAtTheFarm",
- "FormerIDs": "ForageAtTheFarm", // changed in <=1.6
- "Default | UpdateKey": "Nexus:673",
- "~1.5.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Furniture Anywhere": {
- "ID": "Entoarox.FurnitureAnywhere",
- "FormerIDs": "{ID:'EntoaroxFurnitureAnywhere', Name:'Furniture Anywhere'}", // changed in 1.1; disambiguate from Extended Minecart
- "~1.1.5 | UpdateKey": "Chucklefish:4324" // only enable update checks up to 1.1.5 by request (has its own update-check feature)
- },
-
- "Game Reminder": {
- "ID": "mmanlapat.GameReminder",
- "Default | UpdateKey": "Nexus:1153"
- },
-
- "Gate Opener": {
- "ID": "mralbobo.GateOpener",
- "FormerIDs": "{EntryDll: 'GateOpener.dll'}", // changed in 1.1
- "Default | UpdateKey": "GitHub:mralbobo/stardew-gate-opener",
- "~1.0.1 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "GenericShopExtender": {
- "ID": "GenericShopExtender",
- "Default | UpdateKey": "Nexus:814", // added in 0.1.3
- "~0.1.2 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Geode Info Menu": {
- "ID": "cat.geodeinfomenu",
- "Default | UpdateKey": "Nexus:1448"
- },
-
- "Get Dressed": {
- "ID": "Advize.GetDressed",
- "FormerIDs": "{EntryDll: 'GetDressed.dll'}", // changed in 3.3
- "Default | UpdateKey": "Nexus:331",
- "~3.3 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Giant Crop Ring": {
- "ID": "cat.giantcropring",
- "Default | UpdateKey": "Nexus:1182"
- },
-
- "Gift Taste Helper": {
- "ID": "tstaples.GiftTasteHelper",
- "FormerIDs": "8008db57-fa67-4730-978e-34b37ef191d6", // changed in 2.5
- "Default | UpdateKey": "Nexus:229",
- "~2.3.1 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Grandfather's Gift": {
- "ID": "ShadowDragon.GrandfathersGift",
- "Default | UpdateKey": "Nexus:985"
- },
-
- "Happy Animals": {
- "ID": "HappyAnimals",
- "~1.0.3 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Happy Birthday (Omegasis)": {
- "ID": "Omegasis.HappyBirthday",
- "FormerIDs": "{ID:'HappyBirthday', Author:'Alpha_Omegasis'}", // changed in 1.4; disambiguate from Oxyligen's fork
- "Default | UpdateKey": "Nexus:520", // added in 1.4.1
- "~1.3 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Happy Birthday (Oxyligen fork)": {
- "FormerIDs": "{ID:'HappyBirthday', Author:'Alpha_Omegasis/Oxyligen'}", // disambiguate from Oxyligen's fork
- "Default | UpdateKey": "Nexus:1064" // missing key reported: https://www.nexusmods.com/stardewvalley/mods/1064?tab=bugs
- },
-
- "Hardcore Mines": {
- "ID": "kibbe.hardcore_mines",
- "Default | UpdateKey": "Nexus:1674"
- },
-
- "Harp of Yoba Redux": {
- "ID": "Platonymous.HarpOfYobaRedux",
- "Default | UpdateKey": "Nexus:914" // added in 2.0.3
- },
-
- "Harvest Moon Witch Princess": {
- "ID": "Sasara.WitchPrincess",
- "Default | UpdateKey": "Nexus:1157"
- },
-
- "Harvest With Scythe": {
- "ID": "965169fd-e1ed-47d0-9f12-b104535fb4bc",
- "Default | UpdateKey": "Nexus:236",
- "~1.0.6 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Horse Whistle (icepuente)": {
- "ID": "icepuente.HorseWhistle",
- "Default | UpdateKey": "Nexus:1131"
- },
-
- "Hunger (Yyeadude)": {
- "ID": "HungerYyeadude",
- "Default | UpdateKey": "Nexus:613"
- },
-
- "Hunger for Food (Tigerle)": {
- "ID": "HungerForFoodByTigerle",
- "Default | UpdateKey": "Nexus:810",
- "~0.1.2 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Hunger Mod (skn)": {
- "ID": "skn.HungerMod",
- "MapRemoteVersions": { "1.2.1": "1.0" }, // manifest not updated
- "Default | UpdateKey": "Nexus:1127"
- },
-
- "Idle Pause": {
- "ID": "Veleek.IdlePause",
- "MapRemoteVersions": { "1.2": "1.1" }, // manifest not updated
- "Default | UpdateKey": "Nexus:1092"
- },
-
- "Improved Quality of Life": {
- "ID": "Demiacle.ImprovedQualityOfLife",
- "Default | UpdateKey": "Nexus:1025",
- "~1.1 | Status": "AssumeBroken" // broke in SMAPI 2.0
- },
-
- "Instant Geode": {
- "ID": "InstantGeode",
- "~1.12 | Status": "AssumeBroken" // broke in SDV 1.2
- },
-
- "Instant Grow Trees": {
- "ID": "cantorsdust.Instant