Adds the server-authoritative mechanics for three new enemy archetypes on top of
the Grunt/Charger base, plus the weighted wave-composition that introduces them:
- Spitter: a ranged Husk variant (SpitterState) that holds a preferred range-band
(advance/retreat/hold via EnemyAIMath.BandVelocity) and fires a telegraphed,
dodgeable EnemyProjectile. New server EnemyProjectileMoveSystem (integrate +
store LastStep) + EnemyProjectileDamageSystem (region-filtered swept hit-test
rebuilt from LastStep — DR-018 anti-tunnelling; players use HitRadius, structures
a const radius; at-most-once destroy). Concurrent-spit soft cap, soft-fail retry.
- Swarmer: marker tag + deterministic cluster spawn (1 slot = 1 pack;
EnemyAIMath.ClusterOffset), MaxAlive counts ENTITIES so a pack defers if it
won't fit.
- 4-type weighted mix: MixBands -> ZoneEnemyMath.WaveSlots/KindForSlot/
PackSizeForSlot drives both the expedition director and (fork-4a) the base siege,
with a mandatory MaxAlive cap. Legacy WaveSize/IsChargerSlot kept + parity-tested.
- Discriminator stays component-presence (no enum in Bursted systems): query-
partition guards keep each enemy moved by exactly one EnemyAISystem pass
(sole-Position-writer). EnemyTelegraph.IsCharger -> Kind byte for the client cue.
New authoring (Spitter/Swarmer/EnemyProjectile) + expanded director authorings with
tunable mix/cluster defaults. 13 new EditMode tests (mix composition + legacy parity,
band/cluster math, projectile move + cross-region + swept anti-tunnelling regressions);
full suite green before commit.
Dormant until the prefab/subscene wiring lands (next): the new systems guard on
TryGetSingleton/RequireForUpdate, so with no prefabs wired the new types stay inert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add BefourStudios SciFi environment packs, Gabriel Aguiar VFX, and the
ShaderCrew Toon Shader embedded packages, plus combat/enemy/wave/death
gameplay systems and supporting vault docs/screenshots.
Rename 11 vendor textures from uppercase .PNG/.HDR to lowercase so the
case-sensitive Git LFS filters (*.png/*.hdr) match on case-sensitive
filesystems (Linux CI, case-sensitive macOS), not just locally where
core.ignorecase=true masks the gap. Each .meta moved with its asset so
GUID references are preserved. All ~1000 binaries tracked via LFS.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>