Jump to content

Modding:Migrate to Stardew Valley 1.7

From Stardew Valley Wiki
Revision as of 19:06, 23 June 2025 by imported>Pathoschild (→Other API changes: + alternative to Monster.getExtraDropItems() for Harmony patches)

←Index

This page is for mod authors. Players: see the mod compatibility list instead.

⚠ No upcoming Stardew Valley update has been announced.
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

SMAPI mod compatibility over time.

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:
  1. Update for Stardew Valley 1.6.9 if you haven't already.
  2. Rebuild the solution.
  3. Fix any build errors and review any build warnings. You can search this page and previous migration guides for relevant info as needed.
  4. 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.)
  5. Test to make sure the mod works.
  6. Skim through this page, and check any section that might be relevant to the mod.
For Content Patcher packs:
  1. Update for Stardew Valley 1.6.9 if you haven't already.
  2. 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...

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/ChairTiles

  • Fixed support for tilesheet asset names containing a dot. (For example, a tileseet asset named ExampleAuthor.ModName_Tilesheet now correctly uses that as the data key instead of ExampleAuthor.)

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...

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:

bed type effect
Single A single-sized bed with room for one player or NPC.
Double A double-sized bed with room for two players or NPCs.
Child A single bed for a child NPC.
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...

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:

  • DrawFullHair: the hair is drawn like usual (e.g. for hats that don't hide the hair like Abigail's bow).
  • DrawObscuredHair: the hair is partly obscured under the hat (e.g. for most hats like the cowboy hat).
  • HideHair: the hair is fully hidden (e.g. for hats which fully cover the head like the mummy mask).
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:

field effect
common fields See item spawn fields for the generic item fields supported for monster drops.

Notes:

  • If a drop has an item query which returns multiple item stacks, one of them will be selected at random.
  • The Condition field can optionally contain the %RANDOM_KEY token, which is set to a unique identifier for this monster during the current tick.
ForTags (Optional) The monster tags for which this drop applies. This can be a context tag-like query string like !variant_frost_bat, !variant_lava_bat (not frost bat or lava bat). Default none, meaning it applies to all monsters with this data.
Chance (Optional) A probability that this item will be found, as a value between 0 (never) and 1 (always). Default 1.
RepeatingChance (Optional) A compounding probability of an extra drop, as a value between 0 (never) and .95 (nearly always). Default 0.

This applies after an item has been dropped based on the other fields. This chance is repeatedly checked to produce an extra drop until it fails. Each repeat drop will ignore the Chance and Condition fields, but reapply all other item spawn fields (e.g. re-selecting RandomItemId if applicable).

RepeatingChanceKey (Optional) When checking the RepeatingChance field, use this to seed a predictable RNG. This can be used to synchronize separate drops. Default none.

This can optionally contain the %RANDOM_KEY token, which is set to a unique identifier for this monster during the current tick.

ExplodeStack (Optional) Whether to split multi-item stacks into single-item stacks. Default false.

For example, let's say a monster would drop a stack of 15 wood. With this option enabled, it would instead drop 15 stacks of one wood each.

SkipIfDropped (Optional) Skip the current entry if one of these drop IDs have already been dropped. Default none.

This is specified as an array. For example:

"SkipIfDropped": [ "ExampleDropId", "AnotherDropId" ]
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:

field effect
monster fields All monster fields (except DefaultVariant and Variants) can be set on the variant. All fields are optional, and default to the value set in the monster's base data.
InheritDrops (Optional) Whether to inherit drops defined in the monster's base Drops field. Default true.

Specifically:

  • If true, the variant will combine the base Drops and variant Drops into one list.
  • If false, only drops in the variant Drops field are applied.
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/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.

field effect
Id A unique string ID for this entry.
MinLevel (Optional) The minimum enchantment level for which these stats apply. Default 0 (i.e. any level).
other fields See the Effects field in Data/Buffs, which is equivalent to this model.
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:

argument usage
<question> The translation key or literal text to show above the choices. This can be empty ("") to omit the question line.
<answer> The translation key or literal text for an answer to show.
<go to label> If the player chooses this answer, jump to this label in the event (see the goto command for more info). This can be "" or _ to continue to the next command instead.

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"/
...
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:

argument usage
<npc> The internal name of the NPC who should speak (which can be marked optional).
<dialogue> The translation key or literal text for the dialogue to speak. If omitted or empty, the command is skipped when the condition is matched.
[condition] One of:
  • a game state query;
  • or ANSWERED <response ID>+ as a shortcut for the PLAYER_HAS_DIALOGUE_ANSWER Current query;
  • or omitted/blank to always match this dialogue if no previous one matched.

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:
target description
end Jump to the last end event command in the script.
any other value Jump to the first label command with this name.

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:alreadyGotNuts
    Data/Events/IslandWest -888999 (intro)
    -666777 (completed)
    field office intro & completed Strings/Locations:IslandFieldOffice_Intro_Event
    Strings/Locations:FieldOfficeFinale
    Data/Events/IslandFieldOffice FieldOfficeIntro
    FieldOfficeDone
    Leo 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_honorable
    Data/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 missingBundleComplete Event key changed to 192393 to match the event ID.
    Data/Events/Farm 992559/t 600 1130/n clothFound/o Emily/w sunny
    992559/t 600 1130/n clothFound/O Emily/w sunny
    Merged into a single 992559/Time 600 1130/LocalMail clothFound/Weather sunny event.
    Data/Events/QiNutRoom 10040609 Event key changed to 10040609/ per the precondition change.
    Data/Events/SamHouse 94/e 93/k 95/t 1800 1950/i 136/y 1
    94/e 93/k 95/t 1800 1950/i 136/y 2
    Merged into a single 95/SawEvent 93/!SawEvent 94/Time 1800 1950/HasItem 136 event.
    Data/Events/Town 611173/Hn pamHouseUpgrade/o Penny Merged into the existing 611173/Hn pamHouseUpgrade event.

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
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).

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.

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.
  • To check whether any enchantments can be applied to a tool through the forge, use EnchantmentManager.CanForgeEnchant.
  • There's no directly equivalent method in 1.6.16, but you can mimic the former logic if needed.
    static List<Enchantment> GetAvailableEnchantments()
    {
        var dataAsset = DataLoader.Enchantments(Game1.content);
    
        List<Enchantment> enchantments = [];
        foreach ((string id, EnchantmentData data) in dataAsset)
        {
            if (data.ForgeWith == Object.prismaticShardQID)
                enchantments.Add(EnchantmentManager.CreateEnchantment(dataAsset, id));
        }
    
        return enchantments;
    }
    
GetAvailableEnchantmentsForItem(…) Removed.
  • To check whether any enchantments can be applied to a tool through the forge, use EnchantmentManager.CanForgeEnchant.
  • There's no directly equivalent method in 1.6.16, but you can mimic the former logic if needed.
    static List<Enchantment> GetAvailableEnchantmentsForItem(Item? tool, Item? item)
    {
        var dataAsset = DataLoader.Enchantments(Game1.content);
        var contextTags = tool?.GetContextTags();
    
        List<Enchantment> enchantments = [];
        foreach ((string id, EnchantmentData data) in dataAsset)
        {
            if (data.ForgeWith == Object.prismaticShardQID && (contextTags is null || EnchantmentManager.MatchesTags(contextTags, data.AppliesTo)))
                enchantments.Add(EnchantmentManager.CreateEnchantment(dataAsset, id));
        }
    
        return enchantments;
    }
    
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 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.
  • Fixed Event.TryGetEventCommandHandler not loading commands if it's called before any other methods.
  • Fixed machine auto-load leaving empty slots in chests when taking a secondary ingredient.

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ó
Russian
item old name new name
Aged Roe (flavored) Вяленая икра (Альбакор) Вяленая икра альбакора
Вяленая икра (Анчоус) Вяленая икра анчоуса
Вяленая икра (Багрянник) Вяленая икра Багрянника
Вяленая икра (Барабулька) Вяленая икра барабульки
Вяленая икра (Берикс) Вяленая икра берикса
Вяленая икра (Большеротый окунь) Вяленая икра большеротого окуня
Вяленая икра (Бычок) Вяленая икра бычка
Вяленая икра (Голавль) Вяленая икра голавля
Вяленая икра (Голубой дискус) Вяленая икра голубого дискуса
Вяленая икра (Гребешок) Вяленая икра гребешка
Вяленая икра (Дорада) Вяленая икра дорады
Вяленая икра (Желтый судак) Вяленая икра желтого судака
Вяленая икра (Жуть-рыба) Вяленая икра жуть-рыбы
Вяленая икра (Змеезуб) Вяленая икра змеезуба
Вяленая икра (Кальмар) Вяленая икра кальмара
Вяленая икра (Камбала) Вяленая икра палтуса
Вяленая икра (Карп) Вяленая икра карпа
Вяленая икра (Карп-мутант) Вяленая икра Карпа-мутанта
Вяленая икра (Краб) Вяленая икра краба
Вяленая икра (Креветка) Вяленая икра креветок
Вяленая икра (Лавовый угорь) Вяленая икра лавового угря
Вяленая икра (Легенда II) Вяленая икра Легенды II
Вяленая икра (Легенда) Вяленая икра Легенды
Вяленая икра (Ледопип) Вяленая икра ледопипа
Вяленая икра (Ледорыб) Вяленая икра Ледорыба
Вяленая икра (Ледорыб-младший) Вяленая икра Ледорыба-младшего
Вяленая икра (Лесоплюх) Вяленая икра лесоплюха
Вяленая икра (Лещ) Вяленая икра леща
Вяленая икра (Литорина) Вяленая икра литорин
Вяленая икра (Лосось пустоты) Вяленая икра лосося пустоты
Вяленая икра (Лосось) Вяленая икра лосося
Вяленая икра (Малек Багрянника) Вяленая икра Малька Багрянника
Вяленая икра (Малоротый окунь) Вяленая икра малоротого окуня
Вяленая икра (Мелкая камбала) Вяленая икра камбалы
Вяленая икра (Мидия) Вяленая икра мидий
Вяленая икра (Мисс Морской черт) Вяленая икра Мисс Морской черт
Вяленая икра (Морской ёрш) Вяленая икра крылатки
Вяленая икра (Морской еж) Вяленая икра морского ежа
Вяленая икра (Морской огурец) Вяленая икра морского огурца
Вяленая икра (Морской черт) Вяленая икра Морского черта
Вяленая икра (Ночной кальмар) Вяленая икра ночного кальмара
Вяленая икра (Окунь) Вяленая икра окуня
Вяленая икра (Омар) Вяленая икра омара
Вяленая икра (Осьминог) Вяленая икра осьминога
Вяленая икра (Песковник) Вяленая икра песковника
Вяленая икра (Полуночный карп) Вяленая икра полуночного карпа
Вяленая икра (Пятнистый криворот) Вяленая икра пятнистого криворота
Вяленая икра (Радиоактивный карп) Вяленая икра Радиоактивного карпа
Вяленая икра (Радужная форель) Вяленая икра радужной форели
Вяленая икра (Рак) Вяленая икра рака
Вяленая икра (Рыба-еж) Вяленая икра иглобрюха
Вяленая икра (Рыба-камень) Вяленая икра рыбы-камня
Вяленая икра (Рыба-пузырь) Вяленая икра рыбы-капли
Вяленая икра (Сардина) Вяленая икра сардины
Вяленая икра (Сельдь) Вяленая икра сельди
Вяленая икра (Сердцевидка) Вяленая икра сердцевидки
Вяленая икра (Скат) Вяленая икра ската
Вяленая икра (Скорпионовый карп) Вяленая икра скорпионового карпа
Вяленая икра (Слаймджек) Вяленая икра слаймджека
Вяленая икра (Солнечник) Вяленая икра солнечника
Вяленая икра (Сом) Вяленая икра сома
Вяленая икра (Сомик) Вяленая икра сомика
Вяленая икра (Тигровая форель) Вяленая икра тигровой форели
Вяленая икра (Тиляпия) Вяленая икра тиляпии
Вяленая икра (Тунец) Вяленая икра тунца
Вяленая икра (Угорь) Вяленая икра угря
Вяленая икра (Улитка) Вяленая икра улиток
Вяленая икра (Устрица) Вяленая икра устриц
Вяленая икра (Чудо-огурец) Вяленая икра чудо-огурца
Вяленая икра (Шэд) Вяленая икра шэда
Вяленая икра (Щука) Вяленая икра щуки
Bait Приманка Наживка
Basic Retaining Soil Обычная влагосохраняющая почва Обычный аквагрунт
Blobfish Рыба-пузырь Рыба-капля
Blue Slime Egg Синее яйцо слайма Яйцо синего слайма
Crispy Bass Окунь с хруст. корочкой Окунь с хрустящей корочкой
Deluxe Retaining Soil Влагосохраняющая почва Делюкс Аквагрунт Делюкс
Flounder Мелкая камбала Камбала
Green Slime Egg Зеленое яйцо слайма Яйцо зеленого слайма
Halibut Камбала Палтус
Immunity Band Кольцо стойкости Перстень преодоления
Iridium Band Иридиевый обод Иридиевый перстень
Juice (flavored) Сок сквоша Кабачковый сок
Lionfish Морской ёрш Крылатка
Magic Bait Волшебная приманка Волшебная наживка
Pufferfish Рыба-еж Иглобрюх
Purple Slime Egg Фиолетовое яйцо слайма Яйцо фиолетового слайма
Qi Bean Семя Ки Боб Ки
Quality Fertilizer Высококачественное удобрение Улучшенное удобрение
Quality Retaining Soil Высококачественная влагосохраняющая почва Улучшенный аквагрунт
Quality Sprinkler Высококачественный спринклер Улучшенный спринклер
Red Slime Egg Красное яйцо слайма Яйцо красного слайма
Roe (flavored) Икра (Альбакор) Икра альбакора
Икра (Анчоус) Икра анчоуса
Икра (Багрянник) Икра Багрянника
Икра (Барабулька) Икра барабульки
Икра (Берикс) Икра берикса
Икра (Большеротый окунь) Икра большеротого окуня
Икра (Бычок) Икра бычка
Икра (Голавль) Икра голавля
Икра (Голубой дискус) Икра голубого дискуса
Икра (Гребешок) Икра гребешка
Икра (Дорада) Икра дорады
Икра (Желтый судак) Икра желтого судака
Икра (Жуть-рыба) Икра жуть-рыбы
Икра (Змеезуб) Икра змеезуба
Икра (Кальмар) Икра кальмара
Икра (Камбала) Икра палтуса
Икра (Карп) Икра карпа
Икра (Карп-мутант) Икра Карпа-мутанта
Икра (Краб) Икра краба
Икра (Креветка) Икра креветок
Икра (Лавовый угорь) Икра лавового угря
Икра (Легенда II) Икра Легенды II
Икра (Легенда) Икра Легенды
Икра (Ледопип) Икра ледопипа
Икра (Ледорыб) Икра Ледорыба
Икра (Ледорыб-младший) Икра Ледорыба-младшего
Икра (Лесоплюх) Икра лесоплюха
Икра (Лещ) Икра леща
Икра (Литорина) Икра литорин
Икра (Лосось пустоты) Икра лосося пустоты
Икра (Лосось) Икра лосося
Икра (Малек Багрянника) Икра Малька Багрянника
Икра (Малоротый окунь) Икра малоротого окуня
Икра (Мелкая камбала) Икра камбалы
Икра (Мидия) Икра мидий
Икра (Мисс Морской черт) Икра Мисс Морской черт
Икра (Морской ёрш) Икра крылатки
Икра (Морской еж) Икра морского ежа
Икра (Морской огурец) Икра морского огурца
Икра (Морской черт) Икра Морского черта
Икра (Ночной кальмар) Икра ночного кальмара
Икра (Окунь) Икра окуня
Икра (Омар) Икра омара
Икра (Осетр) Икра осетра
Икра (Осьминог) Икра осьминога
Икра (Песковник) Икра песковника
Икра (Полуночный карп) Икра полуночного карпа
Икра (Пятнистый криворот) Икра пятнистого криворота
Икра (Радиоактивный карп) Икра Радиоактивного карпа
Икра (Радужная форель) Икра радужной форели
Икра (Рак) Икра рака
Икра (Рыба-еж) Икра иглобрюха
Икра (Рыба-камень) Икра рыбы-камня
Икра (Рыба-пузырь) Икра рыбы-капли
Икра (Сардина) Икра сардины
Икра (Сельдь) Икра сельди
Икра (Сердцевидка) Икра сердцевидки
Икра (Скат) Икра ската
Икра (Скорпионовый карп) Икра скорпионового карпа
Икра (Слаймджек) Икра слаймджека
Икра (Солнечник) Икра солнечника
Икра (Сом) Икра сома
Икра (Сомик) Икра сомика
Икра (Тигровая форель) Икра тигровой форели
Икра (Тиляпия) Икра тиляпии
Икра (Тунец) Икра тунца
Икра (Угорь) Икра угря
Икра (Улитка) Икра улиток
Икра (Устрица) Икра устриц
Икра (Чудо-огурец) Икра чудо-огурца
Икра (Шэд) Икра шэда
Икра (Щука) Икра щуки
Slime Crate Ящик слайма Ящик для слайма
Smoked Fish (flavored) Копченая камбала Копченый палтус
Копченая рыба-еж Копченый иглобрюх
Копченый морской ёрш Копченая крылатка
Summer Squash Seeds Семена сквоша Семена кабачка
Summer Squash Сквош Кабачок
Targeted Bait Наживка: Альбакор Наживка на альбакора
Наживка: Анчоус Наживка на анчоуса
Наживка: Багрянник Наживка на Багрянника
Наживка: Барабулька Наживка на барабульку
Наживка: Берикс Наживка на берикса
Наживка: Большеротый окунь Наживка на большеротого окуня
Наживка: Бычок Наживка на бычка
Наживка: Голавль Наживка на голавля
Наживка: Голубой дискус Наживка на голубого дискуса
Наживка: Гребешок Приманка для гребешков
Наживка: Дорада Наживка на дораду
Наживка: Желтый судак Наживка на желтого судака
Наживка: Жуть-рыба Наживка на жуть-рыбу
Наживка: Змеезуб Наживка на змеезуба
Наживка: Кальмар Наживка на кальмара
Наживка: Камбала Наживка на палтуса
Наживка: Карп Наживка на карпа
Наживка: Карп-мутант Наживка на Карпа-мутанта
Наживка: Краб Приманка для крабов
Наживка: Креветка Приманка для креветок
Наживка: Лавовый угорь Наживка на лавового угря
Наживка: Легенда Наживка на Легенду
Наживка: Легенда II Наживка на Легенду II
Наживка: Ледопип Наживка на ледопипа
Наживка: Ледорыб Наживка на Ледорыба
Наживка: Ледорыб-младший Наживка на Ледорыба-младшего
Наживка: Лесоплюх Наживка на лесоплюха
Наживка: Лещ Наживка на леща
Наживка: Литорина Приманка для литорин
Наживка: Лосось Наживка на лосося
Наживка: Лосось пустоты Наживка на лосося пустоты
Наживка: Малек Багрянника Наживка на Малька Багрянника
Наживка: Малоротый окунь Наживка на малоротого окуня
Наживка: Мелкая камбала Наживка на камбалу
Наживка: Мидия Приманка для мидий
Наживка: Мисс Морской черт Наживка на Мисс Морской черт
Наживка: Морской ёрш Наживка на крылатку
Наживка: Морской огурец Наживка на морского огурца
Наживка: Морской черт Наживка на Морского черта
Наживка: Ночной кальмар Наживка на ночного кальмара
Наживка: Окунь Наживка на окуня
Наживка: Омар Приманка для омаров
Наживка: Осетр Наживка на осетра
Наживка: Осьминог Наживка на осьминога
Наживка: Песковник Наживка на песковника
Наживка: Полуночный карп Наживка на полуночного карпа
Наживка: Пятнистый криворот Наживка на пятнистого криворота
Наживка: Радиоактивный карп Наживка на Радиоактивного карпа
Наживка: Радужная форель Наживка на радужную форель
Наживка: Рак Приманка для раков
Наживка: Рыба-еж Наживка на иглобрюха
Наживка: Рыба-камень Наживка на рыбу-камень
Наживка: Рыба-пузырь Наживка на рыбу-каплю
Наживка: Сардина Наживка на сардину
Наживка: Сельдь Наживка на сельдь
Наживка: Сердцевидка Приманка для сердцевидок
Наживка: Скат Наживка на ската
Наживка: Скорпионовый карп Наживка на скорпионового карпа
Наживка: Слаймджек Наживка на слаймджека
Наживка: Солнечник Наживка на солнечника
Наживка: Сом Наживка на сома
Наживка: Сомик Наживка на сомика
Наживка: Тигровая форель Наживка на тигровую форель
Наживка: Тиляпия Наживка на тиляпию
Наживка: Тунец Наживка на тунца
Наживка: Угорь Наживка на угря
Наживка: Улитка Приманка для улиток
Наживка: Устрица Приманка для устриц
Наживка: Чудо-огурец Наживка на чудо-огурец
Наживка: Шэд Наживка на шэда
Наживка: Щука Наживка на щуку

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
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
Joja Bookcase Joja könyvespolc Joja könyvszekrény
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
Modern Bookcase Modern könyvespolc Modern könyvszekrény
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
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 Динозавровы штаны Динозавровые штаны

Weapons

Russian
item old name new name
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...

  1. they replace the entire file;
  2. they're loaded through the MonoGame content pipeline which is less tolerant of format changes;
  3. 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/* Removed now-unneeded %fork tokens.
Data/Boots Overhauled format. ✘ broken ✘ broken
(until Content Patcher adds runtime migrations)
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 Overhauled format. ✘ broken ✘ broken
(until Content Patcher adds runtime migrations)
Data/Hats ✘ broken ✘ broken
(until Content Patcher adds runtime migrations)
Data/LostItemsShop Added new field. ✘ broken
Data/Objects Added new context tags. ✘ broken
Data/SpecialOrders Added new fields. ✘ broken
Data/Weddings Fixed Lewis skipping his matrimonial dialogue at the farmer's wedding. ✘ will remove fix ✓ mostly unaffected
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 Removed some unused translations.
Strings/UI Merged male/female variants of PondQuery_StatusRequestPending_* entries. ✘ broken ✓ mostly unaffected