跳转至

Item

职责

item 表示一个运行时物品实例:类型身份、数量、损坏、flag、变量、激活状态、制作 状态、唯一 ID 和嵌套 item_contents。静态 itype 定义由 item_factory 创建,不会 复制到每个实例中。

入口点

从 src/item.h 的 class item 开始。名称、护甲、枪械/工具/弹药、激活、劣化或转换 分别进入对应 item_*.cpp;创建经过 item_factory,持久化进入 src/savegame_json.cpp。

数据所有权

item 拥有实例字段和 contents;容器通过 pocket 拥有子 item;item_location 是可随 移动更新的引用,不是所有权。itype_id 在工厂中解析不可变定义数据。

依赖

物品依赖类型注册表、pocket、单位、flag、use actor、recipe、effect,以及当前持有它 的 map/character/vehicle 容器。

生命周期

item 从类型生成,可能激活、转换、拆分、堆叠、在所有者间移动,最终被消耗或销毁。 safe_reference 与持久 item_uid 解决不同身份问题,不能混用。

不变量

类型指针与 ID 一致;嵌套内容满足 pocket 约束;堆叠比较覆盖所有影响等价性的状态; 按 charges 计数的物品遵守数量规则;移动不能留下失效 location 或重复 UID。

扩展点

内容优先通过 item JSON 和既有 use actor 增加。原生行为放入对应 item 组件,并同时 更新 loader、formatter、存档兼容和测试。

序列化

item::serialize / deserialize 和 item_contents 持久化位于 src/savegame_json.cpp。新字段必须为旧存档提供默认值;派生缓存和 safe reference 不是持久状态。

测试

按修改的不变量选择 item、contents、pocket、stacking、name、spawn、location 或 activation 测试。任何持久实例字段都要做往返测试。

性能

物品访问与 name/info 生成会乘以大型 inventory 的规模。热 predicate 中避免递归全扫、 字符串格式化或重复 factory 查询;有明确失效边界时才用缓存。

CCB 差异

CCB 的 item JSON 与运行时字段可能有意滞后、选择性移植或扩展上游契约。导入上游 修改前必须比较 loader、存档字段和测试。

技术债务

item 仍是分散在许多翻译单元中的宽类型。新增功能应进入既有组件,不要再引入跨 系统 flag 或无版本约定的变量。