Files
TinyWaste/docs/13-运行时引擎与核心系统深化设计.md
virtheart 6234a50bdb feat: 实现避难所仓储系统与生存状态HUD改进
- 新增避难所仓储功能,支持物品在随身背包与仓储间转移
- 添加生存状态图标资源与状态阈值告警系统
- 重构HUD界面,优化状态显示与操作流程
- 扩展游戏核心系统,增加仓储相关动作和校验
- 更新文档说明仓储规则与实现细节
2026-04-28 22:58:49 +08:00

7.6 KiB

13 运行时引擎与核心系统深化设计

本文档补足“把游戏做好”所需要的核心系统设计,不只讨论 UI,而是把运行时引擎、生命周期、背包系统、生命系统、事件与在线存档串成一套完整方案。

13.1 当前产品定位

TinyWaste Online 不是网页式信息展示项目,而是一款:

  • 服务端权威结算的在线废土生存游戏
  • 以单屏 HUD 为常驻界面
  • 以系统弹窗/面板处理中频与低频操作
  • 以时间推进驱动状态、资源、事件和任务

这意味着架构设计要同时满足:

  • 决策节奏像游戏
  • 数据流像在线产品
  • 规则层像可测试的模拟器

13.2 运行时引擎分层

建议把“引擎”理解为运行时规则框架,而不是 3D 图形引擎。

13.2.1 Runtime Core

职责:

  • 接收玩家动作
  • 推进时间
  • 执行效果链
  • 更新世界状态
  • 产出新 GameView

当前仓库中主要由 packages/game-core/src/engine.ts 承担。

13.2.2 View Model Layer

职责:

  • 把内部 GameState 投影成适合 HUD 使用的 GameView
  • 控制哪些信息常驻、哪些信息放到弹窗层
  • 限制 UI 对领域状态的直接依赖

13.2.3 Content Layer

职责:

  • 维护物品、地点、敌人、任务、配方、事件定义
  • 所有玩法扩展优先靠数据增量,而不是写死分支逻辑

13.2.4 Persistence Layer

职责:

  • 用户身份
  • 云存档
  • 版本迁移
  • 存档校验

13.3 游戏生命周期

游戏生命周期建议明确分成 7 个阶段:

  1. boot
    • 客户端初始化、检查账号会话、读取配置
  2. session-ready
    • 已确认账号身份,开始拉取云端存档
  3. save-ready
    • 存档进入内存,HUD 可以渲染
  4. decision
    • 玩家阅读信息、选择动作
  5. resolving
    • 服务端执行动作、推进时间、写入日志
  6. interrupt
    • 战斗、事件、死亡、胜利等强制中断态
  7. persisted
    • 新状态完成落库,回到下一轮 decision

生命周期原则:

  • UI 永远不直接修改权威状态
  • 所有中断态都要可恢复
  • 任意动作完成后都应保证日志、时间、任务和存档状态同步

13.4 HUD 生命周期

主 HUD 只保留高频信息:

  • 时间
  • 生存状态
  • 当前地点
  • 行动入口
  • 角色装备摘要
  • 快捷栏

中频系统改用面板弹出:

  • 背包 / 避难所仓储
  • 蓝图
  • 任务
  • 完整日志

设计原因:

  • 更像真实游戏而不是网页后台
  • 减少主屏认知负担
  • 保证一屏内只承载“下一步决策需要的信息”

13.5 动作执行生命周期

一条标准动作链应为:

  1. 玩家发起动作
  2. 服务端校验动作是否合法
  3. 推进时间
  4. 结算状态消耗
  5. 结算地点资源与热度
  6. 结算掉落/交易/配方结果
  7. 检查事件、战斗、任务推进
  8. 写入日志
  9. 写入存档
  10. 返回新 GameView

这里最重要的是顺序一致性。只要顺序稳定,玩家就能理解“为什么会掉血、为什么这里空了、为什么事件触发了”。

13.6 背包系统设计

13.6.1 当前正确方向

当前采用体积容量,而不是无限背包,这是对的。

原因:

  • 废土游戏的核心就是取舍
  • 容量限制会自然驱动路线规划、补给管理和交易行为
  • 比单纯格子背包更贴合生存题材

13.6.2 背包分层

建议将背包拆成 3 层:

  • Quick Slots
    • 高频立即使用
    • 水、药、近战、少量工具
  • Field Bag
    • 当前随身背包
    • 受体积限制
  • Shelter Storage
    • 基地仓储
    • 用于长线积累

当前项目已经有 Quick Slots + Inventory 雏形,下一步建议补 Shelter Storage

当前实现进度:

  • 已经落地 Field Bag + Shelter Storage 双层库存
  • 仅位于 home / Shelter-7 时可访问避难所仓储
  • 避难所内制作会同时读取背包与仓储材料,避免资源可见却不可用

13.6.3 物品状态

每个背包物品后续建议支持:

  • itemId
  • count
  • durability
  • quality
  • boundFlag(任务物品或不可丢弃)
  • sourceTag(掉落来源,便于日志和分析)

13.6.4 背包交互原则

  • 主 HUD 只显示快捷栏和容量摘要
  • 完整背包在弹窗面板中查看
  • 装备/使用/整理/分类都应在背包面板完成
  • 背包面板必须优先展示“对当前生存决策有帮助的信息”

13.7 生命系统设计

生命系统不应只是一根血条,而是一组相互耦合的生存状态。

13.7.1 核心状态

  • 生命 life
  • 饥饿 hunger
  • 口渴 thirst
  • 精力 energy
  • 理智 sanity
  • 辐射 radiation

13.7.2 设计原则

  • 生命是最终硬失败边界
  • 饥饿与口渴是持续性压力来源
  • 精力限制连续行动长度
  • 理智影响事件与长期稳定性
  • 辐射是高风险区域的长期代价

13.7.3 阈值式生命系统

建议后续把状态效果从“单纯数值显示”升级成阈值逻辑:

  • safe
  • strained
  • critical
  • collapsed

每个阶段绑定不同惩罚:

  • 命中修正
  • 额外时间成本
  • 事件风险提升
  • 治疗效率下降
  • 逃跑成功率下降

13.7.4 生命系统与 UI

主 HUD 只显示数值和条形图还不够,应该同步显示:

  • 当前生存威胁
  • 原因解释
  • 恢复路径提示

例如:

  • “脱水:口渴已压缩行动余量”
  • “疲劳:建议短休或回避高风险搜刮”

13.8 战斗系统设计

战斗不应该吞掉整个游戏,而应该是风险系统的一种表现。

13.8.1 当前定位是对的

当前仓库使用“距离 + 回合 + 动作选择”的轻量模式,这是合理的。

13.8.2 下一步建议

  • 加入更清晰的命中区间提示
  • 加入武器与状态联动的解释文本
  • 区分“战斗结束”和“战后结算”两个阶段
  • 把战斗弹窗升级为更完整的战斗面板

13.8.3 战斗生命周期

  1. 遭遇初始化
  2. 玩家选择动作
  3. 双方结算
  4. 更新距离与生命
  5. 写入战斗日志
  6. 判断胜负/逃跑
  7. 战后掉落与任务推进

13.9 事件系统设计

事件是废土题材最重要的内容增幅器。

要求:

  • 事件必须能解释触发原因
  • 事件必须能绑定状态、物品、任务和地点条件
  • 事件必须能写出可追溯日志
  • 事件应该偏向“抉择”而不是“随机弹窗骚扰”

13.10 在线存档设计

作为账号制在线游戏,存档系统应被视为引擎的一部分。

13.10.1 必须保证

  • 动作完成后立即得到权威新状态
  • 存档和视图状态保持一致
  • 任意时刻掉线后能恢复到最近稳定节点

13.10.2 建议增加

  • 多存档槽
  • 存档版本迁移日志
  • 后端动作审计
  • 非法状态回滚策略

13.11 当前代码层面的下一批重点

  1. 当前已拆出的运行时模块:
    • inventory-system
    • place-system
    • effect-system
    • survival-system
    • quest-system
    • view-projection
  2. 下一轮继续拆出:
    • combat-system
    • event-system
  3. 为状态阈值、背包容量、战斗结算分别补单元测试
  4. 继续强化基地仓储:分类、批量整理、仓储专属配方
  5. 为背包、任务、蓝图面板补筛选与分类
  6. 为状态系统引入更明确的阶段化惩罚定义

13.12 结论

真正像游戏的关键,不是把更多信息摆上屏,而是:

  • 明确主循环
  • 明确系统边界
  • 明确高频与低频交互分层
  • 明确权威状态和表现层职责

这也是本轮把背包、任务、蓝图、日志转成系统弹窗的原因。主 HUD 应该负责“让玩家立刻决定下一步”,而完整系统面板负责“深入管理和规划”。