Difficulty Settings¶
Difficulty settings live under settings.difficultySettings in config.json. Each entry defines the name and gameplay scaling for one difficulty option.
Shape¶
{
"name": "Normal",
"enemiesDifficulty": 4,
"maxInitialLives": 5,
"initialCredits": 3,
"hasInfiniteContinues": false,
"hasInstantEnemiesPulling": true,
"settingsPerNumPlayers": []
}
Difficulty Fields¶
| Field | Type | Description |
|---|---|---|
name |
string |
Name shown in difficulty selection. |
enemiesDifficulty |
int |
Classic-style enemy difficulty value. |
maxInitialLives |
int |
Maximum initial lives selectable or assigned. |
initialCredits |
int |
Starting credits. |
hasInfiniteContinues |
bool |
Enables unlimited continues for this difficulty. |
hasInstantEnemiesPulling |
bool |
Pulls or activates enemies more aggressively. |
settingsPerNumPlayers |
array |
Scaling rules by number of active players. |
Per-Player Scaling¶
Each entry in settingsPerNumPlayers applies to a player-count band. The game clamps to the closest available entry when needed.
{
"maxNumEnemies": 8,
"enemiesHealthMultiplier": { "numerator": 3, "denominator": 2 },
"bossesHealthMultiplier": { "numerator": 2, "denominator": 1 },
"enemiesDamageMultiplier": { "numerator": 1, "denominator": 1 },
"enemiesVelocityMultiplier": { "numerator": 15, "denominator": 14 },
"playersDamageMultiplier": { "numerator": 1, "denominator": 1 },
"enemiesOnScreenActivationMultiplier": { "numerator": 3, "denominator": 2 },
"timeActivationMultiplier": { "numerator": 5, "denominator": 4 },
"useNextSpawnsDifficulty": true
}
| Field | Description |
|---|---|
maxNumEnemies |
Maximum enemies allowed on screen. |
enemiesHealthMultiplier |
Health scaling for normal enemies. |
bossesHealthMultiplier |
Health scaling for bosses. |
enemiesDamageMultiplier |
Damage scaling for enemies. |
enemiesVelocityMultiplier |
Movement speed scaling for enemies. |
playersDamageMultiplier |
Damage scaling for players. |
enemiesOnScreenActivationMultiplier |
How many enemies can activate based on screen presence. |
timeActivationMultiplier |
Time-based activation scaling. |
useNextSpawnsDifficulty |
Allows later spawn definitions to use the next difficulty band. |
Editing Guidance¶
For Classic reskins, difficulty settings are usually left alone. Change them when the reskin also changes balance, player count, or intended challenge.
When editing by hand:
- keep at least one difficulty
- keep
settingsPerNumPlayersnon-empty - use fraction multipliers instead of decimals
- test one-player and multiplayer runs
- verify menus still display every difficulty name