Ungodly Blasphemous install guide

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.

KeyDoes
F7Open or close the settings panel. The game pauses while it is open.
F8Toggle a small live readout in the corner.
The Ungodly Difficulty settings panel open on the Director tab
Ungodly Difficulty on F7, Director tab. Crimson palette, nine tabs, and every control carries its own plain-English description underneath. Shown at 1280×720 — the original is 1920×1080.

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§

  1. Open F7Overview and press a preset.

    Scourge is a good first step up. Ordeal is a serious one.

  2. Close the panel and go and fight something.

    Press F8 first so you can see the readout while you do.

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

ModeWhat it does
OffPinned at 1.00. Only your fixed multipliers apply. Use this for a flat harder or easier game.
AdaptiveRubber-banding. Climbs when you dominate, drops when you struggle. This is the headline feature.
EscalatingIgnores your performance and grinds steadily upward the longer you survive, resetting when you die. Turns a long run into a pressure cooker.
CyclicalRises and falls on a slow wave regardless of how you are doing, so the game breathes between calm stretches and spikes.
HybridAdaptive 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:

SignalWhat it measures
Health heldYour health bar, smoothed. The most honest single signal.
Punishment avoidedDamage taken per minute as a percentage of your maximum health.
Kill speedAverage seconds between first damaging an enemy and killing it.
Staying aliveRecent deaths, decaying.
Flask disciplineRecent flask consumption, decaying.
Execution masteryExecutions 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

ControlShownMeans
Hold me at this skill level0.55The 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 become0.60The 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 become1.80The 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.

PresetEnemy HPEnemy DMGSpeedReactionsElitesNotes
Pilgrim0.700.600.900.90Wider parry window, damage cap on, gentler director.
Penitent1.001.001.001.00Vanilla, with a light adaptive director on top.
Scourge1.401.351.081.085%A firm step up.
Ordeal2.001.751.181.1510%Twice as durable, hits considerably harder.
Tribulation3.002.001.301.2515%Hybrid director, boss enrage below 30% health.
Miracle4.002.501.501.4025%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.cfg

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

SectionCovers
01 GeneralMaster switch, sweep timing, logging
02 InterfaceHotkeys, panel size and solidity, pause, cursor, readout
03 PresetThe named starting points
04 Dynamic DirectorMode, target, limits, reaction, escalation, relief, influence
05 Director SignalsSignal window, the six weights, the two reference values
06 Enemy HealthHealth multiplier, mid-fight rescale behaviour, floor
07 Enemy DamageDamage, contact damage, knockback, minimum, per-hit cap
08 Enemy Armour & ResistanceFlat armour, incoming damage, six elemental reductions, raw stat dials
09 Enemy Speed & ReactionsMovement, jump, animation, stagger, stun
10 Enemy Senses & AggressionSight, hearing, activation range
11 Enemy Behaviour SwitchesExecutions, parry, guard, contact, health bars, off-screen
12 BossesDetection, twelve boss dials, untraced-damage ownership, enrage
13 ProjectilesSpeed, lifetime
14 Damage ElementsPhysical, fire, toxic, magic, lightning, contact
15 Damage TypesStandard, heavy, critical, light
16 ElitesScope, chance, bonuses, tint
17 PlayerHealth, defence, resistances, flasks, damage, timing windows
18 RewardsTears, Fervour
19 Per-Enemy OverridesThe override line
20 Extreme SwitchesGod 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

  1. 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.
  2. A scene-wide BossFightManager scan 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.
  3. Namespace, as a backstop, plus your own ExtraBossIds list for mini-bosses and DLC encounters.

The twelve boss dials

SettingDoes
BossHealthMaximum health
BossDamageAll damage it deals
BossIncomingDamageDamage it takes from you
BossFlatArmourFlat reduction on each of your hits
BossMoveSpeedMovement around the arena
BossAnimationSpeedWind-ups, swings and recoveries
BossContactDamageDamage from touching it
BossKnockbackForceHow hard its hits throw you
BossStaggerRecoveryHow long before it can be staggered again
BossStuntTimeHow long a broken guard stays open
BossProjectileSpeedIts projectiles, separate from regular enemies
BossRewardTears 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:value

Valid 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:2

Turn 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.Started event, so there is no FindObjectsOfType in 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.