diff --git a/2048.js b/2048.js index a83b061..b4aeec8 100644 --- a/2048.js +++ b/2048.js @@ -1,4 +1,3 @@ - /* ------------------------ State & Variables ------------------------ */ @@ -7,19 +6,19 @@ let currentScore = 0; let bestScore = parseInt(localStorage.getItem('bestScore2048')) || 0; let lastMoveDir = null; let isMoving = false; -let mergesInCurrentMove = 0; // NEW: Track combo +let mergesInCurrentMove = 0; /* ------------------------ Audio Setup ------------------------ */ const audio = { - bg: new Audio("bgmusic.mp3"), - pop: new Audio("pop.mp3"), - merge: new Audio("merge.wav") + bg: new Audio("Bgmusic.mp3"), + pop: new Audio("Pop.mp3"), + merge: new Audio("Merge.mp3") }; audio.bg.volume = 0.25; audio.pop.volume = 0.9; -audio.merge.volume = 0.9; +audio.merge.volume = 1.0; audio.bg.loop = true; function tryPlayBg() { @@ -192,7 +191,7 @@ function resetScore() { } /* ------------------------ - Add New Tile + Add New Tile - FIXED: Only play pop sound here ------------------------ */ function addNewTile() { const empty = []; @@ -210,6 +209,7 @@ function addNewTile() { const tile = document.getElementById(`${spot.r}-${spot.c}`); if (tile) { tile.classList.add("new"); + // ✅ POP SOUND: Hanya main di sini (tile baru muncul) playSound(audio.pop); setTimeout(() => tile.classList.remove("new"), 300); } @@ -226,7 +226,7 @@ function playSound(soundObj) { } /* ------------------------ - Movement Logic - UPDATED WITH COMBO + Movement Logic - FIXED: Merge sound plays consistently ------------------------ */ function filterZero(row) { return row.filter(n => n !== 0); @@ -236,25 +236,30 @@ function slide(row) { row = filterZero(row); let mergedThisMove = false; let mergedPositions = []; - let mergeCount = 0; // NEW: count merges + let mergeCount = 0; for (let i = 0; i < row.length - 1; i++) { if (row[i] === row[i + 1]) { row[i] = row[i] * 2; + + // ✅ MERGE SOUND & VIBRATION: Selalu main saat merge playSound(audio.merge); - if (navigator.vibrate) navigator.vibrate(28); + + if (navigator.vibrate) { + navigator.vibrate([80, 20, 80]); + } currentScore += row[i]; row[i + 1] = 0; mergedThisMove = true; mergedPositions.push(i); - mergeCount++; // NEW: increment count + mergeCount++; } } row = filterZero(row); while (row.length < 4) row.push(0); - return { row, merged: mergedThisMove, mergedPositions, mergeCount }; // NEW: return count + return { row, merged: mergedThisMove, mergedPositions, mergeCount }; } function arraysEqual(a, b) { @@ -265,7 +270,7 @@ function arraysEqual(a, b) { function moveLeft() { let moved = false; let mergedCells = []; - mergesInCurrentMove = 0; // Reset counter + mergesInCurrentMove = 0; for (let r = 0; r < 4; r++) { const { row: newRow, mergedPositions, mergeCount } = slide(board[r]); @@ -568,7 +573,7 @@ function hideGameOver() { } /* ============================================= - COMBO EFFECT HANDLER - NEW! + COMBO EFFECT HANDLER ============================================= */ function triggerComboEffect(mergedCells, comboCount) { if (mergedCells.length === 0) return; @@ -603,7 +608,7 @@ function triggerComboEffect(mergedCells, comboCount) { } /* ============================================= - COMBO POPUP - NEW! + COMBO POPUP ============================================= */ function showComboPopup(comboCount) { const board = document.getElementById('board'); @@ -767,7 +772,3 @@ function getTileColor(value) { }; return colors[value] || '#00eaff'; } - -/* ------------------------ - End of File - ------------------------ */ \ No newline at end of file diff --git a/Bgmusic.mp3 b/Bgmusic.mp3 new file mode 100644 index 0000000..4481143 Binary files /dev/null and b/Bgmusic.mp3 differ diff --git a/Merge.mp3 b/Merge.mp3 new file mode 100644 index 0000000..ecfe0c4 Binary files /dev/null and b/Merge.mp3 differ diff --git a/Pop.mp3 b/Pop.mp3 new file mode 100644 index 0000000..28b742f Binary files /dev/null and b/Pop.mp3 differ