# 📋 第一部分:用户故事 (User Stories)
我们将整个游戏拆解为 4 个史诗任务 (Epics)。
### Epic 1: 桌面交互与核心卡牌系统 (The Board & Cards)
* **US1.1 自由拖拽:** 作为玩家,我希望能用鼠标在桌面上自由拖拽任意卡牌并放置在任何位置,以便我整理我的工作台。
* **US1.2 职业与初始卡组:** 作为玩家,我希望在游戏开局时能选择职业(如开发、产品),以便获得该职业专属的初始手牌(如“开发人员”、“PRD文档”)和基础资金。
* **US1.3 资源消耗与显示:** 作为玩家,我希望在屏幕顶部清晰看到当前 Sprint 的“剩余时间”和“项目资金”,以便我评估当前的生存压力。
### Epic 2: 堆叠合成与进度条 (Crafting & Processing)
* **US2.1 触发合成:** 作为玩家,我希望当我把一张卡牌(如“开发人员”)拖拽并覆盖到另一张有效卡牌(如“脏代码”)上时,它们会自动吸附并进入“合成中”状态。
* **US2.2 进度条反馈:** 作为玩家,我希望在“合成中”的卡牌组上方看到一个倒计时进度条,以便我知道还需要等多久才能产出结果。
* **US2.3 产出与概率:** 作为玩家,我希望进度条结束后,原有的消耗品卡牌消失,并在原位置弹射出新的产物卡(如“干净的代码”),并且支持概率掉落副产物(如 30% 掉落“Bug”卡)。
* **US2.4 无效堆叠拒绝:** 作为玩家,我希望当我把两张没有配方关联的卡牌叠在一起时(如“咖啡”叠“咖啡”),它们不会发生任何反应,并在松开鼠标时弹开,防止误操作。
### Epic 3: LLM 动态危机系统 (The AI Director)
* **US3.1 预警卡掩盖延迟:** 作为玩家,我希望在系统即将降临危机时,桌面上会先掉落一张带有 Loading 动画的【⚠️ 甲方正在输入...】卡牌,以便在等待网络请求时给我提供真实的压迫感。
* **US3.2 危机爆发:** 作为玩家,我希望 Loading 结束后,预警卡瞬间翻转为一张带有具体描述和倒计时的【红色危机卡】。
* **US3.3 危机解除:** 作为玩家,我希望能在倒计时结束前,将带有对应 Tag 的卡牌(如带有 `need_test` 标签的“测试员卡”)拖入危机卡的解决槽位中,以消除危机并获得资金奖励。
* **US3.4 危机惩罚:** 作为玩家,我希望如果危机卡倒计时归零我仍未解决,系统会立即执行惩罚(如扣除 50000 资金),若资金低于 0 则触发 Game Over。
### Epic 4: Roguelike 循环与结算 (The Loop)
* **US4.1 Sprint 结算:** 作为玩家,我希望在全局 Sprint 倒计时(如 3 分钟)结束且我存活时,系统暂停桌面,弹出胜利结算画面。
* **US4.2 局外成长 (3选1):** 作为玩家,我希望在结算画面能看到 3 个随机的奖励选项(如新卡牌、永久遗物、删除垃圾卡),我可以选择其一加入下一轮,以获得肉鸽游戏的成长快感。
---
# 🧪 第二部分:核心测试用例 (Test Cases)
这些测试用例主要针对**状态机逻辑**和**异步 API 处理**,这是 VibeCoding(AI 写代码)时最容易出 Bug 的地方。
### 模块一:合成状态机 (Crafting State Machine)
| 用例编号 | 测试模块 | 测试标题 | 前置条件 | 操作步骤 | 预期结果 (Expected Result) |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **TC-1.1** | 合成引擎 | **基础配方成功合成** | 桌面上有一张“开发”和“脏代码”,配方需 5 秒。 | 1. 将“开发”拖拽到“脏代码”上并松开。
2. 等待 5 秒。 | 1. 两张卡被锁定,出现 5 秒进度条。
2. 5秒后,两张卡消失,原地生成一张“干净的代码”。 |
| **TC-1.2** | 合成引擎 | **合成中途强行打断 (Edge Case)** | “开发”与“脏代码”正在读条合成中(第 2 秒)。 | 1. 玩家用鼠标强行拖走处于底部的“脏代码”卡。 | 1. 进度条立即取消。
2. 两张卡恢复独立状态,不产出任何新卡,也不消耗原有卡牌。 |
| **TC-1.3** | 合成引擎 | **多重副产物概率掉落** | 触发“脏代码”+“Vibe助手”配方(设定 100%产出模块,20%产出Bug)。 | 1. 连续触发该配方 10 次并观察产出。 | 每次必定产出“可用模块”,大约有 2 次额外在旁边掉落一张“Bug”卡。 |
### 模块二:LLM 危机触发与网络降级 (AI Director & Fallback)
| 用例编号 | 测试模块 | 测试标题 | 前置条件 | 操作步骤 | 预期结果 (Expected Result) |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **TC-2.1** | LLM 系统 | **正常的危机生成链路** | 游戏运行到第 30 秒,触发危机心跳检测。网络正常,API 延迟为 2 秒。 | 1. 观察桌面变化。
2. 等待 2 秒后。 | 1. 第30秒时,桌面上生成一张【预警卡】并播放 Loading 动画。
2. 第32秒时,预警卡瞬间变成【危机卡】,显示 LLM 返回的 JSON 描述,倒计时开始。 |
| **TC-2.2** | LLM 系统 | **API 超时兜底机制 (断网测试)** | 拦截或断开本地网络,触发危机心跳检测。设定超时阈值为 5 秒。 | 1. 观察桌面出现【预警卡】。
2. 计时等待超过 5 秒。 | 1. 前 5 秒维持 Loading 状态。
2. 第 5.1 秒,触发兜底机制,预警卡变为本地 JSON 表中的随机通用危机(如“服务器宕机”),游戏不会崩溃卡死。 |
| **TC-2.3** | LLM 系统 | **危机成功解除逻辑** | 桌面上存在一张危机卡,要求 `need_pm` (需要产品) 标签。 | 1. 拖拽一张无标签的“咖啡”上去。
2. 拖拽一张带 `need_pm` 标签的“产品经理”上去。 | 1. 拖拽咖啡无效,弹开。
2. 拖拽产品经理后,危机卡被锁定读条 3 秒,随后危机卡消失,顶部资金增加。 |
| **TC-2.4** | LLM 系统 | **危机超时惩罚触发** | 桌面上存在一张“资金扣除”危机卡(倒计时 10 秒,惩罚 50000)。 | 1. 玩家不进行任何操作,等待 10 秒倒计时归零。 | 1. 倒计时变为 0,危机卡爆裂并消失。
2. 顶部面板的【项目资金】瞬间扣除 50000。 |
### 模块三:核心循环与边界判定 (Core Loop Edge Cases)
| 用例编号 | 测试模块 | 测试标题 | 前置条件 | 操作步骤 | 预期结果 (Expected Result) |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **TC-3.1** | 全局状态 | **资金归零触发 Game Over** | 玩家当前资金为 10000。桌面存在一张惩罚为扣除 20000 的危机卡。 | 1. 让该危机卡倒计时归零触发惩罚。 | 1. 资金被扣至 -10000。
2. 游戏立即暂停,弹出“项目破产 (Game Over)”结算弹窗,无法继续拖拽卡牌。 |
| **TC-3.2** | 全局状态 | **倒计时结束正常结算** | 当前 Sprint 全局倒计时剩余 3 秒,资金为 5000,且桌面有一张正在读条的危机卡。 | 1. 等待 3 秒全局倒计时归零。 | 1. 游戏立即暂停,危机卡倒计时冻结。
2. 弹出“Sprint 成功”弹窗,进入 3选1 的 Roguelike 奖励界面。 |