{
  "version": 3,
  "sources": ["../../node_modules/canvas-game-engine/src/entity.mjs", "../game/invaders.mjs", "../game/player.mjs", "../../node_modules/canvas-game-engine/src/input.mjs", "../../node_modules/canvas-game-engine/src/loop.mjs", "../../node_modules/canvas-game-engine/src/renderer.mjs", "../../node_modules/canvas-game-engine/src/scene.mjs", "../../node_modules/canvas-game-engine/src/seed.mjs", "../../node_modules/canvas-game-engine/src/sprite.mjs", "../game/mode.mjs", "../game/api.mjs", "../game/constants.mjs", "../game/flags.mjs", "../game/main.mjs", "../../node_modules/canvas-game-engine/src/collision.mjs", "../game/hud.mjs", "../game/hud-daily.mjs", "../game/hud-mode.mjs", "../game/modifiers/boss-rush.mjs", "../game/modifiers/fog-of-war.mjs", "../game/modifiers/inverted-controls.mjs", "../game/modifiers/one-shot.mjs", "../game/modifiers/speed-run.mjs", "../game/pending-scores.mjs", "../game/whaleshark.mjs", "../game/scenes/play.mjs", "../game/scenes/daily.mjs", "../game/scenes/gameover.mjs", "../game/scenes/leaderboard.mjs", "../game/scenes/menu.mjs", "../game/scenes/menu-daily-option.mjs", "../game/scenes/menu-mode-option.mjs", "../game/score.mjs", "../game/test-hooks.mjs"],
  "sourcesContent": ["/**\n * Axis-aligned game entity with position, velocity, size, and alive state.\n *\n * Public fields: `x`, `y` (position), `vx`, `vy` (velocity per second), `w`, `h`\n * (dimensions), and `alive` (boolean, defaults to `true`).\n *\n * @param {object} [opts] - Initial state.\n * @param {number} [opts.x=0] - Initial x position.\n * @param {number} [opts.y=0] - Initial y position.\n * @param {number} [opts.vx=0] - Initial x velocity, in units per second.\n * @param {number} [opts.vy=0] - Initial y velocity, in units per second.\n * @param {number} [opts.w=0] - Width.\n * @param {number} [opts.h=0] - Height.\n */\nexport class Entity {\n  constructor({ x = 0, y = 0, vx = 0, vy = 0, w = 0, h = 0 } = {}) {\n    this.x = x;\n    this.y = y;\n    this.vx = vx;\n    this.vy = vy;\n    this.w = w;\n    this.h = h;\n    this.alive = true;\n  }\n\n  /**\n   * Current axis-aligned bounding box.\n   *\n   * @returns {{x: number, y: number, w: number, h: number}} AABB snapshot.\n   */\n  aabb() {\n    return {\n      x: this.x,\n      y: this.y,\n      w: this.w,\n      h: this.h,\n    };\n  }\n\n  /**\n   * Integrate position by velocity for one timestep.\n   *\n   * @param {number} dt - Elapsed time in seconds.\n   * @returns {void}\n   */\n  update(dt) {\n    this.x += this.vx * dt;\n    this.y += this.vy * dt;\n  }\n\n  /**\n   * Render hook; no-op on the base entity, intended to be overridden.\n   *\n   * @returns {void}\n   */\n  render() {}\n\n  /**\n   * Mark the entity as dead by setting `alive` to `false`.\n   *\n   * @returns {void}\n   */\n  kill() {\n    this.alive = false;\n  }\n}\n", "import { Entity } from 'canvas-game-engine/entity.mjs';\n\nconst DEFAULT_ROWS = 5;\nconst DEFAULT_COLS = 11;\nconst DEFAULT_CANVAS_WIDTH = 800;\nconst DEFAULT_CANVAS_HEIGHT = 600;\nconst DEFAULT_SPAWN_X = 80;\nconst DEFAULT_SPAWN_Y = 64;\nconst DEFAULT_COL_SPACING = 48;\nconst DEFAULT_ROW_SPACING = 36;\nconst DEFAULT_BASE_SPEED = 60;\nconst DEFAULT_DESCEND_STEP = 16;\nconst DEFAULT_ACCEL_FACTOR = 1.2;\nconst DEFAULT_FIRE_INTERVAL_MS = 1500;\nconst DEFAULT_FIRE_MIN_INTERVAL_MS = 200;\nconst DEFAULT_FIRE_PER_WAVE_MS = 100;\nconst DEFAULT_DEPTH_BUMP_PER_WAVE = 8;\nconst DEFAULT_DEPTH_CAP = 120;\nconst DEFAULT_DESCENT_STEP_PER_WAVE = 1;\nconst DEFAULT_DESCENT_STEP_CAP = 5;\nconst DEFAULT_SHOT_SPEED = 220;\n\nconst POINTS_BY_TYPE = Object.freeze({\n  squid: 40,\n  anglerfish: 20,\n  jellyfish: 10,\n});\n\nconst FRAMES = Object.freeze({\n  enemy_shot: Object.freeze({ x: 48, y: 0, w: 4, h: 10 }),\n  jellyfish: Object.freeze({ x: 0, y: 16, w: 24, h: 24 }),\n  anglerfish: Object.freeze({ x: 48, y: 16, w: 24, h: 24 }),\n  squid: Object.freeze({ x: 0, y: 40, w: 32, h: 24 }),\n});\n\nconst finiteOrZero = (value) => (Number.isFinite(value) && value > 0 ? value : 0);\n\nfunction imageFromSprites(sprites) {\n  return sprites?.image ?? sprites?.sheet?.image ?? sprites?.spriteSheet?.image ?? sprites;\n}\n\nfunction frameFromSprites(sprites, key, fallback) {\n  return sprites?.frames?.[key] ?? sprites?.[key] ?? fallback;\n}\n\nfunction drawSpriteFrame(renderer, sprites, key, fallback, x, y, w, h) {\n  if (typeof renderer?.drawSprite !== 'function') {\n    return false;\n  }\n\n  const image = imageFromSprites(sprites);\n  const frame = frameFromSprites(sprites, key, fallback);\n\n  if (!image || !frame) {\n    return false;\n  }\n\n  renderer.drawSprite(image, frame.x, frame.y, frame.w, frame.h, x, y, w, h);\n  return true;\n}\n\nfunction typeForRow(row) {\n  if (row === 0) {\n    return 'squid';\n  }\n\n  if (row <= 2) {\n    return 'anglerfish';\n  }\n\n  return 'jellyfish';\n}\n\nfunction dimensionsForType(type, opts) {\n  const byType = opts.dimensionsByType?.[type] ?? opts.sizeByType?.[type];\n\n  return {\n    w: opts.enemyW ?? opts.w ?? byType?.w ?? FRAMES[type].w,\n    h: opts.enemyH ?? opts.h ?? byType?.h ?? FRAMES[type].h,\n  };\n}\n\nfunction createEnemy({ type, x, y, points, sprite, w, h, row, col }) {\n  const enemy = new Entity({ x, y, w, h });\n  enemy.type = type;\n  enemy.points = points;\n  enemy.sprite = sprite;\n  enemy.row = row;\n  enemy.col = col;\n  return enemy;\n}\n\nclass EnemyShot extends Entity {\n  constructor(opts = {}) {\n    const speed = opts.speed ?? DEFAULT_SHOT_SPEED;\n    const w = opts.w ?? FRAMES.enemy_shot.w;\n    const h = opts.h ?? FRAMES.enemy_shot.h;\n\n    super({\n      x: opts.x ?? 0,\n      y: opts.y ?? 0,\n      vx: opts.vx ?? 0,\n      vy: opts.vy ?? speed,\n      w,\n      h,\n    });\n\n    this.speed = speed;\n    this.sprite = opts.sprite ?? 'enemy_shot';\n    this.canvasHeight = opts.canvasHeight ?? DEFAULT_CANVAS_HEIGHT;\n  }\n\n  update(dt) {\n    super.update(finiteOrZero(dt));\n\n    if (this.y > this.canvasHeight) {\n      this.kill();\n    }\n  }\n\n  render(renderer, sprites) {\n    return drawSpriteFrame(renderer, sprites, this.sprite, FRAMES.enemy_shot, this.x, this.y, this.w, this.h);\n  }\n}\n\nfunction createEnemyShot(opts = {}) {\n  return new EnemyShot(opts);\n}\n\nfunction randomIndex(rng, length) {\n  if (length <= 1) {\n    return 0;\n  }\n\n  if (typeof rng?.int === 'function') {\n    const rawIndex = Math.trunc(rng.int(0, length - 1));\n    return ((rawIndex % length) + length) % length;\n  }\n\n  const next = typeof rng?.next === 'function' ? rng.next() : Math.random();\n  const normalized = Math.min(0.999999999, Math.max(0, Number.isFinite(next) ? next : 0));\n  return Math.floor(normalized * length);\n}\n\nexport function createFormation(opts = {}) {\n  const rows = opts.rows ?? DEFAULT_ROWS;\n  const cols = opts.cols ?? DEFAULT_COLS;\n  const canvasWidth = opts.canvasWidth ?? DEFAULT_CANVAS_WIDTH;\n  const canvasHeight = opts.canvasHeight ?? DEFAULT_CANVAS_HEIGHT;\n  const spawnX = opts.x ?? opts.spawnX ?? DEFAULT_SPAWN_X;\n  const firstWaveSpawnY = opts.y ?? opts.spawnY ?? DEFAULT_SPAWN_Y;\n  const colSpacing = opts.colSpacing ?? DEFAULT_COL_SPACING;\n  const rowSpacing = opts.rowSpacing ?? DEFAULT_ROW_SPACING;\n  const baseSpeed = opts.baseSpeed ?? DEFAULT_BASE_SPEED;\n  const accelFactor = opts.accelFactor ?? DEFAULT_ACCEL_FACTOR;\n  const baseDescendStep = opts.descendStep ?? DEFAULT_DESCEND_STEP;\n  const pointsByType = { ...POINTS_BY_TYPE, ...(opts.pointsByType ?? {}) };\n  const depthBumpPerWave = opts.depthBumpPerWave ?? DEFAULT_DEPTH_BUMP_PER_WAVE;\n  const depthCap = opts.depthCap ?? DEFAULT_DEPTH_CAP;\n  const firePerWaveMs = opts.firePerWaveMs ?? DEFAULT_FIRE_PER_WAVE_MS;\n  const fireMinIntervalMs = opts.fireMinIntervalMs ?? DEFAULT_FIRE_MIN_INTERVAL_MS;\n  const baseFireIntervalMs = opts.fireIntervalMs ?? DEFAULT_FIRE_INTERVAL_MS;\n  const descentStepPerWave = opts.descentStepPerWave ?? DEFAULT_DESCENT_STEP_PER_WAVE;\n  const descentStepCap = opts.descentStepCap ?? DEFAULT_DESCENT_STEP_CAP;\n  const totalEnemies = rows * cols;\n  const initialDirection = opts.direction === -1 ? -1 : 1;\n\n  let direction = initialDirection;\n  let currentSpawnY = firstWaveSpawnY;\n  let currentFireIntervalMs = baseFireIntervalMs;\n  let currentDescendStep = baseDescendStep;\n  let fireAccumulatorMs = 0;\n  let enemies = [];\n\n  function buildEnemies(yBase) {\n    const built = [];\n\n    for (let row = 0; row < rows; row += 1) {\n      const type = typeForRow(row);\n      const { w, h } = dimensionsForType(type, opts);\n\n      for (let col = 0; col < cols; col += 1) {\n        built.push(createEnemy({\n          type,\n          x: spawnX + (col * colSpacing),\n          y: yBase + (row * rowSpacing),\n          points: pointsByType[type],\n          sprite: type,\n          w,\n          h,\n          row,\n          col,\n        }));\n      }\n    }\n\n    return built;\n  }\n\n  function aliveEnemies() {\n    return enemies.filter((enemy) => enemy.alive !== false);\n  }\n\n  function aliveCount() {\n    return aliveEnemies().length;\n  }\n\n  function currentSpeed() {\n    if (totalEnemies <= 0) {\n      return 0;\n    }\n\n    const aliveRatio = aliveCount() / totalEnemies;\n    return baseSpeed * (1 + ((1 - aliveRatio) * accelFactor));\n  }\n\n  function boundsOfAlive() {\n    const alive = aliveEnemies();\n\n    if (alive.length === 0) {\n      return { left: 0, right: 0, top: 0, bottom: 0 };\n    }\n\n    let left = Infinity;\n    let right = -Infinity;\n    let top = Infinity;\n    let bottom = -Infinity;\n\n    for (const enemy of alive) {\n      left = Math.min(left, enemy.x);\n      right = Math.max(right, enemy.x + enemy.w);\n      top = Math.min(top, enemy.y);\n      bottom = Math.max(bottom, enemy.y + enemy.h);\n    }\n\n    return { left, right, top, bottom };\n  }\n\n  function moveAlive(dx, dy) {\n    for (const enemy of enemies) {\n      if (enemy.alive !== false) {\n        enemy.x += dx;\n        enemy.y += dy;\n      }\n    }\n  }\n\n  function aliveColumns() {\n    const columns = [];\n\n    for (let col = 0; col < cols; col += 1) {\n      if (enemies.some((enemy) => enemy.col === col && enemy.alive !== false)) {\n        columns.push(col);\n      }\n    }\n\n    return columns;\n  }\n\n  function lowestAliveInColumn(col) {\n    let lowest = null;\n\n    for (const enemy of enemies) {\n      if (enemy.col !== col || enemy.alive === false) {\n        continue;\n      }\n\n      if (lowest === null || enemy.y + enemy.h > lowest.y + lowest.h) {\n        lowest = enemy;\n      }\n    }\n\n    return lowest;\n  }\n\n  function consumeFireCadence(accumulatorState) {\n    if (accumulatorState && typeof accumulatorState === 'object') {\n      if (Number.isFinite(accumulatorState.nowMs)) {\n        const dueAt = Number.isFinite(accumulatorState.lastFireAtMs)\n          ? accumulatorState.lastFireAtMs + currentFireIntervalMs\n          : currentFireIntervalMs;\n\n        if (accumulatorState.nowMs < dueAt) {\n          return false;\n        }\n\n        accumulatorState.lastFireAtMs = accumulatorState.nowMs;\n        return true;\n      }\n\n      if (Number.isFinite(accumulatorState.dtMs)) {\n        accumulatorState.elapsedMs = (Number.isFinite(accumulatorState.elapsedMs) ? accumulatorState.elapsedMs : 0)\n          + accumulatorState.dtMs;\n      } else if (Number.isFinite(accumulatorState.dt)) {\n        accumulatorState.elapsedMs = (Number.isFinite(accumulatorState.elapsedMs) ? accumulatorState.elapsedMs : 0)\n          + (accumulatorState.dt * 1000);\n      }\n\n      if (!Number.isFinite(accumulatorState.elapsedMs) || accumulatorState.elapsedMs < currentFireIntervalMs) {\n        return false;\n      }\n\n      accumulatorState.elapsedMs -= currentFireIntervalMs;\n      return true;\n    }\n\n    if (fireAccumulatorMs < currentFireIntervalMs) {\n      return false;\n    }\n\n    fireAccumulatorMs -= currentFireIntervalMs;\n    return true;\n  }\n\n  function update(dt) {\n    const seconds = finiteOrZero(dt);\n    fireAccumulatorMs += seconds * 1000;\n\n    if (aliveCount() === 0 || seconds === 0) {\n      return;\n    }\n\n    const bounds = boundsOfAlive();\n    const dx = direction * currentSpeed() * seconds;\n    const crossesRight = direction > 0 && bounds.right + dx > canvasWidth;\n    const crossesLeft = direction < 0 && bounds.left + dx < 0;\n\n    if (crossesRight || crossesLeft) {\n      moveAlive(0, currentDescendStep);\n      direction *= -1;\n      return;\n    }\n\n    moveAlive(dx, 0);\n  }\n\n  function tryFire(rng, accumulatorState) {\n    const columns = aliveColumns();\n\n    if (columns.length === 0 || !consumeFireCadence(accumulatorState)) {\n      return null;\n    }\n\n    const col = columns[randomIndex(rng, columns.length)];\n    const enemy = lowestAliveInColumn(col);\n\n    if (enemy === null) {\n      return null;\n    }\n\n    const shotW = opts.shotW ?? FRAMES.enemy_shot.w;\n    const shotH = opts.shotH ?? FRAMES.enemy_shot.h;\n\n    return createEnemyShot({\n      x: enemy.x + (enemy.w / 2) - (shotW / 2),\n      y: enemy.y + enemy.h,\n      speed: opts.shotSpeed ?? DEFAULT_SHOT_SPEED,\n      w: shotW,\n      h: shotH,\n      sprite: opts.shotSprite ?? 'enemy_shot',\n      canvasHeight,\n    });\n  }\n\n  function resetForWave(wave = 1) {\n    const waveIndex = Math.max(0, Math.trunc((Number.isFinite(wave) ? wave : 1) - 1));\n    const depth = Math.min(depthCap, waveIndex * depthBumpPerWave);\n    const descentGrowth = Math.min(descentStepCap, waveIndex * descentStepPerWave);\n\n    currentSpawnY = firstWaveSpawnY + depth;\n    currentFireIntervalMs = Math.max(fireMinIntervalMs, baseFireIntervalMs - (waveIndex * firePerWaveMs));\n    currentDescendStep = baseDescendStep + descentGrowth;\n    fireAccumulatorMs = 0;\n    direction = initialDirection;\n    enemies = buildEnemies(currentSpawnY);\n    return api;\n  }\n\n  function forEachAlive(cb) {\n    for (const enemy of enemies) {\n      if (enemy.alive !== false) {\n        cb(enemy);\n      }\n    }\n  }\n\n  function render(renderer, sprites) {\n    let drawn = 0;\n\n    forEachAlive((enemy) => {\n      if (drawSpriteFrame(renderer, sprites, enemy.sprite, FRAMES[enemy.sprite], enemy.x, enemy.y, enemy.w, enemy.h)) {\n        drawn += 1;\n      }\n    });\n\n    return drawn;\n  }\n\n  const api = {\n    get enemies() {\n      return enemies;\n    },\n    update,\n    tryFire,\n    resetForWave,\n    forEachAlive,\n    render,\n    aliveCount,\n    currentSpeed,\n    speed: currentSpeed,\n    isCleared: () => aliveCount() === 0,\n    lowestY: () => boundsOfAlive().bottom,\n    bounds: boundsOfAlive,\n    direction: () => direction,\n    fireIntervalMs: () => currentFireIntervalMs,\n    descendStep: () => currentDescendStep,\n    spawnY: () => currentSpawnY,\n  };\n\n  enemies = buildEnemies(currentSpawnY);\n  return api;\n}\n", "import { Entity } from 'canvas-game-engine/entity.mjs';\n\nconst DEFAULT_CANVAS_WIDTH = 800;\nconst DEFAULT_PLAYER_Y = 560;\nconst DEFAULT_PLAYER_SPEED = 240;\nconst DEFAULT_FIRE_COOLDOWN_MS = 350;\nconst DEFAULT_INVULN_MS = 1500;\nconst DEFAULT_BLINK_MS = 120;\nconst DEFAULT_TORPEDO_SPEED = 540;\n\nconst SUBMARINE_FRAME = Object.freeze({ x: 0, y: 0, w: 32, h: 16 });\nconst TORPEDO_FRAME = Object.freeze({ x: 40, y: 0, w: 4, h: 10 });\n\nconst LEFT_CODES = Object.freeze(['ArrowLeft', 'KeyA']);\nconst RIGHT_CODES = Object.freeze(['ArrowRight', 'KeyD']);\nconst FIRE_CODES = Object.freeze(['Space', 'KeyW', 'ArrowUp']);\n\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\nconst finiteOrZero = (value) => (Number.isFinite(value) && value > 0 ? value : 0);\n\nfunction inputActive(input, method, codes) {\n  return codes.some((code) => input?.[method]?.(code) === true);\n}\n\nfunction imageFromSprites(sprites) {\n  return sprites?.image ?? sprites?.sheet?.image ?? sprites?.spriteSheet?.image ?? sprites;\n}\n\nfunction frameFromSprites(sprites, key, fallback) {\n  return sprites?.frames?.[key] ?? sprites?.[key] ?? fallback;\n}\n\nfunction drawSpriteFrame(renderer, sprites, key, fallback, x, y, w, h) {\n  if (typeof renderer?.drawSprite !== 'function') {\n    return false;\n  }\n\n  const image = imageFromSprites(sprites);\n  const frame = frameFromSprites(sprites, key, fallback);\n\n  if (!image || !frame) {\n    return false;\n  }\n\n  renderer.drawSprite(image, frame.x, frame.y, frame.w, frame.h, x, y, w, h);\n  return true;\n}\n\nclass Torpedo extends Entity {\n  constructor(opts = {}) {\n    const speed = opts.speed ?? DEFAULT_TORPEDO_SPEED;\n    const w = opts.w ?? TORPEDO_FRAME.w;\n    const h = opts.h ?? TORPEDO_FRAME.h;\n\n    super({\n      x: opts.x ?? 0,\n      y: opts.y ?? 0,\n      vx: opts.vx ?? 0,\n      vy: opts.vy ?? -speed,\n      w,\n      h,\n    });\n\n    this.speed = speed;\n    this.sprite = opts.sprite ?? 'torpedo';\n  }\n\n  update(dt) {\n    super.update(finiteOrZero(dt));\n\n    if (this.y + this.h < 0) {\n      this.kill();\n    }\n  }\n\n  render(renderer, sprites) {\n    return drawSpriteFrame(renderer, sprites, this.sprite, TORPEDO_FRAME, this.x, this.y, this.w, this.h);\n  }\n}\n\nclass Player extends Entity {\n  constructor(opts = {}) {\n    const canvasWidth = opts.canvasWidth ?? DEFAULT_CANVAS_WIDTH;\n    const w = opts.w ?? SUBMARINE_FRAME.w;\n    const h = opts.h ?? SUBMARINE_FRAME.h;\n    const centerX = (canvasWidth - w) / 2;\n    const x = clamp(opts.x ?? centerX, 0, Math.max(0, canvasWidth - w));\n    const y = opts.y ?? opts.spawnY ?? DEFAULT_PLAYER_Y;\n\n    super({ x, y, w, h });\n\n    this.canvasWidth = canvasWidth;\n    this.speed = opts.speed ?? DEFAULT_PLAYER_SPEED;\n    this.lives = opts.lives ?? 3;\n    this.fireCooldownMs = opts.fireCooldownMs ?? DEFAULT_FIRE_COOLDOWN_MS;\n    this.invulnMs = opts.invulnMs ?? DEFAULT_INVULN_MS;\n    this.blinkMs = opts.blinkMs ?? DEFAULT_BLINK_MS;\n    this.spawnY = opts.spawnY ?? y;\n    this.torpedoSpeed = opts.torpedoSpeed ?? DEFAULT_TORPEDO_SPEED;\n    this.torpedoW = opts.torpedoW ?? TORPEDO_FRAME.w;\n    this.torpedoH = opts.torpedoH ?? TORPEDO_FRAME.h;\n    this.torpedoSprite = opts.torpedoSprite ?? 'torpedo';\n    this.currentTorpedo = null;\n    this.fireCooldownRemainingMs = 0;\n    this.invulnRemainingMs = 0;\n    this.invulnElapsedMs = 0;\n    this.sprite = opts.sprite ?? 'submarine';\n  }\n\n  centerX() {\n    return (this.canvasWidth - this.w) / 2;\n  }\n\n  update(dt, input) {\n    const seconds = finiteOrZero(dt);\n    const milliseconds = seconds * 1000;\n    const left = inputActive(input, 'down', LEFT_CODES);\n    const right = inputActive(input, 'down', RIGHT_CODES);\n    const direction = (right ? 1 : 0) - (left ? 1 : 0);\n\n    this.vx = direction * this.speed;\n    super.update(seconds);\n    this.x = clamp(this.x, 0, Math.max(0, this.canvasWidth - this.w));\n\n    if (this.fireCooldownRemainingMs > 0) {\n      this.fireCooldownRemainingMs = Math.max(0, this.fireCooldownRemainingMs - milliseconds);\n    }\n\n    if (this.invulnRemainingMs > 0) {\n      this.invulnRemainingMs = Math.max(0, this.invulnRemainingMs - milliseconds);\n      this.invulnElapsedMs += milliseconds;\n    }\n  }\n\n  tryFire(input) {\n    if (!inputActive(input, 'pressed', FIRE_CODES)) {\n      return null;\n    }\n\n    if (this.activeTorpedo() !== null || this.fireCooldownRemainingMs > 0) {\n      return null;\n    }\n\n    const torpedo = createTorpedo({\n      x: this.x + (this.w / 2) - (this.torpedoW / 2),\n      y: this.y - this.torpedoH,\n      w: this.torpedoW,\n      h: this.torpedoH,\n      speed: this.torpedoSpeed,\n      sprite: this.torpedoSprite,\n    });\n\n    this.currentTorpedo = torpedo;\n    this.fireCooldownRemainingMs = this.fireCooldownMs;\n    return torpedo;\n  }\n\n  activeTorpedo() {\n    if (this.currentTorpedo?.alive !== false && this.currentTorpedo !== null) {\n      return this.currentTorpedo;\n    }\n\n    this.currentTorpedo = null;\n    return null;\n  }\n\n  loseLife() {\n    this.lives = Math.max(0, this.lives - 1);\n    return this.lives;\n  }\n\n  respawn() {\n    this.alive = true;\n    this.x = clamp(this.centerX(), 0, Math.max(0, this.canvasWidth - this.w));\n    this.y = this.spawnY;\n    this.vx = 0;\n    this.vy = 0;\n    this.invulnRemainingMs = this.invulnMs;\n    this.invulnElapsedMs = 0;\n    return this;\n  }\n\n  isInvulnerable() {\n    return this.invulnRemainingMs > 0;\n  }\n\n  isDead() {\n    return this.lives <= 0;\n  }\n\n  render(renderer, sprites) {\n    if (this.isInvulnerable() && Math.floor(this.invulnElapsedMs / this.blinkMs) % 2 === 1) {\n      return false;\n    }\n\n    return drawSpriteFrame(renderer, sprites, this.sprite, SUBMARINE_FRAME, this.x, this.y, this.w, this.h);\n  }\n}\n\nexport function createTorpedo(opts = {}) {\n  return new Torpedo(opts);\n}\n\nexport function createPlayer(opts = {}) {\n  return new Player(opts);\n}\n", "const recognizedCodes = new Set([\n  'ArrowLeft',\n  'ArrowRight',\n  'KeyA',\n  'KeyD',\n  'Space',\n  'KeyW',\n  'ArrowUp',\n  'Escape',\n  'KeyM',\n  'KeyL',\n]);\n\nconst touchOptions = { passive: true };\n\nconst touchAt = (touches, index) => {\n  if (touches == null) {\n    return undefined;\n  }\n\n  return touches[index] ?? touches.item?.(index);\n};\n\nconst firstTouch = (touches) => touchAt(touches, 0);\n\nconst touchByIdentifier = (touches, identifier) => {\n  const length = touches?.length ?? 0;\n\n  for (let index = 0; index < length; index += 1) {\n    const touch = touchAt(touches, index);\n\n    if ((touch?.identifier ?? 0) === identifier) {\n      return touch;\n    }\n  }\n\n  return undefined;\n};\n\nconst isWindowTarget = (target) => (\n  typeof globalThis.window !== 'undefined'\n  && target === globalThis.window\n);\n\nconst isCanvasTarget = (target) => {\n  const tagName = target?.tagName ?? target?.nodeName;\n  return typeof tagName === 'string' && tagName.toUpperCase() === 'CANVAS';\n};\n\nconst suppressesKeyboardDefaults = (target) => isWindowTarget(target) || isCanvasTarget(target);\n\nconst defaultAttachTarget = () => (\n  typeof globalThis.window === 'undefined' ? undefined : globalThis.window\n);\n\n/**\n * Create a keyboard and touch input tracker with per-frame edge state.\n *\n * Recognised key codes: ArrowLeft, ArrowRight, KeyA, KeyD, Space, KeyW, ArrowUp,\n * Escape, KeyM, KeyL. Call `endFrame()` once per frame to clear edge/touch state.\n *\n * @param {object} [opts] - Input configuration.\n * @param {EventTarget} [opts.target] - Default attach target; falls back to `window` when available.\n * @returns {{\n *   down: (code: string) => boolean,\n *   pressed: (code: string) => boolean,\n *   released: (code: string) => boolean,\n *   touchDx: () => number,\n *   attach: (target?: EventTarget) => object,\n *   detach: () => object,\n *   endFrame: () => object\n * }} Input API: `down` reports held keys; `pressed`/`released` report this-frame\n *   edges; `touchDx` is accumulated horizontal touch movement; `attach`/`detach`\n *   manage listeners; `endFrame` clears per-frame state. Mutating methods return\n *   the API for chaining.\n */\nexport const createInput = (opts = {}) => {\n  const held = new Set();\n  const pressedThisFrame = new Set();\n  const releasedThisFrame = new Set();\n  const fallbackTarget = opts.target;\n\n  let attachedTarget;\n  let activeTouchIdentifier;\n  let lastTouchX = 0;\n  let frameTouchDx = 0;\n\n  const maybePreventKeyboardDefault = (event) => {\n    if (attachedTarget !== undefined && suppressesKeyboardDefaults(attachedTarget)) {\n      event.preventDefault?.();\n    }\n  };\n\n  const onKeyDown = (event) => {\n    const { code } = event;\n\n    if (!recognizedCodes.has(code)) {\n      return;\n    }\n\n    maybePreventKeyboardDefault(event);\n\n    if (!held.has(code)) {\n      pressedThisFrame.add(code);\n    }\n\n    held.add(code);\n  };\n\n  const onKeyUp = (event) => {\n    const { code } = event;\n\n    if (!recognizedCodes.has(code)) {\n      return;\n    }\n\n    maybePreventKeyboardDefault(event);\n\n    if (held.has(code)) {\n      held.delete(code);\n      releasedThisFrame.add(code);\n    }\n  };\n\n  const onTouchStart = (event) => {\n    const touch = firstTouch(event.changedTouches) ?? firstTouch(event.touches);\n\n    if (touch === undefined) {\n      return;\n    }\n\n    activeTouchIdentifier = touch.identifier ?? 0;\n    lastTouchX = touch.clientX ?? 0;\n  };\n\n  const addTouchDelta = (touch) => {\n    const x = touch.clientX ?? lastTouchX;\n    frameTouchDx += x - lastTouchX;\n    lastTouchX = x;\n  };\n\n  const onTouchMove = (event) => {\n    if (activeTouchIdentifier === undefined) {\n      return;\n    }\n\n    const touch = touchByIdentifier(event.changedTouches, activeTouchIdentifier)\n      ?? touchByIdentifier(event.touches, activeTouchIdentifier);\n\n    if (touch !== undefined) {\n      addTouchDelta(touch);\n    }\n  };\n\n  const onTouchEnd = (event) => {\n    if (activeTouchIdentifier === undefined) {\n      return;\n    }\n\n    const touch = touchByIdentifier(event.changedTouches, activeTouchIdentifier);\n\n    if (touch !== undefined) {\n      addTouchDelta(touch);\n      activeTouchIdentifier = undefined;\n    }\n  };\n\n  const addListeners = () => {\n    attachedTarget.addEventListener('keydown', onKeyDown);\n    attachedTarget.addEventListener('keyup', onKeyUp);\n    attachedTarget.addEventListener('touchstart', onTouchStart, touchOptions);\n    attachedTarget.addEventListener('touchmove', onTouchMove, touchOptions);\n    attachedTarget.addEventListener('touchend', onTouchEnd, touchOptions);\n  };\n\n  const removeListeners = () => {\n    attachedTarget.removeEventListener('keydown', onKeyDown);\n    attachedTarget.removeEventListener('keyup', onKeyUp);\n    attachedTarget.removeEventListener('touchstart', onTouchStart, touchOptions);\n    attachedTarget.removeEventListener('touchmove', onTouchMove, touchOptions);\n    attachedTarget.removeEventListener('touchend', onTouchEnd, touchOptions);\n  };\n\n  const api = {\n    down: (code) => held.has(code),\n    pressed: (code) => pressedThisFrame.has(code),\n    released: (code) => releasedThisFrame.has(code),\n    touchDx: () => frameTouchDx,\n    attach: (target = fallbackTarget ?? defaultAttachTarget()) => {\n      if (attachedTarget === target) {\n        return api;\n      }\n\n      api.detach();\n\n      if (target === undefined || target === null) {\n        return api;\n      }\n\n      attachedTarget = target;\n      addListeners();\n      return api;\n    },\n    detach: () => {\n      if (attachedTarget === undefined) {\n        return api;\n      }\n\n      removeListeners();\n      attachedTarget = undefined;\n      activeTouchIdentifier = undefined;\n      return api;\n    },\n    endFrame: () => {\n      pressedThisFrame.clear();\n      releasedThisFrame.clear();\n      frameTouchDx = 0;\n      return api;\n    },\n  };\n\n  return api;\n};\n", "const DEFAULT_FIXED_DT = 1 / 60;\nconst DEFAULT_MAX_ACCUMULATOR = 0.25;\nconst EPSILON = 1e-12;\n\nfunction getDefaultRaf() {\n  return globalThis.requestAnimationFrame?.bind(globalThis);\n}\n\nfunction getDefaultCancelRaf() {\n  return globalThis.cancelAnimationFrame?.bind(globalThis);\n}\n\nfunction getDefaultNow() {\n  return globalThis.performance?.now.bind(globalThis.performance);\n}\n\nfunction assertFunction(value, name) {\n  if (typeof value !== 'function') {\n    throw new TypeError(`createLoop requires ${name} to be a function`);\n  }\n}\n\n/**\n * Create a fixed-timestep game loop with a variable-rate render and accumulator clamp.\n *\n * `update` is invoked zero or more times per frame with a constant `fixedDt`;\n * `render` is invoked once per frame with an interpolation alpha in [0, 1].\n *\n * @param {object} [opts] - Loop configuration.\n * @param {(dt: number) => void} [opts.update] - Fixed-step update callback; receives `fixedDt` seconds.\n * @param {(alpha: number) => void} [opts.render] - Render callback; receives interpolation alpha in [0, 1].\n * @param {(cb: FrameRequestCallback) => number} [opts.raf] - Schedules the next frame; defaults to `requestAnimationFrame`.\n * @param {(handle: number) => void} [opts.cancelRaf] - Cancels a scheduled frame; defaults to `cancelAnimationFrame`.\n * @param {number} [opts.fixedDt=1/60] - Fixed update step in seconds; must be greater than 0.\n * @param {number} [opts.maxAccumulator=0.25] - Maximum accumulated time in seconds; must be greater than or equal to 0.\n * @param {() => number} [opts.now] - Time source; when omitted uses `performance.now()` (milliseconds) scaled to seconds.\n * @returns {{\n *   start: () => void,\n *   stop: () => void,\n *   pause: () => void,\n *   resume: () => void,\n *   isRunning: () => boolean,\n *   isPaused: () => boolean\n * }} Loop controls.\n */\nexport function createLoop(opts = {}) {\n  const {\n    update = () => {},\n    render = () => {},\n    raf = getDefaultRaf(),\n    cancelRaf = getDefaultCancelRaf(),\n    fixedDt = DEFAULT_FIXED_DT,\n    maxAccumulator = DEFAULT_MAX_ACCUMULATOR,\n  } = opts;\n  const rawNow = opts.now ?? getDefaultNow();\n  const nowScale = opts.now === undefined ? 1 / 1000 : 1;\n\n  assertFunction(update, 'update');\n  assertFunction(render, 'render');\n  assertFunction(raf, 'raf');\n  assertFunction(rawNow, 'now');\n\n  if (!(fixedDt > 0)) {\n    throw new RangeError('createLoop requires fixedDt to be greater than 0');\n  }\n\n  if (!(maxAccumulator >= 0)) {\n    throw new RangeError('createLoop requires maxAccumulator to be greater than or equal to 0');\n  }\n\n  let running = false;\n  let paused = false;\n  let frameId = null;\n  let lastTime = 0;\n  let accumulator = 0;\n\n  const readNow = () => rawNow() * nowScale;\n\n  const scheduleNextFrame = () => {\n    if (!running) {\n      return;\n    }\n\n    frameId = raf(frame);\n  };\n\n  const consumeAccumulator = () => {\n    while (accumulator + EPSILON >= fixedDt) {\n      update(fixedDt);\n      accumulator -= fixedDt;\n    }\n\n    if (Math.abs(accumulator) < EPSILON) {\n      accumulator = 0;\n    }\n  };\n\n  const renderFrame = () => {\n    const alpha = fixedDt === 0 ? 0 : Math.min(Math.max(accumulator / fixedDt, 0), 1);\n    render(alpha);\n  };\n\n  function frame() {\n    if (!running) {\n      return;\n    }\n\n    const currentTime = readNow();\n\n    if (paused) {\n      lastTime = currentTime;\n      renderFrame();\n      scheduleNextFrame();\n      return;\n    }\n\n    const elapsed = Math.max(0, currentTime - lastTime);\n    lastTime = currentTime;\n    accumulator = Math.min(accumulator + elapsed, maxAccumulator);\n\n    consumeAccumulator();\n    renderFrame();\n    scheduleNextFrame();\n  }\n\n  const start = () => {\n    if (running) {\n      return;\n    }\n\n    running = true;\n    paused = false;\n    accumulator = 0;\n    lastTime = readNow();\n    scheduleNextFrame();\n  };\n\n  const stop = () => {\n    if (!running) {\n      return;\n    }\n\n    running = false;\n    paused = false;\n    accumulator = 0;\n\n    if (frameId !== null && typeof cancelRaf === 'function') {\n      cancelRaf(frameId);\n    }\n\n    frameId = null;\n  };\n\n  const pause = () => {\n    if (!running || paused) {\n      return;\n    }\n\n    paused = true;\n    lastTime = readNow();\n  };\n\n  const resume = () => {\n    if (!running || !paused) {\n      return;\n    }\n\n    paused = false;\n    lastTime = readNow();\n  };\n\n  return {\n    start,\n    stop,\n    pause,\n    resume,\n    isRunning: () => running,\n    isPaused: () => paused,\n  };\n}\n", "const DEFAULT_BACKGROUND = '#061525';\nconst DEFAULT_TEXT = Object.freeze({\n  font: '14px monospace',\n  fill: '#ffffff',\n  align: 'left',\n  baseline: 'top',\n});\n\nfunction resolveContext(canvas) {\n  if (!canvas || typeof canvas.getContext !== 'function') {\n    throw new TypeError('createRenderer requires a canvas with getContext');\n  }\n\n  const context = canvas.getContext('2d');\n  if (!context) {\n    throw new TypeError('createRenderer requires a 2D canvas context');\n  }\n\n  return context;\n}\n\nfunction ensureStyle(canvas) {\n  if (!canvas.style) {\n    canvas.style = {};\n  }\n\n  return canvas.style;\n}\n\n/**\n * Create a device-pixel-ratio-aware Canvas 2D drawing wrapper.\n *\n * Sizes the canvas backing store by the device pixel ratio while keeping a logical\n * coordinate space, then exposes simple draw helpers.\n *\n * @param {object} [opts] - Renderer configuration.\n * @param {HTMLCanvasElement} opts.canvas - Target canvas; must expose `getContext('2d')`.\n * @param {number} [opts.logicalWidth=800] - Logical width in CSS pixels.\n * @param {number} [opts.logicalHeight=600] - Logical height in CSS pixels.\n * @param {number} [opts.dpr] - Device pixel ratio override; defaults to `devicePixelRatio` or 1.\n * @returns {{\n *   clear: (color?: string) => void,\n *   drawSprite: (image: CanvasImageSource, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw?: number, dh?: number) => void,\n *   drawRect: (x: number, y: number, w: number, h: number, fill?: string, stroke?: string) => void,\n *   drawText: (text: string, x: number, y: number, opts?: {font?: string, fill?: string, align?: CanvasTextAlign, baseline?: CanvasTextBaseline}) => void,\n *   width: () => number,\n *   height: () => number,\n *   ctx: () => CanvasRenderingContext2D\n * }} Frozen renderer API.\n */\nexport function createRenderer({ canvas, logicalWidth = 800, logicalHeight = 600, dpr } = {}) {\n  const context = resolveContext(canvas);\n  const scale = dpr ?? globalThis.devicePixelRatio ?? 1;\n  const style = ensureStyle(canvas);\n\n  canvas.width = logicalWidth * scale;\n  canvas.height = logicalHeight * scale;\n  style.width = `${logicalWidth}px`;\n  style.height = `${logicalHeight}px`;\n\n  if (typeof context.setTransform === 'function') {\n    context.setTransform(scale, 0, 0, scale, 0, 0);\n  }\n\n  return Object.freeze({\n    clear(color = DEFAULT_BACKGROUND) {\n      context.fillStyle = color;\n      context.fillRect(0, 0, logicalWidth, logicalHeight);\n    },\n\n    drawSprite(image, sx, sy, sw, sh, dx, dy, dw = sw, dh = sh) {\n      context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);\n    },\n\n    drawRect(x, y, w, h, fill, stroke) {\n      if (fill !== undefined && fill !== null) {\n        context.fillStyle = fill;\n        context.fillRect(x, y, w, h);\n      }\n\n      if (stroke !== undefined && stroke !== null) {\n        context.strokeStyle = stroke;\n        context.strokeRect(x, y, w, h);\n      }\n    },\n\n    drawText(text, x, y, opts = {}) {\n      const {\n        font = DEFAULT_TEXT.font,\n        fill = DEFAULT_TEXT.fill,\n        align = DEFAULT_TEXT.align,\n        baseline = DEFAULT_TEXT.baseline,\n      } = opts ?? {};\n\n      context.font = font;\n      context.fillStyle = fill;\n      context.textAlign = align;\n      context.textBaseline = baseline;\n      context.fillText(text, x, y);\n    },\n\n    width() {\n      return logicalWidth;\n    },\n\n    height() {\n      return logicalHeight;\n    },\n\n    ctx() {\n      return context;\n    },\n  });\n}\n", "function callScene(scene, method, args = []) {\n  const fn = scene?.[method];\n  return typeof fn === 'function' ? fn.apply(scene, args) : undefined;\n}\n\n/**\n * Create a duck-typed scene stack with lifecycle hooks and input forwarding.\n *\n * Scenes are plain objects; any of `enter`, `exit`, `update`, `render`, and\n * `handleInput` are invoked when present. Only the top scene receives\n * update/render/input.\n *\n * @returns {{\n *   push: (scene: object) => object,\n *   pop: () => (object | undefined),\n *   replace: (scene: object) => object,\n *   current: () => (object | undefined),\n *   update: (dt: number) => any,\n *   render: (renderer: object) => any,\n *   handleInput: (input: object) => any,\n *   size: () => number\n * }} Scene stack API: `push` calls the scene's `enter`; `pop` calls `exit`;\n *   `replace` pops then pushes; `current` returns the top scene; `update`/`render`/\n *   `handleInput` forward to the top scene; `size` returns the stack depth.\n */\nexport function createSceneStack() {\n  const scenes = [];\n\n  function current() {\n    return scenes.at(-1);\n  }\n\n  function push(scene) {\n    scenes.push(scene);\n    callScene(scene, 'enter');\n    return scene;\n  }\n\n  function pop() {\n    const scene = scenes.pop();\n    callScene(scene, 'exit');\n    return scene;\n  }\n\n  function replace(scene) {\n    pop();\n    return push(scene);\n  }\n\n  function update(dt) {\n    return callScene(current(), 'update', [dt]);\n  }\n\n  function render(renderer) {\n    return callScene(current(), 'render', [renderer]);\n  }\n\n  function handleInput(input) {\n    return callScene(current(), 'handleInput', [input]);\n  }\n\n  function size() {\n    return scenes.length;\n  }\n\n  return {\n    push,\n    pop,\n    replace,\n    current,\n    update,\n    render,\n    handleInput,\n    size,\n  };\n}\n", "/**\n * Create a deterministic Mulberry32 seedable pseudo-random number generator.\n *\n * The same seed always produces the same sequence on every machine and reload,\n * so draws are reproducible without server coordination.\n *\n * @param {number} [seed=1] - Initial seed; coerced to an unsigned 32-bit integer.\n * @returns {{\n *   next: () => number,\n *   range: (min: number, max: number) => number,\n *   int: (min: number, max: number) => number,\n *   seed: (value: number) => number\n * }} RNG API: `next()` yields a float in [0, 1); `range(min, max)` a float in\n *   [min, max); `int(min, max)` an integer in [min, max] inclusive; `seed(value)`\n *   reseeds and returns the new unsigned 32-bit internal state.\n */\nexport function createRng(seed = 1) {\n  let state = 0;\n\n  function reseed(value) {\n    state = Number(value) >>> 0;\n    return state;\n  }\n\n  function next() {\n    state = (state + 0x6d2b79f5) >>> 0;\n    let value = state;\n    value = Math.imul(value ^ (value >>> 15), value | 1);\n    value ^= value + Math.imul(value ^ (value >>> 7), value | 61);\n    return ((value ^ (value >>> 14)) >>> 0) / 4294967296;\n  }\n\n  function range(min, max) {\n    return min + next() * (max - min);\n  }\n\n  function int(min, max) {\n    return Math.floor(next() * (max - min + 1)) + min;\n  }\n\n  reseed(seed);\n\n  return {\n    next,\n    range,\n    int,\n    seed: reseed,\n  };\n}\n", "function dimensionsFor(image) {\n  return {\n    width: image.naturalWidth ?? image.width ?? 0,\n    height: image.naturalHeight ?? image.height ?? 0,\n  };\n}\n\nfunction assertImageLike(image) {\n  if (!image || typeof image !== 'object') {\n    throw new TypeError('loadSpriteSheet expected an image-like object');\n  }\n}\n\nfunction loadWithImageConstructor(src) {\n  const ImageCtor = globalThis.Image;\n  if (typeof ImageCtor !== 'function') {\n    return Promise.reject(new Error('Image constructor is not available'));\n  }\n\n  return new Promise((resolve, reject) => {\n    const image = new ImageCtor();\n    image.onload = () => resolve(image);\n    image.onerror = () => reject(new Error(`Failed to load sprite sheet: ${src}`));\n    image.src = src;\n  });\n}\n\n/**\n * Load a sprite sheet image and report its natural dimensions.\n *\n * @param {string} src - Image URL or source passed to the image factory/constructor.\n * @param {object} [opts] - Options.\n * @param {(src: string) => (HTMLImageElement | Promise<HTMLImageElement>)} [opts.imageFactory] - Custom loader; defaults to the global `Image` constructor.\n * @returns {Promise<{image: HTMLImageElement, width: number, height: number}>} The loaded image plus its natural width/height.\n */\nexport async function loadSpriteSheet(src, opts = {}) {\n  const image = opts.imageFactory\n    ? await opts.imageFactory(src)\n    : await loadWithImageConstructor(src);\n\n  assertImageLike(image);\n  const { width, height } = dimensionsFor(image);\n\n  return { image, width, height };\n}\n\n/**\n * Create an immutable sprite-sheet frame rectangle.\n *\n * @param {object} rect - Frame rectangle.\n * @param {number} rect.x - Left offset within the sheet, in pixels.\n * @param {number} rect.y - Top offset within the sheet, in pixels.\n * @param {number} rect.w - Frame width in pixels.\n * @param {number} rect.h - Frame height in pixels.\n * @returns {Readonly<{x: number, y: number, w: number, h: number}>} Frozen frame.\n */\nexport function createFrame({ x, y, w, h }) {\n  return Object.freeze({ x, y, w, h });\n}\n\n/**\n * Create a frame-based animation clock.\n *\n * @param {object} [opts] - Animation configuration.\n * @param {Array<object>} opts.frames - One or more frames to cycle through; must be non-empty.\n * @param {number} [opts.fps=8] - Playback rate in frames per second; must be a positive finite number.\n * @param {boolean} [opts.loop=true] - When true the animation wraps; otherwise it clamps to the last frame.\n * @returns {Readonly<{tick: (dt: number) => object, currentFrame: () => object}>} Animation API: `tick(dt)` advances by `dt` seconds and returns the current frame; `currentFrame()` returns it without advancing.\n */\nexport function createAnimation({ frames, fps = 8, loop = true } = {}) {\n  if (!Array.isArray(frames) || frames.length === 0) {\n    throw new TypeError('createAnimation requires at least one frame');\n  }\n\n  if (!Number.isFinite(fps) || fps <= 0) {\n    throw new RangeError('createAnimation fps must be a positive finite number');\n  }\n\n  const animationFrames = Object.freeze(Array.from(frames));\n  let elapsed = 0;\n\n  function frameIndex() {\n    const advanced = Math.floor(elapsed * fps);\n    return loop\n      ? advanced % animationFrames.length\n      : Math.min(advanced, animationFrames.length - 1);\n  }\n\n  return Object.freeze({\n    tick(dt) {\n      if (Number.isFinite(dt) && dt > 0) {\n        elapsed += dt;\n      }\n\n      return animationFrames[frameIndex()];\n    },\n\n    currentFrame() {\n      return animationFrames[frameIndex()];\n    },\n  });\n}\n", "export const MODES = Object.freeze({\n  RANKED: 'ranked',\n  PRACTICE: 'practice',\n});\n\nexport const LAST_MODE_KEY = 'subInvadersLastMode';\n\nconst VALID_MODES = new Set(Object.values(MODES));\n\nfunction isValidMode(mode) {\n  return VALID_MODES.has(mode);\n}\n\nfunction resolveStorage(storage) {\n  if (storage !== undefined) {\n    return storage;\n  }\n\n  try {\n    return globalThis.localStorage;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction resolveSearch({ search, url } = {}) {\n  if (search !== undefined) {\n    return search;\n  }\n\n  if (url !== undefined) {\n    return readSearchFromUrl(url);\n  }\n\n  try {\n    return readSearchFromUrl(globalThis.location);\n  } catch {\n    return undefined;\n  }\n}\n\nfunction readSearchFromUrl(url) {\n  try {\n    if (typeof url === 'string') {\n      return new URL(url, 'http://sub-invaders.local').search;\n    }\n\n    if (url && typeof url.search === 'string') {\n      return url.search;\n    }\n  } catch {\n    return undefined;\n  }\n\n  return undefined;\n}\n\nfunction modeFromSearch(search) {\n  try {\n    if (typeof search !== 'string') {\n      return undefined;\n    }\n\n    const params = new URLSearchParams(search.startsWith('?') ? search : `?${search}`);\n    const mode = params.get('mode');\n    return isValidMode(mode) ? mode : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction modeFromStorage(storage) {\n  try {\n    const target = resolveStorage(storage);\n\n    if (!target || typeof target.getItem !== 'function') {\n      return undefined;\n    }\n\n    const mode = target.getItem(LAST_MODE_KEY);\n    return isValidMode(mode) ? mode : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function readUrlMode(opts = {}) {\n  return modeFromSearch(resolveSearch(opts));\n}\n\nexport function getMode(opts = {}) {\n  return modeFromStorage(opts.storage) ?? MODES.RANKED;\n}\n\nexport function setMode(mode, { storage } = {}) {\n  if (!isValidMode(mode)) {\n    return;\n  }\n\n  try {\n    const target = resolveStorage(storage);\n\n    if (!target || typeof target.setItem !== 'function') {\n      return;\n    }\n\n    target.setItem(LAST_MODE_KEY, mode);\n  } catch {\n    // Mode persistence is best-effort; gameplay still has a safe ranked default.\n  }\n}\n\nexport function isRanked(opts = {}) {\n  return getMode(opts) === MODES.RANKED;\n}\n\nexport function isPractice(opts = {}) {\n  return getMode(opts) === MODES.PRACTICE;\n}\n", "/**\n * src/game/api.mjs \u2014 Sub Invaders backend client.\n *\n * Wraps the CS03 Functions API (`/api/session`, `/api/score`, `/api/leaderboard`).\n * Browser `fetch()` only \u2014 no runtime dependencies. Errors are normalized into\n * Error subclasses so game scenes can surface predictable messages.\n */\n\nimport { isPractice as defaultIsPractice } from './mode.mjs';\n\nconst DEFAULT_BASE = '/api';\nconst PRACTICE_SKIP = Object.freeze({ skipped: true, reason: 'practice' });\n\nexport class ApiError extends Error {\n  constructor(message, { status = 0, code = 'unknown', cause } = {}) {\n    super(message);\n    this.name = 'ApiError';\n    this.status = status;\n    this.code = code;\n    if (cause) this.cause = cause;\n  }\n}\n\nfunction isPositiveInt(value) {\n  return Number.isInteger(value) && value >= 0;\n}\n\nfunction isValidUtcDate(date) {\n  if (typeof date !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\n    return false;\n  }\n  const [year, month, day] = date.split('-').map(Number);\n  if (year <= 0 || month <= 0 || day <= 0) {\n    return false;\n  }\n  const roundTrip = new Date(Date.UTC(year, month - 1, day));\n  roundTrip.setUTCFullYear(year);\n  return roundTrip.getUTCFullYear() === year\n    && roundTrip.getUTCMonth() === month - 1\n    && roundTrip.getUTCDate() === day;\n}\n\nfunction normalizeBase(base) {\n  const value = typeof base === 'string' && base.length > 0 ? base : DEFAULT_BASE;\n  return value.replace(/\\/+$/, '');\n}\n\nasync function readJson(response) {\n  const text = await response.text();\n  if (!text) return null;\n  try {\n    return JSON.parse(text);\n  } catch (cause) {\n    throw new ApiError('response body is not valid JSON', {\n      status: response.status,\n      code: 'invalid_json',\n      cause,\n    });\n  }\n}\n\nasync function request(fetchFn, baseUrl, path, init = {}) {\n  let response;\n  try {\n    response = await fetchFn(`${baseUrl}${path}`, init);\n  } catch (cause) {\n    throw new ApiError(`network error contacting ${path}`, {\n      status: 0,\n      code: 'network_error',\n      cause,\n    });\n  }\n  const body = await readJson(response);\n  if (!response.ok) {\n    const code = body?.error ?? `http_${response.status}`;\n    const message = body?.message ?? `request to ${path} failed (${response.status})`;\n    throw new ApiError(message, { status: response.status, code });\n  }\n  return body;\n}\n\nexport function createApiClient(opts = {}) {\n  const fetchFn = opts.fetch ?? globalThis.fetch?.bind(globalThis);\n  if (typeof fetchFn !== 'function') {\n    throw new Error('createApiClient: fetch is not available');\n  }\n  const baseUrl = normalizeBase(opts.baseUrl);\n  // Normalize isPractice to a predicate: accept a function, coerce a plain\n  // boolean (an easy caller mistake), and otherwise default to mode.mjs.\n  const isPractice = typeof opts.isPractice === 'function'\n    ? opts.isPractice\n    : (opts.isPractice === undefined ? () => defaultIsPractice() : () => Boolean(opts.isPractice));\n\n  async function startSession() {\n    if (isPractice()) {\n      return PRACTICE_SKIP;\n    }\n\n    const body = await request(fetchFn, baseUrl, '/session', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!body || typeof body.sessionId !== 'string' || typeof body.startedAt !== 'string') {\n      throw new ApiError('startSession: malformed response', {\n        code: 'malformed_response',\n      });\n    }\n    return {\n      sessionId: body.sessionId,\n      nonce: body.nonce ?? '',\n      startedAt: body.startedAt,\n    };\n  }\n\n  async function submitScore({ sessionId, score, finishedAt, period, utcDate } = {}, { bypassPracticeSkip = false } = {}) {\n    if (isPractice() && !bypassPracticeSkip) {\n      return PRACTICE_SKIP;\n    }\n\n    if (typeof sessionId !== 'string' || sessionId.length === 0) {\n      throw new ApiError('submitScore: sessionId is required', { code: 'invalid_argument' });\n    }\n    if (!isPositiveInt(score)) {\n      throw new ApiError('submitScore: score must be a non-negative integer', { code: 'invalid_argument' });\n    }\n    if (typeof finishedAt !== 'string' || finishedAt.length === 0) {\n      throw new ApiError('submitScore: finishedAt must be ISO-8601 string', { code: 'invalid_argument' });\n    }\n    const payload = { sessionId, score, finishedAt };\n    if (period !== undefined) {\n      if (period !== 'all' && period !== 'daily') {\n        throw new ApiError('submitScore: period must be \"all\" or \"daily\"', { code: 'invalid_argument' });\n      }\n      payload.period = period;\n      if (period === 'daily') {\n        if (!isValidUtcDate(utcDate)) {\n          throw new ApiError('submitScore: utcDate must be YYYY-MM-DD and a real UTC date when period is \"daily\"', { code: 'invalid_argument' });\n        }\n        payload.utcDate = utcDate;\n      }\n    }\n    return request(fetchFn, baseUrl, '/score', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload),\n    });\n  }\n\n  async function getLeaderboard({ period = 'all', date } = {}) {\n    if (period !== 'all' && period !== 'daily') {\n      throw new ApiError('getLeaderboard: period must be \"all\" or \"daily\"', { code: 'invalid_argument' });\n    }\n    const params = new URLSearchParams({ period });\n    if (period === 'daily') {\n      if (!isValidUtcDate(date)) {\n        throw new ApiError('getLeaderboard: date must be YYYY-MM-DD and a real UTC date when period is \"daily\"', { code: 'invalid_argument' });\n      }\n      params.set('date', date);\n    }\n    const body = await request(fetchFn, baseUrl, `/leaderboard?${params.toString()}`, {\n      method: 'GET',\n    });\n    if (!body || !Array.isArray(body.entries)) {\n      throw new ApiError('getLeaderboard: malformed response', { code: 'malformed_response' });\n    }\n    return {\n      period: body.period ?? period,\n      entries: body.entries.map((row) => ({\n        rank: Number(row.rank) || 0,\n        score: Number(row.score) || 0,\n        finishedAt: typeof row.finishedAt === 'string' ? row.finishedAt : '',\n      })),\n    };\n  }\n\n  return { startSession, submitScore, getLeaderboard };\n}\n\nexport const __forTesting = { normalizeBase, isPositiveInt, isValidUtcDate };\n", "export const CANVAS = Object.freeze({ width: 800, height: 600 });\n\nexport const PALETTE = Object.freeze({\n  skyTop: '#061525',\n  skyMid: '#0b4f63',\n  seaAccent: '#12a7a0',\n  player: '#ffd84d',\n  ui: '#ffffff',\n  shot: '#ffd84d',\n  enemyShot: '#ff5b6e',\n});\n\nexport const PLAYER = Object.freeze({\n  speed: 240,\n  fireCooldownMs: 350,\n  invulnMs: 1500,\n  lives: 3,\n  w: 32,\n  h: 16,\n  spawnYOffset: 60,\n});\n\nexport const TORPEDO = Object.freeze({ speed: 540, w: 4, h: 10 });\n\nexport const ENEMY_SHOT = Object.freeze({ speed: 220, w: 4, h: 10 });\n\nexport const FORMATION = Object.freeze({\n  rows: 5,\n  cols: 11,\n  cellW: 40,\n  cellH: 28,\n  originX: 80,\n  originY: 80,\n  baseSpeed: 60,\n  descendStep: 16,\n  accelFactor: 1.2,\n  depthBumpPerWave: 8,\n  depthCap: 120,\n  firePerWaveMs: 100,\n  fireMinIntervalMs: 200,\n  fireIntervalMs: 1500,\n  descentStepPerWave: 1,\n  descentStepCap: 5,\n});\n\nexport const ENEMY_TYPES = Object.freeze({\n  squid: { points: 40, rowIndex: [0], sprite: 'squid', w: 32, h: 24 },\n  anglerfish: { points: 20, rowIndex: [1, 2], sprite: 'anglerfish', w: 24, h: 24 },\n  jellyfish: { points: 10, rowIndex: [3, 4], sprite: 'jellyfish', w: 24, h: 24 },\n});\n\nexport const SCORING = Object.freeze({\n  waveBonusMultiplier: 100,\n});\n\nexport const SPRITES = Object.freeze({\n  submarine: { x: 0, y: 0, w: 32, h: 16 },\n  torpedo: { x: 40, y: 0, w: 4, h: 10 },\n  enemyShot: { x: 48, y: 0, w: 4, h: 10 },\n  lifeIcon: { x: 64, y: 0, w: 16, h: 8 },\n  jellyfish: { x: 0, y: 16, w: 24, h: 24 },\n  anglerfish: { x: 48, y: 16, w: 24, h: 24 },\n  squid: { x: 0, y: 40, w: 32, h: 24 },\n});\n", "// CS04 D5 / CS04-11 \u2014 frontend feature flag delivery.\n//\n// Flag resolution order (CS04-11):\n//   1. HTML <meta name=\"flags\" content=\"key1=value1; key2=value2\"> default.\n//   2. GET /api/health response body's `flags` object overrides defaults.\n//   3. On fetch failure or timeout, fall back to (1).\n//\n// fetchFlags() is called once at boot from main.mjs (row 10) BEFORE pushing\n// the menu scene so the daily option's visibility is decided up front.\n\nexport const FLAG_FETCH_TIMEOUT_MS = 1500;\n\nexport const HEALTH_ENDPOINT = '/api/health';\n\nexport function parseMetaFlags(metaContent) {\n  const out = {};\n  if (typeof metaContent !== 'string' || metaContent.trim() === '') return out;\n  for (const part of metaContent.split(/[;,]/)) {\n    const trimmed = part.trim();\n    if (trimmed === '') continue;\n    const eq = trimmed.indexOf('=');\n    if (eq === -1) continue;\n    const key = trimmed.slice(0, eq).trim();\n    const value = trimmed.slice(eq + 1).trim();\n    if (key === '') continue;\n    out[key] = value;\n  }\n  return out;\n}\n\nexport function readDefaultFlags(documentRef) {\n  const doc = documentRef ?? (typeof document !== 'undefined' ? document : null);\n  if (!doc || typeof doc.querySelector !== 'function') return {};\n  const meta = doc.querySelector('meta[name=\"flags\"]');\n  if (!meta) return {};\n  return parseMetaFlags(meta.getAttribute('content'));\n}\n\nfunction mergeFlags(defaults, overrides) {\n  return { ...defaults, ...overrides };\n}\n\nexport async function fetchFlags({\n  documentRef,\n  fetchImpl,\n  timeoutMs = FLAG_FETCH_TIMEOUT_MS,\n  endpoint = HEALTH_ENDPOINT,\n} = {}) {\n  const defaults = readDefaultFlags(documentRef);\n  const fetcher = fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : null);\n  if (!fetcher) return defaults;\n\n  const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n  const timer = controller && timeoutMs > 0\n    ? setTimeout(() => controller.abort(), timeoutMs)\n    : null;\n\n  try {\n    const res = await fetcher(endpoint, controller ? { signal: controller.signal } : undefined);\n    if (!res || !res.ok) return defaults;\n    const body = await res.json().catch(() => null);\n    if (!body || typeof body !== 'object') return defaults;\n    const overrides = body.flags && typeof body.flags === 'object' ? body.flags : {};\n    return mergeFlags(defaults, overrides);\n  } catch {\n    return defaults;\n  } finally {\n    if (timer !== null) clearTimeout(timer);\n  }\n}\n\nexport function isDailyChallengeEnabled(flags) {\n  return flags?.dailyChallenge === 'on';\n}\n", "import { createInput } from 'canvas-game-engine/input.mjs';\nimport { createLoop } from 'canvas-game-engine/loop.mjs';\nimport { createRenderer } from 'canvas-game-engine/renderer.mjs';\nimport { createSceneStack } from 'canvas-game-engine/scene.mjs';\nimport { createRng } from 'canvas-game-engine/seed.mjs';\nimport { loadSpriteSheet } from 'canvas-game-engine/sprite.mjs';\nimport { createApiClient } from './api.mjs';\nimport { CANVAS, SPRITES } from './constants.mjs';\nimport { fetchFlags as defaultFetchFlags, isDailyChallengeEnabled } from './flags.mjs';\nimport { createFormation } from './invaders.mjs';\nimport { createPlayer } from './player.mjs';\nimport { createDailyScene } from './scenes/daily.mjs';\nimport { createGameOverScene } from './scenes/gameover.mjs';\nimport { createLeaderboardScene } from './scenes/leaderboard.mjs';\nimport { createMenuScene } from './scenes/menu.mjs';\nimport { createDailyMenuOption } from './scenes/menu-daily-option.mjs';\nimport { createModeMenuOption } from './scenes/menu-mode-option.mjs';\nimport { createPlayScene } from './scenes/play.mjs';\nimport { getMode as defaultGetMode, setMode as defaultSetMode, readUrlMode } from './mode.mjs';\nimport { drain as drainPendingScores } from './pending-scores.mjs';\nimport { getHighScore, getHighScoreFor, setHighScore, setHighScoreFor } from './score.mjs';\nimport { installTestHooks } from './test-hooks.mjs';\n\nfunction toScore(value) {\n  const score = Number(value);\n  return Number.isFinite(score) ? Math.max(0, Math.floor(score)) : 0;\n}\n\nfunction toPositiveInt(value, fallback) {\n  const number = Number(value);\n  return Number.isFinite(number) && number >= 1 ? Math.floor(number) : fallback;\n}\n\nfunction toSeed(value, fallback = 1) {\n  const number = Number(value);\n  return Number.isFinite(number) ? Math.floor(number) : fallback;\n}\n\nfunction toNonNegativeNumber(value) {\n  const number = Number(value);\n  return Number.isFinite(number) && number >= 0 ? number : undefined;\n}\n\nfunction locationUrl(locationLike) {\n  const href = typeof locationLike === 'string' ? locationLike : locationLike?.href;\n\n  try {\n    return new URL(href ?? 'about:blank', 'http://localhost/');\n  } catch {\n    return new URL('about:blank');\n  }\n}\n\nfunction readQueryOptions(locationLike) {\n  const params = locationUrl(locationLike).searchParams;\n\n  return {\n    seed: params.has('seed') ? toSeed(params.get('seed')) : undefined,\n    startWave: params.has('startWave') ? toPositiveInt(params.get('startWave'), 1) : undefined,\n    formationSpeed: params.has('formationSpeed') ? toNonNegativeNumber(params.get('formationSpeed')) : undefined,\n    fireIntervalMs: params.has('fireIntervalMs')\n      ? toNonNegativeNumber(params.get('fireIntervalMs'))\n      : undefined,\n  };\n}\n\nfunction buildSprites(spriteSheet) {\n  const image = spriteSheet?.image ?? spriteSheet;\n  const frames = {};\n  const sprites = { image, frames };\n\n  for (const [name, frame] of Object.entries(SPRITES)) {\n    frames[name] = frame;\n    sprites[name] = { image, frame };\n  }\n\n  return sprites;\n}\n\nfunction defaultShowUpdateBanner(sha) {\n  try {\n    const doc = globalThis.document;\n    if (!doc || typeof doc.createElement !== 'function' || !doc.body) {\n      return;\n    }\n    const el = doc.createElement('div');\n    el.textContent = `updated to ${sha || 'new version'}`;\n    el.setAttribute('role', 'status');\n    el.style.cssText = 'position:fixed;top:8px;left:50%;transform:translateX(-50%);'\n      + 'z-index:9999;background:#12a7a0;color:#061525;font:14px monospace;'\n      + 'padding:6px 12px;border-radius:6px;box-shadow:0 0 12px rgb(18 167 160 / 50%)';\n    doc.body.appendChild(el);\n    setTimeout(() => {\n      try { el.remove(); } catch { /* already gone */ }\n    }, 4000);\n  } catch {\n    // The update banner is a best-effort courtesy; never let it break boot.\n  }\n}\n\nexport const __forTesting = { defaultShowUpdateBanner };\n\nexport async function bootstrap(opts = {}) {\n  const {\n    canvas = globalThis.document?.getElementById('game-canvas'),\n    window: win = globalThis.window,\n    location = globalThis.location,\n    navigator: nav = globalThis.navigator,\n    spritesUrl = './public/sprites.png',\n    loadSprites = ({ url, imageFactory: factory }) => loadSpriteSheet(url, { imageFactory: factory }),\n    storage,\n    getMode = defaultGetMode,\n    setMode = defaultSetMode,\n    registerServiceWorker,\n    showUpdateBanner = defaultShowUpdateBanner,\n    seed,\n    startWave,\n    formationSpeed,\n    fireIntervalMs,\n    apiClient = (() => {\n      try {\n        return createApiClient();\n      } catch {\n        return null;\n      }\n    })(),\n    createRendererFn = createRenderer,\n    createInputFn = createInput,\n    createSceneStackFn = createSceneStack,\n    createLoopFn = createLoop,\n    createMenuSceneFn = createMenuScene,\n    createPlaySceneFn = createPlayScene,\n    createDailySceneFn = createDailyScene,\n    createDailyMenuOptionFn = createDailyMenuOption,\n    createGameOverSceneFn = createGameOverScene,\n    createLeaderboardSceneFn = createLeaderboardScene,\n    createPlayerFn = createPlayer,\n    createFormationFn = createFormation,\n    createRngFn = createRng,\n    fetchFlagsFn = defaultFetchFlags,\n    now = () => new Date(),\n    imageFactory,\n  } = opts;\n  const queryOptions = readQueryOptions(location);\n  // CS08-2: consume a `?mode=` deep-link ONCE as the initial mode and persist it,\n  // so the in-menu toggle can override it thereafter (getMode reads the stored\n  // mode, not the live URL).\n  const seededMode = readUrlMode({ url: location });\n  if (seededMode) {\n    setMode(seededMode, { storage });\n  }\n  let currentSeed = toSeed(seed ?? queryOptions.seed, 1);\n  const currentStartWave = toPositiveInt(startWave ?? queryOptions.startWave, 1);\n  const currentFormationSpeed = toNonNegativeNumber(formationSpeed ?? queryOptions.formationSpeed);\n  const currentFireIntervalMs = toNonNegativeNumber(fireIntervalMs ?? queryOptions.fireIntervalMs);\n\n  if (!canvas) {\n    throw new Error('bootstrap: canvas is required');\n  }\n\n  const renderer = createRendererFn({\n    canvas,\n    logicalWidth: CANVAS.width,\n    logicalHeight: CANVAS.height,\n  });\n  const input = createInputFn();\n  input.attach(win);\n\n  const spriteSheet = await loadSprites({ url: spritesUrl, imageFactory });\n  const sprites = buildSprites(spriteSheet);\n  const scenes = createSceneStackFn();\n\n  const flags = await Promise.resolve(fetchFlagsFn({})).catch(() => ({}));\n  const dailyEnabled = isDailyChallengeEnabled(flags);\n\n  const readHighScore = () => getHighScoreFor(getMode(), { storage });\n  const writeHighScore = (value) => setHighScoreFor(getMode(), value, { storage });\n\n  function currentUtcDate() {\n    const date = now();\n    const iso = date instanceof Date ? date.toISOString() : new Date(date).toISOString();\n    return iso.slice(0, 10);\n  }\n\n  // CS04 PvI R1 fix (PVI-CS04-004): track which leaderboard period to show\n  // when the user navigates to leaderboard from the menu vs from a daily run.\n  // Cleared when a normal game starts; set when a daily game starts.\n  let lastLeaderboardContext = { period: 'all', date: null };\n\n  function createMenu() {\n    const dailyOption = createDailyMenuOptionFn({ flags, onDaily: dailyEnabled ? startDaily : undefined, getMode });\n    const modeOption = createModeMenuOption({ getMode, setMode });\n    return createMenuSceneFn({\n      onStart: startPlay,\n      onLeaderboard: apiClient ? showLeaderboard : undefined,\n      getHighScore: readHighScore,\n      dailyOption,\n      modeOption,\n    });\n  }\n\n  function maybeRegisterServiceWorker() {\n    try {\n      const search = String(location?.search ?? '');\n      if (/[?&]nosw=1\\b/.test(search)) return;\n      const host = String(location?.hostname ?? '');\n      if (host === 'localhost' || host === '127.0.0.1' || host === '') return;\n      const sw = nav?.serviceWorker;\n      const reg = registerServiceWorker ?? sw?.register?.bind(sw);\n      if (typeof reg !== 'function') return;\n      // CS08-11: on a genuine update (a controller was already active) show a\n      // one-time \"updated to <sha>\" notice; a first-ever install shows nothing\n      // (CS08-12 \u2014 SW is a progressive enhancement).\n      if (sw && typeof sw.addEventListener === 'function') {\n        const hadController = Boolean(sw.controller);\n        let notified = false;\n        sw.addEventListener('controllerchange', () => {\n          if (notified || !hadController) return;\n          notified = true;\n          let sha = '';\n          try {\n            sha = globalThis.document?.querySelector?.('meta[name=\"build-sha\"]')?.content ?? '';\n          } catch { sha = ''; }\n          showUpdateBanner(sha);\n        });\n      }\n      // sw.mjs is an ES module (it uses `export`), so it MUST be registered as a\n      // module worker or the browser fails to parse it as a classic script.\n      Promise.resolve(reg('/sw.mjs', { type: 'module' })).catch(() => {});\n    } catch {\n      // Service Worker registration is a progressive enhancement; boot must not depend on it.\n    }\n  }\n\n  async function drainPendingOnLoad() {\n    try {\n      if (nav && nav.onLine === false) return;\n      if (!apiClient || typeof apiClient.submitScore !== 'function') return;\n      // Queued scores are always RANKED (practice never enqueues), so submit them\n      // as ranked even if the player is currently in practice mode; otherwise the\n      // mode-aware submitScore would no-op and the drain would silently drop them.\n      await drainPendingScores((entry) => apiClient.submitScore(entry, { bypassPracticeSkip: true }), { storage });\n    } catch {\n      // Pending-score drain is best-effort; the queue remains for the next online load.\n    }\n  }\n\n  function createConfiguredFormation(options = {}) {\n    return createFormationFn({\n      ...options,\n      ...(currentFormationSpeed === undefined ? {} : { baseSpeed: currentFormationSpeed }),\n      ...(currentFireIntervalMs === undefined ? {} : { fireIntervalMs: currentFireIntervalMs }),\n    });\n  }\n\n  function playSceneDeps() {\n    return {\n      createPlayer: createPlayerFn,\n      createFormation: createConfiguredFormation,\n      createRng: createRngFn,\n      loadSprites: () => sprites,\n      getHighScore: readHighScore,\n      setHighScore: writeHighScore,\n      onGameOver: showGameOver,\n      apiClient,\n      startWave: currentStartWave,\n      formationSpeed: currentFormationSpeed,\n    };\n  }\n\n  function createPlay() {\n    return createPlaySceneFn({\n      ...playSceneDeps(),\n      seed: currentSeed,\n    });\n  }\n\n  function createDaily(utcDate = currentUtcDate()) {\n    return createDailySceneFn({\n      ...playSceneDeps(),\n      utcDate,\n      createPlayScene: createPlaySceneFn,\n    });\n  }\n\n  function createGameOver(score, high) {\n    const scene = createGameOverSceneFn({\n      onRestart: startPlay,\n      onMenu: showMenu,\n      onLeaderboard: apiClient ? showLeaderboard : undefined,\n      score,\n      high,\n    });\n\n    if (typeof scene?.enter === 'function') {\n      const originalEnter = scene.enter;\n      const initialState = { score, high };\n      scene.enter = (state = initialState) => originalEnter.call(scene, state);\n    }\n\n    return scene;\n  }\n\n  function createLeaderboard() {\n    return createLeaderboardSceneFn({\n      apiClient,\n      onRestart: startPlay,\n      onMenu: showMenu,\n      period: lastLeaderboardContext.period,\n      ...(lastLeaderboardContext.date ? { date: lastLeaderboardContext.date } : {}),\n    });\n  }\n\n  function startPlay() {\n    lastLeaderboardContext = { period: 'all', date: null };\n    scenes.replace(createPlay());\n  }\n\n  function startDaily() {\n    setMode('ranked', { storage });\n    const utcDate = currentUtcDate();\n    lastLeaderboardContext = { period: 'daily', date: utcDate };\n    scenes.replace(createDaily(utcDate));\n  }\n\n  function showMenu() {\n    scenes.replace(createMenu());\n  }\n\n  function showLeaderboard() {\n    scenes.replace(createLeaderboard());\n  }\n\n  function showGameOver(finalScore) {\n    const score = toScore(finalScore);\n    const storedHigh = toScore(readHighScore());\n    const high = Math.max(storedHigh, score);\n\n    if (score > storedHigh) {\n      writeHighScore(score);\n    }\n\n    scenes.replace(createGameOver(score, high));\n  }\n\n  function setSeed(nextSeed) {\n    currentSeed = toSeed(nextSeed, currentSeed);\n    startPlay();\n  }\n\n  scenes.push(createMenu());\n\n  const loop = createLoopFn({\n    update: (dt) => {\n      scenes.handleInput(input);\n      scenes.update(dt);\n    },\n    render: () => {\n      scenes.render(renderer);\n      input.endFrame();\n    },\n  });\n  loop.start();\n\n  const testHooks = installTestHooks({\n    window: win,\n    location,\n    scenes,\n    input,\n    loop,\n    getHighScore: readHighScore,\n    setHighScore: writeHighScore,\n    setSeed,\n    showGameOver,\n  });\n\n  drainPendingOnLoad();\n  maybeRegisterServiceWorker();\n\n  return { renderer, input, scenes, loop, sprites, testHooks };\n}\n\nif (typeof globalThis.document !== 'undefined') {\n  bootstrap().catch((err) => console.error('Sub Invaders bootstrap failed', err));\n}\n", "const defaultAabbOf = (entity) => ({\n  x: entity.x,\n  y: entity.y,\n  w: entity.w,\n  h: entity.h,\n});\n\nconst isCollisionCandidate = (entity) => entity?.alive !== false;\n\n/**\n * Test whether two axis-aligned bounding boxes overlap.\n *\n * AABBs use closed intervals: touching edges or corners count as overlap.\n *\n * @param {{x: number, y: number, w: number, h: number}} a - First AABB (x/y top-left, w/h size).\n * @param {{x: number, y: number, w: number, h: number}} b - Second AABB.\n * @returns {boolean} True when the boxes intersect or touch.\n */\nexport const aabbOverlap = (a, b) => (\n  a.x <= b.x + b.w\n  && a.x + a.w >= b.x\n  && a.y <= b.y + b.h\n  && a.y + a.h >= b.y\n);\n\n/**\n * Collect every overlapping pair between two groups of entities.\n *\n * Entities whose `alive` field is strictly `false` are skipped.\n *\n * @param {Iterable<object>} groupA - First group of entities (nullish treated as empty).\n * @param {Iterable<object>} groupB - Second group of entities (nullish treated as empty).\n * @param {object} [opts] - Options.\n * @param {(entity: object) => {x: number, y: number, w: number, h: number}} [opts.aabbOf] - Maps an entity to its AABB; defaults to reading `x`/`y`/`w`/`h`.\n * @returns {Array<{a: object, b: object}>} One `{ a, b }` record per overlapping pair.\n */\nexport const groupCollisions = (groupA, groupB, opts = {}) => {\n  const { aabbOf = defaultAabbOf } = opts ?? {};\n  const pairs = [];\n\n  for (const a of groupA ?? []) {\n    if (!isCollisionCandidate(a)) {\n      continue;\n    }\n\n    const aAabb = aabbOf(a);\n\n    for (const b of groupB ?? []) {\n      if (!isCollisionCandidate(b)) {\n        continue;\n      }\n\n      if (aabbOverlap(aAabb, aabbOf(b))) {\n        pairs.push({ a, b });\n      }\n    }\n  }\n\n  return pairs;\n};\n", "import { CANVAS, PALETTE, SPRITES } from './constants.mjs';\n\nconst numberOrZero = (value) => (Number.isFinite(Number(value)) ? Number(value) : 0);\nconst nonNegativeInt = (value) => Math.max(0, Math.floor(numberOrZero(value)));\nconst positiveInt = (value) => Math.max(1, Math.floor(numberOrZero(value)));\n\nconst rendererWidth = (renderer) => (\n  typeof renderer?.width === 'function' ? renderer.width() : CANVAS.width\n);\n\nconst lifeIconFrame = (sprites) => {\n  const candidate = sprites?.lifeIcon;\n  return candidate && Number.isFinite(candidate.x) ? candidate : SPRITES.lifeIcon;\n};\n\nconst lifeIconImage = (sprites) => (\n  sprites?.lifeIcon?.image ?? sprites?.image ?? sprites?.lifeIcon ?? {}\n);\n\nexport function createHud(opts = {}) {\n  const font = opts.font ?? '16px monospace';\n  const fill = opts.fill ?? PALETTE.ui;\n  const padding = opts.padding ?? 16;\n  const lifeIconSpacing = opts.lifeIconSpacing ?? 4;\n\n  let score = 0;\n  let high = 0;\n  let lives = 0;\n  let wave = 1;\n\n  const api = {\n    setScore(nextScore) {\n      score = nonNegativeInt(nextScore);\n      return api;\n    },\n\n    setHigh(nextHigh) {\n      high = nonNegativeInt(nextHigh);\n      return api;\n    },\n\n    setLives(nextLives) {\n      lives = nonNegativeInt(nextLives);\n      return api;\n    },\n\n    setWave(nextWave) {\n      wave = positiveInt(nextWave);\n      return api;\n    },\n\n    render(renderer, sprites = {}) {\n      const width = rendererWidth(renderer);\n      const scoreY = padding;\n      const livesY = scoreY + 24;\n      const textOpts = { font, fill, align: 'left', baseline: 'top' };\n\n      renderer.drawText(`SCORE  ${score}`, padding, scoreY, textOpts);\n      renderer.drawText(`HIGH  ${high}`, width / 2, scoreY, {\n        ...textOpts,\n        align: 'center',\n      });\n      renderer.drawText(`WAVE  ${wave}`, width - padding, scoreY, {\n        ...textOpts,\n        align: 'right',\n      });\n      renderer.drawText('LIVES', padding, livesY, textOpts);\n\n      const frame = lifeIconFrame(sprites);\n      const image = lifeIconImage(sprites);\n      const iconStartX = padding + 56;\n\n      for (let index = 0; index < lives; index += 1) {\n        renderer.drawSprite(\n          image,\n          frame.x,\n          frame.y,\n          frame.w,\n          frame.h,\n          iconStartX + index * (frame.w + lifeIconSpacing),\n          livesY + 4,\n          frame.w,\n          frame.h,\n        );\n      }\n\n      return api;\n    },\n  };\n\n  return api;\n}\n", "import { CANVAS, PALETTE } from './constants.mjs';\n\nconst MAX_MODIFIER_NAME_LENGTH = 24;\nconst DEFAULT_PADDING = 16;\nconst DEFAULT_LINE_HEIGHT = 20;\nconst DEFAULT_FONT = '16px monospace';\n\nconst rendererWidth = (renderer) => (\n  typeof renderer?.width === 'function' ? renderer.width() : CANVAS.width\n);\n\nconst finiteNumberOr = (value, fallback) => (\n  Number.isFinite(Number(value)) ? Number(value) : fallback\n);\n\nconst truncateModifierName = (modifierName) => (\n  String(modifierName ?? '').slice(0, MAX_MODIFIER_NAME_LENGTH)\n);\n\nexport function createDailyHudOverlay({ daily = null, hudConfig = {} } = {}) {\n  return {\n    render(renderer) {\n      if (!daily) {\n        return;\n      }\n\n      const padding = finiteNumberOr(hudConfig.padding, DEFAULT_PADDING);\n      const lineHeight = finiteNumberOr(hudConfig.lineHeight, DEFAULT_LINE_HEIGHT);\n      const waveCounterY = finiteNumberOr(hudConfig.waveCounterY, padding);\n      const x = finiteNumberOr(hudConfig.dailyBadgeX, rendererWidth(renderer) - padding);\n      const y = finiteNumberOr(hudConfig.dailyBadgeY, waveCounterY + lineHeight);\n      const modifierName = truncateModifierName(daily.modifierName);\n\n      renderer.drawText(`DAILY \u00B7 ${daily.utcDate} \u00B7 ${modifierName}`, x, y, {\n        font: hudConfig.font ?? DEFAULT_FONT,\n        fill: hudConfig.fill ?? PALETTE.ui,\n        align: hudConfig.align ?? 'right',\n        baseline: hudConfig.baseline ?? 'top',\n      });\n    },\n  };\n}\n", "const DEFAULT_PADDING = 16;\nconst DEFAULT_BADGE_Y = 64;\nconst DEFAULT_FONT = '16px monospace';\nconst RANKED_FILL = '#ffd23f';\nconst PRACTICE_FILL = '#22d3ee';\n\nconst finiteNumberOr = (value, fallback) => (\n  Number.isFinite(Number(value)) ? Number(value) : fallback\n);\n\nconst normalizedMode = (mode) => (mode === 'practice' ? 'practice' : 'ranked');\n\nexport function createModeBadgeOverlay({ getMode, hudConfig = {} } = {}) {\n  return {\n    render(renderer) {\n      const mode = normalizedMode(getMode?.());\n      const x = finiteNumberOr(hudConfig.padding, DEFAULT_PADDING);\n      const y = finiteNumberOr(hudConfig.badgeY, DEFAULT_BADGE_Y);\n\n      renderer.drawText(mode === 'practice' ? 'PRACTICE' : 'RANKED', x, y, {\n        font: hudConfig.font ?? DEFAULT_FONT,\n        fill: mode === 'practice' ? PRACTICE_FILL : RANKED_FILL,\n        align: 'left',\n        baseline: 'top',\n      });\n    },\n  };\n}\n", "// CS04 D2 \u2014 boss-rush modifier.\n// Sets state.scoreMultiplier x2 and state.enemyFireDensityMultiplier x2 (both\n// honored by play.mjs integration). Also stores onlyEnemyType: 'squid' and\n// respawnImmediately: true on state.modifiers.bossRush \u2014 these are reserved\n// for v1.1+ formation-factory cooperation; in v1.0 they are NOT honored\n// (see CHANGELOG SI-CS04 \"Known sub-limitations\").\n\nexport const NAME = 'boss-rush';\n\nexport const BOSS_RUSH_SCORE_MULTIPLIER = 2;\nexport const BOSS_RUSH_FIRE_DENSITY_MULTIPLIER = 2;\n\nexport function apply(state) {\n  state.modifiers ??= {};\n  state.modifiers.bossRush = {\n    enabled: true,\n    onlyEnemyType: 'squid',\n    respawnImmediately: true,\n  };\n  state.scoreMultiplier = (state.scoreMultiplier ?? 1) * BOSS_RUSH_SCORE_MULTIPLIER;\n  state.enemyFireDensityMultiplier =\n    (state.enemyFireDensityMultiplier ?? 1) * BOSS_RUSH_FIRE_DENSITY_MULTIPLIER;\n  return state;\n}\n", "// CS04 D2 \u2014 fog-of-war modifier.\n// Limits visibility to a circular halo around the player. The halo is rendered\n// as a darkened canvas pass with a circular punch-out at the player position.\n// This module is a pure scene-init mutator + an overlay renderer; integration\n// row 10 wires it into play.mjs's render pipeline.\n\nexport const NAME = 'fog-of-war';\n\nexport const DEFAULT_HALO_RADIUS = 96;\n\nexport function apply(state, { haloRadius = DEFAULT_HALO_RADIUS } = {}) {\n  state.modifiers ??= {};\n  state.modifiers.fogOfWar = { enabled: true, haloRadius };\n  return state;\n}\n\nexport function renderOverlay(renderer, { player, canvasWidth, canvasHeight, haloRadius = DEFAULT_HALO_RADIUS } = {}) {\n  if (!renderer || !player) return;\n  const ctx = typeof renderer.ctx === 'function' ? renderer.ctx() : renderer.ctx;\n  if (!ctx || typeof ctx.save !== 'function') return;\n  const px = player.x + (player.w ?? 0) / 2;\n  const py = player.y + (player.h ?? 0) / 2;\n\n  ctx.save();\n  ctx.fillStyle = 'rgba(0, 0, 0, 0.92)';\n  ctx.beginPath();\n  ctx.rect(0, 0, canvasWidth, canvasHeight);\n  ctx.arc(px, py, haloRadius, 0, Math.PI * 2, true);\n  ctx.fill('evenodd');\n  ctx.restore();\n}\n", "// CS04 D2 \u2014 inverted-controls modifier.\n// Left arrow moves right and right arrow moves left for the whole run.\n// Pure scene-init mutator that flips the input remap; integration row 10\n// reads state.invertHorizontalControls in play.mjs's input handler.\n\nexport const NAME = 'inverted-controls';\n\nexport function apply(state) {\n  state.modifiers ??= {};\n  state.modifiers.invertedControls = { enabled: true };\n  state.invertHorizontalControls = true;\n  return state;\n}\n\n// Pure remap helper that tests + integration row 10 can reuse.\nexport function remapHorizontalCode(code) {\n  if (code === 'ArrowLeft') return 'ArrowRight';\n  if (code === 'ArrowRight') return 'ArrowLeft';\n  if (code === 'KeyA') return 'KeyD';\n  if (code === 'KeyD') return 'KeyA';\n  return code;\n}\n", "// CS04 D2 \u2014 one-shot modifier.\n// Single life only; starting `lives` is reset to 1.\n// Pure scene-init mutator.\n\nexport const NAME = 'one-shot';\n\nexport const ONE_SHOT_LIVES = 1;\n\nexport function apply(state) {\n  state.modifiers ??= {};\n  state.modifiers.oneShot = { enabled: true };\n  state.startingLives = ONE_SHOT_LIVES;\n  return state;\n}\n", "// CS04 D2 \u2014 speed-run modifier.\n// Sets state.playerSpeedMultiplier x2 and state.formationSpeedMultiplier x2\n// (both honored by play.mjs integration). Also sets state.fireRateMultiplier\n// x2 \u2014 this is reserved for v1.1+ player-factory cooperation; in v1.0 it is\n// NOT honored because the player factory only accepts an absolute\n// fireCooldownMs (see CHANGELOG SI-CS04 \"Known sub-limitations\").\n// Pure scene-init mutator; integration row 10 reads the multipliers in play.mjs.\n\nexport const NAME = 'speed-run';\n\nexport const SPEED_MULTIPLIER = 2;\n\nexport function apply(state) {\n  state.modifiers ??= {};\n  state.modifiers.speedRun = { enabled: true };\n  state.playerSpeedMultiplier = (state.playerSpeedMultiplier ?? 1) * SPEED_MULTIPLIER;\n  state.formationSpeedMultiplier = (state.formationSpeedMultiplier ?? 1) * SPEED_MULTIPLIER;\n  state.fireRateMultiplier = (state.fireRateMultiplier ?? 1) * SPEED_MULTIPLIER;\n  return state;\n}\n", "export const PENDING_SCORES_KEY = 'subInvadersPendingScores';\nexport const CAP = 20;\n\nfunction resolveStorage(storage) {\n  if (storage !== undefined) {\n    return storage;\n  }\n\n  try {\n    return globalThis.localStorage;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction normalizeEntry(entry, now) {\n  if (!entry || typeof entry !== 'object') {\n    return undefined;\n  }\n\n  const { sessionId, finishedAt } = entry;\n  const score = Number(entry.score);\n  const queuedAt = entry.queuedAt === undefined ? now() : Number(entry.queuedAt);\n  const invalid =\n    typeof sessionId !== 'string' ||\n    sessionId.trim() === '' ||\n    !Number.isInteger(score) ||\n    score < 0 ||\n    typeof finishedAt !== 'string' ||\n    finishedAt.trim() === '' ||\n    !Number.isFinite(queuedAt) ||\n    queuedAt < 0;\n\n  if (invalid) {\n    return undefined;\n  }\n\n  return { sessionId, score, finishedAt, queuedAt: Math.floor(queuedAt) };\n}\n\nfunction isPendingEntry(entry) {\n  return entry?.queuedAt !== undefined && normalizeEntry(entry, Date.now) !== undefined;\n}\n\nfunction save(queue, { storage } = {}) {\n  try {\n    const target = resolveStorage(storage);\n\n    if (target && typeof target.setItem === 'function') {\n      target.setItem(PENDING_SCORES_KEY, JSON.stringify(queue));\n    }\n  } catch {\n    // Pending-score persistence is best-effort; gameplay must not fail on storage errors.\n  }\n}\n\nexport function read(opts = {}) {\n  try {\n    const target = resolveStorage(opts.storage);\n    if (!target || typeof target.getItem !== 'function') {\n      return [];\n    }\n\n    const value = target.getItem(PENDING_SCORES_KEY);\n    if (value === null || value === undefined || value === '') {\n      return [];\n    }\n\n    const parsed = JSON.parse(value);\n    if (!Array.isArray(parsed) || !parsed.every(isPendingEntry)) {\n      save([], opts);\n      return [];\n    }\n\n    return parsed.map((entry) => ({ ...entry }));\n  } catch {\n    save([], opts);\n    return [];\n  }\n}\n\nexport function peek(opts = {}) {\n  return read(opts).map((entry) => ({ ...entry }));\n}\n\nexport function enqueue(entry, opts = {}) {\n  const now = typeof opts.now === 'function' ? opts.now : Date.now;\n  const queue = read(opts);\n  const normalized = normalizeEntry(entry, now);\n  if (normalized === undefined) {\n    return queue.length;\n  }\n\n  queue.push(normalized);\n  while (queue.length > CAP) {\n    queue.shift();\n  }\n\n  save(queue, opts);\n  return queue.length;\n}\n\nfunction isPermanentlyDead(error) {\n  return (\n    (error?.status === 409 && error?.code === 'session-consumed') ||\n    (error?.status === 400 && error?.code === 'expired')\n  );\n}\n\nfunction droppedNote(entry, error) {\n  const reason = error.code === 'session-consumed' ? 'already submitted' : 'expired';\n  return `Ranked score ${entry.score} for session ${entry.sessionId} was dropped: ${reason}.`;\n}\n\nexport async function drain(submitFn, opts = {}) {\n  const queue = read(opts);\n  const remaining = [];\n  const notes = [];\n  let submitted = 0;\n  let dropped = 0;\n  let stopped = false;\n\n  for (const entry of queue) {\n    if (stopped) {\n      remaining.push(entry);\n      continue;\n    }\n\n    try {\n      await submitFn(entry);\n      submitted += 1;\n    } catch (error) {\n      if (isPermanentlyDead(error)) {\n        dropped += 1;\n        notes.push(droppedNote(entry, error));\n        continue;\n      }\n\n      stopped = true;\n      remaining.push(entry);\n    }\n  }\n\n  save(remaining, opts);\n  return { submitted, dropped, remaining: remaining.length, notes };\n}\n", "import { aabbOverlap } from 'canvas-game-engine/collision.mjs';\nimport { Entity } from 'canvas-game-engine/entity.mjs';\n\nconst DEFAULT_CANVAS_WIDTH = 800;\nconst DEFAULT_CANVAS_HEIGHT = 600;\nconst DEFAULT_SPEED = 80;\nconst DEFAULT_WIDTH = 72;\nconst DEFAULT_HEIGHT = 24;\nconst DEFAULT_NORMAL_MIN_MS = 15000;\nconst DEFAULT_NORMAL_MAX_MS = 30000;\nconst DEFAULT_DAILY_INTERVAL_MS = 15000;\nconst SCORE_VALUES = Object.freeze([50, 100, 200]);\nconst FILL = '#6fe7ff';\nconst STROKE = '#dffbff';\n\n// The mystery enemy spawns at a fixed y position derived from Y_BAND: the\n// midpoint of the band clamped to the canvas (default canvas: spawn y=40).\n// Y_BAND is therefore a \"where in the top band can the spawn-y land if the\n// canvas changes\" range, not a per-spawn random pick. With DEFAULT_HEIGHT=24,\n// the rendered/collidable rectangle on the default canvas spans y=40..64.\n// The default formation (invaders.mjs DEFAULT_SPAWN_Y=64) places its top\n// row at y=64..88 on wave 1 (descends further on later waves), so the shark\n// and top invader row visually touch at y=64 on wave 1. This is acceptable\n// because the whale-shark and invaders do not exchange collisions (only\n// player torpedoes hit the whale-shark).\nconst Y_BAND = Object.freeze({ min: 32, max: 48 });\n\nconst finitePositive = (value, fallback) => {\n  const number = Number(value);\n  return Number.isFinite(number) && number > 0 ? number : fallback;\n};\n\nconst finiteNonNegative = (value, fallback = 0) => {\n  const number = Number(value);\n  return Number.isFinite(number) && number >= 0 ? number : fallback;\n};\n\nconst secondsOrZero = (dt) => finiteNonNegative(dt, 0);\n\nfunction randomInt(rng, min, max) {\n  if (typeof rng?.int === 'function') {\n    return Math.trunc(rng.int(min, max));\n  }\n\n  if (typeof rng?.range === 'function') {\n    return Math.floor(rng.range(min, max + 1));\n  }\n\n  const next = typeof rng?.next === 'function' ? rng.next() : Math.random();\n  const normalized = Math.min(0.999999999, Math.max(0, Number.isFinite(next) ? next : 0));\n  return Math.floor(normalized * (max - min + 1)) + min;\n}\n\nfunction randomIndex(rng, length) {\n  const raw = randomInt(rng, 0, length - 1);\n  return ((raw % length) + length) % length;\n}\n\nfunction aabbOf(entity) {\n  if (typeof entity?.aabb === 'function') {\n    return entity.aabb();\n  }\n\n  return {\n    x: entity?.x ?? 0,\n    y: entity?.y ?? 0,\n    w: entity?.w ?? 0,\n    h: entity?.h ?? 0,\n  };\n}\n\nfunction isLiveTorpedo(torpedo) {\n  return torpedo && torpedo.alive !== false && torpedo.consumed !== true;\n}\n\nfunction consumeTorpedo(torpedo) {\n  torpedo.consumed = true;\n\n  if (typeof torpedo.kill === 'function') {\n    torpedo.kill();\n    return;\n  }\n\n  torpedo.alive = false;\n}\n\nclass WhaleShark extends Entity {\n  constructor({ x, y, vx, w, h, direction, speed }) {\n    super({ x, y, vx, vy: 0, w, h });\n    this.direction = direction;\n    this.speed = speed;\n    this.sprite = 'whaleshark';\n  }\n\n  render(renderer) {\n    if (typeof renderer?.drawRect !== 'function') {\n      return false;\n    }\n\n    // Placeholder cyan silhouette until a whale-shark sprite is wired.\n    renderer.drawRect(this.x, this.y, this.w, this.h, FILL, STROKE);\n    return true;\n  }\n}\n\nexport function createWhaleShark({\n  rng,\n  canvasWidth = DEFAULT_CANVAS_WIDTH,\n  canvasHeight = DEFAULT_CANVAS_HEIGHT,\n  spawnIntervalMs,\n  dailyMode = false,\n} = {}) {\n  const width = finitePositive(canvasWidth, DEFAULT_CANVAS_WIDTH);\n  const height = finitePositive(canvasHeight, DEFAULT_CANVAS_HEIGHT);\n  const maxY = Math.max(0, height - DEFAULT_HEIGHT);\n  const spawnY = Math.round((Math.min(Y_BAND.min, maxY) + Math.min(Y_BAND.max, maxY)) / 2);\n  const state = {\n    active: false,\n    shark: null,\n    spawnTimerMs: 0,\n    spawnIntervalMs: 0,\n    nextSpawnAtMs: null,\n    lastSpawnAtMs: null,\n    dailyMode: Boolean(dailyMode),\n  };\n  let nextEdge = 'left';\n\n  function nextIntervalMs() {\n    if (state.dailyMode) {\n      return finiteNonNegative(spawnIntervalMs, DEFAULT_DAILY_INTERVAL_MS);\n    }\n\n    return finiteNonNegative(randomInt(rng, DEFAULT_NORMAL_MIN_MS, DEFAULT_NORMAL_MAX_MS), DEFAULT_NORMAL_MIN_MS);\n  }\n\n  function scheduleNextSpawn(now) {\n    const delay = nextIntervalMs();\n    state.spawnIntervalMs = delay;\n    state.spawnTimerMs = delay;\n    state.nextSpawnAtMs = Number.isFinite(now) ? now + delay : null;\n    return delay;\n  }\n\n  function spawn(now) {\n    if (state.active) {\n      return state.shark;\n    }\n\n    const direction = nextEdge === 'left' ? 1 : -1;\n    const x = direction > 0 ? -DEFAULT_WIDTH : width;\n    const shark = new WhaleShark({\n      x,\n      y: spawnY,\n      vx: direction * DEFAULT_SPEED,\n      w: DEFAULT_WIDTH,\n      h: DEFAULT_HEIGHT,\n      direction,\n      speed: DEFAULT_SPEED,\n    });\n\n    state.active = true;\n    state.shark = shark;\n    state.spawnTimerMs = 0;\n    state.nextSpawnAtMs = null;\n    state.lastSpawnAtMs = Number.isFinite(now) ? now : null;\n    nextEdge = direction > 0 ? 'right' : 'left';\n    return shark;\n  }\n\n  function despawn({ resetTimer = true, now } = {}) {\n    if (state.shark) {\n      state.shark.kill();\n    }\n\n    state.active = false;\n    state.shark = null;\n    state.lastSpawnAtMs = null;\n\n    if (resetTimer) {\n      scheduleNextSpawn(now);\n    } else {\n      state.spawnTimerMs = 0;\n      state.nextSpawnAtMs = null;\n    }\n\n    return state;\n  }\n\n  function isOffscreen(shark) {\n    return shark.direction > 0 ? shark.x > width : shark.x + shark.w < 0;\n  }\n\n  function maybeSpawn(now) {\n    if (state.active) {\n      return state.shark;\n    }\n\n    if (Number.isFinite(now)) {\n      if (state.nextSpawnAtMs === null) {\n        state.nextSpawnAtMs = now + Math.max(0, state.spawnTimerMs);\n      }\n\n      const remaining = state.nextSpawnAtMs - now;\n      if (remaining > 0) {\n        state.spawnTimerMs = remaining;\n        return null;\n      }\n\n      return spawn(now);\n    }\n\n    return state.spawnTimerMs <= 0 ? spawn() : null;\n  }\n\n  function update(dt) {\n    const seconds = secondsOrZero(dt);\n\n    if (state.active) {\n      state.shark.update(seconds);\n\n      if (isOffscreen(state.shark)) {\n        despawn();\n      }\n\n      return state;\n    }\n\n    state.nextSpawnAtMs = null;\n    state.spawnTimerMs = Math.max(0, state.spawnTimerMs - (seconds * 1000));\n    maybeSpawn();\n    return state;\n  }\n\n  function render(renderer) {\n    if (!state.active) {\n      return false;\n    }\n\n    return state.shark.render(renderer);\n  }\n\n  function checkHit(torpedoes) {\n    if (!state.active) {\n      return { hit: false };\n    }\n\n    for (const torpedo of torpedoes ?? []) {\n      if (!isLiveTorpedo(torpedo)) {\n        continue;\n      }\n\n      if (aabbOverlap(state.shark.aabb(), aabbOf(torpedo))) {\n        consumeTorpedo(torpedo);\n        const points = SCORE_VALUES[randomIndex(rng, SCORE_VALUES.length)];\n        despawn();\n        return { hit: true, points };\n      }\n    }\n\n    return { hit: false };\n  }\n\n  function reset() {\n    if (state.shark) {\n      state.shark.kill();\n    }\n\n    state.active = false;\n    state.shark = null;\n    state.lastSpawnAtMs = null;\n    state.nextSpawnAtMs = null;\n    nextEdge = 'left';\n    scheduleNextSpawn();\n    return state;\n  }\n\n  scheduleNextSpawn();\n\n  return {\n    update,\n    render,\n    checkHit,\n    maybeSpawn,\n    state,\n    reset,\n    __forTesting: Object.freeze({\n      constants: Object.freeze({\n        speed: DEFAULT_SPEED,\n        width: DEFAULT_WIDTH,\n        height: DEFAULT_HEIGHT,\n        yBand: Y_BAND,\n        normalMinMs: DEFAULT_NORMAL_MIN_MS,\n        normalMaxMs: DEFAULT_NORMAL_MAX_MS,\n        scoreValues: SCORE_VALUES,\n      }),\n      forceSpawn: spawn,\n      despawn,\n    }),\n  };\n}\n", "import { groupCollisions } from 'canvas-game-engine/collision.mjs';\nimport { createRng as defaultCreateRng } from 'canvas-game-engine/seed.mjs';\nimport {\n  CANVAS,\n  ENEMY_SHOT,\n  ENEMY_TYPES,\n  FORMATION,\n  PALETTE,\n  PLAYER,\n  SCORING,\n  SPRITES,\n  TORPEDO,\n} from '../constants.mjs';\nimport { createHud } from '../hud.mjs';\nimport { createDailyHudOverlay as defaultCreateDailyHudOverlay } from '../hud-daily.mjs';\nimport { createModeBadgeOverlay as defaultCreateModeBadgeOverlay } from '../hud-mode.mjs';\nimport { getMode as defaultGetMode } from '../mode.mjs';\nimport * as bossRush from '../modifiers/boss-rush.mjs';\nimport * as fogOfWar from '../modifiers/fog-of-war.mjs';\nimport * as invertedControls from '../modifiers/inverted-controls.mjs';\nimport * as oneShot from '../modifiers/one-shot.mjs';\nimport * as speedRun from '../modifiers/speed-run.mjs';\nimport { enqueue as defaultEnqueue } from '../pending-scores.mjs';\nimport { createWhaleShark as defaultCreateWhaleShark } from '../whaleshark.mjs';\n\nconst MODIFIER_REGISTRY = Object.freeze({\n  [bossRush.NAME]: bossRush,\n  [fogOfWar.NAME]: fogOfWar,\n  [invertedControls.NAME]: invertedControls,\n  [oneShot.NAME]: oneShot,\n  [speedRun.NAME]: speedRun,\n});\n\nfunction resolveModifier(daily) {\n  if (!daily?.modifierName) return null;\n  return MODIFIER_REGISTRY[daily.modifierName] ?? null;\n}\n\nfunction resolveModifierState(daily) {\n  const modifier = resolveModifier(daily);\n  if (!modifier) return null;\n  const state = {};\n  modifier.apply(state);\n  return state;\n}\n\nfunction makeInvertedInput(input) {\n  if (!input) return input;\n  const remap = invertedControls.remapHorizontalCode;\n  return {\n    pressed: (code) => input.pressed?.(remap(code)),\n    down: (code) => input.down?.(remap(code)),\n  };\n}\n\nconst noop = () => {};\nconst isThenable = (value) => value && typeof value.then === 'function';\nconst asScore = (value) => Math.max(0, Math.floor(Number(value) || 0));\nconst asStartWave = (value) => {\n  const wave = Number(value);\n  return Number.isFinite(wave) && wave >= 1 ? Math.floor(wave) : 1;\n};\nconst isAlive = (entity) => entity?.alive !== false;\n\nlet defaultPlayerFactoryPromise;\nlet defaultFormationFactoryPromise;\n\nfunction defaultPlayerFactory() {\n  defaultPlayerFactoryPromise ??= import('../player.mjs').then((module) => {\n    if (typeof module.createPlayer !== 'function') {\n      throw new TypeError('player.mjs must export createPlayer');\n    }\n\n    return module.createPlayer;\n  });\n\n  return defaultPlayerFactoryPromise;\n}\n\nfunction defaultFormationFactory() {\n  defaultFormationFactoryPromise ??= import('../invaders.mjs').then((module) => {\n    if (typeof module.createFormation !== 'function') {\n      throw new TypeError('invaders.mjs must export createFormation');\n    }\n\n    return module.createFormation;\n  });\n\n  return defaultFormationFactoryPromise;\n}\n\nfunction callMaybe(fn, receiver, args = []) {\n  return typeof fn === 'function' ? fn.apply(receiver, args) : undefined;\n}\n\nfunction aabbOf(entity) {\n  if (typeof entity?.aabb === 'function') {\n    return entity.aabb();\n  }\n\n  const frame = SPRITES[entity?.sprite] ?? SPRITES.submarine;\n\n  return {\n    x: entity?.x ?? 0,\n    y: entity?.y ?? 0,\n    w: entity?.w ?? frame.w,\n    h: entity?.h ?? frame.h,\n  };\n}\n\nfunction entityX(entity) {\n  return aabbOf(entity).x;\n}\n\nfunction entityY(entity) {\n  return aabbOf(entity).y;\n}\n\nfunction entityW(entity, frame) {\n  return aabbOf(entity).w ?? frame.w;\n}\n\nfunction entityH(entity, frame) {\n  return aabbOf(entity).h ?? frame.h;\n}\n\nfunction kill(entity) {\n  if (typeof entity?.kill === 'function') {\n    entity.kill();\n    return;\n  }\n\n  if (entity) {\n    entity.alive = false;\n  }\n}\n\nfunction projectileList(value) {\n  if (value == null || value === false) {\n    return [];\n  }\n\n  return Array.isArray(value) ? value.filter(Boolean) : [value];\n}\n\nfunction addProjectiles(target, value) {\n  for (const projectile of projectileList(value)) {\n    target.push(projectile);\n  }\n}\n\nfunction updateProjectile(projectile, dt, defaultVy) {\n  if (typeof projectile?.update === 'function') {\n    projectile.update(dt);\n    return;\n  }\n\n  if (projectile) {\n    projectile.x = (projectile.x ?? 0) + (projectile.vx ?? 0) * dt;\n    projectile.y = (projectile.y ?? 0) + (projectile.vy ?? defaultVy) * dt;\n  }\n}\n\nfunction inBounds(projectile) {\n  const box = aabbOf(projectile);\n  return isAlive(projectile)\n    && box.y + box.h >= 0\n    && box.y <= CANVAS.height\n    && box.x + box.w >= 0\n    && box.x <= CANVAS.width;\n}\n\nfunction drawRect(renderer, rect) {\n  if (typeof renderer?.drawRect !== 'function') {\n    return;\n  }\n\n  if (renderer.drawRect.length <= 1) {\n    renderer.drawRect(rect);\n    return;\n  }\n\n  renderer.drawRect(rect.x, rect.y, rect.w, rect.h, rect.fill, rect.stroke);\n}\n\nfunction frameFor(sprites, key) {\n  const candidate = sprites?.[key];\n  return candidate && Number.isFinite(candidate.x) ? candidate : SPRITES[key];\n}\n\nfunction imageFor(sprites, key) {\n  return sprites?.[key]?.image ?? sprites?.image ?? sprites?.[key];\n}\n\nfunction drawEntity(renderer, sprites, entity, fallbackKey, fallbackFill) {\n  if (!isAlive(entity)) {\n    return;\n  }\n\n  if (typeof entity?.render === 'function') {\n    entity.render(renderer, sprites);\n    return;\n  }\n\n  const key = entity?.sprite ?? fallbackKey;\n  const frame = frameFor(sprites, key) ?? SPRITES[fallbackKey];\n  const x = entityX(entity);\n  const y = entityY(entity);\n  const w = entityW(entity, frame);\n  const h = entityH(entity, frame);\n  const image = imageFor(sprites, key);\n\n  if (image && typeof renderer?.drawSprite === 'function') {\n    renderer.drawSprite(image, frame.x, frame.y, frame.w, frame.h, x, y, w, h);\n    return;\n  }\n\n  drawRect(renderer, { x, y, w, h, fill: fallbackFill });\n}\n\nfunction playerLives(player) {\n  const value = callMaybe(player?.getLives, player) ?? player?.lives;\n  return Math.max(0, Math.floor(Number(value) || 0));\n}\n\nfunction playerIsDead(player) {\n  if (typeof player?.isDead === 'function') {\n    return Boolean(player.isDead());\n  }\n\n  return playerLives(player) <= 0;\n}\n\nfunction playerIsInvulnerable(player) {\n  if (typeof player?.isInvulnerable === 'function') {\n    return Boolean(player.isInvulnerable());\n  }\n\n  return Boolean(player?.invulnerable);\n}\n\nfunction damagePlayer(player) {\n  if (!player || playerIsInvulnerable(player)) {\n    return;\n  }\n\n  if (typeof player.hit === 'function') {\n    player.hit();\n  } else if (typeof player.loseLife === 'function') {\n    player.loseLife();\n  } else {\n    player.lives = Math.max(0, playerLives(player) - 1);\n  }\n\n  if (!playerIsDead(player)) {\n    callMaybe(player.respawn, player, [CANVAS, PLAYER]);\n  }\n}\n\nfunction formationInvaders(formation) {\n  if (typeof formation?.invaders === 'function') {\n    return formation.invaders();\n  }\n\n  if (typeof formation?.aliveInvaders === 'function') {\n    return formation.aliveInvaders();\n  }\n\n  if (Array.isArray(formation?.invaders)) {\n    return formation.invaders;\n  }\n\n  if (Array.isArray(formation?.entities)) {\n    return formation.entities;\n  }\n\n  if (Array.isArray(formation?.enemies)) {\n    return formation.enemies;\n  }\n\n  if (typeof formation?.enemies === 'function') {\n    return formation.enemies();\n  }\n\n  return [];\n}\n\nfunction formationAliveCount(formation) {\n  if (typeof formation?.aliveCount === 'function') {\n    return formation.aliveCount();\n  }\n\n  return formationInvaders(formation).filter(isAlive).length;\n}\n\nfunction formationCleared(formation) {\n  if (typeof formation?.isCleared === 'function') {\n    return Boolean(formation.isCleared());\n  }\n\n  const invaders = formationInvaders(formation);\n  return invaders.length > 0 && formationAliveCount(formation) === 0;\n}\n\nfunction formationLowestY(formation) {\n  if (typeof formation?.lowestY === 'function') {\n    return formation.lowestY();\n  }\n\n  return formationInvaders(formation).filter(isAlive).reduce((lowest, invader) => {\n    const box = aabbOf(invader);\n    return Math.max(lowest, box.y + box.h);\n  }, 0);\n}\n\nfunction invaderPoints(invader) {\n  const typeKey = invader?.type ?? invader?.kind ?? invader?.sprite;\n  const typeConfig = typeof typeKey === 'string' ? ENEMY_TYPES[typeKey] : typeKey;\n  return asScore(invader?.points ?? typeConfig?.points);\n}\n\nfunction fireRequested(input) {\n  if (!input) {\n    return true;\n  }\n\n  return Boolean(\n    input.pressed?.('Space')\n    || input.pressed?.('KeyW')\n    || input.pressed?.('ArrowUp')\n    || input.down?.('Space')\n    || input.down?.('KeyW')\n    || input.down?.('ArrowUp'),\n  );\n}\n\nfunction resolveOrReject(valueFactory) {\n  try {\n    return valueFactory();\n  } catch (error) {\n    return Promise.reject(error);\n  }\n}\n\nexport function createPlayScene(opts = {}) {\n  const getHighScore = opts.getHighScore ?? (() => 0);\n  const setHighScore = opts.setHighScore ?? noop;\n  const onGameOver = opts.onGameOver ?? noop;\n  const loadSprites = opts.loadSprites ?? (() => ({}));\n  const startWave = asStartWave(opts.startWave);\n  const hud = createHud(opts.hud ?? {});\n  const apiClient = opts.apiClient ?? null;\n  const now = typeof opts.now === 'function' ? opts.now : () => new Date();\n  const getMode = typeof opts.getMode === 'function' ? opts.getMode : defaultGetMode;\n  const createModeBadgeOverlayFn = opts.createModeBadgeOverlay ?? defaultCreateModeBadgeOverlay;\n  const enqueuePendingScore = typeof opts.enqueuePendingScore === 'function'\n    ? opts.enqueuePendingScore\n    : ((entry) => defaultEnqueue(entry, { storage: opts.storage }));\n  // CS04 daily-mode wiring (PvI R1 fixes for PVI-CS04-001/002/003):\n  // `daily` carries the leaderboard partition (utcDate) AND the date-seeded\n  // modifier name + params drawn by daily.mjs. The modifier's apply(state)\n  // mutator populates startingLives / playerSpeedMultiplier /\n  // formationSpeedMultiplier / scoreMultiplier / enemyFireDensityMultiplier /\n  // invertHorizontalControls / modifiers.fogOfWar.haloRadius which we read\n  // below to actually affect gameplay (not just the leaderboard partition).\n  const daily = opts.daily ?? null;\n  const modifierState = resolveModifierState(daily);\n  const createWhaleSharkFn = opts.createWhaleShark ?? defaultCreateWhaleShark;\n  const createDailyHudOverlayFn = opts.createDailyHudOverlay ?? defaultCreateDailyHudOverlay;\n  const modeBadge = createModeBadgeOverlayFn({ getMode });\n  const isPractice = () => getMode() === 'practice';\n  const fogOfWarHaloRadius = modifierState?.modifiers?.fogOfWar?.haloRadius ?? null;\n  const invertControls = Boolean(modifierState?.invertHorizontalControls);\n  const scoreMultiplier = Number.isFinite(modifierState?.scoreMultiplier)\n    ? Math.max(0, modifierState.scoreMultiplier)\n    : 1;\n  const playerSpeedMultiplier = Number.isFinite(modifierState?.playerSpeedMultiplier)\n    ? Math.max(0, modifierState.playerSpeedMultiplier)\n    : 1;\n  const formationSpeedMultiplier =\n    (Number.isFinite(modifierState?.formationSpeedMultiplier)\n      ? Math.max(0, modifierState.formationSpeedMultiplier)\n      : 1)\n    * (Number.isFinite(daily?.params?.formationSpeedMultiplier)\n      ? Math.max(0, daily.params.formationSpeedMultiplier)\n      : 1);\n  const enemyFireMultiplier =\n    (Number.isFinite(modifierState?.enemyFireDensityMultiplier)\n      ? Math.max(0.0001, modifierState.enemyFireDensityMultiplier)\n      : 1)\n    * (Number.isFinite(daily?.params?.enemyFireMultiplier)\n      ? Math.max(0.0001, daily.params.enemyFireMultiplier)\n      : 1);\n  const startingLives = Number.isFinite(modifierState?.startingLives)\n    ? Math.max(1, Math.floor(modifierState.startingLives))\n    : null;\n\n  let player;\n  let formation;\n  let rng;\n  let sprites = {};\n  let torpedoes = [];\n  let enemyShots = [];\n  let score = 0;\n  let high = 0;\n  let wave = 1;\n  let ready = false;\n  let paused = false;\n  let gameOver = false;\n  let exited = false;\n  let loadError;\n  let lastInput;\n  let setupPromise;\n  let createFormationFactory;\n  let whaleshark = null;\n  let dailyHud = null;\n  let sessionId = null;\n  let sessionStartedAt = null;\n  let sessionError = null;\n  let sessionOffline = false;\n  let submission = { attempted: false, status: 'idle', error: null };\n  let pendingSessionPromise = null;\n  let pendingSubmissionPromise = null;\n\n  function playerOptions() {\n    return {\n      canvas: CANVAS,\n      config: PLAYER,\n      player: PLAYER,\n      torpedo: TORPEDO,\n      palette: PALETTE,\n      sprites: SPRITES,\n      ...(startingLives !== null ? { lives: startingLives } : {}),\n      ...(playerSpeedMultiplier !== 1\n        ? { speed: PLAYER.speed * playerSpeedMultiplier }\n        : {}),\n    };\n  }\n\n  function formationOptions() {\n    return {\n      canvas: CANVAS,\n      config: FORMATION,\n      formation: FORMATION,\n      enemyShot: ENEMY_SHOT,\n      enemyTypes: opts.enemyTypes ?? ENEMY_TYPES,\n      sprites: SPRITES,\n      wave,\n      rng,\n      ...(formationSpeedMultiplier !== 1\n        ? { baseSpeed: FORMATION.baseSpeed * formationSpeedMultiplier }\n        : {}),\n      ...(enemyFireMultiplier !== 1\n        ? { fireIntervalMs: FORMATION.fireIntervalMs / enemyFireMultiplier }\n        : {}),\n    };\n  }\n\n  function updateHud() {\n    hud\n      .setScore(score)\n      .setHigh(high)\n      .setLives(playerLives(player))\n      .setWave(wave);\n  }\n\n  function resetState() {\n    player = undefined;\n    formation = undefined;\n    rng = undefined;\n    sprites = {};\n    torpedoes = [];\n    enemyShots = [];\n    score = 0;\n    high = asScore(getHighScore());\n    wave = startWave;\n    ready = false;\n    paused = false;\n    gameOver = false;\n    loadError = undefined;\n    lastInput = undefined;\n    setupPromise = undefined;\n    whaleshark = null;\n    dailyHud = null;\n    sessionId = null;\n    sessionStartedAt = null;\n    sessionError = null;\n    sessionOffline = false;\n    submission = { attempted: false, status: 'idle', error: null };\n    pendingSessionPromise = null;\n    pendingSubmissionPromise = null;\n    updateHud();\n  }\n\n  function startSession() {\n    if (!apiClient || typeof apiClient.startSession !== 'function') {\n      return null;\n    }\n    pendingSessionPromise = Promise.resolve()\n      .then(() => apiClient.startSession())\n      .then((result) => {\n        if (exited) {\n          return;\n        }\n        sessionId = typeof result?.sessionId === 'string' ? result.sessionId : null;\n        sessionStartedAt = typeof result?.startedAt === 'string' ? result.startedAt : null;\n        sessionError = null;\n        sessionOffline = false;\n      })\n      .catch((err) => {\n        sessionId = null;\n        sessionStartedAt = null;\n        sessionError = err?.message ?? String(err);\n        // Only surface the OFFLINE banner for genuine network failures (same\n        // predicate as the pending-score enqueue) \u2014 not for backend/response\n        // errors like 500s or malformed responses.\n        if (!isPractice() && (err?.code === 'network_error' || err?.status === 0)) {\n          sessionOffline = true;\n        }\n      });\n    return pendingSessionPromise;\n  }\n\n  function performSubmit(sid, finalScore, finishedAt) {\n    submission = { attempted: true, status: 'pending', error: null };\n    const payload = { sessionId: sid, score: finalScore, finishedAt };\n    if (daily?.utcDate) {\n      payload.period = 'daily';\n      payload.utcDate = daily.utcDate;\n    }\n    pendingSubmissionPromise = Promise.resolve()\n      .then(() => apiClient.submitScore(payload))\n      .then(() => {\n        submission = { attempted: true, status: 'ok', error: null };\n      })\n      .catch((err) => {\n        submission = { attempted: true, status: 'error', error: err?.message ?? String(err) };\n        if (!isPractice() && (err?.code === 'network_error' || err?.status === 0)) {\n          try {\n            enqueuePendingScore({ sessionId: sid, score: finalScore, finishedAt });\n          } catch {\n            // Pending persistence is best-effort; gameplay and game-over state must survive it.\n          }\n        }\n      });\n    return pendingSubmissionPromise;\n  }\n\n  function submitScore() {\n    if (!apiClient || typeof apiClient.submitScore !== 'function') {\n      return null;\n    }\n    const finishedAt = now().toISOString();\n    const finalScore = score;\n\n    if (sessionId) {\n      return performSubmit(sessionId, finalScore, finishedAt);\n    }\n\n    // Race: game over fired before startSession resolved. Queue the\n    // submission behind the pending session so we don't drop the score.\n    if (pendingSessionPromise) {\n      submission = { attempted: true, status: 'pending', error: null };\n      pendingSubmissionPromise = pendingSessionPromise.then(() => {\n        if (exited) return null;\n        if (sessionId) {\n          return performSubmit(sessionId, finalScore, finishedAt);\n        }\n        submission = { attempted: false, status: 'skipped', error: sessionError };\n        return null;\n      });\n      return pendingSubmissionPromise;\n    }\n\n    submission = { attempted: false, status: 'skipped', error: sessionError };\n    return null;\n  }\n\n  function finishGame() {\n    if (gameOver) {\n      return;\n    }\n\n    gameOver = true;\n    const storedHigh = asScore(getHighScore());\n    high = Math.max(high, storedHigh);\n\n    if (score > high) {\n      high = score;\n      setHighScore(score);\n    }\n\n    updateHud();\n    submitScore();\n    onGameOver(score);\n  }\n\n  function setupRun(playerFactory, formationFactory, rngFactory, loadedSprites) {\n    if (exited) {\n      return;\n    }\n\n    rng = rngFactory(opts.seed ?? 1);\n    createFormationFactory = formationFactory;\n    player = playerFactory(playerOptions());\n    formation = formationFactory(formationOptions());\n    if (wave > 1) {\n      const resetResult = callMaybe(formation?.resetForWave, formation, [wave]);\n      if (resetResult) {\n        formation = resetResult;\n      }\n    }\n    sprites = loadedSprites ?? {};\n    whaleshark = createWhaleSharkFn({\n      rng,\n      canvasWidth: CANVAS.width,\n      canvasHeight: CANVAS.height,\n      dailyMode: Boolean(daily),\n      spawnIntervalMs: daily?.params?.whaleSharkInterval,\n    });\n    if (daily) {\n      dailyHud = createDailyHudOverlayFn({ daily });\n    }\n    ready = true;\n    updateHud();\n  }\n\n  function resolveResources() {\n    const playerFactory = opts.createPlayer ?? defaultPlayerFactory();\n    const formationFactory = opts.createFormation ?? defaultFormationFactory();\n    const rngFactory = opts.createRng ?? defaultCreateRng;\n    const spritesValue = resolveOrReject(loadSprites);\n    const values = [playerFactory, formationFactory, rngFactory, spritesValue];\n\n    if (values.some(isThenable)) {\n      setupPromise = Promise.all(values)\n        .then(([resolvedPlayerFactory, resolvedFormationFactory, resolvedRngFactory, loadedSprites]) => {\n          setupRun(resolvedPlayerFactory, resolvedFormationFactory, resolvedRngFactory, loadedSprites);\n        })\n        .catch((error) => {\n          loadError = error;\n          ready = false;\n        });\n      return setupPromise;\n    }\n\n    setupRun(playerFactory, formationFactory, rngFactory, spritesValue);\n    return undefined;\n  }\n\n  function updatePlayer(dt, input) {\n    const playerInput = invertControls ? makeInvertedInput(input) : input;\n    callMaybe(player?.handleInput, player, [playerInput]);\n    callMaybe(player?.update, player, [dt, playerInput, CANVAS, PLAYER]);\n\n    if (fireRequested(input)) {\n      addProjectiles(torpedoes, callMaybe(player?.tryFire, player, [playerInput, {\n        canvas: CANVAS,\n        player: PLAYER,\n        torpedo: TORPEDO,\n      }]));\n    }\n  }\n\n  function updateFormation(dt) {\n    addProjectiles(enemyShots, callMaybe(formation?.update, formation, [dt, {\n      canvas: CANVAS,\n      formation: FORMATION,\n      enemyShot: ENEMY_SHOT,\n      rng,\n      player,\n      wave,\n    }]));\n    // Issue #35: previously passed `player` as accumulatorState, which made\n    // consumeFireCadence enter the object branch and short-circuit to false\n    // (player has no nowMs/dtMs/dt/elapsedMs fields), so enemies never fired\n    // in production. Drop player + the unused options object so the formation\n    // uses its internal fireAccumulatorMs (incremented by formation.update).\n    addProjectiles(enemyShots, callMaybe(formation?.tryFire, formation, [rng]));\n    addProjectiles(enemyShots, callMaybe(formation?.fire, formation, [rng, player, wave]));\n  }\n\n  function updateProjectiles(dt) {\n    for (const torpedo of torpedoes) {\n      updateProjectile(torpedo, dt, -TORPEDO.speed);\n    }\n\n    for (const enemyShot of enemyShots) {\n      updateProjectile(enemyShot, dt, ENEMY_SHOT.speed);\n    }\n\n    torpedoes = torpedoes.filter(inBounds);\n    enemyShots = enemyShots.filter(inBounds);\n  }\n\n  function handleTorpedoCollisions() {\n    const invaders = formationInvaders(formation);\n    const collisions = groupCollisions(torpedoes, invaders, { aabbOf });\n\n    for (const { a: torpedo, b: invader } of collisions) {\n      if (!isAlive(torpedo) || !isAlive(invader)) {\n        continue;\n      }\n\n      kill(torpedo);\n      kill(invader);\n      score += Math.floor(invaderPoints(invader) * scoreMultiplier);\n    }\n\n    torpedoes = torpedoes.filter(isAlive);\n\n    if (whaleshark) {\n      const result = whaleshark.checkHit(torpedoes);\n      if (result?.hit) {\n        score += Math.floor((result.points ?? 0) * scoreMultiplier);\n      }\n      torpedoes = torpedoes.filter(isAlive);\n    }\n  }\n\n  function handlePlayerCollisions() {\n    const playerGroup = player ? [player] : [];\n    const collisions = groupCollisions(enemyShots, playerGroup, { aabbOf });\n\n    for (const { a: enemyShot } of collisions) {\n      if (!isAlive(enemyShot)) {\n        continue;\n      }\n\n      kill(enemyShot);\n      damagePlayer(player);\n    }\n\n    enemyShots = enemyShots.filter(isAlive);\n  }\n\n  function advanceWaveIfCleared() {\n    if (!formationCleared(formation)) {\n      return;\n    }\n\n    score += Math.floor(SCORING.waveBonusMultiplier * wave * scoreMultiplier);\n    wave += 1;\n    torpedoes = [];\n    enemyShots = [];\n\n    const resetResult = callMaybe(formation?.resetForWave, formation, [wave]);\n    if (resetResult) {\n      formation = resetResult;\n    } else if (formationAliveCount(formation) === 0 && createFormationFactory) {\n      formation = createFormationFactory(formationOptions());\n    }\n  }\n\n  const scene = {\n    enter() {\n      exited = false;\n      resetState();\n      startSession();\n      return resolveResources();\n    },\n\n    exit() {\n      exited = true;\n      lastInput = undefined;\n    },\n\n    handleInput(input) {\n      lastInput = input;\n\n      if (input?.pressed?.('Escape')) {\n        paused = !paused;\n      }\n    },\n\n    update(dt, input = lastInput) {\n      if (!ready || paused || gameOver) {\n        return;\n      }\n\n      updatePlayer(dt, input);\n      updateFormation(dt);\n      updateProjectiles(dt);\n      if (whaleshark) {\n        whaleshark.update(Number(dt) || 0);\n      }\n      handleTorpedoCollisions();\n      handlePlayerCollisions();\n      advanceWaveIfCleared();\n\n      if (playerIsDead(player)) {\n        finishGame();\n      } else if (formationLowestY(formation) >= entityY(player)) {\n        finishGame();\n      }\n\n      updateHud();\n    },\n\n    render(renderer) {\n      const width = typeof renderer?.width === 'function' ? renderer.width() : CANVAS.width;\n      const height = typeof renderer?.height === 'function' ? renderer.height() : CANVAS.height;\n\n      renderer.clear?.(PALETTE.skyTop);\n      drawRect(renderer, { x: 0, y: 0, w: width, h: Math.floor(height * 0.45), fill: PALETTE.skyTop });\n      drawRect(renderer, { x: 0, y: Math.floor(height * 0.45), w: width, h: Math.floor(height * 0.35), fill: PALETTE.skyMid });\n      drawRect(renderer, { x: 0, y: Math.floor(height * 0.8), w: width, h: Math.ceil(height * 0.2), fill: PALETTE.seaAccent });\n\n      if (loadError) {\n        renderer.drawText('LOAD ERROR', width / 2, height / 2, {\n          font: '18px monospace',\n          fill: PALETTE.enemyShot,\n          align: 'center',\n          baseline: 'middle',\n        });\n        return;\n      }\n\n      if (!ready) {\n        renderer.drawText('LOADING...', width / 2, height / 2, {\n          font: '18px monospace',\n          fill: PALETTE.ui,\n          align: 'center',\n          baseline: 'middle',\n        });\n        return;\n      }\n\n      if (typeof formation?.render === 'function') {\n        formation.render(renderer, sprites);\n      } else {\n        for (const invader of formationInvaders(formation)) {\n          drawEntity(renderer, sprites, invader, invader?.sprite ?? 'jellyfish', PALETTE.ui);\n        }\n      }\n\n      if (whaleshark) {\n        whaleshark.render(renderer);\n      }\n\n      for (const torpedo of torpedoes) {\n        drawEntity(renderer, sprites, torpedo, 'torpedo', PALETTE.shot);\n      }\n\n      for (const enemyShot of enemyShots) {\n        drawEntity(renderer, sprites, enemyShot, 'enemyShot', PALETTE.enemyShot);\n      }\n\n      drawEntity(renderer, sprites, player, 'submarine', PALETTE.player);\n\n      if (fogOfWarHaloRadius && player) {\n        fogOfWar.renderOverlay(renderer, {\n          player,\n          canvasWidth: width,\n          canvasHeight: height,\n          haloRadius: fogOfWarHaloRadius,\n        });\n      }\n\n      updateHud();\n      hud.render(renderer, sprites);\n      modeBadge.render(renderer);\n\n      if (dailyHud) {\n        dailyHud.render(renderer);\n      }\n\n      if (sessionOffline) {\n        renderer.drawText('OFFLINE \u2014 ranked score will submit when back online', width / 2, height - 24, {\n          font: '16px monospace',\n          fill: PALETTE.ui,\n          align: 'center',\n          baseline: 'bottom',\n        });\n      }\n    },\n\n    state() {\n      return {\n        score,\n        high,\n        lives: playerLives(player),\n        wave,\n        ready,\n        paused,\n        gameOver,\n        player,\n        formation,\n        torpedoes,\n        enemyShots,\n        whaleshark: whaleshark?.state ?? null,\n        daily: daily ?? null,\n        modifierName: daily?.modifierName ?? null,\n        modifiers: modifierState?.modifiers ?? null,\n        sessionId,\n        sessionStartedAt,\n        sessionError,\n        submission: { ...submission },\n      };\n    },\n  };\n\n  return scene;\n}\n", "import { createRng } from 'canvas-game-engine/seed.mjs';\nimport { createPlayScene as defaultCreatePlayScene } from './play.mjs';\nimport * as bossRush from '../modifiers/boss-rush.mjs';\nimport * as fogOfWar from '../modifiers/fog-of-war.mjs';\nimport * as invertedControls from '../modifiers/inverted-controls.mjs';\nimport * as oneShot from '../modifiers/one-shot.mjs';\nimport * as speedRun from '../modifiers/speed-run.mjs';\n\n// Single source of truth for modifier names: each modifier module exports\n// its own NAME, and play.mjs MODIFIER_REGISTRY is keyed by the same. Daily\n// just picks one of those NAME strings via the date-seeded RNG; the\n// matching module is then resolved by play.mjs at scene-init.\nconst MODIFIER_NAMES = Object.freeze([\n  fogOfWar.NAME,\n  speedRun.NAME,\n  oneShot.NAME,\n  bossRush.NAME,\n  invertedControls.NAME,\n]);\nconst ENEMY_FIRE_MULTIPLIERS = Object.freeze([0.8, 1.0, 1.2, 1.5]);\nconst FORMATION_SPEED_MULTIPLIERS = Object.freeze([0.8, 1.0, 1.2, 1.5]);\nconst WHALE_SHARK_INTERVALS = Object.freeze([10000, 15000, 20000, 30000]);\nconst UTC_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nfunction assertUtcDate(utcDate) {\n  if (typeof utcDate !== 'string' || !UTC_DATE_PATTERN.test(utcDate)) {\n    throw new TypeError('utcDate must be a YYYY-MM-DD string');\n  }\n\n  const [year, month, day] = utcDate.split('-').map(Number);\n  const parsed = new Date(Date.UTC(year, month - 1, day));\n  if (parsed.toISOString().slice(0, 10) !== utcDate) {\n    throw new TypeError('utcDate must be a valid UTC YYYY-MM-DD date');\n  }\n}\n\nfunction seedForUtcDate(utcDate) {\n  return Number(utcDate.replaceAll('-', ''));\n}\n\nfunction drawFrom(rng, values) {\n  return values[rng.int(0, values.length - 1)];\n}\n\nfunction createDailyDefinition(utcDate) {\n  assertUtcDate(utcDate);\n\n  const seed = seedForUtcDate(utcDate);\n  const rng = createRng(seed);\n  const modifierName = drawFrom(rng, MODIFIER_NAMES);\n  const params = Object.freeze({\n    enemyFireMultiplier: drawFrom(rng, ENEMY_FIRE_MULTIPLIERS),\n    formationSpeedMultiplier: drawFrom(rng, FORMATION_SPEED_MULTIPLIERS),\n    whaleSharkInterval: drawFrom(rng, WHALE_SHARK_INTERVALS),\n  });\n\n  return {\n    seed,\n    daily: Object.freeze({ utcDate, modifierName, params }),\n  };\n}\n\n/**\n * Creates a deterministic daily scene wrapper around play.mjs.\n *\n * Daily-mode wiring summary (see CS04 PvI R2):\n * - The named modifier (`daily.modifierName`) is matched against the\n *   `MODIFIER_REGISTRY` in `play.mjs` and its `apply(state)` is invoked at\n *   scene construction. Resulting state fields drive runtime behavior:\n *   `startingLives`, `playerSpeedMultiplier`, `formationSpeedMultiplier`,\n *   `enemyFireDensityMultiplier`, `scoreMultiplier`, `invertHorizontalControls`,\n *   and `modifiers.fogOfWar.haloRadius`.\n * - The whale-shark mystery enemy is created in both normal and daily modes\n *   (CS04-D7). Daily mode uses the date-seeded deterministic spawn interval;\n *   normal mode uses a random 15-30s interval. It ticks + renders + checks-hit\n *   each frame; its score award is multiplied by the active modifier's\n *   `scoreMultiplier` (daily mode only \u2014 normal mode has scoreMultiplier=1).\n * - The `DAILY \u00B7 YYYY-MM-DD \u00B7 modifier-name` HUD badge is rendered top-right\n *   each frame.\n * - The `period: 'daily', utcDate` tuple is threaded into the score submit\n *   payload so the server partitions to the daily leaderboard.\n *\n * Known sub-limitations (documented as acceptable for v1.0):\n * - boss-rush `onlyEnemyType: 'squid'` requires formation-factory cooperation\n *   to filter spawned types; only its `scoreMultiplier \u00D7 2` and\n *   `enemyFireDensityMultiplier \u00D7 2` take effect.\n * - speed-run `fireRateMultiplier` is a no-op because the player factory does\n *   not accept a fire-rate multiplier (only an absolute `fireCooldownMs`).\n */\nexport function createDailyScene(opts = {}) {\n  const {\n    utcDate,\n    createPlayScene = defaultCreatePlayScene,\n    ...deps\n  } = opts;\n  const { seed, daily } = createDailyDefinition(utcDate);\n  const playScene = createPlayScene({\n    ...deps,\n    seed,\n    daily,\n  });\n\n  return {\n    ...playScene,\n\n    daily() {\n      return daily;\n    },\n\n    state() {\n      const baseState = typeof playScene?.state === 'function' ? playScene.state() : {};\n      return {\n        ...baseState,\n        modifierName: daily.modifierName,\n        daily,\n      };\n    },\n  };\n}\n", "import { CANVAS, PALETTE } from '../constants.mjs';\n\nconst rendererWidth = (renderer) => (\n  typeof renderer?.width === 'function' ? renderer.width() : CANVAS.width\n);\n\nconst asScore = (value) => Math.max(0, Math.floor(Number(value) || 0));\n\nexport function createGameOverScene(opts = {}) {\n  const onRestart = opts.onRestart ?? (() => {});\n  const onMenu = opts.onMenu ?? (() => {});\n  const onLeaderboard = opts.onLeaderboard ?? null;\n\n  let score = asScore(opts.score);\n  let high = asScore(opts.high);\n\n  return {\n    enter(stateFromPlay = {}) {\n      score = asScore(stateFromPlay.score ?? score);\n      high = asScore(stateFromPlay.high ?? high);\n    },\n\n    handleInput(input) {\n      if (input?.pressed?.('Space')) {\n        onRestart();\n      }\n\n      if (input?.pressed?.('KeyM')) {\n        onMenu();\n      }\n\n      if (onLeaderboard && input?.pressed?.('KeyL')) {\n        onLeaderboard();\n      }\n    },\n\n    render(renderer) {\n      const width = rendererWidth(renderer);\n\n      renderer.clear?.(PALETTE.skyTop);\n      renderer.drawText('GAME OVER', width / 2, 128, {\n        font: '38px monospace',\n        fill: PALETTE.enemyShot,\n        align: 'center',\n        baseline: 'middle',\n      });\n      renderer.drawText(`SCORE  ${score}`, width / 2, 208, {\n        font: '22px monospace',\n        fill: PALETTE.ui,\n        align: 'center',\n        baseline: 'middle',\n      });\n      renderer.drawText(`HIGH  ${high}`, width / 2, 244, {\n        font: '22px monospace',\n        fill: PALETTE.ui,\n        align: 'center',\n        baseline: 'middle',\n      });\n      const hint = onLeaderboard\n        ? 'PRESS SPACE TO RESTART  \u2022  PRESS L FOR LEADERBOARD  \u2022  PRESS M FOR MENU'\n        : 'PRESS SPACE TO RESTART  \u2022  PRESS M FOR MENU';\n      renderer.drawText(hint, width / 2, 336, {\n        font: '16px monospace',\n        fill: PALETTE.ui,\n        align: 'center',\n        baseline: 'middle',\n      });\n    },\n\n    state() {\n      return { score, high };\n    },\n  };\n}\n", "import { CANVAS, PALETTE } from '../constants.mjs';\n\nconst rendererWidth = (renderer) => (\n  typeof renderer?.width === 'function' ? renderer.width() : CANVAS.width\n);\n\nconst STATE = Object.freeze({\n  loading: 'loading',\n  ready: 'ready',\n  error: 'error',\n});\n\nfunction formatScore(value) {\n  return String(Math.max(0, Math.floor(Number(value) || 0)));\n}\n\nfunction shortenError(err) {\n  const message = err?.message ?? String(err);\n  return message.length > 80 ? `${message.slice(0, 77)}...` : message;\n}\n\nexport function createLeaderboardScene(opts = {}) {\n  const apiClient = opts.apiClient;\n  const onMenu = opts.onMenu ?? (() => {});\n  const onRestart = opts.onRestart ?? (() => {});\n  const top = Math.max(1, Math.floor(opts.top ?? 10));\n  const period = opts.period === 'daily' ? 'daily' : 'all';\n  const date = period === 'daily' && typeof opts.date === 'string' ? opts.date : null;\n\n  let state = STATE.loading;\n  let entries = [];\n  let errorMessage = '';\n\n  function load() {\n    state = STATE.loading;\n    entries = [];\n    errorMessage = '';\n    if (!apiClient || typeof apiClient.getLeaderboard !== 'function') {\n      state = STATE.error;\n      errorMessage = 'leaderboard unavailable';\n      return;\n    }\n    Promise.resolve(apiClient.getLeaderboard({ period, ...(date ? { date } : {}) })).then(\n      (result) => {\n        entries = (result?.entries ?? []).slice(0, top);\n        state = STATE.ready;\n      },\n      (err) => {\n        errorMessage = shortenError(err);\n        state = STATE.error;\n      },\n    );\n  }\n\n  return {\n    enter() {\n      load();\n    },\n\n    handleInput(input) {\n      if (input?.pressed?.('Space')) {\n        onRestart();\n        return;\n      }\n      if (input?.pressed?.('KeyM')) {\n        onMenu();\n      }\n    },\n\n    render(renderer) {\n      const width = rendererWidth(renderer);\n      renderer.clear?.(PALETTE.skyTop);\n      renderer.drawText('LEADERBOARD', width / 2, 80, {\n        font: '32px monospace',\n        fill: PALETTE.ui,\n        align: 'center',\n        baseline: 'middle',\n      });\n\n      if (state === STATE.loading) {\n        renderer.drawText('LOADING...', width / 2, 200, {\n          font: '20px monospace',\n          fill: PALETTE.ui,\n          align: 'center',\n          baseline: 'middle',\n        });\n      } else if (state === STATE.error) {\n        renderer.drawText('UNABLE TO LOAD', width / 2, 200, {\n          font: '20px monospace',\n          fill: PALETTE.enemyShot,\n          align: 'center',\n          baseline: 'middle',\n        });\n        renderer.drawText(errorMessage, width / 2, 232, {\n          font: '12px monospace',\n          fill: PALETTE.ui,\n          align: 'center',\n          baseline: 'middle',\n        });\n      } else {\n        if (entries.length === 0) {\n          renderer.drawText('NO SCORES YET', width / 2, 200, {\n            font: '20px monospace',\n            fill: PALETTE.ui,\n            align: 'center',\n            baseline: 'middle',\n          });\n        } else {\n          let y = 140;\n          for (const entry of entries) {\n            const rank = String(entry.rank).padStart(2, ' ');\n            const score = formatScore(entry.score).padStart(8, ' ');\n            renderer.drawText(`${rank}.  ${score}`, width / 2, y, {\n              font: '18px monospace',\n              fill: PALETTE.ui,\n              align: 'center',\n              baseline: 'middle',\n            });\n            y += 24;\n          }\n        }\n      }\n\n      renderer.drawText('PRESS SPACE TO RESTART  \u2022  PRESS M FOR MENU', width / 2, 360, {\n        font: '14px monospace',\n        fill: PALETTE.ui,\n        align: 'center',\n        baseline: 'middle',\n      });\n    },\n\n    state() {\n      return { phase: state, entries: entries.slice(), error: errorMessage };\n    },\n  };\n}\n\nexport const __forTesting = { STATE, formatScore, shortenError };\n", "import { CANVAS, PALETTE } from '../constants.mjs';\n\nconst rendererWidth = (renderer) => (\n  typeof renderer?.width === 'function' ? renderer.width() : CANVAS.width\n);\n\nconst rendererHeight = (renderer) => (\n  typeof renderer?.height === 'function' ? renderer.height() : CANVAS.height\n);\n\nexport function createMenuScene(opts = {}) {\n  const onStart = opts.onStart ?? (() => {});\n  const onLeaderboard = opts.onLeaderboard ?? null;\n  const getHighScore = opts.getHighScore ?? (() => 0);\n  const now = opts.now ?? (() => Date.now());\n  const dailyOption = opts.dailyOption ?? null;\n  const modeOption = opts.modeOption ?? null;\n\n  return {\n    handleInput(input) {\n      if (input?.pressed?.('Space')) {\n        onStart();\n      }\n\n      if (onLeaderboard && input?.pressed?.('KeyL')) {\n        onLeaderboard();\n      }\n\n      dailyOption?.handleInput?.(input);\n      modeOption?.handleInput?.(input);\n    },\n\n    render(renderer) {\n      const width = rendererWidth(renderer);\n      const height = rendererHeight(renderer);\n      const highScore = Math.max(0, Math.floor(Number(getHighScore()) || 0));\n\n      renderer.clear?.(PALETTE.skyTop);\n      renderer.drawText('SUB INVADERS', width / 2, 96, {\n        font: '40px monospace',\n        fill: PALETTE.player,\n        align: 'center',\n        baseline: 'middle',\n      });\n      renderer.drawText('ARROWS / A D \u2014 Move    SPACE / W \u2014 Fire', width / 2, 164, {\n        font: '16px monospace',\n        fill: PALETTE.ui,\n        align: 'center',\n        baseline: 'middle',\n      });\n      renderer.drawText(`HIGH  ${highScore}`, width / 2, 212, {\n        font: '20px monospace',\n        fill: PALETTE.ui,\n        align: 'center',\n        baseline: 'middle',\n      });\n\n      if (Math.floor(now() / 500) % 2 === 0) {\n        const prompt = onLeaderboard\n          ? 'PRESS SPACE TO START  \u2022  PRESS L FOR LEADERBOARD'\n          : 'PRESS SPACE TO START';\n        renderer.drawText(prompt, width / 2, height - 96, {\n          font: '18px monospace',\n          fill: PALETTE.ui,\n          align: 'center',\n          baseline: 'middle',\n        });\n\n        const dailyPrompt = dailyOption?.promptText?.();\n        if (dailyPrompt) {\n          renderer.drawText(dailyPrompt, width / 2, height - 64, {\n            font: '18px monospace',\n            fill: PALETTE.ui,\n            align: 'center',\n            baseline: 'middle',\n          });\n        }\n      }\n\n      const modePrompt = modeOption?.promptText?.();\n      if (modePrompt) {\n        renderer.drawText(modePrompt, width / 2, height - 128, {\n          font: '18px monospace',\n          fill: PALETTE.ui,\n          align: 'center',\n          baseline: 'middle',\n        });\n      }\n    },\n  };\n}\n", "// CS04 D5 \u2014 menu daily-challenge option overlay (frontend flag-gated).\n//\n// When `flags.dailyChallenge === 'on'`, the menu scene renders a \"PRESS D\n// FOR DAILY CHALLENGE\" prompt and routes a KeyD press to onDaily(). When\n// the flag is off, both the prompt and the input route are inert so the\n// CS03 menu behaves exactly as before.\n//\n// This module is composed by row-10 integration: main.mjs decides flag\n// state, then menu.mjs (or its caller) wires the daily option via these\n// helpers. Keeping the option behind a separate module lets row 4 ship +\n// be tested without editing menu.mjs (row 10's responsibility).\n\nimport { isDailyChallengeEnabled } from '../flags.mjs';\n\nexport const DAILY_OPTION_LABEL = 'PRESS D FOR DAILY CHALLENGE';\n\nexport function createDailyMenuOption({ flags, onDaily, getMode } = {}) {\n  const baseEnabled = isDailyChallengeEnabled(flags) && typeof onDaily === 'function';\n  // CS08-14: daily and practice are mutually exclusive. In practice mode the\n  // daily option is hidden + inert. Evaluated live so a menu mode toggle takes\n  // effect immediately.\n  const isEnabled = () => baseEnabled\n    && (typeof getMode === 'function' ? getMode() !== 'practice' : true);\n\n  return {\n    get enabled() {\n      return isEnabled();\n    },\n\n    handleInput(input) {\n      if (!isEnabled()) return false;\n      if (input?.pressed?.('KeyD')) {\n        onDaily();\n        return true;\n      }\n      return false;\n    },\n\n    promptText() {\n      return isEnabled() ? DAILY_OPTION_LABEL : null;\n    },\n  };\n}\n", "const PROMPT_SUFFIX = '  (\\u2190 \\u2192 to change)';\n\nconst normalizedMode = (mode) => (mode === 'practice' ? 'practice' : 'ranked');\n\nconst nextModeFor = (mode) => (normalizedMode(mode) === 'practice' ? 'ranked' : 'practice');\n\nexport function createModeMenuOption({ getMode, setMode } = {}) {\n  return {\n    enabled: true,\n\n    handleInput(input) {\n      if (input?.pressed?.('ArrowLeft') || input?.pressed?.('ArrowRight')) {\n        setMode(nextModeFor(getMode?.()));\n        return true;\n      }\n      return false;\n    },\n\n    promptText() {\n      return `MODE: ${normalizedMode(getMode?.()).toUpperCase()}${PROMPT_SUFFIX}`;\n    },\n  };\n}\n", "export const HIGH_SCORE_KEY = 'subInvadersHighScore';\nexport const PRACTICE_HIGH_SCORE_KEY = 'subInvadersPracticeHighScore';\n\nfunction resolveStorage(storage) {\n  if (storage !== undefined) {\n    return storage;\n  }\n\n  try {\n    return globalThis.localStorage;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction parseStoredScore(value) {\n  if (value === null || value === undefined) {\n    return undefined;\n  }\n\n  if (typeof value === 'string' && value.trim() === '') {\n    return undefined;\n  }\n\n  const raw = typeof value === 'string' ? value.trim() : value;\n\n  if (typeof raw === 'string' && !/^\\d+$/.test(raw)) {\n    return undefined;\n  }\n\n  const score = Number(raw);\n  return Number.isInteger(score) && score >= 0 ? score : undefined;\n}\n\nfunction coerceWritableScore(value) {\n  const score = Number(value);\n\n  if (!Number.isFinite(score)) {\n    return undefined;\n  }\n\n  return Math.max(0, Math.floor(score));\n}\n\nfunction highScoreKeyFor(mode) {\n  return mode === 'practice' ? PRACTICE_HIGH_SCORE_KEY : HIGH_SCORE_KEY;\n}\n\nexport function getHighScoreFor(mode, { storage } = {}) {\n  try {\n    const target = resolveStorage(storage);\n\n    if (!target || typeof target.getItem !== 'function') {\n      return 0;\n    }\n\n    return parseStoredScore(target.getItem(highScoreKeyFor(mode))) ?? 0;\n  } catch {\n    return 0;\n  }\n}\n\nexport function setHighScoreFor(mode, value, { storage } = {}) {\n  try {\n    const score = coerceWritableScore(value);\n\n    if (score === undefined) {\n      return;\n    }\n\n    const target = resolveStorage(storage);\n\n    if (!target || typeof target.setItem !== 'function') {\n      return;\n    }\n\n    target.setItem(highScoreKeyFor(mode), String(score));\n  } catch {\n    // High-score persistence is best-effort only.\n  }\n}\n\nexport function getHighScore({ storage } = {}) {\n  return getHighScoreFor('ranked', { storage });\n}\n\nexport function setHighScore(value, { storage } = {}) {\n  setHighScoreFor('ranked', value, { storage });\n}\n", "const HOOK_NAME = '__subInvaders';\n\nfunction locationUrl(locationLike) {\n  const href = typeof locationLike === 'string' ? locationLike : locationLike?.href;\n\n  try {\n    return new URL(href ?? 'about:blank', 'http://localhost/');\n  } catch {\n    return new URL('about:blank');\n  }\n}\n\nfunction shouldInstall(locationLike) {\n  return locationUrl(locationLike ?? globalThis.location).searchParams.get('test') === '1';\n}\n\nfunction sceneState(scene) {\n  return typeof scene?.state === 'function' ? scene.state() : undefined;\n}\n\nfunction currentScene(deps) {\n  return deps.scenes?.current?.();\n}\n\nfunction currentState(deps) {\n  return sceneState(currentScene(deps));\n}\n\nfunction sceneName(state) {\n  if (state && (state.phase === 'loading' || state.phase === 'ready' || state.phase === 'error')\n      && Array.isArray(state.entries)) {\n    return 'leaderboard';\n  }\n\n  if (state && Number.isFinite(Number(state.wave))) {\n    return 'play';\n  }\n\n  if (state && Number.isFinite(Number(state.score)) && Number.isFinite(Number(state.high))) {\n    return 'game-over';\n  }\n\n  return 'menu';\n}\n\nfunction getEnemies(formation) {\n  if (Array.isArray(formation?.enemies)) {\n    return formation.enemies;\n  }\n\n  if (typeof formation?.enemies === 'function') {\n    return formation.enemies();\n  }\n\n  if (Array.isArray(formation?.invaders)) {\n    return formation.invaders;\n  }\n\n  if (typeof formation?.invaders === 'function') {\n    return formation.invaders();\n  }\n\n  if (typeof formation?.aliveInvaders === 'function') {\n    return formation.aliveInvaders();\n  }\n\n  if (Array.isArray(formation?.entities)) {\n    return formation.entities;\n  }\n\n  return [];\n}\n\nfunction entityBox(entity) {\n  if (typeof entity?.aabb === 'function') {\n    return entity.aabb();\n  }\n\n  return {\n    x: entity?.x ?? 0,\n    y: entity?.y ?? 0,\n    w: entity?.w ?? 0,\n    h: entity?.h ?? 0,\n  };\n}\n\nfunction enemySnapshot(enemy, index) {\n  const box = entityBox(enemy);\n\n  return {\n    index,\n    x: box.x,\n    y: box.y,\n    w: box.w,\n    h: box.h,\n    type: enemy?.type ?? enemy?.kind ?? enemy?.sprite ?? 'unknown',\n    row: enemy?.row,\n    col: enemy?.col,\n    alive: enemy?.alive !== false,\n  };\n}\n\nfunction projectileSnapshot(projectile, index) {\n  const box = entityBox(projectile);\n\n  return {\n    index,\n    x: box.x,\n    y: box.y,\n    w: box.w,\n    h: box.h,\n    alive: projectile?.alive !== false,\n  };\n}\n\nfunction playerSnapshot(player, lives = player?.lives ?? 0) {\n  const box = entityBox(player);\n\n  return {\n    x: box.x,\n    y: box.y,\n    w: box.w,\n    h: box.h,\n    lives: Math.max(0, Math.floor(Number(lives) || 0)),\n  };\n}\n\nfunction requirePlayState(deps, action) {\n  const state = currentState(deps);\n\n  if (!state?.player || !state?.formation) {\n    throw new Error(`${HOOK_NAME}.${action} requires the play scene`);\n  }\n\n  return state;\n}\n\nfunction setAlive(entity, alive) {\n  if (!entity) {\n    return;\n  }\n\n  if (!alive && typeof entity.kill === 'function') {\n    entity.kill();\n    return;\n  }\n\n  entity.alive = Boolean(alive);\n}\n\nfunction keyForCode(code) {\n  if (code === 'Space') {\n    return ' ';\n  }\n\n  if (code.startsWith('Key') && code.length === 4) {\n    return code.at(-1).toLowerCase();\n  }\n\n  return code;\n}\n\nfunction dispatchKeyboardEvent(deps, type, code) {\n  const win = deps.window ?? globalThis.window;\n  const doc = deps.document ?? win?.document ?? globalThis.document;\n  const eventInit = { code, key: keyForCode(code), bubbles: true, cancelable: true };\n  const targets = [doc, win].filter(Boolean);\n\n  for (const target of [...new Set(targets)]) {\n    const EventCtor = win?.KeyboardEvent ?? globalThis.KeyboardEvent;\n    const event = typeof EventCtor === 'function'\n      ? new EventCtor(type, eventInit)\n      : { type, ...eventInit };\n    target.dispatchEvent?.(event);\n  }\n}\n\nexport function installTestHooks(deps = {}) {\n  if (!shouldInstall(deps.location)) {\n    return undefined;\n  }\n\n  const win = deps.window ?? globalThis.window;\n\n  if (!win) {\n    throw new Error('installTestHooks requires a window when ?test=1 is present');\n  }\n\n  const api = Object.freeze({\n    state() {\n      const state = currentState(deps) ?? {};\n      const scene = sceneName(state);\n      const playScene = scene === 'play';\n      const leaderboardScene = scene === 'leaderboard';\n      const gameOver = Boolean(state.gameOver) || scene === 'game-over';\n      const liveHigh = Number(deps.getHighScore?.() ?? NaN);\n      const fallbackHigh = Number(state.high ?? 0) || 0;\n      const high = Number.isFinite(liveHigh) ? liveHigh : fallbackHigh;\n      const lives = Number(state.lives ?? state.player?.lives ?? 0) || 0;\n      const enemyShotsCount = Array.isArray(state.enemyShots) ? state.enemyShots.length : 0;\n      const torpedoesCount = Array.isArray(state.torpedoes) ? state.torpedoes.length : 0;\n      const entriesCount = leaderboardScene && Array.isArray(state.entries) ? state.entries.length : 0;\n      const submission = (playScene || gameOver) && state.submission\n        ? {\n            attempted: Boolean(state.submission.attempted),\n            status: typeof state.submission.status === 'string' ? state.submission.status : 'idle',\n            error: state.submission.error ?? null,\n          }\n        : null;\n\n      return {\n        scene,\n        score: Math.max(0, Math.floor(Number(state.score) || 0)),\n        high: Math.max(0, Math.floor(high)),\n        lives: Math.max(0, Math.floor(lives)),\n        wave: Math.max(1, Math.floor(Number(state.wave) || 1)),\n        alive: playScene && lives > 0 && state.player?.alive !== false,\n        ready: !playScene || state.ready === true,\n        paused: Boolean(state.paused),\n        gameOver,\n        enemyShots: enemyShotsCount,\n        torpedoes: torpedoesCount,\n        phase: leaderboardScene ? state.phase : undefined,\n        entriesCount: leaderboardScene ? entriesCount : undefined,\n        leaderboardError: leaderboardScene ? state.error ?? null : undefined,\n        submission,\n      };\n    },\n\n    entries() {\n      const state = currentState(deps);\n      if (!Array.isArray(state?.entries)) {\n        return [];\n      }\n      return state.entries.map((entry) => ({\n        rank: Number(entry?.rank ?? 0) || 0,\n        score: Number(entry?.score ?? 0) || 0,\n        finishedAt: typeof entry?.finishedAt === 'string' ? entry.finishedAt : null,\n      }));\n    },\n\n    formation() {\n      const state = currentState(deps);\n      return getEnemies(state?.formation).map(enemySnapshot);\n    },\n\n    enemyShots() {\n      const state = currentState(deps);\n      return Array.isArray(state?.enemyShots) ? state.enemyShots.map(projectileSnapshot) : [];\n    },\n\n    torpedoes() {\n      const state = currentState(deps);\n      return Array.isArray(state?.torpedoes) ? state.torpedoes.map(projectileSnapshot) : [];\n    },\n\n    player() {\n      const state = currentState(deps);\n      return playerSnapshot(state?.player, state?.lives);\n    },\n\n    pressKey(code) {\n      dispatchKeyboardEvent(deps, 'keydown', code);\n    },\n\n    releaseKey(code) {\n      dispatchKeyboardEvent(deps, 'keyup', code);\n    },\n\n    setSeed(n) {\n      deps.setSeed?.(n);\n    },\n\n    killAllInvaders() {\n      const state = requirePlayState(deps, 'killAllInvaders');\n      for (const enemy of getEnemies(state.formation)) {\n        setAlive(enemy, false);\n      }\n    },\n\n    setLives(n) {\n      const state = requirePlayState(deps, 'setLives');\n      state.player.lives = Math.max(0, Math.floor(Number(n) || 0));\n    },\n\n    setHighScore(n) {\n      deps.setHighScore?.(n);\n    },\n\n    forceGameOver(score) {\n      deps.showGameOver?.(score ?? currentState(deps)?.score ?? 0);\n    },\n\n    forceEnemyFire() {\n      const state = requirePlayState(deps, 'forceEnemyFire');\n      const formation = state.formation;\n\n      if (!formation || !Array.isArray(state.enemyShots)) {\n        return null;\n      }\n\n      const fakeRng = {\n        int: (min, max) => Math.floor(Math.random() * (max - min + 1)) + min,\n        next: () => Math.random(),\n      };\n\n      if (typeof formation.update === 'function') {\n        formation.update(2);\n      }\n\n      const shot = typeof formation.tryFire === 'function'\n        ? formation.tryFire(fakeRng)\n        : null;\n\n      if (shot) {\n        state.enemyShots.push(shot);\n      }\n\n      return shot ? { x: shot.x, y: shot.y, w: shot.w, h: shot.h } : null;\n    },\n\n    loopState() {\n      const loop = deps.loop;\n      if (!loop || typeof loop.isRunning !== 'function') {\n        return { running: false, paused: false };\n      }\n      return {\n        running: Boolean(loop.isRunning()),\n        paused: typeof loop.isPaused === 'function' ? Boolean(loop.isPaused()) : false,\n      };\n    },\n\n    pauseLoop() {\n      deps.loop?.pause?.();\n    },\n\n    resumeLoop() {\n      deps.loop?.resume?.();\n    },\n\n    stopLoop() {\n      deps.loop?.stop?.();\n    },\n\n    startLoop() {\n      deps.loop?.start?.();\n    },\n  });\n\n  win[HOOK_NAME] = api;\n  return api;\n}"],
  "mappings": "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",
  "names": ["imageFromSprites", "frameFromSprites", "drawSpriteFrame", "DEFAULT_CANVAS_WIDTH", "finiteOrZero", "isPractice", "aabbOf", "rendererWidth", "DEFAULT_PADDING", "DEFAULT_FONT", "finiteNumberOr", "getMode", "NAME", "apply", "NAME", "apply", "NAME", "apply", "NAME", "apply", "resolveStorage", "DEFAULT_CANVAS_WIDTH", "DEFAULT_CANVAS_HEIGHT", "randomIndex", "NAME", "aabbOf", "getHighScore", "setHighScore", "getMode", "isPractice", "NAME", "createPlayScene", "rendererWidth", "asScore", "rendererWidth", "rendererWidth", "getHighScore", "getMode", "normalizedMode", "getMode", "setMode", "resolveStorage", "locationUrl", "getMode", "setMode"]
}
