Before the first zombie
The common wave count and budget model.
2 min read
A numbered wave is a batch of scheduled actions. Before those actions create any zombies, ordinary Endless constructs a wave plan: how many waves exist, which are flag boundaries, and how many points the ordinary roster may spend in each wave. A displayed level number determines this common framework.
01 / THE INPUTS
The common inputs
The 16 standard worlds all list Danger. They provide different zombie pools, but the ordinary description builder reads its point parameters from the shared Danger, rather than the generator object's local point declarations.11The shared inputsThe ordinary description builder reads point fields from the shared DangerRoomPropertySheet. The response setter writes server-supplied values into that same object. The local generator declarations are a separate set of fields; they are not the point inputs consumed by this builder.0x101ab68400x101d6db00
The world still matters: it supplies the basic zombie, the pool of selectable types, and any additional designers. Modern, Renai, Steam, and Tale even declare a local wave increment of 20, but this builder does not read that local field. Its shared increment remains the input to the formula.
Our example settings are 100 starting points, a fixed wave increment of 30, and a per-level increment of 5. The wave-count settings are MinWave, MaxWave, Wave, and Wave: one extra wave per ten displayed levels.
Let denote the displayed level and a zero-based wave index. The stored progress value is . In the example schedule, multiples of 5 select Boss files. The ordinary-level views below therefore cover with .22Which level number?The designer getter returns the stored progress value plus one. The filename helper chooses the Boss variant when the displayed number is divisible by the shared BossInterval, whose bundled value is 5. The inspected post-victory continuation branch loads a next level only below 150. The explorer therefore offers ordinary numbers from 1–149; this client branch does not establish a universal server admission rule.0x101d6ca840x101d4a4e80x101c360dc
02 / THE LENGTH
How many waves?
Levels 1–9 have 5 waves, level 36 has 8, and level 49 has 9. The formula reaches the cap of 15 at level 100; since that number selects a Boss file, level 101 is the first ordinary level at the cap. Point budgets continue growing afterward.33Wave count and flag spacingThe description builder uses MinWaveCount, MaxWaveCount, WaveAddEach, and WaveAddInterval. The inspected constructor defaults are 6, 15, 1, and 5. This guide uses the supplied gameplay wave settings 5, 15, 1, and 10. Within the resulting 5–15-wave range, the target group count is 1 below 7 waves, 2 below 12, and 3 otherwise. The resulting spacing equals the wave count divided by that target, rounded up.0x101ab68400x101d4a7e8
03 / THE BUDGET
The underlying progression
For , define the increment and base budget :
Within one level, the base budgets form an arithmetic progression. Increasing changes its slope; the first wave remains at 100 points.44The underlying budgetThe shared constructor supplies StartingPoints = 100, BasePointIncrementPerWave = 30, and BasePointIncrementPerLevel = 5. The description builder adds the combined per-wave increment once for each zero-based wave index.0x101ab68400x101d4a7e8
04 / THE ACCENTS
Flag boundaries and the final wave
Within the 5–15-wave range, the target group count determines the regular flag spacing :3
The filler budget is:
A regular flag boundary occurs whenever the one-based wave number is a multiple of . The last wave also receives the larger budget even when its group is shorter. These markers describe the wave plan; they do not yet count an extra flag zombie.
The logical OR matters: a wave that is both final and at a regular flag boundary receives one multiplier, not two. The next wave still follows the unboosted progression.55One boost at either boundaryThe materialization path multiplies the base budget by 2.5 when the wave is at a regular flag boundary or is final. It applies the multiplier once even when both conditions hold. The product uses float32 arithmetic and is truncated to an integer. The next wave continues from the unboosted base progression.0x101ce8a54
Step through
- 1Base progression. Every wave adds Δ = 30 + 5L = 210 points to the 100 of the first: P(L, w) = 100 + Δw.
- 2Flag boundaries. 8 waves make 2 groups, so s = 4: a wave whose number is a multiple of 4 is a regular flag boundary.
- 3Flag waves. A regular flag boundary spends ⌊2.5P⌋; the green is what the multiplier adds to its base.
- 4The final wave. The last wave receives the larger budget as well, and only once when it is also a flag boundary.
05 / THE NEXT STEP
What this plan covers
The ordinary filler spends using each selected type's Wave. This is neither a zombie count nor a total-health cap. Unspendable points may remain; extra leaders and separate flag actions are added elsewhere. World-specific processing can then replace or supplement the generated roster.66What the budget pays forThe weighted filler consumes points using each selected type’s WavePointCost. Extra leaders are appended after normal filling; the flag zombie is installed as a separate action. Eighties can replace instructions in postprocessing without repeating the ordinary budget check. The budget therefore describes one stage of construction, not a final zombie count or total-health cap.0x101ce7f080x101c79bec0x101ce4f5c
At a flag boundary or the final wave, installation can add a separate flag-zombie action. It has its own default spacing and does not pay its cost from . World processing and extra leaders likewise operate at different stages. The health total used by the wave clock is sampled only after these actions have created and placed their entities.
Active types
- Mummy100 · basic
- Ra100
- Explorer250
- Tomb Raiser350
- Camel300
- 1Mummy100 · level 41,350
- 2Explorer250 · level 55,250
- 3Tomb Raiser350 · level 42,700
- 4Mummy100 · level 54,050
- 5Explorer250 · level 55,250
- 6Tomb Raiser350 · level 42,700
- 7Explorer250 · level 55,250
- 8Ra100 · level 41,350
- +Camel300 · level 42,400
Reported HP of the ordinary action30,300
Step through
- 1The active types. The basic type and four pool entries chosen by index, not by weight.
- 2The budget. Wave 4 is a flag wave, with a filler budget of 1,825 points.
- 3Weighted filling. 8 instructions are drawn among the affordable types until none fits; 75 points cannot be spent.
- 4Outside the budget. The level’s one leader attempt succeeded and chose this wave: its leader is appended without paying from B. A flag or final wave also receives a separate flag-zombie action unless suppressed.
- 5The HP subtotal. Each instruction at its sampled level with the Endless health reference, converted as the wave query reports it; neutral creation modifiers and successful placement are assumed, and the separate flag action is not included.
The next question is how the game chooses that roster: which types are selected, and how do their costs and weights determine the next zombie?
Notes
The evidence behind each claim: the code path, and the native addresses where it was traced.
- 1
The shared inputs
The ordinary description builder reads point fields from the shared DangerRoomPropertySheet. The response setter writes server-supplied values into that same object. The local generator declarations are a separate set of fields; they are not the point inputs consumed by this builder.
0x101ab68400x101d6db00 - 2
Which level number?
The designer getter returns the stored progress value plus one. The filename helper chooses the Boss variant when the displayed number is divisible by the shared BossInterval, whose bundled value is 5. The inspected post-victory continuation branch loads a next level only below 150. The explorer therefore offers ordinary numbers from 1–149; this client branch does not establish a universal server admission rule.
0x101d6ca840x101d4a4e80x101c360dc - 3
Wave count and flag spacing
The description builder uses MinWaveCount, MaxWaveCount, WaveAddEach, and WaveAddInterval. The inspected constructor defaults are 6, 15, 1, and 5. This guide uses the supplied gameplay wave settings 5, 15, 1, and 10. Within the resulting 5–15-wave range, the target group count is 1 below 7 waves, 2 below 12, and 3 otherwise. The resulting spacing equals the wave count divided by that target, rounded up.
0x101ab68400x101d4a7e8 - 4
The underlying budget
The shared constructor supplies StartingPoints = 100, BasePointIncrementPerWave = 30, and BasePointIncrementPerLevel = 5. The description builder adds the combined per-wave increment once for each zero-based wave index.
0x101ab68400x101d4a7e8 - 5
One boost at either boundary
The materialization path multiplies the base budget by 2.5 when the wave is at a regular flag boundary or is final. It applies the multiplier once even when both conditions hold. The product uses float32 arithmetic and is truncated to an integer. The next wave continues from the unboosted base progression.
0x101ce8a54 - 6
What the budget pays for
The weighted filler consumes points using each selected type’s WavePointCost. Extra leaders are appended after normal filling; the flag zombie is installed as a separate action. Eighties can replace instructions in postprocessing without repeating the ordinary budget check. The budget therefore describes one stage of construction, not a final zombie count or total-health cap.
0x101ce7f080x101c79bec0x101ce4f5c