diff --git a/packages-user/data-base/src/enemy/enemy.ts b/packages-user/data-base/src/enemy/enemy.ts index 7f56efb..1c280a3 100644 --- a/packages-user/data-base/src/enemy/enemy.ts +++ b/packages-user/data-base/src/enemy/enemy.ts @@ -51,6 +51,13 @@ export class Enemy implements IEnemy { this.attributes[key] = value; } + addAttribute>( + key: K, + value: number + ): void { + (this.attributes[key] as number) += value; + } + getAttribute(key: K): TAttr[K] { return this.attributes[key]; } diff --git a/packages-user/data-base/src/enemy/types.ts b/packages-user/data-base/src/enemy/types.ts index 3a2ee5b..a0cc59c 100644 --- a/packages-user/data-base/src/enemy/types.ts +++ b/packages-user/data-base/src/enemy/types.ts @@ -100,6 +100,16 @@ export interface IEnemy extends IReadonlyEnemy { */ setAttribute(key: K, value: TAttr[K]): void; + /** + * 对一个数字类型的属性值进行增减操作 + * @param key 属性名称 + * @param value 要增加的属性值,可以是负值 + */ + addAttribute>( + key: K, + value: number + ): void; + /** * 深拷贝此怪物对象 */ diff --git a/packages-user/data-state/src/core.ts b/packages-user/data-state/src/core.ts index e687fd4..c62e888 100644 --- a/packages-user/data-state/src/core.ts +++ b/packages-user/data-state/src/core.ts @@ -13,6 +13,7 @@ import { IEnemyAttributes } from './enemy/types'; import { CommonAuraConverter, GuardAuraConverter, + MainEnemyFinalEffect, MainMapDamageConverter, MainMapDamageReducer } from './enemy'; @@ -44,6 +45,7 @@ export class CoreState implements ICoreState { enemyContext.attachMapDamage(mapDamage); enemyContext.registerAuraConverter(new CommonAuraConverter()); enemyContext.registerAuraConverter(new GuardAuraConverter()); + enemyContext.registerFinalEffect(new MainEnemyFinalEffect()); enemyContext.resize(core._WIDTH_, core._HEIGHT_); this.enemyContext = enemyContext; } diff --git a/packages-user/data-state/src/enemy/aura.ts b/packages-user/data-state/src/enemy/aura.ts index e75bdeb..99caee1 100644 --- a/packages-user/data-state/src/enemy/aura.ts +++ b/packages-user/data-state/src/enemy/aura.ts @@ -95,27 +95,18 @@ export class CommonAura implements IEnemyAuraView< const { hpBuff, atkBuff, defBuff } = this.special.value; if (hpBuff !== 0) { - enemy.setAttribute( - 'hp', - enemy.getAttribute('hp') + - Math.floor((baseEnemy.getAttribute('hp') * hpBuff) / 100) - ); + const hpValue = (baseEnemy.getAttribute('hp') * hpBuff) / 100; + enemy.addAttribute('hp', Math.floor(hpValue)); } if (atkBuff !== 0) { - enemy.setAttribute( - 'atk', - enemy.getAttribute('atk') + - Math.floor((baseEnemy.getAttribute('atk') * atkBuff) / 100) - ); + const atkValue = (baseEnemy.getAttribute('atk') * atkBuff) / 100; + enemy.addAttribute('atk', Math.floor(atkValue)); } if (defBuff !== 0) { - enemy.setAttribute( - 'def', - enemy.getAttribute('def') + - Math.floor((baseEnemy.getAttribute('def') * defBuff) / 100) - ); + const defValue = (baseEnemy.getAttribute('def') * defBuff) / 100; + enemy.addAttribute('def', Math.floor(defValue)); } } diff --git a/packages-user/data-state/src/enemy/final.ts b/packages-user/data-state/src/enemy/final.ts new file mode 100644 index 0000000..6e4337f --- /dev/null +++ b/packages-user/data-state/src/enemy/final.ts @@ -0,0 +1,29 @@ +import { IEnemy, IEnemyFinalEffect } from '@user/data-base'; +import { IEnemyAttributes } from './types'; +import { ITileLocator } from '@user/types'; + +const HERO_STATUS_PLACEHOLDER = { + atk: 0, + def: 0 +} as const; + +export class MainEnemyFinalEffect implements IEnemyFinalEffect { + readonly priority: number = 0; + + apply(enemy: IEnemy, _locator: ITileLocator): void { + if (enemy.hasSpecial(3)) { + enemy.setAttribute( + 'def', + Math.max( + enemy.getAttribute('def'), + HERO_STATUS_PLACEHOLDER.atk - 1 + ) + ); + } + + if (enemy.hasSpecial(10)) { + enemy.setAttribute('atk', HERO_STATUS_PLACEHOLDER.atk); + enemy.setAttribute('def', HERO_STATUS_PLACEHOLDER.def); + } + } +} diff --git a/packages-user/data-state/src/enemy/index.ts b/packages-user/data-state/src/enemy/index.ts index 6de8758..c325133 100644 --- a/packages-user/data-state/src/enemy/index.ts +++ b/packages-user/data-state/src/enemy/index.ts @@ -1,4 +1,5 @@ export * from './aura'; export * from './damage'; +export * from './final'; export * from './mapDamage'; export * from './special';