diff --git a/Sounds/mr_9999_00.wav b/Sounds/mr_9999_00.wav new file mode 100644 index 0000000..a024b08 Binary files /dev/null and b/Sounds/mr_9999_00.wav differ diff --git a/Sounds/mr_9999_01.wav b/Sounds/mr_9999_01.wav new file mode 100644 index 0000000..6129cd2 Binary files /dev/null and b/Sounds/mr_9999_01.wav differ diff --git a/Sounds/mr_9999_02.wav b/Sounds/mr_9999_02.wav new file mode 100644 index 0000000..8578a63 Binary files /dev/null and b/Sounds/mr_9999_02.wav differ diff --git a/Sounds/mr_9999_03.wav b/Sounds/mr_9999_03.wav new file mode 100644 index 0000000..aa6bf40 Binary files /dev/null and b/Sounds/mr_9999_03.wav differ diff --git a/Sounds/mr_9999_04.wav b/Sounds/mr_9999_04.wav new file mode 100644 index 0000000..a75f029 Binary files /dev/null and b/Sounds/mr_9999_04.wav differ diff --git a/Sounds/mr_9999_05.wav b/Sounds/mr_9999_05.wav new file mode 100644 index 0000000..8adb683 Binary files /dev/null and b/Sounds/mr_9999_05.wav differ diff --git a/Sounds/mr_9999_06.wav b/Sounds/mr_9999_06.wav new file mode 100644 index 0000000..0b0cc42 Binary files /dev/null and b/Sounds/mr_9999_06.wav differ diff --git a/Sounds/mr_9999_07.wav b/Sounds/mr_9999_07.wav new file mode 100644 index 0000000..9fef0cd Binary files /dev/null and b/Sounds/mr_9999_07.wav differ diff --git a/Sounds/mr_9999_08.wav b/Sounds/mr_9999_08.wav new file mode 100644 index 0000000..34088ca Binary files /dev/null and b/Sounds/mr_9999_08.wav differ diff --git a/Sounds/mr_9999_09.wav b/Sounds/mr_9999_09.wav new file mode 100644 index 0000000..f3b8b18 Binary files /dev/null and b/Sounds/mr_9999_09.wav differ diff --git a/Sounds/mr_9999_10.wav b/Sounds/mr_9999_10.wav new file mode 100644 index 0000000..5d20186 Binary files /dev/null and b/Sounds/mr_9999_10.wav differ diff --git a/Sounds/mr_9999_11.wav b/Sounds/mr_9999_11.wav new file mode 100644 index 0000000..a0fd526 Binary files /dev/null and b/Sounds/mr_9999_11.wav differ diff --git a/Sounds/mr_9999_12.wav b/Sounds/mr_9999_12.wav new file mode 100644 index 0000000..e3d4490 Binary files /dev/null and b/Sounds/mr_9999_12.wav differ diff --git a/Sounds/mr_9999_13.wav b/Sounds/mr_9999_13.wav new file mode 100644 index 0000000..208aef0 Binary files /dev/null and b/Sounds/mr_9999_13.wav differ diff --git a/Sounds/mr_9999_14.wav b/Sounds/mr_9999_14.wav new file mode 100644 index 0000000..71a84bc Binary files /dev/null and b/Sounds/mr_9999_14.wav differ diff --git a/Sounds/mr_9999_15.wav b/Sounds/mr_9999_15.wav new file mode 100644 index 0000000..ab6fa38 Binary files /dev/null and b/Sounds/mr_9999_15.wav differ diff --git a/background/food.webp b/background/food.webp new file mode 100644 index 0000000..b582f10 Binary files /dev/null and b/background/food.webp differ diff --git a/background/footer_lodyas.png b/background/footer_lodyas.png new file mode 100644 index 0000000..8b1d392 Binary files /dev/null and b/background/footer_lodyas.png differ diff --git a/background/geometry2.webp b/background/geometry2.webp new file mode 100644 index 0000000..6f21e7b Binary files /dev/null and b/background/geometry2.webp differ diff --git a/background/restaurant_icons.webp b/background/restaurant_icons.webp new file mode 100644 index 0000000..5a9f01d Binary files /dev/null and b/background/restaurant_icons.webp differ diff --git a/background/use_your_illusion.webp b/background/use_your_illusion.webp new file mode 100644 index 0000000..4d833dd Binary files /dev/null and b/background/use_your_illusion.webp differ diff --git a/digital-7-italic.ttf b/digital-7-italic.ttf new file mode 100644 index 0000000..c120ab4 Binary files /dev/null and b/digital-7-italic.ttf differ diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000..911e4bb Binary files /dev/null and b/favicon.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..3e4c548 --- /dev/null +++ b/index.html @@ -0,0 +1,159 @@ + + + + + + + + Tetris + + + + + + + + +
+
-tetris-
+ +
+ + +
+ +
+
+
LEFT
+
+ +
+
RIGHT
+
+ +
+
QUICK
+
+ +
+
DOWN
+
+ +
+
ROTATE
+
+ +
+
RESET
+
+ +
+
SOUND
+
+ +
+
PAUSE
+
+ +
+
OPTIONS
+
+
+ + + + + \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..a78b997 --- /dev/null +++ b/main.js @@ -0,0 +1,1057 @@ + +//Leo Tetris Version 0.1 +//http://rozenlab.com/tetris + +const idCanvas = "screen"; +const canvasWidth = 500; +const canvasHeight = 640; +const gameFieldWidth = 300; +const gameFieldHeight = 600; +const widthCellQuantity = 10; +const heightCellQuantity = 20; +const frameColor = '#000'; +const gridColor = '#ddd'; +const multicoloredFigures = false; + +let mainTetris; +let mainField; +let clueField; +let gameField; +let SoundPlay; + +let vibrateOn = true; +let enableGrid = true; +let enableSound = true; +let score = 0; +let hiScore = 0; +let gameSpeed = 1000; +let refreshIntervalId; +let speedLabel = 1; +let speedStep = 100; +let goalStep = 0; +let goalTarget = 10; + +const soundVolume = 0.3; +const buttonVibratePattern = 30; + +let blockControl = false; +let pause = false; + +document.onkeydown = handle; +let ScreenContext = createScreen(idCanvas, canvasWidth, canvasHeight); + +//Test params: +const stepMode = false; +const testFigure = 'no'; // 'no', 0-4 +const bgFigure = false; +const manualPlace = false; + +//https://colorscheme.ru/color-harmony-pastels/color-wheel.html +const palette = [ + '#ec1b24', + '#ee2c38', + '#f47115', + '#f79c0e', + '#dcd100', + '#65c42f', + '#00a65f', + '#00aaaf', + '#1b62b7', + '#293d9b', + '#542790', + '#a0138e' +]; + +function createScreen(idCanvas, canvasWidth, canvasHeight) { + const canvas = document.getElementById(idCanvas); + canvas.width = canvasWidth; + canvas.height = canvasHeight; + return canvas.getContext('2d'); +} + +class Field { + constructor( + ScreenContext, + zeroPointOnCanvasX, + zeroPointOnCanvasY, + width, + height, + widthCellQuantity, + heightCellQuantity + ) { + this.ctx = ScreenContext; + this.x = zeroPointOnCanvasX; + this.y = zeroPointOnCanvasY; + this.width = width; + this.height = height; + this.widthCellQuantity = widthCellQuantity; + this.heightCellQuantity = heightCellQuantity; + this.pixelWidth = width / widthCellQuantity; + this.pixelHeight = height / heightCellQuantity; + + this.fX = width / widthCellQuantity - zeroPointOnCanvasX; + this.fY = height / heightCellQuantity - zeroPointOnCanvasY; + } + + drawPixel(x, y, color) { + if(!(x < 1 || y < 1 || x > widthCellQuantity || y > heightCellQuantity)) { + this.ctx.fillStyle = color; + this.ctx.fill(); + + this.ctx.fillRect( + this.pixelWidth * x - this.fX, + this.pixelHeight * y - this.fY, + this.pixelWidth, + this.pixelHeight + ); + } + } + + drawFigure(x, y, figure, bg, color = '#000') { + let pixelColor; + for (let fx = 0; fx < figure[0].length; fx++) { + for (let fy = 0; fy < figure.length; fy++) { + if (figure[fy][fx] !== 0) { + if (figure[fy][fx] !== 1) { + pixelColor = figure[fy][fx]; + } else pixelColor = color; + this.drawPixel (x + fx, y + fy, pixelColor); + } else { + if(bg) { + this.drawPixel(x + fx, y + fy, '#eae8e8'); + } + } + } + } + } + + mirrorFigure (figure) { + const mirrorFigure = []; + for (let y = 0; y < figure.length; y++ ) { + mirrorFigure[y] = figure[y].reverse(); + } + return mirrorFigure; + } + + rotateFigure (figure) { + let n, m; + n = m = figure.length; + let rotatedFigure = []; + for (let i = 0; i < m; i++){ + rotatedFigure[i] = []; + for (let j = 0; j < n; j++){ + rotatedFigure[i][j] = 0; + }} + + for (let y = 0; y < figure.length; y++) { + for (let x = 0; x < figure[y].length; x++) { + rotatedFigure[x][figure.length - 1 - y] = figure[y][x]; + } + } + return rotatedFigure; + } + + figureColoring(figure, color = '#000') { + let pixelColor; + for (let x = 0; x < figure[0].length; x++) { + for (let y = 0; y < figure.length; y++) { + if (figure[y][x] !== 0) { + if(color === 'random') { + pixelColor = randomStaticColor(palette); + } else pixelColor = color; + figure[y][x] = pixelColor; + } + } + } + return figure; + } + + drawLine(x, y, toX, toY, color) { + this.ctx.beginPath(); + this.ctx.lineWidth = 1; + this.ctx.moveTo(this.x + 0.5 + x,this.y + y + 0.5); + this.ctx.lineTo(this.x + 0.5 + toX,this.y + toY + 0.5); + this.ctx.strokeStyle = color; + this.ctx.stroke(); + } + + drawGrid(color) { + if(enableGrid === true) { + for (let x = 0; x <= this.heightCellQuantity - 1; x++) { + this.drawLine( + 0, + this.pixelHeight + x * this.pixelHeight, + this.width, + this.pixelHeight + x * this.pixelHeight, + color + ); + } + + for (let y = 0; y < this.widthCellQuantity; y++) { + this.drawLine( + this.pixelWidth + y * this.pixelWidth, + this.height, + this.pixelWidth + y * this.pixelWidth, + 0, + color + ); + } + } + } + + drawFrame(color, lineWidth = 1) { + this.ctx.lineWidth = lineWidth; + this.ctx.strokeStyle = color; + this.ctx.strokeRect(this.x, this.y, this.width, this.height); + } + + drawText(text, size, x, y) { + this.ctx.fillStyle = '#3636a5'; + this.ctx.font = size + "px digital-7-italic"; + this.ctx.fillText(text, x, y); + } + + clearScreen() { + this.ctx.clearRect(0, 0, canvasWidth, canvasHeight); + } +} + +function randomInteger(min, max) { + const rand = min + Math.random() * (max + 1 - min); + return Math.floor(rand); +} + +function randomStaticColor(palette) { + let colors = []; + if(palette === undefined) { //Default palette + colors = ['Fuchsia', 'Purple', 'Red', 'Maroon', 'Yellow', 'Olive', 'Lime', 'Green', 'Blue', 'Navy']; + } else colors = palette; + return colors[randomInteger(0, colors.length - 1)]; +} + +class Tetris { + screenMatrix = []; + + I = [ + [0,0,0,0], + [1,1,1,1], + [0,0,0,0], + [0,0,0,0] + ]; + + L = [ //+mirror + [0,0,0,0], + [0,0,1,0], + [1,1,1,0], + [0,0,0,0] + ]; + + O = [ + [0,0,0,0], + [0,1,1,0], + [0,1,1,0], + [0,0,0,0] + ]; + + T = [ + [0,0,0,0], + [0,1,0,0], + [1,1,1,0], + [0,0,0,0] + ]; + + Z = [ //+mirror + [0,0,0,0], + [1,1,0,0], + [0,1,1,0], + [0,0,0,0] + ]; + + figures = [this.I, this.L, this.O, this.T, this.Z]; + + releasePoint = { //!!!!!!!!!!! + x: 4, + y: 0 + }; + + activeFigure = { + buffer: [], + x: 0, + y: 0 + }; + + emptyField = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + + constructor() { + this.screenMatrix = this.emptyField; + this.nextFigure = this.createFigure(this.figures); + this.createActiveFigure(); + this.nextFigure = this.createFigure(this.figures); + } + + createFigure(figures) { + let figure = figures[randomInteger(0, figures.length - 1)]; + + if(testFigure !== 'no') { + figure = figures[testFigure]; + } + + if(randomInteger(0, 1) === 1) { + figure = mainField.mirrorFigure(figure); + } + + const figureRotation = randomInteger(0, 3); + for (let i = 0; i < figureRotation; i++) { + figure = mainField.rotateFigure(figure); + } + + const color = multicoloredFigures ? 'random' : randomStaticColor(palette); + + return mainField.figureColoring(figure, color); + } + + createActiveFigure() { + this.activeFigure.buffer = this.nextFigure; + this.activeFigure.status = 1; + } + + placeFigure(field, figure, x, y, mode = 's') { + let pixelColor; + for (let fx = 0; fx < figure[0].length; fx++) { + for (let fy = 0; fy < figure.length; fy++) { + if (figure[fy][fx] !== 0) { + if (figure[fy][fx] !== 1) { + pixelColor = figure[fy][fx]; + } else pixelColor = color; + + if(mode === 's') { + field[y + fy - 1][x + fx + 3] = figure[fy][fx]; //for S or Auto + } + + if(mode === 'a') { + field[y + fy][x + fx + 3] = figure[fy][fx]; //for A + } + + if(mode === 'd') { + field[y + fy][x + fx + 1] = figure[fy][fx]; //for D + } + } + } + } + return field; + } + + rowsDeleter(field) { + let pixelCounter = 0; + const emptyRow = new Array (widthCellQuantity).fill(0); + + for (let fy = 0; fy < field.length; fy++) { + for (let fx = 0; fx < field[0].length; fx++) { + if (field[fy][fx] !== 0) { + pixelCounter++; + } + } + + if(pixelCounter === widthCellQuantity) { + let fieldCleaned = field.slice(); + fieldCleaned.splice(fy, 1); + fieldCleaned.splice(0, 0, emptyRow); + return fieldCleaned; + } + pixelCounter = 0; + } + return false; + } + + checkCollision(figure, x, y, field) { + field[-1] = new Array (widthCellQuantity).fill(0); + for (let fy = 0; fy < figure.length; fy++) { + for (let fx = 0; fx < figure[0].length; fx++) { + if (figure[fy][fx] !== 0) { + if((y + fy) > heightCellQuantity) { + //console.log('bottom'); + return "bottom"; + } + + if((x + fx) < -3) { + //console.log('wallL'); + return "wallL"; + } + + if((x + fx) > widthCellQuantity - 4) { + //console.log('wallR'); + return "wallR"; + } + + if (field[y + fy - 1][x + fx + 3] !== 0) { + //console.log('field'); + return "field"; + } + } + } + } + } + + endFigureEvent(mode, key = false) { + let f; // 0 - for dev only E key. For game: 1 + if(key === true) { + f = 0; + } else f = 1; + + this.screenMatrix = this.placeFigure( + this.screenMatrix, + this.activeFigure.buffer, + this.activeFigure.x, + this.activeFigure.y - f, + mode + ); + + let cleanedField; + for(let i = 0; i < heightCellQuantity; i++) { + cleanedField = this.rowsDeleter(this.screenMatrix); + if(cleanedField !== false) { + this.screenMatrix = cleanedField; + score += 100; //Добавить бонусы за несколько рядов за раз. 2 ряда: +100, ... + goalStep++; + + SoundPlay.playSound15(); //Deleting row + + if(goalStep === goalTarget) { + goalStep = 0; + speedLabel++; + gameSpeed -= speedStep; + + clearInterval(refreshIntervalId); + refreshIntervalId = setInterval(main, gameSpeed); + + SoundPlay.playSound4(); //Goal + } + + } else break; + } + + this.createActiveFigure(); + this.nextFigure = this.createFigure(this.figures); + + this.activeFigure.x = 0; + this.activeFigure.y = 0; + + SoundPlay.playSound13(); + + clearInterval(mainTetris.quickKeyInterval); + + } + + vibrate(pattern) { + if(vibrateOn) { + window.navigator.vibrate(pattern); + } + } + + //------------------------------------------------------------------------------------------------------------------ + //Control + leftKey(silent = false) { + const mode = 'a'; + if(!blockControl) { + this.activeFigure.x--; + main(mode,true); + if(!silent) { + SoundPlay.playSound14(); + this.vibrate(buttonVibratePattern); + } + } + } + + rightKey(silent = false) { + const mode = 'd'; + if(!blockControl) { + this.activeFigure.x++; + main(mode,true); + if(!silent) { + SoundPlay.playSound14(); + this.vibrate(buttonVibratePattern); + } + } + } + + quickKey() { + let mode; + if(!blockControl) { + clearInterval(this.quickKeyInterval); + this.quickKeyInterval = setInterval(() => { + this.activeFigure.y++; + main(mode,true); + },1); + SoundPlay.playSound14(); + this.vibrate(buttonVibratePattern); + } + } + + downKey(silent = false) { + let mode; + if(!blockControl) { + this.activeFigure.y++; + main(mode,true); + if(!silent) { + SoundPlay.playSound14(); + this.vibrate(buttonVibratePattern); + } + } + } + + rotateKey() { + let mode; + if(!blockControl) { + this.activeFigure.buffer = mainField.rotateFigure(this.activeFigure.buffer); + main(mode,true); + + SoundPlay.playSound5(); + this.vibrate(buttonVibratePattern); + } + } + + pauseKey() { + let mode; + if(pause) { + refreshIntervalId = setInterval(main, gameSpeed); + blockControl = false; + pause = false; + SoundPlay.playSound2(); + this.vibrate(buttonVibratePattern); + } else { + clearInterval(refreshIntervalId); + blockControl = true; + pause = true; + mainTetris.drawPause(); + SoundPlay.playSound1(); + this.vibrate(buttonVibratePattern); + } + main(mode,true); + } + + muteSoundKey() { + if(!pause) { + let mode; + //enableSound = !enableSound; + + if (enableSound) { + SoundPlay.playSound1(); + this.vibrate(buttonVibratePattern); + enableSound = false; + } else { + enableSound = true; + SoundPlay.playSound2(); + this.vibrate(buttonVibratePattern); + } + + main(mode, true); + } + } + + newGameKey() { + let mode; + newGameTetris(); + main(mode,true); + SoundPlay.playSound14(); + this.vibrate(buttonVibratePattern); + } + + stepModeKey() { + if(stepMode) { + if (!blockControl) { + main('s'); + } + } + } + + manualPlaceKey() { + if(!blockControl) { + if(manualPlace) { + mainTetris.endFigureEvent('s', true); + } + } + } + + //------------------------------------------------------------------------------------------------------------------ + //Draw + drawScore() { + mainField.drawText('score: ' + score, 25, 350, 50); + } + + drawSpeed() { + mainField.drawText('speed: ' + speedLabel, 25, 350, 300); + } + + drawPause() { + if(pause) { + mainField.drawText('pause', 25, 350, 330); + } + } + + drawGoal() { + mainField.drawText('goal', 25, 350, 90); + mainField.drawText(goalStep + '/' + goalTarget, 25, 350, 120); + } + + drawHiScore() { + mainField.drawText('hi-score', 25, 350, 420); + mainField.drawText(hiScore, 25, 350, 450); + } + + drawSoundOff() { + if(enableSound === false) { + mainField.drawText('sound off', 25, 350, 600); + } + } + //------------------------------------------------------------------------------------------------------------------ + + endGame() { + clearInterval(refreshIntervalId); + blockControl = true; + SoundPlay.playSound9(); + } +} //End Tetris class + +function drawElements() { + clueField.drawGrid(gridColor); + clueField.drawFrame(frameColor, 0.5); + + mainField.drawGrid(gridColor); + mainField.drawFrame(frameColor); + + mainTetris.drawScore(); + mainTetris.drawGoal(); + mainTetris.drawSpeed(); + mainTetris.drawPause() + + mainTetris.drawSoundOff(); + + //mainTetris.drawHiScore(); +} + +function newGameTetris() { + pause = false; + clearInterval(refreshIntervalId); + if(stepMode === false) { + refreshIntervalId = setInterval(main, gameSpeed); + } + + enableSound = true; + blockControl = false; + + gameField = new Field( + 10, + 10, + 200, + 400, + 10, + 20 + ); + + SoundPlay = new Sound(); + + mainField = new Field( + ScreenContext, + 20, + 20, + gameFieldWidth, + gameFieldHeight, + widthCellQuantity, + heightCellQuantity + ); + + const clueSize = 4; + clueField = new Field( + ScreenContext, + 350, + 140, + gameFieldWidth / widthCellQuantity * clueSize, + gameFieldHeight / heightCellQuantity * clueSize, + clueSize, + clueSize + ); + + mainTetris = new Tetris(); + drawElements(); + score = 0; + goalStep = 0; + speedLabel = 1; + gameSpeed = 1000; +} + + +function scaleFix() { + const zeroWidth = 432; + const zeroScale = 0.79; + const scaleStep = 0.0018; + let widthScreen = window.innerWidth; + let factor = zeroScale - (zeroWidth - widthScreen) * scaleStep; + document.getElementById('container').style.zoom = factor; +} + +function main(mode, key = false) { + scaleFix(); + + if(key === false) { + mainTetris.activeFigure.y++; + } + + let collision = mainTetris.checkCollision( + mainTetris.activeFigure.buffer, + mainTetris.activeFigure.x, + mainTetris.activeFigure.y, + mainTetris.screenMatrix + ); + + if(collision === 'bottom') { + mainTetris.endFigureEvent(mode); + } + + if(collision === 'wallL') { + mainTetris.activeFigure.x++; + } + + if(collision === 'wallR') { + mainTetris.activeFigure.x--; + } + + if(collision === 'field') { + + if(mode === 'a') { + mainTetris.activeFigure.x++; + } else + + if(mode === 'd') { + mainTetris.activeFigure.x--; + } else + + mainTetris.endFigureEvent(mode); + + } + + mainField.clearScreen(); + clueField.drawFigure(1,1, mainTetris.nextFigure, false); //Draw next figure + mainField.drawFigure(1,1, mainTetris.screenMatrix, false); //Draw field + + let collisionDraw = mainTetris.checkCollision( + mainTetris.activeFigure.buffer, + mainTetris.activeFigure.x, + mainTetris.activeFigure.y, + mainTetris.screenMatrix + ); + + if(collisionDraw === 'field') { + mainTetris.endGame(); + } else { + mainField.drawFigure( //Draw active figure + mainTetris.releasePoint.x + mainTetris.activeFigure.x, + mainTetris.releasePoint.y + mainTetris.activeFigure.y, + mainTetris.activeFigure.buffer, + bgFigure, + mainTetris.activeFigure.color + ); + } + + drawElements(); +} + +function handle(e) { + if (e.keyCode === 65 || e.keyCode === 37) { mainTetris.leftKey(); } //A + if (e.keyCode === 68 || e.keyCode === 39) { mainTetris.rightKey(); } //D + if (e.keyCode === 87 || e.keyCode === 38) { mainTetris.rotateKey(); } //W + if (e.keyCode === 83 || e.keyCode === 40) { mainTetris.downKey(); } //S + if (e.keyCode === 77) { mainTetris.muteSoundKey(); } //M + if (e.keyCode === 80) { mainTetris.pauseKey(); } //P + if (e.keyCode === 78) { mainTetris.newGameKey(); } //N + if (e.keyCode === 13) { mainTetris.stepModeKey(); } //Enter + if (e.keyCode === 69) { mainTetris.manualPlaceKey(); } //E + //console.log(e.keyCode); +} + +class Sound { + constructor() { + this.sound0 = new Audio('Sounds/mr_9999_00.wav'); //Music no + this.sound1 = new Audio('Sounds/mr_9999_01.wav'); //Switch ok + this.sound2 = new Audio('Sounds/mr_9999_02.wav'); //Switch x2 ok + this.sound3 = new Audio('Sounds/mr_9999_03.wav'); //Switch x2 slow no + this.sound4 = new Audio('Sounds/mr_9999_04.wav'); //Goal ok ok + this.sound5 = new Audio('Sounds/mr_9999_05.wav'); //Figure flip ok + this.sound6 = new Audio('Sounds/mr_9999_06.wav'); //Error no + this.sound7 = new Audio('Sounds/mr_9999_07.wav'); //Error+ no + this.sound8 = new Audio('Sounds/mr_9999_08.wav'); //Error x3 no + this.sound9 = new Audio('Sounds/mr_9999_09.wav'); //Losing ok + this.sound10 = new Audio('Sounds/mr_9999_10.wav'); //Korobeiniki no + this.sound11 = new Audio('Sounds/mr_9999_11.wav'); //Error 2 no + this.sound12 = new Audio('Sounds/mr_9999_12.wav'); //Error 3 no + this.sound13 = new Audio('Sounds/mr_9999_13.wav'); //Adding figure ok + this.sound14 = new Audio('Sounds/mr_9999_14.wav'); //Keys ok + this.sound15 = new Audio('Sounds/mr_9999_15.wav'); //Deleting row ок + } + + playSound0() { + if(enableSound === true) { + this.sound0.currentTime = 0.0; + this.sound0.volume = soundVolume; + this.sound0.play(); + } + } + + playSound1() { + if(enableSound === true) { + this.sound1.currentTime = 0.0; + this.sound1.volume = soundVolume; + this.sound1.play(); + } + } + + playSound2() { + if(enableSound === true) { + this.sound2.currentTime = 0.0; + this.sound2.volume = soundVolume; + this.sound2.play(); + } + } + + playSound3() { + if(enableSound === true) { + this.sound3.currentTime = 0.0; + this.sound3.volume = soundVolume; + this.sound3.play(); + } + } + + playSound4() { + if(enableSound === true) { + this.sound4.currentTime = 0.0; + this.sound4.volume = soundVolume; + this.sound4.play(); + } + } + + playSound5() { + if(enableSound === true) { + this.sound5.currentTime = 0.0; + this.sound5.volume = soundVolume; + this.sound5.play(); + } + } + + playSound6() { + if(enableSound === true) { + this.sound6.currentTime = 0.0; + this.sound6.volume = soundVolume; + this.sound6.play(); + } + } + + playSound7() { + if(enableSound === true) { + this.sound7.currentTime = 0.0; + this.sound7.volume = soundVolume; + this.sound7.play(); + } + } + + playSound8() { + if(enableSound === true) { + this.sound8.currentTime = 0.0; + this.sound8.volume = soundVolume; + this.sound8.play(); + } + } + + playSound9() { + if(enableSound === true) { + this.sound9.currentTime = 0.0; + this.sound9.volume = soundVolume; + this.sound9.play(); + } + } + + playSound10() { + if(enableSound === true) { + this.sound10.currentTime = 0.0; + this.sound10.volume = soundVolume; + this.sound10.play(); + } + } + + playSound11() { + if(enableSound === true) { + this.sound11.currentTime = 0.0; + this.sound11.volume = soundVolume; + this.sound11.play(); + } + } + + playSound12() { + if(enableSound === true) { + this.sound12.currentTime = 0.0; + this.sound12.volume = soundVolume; + this.sound12.play(); + } + } + + playSound13() { + if(enableSound === true) { + this.sound13.currentTime = 0.0; + this.sound13.volume = soundVolume; + this.sound13.play(); + } + } + + playSound14() { + if(enableSound === true) { + this.sound14.currentTime = 0.0; + this.sound14.volume = soundVolume; + this.sound14.play(); + } + } + + playSound15() { + if(enableSound === true) { + this.sound15.currentTime = 0.0; + this.sound15.volume = soundVolume; + this.sound15.play(); + } + } + +} + +/* Get the documentElement () to display the page in fullscreen */ +const elem = document.documentElement; + +/* View in fullscreen */ +function openFullscreen() { + if (elem.requestFullscreen) { + elem.requestFullscreen(); + } else if (elem.webkitRequestFullscreen) { /* Safari */ + elem.webkitRequestFullscreen(); + } else if (elem.msRequestFullscreen) { /* IE11 */ + elem.msRequestFullscreen(); + } +} + +/* Close fullscreen */ +function closeFullscreen() { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.webkitExitFullscreen) { /* Safari */ + document.webkitExitFullscreen(); + } else if (document.msExitFullscreen) { /* IE11 */ + document.msExitFullscreen(); + } +} + +const leftKeyId = document.getElementById('leftKeyEvent'); +const rightKeyId = document.getElementById('rightKeyEvent'); +const quickKeyId = document.getElementById('quickKeyEvent'); +const downKeyId = document.getElementById('downKeyEvent'); +const rotateKeyId = document.getElementById('rotateKeyEvent'); +const resetKeyId = document.getElementById('resetKeyEvent'); +const muteSoundId = document.getElementById('muteSoundKeyEvent'); +const pauseKeyId = document.getElementById('pauseKeyEvent'); +const optionsKeyId = document.getElementById('optionsKeyEvent'); +const scrRes = document.getElementById('scrRes'); + + +let leftKeyEventInterval; +function leftKeyEventDown() { + mainTetris.leftKey(); + leftKeyEventInterval = setInterval (() => mainTetris.leftKey(true), 100); +} +function leftKeyEventUp() { + clearInterval(leftKeyEventInterval); +} + +let rightKeyEventInterval; +function rightKeyEventDown() { + mainTetris.rightKey(); + rightKeyEventInterval = setInterval (() => mainTetris.rightKey(true), 100); +} +function rightKeyEventUp() { + clearInterval(rightKeyEventInterval); +} + +function quickKeyEventDown() { + mainTetris.quickKey(); +} + +let downKeyEventInterval; +function downKeyEventDown() { + mainTetris.downKey(); + downKeyEventInterval = setInterval (() => mainTetris.downKey(true), 50); +} +function downKeyEventUp() { + clearInterval(downKeyEventInterval); +} + +function rotateKeyEventDown() { + mainTetris.rotateKey(); +} +function rotateKeyEventUp() { + //mainTetris.rotateKey(); +} + +function resetKeyEventDown() { + mainTetris.newGameKey(); +} + +function muteSoundKeyEventDown() { + mainTetris.muteSoundKey(); +} + +function pauseKeyEventDown() { + mainTetris.pauseKey(); +} + +function optionsKeyEventDown() { + //optionsKey +} + +document.body.oncontextmenu = function (e) { return false; }; + +leftKeyId.addEventListener("touchstart", leftKeyEventDown); +rightKeyId.addEventListener("touchstart", rightKeyEventDown); +quickKeyId.addEventListener("touchstart", quickKeyEventDown); +downKeyId.addEventListener("touchstart", downKeyEventDown); +rotateKeyId.addEventListener("touchstart", rotateKeyEventDown); +resetKeyId.addEventListener("touchstart", resetKeyEventDown); +muteSoundId.addEventListener("touchstart", muteSoundKeyEventDown); +pauseKeyId.addEventListener("touchstart", pauseKeyEventDown); +optionsKeyId.addEventListener("touchstart", optionsKeyEventDown); + +leftKeyId.addEventListener("touchend", leftKeyEventUp); +rightKeyId.addEventListener("touchend", rightKeyEventUp); +//quickKeyId.addEventListener("mouseup", quickKeyEventUp); +downKeyId.addEventListener("touchend", downKeyEventUp); +rotateKeyId.addEventListener("touchend", rotateKeyEventUp); +//resetKeyId.addEventListener("mouseup", resetKeyEventUp); +//muteSoundId.addEventListener("mouseup", muteSoundKeyEventUp); +//pauseKeyId.addEventListener("mouseup", pauseKeyEventUp); +//optionsKeyId.addEventListener("mouseup", optionsKeyEventUp); + +scrRes.addEventListener("touchstart", () => { + document.getElementById('scrRes').innerHTML = window.innerWidth + ' x ' + window.innerHeight; +}); \ No newline at end of file