summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/wwwroot
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Web/wwwroot')
-rw-r--r--src/SMAPI.Web/wwwroot/Content/css/index.css59
-rw-r--r--src/SMAPI.Web/wwwroot/Content/css/log-parser.css121
-rw-r--r--src/SMAPI.Web/wwwroot/Content/css/main.css38
-rw-r--r--src/SMAPI.Web/wwwroot/Content/images/direct-download-icon.pngbin0 -> 250 bytes
-rw-r--r--src/SMAPI.Web/wwwroot/Content/images/nexus-icon.pngbin0 -> 927 bytes
-rw-r--r--src/SMAPI.Web/wwwroot/Content/images/pufferchick-cool.pngbin0 -> 1099 bytes
-rw-r--r--src/SMAPI.Web/wwwroot/Content/images/pufferchick.pngbin0 -> 831 bytes
-rw-r--r--src/SMAPI.Web/wwwroot/Content/js/index.js34
-rw-r--r--src/SMAPI.Web/wwwroot/Content/js/log-parser.js136
-rw-r--r--src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json1676
10 files changed, 1885 insertions, 179 deletions
diff --git a/src/SMAPI.Web/wwwroot/Content/css/index.css b/src/SMAPI.Web/wwwroot/Content/css/index.css
index 06cd6fb4..514e1a5c 100644
--- a/src/SMAPI.Web/wwwroot/Content/css/index.css
+++ b/src/SMAPI.Web/wwwroot/Content/css/index.css
@@ -18,7 +18,8 @@ h1 {
text-align: center;
}
-#call-to-action a {
+#call-to-action a.main-cta,
+#call-to-action a.secondary-cta {
box-shadow: #caefab 0 1px 0 0 inset;
background: linear-gradient(#77d42a 5%, #5cb811 100%) #77d42a;
border-radius: 6px;
@@ -40,6 +41,58 @@ h1 {
text-shadow: #2b665e 0 1px 0;
}
+.cta-dropdown {
+ position: relative;
+ display: inline-block;
+ margin-bottom: 1em;
+}
+
+.cta-dropdown a.download {
+ margin-bottom: 0 !important;
+}
+
+.cta-dropdown .dropdown-content {
+ display: none;
+ position: absolute;
+ text-align: left;
+ box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
+ border: 1px solid #566963;
+ background: #5cb811;
+ border-top: 0;
+ border-radius: 0 0 6px 6px;
+ margin-top: -6px;
+ z-index: 1;
+}
+
+.cta-dropdown .dropdown-content a:hover {
+ background-color: #ddd;
+}
+
+.cta-dropdown .dropdown-content img {
+ width: 0.85em;
+ height: 0.85em;
+}
+
+.cta-dropdown.secondary-cta-dropdown .dropdown-content a:hover {
+ background-color: #566963;
+}
+
+.cta-dropdown.secondary-cta-dropdown .dropdown-content {
+ background-color: #768d87;
+ border-color: #566963;
+}
+
+.cta-dropdown.secondary-cta-dropdown .dropdown-content a {
+ color: #fff;
+ text-shadow: #2b665e 0 1px 0;
+}
+
+.cta-dropdown .dropdown-content a {
+ padding: 0.75em 1em;
+ text-decoration: none;
+ display: block;
+}
+
/*********
** Subsections
*********/
@@ -48,10 +101,6 @@ h1 {
padding-left: 1em;
}
-.github-description .noinclude {
- display: none;
-}
-
#support-links li small {
display: block;
width: 50em;
diff --git a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
index 789274e2..1fcd1bff 100644
--- a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
+++ b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
@@ -1,12 +1,8 @@
/*********
** Main layout
*********/
-input[type="button"] {
- font-size: 20px;
- border-radius: 5px;
- outline: none;
- box-shadow: inset 0 0 1px 1px rgba(0, 0, 0, .2);
- cursor: pointer;
+#content {
+ max-width: 100%;
}
caption {
@@ -20,15 +16,6 @@ caption {
font-family: monospace;
}
-input#upload-button {
- background: #ccf;
- border: 1px solid #000088;
-}
-
-input#upload-button {
- background: #eef;
-}
-
table caption {
font-weight: bold;
}
@@ -39,6 +26,7 @@ table caption {
.banner {
border: 2px solid gray;
border-radius: 5px;
+ margin-top: 1em;
padding: 1em;
}
@@ -91,6 +79,10 @@ table#metadata, table#mods {
cursor: pointer;
}
+#mods.filters-disabled tr {
+ cursor: default;
+}
+
#metadata tr,
#mods tr {
background: #eee
@@ -200,6 +192,12 @@ table#metadata, table#mods {
color: #f00;
}
+#log .critical {
+ background-color: #c00;
+ color: #fff;
+ font-weight: bold;
+}
+
#log {
border-spacing: 0;
}
@@ -256,88 +254,19 @@ table#metadata, table#mods {
/*********
-** Upload popup
+** Upload form
*********/
-#upload-area .popup,
-#upload-area #uploader {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, .33);
- z-index: 2;
- display: none;
- padding: 5px;
-}
-
-#upload-area #uploader:after {
- content: attr(data-text);
- display: block;
- width: 100px;
- height: 24px;
- line-height: 25px;
- border: 1px solid #000;
- background: #fff;
- position: absolute;
- top: 50%;
- left: 50%;
- margin: -12px -50px 0 0;
- font-size: 18px;
- font-weight: bold;
- text-align: center;
- border-radius: 5px;
-}
-
-#upload-area .popup h1 {
- position: absolute;
- top: 10%;
- left: 50%;
- margin-left: -150px;
- text-align: center;
- width: 300px;
- border: 1px solid #008;
- border-radius: 5px;
- background: #fff;
- font-family: sans-serif;
- font-size: 40px;
- margin-top: -25px;
- z-index: 10;
- border-bottom: 0;
+#os-list {
+ list-style: none;
}
-#upload-area .frame {
- margin: auto;
- margin-top: 25px;
- padding: 2em;
- position: absolute;
- top: 10%;
- left: 10%;
- right: 10%;
- bottom: 10%;
- padding-bottom: 30px;
- background: #FFF;
- border-radius: 5px;
- border: 1px solid #008;
-}
-
-#upload-area #cancel {
- border: 1px solid #880000;
- background-color: #fcc;
-}
-
-#upload-area #submit {
- border: 1px solid #008800;
- background-color: #cfc;
-}
-
-#upload-area #submit:hover {
- background-color: #efe;
+div[data-os] {
+ display: none;
}
-#upload-area #input {
+#input {
width: 100%;
- height: 30em;
+ height: 20em;
max-height: 70%;
margin: auto;
box-sizing: border-box;
@@ -346,3 +275,13 @@ table#metadata, table#mods {
outline: none;
box-shadow: inset 0px 0px 1px 1px rgba(0, 0, 192, .2);
}
+
+#submit {
+ font-size: 1.5em;
+ border-radius: 5px;
+ outline: none;
+ box-shadow: inset 0 0 1px 1px rgba(0, 0, 0, .2);
+ cursor: pointer;
+ border: 1px solid #008800;
+ background-color: #cfc;
+}
diff --git a/src/SMAPI.Web/wwwroot/Content/css/main.css b/src/SMAPI.Web/wwwroot/Content/css/main.css
index d1fa49e0..57eeee88 100644
--- a/src/SMAPI.Web/wwwroot/Content/css/main.css
+++ b/src/SMAPI.Web/wwwroot/Content/css/main.css
@@ -28,7 +28,8 @@ h2 {
h3 {
font-size: 1.2em;
border-bottom: 1px solid #AAA;
- width: 50%;
+ width: 55em;
+ max-width: 100%;
}
a {
@@ -44,6 +45,8 @@ a {
#content {
min-height: 140px;
+ width: calc(100% - 2em);
+ max-width: 60em;
padding: 0 1em 1em 1em;
border-left: 1px solid #CCC;
background: #FFF;
@@ -51,7 +54,7 @@ a {
}
#content p {
- max-width: 55em;
+ max-width: 100%;
}
.section {
@@ -105,3 +108,34 @@ a {
#footer a {
color: #669;
}
+
+/* mobile fixes */
+@media (min-width: 1020px) and (max-width: 1199px) {
+ #sidebar {
+ width: 7em;
+ background: none;
+ }
+
+ #content-column {
+ left: 7em;
+ }
+}
+
+@media (max-width: 1019px) {
+ h1 {
+ margin-top: 0;
+ }
+
+ #sidebar {
+ margin-top: 0;
+ width: auto;
+ min-height: 0;
+ background: none;
+ }
+
+ #content-column {
+ position: inherit;
+ top: inherit;
+ left: inherit;
+ }
+}
diff --git a/src/SMAPI.Web/wwwroot/Content/images/direct-download-icon.png b/src/SMAPI.Web/wwwroot/Content/images/direct-download-icon.png
new file mode 100644
index 00000000..6c30ca36
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/images/direct-download-icon.png
Binary files differ
diff --git a/src/SMAPI.Web/wwwroot/Content/images/nexus-icon.png b/src/SMAPI.Web/wwwroot/Content/images/nexus-icon.png
new file mode 100644
index 00000000..10c66712
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/images/nexus-icon.png
Binary files differ
diff --git a/src/SMAPI.Web/wwwroot/Content/images/pufferchick-cool.png b/src/SMAPI.Web/wwwroot/Content/images/pufferchick-cool.png
new file mode 100644
index 00000000..f359146c
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/images/pufferchick-cool.png
Binary files differ
diff --git a/src/SMAPI.Web/wwwroot/Content/images/pufferchick.png b/src/SMAPI.Web/wwwroot/Content/images/pufferchick.png
new file mode 100644
index 00000000..1de9cf47
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/images/pufferchick.png
Binary files differ
diff --git a/src/SMAPI.Web/wwwroot/Content/js/index.js b/src/SMAPI.Web/wwwroot/Content/js/index.js
new file mode 100644
index 00000000..d0734b02
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/Content/js/index.js
@@ -0,0 +1,34 @@
+$(document).ready(function () {
+ /* enable pufferchick */
+ var pufferchick = $("#pufferchick");
+ $(".cta-dropdown").hover(
+ function () {
+ pufferchick.attr("src", "Content/images/pufferchick-cool.png");
+ },
+ function () {
+ pufferchick.attr("src", "Content/images/pufferchick.png");
+ }
+ );
+
+ /* enable download dropdowns */
+ $(".cta-dropdown a.download").each(function(i, button) {
+ button = $(button);
+ var wrapper = button.parent(".cta-dropdown");
+ var button = wrapper.find(".download");
+ var dropdownContent = wrapper.find(".dropdown-content");
+
+ $(window).on("click", function(e) {
+ var target = $(e.target);
+
+ // toggle dropdown on button click
+ if (target.is(button) || $.contains(button.get(0), target.get(0))) {
+ e.preventDefault();
+ dropdownContent.toggle();
+ }
+
+ // else hide dropdown
+ else
+ dropdownContent.hide();
+ });
+ });
+});
diff --git a/src/SMAPI.Web/wwwroot/Content/js/log-parser.js b/src/SMAPI.Web/wwwroot/Content/js/log-parser.js
index c4a35e96..0c654205 100644
--- a/src/SMAPI.Web/wwwroot/Content/js/log-parser.js
+++ b/src/SMAPI.Web/wwwroot/Content/js/log-parser.js
@@ -39,11 +39,17 @@ smapi.logParser = function (data, sectionUrl) {
}
},
methods: {
- toggleLevel: function(id) {
+ toggleLevel: function (id) {
+ if (!data.enableFilters)
+ return;
+
this.showLevels[id] = !this.showLevels[id];
},
toggleMod: function (id) {
+ if (!data.enableFilters)
+ return;
+
var curShown = this.showMods[id];
// first filter: only show this by default
@@ -64,6 +70,9 @@ smapi.logParser = function (data, sectionUrl) {
},
showAllMods: function () {
+ if (!data.enableFilters)
+ return;
+
for (var key in this.showMods) {
if (this.showMods.hasOwnProperty(key)) {
this.showMods[key] = true;
@@ -73,6 +82,9 @@ smapi.logParser = function (data, sectionUrl) {
},
hideAllMods: function () {
+ if (!data.enableFilters)
+ return;
+
for (var key in this.showMods) {
if (this.showMods.hasOwnProperty(key)) {
this.showMods[key] = false;
@@ -90,88 +102,50 @@ smapi.logParser = function (data, sectionUrl) {
/**********
** Upload form
*********/
- var error = $("#error");
-
- $("#upload-button").on("click", function(e) {
- e.preventDefault();
-
- $("#input").val("");
- $("#popup-upload").fadeIn();
- });
-
- var closeUploadPopUp = function() {
- $("#popup-upload").fadeOut(400);
- };
-
- $("#popup-upload").on({
- 'dragover dragenter': function(e) {
- e.preventDefault();
- e.stopPropagation();
- },
- 'drop': function(e) {
- $("#uploader").attr("data-text", "Reading...");
- $("#uploader").show();
- var dataTransfer = e.originalEvent.dataTransfer;
- if (dataTransfer && dataTransfer.files.length) {
- e.preventDefault();
- e.stopPropagation();
- var file = dataTransfer.files[0];
- var reader = new FileReader();
- reader.onload = $.proxy(function(file, $input, event) {
- $input.val(event.target.result);
- $("#uploader").fadeOut();
- $("#submit").click();
- }, this, file, $("#input"));
- reader.readAsText(file);
- }
- },
- 'click': function(e) {
- if (e.target.id === "popup-upload")
- closeUploadPopUp();
+ var input = $("#input");
+ if (input.length) {
+ // get elements
+ var systemOptions = $("input[name='os']");
+ var systemInstructions = $("div[data-os]");
+ var submit = $("#submit");
+
+ // instruction OS chooser
+ var chooseSystem = function() {
+ systemInstructions.hide();
+ systemInstructions.filter("[data-os='" + $("input[name='os']:checked").val() + "']").show();
}
- });
-
- $("#submit").on("click", function() {
- $("#popup-upload").fadeOut();
- var paste = $("#input").val();
- if (paste) {
- //memory = "";
- $("#uploader").attr("data-text", "Saving...");
- $("#uploader").fadeIn();
- $
- .ajax({
- type: "POST",
- url: sectionUrl + "/save",
- data: JSON.stringify(paste),
- contentType: "application/json" // sent to API
- })
- .fail(function(xhr, textStatus) {
- $("#uploader").fadeOut();
- error.html('<h1>Parsing failed!</h1>Parsing of the log failed, details follow.<br />&nbsp;<p>Stage: Upload</p>Error: ' + textStatus + ': ' + xhr.responseText + "<hr /><pre>" + $("#input").val() + "</pre>");
- })
- .then(function(data) {
- $("#uploader").fadeOut();
- if (!data.success)
- error.html('<h1>Parsing failed!</h1>Parsing of the log failed, details follow.<br />&nbsp;<p>Stage: Upload</p>Error: ' + data.error + "<hr /><pre>" + $("#input").val() + "</pre>");
- else
- location.href = (sectionUrl.replace(/\/$/, "") + "/" + data.id);
- });
- } else {
- alert("Unable to parse log, the input is empty!");
- $("#uploader").fadeOut();
+ systemOptions.on("click", chooseSystem);
+ chooseSystem();
+
+ // disable submit if it's empty
+ var toggleSubmit = function()
+ {
+ var hasText = !!input.val().trim();
+ submit.prop("disabled", !hasText);
}
- });
+ input.on("input", toggleSubmit);
+ toggleSubmit();
- $(document).on("keydown", function(e) {
- if (e.which === 27) {
- if ($("#popup-upload").css("display") !== "none" && $("#popup-upload").css("opacity") === 1) {
- closeUploadPopUp();
+ // drag & drop file
+ input.on({
+ 'dragover dragenter': function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ },
+ 'drop': function(e) {
+ var dataTransfer = e.originalEvent.dataTransfer;
+ if (dataTransfer && dataTransfer.files.length) {
+ e.preventDefault();
+ e.stopPropagation();
+ var file = dataTransfer.files[0];
+ var reader = new FileReader();
+ reader.onload = $.proxy(function(file, $input, event) {
+ $input.val(event.target.result);
+ toggleSubmit();
+ }, this, file, $("#input"));
+ reader.readAsText(file);
+ }
}
- }
- });
- $("#cancel").on("click", closeUploadPopUp);
-
- if (data.showPopup)
- $("#popup-upload").fadeIn();
-
+ });
+ }
};
diff --git a/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json b/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
new file mode 100644
index 00000000..e72efb39
--- /dev/null
+++ b/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
@@ -0,0 +1,1676 @@
+{
+ /**
+ * 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": {
+ "AccessChestAnywhere": {
+ "ID": "AccessChestAnywhere",
+ "MapLocalVersions": { "1.1-1078": "1.1" },
+ "Default | UpdateKey": "Nexus:257",
+ "~1.1 | Status": "AssumeBroken"
+ },
+
+ "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" },
+ "Default | UpdateKey": "Chucklefish:3532"
+ },
+
+ "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)
+ },
+
+ "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 Farming Tool": {
+ "ID": "439",
+ "MapRemoteVersions": {
+ "1.21": "1.2.1",
+ "1.22-unofficial.3.mizzion": "1.2.2-unofficial.3.mizzion"
+ },
+ "Default | UpdateKey": "Nexus:439"
+ },
+
+ "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",
+ "Default | UpdateKey": "Nexus:581",
+ "~1.0.8 | Status": "AssumeBroken" // broke in SMAPI 2.0
+ },
+
+ "Arcade Pong": {
+ "ID": "Platonymous.ArcadePong",
+ "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
+ },
+
+ "A Tapper's Dream": {
+ "ID": "ddde5195-8f85-4061-90cc-0d4fd5459358",
+ "Default | UpdateKey": "Nexus:260"
+ },
+
+ "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",
+ "~1.10-beta.7 | Status": "AssumeBroken" // broke in SDV 1.3.20
+ },
+
+ "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",
+ "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"
+ },
+
+ "Better Sprinklers": {
+ "ID": "Speeder.BetterSprinklers",
+ "FormerIDs": "SPDSprinklersMod", // changed in 2.3
+ "Default | UpdateKey": "Nexus:41"
+ },
+
+ "Billboard Anywhere": {
+ "ID": "Omegasis.BillboardAnywhere",
+ "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",
+ "MapRemoteVersions": { "1.3.1": "1.3" } // manifest not updated
+ },
+
+ "Breed Like Rabbits": {
+ "ID": "dycedarger.breedlikerabbits",
+ "Default | UpdateKey": "Nexus:948"
+ },
+
+ "Build Endurance": {
+ "ID": "Omegasis.BuildEndurance",
+ "Default | UpdateKey": "Nexus:445" // added in 1.4.1
+ },
+
+ "Build Health": {
+ "ID": "Omegasis.BuildHealth",
+ "Default | UpdateKey": "Nexus:446" // added in 1.4.1
+ },
+
+ "Buy Cooking Recipes": {
+ "ID": "Denifia.BuyRecipes",
+ "Default | UpdateKey": "Nexus:1126" // added in 1.0.1 (2017-10-04)
+ },
+
+ "Buy Back Collectables": {
+ "ID": "Omegasis.BuyBackCollectables",
+ "FormerIDs": "BuyBackCollectables", // changed in 1.4
+ "Default | UpdateKey": "Nexus:507" // added in 1.4.1
+ },
+
+ "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",
+ "~1.4.3-unofficial.2.mizzion | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.18 (in-game errors)
+ },
+
+ "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"
+ },
+
+ "Chest Pooling": {
+ "ID": "mralbobo.ChestPooling",
+ "Default | UpdateKey": "GitHub:mralbobo/stardew-chest-pooling"
+ },
+
+ "Chests Anywhere": {
+ "ID": "Pathoschild.ChestsAnywhere",
+ "FormerIDs": "ChestsAnywhere", // changed in 1.9
+ "Default | UpdateKey": "Nexus:518",
+ "~1.12.4 | Status": "AssumeBroken" // broke in SDV 1.3
+ },
+
+ "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.18-beta | Status": "AssumeBroken" // broke in SDV 1.3, first beta causes significant friendship bugs
+ },
+
+ "CJB Item Spawner": {
+ "ID": "CJBok.ItemSpawner",
+ "FormerIDs": "CJBItemSpawner", // changed in 1.7
+ "Default | UpdateKey": "Nexus:93",
+ "~1.10 | Status": "AssumeBroken" // broke in SDV 1.3
+ },
+
+ "CJB Show Item Sell Price": {
+ "ID": "CJBok.ShowItemSellPrice",
+ "FormerIDs": "CJBShowItemSellPrice", // changed in 1.7
+ "Default | UpdateKey": "Nexus:5",
+ "~1.8 | Status": "AssumeBroken" // broke in SDV 1.3
+ },
+
+ "Clean Farm": {
+ "ID": "tstaples.CleanFarm",
+ "Default | UpdateKey": "Nexus:794"
+ },
+
+ "Climates of Ferngill": {
+ "ID": "KoihimeNakamura.ClimatesOfFerngill",
+ "Default | UpdateKey": "Nexus:604"
+ },
+
+ "Coal Regen": {
+ "ID": "Blucifer.CoalRegen",
+ "Default | UpdateKey": "Nexus:1664"
+ },
+
+ "Cobalt": {
+ "ID": "spacechase0.Cobalt",
+ "MapRemoteVersions": { "1.1.3": "1.1.2" } // not updated in manifest
+ },
+
+ "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"
+ },
+
+ "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
+ },
+
+ "Content Patcher": {
+ "ID": "Pathoschild.ContentPatcher",
+ "Default | UpdateKey": "Nexus:1915",
+ "~1.4-beta.5 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.18 (in-game errors)
+ },
+
+ "Cooking Skill": {
+ "ID": "spacechase0.CookingSkill",
+ "FormerIDs": "CookingSkill", // changed in 1.0.4–6
+ "Default | UpdateKey": "Nexus:522"
+ },
+
+ "CrabNet": {
+ "ID": "jwdred.CrabNet",
+ "Default | UpdateKey": "Nexus:584"
+ },
+
+ "Crafting Counter": {
+ "ID": "lolpcgaming.CraftingCounter",
+ "Default | UpdateKey": "Nexus:1585",
+ "MapRemoteVersions": { "1.1": "1.0" } // not updated in manifest
+ },
+
+ "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"
+ },
+
+ "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",
+ "Defaul