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;