Skip to the text

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 ZombieLevelBase = 0.9 and ZombieLevelAdd = 0.1. Let F32F_{32} mean rounding to float32, and fma⁡32(x,y,z)\operatorname{fma}_{32}(x,y,z) mean a fused xy+zxy+z followed by that rounding. Decimal truncation and the level curve are

D(x)=F32 ⁣(trunc⁡(F32(10x))10),q(L)=min⁡(10,D ⁣(fma⁡32(L,F32(0.1),F32(0.9)))).\begin{aligned} D(x)&=F_{32}\!\left(\frac{\operatorname{trunc}(F_{32}(10x))}{10}\right),\\ q(L)&=\min\left(10,D\!\left(\operatorname{fma}_{32}(L,F_{32}(0.1),F_{32}(0.9))\right)\right). \end{aligned}

Define the integer bounds a=clamp⁡(⌊q⌋,1,10)a=\operatorname{clamp}(\lfloor q\rfloor,1,10) and b=clamp⁡(⌈q⌉,1,10)b=\operatorname{clamp}(\lceil q\rceil,1,10). If a=ba=b, every instruction requests that level. Otherwise, let d=u mod 100d=u\bmod100 for the next integer draw and calculate

τ=F32 ⁣(100F32(q−a)),ℓrequest={b,d<τ,a,d≥τ.\tau=F_{32}\!\left(100F_{32}(q-a)\right),\qquad \ell_{\mathrm{request}}=\begin{cases} b,&d<\tau,\\ a,&d\ge\tau. \end{cases}

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 [10,10][10,10] 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
Plate 4.1Every displayed level as a cell, ten to a row, so that a row runs through the tenths from one whole level to the next, until the request stays at 10 from level 91; a cell fills by the share of residues that request its upper bound, and multiples of 5, which select Boss files, stay blank. At level 3, q = 1.100000024 lies between 1 and 2 and τ = 10.000002, so residues 0–10 request 2.

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 ℓ\ell. ZombieMaxLevel defaults to −1-1, 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 ZombieLevelStats vector, using index ℓ−1\ell-1. 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.

LevelHealthAttack, reported
111
221.2
331.4
451.6
5152
6503
72505
81,00010
95,00030
10100,000100
Plate 4.2The ten-level Endless reference, both columns relative to level 1. Health is drawn on a logarithmic scale, one decade to a gridline: it grows 100,000 times over ten levels. The attack column is the reported value, not the native AttackLevel input.

Both columns are relative to level 1. The attack column is a reported relative value; aℓa_\ell in the bite formula below is the separate native AttackLevel input. Substituting a final damage ratio for that input would count the additional level factor twice.

The five-row DangerRoom table and its replacement

DefaultDangerRoomProps contains five rows: both HitPointsLevel and AttackLevel 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.zls 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 NewPVP table 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. LocalDiyZombieStatsDefault shares Rift’s first eight values and adds 11 and 12.
RowDanger­RoomRiftMainNewPVPLegacy PvPLocal DIY
1111111
222221.52
3333323
44.54.54.542.54.5
5555555
6missing: 1868
7979
810810
9111011
10122012
1113
1214
1315
1416
1517
1618
1719
1820
1921
Danger­Room
Endless: bundled shared table DefaultDangerRoomProps
Rift
Penny’s Pursuit: Rift configuration RiftBaseConfigKey
Main
Main-level comparison: Mummy properties ZombieMummyDefault
NewPVP
NewPVP: mode identity unresolved DefaultNewPVPProps
Legacy PvP
Legacy PvP comparison: Imp properties ZombiePVPImpDefault
Local DIY
Local DIY configuration LocalDiyZombieStatsDefault
Plate 4.3The packaged strength tables side by side, a row of each per line; a cell is the row’s 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

Hbody=Hbasehℓ,Hhelmet=Hhelm,basehℓH_{\mathrm{body}}=H_{\mathrm{base}}h_\ell,\qquad H_{\mathrm{helmet}}=H_{\mathrm{helm,base}}h_\ell

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 EE in this priority order:

  1. Positive EatDPSRatio times maximum body HP.
  2. Otherwise, positive instance m_extraEatDPS.
  3. Otherwise, positive instance m_baseEatDPS.
  4. Otherwise, the property EatDPS.

For the base bite implementation, let aℓa_\ell denote the native AttackLevel field. With other target/type modifiers neutral,

ΔHplant=max⁡ ⁣(0,  E aℓ vattack Δt [1+0.2(ℓ−1)]).\Delta H_{\mathrm{plant}}=\max\!\left(0,\;E\,a_\ell\,v_{\mathrm{attack}}\,\Delta t\,[1+0.2(\ell-1)]\right).

Here vattackv_{\mathrm{attack}} is the condition-dependent attack-pace factor and Δt\Delta t 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_armor1, 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.

entitydeclaredmultiplierentity
Body HP270× 154,050
Helmet HP370× 155,550
Bite per game second100reported attack ×2: the bite needs the native AttackLevel
Plate 4.4A neutral 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 LeaderStrengthenRate 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 ℓ\ell 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 X<232X<232 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. 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. 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. 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. 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