跳转至

Avatar

职责

avatar 是玩家控制的具体 Character,增加角色创建、模板、玩家身份、地图记忆、 控制权转移、面向 UI 的状态,以及世界存档中的顶层玩家序列化。

入口点

先读 src/avatar.h 与 src/avatar.cpp;创建和玩家命令继续进入 newcharacter.cpp、avatar_action.cpp。avatar::serialize、avatar::deserialize、 save_map_memory 和 control_npc 是高风险边界。

数据所有权

avatar 拥有玩家专属状态和稳定 save ID,并通过 memory 对象拥有地图记忆;当前 map、 world、creature 与 UI 服务仍由各自系统管理,avatar 只引用它们。

依赖

它依赖 Character、world/save 服务、map memory、input/UI 状态、mission、faction 和 角色创建注册表。玩家动作应通过常规 map 与 activity 接口,不能直接改远端状态。

生命周期

avatar 被创建或读取,按 character type 初始化,接入世界,然后作为受控行动者更新。 control_npc 会有意转移控制权,同时把原行动者保留为 NPC。

不变量

同一上下文只有一个受控 avatar;save ID 必须稳定;地图记忆使用绝对坐标;转移控制 不能复制 character ID 或物品所有权。

扩展点

玩家专属命令放在 avatar_action.cpp,创建政策放在创建流程;只有不能用局部 adaptor 表达时才保存 UI 状态。共享行动者行为属于 Character,不应塞入 avatar。

序列化

src/savegame_json.cpp 实现具体玩家记录。明确不序列化的 UI 状态(例如区域整理视口 锁)必须能在读取后重建。

测试

使用 new-character 测试,再运行被修改共享子系统的聚焦测试。存档字段需要覆盖旧值/ 缺失值读取和往返,不能只比一份 JSON 快照。

性能

不要在玩家每回合或 redraw 路径执行全世界查询或反复扫描 map memory。任何缓存都需 要明确的失效事件。

CCB 差异

CCB 的玩家 UI 与 Lua 集成可能与上游缺失或不同。移植 avatar 修改时应比较行为和 存档字段,不能仅凭同名类判断等价。

技术债务

玩家专属状态仍分散于创建、game、UI 和 save 单元。应以小而可测的步骤改成显式服务, 不要继续扩大全局 avatar 访问。