From 7c155be5ceb2e3054fb08a88cfa4074f577f6616 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Wed, 30 Sep 2026 00:00:20 +0800 Subject: [PATCH] refactor: map --- .../data-base/src/map/mapState.test.ts | 8 +-- packages-user/data-base/src/map/mapState.ts | 14 ++--- packages-user/data-base/src/map/mover.ts | 53 ++++++------------- packages-user/data-base/src/map/staticTile.ts | 6 +-- packages-user/data-base/src/map/types.ts | 2 +- 5 files changed, 27 insertions(+), 56 deletions(-) diff --git a/packages-user/data-base/src/map/mapState.test.ts b/packages-user/data-base/src/map/mapState.test.ts index 9b99d93..a161ad3 100644 --- a/packages-user/data-base/src/map/mapState.test.ts +++ b/packages-user/data-base/src/map/mapState.test.ts @@ -318,19 +318,19 @@ describe('MapState activation and areas', () => { new Set([[{ start: 0, end: 0 }], [{ start: 1, end: 1 }]]) ); - mapState.notifyEnterFloor('A'); + mapState.autoActivateFloor('A'); expect(mapState.isMapActive('A')).toBe(false); mapState.useAutoActivitor(true); - mapState.notifyEnterFloor('A'); + mapState.autoActivateFloor('A'); expect(mapState.isMapActive('A')).toBe(true); - mapState.notifyEnterFloor('B'); + mapState.autoActivateFloor('B'); expect(mapState.isMapActive('A')).toBe(false); expect(mapState.isMapActive('B')).toBe(true); mapState.useAutoActivitor(false); - mapState.notifyEnterFloor('A'); + mapState.autoActivateFloor('A'); expect(mapState.isMapActive('A')).toBe(false); }); }); diff --git a/packages-user/data-base/src/map/mapState.ts b/packages-user/data-base/src/map/mapState.ts index fe78b00..ece8006 100644 --- a/packages-user/data-base/src/map/mapState.ts +++ b/packages-user/data-base/src/map/mapState.ts @@ -4,7 +4,6 @@ import { SaveCompression, shouldReplay } from '@user/data-common'; -import { ITileStore } from '@user/data-common'; import { IGameMap, IGameMapSave, @@ -34,10 +33,7 @@ export class MapState implements IMapState { /** 自动分区激活器开关 */ private autoActivitorEnabled: boolean = false; - constructor( - private readonly tileStore: ITileStore, - public readonly state: IDataCommon - ) {} + constructor(readonly state: IDataCommon) {} //#region 楼层管理 @@ -72,11 +68,10 @@ export class MapState implements IMapState { const state = this.createMap(raw.floorId, raw.width, height); for (const [zIndex, map] of entries) { const z = Number(zIndex); - const layer = state.addLayer(); const alias = raw.layerAlias[z]; + const layer = state.addLayer(alias); layer.setMapRef(new Uint32Array(map)); layer.setZIndex(z); - state.setLayerAlias(layer, alias); // 设置坐标点事件 const events = raw.events[z]; @@ -106,8 +101,7 @@ export class MapState implements IMapState { } else { this.maps.push(id); } - const tile = this.tileStore; - const state = new GameMap(this.state, tile, id, width, height); + const state = new GameMap(this.state, id, width, height); // 若已设置参考基准,新楼层直接视为全脏 if (this.compared) { state.markDirty(true); @@ -162,7 +156,7 @@ export class MapState implements IMapState { this.autoActivitorEnabled = enable; } - notifyEnterFloor(id: string): void { + autoActivateFloor(id: string): void { if (!this.autoActivitorEnabled) return; const idx = this.maps.indexOf(id); if (idx === -1) return; diff --git a/packages-user/data-base/src/map/mover.ts b/packages-user/data-base/src/map/mover.ts index 2c79c98..7b9502c 100644 --- a/packages-user/data-base/src/map/mover.ts +++ b/packages-user/data-base/src/map/mover.ts @@ -33,65 +33,44 @@ export class DynamicTileMover extends ObjectMover { } @shouldReplay('Dynamic tile moving step should be replayed.') - protected onStepEnd( + protected async onStepEnd( code: number, step: ObjectMoveStep, tile: IDynamicTile ): Promise { if (code !== DynamicMoveCode.Success) { logger.warn(126, 'DynamicMoveCode.Success (0)', code.toString()); - return Promise.resolve({ x: tile.x, y: tile.y }); + return { x: tile.x, y: tile.y }; } - const locator: ITileLocator = { - x: tile.x, - y: tile.y - }; const handler = tile.state.faceManager.get(FaceGroup.Dir8); if (!handler) { logger.warn(192); - return Promise.resolve({ x: tile.x, y: tile.y }); + return { x: tile.x, y: tile.y }; } switch (step.type) { - case ObjectMoveType.Dir: { - const { x, y } = handler.movement(step.move); - tile.setFaceDirection(step.move); - locator.x += x; - locator.y += y; - break; - } - case ObjectMoveType.DirFace: { - const { x, y } = handler.movement(step.move); - tile.setFaceDirection(step.face); - locator.x += x; - locator.y += y; - break; - } - case ObjectMoveType.Face: { - tile.setFaceDirection(step.value); - break; - } + case ObjectMoveType.Dir: + case ObjectMoveType.DirFace: case ObjectMoveType.Special: { const { x, y } = handler.movement(this.moveDirection); tile.setFaceDirection(this.faceDirection); - locator.x += x; - locator.y += y; - break; + return { x: tile.x + x, y: tile.y + y }; + } + case ObjectMoveType.Face: { + tile.setFaceDirection(step.value); + return { x: tile.x, y: tile.y }; } case ObjectMoveType.Teleport: case ObjectMoveType.Jump: { const { x, y, rel } = step; tile.setFaceDirection(this.faceDirection); - if (rel) { - locator.x += x; - locator.y += y; - } else { - locator.x = x; - locator.y = y; - } - break; + const nx = rel ? tile.x + x : x; + const ny = rel ? tile.y + y : y; + return { x: nx, y: ny }; + } + default: { + return { x: tile.x, y: tile.y }; } } - return Promise.resolve(locator); } protected onStepSettled(): Promise { diff --git a/packages-user/data-base/src/map/staticTile.ts b/packages-user/data-base/src/map/staticTile.ts index 27a6305..713eeb1 100644 --- a/packages-user/data-base/src/map/staticTile.ts +++ b/packages-user/data-base/src/map/staticTile.ts @@ -41,16 +41,14 @@ export class StaticTile } saveState(): Readonly { - let save: IStaticBlockSave; const eventView = this.tileEvent(); if (eventView.dirty()) { - save = { + return { events: new Map(eventView.get()) }; } else { - save = {}; + return {}; } - return save; } loadState(save: Readonly): void { diff --git a/packages-user/data-base/src/map/types.ts b/packages-user/data-base/src/map/types.ts index 192ba16..e9aab13 100644 --- a/packages-user/data-base/src/map/types.ts +++ b/packages-user/data-base/src/map/types.ts @@ -834,7 +834,7 @@ export interface IMapState * 那么会自动取消激活当前分区,然后激活新进入的分区。此函数一般不需要手动调用。 * @param id 楼层 id */ - notifyEnterFloor(id: string): void; + autoActivateFloor(id: string): void; } //#endregion