[
{
"Id": "MyMod.MyMailId", // Letter id. It's important to be an unique string to avoid conflicts. Also it shouldn't have space characters.
"GroupId": "MyMod.MyGroupId", // Letter group id. Letters with the same group id are never delivered in the same day. Letters registered first have priority, unless the group id ends with ".Random", in that case, a random letter will be chosen. Default is null.
"Title": "My Letter Title", // Letter title. Will be shown in the collections menu. Set it null or remove the line if you don't want the letter to appear in the collection. If an translation file is provide, you should put a translation key here, but you can still leave if null for no Title.
"Text": "Dear @^This is my custom mail.", // Text of the letter. You can use @ to put the players name and ^ for line breaks. You can also use the base game commands to add money, items and stuff. If an translation file is provide, you should put a translation key here.
"RandomlyChooseAttachment": 2, // If a number is set, it will choose randomly that amount of items from the attachment list, per group. Default is null.
"RandomlyChooseAttachmentPerGroup": { "CaveItems": 3 }, // If a group and amount is set here, it will use that amount to pick items instead of the one that set on RandomlyChooseAttachment. Default is empty.
"AttachmentGroupWithReplacement": [ "CaveItems" ], // Attachments are chosen randonly from a list without replacement by default, if you want the pick to be chosen replacing the the attachments, add the group to the list. If you didn't add groups, use an empty string. Default value is an empty list.
"Attachments": [ // List of attachments. Remove the property to not attach items to the mail.
{
"Type": "Object", // [Object|BigCraftable|Tool|Ring|Furniture|Weapon|Boots|DGA|QualifiedItemId|None] Required. The type of item that will be attached. If not provided the item will be ignored. 'None' is always igored without errors in the log and should be used when you want a probability of not adding an attachment.
"Name": "Cave Carrot", // Used to find the item index. That's required if using custom objects like Json Assets ones. Should be the full DGA ID is using DGA. If not provided, the index will be used. Default is null.
"Index": "(0)78", // The index of an item. Should be the qualified item id as a string, but will also work as an integer for retro compatibility. If no name is provided or an item for the name is not found, the index is used. Otherwise, the attachment is ignored. Ignored if the type is DGA.
"Stack": 1, // The stack value of the item to be delivered. Used only for Objects and BigCraftable. Default is 1.
"Quality": 2, // The quality value of the item to be delivered. Used only for Objects. 0 = none, 1 = silver, 2 = gold, 4 = iridium. Default is 0;
"RequireMailReceived": [ "jojaVault", "ccVault" ], // Require one of the mails to have been received. The game list also contain others thing that are not mail, like community center flags. Default is null to no require a mail received.
"RequireAllMailReceived": false, // If true, require that all mails in the "RequireMailReceived" list to have been received. Default is false.
"ProbabilityWeight": 1, // The weight this attachment have when choosing which one to deliver. The mod sum all weight in a given group and give it a probability dividing this weight by the total. Default is 1.
"RandomGroup": "CaveItems" // When choosing the items randonly, group the list by the found groups and pick the amount set from each group. Default value is an empty string that function as the default group.
},
{
"Type": "Tool", // When using tool, only supported ones can be attached.
"Name": "Axe", // [Axe|Hoe|Watering Can|Pickaxe|Scythe|Golden Scythe|Milk Pail|Shears|Fishing Rod|Pan|Return Scepter] Required for tools. The name of the supported tool. Otherwise, the attachment is ignored.
"UpgradeLevel": 1 // The upgrade level of the tool. Regular tools: 0 = stone, 1 = cooper, 2 = steel, 3 = gold, 4 = iridium. Fishing Rod: 0 = Bamboo Pole, 1 = Training Rod, 2 = Fiberglass Rod, 3 = Iridium Rod. Ignored for the other types. Default is 0.
},
{
"Type": "DGA", //DGA item
"Name": "spacechase0.DynamicGameAssets.Example/My Custom Item", // use the full DGA ID. Required.
"Stack": 10, // The stack value of the item to be delivered. Used only for Objects and BigCraftable. Default is 1.
"Quality": 2 // The quality value of the item to be delivered. Used only for Objects. 0 = none, 1 = silver, 2 = gold, 4 = iridium. Default is 0;
},
{
"Type": "QualifiedItemId", //Any supported item
"Index": "(0)78", // The Qualified Item Id of an item.
"Stack": 10, // The stack value of the item to be delivered. Used only for Objects and BigCraftable. Default is 1;
"Quality": 2 // The quality value of the item to be delivered. Used only for Objects. 0 = none, 1 = silver, 2 = gold, 4 = iridium. Default is 0;
}
],
"Recipe": "Recipe Name", // Remove the line if you don't want to attach a recipe to the mail. It will only work if you have no other attachments to the mail. For DGA recipes only use the ID part (leave away the ModID)
"AdditionalMailReceived": ["MyMod.AnotherMailId", "VANILLA_FLAG"], // Use this to add additional text to the MailReceived list. Can be useful to add vanilla flags or other MFM letter ids.
"MailReceivedToRemove": ["MyMod.AnotherMailThatNeedToBeResent","MyMod.SomeFlagThatWasLockingSomeFeature"], //Text to removed from the MailReceived list. This can be used to trigger new mail, events, vanilla flags, stop other MFM mail from being sent...
"LetterBG": "CustomLetterBG.png", // Name of the file in your content pack that has the custom letter background to use. It should follow the same structure of the game LetterBG file . WhichBG will be relative to this file for this letter. If null or removed the mod will use the game LetterBG.
"WhichBG": 0, //The id of the letter background. 0 = classic, 1 = notepad, 2 = pyramids
"TextColor": -1, //Remove this line to use the default color. Will be ignored if a CustomTextColor is set. -1 = Dark Red, 0 = Black, 1 = Sky Blue, 2 = Red, 3 = Blue Violet, 4 = White, 5 = Orange Red, 6 = Lime Green, 7 = Cyan, 8 = Darkest Gray
"CustomTextColorName": "White", //The color of the text.[http://www.foszor.com/blog/xna-color-chart/] Default will use the TextColor property.
"UpperRightCloseButton": "CustomCloseButton.png", // Name of the file in your content pack that has the custom close button to use. It should be 12 x 12 . If null or removed it will use the default button.
"ReplyConfig": { // If you want the player to send a reply after reading the letter. It will show the reply options that will add one or more "ReceivedMail" based on the player answer. Any additional logic related to the reply needs to be implemented based on the ReceivedMail added.
"QuestionKey": "MyMod.MyMailId.Question", //A key to identify your question. It has only internal use, but should be unique in your content pack to avoid conflict between replies.
"QuestionDialog": "Send a reply choosing your reward:", //Your question or text that will show over the reply options. If an translation file is provided, you should put a translation key here.
"Replies": [
{
"ReplyKey": "MyMod.MyMailId.Reply1", //Must be unique between the question replies.
"ReplyOptionDialog": "I want seeds.", //The option text that will show in the reply list. If an translation file is provided, you should put a translation key here.
"RequireMailReceived": [ "jojaVault", "ccVault" ], // Require one of the mails to have been received. The game list also contain others thing that are not mail, like community center flags. Default is null to no require a mail received.
"RequireAllMailReceived": false, // If true, require that all mails in the "RequireMailReceived" list to have been received. Default is false.
"MailReceivedToAdd": [ "MyMod.MyMailId.PlayerSeedOption" ], // Text to add to the MailReceived list. This can be used to trigger new mail, events, vanilla flags, stop other MFM mail from being sent...
"MailReceivedToRemove": [ "MyMod.MyMailId.PlayerSapplingOption" ], //Text to removed from the MailReceived list. This can be used to trigger new mail, events, vanilla flags, stop other MFM mail from being sent...
"ReplyResponseDialog": "Your letter requesting seeds was sent.", //Text that will show after this reply option is chosen. If an translation file is provided, you should put a translation key here.
"Cost": 50 //The amount of money the player needs to have to choose this option. If they do choose it, that amount is immediately subtracted from the player's money. Always provide an option with no cost, or you mighty softlock the player.
}
]
},
"Repeatable": false, // If true the mod won't check it the letter Id has already been delivered. Default is false.
"AutoOpen": false, // If true the mod will open the letter at the begin of the day after the conditions are met. The letter id will be marked as read and if there is a recipe set, it will be learned. Since the letter will never show, visual properties like title, text, background... will never be used, as well as the attachments.
// CONDITIONS FOR DELIVERY
//Below are conditions for the delivery. Remove any of the lines if you don't want to check that condition.
"Date": "10 spring Y1", // Must be that date or after it. The format is "[1-28] [spring|summer|fall|winter] Y[1-999]".
"Days": [7,14,21,28], // Must be one of the days in the list.
"Seasons": ["fall"], // Must be one of the seasons in the list. [spring|summer|fall|winter]
"Weather": "sunny", // Must be that game weather. The format is "[sunny|rainy]".
"HouseUpgradeLevel": 2, // House upgrade level must be equal or higher what is defined. 0 - starter house(no reason to use this, just remove the line), 1 - kitchen, 2 - second floor, 3 - cellar.
"DeepestMineLevel": 80, // Deepest mine level must be equal or higher what is defined. 120 is the last level of the mine, 121 is the first level of the skull cavern.
"CurrentMoney": 10000, // Current money must be equal or higher what is defined.
"TotalMoneyEarned": 500000, // Total money earned must be equal or higher what is defined.
"FriendshipConditions": // Each NPC of the list must check all conditions.
[
{
"NpcName": "Lewis", //Name of the NPC. Can use custom NPCs.
"FriendshipLevel": 8, // NPC must have a friendship heart level equal or higher what is defined. Default is 0.
"FriendshipStatus": ["Dating","Engaged","Married"] // [Friendly|Dating|Engaged|Married|Divorced] Require the NPC friendship status to be one from the list. Remove to not require a status.
}
],
"SkillConditions": // Each skill of the list must have a level equal or higher what is defined. Can use all coded skills in the vanilla game, including Luck. Can't use custom skills.
[
{ "SkillName": "Farming", "SkillLevel": 1 }
],
"StatsConditions": // Each stats of the list must have a value equal or higher what is defined. Choose a StatsName or a StatsLabel
[
{
"StatsName": "CheeseMade", //[SeedsSown|ItemsShipped|ItemsCooked|ItemsCrafted|ChickenEggsLayed|DuckEggsLayed|CowMilkProduced|GoatMilkProduced|RabbitWoolProduced|SheepWoolProduced|CheeseMade|GoatCheeseMade|TrufflesFound|StoneGathered|RocksCrushed|DirtHoed|GiftsGiven|TimesUnconscious|AverageBedtime|TimesFished|FishCaught|BouldersCracked|StumpsChopped|StepsTaken|MonstersKilled|DiamondsFound|PrismaticShardsFound|OtherPreciousGemsFound|CaveCarrotsFound|CopperFound|IronFound|CoalFound|CoinsFound|GoldFound|IridiumFound|BarsSmelted|BeveragesMade|PreservesMade|PiecesOfTrashRecycled|MysticStonesCrushed|DaysPlayed|WeedsEliminated|SticksChopped|NotesFound|QuestsCompleted|StarLevelCropsShipped|CropsShipped|ItemsForaged|SlimesKilled|GeodesCracked|GoodFriends|IndividualMoneyEarned] Default is null.
"StatsLabel": "Name", // [exMemoriesWiped|childrenTurnedToDoves|trashCansChecked|boatRidesToIsland|beachFarmSpawns|hardModeMonstersKilled|timesEnchanted] This are the current game stats that are identified by label, if more are added, they should also be supported. It will also identify custom stats labels added by other mods. Default is null.
"Amount": 1 // The amount the status should be equal or greater for the condition to be valid.
}
],
"CollectionConditions": // Each collection condition of the list must have a value equal or higher than the defined amount.
[
{
"Collection": "Shipped", //[Shipped|Fish|Artifacts|Minerals|Cooking|Crafting] Required.
"Name": "Oil", //Deprecated, uses Ids instead. The name of the object or recipe for 'Crafting' collection. If not a crafting colection, it will look for that name in the object list to find the index. If the name is not found, the letter is ignored. Will combine with the other properties. Default is null.
"Index": 211, //Deprecated, uses Ids instead. The index of the object. Will combine with the other properties. Default is null.
"Ids": [ "282", "MossSoup" ], //The items ids or the crafting recipe names. Will combine with the other properties. The amounts are summed to compare with the Amount property.
"Amount": 10 // The total amount the objects in the collection should be equal or greater for the condition to be valid.
}
],
"SpecialDateCondition": // Must be that date or after it.
{
"SpecialDate": "ChildBirth", //[Wedding|ChildBirth] Required
"YearsSince": 1, //The amount of years since the date happen. 0 will match the actual date, 1 the flowing year. Default is 0.
"WhichChild": 1 //If the SpecialDate property is ChildBirth, it will reference which chield. Default is 1;
},
"ExpandedPrecondition": "d Mon Fri/HasItem Pink Cake/!JojaMartComplete/!w rainy", //Needs the Expanded Preconditions Utility mod. Sees that mod documentation to see how this works. If the mod is not loaded, the letter will not be delivered.
"ExpandedPreconditions": [ "!z spring/t 600 1000", "f Linus 1000/w rainy/z spring", "f Linus 2500" ], //Needs the Expanded Preconditions Utility mod. Sees that mod documentation to see how this works. If the mod is not loaded, the letter will not be delivered.
"RandomChance": 0.25, // The mod will check if a random number from 0 to 1 is bellow the given number. The same save, on the same day for the same letter will always have the same result to avoid cheating.
"Buildings": ["Coop","Big Coop","Deluxe Coop"], // Require one of the buildings to be currently constructed in the farm.
"RequireAllBuildings": false, // If true, require that all the buildings in the "Buildings" list to be currently constructed in the farm. Default is false.
"MailReceived": ["jojaVault","ccVault"], // Require one of the mails to have been received. The game list also contain others thing that are not mail, like community center flags.
"RequireAllMailReceived": false, // If true, require that all mails in the "MailReceived" list to have been received. Default is false.
"MailNotReceived": ["jojaVault","ccVault"], // Require the mails to have not been received. The game list also contain others thing that are not mail, like community center flags.
"EventsSeen": [ "4", "32423" ], // Require one of the events to have been seen by the player. Should be a string, but will also work as an integer for retro compatibility.
"RequireAllEventsSeen": false, // If true, require that all the events in the "EventsSeen" list to have been seen by the player. Default is false.
"HasMods": [ "SMAPI.ConsoleCommands", "SMAPI.SaveBackup" ], // Require one of the mods to be loaded. Should be the mod UniqueID.
"RequireAllMods": false, // If true, require that all the mods in the "HasMods" list to have been loaded. Default is false.
"EventsNotSeen": [ "4", "32423" ], // Require the events to have not been seen by the player. Should be a string, but will also work as an integer for retro compatibility.
"RecipeKnown": ["Pizza","Survival Burger"], // Require one of the recipes to have been learned by the player.
"RequireAllRecipeKnown": false, // If true, require that all the recipes in the "RecipeKnown" list to have been learned by the player. Default is false.
"RecipeNotKnown": ["Wild Bait"], // Require the recipes to have not been learned by the player.
"KeepValid": false // If this is true, once the conditions are meet, keep the mail valid until read. Default is false.
}
]MailRepository.SaveLetter(
new Letter(
"LetterUniqueId"
,"Letter custom text."
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
)
);
MailRepository.SaveLetter(
new Letter(
"LetterUniqueId"
,"Letter custom text."
,new List<Item> { new StardewValley.Object(60,5) }
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
)
);
MailRepository.SaveLetter(
new Letter(
"LetterUniqueId"
, "Letter custom text."
, "RecipeUniqueName"
, (l) => !Game1.player.cookingRecipes.ContainsKey(l.Recipe)
)
);
MailRepository.SaveLetter(
new Letter(
"LetterUniqueId"
,"Letter custom text."
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
1
){TextColor=8}
);
MailRepository.SaveLetter(
new Letter(
"LetterUniqueId"
,"Letter custom text."
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,Game1.player.mailReceived.Add(l.Id)
1
){
LetterTexture=helper.Content.Load<Texture2D>("CustomLetterBG.png")
,TextColor=4
}
);
Where CustomLetterBG.png is a image file that follows the same structure as "LooseSprites//letterBG"MailRepository.SaveLetter(
new Letter(
"LetterUniqueId"
,"myletter.translation.key.text"
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
){
Title = "myletter.translation.key.title",
I18N = helper.Translation
}
);
内容修补程序
Pathoschild2025-07-28 06:03:57
加载内容包,更改游戏的数据、图像和地图,而不替换XNB文件。
内容补丁
Pathoschild2025-10-26 17:17:30
加载内容包,这些内容包会更改游戏的数据、图像和地图,而不会替换 XNB 文件。
SMAPI-Stardew修改API
Pathoschild2025-07-15 09:52:47
Stardew Valley的mod加载器。
NPC地图位置
Bouhm2025-05-26 10:22:12
在地图上看到NPC和玩家,有一个可选的小地图。
CJB秘籍菜单
Pathoschild2025-07-28 06:19:19
一个简单的游戏作弊菜单,有很多作弊。
SpaceCore
spacechase02025-05-28 10:06:38
A framework mod used by some of my other mods.
星露谷扩建
FlashShifter2025-07-01 07:17:39
mod描述游戏中玩家扮演继承了爷爷农场的“Stardew valley”主角开阔和经营整座小牧场。 你继承了爷爷在星露谷的农场,但是你手头上只有最基础的农具和少许的金钱,你得靠此开始你的新生活。你能把这片杂草丛生的田地变成一个繁荣的家园吗?这很不容易,自从JOJA公司来到了小镇,以前的生活都变了。社区中心,这个曾经是小镇最活跃的地方,如今却是破烂不堪。但山谷里似乎充满了机会,只要你肯努力,就有可能把星露谷变得更繁荣。 开始游戏后,玩家可以通过捏人的方式创建自己所喜爱的角色。人物共有24种肤色,32
农场类型经理(FTM)
EscaMMC2025-07-22 13:55:17
农场类型管理器(FTM)是一个框架,允许其他模组在游戏中的任何地方生成对象和怪物,具有各种控制和自定义选项。