Station 07
Ungodly Difficulty
Every enemy statistic reachable, and a live director on top of them that watches how you are actually playing and moves the whole game to match.
Controls
Hotkeys and the panel§
Nothing here is permanent. Turn the master switch off and every enemy on screen reverts to its shipped numbers within half a second. Delete the DLL and the game is exactly as it was.
| Key | Does |
|---|---|
| F7 | Open or close the settings panel. The game pauses while it is open. |
| F8 | Toggle a small live readout in the corner. |

Nine tabs: Overview, Director, Enemies, Combat, Bosses, Elites, Player, Per-Enemy and Diagnostics. Apply now pushes a sweep immediately, Save config writes to disk, Reset director puts the live number back to where it started.
Getting a feel for it
The first five minutes§
Open F7 → Overview and press a preset.
Scourgeis a good first step up.Ordealis a serious one.Close the panel and go and fight something.
Press F8 first so you can see the readout while you do.
Watch the number after UNGODLY DIFFICULTY.
That is the live difficulty scalar. If you are cruising it climbs. If you are getting mauled it drops. That is the whole idea, and it is worth watching for a few rooms before you change anything else.
If you want a flat, predictable difficulty instead
Set Director → Mode → Off and use the fixed multipliers by themselves. The live number pins at 1.00 and only your own settings apply.
Scope
What it actually changes§
Every enemy statistic is reachable
The full EntityStats set — health, strength, defence, resistance, critical chance, critical
multiplier, damage multiplier, and all six elemental damage reductions — plus everything that is not a stat:
movement speed, acceleration, jump power, animation speed, stagger recovery, stun duration, sight distance, vision cone
angle, hearing radius, activation range, execution chance, knockback force, contact damage, parry flags, guard flags,
health-bar visibility and off-screen behaviour.
Damage is scaled where nothing can escape it
Every damage event in Blasphemous — sword swings, projectiles, contact, traps, poison pools, environmental hazards, hard-coded boss attacks — funnels through two methods. The plugin sits on both. There is no category of damage that slips past.
Projectiles, the player, and rewards
- Projectiles get independent speed and lifetime control, covering straight, curved, accelerated, bouncing, boomerang, crawler, parriable, spline-following and homing types.
- The player side is tuned with the same care: maximum health, flat defence, all six resistances, extra flasks, healing per flask, outgoing damage, critical stats, parry window, riposte window, dash cooldown, and post-hit invulnerability.
- Rewards scale with the risk — Tears from kills and Fervour built by hitting things.
The truncation trap, and why MinimumDamageToEnemy exists
EnemyDamageArea.TakeDamageAmount casts damage to an integer before applying it. Without a floor, a
heavy armour setting or a low damage multiplier rounds a real hit down to zero and the enemy becomes
permanently unkillable.
MinimumDamageToEnemy (default 1) guards exactly this, and it only clamps hits that started at 1 or
above, so genuinely blocked hits still read as blocked. If enemies ever stop taking damage, this setting is the
first thing to check.
The headline feature
The director§
The director produces one number, and everything else reads that number through its own influence weight. That is why a single dial can push the whole game around while you still decide exactly which parts of the game feel it.
The five modes
| Mode | What it does |
|---|---|
Off | Pinned at 1.00. Only your fixed multipliers apply. Use this for a flat harder or easier game. |
Adaptive | Rubber-banding. Climbs when you dominate, drops when you struggle. This is the headline feature. |
Escalating | Ignores your performance and grinds steadily upward the longer you survive, resetting when you die. Turns a long run into a pressure cooker. |
Cyclical | Rises and falls on a slow wave regardless of how you are doing, so the game breathes between calm stretches and spikes. |
Hybrid | Adaptive plus Escalating. Responds to you and creeps upward. The most demanding option. |
How it judges you
Six signals, each weighted, each producing a 0–1 score where 1 means you are dominating:
| Signal | What it measures |
|---|---|
| Health held | Your health bar, smoothed. The most honest single signal. |
| Punishment avoided | Damage taken per minute as a percentage of your maximum health. |
| Kill speed | Average seconds between first damaging an enemy and killing it. |
| Staying alive | Recent deaths, decaying. |
| Flask discipline | Recent flask consumption, decaying. |
| Execution mastery | Executions landed — the payoff of a good parry or a charged attack. |
Health-derived signals are measured by watching your actual health value rather than the damage events, because the events report raw damage before your six resistances and flat defence are applied. Watching the bar measures what really happened, and it picks up poison, hazards and the penitence health-stock system for free.
The weighted average is compared against Target performance. The gap drives the difficulty number, smoothed by Reaction speed, filtered by a dead zone so it does not jitter during ordinary play, and clamped between your floor and ceiling.
The three controls in the screenshot
| Control | Shown | Means |
|---|---|---|
| Hold me at this skill level | 0.55 | The skill level Adaptive tries to hold you at, where 0 is constantly dying and 1 is untouchable. Lower it to be treated more gently; raise it and the game keeps cranking until you are genuinely sweating. 0.55 aims for "winning, but earning it". |
| Easiest it may become | 0.60 | The floor. At 0.6 the game will never make itself more than 40% easier than your fixed settings, no matter how badly a fight is going. Set it to 1.0 if you never want the game to help you. |
| Hardest it may become | 1.80 | The ceiling. At 1.8 a dominant player eventually faces enemies 80% above your fixed settings. Push to 3 or 4 if you want it to keep escalating until it finally breaks you. |
Safety rails
- Boss freeze (on by default) locks the number the moment a boss fight starts. A boss whose health bar moves under you reads as broken, not dynamic.
- Death relief immediately drops difficulty each time you die and fades as you recover. This is the anti-wall mechanism.
- Combat gating stops the number drifting while you are backtracking or reading item descriptions, so a long safe stroll is not mistaken for dominance.
Influence weights
Health 1.0 · Damage 0.65 · Speed 0.35 · Aggression 0.5 · Reward 0.5 by default.
Named starting points
Presets§
Selecting a preset writes real values into the real settings and then hands control straight back to you. There is no hidden "preset is active" state — the config file on disk always says exactly what the game is doing.
| Preset | Enemy HP | Enemy DMG | Speed | Reactions | Elites | Notes |
|---|---|---|---|---|---|---|
| Pilgrim | 0.70 | 0.60 | 0.90 | 0.90 | — | Wider parry window, damage cap on, gentler director. |
| Penitent | 1.00 | 1.00 | 1.00 | 1.00 | — | Vanilla, with a light adaptive director on top. |
| Scourge | 1.40 | 1.35 | 1.08 | 1.08 | 5% | A firm step up. |
| Ordeal | 2.00 | 1.75 | 1.18 | 1.15 | 10% | Twice as durable, hits considerably harder. |
| Tribulation | 3.00 | 2.00 | 1.30 | 1.25 | 15% | Hybrid director, boss enrage below 30% health. |
| Miracle | 4.00 | 2.50 | 1.50 | 1.40 | 25% | A joke difficulty. Enrage below 40%. Not balanced. Have fun. |
Bosses get their own, gentler curve in every preset. A boss health multiplier that works for a corridor enemy turns a seven-minute duel into an endurance test.
The config file
Every setting, by section§
<game folder>\BepInEx\config\com.stixsworldhd.blasphemous.ungodlydifficulty.cfgTwenty sections. Every setting carries its own legal range and a plain-English explanation of what it does to your game, and the in-game panel shows the same text under each control — one source of truth, so the file and the panel can never disagree.
| Section | Covers |
|---|---|
| 01 General | Master switch, sweep timing, logging |
| 02 Interface | Hotkeys, panel size and solidity, pause, cursor, readout |
| 03 Preset | The named starting points |
| 04 Dynamic Director | Mode, target, limits, reaction, escalation, relief, influence |
| 05 Director Signals | Signal window, the six weights, the two reference values |
| 06 Enemy Health | Health multiplier, mid-fight rescale behaviour, floor |
| 07 Enemy Damage | Damage, contact damage, knockback, minimum, per-hit cap |
| 08 Enemy Armour & Resistance | Flat armour, incoming damage, six elemental reductions, raw stat dials |
| 09 Enemy Speed & Reactions | Movement, jump, animation, stagger, stun |
| 10 Enemy Senses & Aggression | Sight, hearing, activation range |
| 11 Enemy Behaviour Switches | Executions, parry, guard, contact, health bars, off-screen |
| 12 Bosses | Detection, twelve boss dials, untraced-damage ownership, enrage |
| 13 Projectiles | Speed, lifetime |
| 14 Damage Elements | Physical, fire, toxic, magic, lightning, contact |
| 15 Damage Types | Standard, heavy, critical, light |
| 16 Elites | Scope, chance, bonuses, tint |
| 17 Player | Health, defence, resistances, flasks, damage, timing windows |
| 18 Rewards | Tears, Fervour |
| 19 Per-Enemy Overrides | The override line |
| 20 Extreme Switches | God mode, one-hit death, one-hit kills |
The raw stat dials in section 08 stack with EnemyDamage
EnemyStrengthStat, EnemyDamageMultiplierStat, EnemyResistance,
EnemyCritChance and EnemyCritMultiplier edit the underlying attributes rather than the
damage that reaches you. Setting both those and EnemyDamage to 2.0 gives roughly four times
damage, not two.
They default to 1.00 and exist so that every enemy statistic is genuinely reachable, not because you should
normally use them. For ordinary difficulty tuning use EnemyDamage in section 07 — it is applied
once, at the point every damage event in the game passes through, so it catches everything.
New in 1.1.0
Bosses§
Bosses are Enemies as far as the engine is concerned, so everything in the plugin already reached them. What 1.1.0 added is making sure the plugin knows which ones are bosses, that boss damage is credited to the boss, and that boss tuning survives the fight.
Detection, three ways
- Balance data. Every boss carries a
BossBalanceImporter— the component the developers attach to anything whose health and per-attack damage come from the boss balance chart rather than from its prefab. That is the game’s own definition of "this is a boss", so it is exact rather than a guess. - A scene-wide
BossFightManagerscan once per level load. The manager is usually a separate object holding a reference to its boss rather than a parent of it, so a cheap parent lookup alone would miss most of them. - Namespace, as a backstop, plus your own
ExtraBossIdslist for mini-bosses and DLC encounters.
The twelve boss dials
| Setting | Does |
|---|---|
BossHealth | Maximum health |
BossDamage | All damage it deals |
BossIncomingDamage | Damage it takes from you |
BossFlatArmour | Flat reduction on each of your hits |
BossMoveSpeed | Movement around the arena |
BossAnimationSpeed | Wind-ups, swings and recoveries |
BossContactDamage | Damage from touching it |
BossKnockbackForce | How hard its hits throw you |
BossStaggerRecovery | How long before it can be staggered again |
BossStuntTime | How long a broken guard stays open |
BossProjectileSpeed | Its projectiles, separate from regular enemies |
BossReward | Tears on death |
Boss projectiles are separated from regular ones because boss bullet patterns are choreographed around specific timings. 1.25 already changes which patterns are dodgeable.
Untraceable damage belongs to the boss
A few boss attacks are separate spawned objects rather than parts of the boss, and they name themselves as the
attacker rather than naming the boss — the High Wills’ mines, Ten Piedad’s thorn bushes, certain
beams. With BossOwnsUntracedDamage on (the default), damage that cannot be traced to a specific attacker
while a boss fight is running uses the boss’s multipliers instead. Regular enemies in the arena are unaffected,
because they resolve directly.
Enrage
Off by default. Switch on BossEnrageEnabled and a boss becomes more dangerous once its health drops below
BossEnrageThreshold — extra damage, extra movement speed, faster animations. The end of the fight
becomes the hardest part of it, which is where the tension should be. Tribulation and Miracle
turn it on for you.
Optional, off by default
Elites§
A percentage of enemies roll as elite when they spawn, arriving with extra health, damage, speed and reactions,
dropping considerably more Tears, and tinted so you can see one coming before it kills you. The default tint is a hot
orange-red (FF6B4AFF) chosen to read clearly against the game’s muted palette without hiding the
sprite art.
The tint survives damage flashes — the plugin re-asserts it each sweep, preserving whatever alpha the flash effect is currently using, so the flash still reads correctly.
Bosses do not roll elite
Not unless you explicitly widen the scope, which you probably should not do. A boss with elite bonuses stacked on top of boss tuning is not a fight, it is a wall.
When one enemy is the problem
Per-enemy overrides§
Open the panel, go to Per-Enemy, switch overrides on, and every enemy you have met since launching the game is listed with sliders. Adjust one and the config line is rewritten for you.
If you would rather write it by hand, the format is:
ID=key:value,key:value ; ID=key:valueValid keys: health damage incoming speed anim
reward armour sense. All are multipliers on top of your global settings except
armour, which is flat damage added.
Example
EN12=health:0.5,damage:0.5;EN27=health:3,anim:1.3,reward:2Turn on HudShowEnemyList to see internal IDs on screen while you play. The Bosses tab shows boss
IDs the same way, and those are the ones you type into ExtraBossIds.
The fine print
Compatibility and performance§
Penitences
- PE01 and PE03 behave normally.
- PE02 (Bleeding Heart) replaces damage with fixed health stocks at a point after this plugin’s scaling runs. Damage multipliers therefore have no effect while PE02 is active — which is correct, since that penitence deliberately makes every hit cost exactly one stock. Everything else still applies.
Game modes
New Game, New Game Plus and Boss Rush all work. Demake mode resets the player’s Strength bonus, which this plugin does not use, so it is unaffected.
Other mods
The plugin patches eight methods, all of them narrow, and adds bonuses through the game’s own stat-bonus system rather than overwriting base values — the same mechanism rosary beads and prayers use. It composes with your equipment instead of fighting it. If another mod also scales damage at the same chokepoints, the two multipliers compound. That is arithmetic, not a bug.
Performance
Designed to be free when nothing is changing:
- No per-frame scanning. Enemies are discovered through the game’s own static
Entity.Startedevent, so there is noFindObjectsOfTypein any hot path. - Generation counter. Every resolved setting is folded into a snapshot carrying a generation number, and each enemy records the generation it was last written with. If they match, the entire per-enemy apply is skipped. A settled game with forty enemies on screen costs roughly forty integer comparisons per sweep, twice a second.
- Allocation-free damage path. The damage prefixes read plain static floats. They do not allocate, do not touch the config system, and do not evaluate a preset chain.
- Cached attacker resolution. Mapping a projectile or a weapon child back to the enemy that owns it is a component walk, so the answer — including the negative answer — is cached per GameObject.
- Quantised director output. The live number is only published when it moves by at least 0.01, so a continuously drifting float cannot invalidate every enemy on every frame.