/src/mapview.ts
import gs from './gamestate';
import { Cell } from './cell';
import { Direction } from './direction';
const MAP_WIDTH = 9;
const MAP_HEIGHT = 9;
const nullCell = new Cell(-1, -1);
export default class MapView {
root: HTMLDivElement
coords: HTMLDivElement
cells: HTMLDivElement[][]
constructor() {
this.root = <HTMLDivElement>document.getElementById('mapview');
this.coords = <HTMLDivElement>document.getElementById('coords');
this.cells = [];
for (let j = 0; j < MAP_HEIGHT; j++) {
const row = document.createElement('div');
this.cells[j] = [];
for (let i = 0; i < MAP_WIDTH; i++) {
const cell: HTMLDivElement = document.createElement('div');
cell.className = 'map-cell';
row.appendChild(cell);
this.cells[j][i] = cell;
}
this.root.appendChild(row);
}
}
/* 012345678
1
2
3
3
4 P
5
6
7
8
*/
updateAll() {
const [ px, py ] = gs.map.getPlayerPosition();
for (let j = py - 4; j <= py + 4; j++) {
for (let i = px - 4; i <= px + 4; i++) {
this.update(i, j);
}
}
gs.mapView.updateCoords(px, py);
}
update(x: number, y: number) {
const [ px, py ] = gs.map.getPlayerPosition();
const cx = x - px + 4;
const cy = y - py + 4;
if (cx < 0 || cy < 0 || cx >= MAP_WIDTH || cx >= MAP_HEIGHT)
return;
const cell = (x < 0 || y < 0 || x >= gs.map.width || y >= gs.map.height) ?
nullCell :
gs.map.cells[y][x];
const domCell = this.cells[cy][cx];
let visual = null;
domCell.classList.toggle('navigable', cell.navigable);
domCell.classList.toggle('blocked-n', !cell.exits[Direction.North]);
domCell.classList.toggle('blocked-e', !cell.exits[Direction.East]);
domCell.classList.toggle('blocked-s', !cell.exits[Direction.South]);
domCell.classList.toggle('blocked-w', !cell.exits[Direction.West]);
if (x == px && y == py) {
visual = '\u25CF';
}
domCell.innerText = visual;
}
updateCoords(x: number, y: number) {
this.coords.innerText = '[' + x + ', ' + y + ']';
}
}