物品系统
目录
简介
本文件系统化梳理 Cataclysm-DDA 的物品系统,围绕“工厂模式”“装备系统”“背包管理”“道具分类机制”展开;同时覆盖“物品属性系统”“耐久度机制”“污染处理”“随机性与稀有度分级”“生成算法与平衡性调整”“批量操作与性能优化”等主题,并提供可直接定位到源码的路径指引与扩展开发建议。
项目结构
- 物品类型定义与工厂:itype + Item_factory 负责加载、校验与模板管理
- 实例对象与行为:item 负责具体实例的状态、属性、行为调用
- 随机生成:Item_group 提供组内随机生成、容器封装、概率与溢出策略
- 背包与交互:inventory 提供堆叠、排序、查找、批量使用等
- 分类与展示:item_category 提供 UI 分区、优先区域、生成速率等
图表来源
- src/itype.h
- src/item_factory.h
- src/item.h
- src/inventory.h
- src/item_group.h
章节来源
- src/itype.h
- src/item_factory.h
- src/item.h
- src/inventory.h
- src/item_group.h
核心组件
- 物品类型(itype):承载所有静态属性(体积、重量、伤害、材料、用途、标签、变体等),由 Item_factory 统一加载与校验
- 物品实例(item):基于 itype 创建的具体对象,维护状态(耐久、污染、电能、温度、变量、内容物等),并提供行为调用(激活/转换/拆分/合并/信息输出)
- 物品工厂(Item_factory):集中式类型管理器,负责加载 JSON、构建模板、迁移与最终化、黑名单、运行时模板注册
- 物品生成组(Item_group):按分布/集合规则从组中随机产出物品,支持容器封装、默认弹药/弹夹、溢出策略、 relic 生成
- 背包(inventory):对物品进行堆叠、排序、查找、批量使用、伪工具提供、容量统计等
- 分类(item_category):为 UI 展示与生成速率提供元数据(名称、排序、优先区域、生成倍率)
章节来源
- src/itype.h
- src/item.h
- src/item_factory.h
- src/item_group.h
- src/inventory.h
- src/item_category.h
架构总览
下面以“从 JSON 到实例”的视角展示工厂与生成链路:
图表来源
- src/item_factory.cpp
- src/item_group.cpp
- src/item.cpp
章节来源
- src/item_factory.cpp
- src/item_group.cpp
- src/item.cpp
详细组件分析
工厂模式:类型与实例的解耦
- 类型(itype):集中定义物品的静态属性与行为入口(如 use_methods、flags、slots 等)
- 实例(item):在构造时绑定 itype,继承其默认值与规则,同时维护自身状态(如 charges、active、contents 等)
- 工厂(Item_factory):统一加载、校验、迁移、缓存与最终化,保证类型一致性与运行期稳定性
图表来源
- src/item_factory.h
- src/itype.h
- src/item.h
章节来源
- src/item_factory.h
- src/itype.h
- src/item.h
装备系统:武器/弹药/护甲/工具
- 武器(gun):射程、精度、后坐力、射速、弹容量、模式、故障、能量消耗等
- 弹药(ammo):伤害、散布修正、燃烧/特殊效果、计数与噪音
- 护甲(armor):部位覆盖、厚度、抗环境、透气性、刚性/舒适度、分层
- 工具(tool):最大/默认充能、功率消耗、电子端口、ememory 转移速率等
图表来源
- src/itype.h
- src/itype.h
- src/itype.h
- src/itype.h
章节来源
- src/itype.h
- src/itype.h
- src/itype.h
背包管理:堆叠、排序与批量操作
- 堆叠与合并:基于 item::stacks_with 与 merge_charges,支持按“计数/电能/液体”等不同维度合并
- 排序与分配:restack 保证同堆一致的 invlet,assign_empty_invlet 为未占用字母分配
- 批量使用与查找:use_amount、reduce_stack、position_by_item/type、invlet_to_position
- 容量与重量:weight/volume 计算考虑 contents 与积分化体积/重量
图表来源
- src/inventory.cpp
章节来源
- src/inventory.h
- src/inventory.cpp
道具分类机制:UI 展示与生成速率
- 分类元数据:名称、排序权重、优先区域(含“脏污”标志)、生成倍率
- 优先区域:根据物品 flags 或脏污状态选择特定区域
- 生成速率:通过 item_category_spawn_rates 控制类别生成倍率
图表来源
- src/item_category.h
- src/item_category.cpp
章节来源
- src/item_category.h
- src/item_category.cpp
物品属性系统与耐久度机制
- 属性来源:itype 中定义的基础属性(体积、重量、伤害、材料、标签等)
- 实例状态:item 维护 damage/degradation、active、energy、rot/spoil、变量等
- 耐久与损坏:set_damage/set_degradation、deterioration 符号、能量电池 mod_energy
- 污染与过热:dirt_symbol/overheat_symbol、故障(fault)与安全机制
图表来源
- src/item.cpp
- src/item.cpp
- src/item.cpp
章节来源
- src/item.cpp
- src/item.cpp
- src/item.cpp
污染处理与特殊效果
- 污染(dirt):影响散布与可靠性,可通过 dirt_symbol 显示等级
- 过热(overheat):影响命中与安全机制(fault_overheat_safety)
- 特殊效果:ammo_effects(燃烧、燃烧开火等)、gun 故障列表、relic 生成
- 变体与描述:itype_variant_data 支持替换描述/符号/颜色/ASCII 艺术
章节来源
- src/item.cpp
- src/item_group.cpp
- src/itype.h
物品生成算法与随机性控制
- Item_group:支持“集合/分布”,按概率或相对权重抽取
- 随机性:spawn_flags 控制最大化/使用全局 spawn_rate;单次生成与批量生成
- 容器与弹药:自动为枪/工具填充默认弹夹/弹药,容器封装与溢出策略
- Relic:按规则生成 artifact
图表来源
- src/item_group.h
- src/item_group.cpp
- src/item_group.cpp
章节来源
- src/item_group.h
- src/item_group.cpp
- src/item_group.cpp
稀有度分级与平衡性调整
- 稀有度:通过 Item_group 的概率与 Item_modifier 的 count/damage/charges 区分
- 平衡性:itype 中 damage/encumbrance/材料/功能限制;Item_factory 最终化阶段统一修正
- 生成速率:item_category_spawn_rates 控制类别生成倍率;spawn_flags 影响实际产出
章节来源
- src/item_group.cpp
- src/item_category.cpp
- src/item_factory.cpp
批量操作与性能优化
- 批量生成:items_from 支持批量产出,配合 spawn_flags 控制随机性
- 背包批量:inventory 提供 operator+=、restack、dump 等减少重复遍历
- 缓存与索引:inventory::get_binned_items、itype_bin 快速按类型检索
- 合并与去重:restack 合并同类项,减少 UI 渲染与交互成本
章节来源
- src/inventory.h
- src/inventory.cpp
- src/item_group.h
依赖关系分析
- Item_factory 依赖 itype、flag、material、ammo、recipe 等模块,统一校验与最终化
- item 依赖 itype、item_contents、item_pocket、iuse_actor 等,承载复杂行为
- Item_group 依赖 Item_factory 查询组与类型,支持递归与容器封装
- inventory 依赖 item、map、pocket_type 等,提供交互与统计
图表来源
- src/item_factory.cpp
- src/item.cpp
- src/item_group.cpp
- src/inventory.cpp
章节来源
- src/item_factory.cpp
- src/item.cpp
- src/item_group.cpp
- src/inventory.cpp
性能考量
- 避免频繁 restack:在大量物品变动后统一调用,减少多次排序与 invlet 更新
- 使用 itype_bin 快速检索:inventory::get_binned_items 降低 O(n) 查找成本
- 合理使用 spawn_flags:最大化模式减少随机分支,提高生成效率
- 控制容器封装与弹药填充:仅在必要时进行,避免额外拷贝与校验
故障排查指南
- 无法找到类型/组:检查 Item_factory::check_definitions 与 group_is_defined
- 生成异常或递归:检查 Item_spawn_data::RecursionList 与 Single_item_creator 的递归保护
- 背包 invlet 冲突:使用 update_invlet 或 assign_empty_invlet 修复
- 价格/价值异常:核对 price_no_contents 与 pratical 参数
章节来源
- src/item_factory.cpp
- src/item_group.cpp
- src/inventory.cpp
结论
CDDA 的物品系统以“类型模板 + 实例状态 + 工厂/生成器 + 背包管理 + 分类元数据”为核心,实现了高扩展性与强一致性的平衡。通过合理的工厂与生成链路、完善的属性与状态模型、以及面向 UI 的分类与速率控制,既满足了玩法深度,也兼顾了性能与可维护性。
附录
- 扩展开发建议
- 新增物品类型:在 JSON 中定义 itype,确保 flags、slots、use_methods、variants 完整
- 新增生成组:使用 Item_group 定义分布/集合,设置 with_ammo/with_magazine 与容器策略
- 新增分类:通过 item_category 定义 UI 名称、排序与优先区域
- 性能优化:批量生成时使用 spawn_flags,背包操作后统一 restack,利用 bin 缓存快速检索