From 24678602f4ce55bb64c55302f447eed18f1d11bc Mon Sep 17 00:00:00 2001 From: Brian Fertig Date: Sun, 14 Jun 2026 10:26:44 -0600 Subject: [PATCH] feat: add 2048 single-player puzzle game - Implement complete 2048 game with Phaser.js scene and game logic - Add customizable theme picker with multiple color schemes - Include smooth tile slide, merge, and spawn animations - Add sound effects (scifi-plink, scifi-plonk) and particle effects - Track best score in localStorage - Register game in server registry with icon frame 67 - Update Wordle name to "Wordle Race" --- public/assets/fx/scifi-plink.mp3 | Bin 0 -> 10896 bytes public/assets/fx/scifi-plonk.mp3 | Bin 0 -> 14208 bytes public/assets/images/game-icons.png | Bin 250223 -> 261743 bytes public/assets/images/game-icons.psd | Bin 663321 -> 690026 bytes public/src/games/2048/2048Game.js | 689 ++++++++++++++++++++++++++++ public/src/games/2048/2048Logic.js | 189 ++++++++ public/src/main.js | 2 + public/src/scenes/GameRoomScene.js | 2 +- server/games/registry.js | 3 +- 9 files changed, 883 insertions(+), 2 deletions(-) create mode 100644 public/assets/fx/scifi-plink.mp3 create mode 100644 public/assets/fx/scifi-plonk.mp3 create mode 100644 public/src/games/2048/2048Game.js create mode 100644 public/src/games/2048/2048Logic.js diff --git a/public/assets/fx/scifi-plink.mp3 b/public/assets/fx/scifi-plink.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1833fa2e15ce82924e937c311156275c2dd57073 GIT binary patch literal 10896 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 literal 0 HcmV?d00001 diff --git a/public/assets/images/game-icons.png b/public/assets/images/game-icons.png index 57013ab0d25e751154e5a82c5989c15a801fb7ac..e897ea01785e0a920e81ebee9b156ef466388ffc 100644 GIT binary patch delta 46850 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∾C(#^*b6~>`;O5hz4fv8Wc}g6y<}>b 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 A5&!@I diff --git a/public/assets/images/game-icons.psd b/public/assets/images/game-icons.psd index 6d3439950ba357f90d1baddded2f7862b856b1a3..9a5136d47c4864440e47fd0446197617dfaddbba 100644 GIT binary patch delta 34772 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 D&)aZ{ delta 8995 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 Y`#En+j~zIpz;q9!6HdefDMSCi0N7`_(*OVf diff --git a/public/src/games/2048/2048Game.js b/public/src/games/2048/2048Game.js new file mode 100644 index 0000000..9aad8a3 --- /dev/null +++ b/public/src/games/2048/2048Game.js @@ -0,0 +1,689 @@ +import * as Phaser from 'phaser'; +import { GAME_WIDTH, GAME_HEIGHT, COLORS } from '../../config.js'; +import { Button } from '../../ui/Button.js'; +import { MusicPlayer } from '../../ui/MusicPlayer.js'; +import { playSound, SFX } from '../../ui/Sounds.js'; +import { api } from '../../services/api.js'; +import { + createState, spawnTile, applyMove, hasValidMoves, + buildTilePalette, buildTextColorTable, getTileLevel, +} from './2048Logic.js'; + +const D = { bg: 0, board: 2, tiles: 5, tileText: 6, fx: 10, ui: 20, picker: 30, overlay: 40, overlayUI: 42 }; + +const FONT_TITLE = 'Righteous'; +const FONT_LABEL = '"Julius Sans One"'; + +// Font size multipliers by tile value level (1-indexed by log2(val)) +const FS_LEVELS = { 1:36, 2:36, 3:36, 4:36, 5:36, 6:36, 7:30, 8:26, 9:22, 10:20, 11:18 }; + +export default class Game2048 extends Phaser.Scene { + constructor() { super('2048Game'); } + + init(data) { + this.gameDef = data?.game ?? { slug: '2048', name: '2048' }; + + this.schemes = []; + this.selectedScheme = null; + this.pickerObjs = []; + this.overlayObjs = []; + + this.state = null; + this.tilePalette = []; + this.tileTextColors = []; + this.tileContainers = []; + this.tileGraphics = []; + this.tileTexts = []; + + this.busy = false; + this.gameOver = false; + this.wonAlready = false; + this.score = 0; + this.best = 0; + + this.scoreValueText = null; + this.bestValueText = null; + this.bgFill = null; + this.boardGfx = null; + + this.boardX = 0; + this.boardY = 0; + this.cellSize = 0; + this.boardSize = 0; + } + + create() { + try { + const music = this.cache.json.get('music'); + if (music?.tracks) new MusicPlayer(this, music.tracks); + } catch (_) {} + + this.schemes = this.cache.json.get('colored-playfields')?.schemes ?? []; + this.best = Number(localStorage.getItem('2048-best') ?? 0); + + const HUD_H = 130; + const PAD = 60; + const availW = GAME_WIDTH - PAD * 2; + const availH = GAME_HEIGHT - HUD_H - PAD * 2; + this.boardSize = Math.min(Math.floor(availW * 0.48), availH); + this.cellSize = Math.floor((this.boardSize - 24) / 4); + this.boardX = Math.floor(GAME_WIDTH / 2 - this.boardSize / 2); + this.boardY = HUD_H + PAD; + + this.bgFill = this.add.rectangle(GAME_WIDTH / 2, GAME_HEIGHT / 2, GAME_WIDTH, GAME_HEIGHT, COLORS.bg).setDepth(D.bg); + + this._buildHUD(); + this._buildTileGrid(); + this._registerInput(); + + const savedId = localStorage.getItem('2048-scheme'); + if (savedId) { + this.selectedScheme = this.schemes.find(s => s.id === savedId) ?? this.schemes[0]; + this._startGameplay(); + } else { + this._showSchemePicker(); + } + } + + // ─── Layout helper ─────────────────────────────────────────────────────────── + + _cellCenter(r, c) { + const cellOuter = this.boardSize / 4; + return { + cx: this.boardX + c * cellOuter + cellOuter / 2, + cy: this.boardY + r * cellOuter + cellOuter / 2, + }; + } + + // ─── HUD ───────────────────────────────────────────────────────────────────── + + _buildHUD() { + const cx = GAME_WIDTH / 2; + + this.add.text(80, 65, '2048', { + fontFamily: FONT_TITLE, fontSize: '80px', color: COLORS.goldHex, + }).setOrigin(0, 0.5).setDepth(D.ui); + + // Score box + this._drawScoreBox(cx - 200, 65, 'SCORE'); + this.scoreValueText = this.add.text(cx - 200, 78, '0', { + fontFamily: FONT_TITLE, fontSize: '44px', color: COLORS.textHex, + }).setOrigin(0.5, 0).setDepth(D.ui); + + // Best box + this._drawScoreBox(cx + 200, 65, 'BEST'); + this.bestValueText = this.add.text(cx + 200, 78, String(this.best), { + fontFamily: FONT_TITLE, fontSize: '44px', color: COLORS.textHex, + }).setOrigin(0.5, 0).setDepth(D.ui); + + new Button(this, GAME_WIDTH - 270, 65, 'New Game', () => this._newGame(), { variant: 'ghost', width: 200, height: 54, fontSize: 22 }).setDepth(D.ui); + new Button(this, GAME_WIDTH - 60, 65, 'Theme', () => this._showSchemePicker(), { variant: 'ghost', width: 110, height: 54, fontSize: 22 }).setDepth(D.ui); + } + + _drawScoreBox(x, y, label) { + const g = this.add.graphics().setDepth(D.ui); + g.fillStyle(0x000000, 0.3); + g.fillRoundedRect(x - 115, y - 55, 230, 100, 10); + this.add.text(x, y - 30, label, { + fontFamily: FONT_LABEL, fontSize: '22px', color: COLORS.mutedHex, + }).setOrigin(0.5).setDepth(D.ui); + } + + // ─── Tile grid (built once, reused across games) ────────────────────────────── + + _buildTileGrid() { + const GAP = 8; + const W = this.boardSize + GAP * 2; + const H = this.boardSize + GAP * 2; + const bx = this.boardX - GAP; + const by = this.boardY - GAP; + + this.boardGfx = this.add.graphics().setDepth(D.board); + this._redrawBoardChrome(0x000000); + + // Empty cell slots (drawn once) + const slotGfx = this.add.graphics().setDepth(D.board + 1); + const cellOuter = this.boardSize / 4; + for (let r = 0; r < 4; r++) { + for (let c = 0; c < 4; c++) { + const { cx, cy } = this._cellCenter(r, c); + const ts = this.cellSize - 4; + slotGfx.fillStyle(0xffffff, 0.06); + slotGfx.fillRoundedRect(cx - ts / 2, cy - ts / 2, ts, ts, 7); + } + } + + this.tileContainers = []; + this.tileGraphics = []; + this.tileTexts = []; + + const fontSize = `${Math.floor(this.cellSize * 0.36)}px`; + + for (let r = 0; r < 4; r++) { + this.tileContainers[r] = []; + this.tileGraphics[r] = []; + this.tileTexts[r] = []; + for (let c = 0; c < 4; c++) { + const { cx, cy } = this._cellCenter(r, c); + const g = this.add.graphics().setDepth(D.tiles); + const t = this.add.text(0, 0, '', { + fontFamily: FONT_TITLE, fontSize, color: '#ffffff', + }).setOrigin(0.5).setDepth(D.tileText); + const cont = this.add.container(cx, cy, [g, t]).setDepth(D.tiles).setAlpha(0); + this.tileContainers[r][c] = cont; + this.tileGraphics[r][c] = g; + this.tileTexts[r][c] = t; + } + } + } + + _redrawBoardChrome(baseColor) { + const GAP = 8; + const bx = this.boardX - GAP; + const by = this.boardY - GAP; + const W = this.boardSize + GAP * 2; + const H = this.boardSize + GAP * 2; + + this.boardGfx.clear(); + // Outer shadow + this.boardGfx.fillStyle(0x000000, 0.5); + this.boardGfx.fillRoundedRect(bx + 4, by + 4, W, H, 14); + // Board panel — darkened base color + const panelColor = this._mixInts(baseColor, 0xffffff, 0.12); + this.boardGfx.fillStyle(panelColor, 1); + this.boardGfx.fillRoundedRect(bx, by, W, H, 12); + // Inner border glow + this.boardGfx.lineStyle(2, this._mixInts(baseColor, 0xffffff, 0.3), 0.4); + this.boardGfx.strokeRoundedRect(bx, by, W, H, 12); + } + + _mixInts(a, b, t) { + const ar = (a >> 16) & 255, ag = (a >> 8) & 255, ab = a & 255; + const br = (b >> 16) & 255, bg = (b >> 8) & 255, bb = b & 255; + return (Math.round(ar + (br - ar) * t) << 16) | + (Math.round(ag + (bg - ag) * t) << 8) | + Math.round(ab + (bb - ab) * t); + } + + // ─── Input ─────────────────────────────────────────────────────────────────── + + _registerInput() { + const dirMap = { + ArrowLeft: 'left', ArrowRight: 'right', ArrowUp: 'up', ArrowDown: 'down', + KeyA: 'left', KeyD: 'right', KeyW: 'up', KeyS: 'down', + }; + this.input.keyboard.on('keydown', (e) => { + if (this.busy || this.gameOver || !this.state || this.pickerObjs.length > 0) return; + const dir = dirMap[e.code]; + if (dir) { e.preventDefault?.(); this._doMove(dir); } + }); + + let touchStart = null; + this.input.on('pointerdown', (p) => { touchStart = { x: p.x, y: p.y }; }); + this.input.on('pointerup', (p) => { + if (!touchStart || this.busy || this.gameOver || !this.state || this.pickerObjs.length > 0) return; + const dx = p.x - touchStart.x; + const dy = p.y - touchStart.y; + touchStart = null; + if (Math.max(Math.abs(dx), Math.abs(dy)) < 30) return; + const dir = Math.abs(dx) > Math.abs(dy) + ? (dx > 0 ? 'right' : 'left') + : (dy > 0 ? 'down' : 'up'); + this._doMove(dir); + }); + } + + // ─── Scheme picker ─────────────────────────────────────────────────────────── + + _showSchemePicker() { + this._destroyPicker(); + + const cx = GAME_WIDTH / 2, cy = GAME_HEIGHT / 2; + const PW = 1260, PH = 740; + const px = cx - PW / 2, py = cy - PH / 2; + + // Dim overlay + const dim = this.add.rectangle(cx, cy, GAME_WIDTH, GAME_HEIGHT, 0x000000, 0.72) + .setDepth(D.picker).setInteractive(); + this.pickerObjs.push(dim); + + // Panel + const panel = this.add.graphics().setDepth(D.picker); + panel.fillStyle(COLORS.panel, 0.98); + panel.fillRoundedRect(px, py, PW, PH, 18); + panel.lineStyle(2, COLORS.accent, 0.8); + panel.strokeRoundedRect(px, py, PW, PH, 18); + this.pickerObjs.push(panel); + + const title = this.add.text(cx, py + 44, 'Choose a Theme', { + fontFamily: FONT_TITLE, fontSize: '46px', color: COLORS.goldHex, + }).setOrigin(0.5).setDepth(D.picker + 1); + this.pickerObjs.push(title); + + // Swatches — 5 cols × 4 rows + const COLS = 5; + const SW = 218, SH = 122, SGAP = 16; + const gridW = COLS * SW + (COLS - 1) * SGAP; + const startX = cx - gridW / 2; + const startY = py + 106; + + this.schemes.forEach((scheme, idx) => { + const col = idx % COLS; + const row = Math.floor(idx / COLS); + const sx = startX + col * (SW + SGAP); + const sy = startY + row * (SH + SGAP); + const scx = sx + SW / 2, scy = sy + SH / 2; + + const g = this.add.graphics().setDepth(D.picker + 1); + this._drawSwatch(g, sx, sy, SW, SH, scheme); + + // Selection ring + const isSelected = this.selectedScheme?.id === scheme.id; + const ring = this.add.graphics().setDepth(D.picker + 2); + if (isSelected) { + ring.lineStyle(3, COLORS.accent, 1); + ring.strokeRoundedRect(sx - 2, sy - 2, SW + 4, SH + 4, 10); + } + + // Scheme name + const nameText = this.add.text(scx, sy + SH - 18, scheme.name, { + fontFamily: FONT_LABEL, fontSize: '16px', color: '#ffffff', + stroke: '#000000', strokeThickness: 3, + }).setOrigin(0.5, 1).setDepth(D.picker + 3); + + // Hit area + const hitZone = this.add.rectangle(scx, scy, SW, SH, 0, 0) + .setDepth(D.picker + 4).setInteractive({ useHandCursor: true }); + + hitZone.on('pointerover', () => { + ring.clear(); + ring.lineStyle(3, COLORS.accent, 1); + ring.strokeRoundedRect(sx - 2, sy - 2, SW + 4, SH + 4, 10); + }); + hitZone.on('pointerout', () => { + ring.clear(); + if (this.selectedScheme?.id === scheme.id) { + ring.lineStyle(3, COLORS.accent, 1); + ring.strokeRoundedRect(sx - 2, sy - 2, SW + 4, SH + 4, 10); + } + }); + hitZone.on('pointerup', () => this._selectScheme(scheme)); + + this.pickerObjs.push(g, ring, nameText, hitZone); + }); + + // Close button (only if a game is in progress) + if (this.state !== null) { + const closeBtn = new Button(this, cx, py + PH - 36, 'Close', () => this._destroyPicker(), { + variant: 'ghost', width: 160, height: 48, fontSize: 20, + }).setDepth(D.picker + 4); + this.pickerObjs.push(closeBtn); + } + } + + _drawSwatch(g, sx, sy, sw, sh, scheme) { + const base = parseInt(scheme.base.replace('#', ''), 16); + g.fillStyle(base, 1); + g.fillRoundedRect(sx, sy, sw, sh, 8); + + // Diagonal accent sweeps + const accents = scheme.accents.map(h => parseInt(h.replace('#', ''), 16)); + accents.forEach((color, i) => { + g.fillStyle(color, 0.28 - i * 0.04); + const offset = i * 14; + // Simple diagonal stripe effect using a rotated rect approximation + g.fillTriangle( + sx + offset, sy, + sx + sw * 0.7 + offset, sy, + sx + offset, sy + sh * 0.8 + ); + }); + + // Tile preview squares + const tileColors = buildTilePalette(scheme); + const tileSize = 18; + const tileGap = 4; + const previewW = 4 * tileSize + 3 * tileGap; + const ptx = sx + (sw - previewW) / 2; + const pty = sy + sh / 2 - tileSize * 0.5 - 10; + [0, 2, 5, 8].forEach((lvl, i) => { + g.fillStyle(tileColors[lvl], 1); + g.fillRoundedRect(ptx + i * (tileSize + tileGap), pty, tileSize, tileSize, 3); + }); + } + + _selectScheme(scheme) { + this.selectedScheme = scheme; + localStorage.setItem('2048-scheme', scheme.id); + this._destroyPicker(); + this._clearOverlays(); + this._startGameplay(); + } + + _destroyPicker() { + for (const obj of this.pickerObjs) { + try { obj.destroy(); } catch (_) {} + } + this.pickerObjs = []; + } + + // ─── Gameplay ──────────────────────────────────────────────────────────────── + + _startGameplay() { + const scheme = this.selectedScheme; + this.tilePalette = buildTilePalette(scheme); + this.tileTextColors = buildTextColorTable(this.tilePalette); + + const baseInt = parseInt(scheme.base.replace('#', ''), 16); + this.bgFill.setFillStyle(baseInt); + this._redrawBoardChrome(baseInt); + + this.state = spawnTile(spawnTile(createState())); + this.score = 0; + this.gameOver = false; + this.wonAlready = false; + this.busy = false; + + this.scoreValueText.setText('0').setColor(COLORS.textHex); + + // Hide all tiles + for (let r = 0; r < 4; r++) + for (let c = 0; c < 4; c++) + this.tileContainers[r][c].setAlpha(0).setScale(1); + + // Animate the two starting tiles + const spawns = []; + for (let i = 0; i < 16; i++) if (this.state.grid[i] > 0) spawns.push(i); + this._redrawAllTiles(this.state); + for (const idx of spawns) { + const r = Math.floor(idx / 4), c = idx % 4; + const cont = this.tileContainers[r][c]; + cont.setAlpha(1).setScale(0); + this.tweens.add({ targets: cont, scaleX: 1, scaleY: 1, duration: 160, ease: 'Back.easeOut' }); + } + } + + _newGame() { + this._clearOverlays(); + this._startGameplay(); + } + + // ─── Move logic ────────────────────────────────────────────────────────────── + + _doMove(dir) { + if (this.busy || this.gameOver || !this.state) return; + const newState = applyMove(this.state, dir); + if (!newState) return; + + this.busy = true; + playSound(this, SFX.PIECE_CLICK); + + this._animateMove(this.state, newState, () => { + this.state = newState; + this._updateScore(newState.score); + + if (!this.wonAlready && newState.won) { + this.wonAlready = true; + this.time.delayedCall(120, () => this._showWinOverlay()); + } + + if (!hasValidMoves(newState)) { + this.gameOver = true; + this.busy = false; + this.time.delayedCall(300, () => this._showGameOverOverlay()); + return; + } + + this.busy = false; + }); + } + + _animateMove(oldState, newState, onDone) { + const SLIDE_MS = 95; + const MERGE_MS = 140; + const SPAWN_MS = 115; + + // Phase 1: slide tiles to their new positions + const movesToAnimate = newState.moves.filter(m => m.fromIdx !== m.toIdx); + + // For merges, two source tiles go to the same destination. + // We only animate the "first" of a pair (visually one tile slides). + const seen = new Set(); + const uniqueMoves = []; + for (const m of movesToAnimate) { + const key = `${m.fromIdx}-${m.toIdx}`; + if (!seen.has(key)) { seen.add(key); uniqueMoves.push(m); } + } + + const spawnPhase = () => { + if (newState.spawned === null) { onDone(); return; } + const r = Math.floor(newState.spawned / 4), c = newState.spawned % 4; + const cont = this.tileContainers[r][c]; + cont.setAlpha(1).setScale(0); + this.tweens.add({ + targets: cont, scaleX: 1, scaleY: 1, + duration: SPAWN_MS, ease: 'Back.easeOut', + onComplete: onDone, + }); + }; + + const afterSlides = () => { + this._redrawAllTiles(newState); + + if (newState.mergedAt.length === 0) { spawnPhase(); return; } + + let mergePending = newState.mergedAt.length; + const afterMerges = () => { mergePending--; if (mergePending === 0) spawnPhase(); }; + + for (const idx of newState.mergedAt) { + const r = Math.floor(idx / 4), c = idx % 4; + const cont = this.tileContainers[r][c]; + const mergeVal = newState.grid[idx]; + this._scorePopup(cont.x, cont.y - 40, mergeVal); + this.tweens.add({ + targets: cont, scaleX: 1.2, scaleY: 1.2, + duration: MERGE_MS / 2, ease: 'Quad.easeOut', + yoyo: true, onComplete: afterMerges, + }); + } + }; + + let pending = uniqueMoves.length; + if (pending === 0) { afterSlides(); return; } + + for (const mv of uniqueMoves) { + const fr = Math.floor(mv.fromIdx / 4), fc = mv.fromIdx % 4; + const tr = Math.floor(mv.toIdx / 4), tc = mv.toIdx % 4; + const cont = this.tileContainers[fr][fc]; + const { cx: tx, cy: ty } = this._cellCenter(tr, tc); + this.tweens.add({ + targets: cont, x: tx, y: ty, + duration: SLIDE_MS, ease: 'Quad.easeOut', + onComplete: () => { pending--; if (pending === 0) afterSlides(); }, + }); + } + } + + _redrawAllTiles(state) { + const CS = this.cellSize - 6; + const baseLevel = 36; + + for (let r = 0; r < 4; r++) { + for (let c = 0; c < 4; c++) { + const val = state.grid[r * 4 + c]; + const { cx, cy } = this._cellCenter(r, c); + const cont = this.tileContainers[r][c]; + const gfx = this.tileGraphics[r][c]; + const txt = this.tileTexts[r][c]; + + if (val === 0) { + cont.setAlpha(0); + cont.setPosition(cx, cy).setScale(1); + continue; + } + cont.setPosition(cx, cy).setScale(1); + + const level = getTileLevel(val); + const color = this.tilePalette[level]; + + gfx.clear(); + // Shadow + gfx.fillStyle(0x000000, 0.35); + gfx.fillRoundedRect(-CS / 2 + 3, -CS / 2 + 3, CS, CS, 8); + // Main tile + gfx.fillStyle(color, 1); + gfx.fillRoundedRect(-CS / 2, -CS / 2, CS, CS, 8); + // Top sheen + const sheen = this._mixInts(color, 0xffffff, 0.22); + gfx.fillStyle(sheen, 0.3); + gfx.fillRoundedRect(-CS / 2, -CS / 2, CS, Math.floor(CS * 0.45), 8); + + txt.setText(String(val)); + txt.setColor(this.tileTextColors[level]); + const log = Math.round(Math.log2(val)); + const fsMultiplier = (FS_LEVELS[log] ?? 18) / 100; + txt.setFontSize(`${Math.floor(this.cellSize * fsMultiplier)}px`); + + cont.setAlpha(1); + } + } + } + + // ─── Score ─────────────────────────────────────────────────────────────────── + + _updateScore(newScore) { + this.score = newScore; + this.scoreValueText.setText(newScore.toLocaleString()); + if (newScore > this.best) { + this.best = newScore; + localStorage.setItem('2048-best', String(newScore)); + this.bestValueText.setText(newScore.toLocaleString()).setColor(COLORS.goldHex); + } + } + + _scorePopup(x, y, points) { + const t = this.add.text(x, y, `+${points.toLocaleString()}`, { + fontFamily: FONT_TITLE, fontSize: '30px', color: COLORS.goldHex, + stroke: '#0a0805', strokeThickness: 5, + }).setOrigin(0.5).setDepth(D.fx); + this.tweens.add({ + targets: t, y: y - 68, alpha: 0, duration: 820, ease: 'Quad.easeOut', + onComplete: () => t.destroy(), + }); + } + + // ─── Win overlay ───────────────────────────────────────────────────────────── + + _showWinOverlay() { + const cx = GAME_WIDTH / 2, cy = GAME_HEIGHT / 2; + const accentInt = this.tilePalette[this.tilePalette.length - 1]; + + // Particle celebration + if (!this.textures.exists('2048-dot')) { + const g = this.make.graphics({ x: 0, y: 0, add: false }); + g.fillStyle(0xffffff, 1); + g.fillCircle(5, 5, 5); + g.generateTexture('2048-dot', 10, 10); + g.destroy(); + } + const emitter = this.add.particles(cx, cy - 60, '2048-dot', { + speed: { min: 250, max: 680 }, + lifespan: 1800, + scale: { start: 1.6, end: 0 }, + alpha: { start: 1, end: 0 }, + quantity: 5, + frequency: 18, + tint: [accentInt, 0xffffff, this.tilePalette[8]], + angle: { min: 0, max: 360 }, + }).setDepth(D.fx); + this.time.delayedCall(2200, () => { try { emitter.destroy(); } catch (_) {} }); + + const objs = []; + + const dim = this.add.rectangle(cx, cy, GAME_WIDTH, GAME_HEIGHT, 0x000000, 0.5) + .setDepth(D.overlay).setInteractive(); + objs.push(dim); + + const panel = this.add.graphics().setDepth(D.overlay + 1); + panel.fillStyle(COLORS.panel, 0.96); + panel.fillRoundedRect(cx - 400, cy - 195, 800, 390, 22); + panel.lineStyle(3, accentInt, 1); + panel.strokeRoundedRect(cx - 400, cy - 195, 800, 390, 22); + objs.push(panel); + + const accentHex = '#' + accentInt.toString(16).padStart(6, '0'); + objs.push(this.add.text(cx, cy - 110, '🎉 You reached 2048!', { + fontFamily: FONT_TITLE, fontSize: '58px', color: accentHex, + }).setOrigin(0.5).setDepth(D.overlay + 2)); + + objs.push(this.add.text(cx, cy - 20, 'Keep going for an even higher score!', { + fontFamily: FONT_LABEL, fontSize: '28px', color: COLORS.textHex, + }).setOrigin(0.5).setDepth(D.overlay + 2)); + + const closeAll = () => { objs.forEach(o => { try { o.destroy(); } catch (_) {} }); }; + + const btn = new Button(this, cx, cy + 90, 'Keep Playing', closeAll, { width: 270, height: 62, fontSize: 26 }) + .setDepth(D.overlay + 2); + objs.push(btn); + + this.time.delayedCall(5000, closeAll); + this.overlayObjs.push(...objs); + } + + // ─── Game over overlay ─────────────────────────────────────────────────────── + + _showGameOverOverlay() { + api.post('/history/single-player', { + slug: '2048', score: this.score, opponentScores: [], result: 'win', + }).catch(() => {}); + + const cx = GAME_WIDTH / 2, cy = GAME_HEIGHT / 2; + const objs = []; + + const dim = this.add.rectangle(cx, cy, GAME_WIDTH, GAME_HEIGHT, 0x000000, 0.7) + .setDepth(D.overlay).setInteractive(); + objs.push(dim); + + const panel = this.add.graphics().setDepth(D.overlay + 1); + panel.fillStyle(COLORS.panel, 0.98); + panel.fillRoundedRect(cx - 420, cy - 305, 840, 610, 24); + panel.lineStyle(3, COLORS.accent, 0.9); + panel.strokeRoundedRect(cx - 420, cy - 305, 840, 610, 24); + objs.push(panel); + + objs.push(this.add.text(cx, cy - 218, 'Game Over', { + fontFamily: FONT_TITLE, fontSize: '72px', color: COLORS.dangerHex, + }).setOrigin(0.5).setDepth(D.overlay + 2)); + + objs.push(this.add.text(cx, cy - 120, 'FINAL SCORE', { + fontFamily: FONT_LABEL, fontSize: '26px', color: COLORS.mutedHex, + }).setOrigin(0.5).setDepth(D.overlay + 2)); + + objs.push(this.add.text(cx, cy - 36, this.score.toLocaleString(), { + fontFamily: FONT_TITLE, fontSize: '92px', color: COLORS.goldHex, + }).setOrigin(0.5).setDepth(D.overlay + 2)); + + const isNewBest = this.score >= this.best; + const bestMsg = isNewBest ? '★ New Best!' : `Best: ${this.best.toLocaleString()}`; + objs.push(this.add.text(cx, cy + 72, bestMsg, { + fontFamily: FONT_LABEL, fontSize: '32px', + color: isNewBest ? COLORS.goldHex : COLORS.mutedHex, + }).setOrigin(0.5).setDepth(D.overlay + 2)); + + const playAgain = new Button(this, cx - 130, cy + 186, 'Play Again', () => this._newGame(), { + width: 220, height: 62, fontSize: 24, + }).setDepth(D.overlay + 2); + const leave = new Button(this, cx + 130, cy + 186, 'Leave', () => this.scene.start('GameMenu'), { + variant: 'ghost', width: 220, height: 62, fontSize: 24, + }).setDepth(D.overlay + 2); + objs.push(playAgain, leave); + this.overlayObjs.push(...objs); + } + + _clearOverlays() { + for (const obj of this.overlayObjs) { + try { obj.destroy(); } catch (_) {} + } + this.overlayObjs = []; + } +} diff --git a/public/src/games/2048/2048Logic.js b/public/src/games/2048/2048Logic.js new file mode 100644 index 0000000..f319e3e --- /dev/null +++ b/public/src/games/2048/2048Logic.js @@ -0,0 +1,189 @@ +function hexToInt(hex) { + return parseInt(hex.replace('#', ''), 16); +} + +function mixInt(a, b, t) { + const ar = (a >> 16) & 255, ag = (a >> 8) & 255, ab = a & 255; + const br = (b >> 16) & 255, bg = (b >> 8) & 255, bb = b & 255; + return (Math.round(ar + (br - ar) * t) << 16) | + (Math.round(ag + (bg - ag) * t) << 8) | + Math.round(ab + (bb - ab) * t); +} + +// Returns 11 integer colors for tile values 2, 4, 8 … 2048 +export function buildTilePalette(scheme) { + const accInts = scheme.accents.map(hexToInt); + const ramp = [ + mixInt(accInts[0], 0x000000, 0.55), + ...accInts, + mixInt(accInts[accInts.length - 1], 0xffffff, 0.35), + ]; + const palette = []; + for (let i = 0; i < 11; i++) { + const t = i / 10; + const seg = (ramp.length - 1) * t; + const lo = Math.floor(seg); + const hi = Math.min(lo + 1, ramp.length - 1); + palette.push(mixInt(ramp[lo], ramp[hi], seg - lo)); + } + return palette; +} + +// Returns 11 hex color strings for tile text (light on dark, dark on light) +export function buildTextColorTable(palette) { + return palette.map((_, i) => (i >= 5 ? '#ffffff' : '#1a1208')); +} + +// Map tile value (2..2048+) to palette index 0-10 +export function getTileLevel(value) { + if (value <= 0) return 0; + return Math.min(Math.round(Math.log2(value)) - 1, 10); +} + +export function createState() { + return { + grid: new Int32Array(16), + score: 0, + won: false, + over: false, + spawned: null, + mergedAt: [], + moves: [], + }; +} + +export function spawnTile(state) { + const empties = []; + for (let i = 0; i < 16; i++) if (state.grid[i] === 0) empties.push(i); + if (empties.length === 0) return { ...state, spawned: null, mergedAt: [], moves: [] }; + const idx = empties[Math.floor(Math.random() * empties.length)]; + const val = Math.random() < 0.9 ? 2 : 4; + const grid = new Int32Array(state.grid); + grid[idx] = val; + return { ...state, grid, spawned: idx, mergedAt: [], moves: [] }; +} + +export function hasValidMoves(state) { + for (let i = 0; i < 16; i++) { + if (state.grid[i] === 0) return true; + const r = Math.floor(i / 4), c = i % 4; + if (c < 3 && state.grid[i] === state.grid[i + 1]) return true; + if (r < 3 && state.grid[i] === state.grid[i + 4]) return true; + } + return false; +} + +// Rotate grid 90° clockwise (for direction abstraction) +function rotateGrid(grid) { + const g = new Int32Array(16); + for (let r = 0; r < 4; r++) + for (let c = 0; c < 4; c++) + g[c * 4 + (3 - r)] = grid[r * 4 + c]; + return g; +} + +// Merge a single row leftward; returns { row, mergedCols, scoreGained } +function mergeRow(row) { + const vals = row.filter(v => v > 0); + const out = [0, 0, 0, 0]; + const mergedCols = []; + let si = 0; + for (let i = 0; i < vals.length; i++) { + if (i + 1 < vals.length && vals[i] === vals[i + 1]) { + out[si] = vals[i] * 2; + mergedCols.push(si); + si++; + i++; + } else { + out[si++] = vals[i]; + } + } + return { row: out, mergedCols }; +} + +export function applyMove(state, dir) { + // Number of 90° CW rotations to make the move direction equivalent to "left" + const rotations = { left: 0, down: 1, right: 2, up: 3 }; + const nRot = rotations[dir]; + + let g = new Int32Array(state.grid); + for (let i = 0; i < nRot; i++) g = rotateGrid(g); + + const newGrid = new Int32Array(16); + const mergedAtRotated = []; + let scoreGained = 0; + // moves: track fromIdx→toIdx in rotated space, then we'll map back + const movesRotated = []; + + for (let r = 0; r < 4; r++) { + const row = [g[r*4], g[r*4+1], g[r*4+2], g[r*4+3]]; + const { row: merged, mergedCols } = mergeRow(row); + + for (const mc of mergedCols) { + mergedAtRotated.push(r * 4 + mc); + scoreGained += merged[mc]; + } + + // Track where each non-zero original cell ends up + const srcCols = []; + for (let c = 0; c < 4; c++) if (row[c] > 0) srcCols.push(c); + let dstIdx = 0; + let srcConsumed = 0; + for (let di = 0; di < 4 && dstIdx < srcCols.length; di++) { + if (merged[di] === 0) continue; + if (merged[di] === row[srcCols[srcConsumed]] && srcConsumed + 1 < srcCols.length && row[srcCols[srcConsumed]] === row[srcCols[srcConsumed + 1]]) { + // two tiles merged into merged[di] + movesRotated.push({ fromIdx: r*4+srcCols[srcConsumed], toIdx: r*4+di, value: merged[di] }); + movesRotated.push({ fromIdx: r*4+srcCols[srcConsumed+1], toIdx: r*4+di, value: merged[di] }); + srcConsumed += 2; + } else { + movesRotated.push({ fromIdx: r*4+srcCols[srcConsumed], toIdx: r*4+di, value: merged[di] }); + srcConsumed++; + } + newGrid[r*4+di] = merged[di]; + } + } + + // Check if anything changed + let changed = false; + for (let i = 0; i < 16; i++) if (newGrid[i] !== g[i]) { changed = true; break; } + if (!changed) return null; + + // Rotate result back + const unRotations = (4 - nRot) % 4; + + let finalGrid = newGrid; + for (let i = 0; i < unRotations; i++) finalGrid = rotateGrid(finalGrid); + + // Map mergedAt and moves back through unRotations + function mapIdx(idx, times) { + let r = Math.floor(idx / 4), c = idx % 4; + for (let i = 0; i < times; i++) { + const nr = c, nc = 3 - r; + r = nr; c = nc; + } + return r * 4 + c; + } + + const mergedAt = mergedAtRotated.map(i => mapIdx(i, unRotations)); + const moves = movesRotated.map(m => ({ + fromIdx: mapIdx(m.fromIdx, unRotations), + toIdx: mapIdx(m.toIdx, unRotations), + value: m.value, + })); + + const newScore = state.score + scoreGained; + const won = state.won || finalGrid.some(v => v >= 2048); + + const nextState = { + grid: finalGrid, + score: newScore, + won, + over: false, + spawned: null, + mergedAt, + moves, + }; + + return spawnTile(nextState); +} diff --git a/public/src/main.js b/public/src/main.js index 4bd0015..c25e863 100644 --- a/public/src/main.js +++ b/public/src/main.js @@ -76,6 +76,7 @@ import SlotsGame from './games/slots/SlotsGame.js'; import CribbageGame from './games/cribbage/CribbageGame.js'; import CanastaGame from './games/canasta/CanastaGame.js'; import DotLinkGame from './games/dotlink/DotLinkGame.js'; +import Game2048 from './games/2048/2048Game.js'; const config = { type: Phaser.AUTO, @@ -165,6 +166,7 @@ const config = { CribbageGame, CanastaGame, DotLinkGame, + Game2048, ], }; diff --git a/public/src/scenes/GameRoomScene.js b/public/src/scenes/GameRoomScene.js index d6ee0de..3f91b24 100644 --- a/public/src/scenes/GameRoomScene.js +++ b/public/src/scenes/GameRoomScene.js @@ -22,7 +22,7 @@ export default class GameRoomScene extends Phaser.Scene { } create() { - const slugDispatch = { backgammon: 'Backgammon', holdem: 'HoldemGame', blackjack: 'BlackjackGame', parchisi: 'ParchisiGame', yatzi: 'YatziGame', skipbo: 'SkipBoGame', phase10: 'Phase10Game', chinesecheckers: 'ChineseCheckersGame', gofish: 'GoFishGame', uno: 'UnoGame', craps: 'CrapsGame', roulette: 'RouletteGame', mexicantrain: 'MexicanTrainGame', hearts: 'HeartsGame', catan: 'CatanGame', tickettoride: 'TicketToRideGame', nerts: 'NertsGame', bingo: 'BingoGame', baccarat: 'BaccaratGame', dominion: 'DominionGame', checkers: 'CheckersGame', chess: 'ChessGame', wordle: 'WordleGame', scrabble: 'ScrabbleGame', ghost: 'GhostGame', wordladder: 'WordLadderGame', wordsearch: 'WordSearchGame', hangman: 'HangmanGame', sudoku: 'SudokuGame', othello: 'OthelloGame', go: 'GoGame', battleship: 'BattleshipGame', mastermind: 'MastermindGame', connect4: 'Connect4Game', boggle: 'BoggleGame', oldmaid: 'OldMaidGame', blokus: 'BlokusGame', spellingbee: 'SpellingBeeGame', minicrossword: 'MiniCrosswordGame', forbiddenisland: 'ForbiddenIslandGame', solitairetour: 'SolitaireTourGame', splendor: 'SplendorGame', tectonic: 'TectonicGame', labyrinth: 'LabyrinthGame', videopoker: 'VideoPokerGame', farkel: 'FarkelGame', stratego: 'StrategoGame', kiitos: 'KiitosGame', monopoly: 'MonopolyGame', triominoes: 'TriominoesGame', freecell: 'FreecellGame', rushhour: 'RushHourGame', hexsweeper: 'HexsweeperGame', puddingmonsters: 'PuddingMonstersGame', shift: 'ShiftGame', blockfighter: 'BlockFighterGame', mahjongmatch: 'MahjongMatchGame', mahjong: 'MahjongGame', jewelquest: 'JewelQuestGame', zuma: 'ZumaGame', bejeweled: 'BejeweledGame', minimotorways: 'MiniMotorwaysGame', slots: 'SlotsGame', cribbage: 'CribbageGame', canasta: 'CanastaGame', dotlink: 'DotLinkGame' }; + const slugDispatch = { backgammon: 'Backgammon', holdem: 'HoldemGame', blackjack: 'BlackjackGame', parchisi: 'ParchisiGame', yatzi: 'YatziGame', skipbo: 'SkipBoGame', phase10: 'Phase10Game', chinesecheckers: 'ChineseCheckersGame', gofish: 'GoFishGame', uno: 'UnoGame', craps: 'CrapsGame', roulette: 'RouletteGame', mexicantrain: 'MexicanTrainGame', hearts: 'HeartsGame', catan: 'CatanGame', tickettoride: 'TicketToRideGame', nerts: 'NertsGame', bingo: 'BingoGame', baccarat: 'BaccaratGame', dominion: 'DominionGame', checkers: 'CheckersGame', chess: 'ChessGame', wordle: 'WordleGame', scrabble: 'ScrabbleGame', ghost: 'GhostGame', wordladder: 'WordLadderGame', wordsearch: 'WordSearchGame', hangman: 'HangmanGame', sudoku: 'SudokuGame', othello: 'OthelloGame', go: 'GoGame', battleship: 'BattleshipGame', mastermind: 'MastermindGame', connect4: 'Connect4Game', boggle: 'BoggleGame', oldmaid: 'OldMaidGame', blokus: 'BlokusGame', spellingbee: 'SpellingBeeGame', minicrossword: 'MiniCrosswordGame', forbiddenisland: 'ForbiddenIslandGame', solitairetour: 'SolitaireTourGame', splendor: 'SplendorGame', tectonic: 'TectonicGame', labyrinth: 'LabyrinthGame', videopoker: 'VideoPokerGame', farkel: 'FarkelGame', stratego: 'StrategoGame', kiitos: 'KiitosGame', monopoly: 'MonopolyGame', triominoes: 'TriominoesGame', freecell: 'FreecellGame', rushhour: 'RushHourGame', hexsweeper: 'HexsweeperGame', puddingmonsters: 'PuddingMonstersGame', shift: 'ShiftGame', blockfighter: 'BlockFighterGame', mahjongmatch: 'MahjongMatchGame', mahjong: 'MahjongGame', jewelquest: 'JewelQuestGame', zuma: 'ZumaGame', bejeweled: 'BejeweledGame', minimotorways: 'MiniMotorwaysGame', slots: 'SlotsGame', cribbage: 'CribbageGame', canasta: 'CanastaGame', dotlink: 'DotLinkGame', '2048': '2048Game' }; if (slugDispatch[this.game.slug]) { this.scene.start(slugDispatch[this.game.slug], { game: this.game, diff --git a/server/games/registry.js b/server/games/registry.js index e36ef71..ef4af5b 100644 --- a/server/games/registry.js +++ b/server/games/registry.js @@ -47,7 +47,7 @@ registerGame({ slug: 'baccarat', name: 'Baccarat', category: 'casino', cardGame: registerGame({ slug: 'dominion', name: 'Dominion', category: 'cards', cardGame: true, minPlayers: 3, maxPlayers: 4, minOpponents: 2, maxOpponents: 3, hasTutorial: true, iconFrame: 19 }); registerGame({ slug: 'checkers', name: 'Checkers', category: 'tabletop', minPlayers: 2, maxPlayers: 2, minOpponents: 1, maxOpponents: 1, iconFrame: 20 }); registerGame({ slug: 'chess', name: 'Chess', category: 'tabletop', minPlayers: 2, maxPlayers: 2, minOpponents: 1, maxOpponents: 1, iconFrame: 21 }); -registerGame({ slug: 'wordle', name: 'Wordle', category: 'word', minPlayers: 2, maxPlayers: 2, minOpponents: 1, maxOpponents: 1, iconFrame: 22 }); +registerGame({ slug: 'wordle', name: 'Wordle Race', category: 'word', minPlayers: 2, maxPlayers: 2, minOpponents: 1, maxOpponents: 1, iconFrame: 22 }); registerGame({ slug: 'scrabble', name: 'Scrabble', category: 'word', minPlayers: 2, maxPlayers: 4, minOpponents: 1, maxOpponents: 3, iconFrame: 23 }); registerGame({ slug: 'ghost', name: 'Ghost', category: 'word', minPlayers: 2, maxPlayers: 2, minOpponents: 1, maxOpponents: 1, iconFrame: 24 }); registerGame({ slug: 'wordladder', name: 'Word Ladder', category: 'word', minPlayers: 1, maxPlayers: 2, minOpponents: 0, maxOpponents: 1, iconFrame: 25 }); @@ -91,3 +91,4 @@ registerGame({ slug: 'slots', name: 'Slot Machines', category: 'casino', minPlay registerGame({ slug: 'cribbage', name: 'Cribbage', category: 'cards', cardGame: true, minPlayers: 2, maxPlayers: 2, minOpponents: 1, maxOpponents: 1, hasTutorial: true, iconFrame: 64 }); registerGame({ slug: 'canasta', name: 'Canasta', category: 'cards', cardGame: true, minPlayers: 4, maxPlayers: 4, minOpponents: 3, maxOpponents: 3, hasTutorial: true, iconFrame: 65 }); registerGame({ slug: 'dotlink', name: 'Dot Link', category: 'logic', minPlayers: 1, maxPlayers: 1, minOpponents: 0, maxOpponents: 0, iconFrame: 66 }); +registerGame({ slug: '2048', name: '2048', category: 'logic', minPlayers: 1, maxPlayers: 1, minOpponents: 0, maxOpponents: 0, iconFrame: 67 });