{"mappings":"SAASA,KAAKC,EAAMC,GAClBC,KAAKF,KAAOA,EACZE,KAAKC,MAAQF,EAAgBC,KAAKE,UAAUH,GAAiBC,KAAKG,QAIpEN,KAAKO,UAAUD,MAAQ,WAGrB,IAFA,IAAIF,EAAQ,GAEHI,EAAI,EAAGA,EAAIL,KAAKF,KAAMO,IAG7B,IAFA,IAAIC,EAAML,EAAMI,GAAK,GAEZE,EAAI,EAAGA,EAAIP,KAAKF,KAAMS,IAC7BD,EAAIE,KAAK,MAIb,OAAOP,GAGTJ,KAAKO,UAAUF,UAAY,SAAUO,GAGnC,IAFA,IAAIR,EAAQ,GAEHI,EAAI,EAAGA,EAAIL,KAAKF,KAAMO,IAG7B,IAFA,IAAIC,EAAML,EAAMI,GAAK,GAEZE,EAAI,EAAGA,EAAIP,KAAKF,KAAMS,IAAK,CAClC,IAAIG,EAAOD,EAAMJ,GAAGE,GACpBD,EAAIE,KAAKE,EAAO,IAAIC,KAAKD,EAAKE,SAAUF,EAAKG,OAAS,MAI1D,OAAOZ,GAITJ,KAAKO,UAAUU,oBAAsB,WACnC,IAAIb,EAAQD,KAAKe,iBAEjB,GAAId,EAAMe,OACR,OAAOf,EAAMgB,KAAKC,MAAMD,KAAKE,SAAWlB,EAAMe,UAIlDnB,KAAKO,UAAUW,eAAiB,WAC9B,IAAId,EAAQ,GAQZ,OANAD,KAAKoB,UAAS,SAAUf,EAAGE,EAAGG,GACvBA,GACHT,EAAMO,KAAK,CAAEH,EAAGA,EAAGE,EAAGA,OAInBN,GAITJ,KAAKO,UAAUgB,SAAW,SAAUC,GAClC,IAAK,IAAIhB,EAAI,EAAGA,EAAIL,KAAKF,KAAMO,IAC7B,IAAK,IAAIE,EAAI,EAAGA,EAAIP,KAAKF,KAAMS,IAC7Bc,EAAShB,EAAGE,EAAGP,KAAKC,MAAMI,GAAGE,KAMnCV,KAAKO,UAAUkB,eAAiB,WAC9B,QAAStB,KAAKe,iBAAiBC,QAIjCnB,KAAKO,UAAUmB,cAAgB,SAAUC,GACvC,OAAQxB,KAAKyB,aAAaD,IAG5B3B,KAAKO,UAAUqB,aAAe,SAAUD,GACtC,QAASxB,KAAK0B,YAAYF,IAG5B3B,KAAKO,UAAUsB,YAAc,SAAUF,GACrC,OAAIxB,KAAK2B,aAAaH,GACbxB,KAAKC,MAAMuB,EAAKnB,GAAGmB,EAAKjB,GAExB,MAKXV,KAAKO,UAAUwB,WAAa,SAAUlB,GACpCV,KAAKC,MAAMS,EAAKL,GAAGK,EAAKH,GAAKG,GAG/Bb,KAAKO,UAAUyB,WAAa,SAAUnB,GACpCV,KAAKC,MAAMS,EAAKL,GAAGK,EAAKH,GAAK,MAG/BV,KAAKO,UAAUuB,aAAe,SAAUf,GACtC,OAAOA,EAASP,GAAK,GAAKO,EAASP,EAAIL,KAAKF,MACrCc,EAASL,GAAK,GAAKK,EAASL,EAAIP,KAAKF,MAG9CD,KAAKO,UAAU0B,UAAY,WAGzB,IAFA,IAAIC,EAAY,GAEP1B,EAAI,EAAGA,EAAIL,KAAKF,KAAMO,IAG7B,IAFA,IAAIC,EAAMyB,EAAU1B,GAAK,GAEhBE,EAAI,EAAGA,EAAIP,KAAKF,KAAMS,IAC7BD,EAAIE,KAAKR,KAAKC,MAAMI,GAAGE,GAAKP,KAAKC,MAAMI,GAAGE,GAAGuB,YAAc,MAI/D,MAAO,CACLhC,KAAME,KAAKF,KACXG,MAAO8B","sources":["src/js/grid.js"],"sourcesContent":["function Grid(size, previousState) {\n this.size = size;\n this.cells = previousState ? this.fromState(previousState) : this.empty();\n}\n\n// Build a grid of the specified size\nGrid.prototype.empty = function () {\n var cells = [];\n\n for (var x = 0; x < this.size; x++) {\n var row = cells[x] = [];\n\n for (var y = 0; y < this.size; y++) {\n row.push(null);\n }\n }\n\n return cells;\n};\n\nGrid.prototype.fromState = function (state) {\n var cells = [];\n\n for (var x = 0; x < this.size; x++) {\n var row = cells[x] = [];\n\n for (var y = 0; y < this.size; y++) {\n var tile = state[x][y];\n row.push(tile ? new Tile(tile.position, tile.value) : null);\n }\n }\n\n return cells;\n};\n\n// Find the first available random position\nGrid.prototype.randomAvailableCell = function () {\n var cells = this.availableCells();\n\n if (cells.length) {\n return cells[Math.floor(Math.random() * cells.length)];\n }\n};\n\nGrid.prototype.availableCells = function () {\n var cells = [];\n\n this.eachCell(function (x, y, tile) {\n if (!tile) {\n cells.push({ x: x, y: y });\n }\n });\n\n return cells;\n};\n\n// Call callback for every cell\nGrid.prototype.eachCell = function (callback) {\n for (var x = 0; x < this.size; x++) {\n for (var y = 0; y < this.size; y++) {\n callback(x, y, this.cells[x][y]);\n }\n }\n};\n\n// Check if there are any cells available\nGrid.prototype.cellsAvailable = function () {\n return !!this.availableCells().length;\n};\n\n// Check if the specified cell is taken\nGrid.prototype.cellAvailable = function (cell) {\n return !this.cellOccupied(cell);\n};\n\nGrid.prototype.cellOccupied = function (cell) {\n return !!this.cellContent(cell);\n};\n\nGrid.prototype.cellContent = function (cell) {\n if (this.withinBounds(cell)) {\n return this.cells[cell.x][cell.y];\n } else {\n return null;\n }\n};\n\n// Inserts a tile at its position\nGrid.prototype.insertTile = function (tile) {\n this.cells[tile.x][tile.y] = tile;\n};\n\nGrid.prototype.removeTile = function (tile) {\n this.cells[tile.x][tile.y] = null;\n};\n\nGrid.prototype.withinBounds = function (position) {\n return position.x >= 0 && position.x < this.size &&\n position.y >= 0 && position.y < this.size;\n};\n\nGrid.prototype.serialize = function () {\n var cellState = [];\n\n for (var x = 0; x < this.size; x++) {\n var row = cellState[x] = [];\n\n for (var y = 0; y < this.size; y++) {\n row.push(this.cells[x][y] ? this.cells[x][y].serialize() : null);\n }\n }\n\n return {\n size: this.size,\n cells: cellState\n };\n};\n"],"names":["Grid","size","previousState","this","cells","fromState","empty","prototype","x","row","y","push","state","tile","Tile","position","value","randomAvailableCell","availableCells","length","Math","floor","random","eachCell","callback","cellsAvailable","cellAvailable","cell","cellOccupied","cellContent","withinBounds","insertTile","removeTile","serialize","cellState"],"version":3,"file":"index.c017d1cb.js.map"}