diff --git a/packages-user/data-base/src/enemy/manager.ts b/packages-user/data-base/src/enemy/manager.ts index 6908e56..8be7a86 100644 --- a/packages-user/data-base/src/enemy/manager.ts +++ b/packages-user/data-base/src/enemy/manager.ts @@ -1,13 +1,18 @@ import { logger } from '@motajs/common'; import { Enemy as EnemyImpl } from './enemy'; -import { IEnemy, IEnemyManager, SpecialCreation } from './types'; +import { + IEnemy, + IEnemyManager, + IEnemyLegacyBridge, + SpecialCreation +} from './types'; export class EnemyManager implements IEnemyManager { /** 特殊属性注册表,code -> 创建函数 */ private readonly specialRegistry: Map> = new Map(); /** 自定义怪物属性注册表,name -> 默认值 */ - private readonly attributeRegistry: Map = new Map(); + private readonly attributeRegistry: Map = new Map(); /** 怪物模板表,code -> IEnemy */ private readonly prefabByCode: Map> = new Map(); /** 怪物模板表,id -> IEnemy */ @@ -15,11 +20,16 @@ export class EnemyManager implements IEnemyManager { /** 旧样板怪物 id 到 code 的映射,用于 fromLegacyEnemy 快速查找已有模板 */ private readonly legacyIdToCode: Map = new Map(); + constructor(readonly bridge: IEnemyLegacyBridge) {} + registerSpecial(code: number, cons: SpecialCreation): void { this.specialRegistry.set(code, cons); } - registerAttribute(name: string, defaultValue: any): void { + setAttributeDefaults( + name: K, + defaultValue: TAttr[K] + ): void { if ( typeof defaultValue === 'function' || typeof defaultValue === 'symbol' || @@ -50,16 +60,13 @@ export class EnemyManager implements IEnemyManager { * @param enemy 旧样板怪物对象 */ private createAttributes(enemy: Enemy): TAttr { - const attrs: Record = {}; + const attrs: Partial = {}; for (const [name, defaultValue] of this.attributeRegistry) { attrs[name] = structuredClone(defaultValue); } - attrs.hp = enemy.hp; - attrs.atk = enemy.atk; - attrs.def = enemy.def; - attrs.money = enemy.money; - attrs.exp = enemy.exp; - attrs.point = enemy.point; + + Object.assign(attrs, this.bridge.fromLegacyEnemy(enemy, attrs)); + return attrs as TAttr; } diff --git a/packages-user/data-base/src/enemy/types.ts b/packages-user/data-base/src/enemy/types.ts index 95f44eb..b08001b 100644 --- a/packages-user/data-base/src/enemy/types.ts +++ b/packages-user/data-base/src/enemy/types.ts @@ -1,5 +1,7 @@ import { IRange, ITileLocator } from '@motajs/common'; +//#region 怪物基础 + export interface ISpecial { /** 特殊属性代码 */ readonly code: number; @@ -121,8 +123,20 @@ export interface IEnemy extends IReadonlyEnemy { copyFrom(enemy: IReadonlyEnemy): void; } +//#endregion + +//#region 怪物管理器 + export type SpecialCreation = (enemy: IEnemy) => ISpecial; +export interface IEnemyLegacyBridge { + /** + * 从旧样板的怪物对象中获取其属性 + * @param enemy 旧样板怪物对象 + */ + fromLegacyEnemy(enemy: Enemy, defaultValue: Partial): TAttr; +} + export interface IEnemyManager { /** * 注册一个特殊属性 @@ -136,7 +150,10 @@ export interface IEnemyManager { * @param name 属性名称 * @param defaultValue 属性默认值 */ - registerAttribute(name: string, defaultValue: any): void; + setAttributeDefaults( + name: K, + defaultValue: TAttr[K] + ): void; /** * 根据旧样板怪物对象生成一个新的怪物对象 @@ -196,6 +213,8 @@ export interface IEnemyManager { changePrefab(code: number | string, enemy: IEnemy): void; } +//#endregion + //#region 辅助接口 export interface IMapLocHelper { diff --git a/packages-user/data-state/src/core.ts b/packages-user/data-state/src/core.ts index dd9cffa..4e7e306 100644 --- a/packages-user/data-state/src/core.ts +++ b/packages-user/data-state/src/core.ts @@ -13,6 +13,7 @@ import { import { IEnemyAttributes } from './enemy/types'; import { CommonAuraConverter, + EnemyLegacyBridge, GuardAuraConverter, MainEnemyFinalEffect, MainMapDamageConverter, @@ -38,9 +39,18 @@ export class CoreState implements ICoreState { this.idNumberMap = new Map(); this.numberIdMap = new Map(); + //#region 怪物初始化 + // 怪物管理器初始化 - this.enemyManager = new EnemyManager(); - registerSpecials(this.enemyManager); + const enemyManager = new EnemyManager(new EnemyLegacyBridge()); + enemyManager.setAttributeDefaults('hp', 0); + enemyManager.setAttributeDefaults('atk', 0); + enemyManager.setAttributeDefaults('def', 0); + enemyManager.setAttributeDefaults('exp', 0); + enemyManager.setAttributeDefaults('money', 0); + enemyManager.setAttributeDefaults('point', 0); + registerSpecials(enemyManager); + this.enemyManager = enemyManager; // 怪物上下文初始化 const enemyContext = new EnemyContext(); const damageSystem = new DamageSystem(enemyContext); @@ -54,6 +64,8 @@ export class CoreState implements ICoreState { enemyContext.registerFinalEffect(new MainEnemyFinalEffect()); enemyContext.resize(TILE_WIDTH, TILE_HEIGHT); this.enemyContext = enemyContext; + + //#endregion } saveState(): IStateSaveData { diff --git a/packages-user/data-state/src/enemy/index.ts b/packages-user/data-state/src/enemy/index.ts index c325133..a5b8d19 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 './damage'; export * from './final'; +export * from './legacy'; export * from './mapDamage'; export * from './special'; diff --git a/packages-user/data-state/src/enemy/legacy.ts b/packages-user/data-state/src/enemy/legacy.ts new file mode 100644 index 0000000..3c73f3a --- /dev/null +++ b/packages-user/data-state/src/enemy/legacy.ts @@ -0,0 +1,19 @@ +import { IEnemyLegacyBridge } from '@user/data-base'; +import { IEnemyAttributes } from './types'; + +export class EnemyLegacyBridge implements IEnemyLegacyBridge { + fromLegacyEnemy( + enemy: Enemy, + defaultAttr: Partial + ): IEnemyAttributes { + return { + hp: enemy.hp ?? defaultAttr.hp ?? 0, + atk: enemy.atk ?? defaultAttr.atk ?? 0, + def: enemy.def ?? defaultAttr.def ?? 0, + money: enemy.money ?? defaultAttr.money ?? 0, + exp: enemy.exp ?? defaultAttr.exp ?? 0, + point: enemy.point ?? defaultAttr.point ?? 0, + guard: defaultAttr.guard ?? new Set() + }; + } +} diff --git a/packages-user/data-state/src/enemy/special.ts b/packages-user/data-state/src/enemy/special.ts index 3f46fd3..71e3833 100644 --- a/packages-user/data-state/src/enemy/special.ts +++ b/packages-user/data-state/src/enemy/special.ts @@ -51,7 +51,7 @@ export interface IHaloValue { export function registerSpecials( manager: IEnemyManager ): void { - manager.registerAttribute('guard', new Set()); + manager.setAttributeDefaults('guard', new Set()); // 0 - 空 manager.registerSpecial(