# 08 技术架构与代码导读

本文档定义“新项目重制版”的目标技术架构，并说明为何要从旧版的全局脚本结构迁移到现代工程化。该文档同时作为程序端的模块边界约定，避免后期职责混乱与重复实现。

## 8.1 技术目标

- 现代工程化：TypeScript、模块化、自动化测试、CI
- 数据驱动：内容配置可热更新（至少开发期热更新），线上可增量发布内容包
- 可重放：随机数与模拟可注入 seed，便于复现与平衡
- 可观测：结构化日志与埋点，便于 QA/分析
- 可扩展：系统之间低耦合，内容扩展不引发代码级联改动

## 8.2 总体架构（客户端）

推荐架构分层：

- Presentation（UI 层）：界面渲染与交互
- Application（应用层）：用例编排（例如“执行一次采集”）
- Domain（领域层）：规则与模型（状态、战斗、事件、任务、时间推进）
- Data（数据层）：内容配置加载、存档读写、远端 API

```mermaid
flowchart TB
  UI[UI: React/Canvas/纯DOM均可] --> APP[Application: 用例与指令]
  APP --> DOM[Domain: 规则引擎与模型]
  DOM --> RNG[RNG: 可注入种子]
  APP --> DATA[Data: 配置/存档/API]
  DATA --> CT[Content: 表与包]
  DATA --> SAV[Save: 本地/云端]
  DATA --> NET[Net: 后端API]
```

对应源文件：[architecture-client.mmd](./diagrams/architecture-client.mmd)

## 8.3 关键模块与职责边界

### 8.3.1 Simulation（时间推进）

职责：

- `advanceTime(Δt)`：统一时间推进管线
- 结算状态消耗、Buff tick、资源刷新、灾害计时
- 对外暴露“结算结果摘要”用于 UI 提示（不直接操作 UI）

边界：

- 不负责事件抽取（由 EventEngine 负责）
- 不直接读写存档（由 SaveService 负责）

### 8.3.2 Inventory（背包与容器）

职责：

- 容量计算（体积/堆叠）
- 移入移出、消耗、掉落
- 装备槽与耐久更新
- 随身背包与避难所仓储之间的转移

边界：

- 不负责“物品效果执行”（由 EffectEngine 执行）

### 8.3.3 EffectEngine（效果执行器）

职责：

- 执行配置化效果链：AddItem、AddStatus、AddBuff、SetFlag、StartCombat 等
- 保障效果执行顺序与事务性（可选：失败回滚）

边界：

- 不包含具体内容逻辑；内容差异通过配置表达

### 8.3.4 EventEngine（事件引擎）

职责：

- 事件池管理（全局/区域/地点/任务）
- 条件过滤、权重抽取
- 选项检定（属性/资源/标记）
- 返回事件给 UI；结果通过 EffectEngine 执行

### 8.3.5 CombatEngine（战斗引擎）

职责：

- 依据双方数据初始化战斗场景（距离、回合）
- 执行玩家动作与敌人 AI
- 输出结构化战斗日志

边界：

- 不直接改变全局状态；通过 EffectEngine 或 CombatResult 由上层应用写回

### 8.3.6 QuestEngine（任务引擎）

职责：

- 任务状态机（NotStarted/Active/Completed）
- 监听世界事件（到达地点、获得物品、完成战斗等）
- 驱动任务事件池与奖励发放

### 8.3.7 ViewProjection（视图投影层）

职责：

- 将 `GameState` 投影成 HUD 可直接消费的 `GameView`
- 产出生存阈值告警、仓储可访问性、战斗与事件视图
- 保证 UI 不需要反向猜测领域规则

### 8.3.8 ContentService（内容服务）

职责：

- 加载基础包与扩展包（版本、依赖、覆盖策略）
- 提供按 ID 与按标签检索能力
- 提供校验：唯一性、引用完整性、字段类型、循环依赖检查

### 8.3.9 当前代码映射

当前仓库中已经开始按模块边界落地：

- `packages/game-core/src/systems/inventory-system.ts`
- `packages/game-core/src/systems/place-system.ts`
- `packages/game-core/src/systems/effect-system.ts`
- `packages/game-core/src/systems/survival-system.ts`
- `packages/game-core/src/systems/quest-system.ts`
- `packages/game-core/src/view-projection.ts`

## 8.4 数据与配置组织（建议）

### 8.4.1 文件结构建议

- `content/base/*.json`：基础内容
- `content/packs/<packId>/*.json`：扩展包
- `content/locales/zh-CN.json`：文本本地化
- `content/schema/*.json`：JSON Schema（用于校验）

### 8.4.2 依赖与覆盖策略

- 包必须声明：
  - `packId`
  - `version`
  - `dependsOn`（可选）
  - `overrides`（可选，覆盖的目标与字段）
- 默认策略：追加；只有明确声明 overrides 才允许覆盖

## 8.5 随机与可重放

### 8.5.1 RNG 注入原则

- 任何概率行为必须来自同一个 RNG 实例（或可追踪的子 RNG）
- 每次行动生成子种子，保证“局部随机独立、整体可重放”

### 8.5.2 重放数据

为了复现 bug：

- 记录：初始 seed、玩家输入序列（动作与选项）、版本号、内容包版本
- 可导出一份 replay 文件给 QA

## 8.6 存档体系（概览）

存档应分层：

- `PlayerState`：状态、背包、装备、位置、任务进度
- `WorldState`：时间、地点资源存量、世界标记、灾害状态
- `ContentVersion`：内容包版本（用于兼容与迁移）

存档详细见：[09-存档与后端.md](./09-%E5%AD%98%E6%A1%A3%E4%B8%8E%E5%90%8E%E7%AB%AF.md)

## 8.7 旧版 TinyWaste 代码结构速览（用于迁移参考）

旧版项目（当前仓库）具备典型特点：

- 入口由 [loader.js](file:///Users/virtheart/Documents/CloneProjects/TinyWaste/data/loader.js) 动态加载多个 `data/*.min.js`
- 大量全局变量保存游戏状态（例如 `PLAYER_STATUS/BAG_DATA/MAP_DATA` 等）
- 时间推进由 [updateSysClock](file:///Users/virtheart/Documents/CloneProjects/TinyWaste/data/lib.js#L460-L510) 驱动，依赖 `setTimeout` 递归
- 快进逻辑在 [costTimeFunc](file:///Users/virtheart/Documents/CloneProjects/TinyWaste/data/action.js#L587-L682) 内实现，快进过程中暂停计时器
- 战斗 UI 与逻辑混在一起（见 [battleObj](file:///Users/virtheart/Documents/CloneProjects/TinyWaste/data/action.js#L2486-L2605)）

迁移目标：

- 将“全局状态 + DOM 操作”拆解为“领域模型 + 纯逻辑结算 + UI 渲染”
- 保留数据驱动思想，但用 Schema 与工具链保障质量

## 8.8 安全与反作弊（基础）

即使是单人游戏，也建议做到：

- 云端存档接口鉴权（token）
- 存档校验与限流，避免被滥用
- 客户端不保存敏感密钥

## 8.9 工程化与质量

- TypeScript 全覆盖
- 单元测试：
  - 时间推进管线
  - 事件抽取
  - 战斗计算
  - 存档迁移
- 内容校验：
  - CI 中运行 Schema 校验与引用完整性检查
