Mob level per wave — the biome×wave formula

A single function level(biome, wave) that reproduces Claw Master's per-wave enemy level for biomes 1–16 and extrapolates beyond — for auto-generating new biomes with CM-approximate balance. This is the input to Enemy Progression, which turns the level into HP/DMG.

The formula FACT (fit) / ASSUMPTION (shape)

level(b, w) = round( S(b) + ( E(b) − S(b) ) × xp(b) )
x = (w−1)/(W(b)−1) — normalised wave position, 0→1
W(b) = 10 if biome odd, 15 if even
S(b) = floor (wave-1 level) · E(b) = boss (last-wave level)
p(b) = clamp(1.05 + 0.095·b, 1.1, 3.0) — ramp steepens with biome

Biomes 1–16: use CM's real anchors S(b), E(b) (table below) — exact boss match. Biome ≥17: extrapolate E(b)=128.5·1.236b (boss grows +23.6%/biome, log-R² 0.98), S(b)=r·E(b), r=0.72 (10-wave) / 0.55 (15-wave). The dip at each biome start (floor < previous boss) is preserved automatically — CM's intentional "breather + power fantasy" on entering a new biome.

Accuracy vs Claw Master (all 200 waves, biomes 1–16)

1.5%
Mean abs. error
0.5%
Median error
3.9%
90th-pctile error
±1%
Boss-level match

Boss (last-wave) levels reproduced within ±1% for every biome. Worst single cell (28.6%) is an early onboarding wave in Biome 1 where the true level is single-digit — a 1–2 level miss reads large in % but is trivial in play.

Enemy level across all 200 waves — actual vs model

Global wave index left→right (B1·W1 … B16·W15). Note the saw-tooth: each biome starts below the previous biome's boss. — actual (CM)   - - model

Mean absolute % error within each biome

Drop-in implementation

// Claw-Master-style mob level for an auto-generated biome. biome & wave are 1-based.
public static class MobLevels
{
    // CM anchors, biomes 1-16: (floor S = wave 1, boss E = last wave).
    static readonly (int S, int E)[] Anchors = {
        (1,12),(11,100),(85,180),(144,370),(278,430),(301,500),(425,575),(403,700),
        (595,850),(595,1000),(850,1150),(805,1650),(1403,2000),(1400,2500),(2125,2750),(1925,4500)
    };
    public static int Get(int biome, int wave)
    {
        int W = (biome % 2 == 1) ? 10 : 15;            // odd biome = 10 waves, even = 15
        double S, E;
        if (biome >= 1 && biome <= 16) { S = Anchors[biome-1].S; E = Anchors[biome-1].E; }
        else { E = 128.5 * System.Math.Pow(1.236, biome); S = (W==10 ? 0.72 : 0.55) * E; }
        double p = System.Math.Clamp(1.05 + 0.095 * biome, 1.1, 3.0);
        double x = (wave - 1.0) / (W - 1);             // 0 at wave 1, 1 at boss wave
        return (int)System.Math.Round(S + (E - S) * System.Math.Pow(x, p));
    }
}

Anchor table — biomes 1–16 FACT (exact CM values)

BiomeWavesS — floor (wave 1)E — boss (last wave)
110112
21511100
31085180
415144370
510278430
615301500
710425575
815403700
910595850
10155951,000
11108501,150
12158051,650
13101,4032,000
14151,4002,500
15102,1252,750
16151,9254,500

Extrapolation — biomes 17+ ASSUMPTION

From E(b)=128.5·1.236b; feed into the same ramp. Wave-count parity assumed to keep alternating (odd 10 / even 15).

BiomeWavesS — floorE — boss
17103,3884,706
18153,1995,816
19105,1757,188
20154,8868,883
21107,90510,979
22157,46313,568
231012,07416,769
241511,39920,725

Full reconstruction — actual / model per wave

Top = Claw Master actual · bottom = model. Right column = biome mean error.

BiomeW1W2W3W4W5W6W7W8W9W10W11W12W13W14W15err
B1 · Enchanted Forest1
1
2
2
3
3
5
4
7
5
8
7
9
8
10
9
11
11
12
12
8.2%
B2 · Mystic Woods11
11
16
14
21
19
26
24
32
30
38
36
44
42
50
49
57
55
64
62
71
70
78
77
85
85
93
92
100
100
3.9%
B3 · Frozen Tundra85
85
92
90
101
98
110
107
120
117
131
128
142
140
155
153
167
166
180
180
1.6%
B4 · Crystal Caves144
144
155
149
168
158
181
169
196
182
211
196
227
211
243
228
260
246
277
264
295
284
314
304
332
325
351
347
370
370
4.3%
B5 · Molten Fields278
278
284
283
292
293
303
306
317
322
334
340
354
360
377
382
402
405
430
430
0.9%
B6 · Clockwork Factory301
301
305
304
310
310
317
317
325
327
336
339
348
351
361
366
376
381
393
398
412
416
431
436
453
456
476
477
500
500
0.6%
B7 · Desert Oasis425
425
430
428
439
436
450
448
463
462
480
480
500
500
522
522
548
548
575
575
0.2%
B8 · Abandoned City403
403
407
406
413
412
421
421
432
434
446
449
463
467
482
488
505
511
530
536
558
565
589
595
623
628
660
663
700
700
0.6%
B9 · Poisonous Marsh595
595
600
599
609
610
624
626
645
649
671
678
705
713
746
753
794
799
850
850
0.5%
B10 · Glacial Peaks595
595
598
597
604
603
613
614
626
628
643
647
664
669
689
696
718
727
753
762
792
802
836
845
886
893
940
944
1,000
1,000
0.6%
B11 · Scrapyard850
850
855
853
865
863
881
880
904
905
934
938
974
978
1,023
1,027
1,081
1,084
1,150
1,150
0.2%
B12 · Blazing Caves805
805
810
808
820
817
836
834
859
859
891
894
931
937
982
990
1,042
1,053
1,113
1,126
1,195
1,209
1,290
1,303
1,397
1,408
1,517
1,523
1,650
1,650
0.5%
B13 · Dark Catacombs1,403
1,403
1,409
1,407
1,424
1,422
1,450
1,452
1,490
1,497
1,547
1,559
1,625
1,639
1,724
1,739
1,849
1,859
2,000
2,000
0.4%
B14 · Ancient Ruins1,400
1,400
1,406
1,402
1,417
1,411
1,436
1,428
1,464
1,456
1,502
1,495
1,553
1,546
1,616
1,611
1,693
1,690
1,785
1,784
1,893
1,894
2,018
2,020
2,160
2,162
2,321
2,322
2,500
2,500
0.2%
B15 · Neon District2,125
2,125
2,131
2,128
2,146
2,140
2,173
2,166
2,215
2,209
2,275
2,271
2,355
2,354
2,460
2,461
2,591
2,592
2,750
2,750
0.1%
B16 · Ghostly Swamp1,925
1,925
1,932
1,928
1,949
1,942
1,980
1,974
2,031
2,028
2,105
2,108
2,207
2,217
2,341
2,359
2,510
2,536
2,719
2,752
2,972
3,009
3,273
3,311
3,626
3,658
4,033
4,053
4,500
4,500
0.6%

What this is — and what to check FACTASSUMPTIONVERIFY

FACT Source: biome_waves_detailed.json (per-enemy level) + boss_data.json→biomeOrder, CM 1.15.4 teardown. 16 biomes, 200 waves. All enemies in a wave share one level; biomes alternate 10/15 waves.

ASSUMPTION No closed-form in the binary — per-wave levels are authored content, so this formula approximates designer-tuned data. It is intentionally smooth and won't be bit-exact on the hand-rounded boss numbers or the two deliberate outliers (Biome 5 boss unusually low; Biome 16 jumps 1.64× as an end-wall).

VERIFY This maps the level index, not difficulty. Level→HP/DMG lives in Enemy Progression (HP=base×(1+0.14(L−1)), DMG=base×(1+(L−1)/20)1.18). To difficulty-match Claw Fight (not just level-match CM), apply CF's own base stats. Enemy composition per wave (types/counts/lanes) is separate data, not modelled here.