4.6 KiB
4.6 KiB
M4 module-npc 与 module-combat 联合编排基线(2026-04-21)
更新时间:2026-04-22
0. 文档目标
本文件只冻结一件事:
在不污染 module-npc 纯领域边界的前提下,把 npc_fight / npc_spar 从“只返回 BattlePending 语义”推进到“可在 spacetime-module 聚合层同步创建 battle_state”的最小联合编排口径。
这不是完整 resolve_story_action 设计,也不是完整战斗奖励编译、经验预算和剧情续写迁移。
1. 本轮落地范围
本轮只落实下面 4 件事:
- 明确
module-npc继续只负责 NPC 交互语义,不直接依赖module-combat。 - 在
spacetime-module聚合层新增resolve_npc_battle_interaction_and_returnprocedure。 - 让该 procedure 在同一事务内完成:
resolve_npc_interactionbattle_state初始化写入
- 返回统一结果,供后续
spacetime-client/ Axum facade 直接消费。
2. 为什么不把 battle 初始化塞进 module-npc
原因很直接:
module-npc当前职责是npc_state / relation_state / stance_profile / interaction contract。battle_state属于module-combat真相,不应倒灌进 NPC 领域 crate。- 如果把玩家 HP / MP、战斗生命、故事会话 ID 这些字段直接塞进
ResolveNpcInteractionInput,会把module-npc再次膨胀成跨子域入口。
因此本轮明确冻结为:
module-npc- 继续只返回
BattlePending + battle_mode
- 继续只返回
spacetime-module- 负责把 NPC 交互结果编排成真正的
battle_state
- 负责把 NPC 交互结果编排成真正的
3. 新增 procedure 口径
3.1 名称
新增:
resolve_npc_battle_interaction_and_return
3.2 输入
首版输入冻结为:
npc_interaction- 原样复用
ResolveNpcInteractionInput - 当前只允许
npc_fight / npc_spar
- 原样复用
story_session_idactor_user_idbattle_state_id- 允许为空
- 为空时按
updated_at_micros自动派生
player_hpplayer_max_hpplayer_manaplayer_max_manatarget_hptarget_max_hpexperience_reward- 由上游作为已编译好的确定奖励透传
- 当前允许为
0
reward_items- 类型固定为
Vec<module-runtime-item::RuntimeItemRewardItemSnapshot> - 只承接已经编译好的战利品快照,不在 procedure 内现场生成
- 类型固定为
3.3 输出
当前返回:
interactionmodule-npc::NpcInteractionResult
battle_statemodule-combat::BattleStateSnapshot
也就是说,这个 procedure 明确是一个聚合返回口径,不是新的底层领域真相。
4. 当前事务流程
单次调用按下面顺序执行:
- 校验
story_session_id / actor_user_id - 校验
interaction_function_id必须是:npc_fightnpc_spar
- 先执行
resolve_npc_interaction_record- 写入最新
npc_state - 拿到
NpcInteractionResult
- 写入最新
- 从
NpcInteractionResult.battle_mode映射出BattleMode - 组装
BattleStateInput- 透传
experience_reward - 透传
reward_items
- 透传
- 复用
module-combat的validate_battle_state_input - 插入
battle_state - 返回:
interactionbattle_state
5. 当前刻意未做
本轮明确不做下面这些扩张:
- 不在这个 procedure 里直接发经验
- 不在这个 procedure 里直接记
chapter_progression - 不在这个 procedure 里直接写
story_event - 不在这个 procedure 里现场计算掉落或经验预算
- 不在这个 procedure 里直接执行
inventory_slot发物 - 不在这个 procedure 里直接接
resolve_combat_action - 不在这个 procedure 里推导敌方等级、强度、掉落预算
也就是说,这一层当前只解决:
NPC 宣告开战后,如何立刻把 battle 真相表连同已编译奖励真相一起建立起来。
6. 与现有文档的关系
本文件是对下面两份基线文档的补充,而不是替代:
M4_MODULE_NPC_SPACETIMEDB_BASELINE_2026-04-21.md- 继续定义 NPC 领域 contract
M4_MODULE_COMBAT_SPACETIMEDB_BASELINE_2026-04-21.md- 继续定义 battle_state 与单行为战斗推进规则
新增编排只发生在 spacetime-module 聚合层。
7. 下一步建议
在这条最小联合编排稳定后,后续按下面顺序推进最稳:
- 把 Node 侧
monster_drop/ hostile reward 编译逻辑收口到 Rust 聚合层。 - 再把章节自动定级、敌对经验预算和
chapter_progression所需章节上下文收口进 battle 初始化编译器。 - 最后把这条链收口进完整
resolve_story_action。