Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | <template> <div class="layout"> <Spinner v-if="isLoading" key="loading" size="large" ariaLabel="Loading..." /> <GameCanvas v-if="gameStore.gameStarted" key="canvas" :seed="gameStore.seed" :difficulty="gameStore.difficulty" @newGame="handleStartModal" /> <GameCanvasDemo v-if="!gameStore.gameStarted && !isLoading" class="preview-bg" /> </div> <Teleport to="body"> <transition name="fade-panel"> <StartModal v-if="!gameStore.gameStarted && !isLoading" key="start" @start="handleStart" /></transition> <transition name="fade-panel"> <DevPanel v-if="gameStore.devPanelVisible" /> </transition> </Teleport> </template> <script setup lang="ts"> import { useGameStart } from './hooks/useGameStart'; import { useGameStateStorage } from './hooks/useGameStateStorage'; import { useGameHistoryStore } from './stores/useGameHistoryStore'; import { useGameStore } from './stores/useGameStore'; const gameStore = useGameStore(); const { isLoading, startGame } = useGameStart(); const { load } = useGameStateStorage(); defineEmits<{ (e: 'newGame'): void; }>(); async function handleStart(payload: { seed: string; difficulty: number }) { const result = await startGame(payload); gameStore.startGame(result); } async function handleStartModal() { gameStore.setGameStarted(false); gameStore.setGameOver(false); } onMounted(() => { const saved = load(); useGameHistoryStore().loadFromStorage(); if (saved) { const anyMatched = saved.tiles.some((t) => t.matched); if (anyMatched) { gameStore.restoreGame(saved); } else { gameStore.setGameStarted(false); } } }); </script> |