Cataclysm-DDA 电池与电力系统设计解析:从电压/电流抽象到容量驱动的设备匹配机制
【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA
Cataclysm-DDA(大灾变:黑暗之日)是一款回合制末日生存游戏,其道具系统覆盖数千种电子设备与工具。本文基于仓库文档 doc/design-balance-lore/batteries_and_electricity.md,系统讲解游戏中电池、储能与用电的核心设计决策:为何只建模容量而不显式处理电压与电流、如何用少量"电池尺寸等级"抽象真实世界中纷繁复杂的电池型号、以及新增电动设备时应如何匹配电池与功耗以保证运行时长的真实感。读完本文,你将掌握 DDA 电池体系的完整脉络,并能在添加新设备时正确选择电池类型、设置功耗数值与BATTERY_*标志。
设计总纲:一套"妥协"出来的现实模型
文档开篇即点明立场:游戏中电池、储能与用电的处理方式"是一堆妥协的产物"(a pile of compromises)。作为一款生存模拟游戏,DDA 并不追求对物理电路的真实仿真,而是追求可玩性、可理解性与表达力之间的平衡。后续所有设计决策——抽象电压电流、压缩电池型号、按运行时长度身功耗——都可以看作这套妥协哲学的落地。
这种取向与 DDA 整体"以 JSON 驱动内容、以模拟支撑玩法"的架构一致:电池体系的复杂度被刻意压到最低,让内容作者与玩家都能快速推理"这块电池能让这个设备撑多久"。
电压、电流与容量:只建模容量,不建模物理电学
为什么不显式处理电压与电流
DDA 明确不显式建模电压(voltage)与电流(current),只建模容量(capacity)。理由是:我们不是在"设计系统",而是在"表征现实设备"(representing them rather than designing systems),因此可以合理假定"某一类电池天然适合其目标设备"。
文档给出两个典型例证:
- 手持设备用的电池单元,被假定足以驱动对应手持设备;而现实中某些设备确实需要高于普通电池平均水平的电流。
- 一旦上升到电动汽车级别的电池包,游戏中假定"汽车级电池包适合汽车";而现实中把电池从一辆电动车挪到另一辆几乎是不可能的工程难题。
因此游戏刻意绕开了电流上限、电压匹配这类物理约束。文档同时留了一个伏笔:未来若想让某些电源"不适配"特定任务,实现方式将是引入类似"高放电电源"(high-draw power source)的标签化标注,而不是去建模真实的电压/电流限制。
容量在代码中的真实载体
"容量"在游戏数据层有直接落点:battery是一种弹药类型(ammunition_type),其显示单位就是kJ。见 data/json/items/ammo_types.json:
{ "type": "ammunition_type", "id": "battery", "name": "kJ", "default": "battery" }这意味着电池本质上被实现为装填了"电量弹药"的弹匣(MAGAZINE)。每块电池的capacity字段以 kJ 为单位声明其总能量,而设备(TOOL)则通过power_draw字段声明功耗,例如 data/json/items/tool/lighting.json 中的手电筒类设备功耗从46 mW(极省电的灯)到5 W(高亮灯具)不等。运行时长的核心关系由此变得异常直观:
运行时长 ≈ 电池容量(kJ) / 设备功耗(W)功耗字段在源码中的解析入口位于 src/item_factory.cpp,工具型物品通过power_draw字段(units::power类型,支持 W/mW 等单位后缀)声明持续工作的耗电速率;src/item_gun_tool_ammo.cpp 则在回合结算时按power_draw从电池扣减电量,并把消耗计入载具链路电量统计。这正是"只建模容量"在运行时的完整闭环:没有电压、没有电流,只有"每回合烧掉多少 kJ"。
电池表征:把几十种型号压缩成四档尺寸等级
为什么不做"电池与设备严格匹配"的玩法
现实中电子设备使用五花八门的电池规格(AA、AAA、C、D、18650、各种锂电工具包……)。文档直言:"把电池匹配到特定电子设备很麻烦,但这种麻烦有趣吗?我断言并不有趣。"因此游戏不做多型号严格匹配,而是把电池抽象成一组接近最小必要数量的尺寸等级,覆盖全部设备。
与此同时,现实中很多设备装多节标准电池(例如三节 AAA),但"装几节电池"同样不是有趣细节,所以游戏进一步抽象为:每个设备的电池仓只容纳一节合适容量的电池,不处理多节并联。
容量与尺寸为何对应真实外形,名称却不沿用
为了让玩家/作者推理电池更方便,游戏让容量与尺寸尽量与真实电池外形规格(form factor)挂钩,并在 JSON 的//注释中写明对应关系(例如medium_battery_cell标注18650);但ID、名称与描述刻意不引用真实型号。
文档用 LED 小手电举例:现实中它可能装三节 AAA,但游戏中不会用 3 节 AAA,而是一节大约 C/D 电池大小的单电池。若把这块游戏电池直接命名为"D cell",玩家很可能因为它现实中相对小众而忽略它——但在 DDA 里它其实极其常见。命名与真实规格脱钩,是为了避免玩家用现实直觉误导游戏内价值判断。
现行电池清单(源码级核实)
文档给出电池清单表格,我们可以在 data/json/items/battery.json 中逐一核实其实现,并补充重量、体积、可充电性等细节:
| ID | 现实对应物 | 类型标志 | 能量(kJ) | 实测capacity | 重量/体积(源码) | 是否可充电 |
|---|---|---|---|---|---|---|
light_minus_battery_cell | 纽扣电池(LIR2032/DL2032) | BATTERY_ULTRA_LIGHT | 2 | 2 | 3 g / 1 ml | 是(RECHARGE) |
light_minus_disposable_cell | 纽扣电池(CR2032) | BATTERY_ULTRA_LIGHT | 2 | 2 | 3 g / 1 ml | 否 |
light_cell_rechargeable | AA(NiMH,如 ENERGIZER NH15-2300) | BATTERY_LIGHT | 10 | 10 | 27 g / 8 ml | 是 |
light_battery_cell | AA(锂铁,如 ENERGIZER L91) | BATTERY_LIGHT | 16 | 16 | 15 g / 8 ml | 否 |
medium_battery_cell | 18650(锂离子) | BATTERY_MEDIUM | 56 | 56 | 85 g / 17 ml | 是 |
heavy_battery_cell | 小型电动工具电池(如牧田 18V BL1815N) | BATTERY_HEAVY | 259 | 259 | 350 g / 382 ml | 是 |
heavy_plus_battery_cell | 大型电动工具电池(如牧田 18V BL1850B) | BATTERY_HEAVY | 503 | 503 | 680 g / 525 ml | 是 |
(数据来源:data/json/items/battery.json,capacity单位即 kJ,与ammo_type: "battery"的弹药单位一致。)
此外该文件还包含文档表格之外的扩展档位:heavy_atomic_battery_cell(4800 kJ,重 1.6 kg,BATTERY_HEAVY、不可充电、带放射性)与huge_atomic_battery_cell(100000 kJ 军用钚燃料电池,用于机甲)——它们说明这套档位体系是开放可扩展的,且原子电池同样复用BATTERY_HEAVY标志,印证了"以标志归类、以容量区分"的设计。
五倍能量密度的分级逻辑
从上表可以看出清晰的规律:每一档电池的能量约为上一档的 5 倍(2 → 10/16 → 56 → 259 → 503)。这意味着如果某个工具现实中需要 5 节 AA,游戏中就表达为一节 medium 电池。
这套规律让作者在换算时拥有一个非常顺手的经验法则:五节同级小电池 ≈ 上一级一节大电池。
匹配电池与设备:以"总运行时长"为核心的实操方法论
首要目标:让运行时长贴近现实
给游戏添加一个电池供电设备时,最重要、最需要做对的是整体运行时长(overall runtime)。具体流程是:
- 估算该设备在标准电池下能持续工作多久;
- 设定设备的功耗(
power_draw)与它接受的电池类型,使两者的组合大致还原该时长。
文档特别提醒:厂商在宣传电池续航时有强烈的误导动机,因此对厂商宣称数据要保持怀疑;但只要数据不过分离谱、或影响不大,就不必过度纠结精度。以下是精确度把握的取舍准则:
- 高功耗、续航短的设备:越需要谨慎校准。此类设备对功耗/容量误差极度敏感,差之毫厘可能让实际续航偏离目标数倍。
- 低功耗、或现实中设备容量远大于所需:容差很宽松,随便取一个合理的功耗即可。
- 现实中频繁快速耗尽电量的设备:更要避免高估或低估其续航能力(既不要让它太耐用,也不要让它瞬间没电)。
多节电池的换算规则
现实设备若装多节电池,按如下规则折算到单节游戏电池:
- 现实用5 节同级电池→ 游戏用高一级电池(五倍能量密度规律的直接应用)。
- 现实用2 节→ 用同级的一节 light 电池,并把功耗调低以匹配预期工作时长(2 节 AA 约 20–32 kJ,接近一节 light 的 10–16 kJ,故降功耗补偿)。
- 现实用3~4 节→ 用高一级的medium 电池,并把功耗调高以匹配预期工作时长。
文档给出的边界情形处理思路是:先用档位定容量,再用功耗校准时长。当然,也可以反过来寻找一个"电池节数更好匹配"的现实对应设备——作者拥有最终裁量权,一切以手感与真实感为准。
设备侧的落地方式:MAGAZINE_WELL + flag_restriction
电池与设备的匹配在 JSON 数据层面通过**弹匣井(MAGAZINE_WELL)+ 标志限制(flag_restriction)**实现。以盖革计数器为例(data/json/items/tool/electronics.json):
"pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "rigid": true, "flag_restriction": [ "BATTERY_LIGHT" ], "default_magazine": "light_battery_cell" } ], "tool_ammo": [ "battery" ]这段配置的含义是:设备有一个刚性弹匣井,只接受带BATTERY_LIGHT标志的电池(即 light 档),默认预装light_battery_cell;同时声明tool_ammo: [ "battery" ]表明它消耗的是电池弹药(kJ)。与之对称,电池侧则通过flags声明自己的档位(如BATTERY_MEDIUM),并通过pocket_data中的ammo_restriction: { "battery": N }声明可容纳的电量(data/json/items/battery.json)。
仓库中大量设备展示了多档兼容写法,例如 data/json/items/tool/electronics.json 允许BATTERY_MEDIUM/BATTERY_LIGHT/BATTERY_ULTRA_LIGHT三档通用,data/json/items/tool/electronics.json 则兼容全部四档——flag_restriction数组列出的标志越多,设备能接受的电池越广,这为作者提供了从"严格单档"到"全档通用"的弹性空间。
功耗设置与运行时的完整闭环
把上述机制串起来,一个典型电动工具的工作流是:
- 设备 JSON 声明
power_draw(如 data/json/items/tool/lighting.json 中"power_draw": "1 W"、"1200 mW"、"3 W"等)。 - 玩家装入符合
flag_restriction的电池,电池以 kJ 计的capacity成为设备的总能量储备。 - 设备激活后,每回合结算按 src/item_gun_tool_ammo.cpp 的逻辑从电池扣减
power_draw对应的能量,直到电量耗尽。
这条链路把"只建模容量"的设计原则、五倍档位体系和"运行时长第一"的内容制作准则无缝衔接,构成了 DDA 电池系统从设计文档到运行时的完整闭环。
面向内容作者的快速决策清单
给 DDA 添加新电池供电设备时,可按以下清单走完整个流程:
- 定档位:按设备功耗级别与真实对应物,从
BATTERY_ULTRA_LIGHT/BATTERY_LIGHT/BATTERY_MEDIUM/BATTERY_HEAVY四档中选档;高功耗工业级设备选 heavy,微功耗小玩意选 ultra-light。 - 换算容量:现实用几节电池?1 节 → 直接取对应档位;2 节 → 同档 light + 降功耗;3~4 节 → 上一档 medium + 升功耗;5 节 → 直接上一档。
- 设功耗:用
power_draw校准,目标是把"容量 ÷ 功耗"的续航拉到与现实接近;高功耗设备务必反复核对,低功耗设备可从宽。 - 接线:设备侧加
MAGAZINE_WELL+flag_restriction+default_magazine+tool_ammo: ["battery"];若需要新电池,参考 data/json/items/battery.json 的既有条目复制修改,并保留NO_SALVAGE/NO_UNLOAD/NO_RELOAD等基础标志与//真实规格注释。 - 验证:在游戏中实际开机运行,检查续航是否符合预期时长;必要时微调
power_draw而非更换电池档位。
总结
Cataclysm-DDA 的电池与电力体系是一套深思熟虑的抽象:用容量(kJ)统一表达电能、用四档尺寸等级压缩电池型号、用标志系统(BATTERY_*)与弹匣井完成设备匹配、用"运行时长第一"的准则指导内容制作。它牺牲了电学细节的真实性,换来了内容创作与玩家推理上的极低认知负担——而文档 doc/design-balance-lore/batteries_and_electricity.md 所记录的,正是这一整套妥协背后"为什么这么做"的设计哲学。对于想要为 DDA 添加新设备、或想理解其道具模拟深度的开发者来说,理解这套电池逻辑,就是理解 DDA 内容设计方法论的一把钥匙。
【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考