Enemy progression — how CM scales enemies

How Claw Master increases enemy stats over the campaign, with an interactive calculator. The formulas are decompiled from the arm64 binary (libil2cpp.so); the multipliers are live runtime values read off the running game. Both curves climb hard: HP is linear and explodes; damage is a steep, super-linear power curve.

Correction (16/06/2026): the DMG exponent was 0.10, now 1.18. The old 0.10 came from the 31-May static APK dump and made enemy damage look near-flat (it predicted a biome-3 Rat at ~24). The live build runs 1.18 (captured via frida-il2cpp-bridge off the running EnemyMultipliersConfig singleton), which reproduces the team's observed ~150 for that Rat. HP (0.14) was unchanged and was already correct.

Mechanism + verified formulas FACT

CM stores one base config per enemy (42 total) and scales at spawn via LevelSpawnEnemiesAbility.Spawn(EnemyConfig, int level)CalculateHealth/DamageParameterValue(base, multiplier, level), multiplier = one global EnemyMultipliersConfig (HP 0.14, DMG 1.18 live). The integer level runs 1 → ~4500 across the campaign. Decompiled bodies (RVA 0x2EC5754 / 0x2EC57F8):
HP(level)  = round( baseHP  × (1 + 0.14 × (level − 1)) )
DMG(level) = round( baseDMG × (1 + (level − 1) / 20) 1.18 )
Note: level is 1-based — at level 1 both equal the base stat. HP is linear: the 0.14 is a per-level coefficient. DMG is a power curve with exponent 1.18 > 1, so it's super-linear — damage climbs faster than linearly with level, not the near-flat curve the stale 0.10 implied. Results are rounded to the nearest integer (half-to-even, via modf + frintp/frintm in the asm).

What this means for balance FACT

Across the full campaign (level 1 → ~4500), a Common enemy scales HP ≈ ×631 (240 → ~151k) and DMG ≈ ×600 (20 → ~12,000) — the two curves climb at comparable rates. CM enemies become both enormous HP walls and lethal hitters: by the mid/late biomes a single basic mob deals hundreds-to-thousands of damage, so avoiding hits matters as much as clear-speed. (An earlier version of this page, built on the stale 0.10 exponent, wrongly said damage stayed near-flat — that was incorrect.) Bosses follow the same two curves from their higher base, consistent with the dungeon's authored multi-thousand boss damage.

🧮 Enemy progression calculator

Pick a CM enemy (auto-fills base stats) or type your own, set a level, read the effective stats. The HP coefficient, DMG exponent and DMG divisor are editable so you can model CF's own curve. Decompiled formulas: HP = round(base × (1 + cHP×(level−1))), DMG = round(base × (1 + (level−1)/div)^exp).

Effective HP
Effective DMG
×HP / ×DMG vs base
This enemy across the campaign (effective stats at each biome's level range):
#BiomeLevelEff. HPEff. DMG

Campaign curve — basic mob & boss per biome (true play order)

Basic columns = floor Common enemy (base 240 HP / 20 DMG, e.g. Rat). Boss column = biome boss base → scaled at the biome's top level. Sorted by biomeOrder (the data's biome key order is NOT play order).

#BiomeWavesEnemy levelBasic HPBasic DMGBossBoss HP (base→scaled)
1Enchanted Forest101–12240–61020–34SpikeWorm5.2k → 13.2k
2Mystic Woods1511–100576–3.6k32–164Golem4.4k → 65.4k
3Frozen Tundra1085–1803.1k–6.3k140–301ArcticWorm5.2k → 135.5k
4Crystal Caves15144–3705.0k–12.6k238–664LarvaQueen4.4k → 231.7k
5Molten Fields10278–4309.5k–14.7k483–786MagmaWorm5.2k → 317.5k
6Clockwork Factory15301–50010.3k–17.0k527–933CyberWorm5.2k → 368.5k
7Desert Oasis10425–57514.5k–19.5k776–1.1kGolem4.4k → 358.0k
8Abandoned City15403–70013.7k–23.7k731–1.4kBeholder5.2k → 514.1k
9Poisonous Marsh10595–85020.2k–28.8k1.1k–1.7kLarvaQueen4.4k → 527.4k
10Glacial Peaks15595–100020.2k–33.8k1.1k–2.1kArcticOgre4.4k → 619.8k
11Scrapyard10850–115028.8k–38.8k1.7k–2.4kMetalWorm5.2k → 841.7k
12Blazing Caves15805–165027.3k–55.6k1.6k–3.7kDevil4.4k → 1.02M
13Dark Catacombs101403–200047.3k–67.4k3.1k–4.6kWyvern5.2k → 1.46M
14Ancient Ruins151400–250047.2k–84.2k3.1k–6.0kCyberWorm5.2k → 1.82M
15Neon District102125–275071.6k–92.6k5.0k–6.7kSpikeWorm5.2k → 2.01M
16Ghostly Swamp151925–450064.9k–151.4k4.4k–12.0kBugWorm5.2k → 3.28M

EnemyWaves sheet — where level comes from

Every spawn's level is hand-authored in the donor's EnemyWaves config sheet (EnemySpawnData: Enemy / Line / Distance / Level) — not computed at runtime. Below is the full sheet (1,113 spawns across 16 biomes), filtered by biome, with each spawn's authored level and the resulting effective HP/DMG from the decompiled formulas. ⬇ download full CSV

WaveEnemyLineDistLevelEff. HPEff. DMG

Cross-check — Dungeon observed scaling FACT

The Dungeon (23 levels) authors boss HP/DMG explicitly (overrides, not the formula) and reuses base configs as lackeys via an integer lackeyLevel that feeds the same scaling. Boss HP 260k → 5.6M (~22×) — the magnitude anchor confirming the linear HP curve.

#BossBoss HPBoss DMGLackeyLackey level
1RatSquire260.0k1.3kRat82
2Wasp303.0k1.6kRat90
3Boar347.0k1.9kRat98
4Wolf392.0k2.2kRat106
5RatKing654.0k4.1kRat154
6HawkBat745.0k4.8kRat170
7Quillbeast838.0k5.4kRat186
8Tusk931.0k6.1kRat202
9CannonBoar1.02M6.7kRat218
10Warg1.57M10.5kRat314
11PolarRat1.71M11.5kRat338
12Parasite1.85M12.5kRat362
13BlackHoof1.99M13.5kRat386
14HawkBat2.14M14.5kRat410
15BlackBear2.97M20.3kRat554
16Larva3.16M21.6kRat586
17ShardLizard3.35M22.9kRat618
18MinerBoar3.55M24.2kRat650
19Ghost3.74M25.6kRat682
20Scarab4.87M33.3kRat874
21HawkBat5.11M35.0kRat914
22Quillbeast5.36M36.7kRat954
23Tusk5.60M38.3kRat994

Provenance FACT

Formula structure decompiled from unpacked/lib/arm64-v8a/libil2cpp.so at the RVAs given by the Il2CppDumper output (CalculateHealthParameterValue 0x2EC5754, CalculateDamageParameterValue 0x2EC57F8); disassembled with radare2 (arm64). Multiplier values are LIVE runtime reads (16/06/2026) — frida-il2cpp-bridge on the running build read EnemyMultipliersConfig as Health = 0.14, Damage = 1.18. The 31-May static APK dump had Damage = 0.10 at offset 0x0090; that value was stale (the live build retuned it), which is why the archive previously under-reported enemy damage by several times. Level values + biome order from biome_waves_detailed.json + boss_data.json. Open: whether Super/Boss types receive a different multiplier than Common (the config exposes only one HP + one DMG value, so the same pair is applied to all); and the exact source of the 0.10→1.18 change (newer baked build vs runtime override — OnlineConfigs showed no sheet override, so most likely a retuned baked value in the current build).