import { ITileLocator } from '@motajs/common'; import { FaceDirection, IDataCommon, IDataCommonExtended, ISaveableContent, ITileRawData } from '@user/data-common'; import { LayerEventView } from './eventView'; import { ILayerEventView, IMapBlockSaveBase, IMapLayer, ITileBase } from './types'; export abstract class MapTileBase implements ITileBase, IDataCommonExtended, ISaveableContent> { readonly state: IDataCommon; readonly layer: IMapLayer; locator: ITileLocator; /** 该图块实例绑定的图块事件 */ private readonly tileEvents: ILayerEventView; constructor(x: number, y: number, layer: IMapLayer) { this.layer = layer; this.state = layer.state; this.locator = { x, y }; this.tileEvents = new LayerEventView(); this.tileEvents.markPure(); } abstract num(): number; abstract raw(): ITileRawData | null; abstract set(num: number): void; /** * 根据当前图块原始数据恢复默认事件并建立干净基准 */ protected restoreDefaultEvents(): void { const eventView = this.tileEvent(); eventView.clear(); const data = this.raw(); if (data) { for (const [priority, id] of Object.entries(data.events)) { eventView.set(Number(priority), id); } } eventView.markPure(); } setFaceDirection(direction: FaceDirection): number { const cur = this.num(); const next = this.layer.faceBinder.getFaceOf(cur, direction); if (next) { this.set(next.identifier); return next.identifier; } else { return cur; } } tileEvent(): ILayerEventView { return this.tileEvents; } pointEvent(): ILayerEventView | null { return this.layer.event(this.locator.x, this.locator.y); } abstract saveState(): Readonly; abstract loadState(save: Readonly): void; }