Altair — Patch Notes v1.3.2

Focus: Persistence fixes, balance adjustments, and quality-of-life improvements.


Meta Progression & Persistence

  • Server-authoritative meta state. loadFromServer() now fully replaces local state with DB data instead of merging. The server is the single source of truth for coins, upgrades, unlocked classes, and all meta progression.

  • Meta state loads on shell mount. DB sync now happens in AltairShell (shared layout), so meta progression is available as soon as any /altair route loads — no waiting until the game page mounts.

  • Immediate save on purchases. Meta shop purchases (upgrades and class unlocks) now save to the DB immediately instead of using the 1-second debounce. If the save fails, the purchase is rolled back to prevent desync.

  • Other mutations (bestiary, run stats, etc.) still use the debounced save for performance.

Bestiary

  • Encounters now tracked on spawn, not on hit. Previously, recordBestiaryEncounter was called when an enemy damaged the player, leading to killed > encountered for most enemy types. Encounters are now recorded when enemies are actually spawned by the wave director, split spawns, and boss minion spawns.

  • Batch encounter recording. Spawn tracking uses a batched update (recordBestiaryEncounterBatch) to avoid per-enemy Zustand state thrashing during high-spawn-rate frames.

Balance

  • Catalysts no longer consumed on evolution. When a weapon evolves, the matching catalyst remains in the player’s inventory. It still occupies its item slot and provides its effect. This increases build commitment difficulty — evolution is a power spike but doesn’t free up a slot.

Collision & Props

  • Tighter prop hitboxes. Increased collision dimensions for all prop types to better match their sprite visuals. Players can no longer walk into prop sprites.

    • Tombstone: 10×20 → 16×24

    • Barrel: 18×18 → 24×24

    • Urn: 10×14 → 14×16

    • Fences: thickness 8 → 12

    • Walls: depth 20 → 28

    • Crate: 20×20 → 26×26

    • Well: 24×24 → 28×28

Entity Caps & Visibility

  • No more on-screen enemy despawns. The enemy despawn system now only removes off-screen Tier 1 enemies, and only when significantly over the soft cap (+50 over MAX_ACTIVE_ENEMIES). Enemies visible to the player are never culled.

  • No more on-screen projectile removal. The projectile hard-cap splice has been removed. Instead, new enemy and boss projectiles are simply not created when the projectile count exceeds MAX_PROJECTILES. Existing in-flight projectiles are never removed mid-flight. Player projectiles are never gated.


Files Changed

File

Changes

lib/altair/stores/meta-store.ts

Server-wins load, immediate save for purchases, batch bestiary encounters

components/altair/AltairShell.tsx

Load meta state on shell mount

app/altair/page.tsx

Removed redundant loadFromServer call

app/api/altair/meta/route.ts

No changes (API already correct)

lib/altair/stores/game-store.ts

evolveWeapon no longer removes catalyst

lib/altair/engine/wave-director.ts

Spawn tracking via WaveDirectorEvents.spawned, safe despawn

lib/altair/engine/game-loop.ts

onEnemySpawns callback, projectile cap gating, split/minion tracking

components/altair/screens/GameScreen.tsx

Wired onEnemySpawns, removed encounter-on-damage

lib/altair/engine/tile-generator.ts

Increased PROP_HITBOX dimensions

docs/altair/v1.3_balance.md

Updated catalyst evolution docs (no longer consumed)