86 lines
1.7 KiB
TypeScript
86 lines
1.7 KiB
TypeScript
import { Tile } from './tile.js';
|
|
|
|
export class Layer {
|
|
#size_x: number;
|
|
#size_y: number;
|
|
#level: number;
|
|
#tileset: string;
|
|
|
|
#occupied: boolean[][];
|
|
|
|
constructor(size_x: number, size_y: number) {
|
|
this.#size_x = size_x;
|
|
this.#size_y = size_y;
|
|
|
|
this.#occupied = [];
|
|
|
|
for (let xi = 0; xi < this.#size_x; xi++) {
|
|
this.#occupied.push(Array(this.#size_y).fill(false));
|
|
}
|
|
}
|
|
|
|
set_level(level: number) {
|
|
this.#level = level;
|
|
}
|
|
|
|
set_tileset(tileset: string) {
|
|
this.#tileset = tileset;
|
|
}
|
|
|
|
add_tile(tile: Tile, x: number, y: number): HTMLElement | undefined {
|
|
if (!this.can_add(tile, x, y)) {
|
|
return undefined;
|
|
}
|
|
|
|
this.mark_occupied(tile, x, y);
|
|
|
|
const elem = tile.get_elem(this.#tileset);
|
|
elem.style.zIndex = `${this.#level}`;
|
|
|
|
return elem;
|
|
}
|
|
|
|
private can_add(tile: Tile, x: number, y: number) {
|
|
const mask = tile.get_mask();
|
|
|
|
for (let xi = 0; xi < mask.length; xi++) {
|
|
if (x + xi >= this.#occupied.length) {
|
|
// Shape goes off grid (x)
|
|
return false;
|
|
}
|
|
|
|
for (let yi = 0; yi < mask[xi].length; yi++) {
|
|
if (!mask[xi][yi]) {
|
|
continue;
|
|
}
|
|
|
|
if (y + yi >= this.#occupied[x + xi].length) {
|
|
// Shape goes off grid (y)
|
|
return false;
|
|
}
|
|
|
|
if (this.#occupied[x + xi][y + yi]) {
|
|
// Conflicts
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private mark_occupied(tile: Tile, x: number, y: number) {
|
|
const mask = tile.get_mask();
|
|
|
|
for (let xi = 0; xi < mask.length; xi++) {
|
|
for (let yi = 0; yi < mask[xi].length; yi++) {
|
|
if (!mask[xi][yi]) {
|
|
continue;
|
|
}
|
|
|
|
this.#occupied[x + xi][y + yi] = true;
|
|
}
|
|
}
|
|
}
|
|
}
|