From 0da19e16971daa7432277d6d9726a4ac440a9499 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Tue, 12 May 2026 17:11:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=88=98=E6=96=97=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=96=87=E4=BB=B6=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev/enemy/enemy-types-restructure.md | 54 ++ .../src/{enemy => combat}/context.ts | 12 +- .../data-base/src/{enemy => combat}/damage.ts | 6 +- packages-user/data-base/src/combat/enemy.ts | 42 + packages-user/data-base/src/combat/index.ts | 5 + .../src/{enemy => combat}/mapDamage.ts | 6 +- packages-user/data-base/src/combat/types.ts | 688 +++++++++++++++++ packages-user/data-base/src/common/indexer.ts | 61 ++ packages-user/data-base/src/enemy/enemy.ts | 49 +- packages-user/data-base/src/enemy/index.ts | 4 - packages-user/data-base/src/enemy/types.ts | 715 ------------------ packages-user/data-base/src/enemy/utils.ts | 25 - packages-user/data-base/src/index.ts | 1 + 13 files changed, 863 insertions(+), 805 deletions(-) create mode 100644 docs/dev/enemy/enemy-types-restructure.md rename packages-user/data-base/src/{enemy => combat}/context.ts (99%) rename packages-user/data-base/src/{enemy => combat}/damage.ts (99%) create mode 100644 packages-user/data-base/src/combat/enemy.ts create mode 100644 packages-user/data-base/src/combat/index.ts rename packages-user/data-base/src/{enemy => combat}/mapDamage.ts (99%) create mode 100644 packages-user/data-base/src/combat/types.ts create mode 100644 packages-user/data-base/src/common/indexer.ts delete mode 100644 packages-user/data-base/src/enemy/utils.ts diff --git a/docs/dev/enemy/enemy-types-restructure.md b/docs/dev/enemy/enemy-types-restructure.md new file mode 100644 index 0000000..e84256c --- /dev/null +++ b/docs/dev/enemy/enemy-types-restructure.md @@ -0,0 +1,54 @@ +# 怪物系统文件结构重构 + +**目的:** 使 `IEnemyHandler` 能持有 `IStateBase` 引用而不产生循环引用。 + +**循环根源:** `enemy/types.ts` 混写了两层接口,`data-base/src/types.ts` 经由 `./enemy` index 引入 `IEnemyManager`,导致无法反向引用。 + +## 接口归属 + +**`enemy/types.ts`(Layer 1 — 存档/管理层,保留)** + +只保留以下接口,其余全部迁出: + +- `IEnemySaveState`、`IEnemyManagerSaveState`、`IEnemyComparer` +- `ISpecial`、`IReadonlyEnemy`、`IEnemy` +- `SpecialCreation`、`IEnemyLegacyBridge`、`IEnemyManager` + +只允许引用 `@motajs/common`、`../common`,不得引用 `../types`。 + +**`enemy/utils.ts`(Layer 0 — 工具层,与实现类并列)** + +从 `enemy/types.ts` 迁出以下接口(实现类 `MapLocIndexer` 已在此文件): + +- `IMapLocHelper`、`IMapLocIndexer` + +**`combat/types.ts`(Layer 2 — 战斗/上下文层,现为空文件)** + +从 `enemy/types.ts` 迁入以下接口: + +- `IEnemyHandler`、`IReadonlyEnemyHandler`、`IEnemyView` +- `IEnemySpecialModifier`、`IAuraView`、`IEnemyAuraView`、`IAuraConverter` +- `IEnemySpecialQueryModifier`、`IEnemySpecialQueryEffect`、`IEnemyCommonQueryEffect`、`IEnemyFinalEffect` +- `IMapDamageInfoExtra`、`IMapDamageInfo`、`IMapDamageView`、`IMapDamageConverter`、`IMapDamageReducer`、`IMapDamage` +- `IEnemyDamageInfo`、`IEnemyCritical`、`CriticalableHeroStatus`、`IDamageCalculator`、`IDamageContext`、`IDamageSystem` +- `IEnemyContext` + +需引用 `../enemy/types`(Layer 1)、`../enemy/utils`(Layer 0)、`../types`(`IStateBase`,现在无循环)。在 `IEnemyHandler` 和 `IReadonlyEnemyHandler` 中新增 `readonly state: IStateBase`。 + +## 文件修改清单 + +| 文件 | 操作 | +| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| `combat/types.ts` | 迁入所有 Layer 2 接口;新增三条 import(`../enemy/types`、`../enemy/utils`、`../types`);`IEnemyHandler` 系列加 `state` 字段 | +| `combat/context.ts` | 从 `enemy/context.ts` **移动**;import 路径改为从 `./types`、`../enemy/types`、`../enemy/utils` 引入 | +| `combat/damage.ts` | 从 `enemy/damage.ts` **移动**;import 路径同上 | +| `combat/mapDamage.ts` | 从 `enemy/mapDamage.ts` **移动**;import 路径同上 | +| `combat/index.ts` | 新建,`export * from './types/context/damage/mapDamage'` | +| `enemy/types.ts` | 删除所有 Layer 2 接口(迁出后仅剩 Layer 1 内容) | +| `enemy/utils.ts` | 新增 `IMapLocHelper`、`IMapLocIndexer` 接口定义 | +| `enemy/index.ts` | 删除对 `context`、`damage`、`mapDamage` 的导出 | +| `data-base/src/index.ts` | 新增 `export * from './combat'` | +| `data-base/src/types.ts` | `import { IEnemyManager }` 改从 `./enemy/types` 直接引入(`enemy/types.ts` 不再引用 `../types`,无循环) | +| `enemy/enemy.ts` | import 路径无需改动(`IEnemy` 等仍在 `./types`) | +| `enemy/manager.ts` | import 路径无需改动(全部 Layer 1 接口仍在 `./types`) | +| `enemy/special.ts` | import 路径无需改动 | diff --git a/packages-user/data-base/src/enemy/context.ts b/packages-user/data-base/src/combat/context.ts similarity index 99% rename from packages-user/data-base/src/enemy/context.ts rename to packages-user/data-base/src/combat/context.ts index a5206a1..165a7b9 100644 --- a/packages-user/data-base/src/enemy/context.ts +++ b/packages-user/data-base/src/combat/context.ts @@ -3,7 +3,6 @@ import { IAuraConverter, IAuraView, IDamageSystem, - IEnemy, IEnemyAuraView, IEnemyCommonQueryEffect, IEnemyContext, @@ -13,13 +12,12 @@ import { IEnemySpecialQueryEffect, IEnemyView, IMapDamage, - IReadonlyEnemy, - IReadonlyEnemyHandler, - ISpecial + IReadonlyEnemyHandler } from './types'; -import { EnemyView } from './enemy'; -import { MapLocIndexer } from './utils'; import { IReadonlyHeroAttribute } from '../hero'; +import { IEnemy, IReadonlyEnemy, ISpecial } from '../enemy'; +import { EnemyView } from './enemy'; +import { ILocationIndexer, MapLocIndexer } from '../common/indexer'; export class EnemyContext implements IEnemyContext { /** 坐标索引 -> 怪物视图 */ @@ -82,7 +80,7 @@ export class EnemyContext implements IEnemyContext { private damageSystem: IDamageSystem | null = null; /** 索引工具 */ - readonly indexer: MapLocIndexer = new MapLocIndexer(); + readonly indexer: ILocationIndexer = new MapLocIndexer(); /** 当前是否需要全量刷新 */ private needUpdate: boolean = true; diff --git a/packages-user/data-base/src/enemy/damage.ts b/packages-user/data-base/src/combat/damage.ts similarity index 99% rename from packages-user/data-base/src/enemy/damage.ts rename to packages-user/data-base/src/combat/damage.ts index 72c667c..10842af 100644 --- a/packages-user/data-base/src/enemy/damage.ts +++ b/packages-user/data-base/src/combat/damage.ts @@ -1,3 +1,4 @@ +import { clamp } from 'lodash-es'; import { ITileLocator, logger } from '@motajs/common'; import { CriticalableHeroStatus, @@ -8,11 +9,10 @@ import { IEnemyCritical, IEnemyDamageInfo, IReadonlyEnemyHandler, - IEnemyView, - IReadonlyEnemy + IEnemyView } from './types'; import { IHeroAttribute, IReadonlyHeroAttribute } from '../hero'; -import { clamp } from 'lodash-es'; +import { IReadonlyEnemy } from '../enemy'; interface ICriticalSearchResult { /** 此临界点的属性值 */ diff --git a/packages-user/data-base/src/combat/enemy.ts b/packages-user/data-base/src/combat/enemy.ts new file mode 100644 index 0000000..94a8a60 --- /dev/null +++ b/packages-user/data-base/src/combat/enemy.ts @@ -0,0 +1,42 @@ +import { IEnemy, IReadonlyEnemy } from '../enemy'; +import { IEnemyView, IEnemyContext } from './types'; + +export class EnemyView implements IEnemyView { + /** 计算后怪物 */ + private readonly computedEnemy: IEnemy; + + constructor( + readonly baseEnemy: IEnemy, + readonly context: IEnemyContext + ) { + this.computedEnemy = baseEnemy.clone(); + } + + reset(): void { + this.computedEnemy.copyFrom(this.baseEnemy); + } + + getBaseEnemy(): IReadonlyEnemy { + return this.baseEnemy; + } + + getComputedEnemy(): IReadonlyEnemy { + this.context.requestRefresh(this); + return this.computedEnemy; + } + + /** + * 获取计算中怪物对象,这个接口不对外暴露,仅在系统内部的 EnemyContext 中使用。 + */ + getComputingEnemy(): IEnemy { + return this.computedEnemy; + } + + getModifiableEnemy(): IEnemy { + return this.baseEnemy; + } + + markDirty(): void { + this.context.markDirty(this); + } +} diff --git a/packages-user/data-base/src/combat/index.ts b/packages-user/data-base/src/combat/index.ts new file mode 100644 index 0000000..a893526 --- /dev/null +++ b/packages-user/data-base/src/combat/index.ts @@ -0,0 +1,5 @@ +export * from './context'; +export * from './damage'; +export * from './enemy'; +export * from './mapDamage'; +export * from './types'; diff --git a/packages-user/data-base/src/enemy/mapDamage.ts b/packages-user/data-base/src/combat/mapDamage.ts similarity index 99% rename from packages-user/data-base/src/enemy/mapDamage.ts rename to packages-user/data-base/src/combat/mapDamage.ts index be665c4..5d3d576 100644 --- a/packages-user/data-base/src/enemy/mapDamage.ts +++ b/packages-user/data-base/src/combat/mapDamage.ts @@ -7,9 +7,9 @@ import { IMapDamageConverter, IMapDamageInfo, IMapDamageReducer, - IMapDamageView, - IMapLocIndexer + IMapDamageView } from './types'; +import { ILocationHelper } from '../common/indexer'; interface IPointInfo { /** 该点所有的地图伤害 */ @@ -61,7 +61,7 @@ export class MapDamage implements IMapDamage { private readonly reducedCache: Map = new Map(); /** 坐标索引对象 */ - private readonly indexer: IMapLocIndexer; + private readonly indexer: ILocationHelper; constructor(readonly context: IEnemyContext) { this.indexer = context.indexer; diff --git a/packages-user/data-base/src/combat/types.ts b/packages-user/data-base/src/combat/types.ts new file mode 100644 index 0000000..b3ae7f5 --- /dev/null +++ b/packages-user/data-base/src/combat/types.ts @@ -0,0 +1,688 @@ +import { ITileLocator, IRange } from '@motajs/common'; +import { IEnemy, IReadonlyEnemy, ISpecial } from '../enemy'; +import { IReadonlyHeroAttribute, IHeroAttribute } from '../hero'; +import { ILocationHelper } from '../common/indexer'; + +//#region 辅助接口 + +export interface IEnemyHandler { + /** 怪物属性信息 */ + readonly enemy: IEnemy; + /** 怪物定位符 */ + readonly locator: ITileLocator; + /** 勇士属性信息 */ + readonly hero: IReadonlyHeroAttribute; +} + +export interface IReadonlyEnemyHandler { + /** 怪物属性信息 */ + readonly enemy: IReadonlyEnemy; + /** 怪物定位符 */ + readonly locator: ITileLocator; + /** 勇士属性信息 */ + readonly hero: IReadonlyHeroAttribute; +} + +//#endregion + +//#region 怪物对象 + +export interface IEnemyView { + /** 怪物视图所属的上下文 */ + readonly context: IEnemyContext; + + /** + * 重置此怪物视图的状态,将计算后怪物对象恢复至初始状态 + */ + reset(): void; + + /** + * 获取基本怪物对象 + */ + getBaseEnemy(): IReadonlyEnemy; + + /** + * 获取计算后的怪物对象,返回的怪物对象同引用 + */ + getComputedEnemy(): IReadonlyEnemy; + + /** + * 获取可修改的怪物对象。如果修改此方法获取的怪物对象,那么怪物的真实信息是不会刷新的, + * 需要手动调用 markDirty 方法来刷新。 + */ + getModifiableEnemy(): IEnemy; + + /** + * 将此怪物标记为脏,需要更新 + */ + markDirty(): void; +} + +//#endregion + +//#region 光环与查询 + +export interface IEnemySpecialModifier { + /** + * 获取要添加到指定怪物身上的特殊属性 + * @param handler 信息对象 + */ + add(handler: IReadonlyEnemyHandler): ISpecial[]; + + /** + * 获取制定怪物身上要删除的特殊属性 + * @param handler 信息对象 + */ + delete(handler: IReadonlyEnemyHandler): ISpecial[]; + + /** + * 修改一个怪物的特殊属性,如果真正进行了修改则返回 true,否则返回 false + * @param handler 信息对象 + * @param special 要修改的怪物特殊属性 + */ + modify( + handler: IEnemyHandler, + special: ISpecial + ): boolean; +} + +export interface IAuraView { + /** 此光环视图的优先级 */ + readonly priority: number; + /** 此光环视图的影响范围 */ + readonly range: IRange; + + /** 这个光环视图是否有可能修改怪物的基本属性 */ + readonly couldApplyBase: boolean; + /** 这个光环视图是否有可能修改怪物的特殊属性 */ + readonly couldApplySpecial: boolean; + + /** + * 获取范围扫描参数 + */ + getRangeParam(): T; + + /** + * 对指定怪物对象施加修饰器 + * @param handler 信息对象 + * @param baseEnemy 原始怪物对象,即未进行任何修改的怪物对象 + */ + apply( + handler: IEnemyHandler, + baseEnemy: IReadonlyEnemy + ): void; + + /** + * 对指定怪物对象添加特殊属性修饰器 + * @param handler 信息对象 + * @param baseEnemy 原始怪物对象,即未进行任何修改的怪物对象 + */ + applySpecial( + handler: IEnemyHandler, + baseEnemy: IReadonlyEnemy + ): IEnemySpecialModifier | null; +} + +export interface IEnemyAuraView extends IAuraView { + /** 此光环视图所属的怪物 */ + readonly enemy: IReadonlyEnemy; + /** 此光环视图所属的特殊属性 */ + readonly special: ISpecial; + /** 此光环视图所属怪物的定位符 */ + readonly locator: ITileLocator; +} + +export interface IAuraConverter { + /** + * 判断一个特殊属性是否应该被当前光环转换器执行转换 + * @param special 要转换的特殊属性 + * @param handler 信息对象 + */ + shouldConvert( + special: ISpecial, + handler: IReadonlyEnemyHandler + ): boolean; + + /** + * 将一个特殊属性转换为光环视图 + */ + convert( + special: ISpecial, + handler: IReadonlyEnemyHandler, + context: IEnemyContext + ): IEnemyAuraView; +} + +export interface IEnemySpecialQueryModifier< + TAttr, + THero +> extends IEnemySpecialModifier { + /** + * 判断一个怪物是否应该查询外部状态 + */ + shouldQuery(handler: IReadonlyEnemyHandler): boolean; +} + +export interface IEnemySpecialQueryEffect { + /** 效果优先级,与光环属性共用 */ + readonly priority: number; + + /** + * 根据传入的怪物上下文,获取对应的怪物特殊属性修饰器 + */ + for( + ctx: IEnemyContext + ): IEnemySpecialQueryModifier; +} + +export interface IEnemyCommonQueryEffect { + /** 优先级,越高的越先执行 */ + readonly priority: number; + + /** + * 对怪物的某个特殊属性施加常规查询效果 + */ + apply( + handler: IEnemyHandler, + special: ISpecial, + query: () => IEnemyContext + ): void; +} + +export interface IEnemyFinalEffect { + /** 效果优先级,越高会越先被执行 */ + readonly priority: number; + + /** + * 向怪物施加最终修饰效果 + */ + apply(handler: IEnemyHandler): void; +} + +//#endregion + +//#region 地图伤害 + +export interface IMapDamageInfoExtra { + /** 捕捉怪物信息 */ + catch: Set; + /** 阻击怪物信息 */ + repulse: Set; +} + +export interface IMapDamageInfo { + /** 伤害值 */ + damage: number; + /** 伤害类型 */ + type: number; + /** 地图伤害额外信息 */ + extra: IMapDamageInfoExtra; +} + +export interface IMapDamageView { + /** + * 获取地图伤害影响范围 + */ + getRange(): IRange; + + /** + * 获取范围参数 + */ + getRangeParam(): T; + + /** + * 获取指定位置的地图伤害,会对坐标进行判断 + * @param locator 伤害位置 + */ + getDamageAt(locator: ITileLocator): Readonly | null; + + /** + * 获取指定位置的地图伤害,会对坐标进行判断 + * @param locator 伤害位置 + */ + getDamageWithoutCheck( + locator: ITileLocator + ): Readonly | null; +} + +export interface IMapDamageConverter { + /** + * 转换地图伤害视图 + */ + convert( + handler: IReadonlyEnemyHandler, + context: IEnemyContext + ): IMapDamageView[]; +} + +export interface IMapDamageReducer { + /** + * 对伤害信息进行合并 + */ + reduce( + info: Iterable>, + locator: ITileLocator + ): Readonly; +} + +export interface IMapDamage { + /** 当前绑定的怪物上下文 */ + readonly context: IEnemyContext; + + /** + * 设置地图伤害转换器,并基于当前上下文重建所有地图伤害视图 + * @param converter 地图伤害转换器 + */ + useConverter(converter: IMapDamageConverter): void; + + /** + * 设置地图伤害合并器 + * @param reducer 地图伤害合并器 + */ + useReducer(reducer: IMapDamageReducer): void; + + /** + * 在指定位置添加一条无来源地图伤害 + * @param locator 地图定位符 + * @param info 地图伤害信息 + */ + addMapDamage(locator: ITileLocator, info: IMapDamageInfo): void; + + /** + * 在指定位置删除一条无来源地图伤害 + * @param locator 地图定位符 + * @param info 地图伤害信息 + */ + deleteMapDamage(locator: ITileLocator, info: IMapDamageInfo): void; + + /** + * 将指定位置标记为脏,后续访问时会重新计算该点的有来源伤害 + * @param locator 地图定位符 + */ + markDirty(locator: ITileLocator): void; + + /** + * 将指定怪物对应的地图伤害标记为脏并刷新 + * @param view 怪物视图 + */ + markEnemyDirty(view: IEnemyView): void; + + /** + * 基于当前上下文重新刷新全部有来源地图伤害 + */ + refreshAll(): void; + + /** + * 删除指定怪物带来的全部地图伤害来源 + * @param view 怪物视图 + */ + deleteEnemy(view: IEnemyView): void; + + /** + * 获取指定位置合并后的地图伤害 + * @param locator 地图定位符 + */ + getReducedDamage(locator: ITileLocator): Readonly | null; + + /** + * 获取指定位置未合并的地图伤害列表 + * @param locator 地图定位符 + */ + getSeparatedDamage( + locator: ITileLocator + ): Iterable>; +} + +//#endregion + +//#region 伤害系统 + +export interface IEnemyDamageInfo { + /** 战斗伤害值 */ + readonly damage: number; + /** 战斗回合数 */ + readonly turn: number; +} + +export interface IEnemyCritical { + /** 此临界点中指定勇士属性的值 */ + readonly nextValue: number; + /** 当前勇士指定属性的值 */ + readonly baseValue: number; + /** 此临界点中指定勇士数值的值与当前值的差,即 `nextValue - baseValue` */ + readonly nextDiff: number; + /** 当前状态下怪物的伤害信息 */ + readonly baseInfo: IEnemyDamageInfo; + /** 此临界点下怪物的伤害信息 */ + readonly info: IEnemyDamageInfo; + /** 此临界点的伤害值与当前伤害值的差 */ + readonly damageDiff: number; +} + +export type CriticalableHeroStatus = keyof { + [P in keyof THero as THero[P] extends number ? P : never]: number; +}; + +export interface IDamageCalculator { + /** + * 计算战斗伤害信息 + * @param handler 信息对象 + */ + calculate(handler: IReadonlyEnemyHandler): IEnemyDamageInfo; + + /** + * 获取临界计算的上界 + * @param handler 信息对象 + * @param attribute 勇士的临界属性 + */ + getCriticalLimit( + handler: IReadonlyEnemyHandler, + attribute: CriticalableHeroStatus + ): number; +} + +export interface IDamageContext { + /** + * 获取战斗伤害信息 + * @param enemy 怪物视图 + */ + getDamageInfo(enemy: IEnemyView): IEnemyDamageInfo | null; + + /** + * 根据怪物对象获取战斗伤害信息 + * @param enemy 怪物对象 + */ + getDamageInfoByComputed( + enemy: IReadonlyEnemy + ): IEnemyDamageInfo | null; + + /** + * 计算怪物在指定勇士属性下的临界 + * @param enemy 怪物视图 + * @param attribute 计算临界的目标勇士属性,比如计算攻击临界、自定义属性的临界等等 + * @param precision 临界计算精度,表示会进行多少次二分计算,一般填写 `12-16` 之间的数即可,默认是 12 + */ + calculateCritical( + enemy: IEnemyView, + attribute: CriticalableHeroStatus, + precision?: number + ): Generator; +} + +export interface IDamageSystem extends IDamageContext< + TAttr, + THero +> { + /** 伤害系统所属的上下文 */ + readonly context: IEnemyContext; + + /** + * 设置当前伤害计算系统使用的伤害计算器 + * @param calculator 伤害计算器 + */ + useCalculator(calculator: IDamageCalculator): void; + + /** + * 获取当前使用的伤害计算器 + */ + getCalculator(): IDamageCalculator | null; + + /** + * 绑定勇士信息 + * @param hero 勇士信息 + */ + bindHeroStatus(hero: IReadonlyHeroAttribute | null): void; + + /** + * 将指定的怪物标记为脏 + * @param enemy 怪物视图 + */ + markDirty(enemy: IEnemyView): void; + + /** + * 删除指定的怪物 + * @param enemy 怪物视图 + */ + deleteEnemy(enemy: IEnemyView): void; + + /** + * 将所有怪物标记为脏 + */ + markAllDirty(): void; + + /** + * 修改勇士属性,然后返回修改后勇士属性所组成的计算对象,不影响当前伤害系统的状态 + * @param modify 勇士修改函数 + */ + with(hero: IHeroAttribute): IDamageContext; +} + +//#endregion + +//#region 上下文 + +export interface IEnemyContext { + /** 怪物上下文宽度 */ + readonly width: number; + /** 怪物上下文高度 */ + readonly height: number; + /** 此上下文使用的索引对象 */ + readonly indexer: ILocationHelper; + + /** + * 调整上下文尺寸,并清空当前上下文中的所有怪物与状态 + * @param width 地图宽度 + * @param height 地图高度 + */ + resize(width: number, height: number): void; + + /** + * 注册一个光环转换器 + * @param converter 光环转换器 + */ + registerAuraConverter(converter: IAuraConverter): void; + + /** + * 注销一个光环转换器 + * @param converter 光环转换器 + */ + unregisterAuraConverter(converter: IAuraConverter): void; + + /** + * 设置光环转换器的启用状态 + * @param converter 光环转换器 + * @param enabled 是否启用 + */ + setAuraConverterEnabled( + converter: IAuraConverter, + enabled: boolean + ): void; + + /** + * 注册一个特殊属性查询效果 + * @param effect 特殊属性查询效果 + */ + registerSpecialQueryEffect( + effect: IEnemySpecialQueryEffect + ): void; + + /** + * 注销一个特殊属性查询效果 + * @param effect 特殊属性查询效果 + */ + unregisterSpecialQueryEffect( + effect: IEnemySpecialQueryEffect + ): void; + + /** + * 为指定特殊属性代码注册常规查询效果 + * @param code 特殊属性代码 + * @param effect 常规查询效果 + */ + registerCommonQueryEffect( + code: number, + effect: IEnemyCommonQueryEffect + ): void; + + /** + * 注销指定特殊属性代码上的常规查询效果 + * @param code 特殊属性代码 + * @param effect 常规查询效果 + */ + unregisterCommonQueryEffect( + code: number, + effect: IEnemyCommonQueryEffect + ): void; + + /** + * 注册一个最终效果 + * @param effect 最终效果 + */ + registerFinalEffect(effect: IEnemyFinalEffect): void; + + /** + * 注销一个最终效果 + * @param effect 最终效果 + */ + unregisterFinalEffect(effect: IEnemyFinalEffect): void; + + /** + * 绑定勇士对象 + * @param hero 勇士属性对象 + */ + bindHero(hero: IReadonlyHeroAttribute | null): void; + + /** + * 获取当前绑定的勇士属性对象 + */ + getBindedHero(): IReadonlyHeroAttribute | null; + + /** + * 获取指定怪物对象当前所在位置 + * @param enemy 怪物对象 + */ + getEnemyLocator(enemy: IEnemy): Readonly | null; + + /** + * 获取指定怪物视图当前所在位置 + * @param view 怪物视图 + */ + getEnemyLocatorByView( + view: IEnemyView + ): Readonly | null; + + /** + * 根据定位符获取怪物视图 + * @param locator 地图定位符 + */ + getEnemyByLocator(locator: ITileLocator): IEnemyView | null; + + /** + * 根据坐标获取怪物视图 + * @param x 横坐标 + * @param y 纵坐标 + */ + getEnemyByLoc(x: number, y: number): IEnemyView | null; + + /** + * 根据计算后怪物对象反查怪物视图 + * @param enemy 计算后怪物对象 + */ + getViewByComputed(enemy: IReadonlyEnemy): IEnemyView | null; + + /** + * 在指定位置放置一个怪物对象 + * @param locator 地图定位符 + * @param enemy 怪物对象 + */ + setEnemyAt(locator: ITileLocator, enemy: IEnemy): void; + + /** + * 删除指定位置的怪物 + * @param locator 地图定位符 + */ + deleteEnemy(locator: ITileLocator): void; + + /** + * 扫描指定范围内的怪物视图 + * @param range 范围对象 + * @param param 范围参数 + */ + scanRange( + range: IRange, + param: T + ): Iterable<[ITileLocator, IEnemyView]>; + + /** + * 迭代上下文中的全部怪物 + */ + iterateEnemy(): Iterable<[ITileLocator, IEnemyView]>; + + /** + * 添加一个全局光环视图 + * @param aura 光环视图 + */ + addAura(aura: IAuraView): void; + + /** + * 删除一个全局光环视图 + * @param aura 光环视图 + */ + deleteAura(aura: IAuraView): void; + + /** + * 绑定地图伤害管理器 + * @param damage 地图伤害管理器 + */ + attachMapDamage(damage: IMapDamage | null): void; + + /** + * 获取当前绑定的地图伤害管理器 + */ + getMapDamage(): IMapDamage | null; + + /** + * 绑定伤害计算系统 + * @param system 伤害系统 + */ + attachDamageSystem(system: IDamageSystem | null): void; + + /** + * 获取当前绑定的伤害计算系统 + */ + getDamageSystem(): IDamageSystem | null; + + /** + * 重建当前上下文中的全部怪物计算结果 + * + * 1. 对所有光环及特殊查询进行构建操作,这一步中会决定每个怪物所拥有的特殊属性,后续不会变动 + * 2. 执行所有的普通光环效果,修改怪物的基础属性 + * 3. 执行常规查询效果,允许查询上下文状态并修改怪物自身的基础属性 + * 4. 执行最终效果,不允许查询上下文状态,仅允许修改怪物自身的基础属性 + */ + buildup(): void; + + /** + * 将指定怪物视图标记为脏 + * @param view 怪物视图 + */ + markDirty(view: IEnemyView): void; + + /** + * 申请刷新指定怪物视图 + * @param view 怪物视图 + */ + requestRefresh(view: IEnemyView): void; + + /** + * 清空当前上下文中的所有对象与运行状态 + */ + clear(): void; + + /** + * 销毁当前上下文 + */ + destroy(): void; +} + +//#endregion diff --git a/packages-user/data-base/src/common/indexer.ts b/packages-user/data-base/src/common/indexer.ts new file mode 100644 index 0000000..c5532f3 --- /dev/null +++ b/packages-user/data-base/src/common/indexer.ts @@ -0,0 +1,61 @@ +import { ITileLocator } from '@motajs/common'; + +//#region 接口定义 + +export interface ILocationHelper { + /** + * 坐标 -> 索引 + * @param x 横坐标 + * @param y 纵坐标 + */ + locToIndex(x: number, y: number): number; + + /** + * 定位符 -> 索引 + * @param locator 定位符 + */ + locaterToIndex(locator: ITileLocator): number; + + /** + * 索引 -> 定位符 + * @param index 索引 + */ + indexToLocator(index: number): ITileLocator; +} + +export interface ILocationIndexer extends ILocationHelper { + /** + * 设置地图宽度 + * @param width 地图宽度 + */ + setWidth(width: number): void; +} + +//#endregion + +//#region 默认实现 + +export class MapLocIndexer implements ILocationIndexer { + private width: number = 0; + + setWidth(width: number): void { + this.width = width; + } + + locToIndex(x: number, y: number): number { + return y * this.width + x; + } + + locaterToIndex(locator: ITileLocator): number { + return locator.y * this.width + locator.x; + } + + indexToLocator(index: number): ITileLocator { + return { + x: index % this.width, + y: Math.floor(index / this.width) + }; + } +} + +//#endregion diff --git a/packages-user/data-base/src/enemy/enemy.ts b/packages-user/data-base/src/enemy/enemy.ts index 189e2f1..36a0fd0 100644 --- a/packages-user/data-base/src/enemy/enemy.ts +++ b/packages-user/data-base/src/enemy/enemy.ts @@ -1,12 +1,5 @@ import { logger } from '@motajs/common'; -import { - IEnemy, - IEnemyContext, - IEnemySaveState, - IReadonlyEnemy, - ISpecial, - IEnemyView -} from './types'; +import { IEnemy, IEnemySaveState, IReadonlyEnemy, ISpecial } from './types'; import { SaveCompression } from '../common/types'; export class Enemy implements IEnemy { @@ -113,43 +106,3 @@ export class Enemy implements IEnemy { } } } - -export class EnemyView implements IEnemyView { - /** 计算后怪物 */ - private readonly computedEnemy: IEnemy; - - constructor( - readonly baseEnemy: IEnemy, - readonly context: IEnemyContext - ) { - this.computedEnemy = baseEnemy.clone(); - } - - reset(): void { - this.computedEnemy.copyFrom(this.baseEnemy); - } - - getBaseEnemy(): IReadonlyEnemy { - return this.baseEnemy; - } - - getComputedEnemy(): IReadonlyEnemy { - this.context.requestRefresh(this); - return this.computedEnemy; - } - - /** - * 获取计算中怪物对象,这个接口不对外暴露,仅在系统内部的 EnemyContext 中使用。 - */ - getComputingEnemy(): IEnemy { - return this.computedEnemy; - } - - getModifiableEnemy(): IEnemy { - return this.baseEnemy; - } - - markDirty(): void { - this.context.markDirty(this); - } -} diff --git a/packages-user/data-base/src/enemy/index.ts b/packages-user/data-base/src/enemy/index.ts index cc09d68..ba2afa4 100644 --- a/packages-user/data-base/src/enemy/index.ts +++ b/packages-user/data-base/src/enemy/index.ts @@ -1,8 +1,4 @@ export * from './enemy'; -export * from './context'; -export * from './damage'; -export * from './mapDamage'; export * from './manager'; export * from './special'; export * from './types'; -export * from './utils'; diff --git a/packages-user/data-base/src/enemy/types.ts b/packages-user/data-base/src/enemy/types.ts index 849a7a2..94251ad 100644 --- a/packages-user/data-base/src/enemy/types.ts +++ b/packages-user/data-base/src/enemy/types.ts @@ -1,5 +1,3 @@ -import { IRange, ITileLocator } from '@motajs/common'; -import { IHeroAttribute, IReadonlyHeroAttribute } from '../hero'; import { ISaveableContent } from '../common/types'; //#region 怪物基础 @@ -288,716 +286,3 @@ export interface IEnemyManager extends ISaveableContent< } //#endregion - -//#region 辅助接口 - -export interface IMapLocHelper { - /** - * 坐标 -> 索引 - * @param x 横坐标 - * @param y 纵坐标 - */ - locToIndex(x: number, y: number): number; - - /** - * 定位符 -> 索引 - * @param locator 定位符 - */ - locaterToIndex(locator: ITileLocator): number; - - /** - * 索引 -> 定位符 - * @param index 索引 - */ - indexToLocator(index: number): ITileLocator; -} - -export interface IMapLocIndexer extends IMapLocHelper { - /** - * 设置地图宽度 - * @param width 地图宽度 - */ - setWidth(width: number): void; -} - -export interface IEnemyHandler { - /** 怪物属性信息 */ - readonly enemy: IEnemy; - /** 怪物定位符 */ - readonly locator: ITileLocator; - /** 勇士属性信息 */ - readonly hero: IReadonlyHeroAttribute; -} - -export interface IReadonlyEnemyHandler { - /** 怪物属性信息 */ - readonly enemy: IReadonlyEnemy; - /** 怪物定位符 */ - readonly locator: ITileLocator; - /** 勇士属性信息 */ - readonly hero: IReadonlyHeroAttribute; -} - -//#endregion - -//#region 怪物对象 - -export interface IEnemyView { - /** 怪物视图所属的上下文 */ - readonly context: IEnemyContext; - - /** - * 重置此怪物视图的状态,将计算后怪物对象恢复至初始状态 - */ - reset(): void; - - /** - * 获取基本怪物对象 - */ - getBaseEnemy(): IReadonlyEnemy; - - /** - * 获取计算后的怪物对象,返回的怪物对象同引用 - */ - getComputedEnemy(): IReadonlyEnemy; - - /** - * 获取可修改的怪物对象。如果修改此方法获取的怪物对象,那么怪物的真实信息是不会刷新的, - * 需要手动调用 markDirty 方法来刷新。 - */ - getModifiableEnemy(): IEnemy; - - /** - * 将此怪物标记为脏,需要更新 - */ - markDirty(): void; -} - -//#endregion - -//#region 光环与查询 - -export interface IEnemySpecialModifier { - /** - * 获取要添加到指定怪物身上的特殊属性 - * @param handler 信息对象 - */ - add(handler: IReadonlyEnemyHandler): ISpecial[]; - - /** - * 获取制定怪物身上要删除的特殊属性 - * @param handler 信息对象 - */ - delete(handler: IReadonlyEnemyHandler): ISpecial[]; - - /** - * 修改一个怪物的特殊属性,如果真正进行了修改则返回 true,否则返回 false - * @param handler 信息对象 - * @param special 要修改的怪物特殊属性 - */ - modify( - handler: IEnemyHandler, - special: ISpecial - ): boolean; -} - -export interface IAuraView { - /** 此光环视图的优先级 */ - readonly priority: number; - /** 此光环视图的影响范围 */ - readonly range: IRange; - - /** 这个光环视图是否有可能修改怪物的基本属性 */ - readonly couldApplyBase: boolean; - /** 这个光环视图是否有可能修改怪物的特殊属性 */ - readonly couldApplySpecial: boolean; - - /** - * 获取范围扫描参数 - */ - getRangeParam(): T; - - /** - * 对指定怪物对象施加修饰器 - * @param handler 信息对象 - * @param baseEnemy 原始怪物对象,即未进行任何修改的怪物对象 - */ - apply( - handler: IEnemyHandler, - baseEnemy: IReadonlyEnemy - ): void; - - /** - * 对指定怪物对象添加特殊属性修饰器 - * @param handler 信息对象 - * @param baseEnemy 原始怪物对象,即未进行任何修改的怪物对象 - */ - applySpecial( - handler: IEnemyHandler, - baseEnemy: IReadonlyEnemy - ): IEnemySpecialModifier | null; -} - -export interface IEnemyAuraView extends IAuraView { - /** 此光环视图所属的怪物 */ - readonly enemy: IReadonlyEnemy; - /** 此光环视图所属的特殊属性 */ - readonly special: ISpecial; - /** 此光环视图所属怪物的定位符 */ - readonly locator: ITileLocator; -} - -export interface IAuraConverter { - /** - * 判断一个特殊属性是否应该被当前光环转换器执行转换 - * @param special 要转换的特殊属性 - * @param handler 信息对象 - */ - shouldConvert( - special: ISpecial, - handler: IReadonlyEnemyHandler - ): boolean; - - /** - * 将一个特殊属性转换为光环视图 - */ - convert( - special: ISpecial, - handler: IReadonlyEnemyHandler, - context: IEnemyContext - ): IEnemyAuraView; -} - -export interface IEnemySpecialQueryModifier< - TAttr, - THero -> extends IEnemySpecialModifier { - /** - * 判断一个怪物是否应该查询外部状态 - */ - shouldQuery(handler: IReadonlyEnemyHandler): boolean; -} - -export interface IEnemySpecialQueryEffect { - /** 效果优先级,与光环属性共用 */ - readonly priority: number; - - /** - * 根据传入的怪物上下文,获取对应的怪物特殊属性修饰器 - */ - for( - ctx: IEnemyContext - ): IEnemySpecialQueryModifier; -} - -export interface IEnemyCommonQueryEffect { - /** 优先级,越高的越先执行 */ - readonly priority: number; - - /** - * 对怪物的某个特殊属性施加常规查询效果 - */ - apply( - handler: IEnemyHandler, - special: ISpecial, - query: () => IEnemyContext - ): void; -} - -export interface IEnemyFinalEffect { - /** 效果优先级,越高会越先被执行 */ - readonly priority: number; - - /** - * 向怪物施加最终修饰效果 - */ - apply(handler: IEnemyHandler): void; -} - -//#endregion - -//#region 地图伤害 - -export interface IMapDamageInfoExtra { - /** 捕捉怪物信息 */ - catch: Set; - /** 阻击怪物信息 */ - repulse: Set; -} - -export interface IMapDamageInfo { - /** 伤害值 */ - damage: number; - /** 伤害类型 */ - type: number; - /** 地图伤害额外信息 */ - extra: IMapDamageInfoExtra; -} - -export interface IMapDamageView { - /** - * 获取地图伤害影响范围 - */ - getRange(): IRange; - - /** - * 获取范围参数 - */ - getRangeParam(): T; - - /** - * 获取指定位置的地图伤害,会对坐标进行判断 - * @param locator 伤害位置 - */ - getDamageAt(locator: ITileLocator): Readonly | null; - - /** - * 获取指定位置的地图伤害,会对坐标进行判断 - * @param locator 伤害位置 - */ - getDamageWithoutCheck( - locator: ITileLocator - ): Readonly | null; -} - -export interface IMapDamageConverter { - /** - * 转换地图伤害视图 - */ - convert( - handler: IReadonlyEnemyHandler, - context: IEnemyContext - ): IMapDamageView[]; -} - -export interface IMapDamageReducer { - /** - * 对伤害信息进行合并 - */ - reduce( - info: Iterable>, - locator: ITileLocator - ): Readonly; -} - -export interface IMapDamage { - /** 当前绑定的怪物上下文 */ - readonly context: IEnemyContext; - - /** - * 设置地图伤害转换器,并基于当前上下文重建所有地图伤害视图 - * @param converter 地图伤害转换器 - */ - useConverter(converter: IMapDamageConverter): void; - - /** - * 设置地图伤害合并器 - * @param reducer 地图伤害合并器 - */ - useReducer(reducer: IMapDamageReducer): void; - - /** - * 在指定位置添加一条无来源地图伤害 - * @param locator 地图定位符 - * @param info 地图伤害信息 - */ - addMapDamage(locator: ITileLocator, info: IMapDamageInfo): void; - - /** - * 在指定位置删除一条无来源地图伤害 - * @param locator 地图定位符 - * @param info 地图伤害信息 - */ - deleteMapDamage(locator: ITileLocator, info: IMapDamageInfo): void; - - /** - * 将指定位置标记为脏,后续访问时会重新计算该点的有来源伤害 - * @param locator 地图定位符 - */ - markDirty(locator: ITileLocator): void; - - /** - * 将指定怪物对应的地图伤害标记为脏并刷新 - * @param view 怪物视图 - */ - markEnemyDirty(view: IEnemyView): void; - - /** - * 基于当前上下文重新刷新全部有来源地图伤害 - */ - refreshAll(): void; - - /** - * 删除指定怪物带来的全部地图伤害来源 - * @param view 怪物视图 - */ - deleteEnemy(view: IEnemyView): void; - - /** - * 获取指定位置合并后的地图伤害 - * @param locator 地图定位符 - */ - getReducedDamage(locator: ITileLocator): Readonly | null; - - /** - * 获取指定位置未合并的地图伤害列表 - * @param locator 地图定位符 - */ - getSeparatedDamage( - locator: ITileLocator - ): Iterable>; -} - -//#endregion - -//#region 伤害系统 - -export interface IEnemyDamageInfo { - /** 战斗伤害值 */ - readonly damage: number; - /** 战斗回合数 */ - readonly turn: number; -} - -export interface IEnemyCritical { - /** 此临界点中指定勇士属性的值 */ - readonly nextValue: number; - /** 当前勇士指定属性的值 */ - readonly baseValue: number; - /** 此临界点中指定勇士数值的值与当前值的差,即 `nextValue - baseValue` */ - readonly nextDiff: number; - /** 当前状态下怪物的伤害信息 */ - readonly baseInfo: IEnemyDamageInfo; - /** 此临界点下怪物的伤害信息 */ - readonly info: IEnemyDamageInfo; - /** 此临界点的伤害值与当前伤害值的差 */ - readonly damageDiff: number; -} - -export type CriticalableHeroStatus = keyof { - [P in keyof THero as THero[P] extends number ? P : never]: number; -}; - -export interface IDamageCalculator { - /** - * 计算战斗伤害信息 - * @param handler 信息对象 - */ - calculate(handler: IReadonlyEnemyHandler): IEnemyDamageInfo; - - /** - * 获取临界计算的上界 - * @param handler 信息对象 - * @param attribute 勇士的临界属性 - */ - getCriticalLimit( - handler: IReadonlyEnemyHandler, - attribute: CriticalableHeroStatus - ): number; -} - -export interface IDamageContext { - /** - * 获取战斗伤害信息 - * @param enemy 怪物视图 - */ - getDamageInfo(enemy: IEnemyView): IEnemyDamageInfo | null; - - /** - * 根据怪物对象获取战斗伤害信息 - * @param enemy 怪物对象 - */ - getDamageInfoByComputed( - enemy: IReadonlyEnemy - ): IEnemyDamageInfo | null; - - /** - * 计算怪物在指定勇士属性下的临界 - * @param enemy 怪物视图 - * @param attribute 计算临界的目标勇士属性,比如计算攻击临界、自定义属性的临界等等 - * @param precision 临界计算精度,表示会进行多少次二分计算,一般填写 `12-16` 之间的数即可,默认是 12 - */ - calculateCritical( - enemy: IEnemyView, - attribute: CriticalableHeroStatus, - precision?: number - ): Generator; -} - -export interface IDamageSystem extends IDamageContext< - TAttr, - THero -> { - /** 伤害系统所属的上下文 */ - readonly context: IEnemyContext; - - /** - * 设置当前伤害计算系统使用的伤害计算器 - * @param calculator 伤害计算器 - */ - useCalculator(calculator: IDamageCalculator): void; - - /** - * 获取当前使用的伤害计算器 - */ - getCalculator(): IDamageCalculator | null; - - /** - * 绑定勇士信息 - * @param hero 勇士信息 - */ - bindHeroStatus(hero: IReadonlyHeroAttribute | null): void; - - /** - * 将指定的怪物标记为脏 - * @param enemy 怪物视图 - */ - markDirty(enemy: IEnemyView): void; - - /** - * 删除指定的怪物 - * @param enemy 怪物视图 - */ - deleteEnemy(enemy: IEnemyView): void; - - /** - * 将所有怪物标记为脏 - */ - markAllDirty(): void; - - /** - * 修改勇士属性,然后返回修改后勇士属性所组成的计算对象,不影响当前伤害系统的状态 - * @param modify 勇士修改函数 - */ - with(hero: IHeroAttribute): IDamageContext; -} - -//#endregion - -//#region 上下文 - -export interface IEnemyContext { - /** 怪物上下文宽度 */ - readonly width: number; - /** 怪物上下文高度 */ - readonly height: number; - /** 此上下文使用的索引对象 */ - readonly indexer: IMapLocIndexer; - - /** - * 调整上下文尺寸,并清空当前上下文中的所有怪物与状态 - * @param width 地图宽度 - * @param height 地图高度 - */ - resize(width: number, height: number): void; - - /** - * 注册一个光环转换器 - * @param converter 光环转换器 - */ - registerAuraConverter(converter: IAuraConverter): void; - - /** - * 注销一个光环转换器 - * @param converter 光环转换器 - */ - unregisterAuraConverter(converter: IAuraConverter): void; - - /** - * 设置光环转换器的启用状态 - * @param converter 光环转换器 - * @param enabled 是否启用 - */ - setAuraConverterEnabled( - converter: IAuraConverter, - enabled: boolean - ): void; - - /** - * 注册一个特殊属性查询效果 - * @param effect 特殊属性查询效果 - */ - registerSpecialQueryEffect( - effect: IEnemySpecialQueryEffect - ): void; - - /** - * 注销一个特殊属性查询效果 - * @param effect 特殊属性查询效果 - */ - unregisterSpecialQueryEffect( - effect: IEnemySpecialQueryEffect - ): void; - - /** - * 为指定特殊属性代码注册常规查询效果 - * @param code 特殊属性代码 - * @param effect 常规查询效果 - */ - registerCommonQueryEffect( - code: number, - effect: IEnemyCommonQueryEffect - ): void; - - /** - * 注销指定特殊属性代码上的常规查询效果 - * @param code 特殊属性代码 - * @param effect 常规查询效果 - */ - unregisterCommonQueryEffect( - code: number, - effect: IEnemyCommonQueryEffect - ): void; - - /** - * 注册一个最终效果 - * @param effect 最终效果 - */ - registerFinalEffect(effect: IEnemyFinalEffect): void; - - /** - * 注销一个最终效果 - * @param effect 最终效果 - */ - unregisterFinalEffect(effect: IEnemyFinalEffect): void; - - /** - * 绑定勇士对象 - * @param hero 勇士属性对象 - */ - bindHero(hero: IReadonlyHeroAttribute | null): void; - - /** - * 获取当前绑定的勇士属性对象 - */ - getBindedHero(): IReadonlyHeroAttribute | null; - - /** - * 获取指定怪物对象当前所在位置 - * @param enemy 怪物对象 - */ - getEnemyLocator(enemy: IEnemy): Readonly | null; - - /** - * 获取指定怪物视图当前所在位置 - * @param view 怪物视图 - */ - getEnemyLocatorByView( - view: IEnemyView - ): Readonly | null; - - /** - * 根据定位符获取怪物视图 - * @param locator 地图定位符 - */ - getEnemyByLocator(locator: ITileLocator): IEnemyView | null; - - /** - * 根据坐标获取怪物视图 - * @param x 横坐标 - * @param y 纵坐标 - */ - getEnemyByLoc(x: number, y: number): IEnemyView | null; - - /** - * 根据计算后怪物对象反查怪物视图 - * @param enemy 计算后怪物对象 - */ - getViewByComputed(enemy: IReadonlyEnemy): IEnemyView | null; - - /** - * 在指定位置放置一个怪物对象 - * @param locator 地图定位符 - * @param enemy 怪物对象 - */ - setEnemyAt(locator: ITileLocator, enemy: IEnemy): void; - - /** - * 删除指定位置的怪物 - * @param locator 地图定位符 - */ - deleteEnemy(locator: ITileLocator): void; - - /** - * 扫描指定范围内的怪物视图 - * @param range 范围对象 - * @param param 范围参数 - */ - scanRange( - range: IRange, - param: T - ): Iterable<[ITileLocator, IEnemyView]>; - - /** - * 迭代上下文中的全部怪物 - */ - iterateEnemy(): Iterable<[ITileLocator, IEnemyView]>; - - /** - * 添加一个全局光环视图 - * @param aura 光环视图 - */ - addAura(aura: IAuraView): void; - - /** - * 删除一个全局光环视图 - * @param aura 光环视图 - */ - deleteAura(aura: IAuraView): void; - - /** - * 绑定地图伤害管理器 - * @param damage 地图伤害管理器 - */ - attachMapDamage(damage: IMapDamage | null): void; - - /** - * 获取当前绑定的地图伤害管理器 - */ - getMapDamage(): IMapDamage | null; - - /** - * 绑定伤害计算系统 - * @param system 伤害系统 - */ - attachDamageSystem(system: IDamageSystem | null): void; - - /** - * 获取当前绑定的伤害计算系统 - */ - getDamageSystem(): IDamageSystem | null; - - /** - * 重建当前上下文中的全部怪物计算结果 - * - * 1. 对所有光环及特殊查询进行构建操作,这一步中会决定每个怪物所拥有的特殊属性,后续不会变动 - * 2. 执行所有的普通光环效果,修改怪物的基础属性 - * 3. 执行常规查询效果,允许查询上下文状态并修改怪物自身的基础属性 - * 4. 执行最终效果,不允许查询上下文状态,仅允许修改怪物自身的基础属性 - */ - buildup(): void; - - /** - * 将指定怪物视图标记为脏 - * @param view 怪物视图 - */ - markDirty(view: IEnemyView): void; - - /** - * 申请刷新指定怪物视图 - * @param view 怪物视图 - */ - requestRefresh(view: IEnemyView): void; - - /** - * 清空当前上下文中的所有对象与运行状态 - */ - clear(): void; - - /** - * 销毁当前上下文 - */ - destroy(): void; -} - -//#endregion diff --git a/packages-user/data-base/src/enemy/utils.ts b/packages-user/data-base/src/enemy/utils.ts deleted file mode 100644 index 088d186..0000000 --- a/packages-user/data-base/src/enemy/utils.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ITileLocator } from '@motajs/common'; -import { IMapLocIndexer } from './types'; - -export class MapLocIndexer implements IMapLocIndexer { - private width: number = 0; - - setWidth(width: number): void { - this.width = width; - } - - locToIndex(x: number, y: number): number { - return y * this.width + x; - } - - locaterToIndex(locator: ITileLocator): number { - return locator.y * this.width + locator.x; - } - - indexToLocator(index: number): ITileLocator { - return { - x: index % this.width, - y: Math.floor(index / this.width) - }; - } -} diff --git a/packages-user/data-base/src/index.ts b/packages-user/data-base/src/index.ts index 0be7276..f71b3b5 100644 --- a/packages-user/data-base/src/index.ts +++ b/packages-user/data-base/src/index.ts @@ -1,3 +1,4 @@ +export * from './combat'; export * from './common'; export * from './enemy'; export * from './flag';