Modding:Migrate to Stardew Valley 1.7
This page is for mod authors. Players: see the mod compatibility list instead.
This page describes changes accumulated in the game's pre-alpha development branch. There's no estimated release date or even assigned version number for these changes yet. Things will change before it's released!
This page helps mod authors prepare their mods for the next game version (tentatively Stardew Valley 1.6.16), and documents some of the changes and new functionality.
FAQs

What's changing?
Stardew Valley 1.6.16 makes significant changes to event data, but otherwise so far only has small changes for mods following the major 1.6 and 1.6.9 updates.
Is this the modapocalypse?
No, the current impact on mods is expected to be minimal.
Some potential impacts:
- The event changes may affect mods which edit vanilla events or add pre-1.6 events with numeric IDs. Content packs for Content Patcher should be mostly unaffected, since it will rewrite older content packs automatically where possible.
- Mods which use Harmony or reflection to hook deeply into game internals are fragile, and may break unexpectedly in any game update. However there are no particular changes in 1.6.16 expected to affect such mods more than usual.
How to update your mod
Here's a suggested 'quick start' guide to update a mod for Stardew Valley 1.6.16.
- For C# mods:
-
- Update for Stardew Valley 1.6.9 if you haven't already.
- Rebuild the solution.
- Fix any build errors and review any build warnings. You can search this page and previous migration guides for relevant info as needed.
- Increment your mod version in manifest.json.
(Some mods may be added to SMAPI's compatibility blacklist due to runtime errors. Incrementing the mod version will fix that if so.) - Test to make sure the mod works.
- Skim through this page, and check any section that might be relevant to the mod.
- For Content Patcher packs:
-
- Update for Stardew Valley 1.6.9 if you haven't already.
- Skim through this page, and check any section that might be relevant to the mod.
- For content packs which use another framework:
- See the documentation for the framework mod. Often you won't need to update the content pack if the framework mod itself was updated.
Data asset changes
Data/Boots
This has been overhauled into a data model asset, with translations moved into a new Strings/Boots asset. This also includes new fields like ContextTags and CustomFields which weren't available in the old format.
The data asset now consists of a string → model lookup, where...
- The key is the unqualified item ID.
- The value is a model with the fields listed below.
| field | effect |
|---|---|
| basic info | |
| Name | The internal item name (not shown in-game). |
| DisplayName Description |
A tokenizable string for the item's in-game display name and description. |
| ContextTags | (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array. |
| equipment effects | |
| AddDefense AddImmunity |
(Optional) A bonus applied to the player's defense or immunity stats when the boots are equipped. Default 0. |
| appearance | |
| Texture | The asset name for the texture containing the boots sprite. Defaults to Maps/springobjects if omitted, but should always be specified for custom boots. |
| SpriteIndex | (Optional) The sprite's index within the Texture, where 0 is the top-left sprite. Default 0. |
| ColorTexture | (Optional) The asset name for the texture containing the boots color sprite. Defaults to Characters/Farmer/shoeColors if omitted. |
| ColorSpriteIndex | (Optional) The color sprite's index within the ColorTexture, where 0 is the top-left sprite. Default 0. |
| advanced | |
| CustomFields | (Optional) The custom fields for this entry. |
For example, here's how to add new boots in 1.6.16:
{
"Format": "2.8.0",
"Changes": [
// add data
{
"Action": "EditData",
"Target": "Data/Boots",
"Entries": {
"{{ModId}}_FancyBoots": {
"Name": "{{ModId}}_FancyBoots",
"DisplayName": "{{i18n: fancy-boots.name}}",
"Description": "{{i18n: fancy-boots.description}}",
"Texture": "Mods/{{ModId}}/Boots",
"SpriteIndex": 0,
"ColorSpriteIndex": 1
}
}
},
// add texture
{
"Action": "Load",
"Target": "Mods/{{ModId}}/Boots",
"FromFile": "assets/boots.png"
}
]
}
Data/Buffs
Added one new field:
| field | effect |
|---|---|
| CustomFields | (Optional) The custom fields for this entry. |
Data/ChairTiles
- Fixed support for tilesheet asset names containing a dot. (For example, a tileseet asset named
ExampleAuthor.ModName_Tilesheetnow correctly uses that as the data key instead ofExampleAuthor.)
Data/CookingRecipes
These cooking recipe keys were changed to match their object name (like all the other recipes):
| old name | new name |
|---|---|
| Cheese Cauli. | Cheese Cauliflower |
| Cookies | Cookie |
| Cran. Sauce | Cranberry Sauce |
| Dish o' The Sea | Dish O' The Sea |
| Eggplant Parm. | Eggplant Parmesan |
| Vegetable Stew | Vegetable Medley |
This has no effect on the display text, but mods which reference these recipe keys will need to be updated.
Data/Events/*
See event changes below.
Data/Furniture
This has been overhauled into a data model asset. The overhaul also adds support for previously-hardcoded features like custom item descriptions (via Description), custom TVs (via the new Television furniture type and TelevisionScreen* fields), and custom fields.
The data asset now consists of a string → model lookup, where...
- The key is the unqualified item ID.
- The value is a model with the fields listed below.
| field | effect | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| basic info | |||||||||
| Name | The internal item name (not shown in-game). | ||||||||
| DisplayName | A tokenizable string for the item's in-game display name. | ||||||||
| Description | (Optional) A tokenizable string for the item's in-game description. Defaults to a generic description based on the other fields like CanPlaceIndoors and CanPlaceOutdoors. | ||||||||
| Type | (Optional) The furniture type, which affects various furniture functionality and default values (e.g. default bounding box size). Defaults to Other.
See table of valid types. | ||||||||
| Price | (Optional) The price for this furniture when purchased from a shop. Default 0. | ||||||||
| ContextTags | (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array. | ||||||||
| behavior | |||||||||
| CanPlaceIndoors CanPlaceOutdoors |
(Optional) Whether the player can place this furniture indoors and/or outdoors. Defaults to generic behavior based on the Type field (e.g. TVs can't be placed outdoors by default). | ||||||||
| ExcludeFromRandomSale | (Optional) Whether to prevent this furniture from being shown in randomly generated shop stock or furniture catalogues. Default false. | ||||||||
| appearance | |||||||||
| Texture | The asset name for the texture containing the furniture sprite. Defaults to TileSheets/furniture if omitted, but should always be specified for custom furniture. | ||||||||
| SpriteIndex | (Optional) The sprite's index within the Texture, where 0 is the top-left sprite. Default 0. | ||||||||
| Rotations | (Optional) The number of rotations possible (1, 2, or 4). Default 1. | ||||||||
| SpriteSize | (Optional) The sprite's size in the Texture, measured in tiles. Defaults to a generic size depending on the Type field. | ||||||||
| BoundingBoxSize | (Optional) The collision box size when the furniture is placed in-game, measured in tiles. Defaults to a generic size depending on the Type field.
The bounding box is anchored to the bottom-left corner of the SpriteSize. Width will push the right side of the box to the right, height will push the top of the box upwards. | ||||||||
| type-specific options | |||||||||
| BedType | (Optional) When the Type field is set to Bed, the bed type which affects who can sleep in it. Default Single.
Valid values:
| ||||||||
| TelevisionScreenOffset | (Optional) When the Type field is set to Television, the X and Y pixel offset relative to the TV's bounding box to apply when drawing the screen image onto the TV. Default none. | ||||||||
| TelevisionScreenScale | (Optional) When the Type field is set to Television, the zoom multiplier to apply to the screen image so it fits onto the TV's screen. | ||||||||
| advanced | |||||||||
| CustomFields | (Optional) The custom fields for this entry. | ||||||||
Data/Hats
This has been overhauled into a data model asset, with translations moved into a new Strings/Hats asset. This also includes new fields like ContextTags and CustomFields which weren't available in the old format.
The data asset now consists of a string → model lookup, where...
- The key is the unqualified item ID.
- The value is a model with the fields listed below.
| field | effect |
|---|---|
| basic info | |
| Name | The internal item name (not shown in-game). |
| DisplayName Description |
A tokenizable string for the item's in-game display name and description. |
| HairStyle | (Optional) What to do about the player's hair when they wear this hat. Default DrawObscuredHair.
The possible values are:
|
| SkipHairOffset | (Optional) Whether to skip offsetting the hat to sit 'on top' of the player's current hairstyle (e.g. for masks). Default false. |
| Texture | The asset name for the texture containing the hat sprite. Defaults to Characters/Farmer/hats if omitted, but should always be specified for custom hats. |
| SpriteIndex | (Optional) The sprite's index within the Texture, where 0 is the top-left sprite. Default 0. |
| ContextTags | (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array. |
| CustomFields | (Optional) The custom fields for this entry. |
For example, here's how to add a new hat in 1.6.16:
{
"Format": "2.8.0",
"Changes": [
// add data
{
"Action": "EditData",
"Target": "Data/Hats",
"Entries": {
"{{ModId}}_FancyHat": {
"Name": "{{ModId}}_FancyHat",
"DisplayName": "{{i18n: fancy-hat.name}}",
"Description": "{{i18n: fancy-hat.description}}",
"HairStyle": "DrawObscuredHair",
"Texture": "Mods/{{ModId}}/Hats",
"SpriteIndex": 0
}
}
},
// add texture
{
"Action": "Load",
"Target": "Mods/{{ModId}}/Hats",
"FromFile": "assets/hats.png"
}
]
}
Data/LostItemsShop
Added one new field:
| field | effect |
|---|---|
| RequireCondition | (Optional) The game state queries which must match to add this item. The Target player is the one being checked.
This field should generally only be used with deterministic game state queries. |
If you specify multiple criteria fields, only one is applied in this order: RequireMailReceived, then RequireEventSeen, then RequireCondition.
Data/Monsters
Monster data has been completely rethought in Stardew Valley 1.6.16. In particular...
- For monster data in general:
- Data/Monsters has been been overhauled into a data model asset, with translations moved into a new Strings/Monsters asset. This includes significant new features which weren't supported with the old format.
- A new 'monster variant' concept lets multiple specific monsters share common data (e.g. Green Slime and Tiger Slime are variants of the new base Slime monster). This is particularly used for common drops.
- A new 'monster tag' system lets monster define custom tags like slime_is_prismatic, which can be used to filter monster drops.
- For monster drops:
- A rethought monster drop system supports the full range of vanilla features like conditions, item queries, qualified item IDs for non-object drops, and monster-specific concepts like repeating drop chance and mutually-exclusive drops.
- All drops are now qualified item IDs. The former 'resource IDs' (formatted as negative numbers like -4) are no longer supported; items are converted into their equivalent resource debris automatically where needed.
- Nearly all monster drops are now defined in Data/Monsters (with just a few hardcoded drops common to all monsters left).
The data asset now consists of a string → model lookup, where...
- The key is the unique string ID.
- The value is a model with the fields listed below.
| field | effect | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| basic info | |||||||||||||||||
| DisplayName | A tokenizable string for the monster's display name. | ||||||||||||||||
| IsGlider | (Optional) Whether the monster is flying (e.g. so they glide over obstacles). Default false. | ||||||||||||||||
| IsMineMonster | (Optional) Whether this monster spawns in the mines, and should be buffed after the player reaches the bottom. This sometimes applies to monsters that can appear elsewhere too (e.g. wilderness golems on the farm receive mine buffs too). Default false. | ||||||||||||||||
| ExperiencePoints | (Optional) The combat experience points received for defeating the monster. Default 1. | ||||||||||||||||
| stats | |||||||||||||||||
| Health | (Optional) The initial hit points. Default 20. | ||||||||||||||||
| Attack | (Optional) The attack power (i.e. how much damage its hits inflict on players). Default 5. | ||||||||||||||||
| Defense | (Optional) The defense which reduces damage received by this monster. Default 0. | ||||||||||||||||
| DodgeChance | (Optional) The percentage chance that the monster dodges an attack, as a value between 0 (never) and 1 (always). Default 0. | ||||||||||||||||
| Speed | (Optional) The default movement speed. Default 1. | ||||||||||||||||
| Jitteriness | (Optional) How often the monster will move in random non-player directions to try to get around objects, as a value between 0 (never) and 1 (always). Default 0.1. | ||||||||||||||||
| DetectionDistance | (Optional) The distance at which the monster detects a player and begins moving towards them, or -1 for unlimited. Default 4. | ||||||||||||||||
| drops | |||||||||||||||||
| Drops | (Optional) The items which can drop when the monster is defeated. Default none.
All matching entries are dropped. If the player has a burglar's ring equipped, each entry will make two attempts to drop (but fields like RepeatingChance and SkipIfDropped are independent between the two attempts). This consists of a list of models with these fields:
| ||||||||||||||||
| variants | |||||||||||||||||
| DefaultVariant | (Optional) When the game creates a monster of this type without specifying a variant, use the given variant instead of creating it from only the base data. Default false. | ||||||||||||||||
| Variants | (Optional) The possible variations of this monster. Default none.
Each variant is simply a set of fields which override the base data when set. For example, this creates a variant which only differs from the base monster by name and health points: "Variants": [
{
"DisplayName": "{{i18n: variant-name}}",
"Health": 50
}
This consists of a list of models with these fields:
| ||||||||||||||||
| advanced | |||||||||||||||||
| CustomFields | (Optional) The custom fields for this entry. | ||||||||||||||||
For example, this Content Patcher code adds a new 'Pufferchick' monster which drops pufferfish when defeated. The monster's spritesheet is automatically loaded from Monsters/<ID>.
Note: this only adds the monster data. Currently this does nothing unless you have another mod which spawns instances of the monster in-game.
{
"Format": "2.8.0",
"Changes": [
// add data
{
"Action": "EditData",
"Target": "Data/Monsters",
"Entries": {
"{{ModId}}_Pufferchick": {
"DisplayName": "{{i18n: pufferchick.name}}",
"ExperiencePoints": 3,
"Health": 30,
"Attack": 2,
"Defense": 5,
"DodgeChance": 0.3,
"Speed": 2,
"DetectionDistance": 2,
"Drops": [
{
"Id": "Pufferfish",
"ItemId": "(O)128",
"Chance": 0.5,
"RepeatingChance": 0.1
}
]
}
}
},
// add texture
{
"Action": "Load",
"Target": "Monsters/{{ModId}}_Pufferchick",
"FromFile": "assets/pufferchick.png"
}
]
}
Data/Objects
Added one new field:
| field | effect | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Buffs | This field already existed, but has a field change:
|
Data/SpecialOrders
- Added one new field:
field effect CanBeCancelled (Optional) Whether the special order can be cancelled. In multiplayer, any player cancelling the special order will remove it for all players. Default false. And improved one field:
field effect Duration This can now be set to "Indefinite" for a special order with no expiry. It will remain active until it's completed or cancelled. Consider enabling CanBeCancelled if applicable.
Data/Tools
Added one field:
| field | effect |
|---|---|
| ContextTags | (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array. |
Data/Weapons
Added one field:
| field | effect |
|---|---|
| ContextTags | (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array. |
Changes for all mod authors
Context tag changes
Added new context tags:
| context tag | item types | effect |
|---|---|---|
| axe error_tool fishing_rod generic_tool hoe lantern melee_weapon milk_pail pan pickaxe raft shears slingshot wand watering_can |
tools and weapons | The C# type which implements the tool or melee weapon.
Note that the vanilla scythes are melee_weapon. |
| fish_skip_minigame | any | If the player catches this item while fishing, it'll be caught directly without the fishing minigame. This matches the behavior when catching junk items like seaweed (which now have the context tag where needed). |
| is_galaxy_weapon | weapons | Marks the tool as a galaxy weapon like the galaxy hammer or galaxy sword. This is set for vanilla scythes through Data/Weapons. This affects logic which checks for galaxy weapons (e.g. galaxy soul enchantments). |
| is_scythe | tools and weapons | Marks the tool as a scythe. This is set for vanilla scythes through Data/Weapons. |
| upgrade_level_* | tools and weapons | The tool upgrade level. These tags are added automatically based on the tool's current level. For example, a copper axe will have both upgrade_level_0 (base axe) and upgrade_level_1 (copper axe). |
Debug command changes
Improved existing commands:
| command | description |
|---|---|
| jump | Fixed error if the NPC doesn't exist. |
| perfection | Fixed error when run on a save which already has some requirements partly met. |
Enchantment data
Enchantments have been partly de-hardcoded into a new Data/Enchantments data asset. Mods can now easily add new enchantments, including enchantments applied through the forge using a prismatic shard or a custom item ID.
However, this logic is still hardcoded:
- Forging innate enchantments. The innate enchantments are in data, but the logic to choose which to apply is still hardcoded.
- Forging diamonds into a weapon to fill all its weapon stat slots.
- Forging three galaxy souls into galaxy weapons to transform them into infinity weapons. (The 'Galaxy Soul' enchantment is in data, but the transformation is hardcoded.)
- Several enchantments' effects when applied (though weapon buff effects are in data).
This consists of a string → model lookup, where...
- The key is the unique string ID for the enchantment.
- The value is a model with the fields listed below.
| field | effect | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| DisplayName | A tokenizable string for the enchantment's display name, shown in tooltips. This can contain {0} for the enchantment level, if applicable. | ||||||||
| ForgeWith | (Optional) If set, this enchantment is applied to tools by forging an item with this qualified ID into it. Default none, in which case it won't be applicable through the forge. | ||||||||
| AppliesTo | (Optional) The tools or weapons to which this enchantment can be applied. Defaults to all tools/weapons.
This is specified as an array of context tag queries. The enchantment can be applied if at least one query matches. "AppliesTo": [
"melee_weapon, !is_scythe", // any non-scythe melee weapon
"hoe, upgrade_level_4" // any hoe upgraded to iridium or higher
]
| ||||||||
| IsForge | (Optional) Whether this is a weapon stat enchantment applied through the forge. Default false. | ||||||||
| IsSecondary | (Optional) Whether this is an innate enchantment applied through the forge using a dragon tooth. Default false. | ||||||||
| IsVisible | (Optional) Whether the enchantment should be shown in the tool/weapon's tooltip. Default true. | ||||||||
| MaximumLevel | (Optional) The number of times this enchantment can be applied to the same tool to upgrade the enchantment level (e.g. for weapon stat enchantments). A value of 1 means there's only one enchantment level, so it can't be upgraded by applying the enchantment again. Default 1. | ||||||||
| EquipmentEffects | (Optional) The buffs applied to the weapon when this enchantment is applied.
This consists of a list of models with the fields below. You can specify any number of entries; the first one which matches the tool will be applied.
| ||||||||
| advanced | |||||||||
| CustomFields | (Optional) The custom fields for this entry. | ||||||||
| ClassName | (Optional, specialized) The name of the C# class to construct within the StardewValley.Enchantments namespace. The class must be a subclass of StardewValley.Enchantments.Enchantment, and have a constructor with no arguments. For example, given a value of BottomlessEnchantment, the game will create StardewValley.Enchantments.BottomlessEnchantment instances.
This should usually be omitted, in which case the game will create a generic Enchantment instance which uses the data in Data/Enchantments for its ID. | ||||||||
Event changes
Multilingual events
All vanilla events are now multilingual, with a single copy of each event script which uses translation keys. Translations from the old per-language event files were moved into a per-language Strings/Events file.
For example:
| files in 1.6.15 | files in 1.6.16 |
|---|---|
Data/Events/Beach Data/Events/Beach.de-DE Data/Events/Beach.es-ES Data/Events/Beach.fr-FR Data/Events/Beach.hu-HU Data/Events/Beach.it-IT Data/Events/Beach.ja-JP Data/Events/Beach.ko-KR Data/Events/Beach.pt-BR Data/Events/Beach.ru-RU Data/Events/Beach.tr-TR Data/Events/Beach.zh-CN |
Data/Events/Beach |
Content Patcher content packs should generally be unaffected, since their edits were applied to the active version of the file automatically (which will just become the base file in all languages).
In rare cases, a mod which directly targets a specific localized asset name like Data/Events/Beach.fr-FR may no longer work or break vanilla events (depending on how it edits them). That should be a very rare case, since the APIs for both Content Patcher and SMAPI were designed to discourage doing that.
Forking deprecated
All vanilla events which used forking now use goto labels instead.
Forking still works like before for backwards compatibility, but mod events should prefer goto labels since...
- they work more consistently and intuitively with other features like skip labels;
- it's the approach that the game will be applying and developing in future versions;
- deprecated commands will be reported as an error if you use the EventValidator;
- and there's no guarantee forking will always work in future versions.
The fork-related event commands are deprecated.
Precondition slash now required for numeric event IDs
In Stardew Valley 1.6.0–15, the behavior of an event key with no / depended on whether the ID was numeric. A numeric event ID like 10040609 was treated as an event with no precondition, while a string event ID like PlayerKilled was treated as a manual script. In 1.6.16+, the behavior is now consistent: any event ID without a slash (like 10040609) is treated as a manual script, and any with a slash (like 10040609/) is treated as an event.
In other words:
| event key format | behavior in 1.6.15 | → | behavior in 1.6.16 |
|---|---|---|---|
<id>
|
event if numeric, else manual script | → | manual script |
<id>/[preconditions]
|
event | → | event |
New event commands
| command | description | ||||||||
|---|---|---|---|---|---|---|---|---|---|
addAchievement <achievement ID>
|
Unlock an achievement for the current player. The <achievement ID> can be a platform achievement ID (like Achievement_LocalLegend) or internal ID (like 17 for Gourmet Chef).
| ||||||||
addActor <x> <y> <direction>
|
Add a character or player to the event. This is mostly equivalent to adding them through the character positions field, but can be done at any point in the script (e.g. for use with goto for event variations). | ||||||||
choose <question> [<answer> <go to label>]+
|
Show a dialogue box to choose from a list of responses, then optionally skip to a label based on the selected answer.
Arguments:
For example, here's a simple choice which doesn't affect anything: choose "Do you like apples?" "I love them." _ "I hate them." _/ Or you can change the course of the event based on the choice: speak Abigail "Do you... like me?$l"/ choose "" "Yes!" happy "No." heartbroken/ label heartbroken/ speak Abigail "Oh. I understand.$s"/ faceDirection Abigail left/ pause 3000/ end/ label happy/ speak Abigail "We should explore the mines together next time!$h"/ ... | ||||||||
completeQuest <id>
|
Mark a quest complete. If the quest has no reward to collect, this also removes it from the in-game journal. | ||||||||
conditionSpeak <npc> [<dialogue> [condition]]+
|
Make an NPC say a dialogue based on arbitrary conditions. The first dialogue with a matching dialogue is spoken; if none match, the command is skipped.
Arguments:
For example, here Maru says a different line if the player suggested she tell the truth: conditionSpeak Maru "I accidentally dropped one of the samples... I'm so sorry.$s" "ANSWERED 38" "@ came in and slammed the door so loud I dropped this sample.$u" | ||||||||
goto [<target> [condition]]+
|
Skip forward or backward to a specific position in the event script. Each <target> can be:
You can list any number of label/condition pairs, and it will go to the first label with a matching condition. If a condition is omitted, it defaults to always true. If none of the conditions match, it continues to the next command normally. For example, this event script uses goto to repeat a question until a specific answer is selected: .../ label question/ choose Abigail "Hey! Did you have your eye on someone?" "Abigail" correct "Penny" wrong "Alex" wrong/ label wrong/ speak Abigail "Oh?$u"/ pause 500/ goto question/ label correct/ speak Abigail \"I thought so!$l\"/ pause 500/ end You can make goto conditional using game state queries. For example, this will go to the divorced label if you divorced Abigail, and continue to the next command if not: goto divorced "PLAYER_NPC_RELATIONSHIP Current Abigail Divorced"/ | ||||||||
label <label>
|
Set a named position in the event script, which you can go to using the goto command.
Note: you can't use end as a label name, since that automatically matches the end event command. |
Improved existing commands
| command | description |
|---|---|
| gainSkill | Added argument validation. |
| skippable | Added an optional [skip to label] argument. If set, the event will jump to that label when the player clicks the skip button (see goto for more info). The last skippable command run before the player skips is applied.
This is meant to clean up or grant unlocks before the event ends. For example: skippable beforeEnd/ .../ label beforeEnd/ gainSkill Fishing 1/ addItem (T)TrainingRod/ end Technically you can jump to any point in the event (e.g. to cancel the skip). However, the skip action will still cancel any ongoing event behavior like ongoing player/NPC movements, so you should be careful doing this. |
| splitSpeak | You should now specify each dialogue as a separate argument (though the old syntax will still work):
// in 1.6.15 splitSpeak Sam "You think so?~Yeah... kids should play and have fun while they still have the chance." // in 1.6.16 splitSpeak Sam "You think so?" "Yeah... kids should play and have fun while they still have the chance." This also now works with the new choose command too. |
| spriteText | The [text] argument can now be a translation key to get the text from.
|
Deprecated commands
These event commands are deprecated. They still work just like before (except the ones at the bottom of the table), but if you use the EventValidator it'll report them as an error.
| event command | migration |
|---|---|
| fork resetVariable switchEvent |
Use the choose or goto commands instead. If you used dialogue containing the %fork token, it should be removed and replaced with equivalent event commands. |
| question forkX | Use the choose command instead, and replace the event fork with a label.
For example, this script: // main event question fork1 "#I believe in you!#Wow, you're really arrogant."/ fork arrogant/ speak Alex "Thanks, @. I'll remember that."/ ... // 'arrogant' event emote Alex 12/ speak Alex "Hmmph... I think someone's a little jealous.$a"/ Becomes this script: choose "" "I believe in you!" believe "Wow, you're really arrogant." arrogant/ label believe/ speak Alex "Thanks, @. I'll remember that."/ ... label arrogant/ emote Alex 12/ speak Alex "Hmmph... I think someone's a little jealous.$a"/ ... Forks often duplicated the end of the script. In that case, you can have both variants just goto the common ending instead. |
| question null | Use choose with _ labels instead. (Setting a label argument to _ means it'll just continue to the next command instead.)
For example, this command: question null "But what am I going to say to Vincent?#It's best to be honest with kids.#You did the right thing. Kids should have hope."/ Would become this command: choose "But what am I going to say to Vincent?" "It's best to be honest with kids." _ "You did the right thing. Kids should have hope." _/ |
| quickQuestion | Use the choose command instead. The <question> and <answerX> have matching choose arguments, while the <answerX script> arguments become labels.
For example, this command: quickQuestion #I'd like to help#Nah, I'll pass...(break)emote Willy 32\speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."(break)emote Willy 28\speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/ Becomes this script: choose "" "I'd like to help" accept "Nah, I'll pass..." refuse/ label accept/ emote Willy 32/ speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."/ goto resume/ label refuse/ emote Willy 28/ speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/ label resume/ |
| cutscene bandfork elliottBookTalk question haleyDarkRoom question shaneCliffs question shaneLoan |
These commands are deleted and will no longer work. They're unlikely to be used by mod events, but see their relevant events for the new equivalents if needed. |
Changed event keys
Events were generally unified and de-hardcoded in 1.6.16. In particular...
- Several events were previously defined in the game's C# code, where they couldn't be changed by content packs. Most of these were moved into Data/Events/* with translations in Strings/Events:
event new asset name new event ID forest raccoon finished event Data/Events/Forest RaccoonFinish forest trash bear cleanup Data/Events/Forest 777111 island Gourmand crop inspection Data/Events/islandFarmCave GourmandInspection summit perfection cutscene Data/Events/Summit SummitPerfection summit cheat event Data/Events/Summit SummitCheat - Others were moved from non-event data into Data/Events/*:
event old location new asset new event ID Birdie quest intro & completed Strings/Locations:IslandSecret_Event_BirdieIntro
Strings/Locations:IslandSecret_Event_BirdieFinished
Strings/Locations:alreadyGotNutsData/Events/IslandWest -888999 (intro)
-666777 (completed)field office intro & completed Strings/Locations:IslandFieldOffice_Intro_Event
Strings/Locations:FieldOfficeFinaleData/Events/IslandFieldOffice FieldOfficeIntro
FieldOfficeDoneLeo intro Strings/Locations:IslandHut_Event_ParrotBoyIntro Data/Events/IslandHut LeoIntro Meowmere event Strings/1_6_Strings:ForestPylonEvent Data/Events/WizardHouseBasement ForestPylon Mr. Qi Skull Cavern level 100 Data/ExtraDialogue:SkullCavern_100_event
Data/ExtraDialogue:SkullCavern_100_event_honorableData/Events/SkullCave SkullCavern100 Professor Snail exits cave Strings/Locations:IslandNorth_Event_SafariManAppear Data/Events/IslandNorth ProfSnailIntro - Other event keys were changed or merged as part of the other event changes:
asset entry key change in 1.6.16 Data/Events/AbandonedJojaMart missingBundleCompleteEvent key changed to 192393to match the event ID.Data/Events/Farm 992559/t 600 1130/n clothFound/o Emily/w sunny992559/t 600 1130/n clothFound/O Emily/w sunnyMerged into a single 992559/Time 600 1130/LocalMail clothFound/Weather sunnyevent.Data/Events/QiNutRoom 10040609Event key changed to 10040609/per the precondition change.Data/Events/SamHouse 94/e 93/k 95/t 1800 1950/i 136/y 194/e 93/k 95/t 1800 1950/i 136/y 2Merged into a single 95/SawEvent 93/!SawEvent 94/Time 1800 1950/HasItem 136event.Data/Events/Town 611173/Hn pamHouseUpgrade/o PennyMerged into the existing 611173/Hn pamHouseUpgradeevent.
For events that didn't previously have an event ID, their new IDs will be added to the player's seen-events list automatically if needed when the save is loaded.
Other event changes
- Moved all vanilla events' on-skip behavior into their event scripts (except the pet adoption logic).
Game state query changes
Added new game state queries:
| Condition | effect |
|---|---|
| IS_DEBRIS_WEATHER IS_GREEN_RAINING IS_LIGHTNING IS_RAINING IS_SNOWING |
Whether the weather in the given location sets the related weather field. For example, IS_RAINING is true for the Rain, GreenRain, and Storm weathers. |
LOCATION_MINE_DIFFICULTY <location> <min> [max]
|
Whether the given location is in the mines or Skull Cavern, and its difficulty level is between <min> and [max] (default unlimited) inclusively. Difficulty 0 is the default difficulty, and modifiers like the Shrine of Challenge or some special orders each increase it by one.
|
LOCATION_MINE_LEVEL <location> <min> [max]
|
Whether the given location is in the mines or Skull Cavern, and its floor level is between <min> and [max] (default unlimited) inclusively. The Skull Cavern implicitly starts at level 121 (e.g. Skull Cavern level 10 is mine level 130).
|
PLAYER_QUEST_ACTIVE <player> <id>+PLAYER_QUEST_COMPLETE <player> <id>+
|
Whether the specified player(s) have any of the specified quest IDs open (PLAYER_QUEST_ACTIVE) or previously completed (PLAYER_QUEST_COMPLETE). |
Item query changes
Added one new item query:
| query | effect |
|---|---|
| SEASONAL_RACCOON_SEED | Get a seasonal raccoon seed for the current season.
This sets the stack size to the recommended amount based on the player's luck. When used in item spawn fields, you can set MinStack and MaxStack to override the stack size. |
Item spawn field changes
- Added new item spawn fields:
field effect Color (Optional) For item types that support it (e.g. objects and clothes), a tint color to apply to the produced item. Default none. Enchantments (Optional) For tools and weapons, the enchantment IDs to apply (matching their IDs in Data/Enchantments). This field applies the normal enchantment rules. Default none. This is specified as an array, and you can repeat secondary enchantments to boost their level. For example, this applies Vampiric and Attack (level 2):
"Enchantments": [ "Vampiric", "Attack", "Attack" ]
IsSpecial (Optional) Whether to mark the produced item as a special permanent item, which can't be destroyed or dropped. Default false. ObjectIsQuestItem (Optional) Whether to mark the dropped item as a quest item. This enables special rules like not being able to gift the item, and the item getting auto-recovered when it's lost in some cases. Default false. TempData (Optional) Set temporary item info that's not synchronized in multiplayer or written to the save file. This is somewhat specialized, and does nothing if there's no game logic or C# mod logic which reads it. Default none. For example, this adds a custom flag:
"TempData": { "SomeExampleKey": "Example Value" }
A C# code can then check for the field on the dropped items:
if (item.TryGetTempData("SomeExampleKey", out object value)) ...;
- The ObjectColor field is obsolete and replaced by Color. Content packs which set it will still work (since the game will pass the value through to Color automatically).
New trigger actions
| action | effect |
|---|---|
CompleteQuest <quest ID>
|
Complete all active quests with this ID in the player's journal. |
Other changes
- Added validation for schedule offset command in end-of-route animations.
- Fixed FarmHouseFurniture map property only allowing numeric item IDs.
- Fixed crash when loading a save with missing building interiors.
- Fixed intermittent crash when an item delivery quest for a non-Wizard NPC requests a cooking-type item.
- Fixed RejectItem_* dialogue disabling the NPC's normal dialogue after it's shown.
- Fixed NPC FlowerDanceCanDance field ignored for non-datable NPCs with no dialogue.
Changes for C# mod authors
Instance statics no longer affect mod assemblies
In multiplayer, split-screen mode works by swapping the values of static fields for each screen (called instanced statics). In previous versions, Stardew Valley would scan all loaded assemblies for static fields marked with [InstancedStatic] attributes except a few ignored assemblies like MonoGame.
In Stardew Valley 1.6.16, the game now only does this for the main game assembly to improve performance. If a mod was using [InstancedStatic], it should use SMAPI's built-in per-screen data utility instead.
AssetNameUtility
The new AssetNameUtility class has methods for working with asset names:
| method | usage |
|---|---|
| Normalize | A low-level method which normalizes path separators in an asset name. For example:
string assetName = AssetNameUtility.Normalize("Characters/\\/Abigail"); // produces "Characters/Abigail"
Consider using SMAPI's PathUtilities.NormalizeAssetName instead, which is more thorough. |
| TryParseTranslationKey | Parses a translation key into its component parts. For example:
if (AssetNameUtility.TryParseTranslationKey("Strings/UI:Confirm", out string assetName, out string fieldKey, out string error))
...; // assetName: Strings/UI, fieldKey: Confirm, error: null
This doesn't check whether the asset or key exists; see Game1.content.IsValidTranslationKey to do that. |
EventValidator
Overview
The new EventValidator class analyses event scripts to detect issues like...
- command names which don't match a registered command or alias;
- command arguments which don't match those expected by the command;
- and custom rule violations based on the EventValidator.CommandValidators field (e.g. a default validator checks that goto commands match a valid label).
This is mainly meant to implement unit tests for events. For example, to validate all events in a data asset:
string assetName = "Data/Events/Farm";
var events = Game1.content.Load<Dictionary<string, string>>(assetName);
var validator = new EventValidator();
foreach ((string key, string script) in events)
{
foreach (var issue in validator.Validator(assetName, key, script))
Assert.Fail($"Validation failed for event '{key}' > command '{issue.CommandText}': {issue.SuggestedError}.");
}
Command argument validation
Argument validation is enabled if the command's handler method has an EventArguments attribute, which defines the argument pattern using a special syntax. Each command can list multiple patterns, and it'll be considered valid if any of them matches. If the pattern is an empty string, the validator will ensure no arguments are provided.
For example, the default showFrame command is defined like this:
[EventArguments("int", "actor int bool?")]
public static void ShowFrame(Event @event, string[] args, EventContext context)
An argument pattern consists of space-delimited tokens, where each token defines the format for an argument. For example, actor int bool? has three tokens representing three arguments: an actor name, a positive integer, and an optional boolean.
These are the tokens recognized by the validator:
| token | meaning |
|---|---|
| generic argument types | |
| bool | A boolean value (true or false). |
| float | A positive number with optional decimal point (like 5 or 0.5). |
| -float | A number with optional decimal point and optional negative sign (like 5, -5, or -0.5). |
| int | A positive integer (like 5). |
| -int | An integer with optional negative sign (like 5 or -5). |
| string | A quoted sequence of arbitrary text like "some words here". If the argument has no quotes, this is equivalent to the word token. |
| word | A simple sequence of letters, numbers, periods, and/or underscores (usually an ID or similar value). While the command will accept quotes, they're redundant and will be rejected by the validator. |
| remainder | One or more arguments of any type. |
| specific string formats | |
| actor | An actor name in the event format (like Abigail or Kent?). |
| assetName | An asset name like Data/Achievements. |
| direction | A direction which can be specified as either a number (like 0) or name (like up). |
| goToLabel | An event label (see the goto and label event commands). This is equivalent to word, but is used by EventValidator to validate label references. |
| itemId | An item ID which can be qualified or unqualified (like (O)MossySoup or MossySoup). |
| translationKey | A translation key like Strings/Locations:SomeKey. |
| custom formats | |
| '...' | The literal text or regex pattern to match, like 'continue' or '[\w-]+'.
|
In addition, you can extend tokens with these indicators:
- Suffix with + for repeating argument of that type. For example, int+ would allow both 5 and 5 6 7.
- Suffix with ? for an optional argument which can be omitted. All tokens after this token must also be optional. (You can have optional repeating arguments like int+?.)
- Infix with | for a parameter which can be one of multiple types. For example int|bool will allow either integer or boolean values.
Item changes
- Added IItemDataDefinition.GetContextTags(itemData) method, so custom item data definitions can add context tags from their data if applicable.
- Fixed
item.CopyFieldsFrom(other)always setting the stack size for the copy to 1.
Monster changes
- The monster data has been overhauled.
- The new monster.Tags field contains a set of metadata tags about the monster which can be checked in Data/Monsters. It's safe to add new tags to the list for existing monster types.
- The former monster.objectsToDrop field (a list of string object IDs) has been replaced by monster.drops (an item inventory).
- Removed monster.getExtraDropItems(). Drops should be added in Data/Monsters instead.
Other breaking API changes
(This section is meant as a quick reference if you have build errors; there's no need to read through it otherwise.)
Removed or renamed types
These classes were removed or renamed in 1.6.16:
| type | migration |
|---|---|
| BaseEnchantment | Renamed to Enchantment. |
| AxeEnchantment BaseWeaponEnchantment FishingRodEnchantment HoeEnchantment MilkPailEnchantment PanEnchantment PickaxeEnchantment ShearsEnchantment WateringCanEnchantment |
Removed. Enchantments now target tools via data instead. |
Other API changes
These class members changed in 1.6.16:
| type | member | migration |
|---|---|---|
| BaseEnchantment (and its subclasses) |
hideEnchantmentName | Replaced by EnchantmentManager.HideEnchantmentName. |
| hideSecondaryEnchantName | Replaced by EnchantmentManager.HideSecondaryEnchantName. | |
| GetEnchantmentFromItem(…) | Replaced by EnchantmentManager.GetEnchantmentFromItem. | |
| GetAvailableEnchantments() | Removed.
| |
| GetAvailableEnchantmentsForItem(…) | Removed.
| |
| GetName() | Removed. This inconsistently returned an ID, a display name, or "Unknown Enchantment" depending on the enchantment type. Use the new Id property or the pre-existing GetDisplayName() method instead. | |
| GetLevel() | Removed. Use Level instead. | |
| GetType() | This was sometimes to identify enchantments (like enchantment.GetType() == expectedEnchantment.GetType()). That's no longer reliable, since 1.6.16 introduces data-based enchantments which may not have their own C# type. You should use the new enchantment.Id property instead.
| |
| ResetEnchantments() | Removed. This is no longer needed since it no longer has a cached list of enchantment instances. | |
| Boots | price | Removed. This was never used, since boots prices are calculated dynamically. |
| FishingRod | lastCatchWasJunk | Renamed to lastCatchSkippedMinigame to more accurately convey what it does. |
| Furniture | armchair bed bench bookcase chair couch decor dresser fireplace lamp longTable other painting rug sconce table torch window |
Removed. Replaced by the FurnitureType enum (e.g. Furniture.rug is now FurnitureType.Rug).
|
| placementRestrictions | Removed. Replaced by CanPlaceIndoors and CanPlaceOutdoors. | |
| Monster | getExtraDropItems() | Removed. Drops should be added to Data/Monsters instead.
Harmony patches which can't be moved into data can target Monster.RollForDrops instead. |
| objectsToDrop | Removed. Replaced by drops; see monster changes and Data/Monsters. | |
| Tool | GetEnchantmentLevel<T>() GetEnchantmentOfType<T>() hasEnchantmentOfType<T>() |
Removed. Replaced by GetEnchantmentLevel(id), GetEnchantment(id), and HasEnchantment(id) respectively. All vanilla enchantments have a constant for the ID like EnchantmentIds.GalaxySoul. |
Other changes
- Added PlatformAchievementIds and QuestIds constants.
- Added event.floorSprites field for temporary animated sprites that should be drawn on the ground (e.g. under NPC shadows).
- The game now uses forward slashes in all asset names (like Maps/Town instead of Maps\Town). This shouldn't affect most mods, since SMAPI already converted all asset names to forward slashes.
- Removed broken Lantern tool, Raft tool, and their related logic.
- Fixed
Event.TryGetEventCommandHandlernot loading commands if it's called before any other methods. - Fixed machine auto-load leaving empty slots in chests when taking a secondary ingredient.
- Fixed issue where placing a storage furniture (e.g. a dresser or fish tank) on a table would discard any items inside it.
Name translation changes for wiki maintainers
Some in-game item and monster names were retranslated in some languages for clarity or correctness.
This list is mostly provided to help wiki maintainers update pages, so it doesn't include names which only changed capitalization, changed ' (straight apostrophe) to ’ (curly) in French, or aren't visible to vanilla players (like mine rocks).
Objects
- Hungarian
item old name new name Bone Mill Csontőrlő Csontdaráló Cranberry Candy Vörös áfonyás cukorka Vörös áfonyás üdítő Tea Sapling Tea csemete Teacsemete Woodcutter's Weekly Favágok hetilapja Favágók hetilapja
- Russian
item old name new name Aged Roe (flavored) Вяленая икра (Альбакор) Вяленая икра альбакора Вяленая икра (Анчоус) Вяленая икра анчоуса Вяленая икра (Морской черт) Вяленая икра Морского черта Вяленая икра (Рыба-капля) Вяленая икра рыбы-капли Вяленая икра (Голубой дискус) Вяленая икра голубого дискуса Вяленая икра (Лещ) Вяленая икра леща Вяленая икра (Сомик) Вяленая икра сомика Вяленая икра (Карп) Вяленая икра карпа Вяленая икра (Сом) Вяленая икра сома Вяленая икра (Голавль) Вяленая икра голавля Вяленая икра (Гребешок) Вяленая икра гребешка Вяленая икра (Сердцевидка) Вяленая икра сердцевидки Вяленая икра (Краб) Вяленая икра краба Вяленая икра (Рак) Вяленая икра рака Вяленая икра (Багрянник) Вяленая икра Багрянника Вяленая икра (Дорада) Вяленая икра дорады Вяленая икра (Угорь) Вяленая икра угря Вяленая икра (Камбала) Вяленая икра камбалы Вяленая икра (Пятнистый криворот) Вяленая икра пятнистого криворота Вяленая икра (Ледорыб) Вяленая икра Ледорыба Вяленая икра (Ледорыб-младший) Вяленая икра Ледорыба-младшего Вяленая икра (Бычок) Вяленая икра бычка Вяленая икра (Палтус) Вяленая икра палтуса Вяленая икра (Сельдь) Вяленая икра сельди Вяленая икра (Ледопип) Вяленая икра ледопипа Вяленая икра (Большеротый окунь) Вяленая икра большеротого окуня Вяленая икра (Лавовый угорь) Вяленая икра лавового угря Вяленая икра (Легенда) Вяленая икра Легенды Вяленая икра (Легенда II) Вяленая икра Легенды II Вяленая икра (Змеезуб) Вяленая икра змеезуба Вяленая икра (Крылатка) Вяленая икра крылатки Вяленая икра (Омар) Вяленая икра омара Вяленая икра (Полуночный карп) Вяленая икра полуночного карпа Вяленая икра (Ночной кальмар) Вяленая икра ночного кальмара Вяленая икра (Мисс Морской черт) Вяленая икра Мисс Морской черт Вяленая икра (Мидия) Вяленая икра мидий Вяленая икра (Карп-мутант) Вяленая икра Карпа-мутанта Вяленая икра (Осьминог) Вяленая икра осьминога Вяленая икра (Устрица) Вяленая икра устриц Вяленая икра (Окунь) Вяленая икра окуня Вяленая икра (Литорина) Вяленая икра литорин Вяленая икра (Щука) Вяленая икра щуки Вяленая икра (Иглобрюх) Вяленая икра иглобрюха Вяленая икра (Радиоактивный карп) Вяленая икра Радиоактивного карпа Вяленая икра (Радужная форель) Вяленая икра радужной форели Вяленая икра (Барабулька) Вяленая икра барабульки Вяленая икра (Берикс) Вяленая икра берикса Вяленая икра (Лосось) Вяленая икра лосося Вяленая икра (Песковник) Вяленая икра песковника Вяленая икра (Сардина) Вяленая икра сардины Вяленая икра (Скорпионовый карп) Вяленая икра скорпионового карпа Вяленая икра (Морской огурец) Вяленая икра морского огурца Вяленая икра (Морской еж) Вяленая икра морского ежа Вяленая икра (Шэд) Вяленая икра шэда Вяленая икра (Креветка) Вяленая икра креветок Вяленая икра (Слаймджек) Вяленая икра слаймджека Вяленая икра (Малоротый окунь) Вяленая икра малоротого окуня Вяленая икра (Улитка) Вяленая икра улиток Вяленая икра (Малек Багрянника) Вяленая икра Малька Багрянника Вяленая икра (Жуть-рыба) Вяленая икра жуть-рыбы Вяленая икра (Кальмар) Вяленая икра кальмара Вяленая икра (Скат) Вяленая икра ската Вяленая икра (Рыба-камень) Вяленая икра рыбы-камня Вяленая икра (Солнечник) Вяленая икра солнечника Вяленая икра (Чудо-огурец) Вяленая икра чудо-огурца Вяленая икра (Тигровая форель) Вяленая икра тигровой форели Вяленая икра (Тиляпия) Вяленая икра тиляпии Вяленая икра (Тунец) Вяленая икра тунца Вяленая икра (Лосось пустоты) Вяленая икра лосося пустоты Вяленая икра (Желтый судак) Вяленая икра желтого судака Вяленая икра (Лесоплюх) Вяленая икра лесоплюха Bait Приманка Наживка Basic Retaining Soil Обычная влагосохраняющая почва Обычный аквагрунт Deluxe Retaining Soil Влагосохраняющая почва Делюкс Аквагрунт Делюкс Dried Fruit (flavored) Сушеная морошка Сушеная малина Jelly (flavored) Джем из морошки Малиновый джем Juice (flavored) Сок сквоша Кабачковый сок Magic Bait Волшебная приманка Волшебная наживка Quality Fertilizer Высококачественное удобрение Улучшенное удобрение Quality Retaining Soil Высококачественная влагосохраняющая почва Улучшенный аквагрунт Quality Sprinkler Высококачественный спринклер Улучшенный спринклер Roe (flavored) Икра (Альбакор) Икра альбакора Икра (Анчоус) Икра анчоуса Икра (Морской черт) Икра Морского черта Икра (Рыба-капля) Икра рыбы-капли Икра (Голубой дискус) Икра голубого дискуса Икра (Лещ) Икра леща Икра (Сомик) Икра сомика Икра (Карп) Икра карпа Икра (Сом) Икра сома Икра (Голавль) Икра голавля Икра (Гребешок) Икра гребешка Икра (Сердцевидка) Икра сердцевидки Икра (Краб) Икра краба Икра (Рак) Икра рака Икра (Багрянник) Икра Багрянника Икра (Дорада) Икра дорады Икра (Угорь) Икра угря Икра (Камбала) Икра камбалы Икра (Пятнистый криворот) Икра пятнистого криворота Икра (Ледорыб) Икра Ледорыба Икра (Ледорыб-младший) Икра Ледорыба-младшего Икра (Бычок) Икра бычка Икра (Палтус) Икра палтуса Икра (Сельдь) Икра сельди Икра (Ледопип) Икра ледопипа Икра (Большеротый окунь) Икра большеротого окуня Икра (Лавовый угорь) Икра лавового угря Икра (Легенда) Икра Легенды Икра (Легенда II) Икра Легенды II Икра (Змеезуб) Икра змеезуба Икра (Крылатка) Икра крылатки Икра (Омар) Икра омара Икра (Полуночный карп) Икра полуночного карпа Икра (Ночной кальмар) Икра ночного кальмара Икра (Мисс Морской черт) Икра Мисс Морской черт Икра (Мидия) Икра мидий Икра (Карп-мутант) Икра Карпа-мутанта Икра (Осьминог) Икра осьминога Икра (Устрица) Икра устриц Икра (Окунь) Икра окуня Икра (Литорина) Икра литорин Икра (Щука) Икра щуки Икра (Иглобрюх) Икра иглобрюха Икра (Радиоактивный карп) Икра Радиоактивного карпа Икра (Радужная форель) Икра радужной форели Икра (Барабулька) Икра барабульки Икра (Берикс) Икра берикса Икра (Лосось) Икра лосося Икра (Песковник) Икра песковника Икра (Сардина) Икра сардины Икра (Скорпионовый карп) Икра скорпионового карпа Икра (Морской огурец) Икра морского огурца Икра (Морской еж) Икра морского ежа Икра (Шэд) Икра шэда Икра (Креветка) Икра креветок Икра (Слаймджек) Икра слаймджека Икра (Малоротый окунь) Икра малоротого окуня Икра (Улитка) Икра улиток Икра (Малек Багрянника) Икра Малька Багрянника Икра (Жуть-рыба) Икра жуть-рыбы Икра (Кальмар) Икра кальмара Икра (Скат) Икра ската Икра (Рыба-камень) Икра рыбы-камня Икра (Осетр) Икра осетра Икра (Солнечник) Икра солнечника Икра (Чудо-огурец) Икра чудо-огурца Икра (Тигровая форель) Икра тигровой форели Икра (Тиляпия) Икра тиляпии Икра (Тунец) Икра тунца Икра (Лосось пустоты) Икра лосося пустоты Икра (Желтый судак) Икра желтого судака Икра (Лесоплюх) Икра лесоплюха Salmonberry Морошка Малина Summer Squash Seeds Семена сквоша Семена кабачка Summer Squash Сквош Кабачок Targeted Bait Наживка: Альбакор Наживка на альбакора Наживка: Анчоус Наживка на анчоуса Наживка: Морской черт Наживка на Морского черта Наживка: Рыба-капля Наживка на рыбу-каплю Наживка: Голубой дискус Наживка на голубого дискуса Наживка: Лещ Наживка на леща Наживка: Сомик Наживка на сомика Наживка: Карп Наживка на карпа Наживка: Сом Наживка на сома Наживка: Голавль Наживка на голавля Наживка: Гребешок Приманка для гребешков Наживка: Сердцевидка Приманка для сердцевидок Наживка: Краб Приманка для крабов Наживка: Рак Приманка для раков Наживка: Багрянник Наживка на Багрянника Наживка: Дорада Наживка на дораду Наживка: Угорь Наживка на угря Наживка: Камбала Наживка на камбалу Наживка: Пятнистый криворот Наживка на пятнистого криворота Наживка: Ледорыб Наживка на Ледорыба Наживка: Ледорыб-младший Наживка на Ледорыба-младшего Наживка: Бычок Наживка на бычка Наживка: Палтус Наживка на палтуса Наживка: Сельдь Наживка на сельдь Наживка: Ледопип Наживка на ледопипа Наживка: Большеротый окунь Наживка на большеротого окуня Наживка: Лавовый угорь Наживка на лавового угря Наживка: Легенда Наживка на Легенду Наживка: Легенда II Наживка на Легенду II Наживка: Змеезуб Наживка на змеезуба Наживка: Крылатка Наживка на крылатку Наживка: Омар Приманка для омаров Наживка: Полуночный карп Наживка на полуночного карпа Наживка: Ночной кальмар Наживка на ночного кальмара Наживка: Мисс Морской черт Наживка на Мисс Морской черт Наживка: Мидия Приманка для мидий Наживка: Карп-мутант Наживка на Карпа-мутанта Наживка: Осьминог Наживка на осьминога Наживка: Устрица Приманка для устриц Наживка: Окунь Наживка на окуня Наживка: Литорина Приманка для литорин Наживка: Щука Наживка на щуку Наживка: Иглобрюх Наживка на иглобрюха Наживка: Радиоактивный карп Наживка на Радиоактивного карпа Наживка: Радужная форель Наживка на радужную форель Наживка: Барабулька Наживка на барабульку Наживка: Берикс Наживка на берикса Наживка: Лосось Наживка на лосося Наживка: Песковник Наживка на песковника Наживка: Сардина Наживка на сардину Наживка: Скорпионовый карп Наживка на скорпионового карпа Наживка: Морской огурец Наживка на морского огурца Наживка: Шэд Наживка на шэда Наживка: Креветка Приманка для креветок Наживка: Слаймджек Наживка на слаймджека Наживка: Малоротый окунь Наживка на малоротого окуня Наживка: Улитка Приманка для улиток Наживка: Малек Багрянника Наживка на Малька Багрянника Наживка: Жуть-рыба Наживка на жуть-рыбу Наживка: Кальмар Наживка на кальмара Наживка: Скат Наживка на ската Наживка: Рыба-камень Наживка на рыбу-камень Наживка: Осетр Наживка на осетра Наживка: Солнечник Наживка на солнечника Наживка: Чудо-огурец Наживка на чудо-огурец Наживка: Тигровая форель Наживка на тигровую форель Наживка: Тиляпия Наживка на тиляпию Наживка: Тунец Наживка на тунца Наживка: Лосось пустоты Наживка на лосося пустоты Наживка: Желтый судак Наживка на желтого судака Наживка: Лесоплюх Наживка на лесоплюха Wine (flavored) Вино из морошки Малиновое вино
Furniture
- Hungarian
item old name new name Artist Bookcase Művészi könyvespolc Művészi könyvszekrény Birch Double Bed Birs dupla ágy Nyírfa dupla ágy Birch Lamp End Table Nyírfa lámpás éjjeliszekrény Nyírfa éjjeliszekrény lámpával China Cabinet Kínai vitrin Porcelános vitrin Coffee Table Kávésasztal Kávézó asztal Dark Bookcase Sötét könyvespolc Sötét könyvszekrény Gray Joja Bookcase Szürke Joja könyvespolc Szürke Joja könyvszekrény Gray Joja Coffee Table Szürke Joja kávésasztal Szürke Joja kávézó asztal Joja Bookcase Joja könyvespolc Joja könyvszekrény Joja Coffee Table Joja kávésasztal Joja kávézó asztal Junimo Bookcase Junimo könyvespolc Junimo könyvszekrény Large Wizard Bookcase Nagy varázsló könyvespolc Nagy varázsló könyvszekrény Luxury Bookcase Luxus könyvespolc Luxus könyvszekrény Mahogany Lamp End Table Mahagóni lámpás éjjeliszekrény Mahagóni éjjeliszekrény lámpával Modern Bookcase Modern könyvespolc Modern könyvszekrény Oak Lamp End Table Tölgyfa lámpás éjjeliszekrény Tölgyfa éjjeliszekrény lámpával Retro Bookcase Retro könyvespolc Retro könyvszekrény Short Bookcase Kicsi könyvespolc Kicsi könyvszekrény Short Wizard Bookcase Alacsony varázsló könyvespolc Alacsony varázsló könyvszekrény Small Wizard Bookcase Kicsi varázsló könyvespolc Kicsi varázsló könyvszekrény Spirits Table Italosasztal Italos asztal Walnut Lamp End Table Diófa lámpás éjjeliszekrény Diófa éjjeliszekrény lámpával Wizard Bookcase Varázsló könyvespolc Varázsló könyvszekrény
- Russian
item old name new name Pierre's Sign Знак Пьера Вывеска Пьера
Hats
- French
item old name new name Good Ol' Cap Veille casquette Vieille casquette
- Russian
item old name new name Blobfish Mask Маска рыбы-пузыря Маска рыбы-капли Bluebird Mask Маска сиалии Маска синей птицы Cowgal Hat Шляпа девушки-ковбоя Женская ковбойская шляпа Deluxe Pirate Hat Элитная пиратская шляпа Роскошная пиратская шляпа Dinosaur Hat Шляпа-динозавр Шапка динозавра Official Cap Кепка от униформы Фуражка Panda Hat Шляпка Панды Шапка панды Party Hat Шляпа тусовщика Праздничный колпак Santa Hat Шляпа Санты Шапка Санты Star Helmet Звездный шлем Шапка со звездами Sunglasses Солнечные очки Солнцезащитные очки Tiger Hat Тигриная шляпа Тигриная шапка
Pants
- Russian
item old name new name Dinosaur Pants Динозавровы штаны Динозавровые штаны
Shirts
- Hungarian
item old name new name Goodnight Shirt Jóéjt póló Jó éjt póló
Tools
- Hungarian
item old name new name Advanced Iridium Rod Fejlett irídium horgászbot Profi irídium horgászbot Milk Pail Tejesvödör Tejes vödör
Weapons
- Hungarian
item old name new name Iridium Needle Irídium tű Irídiumtű Iridium Scythe Irídium kasza Irídiumkasza
- Russian
item old name new name Abby's Planchette Дощечка Эбби Спиритическая планшетка Эбби Dark Sword Темный Меч Темный клинок Dragontooth Club Драконозубья дубинка Дубина из драконьего зуба Dragontooth Cutlass Драконозубья сабля Сабля из драконьего зуба Dragontooth Shiv Драконозубья заточка Заточка из драконьего зуба Dwarf Dagger Кинжал Дварфов Дварфийский кинжал Dwarf Hammer Молот Дварфов Дварфийский молот Dwarf Sword Меч Дварфов Дварфийский меч Insect Head Жучья Голова Жучиная голова Leah's Whittler Точилка Леи Резец Леи Seb's Lost Mace Потерянная палица Себа Потерянная булава Себа Wind Spire Башня Ветров Пика ветров
Monsters
- Hungarian
monster old name new name Truffle Crab Kőrák Szarvasgombarák
XNB impact
Overview
This section provides a summary of the XNB files which changed in Stardew Valley 1.6.16. This doesn't include new files (since they won't impact existing mods), text changes in non-English files, or the switch from \ to / in asset names (since that's backwards compatible).
XNB mods are disproportionately affected, since...
- they replace the entire file;
- they're loaded through the MonoGame content pipeline which is less tolerant of format changes;
- they don't benefit from the compatibility rewrites Content Patcher provides for its content packs.
Content Patcher packs are typically unaffected (and Content Patcher will try to rewrite content packs automatically). However if a content pack replaces an entire asset instead of editing, it's more likely to be affected like an XNB mod.
Changed assets
Compatibility is broadly grouped into four categories:
- "✘ broken": mods will remove new content or significant changes, or the mod's intended changes will no longer work. Effects may range from display bugs to crashes, depending how the game uses that specific content.
- "✘ will remove changes": mods will remove minor changes in 1.6.16 (e.g. typo fixes).
- "✓ mostly unaffected": mods will only be affected if they replace the entire asset, or edit specific entries or fields.
- Blank: no expected impact for the vast majority of mods.
| content asset | changes in 1.6.16 | compatibility for pre-1.6.16 mods | |
|---|---|---|---|
| XNB mods | Content Patcher packs | ||
| Characters/Dialogue/* |
|
✘ will remove fixes. | |
| Data/Boots | Overhauled format. | ✘ broken | ✘ broken (until Content Patcher adds runtime migrations) |
| Data/Buffs | Added new data fields. | ✘ broken | |
| Data/CookingRecipes | Changed several recipe keys. | ✘ broken | ✓ mostly unaffected (until Content Patcher adds runtime migrations) |
| Data/Events/* Data/Events/Festivals/* |
|
✘ broken | ✓ mostly unaffected |
| Data/ExtraDialogues |
|
✓ mostly unaffected | ✓ mostly unaffected |
| Data/Furniture |
|
✘ broken | ✘ broken (until Content Patcher adds runtime migrations) |
| Data/Hats |
|
✘ broken | ✘ broken (until Content Patcher adds runtime migrations) |
| Data/LocationContexts | Changed weather conditions to fix re-randomization issue. | ✘ will remove fixes. | ✓ mostly unaffected. |
| Data/Locations | Changed Legend condition to use new IS_RAINING query to support mods weathers. | ✘ will remove fixes. | ✓ mostly unaffected. |
| Data/LostItemsShop | Added new field. | ✘ broken | |
| Data/Monsters | Overhauled format. | ✘ broken | ✘ broken (until Content Patcher adds runtime migrations) |
| Data/Objects | Added new fields and new context tags. | ✘ broken | |
| Data/SpecialOrders | Added new fields. | ✘ broken | |
| Data/Tools |
|
✘ broken | |
| Data/Weapons | Added new fields. | ✘ broken | |
| Data/Weddings | Fixed Lewis skipping his matrimonial dialogue at the farmer's wedding. | ✘ will remove fix | ✓ mostly unaffected |
| Maps/Bus(people) Maps/busPeople Maps/Island_Secret |
Removed (these were unused). | ||
| Strings/Events | Added the translations for multilingual events. | ✘ broken | |
| Strings/1_6_Strings |
|
✓ mostly unaffected | ✓ mostly unaffected |
| Strings/Furniture | Added translations for catalogue descriptions (moved from Strings/1_6_Strings). | ✘ broken | |
| Strings/Locations | Removed hardcoded events. | ✓ mostly unaffected | ✓ mostly unaffected |
| Strings/Objects | Moved some translations into Strings/Furniture. | ✓ mostly unaffected | ✓ mostly unaffected |
| Strings/StringsFromCSFiles Strings/Tools |
Removed some unused translations. | ||
| Strings/UI | Merged male/female variants of PondQuery_StatusRequestPending_* entries. | ✘ broken | ✓ mostly unaffected |