跳转至

Activity

职责

activity 表示跨 move/turn 的工作。player_activity 保存调度、进度、target、value、 resume 状态与可选多态 activity_actor;actor 实现拥有 start、每回合、finish、cancel 与序列化行为。

入口点

阅读 src/player_activity.h、src/activity_actor.h 及其实现,再看聚焦的 activity_actor_definitions.h。旧 handler 仍在 activity_handlers,调度/backlog 使用 activity_tracker。

数据所有权

Character 通过 tracker 拥有当前与排队 activity。player_activity 拥有可 clone 的 actor 与稳定 item location/target,但不拥有目标 item 或 map tile 本身。

依赖

activity 依赖 Character、item location、坐标、activity type 定义、inventory 有效性、 move point、UI interrupt、event 与存档 JSON。

生命周期

activity 构造并分配;actor start 一次;do_turn 推进;interrupt 可 suspend/cancel; 兼容工作可 resume;finish 或取消执行清理,然后 tracker 继续。

不变量

actor type 与 activity ID 一致;clone 保留具体行为;使用前检查 target;总 move 与剩余 工作一致;cancel 完成必要清理;resume 只比较兼容 actor。

扩展点

新的长耗时行为应实现 activity_actor 并注册 deserializer。UI 选择留在 actor 外, 持久执行输入放进 actor;不要再增加 legacy handler。

序列化

player_activity 在 savegame_json.cpp 序列化;每个 actor 必须保存自定义数据并注册 对应 deserializer。旧 actor payload 要有默认或迁移。

测试

使用 activity tracker/scheduling 和聚焦行为测试,覆盖 start、单回合、完成、取消、 suspend/resume、无效 target、clone 与存档往返。

性能

activity 每回合执行,并可能验证 inventory。能安全自行管理无效 item 清理的 actor 应 使用已有 override,避免反复昂贵扫描。

CCB 差异

CCB 同时保留 actor 与 legacy activity 路径。上游 actor 移植必须匹配当前 CCB ID 映射、 存档 payload、interrupt 和 inventory 规则。

技术债务

legacy handler 与 actor activity 并存。应逐项迁移并保持存档兼容,不能重编号或悄然 重解释旧 ID。