2021-05-09 04:58:29 +00:00
|
|
|
import { Layer } from './layer.js';
|
2021-05-17 04:26:18 +00:00
|
|
|
import { Mask } from './mask.js';
|
2021-05-11 03:12:32 +00:00
|
|
|
import { Tile } from './tile.js';
|
2021-05-11 02:21:23 +00:00
|
|
|
import { TileFactory } from './tile_factory.js';
|
2021-05-09 04:58:29 +00:00
|
|
|
|
|
|
|
|
export class Grid {
|
2021-05-11 03:41:01 +00:00
|
|
|
prnt: HTMLElement;
|
|
|
|
|
layers: Map<string, Layer> = new Map<string, Layer>();
|
2021-05-17 04:26:18 +00:00
|
|
|
masks: Map<string, Mask> = new Map<string, Mask>();
|
2021-05-09 04:58:29 +00:00
|
|
|
|
2021-05-17 04:26:18 +00:00
|
|
|
constructor(prnt: HTMLElement, width: number, height: number, tileset: string, layers: string[], masks: string[]) {
|
2021-05-11 03:41:01 +00:00
|
|
|
this.prnt = prnt;
|
2021-05-09 04:58:29 +00:00
|
|
|
|
2021-05-17 04:26:18 +00:00
|
|
|
this.prnt.style.display = 'grid';
|
|
|
|
|
this.prnt.style.gridTemplateColumns = `repeat(${width}, 1fr)`;
|
|
|
|
|
this.prnt.style.gridTemplateRows = `repeat(${height}, 1fr)`;
|
|
|
|
|
this.prnt.style.backgroundImage = `url("images/${tileset}/land.svg")`;
|
2021-05-09 04:58:29 +00:00
|
|
|
|
2021-05-17 04:26:18 +00:00
|
|
|
for (let i = 0; i <= layers.length; i++) {
|
|
|
|
|
const name = layers[i];
|
|
|
|
|
this.layers.set(name, new Layer(i * height, tileset));
|
2021-05-09 04:58:29 +00:00
|
|
|
}
|
|
|
|
|
|
2021-05-17 04:26:18 +00:00
|
|
|
for (const name of masks) {
|
|
|
|
|
this.masks.set(name, new Mask(width, height));
|
2021-05-09 04:58:29 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-11 03:23:28 +00:00
|
|
|
add_tile(tile_factory: TileFactory, x: number, y: number): Tile {
|
2021-05-11 03:41:01 +00:00
|
|
|
const tile = this.layers.get(tile_factory.layer_name)!.add_tile(tile_factory, y);
|
2021-05-11 03:23:28 +00:00
|
|
|
|
2021-05-09 04:58:29 +00:00
|
|
|
// Grids are 1-indexed
|
2021-05-11 03:23:28 +00:00
|
|
|
tile.elem.style.gridColumnStart = `${x + 1}`;
|
|
|
|
|
tile.elem.style.gridRowStart = `${y + 1}`;
|
2021-05-11 03:41:01 +00:00
|
|
|
this.prnt.appendChild(tile.elem);
|
2021-05-11 03:23:28 +00:00
|
|
|
|
2021-05-17 04:26:18 +00:00
|
|
|
for (const [name, mask] of tile.masks) {
|
|
|
|
|
this.masks.get(name)!.update(x, y, mask);
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-11 03:12:32 +00:00
|
|
|
return tile;
|
2021-05-09 04:58:29 +00:00
|
|
|
}
|
|
|
|
|
}
|