From 8a3d4b4a9dbefe626258ee7f99daf28cd063e69c Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Sun, 12 Apr 2026 00:50:46 +0700 Subject: [PATCH] feat!: rewrite on Svelte 5, drop Phaser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace Phaser 3 with Svelte 5 as the rendering and UI layer. The framework-agnostic core (level parser, board model, progress store, microban level data) moves from src/game/core → src/lib/core with zero code changes. Scenes and the hand-rolled button factory are gone; in their place: - src/App.svelte root router (menu / levels / game) - src/views/MenuView title + play + progress + hints - src/views/LevelSelectView paginated 5x4 grid with native + + diff --git a/src/views/Board.svelte b/src/views/Board.svelte new file mode 100644 index 0000000..df4a2b3 --- /dev/null +++ b/src/views/Board.svelte @@ -0,0 +1,159 @@ + + + +
+ {#each floorCells as cell (cell.x + ',' + cell.y)} +
+ {/each} + + {#each targetCells as cell (cell.x + ',' + cell.y)} +
+ {/each} + + {#each wallCells as cell (cell.x + ',' + cell.y)} +
+ {/each} + + {#each boxes as box (box.id)} +
+ {/each} + +
+
+ + diff --git a/src/views/GameView.svelte b/src/views/GameView.svelte new file mode 100644 index 0000000..2378a56 --- /dev/null +++ b/src/views/GameView.svelte @@ -0,0 +1,253 @@ + + + + + +
+ {#if parseError} +

{parseError}

+ BACK TO MENU + {:else} +
+
+
LEVEL {levelIndex + 1}
+
+ Moves: {moves} + {#if best != null}  ·  Best: {best}{/if} +
+
+
+ UNDO + RESTART + LEVELS +
+
+ +
+ +
+ + {#if won} +
+
+

LEVEL COMPLETE!

+

Moves: {moves}

+
+ {#if hasNext} + NEXT LEVEL + {/if} + LEVELS +
+
+
+ {/if} + {/if} +
+ + diff --git a/src/views/LevelSelectView.svelte b/src/views/LevelSelectView.svelte new file mode 100644 index 0000000..136c395 --- /dev/null +++ b/src/views/LevelSelectView.svelte @@ -0,0 +1,179 @@ + + + + + +
+
+ < BACK +

SELECT LEVEL

+ {completedCount} / {total} +
+ +
+ {#each visibleLevels as level (level.index)} + + {/each} +
+ +
+ changePage(-1)} disabled={page === 0}>< + Page {page + 1} / {totalPages} + changePage(1)} disabled={page >= totalPages - 1}>> +
+
+ + diff --git a/src/views/MenuView.svelte b/src/views/MenuView.svelte new file mode 100644 index 0000000..e03a080 --- /dev/null +++ b/src/views/MenuView.svelte @@ -0,0 +1,43 @@ + + + + + + diff --git a/vite/config.dev.mjs b/vite/config.dev.mjs index 71e0cc8..cc69daa 100644 --- a/vite/config.dev.mjs +++ b/vite/config.dev.mjs @@ -1,16 +1,9 @@ import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; export default defineConfig({ base: './', - build: { - rollupOptions: { - output: { - manualChunks: { - phaser: ['phaser'] - } - } - }, - }, + plugins: [svelte()], server: { port: 8080 } diff --git a/vite/config.prod.mjs b/vite/config.prod.mjs index 7152b08..70fffe5 100644 --- a/vite/config.prod.mjs +++ b/vite/config.prod.mjs @@ -1,47 +1,7 @@ import { defineConfig } from 'vite'; - -const phasermsg = () => { - return { - name: 'phasermsg', - buildStart() { - process.stdout.write(`Building for production...\n`); - }, - buildEnd() { - const line = "---------------------------------------------------------"; - const msg = `❤️❤️❤️ Tell us about your game! - games@phaser.io ❤️❤️❤️`; - process.stdout.write(`${line}\n${msg}\n${line}\n`); - - process.stdout.write(`✨ Done ✨\n`); - } - } -} +import { svelte } from '@sveltejs/vite-plugin-svelte'; export default defineConfig({ base: '/sokoban/', - logLevel: 'warn', - build: { - rollupOptions: { - output: { - manualChunks: { - phaser: ['phaser'] - } - } - }, - minify: 'terser', - terserOptions: { - compress: { - passes: 2 - }, - mangle: true, - format: { - comments: false - } - } - }, - server: { - port: 8080 - }, - plugins: [ - phasermsg() - ] + plugins: [svelte()] });