Difference between revisions of "Modding:Migrate to Stardew Valley 1.5"

From Stardew Valley Wiki
Jump to navigation Jump to search
 
(14 intermediate revisions by 2 users not shown)
Line 10: Line 10:
 
In split-screen mode…
 
In split-screen mode…
  
* '''Each screen runs within the same game instance'''. The game automatically swaps the game state for the current player, but in-memory data from mods will be shared between all screens. You can wrap fields with SMAPI's [[Modding:Modder Guide/APIs/Utilities#Per-screen data|<tt>PerScreen&lt;T&gt;</tt>]] to have separate values for each player.
+
* '''Each screen runs within the same game instance'''. The game automatically swaps the game state for the current player, but in-memory data from mods will be shared between all screens. You can wrap fields with SMAPI's [[Modding:Modder Guide/APIs/Utilities#Per-screen data|<samp>PerScreen&lt;T&gt;</samp>]] to have separate values for each player.
* '''Each screen has its own events''' (except <tt>GameLoop.GameLaunched</tt>). For example, with two active screens the <tt>GameLoop.UpdateTicked</tt> event happens twice per tick (120/second instead of 60/second). You can use <tt>Context</tt> fields if you need to check which player it is (like <tt>IsMainPlayer</tt>, <tt>IsSplitScreen</tt>, <tt>IsOnHostComputer</tt>, or <tt>PlayerIndex</tt>).
+
* '''Each screen has its own events''' (except <samp>GameLoop.GameLaunched</samp>). For example, with two active screens the <samp>GameLoop.UpdateTicked</samp> event happens twice per tick (120/second instead of 60/second). You can use <samp>Context</samp> fields if you need to check which player it is (like <samp>IsMainPlayer</samp>, <samp>IsSplitScreen</samp>, <samp>IsOnHostComputer</samp>, or <samp>PlayerIndex</samp>).
 
* '''Multiplayer limitations still apply for split-screen farmhands''', since split-screen is just normal multiplayer under the hood. For example, even though they're running on the host computer, split-screen farmhands can only access synced locations (unless you manually access the host's stashed state). The exception is SMAPI's save data API, which does work for farmhands on the host computer (but not remote farmhands).
 
* '''Multiplayer limitations still apply for split-screen farmhands''', since split-screen is just normal multiplayer under the hood. For example, even though they're running on the host computer, split-screen farmhands can only access synced locations (unless you manually access the host's stashed state). The exception is SMAPI's save data API, which does work for farmhands on the host computer (but not remote farmhands).
* <tt>Context.IsMultiplayer</tt> returns true for split-screen multiplayer. You can use more specific fields like <tt>IsSplitScreen</tt>, <tt>HasRemotePlayers</tt>, or <tt>IsOnHostComputer</tt> if needed.
+
* <samp>Context.IsMultiplayer</samp> returns true for split-screen multiplayer. You can use more specific fields like <samp>IsSplitScreen</samp>, <samp>HasRemotePlayers</samp>, or <samp>IsOnHostComputer</samp> if needed.
  
===Custom item data===
+
===Custom mod data===
Each <tt>Character</tt>, <tt>GameLocation</tt>, <tt>Item</tt>, and <tt>TerrainFeature</tt> instance now has a <tt>modData</tt> dictionary field, which is persisted to the save file and synchronized in multiplayer. This can be used to store arbitrary mod data, including on the player itself via <tt>Game1.player.modData</tt>.
+
Each <samp>Character</samp>, <samp>GameLocation</samp>, <samp>Item</samp>, and <samp>TerrainFeature</samp> instance now has a <samp>modData</samp> dictionary field, which is persisted to the save file and synchronized in multiplayer. This can be used to store arbitrary mod data, including on the player itself via <samp>Game1.player.modData</samp>.
  
When you split an item stack, the new stack copies the previous one's mod data; when merged into another stack, the merged items adopt the target stack's mod data. Otherwise mod data has no effect on item split/merge logic (e.g. you can still merge items with different mod data), unless overridden by a Harmony patch.
+
When you split an item stack, the new stack copies the previous one's mod data; when merged into another stack, the merged items adopt the target stack's mod data. Otherwise mod data has no effect on item split/merge logic (''e.g.,'' you can still merge items with different mod data), unless overridden by a Harmony patch.
  
 
'''Note:''' to avoid mod conflicts, prefixing data fields with your mod ID is strongly recommended:
 
'''Note:''' to avoid mod conflicts, prefixing data fields with your mod ID is strongly recommended:
Line 35: Line 35:
 
:* menus;
 
:* menus;
 
:* HUD elements;
 
:* HUD elements;
:* SMAPI's <tt>RenderingActiveMenu</tt> and <tt>RenderedActiveMenu</tt> events;
+
:* SMAPI's <samp>RenderingActiveMenu</samp> and <samp>RenderedActiveMenu</samp> events;
:* SMAPI's <tt>Rendering</tt> and <tt>Rendered</tt> events in some contexts (check <tt>Game1.uiMode</tt>).
+
:* SMAPI's <samp>Rendering</samp> and <samp>Rendered</samp> events in some contexts (check <samp>Game1.uiMode</samp>).
  
 
: This does ''not'' affect…
 
: This does ''not'' affect…
:* the <tt>draw</tt> method for map objects, furniture, crops, etc placed in the world;
+
:* the <samp>draw</samp> method for map objects, furniture, crops, etc placed in the world;
 
:* code which only uses tile coordinates (not pixel coordinates).
 
:* code which only uses tile coordinates (not pixel coordinates).
  
: You can test your mod by setting the zoom to maximum and the UI scale to minimum (i.e. have them at different values) or vice versa; in particular check any logic which handles pixel positions, like menus clicking. If everything looks fine, you can skip the rest of this section.
+
: You can test your mod by setting the zoom to maximum and the UI scale to minimum (''i.e.,'' have them at different values) or vice versa; in particular check any logic which handles pixel positions, like menus clicking. If everything looks fine, you can skip the rest of this section.
  
 
; What does this mean for affected mods?
 
; What does this mean for affected mods?
  
 
:* This introduces two UI-adjusted pixel [[Modding:Modder Guide/Game Fundamentals#Positions|coordinate systems]], one for absolute positions (relative to the top-left corner of the map) and one for screen positions (relative to the top-left corner of the screen). You should be careful not to mix them to avoid tricky calculations; for example, do all your work in one coordinate system and then convert them once.
 
:* This introduces two UI-adjusted pixel [[Modding:Modder Guide/Game Fundamentals#Positions|coordinate systems]], one for absolute positions (relative to the top-left corner of the map) and one for screen positions (relative to the top-left corner of the screen). You should be careful not to mix them to avoid tricky calculations; for example, do all your work in one coordinate system and then convert them once.
:* The game now has two distinct draw modes depending on the context: ''UI mode'' and ''non-UI mode''. You can check <tt>Game1.uiMode</tt> to know which mode is active. This affects which of the coordinate systems should be used to draw to the screen.<p>When drawing UI, you can indicate to the game that you want to use UI scaling. This has minimal performance impact if the game is already in UI mode, but you should avoid doing it unnecessarily if you know the code will always run in non-UI mode.</p><syntaxhighlight lang="c#">Game1.game1.InUIMode(() =>
+
:* The game now has two distinct draw modes depending on the context: ''UI mode'' and ''non-UI mode''. You can check <samp>Game1.uiMode</samp> to know which mode is active. This affects which of the coordinate systems should be used to draw to the screen.<p>When drawing UI, you can indicate to the game that you want to use UI scaling. This has minimal performance impact if the game is already in UI mode, but you should avoid doing it unnecessarily if you know the code will always run in non-UI mode.</p><syntaxhighlight lang="c#">Game1.game1.InUIMode(() =>
 
{
 
{
 
   // your UI draw code here
 
   // your UI draw code here
Line 55: Line 55:
 
; How do I update affected code?
 
; How do I update affected code?
  
:* Drawing something into the game world (e.g. a tile overlay) in UI mode will make things much more difficult. Consider drawing outside UI mode instead, e.g. by switching from SMAPI's <tt>Rendered</tt> event to <tt>RenderedWorld</tt>.
+
:* Drawing something into the game world (''e.g.,'' a tile overlay) in UI mode will make things much more difficult. Consider drawing outside UI mode instead, ''e.g.,'' by switching from SMAPI's <samp>Rendered</samp> event to <samp>RenderedWorld</samp>.
 
:* Be very careful about mixed coordinate systems. For example, a menu constructed outside the draw loop may initialize coordinates in non-UI mode, then handle clicks in UI mode. You may need to convert values to non-UI coordinates to check them in that case (see conversions below).
 
:* Be very careful about mixed coordinate systems. For example, a menu constructed outside the draw loop may initialize coordinates in non-UI mode, then handle clicks in UI mode. You may need to convert values to non-UI coordinates to check them in that case (see conversions below).
:* When drawing UI, in most cases you should replace <tt>Game1.viewport</tt> with <tt>Game1.uiViewport</tt>. These provide UI-adjusted pixel positions. '''Don't''' do this if you'll be adjusting the positions for UI scaling separately (see below), since double-conversion will give you incorrect results.
+
:* When drawing UI, in most cases you should replace <samp>Game1.viewport</samp> with <samp>Game1.uiViewport</samp>. These provide UI-adjusted pixel positions. '''Don't''' do this if you'll be adjusting the positions for UI scaling separately (see below), since double-conversion will give you incorrect results.
 
:* If you adjust pixel positions manually, see conversions below.
 
:* If you adjust pixel positions manually, see conversions below.
  
Line 78: Line 78:
  
 
===Chest inventory===
 
===Chest inventory===
Using <tt>chest.items</tt> and <tt>Chest.capacity</tt> to access chest inventory won't handle special cases like the [[Junimo Chest]] or [[Mini-Shipping Bin]]. Instead you should use <tt>chest.GetItemsForPlayer</tt> to get the item list, and <tt>chest.GetActualCapacity()</tt> to get the max capacity.
+
Using <samp>chest.items</samp> and <samp>Chest.capacity</samp> to access chest inventory won't handle special cases like the [[Junimo Chest]] or [[Mini-Shipping Bin]]. Instead you should use <samp>chest.GetItemsForPlayer</samp> to get the item list, and <samp>chest.GetActualCapacity()</samp> to get the max capacity.
  
 
===Paint buildings===
 
===Paint buildings===
Line 86: Line 86:
  
 
The feature is based on two files:
 
The feature is based on two files:
* <tt>Data/PaintData</tt> lists the buildings which can be painted, the group names shown in the UI, and the relative ranges for the brightness slider. More info from the game developers: {{quote|To explain: the hue and saturation values are applied as is, but the brightness value is actually tracked as a "relative" brightness, i.e. a value halfway through the slider bar actually corresponds to a value that's lerped halfway between the lowest acceptable brightness and highest acceptable brightness.
+
* <samp>Data/PaintData</samp> lists the buildings which can be painted, the group names shown in the UI, and the relative ranges for the brightness slider. More info from the game developers: {{quote|To explain: the hue and saturation values are applied as is, but the brightness value is actually tracked as a "relative" brightness, ''i.e.,'' a value halfway through the slider bar actually corresponds to a value that's lerped halfway between the lowest acceptable brightness and highest acceptable brightness.
  
 
This is so that a single paint color will look generally the same when applied across multiple buildings, and is also used to ensure brightness values that are overbright or too dark aren't usable as they generally look bad. This is also used to prevent values that shade in weird ways.}}
 
This is so that a single paint color will look generally the same when applied across multiple buildings, and is also used to ensure brightness values that are overbright or too dark aren't usable as they generally look bad. This is also used to prevent values that shade in weird ways.}}
* Each paintable building also has a separate mask texture, like <tt>Buildings/Stable_PaintMask</tt> for the stable. The masks use three predefined colors: green (roof), blue (trim), and red (walls) matching the order in <tt>Data/PaintData</tt> (other colors are ignored). Groups don't need to be contiguous (e.g. you can have separate red areas).  
+
* Each paintable building also has a separate mask texture, like <samp>Buildings/Stable_PaintMask</samp> for the stable. The masks use three predefined colors: green (roof), blue (trim), and red (walls) matching the order in <samp>Data/PaintData</samp> (other colors are ignored). Groups don't need to be contiguous (''e.g.,'' you can have separate red areas).  
  
 
===Other breaking changes===
 
===Other breaking changes===
* The game's <tt>NetCollection&lt;T&gt;</tt> enumerator changed in a way that SMAPI can't easily rewrite. Affected mods only need to be recompiled to fix it.
+
* The game's <samp>NetCollection&lt;T&gt;</samp> enumerator changed in a way that SMAPI can't easily rewrite. Affected mods only need to be recompiled to fix it.
* The <tt>IsTileLocationOpen</tt> and <tt>isTileLocationOpenIgnoreFrontLayers</tt> methods now take tile coordinates instead of pixel coordinates.
+
* The <samp>IsTileLocationOpen</samp> and <samp>isTileLocationOpenIgnoreFrontLayers</samp> methods now take tile coordinates instead of pixel coordinates.
* Bundles can now be randomized, so you should read data from <tt>Game1.netWorldState.Value.BundleData</tt> instead of loading the <tt>Data\Bundles</tt> asset.
+
* Bundles can now be randomized, so you should read data from <samp>Game1.netWorldState.Value.BundleData</samp> instead of loading the <samp>Data\Bundles</samp> asset.
* The game now has per-location seasons/weather to support the Fern Islands. In many cases you may need to use methods like <tt>Game1.GetSeasonForLocation</tt>, <tt>Game1.IsRainingHere</tt>, etc instead of accessing the values like <tt>Game1.currentSeason</tt> directly.
+
* The game now has per-location seasons/weather to support the Fern Islands. In many cases you may need to use methods like <samp>Game1.GetSeasonForLocation</samp>, <samp>Game1.IsRainingHere</samp>, etc instead of accessing the values like <samp>Game1.currentSeason</samp> directly.
  
 
===Other notable changes===
 
===Other notable changes===
Line 103: Line 103:
 
* See ''[[#For Content Patcher packs|For Content Patcher packs]]'' for content changes.
 
* See ''[[#For Content Patcher packs|For Content Patcher packs]]'' for content changes.
 
* Location changes:
 
* Location changes:
** All locations can now have furniture, resource clumps, and <tt>getWalls()</tt>.
+
** All locations can now have furniture, resource clumps, and <samp>getWalls()</samp>.
 
** The greenhouse is now always synced to farmhands in multiplayer.
 
** The greenhouse is now always synced to farmhands in multiplayer.
** Some furniture can now be placed outdoors or outside the farm (based on <tt>furniture.placementRestriction</tt>).
+
** Some furniture can now be placed outdoors or outside the farm (based on <samp>furniture.placementRestriction</samp>).
** Added <tt>location.treatAsOutdoors</tt> field.
+
** Added <samp>location.treatAsOutdoors</samp> field.
** Added <tt>LightSource.fishTankLight</tt> light source type, matching <tt>LooseSprites\Lighting\fishTankLight</tt>.
+
** Added <samp>LightSource.fishTankLight</samp> light source type, matching <samp>LooseSprites\Lighting\fishTankLight</samp>.
* New <tt>Utility</tt> methods:
+
* New <samp>Utility</samp> methods:
** <tt>ModifyTime</tt>: perform simple time calculations like <tt>ModifyTime(1250, 10) == 1300</tt>;
+
** <samp>ModifyTime</samp>: perform simple time calculations like <samp>ModifyTime(1250, 10) == 1300</samp>;
** <tt>AOrAn</tt>;
+
** <samp>AOrAn</samp>;
** <tt>ConvertMinutesToTime</tt>;
+
** <samp>ConvertMinutesToTime</samp>;
** <tt>forAllLocations</tt>;
+
** <samp>forAllLocations</samp>;
** <tt>getNumObjectsOfIndexWithinRectangle</tt>;
+
** <samp>getNumObjectsOfIndexWithinRectangle</samp>;
** <tt>fuzzyAnimalSearch</tt>;
+
** <samp>fuzzyAnimalSearch</samp>;
** <tt>getRandomBasicSeasonalForageItem</tt>;
+
** <samp>getRandomBasicSeasonalForageItem</samp>;
** <tt>HasAnyPlayerSeenSecretNote</tt>;
+
** <samp>HasAnyPlayerSeenSecretNote</samp>;
** <tt>RGBtoHSL</tt>, <tt>HSLtoRGB</tt>, <tt>QQHtoRGB</tt>;
+
** <samp>RGBtoHSL</samp>, <samp>HSLtoRGB</samp>, <samp>QQHtoRGB</samp>;
** <tt>ModifyCoordinateFromUIScale</tt>, <tt>ModifyCoordinatesFromUIScale</tt>, <tt>ModifyCoordinateForUIScale</tt>, <tt>ModifyCoordinatesForUIScale</tt>;
+
** <samp>ModifyCoordinateFromUIScale</samp>, <samp>ModifyCoordinatesFromUIScale</samp>, <samp>ModifyCoordinateForUIScale</samp>, <samp>ModifyCoordinatesForUIScale</samp>;
** <tt>IsHospitalVisitDay</tt>.
+
** <samp>IsHospitalVisitDay</samp>.
* New <tt>Farm</tt> methods:
+
* New <samp>Farm</samp> methods:
** <tt>doesFarmCaveNeedHarvesting</tt>;
+
** <samp>doesFarmCaveNeedHarvesting</samp>;
** <tt>getTotalCrops</tt>;
+
** <samp>getTotalCrops</samp>;
** <tt>getTotalCropsReadyforHarvest</tt>;
+
** <samp>getTotalCropsReadyforHarvest</samp>;
** <tt>getTotalGreenouseCropsReadyForHarvest</tt>;
+
** <samp>getTotalGreenouseCropsReadyForHarvest</samp>;
** <tt>getGreenhouseBuilding</tt>;
+
** <samp>getGreenhouseBuilding</samp>;
** <tt>getTotalOpenHoeDirt</tt>;
+
** <samp>getTotalOpenHoeDirt</samp>;
** <tt>getTotalForageItems</tt>;
+
** <samp>getTotalForageItems</samp>;
** <tt>getNumberOfMachinesReadyForHarvest</tt>.
+
** <samp>getNumberOfMachinesReadyForHarvest</samp>.
* New <tt>Furniture.GetFurnitureInstance</tt> method to create furniture without needing to hardcode the separate types for TVs, etc.
+
* New <samp>Furniture.GetFurnitureInstance</samp> method to create furniture without needing to hardcode the separate types for TVs, etc.
* <tt>Farmer</tt> changes:
+
* <samp>Farmer</samp> changes:
** <tt>Farmer.addItemToInventory</tt> now returns a list of item stacks in the player's inventory to which items were added.
+
** <samp>Farmer.addItemToInventory</samp> now returns a list of item stacks in the player's inventory to which items were added.
* <tt>Game1</tt> changes:
+
* <samp>Game1</samp> changes:
** Added <tt>Game1.setMousePosition</tt>.
+
** Added <samp>Game1.setMousePosition</samp>.
* Changed <tt>Utility.GetPrismaticColor</tt> to take an optional speed multiplier.
+
* Changed <samp>Utility.GetPrismaticColor</samp> to take an optional speed multiplier.
* Added <tt>Farmer.IsBusyDoingSomething()</tt> method.
+
* Added <samp>Farmer.IsBusyDoingSomething()</samp> method.
* Added a new <tt>LikeLevel</tt> enum for gift tastes.
+
* Added a new <samp>LikeLevel</samp> enum for gift tastes.
 
* Dialogue changes:
 
* Dialogue changes:
** You can now specify a custom portrait texture when calling <tt>Game1.drawDialogue</tt>.
+
** You can now specify a custom portrait texture when calling <samp>Game1.drawDialogue</samp>.
** You can now set <tt>dialogue.onFinish</tt> to do something when the dialogue closes.
+
** You can now set <samp>dialogue.onFinish</samp> to do something when the dialogue closes.
* Added <tt>object.isEssentialItem()</tt>, which prevents the item from sinking and considers the player always in range for magnetism.
+
* Added <samp>object.isEssentialItem()</samp>, which prevents the item from sinking and considers the player always in range for magnetism.
* Added <tt>Debris.DebrisType</tt> field (<tt>ARCHAEOLOGY</tt> or <tt>OBJECT</tt>).
+
* Added <samp>Debris.DebrisType</samp> field (<samp>ARCHAEOLOGY</samp> or <samp>OBJECT</samp>).
* Added <tt>Event.eventPositionTileOffset</tt> field, which adjusts any tile positions referenced by event by the specified amount. For example, this is used to offset farm events to match the farmhouse position. This is ignored if the event has the <tt>ignoreEventTileOffset</tt> command. (Some hardcoded sprite positions aren't adjusted.)
+
* Added <samp>Event.eventPositionTileOffset</samp> field, which adjusts any tile positions referenced by event by the specified amount. For example, this is used to offset farm events to match the farmhouse position. This is ignored if the event has the <samp>ignoreEventTileOffset</samp> command. (Some hardcoded sprite positions aren't adjusted.)
  
 
===Debug command changes===
 
===Debug command changes===
This section is mainly intended for wiki maintainers; see [[Modding:Debug commands]] for the general documentation.
+
This section is mainly intended for wiki maintainers; see [[Modding:Console commands]] for the general documentation.
  
 
* Added commands:
 
* Added commands:
** <tt>boatjourney</tt>: start the BoatJourney minigame.
+
** <samp>boatjourney</samp>: start the BoatJourney minigame.
** <tt>bpm</tt>: show the building painting menu for the building immediately north of the player, or for the farmhouse if no such building is found.
+
** <samp>bpm</samp>: show the building painting menu for the building immediately north of the player, or for the farmhouse if no such building is found.
** <tt>broadcastMailbox</tt>: send a given letter ID to all players and adds it retroactively to any players who join the game afterwards.
+
** <samp>broadcastMailbox</samp>: send a given letter ID to all players and adds it retroactively to any players who join the game afterwards.
** <tt>completespecialorders</tt> / <tt>cso</tt>: marks every objective for every open special order complete.
+
** <samp>completespecialorders</samp> / <samp>cso</samp>: marks every objective for every open special order complete.
** <tt>crib</tt>: change crib style in the farmhouse.
+
** <samp>crib</samp>: change crib style in the farmhouse.
** <tt>darts</tt>: start the darts minigame.
+
** <samp>darts</samp>: start the darts minigame.
** <tt>forge</tt>: show the forge menu.
+
** <samp>forge</samp>: show the forge menu.
** <tt>gem</tt>: add the specified number of Qi gems to the player.
+
** <samp>gem</samp>: add the specified number of Qi gems to the player.
** <tt>language</tt>: show the language selection screen.
+
** <samp>language</samp>: show the language selection screen.
** <tt>minedifficulty</tt> / <tt>md</tt> and <tt>skullcavedifficulty</tt> / <tt>scd</tt>: change the mine or skull cavern difficulty level.
+
** <samp>minedifficulty</samp> / <samp>md</samp> and <samp>skullcavedifficulty</samp> / <samp>scd</samp>: change the mine or skull cavern difficulty level.
** <tt>ordersboard</tt>: show the special orders board.
+
** <samp>ordersboard</samp>: show the special orders board.
** <tt>pathspousetome</tt> / <tt>pstm</tt>: warp or path the player's spouse spouse to the player.
+
** <samp>pathspousetome</samp> / <samp>pstm</samp>: warp or path the player's spouse spouse to the player.
** <tt>perfection</tt>: makes changes needed for 100% game completion (e.g. max all friendships, mark all fish caught, etc).
+
** <samp>perfection</samp>: makes changes needed for 100% game completion (''e.g.,'' max all friendships, mark all fish caught, etc).
** <tt>pgb</tt>: prints the solution to the island gem bird shrine puzzle.
+
** <samp>pgb</samp>: prints the solution to the island gem bird shrine puzzle.
** <tt>phone</tt>: show the telephone menu.
+
** <samp>phone</samp>: show the telephone menu.
** <tt>printPlayerPosition</tt> /  <tt>ppp</tt>:
+
** <samp>printPlayerPosition</samp> /  <samp>ppp</samp>:
** <tt>qiboard / qi</tt>: show a special orders board for Mr. Qi.
+
** <samp>qiboard / qi</samp>: show a special orders board for Mr. Qi.
** <tt>recountnuts</tt>: resets the player’s walnut count to its expected value given walnuts found and spent. Will likely be removed on launch.
+
** <samp>recountnuts</samp>: resets the player’s walnut count to its expected value given walnuts found and spent. Will likely be removed on launch.
** <tt>renovate</tt>: show the house renovation menu.
+
** <samp>renovate</samp>: show the house renovation menu.
** <tt>returneddonations</tt>: open the returned donations UI.
+
** <samp>returneddonations</samp>: open the returned donations UI.
** <tt>runtestevent</tt> / <tt>rte</tt>: read an event from a <tt>test_event.txt</tt> file in the game folder, and start the event. The first line of the file is the location the event takes place, and the rest of the contents of the file are the same as a normal event file, except line breaks will be treated as ‘\’ delimiters.
+
** <samp>runtestevent</samp> / <samp>rte</samp>: read an event from a <samp>test_event.txt</samp> file in the game folder, and start the event. The first line of the file is the location the event takes place, and the rest of the contents of the file are the same as a normal event file, except line breaks will be treated as ‘\’ delimiters.
** <tt>showplurals</tt>: prints a list of the plural forms for each item name and lexicon term.
+
** <samp>showplurals</samp>: prints a list of the plural forms for each item name and lexicon term.
** <tt>shufflebundles</tt>: randomise bundles.
+
** <samp>shufflebundles</samp>: randomise bundles.
** <tt>specialorder</tt>: adds the special order with the matching ID to the active special orders list.
+
** <samp>specialorder</samp>: adds the special order with the matching ID to the active special orders list.
** <tt>split</tt>: start split-screen mode or add players.
+
** <samp>split</samp>: start split-screen mode or add players.
** <tt>testnut</tt>: spawn a golden walnut at (0, 0)?
+
** <samp>testnut</samp>: spawn a golden walnut at (0, 0)?
** <tt>tls</tt>: toggle between scaled and unscaled lighting.
+
** <samp>tls</samp>: toggle between scaled and unscaled lighting.
** <tt>townkey</tt>: give the current player the [[Key To The Town]].
+
** <samp>townkey</samp>: give the current player the [[Key To The Town]].
** <tt>uiscale</tt> / <tt>us</tt>: set a new UI scale.
+
** <samp>uiscale</samp> / <samp>us</samp>: set a new UI scale.
** <tt>volcano</tt>: warp player to specified level of the volcano dungeon.
+
** <samp>volcano</samp>: warp player to specified level of the volcano dungeon.
** <tt>walnut</tt>: add a specified number of golden walnuts for the player team.
+
** <samp>walnut</samp>: add a specified number of golden walnuts for the player team.
** <tt>warpanimaltome</tt> / <tt>watm</tt>: find a named animal and warp it to player.
+
** <samp>warpanimaltome</samp> / <samp>watm</samp>: find a named animal and warp it to player.
** <tt>warpcharactertome</tt> / <tt>wctm</tt>: find a named character and warp them to the player.
+
** <samp>warpcharactertome</samp> / <samp>wctm</samp>: find a named character and warp them to the player.
 
* Command changes:
 
* Command changes:
** <tt>marry</tt>: fixed issue when NPC hasn't been met?
+
** <samp>marry</samp>: fixed issue when NPC hasn't been met?
** <tt>minigame</tt>: added 'fishing' option.
+
** <samp>minigame</samp>: added 'fishing' option.
** <tt>invincible</tt>: added 'gm' and 'inv' aliases.
+
** <samp>invincible</samp>: added 'gm' and 'inv' aliases.
  
 
==For Content Patcher packs==
 
==For Content Patcher packs==
Line 191: Line 191:
  
 
* See ''[[#Update impact|update impact]]'' below.
 
* See ''[[#Update impact|update impact]]'' below.
 +
 +
===Home renovations===
 +
Stardew Valley 1.5 adds [[Carpenter's Shop#House Renovations|house renovations]]. Mods can add or change removations by editing the <samp>Data/HomeRenovations</samp> asset. This consists of a string → model lookup, where the asset key is a unique renovation ID. The asset value is a model with these fields:
 +
 +
{| class="wikitable"
 +
|-
 +
! field
 +
! effect
 +
|-
 +
| <samp>TextStrings</samp>
 +
| A translation key in the form <samp>{{t|asset name}}:{{t|key}}</samp> (like <samp>Strings\\Locations:ScienceHouse_Renovation_BuildCrib</samp>). The translation text should contain three slash-delimited fields:
 +
{| class="wikitable"
 +
|-
 +
! index
 +
! effect
 +
|-
 +
| 0
 +
| The translated display name shown in the renovation menu.
 +
|-
 +
| 1
 +
| The translated description shown in the renovation menu.
 +
|-
 +
| 2
 +
| The message shown to ask the player which area to renovate.
 +
|}
 +
For example, the vanilla 'remove crib' matches a translation in this format:
 +
<pre>"Remove Crib/Remove the crib from your home./Select a crib to remove."</pre>
 +
|-
 +
| <samp>Requirements</samp>
 +
| The criteria that must match for the renovation to appear as an option. This consists of a list of models with these fields:
 +
{| class="wikitable"
 +
|-
 +
! field
 +
! effect
 +
|-
 +
| <samp>Type</samp>
 +
| The requirement type. This can be <samp>Mail</samp> (check if the player has the given [[Modding:Mail data#Mail flags|mail flag]]) or <samp>Value</samp> (check the value of a C# <samp>NetInt</samp> field on the farmhouse instance). Any other type always returns true.
 +
|-
 +
| <samp>Key</samp>
 +
| &#32;
 +
* For a <samp>Mail</samp> requirement, the mail flag.
 +
* For a <samp>Value</samp> requirement, the C# <samp>NetInt</samp> field name.
 +
|-
 +
| <samp>Value</samp>
 +
| &#32;
 +
* For a <samp>Mail</samp> requirement, <samp>"0"</samp> (player must ''not'' have the flag) or <samp>"1"</samp> (player must have it).
 +
* For a <samp>Value</samp> requirement, the required field value. The value can be prefixed with <samp>!</samp> to require any value ''except'' this one.
 +
|}
 +
 +
For example, <code>"Key": "renovation_bedroom_open", "Value": "1"</code> matches if the player has the <samp>renovation_bedroom_open</samp> mail flag.
 +
|-
 +
| <samp>RenovateActions</samp>
 +
| The actions to perform after the renovation is applied. This consists of a list of models with these fields:
 +
{| class="wikitable"
 +
|-
 +
! field
 +
! effect
 +
|-
 +
| <samp>Type</samp>
 +
| The action type. This can be <samp>Mail</samp> (add or remove a [[Modding:Mail data#Mail flags|mail flag]]) or <samp>Value</samp> (set the value of a C# field on the farmhouse instance). Any other type is ignored.
 +
|-
 +
| <samp>Key</samp>
 +
| &#32;
 +
* For a <samp>Mail</samp> requirement, the mail flag to add or remove.
 +
* For a <samp>Value</samp> requirement, the C# <samp>NetInt</samp> field name.
 +
|-
 +
| <samp>Value</samp>
 +
| &#32;
 +
* For a <samp>Mail</samp> requirement, either <samp>"0"</samp> (remove the mail flag) or <samp>"1"</samp> (add it).
 +
* For a <samp>Value</samp> requirement, either the integer value to set, or the exact string <samp>"selected"</samp> to set it to the index of the applied renovation.
 +
|}
 +
|-
 +
| <samp>RectGroups</samp>
 +
| The tile areas within the farmhouse where the renovation can be placed.
 +
|-
 +
| <samp>AnimationType</samp>
 +
| ''(Optional)'' The animation to play when the renovation is applied. The possible values are <samp>destroy</samp> or <samp>build</samp>. Any other value defaults to <samp>build</samp>.
 +
|-
 +
| <samp>CheckForObstructions</samp>
 +
| ''(Optional)'' Whether to prevent the player from applying the renovations if there are any players, NPCs, items, etc within the target area. Default false.
 +
|-
 +
| <samp>SpecialRect</samp>
 +
| ''(Optional)'' A dynamic area to add to the <samp>RectGroups</samp> field. The only supported value is <samp>crib</samp>, which is the farmhouse area containing the cribs.
 +
|}
 +
 +
For example, this content pack redefines one of the vanilla home renovations:
 +
 +
{{#tag:syntaxhighlight|<nowiki>
 +
{
 +
    "Format": "</nowiki>{{Content Patcher version}}<nowiki>",
 +
    "Changes": [
 +
        {
 +
            "Action": "EditData",
 +
            "Target": "Data/HomeRenovations",
 +
            "Entries": {
 +
                "open_bedroom": {
 +
                    "TextStrings": "Strings\\Locations:ScienceHouse_Renovation_OpenBedroom",
 +
                    "AnimationType": "destroy",
 +
                    "CheckForObstructions": true,
 +
                    "Requirements": [
 +
                        {
 +
                            "Type": "Mail",
 +
                            "Key": "renovation_bedroom_open",
 +
                            "Value": "0"
 +
                        }
 +
                    ],
 +
                    "RenovateActions": [
 +
                        {
 +
                            "Type": "Mail",
 +
                            "Key": "renovation_bedroom_open",
 +
                            "Value": "1"
 +
                        }
 +
                    ],
 +
                    "RectGroups": [
 +
                        {
 +
                            "Rects": [
 +
                                { "X": 21, "Y": 10, "Width": 2, "Height": 8 },
 +
                                { "X": 21, "Y": 19, "Width": 2, "Height": 1 }
 +
                            ]
 +
                        }
 +
                    ]
 +
                }
 +
        }
 +
    ]
 +
}</nowiki>|lang=javascript}}
  
 
===Special orders===
 
===Special orders===
1.5 adds a new 'special orders' quest system which is much more flexible and supports custom quests. You can add special orders to <tt>Data/SpecialOrders</tt> with options like duration, repeatability, objectives, and rewards etc. Each order can have any number of objectives of predefined types (<tt>Collect</tt>, <tt>Deliver</tt>, <tt>Fish</tt>, <tt>Gift</tt>, <tt>JKScore</tt>, <tt>ReachMineFloor</tt>, <tt>Ship</tt>, <tt>Slay</tt>) and rewards (<tt>Friendship</tt>, <tt>Gems</tt>, <tt>Mail</tt>, <tt>Money</tt>, <tt>ResetEvent</tt>). The <tt>Mail</tt> reward sets a mail flag, which can be used to trigger custom events, dialogue, or other changes.
+
1.5 adds a new 'special orders' quest system which is much more flexible and supports custom quests. You can add special orders to <samp>Data/SpecialOrders</samp> with options like duration, repeatability, objectives, and rewards etc. Each order can have any number of objectives of predefined types (<samp>Collect</samp>, <samp>Deliver</samp>, <samp>Fish</samp>, <samp>Gift</samp>, <samp>JKScore</samp>, <samp>ReachMineFloor</samp>, <samp>Ship</samp>, <samp>Slay</samp>) and rewards (<samp>Friendship</samp>, <samp>Gems</samp>, <samp>Mail</samp>, <samp>Money</samp>, <samp>ResetEvent</samp>). The <samp>Mail</samp> reward sets a mail flag, which can be used to trigger custom events, dialogue, or other changes.
  
 
===Dialogue changes===
 
===Dialogue changes===
* Added dialogue keys related to the resort area on the islands (keys starting with <tt>Resort</tt>).
+
* Added dialogue keys related to the resort area on the islands (keys starting with <samp>Resort</samp>).
* Added <tt>%year</tt> placeholder.
+
* Added <samp>%year</samp> placeholder.
  
 
===Event changes===
 
===Event changes===
* Tile positions in farm events are now offset to match the farmhouse position automatically. If an event shouldn't be based on the farmhouse position, add an <tt>ignoreEventTileOffset</tt> command to disable the offset for that event. (Some hardcoded sprite positions aren't adjusted.)
+
* Tile positions in farm events are now offset to match the farmhouse position automatically. If an event shouldn't be based on the farmhouse position, add an <samp>ignoreEventTileOffset</samp> command to disable the offset for that event. (Some hardcoded sprite positions aren't adjusted.)
 
* NPCs and players in events now walk through obstacles by default, instead of getting stuck.
 
* NPCs and players in events now walk through obstacles by default, instead of getting stuck.
 
* New event commands:
 
* New event commands:
** <tt>animateHeight</tt>: something about jumping.
+
** <samp>animateHeight</samp>: something about jumping.
** <tt>changeName</tt>: change the display name for an actor.
+
** <samp>changeName</samp>: change the display name for an actor.
** <tt>drawOffset</tt>: set the draw offset for a farmer or named NPC.
+
** <samp>drawOffset</samp>: set the draw offset for a farmer or named NPC.
** <tt>hideShadow</tt>: hide the shadow for a named NPC.
+
** <samp>hideShadow</samp>: hide the shadow for a named NPC.
** <tt>ignoreEventTileOffset</tt>: disables event tile offsets for the remainder of the event.
+
** <samp>ignoreEventTileOffset</samp>: disables event tile offsets for the remainder of the event.
** <tt>ignoreMovementAnimation</tt>. Toggles a flag that allows NPCs to move without animating their walk animations (?).
+
** <samp>ignoreMovementAnimation</samp>. Toggles a flag that allows NPCs to move without animating their walk animations (?).
** <tt>hostMail</tt> option: add mail for tomorrow.
+
** <samp>hostMail</samp> option: add mail for tomorrow.
** <tt>locationSpecificCommand</tt>. used for some events, used just to call some location specific logic that’s hardcoded into some of the GameLocations.
+
** <samp>locationSpecificCommand</samp>. used for some events, used just to call some location specific logic that’s hardcoded into some of the GameLocations.
** <tt>playFramesAhead</tt>: skips specified number of commands.
+
** <samp>playFramesAhead</samp>: skips specified number of commands.
** <tt>showKissFrame</tt>;
+
** <samp>showKissFrame</samp>;
** <tt>unskippable</tt>: marks the event unskippable. This is used in conjunction with the skippable command for cases where the event should no longer be skippable after a certain point.
+
** <samp>unskippable</samp>: marks the event unskippable. This is used in conjunction with the skippable command for cases where the event should no longer be skippable after a certain point.
 
* Changed event commands:
 
* Changed event commands:
** <tt>addTemporaryActor</tt> can now set the actor's display name at the 8th index ("Character", "Animal", or "Monster").
+
** <samp>addTemporaryActor</samp> can now set the actor's display name at the 8th index ("Character", "Animal", or "Monster").
** <tt>awardFestivalPrize</tt>: added _birdiereward_ and _memento_ as options.
+
** <samp>awardFestivalPrize</samp>: added _birdiereward_ and _memento_ as options.
** <tt>fork</tt>: args changed somehow?
+
** <samp>fork</samp>: args changed somehow?
 
* Other command changes:
 
* Other command changes:
** Commands which start with <tt>--</tt> are now skipped. This is mainly meant for the <tt>runTestEvent</tt> command, to act as a comment.
+
** Commands which start with <samp>--</samp> are now skipped. This is mainly meant for the <samp>runTestEvent</samp> command, to act as a comment.
 
** When an event fails to parse a command, it now shows an error box and skips the rest of the event instead of crashing.
 
** When an event fails to parse a command, it now shows an error box and skips the rest of the event instead of crashing.
 
* New preconditions:
 
* New preconditions:
** <tt>N &lt;count></tt>: player has collected at least this many Golden Walnuts.
+
** <samp>N &lt;count></samp>: player has collected at least this many Golden Walnuts.
** <tt>B</tt>: the player's home has a spouse bed.
+
** <samp>B</samp>: the player's home has a spouse bed.
 
* New event options (editable by SMAPI mods):
 
* New event options (editable by SMAPI mods):
** <tt>ignoreObjectCollisions</tt>: whether NPCs/players should walk through obstacles instead of getting stuck. Default true.
+
** <samp>ignoreObjectCollisions</samp>: whether NPCs/players should walk through obstacles instead of getting stuck. Default true.
** <tt>showWorldCharacters</tt>: whether to draw NPCs which are in the same location as the event, even if they're not part of the event script. Default false.
+
** <samp>showWorldCharacters</samp>: whether to draw NPCs which are in the same location as the event, even if they're not part of the event script. Default false.
 
* New specific temporary sprites: doneWithSlideShow + getEndSlideshow, georgeLeekGift, grandpaThumbsUp, krobusraven, islandFishSplash, parrotHutSquawk, parrotPerchHut, staticSprite, WillyWad.
 
* New specific temporary sprites: doneWithSlideShow + getEndSlideshow, georgeLeekGift, grandpaThumbsUp, krobusraven, islandFishSplash, parrotHutSquawk, parrotPerchHut, staticSprite, WillyWad.
  
 
===Festival changes===
 
===Festival changes===
* Festivals can now have different versions per year. This works by adding a new <tt>set-up_y&lt;year&gt;</tt> field in the festival data (modulo with the current year), and/or <tt>&lt;npc>_y&lt;year&gt;</tt> dialogue keys for each NPC (like <tt>Abigail_y2</tt>).
+
: ''Main article: [[Modding:Festival data]].''
 +
 
 +
* Festivals can now have different versions per year. This works by adding a new <samp>set-up_y&lt;year&gt;</samp> field in the festival data (modulo with the current year), and/or <samp>&lt;npc>_y&lt;year&gt;</samp> dialogue keys for each NPC (like <samp>Abigail_y2</samp>).
 
* Custom NPCs can now be added to festivals by editing the festival data file (instead of patching them into the character sheet which is conflict-prone). The key is "Set-Up_additionalCharacters" (with that exact capitalization), and the value format is "NpcName X Y Direction" (where direction can be up/down/left/right or an integer code) delimited by "/".<p>For example, this safely adds a custom NPC to the Stardew Valley Fair using Content Patcher:</p><syntaxhighlight lang="js">{
 
* Custom NPCs can now be added to festivals by editing the festival data file (instead of patching them into the character sheet which is conflict-prone). The key is "Set-Up_additionalCharacters" (with that exact capitalization), and the value format is "NpcName X Y Direction" (where direction can be up/down/left/right or an integer code) delimited by "/".<p>For example, this safely adds a custom NPC to the Stardew Valley Fair using Content Patcher:</p><syntaxhighlight lang="js">{
 
   "Action": "EditData",
 
   "Action": "EditData",
Line 243: Line 370:
 
   ]
 
   ]
 
}</syntaxhighlight>
 
}</syntaxhighlight>
* Shops can now sell furniture via the <tt>shop</tt> field in the festival data file. The format is identical to the existing field, but with a <tt>F</tt> item type code.
+
* Shops can now sell furniture via the <samp>shop</samp> field in the festival data file. The format is identical to the existing field, but with a <samp>F</samp> item type code.
  
 
===Schedule changes===
 
===Schedule changes===
* Added a <tt>marriage_&lt;season&gt;_&lt;day of month&gt;</tt> key used by spouse NPCs to enable schedules for specific days. This has a higher priority than the existing marriage keys.
+
: ''Main article: [[Modding:Schedule data]].''
 +
 
 +
* Added a <samp>marriage_&lt;season&gt;_&lt;day of month&gt;</samp> key used by spouse NPCs to enable schedules for specific days. This has a higher priority than the existing marriage keys.
  
 
===New map properties===
 
===New map properties===
Line 254: Line 383:
  
 
* For the farm only:
 
* For the farm only:
** <tt>GrandpaShrineLocation</tt>, <tt>GreenhouseLocation</tt>, <tt>MailboxLocation</tt>, <tt>ShippingBinLocation</tt>, <tt>SpouseAreaLocation</tt>: the top-left tile at which to place the target by default.
+
** <samp>GrandpaShrineLocation</samp>, <samp>GreenhouseLocation</samp>, <samp>MailboxLocation</samp>, <samp>ShippingBinLocation</samp>, <samp>SpouseAreaLocation</samp>: the top-left tile at which to place the target by default.
** <tt>BackwoodsEntry</tt>, <tt>BusStopEntry</tt>, <tt>FarmCaveEntry</tt>, <tt>FarmHouseEntry</tt>, <tt>ForestEntry</tt>, <tt>WarpTotemEntry</tt>: when the player enters the farm from the named location, the position to which to move them instead of the default position. The FarmhouseEntry map property also affects other house-related logic such as the house sprite draw location, the location where events on the farm take place, etc.
+
** <samp>BackwoodsEntry</samp>, <samp>BusStopEntry</samp>, <samp>FarmCaveEntry</samp>, <samp>FarmHouseEntry</samp>, <samp>ForestEntry</samp>, <samp>WarpTotemEntry</samp>: when the player enters the farm from the named location, the position to which to move them instead of the default position. The FarmhouseEntry map property also affects other house-related logic such as the house sprite draw location, the location where events on the farm take place, etc.
 
* For the farmhouse only:
 
* For the farmhouse only:
** <tt>KitchenStandingLocation</tt>: the position where the player's spouse stands while in the kitchen. If omitted, the spouse will stand in front of the oven.
+
** <samp>KitchenStandingLocation</samp>: the position where the player's spouse stands while in the kitchen. If omitted, the spouse will stand in front of the oven.
 
* For indoor locations:
 
* For indoor locations:
** <tt>ForceSpawnForageables</tt>: causes forage to spawn in the location.
+
** <samp>ForceSpawnForageables</samp>: causes forage to spawn in the location.
** <tt>indoorWater</tt>: enables water tiles in the location (e.g. for fishing).
+
** <samp>indoorWater</samp>: enables water tiles in the location (''e.g.,'' for fishing).
 
* For all locations:
 
* For all locations:
** <tt>CanCaskHere</tt>: if set to any value, casks will work in this location regardless of whether it's a cellar.
+
** <samp>CanCaskHere</samp>: if set to any value, casks will work in this location regardless of whether it's a cellar.
** <tt>LocationContext</tt>: the general world area (possible values: <tt>Default</tt> and <tt>Island</tt>). This affects which area's weather is used, whether you hear the train whistle when it's passing, etc.
+
** <samp>LocationContext</samp>: the general world area (possible values: <samp>Default</samp> and <samp>Island</samp>). This affects which area's weather is used, whether you hear the train whistle when it's passing, etc.
** <tt>NPCWarp</tt>: equivalent to <tt>Warp</tt>, but only usable by NPCs.
+
** <samp>NPCWarp</samp>: equivalent to <samp>Warp</samp>, but only usable by NPCs.
** <tt>SeasonOverride</tt>: assumes the given season for many checks in that location (such as crop growing season, tilesheet appearance, etc). Some game checks still use the global season where it makes sense to do so.
+
** <samp>SeasonOverride</samp>: assumes the given season for many checks in that location (such as crop growing season, tilesheet appearance, etc). Some game checks still use the global season where it makes sense to do so.
** <tt>skipWeedGrowth</tt>: skip spawning/spreading weeds in this location.
+
** <samp>skipWeedGrowth</samp>: skip spawning/spreading weeds in this location.
  
The various tiles/properties that accompany these features (e.g. door tiles, mailbox tile action, etc) still need to be added to the map file. These aren't added/moved automatically by the map properties.
+
The various tiles/properties that accompany these features (''e.g.,'' door tiles, mailbox tile action, etc) still need to be added to the map file. These aren't added/moved automatically by the map properties.
  
 
===Greenhouse building===
 
===Greenhouse building===
Stardew Valley 1.5 changes the greenhouse into its own building that can be moved, and moves the greenhouse texture out of <tt>Buildings/House</tt> into a new <tt>Buildings/Greenhouse</tt> asset.
+
Stardew Valley 1.5 changes the greenhouse into its own building that can be moved, and moves the greenhouse texture out of <samp>Buildings/House</samp> into a new <samp>Buildings/Greenhouse</samp> asset.
  
 
To update an older custom farm map:
 
To update an older custom farm map:
Line 280: Line 409:
 
|-
 
|-
 
! tilesheet ID
 
! tilesheet ID
! file in <tt>Contents/Maps</tt>
+
! file in <samp>Contents/Maps</samp>
 
|-
 
|-
 
| <code>Paths</code>
 
| <code>Paths</code>
Line 289: Line 418:
 
|-
 
|-
 
| <code>untitled tile sheet2</code>
 
| <code>untitled tile sheet2</code>
| <code>spring_island_tilesheet_1</code> * in <tt>Farm_Island</tt> only
+
| <code>spring_island_tilesheet_1</code> * in <samp>Farm_Island</samp> only
 
|}
 
|}
 
</li>
 
</li>
Line 295: Line 424:
 
<li>Remove the <code>Action: WarpGreenhouse</code> tile property from the building layer where the greenhouse door was.</li>
 
<li>Remove the <code>Action: WarpGreenhouse</code> tile property from the building layer where the greenhouse door was.</li>
 
<li>Add a <code>GreenhouseLocation</code> [[Modding:Maps#Map properties|map property]], with the value set to the top-left tile of your greenhouse position (like <code>24 9</code>).</li>
 
<li>Add a <code>GreenhouseLocation</code> [[Modding:Maps#Map properties|map property]], with the value set to the top-left tile of your greenhouse position (like <code>24 9</code>).</li>
<li>In rare cases, you may want to edit <tt>Maps/Farm_Greenhouse_Dirt</tt> or <tt>Maps/Farm_Greenhouse_Dirt_FourCorners</tt>. They patch the area where the greenhouse was originally when the save was created (even if using the new property to set greenhouse location, in this case the patch will patch the related area). This affects all vanilla farm map type except Beach map.</li>
+
<li>In rare cases, you may want to edit <samp>Maps/Farm_Greenhouse_Dirt</samp> or <samp>Maps/Farm_Greenhouse_Dirt_FourCorners</samp>. They patch the area where the greenhouse was originally when the save was created (even if using the new property to set greenhouse location, in this case the patch will patch the related area). This affects all vanilla farm map type except Beach map.</li>
 
</ol>
 
</ol>
  
 
===Bed changes===
 
===Bed changes===
Stardew Valley 1.5 changes beds into furniture that can be picked up and moved. The bed sprites are now in <tt>Tilesheets/furniture</tt>.
+
Stardew Valley 1.5 changes beds into furniture that can be picked up and moved. The bed sprites are now in <samp>Tilesheets/furniture</samp>.
  
 
===Sitting on non-furniture chairs===
 
===Sitting on non-furniture chairs===
Players can sit on chairs that are part of the map. This works by checking the tile on the <tt>Buildings</tt> layer, and comparing its tilesheet and tilesheet index to the data in <tt>Data\ChairTiles</tt>.
+
{{main article|Modding:Maps#Sitting on non-furniture chairs}}
 +
 
 +
Players can sit on chairs that are part of the map. This works by checking the tile on the <samp>Buildings</samp> layer, and comparing its tilesheet and tilesheet index to the data in <samp>Data\ChairTiles</samp>.
  
 
Each entry has a key in the form <code>sheet filename/tile X/tile Y</code>:
 
Each entry has a key in the form <code>sheet filename/tile X/tile Y</code>:
Line 327: Line 458:
 
|-
 
|-
 
| direction
 
| direction
| The direction the player should face when sitting. The possible values are <tt>down</tt>, <tt>left</tt>, <tt>right</tt>, <tt>up</tt>, or <tt>opposite</tt>. Any other value defaults to <tt>up</tt>.
+
| The direction the player should face when sitting. The possible values are <samp>down</samp>, <samp>left</samp>, <samp>right</samp>, <samp>up</samp>, or <samp>opposite</samp>. Any other value defaults to <samp>up</samp>.
 
|-
 
|-
 
| type
 
| type
| An arbitrary seat code (like <tt>playground</tt> or <tt>ccdesk</tt>), which affects hardcoded game logic for specific seats in the game. You can specify an invalid value like <tt>default</tt> to ignore this.
+
| An arbitrary seat code (like <samp>playground</samp> or <samp>ccdesk</samp>), which affects hardcoded game logic for specific seats in the game. You can specify an invalid value like <samp>default</samp> to ignore this.
 
|-
 
|-
 
| draw tile X<br />draw tile Y
 
| draw tile X<br />draw tile Y
| The X and Y position in <tt>TileSheets\ChairTiles</tt> (or the custom tilesheet) to draw when the player is sitting, starting at 0. If the width and/or height are more than 1, this is the position of the top-left tile.
+
| The X and Y position in <samp>TileSheets\ChairTiles</samp> (or the custom tilesheet) to draw when the player is sitting, starting at 0. If the width and/or height are more than 1, this is the position of the top-left tile.
 
|-
 
|-
 
| is seasonal
 
| is seasonal
Line 339: Line 470:
 
|-
 
|-
 
| alternate tilesheet
 
| alternate tilesheet
| The tilesheet from which to get the draw tiles, instead of <tt>TileSheets\ChairTiles</tt>.
+
| The tilesheet from which to get the draw tiles, instead of <samp>TileSheets\ChairTiles</samp>.
 
|}
 
|}
  
 
===Custom hairstyles===
 
===Custom hairstyles===
You can now define custom hairstyles by editing the <tt>Data/HairData</tt> asset. Each line consists of a unique numeric ID, and a slash-delimited sequence of these fields:
+
You can now define custom hairstyles by editing the <samp>Data/HairData</samp> asset. Each line consists of a unique numeric ID, and a slash-delimited sequence of these fields:
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 391: Line 522:
 
These are changes which might be of interest to modders, but shouldn't break any mods.
 
These are changes which might be of interest to modders, but shouldn't break any mods.
  
* Some assets were duplicated between <tt>Content/Maps</tt> and <tt>Content</tt>, but the ones directly under <tt>Content</tt> were unused by the game and no longer exist in 1.5.
+
* Some assets were duplicated between <samp>Content/Maps</samp> and <samp>Content</samp>, but the ones directly under <samp>Content</samp> were unused by the game and no longer exist in 1.5.
 
* Farmhouse bed changes:
 
* Farmhouse bed changes:
** The <tt>Bed</tt> and <tt>TouchAction Sleep</tt> properties are no longer required in farmhouses, since placed beds transparently add it to their current position. They can still be added to have static beds that are part of the map.
+
** The <samp>Bed</samp> and <samp>TouchAction Sleep</samp> properties are no longer required in farmhouses, since placed beds transparently add it to their current position. They can still be added to have static beds that are part of the map.
** The new <tt>DefaultBedPosition</tt> property on the <tt>Back</tt> layer can be added to spawn a bed furniture on that spot.
+
** The new <samp>DefaultBedPosition</samp> property on the <samp>Back</samp> layer can be added to spawn a bed furniture on that spot.
 
* Mail changes:
 
* Mail changes:
** <tt>%item tools</tt> can now be used to give <tt>furniture</tt> too.
+
** <samp>%item tools</samp> can now be used to give <samp>furniture</samp> too.
* Furniture data has a new 'placement restrictions' field at index 6. This overrides the default restrictions. The possible values are <tt>1</tt> (outdoors only), <tt>2</tt> (placed as decoration?), or any other value for inside-farmhouse-only. Certain furniture types programmatically have different default values set by default, but these can be overridden by specifying a value.
+
* Furniture data has a new 'placement restrictions' field at index 6. This overrides the default restrictions. The possible values are <samp>1</samp> (outdoors only), <samp>2</samp> (placed as decoration?), or any other value for inside-farmhouse-only. Certain furniture types programmatically have different default values set by default, but these can be overridden by specifying a value.
 
* New map properties: see [[#New map properties|_new map properties_]] above.
 
* New map properties: see [[#New map properties|_new map properties_]] above.
 
* New map tile properties:
 
* New map tile properties:
** <tt>Back</tt> > <tt>BeachSpawn</tt>: affects beach forage spawning on the beach farm;
+
** <samp>Back</samp> > <samp>BeachSpawn</samp>: affects beach forage spawning on the beach farm;
** <tt>Back</tt> > <tt>NoPath</tt>: prevent NPCs from pathing through the tile;
+
** <samp>Back</samp> > <samp>NoPath</samp>: prevent NPCs from pathing through the tile;
** <tt>Buildings</tt> > <tt>NPCPassable</tt>: equivalent to <tt>Passable</tt>, but only for NPCs;
+
** <samp>Buildings</samp> > <samp>NPCPassable</samp>: equivalent to <samp>Passable</samp>, but only for NPCs;
** <tt>Buildings > ProjectilePassable</tt>: allows projectiles to cross tiles that would normally block them (e.g. to allow shooting into lava pools).
+
** <samp>Buildings > ProjectilePassable</samp>: allows projectiles to cross tiles that would normally block them (''e.g.,'' to allow shooting into lava pools).
  
 
===Update impact===
 
===Update impact===
Here's a summary of the XNB files which changed in Stardew Valley 1.4.
+
Here's a summary of the XNB files which changed in Stardew Valley 1.5.
  
 
Notes:
 
Notes:
Line 426: Line 557:
 
! Content Patcher
 
! Content Patcher
 
|-
 
|-
| <tt>Animals/BabyWhite Chicken</tt>
+
| <samp>Animals/BabyWhite Chicken</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Animals/Dinosaur</tt>
+
| <samp>Animals/Dinosaur</samp>
 
| cosmetic changes
 
| cosmetic changes
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Animals/Duck</tt>
+
| <samp>Animals/Duck</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Buildings/houses</tt>
+
| <samp>Buildings/houses</samp>
 
| See [[#Greenhouse building|Greenhouse building]].
 
| See [[#Greenhouse building|Greenhouse building]].
 
| ✘ greenhouse edits ignored silently
 
| ✘ greenhouse edits ignored silently
 
| ✘ greenhouse edits ignored with an error
 
| ✘ greenhouse edits ignored with an error
 
|-
 
|-
| <tt>Characters/Abigail</tt>
+
| <samp>Characters/Abigail</samp>
 
| new sitting sprite in empty area
 
| new sitting sprite in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Caroline</tt>
+
| <samp>Characters/Caroline</samp>
 
| new sitting sprite in new area
 
| new sitting sprite in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Demetrius</tt>
+
| <samp>Characters/Demetrius</samp>
 
| cosmetic tweaks
 
| cosmetic tweaks
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✘ may remove changes
 
| ✘ may remove changes
 
|-
 
|-
| <tt>Characters/Dialogue/Abigail</tt>
+
| <samp>Characters/Dialogue/Abigail</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Alex</tt>
+
| <samp>Characters/Dialogue/Alex</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Caroline</tt>
+
| <samp>Characters/Dialogue/Caroline</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Clint</tt>
+
| <samp>Characters/Dialogue/Clint</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Demetrius</tt>
+
| <samp>Characters/Dialogue/Demetrius</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Elliott</tt>
+
| <samp>Characters/Dialogue/Elliott</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Emily</tt>
+
| <samp>Characters/Dialogue/Emily</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Evelyn</tt>
+
| <samp>Characters/Dialogue/Evelyn</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/George</tt>
+
| <samp>Characters/Dialogue/George</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Gus</tt>
+
| <samp>Characters/Dialogue/Gus</samp>
 
| new content, fixed typos
 
| new content, fixed typos
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Haley</tt>
+
| <samp>Characters/Dialogue/Haley</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Harvey</tt>
+
| <samp>Characters/Dialogue/Harvey</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Jas</tt>
+
| <samp>Characters/Dialogue/Jas</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Jodi</tt>
+
| <samp>Characters/Dialogue/Jodi</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Kent</tt>
+
| <samp>Characters/Dialogue/Kent</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Leah</tt>
+
| <samp>Characters/Dialogue/Leah</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Lewis</tt>
+
| <samp>Characters/Dialogue/Lewis</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Linus</tt>
+
| <samp>Characters/Dialogue/Linus</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Marnie</tt>
+
| <samp>Characters/Dialogue/Marnie</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/MarriageDialogue</tt>
+
| <samp>Characters/Dialogue/MarriageDialogue</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Maru</tt>
+
| <samp>Characters/Dialogue/Maru</samp>
 
| new content, fixed typo
 
| new content, fixed typo
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Characters/Dialogue/Mister Qi</tt>
+
| <samp>Characters/Dialogue/Mister Qi</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|  
 
|  
 
|-
 
|-
| <tt>Characters/Dialogue/Pam</tt>
+
| <samp>Characters/Dialogue/Pam</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Penny</tt>
+
| <samp>Characters/Dialogue/Penny</samp>
 
| new content, fixed typos
 
| new content, fixed typos
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Pierre</tt>
+
| <samp>Characters/Dialogue/Pierre</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/rainy</tt>
+
| <samp>Characters/Dialogue/rainy</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Robin</tt>
+
| <samp>Characters/Dialogue/Robin</samp>
 
| new content, fixed typo
 
| new content, fixed typo
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Characters/Dialogue/Sam</tt>
+
| <samp>Characters/Dialogue/Sam</samp>
 
| new content, fixed typo
 
| new content, fixed typo
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Characters/Dialogue/Sandy</tt>
+
| <samp>Characters/Dialogue/Sandy</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Sebastian</tt>
+
| <samp>Characters/Dialogue/Sebastian</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Shane</tt>
+
| <samp>Characters/Dialogue/Shane</samp>
 
| new content, fixed typo
 
| new content, fixed typo
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Characters/Dialogue/Vincent</tt>
+
| <samp>Characters/Dialogue/Vincent</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Willy</tt>
+
| <samp>Characters/Dialogue/Willy</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Dialogue/Wizard</tt>
+
| <samp>Characters/Dialogue/Wizard</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Farmer/Farmer_base</tt><br /><tt>Characters/Farmer/Farmer_base_bald</tt><br /><tt>Characters/Farmer/Farmer_girl_base</tt><br /><tt>Characters/Farmer/Farmer_girl_base_bald</tt>
+
| <samp>Characters/Farmer/Farmer_base</samp><br /><samp>Characters/Farmer/Farmer_base_bald</samp><br /><samp>Characters/Farmer/Farmer_girl_base</samp><br /><samp>Characters/Farmer/Farmer_girl_base_bald</samp>
 
| new sprite in empty area<br /><small>(arm sprites when sitting on a chair that's facing down and when using the horse flute)</small>
 
| new sprite in empty area<br /><small>(arm sprites when sitting on a chair that's facing down and when using the horse flute)</small>
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Farmer/hats</tt>
+
| <samp>Characters/Farmer/hats</samp>
 
| new sprites in empty area, new area
 
| new sprites in empty area, new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Farmer/shoeColors</tt>
+
| <samp>Characters/Farmer/shoeColors</samp>
 
| new sprites in empty area
 
| new sprites in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/George</tt>
+
| <samp>Characters/George</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Haley</tt>
+
| <samp>Characters/Haley</samp>
 
| new sprite in empty area
 
| new sprite in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Lewis</tt>
+
| <samp>Characters/Lewis</samp>
 
| new sprite in new area
 
| new sprite in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Linus</tt>
+
| <samp>Characters/Linus</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Marnie</tt>
+
| <samp>Characters/Marnie</samp>
 
| new sprite in empty area
 
| new sprite in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Pam</tt>
+
| <samp>Characters/Pam</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Robin</tt>
+
| <samp>Characters/Robin</samp>
 
| new sprites in empty area
 
| new sprites in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/Willy</tt>
+
| <samp>Characters/Willy</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Characters/schedules/Linus</tt>
+
| <samp>Characters/schedules/Linus</samp>
 
| tweaked schedule position
 
| tweaked schedule position
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Characters/schedules/Willy</tt>
+
| <samp>Characters/schedules/Willy</samp>
 
| tweaked schedule positions
 
| tweaked schedule positions
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✘ may remove changes
 
| ✘ may remove changes
 
|-
 
|-
| <tt>Data/animationDescriptions</tt>
+
| <samp>Data/animationDescriptions</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/BigCraftablesInformation</tt>
+
| <samp>Data/BigCraftablesInformation</samp>
 
| new content, deleted broken item, tweaked Workbench price
 
| new content, deleted broken item, tweaked Workbench price
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Blueprints</tt>
+
| <samp>Data/Blueprints</samp>
 
| replaced Greenhouse entry, tweaked Mill description
 
| replaced Greenhouse entry, tweaked Mill description
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Boots</tt>
+
| <samp>Data/Boots</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/ClothingInformation</tt>
+
| <samp>Data/ClothingInformation</samp>
 
| fixed typo
 
| fixed typo
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/CookingRecipes</tt>
+
| <samp>Data/CookingRecipes</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|  
 
|  
 
|-
 
|-
| <tt>Data/CraftingRecipes</tt>
+
| <samp>Data/CraftingRecipes</samp>
 
| new content, changed Skull Brazier recipe
 
| new content, changed Skull Brazier recipe
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Crops</tt>
+
| <samp>Data/Crops</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/Beach</tt>
+
| <samp>Data/Events/Beach</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/Farm</tt>
+
| <samp>Data/Events/Farm</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/FarmHouse</tt>
+
| <samp>Data/Events/FarmHouse</samp>
 
| tweaked precondition
 
| tweaked precondition
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Events/Forest</tt>
+
| <samp>Data/Events/Forest</samp>
 
| fixed typo
 
| fixed typo
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Events/HaleyHouse</tt>
+
| <samp>Data/Events/HaleyHouse</samp>
 
| new content, tweaked event
 
| new content, tweaked event
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Events/JoshHouse</tt>
+
| <samp>Data/Events/JoshHouse</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/Mountain</tt>
+
| <samp>Data/Events/Mountain</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/Railroad</tt>
+
| <samp>Data/Events/Railroad</samp>
 
| fixes to Harvey's 10-heart event
 
| fixes to Harvey's 10-heart event
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Events/Saloon</tt>
+
| <samp>Data/Events/Saloon</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/ScienceHouse</tt>
+
| <samp>Data/Events/ScienceHouse</samp>
 
| new content, fixed typo
 
| new content, fixed typo
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Events/SeedShop</tt>
+
| <samp>Data/Events/SeedShop</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/Town</tt>
+
| <samp>Data/Events/Town</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Events/Trailer</tt>
+
| <samp>Data/Events/Trailer</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/ExtraDialogue</tt>
+
| <samp>Data/ExtraDialogue</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/FarmAnimals</tt>
+
| <samp>Data/FarmAnimals</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Festivals/fall16</tt>
+
| <samp>Data/Festivals/fall16</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Festivals/fall27</tt>
+
| <samp>Data/Festivals/fall27</samp>
 
| new content, added new items to shop field
 
| new content, added new items to shop field
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Festivals/spring13</tt>
+
| <samp>Data/Festivals/spring13</samp>
 
| new content, changed 'set-up' and 'mainEvent' fields to add Leo, added new item to shop field
 
| new content, changed 'set-up' and 'mainEvent' fields to add Leo, added new item to shop field
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Festivals/spring24</tt>
+
| <samp>Data/Festivals/spring24</samp>
 
| new content, added new items to shop field
 
| new content, added new items to shop field
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Festivals/summer11</tt>
+
| <samp>Data/Festivals/summer11</samp>
 
| new content, added shop field
 
| new content, added shop field
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Festivals/summer28</tt>
+
| <samp>Data/Festivals/summer28</samp>
 
| new content, added shop field
 
| new content, added shop field
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Festivals/winter8</tt>
+
| <samp>Data/Festivals/winter8</samp>
 
| new content, added new items to shop field
 
| new content, added new items to shop field
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Festivals/winter25</tt>
+
| <samp>Data/Festivals/winter25</samp>
 
| new content, added new items to shop field
 
| new content, added new items to shop field
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Fish</tt>
+
| <samp>Data/Fish</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/FishPondData</tt>
+
| <samp>Data/FishPondData</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/fruitTrees</tt>
+
| <samp>Data/fruitTrees</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Furniture</tt>
+
| <samp>Data/Furniture</samp>
 
| new content, tweaked Butterfly Hutch
 
| new content, tweaked Butterfly Hutch
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/hats</tt>
+
| <samp>Data/hats</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/Locations</tt>
+
| <samp>Data/Locations</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|  
 
|  
 
|-
 
|-
| <tt>Data/mail</tt>
+
| <samp>Data/mail</samp>
 
| new content, added item to 'georgeGifts' entry, changed 'foundLostTools' entry, fixed typo
 
| new content, added item to 'georgeGifts' entry, changed 'foundLostTools' entry, fixed typo
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/Monsters</tt>
+
| <samp>Data/Monsters</samp>
 
| new content; tweaked Mummy, Skeleton, and Spiker entries
 
| new content; tweaked Mummy, Skeleton, and Spiker entries
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/MoviesReactions</tt>
+
| <samp>Data/MoviesReactions</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|  
 
|  
 
|-
 
|-
| <tt>Data/NPCDispositions</tt>
+
| <samp>Data/NPCDispositions</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/NPCGiftTastes</tt>
+
| <samp>Data/NPCGiftTastes</samp>
 
| new content, added new item to several entries, tidying
 
| new content, added new item to several entries, tidying
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✘ may remove changes
 
| ✘ may remove changes
 
|-
 
|-
| <tt>Data/ObjectContextTags</tt>
+
| <samp>Data/ObjectContextTags</samp>
 
| new content, added tags for ring items, added tag for Lionfish entry
 
| new content, added tags for ring items, added tag for Lionfish entry
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/ObjectInformation</tt>
+
| <samp>Data/ObjectInformation</samp>
 
| new content, edited a few descriptions, changed duck feather price
 
| new content, edited a few descriptions, changed duck feather price
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Data/SecretNotes</tt>
+
| <samp>Data/SecretNotes</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/TailoringRecipes</tt>
+
| <samp>Data/TailoringRecipes</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Data/weapons</tt>
+
| <samp>Data/weapons</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>LooseSprites/Cursors</tt>
+
| <samp>LooseSprites/Cursors</samp>
 
| new sprites in empty areas, replaced unused sprites, repositioned fertilized dirt overlay
 
| new sprites in empty areas, replaced unused sprites, repositioned fertilized dirt overlay
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>LooseSprites/Cursors2</tt>
+
| <samp>LooseSprites/Cursors2</samp>
 
| new sprites in empty areas + new areas
 
| new sprites in empty areas + new areas
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>LooseSprites/letterBG</tt>
+
| <samp>LooseSprites/letterBG</samp>
 
| new sprite in empty area
 
| new sprite in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>LooseSprites/map</tt>
+
| <samp>LooseSprites/map</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>LooseSprites/temporary_sprites_1</tt>
+
| <samp>LooseSprites/temporary_sprites_1</samp>
 
| new sprites in empty area
 
| new sprites in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Maps/*</tt>
+
| <samp>Maps/*</samp>
 
| All tilesheet paths now have "Maps/" prefixed.
 
| All tilesheet paths now have "Maps/" prefixed.
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/ArchaeologyHouse</tt>
+
| <samp>Maps/ArchaeologyHouse</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Backwoods</tt>
+
| <samp>Maps/Backwoods</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Backwoods-GraveSite</tt>
+
| <samp>Maps/Backwoods-GraveSite</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Barn</tt><br /><tt>Maps/Barn2</tt><br /><tt>Maps/Barn3</tt><br />
+
| <samp>Maps/Barn</samp><br /><samp>Maps/Barn2</samp><br /><samp>Maps/Barn3</samp><br />
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Beach</tt>
+
| <samp>Maps/Beach</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Beach-Jellies</tt>
+
| <samp>Maps/Beach-Jellies</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Beach-Luau</tt>
+
| <samp>Maps/Beach-Luau</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Beach-NightMarket</tt>
+
| <samp>Maps/Beach-NightMarket</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/BusStop</tt>
+
| <samp>Maps/BusStop</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Cabin</tt><br /><tt>Maps/Cabin1</tt><br /><tt>Maps/Cabin1_marriage</tt><br /><tt>Maps/Cabin2</tt><br /><tt>Maps/Cabin2_marriage</tt>
+
| <samp>Maps/Cabin</samp><br /><samp>Maps/Cabin1</samp><br /><samp>Maps/Cabin1_marriage</samp><br /><samp>Maps/Cabin2</samp><br /><samp>Maps/Cabin2_marriage</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/cave</tt>
+
| <samp>Maps/cave</samp>
 
| overhauled spritesheet
 
| overhauled spritesheet
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|-
 
|-
| <tt>Maps/characterSheet</tt>
+
| <samp>Maps/characterSheet</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Maps/Coop</tt><br /><tt>Maps/Coop2</tt><br /><tt>Maps/Coop3</tt><br />
+
| <samp>Maps/Coop</samp><br /><samp>Maps/Coop2</samp><br /><samp>Maps/Coop3</samp><br />
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/desert</tt>
+
| <samp>Maps/desert</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/fall_outdoorsTileSheet2</tt><br /><tt>Maps/spring_outdoorsTileSheet2</tt><br /><tt>Maps/summer_outdoorsTileSheet2</tt><br /><tt>Maps/winter_outdoorsTileSheet2</tt>
+
| <samp>Maps/fall_outdoorsTileSheet2</samp><br /><samp>Maps/spring_outdoorsTileSheet2</samp><br /><samp>Maps/summer_outdoorsTileSheet2</samp><br /><samp>Maps/winter_outdoorsTileSheet2</samp>
 
| new sprites in empty + new areas; replaced unused sprites
 
| new sprites in empty + new areas; replaced unused sprites
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Maps/fall_town</tt><br /><tt>Maps/spring_town</tt><br /><tt>Maps/summer_town</tt><br /><tt>Maps/winter_town</tt>
+
| <samp>Maps/fall_town</samp><br /><samp>Maps/spring_town</samp><br /><samp>Maps/summer_town</samp><br /><samp>Maps/winter_town</samp>
 
| new sprites in empty areas; tweaked winter fountain sprites
 
| new sprites in empty areas; tweaked winter fountain sprites
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Maps/Farm</tt><br /><tt>Maps/Farm_Combat</tt><br /><tt>Maps/Farm_Fishing</tt><br /><tt>Maps/Farm_Foraging</tt><br /><tt>Maps/Farm_FourCorners</tt><br /><tt>Maps/Farm_Mining</tt>
+
| <samp>Maps/Farm</samp><br /><samp>Maps/Farm_Combat</samp><br /><samp>Maps/Farm_Fishing</samp><br /><samp>Maps/Farm_Foraging</samp><br /><samp>Maps/Farm_FourCorners</samp><br /><samp>Maps/Farm_Mining</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/farmhouse_tiles</tt>
+
| <samp>Maps/farmhouse_tiles</samp>
 
| new sprites in empty + new areas, cosmetic tweaks
 
| new sprites in empty + new areas, cosmetic tweaks
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Maps/FarmHouse</tt><br /><tt>Maps/FarmHouse1</tt><br /><tt>Maps/FarmHouse1_marriage</tt><br /><tt>Maps/FarmHouse2</tt><br /><tt>Maps/FarmHouse2_marriage</tt>
+
| <samp>Maps/FarmHouse</samp><br /><samp>Maps/FarmHouse1</samp><br /><samp>Maps/FarmHouse1_marriage</samp><br /><samp>Maps/FarmHouse2</samp><br /><samp>Maps/FarmHouse2_marriage</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Festivals</tt>
+
| <samp>Maps/Festivals</samp>
 
| new sprites in empty area
 
| new sprites in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Maps/FishingGame</tt>
+
| <samp>Maps/FishingGame</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/FishShop</tt>
+
| <samp>Maps/FishShop</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Forest-FlowerFestival</tt>
+
| <samp>Maps/Forest-FlowerFestival</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Forest-IceFestival</tt>
+
| <samp>Maps/Forest-IceFestival</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Forest-SewerClean</tt>
+
| <samp>Maps/Forest-SewerClean</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Greenhouse</tt>
+
| <samp>Maps/Greenhouse</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/JoshHouse</tt>
+
| <samp>Maps/JoshHouse</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/ManorHouse</tt>
+
| <samp>Maps/ManorHouse</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Mines/mine_lava</tt><br /><tt>mine_lava</tt>
+
| <samp>Maps/Mines/mine_lava</samp><br /><samp>mine_lava</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|  
 
|  
 
|-
 
|-
| <tt>Maps/Mountain</tt>
+
| <samp>Maps/Mountain</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Mountain-BridgeFixed</tt>
+
| <samp>Maps/Mountain-BridgeFixed</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/paths</tt>
+
| <samp>Maps/paths</samp>
 
| deleted unused area and sprites
 
| deleted unused area and sprites
 
|
 
|
 
|
 
|
 
|-
 
|-
| <tt>Maps/Railroad</tt>
+
| <samp>Maps/Railroad</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Saloon</tt>
+
| <samp>Maps/Saloon</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/SamHouse</tt>
+
| <samp>Maps/SamHouse</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/ScienceHouse</tt>
+
| <samp>Maps/ScienceHouse</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/SeedShop</tt>
+
| <samp>Maps/SeedShop</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Sewer</tt>
+
| <samp>Maps/Sewer</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Shed</tt><br /><tt>Maps/Shed2</tt>
+
| <samp>Maps/Shed</samp><br /><samp>Maps/Shed2</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/SkullCave</tt>
+
| <samp>Maps/SkullCave</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Submarine</tt>
+
| <samp>Maps/Submarine</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Summit</tt>
+
| <samp>Maps/Summit</samp>
 
| [[The Summit]] was added as an accessible location in 1.5, which includes major changes to the map to make it work.
 
| [[The Summit]] was added as an accessible location in 1.5, which includes major changes to the map to make it work.
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/springobjects</tt>
+
| <samp>Maps/springobjects</samp>
 
| new sprites in empty + new areas; replaced unused sprites; cosmetic changes; tweaked all ring positions so they align for combined rings
 
| new sprites in empty + new areas; replaced unused sprites; cosmetic changes; tweaked all ring positions so they align for combined rings
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Maps/Town</tt>
+
| <samp>Maps/Town</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-Christmas</tt>
+
| <samp>Maps/Town-Christmas</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-DogHouse</tt>
+
| <samp>Maps/Town-DogHouse</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-EggFestival</tt>
+
| <samp>Maps/Town-EggFestival</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-Fair</tt>
+
| <samp>Maps/Town-Fair</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-Halloween</tt>
+
| <samp>Maps/Town-Halloween</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-Theater</tt>
+
| <samp>Maps/Town-Theater</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-TheaterCC</tt>
+
| <samp>Maps/Town-TheaterCC</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Town-TrashGone</tt>
+
| <samp>Maps/Town-TrashGone</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/townInterior</tt>
+
| <samp>Maps/townInterior</samp>
 
| cosmetic changes
 
| cosmetic changes
 
| ✘ will remove changes
 
| ✘ will remove changes
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Maps/townInterior2</tt>
+
| <samp>Maps/townInterior2</samp>
 
| new sprites in empty area
 
| new sprites in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Maps/Trailer</tt>
+
| <samp>Maps/Trailer</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Trailer_big</tt>
+
| <samp>Maps/Trailer_big</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Maps/Woods</tt>
+
| <samp>Maps/Woods</samp>
 
| unknown changes
 
| unknown changes
 
| ?
 
| ?
 
| ?
 
| ?
 
|-
 
|-
| <tt>Minigames/Clouds</tt>
+
| <samp>Minigames/Clouds</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Portraits/Grandpa</tt>
+
| <samp>Portraits/Grandpa</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Portraits/Kent</tt>
+
| <samp>Portraits/Kent</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Portraits/Leah</tt>
+
| <samp>Portraits/Leah</samp>
 
| new sprite in empty area
 
| new sprite in empty area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Portraits/Linus</tt>
+
| <samp>Portraits/Linus</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Portraits/Robin</tt>
+
| <samp>Portraits/Robin</samp>
 
| new sprite in new area
 
| new sprite in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Strings/Buildings</tt>
+
| <samp>Strings/Buildings</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Strings/Characters</tt>
+
| <samp>Strings/Characters</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Strings/Lexicon</tt>
+
| <samp>Strings/Lexicon</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Strings/Locations</tt>
+
| <samp>Strings/Locations</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Strings/StringsFromCSFiles</tt>
+
| <samp>Strings/StringsFromCSFiles</samp>
 
| new content, fixed typo, tweaked some entries
 
| new content, fixed typo, tweaked some entries
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>Strings/StringsFromMaps</tt>
+
| <samp>Strings/StringsFromMaps</samp>
 
| new content
 
| new content
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>Strings/UI</tt>
+
| <samp>Strings/UI</samp>
 
| new content, tweaked Desperado description
 
| new content, tweaked Desperado description
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TerrainFeatures/Flooring</tt><br /><tt>TerrainFeatures/Flooring_winter</tt>
+
| <samp>TerrainFeatures/Flooring</samp><br /><samp>TerrainFeatures/Flooring_winter</samp>
 
| new sprites in empty areas
 
| new sprites in empty areas
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TerrainFeatures/grass</tt>
+
| <samp>TerrainFeatures/grass</samp>
 
| new sprites in new areas
 
| new sprites in new areas
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TerrainFeatures/upperCavePlants</tt>
+
| <samp>TerrainFeatures/upperCavePlants</samp>
 
| overhauled spritesheet
 
| overhauled spritesheet
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|-
 
|-
| <tt>TileSheets/BuffsIcons</tt>
+
| <samp>TileSheets/BuffsIcons</samp>
 
| new sprite in new area
 
| new sprite in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TileSheets/bushes</tt>
+
| <samp>TileSheets/bushes</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TileSheets/Craftables</tt>
+
| <samp>TileSheets/Craftables</samp>
 
| new sprites in empty + new areas, replaced unused sprites
 
| new sprites in empty + new areas, replaced unused sprites
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TileSheets/critters</tt>
+
| <samp>TileSheets/critters</samp>
 
| new sprites in empty + new areas
 
| new sprites in empty + new areas
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TileSheets/crops</tt>
+
| <samp>TileSheets/crops</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TileSheets/fruitTrees</tt>
+
| <samp>TileSheets/fruitTrees</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TileSheets/furniture</tt>
+
| <samp>TileSheets/furniture</samp>
 
| new sprites in empty + new areas; cosmetic changes
 
| new sprites in empty + new areas; cosmetic changes
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>TileSheets/Projectiles</tt>
+
| <samp>TileSheets/Projectiles</samp>
 
| new sprite in empty area, cosmetic changes
 
| new sprite in empty area, cosmetic changes
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
| ✓ mostly unaffected
 
| ✓ mostly unaffected
 
|-
 
|-
| <tt>TileSheets/SecretNoteImages</tt>
+
| <samp>TileSheets/SecretNoteImages</samp>
 
| new sprites in new area
 
| new sprites in new area
 
| ✘ '''broken'''
 
| ✘ '''broken'''
 
|
 
|
 
|-
 
|-
| <tt>TileSheets/weapons</tt>
+
| <samp>TileSheets/weapons</samp>
 
| new sprites in empty + new areas
 
| new sprites in empty + new areas
 
| ✘ '''broken'''
 
| ✘ '''broken'''

Latest revision as of 01:58, 27 July 2022

Index

This page is for mod authors. Players: see Modding:Mod compatibility instead.

This page explains how to update your mods for compatibility with Stardew Valley 1.5, and documents some of the changes and new functionality.

For SMAPI mods

Split-screen mode

Stardew Valley 1.5 adds split-screen local multiplayer. Most mods aren't affected in non-split-screen mode, and will work the same as before.

In split-screen mode…

  • Each screen runs within the same game instance. The game automatically swaps the game state for the current player, but in-memory data from mods will be shared between all screens. You can wrap fields with SMAPI's PerScreen<T> to have separate values for each player.
  • Each screen has its own events (except GameLoop.GameLaunched). For example, with two active screens the GameLoop.UpdateTicked event happens twice per tick (120/second instead of 60/second). You can use Context fields if you need to check which player it is (like IsMainPlayer, IsSplitScreen, IsOnHostComputer, or PlayerIndex).
  • Multiplayer limitations still apply for split-screen farmhands, since split-screen is just normal multiplayer under the hood. For example, even though they're running on the host computer, split-screen farmhands can only access synced locations (unless you manually access the host's stashed state). The exception is SMAPI's save data API, which does work for farmhands on the host computer (but not remote farmhands).
  • Context.IsMultiplayer returns true for split-screen multiplayer. You can use more specific fields like IsSplitScreen, HasRemotePlayers, or IsOnHostComputer if needed.

Custom mod data

Each Character, GameLocation, Item, and TerrainFeature instance now has a modData dictionary field, which is persisted to the save file and synchronized in multiplayer. This can be used to store arbitrary mod data, including on the player itself via Game1.player.modData.

When you split an item stack, the new stack copies the previous one's mod data; when merged into another stack, the merged items adopt the target stack's mod data. Otherwise mod data has no effect on item split/merge logic (e.g., you can still merge items with different mod data), unless overridden by a Harmony patch.

Note: to avoid mod conflicts, prefixing data fields with your mod ID is strongly recommended:

item.modData[$"{this.ModManifest.UniqueID}/item-age"] = "30";

UI scale changes

Main article: Modding:Modder Guide/Game Fundamentals#UI scaling.

Stardew Valley 1.5 lets players change the UI scaling separate from the zoom level. What this means for mods depends on what they're doing.

Which mods are affected?
This affects code which draws or checks positions in…
  • menus;
  • HUD elements;
  • SMAPI's RenderingActiveMenu and RenderedActiveMenu events;
  • SMAPI's Rendering and Rendered events in some contexts (check Game1.uiMode).
This does not affect…
  • the draw method for map objects, furniture, crops, etc placed in the world;
  • code which only uses tile coordinates (not pixel coordinates).
You can test your mod by setting the zoom to maximum and the UI scale to minimum (i.e., have them at different values) or vice versa; in particular check any logic which handles pixel positions, like menus clicking. If everything looks fine, you can skip the rest of this section.
What does this mean for affected mods?
  • This introduces two UI-adjusted pixel coordinate systems, one for absolute positions (relative to the top-left corner of the map) and one for screen positions (relative to the top-left corner of the screen). You should be careful not to mix them to avoid tricky calculations; for example, do all your work in one coordinate system and then convert them once.
  • The game now has two distinct draw modes depending on the context: UI mode and non-UI mode. You can check Game1.uiMode to know which mode is active. This affects which of the coordinate systems should be used to draw to the screen.

    When drawing UI, you can indicate to the game that you want to use UI scaling. This has minimal performance impact if the game is already in UI mode, but you should avoid doing it unnecessarily if you know the code will always run in non-UI mode.

    Game1.game1.InUIMode(() =>
    {
       // your UI draw code here
    });
    
How do I update affected code?
  • Drawing something into the game world (e.g., a tile overlay) in UI mode will make things much more difficult. Consider drawing outside UI mode instead, e.g., by switching from SMAPI's Rendered event to RenderedWorld.
  • Be very careful about mixed coordinate systems. For example, a menu constructed outside the draw loop may initialize coordinates in non-UI mode, then handle clicks in UI mode. You may need to convert values to non-UI coordinates to check them in that case (see conversions below).
  • When drawing UI, in most cases you should replace Game1.viewport with Game1.uiViewport. These provide UI-adjusted pixel positions. Don't do this if you'll be adjusting the positions for UI scaling separately (see below), since double-conversion will give you incorrect results.
  • If you adjust pixel positions manually, see conversions below.
How do I convert between UI and non-UI coordinates?
conversion code
pixel → UI-adjusted pixel Utility.ModifyCoordinatesForUIScale(position)
UI-adjusted pixel → pixel Utility.ModifyCoordinatesFromUIScale(position)
UI-adjusted pixel → tile First convert to non-UI-adjusted pixel, then see pixel → tile conversion.

Chest inventory

Using chest.items and Chest.capacity to access chest inventory won't handle special cases like the Junimo Chest or Mini-Shipping Bin. Instead you should use chest.GetItemsForPlayer to get the item list, and chest.GetActualCapacity() to get the max capacity.

Paint buildings

You can now paint fully-upgraded buildings through Robin's menu, which fills predefined groups with that color. This applies to the farmhouse, cabins, barn, coop, shed, and stable. This has no effect on most mods, but mods which customize building appearances will need an update to be paintable.

Each building has three distinct groups: roof, walls, and trim. When you apply paint to part of a building, it applies to every part of the building that's in the same group.

The feature is based on two files:

  • Data/PaintData lists the buildings which can be painted, the group names shown in the UI, and the relative ranges for the brightness slider. More info from the game developers:
“To explain: the hue and saturation values are applied as is, but the brightness value is actually tracked as a "relative" brightness, i.e., a value halfway through the slider bar actually corresponds to a value that's lerped halfway between the lowest acceptable brightness and highest acceptable brightness.

This is so that a single paint color will look generally the same when applied across multiple buildings, and is also used to ensure brightness values that are overbright or too dark aren't usable as they generally look bad. This is also used to prevent values that shade in weird ways.”

  • Each paintable building also has a separate mask texture, like Buildings/Stable_PaintMask for the stable. The masks use three predefined colors: green (roof), blue (trim), and red (walls) matching the order in Data/PaintData (other colors are ignored). Groups don't need to be contiguous (e.g., you can have separate red areas).

Other breaking changes

  • The game's NetCollection<T> enumerator changed in a way that SMAPI can't easily rewrite. Affected mods only need to be recompiled to fix it.
  • The IsTileLocationOpen and isTileLocationOpenIgnoreFrontLayers methods now take tile coordinates instead of pixel coordinates.
  • Bundles can now be randomized, so you should read data from Game1.netWorldState.Value.BundleData instead of loading the Data\Bundles asset.
  • The game now has per-location seasons/weather to support the Fern Islands. In many cases you may need to use methods like Game1.GetSeasonForLocation, Game1.IsRainingHere, etc instead of accessing the values like Game1.currentSeason directly.

Other notable changes

These are changes which might be of interest to modders, but shouldn't break any mods.

  • See Modding wishlist#Done in Stardew Valley 1.5.
  • See For Content Patcher packs for content changes.
  • Location changes:
    • All locations can now have furniture, resource clumps, and getWalls().
    • The greenhouse is now always synced to farmhands in multiplayer.
    • Some furniture can now be placed outdoors or outside the farm (based on furniture.placementRestriction).
    • Added location.treatAsOutdoors field.
    • Added LightSource.fishTankLight light source type, matching LooseSprites\Lighting\fishTankLight.
  • New Utility methods:
    • ModifyTime: perform simple time calculations like ModifyTime(1250, 10) == 1300;
    • AOrAn;
    • ConvertMinutesToTime;
    • forAllLocations;
    • getNumObjectsOfIndexWithinRectangle;
    • fuzzyAnimalSearch;
    • getRandomBasicSeasonalForageItem;
    • HasAnyPlayerSeenSecretNote;
    • RGBtoHSL, HSLtoRGB, QQHtoRGB;
    • ModifyCoordinateFromUIScale, ModifyCoordinatesFromUIScale, ModifyCoordinateForUIScale, ModifyCoordinatesForUIScale;
    • IsHospitalVisitDay.
  • New Farm methods:
    • doesFarmCaveNeedHarvesting;
    • getTotalCrops;
    • getTotalCropsReadyforHarvest;
    • getTotalGreenouseCropsReadyForHarvest;
    • getGreenhouseBuilding;
    • getTotalOpenHoeDirt;
    • getTotalForageItems;
    • getNumberOfMachinesReadyForHarvest.
  • New Furniture.GetFurnitureInstance method to create furniture without needing to hardcode the separate types for TVs, etc.
  • Farmer changes:
    • Farmer.addItemToInventory now returns a list of item stacks in the player's inventory to which items were added.
  • Game1 changes:
    • Added Game1.setMousePosition.
  • Changed Utility.GetPrismaticColor to take an optional speed multiplier.
  • Added Farmer.IsBusyDoingSomething() method.
  • Added a new LikeLevel enum for gift tastes.
  • Dialogue changes:
    • You can now specify a custom portrait texture when calling Game1.drawDialogue.
    • You can now set dialogue.onFinish to do something when the dialogue closes.
  • Added object.isEssentialItem(), which prevents the item from sinking and considers the player always in range for magnetism.
  • Added Debris.DebrisType field (ARCHAEOLOGY or OBJECT).
  • Added Event.eventPositionTileOffset field, which adjusts any tile positions referenced by event by the specified amount. For example, this is used to offset farm events to match the farmhouse position. This is ignored if the event has the ignoreEventTileOffset command. (Some hardcoded sprite positions aren't adjusted.)

Debug command changes

This section is mainly intended for wiki maintainers; see Modding:Console commands for the general documentation.

  • Added commands:
    • boatjourney: start the BoatJourney minigame.
    • bpm: show the building painting menu for the building immediately north of the player, or for the farmhouse if no such building is found.
    • broadcastMailbox: send a given letter ID to all players and adds it retroactively to any players who join the game afterwards.
    • completespecialorders / cso: marks every objective for every open special order complete.
    • crib: change crib style in the farmhouse.
    • darts: start the darts minigame.
    • forge: show the forge menu.
    • gem: add the specified number of Qi gems to the player.
    • language: show the language selection screen.
    • minedifficulty / md and skullcavedifficulty / scd: change the mine or skull cavern difficulty level.
    • ordersboard: show the special orders board.
    • pathspousetome / pstm: warp or path the player's spouse spouse to the player.
    • perfection: makes changes needed for 100% game completion (e.g., max all friendships, mark all fish caught, etc).
    • pgb: prints the solution to the island gem bird shrine puzzle.
    • phone: show the telephone menu.
    • printPlayerPosition / ppp:
    • qiboard / qi: show a special orders board for Mr. Qi.
    • recountnuts: resets the player’s walnut count to its expected value given walnuts found and spent. Will likely be removed on launch.
    • renovate: show the house renovation menu.
    • returneddonations: open the returned donations UI.
    • runtestevent / rte: read an event from a test_event.txt file in the game folder, and start the event. The first line of the file is the location the event takes place, and the rest of the contents of the file are the same as a normal event file, except line breaks will be treated as ‘\’ delimiters.
    • showplurals: prints a list of the plural forms for each item name and lexicon term.
    • shufflebundles: randomise bundles.
    • specialorder: adds the special order with the matching ID to the active special orders list.
    • split: start split-screen mode or add players.
    • testnut: spawn a golden walnut at (0, 0)?
    • tls: toggle between scaled and unscaled lighting.
    • townkey: give the current player the Key To The Town.
    • uiscale / us: set a new UI scale.
    • volcano: warp player to specified level of the volcano dungeon.
    • walnut: add a specified number of golden walnuts for the player team.
    • warpanimaltome / watm: find a named animal and warp it to player.
    • warpcharactertome / wctm: find a named character and warp them to the player.
  • Command changes:
    • marry: fixed issue when NPC hasn't been met?
    • minigame: added 'fishing' option.
    • invincible: added 'gm' and 'inv' aliases.

For Content Patcher packs

Possible breaking changes

Notable changes which may break Content Patcher packs (and XNB mods):

Home renovations

Stardew Valley 1.5 adds house renovations. Mods can add or change removations by editing the Data/HomeRenovations asset. This consists of a string → model lookup, where the asset key is a unique renovation ID. The asset value is a model with these fields:

field effect
TextStrings A translation key in the form <asset name>:<key> (like Strings\\Locations:ScienceHouse_Renovation_BuildCrib). The translation text should contain three slash-delimited fields:
index effect
0 The translated display name shown in the renovation menu.
1 The translated description shown in the renovation menu.
2 The message shown to ask the player which area to renovate.

For example, the vanilla 'remove crib' matches a translation in this format:

"Remove Crib/Remove the crib from your home./Select a crib to remove."
Requirements The criteria that must match for the renovation to appear as an option. This consists of a list of models with these fields:
field effect
Type The requirement type. This can be Mail (check if the player has the given mail flag) or Value (check the value of a C# NetInt field on the farmhouse instance). Any other type always returns true.
Key
  • For a Mail requirement, the mail flag.
  • For a Value requirement, the C# NetInt field name.
Value
  • For a Mail requirement, "0" (player must not have the flag) or "1" (player must have it).
  • For a Value requirement, the required field value. The value can be prefixed with ! to require any value except this one.

For example, "Key": "renovation_bedroom_open", "Value": "1" matches if the player has the renovation_bedroom_open mail flag.

RenovateActions The actions to perform after the renovation is applied. This consists of a list of models with these fields:
field effect
Type The action type. This can be Mail (add or remove a mail flag) or Value (set the value of a C# field on the farmhouse instance). Any other type is ignored.
Key
  • For a Mail requirement, the mail flag to add or remove.
  • For a Value requirement, the C# NetInt field name.
Value
  • For a Mail requirement, either "0" (remove the mail flag) or "1" (add it).
  • For a Value requirement, either the integer value to set, or the exact string "selected" to set it to the index of the applied renovation.
RectGroups The tile areas within the farmhouse where the renovation can be placed.
AnimationType (Optional) The animation to play when the renovation is applied. The possible values are destroy or build. Any other value defaults to build.
CheckForObstructions (Optional) Whether to prevent the player from applying the renovations if there are any players, NPCs, items, etc within the target area. Default false.
SpecialRect (Optional) A dynamic area to add to the RectGroups field. The only supported value is crib, which is the farmhouse area containing the cribs.

For example, this content pack redefines one of the vanilla home renovations:

{
    "Format": "2.0.0",
    "Changes": [
        {
            "Action": "EditData",
            "Target": "Data/HomeRenovations",
            "Entries": {
                "open_bedroom": {
                    "TextStrings": "Strings\\Locations:ScienceHouse_Renovation_OpenBedroom",
                    "AnimationType": "destroy",
                    "CheckForObstructions": true,
                    "Requirements": [
                        {
                            "Type": "Mail",
                            "Key": "renovation_bedroom_open",
                            "Value": "0"
                        }
                    ],
                    "RenovateActions": [
                        {
                            "Type": "Mail",
                            "Key": "renovation_bedroom_open",
                            "Value": "1"
                        }
                    ],
                    "RectGroups": [
                        {
                            "Rects": [
                                { "X": 21, "Y": 10, "Width": 2, "Height": 8 },
                                { "X": 21, "Y": 19, "Width": 2, "Height": 1 }
                            ]
                        }
                    ]
                }
        }
    ]
}

Special orders

1.5 adds a new 'special orders' quest system which is much more flexible and supports custom quests. You can add special orders to Data/SpecialOrders with options like duration, repeatability, objectives, and rewards etc. Each order can have any number of objectives of predefined types (Collect, Deliver, Fish, Gift, JKScore, ReachMineFloor, Ship, Slay) and rewards (Friendship, Gems, Mail, Money, ResetEvent). The Mail reward sets a mail flag, which can be used to trigger custom events, dialogue, or other changes.

Dialogue changes

  • Added dialogue keys related to the resort area on the islands (keys starting with Resort).
  • Added %year placeholder.

Event changes

  • Tile positions in farm events are now offset to match the farmhouse position automatically. If an event shouldn't be based on the farmhouse position, add an ignoreEventTileOffset command to disable the offset for that event. (Some hardcoded sprite positions aren't adjusted.)
  • NPCs and players in events now walk through obstacles by default, instead of getting stuck.
  • New event commands:
    • animateHeight: something about jumping.
    • changeName: change the display name for an actor.
    • drawOffset: set the draw offset for a farmer or named NPC.
    • hideShadow: hide the shadow for a named NPC.
    • ignoreEventTileOffset: disables event tile offsets for the remainder of the event.
    • ignoreMovementAnimation. Toggles a flag that allows NPCs to move without animating their walk animations (?).
    • hostMail option: add mail for tomorrow.
    • locationSpecificCommand. used for some events, used just to call some location specific logic that’s hardcoded into some of the GameLocations.
    • playFramesAhead: skips specified number of commands.
    • showKissFrame;
    • unskippable: marks the event unskippable. This is used in conjunction with the skippable command for cases where the event should no longer be skippable after a certain point.
  • Changed event commands:
    • addTemporaryActor can now set the actor's display name at the 8th index ("Character", "Animal", or "Monster").
    • awardFestivalPrize: added _birdiereward_ and _memento_ as options.
    • fork: args changed somehow?
  • Other command changes:
    • Commands which start with -- are now skipped. This is mainly meant for the runTestEvent command, to act as a comment.
    • When an event fails to parse a command, it now shows an error box and skips the rest of the event instead of crashing.
  • New preconditions:
    • N <count>: player has collected at least this many Golden Walnuts.
    • B: the player's home has a spouse bed.
  • New event options (editable by SMAPI mods):
    • ignoreObjectCollisions: whether NPCs/players should walk through obstacles instead of getting stuck. Default true.
    • showWorldCharacters: whether to draw NPCs which are in the same location as the event, even if they're not part of the event script. Default false.
  • New specific temporary sprites: doneWithSlideShow + getEndSlideshow, georgeLeekGift, grandpaThumbsUp, krobusraven, islandFishSplash, parrotHutSquawk, parrotPerchHut, staticSprite, WillyWad.

Festival changes

Main article: Modding:Festival data.
  • Festivals can now have different versions per year. This works by adding a new set-up_y<year> field in the festival data (modulo with the current year), and/or <npc>_y<year> dialogue keys for each NPC (like Abigail_y2).
  • Custom NPCs can now be added to festivals by editing the festival data file (instead of patching them into the character sheet which is conflict-prone). The key is "Set-Up_additionalCharacters" (with that exact capitalization), and the value format is "NpcName X Y Direction" (where direction can be up/down/left/right or an integer code) delimited by "/".

    For example, this safely adds a custom NPC to the Stardew Valley Fair using Content Patcher:

    {
       "Action": "EditData",
       "Target": "Data/Festivals/fall16",
       "TextOperations": [
          {
             "Operation": "Append",
             "Target": ["Entries", "Set-Up_additionalCharacters"],
             "Value": "Jasper 43 87 down",
             "Delimiter": "/"
          }
       ]
    }
    
  • Shops can now sell furniture via the shop field in the festival data file. The format is identical to the existing field, but with a F item type code.

Schedule changes

Main article: Modding:Schedule data.
  • Added a marriage_<season>_<day of month> key used by spouse NPCs to enable schedules for specific days. This has a higher priority than the existing marriage keys.

New map properties

Main article: Modding:Maps

Stardew Valley 1.5 adds several map properties.

  • For the farm only:
    • GrandpaShrineLocation, GreenhouseLocation, MailboxLocation, ShippingBinLocation, SpouseAreaLocation: the top-left tile at which to place the target by default.
    • BackwoodsEntry, BusStopEntry, FarmCaveEntry, FarmHouseEntry, ForestEntry, WarpTotemEntry: when the player enters the farm from the named location, the position to which to move them instead of the default position. The FarmhouseEntry map property also affects other house-related logic such as the house sprite draw location, the location where events on the farm take place, etc.
  • For the farmhouse only:
    • KitchenStandingLocation: the position where the player's spouse stands while in the kitchen. If omitted, the spouse will stand in front of the oven.
  • For indoor locations:
    • ForceSpawnForageables: causes forage to spawn in the location.
    • indoorWater: enables water tiles in the location (e.g., for fishing).
  • For all locations:
    • CanCaskHere: if set to any value, casks will work in this location regardless of whether it's a cellar.
    • LocationContext: the general world area (possible values: Default and Island). This affects which area's weather is used, whether you hear the train whistle when it's passing, etc.
    • NPCWarp: equivalent to Warp, but only usable by NPCs.
    • SeasonOverride: assumes the given season for many checks in that location (such as crop growing season, tilesheet appearance, etc). Some game checks still use the global season where it makes sense to do so.
    • skipWeedGrowth: skip spawning/spreading weeds in this location.

The various tiles/properties that accompany these features (e.g., door tiles, mailbox tile action, etc) still need to be added to the map file. These aren't added/moved automatically by the map properties.

Greenhouse building

Stardew Valley 1.5 changes the greenhouse into its own building that can be moved, and moves the greenhouse texture out of Buildings/House into a new Buildings/Greenhouse asset.

To update an older custom farm map:

  1. Make sure all custom tilesheet IDs have a z_ prefix.
  2. Make sure your farm has these tilesheets before any custom tilesheets, with the exact same IDs and order:
    tilesheet ID file in Contents/Maps
    Paths paths
    untitled tile sheet spring_outdoorsTileSheet
    untitled tile sheet2 spring_island_tilesheet_1 * in Farm_Island only
  3. Remove all tiles on the building layer where the greenhouse was.
  4. Remove the Action: WarpGreenhouse tile property from the building layer where the greenhouse door was.
  5. Add a GreenhouseLocation map property, with the value set to the top-left tile of your greenhouse position (like 24 9).
  6. In rare cases, you may want to edit Maps/Farm_Greenhouse_Dirt or Maps/Farm_Greenhouse_Dirt_FourCorners. They patch the area where the greenhouse was originally when the save was created (even if using the new property to set greenhouse location, in this case the patch will patch the related area). This affects all vanilla farm map type except Beach map.

Bed changes

Stardew Valley 1.5 changes beds into furniture that can be picked up and moved. The bed sprites are now in Tilesheets/furniture.

Sitting on non-furniture chairs

Main article: Modding:Maps#Sitting on non-furniture chairs

Players can sit on chairs that are part of the map. This works by checking the tile on the Buildings layer, and comparing its tilesheet and tilesheet index to the data in Data\ChairTiles.

Each entry has a key in the form sheet filename/tile X/tile Y:

field description
sheet filename The file name of the tilesheet, without the file extension. For example, for a tilesheet loaded from assets/some-tilesheet.png, this should be some-tilesheet.
tile X
tile Y
The tile's X and Y position in the map tilesheet, starting at zero.

And a value in the form width in tiles/height in tiles/direction/type/draw tile X/draw tile Y/is seasonal/alternate tilesheet:

field description
width in tiles
height in tiles
The size of the seat in tiles. For example, a width of 2 lets the player sit on the next tile to the right of it too.
direction The direction the player should face when sitting. The possible values are down, left, right, up, or opposite. Any other value defaults to up.
type An arbitrary seat code (like playground or ccdesk), which affects hardcoded game logic for specific seats in the game. You can specify an invalid value like default to ignore this.
draw tile X
draw tile Y
The X and Y position in TileSheets\ChairTiles (or the custom tilesheet) to draw when the player is sitting, starting at 0. If the width and/or height are more than 1, this is the position of the top-left tile.
is seasonal Whether to draw seasonal variants when sitting. If enabled, the <draw tile X> and <draw tile Y> are offset by one width for each season. In other words, the spring/summer/fall/winter sprites should appear in the draw tilesheet directly adjacent, moving rightward in that order.
alternate tilesheet The tilesheet from which to get the draw tiles, instead of TileSheets\ChairTiles.

Custom hairstyles

You can now define custom hairstyles by editing the Data/HairData asset. Each line consists of a unique numeric ID, and a slash-delimited sequence of these fields:

index syntax example description
0 <spritesheet> hairstyles2 The filename of the texture containing the hairstyle sprites within Characters/Farmer/.
1
2
<x>
<y>
0
0

The tile position of the top hair sprite within the spritesheet, starting from 0, where each tile is 16 by 16 pixels.

For example, the second sprite would have tile coordinate (1, 0): one tile across, zero down.

Each hairstyle should have three to four sprites stacked vertically. Starting from the top sprite, they represent the hairstyle when the player is facing down, right, up, and (if <unique left sprite> is true) left.

3 <unique left sprite> true When the player is facing left, whether to draw the hair in the fourth sprite slot instead of flipping the right-facing sprite.
4 <covered index> -1 The unique ID of the separate hairstyle to display when the player is wearing a hat, or -1 to hide the hair in that case.
5 <is bald style> false TODO
6
7
8
<overlay spritesheet>
<overlay x>
<overlay y>
Not used, can be omitted.

Other notable changes

These are changes which might be of interest to modders, but shouldn't break any mods.

  • Some assets were duplicated between Content/Maps and Content, but the ones directly under Content were unused by the game and no longer exist in 1.5.
  • Farmhouse bed changes:
    • The Bed and TouchAction Sleep properties are no longer required in farmhouses, since placed beds transparently add it to their current position. They can still be added to have static beds that are part of the map.
    • The new DefaultBedPosition property on the Back layer can be added to spawn a bed furniture on that spot.
  • Mail changes:
    • %item tools can now be used to give furniture too.
  • Furniture data has a new 'placement restrictions' field at index 6. This overrides the default restrictions. The possible values are 1 (outdoors only), 2 (placed as decoration?), or any other value for inside-farmhouse-only. Certain furniture types programmatically have different default values set by default, but these can be overridden by specifying a value.
  • New map properties: see _new map properties_ above.
  • New map tile properties:
    • Back > BeachSpawn: affects beach forage spawning on the beach farm;
    • Back > NoPath: prevent NPCs from pathing through the tile;
    • Buildings > NPCPassable: equivalent to Passable, but only for NPCs;
    • Buildings > ProjectilePassable: allows projectiles to cross tiles that would normally block them (e.g., to allow shooting into lava pools).

Update impact

Here's a summary of the XNB files which changed in Stardew Valley 1.5.

Notes:

  • This ignores text changes in non-English files for simplicity.
  • New content files aren't listed, since they won't impact existing mods.
  • XNB mods are disproportionately affected, since they replace the entire file. Content Patcher packs are typically unaffected (unless they replace the entire file, in which case see the XNB mod column).
  • It's more difficult to determine what changed in map files, so they're often just marked 'unknown' if they changed.

Shorthand:

  • 'broken' means removing new content or potentially important changes, or potentially causing significant display bugs. This is a broad category — the game may work fine without it or crash, depending how it uses that specific content.
  • 'mostly unaffected' means mods will only be affected if they edit specific entries or fields.
  • Blank means no expected impact for the vast majority of mods.
content file changes XNB Content Patcher
Animals/BabyWhite Chicken new sprites in new area broken
Animals/Dinosaur cosmetic changes ✘ will remove changes ✓ mostly unaffected
Animals/Duck new sprites in new area broken
Buildings/houses See Greenhouse building. ✘ greenhouse edits ignored silently ✘ greenhouse edits ignored with an error
Characters/Abigail new sitting sprite in empty area broken
Characters/Caroline new sitting sprite in new area broken
Characters/Demetrius cosmetic tweaks ✘ will remove changes ✘ may remove changes
Characters/Dialogue/Abigail new content broken
Characters/Dialogue/Alex new content broken
Characters/Dialogue/Caroline new content broken
Characters/Dialogue/Clint new content broken
Characters/Dialogue/Demetrius new content broken
Characters/Dialogue/Elliott new content broken
Characters/Dialogue/Emily new content broken
Characters/Dialogue/Evelyn new content broken
Characters/Dialogue/George new content broken
Characters/Dialogue/Gus new content, fixed typos broken
Characters/Dialogue/Haley new content broken
Characters/Dialogue/Harvey new content broken
Characters/Dialogue/Jas new content broken
Characters/Dialogue/Jodi new content broken
Characters/Dialogue/Kent new content broken
Characters/Dialogue/Leah new content broken
Characters/Dialogue/Lewis new content broken
Characters/Dialogue/Linus new content broken
Characters/Dialogue/Marnie new content broken
Characters/Dialogue/MarriageDialogue new content broken
Characters/Dialogue/Maru new content, fixed typo broken ✓ mostly unaffected
Characters/Dialogue/Mister Qi new content broken
Characters/Dialogue/Pam new content broken
Characters/Dialogue/Penny new content, fixed typos broken
Characters/Dialogue/Pierre new content broken
Characters/Dialogue/rainy new content broken
Characters/Dialogue/Robin new content, fixed typo broken ✓ mostly unaffected
Characters/Dialogue/Sam new content, fixed typo broken ✓ mostly unaffected
Characters/Dialogue/Sandy new content broken
Characters/Dialogue/Sebastian new content broken
Characters/Dialogue/Shane new content, fixed typo broken ✓ mostly unaffected
Characters/Dialogue/Vincent new content broken
Characters/Dialogue/Willy new content broken
Characters/Dialogue/Wizard new content broken
Characters/Farmer/Farmer_base
Characters/Farmer/Farmer_base_bald
Characters/Farmer/Farmer_girl_base
Characters/Farmer/Farmer_girl_base_bald
new sprite in empty area
(arm sprites when sitting on a chair that's facing down and when using the horse flute)
broken
Characters/Farmer/hats new sprites in empty area, new area broken
Characters/Farmer/shoeColors new sprites in empty area broken
Characters/George new sprites in new area broken
Characters/Haley new sprite in empty area broken
Characters/Lewis new sprite in new area broken
Characters/Linus new sprites in new area broken
Characters/Marnie new sprite in empty area broken
Characters/Pam new sprites in new area broken
Characters/Robin new sprites in empty area broken
Characters/Willy new sprites in new area broken
Characters/schedules/Linus tweaked schedule position ✘ will remove changes ✓ mostly unaffected
Characters/schedules/Willy tweaked schedule positions ✘ will remove changes ✘ may remove changes
Data/animationDescriptions new content broken
Data/BigCraftablesInformation new content, deleted broken item, tweaked Workbench price broken ✓ mostly unaffected
Data/Blueprints replaced Greenhouse entry, tweaked Mill description broken ✓ mostly unaffected
Data/Boots new content broken
Data/ClothingInformation fixed typo ✘ will remove changes ✓ mostly unaffected
Data/CookingRecipes new content broken
Data/CraftingRecipes new content, changed Skull Brazier recipe broken ✓ mostly unaffected
Data/Crops new content broken
Data/Events/Beach new content broken
Data/Events/Farm new content broken
Data/Events/FarmHouse tweaked precondition ✘ will remove changes ✓ mostly unaffected
Data/Events/Forest fixed typo ✘ will remove changes ✓ mostly unaffected
Data/Events/HaleyHouse new content, tweaked event broken ✓ mostly unaffected
Data/Events/JoshHouse new content broken
Data/Events/Mountain new content broken
Data/Events/Railroad fixes to Harvey's 10-heart event ✘ will remove changes ✓ mostly unaffected
Data/Events/Saloon new content broken
Data/Events/ScienceHouse new content, fixed typo broken ✓ mostly unaffected
Data/Events/SeedShop new content broken
Data/Events/Town new content broken
Data/Events/Trailer new content broken
Data/ExtraDialogue new content broken
Data/FarmAnimals new content broken
Data/Festivals/fall16 new content broken
Data/Festivals/fall27 new content, added new items to shop field broken
Data/Festivals/spring13 new content, changed 'set-up' and 'mainEvent' fields to add Leo, added new item to shop field broken ✓ mostly unaffected
Data/Festivals/spring24 new content, added new items to shop field broken
Data/Festivals/summer11 new content, added shop field broken
Data/Festivals/summer28 new content, added shop field broken
Data/Festivals/winter8 new content, added new items to shop field broken
Data/Festivals/winter25 new content, added new items to shop field broken
Data/Fish new content broken
Data/FishPondData new content broken
Data/fruitTrees new content broken
Data/Furniture new content, tweaked Butterfly Hutch broken ✓ mostly unaffected
Data/hats new content broken
Data/Locations new content broken
Data/mail new content, added item to 'georgeGifts' entry, changed 'foundLostTools' entry, fixed typo broken ✓ mostly unaffected
Data/Monsters new content; tweaked Mummy, Skeleton, and Spiker entries broken ✓ mostly unaffected
Data/MoviesReactions new content broken
Data/NPCDispositions new content broken
Data/NPCGiftTastes new content, added new item to several entries, tidying broken ✘ may remove changes
Data/ObjectContextTags new content, added tags for ring items, added tag for Lionfish entry broken ✓ mostly unaffected
Data/ObjectInformation new content, edited a few descriptions, changed duck feather price broken ✓ mostly unaffected
Data/SecretNotes new content broken
Data/TailoringRecipes new content broken
Data/weapons new content broken
LooseSprites/Cursors new sprites in empty areas, replaced unused sprites, repositioned fertilized dirt overlay broken ✓ mostly unaffected
LooseSprites/Cursors2 new sprites in empty areas + new areas broken
LooseSprites/letterBG new sprite in empty area broken
LooseSprites/map new sprites in new area broken
LooseSprites/temporary_sprites_1 new sprites in empty area broken
Maps/* All tilesheet paths now have "Maps/" prefixed. ? ?
Maps/ArchaeologyHouse unknown changes ? ?
Maps/Backwoods unknown changes ? ?
Maps/Backwoods-GraveSite unknown changes ? ?
Maps/Barn
Maps/Barn2
Maps/Barn3
unknown changes ? ?
Maps/Beach unknown changes ? ?
Maps/Beach-Jellies unknown changes ? ?
Maps/Beach-Luau unknown changes ? ?
Maps/Beach-NightMarket unknown changes ? ?
Maps/BusStop unknown changes ? ?
Maps/Cabin
Maps/Cabin1
Maps/Cabin1_marriage
Maps/Cabin2
Maps/Cabin2_marriage
unknown changes ? ?
Maps/cave overhauled spritesheet broken broken
Maps/characterSheet new sprites in new area broken
Maps/Coop
Maps/Coop2
Maps/Coop3
unknown changes ? ?
Maps/desert unknown changes ? ?
Maps/fall_outdoorsTileSheet2
Maps/spring_outdoorsTileSheet2
Maps/summer_outdoorsTileSheet2
Maps/winter_outdoorsTileSheet2
new sprites in empty + new areas; replaced unused sprites broken
Maps/fall_town
Maps/spring_town
Maps/summer_town
Maps/winter_town
new sprites in empty areas; tweaked winter fountain sprites broken
Maps/Farm
Maps/Farm_Combat
Maps/Farm_Fishing
Maps/Farm_Foraging
Maps/Farm_FourCorners
Maps/Farm_Mining
unknown changes ? ?
Maps/farmhouse_tiles new sprites in empty + new areas, cosmetic tweaks broken ✓ mostly unaffected
Maps/FarmHouse
Maps/FarmHouse1
Maps/FarmHouse1_marriage
Maps/FarmHouse2
Maps/FarmHouse2_marriage
unknown changes ? ?
Maps/Festivals new sprites in empty area broken ✓ mostly unaffected
Maps/FishingGame unknown changes ? ?
Maps/FishShop unknown changes ? ?
Maps/Forest-FlowerFestival unknown changes ? ?
Maps/Forest-IceFestival unknown changes ? ?
Maps/Forest-SewerClean unknown changes ? ?
Maps/Greenhouse unknown changes ? ?
Maps/JoshHouse unknown changes ? ?
Maps/ManorHouse unknown changes ? ?
Maps/Mines/mine_lava
mine_lava
new sprites in new area broken
Maps/Mountain unknown changes ? ?
Maps/Mountain-BridgeFixed unknown changes ? ?
Maps/paths deleted unused area and sprites
Maps/Railroad unknown changes ? ?
Maps/Saloon unknown changes ? ?
Maps/SamHouse unknown changes ? ?
Maps/ScienceHouse unknown changes ? ?
Maps/SeedShop unknown changes ? ?
Maps/Sewer unknown changes ? ?
Maps/Shed
Maps/Shed2
unknown changes ? ?
Maps/SkullCave unknown changes ? ?
Maps/Submarine unknown changes ? ?
Maps/Summit The Summit was added as an accessible location in 1.5, which includes major changes to the map to make it work. ? ?
Maps/springobjects new sprites in empty + new areas; replaced unused sprites; cosmetic changes; tweaked all ring positions so they align for combined rings broken ✓ mostly unaffected
Maps/Town unknown changes ? ?
Maps/Town-Christmas unknown changes ? ?
Maps/Town-DogHouse unknown changes ? ?
Maps/Town-EggFestival unknown changes ? ?
Maps/Town-Fair unknown changes ? ?
Maps/Town-Halloween unknown changes ? ?
Maps/Town-Theater unknown changes ? ?
Maps/Town-TheaterCC unknown changes ? ?
Maps/Town-TrashGone unknown changes ? ?
Maps/townInterior cosmetic changes ✘ will remove changes ✓ mostly unaffected
Maps/townInterior2 new sprites in empty area broken
Maps/Trailer unknown changes ? ?
Maps/Trailer_big unknown changes ? ?
Maps/Woods unknown changes ? ?
Minigames/Clouds new sprites in new area broken
Portraits/Grandpa new sprites in new area broken
Portraits/Kent new sprites in new area broken
Portraits/Leah new sprite in empty area broken
Portraits/Linus new sprites in new area broken
Portraits/Robin new sprite in new area broken
Strings/Buildings new content broken
Strings/Characters new content broken
Strings/Lexicon new content broken
Strings/Locations new content broken
Strings/StringsFromCSFiles new content, fixed typo, tweaked some entries broken ✓ mostly unaffected
Strings/StringsFromMaps new content broken
Strings/UI new content, tweaked Desperado description broken
TerrainFeatures/Flooring
TerrainFeatures/Flooring_winter
new sprites in empty areas broken
TerrainFeatures/grass new sprites in new areas broken
TerrainFeatures/upperCavePlants overhauled spritesheet broken broken
TileSheets/BuffsIcons new sprite in new area broken
TileSheets/bushes new sprites in new area broken
TileSheets/Craftables new sprites in empty + new areas, replaced unused sprites broken
TileSheets/critters new sprites in empty + new areas broken
TileSheets/crops new sprites in new area broken
TileSheets/fruitTrees new sprites in new area broken
TileSheets/furniture new sprites in empty + new areas; cosmetic changes broken ✓ mostly unaffected
TileSheets/Projectiles new sprite in empty area, cosmetic changes broken ✓ mostly unaffected
TileSheets/SecretNoteImages new sprites in new area broken
TileSheets/weapons new sprites in empty + new areas broken