Difference between revisions of "Modding:Mod compatibility/entry"

From Stardew Valley Wiki
Jump to navigation Jump to search
(cache expensive values using #array functions)
(→‎Usage: remove deleted 'pull request' parameter)
 
(88 intermediate revisions by 3 users not shown)
Line 10: Line 10:
 
</noinclude><!--
 
</noinclude><!--
  
Define a few expensive variables here.
+
Define a few variables here:
 +
  {{#arrayindex:has_source|0}}    = set if a GitHub project name or custom source URL is set, else blank
 +
  {{#arrayindex:status|0}}        = compatibility status for the stable SMAPI/SDV release
 +
  {{#arrayindex:beta_status|0}}    = compatibility status for the beta SMAPI/SDV release
  
  {{#arrayindex:vars|0}} = main status
+
-->{{#arraydefine:has_source|{{#if:{{{github|}}}{{{source|}}}|1}}}}<!--
  {{#arrayindex:vars|1}} = main status (no subtag)
 
  {{#arrayindex:vars|2}} = beta status
 
  {{#arrayindex:vars|3}} = beta status (no subtag)
 
  {{#arraydefine:statuscompare|0}} = whether the compatibility info is equivalent between main and beta ('same' or 'different')
 
  
-->{{#arraydefine:vars|<!--
+
-->{{#arraydefine:status|{{#if:{{{status|}}}
  0-->{{Modding:SMAPI compatibility/entry/status|source={{{source|}}}|unofficial={{{unofficial|}}}|broke in={{{broke in|}}}|status={{{status|}}}}},<!--
+
   |{{{status}}}
   1-->{{Modding:SMAPI compatibility/entry/status|source={{{source|}}}|unofficial={{{unofficial|}}}|broke in={{{broke in|}}}|status={{{status|}}}|no subtag=1}},<!--
+
   |{{#if:{{{unofficial url|}}}
   2-->{{Modding:SMAPI compatibility/entry/status|source={{{source|}}}|unofficial={{{unofficial|}}}|broke in={{{broke in|}}}|status={{{status|}}}|beta unofficial={{{beta unofficial|}}}|beta broke in={{{beta broke in|}}}|beta status={{{beta status|}}}}}
+
    |unofficial
   3-->{{Modding:SMAPI compatibility/entry/status|source={{{source|}}}|unofficial={{{unofficial|}}}|broke in={{{broke in|}}}|status={{{status|}}}|beta unofficial={{{beta unofficial|}}}|beta broke in={{{beta broke in|}}}|beta status={{{beta status|}}}|no subtag=1}}
+
    |{{#if:{{{broke in|}}}
}}<!--
+
      |broken
 +
      |ok
 +
    }}
 +
   }}
 +
}}}}<!--
  
-->{{#arraydefine:statuscompare|<!--
+
Parse input arrays
  0-->{{Modding:SMAPI compatibility/entry/compare status |main={{#arrayindex:vars|0}} |beta={{#arrayindex:vars|1}} |main unofficial url={{{unofficial url|}}} |beta unofficial url={{{beta unofficial url|}}}}}
+
 
}}<!--
+
-->{{#arraydefine:names|{{{name|}}}}}{{#arrayslice:altNames|names|1}}<!--
 +
-->{{#arraydefine:authors|{{{author|}}}}}{{#arrayslice:altAuthors|authors|1}}<!--
 +
-->{{#arraydefine:ids|{{{id|}}}}}<!--
 +
-->{{#arraydefine:warnings|{{{warnings|}}}}}<!--
  
 
Build output
 
Build output
  
 
-->
 
-->
|- class="mod" id="{{{name}}}" data-id="{{#if:{{{id|}}}{{{old ids|}}}|{{#ifeq:{{{id}}}|none||{{{id}}}{{#if:{{{old ids|}}}|,}}}}{{{old ids|}}}}}" {{#if:{{{nexus id|}}}|data-nexus-id="{{{nexus id|}}}"}} {{#if:{{{cf id|}}}|data-chucklefish-id="{{{cf id|}}}"}} {{#if:{{{github|}}}|data-github="{{{github}}}"}} {{#if:{{{source|}}}|data-custom-source="{{{source|}}}"}} {{#if:{{{url|}}}|data-custom-url="{{{url}}}"}} data-status="{{#arrayindex:vars|1}}" data-beta-status="{{#arrayindex:vars|3}}" {{#if:{{{unofficial version|}}}|data-unofficial-version="{{{unofficial version}}}"}} {{#if:{{{beta unofficial version|}}}|data-beta-unofficial-version="{{{beta unofficial version}}}"}} style="line-height: 1em; {{#switch:{{#arrayindex:vars|3}} |ok|optional=background: #9F9; |workaround|unofficial=background: #CF9; |broken=background: #F99; |obsolete|abandoned=background: #999}}"
+
|- class="mod" style="line-height: 1em; {{#switch:{{#arrayindex:status|0}} |ok|optional=background: #9F9; |workaround|unofficial=background: #CF9; |broken=background: #F99; |obsolete|abandoned=background: #999}}" <!--
| {{#if:{{{nexus id|}}}|[{{nexus mod|{{{nexus id}}} {{{name|}}}]}}|{{#if:{{{cf id|}}}|[https://community.playstarbound.com/resources/{{urlencode:{{{cf id}}}}} {{{name}}}]|{{#if:{{{url|}}}|[{{{url}}} {{{name}}}]|{{{name}}}}}}}}}{{#if:{{{name2|}}}|<br /><small style="font-size:0.75em;">(aka {{{name2}}})</small>}}
+
-->id="{{anchorencode:{{#arrayindex:names|0}}}}" <!--
| {{{author}}}{{#if:{{{author2|}}}|<br /><small style="font-size:0.75em;">(aka {{{author2}}})</small>}}
+
-->data-id="{{#arrayprint:ids|,|@@@|@@@}}" <!--
|class="summary"|<!--
+
-->data-name="{{#arrayprint:names|,|@@@|@@@}}" <!--
 
+
-->data-author="{{#arrayprint:authors|,|@@@|@@@}}" <!--
stable label (if different)-->{{#ifeq:{{#arraydefine:statuscompare|0}}|different|'''1.3.28:'''&#32;}}<!--
+
-->{{#if:{{{chucklefish id|}}}|data-cf-id="{{{chucklefish id}}}"}} <!--
 +
-->{{#if:{{{curseforge id|}}}|data-curseforge-id="{{{curseforge id}}}"}} <!--
 +
-->{{#if:{{{curseforge key|}}}|data-curseforge-key="{{{curseforge key}}}"}} <!--
 +
-->{{#if:{{{nexus id|}}}|data-nexus-id="{{{nexus id}}}"}} <!--
 +
-->{{#if:{{{moddrop id|}}}|data-moddrop-id="{{{moddrop id}}}"}} <!--
 +
-->{{#if:{{{github|}}}|data-github="{{{github}}}"}} <!--
 +
-->{{#if:{{{source|}}}|data-custom-source="{{#tag:nowiki|{{{source}}}}}"}} <!--
 +
-->data-url="{{#tag:nowiki|{{#if:{{{nexus id|}}}|{{nexus mod|{{{nexus id}}}}}|{{#if:{{{moddrop id|}}}|{{ModDrop mod|{{{moddrop id}}}}}|{{#if:{{{curseforge key|}}}|https://www.curseforge.com/stardewvalley/mods/{{urlencode:{{{curseforge key}}}}}|{{#if:{{{chucklefish id|}}}|https://community.playstarbound.com/resources/{{urlencode:{{{chucklefish id}}}}}|{{{url|}}}}}}}}}}}}}" <!--
 +
-->data-status="{{#arrayindex:status|0}}" <!--
 +
-->{{#if:{{{broke in|}}}|data-broke-in="{{{broke in}}}"}} <!--
 +
-->{{#if:{{{unofficial version|}}}|data-unofficial-version="{{{unofficial version}}}"}} <!--
 +
-->{{#if:{{{unofficial url|}}}|data-unofficial-url="{{#tag:nowiki|{{{unofficial url}}}}}"}} <!--
 +
-->{{#if:{{{pull request|}}}|data-pr="{{#tag:nowiki|{{{pull request}}}}}"}} <!--
 +
-->{{#ifexpr:{{#arraysize:warnings}} > 0|data-warnings="{{#arrayprint:warnings|, |@@@|@@@}}"}} <!--
 +
-->{{#if:{{{content pack for|}}}|data-content-pack-for="{{{content pack for}}}"}} <!--
 +
-->{{#if:{{{dev note|}}}|data-dev-note="{{{dev note}}}"}} <!--
 +
-->{{#if:{{{map local versions|}}}|data-map-local-versions="{{{map local versions}}}"}} <!--
 +
-->{{#if:{{{map remote versions|}}}|data-map-remote-versions="{{{map remote versions}}}"}}<!--
 +
-->{{#if:{{{change update keys|}}}|data-change-update-keys="{{{change update keys}}}"}}
 +
| {{#if:{{{nexus id|}}}|[{{nexus mod|{{{nexus id}}}}} {{#arrayindex:names|0}}]|{{#if:{{{moddrop id|}}}|{{ModDrop mod|{{{moddrop id}}}|{{#arrayindex:names|0}}}}|{{#if:{{{curseforge key|}}}|[https://www.curseforge.com/stardewvalley/mods/{{urlencode:{{{curseforge key}}}}} {{#arrayindex:names|0}}]|{{#if:{{{chucklefish id|}}}|[https://community.playstarbound.com/resources/{{urlencode:{{{chucklefish id}}}}} {{#arrayindex:names|0}}]|{{#if:{{{url|}}}|[{{{url}}} {{#arrayindex:names|0}}]|{{#arrayindex:names|0}}}}}}}}}}}}{{#ifexpr:{{#arraysize:altNames}} > 0|<br /><small style="font-size:0.75em;">(aka {{#arrayprint:altNames|, |@@@|@@@}})</small>}}
 +
| {{#arrayindex:authors|0}}{{#ifexpr:{{#arraysize:altAuthors}} > 0|<br /><small style="font-size:0.75em;">(aka {{#arrayprint:altAuthors|, |@@@|@@@}})</small>}}
 +
|<!--
  
stable summary--><span class="data-summary">{{#switch:{{#arrayindex:vars|0}}
+
summary--><span class="mod-summary">{{#switch:{{#arrayindex:status|0}}
 
  |ok        = ✓ {{#if:{{{summary|}}}|{{{summary}}}|use latest version.}}
 
  |ok        = ✓ {{#if:{{{summary|}}}|{{{summary}}}|use latest version.}}
  |optional  = ✓ {{#if:{{{summary|}}}|{{{summary}}}|use optional download<ref name="optional-update" />.}}
+
  |optional  = ✓ {{#if:{{{summary|}}}|{{{summary}}}|use optional download.}}
 
  |unofficial = ⚠ broken{{#if:{{{unofficial url|}}}|, use [{{{unofficial url}}} unofficial update]{{#if:{{{unofficial version|}}}|&#32;(<small>{{{unofficial version}}}</small>)}}|{{{unofficial url}}}}}.
 
  |unofficial = ⚠ broken{{#if:{{{unofficial url|}}}|, use [{{{unofficial url}}} unofficial update]{{#if:{{{unofficial version|}}}|&#32;(<small>{{{unofficial version}}}</small>)}}|{{{unofficial url}}}}}.
 
  |workaround = ⚠ broken, {{{summary}}}
 
  |workaround = ⚠ broken, {{{summary}}}
  |broken-open  = ↻ broken, {{#if:{{{summary|}}}|{{{summary}}}|not updated yet.}}
+
  |broken     = ↻ broken, {{#if:{{{summary|}}}|{{{summary}}}|{{#if:{{#arrayindex:has_source|0}}|not updated yet.|not open-source.}}}}
  |broken-closed = ✖ broken, {{#if:{{{summary|}}}|{{{summary}}}|not open-source.}}
+
  |obsolete  = ✖ {{#if:{{{summary|}}}|{{{summary}}}|remove this mod (obsolete).}}
  |obsolete  = ✖ {{#if:{{{summary|}}}|{{{summary}}}|obsolete.}}
+
  |abandoned  = ✖ {{#if:{{{summary|}}}|{{{summary}}}|remove this mod (no longer maintained).}}
  |abandoned  = {{#if:{{{summary|}}}|{{{summary}}}|no longer maintained.}}
+
  |unknown    = {{#if:{{{summary|}}}|{{{summary}}}|not tested yet.}}
}}</span><!--
+
}}</span>{{#ifeq:{{#arrayindex:status|0}}|optional|<ref name="optional-update" />}}<!--
  
beta summary (if different)-->{{#ifeq:{{#arraydefine:statuscompare|0}}|different|<br />'''1.3.29-beta:'''&#32;<span class="data-beta-summary">{{#switch:{{#arrayindex:vars|2}}
+
warnings-->{{#if:{{{warnings|}}}|<br />⚠&#32;{{#arrayprint:warnings|<br />⚠&#32;}}}}
|ok        = ✓ {{#if:{{{beta summary|}}}|{{{beta summary}}}|use latest version.}}
+
| <small>{{{broke in|}}}</small>
|optional  = ✓ {{#if:{{{beta summary|}}}|{{{beta summary}}}|use optional download<ref name="optional-update" />.}}
 
|unofficial = ⚠ broken{{#if:{{{beta unofficial url|}}}|, use [{{{beta unofficial url}}} unofficial update]{{#if:{{{beta unofficial version|}}}|&#32;(<small>{{{beta unofficial version}}}</small>)}}|{{{beta unofficial url}}}}}.
 
|workaround = ⚠ broken, {{{beta summary}}}
 
|broken-open  = ↻ broken, {{#if:{{{beta summary|}}}|{{{beta summary}}}|not updated yet.}}
 
|broken-closed = ✖ broken, {{#if:{{{beta summary|}}}|{{{beta summary}}}|not open-source.}}
 
|obsolete  = ✖ {{#if:{{{beta summary|}}}|{{{beta summary}}}|obsolete.}}
 
|abandoned  = ✖ {{#if:{{{beta summary|}}}|{{{beta summary}}}|no longer maintained.}}
 
}}</span>}}{{#if:{{{warnings|}}}|<br />⚠&#32;{{#arraydefine:warningArray|{{{warnings}}}}}{{#arrayprint:warningArray|<br />⚠&#32;}}}}
 
| <small>{{#if:{{{beta broke in|}}}|{{{beta broke in}}}|{{{broke in|}}}}}</small>
 
 
| {{#if:{{{github|}}}|[https://github.com/{{{github}}} source]|{{#if:{{{source|}}}|[{{{source}}} source]|<span style="color: red; font-size: 0.85em; opacity: 0.5;">closed source</span>}}}}
 
| {{#if:{{{github|}}}|[https://github.com/{{{github}}} source]|{{#if:{{{source|}}}|[{{{source}}} source]|<span style="color: red; font-size: 0.85em; opacity: 0.5;">closed source</span>}}}}
| <small>[[#{{{name|}}}|#]] {{#if:{{{hide-url|}}}|&#32;[{{{hide-url}}} o]}}{{#if:{{{links|}}}|&#32;{{#arraydefine:linkArray|{{{links}}}}}{{#arrayprint:linkArray|&#32;|@@@|[@@@ {{#expr:{{#arraysearch:linkArray|@@@}} + 1}}]}}}} {{#if:{{{id|}}}||⚠ no id}}</small><noinclude>
+
| class="no-wrap"|<small><!--
 +
 
 +
anchor-->[[#{{#arrayindex:names|0}}|#]] <!--
 +
pull request-->{{#if:{{{pull request|}}}|&#32;[{{{pull request}}} PR]}} <!--
 +
developer note-->{{#if:{{{dev note|}}}|<abbr title="{{{dev note|}}}">[dev note]</abbr>}}<!--
 +
 
 +
validation-->{{#ifeq:{{#if:{{{curseforge id|}}}|1|0}}|{{#if:{{{curseforge key|}}}|1|0}}||<abbr title="The mod data is invalid: can't specify CurseForge key or ID without the other.">[invalid data]</abbr>}}</small><noinclude>
 
|}
 
|}
  
==Usage==
+
==Examples==
===Templates===
+
===Compatible mod===
For a compatible mod:
 
 
<pre>
 
<pre>
 
{{/entry
 
{{/entry
Line 78: Line 101:
 
</pre>
 
</pre>
  
For a broken mod:
+
{| class="wikitable plainlinks"
 +
|-
 +
! mod name
 +
! author
 +
! compatibility
 +
! broke in
 +
! source
 +
! &nbsp;
 +
{{Modding:Mod compatibility/entry
 +
  |name    = Lookup Anything
 +
  |author  = Pathoschild
 +
  |id      = Pathoschild.LookupAnything
 +
  |nexus id = 541
 +
  |github  = Pathoschild/StardewMods
 +
}}
 +
|}
 +
 
 +
===Broken mod===
 
<pre>
 
<pre>
 
{{/entry
 
{{/entry
Line 87: Line 127:
 
   |github  = Pathoschild/StardewMods
 
   |github  = Pathoschild/StardewMods
 
   |summary  =  
 
   |summary  =  
 +
 
   |broke in = Stardew Valley 1.2
 
   |broke in = Stardew Valley 1.2
 
}}
 
}}
 
</pre>
 
</pre>
 +
{| class="wikitable plainlinks"
 +
|-
 +
! mod name
 +
! author
 +
! compatibility
 +
! broke in
 +
! source
 +
! &nbsp;
 +
{{Modding:Mod compatibility/entry
 +
  |name    = Lookup Anything
 +
  |author  = Pathoschild
 +
  |id      = Pathoschild.LookupAnything
 +
  |nexus id = 541
 +
  |github  = Pathoschild/StardewMods
 +
  |summary  =
 +
 +
  |broke in = Stardew Valley 1.2
 +
}}
 +
|}
  
For an unofficial update, use the broken-mod template and add these under the other fields:
+
===Unofficial update===
 +
For an unofficial update, use the broken-mod template and add these under <samp>broke in</samp>:
 
<pre>
 
<pre>
   |unofficial url    = https://community.playstarbound.com/attachments/201345000
+
   |unofficial url    = https://community.playstarbound.com/threads/updating-mods-for-stardew-valley-1-3.142524/page-62#post-3329160
 
   |unofficial version = 1.18.2-unofficial.1-example
 
   |unofficial version = 1.18.2-unofficial.1-example
 +
  |pull request      = https://github.com/Pathoschild/Example/pull/1
 
</pre>
 
</pre>
 +
{| class="wikitable plainlinks"
 +
|-
 +
! mod name
 +
! author
 +
! compatibility
 +
! broke in
 +
! source
 +
! &nbsp;
 +
{{Modding:Mod compatibility/entry
 +
  |name    = Lookup Anything
 +
  |author  = Pathoschild
 +
  |id      = Pathoschild.LookupAnything
 +
  |nexus id = 541
 +
  |github  = Pathoschild/StardewMods
 +
  |summary  =
 +
 +
  |broke in          = Stardew Valley 1.2
 +
  |unofficial url    = https://community.playstarbound.com/threads/updating-mods-for-stardew-valley-1-3.142524/page-62#post-3329160
 +
  |unofficial version = 1.18.2-unofficial.1-example
 +
  |pull request      = https://github.com/Pathoschild/Example/pull/1
 +
}}
 +
|}
 +
 +
==Usage==
 +
===Limitations===
 +
* Avoid using quotes (<code>"</code>) in argument values; use <code>&amp;quot;</code> instead.
 +
* The <nowiki>name</nowiki>, <nowiki>author</nowiki>, and <nowiki>id</nowiki> arguments are comma-separated. If the actual value contains a comma, use <code>&amp;#44;</code> instead.
  
 
===Main fields (shown above)===
 
===Main fields (shown above)===
Line 104: Line 193:
 
|-
 
|-
 
| <code>name</code>
 
| <code>name</code>
| The normalised display name for the mod. Combine with <code>name2</code> (see below) to add alternate names.
+
| The normalised display name for the mod. Delimit alternate names with commas.
 
|-
 
|-
 
| <code>author</code>
 
| <code>author</code>
| The name of the author, as shown on Nexus or in its <tt>manifest.json</tt> file. Combine with <code>author2</code> (see below) to add alternate names.
+
| The name of the author, as shown on Nexus or in its <samp>manifest.json</samp> file. Delimit alternate names with commas.
 
|-
 
|-
 
| <code>id</code>
 
| <code>id</code>
| The latest unique mod ID, as listed in its <tt>manifest.json</tt> file. In rare cases where there are parallel current releases with different IDs, this can be comma-delimited. For very old mods with no ID, use <tt>none</tt> to disable validation checks.
+
| The unique mod ID, as listed in its <samp>manifest.json</samp> file. Delimit alternate/older IDs with commas (ideally in latest to oldest order). For very old mods with no ID, use <samp>none</samp> to disable validation checks.
 
|-
 
|-
 
| <code>nexus id</code>
 
| <code>nexus id</code>
Line 116: Line 205:
 
|-
 
|-
 
| <code>github</code>
 
| <code>github</code>
| The mod's GitHub repository in the form <tt>owner/repo</tt>.
+
| The mod's GitHub repository in the form <samp>owner/repo</samp>.
 
|-
 
|-
 
| <code>summary</code>
 
| <code>summary</code>
Line 140: Line 229:
 
| The unofficial update's version number, if any.
 
| The unofficial update's version number, if any.
 
|-
 
|-
| <code>old ids</code>
+
| <code>chucklefish id</code>
| IDs which identify older versions of this mod.
+
| The mod's ID in the [https://community.playstarbound.com/resources/categories/stardew-valley.22/ Chucklefish mod repository].
 +
|-
 +
| <code>curseforge id</code>
 +
| The mod's project ID in the [https://www.curseforge.com/stardewvalley CurseForge mod repository]. This is the value shown on the mod page next to "Project ID".
 +
|-
 +
| <code>curseforge key</code>
 +
| The mod's key in the [https://www.curseforge.com/stardewvalley CurseForge mod repository]. This is the mod key shown in the mod page's URL.
 
|-
 
|-
| <code>cf id</code>
+
| <code>moddrop id</code>
| The mod's ID in the Chucklefish mod repository.
+
| The mod's ID in the [https://www.moddrop.com/stardew-valley/ ModDrop mod repository].
 
|-
 
|-
 
| <code>url</code>
 
| <code>url</code>
| The arbitrary mod URL, if not on Nexus or Chucklefish. Avoid if possible, since this makes crossreferencing more difficult.
+
| The arbitrary mod URL, if not on a known mod site. Avoid if possible, since this makes crossreferencing more difficult.
 
|-
 
|-
 
| <code>source</code>
 
| <code>source</code>
 
| An arbitrary source code URL, if not on GitHub. Avoid if possible, since this makes crossreferencing more difficult.
 
| An arbitrary source code URL, if not on GitHub. Avoid if possible, since this makes crossreferencing more difficult.
 
|-
 
|-
| <code>name2</code><br /><code>author2</code>
+
| <code>warnings</code>
| Adds alternate mod and author names.
+
| Text explaining additional compatibility warnings about the mod (''e.g.,'' not compatible with Linux/Mac).
|-
 
| <code>hide-url</code>
 
| Use this instead of (<code>url</code>) to move it into a superscript link. Mainly useful for broken mods with a workaround, so players don't automatically click through to the old mod.
 
 
|-
 
|-
| <code>links</code>
+
| <code>content pack for</code>
| A comma-delimited list of URLs to add as superscript links. Mainly useful for linking to pull requests.
+
| The name of the mod which loads this content pack.
 
|-
 
|-
| <code>warnings</code>
+
| <code>dev note</code>
| Text explaining additional compatibility warnings about the mod (e.g. not compatible with Linux/Mac).
+
| Special notes intended for developers who maintain unofficial updates or submit pull requests.
 
|}
 
|}
  
===Beta fields===
+
===Override fields===
When there's a Stardew Valley beta, some mods may have different compatibility statuses for stable vs beta. You can specify these optional fields to specify a different beta status.
+
These fields override information provided by the author in the <samp>manifest.json</samp> or mod page, so they should only be used as a last resort.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 173: Line 265:
 
! purpose
 
! purpose
 
|-
 
|-
| <code>beta summary</code>
+
| <code>change update keys</code>
| Specify custom notes or instructions about the mod's compatibility. Should usually be blank.
+
| Overrides the [[Modding:Modder Guide/APIs/Update checks|update keys]] from the <samp>manifest.json</samp> or other compatibility list fields. Remove a key with <code>-</code>, add a key with an optional <code>+</code>, and separate keys with commas. For example:
 +
<pre>
 +
|override update keys = -Nexus:991, +Nexus:991@CFA
 +
</pre>
 
|-
 
|-
| <code>beta broke in</code>
+
| <code>map remote version</code>
| The SMAPI or Stardew Valley update which broke this mod (if applicable).
+
| When SMAPI performs an update check for the mod, this field overrides the version returned by the server. SMAPI will match the original version using [https://semver.org/ semantic rules] if it's parseable (''e.g.,'' <code>1.0</code> and <code>1.0.0</code> are equivalent), else it'll fallback to case-insensitive string comparison (''e.g.,'' <code>1.01</code> and <code>1.01.0</code> are ''not'' equivalent). If an invalid format is specified or the new version can't be parsed, the mapping will be ignored.
|-
+
 
| <code>beta status</code>
+
'''This is a specialised field; it's better to correct the mod page if possible.'''
| Whether the mod is compatible with the latest versions of Stardew Valley and SMAPI (see [[#Valid statuses]]). If not specified, it defaults to <code>unofficial</code> if an unofficial URL is given, else <code>broken</code> if <code>broke in</code> is specified, else <code>ok</code>.
+
 
|-
+
Mappings are specified with an arrow, and multiple mappings can be separated by a semi-colon:
| <code>beta unofficial url</code>
+
<pre>
| A page URL where the player can download an unofficial update, if any.
+
|map remote versions = 0.01 → 0.0.1; 0.0.1-beta → 0.0.1
 +
</pre>
 
|-
 
|-
| <code>beta unofficial version</code>
+
| <code>map local version</code>
| The unofficial update's version number, if any.
+
| Equivalent to <code>map remote version</code>, but for the manifest version.
 
|}
 
|}
  
Line 202: Line 298:
 
|-
 
|-
 
| <code>unofficial</code>
 
| <code>unofficial</code>
| The mod is compatible using an unofficial update. There's no need to specify this; if you also set <tt>unofficial url</tt> and <tt>unofficial version</tt>, you can remove the status field.
+
| The mod is compatible using an unofficial update. There's no need to specify this; if you also set <samp>unofficial url</samp> and <samp>unofficial version</samp>, you can remove the status field.
 
|-
 
|-
 
| <code>workaround</code>
 
| <code>workaround</code>
| The mod isn't compatible, but the player can fix it or there's a good alternative. A summary should be provided manually. If you also set <tt>unofficial url</tt> and <tt>unofficial version</tt>, you can remove the status field.
+
| The mod isn't compatible, but the player can fix it or there's a good alternative. A summary should be provided manually. If you also set <samp>unofficial url</samp> and <samp>unofficial version</samp>, you can remove the status field.
 
|-
 
|-
 
| <code>broken</code>
 
| <code>broken</code>
Line 215: Line 311:
 
| <code>obsolete</code>
 
| <code>obsolete</code>
 
| The mod is no longer needed and should be removed.
 
| The mod is no longer needed and should be removed.
 +
|-
 +
| <code>unknown</code>
 +
| The mod's compatibility status hasn't been tested. This should only be used as a placeholder (''e.g.,'' when adding a new beta), it should never be used long since that defeats the purpose of the compatibility list.
 
|}
 
|}
  
==Script==
+
[[de:Modding:SMAPI Kompatibilität/entry]]
This script generates the template call when run from a Nexus or Chucklefish mod page.
 
<source lang="javascript">
 
switch(location.host)
 
{
 
case "www.nexusmods.com":
 
var url = location.origin + location.pathname.replace(/\/*$/, '');
 
var name = $(".header-name").text();
 
var author = $(".uploader a").text();
 
var author2 = $(".header-author strong").text();
 
break;
 
 
 
case "community.playstarbound.com":
 
var url = location.origin + location.pathname.replace(/\/*$/, '');
 
var name = $.trim($("h1:first").contents().first().text());
 
var author = $(".primaryContent[data-author]:first").attr("data-author");
 
break;
 
 
 
default:
 
throw `Unknown domain: ${location.host}`;
 
}
 
 
 
var template = `
 
{{/entry
 
  |name    = ${name}
 
  |author  = ${author}`;
 
if(author2 && author2 != author)
 
  template += '\n' + `  |author2 = ${author2}`;
 
template += `
 
  |url    = ${url}
 
  |status  = ok
 
  |summary =
 
  |source  =
 
}}
 
`;
 
</source>
 
  
[[Category:Modding]]</noinclude>
+
[[Category:Modding]]
 +
</noinclude>

Latest revision as of 19:47, 2 March 2024

Examples

Compatible mod

{{/entry
  |name     = Lookup Anything
  |author   = Pathoschild
  |id       = Pathoschild.LookupAnything
  |nexus id = 541
  |github   = Pathoschild/StardewMods
}}

Broken mod

{{/entry
  |name     = Lookup Anything
  |author   = Pathoschild
  |id       = Pathoschild.LookupAnything
  |nexus id = 541
  |github   = Pathoschild/StardewMods
  |summary  = 

  |broke in = Stardew Valley 1.2
}}

Unofficial update

For an unofficial update, use the broken-mod template and add these under broke in:

  |unofficial url     = https://community.playstarbound.com/threads/updating-mods-for-stardew-valley-1-3.142524/page-62#post-3329160
  |unofficial version = 1.18.2-unofficial.1-example
  |pull request       = https://github.com/Pathoschild/Example/pull/1

Usage

Limitations

  • Avoid using quotes (") in argument values; use &quot; instead.
  • The name, author, and id arguments are comma-separated. If the actual value contains a comma, use &#44; instead.

Main fields (shown above)

field purpose
name The normalised display name for the mod. Delimit alternate names with commas.
author The name of the author, as shown on Nexus or in its manifest.json file. Delimit alternate names with commas.
id The unique mod ID, as listed in its manifest.json file. Delimit alternate/older IDs with commas (ideally in latest to oldest order). For very old mods with no ID, use none to disable validation checks.
nexus id The mod's unique ID on Nexus (if any). This is the number in the mod page's URL.
github The mod's GitHub repository in the form owner/repo.
summary Specify custom notes or instructions about the mod's compatibility. Should usually be blank.
broke in The SMAPI or Stardew Valley update which broke this mod (if applicable).

Other fields

field purpose
status Whether the mod is compatible with the latest versions of Stardew Valley and SMAPI (see #Valid statuses). If not specified, it defaults to unofficial if an unofficial URL is given, else broken if broke in is specified, else ok.
unofficial url A page URL where the player can download an unofficial update, if any.
unofficial version The unofficial update's version number, if any.
chucklefish id The mod's ID in the Chucklefish mod repository.
curseforge id The mod's project ID in the CurseForge mod repository. This is the value shown on the mod page next to "Project ID".
curseforge key The mod's key in the CurseForge mod repository. This is the mod key shown in the mod page's URL.
moddrop id The mod's ID in the ModDrop mod repository.
url The arbitrary mod URL, if not on a known mod site. Avoid if possible, since this makes crossreferencing more difficult.
source An arbitrary source code URL, if not on GitHub. Avoid if possible, since this makes crossreferencing more difficult.
warnings Text explaining additional compatibility warnings about the mod (e.g., not compatible with Linux/Mac).
content pack for The name of the mod which loads this content pack.
dev note Special notes intended for developers who maintain unofficial updates or submit pull requests.

Override fields

These fields override information provided by the author in the manifest.json or mod page, so they should only be used as a last resort.

field purpose
change update keys Overrides the update keys from the manifest.json or other compatibility list fields. Remove a key with -, add a key with an optional +, and separate keys with commas. For example:
|override update keys = -Nexus:991, +Nexus:991@CFA
map remote version When SMAPI performs an update check for the mod, this field overrides the version returned by the server. SMAPI will match the original version using semantic rules if it's parseable (e.g., 1.0 and 1.0.0 are equivalent), else it'll fallback to case-insensitive string comparison (e.g., 1.01 and 1.01.0 are not equivalent). If an invalid format is specified or the new version can't be parsed, the mapping will be ignored.

This is a specialised field; it's better to correct the mod page if possible.

Mappings are specified with an arrow, and multiple mappings can be separated by a semi-colon:

|map remote versions = 0.01 → 0.0.1; 0.0.1-beta → 0.0.1
map local version Equivalent to map remote version, but for the manifest version.

Valid statuses

status description
ok The mod is compatible. This is the default and doesn't need to be specified.
Default summary: use latest version.
optional The mod is compatible, if you use an optional download on the mod page.
Default summary: use optional download.[1]
unofficial The mod is compatible using an unofficial update. There's no need to specify this; if you also set unofficial url and unofficial version, you can remove the status field.
workaround The mod isn't compatible, but the player can fix it or there's a good alternative. A summary should be provided manually. If you also set unofficial url and unofficial version, you can remove the status field.
broken The mod isn't compatible. The message depends on whether the source link is set.
Default summary: broken, not updated yet or broken, not open-source.
abandoned The mod is no longer maintained by the author, and an unofficial update or continuation is unlikely. This should only be used when the author has definitively abandoned the mod (either explicitly, or by removing the mod page or downloads).
Default summary: no longer maintained.
obsolete The mod is no longer needed and should be removed.
unknown The mod's compatibility status hasn't been tested. This should only be used as a placeholder (e.g., when adding a new beta), it should never be used long since that defeats the purpose of the compatibility list.