Introduction
NPC Helper is a Stardew Valley mod that allows you to create custom NPCs using simple TOML configuration files. No C# coding required! The mod provides a complete system for NPC creation including:
TOML-Based Configuration
Define NPCs with simple, readable configuration files
Dynamic Dialogue
Conditional and randomized dialogue based on friendship, time, weather, and more
Advanced Schedules
Day/season/date-based routing with automatic pathfinding
Asset Variants
Location and season-specific sprites and portraits
Installation
Prerequisites
- Stardew Valley 1.6 or higher
- SMAPI 4.0 or higher
Installation Steps
Quick Start Guide
Before You Begin
This guide will walk you through creating your first custom NPC. Make sure NPC Helper is installed and working before proceeding.
1 Create Content Pack Structure
Create the following folder structure in your Mods directory:
Mods/ └── MyFirstNPC/ ← Your content pack folder ├── manifest.json ← Required: Mod metadata ├── mod.toml ← Required: NPC list └── NPCs/ └── Alex/ ← Example NPC name ├── Alex.toml ← NPC definition ├── sprite.png ← Character sprite (16x32 per frame) └── portrait.png ← Portrait (64x64 per expression)
2 Create manifest.json
{
"Name": "My First NPC",
"Author": "YourName",
"Version": "1.0.0",
"Description": "Adds a custom NPC to Stardew Valley",
"UniqueID": "YourName.MyFirstNPC",
"ContentPackFor": {
"UniqueID": "TamKungZ.NpcHelper"
},
"UpdateKeys": []
}
3 Create mod.toml
This file tells NPC Helper where to find your NPC definitions:
NPCs = ["NPCs/Alex/Alex.toml"]
4 Create NPC Definition
Create NPCs/Alex/Alex.toml with minimal configuration:
# Basic Identity
Name = "Alex"
DisplayName = "Alex the Adventurer"
Gender = "male"
Age = "adult"
# Birthday
BirthdaySeason = "spring"
BirthdayDay = 13
# Starting Location
DefaultMap = "Town"
DefaultX = 52
DefaultY = 87
DefaultFacing = 2
# Assets
CustomSpritePath = "sprite.png"
CustomPortraitPath = "portrait.png"
✓ Test Your NPC
- Launch Stardew Valley with SMAPI
- Check the SMAPI console for "[NpcHelper] Registered NPC definition: Alex"
- Load or start a save game
- Look for your NPC at the Town coordinates (52, 87)
- Interact with them to verify they appear in-game
Configuration Files
manifest.json
RequiredThis file defines your content pack metadata. Must reference TamKungZ.NpcHelper as the content pack target.
{
"Name": "My Custom NPC Pack",
"Author": "YourName",
"Version": "1.0.0",
"UniqueID": "YourName.MyCustomNPCs",
"Description": "Adds custom NPCs to Stardew Valley",
"ContentPackFor": {
"UniqueID": "TamKungZ.NpcHelper"
},
"UpdateKeys": []
}
mod.toml
Entry PointLists all NPC definition files relative to the content pack root.
# List all NPC definition files
NPCs = [
"NPCs/Rei/Rei.toml",
"NPCs/Alex/Alex.toml",
"NPCs/Sophia/Sophia.toml"
]
NPC Definition (.toml)
Main ConfigurationThe main TOML file that defines an NPC's properties. Place this in your NPC's folder.
# ───── Basic Identity ─────
Name = "Rei" # Internal name (no spaces, unique)
DisplayName = "Rei" # Name shown to players
# ───── Core Properties ─────
Gender = "female" # "male" or "female"
Age = "adult" # "child", "teen", or "adult"
Manner = "polite" # "polite", "rude", or "neutral"
SocialAnxiety = "neutral" # "outgoing", "shy", or "neutral"
Optimism = "positive" # "positive", "negative", or "neutral"
# ───── Birthday ─────
BirthdaySeason = "summer" # "spring", "summer", "fall", or "winter"
BirthdayDay = 12 # 1-28
# ───── Spawn Location ─────
HomeRegion = "Town" # Region for game logic
DefaultMap = "Hospital" # Starting map
DefaultX = 9 # X tile coordinate
DefaultY = 7 # Y tile coordinate
DefaultFacing = 2 # 0=Up, 1=Right, 2=Down, 3=Left
# ───── Relationship Flags ─────
Datable = true # Can be dated
Marriageable = true # Can be married
# ───── Asset Paths ─────
CustomSpritePath = "sprite.png" # Default sprite
CustomPortraitPath = "portrait.png" # Default portrait
# ───── External Files ─────
DialoguePath = "Dialogue.toml" # Separate dialogue file
SchedulePath = "Schedule.toml" # Separate schedule file
# ───── Sprite Variants ─────
[Sprites]
Hospital = "sprite_Hospital.png" # When at Hospital
Beach = "sprite_Beach.png" # When at Beach
summer = "sprite_Summer.png" # During summer
rainy = "sprite_Rainy.png" # When raining
# ───── Portrait Variants ─────
[Portraits]
Hospital = "portrait_Hospital.png" # When at Hospital
summer = "portrait_Summer.png" # During summer
# ───── Gift Tastes ─────
[GiftTastes]
# Item IDs or names (supports universal keys like "Universal_Love")
Love = ["Diamond", "Coffee", "Universal_Love"]
Like = ["Blueberry", "Universal_Like"]
Neutral = ["Universal_Neutral"]
Dislike = ["Universal_Dislike"]
Hate = ["Universal_Hate"]
Allowed Values Reference
| Property | Allowed Values | Description |
|---|---|---|
Gender |
"male", "female" |
Determines pronouns and base sound effects |
Age |
"child", "teen", "adult" |
Affects walking speed, height, and events |
Manner |
"neutral", "polite", "rude" |
Changes speech bubble shape and default reactions |
SocialAnxiety |
"neutral", "outgoing", "shy" |
Affects idle animations and social behavior |
Optimism |
"neutral", "positive", "negative" |
General personality bias |
BirthdaySeason |
"spring", "summer", "fall", "winter" |
Season of NPC's birthday |
DefaultFacing |
0, 1, 2, 3 |
0: Up, 1: Right, 2: Down, 3: Left |
Dialogue System
Follows Stardew Valley StandardsNPC Helper uses Stardew Valley's native dialogue system. All dialogue keys and formats must follow the official Stardew Valley format. View complete documentation on Stardew Valley Wiki ↗
Dialogue is defined in TOML files using Stardew Valley's standard key system. NPC Helper passes dialogue directly to the game engine, which handles all conditional logic and selection.
[Dialogue]
# Basic dialogue keys (following Stardew Valley format)
Introduction = "Hi, I'm Rei. Nice to meet you!"
# Day of week
Mon = "Mondays are tough, but we'll get through it."
Tue = "Tuesday already? Time flies."
# Heart levels (Stardew Valley uses numeric suffixes)
2 = "You're becoming a familiar face."
4 = "Good to see you again!"
6 = "I'm glad we're friends."
# Location-based (when NPC is at these locations)
Hospital = "I'm on duty today. Please don't distract me too much."
Town = "The town looks peaceful today."
# Seasonal dialogue
spring_1 = "Spring is finally here!"
winter_24 = "Happy Winter Star!"
# Time-based (using game's time format)
Town_2000 = "It's getting late. You should head home soon."
# Weekly rotation (Stardew Valley's || operator)
Greeting = "Hello! || Hi there! || Good to see you!"
# Festival dialogue (must match festival names)
EggFestival = "Egg hunting isn't really my thing."
FlowerDance = "The flowers are beautiful this year."
# Using Stardew Valley dialogue commands
Question = "$q 100/101 Do you like medicine?#$b#I'm just curious."
AnswerYes = "$r 100 10 Yes, I find it fascinating!"
AnswerNo = "$r 101 0 Not really, it's not for me."
# Special dialogue keys
breakUp = "This is for the best..."
divorced = "Please, just leave me alone."
AcceptGift_Loved = "This is wonderful! Thank you!"
AcceptGift_Liked = "Thanks, I appreciate it."
Dialogue Key Reference (Stardew Valley Format)
View Full ReferenceStandard Dialogue Keys
Introduction- First meeting dialogueMon,Tue, etc. - Day of week2,4,6- Heart levelsspring_1- Seasonal (season_day)Hospital,Town- Location-specificHospital_Tue- Location + day combinationTown_2000- Location + time combinationEggFestival- Festival-specificDefault- Fallback dialogue
Key Priority Order
Stardew Valley checks keys in this order: Location-specific → Seasonal → Heart level → Day of week → Generic
Special Keys & Commands
breakUp- After breaking updivorced- After divorceAcceptGift_Loved- Gift reactionsAcceptGift_Liked- Gift reactionsRejectBouquet- Rejecting bouquetDumpsterDiveComment- When player digs in trash$h,$s,$u- Portrait emotes$q- Question dialogue$r- Response options||- Weekly rotation separator@- Player name replacement${male^female}- Gender-specific text
Note on Conditions
[condition] syntax is NOT supported. Use Stardew Valley's built-in key system instead. Example: Instead of [friendship >= 4], use 4 or Mon4.
Example Conversion from Old to New Format
Old Format (Not Supported)
[friendship >= 6] Hello friend! || Hi there. [time >= 1800] Good evening! || Hello. [season = summer] It's hot today!
New Format (Stardew Valley)
6 = "Hello friend!" Default = "Hi there." Town_1800 = "Good evening!" Town = "Hello." summer = "It's hot today!"
Important Migration Notice
If you have existing NPCs using the old [condition] syntax, you must convert them to Stardew Valley format.
Use the DialogueConverter tool or manually update your TOML files.
Schedule System
Day/Season FilteringDefine NPC movement patterns throughout the day. Schedules can be filtered by day, season, or specific dates.
# Separate Schedule.toml file structure
# ───── Weekday Schedule (Mon-Fri) ─────
[[Schedule]]
Time = 600 # 6:00 AM
Map = "Hospital"
X = 1
Y = 18
Facing = 2 # Facing down
Days = "Weekday" # Monday through Friday
[[Schedule]]
Time = 1200 # 12:00 PM
Map = "Town"
X = 29
Y = 54
Facing = 2
Days = "Weekday"
Action = "Having lunch" # Optional description
[[Schedule]]
Time = 1800 # 6:00 PM
Map = "Hospital"
X = 13
Y = 5
Facing = 0 # Facing up
Days = "Weekday"
# ───── Weekend Schedule (Sat-Sun) ─────
[[Schedule]]
Time = 900 # 9:00 AM
Map = "Beach"
X = 20
Y = 20
Facing = 2
Days = "Weekend" # Saturday and Sunday
[[Schedule]]
Time = 1700 # 5:00 PM
Map = "Saloon"
X = 21
Y = 17
Facing = 1
Days = "Weekend"
# ───── Specific Day Schedule ─────
[[Schedule]]
Time = 1000 # 10:00 AM
Map = "ArchaeologyHouse"
X = 15
Y = 8
Facing = 2
Season = "spring"
Day = 1 # Only on Spring 1
# ───── Birthday Schedule ─────
[[Schedule]]
Time = 1400 # 2:00 PM
Map = "Saloon"
X = 21
Y = 17
Season = "summer" # Rei's birthday is Summer 12
Day = 12
# ───── Specific Days of Week ─────
[[Schedule]]
Time = 800
Map = "Forest"
X = 45
Y = 32
Facing = 2
Days = "Mon,Wed,Fri" # Only on Monday, Wednesday, Friday
Schedule Filter Options
Day Filters
Days = "Weekday"- Monday through FridayDays = "Weekend"- Saturday and SundayDays = "Mon,Tue,Wed"- Specific daysDays = "Mon,Wed,Fri"- Multiple specific days- No
Daysfilter = applies every day
Date Filters
Season = "spring"- Only in springDay = 12- Only on day 12 of monthSeason = "winter", Day = 24- Only on Winter 24- No filters = applies every day of matching season
Gift Tastes System
Stardew Valley Gift System
⚠️ Breaking Change: The LoveMessage, LikeMessage etc. in [GiftTastes] are
no longer supported. Gift response messages must now be defined in Dialogue.toml using
AcceptGift_* keys following Stardew Valley's standard format.
Define what items your NPC loves, likes, is neutral about, dislikes, or hates using Stardew Valley's gift system. Gift response messages are defined separately in the dialogue file.
Main NPC TOML File
# In your main NPC TOML file (e.g., Rei.toml)
[GiftTastes]
# Use item names, qualified IDs, or universal categories
Love = [
"Diamond", # Specific item name
"(O)395", # Qualified item ID (Coffee)
"Starfruit", # Another specific item
# "Universal_Love" # Optional: Include universal loves
]
Like = [
"Blueberry",
"Coconut",
"Salmon",
"Cheese"
# "Universal_Like" # Optional: Include universal likes
]
Neutral = [
"Stone",
"Wood",
"Wheat"
# "Universal_Neutral" # Optional: Include universal neutrals
]
Dislike = [
"Clay",
"Copper Ore",
"Algae"
# "Universal_Dislike" # Optional: Include universal dislikes
]
Hate = [
"Joja Cola",
"Trash",
"Broken Glasses"
# "Universal_Hate" # Optional: Include universal hates
]
# ⚠️ DEPRECATED - DO NOT USE:
# LoveMessage = "Old format - no longer works!"
# LikeMessage = "Use AcceptGift_* in Dialogue.toml instead"
Dialogue TOML File
# In Dialogue.toml - Gift response messages
# These keys must follow Stardew Valley's standard format
# Regular gift reactions
AcceptGift_Loved = "Oh wow! Is this for me? I love it! $h"
AcceptGift_Liked = "Thanks! This is nice. I appreciate it. $h"
AcceptGift_Neutral = "Thank you."
AcceptGift_Disliked = "Oh... um, thanks? $u"
AcceptGift_Hated = "Eww, why would you give me this? $a"
# Birthday gift reactions (override for birthday)
AcceptBirthdayGift_Loved = "You remembered my birthday! This is amazing! $h"
AcceptBirthdayGift = "A birthday gift? Thank you! $h"
# Optional: Specific item reactions
AcceptGift_(O)72 = "A diamond! How extravagant... $h" # Diamond
AcceptGift_Coffee = "Coffee! Exactly what I needed. $h" # Coffee
AcceptGift_(O)395 = "More coffee? You know me too well. $h" # Coffee by ID
# Optional: Context tag reactions
AcceptGift_category_gem = "A gemstone! Very thoughtful. $h"
AcceptGift_category_cooking = "Homemade food? You shouldn't have! $h"
Gift System Reference
Item Reference Formats
"Diamond"- Item name (works for most unique items)"(O)72"- Qualified item ID (Object 72 = Diamond)"(O)Starfruit"- Qualified ID with internal name"(BC)17"- Building/other item types"Universal_Love"- All universally loved items"category_fruit"- All fruits (context tag)"category_gem"- All gems (context tag)
Finding Item IDs
Use CJB Item Spawner mod or check the
Stardew Valley Item IDs wiki
for reference.
Response Message Keys
AcceptGift_Loved- Loved gifts (+80 friendship)AcceptGift_Liked- Liked gifts (+45 friendship)AcceptGift_Neutral- Neutral gifts (+20 friendship)AcceptGift_Disliked- Disliked gifts (-20 friendship)AcceptGift_Hated- Hated gifts (-40 friendship)AcceptBirthdayGift_*- Birthday-specific responsesAcceptGift_(O)72- Specific item responsesAcceptGift_category_gem- Category responses
Priority Order
Stardew Valley checks: Specific item → Context tag → Gift taste → Default
Migration Guide: Old → New Format
Old Format (Deprecated)
# In main NPC TOML: [GiftTastes] Love = ["Diamond", "Coffee"] LoveMessage = "I love this! $h" LikeMessage = "Thanks! $h" # Dialogue.toml had regular dialogue only
New Format (Required)
# In main NPC TOML: [GiftTastes] Love = ["Diamond", "Coffee"] Like = ["Blueberry", "Coconut"] # NO Message keys here! # In Dialogue.toml: AcceptGift_Loved = "I love this! $h" AcceptGift_Liked = "Thanks! $h" AcceptBirthdayGift = "A birthday gift! $h"
How the System Works
- • GiftTastes in main TOML → Defines what items NPC likes/dislikes
- • AcceptGift_* in Dialogue.toml → Defines what NPC says when receiving gifts
- • Stardew Valley engine → Handles friendship points, birthday bonuses, and response selection
- • The two systems work together seamlessly when both are properly configured
Advanced Features
Asset Variants
Dynamic Sprites & PortraitsNPC Helper automatically switches sprites and portraits based on location, season, weather, or custom conditions. The system checks for variants in this priority order:
- NPC's current location (e.g., "Hospital", "Beach")
- Current season ("spring", "summer", "fall", "winter")
- Custom sprite/portrait path from TOML
- Default sprite.png/portrait.png in NPC folder
# In your main NPC TOML file
[Sprites]
# Location-based variants
Hospital = "sprite_Hospital.png" # When NPC is at Hospital
Beach = "sprite_Beach.png" # When at Beach
Saloon = "sprite_Saloon.png" # When at Saloon
# Season-based variants
spring = "sprite_Spring.png"
summer = "sprite_Summer.png"
fall = "sprite_Fall.png"
winter = "sprite_Winter.png"
# Weather-based variants
rainy = "sprite_Rainy.png"
snow = "sprite_Snow.png"
# Special occasion variants
festival = "sprite_Festival.png"
birthday = "sprite_Birthday.png"
[Portraits]
# Same structure for portraits
Hospital = "portrait_Hospital.png"
summer = "portrait_Summer.png"
rainy = "portrait_Rainy.png"
festival = "portrait_Festival.png"
Asset Requirements
- Sprites: 16x32 pixels per frame (standard Stardew NPC size)
- Portraits: 64x64 pixels per expression
- Format: PNG recommended (supports transparency)
- Paths: Relative to the NPC's folder, or absolute paths
- Naming: File names are case-sensitive on some systems
Localization
Multi-language Support
NPC Helper automatically loads localized versions of your TOML files based on the game's current language.
Create a locale folder in your NPC's directory with language-specific TOML files.
NPCs/
└── Rei/
├── Rei.toml # Default (English) definition
├── sprite.png
├── portrait.png
└── locale/ # Localization folder
├── es-ES/ # Spanish (Spain)
│ └── Rei.toml # Spanish translation
├── fr-FR/ # French
│ └── Rei.toml
└── de/ # German (generic)
└── Rei.toml
# locale/es-ES/Rei.toml - Spanish translation
# Only include properties that need translation
DisplayName = "Rei" # Spanish display name
[Dialogue]
Introduction = "Hola. Soy Rei, médico en prácticas en la clínica."
Mon = "Los lunes no me asustan. Solo necesitan el café adecuado."
Default = "Si me necesitas, estoy en la clínica."
# Gift messages can also be localized
LoveMessage = "¡Oh, vaya! ¿Esto es para mí? ¡Me encanta!"
LikeMessage = "¡Gracias! Esto está bien."
DislikeMessage = "Oh... um, ¿gracias?"
How Localization Works
- Locale Detection: Uses
helper.Translation.Locale(e.g., "es-ES", "fr-FR") - Fallback: If "es-ES" folder doesn't exist, tries "es" folder
- Overlay System: Localized TOML merges with base definition
- Automatic: No code needed - just create locale folders
- Cache Invalidation: Assets automatically reload when language changes
API Reference
For Mod DevelopersOther mods can programmatically register NPCs with NPC Helper using the provided API interface.
using StardewModdingAPI;
using NpcHelper;
public class MyMod : Mod
{
public override void Entry(IModHelper helper)
{
// Get the NPC Helper API
var npcHelper = helper.ModRegistry.GetApi("TamKungZ.NpcHelper");
if (npcHelper != null)
{
// Create NPC definition programmatically
var customNpc = new NpcDefinition
{
DisplayName = "Programmatic NPC",
Gender = "female",
Age = "adult",
DefaultMap = "Town",
DefaultX = 35,
DefaultY = 42,
DefaultFacing = 2,
Datable = true,
Marriageable = false
};
// Add dialogue
customNpc.Dialogue["Introduction"] = "Hello from code!";
customNpc.Dialogue["Mon"] = "Monday dialogue from API.";
// Add gift tastes
customNpc.GiftTastes["Love"] = new List { "Diamond", "Prismatic Shard" };
customNpc.GiftTastes["Hate"] = new List { "Joja Cola" };
// Register the NPC
npcHelper.RegisterNpc("CustomNPC", customNpc);
}
}
}
API Interface
INpcHelperApi Interface
public interface INpcHelperApi
{
///
/// Register a new NPC programmatically
///
/// Unique NPC name (no spaces)
/// NPC definition data
void RegisterNpc(string name, NpcDefinition data);
}
// Implementation in ModEntry.cs
public class NpcHelperApi : INpcHelperApi
{
private readonly NpcManager _manager;
public NpcHelperApi(NpcManager manager) => _manager = manager;
public void RegisterNpc(string name, NpcDefinition data)
{
data.Name = name;
_manager.Register(data);
}
}
Requirements
- NPC Helper must be installed
- Mod must reference NpcHelper namespace
- MinimumApiVersion: "4.0.0"
- UniqueID: "TamKungZ.NpcHelper"
Limitations
- Assets must be loaded via SMAPI's content API
- No direct access to NPC instances
- Schedule execution handled by NPC Helper
Help & Support
Troubleshooting
NPC Not Appearing in Game
- • Check SMAPI Log: Look for "[NpcHelper]" messages. Missing logs mean the mod isn't loading.
-
•
Verify manifest.json: Ensure
ContentPackFor.UniqueIDis exactly"TamKungZ.NpcHelper" -
•
Check mod.toml: Verify the path in
NPCs = ["..."]is correct and file exists. -
•
DefaultMap exists: Ensure the map name in
DefaultMapexists in your game version. -
•
NPC name conflict: Ensure NPC
Namedoesn't conflict with vanilla or other mod NPCs.
Dialogue Not Showing or Incorrect
- • Dialogue keys: Verify keys match Stardew's expected format (Mon, Tue, Introduction, etc.)
-
•
Condition syntax: Ensure conditions use correct syntax:
[friendship >= 4] Text -
•
TOML header: Dialogue in separate files needs
[Dialogue]header - • Cache issue: Try clearing SMAPI cache or restarting the game
- • Test without conditions: First test simple dialogue without conditions
Assets Not Loading (Red Question Mark)
- • File format: Ensure images are PNG format with transparency
- • Dimensions: Sprites: 16x32 per frame, Portraits: 64x64 per expression
- • File paths: Check TOML paths are correct relative to TOML file location
- • Case sensitivity: File names are case-sensitive on Linux/Mac
-
•
SMAPI cache: Clear SMAPI cache: Delete
Mods/.cachefolder
Common SMAPI Error Messages
Error Message
- "Content file not found"
- "Invalid TOML syntax"
- "Duplicate NPC name"
- "Missing dependency"
- "Failed to load texture"
Solution
- Check asset paths in TOML
- Validate TOML with online validator
- Change NPC name to be unique
- Install NPC Helper mod
- Verify image file exists and is PNG
Compatibility
| Feature | Stardew 1.5 | Stardew 1.6 | Notes |
|---|---|---|---|
| Basic NPC Creation | Limited | Full | 1.6 has better character data support |
| Advanced Schedules | Basic | Full | Day/Season filters optimized for 1.6 |
| Asset Variants | Yes | Yes | Location/season-based sprites work in both |
| Dynamic Dialogue | Yes | Yes | Conditional and randomized dialogue |
| Multiplayer Support | Limited | Full | Full sync in 1.6 multiplayer |
| Gift Tastes System | Yes | Yes | Customizable gift preferences |
| Localization | Yes | Yes | Automatic locale folder detection |
Mod Compatibility
Frequently Asked Questions
Q: Can I use NPC Helper with existing Content Patcher NPCs?
A: Yes, but they may conflict if modifying the same NPC data. NPC Helper creates new NPCs in the game's character data, while Content Patcher usually edits existing data. It's recommended to use one system or the other for a given NPC.
Q: How do I make my NPC appear in a specific location?
A: Use the DefaultMap, DefaultX, and DefaultY properties in your NPC TOML. The coordinates are tile coordinates (multiply by 64 for pixel coordinates). Use the Schedule.toml file to define daily movement patterns.
Q: Can NPCs have custom events or cutscenes?
A: NPC Helper focuses on runtime NPC creation and management. For complex events or cutscenes, you'll need to create them separately using SMAPI's event system or Content Patcher. The API allows other mods to interact with NPC Helper NPCs.
Q: How do I update an existing NPC without breaking saves?
A: NPC definitions are loaded at runtime each time the game starts. You can update TOML files, assets, or add new features, and they'll be applied when players reload their game. However, changing an NPC's Name property will create a new NPC and may break existing friendships.
Q: What's the performance impact of many NPCs?
A: NPC Helper is optimized for performance. Each NPC has minimal overhead when not on screen. The main impact comes from asset loading and schedule execution. For large numbers of NPCs (50+), consider spreading them across different content packs or using simplified schedules.