5.4 KiB
5.4 KiB
M4 RPG Runtime Inventory SpacetimeDB 基座记录(2026-04-21)
更新时间:2026-04-21
0. 文档目标
本文件只记录一件事:
把 module-inventory 从“只有 README 占位”推进到“已有首版背包领域契约、SpacetimeDB inventory_slot 真相表与 apply_inventory_mutation reducer”的真实落地结果。
本轮目标不是一次性迁完 Node 版所有背包玩法,而是先把后续 story / quest / runtime-item / npc 都能稳定复用的最小背包真相源立起来。
1. 本轮落地范围
本轮只落实下面 4 件事:
- 新增
server-rs/crates/module-inventory/真实 crate,而不是继续停留在 README 占位。 - 在
module-inventory中冻结inventory_slot、apply_inventory_mutation的首版领域类型、输入输出和字段校验 helper。 - 在
server-rs/crates/spacetime-module/中新增inventory_slot表。 - 在
spacetime-module中新增apply_inventory_mutationreducer,形成最小可编译背包主链。
2. 当前冻结的数据口径
2.1 inventory_slot
当前首版字段冻结为:
slot_idruntime_session_idstory_session_idactor_user_idcontainer_kindslot_keyitem_idcategorynamedescriptionquantityraritytagsstackablestack_keyequipment_slot_idsource_kindsource_reference_idcreated_atupdated_at
当前策略:
inventory_slot采用“单槽位即单真相行”的口径,不再把背包塞回 runtime snapshot 大 JSON。Backpack / Equipment统一进同一张表,通过container_kind + slot_key区分容器和装备位。- 首版堆叠不再依赖 Node 版的隐式 heuristic,统一冻结为
stackable + stack_key显式口径。
2.2 apply_inventory_mutation
当前首版只支持 4 类 mutation:
GrantItemConsumeItemEquipItemUnequipItem
当前策略:
GrantItem负责发放新物品,并在Backpack内按stack_key合并可堆叠物品。ConsumeItem负责安全扣减堆叠数量,数量归零时删除槽位。EquipItem负责把背包中的可装备物品移动到目标装备位,并自动把原装备挪回背包。UnequipItem负责把装备位物品退回背包。
3. 当前刻意未做
本轮明确没有扩到以下范围:
- 还没有落
UseItem / Craft / Dismantle / Reforge这类更高阶背包动作。 quest_turn_in奖励物品链当前已进入聚合 reducer 接线,但npc_trade、npc_gift仍未落专属 reducer。- 当前已经补上最小同步查询切片
GET /api/runtime/sessions/:runtimeSessionId/inventory, 但还没有落背包 public view,也没有让前端直读inventory_slot。 - 还没有把 Node 版
inventoryMutationService.ts整体迁到 Rust,只先冻结首版真相表和最小规则。
也就是说,本轮只是把 module-inventory 的基座立起来,不宣称已经完成完整背包玩法迁移。
4. 关键规则冻结
4.1 非堆叠物品固定单槽位单数量
当前规则:
stackable = false的物品必须固定quantity = 1。- 可装备物品固定
equipment_slot_id != None且必须stackable = false。 - 后续如果要支持“同名但独立词缀装备”,继续沿用“一件装备一条
inventory_slot”。
4.2 装备切换不引入新真相副本
当前规则:
- 装备和卸下都只是在同一条
inventory_slot上切换container_kind + slot_key。 - 遇到同装备位冲突时,原装备直接回到
Backpack,不额外创建临时副本。 - 这样后续做 Axum façade 或前端 view 时,可以稳定用
slot_id追踪同一件物品。
4.3 背包真相优先,展示读模型后置
当前规则:
module-inventory只负责状态真相与 mutation 规则。- 若后续需要“前端背包列表”“装备面板读模型”,优先通过
view或 Axum façade 暴露。 - 不新增第二份背包真相副本,也不回退到多个 service 各自改 JSON。
5. 本轮新增的真实工程落点
5.1 新增 crate
server-rs/crates/module-inventory/Cargo.tomlserver-rs/crates/module-inventory/src/lib.rs
5.2 workspace 与主工程聚合
server-rs/Cargo.toml- 已把
crates/module-inventory纳入 workspace members
- 已把
server-rs/crates/spacetime-module/Cargo.toml- 已接入
module-inventory依赖
- 已接入
server-rs/crates/spacetime-module/src/lib.rs- 已接入
module-inventory类型 - 已新增
inventory_slot - 已新增
apply_inventory_mutation
- 已接入
6. 验证目标
本轮应至少验证:
module-inventorycrate 可以独立cargo check / cargo testspacetime-module能成功编译并接入新表与 reducer- 不会把现有中文内容写坏,编码检查继续通过
7. 下一步建议
按当前节奏,后续应继续按下面顺序推进:
- 在
module-inventory中继续补UseItem / Craft / Dismantle / Reforge对应的纯规则契约。 - 继续把
npc_trade / npc_gift / runtime-item发物链改成显式调用apply_inventory_mutation,并补齐 quest / treasure 之外的奖励入口。 - 在最小同步查询切片稳定后,再评估是否继续补
inventory view、旧前端背包读模型兼容或 public subscription。 - 最后再把 Node 版
inventoryMutationService.ts的玩法细节逐步迁走。