{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/packs/projects/tetris_pieces.js","webpack:///./app/javascript/packs/shared/copy.js","webpack:///./app/javascript/packs/projects/tetris.js","webpack:///./app/javascript/packs/shared/modes.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","pieces","piece","yMargin","xOffset","deepCopy","arr","copy","forEach","elem","Array","isArray","push","deepCopyObject","obj","tempObj","entries","canvas","document","getElementById","ctx","getContext","width","height","unit","delay","lastIteration","scoreText","scoreInput","score","scoreTimes","Date","now","grid","submit","querySelector","nameInput","play","playing","drop","buildGrid","splice","length","j","row","mod","num","limit","player","x","y","newPiece","Math","floor","random","ceil","draw","fillStyle","fillRect","drawPiece","pieceCollision","digitSum","sum","updateScore","innerText","codedScore","addToScore","diff","movePlayerDown","pieceAtBottom","classList","remove","font","fillText","addPieceToGrid","every","element","newRow","unshift","deleteFullRows","setTimeout","update","time","requestAnimationFrame","rotatePiece","dir","rotatedPiece","addEventListener","event","keyCode","light","darkToLight","dark","lightToDark","window","alert","add"],"mappings":"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","file":"js/projects/tetris-0db2faddbe63189f5d40.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 61);\n","const tPiece = {\n piece: [\n ['.', '.', '.'],\n [0, 0, 0],\n ['.', 0, '.']\n ],\n yMargin: 1,\n xOffset: 1\n};\n\nconst oPiece = {\n piece: [\n [50, 50],\n [50, 50]\n ],\n yMargin: 0,\n xOffset: 0\n};\n\nconst sPiece = {\n piece: [\n ['.', 100, 100],\n [100, 100, '.'],\n ['.', '.', '.']\n ],\n yMargin: 0,\n xOffset: 1\n};\n\nconst zPiece = {\n piece: [\n [150, 150, '.'],\n ['.', 150, 150],\n ['.', '.', '.']\n ],\n yMargin: 0,\n xOffset: 1\n};\n\nconst lPiece = {\n piece: [\n [200, '.', '.'],\n [200, '.', '.'],\n [200, 200, '.']\n ],\n yMargin: 0,\n xOffset: 1\n};\n\nconst jPiece = {\n piece: [\n ['.', '.', 250],\n ['.', '.', 250],\n ['.', 250, 250]\n ],\n yMargin: 0,\n xOffset: 1\n};\n\nconst iPiece = {\n piece: [\n ['.', 300, '.', '.'],\n ['.', 300, '.', '.'],\n ['.', 300, '.', '.'],\n ['.', 300, '.', '.']\n ],\n yMargin: 0,\n xOffset: 1\n};\n\n// 60, 120, 240, 280, 320\n\nconst pieces = [tPiece, oPiece, sPiece, zPiece, lPiece, jPiece, iPiece];\n\nexport { pieces };\n","// From https://medium.com/@ziyoshams/deep-copying-javascript-arrays-4d5fc45a6e3e\nconst deepCopy = (arr) => {\n let copy = [];\n arr.forEach(elem => {\n if(Array.isArray(elem)){\n copy.push(deepCopy(elem))\n }else{\n if (typeof elem === 'object') {\n copy.push(deepCopyObject(elem))\n } else {\n copy.push(elem)\n }\n }\n })\n return copy;\n}\n\nconst deepCopyObject = (obj) => {\n let tempObj = {};\n for (let [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n tempObj[key] = deepCopy(value);\n } else {\n if (typeof value === 'object') {\n tempObj[key] = deepCopyObject(value);\n } else {\n tempObj[key] = value\n }\n }\n }\n return tempObj;\n}\n\nexport { deepCopy, deepCopyObject };\n","import { pieces } from './tetris_pieces.js';\nimport { deepCopy, deepCopyObject } from '../shared/copy.js';\nimport { light, dark, mode, lightToDark, darkToLight } from '../shared/modes.js';\n\nconst canvas = document.getElementById('tetris');\nconst ctx = canvas.getContext('2d');\n\ncanvas.width = 240;\ncanvas.height = 480;\nconst unit = 24;\n\nlet delay = 500;\nlet lastIteration = 0;\nlet deltaTime = 0;\n\nconst scoreText = document.getElementById('score');\nconst scoreInput = document.getElementById('tetris_score_score');\nlet score = 0;\nlet scoreTimes = [Date.now(), Date.now(), Date.now()];\n\nconst grid = [];\n\nconst submit = document.querySelector('[type=\"submit\"]');\nconst nameInput = document.querySelector('.form-control.string');\n\nconst play = document.getElementById('play');\nlet playing = false;\n\nlet drop = false;\n\nconst buildGrid = () => {\n grid.splice(0, grid.length);\n for (let j = 0; j < canvas.height / unit; j += 1) {\n const row = [];\n for (let i = 0; i < canvas.width / unit; i += 1) {\n row.push('.');\n }\n grid.push(row);\n }\n};\n\nbuildGrid();\n\nconst mod = (num) => {\n const limit = canvas.width / unit\n if (num < 0) {\n num = limit + num;\n } else if (num > (limit - 1)) {\n num = num - limit;\n }\n return num;\n};\n\nconst player = {\n x: 5,\n y: 0\n};\n\nconst newPiece = () => {\n const newPiece = pieces[Math.floor(Math.random() * pieces.length)]\n player.piece = deepCopyObject(newPiece);\n player.x = 4 - newPiece.xOffset;\n player.y = 0 - newPiece.piece.length;\n delay -= Math.ceil(delay / 100);\n};\n\nconst drawPiece = (piece, x, y) => {\n for (let j = 0; j < piece.piece.length; j += 1) {\n for (let i = 0; i < piece.piece[j].length; i += 1) {\n if (piece.piece[j][i] !== '.') {\n ctx.fillStyle = mode === \"dark\" ? `hsl(${piece.piece[j][i]},100%,50%)` : `hsl(${piece.piece[j][i]},75%,75%)`;\n ctx.fillRect(mod(i + x) * unit,\n (j + y) * unit,\n unit, unit);\n }\n }\n }\n};\n\nconst draw = () => {\n for (let j = 0; j < grid.length; j += 1) {\n for (let i = 0; i < grid[j].length; i += 1) {\n if (grid[j][i] === '.') {\n ctx.fillStyle = mode === \"dark\" ? \"black\" : \"white\";\n } else {\n ctx.fillStyle = mode === \"dark\" ? `hsl(${grid[j][i]},100%,50%)` : `hsl(${grid[j][i]},75%,75%)`;\n }\n ctx.fillRect(i * unit, j * unit, unit, unit);\n }\n }\n if (playing === true) {\n drawPiece(player.piece, player.x, player.y);\n }\n};\n\ndraw();\n\nconst pieceAtBottom = () => {\n const piece = player.piece.piece;\n for (let j = 0; j < piece.length; j += 1) {\n for (let i = 0; i < piece[j].length; i += 1) {\n if ((player.y + j) === 19 && piece[j][i] !== '.') {\n // console.log(grid[(player.y + j + 1)][mod(player.x + i)]);\n return true;\n }\n }\n }\n return false;\n};\n\nconst pieceCollision = (piece, x, y) => {\n for (let j = 0; j < piece.length; j += 1) {\n for (let i = 0; i < piece[j].length; i += 1) {\n if ((y + j) >= 0 && piece[j][i] !== '.') {\n if (grid[(y +j)][mod(x + i)] !== '.') {\n // console.log(grid[(player.y + j + 1)][mod(player.x + i)]);\n return true;\n }\n }\n }\n }\n return false;\n};\n\nconst gameOver = () => {\n drop = false;\n playing = false;\n play.classList.remove('btn-active');\n ctx.fillStyle = mode === 'dark' ? 'white' : '#042D43';\n ctx.font = '42px \"Open Sans\", \"Helvetica\", \"sans-serif\"';\n ctx.fillText('Game over', 10, 80);\n}\n\nconst addPieceToGrid = (piece, x, y) => {\n for (let j = 0; j < piece.length; j += 1) {\n for (let i = 0; i < piece[j].length; i += 1) {\n if (y <= 0) {\n gameOver();\n } else if (piece[j][i] !== '.') {\n grid[(y + j)][mod(x + i)] = piece[j][i];\n }\n }\n }\n};\n\nconst digitSum = (num) => {\n let sum = 0;\n // Below code from https://stackoverflow.com/questions/38334652/sum-all-the-digits-of-a-number-javascript\n while (num) {\n sum += num % 10;\n num = Math.floor(num / 10);\n }\n return sum;\n}\n\nconst updateScore = () => {\n scoreText.innerText = score;\n const codedScore = 999999999 - (score * 13);\n let num = score * 17;\n while (num > 9) { num = digitSum(num) };\n scoreInput.value = `${codedScore}.${num}`;\n}\n\nconst addToScore = () => {\n score += 250;\n for (let i = 1; i < 4; i += 1) {\n const diff = Date.now() - scoreTimes[scoreTimes.length - i];\n if (diff <= 10000) {\n score += Math.ceil(250 - (diff / 40));\n }\n }\n scoreTimes.push(Date.now());\n updateScore();\n};\n\nconst deleteFullRows = () => {\n for (let i = 0; i < grid.length; i += 1) {\n if (grid[i].every(element => element != '.')) {\n grid.splice(i, 1);\n const newRow = [];\n for (let i = 0; i < canvas.width / unit; i += 1) {\n newRow.push('.');\n }\n grid.unshift(newRow);\n addToScore();\n draw();\n }\n }\n};\n\nconst movePlayerDown = () => {\n if (pieceAtBottom() || pieceCollision(player.piece.piece, player.x, player.y + 1)) {\n addPieceToGrid(player.piece.piece, player.x, player.y);\n deleteFullRows();\n if (playing === true) {\n score += (505 - delay);\n updateScore();\n drop = false;\n newPiece();\n }\n } else {\n player.y += 1;\n }\n if (drop === true && playing === true) {\n score += 5;\n updateScore();\n setTimeout(movePlayerDown, 50);\n }\n};\n\nconst update = (time = 0) => {\n draw();\n deltaTime = time - lastIteration;\n if (deltaTime > delay) {\n movePlayerDown();\n deltaTime = 0;\n lastIteration = time;\n }\n if (playing === true) {\n requestAnimationFrame(update);\n }\n};\n\nconst rotatePiece = (dir) => {\n const piece = player.piece.piece;\n const l = piece.length;\n const rotatedPiece = [];\n // All pieces are square so can do piece.length everywhere\n if (dir === 'cwise') {\n for (let j = 0; j < l; j += 1) {\n const row = [];\n for (let i = 0; i < l; i += 1) {\n row.push(piece[l - 1 - i][j]);\n }\n rotatedPiece.push(row);\n }\n } else {\n for (let j = 0; j < piece.length; j += 1) {\n const row = [];\n for (let i = 0; i < piece.length; i += 1) {\n row.push(piece[i][l - 1 - j]);\n }\n rotatedPiece.push(row);\n }\n }\n return pieceCollision(rotatedPiece, player.x, player.y) ? piece : rotatedPiece;\n}\n\ndocument.addEventListener('keydown', (event) => {\n if (event.keyCode === 65 || event.keyCode === 37) {\n if (!pieceCollision(player.piece.piece, player.x - 1, player.y)) {\n player.x -= 1;\n }\n }\n if (event.keyCode === 68 || event.keyCode === 39) {\n if (!pieceCollision(player.piece.piece, player.x + 1, player.y)) {\n player.x += 1;\n }\n }\n if (event.keyCode === 83 || event.keyCode === 32) {\n drop = true;\n movePlayerDown();\n } else {\n drop = false;\n }\n if (event.keyCode === 76 || event.keyCode === 38) {\n player.piece.piece = rotatePiece('cwise');\n }\n if (event.keyCode === 74 || event.keyCode === 40) {\n player.piece.piece = rotatePiece('acwise');\n }\n player.x = mod(player.x);\n});\n\nplay.addEventListener('click', (event) => {\n playing = true;\n drop = false;\n buildGrid();\n newPiece();\n\n delay = 500;\n lastIteration = 0;\n score = 0;\n updateScore();\n scoreTimes = [Date.now(), Date.now(), Date.now()]\n\n update();\n});\n\nlight.addEventListener('click', (event) => {\n darkToLight();\n draw();\n});\n\ndark.addEventListener('click', (event) => {\n lightToDark();\n draw();\n});\n\nsubmit.addEventListener('click', (event) => {\n if (nameInput.value === '') {\n window.alert(\"Please give a name to save your score\");\n }\n});\n","const dark = document.getElementById('dark');\nconst light = document.getElementById('light');\nlet mode = \"dark\";\n\nconst darkToLight = () => {\n if (mode === \"dark\") {\n mode = \"light\";\n dark.classList.remove('btn-active');\n light.classList.add('btn-active');\n }\n};\n\nconst lightToDark = () => {\n if (mode === \"light\") {\n mode = \"dark\";\n dark.classList.add('btn-active');\n light.classList.remove('btn-active');\n }\n};\n\nexport { dark, light, mode, lightToDark, darkToLight };\n\n// import { light, dark, mode, lightToDark, darkToLight } from '../shared/modes.js';\n\n// light.addEventListener('click', (event) => {\n// darkToLight();\n// draw();\n// });\n\n// dark.addEventListener('click', (event) => {\n// lightToDark();\n// draw();\n// });\n"],"sourceRoot":""}