Phase B: new content — daily challenge, enemies, platform, settings, stats

B1 Seeded RNG + Daily Challenge
- utils/random.js wraps Phaser seedable RND (Between/frac are NOT seedable)
- All gameplay spawning (PlatformManager, Platform, Enemy) uses seeded rng
- GameScene reads mode/seed in init and seeds the run; daily shows a HUD badge
  and keeps a per-day best (daily_<YYYYMMDD>); MenuScene DAILY button;
  GameOver RETRY preserves mode and shows today's best
- Verified: same seed -> identical layout, different seed -> different

B2 New content
- Enemy mev_bot: homing chaser that eases toward the player (unlock >1500)
- Platform reorg: phantom, semi-transparent, vanishes shortly after landing
  (unlock >600); no power-ups on breaking/reorg; SPAWN_RATES + UNLOCK config
- Verified spawn distribution at high difficulty includes all new types

B3 Settings
- SoundManager gains volume (persisted); MenuScene SETTINGS overlay with
  volume stepper, particle-quality Low/High toggle, two-step reset progress

B4 Stats
- StatsManager tracks lifetime games/jumps/stomps/blocks/best combo, flushed
  at game over; MenuScene STATS overlay; hooks in GameScene/ScoreManager

B5 Difficulty tuning via UNLOCK thresholds and rebalanced spawn rates

Functionally verified in-browser via eval (no console errors, deterministic
daily, content spawns, particles emit). Visual screenshot unavailable in the
headless preview because the hidden tab pauses Phaser's loop.
This commit is contained in:
2026-05-29 13:29:34 +07:00
parent fc1f12bb7e
commit 6f5b4d83f7
10 changed files with 397 additions and 45 deletions

View File

@@ -13,9 +13,10 @@ export const PLATFORM_GAP_MIN = 60;
export const PLATFORM_GAP_MAX = 120;
export const SPAWN_RATES = {
stable: 0.60,
moving: 0.20,
breaking: 0.15,
stable: 0.55,
moving: 0.18,
breaking: 0.12,
reorg: 0.10,
genesis: 0.05,
};
@@ -37,6 +38,13 @@ export const DIFFICULTY = {
maxEnemyRate: 0.30,
};
// Height (px climbed) at which harder content starts appearing.
export const UNLOCK = {
reorg: 600,
failedTx: 800,
mevBot: 1500,
};
export const SCORE = {
basePoints: 10,
genesisBonus: 50,