Files
tower/ts/layer.ts
2021-05-09 04:58:29 +00:00

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;
}
}
}
}