# Task 2A+2B: 周报结算系统 + 特殊技能完善 + 胜利失败界面 + 怪物语录 ## 任务概要 在已完成的游戏基础框架上,实现周报结算弹窗(每3波触发)、完善各塔特殊技能、实现胜利/失败结算界面、以及怪物头顶语录飘字系统。 **前置条件**:Task 1A+1B+1C+1D 已完成,完整的游戏框架已运行。 ## 需要了解的已有文件 先读取以下文件了解现有实现: - `game/GameManager.ts`(游戏状态,了解事件系统接口) - `game/GameScene.ts`(主场景,了解如何集成新UI) - `game/ui/HUD.ts`(已有HUD,了解胜利/失败通知已有实现) - `game/enemies/WaveManager.ts`(了解波次完成事件是如何触发的) ## 实现内容 ### 1. 周报结算弹窗(`game/ui/WeeklyReportModal.ts`) **触发时机**:第3波结束后(WaveManager 已有 `onWeeklyReport` 回调) **弹窗设计**(全屏覆盖 DOM 层,仿钉钉/飞书全屏通知): ``` [全屏黑色半透明背景(z-index: 9999)] [中央弹窗卡片,深色背景 #1a1a2e,霓虹紫边框] 标题:"📊 周报提交时间!"(用 img/SVG 图标代替 emoji,或纯文字) 副标题:"请选择正确的互联网黑话,提交本周工作总结" [10秒倒计时进度条] — 顶部红色进度条,从满到空 3个选项卡片(随机从黑话题库选3个,其中1个是"正确答案"): [选项A] [选项B] [选项C] 答题结果区域(答题后显示): - 选对:绿色提示 "正确!获得奖励:+80 HC" 或 "全场精力已补满" - 选错/超时:红色提示 "答错了!老板视察3秒!全场塔禁锢!" ``` **黑话题库**(在 `game/data/buzzwords.ts` 中定义100条): ```typescript // 分为两类:正确答案类(互联网常见黑话)+ 干扰项 export const BUZZWORDS = [ // 正确答案(真实大厂黑话) "赋能", "对齐", "颗粒度", "打通", "闭环", "抓手", "生态", "赛道", "护城河", "降维打击", "底层逻辑", "顶层设计", "方法论", "复盘", "迭代", "串联", "拉齐", "落地", "沉淀", "跑通", "MVP", "ROI", "私域流量", "增量市场", "存量竞争", "心智占位", "势能积累", "组织赋能", "生态打通", "战略对齐", "价值共创", "协同增效", "降本增效", "提质增效", "精益管理", "敏捷开发", "极致体验", "用户心智", "品牌溢价", "流量变现", "私域运营", "全渠道", "中台建设", "数字化转型", "智能升级", "生态圈", "护城河", "弯道超车", "换道超车", "破圈", "出圈", "刷屏", "爆款", "现象级", "标杆案例", "对标", "copy from", "跑模型", // 干扰项(故意写错/不通顺的) "增熵赋能", "横向闭环", "负向对齐", "反底层逻辑", ] // 每次从 BUZZWORDS 随机取3个,其中第一个是"正确答案" // 随机打乱顺序后展示 export function generateWeeklyOptions(): { options: string[], correctIndex: number } { const shuffled = [...BUZZWORDS].sort(() => Math.random() - 0.5) const correct = shuffled[0] const options = [correct, shuffled[1], shuffled[2]].sort(() => Math.random() - 0.5) return { options, correctIndex: options.indexOf(correct) } } ``` **倒计时逻辑**: - 10秒倒计时,使用 `setInterval` - 超时自动触发"选错"结果 - 选择后立即停止倒计时,显示结果 2 秒后自动关闭弹窗 **结果逻辑**: ```typescript // 选对:随机50%概率给HC,50%概率补满精力 if (Math.random() > 0.5) { gameManager.addHC(50 + Math.floor(Math.random() * 50)) showResult('success', `获得 ${reward} HC!继续加油!`) } else { // 通知所有塔补满精力(通过 GameScene 的回调) onFullStamina() showResult('success', '全场精力已补满!') } // 选错/超时:触发全场塔禁锢3秒 onBossInspection() // 调用 GameScene 的回调,禁锢所有塔 showResult('error', '老板来视察了!全场禁锢3秒!') ``` ### 2. 完善胜利/失败界面(更新 `game/ui/HUD.ts` 或单独文件) 当前 HUD 可能已有简单的胜利/失败提示,需要升级为完整的模态弹窗。 **失败弹窗**(KPI 归零时触发,仿钉钉退群通知): ``` [弹窗容器,白色背景,仿钉钉卡片样式] [顶部蓝色条] 系统通知 [钉钉风格图标] 正文: 鉴于您近期的表现未能达成业务闭环, 经公司管理层研究决定, 对您进行"毕业"处理。 请于5分钟内归还工牌,不要带走办公文具。 [领取 N+1] (重新开始,刷新页面) [申请仲裁] (返回主页,跳转 /) ``` **胜利弹窗**(全6波清空后,仿绩效评级系统): ``` [弹窗容器,深色背景,金色边框] 标题:绩效评级公示 最终KPI: XX% 消灭怪物: XX只 剩余HC: XX 绩效等级: - KPI >= 80%: S级 "超出预期" - KPI >= 60%: A级 "达成预期" - KPI >= 40%: B级 "基本达成" - KPI < 40%: C级 "未达预期" 等级对应奖励描述(黑色幽默): - S级:"恭喜晋升为高级打工人!福报已在路上..." - A级:"表现良好,明年涨薪3%(扣去通胀后-2%)" - B级:"还需努力,下月开始996" - C级:"已被纳入待优化名单" [再战一局] (重新开始) [见好就收] (返回主页) ``` ### 3. 怪物头顶语录飘字(更新 `game/enemies/EnemyBase.ts`) EnemyBase 中的 `quoteText` 字段已预留。现在实现完整的语录系统: **`game/data/quotes.ts`**(100条语录分怪物类型): ```typescript export const QUOTES = { FreshGraduate: [ "求转正!", "我愿意加班!", "卷!卷!卷!", "内推有名额吗?", "实习补贴够买咖啡吗?", "我会CRUD!", "熟练掌握Word和Excel", "我有五年实习经验!", "大厂梦...", "期待来公司学习!", "我不需要工资,只需要经验!", "比同龄人卷!", ], OldEmployee: [ "我为公司立过功!", "我有10年经验!", "年龄不是问题!", "那时候还是我搭的架构", "当年我一个人顶三个人!", "这个需求做不了", "怎么可能这么快做完!", "文档?从来没有!", "测试?QA负责的!", "这是历史遗留问题", ], TroubleMaker: [ "录音笔已开启", "这是违法的!", "我要仲裁!", "劳动法第X条规定...", "我已咨询过律师", "保留证据中...", "你们的违规操作我都记录了", "看我不告你们!", ], BossVP: [ "我来教大家怎么做事", "你们缺乏战略眼光", "这不是执行力的问题", "格局太小了", "你们都不懂商业本质", "要有全局思维", "小事不过手,大事全拍板", "你们的方案需要颠覆性重构", "我在BAT做过这个", "先对齐一下认知", ], } ``` **语录飘字动效**: - 怪物出生后 0.5 秒显示语录(随机从该类型的语录库中取) - 字体:VT323,白色 - 文字在怪物头顶30px处显示 - 3秒后淡出(alpha 从1到0的 Tween 动画) - 文字跟随怪物移动 ### 4. 全场塔禁锢效果(`GameScene` 中添加) 当周报答错/超时时,触发"老板视察": ```typescript // 在 GameScene 中添加 freezeAllTowers(duration: number = 3000): void { this.towerManager.getAllTowers().forEach(tower => { tower.isFrozen = true // 视觉:塔变灰色 setTimeout(() => { tower.isFrozen = false // 视觉:恢复正常颜色 }, duration) }) } refillAllStamina(): void { this.towerManager.getAllTowers().forEach(tower => { tower.stamina = tower.maxStamina tower.isActive = true }) } ``` 在 TowerBase 的 `update()` 中检查 `isFrozen` 状态,如果为 true 则跳过攻击。 ## 验收标准 1. 第3波全部怪物消灭后,弹出周报弹窗,有10秒倒计时 2. 选对答案:随机给予HC奖励或补满精力 3. 选错/超时:全场塔3秒无法攻击(显示灰色) 4. KPI归零时:弹出仿钉钉失败弹窗,两个按钮功能正确 5. 第6波全部消灭后:弹出绩效评级胜利弹窗,根据最终KPI显示正确等级 6. 所有怪物头顶有飘字语录,随怪物移动,3秒后淡出 ## 相关上下文 - 设计系统:`design-system/大厂保卫战/MASTER.md` - PRD:`.docs/prd-tower-defense-game.md` - 计划文档:`.docs/plans/2026-03-21-tower-defense-game.md` - 开发规范:`@rules/dev-best-practices.md`(**必须先阅读**) - 原子提交规范:`@rules/atomic-commit.md` 完成开发后,按 `@rules/atomic-commit.md` 规范,将变更按逻辑模块分组提交(禁止 `git add .`),确保所有文件均已 commit 后再结束任务。