mirror of
https://github.com/motajs/template.git
synced 2026-10-19 05:10:16 +08:00
docs(10-08): 引导式重写 enemy-aura/query/final
- enemy-aura:先讲「光环影响周围」,再引出优先级与 apply/applySpecial - enemy-query:从「需要看周围」引入查询,保留未内置警示与三示例 - enemy-final:从「最后收尾」引入最终效果,保留三方对比与仿攻示例
This commit is contained in:
parent
b1b7c8e0e7
commit
f5e432d04f
@ -1,19 +1,27 @@
|
||||
# 怪物光环
|
||||
|
||||
光环(aura)是一类特殊属性的执行方式:带有光环的怪物不直接改自己,而是把效果施加到范围内的其他怪物(也可以包括自己)。本篇先讲优先级,再讲内置光环与自定义写法。基础概念见[战斗总览](./combat-overview.md)。
|
||||
有些怪物并不直接改自己,而是影响周围的怪物:站在它旁边的怪物攻击更高、金币更少,或者被「传染」上另一层光环。这类特殊属性的执行方式就是光环(aura)。
|
||||
|
||||
光环的效果作用在范围内的其他怪物身上(也可以包括自己)。它要回答两个问题:先算谁、后算谁?改基础属性还是改特殊属性?下面先从优先级讲起,再看内置光环与自定义写法。基础概念见[战斗总览](./combat-overview.md)。
|
||||
|
||||
## 优先级
|
||||
|
||||
每只怪物可能同时受到多个光环影响。谁先算、谁后算,会直接改变结果,所以光环用 `priority` 排队。
|
||||
|
||||
每个光环视图都有 `priority`,每个查询效果也有 `priority`,两者共用同一套优先级:
|
||||
|
||||
- 构建时从高优先级开始处理,再处理较低优先级;
|
||||
- 高优先级产生的特殊属性变化,低优先级能看到;低优先级产生变化时,高优先级已经执行完,不能回头影响它;
|
||||
- 由效果新增的光环只能影响之后的阶段。若新光环的优先级高于当前阶段,开发环境会告警并跳过它。
|
||||
|
||||
可以把它想成排队办事:号码靠前的人先办,办完的结果留在桌上,后面的人可以接着用;但后面的人办完事,前面的人已经离开,不能再回来改。
|
||||
|
||||
因此,想让一个光环「先于普通光环生效」,把它的 `priority` 设得更高即可。
|
||||
|
||||
## 内置光环
|
||||
|
||||
引擎内置了三类光环,分别处理不同的需求:
|
||||
|
||||
| 光环 | code | 视图类 | priority | 行为 |
|
||||
|------|------|--------|----------|------|
|
||||
| 普通光环 | 23 | `CommonAura` | 10 | 按范围给怪物加 `hp` / `atk` / `def` 百分比 |
|
||||
@ -24,7 +32,7 @@
|
||||
|
||||
## 运作方式
|
||||
|
||||
一个光环由两部分组成:
|
||||
一条光环要经过两步才会生效:先认出「这个特殊属性是一条光环」,再决定「这条光环怎么影响目标」。对应到代码里,就是转换器与视图两部分:
|
||||
|
||||
- **转换器** `IAuraConverter`:`shouldConvert(special, handler)` 判断某个特殊属性是否归自己处理;`convert(special, handler, context)` 返回光环视图;
|
||||
- **视图** `IEnemyAuraView`:描述优先级、范围、影响方式。
|
||||
@ -38,7 +46,7 @@
|
||||
- `apply(handler, baseEnemy)`:修改目标怪物的基础属性;
|
||||
- `applySpecial(handler, baseEnemy)`:返回 `IEnemySpecialModifier`,用于添加、删除或修改目标怪物的特殊属性。
|
||||
|
||||
`apply` 与 `applySpecial` 的差别:
|
||||
`apply` 与 `applySpecial` 的差别,可以按「改什么」来记:
|
||||
|
||||
- `apply` 在「普通光环」阶段执行,目标是基础属性(`hp`、`atk`、`def` 等),拿到的 `baseEnemy` 是未修改的原始怪物;
|
||||
- `applySpecial` 在「光环与特殊查询」阶段执行,返回一个修饰器,由上下文按当前优先级应用到目标的特殊属性上。只有 `couldApplySpecial` 为 `true` 的光环才会被调用;
|
||||
@ -48,7 +56,7 @@
|
||||
|
||||
## 示例:基础光环(减少周围怪物的金币与经验)
|
||||
|
||||
先定义一个带参数的特殊属性(code 取一个未占用的值,这里用 30):
|
||||
先从一个只改基础属性的例子开始:让范围内的怪物金币与经验下降。第一步是定义一条带参数的特殊属性(code 取一个未占用的值,这里用 30):
|
||||
|
||||
```ts
|
||||
/** 30 - 削弱光环 */
|
||||
@ -180,7 +188,7 @@ state.enemyContext.registerAuraConverter(new WeakAuraConverter());
|
||||
|
||||
## 示例:特殊光环(给周围怪物上光环)
|
||||
|
||||
如果要给周围怪物「上」一个特殊属性,而不是直接改基础属性,就在 `applySpecial` 中返回一个 `IEnemySpecialModifier`。下面的例子给范围内没有普通光环的怪物加上 code 23 的普通光环:
|
||||
如果光环要给目标「加一条特殊属性」,而不是直接改基础属性,就把逻辑放进 `applySpecial`。下面的例子给范围内没有普通光环的怪物加上 code 23 的普通光环:
|
||||
|
||||
```ts
|
||||
// special.ts:31 - 传染光环
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
# 最终属性效果
|
||||
|
||||
最终效果(final effect)是构建计算后怪物的最后一个阶段:它只对怪物自身的基础属性做收尾调整,不查询怪物上下文,也不影响其他怪物。它适合实现「只看自己(和勇士)就能决定」的转换,例如坚固、模仿。整体流程见[战斗总览](./combat-overview.md)。
|
||||
光环影响别人,查询读取外部再改自己。等这些外部影响都算完,有时还需要对怪物自己做一次最后的收尾:既不依赖周围环境,也不影响其他怪物。这类收尾调整就是最终效果(final effect)。
|
||||
|
||||
它适合实现「只看自己(和勇士)就能决定」的转换,例如坚固、模仿。整体流程见[战斗总览](./combat-overview.md)。
|
||||
|
||||
## 接口
|
||||
|
||||
@ -22,7 +24,7 @@ state.enemyContext.registerFinalEffect(effect);
|
||||
|
||||
## 三方对比
|
||||
|
||||
光环、查询、最终效果都在构建计算后怪物时执行,但读取与影响的范围不同:
|
||||
光环、查询、最终效果都在构建计算后怪物时执行,但读取与影响的范围不同。把三者放在一起看,分工就清楚了:
|
||||
|
||||
| 效果 | 读取其他怪物/上下文 | 影响其他怪物 | 典型用途 |
|
||||
|------|---------------------|--------------|----------|
|
||||
|
||||
@ -1,14 +1,16 @@
|
||||
# 怪物查询
|
||||
|
||||
查询(query)让特殊属性在构建计算后怪物时读取上下文:周围有哪些怪物、它们带什么特殊属性、勇士在哪里。读取之后,查询可以修改怪物自身的基础属性,或增删、修改怪物的特殊属性。基础概念见[战斗总览](./combat-overview.md)。
|
||||
有些特殊属性不能只看自己。比如「抱团」要知道周围站了多少同伴,「同化」要看看附近怪物身上有什么属性,「号角」要数一数场上有多少怪物。这类属性需要先读取外部状态,再决定自己怎么变,对应的机制就叫查询(query)。
|
||||
|
||||
查询在构建计算后怪物时执行:读取周围有哪些怪物、它们带什么特殊属性、勇士在哪里,然后修改怪物自身的基础属性,或增删、修改怪物的特殊属性。基础概念见[战斗总览](./combat-overview.md)。
|
||||
|
||||
:::warning
|
||||
查询效果是**需要自己注册的新增内容**。当前 `src/data/enemy/initialize.ts` 只注册了光环转换器、最终效果、战斗脚本与钩子,没有注册任何查询效果。下面的接口与示例在你自己调用注册方法之前不会生效。
|
||||
查询效果是**引擎未内置、需要自己注册的新增内容**。当前 `src/data/enemy/initialize.ts` 只注册了光环转换器、最终效果、战斗脚本与钩子,没有注册任何查询效果。下面的接口与示例在你自己调用注册方法之前不会生效。
|
||||
:::
|
||||
|
||||
## 常规查询(CommonQuery)
|
||||
|
||||
常规查询面向「某个特殊属性要读外部状态,然后改自己」。注册方式:
|
||||
如果一条特殊属性只需要「读外部状态,然后改自己的基础属性」,用常规查询就够了。注册方式:
|
||||
|
||||
```ts
|
||||
state.enemyContext.registerCommonQueryEffect(code, effect);
|
||||
@ -23,7 +25,7 @@ state.enemyContext.registerCommonQueryEffect(code, effect);
|
||||
|
||||
## 特殊查询(SpecialQuery)
|
||||
|
||||
特殊查询面向「修改目标怪物拥有的特殊属性」,例如给范围内的怪物添加、删除或改写特殊属性。注册方式:
|
||||
如果查询要动的是目标怪物**拥有的特殊属性**——添加、删除或改写——就用特殊查询。例如给范围内的怪物补上一条属性,或把它们身上的数值属性叠加起来。注册方式:
|
||||
|
||||
```ts
|
||||
state.enemyContext.registerSpecialQueryEffect(effect);
|
||||
@ -49,7 +51,7 @@ state.enemyContext.registerSpecialQueryEffect(effect);
|
||||
|
||||
## 示例:抱团
|
||||
|
||||
「抱团」的规则是:范围内每有一个带同种特殊属性的怪物,自身攻击力就增加固定值。用常规查询实现:
|
||||
「抱团」的规则是:范围内每有一个带同种特殊属性的怪物,自身攻击力就增加固定值。它只需要读周围、改自己的攻击,所以用常规查询实现:
|
||||
|
||||
```ts
|
||||
import { ManhattanRange } from '@motajs/common';
|
||||
@ -92,7 +94,7 @@ state.enemyContext.registerCommonQueryEffect(40, effect);
|
||||
|
||||
## 示例:同化
|
||||
|
||||
「同化」的规则是:把范围内其他怪物的特殊属性复制到自己身上;数值型属性加算叠加,非数值型属性取位置索引最小的那个。用特殊查询实现:
|
||||
「同化」的规则是:把范围内其他怪物的特殊属性复制到自己身上;数值型属性加算叠加,非数值型属性取位置索引最小的那个。它要增删、改写自己拥有的特殊属性,所以用特殊查询:
|
||||
|
||||
```ts
|
||||
import { IEnemyAttr, IHeroAttr } from '@user/data-common';
|
||||
|
||||
Loading…
Reference in New Issue
Block a user