import Debug, { Debugger } from 'debug'; enum Direction { North, East, South, West } enum Item { Empty = " ", Road = "R", Town = "T", River = "I", Church = "C", } class Cell { center: Item; private sides: [Item, Item, Item, Item]; private orientation: number // amount of 90-degree counter-clockwise rotations from original orientation shield?: boolean; debug: Debugger; public constructor(center: Item, sides: [Item, Item, Item, Item], shield = false) { this.center = center; this.sides = sides; this.shield = shield; this.orientation = 0; this.debug = Debug('cell'); } toString() { return ` ${this.getSide(Direction.North)} \n${this.getSide(Direction.West)}${this.center}${this.getSide(Direction.East)}\n ${this.getSide(Direction.South)} `; } getSide(direction: Direction) { return this.sides[(((this.orientation + direction) % 4) + 4) % 4]; } rotate(rotation = 1) { this.debug(`Rotating ${rotation} clockwise`) this.orientation = this.orientation - rotation; } isAttachable(cell: Cell, side: Direction) { return (this.getSide(side) === cell.getSide(side + 2)); } } const test = () => { const cell = new Cell(Item.Empty, [Item.Road, Item.Road, Item.Town, Item.Town]); console.log(cell.toString()); const other = new Cell(Item.Empty, [Item.Road, Item.Road, Item.Town, Item.Town]); other.rotate(); console.log(other.toString()); console.log(cell.isAttachable(other, Direction.North)); } test();