using Unity.Mathematics; namespace ProjectM.Simulation { /// /// Pure, deterministic wave-size math — no RNG state, no wall-clock — so a wave is reproducible across /// restarts/saves and EditMode-unit-testable without an ECS world (mirrors ). /// /// HISTORY (2026-08-07 audit purge): this class used to carry a 4-kind weighted composition /// (Grunt/Charger/Spitter/Swarmer) driven by a MixBands struct. The Charger/Spitter/Swarmer authoring /// components were on ZERO prefabs, so LungeState/SpitterState/SwarmerTag were never baked and every /// branch of that math resolved to Grunt at runtime — the escalation curve was inert while 734 lines of /// green tests certified it. The composition layer was deleted; the LANTERN bestiary (Drowner, Grindylow, /// Wrecker, Wisp-Choir) will reintroduce variety through the CreatureKit path, not through this file. /// Recover the old version from git if the weighted-slot model is wanted again. /// public static class ZoneEnemyMath { /// The single enemy kind. Directors index a per-Kind prefab buffer by this byte; kept as a /// byte (not an enum) because EnemyAISystem is Bursted and cross-assembly enums trip Burst. public const byte KindGrunt = 0; /// /// Total enemies in this wave: plus one extra per epoch beyond the first /// (a gentle ramp). Lower-bounded at 1 so an occupied arena always has a fight. /// is the monotonic wave counter (>=1 in practice). Pure integer math; Burst-safe. /// public static int WaveSize(int epoch, int baseCount) { int e = math.max(1, epoch); return math.max(1, math.max(0, baseCount) + (e - 1)); } } }