Jump to content

Modding:Migrate to Stardew Valley 1.7: Difference between revisions

From Stardew Valley Wiki
imported>Pathoschild
imported>Pathoschild
→Other changes: remove change moved to new quest section
Line 1,394: Line 1,394:
* Added validation for schedule <samp>offset</samp> command in end-of-route animations.
* Added validation for schedule <samp>offset</samp> command in end-of-route animations.
* Fixed crash when loading a save with missing building interiors.
* 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 <samp>RejectItem_*</samp> dialogue disabling the NPC's normal dialogue after it's shown.
* Fixed <samp>RejectItem_*</samp> dialogue disabling the NPC's normal dialogue after it's shown.
* Fixed [[Modding:NPC data|NPC <samp>FlowerDanceCanDance</samp> field]] ignored for non-datable NPCs with no dialogue.
* Fixed [[Modding:NPC data|NPC <samp>FlowerDanceCanDance</samp> field]] ignored for non-datable NPCs with no dialogue.

Revision as of 16:01, 30 August 2025

←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/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_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/PassiveFestivals

Added one new field:

field effect
InLocations (Optional) The locations in which the festival happens. This affects various game logic like NPC dialogues, tent placement restrictions, weather, etc. If omitted, defaults to the keys in MapReplacements.

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

Added one new field:

field effect
Buffs This field already existed, but has a field change:
field effect
CustomAttributes This field already existed, but has one new field:
field effect
CustomFields (Optional) The custom fields for this entry.

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).
ignore_gift_limits any giftable item Whether this item ignores the gift limits when given as a gift (similar to stardrop tea). Items with this tag don't count towards the daily/weekly limits, and can be given even if those limits have been reached.
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.
spawns_butterflies furniture Whether butterflies spawn around this furniture, similar to the butterfly hutch.
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.

Dialogue changes

  • Added a new special token in dialogue strings:
    token description
    ||| Stands for "randomizeDelimiter". Delimits an arbitrary number of dialogue variants from which to choose each day. After randomization, any leading or trailing whitespace is trimmed. This randomization is deterministic per day (e.g. reloading the save won't change which one is shown).

    For example, let's say you did this:

    "Rainy_Night": "
        I love rain.$h|||
        I like rain.$h|||
        I adore rain.$h|||
        I hate rain.$s#$b#Just kidding. I love it!$h|||
        I enjoy rain.$h
    "
    

    That would create five variants of the dialogue which each have an equal probability of being selected.

  • Added new dialogue keys:
    key description
    passive festival dialogue Identical to location dialogue, but you can use the passive festival ID as the location name. Any passive festival dialogue has priority over location dialogue in the same location.
  • Improved some special tokens:
    token changes
    || Whitespace around the token is now ignored, so you can split text into multiple lines:
    "Wed8": "
        Isn't it expensive, coming to the desert so often like you do?#$e#You must really like to see me, huh? Hmmm... $h||
        *sigh*... I do miss the beautiful flowers of Stardew Valley...$s
    "
    
  • Some dialogues were merged or renamed using the new features. The previous dialogue keys are now ignored by the game.
    asset former key changes
    Characters/Dialogue/<NPC name> Resort_<number>
    Resort_Bar_<number>
    Resort_Chair_<number>
    Resort_Dance_<number>
    Resort_Shore_<number>
    Resort_Towel_<number>
    Resort_Umbrella_<number>
    Resort_Wander_<number>
    Merged into their base key (e.g. Resort_<random> into Resort) using the new ||| random-variant token.
    Characters/Dialogue/MarriageDialogue
    Characters/Dialogue/MarriageDialogue<NPC name>
    Characters/Dialogue/MarriageDialogue<NPC name>Roommates
    funLeave_<NPC name>
    funReturn_<NPC name>
    jobLeave_<NPC name>
    jobReturn_<NPC name>

    patio_<NPC name>
    spouseRoom_<NPC name>

    spring_<NPC name>
    summer_<NPC name>
    fall_<NPC name>
    winter_<NPC name>
    Moved into MarriageDialogue<NPC name> and removed the NPC suffix (like spouseRoom_<NPC name> → spouseRoom).
    Indoor_Day_0
    Indoor_Day_1
    Indoor_Day_2
    Indoor_Day_3
    Indoor_Day_4
    Merged into Indoor_Day.
    Indoor_Night_0
    Indoor_Night_1
    Indoor_Night_2
    Indoor_Night_3
    Indoor_Night_4
    Indoor_Night_<NPC name>
    Merged into Indoor_Night.
    NoBed_0
    NoBed_1
    NoBed_2
    NoBed_3
    Merged into NoBed.
    Outdoor_0
    Outdoor_1
    Outdoor_2
    Outdoor_3
    Outdoor_4
    Outdoor_<NPC name>
    Merged into Outdoor.
    Rainy_Day_0
    Rainy_Day_1
    Rainy_Day_2
    Rainy_Day_3
    Rainy_Day_4
    Merged into Rainy_Day.
    Rainy_Night_0
    Rainy_Night_1
    Rainy_Night_2
    Rainy_Night_3
    Rainy_Night_4
    Rainy_Night_5
    Rainy_Night_<NPC name>
    Merged into Rainy_Night.
  • Fixed <location>_<x>_<y> and <location>_<dayOfWeek> dialogue keys never used in 1.6.0+ if a player has at least two hearts with the NPC.
  • Fixed location dialogues not recognizing the spring prefix (they only allowed summer, fall, and winter).
  • Fixed $r response IDs not tracked correctly if you reuse an NPC reaction key across multiple $r options.

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

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

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
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_HAS_PREVIOUS_CONVERSATION_TOPIC <player> <id>+ Whether the specified player(s) have previously had any of the specified conversation topics active. This doesn't include current topics (unless they're a repeat of a previous one).
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).

Map property changes

  • Added new map properties:
    action effect
    FarmHouseBed <x> <y> [item ID]
    (valid in farm or farmhouse)
    Sets the initial bed to place when creating the farmhouse or cabin. The arguments are:
    • <x> <y>: the tile position at which to place it.
    • [item ID]: if set, the qualified or unqualified item ID for the bed furniture to place. This must match a furniture item with item type Bed. Defaults to (F)2048 (single bed).

    If omitted, a single bed is placed at position (9, 8).

  • Improved map properties:
    action changes
    FarmHouseFlooring
    FarmHouseFurniture
    FarmHouseStarterGift
    FarmHouseStarterSeedsPosition
    FarmHouseWallpaper
    Can now be set on the farmhouse map to override the farm map's equivalent property.
    FarmHouseFurniture Fixed property only allowing numeric item IDs.

Quest changes

Schedule changes

  • Added new schedule keys:
    syntax summary
    roommate_<festival ID>_<festival day>
    roommate_<festival ID>
    roommate_<season>_<day of month>
    roommate_<day of week>
    roommateJob
    Equivalent to the marriage schedules, but only apply if the NPC is a roommate.

    If a roommate NPC has both roommate* and marriage* schedules, it'll use a roommate* schedule if any of them apply. If none apply, it'll default to marriage* schedules. You can avoid that by setting the fallback roommate schedule key.

    marriage
    roommate
    A fallback schedule to use if a more specific schedule doesn't apply. If this is omitted and no other schedule applies, the NPC won't have a schedule that day.

Trigger action changes

  • Added 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 crash when loading a save with missing building interiors.
  • 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.

DialogueKeyValidator

The new DialogueKeyValidator class analyses dialogue entries to detect dialogue keys which don't match one of the predefined patterns.

This is mainly meant to implement unit tests. For example, to validate all dialogue keys in a data asset:

string assetName = "Characters/Dialogues/Abigail";
var dialogues = Game1.content.Load<Dictionary<string, string>>(assetName);

var validator = new DialogueKeyValidator();
foreach ((string key, string dialogue) in dialogues)
{
    if (!validator.IsKnownFormat(assetName, key))
        Assert.Fail($"Validation failed for dialogue '{key}': key doesn't match one of the expected patterns.");
}

You can optionally extend the valid patterns by setting validator fields like MarriageDialogueKeyPatterns.

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.

Content manager changes

The base game's 'content manager' API changed in Stardew Valley 1.6.16. This mainly affects LanguageCode, Game1.content, and other content manager fields. This does not affect mods which only use SMAPI's content API.

In particular:

  • The game now uses IContentManager instead of LocalizedContentManager in most places. That includes fields like Game1.content, methods like Game1.content.CreateTemporary(), etc. The new interface also includes full IntelliSense docs.
  • Moved three types:
    type changes
    LocalizedContentManager Moved from the StardewValley namespace into StardewValley.ContentManagement.
    LocalizedContentManager.LanguageCode
    LocalizedContentManager.LanguageChangedHandler
    • Moved from the StardewValley namespace into StardewValley.ContentManagement.
    • Moved out of the nested type (e.g. change LocalizedContentManager.LanguageCode to just LanguageCode in your mod code).
  • And changed some LocalizedContentManager members:
    type member changes
    LocalizedContentManager CurrentLanguageCode
    CurrentLanguageLatin
    CurrentLanguageString
    CurrentModLanguage
    GetDefaultLanguageCode()
    OnLanguageChange
    SetModLanguage(…)
    These are no longer static, so they need to be called through an instance like Game1.content. For example, change LocalizedContentManager.GetDefaultLanguageCode() in mod code to Game1.content.GetDefaultLanguageCode().

    Some of these are also renamed (see the next rows).

    CurrentCulture Removed (it was unused).
    CurrentLanguageCode Renamed to LanguageCode.
    CurrentLanguageLatin Renamed to LanguageUsesLatinFont.
    CurrentLanguageString Renamed to LanguageString.
    CurrentModLanguage Renamed to LanguageModData.
    GetCurrentLanguage() Removed. Use the LanguageCode property instead.
    OnLanguageChange Renamed to OnGlobalLanguageChanged.
  • Added a SourceCodeContentManager implementation of IContentManager. This is meant for internal unit tests, and isn't relevant for mod authors except as an example.

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.

Utility fields & methods

  • 1.6.9 adds many new utility methods and fields. For example:
    type member usage
    PassiveFestivalData CoversDate(…) Get whether the festival is active on the given date.
    GetFestivalLocations() Get the locations in which the passive festival happens (based on the InLocations or MapReplacements fields in Data/PassiveFestivals).
    TryGetLocationReplacement(…) Get the new location to load instead of a normal one when the passive festival is active. For example, the Night Market replaces Beach with BeachNightMarket.
    Utility TryGetPassiveFestivalDataForDayHere(…) Get the passive festival which occurs on a given date within the given location, if any. This is equivalent to Utility.TryGetPassiveFestivalDataForDay(…), but also checks the given location against the passive festival's InLocation or MapReplacements field.

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
Obsolete. Enchantments now target tools via data instead.
Events.DiaryEvent Removed. This was unused.

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.
Bush draw(SpriteBatch batch, int yDrawOffset) Removed. Set the drawOffset field and then call draw(SpriteBatch) instead.
yDrawOffset Replaced by drawOffset, which is now public and a Point.
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.
NPCDialogueResponse
Response
id
friendshipChange
extraArgument
hotkey
responseText
Fields changed to get-only properties.
responseKey
  • Field changed to get-only property.
  • Previously NPCDialogueResponse stored the NPC's reaction dialogue key in this field. You should now use npcReactionKey for that instead.
SetHotKey(…) Removed. Set the hotkey through the constructor instead.
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.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.
  • 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
Artichoke Dip Articsóka mártás Articsókamártás
Blackberry Cobbler Szeder kosár Szedres kosárka
Bone Mill Csontőrlő Csontdaráló
Chocolate Cake Csokis torta Csokitorta
Cranberry Candy Vörös áfonyás cukorka Vörös áfonyás üdítő
Geode Crusher Geóda zúzó Geódazúzó
Maple Syrup Juharfaszirup Juharszirup
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...

  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.
  • Fixed bugs & typos.
✘ 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