feat(event): complete phase one event system

This commit is contained in:
AncTe committed 2026-09-09 12:01:21 +08:00
1 parent b9213ddf22
commit a297311ea6
51 files changed
+3261 -1114

No files matched your search

@@ -0,0 +1,48 @@
import { logger } from '@motajs/common';
import { ILayerEventView } from './types';
export class LayerEventView implements ILayerEventView {
/** 当前绑定的事件 */
private readonly store: Map<number, string> = new Map();
/** 用于判断事件是否变化的参考基准 */
private reference: Map<number, string> | null = null;
get(): ReadonlyMap<number, string> {
return this.store;
}
set(priority: number, event: string): void {
if (this.store.has(priority)) {
logger.warn(136, priority.toString());
}
this.store.set(priority, event);
}
delete(priority: number): void {
this.store.delete(priority);
}
clear(): void {
this.store.clear();
}
markPure(): void {
this.reference = new Map(this.store);
}
dirty(): boolean {
const reference = this.reference;
if (!reference) {
return this.store.size > 0;
}
if (this.store.size !== reference.size) {
return true;
}
for (const [priority, event] of this.store) {
if (reference.get(priority) !== event) {
return true;
}
}
return false;
}
}
+2 -1
View File
@@ -16,6 +16,7 @@ import {
} from './types';
import {
IDataCommon,
ILocationIndexer,
ITileStore,
MapLocIndexer,
SaveCompression
@@ -36,7 +37,7 @@ export class GameMap extends Hookable<IGameMapHooks> implements IGameMap {
private layerHookMap: Map<IMapLayer, IMapLayerHookController> = new Map();
/** 坐标索引器 */
readonly indexer = new MapLocIndexer();
readonly indexer: ILocationIndexer = new MapLocIndexer();
active: boolean = false;
eventLayer: IMapLayer | null = null;
+15 -23
View File
@@ -3,11 +3,16 @@ import {
FaceDirection,
IDataCommon,
IDataCommonExtended,
IMapBlockRawData,
ISaveableContent,
ITileRawData
} from '@user/data-common';
import { IMapBlockSaveBase, IMapLayer, ITileBase } from './types';
import { LayerEventView } from './eventView';
import {
ILayerEventView,
IMapBlockSaveBase,
IMapLayer,
ITileBase
} from './types';
export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
implements ITileBase, IDataCommonExtended, ISaveableContent<Readonly<TSave>>
@@ -15,12 +20,15 @@ export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
readonly state: IDataCommon;
readonly layer: IMapLayer;
locator: ITileLocator;
triggers: Set<number> | null = null;
/** 该图块实例绑定的图块事件 */
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;
@@ -29,10 +37,6 @@ export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
abstract set(num: number): void;
block(): IMapBlockRawData | null {
return null;
}
setFaceDirection(direction: FaceDirection): number {
const cur = this.num();
const next = this.layer.faceBinder.getFaceOf(cur, direction);
@@ -44,24 +48,12 @@ export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
}
}
clearTrigger(): void {
this.triggers = null;
tileEvent(): ILayerEventView {
return this.tileEvents;
}
addTrigger(trigger: number): void {
if (!this.triggers) {
this.triggers = new Set();
}
this.triggers.add(trigger);
}
deleteTrigger(trigger: number): void {
if (!this.triggers) return;
this.triggers.delete(trigger);
}
useEmptyTrigger(): void {
this.triggers = new Set();
pointEvent(): ILayerEventView | null {
return this.layer.event(this.locator.x, this.locator.y);
}
abstract saveState(): Readonly<TSave>;