Spaces:
Runtime error
Runtime error
| const Cast = require('../../util/cast'); | |
| const Clone = require('../../util/clone'); | |
| const blankGridReturn = { | |
| grid: [ | |
| [0, 0, 0], | |
| [0, 0, 0], | |
| [0, 0, 0] | |
| ], | |
| offset: { | |
| left: 0, | |
| top: 0 | |
| } | |
| }; | |
| class Map { | |
| constructor() { | |
| this.boxes = []; | |
| } | |
| static new(...args) { | |
| return new Map(...args); | |
| } | |
| add(x1, y1, x2, y2) { | |
| // cast & round | |
| x1 = Math.round(Cast.toNumber(x1)); | |
| y1 = Math.round(Cast.toNumber(y1)); | |
| x2 = Math.round(Cast.toNumber(x2)); | |
| y2 = Math.round(Cast.toNumber(y2)); | |
| const position = { | |
| x1: x1, | |
| y1: y1, | |
| x2: x2, | |
| y2: y2, | |
| }; | |
| if (x2 < x1) { | |
| // x1 should be less | |
| position.x1 = x2; | |
| position.x2 = x1; | |
| } | |
| if (y2 > y1) { | |
| // y1 should be greater | |
| position.y1 = y2; | |
| position.y2 = y1; | |
| } | |
| const box = { | |
| x: position.x1, | |
| y: position.x2, | |
| width: position.x2 - position.x1, | |
| height: position.y1 - position.y2 | |
| }; | |
| this.boxes.push(box); | |
| return box; | |
| } | |
| clear() { | |
| this.boxes = []; | |
| } | |
| toGrid() { | |
| // no tiles if theres no boxes | |
| if (!this.boxes) return blankGridReturn; | |
| if (this.boxes.length <= 0) return blankGridReturn; | |
| const grid = []; | |
| // find highest y | |
| let highestY = -Infinity; | |
| for (const box of this.boxes) { | |
| if (box.y > highestY) highestY = box.y; | |
| } | |
| // find lowest y & its block height | |
| let lowestY = Infinity; | |
| let lowestHeight = 0; | |
| for (const box of this.boxes) { | |
| if (box.y < lowestY) { | |
| lowestY = box.y; | |
| lowestHeight = box.height; | |
| } | |
| } | |
| // for simplicity, we just fill this array & then clone it to make our rows | |
| const baseRow = []; | |
| // get grid width | |
| // find lowest x | |
| let lowestX = Infinity; | |
| for (const box of this.boxes) { | |
| if (box.x < lowestX) lowestX = box.x; | |
| } | |
| // find highest x & its block width | |
| let highestX = -Infinity; | |
| let highestWidth = 0; | |
| for (const box of this.boxes) { | |
| if (box.x > highestX) { | |
| highestX = box.x; | |
| highestWidth = box.width; | |
| } | |
| } | |
| // based on x numbers, add 0s to base row | |
| const xtoxwidth = (highestX - lowestX) + highestWidth; | |
| for (let i = 0; i < xtoxwidth; i++) { | |
| baseRow.push(0); | |
| } | |
| // based on y numbers, add rows to grid | |
| const ytoyheight = (highestY - lowestY) + lowestHeight; | |
| for (let i = 0; i < ytoyheight; i++) { | |
| // add a clone so modifiying a row doesnt modify all rows | |
| const clone = Clone.simple(baseRow); | |
| grid.push(clone); | |
| } | |
| // console.log(Clone.simple(grid)); | |
| // fill the walls | |
| // we need the offset since we are converting scratch coords to grid indexes | |
| const offset = Clone.simple({ | |
| top: highestY, | |
| left: lowestX | |
| }); | |
| for (const box of this.boxes) { | |
| // offsetX is straight forward | |
| // offsetY makes everything except the highest box be a negative Y | |
| // so we correct for that | |
| const offsetX = box.x - offset.left; | |
| const offsetY = Math.abs(box.y - offset.top); | |
| let tileIdx = offsetX; | |
| let rowIdx = offsetY; | |
| // repeat (height) { repeat (width) { tileIdx++ } rowIdx++; tileIdx = offsetX; } | |
| // the for loops could probably be better optimized but i dont wanna focus on that until the code actually works | |
| for (let i = 0; i < box.height; i++) { | |
| for (let j = 0; j < box.width; j++) { | |
| // find row & then find tile to set to 1 | |
| const row = grid[rowIdx]; | |
| row[tileIdx] = 1; | |
| tileIdx++; | |
| } | |
| rowIdx++; | |
| tileIdx = offsetX; | |
| } | |
| } | |
| return { | |
| grid: grid, | |
| offset: offset | |
| } | |
| } | |
| } | |
| module.exports = Map; |