Changes

Jump to navigation Jump to search
→‎Custom mail formatting: fix captioning on image
Line 1: Line 1:  
←[[Modding:Index|Index]]
 
←[[Modding:Index|Index]]
   −
{{SMAPI upcoming|3.13.0}}
   
{{Modder compatibility header}}
 
{{Modder compatibility header}}
   Line 21: Line 20:  
     <RootNamespace>EXAMPLE_MOD_NAME</RootNamespace>
 
     <RootNamespace>EXAMPLE_MOD_NAME</RootNamespace>
 
     <Version>1.0.0</Version>
 
     <Version>1.0.0</Version>
     <TargetFramework>net452</TargetFramework>
+
     <TargetFramework>net5.0</TargetFramework>
 +
    <LangVersion>Latest</LangVersion>
 
   </PropertyGroup>
 
   </PropertyGroup>
    
   <ItemGroup>
 
   <ItemGroup>
     <PackageReference Include="Pathoschild.Stardew.ModBuildConfig" Version="3.3.0" />
+
     <PackageReference Include="Pathoschild.Stardew.ModBuildConfig" Version="4.1.1" />
 
   </ItemGroup>
 
   </ItemGroup>
 
</Project>
 
</Project>
Line 33: Line 33:  
<li>Update the <samp>AssemblyName</samp>, <samp>RootNamespace</samp>, and <samp>Version</samp> tags. (You can delete the <samp>AssemblyName</samp> and <samp>RootNamespace</samp> tags if they just match the project name.)</li>
 
<li>Update the <samp>AssemblyName</samp>, <samp>RootNamespace</samp>, and <samp>Version</samp> tags. (You can delete the <samp>AssemblyName</samp> and <samp>RootNamespace</samp> tags if they just match the project name.)</li>
 
<li>Add any other NuGet packages you used, if any.</li>
 
<li>Add any other NuGet packages you used, if any.</li>
<li>Delete the <samp>Properties/AssemblyInfo.cs</samp> file, <samp>packages</samp> folder, and <samp>packages.config</samp> file (if present).</li>
+
</ol>
 +
 
 +
If you're using the simplified format already, you just need to update version numbers in the .csproj file:
 +
<ol>
 +
<li>Replace <code><nowiki><TargetFramework>net452</TargetFramework></nowiki></code> with <code><nowiki><TargetFramework>net5.0</TargetFramework></nowiki></code>.</li>
 +
<li>Replace <code><nowiki><PackageReference Include="Pathoschild.Stardew.ModBuildConfig" Version="3.3.0" /></nowiki></code> with <code><nowiki><PackageReference Include="Pathoschild.Stardew.ModBuildConfig" Version="4.1.1" /></nowiki></code></li>
 
</ol>
 
</ol>
 
</li>
 
</li>
<li>Edit your mod's <samp>.csproj</samp> file, and replace <code><nowiki><TargetFramework>net452</TargetFramework></nowiki></code> with <code><nowiki><TargetFramework>net5.0</TargetFramework></nowiki></code>.</li>
+
<li>Delete the <samp>Properties/AssemblyInfo.cs</samp> file, <samp>packages</samp> folder, and <samp>packages.config</samp> file (if present).</li>
<li>Update the mod build package to the prerelease 4.0.0 version.</li>
   
<li>Exit Visual Studio.</li>
 
<li>Exit Visual Studio.</li>
 
<li>Delete your solution's hidden <samp>.vs</samp> folder, and every project's <samp>bin</samp> and <samp>obj</samp> folders.</li>
 
<li>Delete your solution's hidden <samp>.vs</samp> folder, and every project's <samp>bin</samp> and <samp>obj</samp> folders.</li>
Line 73: Line 77:     
===Game compatibility branch===
 
===Game compatibility branch===
Stardew Valley 1.5.5 is available in two branches on each OS (with identical content for players): the ''main branch'' which is installed by default, and an optional ''compatibility branch'' for [https://www.stardewvalley.net/compatibility older systems]. These have identical content for players, but use different frameworks:
+
{{main article|Modding:Player Guide/Troubleshooting#SMAPI doesn't work with compatibility branch}}
 +
 
 +
Stardew Valley 1.5.5 is available in two branches on each OS: the ''main branch'' which is installed by default, and an optional [https://www.stardewvalley.net/compatibility''compatibility branch'' for older systems]. These have identical content for players, but use different frameworks:
    
{| class="wikitable"
 
{| class="wikitable"
Line 101: Line 107:  
|}
 
|}
   −
Unfortunately '''SMAPI only supports the main branch of the game.''' There are formidable difficulties across all mods in supporting all three variations, the [https://store.steampowered.com/hwsurvey Steam hardware stats] show that ≈99.69% of players have 64-bit, and 32-bit imposes significant restrictions on what mods can do.
+
Unfortunately '''SMAPI only supports the main branch of the game currently.''' There are formidable difficulties across all mods in supporting all three variations, 32-bit imposes significant restrictions on what mods can do, and the [https://store.steampowered.com/hwsurvey Steam hardware stats] show that ≈99.69% of players have 64-bit.
 +
 
 +
Having two versions of SMAPI (like we do for Linux/macOS vs Windows compatibility) wouldn't be enough in this case. Every C# mod author would need to manually port two versions of every update of every mod forever, which is prohibitively unfeasible. It's possible that in the future we'll either figure out how SMAPI can automatically rewrite mods for the compatibility branch, or some modders may port SMAPI and individual mods to the compatibility branch.
    
===Game assembly name===
 
===Game assembly name===
 
Previously the game assembly was <code>Stardew Valley</code> on Windows, and <code>StardewValley</code> on Linux and macOS. The assembly is now named <code>Stardew Valley</code> on all platforms. Most mods shouldn't be affected once you update the mod build package.
 
Previously the game assembly was <code>Stardew Valley</code> on Windows, and <code>StardewValley</code> on Linux and macOS. The assembly is now named <code>Stardew Valley</code> on all platforms. Most mods shouldn't be affected once you update the mod build package.
 +
 +
===New assembly reference model===
 +
If your mod references a <samp>.dll</samp> file manually, note that assembly references are handled differently in .NET 5. Custom assemblies are no longer copied into your mod's folder by default, which may break your mod. In that case you need to explicitly enable assembly bundling in your project file; see <code>BundleExtraAssemblies</code> in the [https://smapi.io/package mod build package] documentation for details.
    
==Breaking changes for Content Patcher packs==
 
==Breaking changes for Content Patcher packs==
Line 206: Line 217:  
|-
 
|-
 
| <samp>ID</samp>
 
| <samp>ID</samp>
| A unique ID value. This must be '''globally''' unique across all mods, so you should prefix your mod ID (''e.g.'', <samp>Example.PineapplesAnywhere/PineappleFarm</samp>). You should avoid commas for compatibility with Content Patcher packs checking the <samp><nowiki>{{FarmType}}</nowiki></samp> token. This is not shown in-game.
+
| A unique ID value. This must be '''globally''' unique across all mods, so you should prefix your mod ID (''e.g.,'' <samp>Example.PineapplesAnywhere/PineappleFarm</samp>). You should avoid commas for compatibility with Content Patcher packs checking the <samp><nowiki>{{FarmType}}</nowiki></samp> token. This is not shown in-game.
 
|-
 
|-
 
| <samp>TooltipStringPath</samp>
 
| <samp>TooltipStringPath</samp>
Line 234: Line 245:  
             "Target": "Data/AdditionalFarms",
 
             "Target": "Data/AdditionalFarms",
 
             "Entries": {
 
             "Entries": {
                 "Pathoschild.PineappleFarm/PineappleFarm": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
+
                 "ExampleAuthor.PineappleFarm/PineappleFarm": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
                     "ID": "Pathoschild.PineappleFarm/PineappleFarm",
+
                     "ID": "ExampleAuthor.PineappleFarm/PineappleFarm",
                     "TooltipStringPath": "Strings/UI:Pathoschild_PineappleFarm",
+
                     "TooltipStringPath": "Strings/UI:ExampleAuthor_PineappleFarm",
                     "MapName": "Pathoschild_PineappleFarm",
+
                     "MapName": "ExampleAuthor_PineappleFarm",
                     "IconTexture": "Mods/Pathoschild.PineappleFarm/Icon",
+
                     "IconTexture": "Mods/ExampleAuthor.PineappleFarm/Icon",
                     "WorldMapTexture": "Mods/Pathoschild.PineappleFarm/WorldMap"
+
                     "WorldMapTexture": "Mods/ExampleAuthor.PineappleFarm/WorldMap"
 
                 }
 
                 }
 
             }
 
             }
Line 249: Line 260:  
             "Target": "Strings/UI",
 
             "Target": "Strings/UI",
 
             "Entries": {
 
             "Entries": {
                 "Pathoschild_PineappleFarm": "Pineapple Farm_A farm shaped like a pineapple!" // tip: use <nowiki>{{i18n}}</nowiki> to translate it
+
                 "ExampleAuthor_PineappleFarm": "Pineapple Farm_A farm shaped like a pineapple!" // tip: use <nowiki>{{i18n}}</nowiki> to translate it
 
             }
 
             }
 
         },
 
         },
Line 256: Line 267:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Maps/Pathoschild_PineappleFarm",
+
             "Target": "Maps/ExampleAuthor_PineappleFarm",
 
             "FromFile": "assets/map.tmx"
 
             "FromFile": "assets/map.tmx"
 
         },
 
         },
Line 263: Line 274:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Mods/Pathoschild.PineappleFarm/Icon, Mods/Pathoschild.PineappleFarm/WorldMap",
+
             "Target": "Mods/ExampleAuthor.PineappleFarm/Icon, Mods/ExampleAuthor.PineappleFarm/WorldMap",
 
             "FromFile": "assets/<nowiki>{{TargetWithoutPath}}</nowiki>.png"
 
             "FromFile": "assets/<nowiki>{{TargetWithoutPath}}</nowiki>.png"
 
         }
 
         }
Line 322: Line 333:  
|-
 
|-
 
| <samp>NumberComma</samp>
 
| <samp>NumberComma</samp>
| ''(optional)'' The string to use as the thousands separator (''e.g.'', <code>","</code> for <code>5,000,000</code>). Defaults to a comma.
+
| ''(optional)'' The string to use as the thousands separator (''e.g.,'' <code>","</code> for <code>5,000,000</code>). Defaults to a comma.
 
|-
 
|-
 
| <samp>SmallFontLineSpacing</samp>
 
| <samp>SmallFontLineSpacing</samp>
Line 343: Line 354:  
             "Target": "Data/AdditionalLanguages",
 
             "Target": "Data/AdditionalLanguages",
 
             "Entries": {
 
             "Entries": {
                 "Pathoschild.Esperanto": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
+
                 "ExampleAuthor.Esperanto": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
                     "ID": "Pathoschild.Esperanto",
+
                     "ID": "ExampleAuthor.Esperanto",
 
                     "LanguageCode": "eo",
 
                     "LanguageCode": "eo",
                     "ButtonTexture": "Mods/Pathoschild.Esperanto/Button",
+
                     "ButtonTexture": "Mods/ExampleAuthor.Esperanto/Button",
 
                     "UseLatinFont": true,
 
                     "UseLatinFont": true,
 
                     "TimeFormat": "[HOURS_24_00]:[MINUTES]",
 
                     "TimeFormat": "[HOURS_24_00]:[MINUTES]",
Line 358: Line 369:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Mods/Pathoschild.Esperanto/Button",
+
             "Target": "Mods/ExampleAuthor.Esperanto/Button",
 
             "FromFile": "assets/button.png"
 
             "FromFile": "assets/button.png"
 
         }
 
         }
Line 381: Line 392:     
===Custom festival location names===
 
===Custom festival location names===
The location name in the festival-started message (''e.g.'', "''The Luau has begun on the beach''") was previously hardcoded, so it would always show the internal name for non-vanilla festival locations. You can now add a <samp>locationDisplayName</samp> field in the <samp>Data/Festivals/*</samp> file to set the display name.
+
The location name in the festival-started message (''e.g.,'' "''The Luau has begun on the beach''") was previously hardcoded, so it would always show the internal name for non-vanilla festival locations. You can now add a <samp>locationDisplayName</samp> field in the <samp>Data/Festivals/*</samp> file to set the display name.
    
===Custom spouse rooms===
 
===Custom spouse rooms===
Line 394: Line 405:  
|-
 
|-
 
| <code>{{t|NPC name}}</code>
 
| <code>{{t|NPC name}}</code>
| The internal name of the NPC (i.e. their key in <samp>Data/NPCDispositions</samp>).
+
| The internal name of the NPC (''i.e.,'' their key in <samp>Data/NPCDispositions</samp>).
 
|-
 
|-
 
| <code>{{t|map name}}</code>
 
| <code>{{t|map name}}</code>
Line 404: Line 415:  
<li>You can mark where the spouse stands in their spouse room by placing the red circle path tile (tile index 7) on [[Modding:Maps#Paths layer|the <samp>Paths</samp> layer]].</li>
 
<li>You can mark where the spouse stands in their spouse room by placing the red circle path tile (tile index 7) on [[Modding:Maps#Paths layer|the <samp>Paths</samp> layer]].</li>
 
<li>The spouse room maps are now applied using the game's newer map override system, so tile properties and custom tilesheets in the spouse room map are copied over automatically.</li>
 
<li>The spouse room maps are now applied using the game's newer map override system, so tile properties and custom tilesheets in the spouse room map are copied over automatically.</li>
<li>Some of the game's spouse room code (''e.g.'', positions for Sebastian's 14-heart frog terrarium) was updated to potentially allow moving spouse rooms around. However, some things like event positions are still hardcoded and will need to be fixed to fully support this feature.</li>
+
<li>Some of the game's spouse room code (''e.g.,'' positions for Sebastian's 14-heart frog terrarium) was updated to potentially allow moving spouse rooms around. However, some things like event positions are still hardcoded and will need to be fixed to fully support this feature.</li>
 
</ul>
 
</ul>
   Line 417: Line 428:  
             "Target": "Data/SpouseRooms",
 
             "Target": "Data/SpouseRooms",
 
             "Entries": {
 
             "Entries": {
                 "Akila": "Pathoschild_ExampleAkilaMod_SpouseRoom/0"
+
                 "Akila": "ExampleAuthor_ExampleAkilaMod_SpouseRoom/0"
 
             }
 
             }
 
         },
 
         },
Line 424: Line 435:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Maps/Pathoschild_ExampleAkilaMod_SpouseRoom",
+
             "Target": "Maps/ExampleAuthor_ExampleAkilaMod_SpouseRoom",
 
             "FromFile": "assets/spouse-room.tmx"
 
             "FromFile": "assets/spouse-room.tmx"
 
         }
 
         }
Line 462: Line 473:  
             "Target": "Data/SpousePatios",
 
             "Target": "Data/SpousePatios",
 
             "Entries": {
 
             "Entries": {
                 "Akila": "Pathoschild_ExampleAkilaMod_OutsideArea/0/16 16 16 17 17 17 18 18 18 19 19 19/1 5"
+
                 "Akila": "ExampleAuthor_ExampleAkilaMod_OutsideArea/0/16 16 16 17 17 17 18 18 18 19 19 19/1 5"
 
             }
 
             }
 
         },
 
         },
Line 469: Line 480:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Maps/Pathoschild_ExampleAkilaMod_OutsideArea",
+
             "Target": "Maps/ExampleAuthor_ExampleAkilaMod_OutsideArea",
 
             "FromFile": "assets/outside-area.tmx"
 
             "FromFile": "assets/outside-area.tmx"
 
         }
 
         }
Line 509: Line 520:  
|}
 
|}
   −
For example, this Content Patcher pack would add a renovation to the fully-upgraded farmhouse based on a custom <samp>Pathoschild_PineapplesEverywhere_HasRenovation</samp> flag. Note that <samp>TextOperations</samp> is used to avoid overwriting any renovations added by another mod, and <samp>Pathoschild_PineapplesEverywhere_</samp> is a unique prefix for the hypothetical mod to avoid conflicts with other mods.
+
For example, this Content Patcher pack would add a renovation to the fully-upgraded farmhouse based on a custom <samp>ExampleAuthor_PineapplesEverywhere_HasRenovation</samp> flag. Note that <samp>TextOperations</samp> is used to avoid overwriting any renovations added by another mod, and <samp>ExampleAuthor_PineapplesEverywhere_</samp> is a unique prefix for the hypothetical mod to avoid conflicts with other mods.
 
{{#tag:syntaxhighlight|
 
{{#tag:syntaxhighlight|
 
{
 
{
Line 522: Line 533:  
                     "Operation": "Append",
 
                     "Operation": "Append",
 
                     "Target": [ "MapProperties", "AdditionalRenovations" ],
 
                     "Target": [ "MapProperties", "AdditionalRenovations" ],
                     "Value": "Pathoschild_PineapplesEverywhere_KitchenUpgrade Pathoschild_PineapplesEverywhere_HasRenovation Pathoschild_PineapplesEverywhere_Kitchen Pathoschild_PineapplesEverywhere_Empty 0 19 3 3",
+
                     "Value": "ExampleAuthor_PineapplesEverywhere_KitchenUpgrade ExampleAuthor_PineapplesEverywhere_HasRenovation ExampleAuthor_PineapplesEverywhere_Kitchen ExampleAuthor_PineapplesEverywhere_Empty 0 19 3 3",
 
                     "Delimiter": "," // if there are already renovations, add a comma before this one
 
                     "Delimiter": "," // if there are already renovations, add a comma before this one
 
                 }
 
                 }
Line 531: Line 542:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Maps/Pathoschild_PineapplesEverywhere_Kitchen",
+
             "Target": "Maps/ExampleAuthor_PineapplesEverywhere_Kitchen",
 
             "FromFile": "assets/kitchen-upgrade.tmx"
 
             "FromFile": "assets/kitchen-upgrade.tmx"
 
         },
 
         },
Line 538: Line 549:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Maps/Pathoschild_PineapplesEverywhere_Empty",
+
             "Target": "Maps/ExampleAuthor_PineapplesEverywhere_Empty",
 
             "FromFile": "assets/kitchen-upgrade-empty.tmx"
 
             "FromFile": "assets/kitchen-upgrade-empty.tmx"
 
         }
 
         }
Line 616: Line 627:  
             "Target": "Data/AdditionalWallpaperFlooring",
 
             "Target": "Data/AdditionalWallpaperFlooring",
 
             "Entries": {
 
             "Entries": {
                 "Pathoschild.CustomWallpapers": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
+
                 "ExampleAuthor.CustomWallpapers": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
                     "ID": "Pathoschild.CustomWallpapers",
+
                     "ID": "ExampleAuthor.CustomWallpapers",
                     "Texture": "Mods/Pathoschild.CustomWallpapers/Wallpapers",
+
                     "Texture": "Mods/ExampleAuthor.CustomWallpapers/Wallpapers",
 
                     "IsFlooring": false,
 
                     "IsFlooring": false,
 
                     "Count": 3
 
                     "Count": 3
Line 628: Line 639:  
         {
 
         {
 
             "Action": "Load",
 
             "Action": "Load",
             "Target": "Mods/Pathoschild.CustomWallpapers/Wallpapers",
+
             "Target": "Mods/ExampleAuthor.CustomWallpapers/Wallpapers",
 
             "FromFile": "assets/wallpapers.png"
 
             "FromFile": "assets/wallpapers.png"
 
         }
 
         }
Line 635: Line 646:     
===Map property changes===
 
===Map property changes===
 +
{{main article|Modding:Maps#Known_properties}}
 
Stardew Valley 1.5.5 adds several map properties (in addition to those listed in their own sections):
 
Stardew Valley 1.5.5 adds several map properties (in addition to those listed in their own sections):
   Line 665: Line 677:  
| ''any''
 
| ''any''
 
| <samp>IsFarm T</samp>
 
| <samp>IsFarm T</samp>
| Marks the location as a farm. This only affects generic location/interaction logic which checks the in-code <code>location.IsFarm</code> property; logic hardcoded into the game's <code>Farm</code> class (''e.g.'', farm animals, pets, crows/scarecrows, greenhouse, farm buildings, etc) is still limited to the actual farm.
+
| Marks the location as a farm. This only affects generic location/interaction logic which checks the in-code <code>location.IsFarm</code> property; logic hardcoded into the game's <code>Farm</code> class (''e.g.,'' farm animals, pets, crows/scarecrows, greenhouse, farm buildings, etc) is still limited to the actual farm.
 
|-
 
|-
 
| ''any''
 
| ''any''
Line 754: Line 766:  
Specifically:
 
Specifically:
 
<ul>
 
<ul>
<li>Items with the "<samp>propose_roommate_{{t|NPC name}}</samp>" [[Modding:Context tags|context tag]] will trigger a roommate proposal when given to the named NPC. The NPC name must be lowercase with underscores instead of spaces (''e.g.'', <samp>propose_roommate_dwarf</samp>).</li>
+
<li>Items with the "<samp>propose_roommate_{{t|NPC name}}</samp>" [[Modding:Items#Context tags|context tag]] will trigger a roommate proposal when given to the named NPC. The NPC name must be lowercase with underscores instead of spaces (''e.g.,'' <samp>propose_roommate_dwarf</samp>).</li>
 
<li>These [[Modding:Dialogue|dialogue keys]] apply before they move in:
 
<li>These [[Modding:Dialogue|dialogue keys]] apply before they move in:
 
{| class="wikitable"
 
{| class="wikitable"
Line 768: Line 780:  
| <samp>Strings/Characters</samp>
 
| <samp>Strings/Characters</samp>
 
| <samp>MovieInvite_NoTheater</samp>
 
| <samp>MovieInvite_NoTheater</samp>
| The NPC's roommate proposal rejection text when you don't meet the requirements (i.e. min friendship + house upgrade level, and not already having a roommate/spouse). This is the same dialogue used when you can't invite someone to the movies.
+
| The NPC's roommate proposal rejection text when you don't meet the requirements (''i.e.,'' min friendship + house upgrade level, and not already having a roommate/spouse). This is the same dialogue used when you can't invite someone to the movies.
 
|-
 
|-
 
| <samp>Data/EngagementDialogue</samp>
 
| <samp>Data/EngagementDialogue</samp>
Line 822: Line 834:  
| <samp>[letterbg {{t|asset name}} {{t|index}}]</samp>
 
| <samp>[letterbg {{t|asset name}} {{t|index}}]</samp>
 
| Changes the default letter background to the given texture. The asset name should match a texture containing two rows: one with 320x180 pixel letter background images, and one with 24x24 pixel button backgrounds shown behind attached items. The index is the sprite to use from those rows, starting at 0 for the first one.
 
| Changes the default letter background to the given texture. The asset name should match a texture containing two rows: one with 320x180 pixel letter background images, and one with 24x24 pixel button backgrounds shown behind attached items. The index is the sprite to use from those rows, starting at 0 for the first one.
 +
Only the first 4 letter background images of a row will be properly displayed.
 +
Only one row of button may exist.
 +
See image below
 
|-
 
|-
 
| <samp>[textcolor {{t|color}}]</samp>
 
| <samp>[textcolor {{t|color}}]</samp>
 
| Changes the letter text color. The valid colors are <samp>black</samp>, <samp>blue</samp>, <samp>cyan</samp>, <samp>gray</samp>, <samp>green</samp>, <samp>orange</samp>, <samp>purple</samp>, <samp>red</samp>, and <samp>white</samp>.
 
| Changes the letter text color. The valid colors are <samp>black</samp>, <samp>blue</samp>, <samp>cyan</samp>, <samp>gray</samp>, <samp>green</samp>, <samp>orange</samp>, <samp>purple</samp>, <samp>red</samp>, and <samp>white</samp>.
 
|}
 
|}
 +
 +
 +
[[File:Lettersbglayers.png|center|thumb|Example : the letters  background images can go on the pale pink, pink and purple spaces, while the buttons can only go on the orange line.]]
    
===Custom scarecrows===
 
===Custom scarecrows===
You can now mark any placeable item as a [[scarecrow]] with two new [[Modding:Context tags|context tags]]:
+
You can now mark any placeable item as a [[scarecrow]] with two new [[Modding:Items#Context tags|context tags]]:
    
{| class="wikitable"
 
{| class="wikitable"
Line 843: Line 861:     
===Improved map seats===
 
===Improved map seats===
When defining map seats via <samp>Data\ChairTiles</samp> (see [[Modding:Migrate to Stardew Valley 1.5#Sitting on non-furniture chairs|docs in the 1.5 migration guide]]), you can now set the type field to <samp>custom {{t|offset_x}} {{t|offset_y}} {{t|extra_height}}</samp> to override the hardcoded offset and height values in code. The three values are measured in tiles (''e.g.'', an X offset value of 0.5 would shift the sitting location by half a tile).
+
{{main article|Modding:Maps#Sitting on non-furniture chairs}}
 +
 
 +
When defining map seats via <samp>Data\ChairTiles</samp> (see [[Modding:Migrate to Stardew Valley 1.5#Sitting on non-furniture chairs|docs in the 1.5 migration guide]]), you can now set the type field to <samp>custom {{t|offset_x}} {{t|offset_y}} {{t|extra_height}}</samp> to override the hardcoded offset and height values in code. The three values are measured in tiles (''e.g.,'' an X offset value of 0.5 would shift the sitting location by half a tile).
    
==See also==
 
==See also==
Line 850: Line 870:  
[[Category:Modding]]
 
[[Category:Modding]]
    +
[[es:Modding:Migrar a Stardew Valley 1.5.5]]
 
[[zh:模组:迁移至游戏本体1.5.5]]
 
[[zh:模组:迁移至游戏本体1.5.5]]

Navigation menu