From level to strength
Spawn levels, health and attack multipliers, and leader effects.
5 min read
Point cost buys an instruction; it does not specify that zombie’s health. Strength is resolved through three distinct inputs: the instruction’s requested level, the entity’s effective level after creation modifiers, and the shared health/attack table. Leader marking is another operation afterward.
From the displayed level to an integer request
The baseline coefficients are Zombie and Zombie. Let mean rounding to float32, and mean a fused followed by that rounding. Decimal truncation and the level curve are
Define the integer bounds and . If , every instruction requests that level. Otherwise, let for the next integer draw and calculate
The fractional part therefore selects between adjacent integer levels; it is not itself the stored entity level. In the baseline, the request becomes fixed at from level 91.11Float32 level requestsThe native chain uses fused multiply-add with the float32 base/add coefficients, decimal truncation, a cap of 10, then floor/ceil clamped to 1–10. When those bounds differ, the upper choice is accepted when the integer residue is below the float32 fractional part multiplied by 100. The default inputs 2 and 3 both produce approximately 1.100000024 and accept residues 0–10.0x101d4561c0x101b3a27c
Float32 cannot represent every decimal exactly. Inputs 2 and 3 both reach approximately 1.100000024 after the native truncation sequence, and their slightly-above-10 threshold accepts residues 0–10. The view below exposes every ordinary level, its bounds, threshold, and accepted residues.
Level 3
- q
- 1.100000024between 1 and 2
- τ
- 10.000002
Residues d = u mod 100
- 11 residues request level 2
- 89 residues request level 1
This residue test belongs to ordinary spawn instructions. Modern portal children use the same level bounds but a separate global floating-point draw path.
Resolve the entity level, then select the mode’s table
Creation can apply level-module modifiers before storing the effective level . Zombie defaults to , so its clamp is inactive unless overridden. The ordinary definitions do not impose a five-level cap.
For a non-Zomboss entity in DangerRoom, both multipliers come from the shared Zombie vector, using index . This path does not read the type’s own level-stat vector. Penny’s Pursuit uses a separate Rift configuration; NewPVP has another shared-table branch.
The Endless gameplay reference
Health examples, including the wave-construction view, use the following ten-level Endless reference by default.
| Level | Health | Attack, reported |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 1.2 |
| 3 | 3 | 1.4 |
| 4 | 5 | 1.6 |
| 5 | 15 | 2 |
| 6 | 50 | 3 |
| 7 | 250 | 5 |
| 8 | 1,000 | 10 |
| 9 | 5,000 | 30 |
| 10 | 100,000 | 100 |
AttackLevel input.Both columns are relative to level 1. The attack column is a reported relative value; in the bite formula below is the separate native Attack input. Substituting a final damage ratio for that input would count the additional level factor twice.
The five-row DangerRoom table and its replacement
Default contains five rows: both HitPoints and Attack are 1, 2, 3, 4.5, and 5. A missing index returns multiplier 1; it neither repeats the last row nor extrapolates a growth formula. The generator’s request range of 1–10 and this table’s length are independent inputs.22Shared table lookup and missing rowsThe non-Zomboss DangerRoom lookup uses the shared ZombieLevelStats vector at effective entity level minus one. The bundled vector has five rows and a missing row returns multiplier 1; neccd.zls can replace the ordered pairs. The adopted ten-level Endless reference is reported gameplay data. Its attack column is a reported ratio, kept separate from the native AttackLevel input. Rift and NewPVP have separate table-selection branches; NewPVP's player-facing identity is unresolved. The level-module ZombieMaxLevel default is -1, and the ordinary definitions omit an override.0x1019938a00x101993af80x101d6db000x100fd8a100x10067f50c
neccd. can replace the entire ordered vector with attack/health pairs. Row order determines which effective level reads each pair. Replacing the table does not require changing the level curve, and a module-level override does not create a missing table row.
The other tables use different progressions:
- Penny’s Pursuit uses the Rift path. Its table has 19 rows, with levels 9–19 declaring 11–21 in both fields.
- Across 140 files, the main-level five-row sequence appears in 916 of 1,050 declarations. It is common, but other per-type declarations differ.
- The
NewPVPtable matches the reported Battlez values through level 8, then declares 10 and 20 at levels 9–10. - The legacy PvP comparison matches through level 4 but includes a fifth row of 5.
Localshares Rift’s first eight values and adds 11 and 12.DiyZombie Stats Default
| Row | DangerRoom | Rift | Main | NewPVP | Legacy PvP | Local DIY |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | 2 | 1.5 | 2 |
| 3 | 3 | 3 | 3 | 3 | 2 | 3 |
| 4 | 4.5 | 4.5 | 4.5 | 4 | 2.5 | 4.5 |
| 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| 6 | missing: 1 | 8 | 6 | 8 | ||
| 7 | 9 | 7 | 9 | |||
| 8 | 10 | 8 | 10 | |||
| 9 | 11 | 10 | 11 | |||
| 10 | 12 | 20 | 12 | |||
| 11 | 13 | |||||
| 12 | 14 | |||||
| 13 | 15 | |||||
| 14 | 16 | |||||
| 15 | 17 | |||||
| 16 | 18 | |||||
| 17 | 19 | |||||
| 18 | 20 | |||||
| 19 | 21 |
- DangerRoom
- Endless: bundled shared table
DefaultDanger Room Props - Rift
- Penny’s Pursuit: Rift configuration
RiftBase Config Key - Main
- Main-level comparison: Mummy properties
ZombieMummy Default - NewPVP
- NewPVP: mode identity unresolved
DefaultNew PVPProps - Legacy PvP
- Legacy PvP comparison: Imp properties
ZombiePVPImp Default - Local DIY
- Local DIY configuration
LocalDiy Zombie Stats Default
HitPointsLevel, which its AttackLevel repeats in every table. The shading deepens with the value. Below row 5 the DangerRoom table has no rows, and its lookup reads multiplier 1 there.The reported level-10 health multiplier of 100,000 is representable through the replacement path. Stored body and helmet HP remain distinct from the signed 32-bit value reported to wave scheduling: that reporting path can saturate.
Health and chewing use different calculations
With other health modifiers neutral, the resource values give
when a helmet is present. The implementation also accounts for module modifiers and existing health-reduction factors.
The chewing-rate getter chooses its base rate in this priority order:
- Positive
EatDPSRatiotimes maximum body HP. - Otherwise, positive instance
m_extra.EatDPS - Otherwise, positive instance
m_base.EatDPS - Otherwise, the property
EatDPS.
For the base bite implementation, let denote the native Attack field. With other target/type modifiers neutral,
Here is the condition-dependent attack-pace factor and is game-clock delta. The table’s attack multiplier is therefore only one factor; a fixed EatDPS is not the complete final bite rate. Specialized subclass attacks can use other implementations.33The base chewing-rate chainThe rate getter first uses a positive EatDPSRatio multiplied by maximum body health, then positive extraEatDPS, then positive baseEatDPS, then the property EatDPS. The base bite path multiplies this selected rate by the attack-table multiplier, attack pace, frame time, and 1 + 0.2 × (effective level - 1), with further condition/type modifiers and a nonnegative clamp.0x1019b55b00x10199f658
For a neutral level-5 mummy_, declared body/helmet HP 270/370 becomes 4050/5550 with the reported health multiplier 15. Reported attack is 2 relative to level 1; this does not determine the native bite rate.
For comparison, the five-row DangerRoom table gives 1350/1850 HP. Its EatDPS = 100, native attack multiplier 5, and level factor 1.8 produce 900 damage per game second at attack pace 1. The view lets you switch between the Endless reference and this DangerRoom-table calculation.
| entity | declared | multiplier | entity |
|---|---|---|---|
| Body HP | 270 | × 15 | 4,050 |
| Helmet HP | 370 | × 15 | 5,550 |
| Bite per game second | 100 | reported attack ×2: the bite needs the native AttackLevel | |
mummy_armor1 at level 5 under the Endless reference; above, each level’s health multiplier under both, on a logarithmic scale. The reported attack, 2 times level 1’s, sets no bite rate.Leader marking changes current and maximum health
On the first true leader mark, current body HP is multiplied by Leader and the result becomes maximum body HP. The baseline rate is 2. A present helmet is strengthened separately with its existing armor-health reduction factor reapplied and a nonnegative clamp; its resulting current HP also becomes its maximum.
Repeating the true mark does not multiply again, and a false call does not undo the earlier operation. This path changes neither nor the cached attack-table multiplier. For the fixed-EatDPS conehead above, the adopted health reference gives a neutral leader result of 8100/11100 HP. In the bundled-table comparison, the result is 2700/3700 HP while the calculated bite rate remains 900. A type using EatDPSRatio can instead gain bite damage indirectly through its larger maximum body HP.
The leader update changes its overlay as combined body/helmet health falls through approximately 67% and 33% of the combined maximum. Those transitions do not heal it. A qualifying leader at in the ordinary five-row layout enters a retreat path, starts a 2.3-game-second countdown, and requests removal when it expires.44Leader marking and retreatFirst marking scales current body HP and stores it as maximum HP; helmet handling also accounts for its reduction factor. Repeated true marking does not repeat this operation. This path does not change the entity level or directly multiply cached attack. Overlay thresholds use combined maximum body/helmet health. The ordinary retreat threshold is X < 232 with a 2.3-game-second countdown.0x1019afe480x10199a84c
Notes
The evidence behind each claim: the code path, and the native addresses where it was traced.
- 1
Float32 level requests
The native chain uses fused multiply-add with the float32 base/add coefficients, decimal truncation, a cap of 10, then floor/ceil clamped to 1–10. When those bounds differ, the upper choice is accepted when the integer residue is below the float32 fractional part multiplied by 100. The default inputs 2 and 3 both produce approximately 1.100000024 and accept residues 0–10.
0x101d4561c0x101b3a27c - 2
Shared table lookup and missing rows
The non-Zomboss DangerRoom lookup uses the shared ZombieLevelStats vector at effective entity level minus one. The bundled vector has five rows and a missing row returns multiplier 1; neccd.zls can replace the ordered pairs. The adopted ten-level Endless reference is reported gameplay data. Its attack column is a reported ratio, kept separate from the native AttackLevel input. Rift and NewPVP have separate table-selection branches; NewPVP's player-facing identity is unresolved. The level-module ZombieMaxLevel default is -1, and the ordinary definitions omit an override.
0x1019938a00x101993af80x101d6db000x100fd8a100x10067f50c - 3
The base chewing-rate chain
The rate getter first uses a positive EatDPSRatio multiplied by maximum body health, then positive extraEatDPS, then positive baseEatDPS, then the property EatDPS. The base bite path multiplies this selected rate by the attack-table multiplier, attack pace, frame time, and 1 + 0.2 × (effective level - 1), with further condition/type modifiers and a nonnegative clamp.
0x1019b55b00x10199f658 - 4
Leader marking and retreat
First marking scales current body HP and stores it as maximum HP; helmet handling also accounts for its reduction factor. Repeated true marking does not repeat this operation. This path does not change the entity level or directly multiply cached attack. Overlay thresholds use combined maximum body/helmet health. The ordinary retreat threshold is X < 232 with a 2.3-game-second countdown.
0x1019afe480x10199a84c