From 77b2f09883d4144c01802c5c75622e28f3864ca0 Mon Sep 17 00:00:00 2001 From: eug-vs Date: Sat, 12 Mar 2022 15:28:19 +0300 Subject: refactor: separate TileOnBoard class --- src/Tile/TileOnBoard.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/Tile/TileOnBoard.ts (limited to 'src/Tile/TileOnBoard.ts') diff --git a/src/Tile/TileOnBoard.ts b/src/Tile/TileOnBoard.ts new file mode 100644 index 0000000..65f3731 --- /dev/null +++ b/src/Tile/TileOnBoard.ts @@ -0,0 +1,46 @@ +import _ from 'lodash'; +import Tile, { Feature, Direction } from './Tile'; + +export interface Attachment { + attachTo: Tile; + side: Direction; + tile: Tile; + rotation: number; // Clockwise rotation of a tile +} + +export default class TileOnBoard extends Tile { + neighbors: [Tile, Tile, Tile, Tile]; + private orientation: number // amount of 90-degree counter-clockwise rotations from original orientation + + constructor(center: Feature, sides: [Feature, Feature, Feature, Feature], shield = false, orientation = 0) { + super(center, sides, shield); + this.orientation = orientation; + } + + getSide(direction: Direction) { + return this.sides[(((this.orientation + direction) % 4) + 4) % 4]; + } + + rotate(rotation = 1) { + this.orientation = this.orientation - rotation; + } + + getAttachments(tile: Tile): Attachment[] { + return _.flatten([0, 1, 2, 3].map(side => { + const item = this.getSide(side); + return [0, 1, 2, 3] + .filter(rotation => tile.getSide(side - rotation + 2) === item) + .map(rotation => ({ + tile, + rotation, + side, + attachTo: this as Tile + })) + })); + } + + attach(tile: Tile, side: Direction) { + if (this.neighbors[side]) throw new Error('There is something already attached to this side!'); + this.neighbors[side] = tile; + } +} -- cgit v1.2.3