From c43bfa2ab0e7dcdd22285447609e68e566ebf5f5 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sun, 26 Apr 2026 15:31:27 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=9C=B0=E5=9B=BE=E5=AD=98?= =?UTF-8?q?=E6=A1=A3=E7=9A=84=E5=8A=A0=E8=BD=BD=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages-user/client-modules/src/client.ts | 4 +- .../client-modules/src/render/ui/main.tsx | 2 +- packages-user/data-base/src/types.ts | 2 +- packages-user/data-state/src/core.ts | 127 ++++++++++++++---- packages-user/data-state/src/enemy/index.ts | 1 + packages-user/data-state/src/index.ts | 18 --- packages-user/data-state/src/save/index.ts | 1 + packages-user/data-state/src/shared.ts | 17 +++ packages-user/data-state/src/types.ts | 3 +- .../legacy-plugin-data/src/fallback.ts | 8 +- 10 files changed, 130 insertions(+), 53 deletions(-) diff --git a/packages-user/client-modules/src/client.ts b/packages-user/client-modules/src/client.ts index 4a2945e..14b538a 100644 --- a/packages-user/client-modules/src/client.ts +++ b/packages-user/client-modules/src/client.ts @@ -114,7 +114,7 @@ export class ClientCore implements IClientCore { // 使用分频器,用户可以在设置中调整,如果设备性能较差调高分频有助于提高性能表现 excitaion: excitationDivider }); - this.mainMapRenderer = new MapRenderer(this.materials, data.layer); + this.mainMapRenderer = new MapRenderer(this.materials, data.maps); this.mainMapExtension = new MapExtensionManager(this.mainMapRenderer); // 兼容层 @@ -133,7 +133,7 @@ export class ClientCore implements IClientCore { await this.materials.trackedAsset.then(); this.mainMapRenderer.useAsset(this.materials.trackedAsset); - const layer = this.data.layer.getLayerByAlias('event'); + const layer = this.data.maps.getLayerByAlias('event'); if (layer) { this.mainMapExtension.addHero(this.data.hero.mover, layer); this.mainMapExtension.addDoor(layer); diff --git a/packages-user/client-modules/src/render/ui/main.tsx b/packages-user/client-modules/src/render/ui/main.tsx index 40a77a5..f46e26a 100644 --- a/packages-user/client-modules/src/render/ui/main.tsx +++ b/packages-user/client-modules/src/render/ui/main.tsx @@ -243,7 +243,7 @@ const MainScene = defineComponent(() => { > diff --git a/packages-user/data-base/src/types.ts b/packages-user/data-base/src/types.ts index 9c4b160..673f5f4 100644 --- a/packages-user/data-base/src/types.ts +++ b/packages-user/data-base/src/types.ts @@ -18,7 +18,7 @@ export interface IStateBase { readonly numberIdMap: Map; /** 地图状态 */ - readonly layer: IMapStore; + readonly maps: IMapStore; /** 勇士状态 */ readonly hero: IHeroState; diff --git a/packages-user/data-state/src/core.ts b/packages-user/data-state/src/core.ts index d1eaa10..4b3b325 100644 --- a/packages-user/data-state/src/core.ts +++ b/packages-user/data-state/src/core.ts @@ -16,16 +16,14 @@ import { MotaDataLoader, loading, IRoleFaceBinder, - ILayerState, - LayerState, RoleFaceBinder, FaceDirection, ISaveableContent, - IStateSaveData, SaveCompression, - IReadonlyEnemy + IReadonlyEnemy, + IMapStore, + MapStore } from '@user/data-base'; -import { IEnemyAttr } from './enemy'; import { CommonAuraConverter, EnemyLegacyBridge, @@ -34,16 +32,25 @@ import { MainEnemyFinalEffect, MainMapDamageConverter, MainMapDamageReducer, - registerSpecials + registerSpecials, + MainEnemyComparer, + IEnemyAttr } from './enemy'; -import { HERO_DEFAULT_ATTRIBUTE, TILE_HEIGHT, TILE_WIDTH } from './shared'; +import { + BG2_ZINDEX, + BG_ZINDEX, + EVENT_ZINDEX, + FG2_ZINDEX, + FG_ZINDEX, + HERO_DEFAULT_ATTRIBUTE, + TILE_HEIGHT, + TILE_WIDTH +} from './shared'; import { IHeroAttr } from './hero'; import { ILoadProgressTotal, LoadProgressTotal } from '@motajs/loader'; import { isNil } from 'lodash-es'; import { logger } from '@motajs/common'; -import { ISaveSystem } from './save'; -import { SaveSystem } from './save/system'; -import { MainEnemyComparer } from './enemy/comparer'; +import { ISaveSystem, SaveSystem } from './save'; export class CoreState implements ICoreState { // 全局内容 @@ -52,7 +59,7 @@ export class CoreState implements ICoreState { readonly numberIdMap: Map; // 可存档内容 - readonly layer: ILayerState; + readonly maps: IMapStore; readonly hero: IHeroState; readonly enemyManager: IEnemyManager; readonly flags: IFlagSystem; @@ -74,7 +81,7 @@ export class CoreState implements ICoreState { > = new Map(); constructor() { - this.layer = new LayerState(); + this.maps = new MapStore(); this.roleFace = new RoleFaceBinder(); this.idNumberMap = new Map(); this.numberIdMap = new Map(); @@ -149,9 +156,16 @@ export class CoreState implements ICoreState { // 加载先使用兼容层实现 loading.once('loaded', () => { this.initEnemyManager(enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80); + this.initMapStore( + core.floorIds, + core.floors as Record + ); }); - this.addSaveableContent('flags', this.flags); + this.addSaveableContent('@system/hero', this.hero); + this.addSaveableContent('@system/flags', this.flags); + this.addSaveableContent('@system/maps', this.maps); + this.addSaveableContent('@system/enemy', this.enemyManager); //#endregion } @@ -193,12 +207,86 @@ export class CoreState implements ICoreState { manager.compareWith(reference); } + private initMapStore( + floors: FloorIds[], + data: Record + ) { + const reference = new Map>(); + for (const id of floors) { + const floor = data[id]; + const state = this.maps.createLayerState(id); + const bg = state.addLayer(floor.width, floor.height); + const bg2 = state.addLayer(floor.width, floor.height); + const event = state.addLayer(floor.width, floor.height); + const fg = state.addLayer(floor.width, floor.height); + const fg2 = state.addLayer(floor.width, floor.height); + bg.setZIndex(BG_ZINDEX); + bg2.setZIndex(BG2_ZINDEX); + event.setZIndex(EVENT_ZINDEX); + fg.setZIndex(FG_ZINDEX); + fg2.setZIndex(FG2_ZINDEX); + state.setLayerAlias(bg, 'bg'); + state.setLayerAlias(bg2, 'bg2'); + state.setLayerAlias(event, 'event'); + state.setLayerAlias(fg, 'fg'); + state.setLayerAlias(fg2, 'fg2'); + state.setActiveStatus(false); + + const size = floor.width * floor.height; + const ref = new Map(); + + if (floor.bgmap && floor.bgmap.length > 0) { + const arr = new Uint32Array(floor.bgmap.flat()); + bg.setMapRef(arr); + ref.set(BG_ZINDEX, new Uint32Array(arr)); + } else { + ref.set(BG_ZINDEX, new Uint32Array(size)); + } + + if (floor.bg2map && floor.bg2map.length > 0) { + const arr = new Uint32Array(floor.bg2map.flat()); + bg2.setMapRef(arr); + ref.set(BG2_ZINDEX, new Uint32Array(arr)); + } else { + ref.set(BG2_ZINDEX, new Uint32Array(size)); + } + + if (floor.map && floor.map.length > 0) { + const arr = new Uint32Array(floor.map.flat()); + event.setMapRef(arr); + ref.set(EVENT_ZINDEX, new Uint32Array(arr)); + } else { + ref.set(EVENT_ZINDEX, new Uint32Array(size)); + } + + if (floor.fgmap && floor.fgmap.length > 0) { + const arr = new Uint32Array(floor.fgmap.flat()); + fg.setMapRef(arr); + ref.set(FG_ZINDEX, new Uint32Array(arr)); + } else { + ref.set(FG_ZINDEX, new Uint32Array(size)); + } + + if (floor.fg2map && floor.fg2map.length > 0) { + const arr = new Uint32Array(floor.fg2map.flat()); + fg2.setMapRef(arr); + ref.set(FG2_ZINDEX, new Uint32Array(arr)); + } else { + ref.set(FG2_ZINDEX, new Uint32Array(size)); + } + + reference.set(id, ref); + } + this.maps.compareWith(reference); + } + addSaveableContent(id: string, content: ISaveableContent): void { if (this.saveables.has(id)) { logger.warn(112, id); return; } this.saveables.set(id, content); + this.addedSaveables.add(content); } getSaveableContent(id: string): ISaveableContent | null { @@ -222,17 +310,4 @@ export class CoreState implements ICoreState { this.executors.set(content, executor); } } - - saveState(): IStateSaveData { - return structuredClone({ - followers: this.hero.mover.followers - }); - } - - loadState(data: IStateSaveData): void { - this.hero.mover.removeAllFollowers(); - data.followers.forEach(v => { - this.hero.mover.addFollower(v.num, v.identifier); - }); - } } diff --git a/packages-user/data-state/src/enemy/index.ts b/packages-user/data-state/src/enemy/index.ts index 5998ef6..ae9c5d4 100644 --- a/packages-user/data-state/src/enemy/index.ts +++ b/packages-user/data-state/src/enemy/index.ts @@ -1,5 +1,6 @@ export * from './aura'; export * from './calculator'; +export * from './comparer'; export * from './damage'; export * from './final'; export * from './legacy'; diff --git a/packages-user/data-state/src/index.ts b/packages-user/data-state/src/index.ts index bc01750..2cdc90c 100644 --- a/packages-user/data-state/src/index.ts +++ b/packages-user/data-state/src/index.ts @@ -1,27 +1,9 @@ import { FaceDirection, loading } from '@user/data-base'; import { isNil } from 'lodash-es'; import { ICoreState } from './types'; -import { TILE_HEIGHT, TILE_WIDTH } from './shared'; import { state } from './ins'; function createCoreState(state: ICoreState) { - //#region 地图部分 - - const width = TILE_WIDTH; - const height = TILE_HEIGHT; - const bg = state.layer.addLayer(width, height); - const bg2 = state.layer.addLayer(width, height); - const event = state.layer.addLayer(width, height); - const fg = state.layer.addLayer(width, height); - const fg2 = state.layer.addLayer(width, height); - state.layer.setLayerAlias(bg, 'bg'); - state.layer.setLayerAlias(bg2, 'bg2'); - state.layer.setLayerAlias(event, 'event'); - state.layer.setLayerAlias(fg, 'fg'); - state.layer.setLayerAlias(fg2, 'fg2'); - - //#endregion - //#region 图块部分 const data = Object.entries(core.maps.blocksInfo); diff --git a/packages-user/data-state/src/save/index.ts b/packages-user/data-state/src/save/index.ts index fcb073f..213e667 100644 --- a/packages-user/data-state/src/save/index.ts +++ b/packages-user/data-state/src/save/index.ts @@ -1 +1,2 @@ +export * from './system'; export * from './types'; diff --git a/packages-user/data-state/src/shared.ts b/packages-user/data-state/src/shared.ts index 33d5ebb..0f4b609 100644 --- a/packages-user/data-state/src/shared.ts +++ b/packages-user/data-state/src/shared.ts @@ -1,10 +1,27 @@ import { IHeroAttr } from './hero'; +//#region 地图相关 + /** 每个地图的默认宽度 */ export const TILE_WIDTH = 13; /** 每个地图的默认高度 */ export const TILE_HEIGHT = 13; +// 图层纵深,这些纵深与渲染系统的纵深没有关系,仅在地图图层之间生效 + +/** 背景层纵深 */ +export const BG_ZINDEX = 0; +/** 背景层2纵深 */ +export const BG2_ZINDEX = 10; +/** 事件层纵深 */ +export const EVENT_ZINDEX = 20; +/** 前景层纵深 */ +export const FG_ZINDEX = 30; +/** 前景层2纵深 */ +export const FG2_ZINDEX = 40; + +//#endregion + //#region 勇士相关 /** 默认的勇士图片 */ diff --git a/packages-user/data-state/src/types.ts b/packages-user/data-state/src/types.ts index 318816e..5ef2e96 100644 --- a/packages-user/data-state/src/types.ts +++ b/packages-user/data-state/src/types.ts @@ -30,7 +30,8 @@ export interface ICoreState extends IStateBase { readonly saveSystem: ISaveSystem; /** - * 将某个存档执行器绑定至指定的可存档对象,一个可存档对象只能绑定一个执行器,但一个执行器可以绑定多个可存档对象 + * 将某个存档执行器绑定至指定的可存档对象,一个可存档对象只能绑定一个执行器, + * 但一个执行器可以绑定多个可存档对象,主要用来在读档后进行一些全局性的操作 * @param content 可存档对象或其注册 id * @param executor 可存档对象对应的执行器 */ diff --git a/packages-user/legacy-plugin-data/src/fallback.ts b/packages-user/legacy-plugin-data/src/fallback.ts index 1271d38..4cb8edf 100644 --- a/packages-user/legacy-plugin-data/src/fallback.ts +++ b/packages-user/legacy-plugin-data/src/fallback.ts @@ -324,7 +324,7 @@ export function initFallback() { callback?.(); }; - const layer = state.layer.getLayerByAlias('event')!; + const layer = state.maps.getLayerByAlias('event')!; layer.openDoor(x, y).then(cb); const animate = fallbackIds++; @@ -373,7 +373,7 @@ export function initFallback() { cb(); } else { const num = state.idNumberMap.get(id)!; - const layer = state.layer.getLayerByAlias('event')!; + const layer = state.maps.getLayerByAlias('event')!; layer.closeDoor(num, x, y).then(cb); const animate = fallbackIds++; @@ -514,11 +514,11 @@ export function initFallback() { // 先使用 mainMapRenderer 妥协 const { client } = Mota.require('@user/client-modules'); const renderer = client.mainMapRenderer; - if (renderer.layerState !== state.layer) { + if (renderer.layerState !== state.maps) { callback?.(); return; } - const layer = state.layer.getLayerByAlias('event'); + const layer = state.maps.getLayerByAlias('event'); if (!layer) { callback?.(); return;