{
  "version": 3,
  "sources": ["saffron/app.mjs"],
  "sourcesContent": ["import { prepareGameplayStorage } from '../gameplay-reset.mjs?v=8a6208ef22c9ab94';\nimport { bindKeyboardControls } from '../keyboard-controls.mjs?v=8a6208ef22c9ab94';\nimport { createSoundEffects } from '../sound-effects.mjs?v=8a6208ef22c9ab94';\nimport { createGameplayBlocker } from '../dialog-state.mjs?v=8a6208ef22c9ab94';\nimport { HintRoutes } from '../hint-routes.mjs?v=8a6208ef22c9ab94';\nimport {\n  difficultyLabel,\n  updateCompletion,\n  bindCompletionPresentation,\n  advanceChallenge,\n  showGameMessage,\n} from '../gameplay-flow.mjs?v=8a6208ef22c9ab94';\nimport { updateGymBadge } from '../gym-badges.mjs?v=8a6208ef22c9ab94';\nimport { loading, startupSelection } from '../loading.mjs?v=8a6208ef22c9ab94';\nimport { drawingCache, drawingVariants, boardStager } from '../drawing-cache.mjs?v=8a6208ef22c9ab94';\nimport { bindGeneratorGuidance, formatGenerationFailure } from '../generator-guidance.mjs?v=8a6208ef22c9ab94';\nimport { setupBoardAccessibility } from '../accessibility.mjs?v=8a6208ef22c9ab94';\nimport { tile as accessibleTile, step, recover, explored, DIRS, encode } from './engine.mjs?v=8a6208ef22c9ab94';\nimport { restoreInWorker, createTaskWorker } from '../worker-task.mjs?v=8a6208ef22c9ab94';\nimport { reducedMotion } from '../motion-preference.mjs?v=8a6208ef22c9ab94';\nimport { createSaveStore, SAVE_CONFLICT_MESSAGE } from '../save-store.mjs?v=8a6208ef22c9ab94';\nimport { bindPointerControls } from '../pointer-controls.mjs?v=8a6208ef22c9ab94';\nimport { elapsedSince } from '../run-clock.mjs?v=8a6208ef22c9ab94';\nimport { updateMapButton, updateSoundButton } from '../board-tools.mjs?v=8a6208ef22c9ab94';\nimport { challengeProgress, isLevelCleared } from '../challenge-progress.mjs?v=8a6208ef22c9ab94';\nimport { setupFeedback } from '../feedback.mjs?v=8a6208ef22c9ab94';\nimport { LEVELS, level, canonical, installGenerated } from './levels.mjs?v=8a6208ef22c9ab94';\nimport { settings } from './generator.mjs?v=8a6208ef22c9ab94';\nimport { loadProgress, freshSlot, cleanSlot } from './progress.mjs?v=8a6208ef22c9ab94';\nimport { scene, drawRoom, drawOverview, T, viewport } from './render.mjs?v=8a6208ef22c9ab94';\nimport { roomTrainer } from './trainers.mjs?v=8a6208ef22c9ab94';\nimport { emblemDescription } from './room-emblems.mjs?v=8a6208ef22c9ab94';\nimport {\n  TapQueue,\n  DirectionInput,\n  padDirection as pad,\n  swipeDirection as swipe,\n} from '../input.mjs?v=8a6208ef22c9ab94';\nimport { createAnalytics } from '../analytics.mjs?v=8a6208ef22c9ab94';\nconst updateAccessibility = setupBoardAccessibility();\nconst track = createAnalytics('saffron');\n\nconst $ = (id) => document.getElementById(id),\n  canvas = $('game'),\n  ctx = canvas.getContext('2d'),\n  pads = [...document.querySelectorAll('[data-dir]')];\nconst STORAGE = 'gym-puzzles-beta-20261028-saffron-v1';\nprepareGameplayStorage();\nconst saveStore = createSaveStore(STORAGE);\nconst saved = startupSelection(saveStore.read(), LEVELS);\nlet generated = saved.generated ?? null;\nlet generatedReady = false;\nlet generatedRevision = 0;\nlet restoration = null;\nconst withLoading = loading();\nasync function restoreGenerated() {\n  if (generatedReady) return;\n  const generationToken = generatedRevision;\n  restoration ??= withLoading(async () => {\n    const restoredGenerated = await restoreInWorker(\n      new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url),\n      saved.generated,\n    );\n    if (generationToken !== generatedRevision) return;\n    if (restoredGenerated) {\n      installGenerated(restoredGenerated.board, generated);\n      generatedReady = true;\n    }\n  }, 'Loading saved puzzle\u2026').finally(() => {\n    restoration = null;\n  });\n  await restoration;\n}\n// A selected generated game still validates before it can be played. Other\n// modes retain the raw record and slot unchanged until explicitly requested.\nif (saved.selected === 'generated') await restoreGenerated();\nconst progress = loadProgress(\n  generatedReady\n    ? saved\n    : {\n        ...saved,\n        slots: Object.fromEntries(\n          Object.entries(saved.slots ?? {}).filter(([id]) => id !== 'generated'),\n        ),\n      },\n);\n// Keep retained bytes/extension fields outside the active authored slot. An invalid\n// generated startup must not become a fresh or silently repaired generated run.\nif (Object.hasOwn(saved.slots ?? {}, 'generated'))\n  progress.slots.generated = generatedReady\n    ? (retainedGeneratedSlot(saved.slots.generated) ?? saved.slots.generated)\n    : saved.slots.generated;\nif (\n  saved.selected === 'generated' &&\n  (!generatedReady || !retainedGeneratedSlot(saved.slots?.generated))\n)\n  progress.selected = canonical('');\nlet selected = progress.selected,\n  slots = progress.slots,\n  archived = progress.archived;\nlet slot = slots[selected] ?? freshSlot(selected),\n  b = level(selected).board;\nlet animation = null,\n  queued = null,\n  dir = 'up',\n  hint = null,\n  hintWorker = null,\n  generatorWorker = null,\n  job = 0,\n  map = false,\n  sound = false;\nlet lastFrame = performance.now(),\n  lastSave = lastFrame,\n  visual = { x: slot.state.x, y: slot.state.y };\nlet controls = null;\nconst remembered = { classic: 'classic', custom: 'first-jump', ...saved.remembered };\nconst analyticsDetails = () => ({\n  level_id: selected,\n  mode: level(selected).kind,\n  difficulty: level(selected).difficulty ?? 'classic',\n});\nlet roomCaches = [],\n  mapCache,\n  mapKey;\nconst consoleElement = document.querySelector('.console');\nconst taps = new TapQueue();\nconst hintRoutes = new HintRoutes();\nlet completionVisible = false;\nconst input = new DirectionInput((d, repeat) => request(d, repeat));\nconst dialogOpen = createGameplayBlocker();\nconst say = (text) => {\n  showGameMessage(\n    $('message'),\n    saveStore.conflicted ? SAVE_CONFLICT_MESSAGE : text,\n    saveStore.conflicted,\n  );\n};\nconst clock = (ms) =>\n  `${String(Math.floor(ms / 60000)).padStart(2, '0')}:${String(Math.floor(ms / 1000) % 60).padStart(2, '0')}`;\nconst arrows = {\n  up: '\u2191',\n  right: '\u2192',\n  down: '\u2193',\n  left: '\u2190',\n  upLeft: '\u2196',\n  upRight: '\u2197',\n  downLeft: '\u2199',\n  downRight: '\u2198',\n};\nfunction announceChallenge() {\n  say(`${level(selected).name}. Find the finish through the warp pads.`);\n}\nfunction stopHint() {\n  hintWorker?.terminate();\n  hintWorker = null;\n  hint = null;\n}\nfunction clearInput() {\n  input.clear();\n  queued = null;\n  taps.clear();\n  controls?.reset();\n  updatePad();\n}\nfunction updatePad() {\n  $('queuedInput').hidden = !queued;\n  $('queuedInput').textContent = queued\n    ? `Next input: ${queued.replace(/([A-Z])/g, ' $1').toLowerCase()} ${arrows[queued]}`\n    : '';\n  for (const p of pads) {\n    p.disabled = !slot.started || slot.state.won;\n    p.classList.toggle('is-active', input.last === p.dataset.dir);\n    p.classList.toggle('is-queued', queued === p.dataset.dir);\n  }\n}\nfunction persist() {\n  slots[selected] = slot;\n  try {\n    const result = saveStore.write(\n      { version: 1, selected, slots, archived, generated, remembered },\n      selected,\n    );\n    if (result.status === 'conflict') say(SAVE_CONFLICT_MESSAGE);\n    $('saveLabel').textContent =\n      result.status === 'conflict'\n        ? 'NEWER SAVE IN ANOTHER TAB \u2014 RELOAD'\n        : result.status === 'session'\n          ? 'THIS SESSION'\n          : animation\n            ? 'STEPPING\u2026'\n            : 'PROGRESS SAVED';\n  } catch {\n    $('saveLabel').textContent = animation ? 'STEPPING\u2026' : 'THIS SESSION';\n  }\n}\nconst cachedDrawing = drawingCache();\nfunction buildCache() {\n  roomCaches = drawingVariants(b.rooms.length, (i) => {\n    const c = cachedDrawing(b, 'drawRoom' + ':' + i, () => {\n      const c = document.createElement('canvas');\n      c.width = c.height = 9 * T;\n      drawRoom(c.getContext('2d'), b, i);\n      return c;\n    });\n    return c;\n  });\n  mapKey = null;\n  buildMap();\n  stageBoard();\n}\nfunction buildMap() {\n  const key = slot.state.seen + ':' + slot.state.found.join('|');\n  if (mapKey === key) return;\n  mapKey = key;\n  mapCache = document.createElement('canvas');\n  Object.assign(mapCache, viewport(b, true));\n  drawOverview(mapCache.getContext('2d'), b, slot.state);\n}\nconst stageDrawing = boardStager(canvas);\nfunction stageBoard() {\n  const size = viewport(b, map);\n  stageDrawing(size, (c) =>\n    scene(c, {\n      board: b,\n      state: slot.state,\n      map,\n      visual,\n      dir,\n      time: reducedMotion() ? 0 : performance.now(),\n      roomCache: roomCaches[slot.state.room],\n      mapCache,\n    }),\n  );\n  consoleElement.style.setProperty('--map-aspect', `${canvas.width}/${canvas.height}`);\n}\nfunction resize() {\n  const size = viewport(b, map);\n  canvas.width = size.width;\n  canvas.height = size.height;\n  consoleElement.style.setProperty('--map-aspect', `${canvas.width}/${canvas.height}`);\n}\nfunction update() {\n  $('resumeGeneratedButton').hidden = !generated || selected === 'generated';\n  const emblem = emblemDescription(b, slot.state.room);\n  updateAccessibility({\n    name: level(selected).name,\n    state: slot.state,\n    width: 9,\n    height: 9,\n    cell: (x, y) =>\n      (() => {\n        if (slot.state.room === b.goal[0] && x === b.goal[1] && y === b.goal[2]) return 'E';\n        if (slot.state.room === b.start[0] && x === b.start[1] && y === b.start[2]) return 'S';\n        const pad = b.rooms[slot.state.room].portal.get(`${x},${y}`);\n        return pad\n          ? slot.state.found.includes(`${slot.state.room},${x},${y}`)\n            ? `warp pad to room ${pad.to[0] + 1}, column ${pad.to[1] + 1}, row ${pad.to[2] + 1}`\n            : 'warp pad; destination unexplored'\n          : accessibleTile(b, slot.state.room, x, y);\n      })(),\n    mechanisms: emblem ? [`${b.rooms[slot.state.room].name}. ${emblem}`] : [],\n  });\n  const l = level(selected),\n    n = explored(slot.state);\n  $('levelSelect').value = selected === 'generated' ? 'classic' : selected;\n  $('levelChoice').hidden = selected === 'generated';\n  for (const [id, kind] of [\n    ['modeClassic', 'classic'],\n    ['modeCustom', 'custom'],\n    ['modeGenerator', 'generated'],\n  ])\n    $(id).setAttribute('aria-pressed', String(l.kind === kind));\n  $('levelDifficulty').textContent = difficultyLabel(l, slot.stage ?? 0, 'teleports');\n  $('levelNote').textContent = l.note;\n  $('editionName').textContent = `${l.name.toUpperCase()} \u00B7 ${b.rooms[slot.state.room].name}`;\n  $('editionProgress').textContent =\n    `${LEVELS.filter((l) => isLevelCleared(l, slots[l.id])).length} / 7 ${selected === 'generated' ? 'CLASSIC & CUSTOM CLEARED' : 'CLEARED'}`;\n  $('challengeProgress').innerHTML = challengeProgress(\n    selected === 'generated' ? [...LEVELS, level(selected)] : LEVELS,\n    { ...slots, [selected]: slot },\n    selected,\n  );\n  const badge = updateGymBadge('saffron', LEVELS, { ...slots, [selected]: slot });\n  $('broken').textContent = String(n).padStart(2, '0');\n  $('requiredTotal').textContent = `/ ${String(b.rooms.length).padStart(2, '0')}`;\n  $('progressFill').style.width = `${(n / b.rooms.length) * 100}%`;\n  $('moves').textContent = String(slot.state.moves);\n  $('warps').textContent = String(slot.state.warps);\n  $('timer').textContent = clock(slot.elapsed);\n  $('undoButton').disabled = !slot.history.length;\n  $('startOverlay').hidden = slot.started;\n  $('winOverlay').hidden = !slot.state.won || !completionVisible;\n  $('startTitle').textContent = 'Choose your next jump.';\n  $('startDescription').textContent =\n    `${b.rooms.length} rooms. Walk onto a warp pad and find the glowing finish platform.`;\n  $('winTitle').textContent = 'Challenge cleared.';\n  $('winStats').textContent =\n    `${slot.state.moves} move${slot.state.moves === 1 ? '' : 's'} \u00B7 ${slot.state.warps} teleports \u00B7 ${clock(slot.elapsed)}`;\n  $('nextButton').textContent =\n    selected === 'generated' ? 'Generate another maze \u2192' : 'Next challenge \u2192';\n  const trainer = roomTrainer(b, slot.state.room);\n  $('controlsNote').textContent = trainer\n    ? `Landmark: ${trainer.label}`\n    : emblemDescription(b, slot.state.room);\n  buildMap();\n  updateCompletion({\n    levels: LEVELS,\n    slots: { ...slots, [selected]: slot },\n    selected,\n    slot,\n    visible: completionVisible,\n    badge,\n    busy: !!animation,\n  });\n  updatePad();\n}\nconst tone = createSoundEffects({ enabled: () => sound });\nconst copy = (s) => ({ ...s, found: [...s.found] });\nfunction finish() {\n  if (!animation) return;\n  const a = animation;\n  animation = null;\n  slot.state = a.result.state;\n  completionVisible = slot.state.won;\n  visual = { x: slot.state.x, y: slot.state.y };\n  slots[selected] = slot;\n  if (slot.state.won) {\n    clearInput();\n    say('The finish is yours. Challenge cleared.');\n    track('challenge_completed', {\n      ...analyticsDetails(),\n      moves: slot.state.moves,\n      teleports: slot.state.warps,\n      duration_seconds: Math.round(slot.elapsed / 1000),\n    });\n  } else {\n    const trainer = roomTrainer(b, slot.state.room);\n    say(\n      a.result.type === 'warp'\n        ? `${b.rooms[slot.state.room].name}${trainer ? ` \u00B7 ${trainer.label}` : emblemDescription(b, slot.state.room) ? ` \u00B7 ${emblemDescription(b, slot.state.room)}` : ''}.${slot.state.found.length > a.from.found.length ? ' New connection added to your map.' : ''}`\n        : 'Look for a warp pad. Every jump takes you to one landing.',\n    );\n  }\n  update();\n  if (slot.state.won) $('nextButton').focus?.({ preventScroll: true });\n  persist();\n  const next = taps.shift();\n  queued = taps.items[0] ?? null;\n  if (next && !dialogOpen() && !slot.state.won) request(next, false);\n  updatePad();\n}\nfunction request(d, repeat = false) {\n  if (\n    saveStore.conflicted ||\n    !slot.started ||\n    slot.state.won ||\n    dialogOpen() ||\n    document.visibilityState === 'hidden'\n  )\n    return;\n  if (animation) {\n    if (!repeat) taps.push(d);\n    queued = taps.items[0] ?? null;\n    updatePad();\n    return;\n  }\n  stopHint();\n  const result = step(b, slot.state, d);\n  dir = d;\n  if (result.type === 'blocked') {\n    const trainer = roomTrainer(b, slot.state.room),\n      [dx, dy] = DIRS[d];\n    say(\n      trainer && slot.state.x + dx === trainer.x && slot.state.y + dy === trainer.y\n        ? `${trainer.label} is standing here. Walk around them.`\n        : 'Solid edge. Choose another direction.',\n    );\n    const nextTap = taps.shift();\n    queued = taps.items[0] ?? null;\n    if (nextTap) request(nextTap);\n    return;\n  }\n  slot.history.push(copy(slot.state));\n  slot.history = slot.history.slice(-600);\n  animation = {\n    from: copy(slot.state),\n    result,\n    start: performance.now(),\n    duration: result.type === 'warp' ? 280 : 115,\n  };\n  $('saveLabel').textContent = 'STEPPING\u2026';\n  tone(result.type === 'warp');\n  update();\n  if (reducedMotion()) finish();\n}\nfunction retainedGeneratedSlot(retained) {\n  const restored = cleanSlot('generated', retained);\n  if (\n    !restored ||\n    ('history' in retained && !Array.isArray(retained.history)) ||\n    ('elapsed' in retained && restored.elapsed !== retained.elapsed) ||\n    ('started' in retained && restored.started !== retained.started) ||\n    JSON.stringify(restored.history) !== JSON.stringify(retained.history ?? [])\n  )\n    return null;\n  // Omitted legacy defaults stay supported; supplied valid fields/extensions stay exact.\n  return globalThis.structuredClone({ ...restored, ...retained });\n}\nlet selectionRequest = 0;\nlet generatedPickerRequest = false;\nlet generatedReturnFocus = null;\nfunction endGeneratedPicker() {\n  if (!generatedPickerRequest) return;\n  generatedPickerRequest = false;\n  $('levelPickerDialog').close();\n}\nfunction rejectGeneratedResume(text) {\n  endGeneratedPicker();\n  say(text);\n}\nfunction cancelGeneratedPicker() {\n  if (!generatedPickerRequest) return;\n  generatedPickerRequest = false;\n  selectionRequest++;\n}\nfunction change(id) {\n  if (id !== 'generated') cancelGeneratedPicker();\n  if (id === 'generated' && !saveStore.checkGenerated()) {\n    rejectGeneratedResume(SAVE_CONFLICT_MESSAGE);\n    return;\n  }\n  const selectionToken = ++selectionRequest;\n  if (id === 'generated' && generatedReady) {\n    const retained = slots.generated;\n    const restored = retainedGeneratedSlot(retained);\n    if (!restored) {\n      rejectGeneratedResume(\n        'Your saved run could not be validated. It is still saved; your current run is unchanged.',\n      );\n      return;\n    }\n    slots.generated = restored;\n  }\n  if (id === 'generated' && !generatedReady) {\n    void restoreGenerated()\n      .then(() => {\n        if (selectionToken !== selectionRequest) return;\n        if (!saveStore.checkGenerated()) {\n          rejectGeneratedResume(SAVE_CONFLICT_MESSAGE);\n          return;\n        }\n        if (!generatedReady) {\n          rejectGeneratedResume(\n            'Your saved puzzle could not be validated. It is still saved; your current run is unchanged.',\n          );\n          return;\n        }\n        slots.generated = saved.slots?.generated;\n        change(id);\n      })\n      .catch(() => {\n        if (selectionToken === selectionRequest)\n          rejectGeneratedResume(\n            'Your saved puzzle could not be loaded. It is still saved; select it again to retry.',\n          );\n      });\n    return;\n  }\n  if (saveStore.conflicted) return;\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  persist();\n  if (saveStore.conflicted) return;\n  completionVisible = false;\n  $('keepProgress').checked = false;\n  selected = canonical(id);\n  if (selected !== 'generated')\n    slots[selected] = loadProgress(saveStore.refresh(selected)).slots[selected];\n  slot = slots[selected] ?? freshSlot(selected);\n  b = level(selected).board;\n  visual = { x: slot.state.x, y: slot.state.y };\n  if (level(selected).kind !== 'generated') remembered[level(selected).kind] = selected;\n  buildCache();\n  update();\n  persist();\n  announceChallenge();\n  track('challenge_selected', analyticsDetails());\n  if (generatedPickerRequest) {\n    generatedReturnFocus = selectionToken;\n    endGeneratedPicker();\n  }\n}\nfunction restart() {\n  if (saveStore.conflicted) return;\n  clearInput();\n  stopHint();\n  animation = null;\n  const cleared = isLevelCleared(level(selected), slot);\n  slot = freshSlot(selected);\n  if (cleared) slot.cleared = true;\n  slot.started = true;\n  slots[selected] = slot;\n  visual = { x: slot.state.x, y: slot.state.y };\n  buildCache();\n  completionVisible = false;\n  update();\n  persist();\n  say('A fresh maze. Your learned map has been reset.');\n  track('challenge_started', { ...analyticsDetails(), trigger: 'restart' });\n}\nfunction undo() {\n  if (saveStore.conflicted) return;\n  if (!slot.history.length || slot.state.won) return;\n  clearInput();\n  stopHint();\n  animation = null;\n  slot.state = slot.history.pop();\n  visual = { x: slot.state.x, y: slot.state.y };\n  completionVisible = false;\n  update();\n  persist();\n  say('Last step undone. Find your route.');\n}\nfunction retryFloor() {\n  if (saveStore.conflicted || slot.state.won) return;\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  if (saveStore.conflicted || slot.state.won) return;\n  slot.history.push(copy(slot.state));\n  slot.history = slot.history.filter((s) => !s.won).slice(-600);\n  slot.state = recover(b, slot.state);\n  slot.started = true;\n  visual = { x: slot.state.x, y: slot.state.y };\n  completionVisible = false;\n  update();\n  persist();\n  say('Back at the entrance. Your learned map is kept; one recovery teleport is counted.');\n}\nfunction next() {\n  if (!slot.state.won) return;\n  clearInput();\n  stopHint();\n  if (selected === 'generated') openGenerator();\n  else advanceChallenge(LEVELS, { ...slots, [selected]: slot }, selected, change);\n}\nfunction showDialog(id) {\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  persist();\n  $(id).showModal();\n}\nfunction hintStep() {\n  if (saveStore.conflicted || !slot.started || slot.state.won || dialogOpen()) return;\n  clearInput();\n  if (animation) finish();\n  if (slot.state.won) return;\n  stopHint();\n  const capture = JSON.stringify([selected, slot.state]);\n  say('Looking for a route from this landing\u2026');\n  track('hint_requested', analyticsDetails());\n  const present = (data, verified = false) => {\n    const result = data.result;\n    if (\n      !verified &&\n      result?.status === 'ok' &&\n      result.route?.length &&\n      !hintRoutes.remember(b, slot.state, result, (state, direction) =>\n        direction === 'return' ? recover(b, state) : step(b, state, direction).state,\n      )\n    ) {\n      say('A reliable hint could not be verified. Try Undo or Back to entrance.');\n      return;\n    }\n    if (data.type === 'hint' && result?.status === 'ok' && result.route.length) {\n      const d = result.route[0];\n      if (d === 'return') {\n        say('Try BACK TO ENTRANCE. Your learned map will be kept.');\n        return;\n      }\n      if (!DIRS[d]) return;\n      const [dx, dy] = DIRS[d];\n      hint = { x: slot.state.x + dx, y: slot.state.y + dy };\n      say(\n        `Try ${d.toUpperCase()}. This hint minimizes walking steps, which can use more teleports.`,\n      );\n    } else say('No route found from this landing. Undo or return to the entrance.');\n  };\n  const cached = hintRoutes.get(b, slot.state);\n  if (cached) {\n    present({ type: 'hint', result: cached }, true);\n    return;\n  }\n  try {\n    const task = createTaskWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url));\n    hintWorker = task;\n    task.onmessage = ({ data }) => {\n      if (hintWorker !== task || capture !== JSON.stringify([selected, slot.state])) return;\n      task.terminate();\n      hintWorker = null;\n      present(data);\n    };\n    task.onerror = () => {\n      if (hintWorker === task) {\n        stopHint();\n        say('Hints are unavailable right now. Undo or return still works.');\n      }\n    };\n    task.postMessage({\n      kind: 'hint',\n      proof:\n        selected === 'generated'\n          ? undefined\n          : (level(selected).routes?.[slot.stage ?? 0] ?? level(selected).route ?? b.proof),\n      board: encode(b),\n      state: copy(slot.state),\n    });\n  } catch {\n    stopHint();\n    say('Hints are unavailable in this browser. Undo or return still works.');\n  }\n}\nfunction generatorFields(config = generated?.settings ?? settings()) {\n  $('generatorRooms').value = String(config.rooms);\n  $('generatorWarps').value = String(config.minWarps);\n  $('generatorDensity').value = String(config.density);\n  $('generatorRandomness').value = String(config.randomness);\n  $('randomnessValue').textContent = `${config.randomness}%`;\n  $('generatorSeed').value = '';\n  refreshGeneratorGuidance();\n}\nfunction openGenerator() {\n  cancelGeneratedPicker();\n  generatorFields();\n  $('generatorStatus').textContent =\n    'Same seed and settings replay the same maze. Leave the seed blank for a fresh board.';\n  showDialog('generatorDialog');\n}\nfunction cancelGeneration(close = true) {\n  job++;\n  generatorWorker?.terminate();\n  generatorWorker = null;\n  $('generateButton').disabled = false;\n  $('generatorCancel').textContent = 'Close';\n  if (close) $('generatorDialog').close();\n}\nfunction startGeneration(event) {\n  event.preventDefault();\n  cancelGeneration(false);\n  let config;\n  try {\n    config = settings({\n      rooms: $('generatorRooms').value,\n      minWarps: $('generatorWarps').value,\n      density: $('generatorDensity').value,\n      randomness: $('generatorRandomness').value,\n      seed: $('generatorSeed').value,\n    });\n  } catch (e) {\n    $('generatorStatus').textContent = formatGenerationFailure(e.message, $('generatorSeed').value);\n    return;\n  }\n  const explicit = !!config.seed;\n  if (!explicit)\n    config.seed = Array.from(crypto.getRandomValues(new Uint32Array(3)), (n) =>\n      n.toString(36),\n    ).join('-');\n  const identity = ++job;\n  $('generateButton').disabled = true;\n  $('generatorCancel').textContent = 'Cancel';\n  $('generatorStatus').textContent = 'Constructing and verifying a new route\u2026';\n  try {\n    const task = createTaskWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url));\n    generatorWorker = task;\n    task.onmessage = ({ data }) => {\n      if (identity !== job || generatorWorker !== task) return;\n      if (data.type === 'progress') {\n        $('generatorStatus').textContent = `Searching layout ${data.attempt} / 80\u2026`;\n        return;\n      }\n      if (data.type === 'error') {\n        cancelGeneration(false);\n        $('generatorStatus').textContent = formatGenerationFailure(\n          data.message,\n          explicit ? config.seed : '',\n        );\n        return;\n      }\n      if (data.type !== 'complete') return;\n      const restored = data.restored;\n      if (!restored) {\n        cancelGeneration(false);\n        $('generatorStatus').textContent = 'Verification failed. Your current board is kept.';\n        return;\n      }\n      clearInput();\n      stopHint();\n      if (animation) finish();\n      persist();\n      cancelGeneration();\n      generatedRevision++;\n      generated = restored.record;\n      installGenerated(restored.board, generated);\n      generatedReady = true;\n      slots.generated = freshSlot('generated');\n      if (selected === 'generated') slot = slots.generated;\n      change('generated');\n      if (!saveStore.conflicted) $('startButton').focus();\n      track('puzzle_generated', analyticsDetails());\n    };\n    task.onerror = () => {\n      if (identity === job) {\n        cancelGeneration(false);\n        $('generatorStatus').textContent =\n          'Generation is unavailable right now. Your current board is kept.';\n      }\n    };\n    task.postMessage({\n      kind: 'generate',\n      settings: config,\n      // Seed identity must not depend on the previous board.\n      exclude: '',\n    });\n  } catch {\n    cancelGeneration(false);\n    $('generatorStatus').textContent =\n      'Generation is unavailable in this browser. Your current board is kept.';\n  }\n}\n\n$('startButton').addEventListener('click', () => {\n  if (!slot.started && !slot.state.won)\n    track('challenge_started', { ...analyticsDetails(), trigger: 'enter' });\n  slot.started = true;\n  update();\n  persist();\n  canvas.focus({ preventScroll: true });\n});\n$('levelSelect').addEventListener('change', (e) => change(e.target.value));\nfor (const [id, kind] of [\n  ['modeClassic', 'classic'],\n  ['modeCustom', 'custom'],\n])\n  $(id).addEventListener('click', () => change(remembered[kind]));\n$('modeGenerator').addEventListener('click', () =>\n  generated ? change('generated') : openGenerator(),\n);\n$('resumeGeneratedButton').addEventListener('click', () => {\n  if (!generated) return;\n  generatedPickerRequest = true;\n  change('generated');\n});\nfor (const event of ['gym-dialog-close', 'cancel'])\n  $('levelPickerDialog').addEventListener(event, cancelGeneratedPicker);\n$('levelPickerDialog').addEventListener('close', () => {\n  if ($('levelPickerDialog').open) return;\n  cancelGeneratedPicker();\n  const token = generatedReturnFocus;\n  generatedReturnFocus = null;\n  if (token !== null)\n    globalThis.queueMicrotask(() => {\n      if (token === selectionRequest && !dialogOpen()) canvas.focus({ preventScroll: true });\n    });\n});\n$('generatorSettingsButton').addEventListener('click', openGenerator);\nbindCompletionPresentation({\n  setVisible: (value) => {\n    completionVisible = value;\n  },\n  update: update,\n  dialogOpen,\n});\n$('generatorForm').addEventListener('submit', startGeneration);\nfor (const id of ['generatorClose', 'generatorCancel'])\n  $(id).addEventListener('click', () => cancelGeneration());\n$('generatorDialog').addEventListener('cancel', () => cancelGeneration());\n$('generatorDialog').addEventListener('close', () => {\n  if (generatorWorker) cancelGeneration(false);\n});\n$('generatorRandomness').addEventListener('input', () => {\n  $('randomnessValue').textContent = `${$('generatorRandomness').value}%`;\n});\n$('useSeedButton').addEventListener('click', () => {\n  $('generatorSeed').value = generated?.seed ?? '';\n});\n$('returnButton').addEventListener('click', retryFloor);\n$('undoButton').addEventListener('click', undo);\n$('resetButton').addEventListener('click', () =>\n  $('keepProgress').checked && !slot.state.won ? retryFloor() : restart(),\n);\n$('againButton').addEventListener('click', restart);\n$('nextButton').addEventListener('click', next);\n$('hintButton').addEventListener('click', hintStep);\n$('helpButton').addEventListener('click', () => showDialog('helpDialog'));\nfor (const id of ['closeHelp', 'helpDone'])\n  $(id).addEventListener('click', () => $('helpDialog').close());\n$('mapButton').addEventListener('click', () => {\n  clearInput();\n  map = !map;\n  consoleElement.classList.toggle('map-active', map);\n  updateMapButton($('mapButton'), map);\n  resize();\n});\n$('soundButton').addEventListener('click', () => {\n  sound = !sound;\n  updateSoundButton($('soundButton'), sound);\n  if (sound) tone();\n});\nbindKeyboardControls({\n  input,\n  blocked: dialogOpen,\n  undo,\n  restart: () => {\n    $('keepProgress').checked && !slot.state.won ? retryFloor() : restart();\n  },\n  recover: () => retryFloor(),\n  update: updatePad,\n});\ncontrols = bindPointerControls({\n  canvas,\n  dpad: $('dpad'),\n  pads,\n  input,\n  request,\n  enabled: () => !dialogOpen() && slot.started && !slot.state.won,\n  clearInput,\n  update: updatePad,\n  padDirection: (x, y, r, previous) => pad(x, y, r, previous),\n  swipeDirection: (dx, dy) => swipe(dx, dy),\n});\nfunction pause() {\n  cancelGeneratedPicker();\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  persist();\n  lastFrame = performance.now();\n}\nwindow.addEventListener('gym-ui-open', pause);\nwindow.addEventListener('gym-ui-close', () => {\n  lastFrame = performance.now();\n});\nwindow.addEventListener('blur', pause);\nwindow.addEventListener('gym-privacy-open', pause);\nwindow.addEventListener('pagehide', pause);\ndocument.addEventListener('visibilitychange', pause);\nfunction frame(now) {\n  const dt = elapsedSince(now, lastFrame);\n  lastFrame = now;\n  if (slot.started && !slot.state.won && !dialogOpen() && document.visibilityState !== 'hidden')\n    slot.elapsed += dt;\n  let paint = slot.state,\n    fade = 0;\n  if (reducedMotion() && animation) finish();\n  if (animation) {\n    const a = animation,\n      t = Math.min(1, (now - a.start) / a.duration);\n    if (t >= 1) finish();\n    else if (a.result.type === 'warp') {\n      const second = t >= 0.5;\n      paint = second ? a.result.state : a.from;\n      const target = a.result.depart;\n      visual = second\n        ? { x: paint.x, y: paint.y }\n        : {\n            x: a.from.x + (target[1] - a.from.x) * Math.min(1, t * 3),\n            y: a.from.y + (target[2] - a.from.y) * Math.min(1, t * 3),\n          };\n      fade = Math.sin(t * Math.PI) * 0.88;\n    } else {\n      paint = a.from;\n      visual = {\n        x: a.from.x + (a.result.state.x - a.from.x) * t,\n        y: a.from.y + (a.result.state.y - a.from.y) * t,\n      };\n    }\n  }\n  if (!animation) paint = slot.state;\n  if (!dialogOpen() && document.visibilityState !== 'hidden') input.update(now, !!animation);\n  // A warp's map switches after commitment; the room fades to the destination.\n  scene(ctx, {\n    board: b,\n    state: map ? slot.state : paint,\n    roomCache: roomCaches[paint.room],\n    mapCache,\n    map,\n    visual,\n    dir,\n    time: reducedMotion() ? 0 : now,\n    moving: !reducedMotion() && !!animation,\n    hint,\n    fade,\n  });\n  const displayTime = clock(slot.elapsed);\n  if ($('timer').textContent !== displayTime) $('timer').textContent = displayTime;\n  if (now - lastSave > 5000) {\n    persist();\n    lastSave = now;\n  }\n  requestAnimationFrame(frame);\n}\nbuildCache();\nupdate();\nif (slot.state.won) say(`${level(selected).name}. Challenge cleared.`);\nelse announceChallenge();\npersist();\nrequestAnimationFrame(frame);\n\nsetupFeedback({\n  gym: 'saffron',\n  track,\n  beforeOpen: pause,\n  afterClose: () => {\n    lastFrame = performance.now();\n  },\n  context: () => ({\n    ...analyticsDetails(),\n    level_name: level(selected).name,\n    moves: slot.state.moves,\n    puzzle_state: slot.state,\n    player_x: slot.state.x,\n    player_y: slot.state.y,\n    duration_seconds: Math.round(slot.elapsed / 1000),\n    ...(slot.state.room !== undefined ? { room: slot.state.room } : {}),\n    ...(selected === 'generated' && generated\n      ? { puzzle_seed: generated.seed, puzzle_settings: generated.settings }\n      : {}),\n  }),\n});\n\nsaveStore.watch(\n  () => selected,\n  () => {\n    clearInput();\n    stopHint();\n    $('saveLabel').textContent = 'NEWER SAVE IN ANOTHER TAB \u2014 RELOAD';\n    say(SAVE_CONFLICT_MESSAGE);\n  },\n);\n\n$('generatorDialog').addEventListener('gym-dialog-close', () => {\n  if (generatorWorker) cancelGeneration(false);\n});\n\nconst refreshGeneratorGuidance = bindGeneratorGuidance('saffron');\n"],
  "mappings": "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",
  "names": ["prepareGameplayStorage", "bindKeyboardControls", "createSoundEffects", "createGameplayBlocker", "HintRoutes", "difficultyLabel", "updateCompletion", "bindCompletionPresentation", "advanceChallenge", "showGameMessage", "updateGymBadge", "loading", "startupSelection", "drawingCache", "drawingVariants", "boardStager", "bindGeneratorGuidance", "formatGenerationFailure", "setupBoardAccessibility", "accessibleTile", "step", "recover", "explored", "DIRS", "encode", "restoreInWorker", "createTaskWorker", "reducedMotion", "createSaveStore", "SAVE_CONFLICT_MESSAGE", "bindPointerControls", "elapsedSince", "updateMapButton", "updateSoundButton", "challengeProgress", "isLevelCleared", "setupFeedback", "LEVELS", "level", "canonical", "installGenerated", "settings", "loadProgress", "freshSlot", "cleanSlot", "scene", "drawRoom", "drawOverview", "T", "viewport", "roomTrainer", "emblemDescription", "TapQueue", "DirectionInput", "pad", "swipe", "createAnalytics", "updateAccessibility", "track", "$", "id", "canvas", "ctx", "pads", "STORAGE", "saveStore", "saved", "generated", "generatedReady", "generatedRevision", "restoration", "withLoading", "restoreGenerated", "generationToken", "restoredGenerated", "progress", "retainedGeneratedSlot", "selected", "slots", "archived", "slot", "b", "animation", "queued", "dir", "hint", "hintWorker", "generatorWorker", "job", "map", "sound", "lastFrame", "lastSave", "visual", "controls", "remembered", "analyticsDetails", "roomCaches", "mapCache", "mapKey", "consoleElement", "taps", "hintRoutes", "completionVisible", "input", "d", "repeat", "request", "dialogOpen", "say", "text", "clock", "ms", "arrows", "announceChallenge", "stopHint", "clearInput", "updatePad", "p", "persist", "result", "cachedDrawing", "buildCache", "i", "c", "buildMap", "stageBoard", "key", "stageDrawing", "size", "resize", "update", "emblem", "x", "y", "l", "n", "kind", "badge", "trainer", "tone", "copy", "s", "finish", "a", "next", "dx", "dy", "nextTap", "retained", "restored", "selectionRequest", "generatedPickerRequest", "generatedReturnFocus", "endGeneratedPicker", "rejectGeneratedResume", "cancelGeneratedPicker", "change", "selectionToken", "restart", "cleared", "undo", "retryFloor", "openGenerator", "showDialog", "hintStep", "capture", "present", "data", "verified", "state", "direction", "cached", "task", "generatorFields", "config", "refreshGeneratorGuidance", "cancelGeneration", "close", "startGeneration", "event", "e", "explicit", "identity", "token", "value", "r", "previous", "pause", "frame", "now", "dt", "paint", "fade", "t", "second", "target", "displayTime"]
}
