A1 Pooled particle system
- New ParticleManager owns 9 reusable Phaser emitters created once per scene
(jump, explosion, powerup, puff, sparks, flame, wind, spring, speedline)
- BootScene generates reusable white textures (px_square/soft/streak/ring)
- GameScene burst helpers + EffectsManager flow effects now delegate to the
pool instead of allocating rectangles + tweens every frame
- Quality auto-detect (low on mobile/small screens) cuts particle counts
A2 Fix high-speed landing tunneling
- Cap downward velocity at PHYSICS.maxFallSpeed (boosts unaffected)
- platformCollisionFilter now uses a swept deltaY one-way check so a fast
fall can never be wrongly rejected or passed through
A3 Safe storage
- New utils/storage.js wraps localStorage with in-memory fallback so private
mode / quota errors cannot crash the game; all access routed through it
A4-A6 Lifecycle and robustness
- Global error / unhandledrejection guard recovers to the menu
- GameScene auto-pauses on tab hidden and cleans up the cross-scene listener
on shutdown; fps pacing + disableContextMenu in game config
- Moving platforms use a proper dynamic body instead of destroy()+new Body
Verified in-browser: menu + game load with zero console errors, all emitters
active, normal bouncing works, fall speed capped.