template/docs/intermediate/combat-overview.md
unanmed 5528edc70d docs(10-04): write combat overview, specials, and aura docs
- add combat flow overview with mermaid and doc map
- document special attribute definitions and implementation locations
- document aura priority, built-in auras, and custom examples
2026-10-17 18:43:06 +08:00

3.6 KiB
Raw Blame History

战斗总览

战斗在数据端完成:怪物先被计算成「计算后怪物」,再由伤害计算器根据怪物与勇士的属性算出伤害与回合数,最后经过战前脚本、战后脚本与状态钩子结算。本篇串起这条主线,各环节的细节见对应文档。

伤害大致怎么算

一次战斗的伤害可以写成 f(enemy, hero):enemy 是计算后的怪物对象,hero 是勇士属性对象。计算器读取双方的 hp、atk、def、mdef 等属性,返回:

  • damage:本次战斗勇士会损失的生命值;
  • turn:战斗持续多少回合。

数据端不逐帧模拟战斗,只根据公式给出这两个值。公式的实现与替换见伤害计算。

计算后怪物:buildup 的四个阶段

怪物在数据里保存的是基础属性与特殊属性。进入战斗前,怪物上下文会把每个怪物重建为「计算后怪物」(enemyContext.buildup()),分四步:

  1. 光环与特殊查询:把特殊属性转换成光环视图,按优先级执行会修改特殊属性的效果,确定每个怪物最终拥有哪些特殊属性;
  2. 普通光环:执行修改基础属性的光环效果;
  3. 常规查询:允许读取上下文(周围怪物、位置等),并修改自身基础属性;
  4. 最终效果:不再查询上下文,只对自身基础属性做收尾调整。

前三步都可能受优先级影响;光环与查询共用同一套优先级,见怪物光环与怪物查询。最终效果见最终属性效果。

战斗流程

graph TD
    A[怪物基础数据] --> B[光环 / 查询 / 最终]
    B --> C[伤害计算 f(enemy, hero)]
    C --> D[战前脚本 before]
    D -->|返回 false| X[放弃战斗]
    D -->|返回 true| E[战斗结算 damage / turn]
    E --> F[战后脚本 after]
    F --> G[战后钩子与状态钩子]
  • 基础数据:怪物模板的属性与特殊属性,来自怪物数据;
  • 光环 / 查询 / 最终:由 enemyContext.buildup() 生成计算后怪物;
  • 伤害计算:IDamageCalculator.calculate 返回 { damage, turn };
  • 战前脚本:ICombatScript.before 返回 false 时放弃战斗;
  • 战斗结算:按 damage 扣血,按 turn 记录回合数;
  • 战后脚本:ICombatScript.after 结算经验、金币等内容;
  • 战后钩子与状态钩子:处理中毒、衰弱、重生等持续状态。

战斗流程本身由 state.combat(ICombatFlow)驱动,battle(view) 返回本次战斗的伤害信息。脚本见战斗脚本,状态钩子见状态钩子。

流程步骤与对应文档

步骤 做什么 对应文档
特殊属性 定义怪物的机制与参数 特殊属性
光环 影响周围怪物的基础属性或特殊属性 怪物光环
查询 读取上下文后调整自身 怪物查询
最终效果 只调整自身基础属性 最终属性效果
伤害计算 实现 f(enemy, hero) 伤害计算
地图伤害 勇士移动时按位置结算伤害 地图伤害
战前 / 战后脚本 拦截战斗、结算奖励 战斗脚本
状态钩子 处理中毒、衰弱、重生等状态 状态钩子

勇士一侧的属性读写见勇士属性。