diff --git a/js/app.js b/js/app.js index 8452a43..5b42561 100644 --- a/js/app.js +++ b/js/app.js @@ -1,10 +1,11 @@ -let scheduler = new Scheduler() -let settings = new Settings() -let stats = new Stats() -let holdQueue = new MinoesTable("holdTable") -let matrix = new Matrix() -let nextQueue = new NextQueue() -let playing = false +let scheduler = new Scheduler() +let settings = new Settings() +let stats = new Stats() +let holdQueue = new MinoesTable("holdTable") +let matrix = new Matrix() +let nextQueue = new NextQueue() +let playing = false +let lastActionSucceded = true let favicon window.onload = function(event) { @@ -94,6 +95,7 @@ function ticktack() { function generate(piece) { matrix.piece = piece || nextQueue.shift() + lastActionSucceded = true favicon.href = matrix.piece.favicon_href if (matrix.piece.canMove(TRANSLATION.NONE)) { @@ -112,23 +114,15 @@ let playerActions = { rotateCounterclockwise: () => matrix.piece.rotate(ROTATION.CCW), - softDrop: function() { - if (matrix.piece.move(TRANSLATION.DOWN)) { - stats.score++ - return true - } else { - return false - } - }, + softDrop: () => matrix.piece.move(TRANSLATION.DOWN) && ++stats.score, hardDrop: function() { scheduler.clearTimeout(lockDown) playSound(hardDropSound) while (matrix.piece.move(TRANSLATION.DOWN, ROTATION.NONE, true)) stats.score +=2 - // wallSound.currentTime = 0 - // wallSound.pause() matrix.table.classList.add("hard-dropped-table-animation") lockDown() + return true }, hold: function() { @@ -164,7 +158,12 @@ function onkeydown(event) { if (!pressedKeys.has(event.key)) { pressedKeys.add(event.key) action = settings.keyBind[event.key] - action() + if (action()) { + lastActionSucceded = true + } else if (lastActionSucceded) { + wallSound.play() + lastActionSucceded = false + } if (REPEATABLE_ACTIONS.includes(action)) { actionsQueue.unshift(action) scheduler.clearTimeout(repeat) @@ -186,10 +185,14 @@ function repeat() { function autorepeat() { if (actionsQueue.length) { - actionsQueue[0]() - } else { - scheduler.clearInterval(autorepeat) + if (actionsQueue[0]()) { + lastActionSucceded = true + } else if (lastActionSucceded) { + wallSound.play() + lastActionSucceded = false + } } + else scheduler.clearInterval(autorepeat) } function onkeyup(event) { diff --git a/js/game_logic.js b/js/game_logic.js index 6090282..8cdd978 100644 --- a/js/game_logic.js +++ b/js/game_logic.js @@ -103,17 +103,32 @@ class Scheduler { } setInterval(func, delay, ...args) { - this.intervalTasks.set(func, window.setInterval(func, delay, ...args)) + if (this.intervalTasks.has(func)) { + console.warn(`$func already in intervalTasks`) + return false + } else { + this.intervalTasks.set(func, window.setInterval(func, delay, ...args)) + return true + } } setTimeout(func, delay, ...args) { - this.timeoutTasks.set(func, window.setTimeout(func, delay, ...args)) + if (this.timeoutTasks.has(func)) { + console.warn(`$func already in timeoutTasks`) + return false + } else { + this.timeoutTasks.set(func, window.setTimeout(func, delay, ...args)) + return true + } } clearInterval(func) { if (this.intervalTasks.has(func)) { window.clearInterval(this.intervalTasks.get(func)) this.intervalTasks.delete(func) + return true + } else { + return false } } @@ -121,6 +136,9 @@ class Scheduler { if (this.timeoutTasks.has(func)) { window.clearTimeout(this.timeoutTasks.get(func)) this.timeoutTasks.delete(func) + return true + } else { + return false } } } @@ -332,7 +350,6 @@ class Tetromino { matrix.drawPiece() return true } else if (!hardDropped) { - wallSound.play() if (translation == TRANSLATION.DOWN) { this.locked = true if (!scheduler.timeoutTasks.has(lockDown))