Effect¶
职责¶
effect 子系统定义定时状态类型和每个 Creature 的实例:持续时间、强度、body-part 范围、 来源、modifier、消息、免疫、移除,以及重命名 effect ID 的迁移。
入口点¶
阅读 src/effect.h、src/effect.cpp、src/effect_source.*。静态 JSON 进入
effect_type;creature 的 effects_map 保存实例;EOC 集成是
effect_on_condition 中的另一契约。
数据所有权¶
注册表拥有 effect_type 定义。每个 Creature 拥有自己的 effects_map;effect
引用类型,并拥有实例持续时间、强度、身体范围和 source 数据。
依赖¶
effect 依赖 ID、body part、damage/character modifier、event、message、免疫规则、EOC、 source 序列化与 creature 每回合处理。
生命周期¶
类型加载并 finalize;实例被添加/刷新,每回合处理,改变强度或持续时间,触发相关行为, 最后到期或被明确移除/迁移。
不变量¶
类型 ID 可解析;持续时间/强度遵守类型边界;body-scoped key 不冲突;source 有效; 处理中移除不能使 iterator 失效;migration 无环且保留旧存档。
扩展点¶
优先使用 effect JSON、modifier 与 EOC hook。只有无法声明且可复用的行为才加原生实现, 并集中处理、测试免疫、添加、处理和移除路径。
序列化¶
effect 实例和 effect_source 在存档层序列化,定义从 JSON 加载。新字段需有默认值;
重命名 ID 必须提供明确 effect_migration。
测试¶
使用 effect/creature-effect 测试和聚焦 Character/monster 测试,覆盖 duration/intensity 边界、body part、免疫、source、处理中移除与往返。
性能¶
每个活跃 creature 都处理 effect。每回合工作应与活跃实例数成比例,避免重复类型查询/ 格式化,也不要为一个 effect 重建整张 map。
CCB 差异¶
即使共享 ID,CCB effect 定义与 EOC 用法也可能不同。移植数据和原生语义前要核对 migration、save 与 CCB 测试。
技术债务¶
effect 混合声明式 modifier 与原生特判。应优先使用显式可测的数据/event hook,并把 剩余硬编码 ID 行为记录为兼容债务。