Stolen Realm
Install with App

Details

Latest version
1.0.2
Last Updated
First Uploaded
Downloads
117
Likes
0
Size
1MB
Dependants

Categories

Roguelike Scaling

Stolen Realm's roguelike mode scales player stats with flat linear rules while enemies scale through multiplier tables. The two drift apart, and by the late levels your character is doing a fraction of the damage it did at the start of the run.

This mod rebalances the curves from measured in-game data so a run stays consistent end to end.

The problem, measured

Every number below was read out of the live game with a headless probe that enters a real roguelike run, force-levels a hero, and records the actual stat values. The enemy column is the game's own curve for a baseline-100 enemy.

Vanilla, level 1 to level 25:

L1 L10 L20 L25 Growth
Player MaxHealth 225 2954 16843 32724 145x
Enemy MaxHealth 56 907 6400 12000 214x
Player weapon damage 25 62 109 132 5.3x
Player ability power 19 171 492 713 37x
Enemy spell power 42 364 1092 1736 41x

Health and ability power track the enemy curve closely because attribute points feed them multiplicatively. Weapon damage does not. As a share of enemy health it collapses roughly 34x over a run, and the effect on play is a turns-to-kill that stretches like this:

Level 1 5 10 15 20 25
Turns to kill (vanilla) 2.2 3.8 5.4 6.8 9.9 11.2
Turns to kill (with this mod) 2.0 2.9 3.0 2.6 2.6 2.1

Turns to kill by level, vanilla versus modded

The same drift shows up defensively: player health stays at 4.0x a baseline enemy at level 1 but only 2.7x by level 25.

The fix

The mod multiplies the game's own values; it never replaces a formula. Nothing is hardcoded from the game's balance numbers, so it cannot desync from a future balance pass, item modifiers, rogue powerups and skill bonuses all keep composing normally, and switching the mod off restores vanilla exactly.

multiplier(level) = (1 + rate) ^ max(0, level - pivot)

Weapon damage and attributes use separate rates and pivots, because they are not the same problem.

With the shipped defaults:

L1 L5 L10 L15 L20 L25
Turns to kill 2.0 2.9 3.0 2.6 2.6 2.1
Player MaxHealth : enemy MaxHealth 4.0x 3.5x 3.6x 3.9x 3.5x 4.1x
Weapon damage growth 1.06x 1.31x 1.71x 2.23x 2.92x 3.81x

Turns to kill stays in a 2.0-3.0 band for the whole run instead of stretching five-fold.

WeaponGrowthPerLevel was tuned by measurement, not by feel. The obvious guess of 0.16 was tried first and rejected: it pushed turns-to-kill down to about 0.2 by level 25, so every fight ended in a single hit. 0.055 was the rate that holds the band above.

Installing and removing is safe

The mod never writes to your save files. Every change is applied at read time: the game's own numbers are read, multiplied by the curve, and handed back. Nothing is baked into a character, an item, or a quest record.

  • Install it and your existing characters and in-progress runs are untouched. Scaling appears the moment you load in.
  • Remove it and every number returns to exactly what the game would have given you. There is nothing to migrate, repair or undo, because nothing was ever persisted.
  • Turn it off (Enabled = false) and you get the same result as removing it, without a restart.
  • Item drops, rogue powerups, skill bonuses and future balance changes all keep composing normally, because the mod multiplies rather than replaces.

What the mod does not touch: the campaign mode by default (RoguelikeOnly = true), AI characters (so enemy stats are unchanged unless you enable enemy scaling), and save data of any kind.

Scaling follows the run, not the character sheet

In a roguelike run the curves are evaluated against the run's level, not each character's own level. These are not always the same thing: a character who has levelled less often than the run has advanced, or a party member recruited part-way through, sits below the run level. Scaling off the character sheet in that case leaves them weaker than the enemies they are fighting, which is the exact problem the mod exists to fix.

The run level is RoguelikeManager.RoguelikeBattleLevel, which is what the enemy curve is driven by too, so the player and enemy sides stay on the same footing at every point in a run. Outside a roguelike run there is no run level, so your character's own level is used unchanged.

Multiplayer

Every player in a session needs this mod installed, with the same curve settings.

That is not optional and it is not a nice-to-have. Each client computes its own multiplier from its own copy of the game, so a player without the mod has genuinely different stats from a player with it. Nothing will warn you mid-fight that this is the problem, so agree on it before you start.

With that in place the session is stable. Combat in this game is host-authoritative — damage, deaths and movement are decided on the host — and the mod only ever multiplies a value at read time. It writes nothing the network replicates, and the character data it does send is the game's own unscaled attributes. So all players running the mod see the same numbers and the same outcomes.

What to watch for:

  • Host has it, clients don't — the host's characters are stronger than clients' characters appear to be. Health bars on the client will also be wrong, because current and maximum health are scaled together.
  • Keep Enemy Scaling off for co-op. Enemy health and damage are host decisions. If the host has it enabled and a client does not, that client sees enemy numbers that do not match what it is fighting. It ships off by default; leave it off unless every player has matched settings.
  • The mod logs a [multiplayer] warning to BepInEx\LogOutput.log the first time it detects a networked session, so you can confirm everyone is actually running it.

Configuration

Everything lives in BepInEx\config\com.stolenrealm.roguelikescaling.cfg. Close the game, edit, relaunch.

Section Key Default What it does
General Enabled true Master switch. false restores vanilla exactly.
General RoguelikeOnly true Leave campaign characters untouched.
Curves GrowthPerLevel 0.02 Compounding rate for health, mana, armor, ability power.
Curves PivotLevel 5 Levels at or below this are untouched for attributes.
Curves WeaponGrowthPerLevel 0.055 Compounding rate for weapon damage. The main lever.
Curves WeaponPivotLevel 0 Weapon damage compounds from level 1, because the deficit exists across the whole run.
Attribute Weights MaxHealth 1 Weight on GrowthPerLevel for health. 0 disables.
Attribute Weights MaxMana 1 Weight for mana.
Attribute Weights ArmorAndMagicArmor 1 Weight for armor.
Attribute Weights AbilityPower 1 Weight for ability power.
Attribute Weights WeaponDamage 1 Weight on WeaponGrowthPerLevel.
Attribute Weights BonusStatPointsPerLevel 0 Extra attribute points per level past the pivot.
Enemy Scaling Enabled false Also extend enemy curves past the game's table.
Enemy Scaling PivotLevel 30 Where the enemy tail starts.
Enemy Scaling HealthGrowthPerLevel 0.03 Enemy health compounding rate.
Enemy Scaling DamageGrowthPerLevel 0.02 Enemy damage compounding rate.
Diagnostics LogLevelUps true Log a per-level stat line to BepInEx\LogOutput.log.
Diagnostics ShowScalingInStatScreen true Show the multiplier next to each scaled stat.
Diagnostics ShowVanillaValues false Also show the un-scaled value, e.g. x1.35 (6087).

Seeing the scaling in game

Press C for the character screen and the multiplier appears next to every stat the mod is actually touching, so you never have to open the config to know why a number is what it is:

Stat screen showing Attack Power 2431 x3.93

Nothing is annotated at levels where the curve is still 1, and stats the mod does not scale are left alone. The roguelike level-up panel shows both curves for the same reason: the attributes you are buying there compound at a different rate from the weapon damage shown on the character screen.

Weights are relative: 1 follows the curve rate, 0.5 halves it, 0 turns that stat off.

Enemy scaling is off by default, and there is a reason

The roguelike branch of the game's enemy curve has no extrapolation tail. The campaign path adds 1.05^(L-30) + 24(L-30) past level 30, but roguelike just lerps the final two table nodes forever, so enemy health and damage flatten out at depth. The tail is implemented here, but ships disabled so the player curves are what you are evaluating first. Turn it on if you want enemies to keep compounding past level 30.

Tuning

Set Diagnostics/LogLevelUps = true and play. Every level-up writes a line to BepInEx\LogOutput.log with the curve multiplier and your real stats, so you can tune against numbers rather than guesses.

If late-game damage still feels short, raise WeaponGrowthPerLevel before touching anything else. If enemies outgrow your mitigation, raise the ArmorAndMagicArmor weight or turn enemy scaling on. Reach for BonusStatPointsPerLevel last: it feeds health, ability power, armor and dodge at once, so it quietly amplifies every other curve.

Notes

  • Requires BepInEx 5.x (x64). Not BepInEx 6.
  • Built and measured against Assembly-CSharp.dll dated 2026-09-16.
  • The mod does not scale characters that are IsAI, so enemy stats are untouched unless you enable enemy scaling.
  • If a game update renames anything the mod touches, that patch becomes a no-op and logs a warning at startup instead of throwing.

Credits

Measured and built with the Stolen Realm modding pile. Thanks to Burst2Flame Entertainment for Stolen Realm.

Thunderstore development is made possible with ads. Please consider making an exception to your adblock.