{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/packs/projects/game_of_life_pieces.js","webpack:///./app/javascript/packs/projects/game_of_life.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","patterns","Map","canvas","document","querySelector","ctx","getContext","speedButton","getElementById","speed","autoplayButton","counter","autoplay","iterateButton","iterate","clear","random","patternSelect","adding","width","height","cols","rows","buildGrid","Array","fill","map","grid","drawCell","col","row","fillStyle","fillRect","draw","length","addEventListener","event","Math","floor","offsetX","offsetY","pattern","colPlus","parseInt","rowPlus","countLivingNeighbours","x","y","neighbours","push","filter","undefined","iteration","nextGen","livingN","toString","nextGeneration","requestAnimationFrame","classList","toggle","target","light","darkToLight","dark","lightToDark","remove","add"],"mappings":"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","file":"js/projects/game_of_life-68bafdeb891bcaf3818f.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 = 52);\n","const patterns = new Map([\n ['dot', [[0,0]]],\n ['r-pentomino', [[1,0],[2,0],[1,1],[0,1],[1,2]]],\n ['b-heptomino', [[0,0],[0,1],[1,1],[1,2],[2,1],[2,0],[3,0]]],\n ['pi-heptomino', [[0,0],[0,1],[0,2],[1,0],[2,0],[2,1],[2,2]]],\n ['glider', [[0,2],[1,2],[2,2],[2,1],[1,0]]],\n ['acorn', [[1,0],[3,1],[0,2],[1,2],[4,2],[5,2],[6,2]]],\n ['diehard', [[0,1],[1,1],[1,2],[5,2],[6,2],[7,2],[6,0]]],\n ['bunnies', [[0,0],[2,1],[2,2],[1,3],[3,3],[6,0],[6,1],[5,2],[7,2]]],\n ['lidka', [[1,0],[0,1],[2,1],[1,2],[4,14],[5,14],[6,14],[8,12],[8,11],[8,10],[6,12],[6,11],[5,12]]],\n ['pentadecathlon', [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0]]],\n ['lwss', [[1,0],[2,0],[3,0],[4,0],[4,1],[4,2],[3,3],[0,1],[0,3]]],\n ['mwss', [[1,0],[2,0],[3,0],[4,0],[5,0],[5,1],[5,2],[4,3],[0,1],[0,3],[2,4]]],\n ['hwss', [[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[6,1],[6,2],[5,3],[0,1],[0,3],[2,4],[3,4]]],\n ['loafer', [[1,0],[2,0],[0,1],[1,2],[2,3],[3,1],[3,2],[5,0],[6,1],[7,1],[7,0],[8,0],[8,4],[8,5],[7,5],[6,5],[5,6],[6,7],[7,8],[8,8]]],\n ['copperhead', [[1,0],[2,0],[5,0],[6,0],[3,1],[4,1],[3,2],[4,2],[0,3],[2,3],[5,3],[7,3],[0,4],[7,4],[0,6],[7,6],[1,7],[2,7],[5,7],[6,7],[2,8],[3,8],[4,8],[5,8],[3,10],[4,10],[3,11],[4,11]]],\n ['noahsArk', [[10,0],[9,1],[12,0],[10,2],[13,2],[12,3],[13,3],[14,3],[0,10],[1,9],[0,12],[2,10],[2,13],[3,12],[3,13],[3,14]]],\n ['queenBeeLoop', [[12,0],[12,1],[13,2],[13,3],[13,4],[12,5],[12,6],[14,1],[14,5],[15,2],[15,4],[16,3],[0,11],[1,11],[5,11],[6,11],[2,10],[3,10],[4,10],[1,9],[5,9],[2,8],[4,8],[3,7],[17,12],[18,12],[22,12],[23,12],[19,13],[20,13],[21,13],[18,14],[22,14],[19,15],[21,15],[20,16],[11,17],[11,18],[11,22],[11,23],[10,19],[10,20],[10,21],[9,18],[9,22],[8,19],[8,21],[7,20]]],\n ['gliderGun', [[0,4],[1,4],[0,5],[1,5],[10,4],[10,5],[10,6],[11,3],[11,7],[12,2],[12,8],[13,2],[13,8],[14,5],[15,3],[15,7],[16,4],[16,5],[16,6],[17,5],[20,4],[20,3],[20,2],[21,4],[21,3],[21,2],[22,1],[22,5],[24,0],[24,1],[24,5],[24,6],[34,2],[35,2],[34,3],[35,3]]]\n]);\n\nexport { patterns };\n","import { light, dark, mode, lightToDark, darkToLight } from '../shared/modes.js';\nimport { patterns } from './game_of_life_pieces.js'\n\nconst canvas = document.querySelector('canvas');\nconst ctx = canvas.getContext('2d');\n\nlet speedButton = document.getElementById('speed');\nlet speed = 101 - speedButton.value;\nconst autoplayButton = document.getElementById('autoplay');\nlet counter = 0;\nlet autoplay = false;\nlet lastTime;\n\nconst iterateButton = document.getElementById('iterate');\nlet iterate = false;\n\nconst clear = document.getElementById('clear');\nconst random = document.getElementById('random');\n\nconst patternSelect = document.getElementById('pattern-select');\nlet adding = 'dot';\n\nconst resolution = 4;\ncanvas.width = 400;\ncanvas.height = 400;\n\nlet cols = canvas.width / resolution;\nlet rows = canvas.height / resolution;\n\nconst buildGrid = () => {\n return new Array(cols).fill(null)\n .map(() => new Array(rows).fill('.'));\n};\n\nlet grid = buildGrid();\n\nconst drawCell = (col, row, value) => {\n if (mode === \"dark\") {\n ctx.fillStyle = value === '.' ? `hsl(0,0%,0%)` : `hsl(${value},100%,50%)`;\n } else if (mode === \"light\") {\n ctx.fillStyle = value === '.' ? `hsl(0,100%,100%)` : `hsl(${value},75%,75%)`;\n }\n ctx.fillRect(col * resolution, row * resolution, resolution, resolution);\n};\n\nconst draw = () => {\n for (let col = 0; col < grid.length; col++) {\n for (let row = 0; row < grid[col].length; row++) {\n const value = grid[col][row];\n drawCell(col, row, value);\n }\n }\n};\n\ndraw();\n\ncanvas.addEventListener('click', (event) => {\n const col = Math.floor((event.offsetX - 3) / resolution);\n const row = Math.floor((event.offsetY - 3) / resolution);\n if (adding === 'delete') {\n grid[col][row] = '.';\n } else {\n let pattern = patterns.get(adding);\n\n for (let i = 0; i < pattern.length; i++) {\n const colPlus = col + parseInt(pattern[i][0]);\n const rowPlus = row + parseInt(pattern[i][1]);\n grid[colPlus][rowPlus] = '0';\n }\n }\n\n draw();\n});\n\nconst countLivingNeighbours = (x, y) => {\n const neighbours = [\n grid[x][y+1],\n grid[x][y-1]\n ];\n if (x > 0) {\n neighbours.push(grid[x-1][y-1], grid[x-1][y], grid[x-1][y+1]);\n }\n if (x < grid.length - 1) {\n neighbours.push(grid[x+1][y+1], grid[x+1][y], grid[x+1][y-1]);\n }\n const livingNeighbours = neighbours.filter(n => n !== '.' && n !== undefined);\n return livingNeighbours.length;\n}\n\nconst nextGeneration = (grid) => {\n const nextGen = buildGrid();\n for (let col = 0; col < nextGen.length; col++) {\n for (let row = 0; row < nextGen[col].length; row++) {\n const livingN = countLivingNeighbours(col, row);\n if (grid[col][row] === '.') {\n nextGen[col][row] = livingN === 3 ? '0' : '.';\n } else {\n if (livingN < 2 || livingN > 3) {\n nextGen[col][row] = '.';\n } else {\n nextGen[col][row] = (parseInt(grid[col][row]) + 11).toString();\n }\n }\n }\n }\n return nextGen;\n}\n\nconst iteration = () => {\n if (iterate === true || counter === speed) {\n grid = nextGeneration(grid);\n draw();\n iterate = false;\n }\n\n if (counter >= speed) {\n counter = 0;\n }\n\n if (autoplay === true) {\n counter ++;\n requestAnimationFrame(iteration);\n }\n}\n\niterateButton.addEventListener('click', (event) => {\n iterate = true;\n iteration();\n});\n\nautoplayButton.addEventListener('click', (event) => {\n autoplay = !autoplay;\n\n if (autoplay === true) {\n counter = speed - 1;\n iteration();\n }\n autoplayButton.classList.toggle('btn-active');\n});\n\nspeedButton.addEventListener('input', (event) => {\n speed = 101 - speedButton.value;\n});\n\nrandom.addEventListener('click', (event) => {\n for (let col = 0; col < grid.length; col++) {\n for (let row = 0; row < grid[col].length; row++) {\n grid[col][row] = Math.random() < 0.5 ? '.' : '0';\n }\n }\n draw();\n});\n\nclear.addEventListener('click', (event) => {\n grid = buildGrid();\n draw();\n});\n\npatternSelect.addEventListener('input', (event) => {\n adding = event.target.value;\n})\n\nlight.addEventListener('click', (event) => {\n darkToLight();\n draw();\n});\n\ndark.addEventListener('click', (event) => {\n lightToDark();\n draw();\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":""}