240 lines
9.5 KiB
Markdown
240 lines
9.5 KiB
Markdown
# 《大厂保卫战:最后的打工人》- 任务计划 v1.0
|
||
**日期:** 2026-03-21
|
||
**目标:** 在 Next.js 项目中,用 Phaser.js 实现完整的第一关塔防游戏
|
||
**设计文档:** `design-system/大厂保卫战/MASTER.md`
|
||
**需求文档:** `.docs/prd-tower-defense-game.md`
|
||
|
||
---
|
||
|
||
## 功能优先级
|
||
|
||
| 优先级 | 功能 | 说明 |
|
||
|--------|------|------|
|
||
| P0 | 游戏基础框架 + 主页入口 | Next.js 页面 + Phaser.js 集成 + 地图渲染 |
|
||
| P0 | 防御塔系统 | 4种塔的部署、攻击、精力管理 |
|
||
| P0 | 怪物波次系统 | 6波怪物 + 路径寻路 + 战斗逻辑 |
|
||
| P1 | 周报结算系统 | 第3波后触发的黑话问答弹窗 |
|
||
| P1 | 特殊技能与摸鱼机制 | 各塔特殊能力 + 精力恢复 + 咖啡购买 |
|
||
| P1 | 胜利/失败结算界面 | 钉钉风格弹窗 + 绩效评级 |
|
||
| P2 | 怪物头顶语录飘字 | 100条黑话随机飘过 |
|
||
|
||
---
|
||
|
||
## Phase 1(当前批):游戏基础框架 + 主页
|
||
|
||
**目标:** 搭建可运行的 Next.js + Phaser.js 框架,渲染 S 型地图,部署基础塔,实现预设路径怪物移动
|
||
|
||
### 任务列表
|
||
|
||
- [ ] **Task 1A: 安装依赖 + 创建游戏入口页面**
|
||
- 批次:当前批
|
||
- 执行方式:串行(基础设施)
|
||
- 前置依赖:无
|
||
- 目标:
|
||
- 安装 `phaser` npm 包
|
||
- 创建 `app/game/page.tsx`:Next.js 游戏页面(`use client`)
|
||
- 创建 `app/page.tsx`:主页(游戏封面 + 进入游戏按钮,覆盖模板原有页面)
|
||
- 字体:从 Google Fonts 加载 Press Start 2P + VT323
|
||
- 涉及范围:
|
||
- `package.json`(添加 phaser 依赖)
|
||
- `app/page.tsx`(主页重写)
|
||
- `app/game/page.tsx`(游戏页面新建)
|
||
- `app/layout.tsx`(添加字体 import)
|
||
- `app/globals.css`(游戏全局样式)
|
||
- 验收标准:访问 `/game` 页面不报错,主页显示游戏封面
|
||
- 验证方式:`curl -s http://localhost:13000/game | grep -c "html"`
|
||
|
||
- [ ] **Task 1B: Phaser.js 游戏核心框架**
|
||
- 批次:当前批
|
||
- 执行方式:串行(依赖 1A)
|
||
- 前置依赖:Task 1A 完成
|
||
- 目标:
|
||
- 创建 `game/` 目录(游戏源码目录,非 Next.js app 目录)
|
||
- 实现 `game/GameScene.ts`:主游戏场景,S型地图渲染(16x12格,格子48px)
|
||
- 实现 `game/config.ts`:Phaser 配置(Canvas 1280x720,transparent background)
|
||
- 实现 `game/constants.ts`:游戏常量(地图路径坐标、HC初始值200、KPI初始100等)
|
||
- 实现 `game/GameManager.ts`:游戏状态管理(HC、KPI、波次、游戏状态)
|
||
- 在 `app/game/page.tsx` 中挂载 Phaser Game 实例(useEffect)
|
||
- 涉及范围:
|
||
- `game/config.ts`
|
||
- `game/constants.ts`
|
||
- `game/GameScene.ts`
|
||
- `game/GameManager.ts`
|
||
- `app/game/page.tsx`
|
||
- 关键实现细节:
|
||
- S型路径坐标:`[(0,2),(7,2),(7,9),(15,9)]`,格子大小 48px
|
||
- 地图背景:深色办公室风格(`#0A1628`),路径用深褐色(`#2D1B00`)
|
||
- 可建塔区域:路径以外的格子,点击触发建塔UI
|
||
- 所有 Phaser 相关代码只在客户端运行(SSR 需跳过)
|
||
- 验收标准:浏览器显示游戏地图,S型路径可见,格子可点击
|
||
- 验证方式:启动开发服务器后访问 `/game`
|
||
|
||
- [ ] **Task 1C: 防御塔基础系统(部署+攻击+精力)**
|
||
- 批次:当前批
|
||
- 执行方式:串行(依赖 1B)
|
||
- 前置依赖:Task 1B 完成
|
||
- 目标:
|
||
- 实现 `game/towers/TowerBase.ts`:塔基类(位置、成本、攻速、精力、攻击范围)
|
||
- 实现 4 种塔:
|
||
- `game/towers/InternTower.ts`(00后实习生,50HC,近战)
|
||
- `game/towers/SeniorDevTower.ts`(P6资深开发,120HC,远程直线)
|
||
- `game/towers/PPTMasterTower.ts`(PPT大师,100HC,范围减速)
|
||
- `game/towers/HRBPTower.ts`(HRBP,80HC,辅助Buff)
|
||
- 实现 `game/towers/TowerManager.ts`:塔的部署管理、攻击目标选择
|
||
- HUD 底部:塔选择栏(4个卡片,显示名称、成本、当前可选状态)
|
||
- 点击地图格子后弹出确认浮层,扣除 HC 后放置塔
|
||
- 塔的精力条显示(进度条悬浮在塔上方)
|
||
- 涉及范围:
|
||
- `game/towers/` 目录(5个文件)
|
||
- `game/GameScene.ts`(集成塔管理器)
|
||
- `game/ui/TowerPanel.ts`(底部塔选择 HUD)
|
||
- 验收标准:可以点击格子选塔,扣除 HC 后塔出现在地图上,塔有精力条
|
||
- 验证方式:手动游玩验证
|
||
|
||
- [ ] **Task 1D: 怪物波次系统(路径寻路+战斗)**
|
||
- 批次:当前批
|
||
- 执行方式:串行(依赖 1B)
|
||
- 前置依赖:Task 1B 完成(可与 1C 并行)
|
||
- 执行方式:并行(P1-游戏核心)(与 1C 并行)
|
||
- 关键实现细节:
|
||
- 实现 `game/enemies/EnemyBase.ts`:怪物基类(血量、移速、路径跟随、受伤、死亡)
|
||
- 实现 4 种怪物:
|
||
- `game/enemies/FreshGraduate.ts`(校招应届生:30HP,快速,数量多)
|
||
- `game/enemies/OldEmployee.ts`(35岁老员工:150HP,慢速,经验护盾)
|
||
- `game/enemies/TroubleMaker.ts`(职业碰瓷王:80HP,死亡扣20HC)
|
||
- `game/enemies/BossVP.ts`(空降VP:800HP,组织架构调整技能)
|
||
- 实现 `game/enemies/WaveManager.ts`:波次管理器(6波配置、波次间隔、怪物生成)
|
||
- 实现路径跟随:沿预设路径坐标数组移动,到达终点扣除 KPI
|
||
- 实现攻击目标选择:塔选择射程内最近怪物
|
||
- 对象池:复用怪物对象,避免频繁 GC
|
||
- 怪物头顶显示血条
|
||
- 涉及范围:
|
||
- `game/enemies/` 目录(6个文件)
|
||
- `game/GameScene.ts`(集成波次管理器)
|
||
- 验收标准:第1波10只应届生沿S型路径走到终点,KPI 正确扣减
|
||
- 验证方式:手动游玩第1波
|
||
|
||
---
|
||
|
||
## Phase 2(下一批):游戏玩法完整化
|
||
|
||
**目标:** 实现周报结算、特殊技能、完整6波、胜利/失败界面
|
||
|
||
- [ ] **Task 2A: 周报结算系统 + 特殊技能**
|
||
- 批次:下一批
|
||
- 执行方式:并行(P2-玩法)
|
||
- 前置依赖:Phase 1 全部完成
|
||
- 目标:
|
||
- 实现周报弹窗(第3波结束触发,10秒倒计时,3个黑话选项)
|
||
- 实现选对/超时/选错的结果逻辑
|
||
- 实现各塔特殊技能:整顿职场、代码屎山、黑话领域、打鸡血
|
||
- 实现摸鱼机制:点击塔花10HC买咖啡补满精力
|
||
- 涉及范围:
|
||
- `game/ui/WeeklyReportModal.ts`(周报弹窗)
|
||
- `game/data/buzzwords.ts`(黑话题库100条)
|
||
- 各塔文件的特殊技能方法
|
||
- 验收标准:第3波后弹出周报,选对获得奖励,特殊技能正常触发
|
||
|
||
- [ ] **Task 2B: 胜利/失败结算界面 + HUD完善**
|
||
- 批次:下一批
|
||
- 执行方式:并行(P2-玩法)
|
||
- 前置依赖:Phase 1 全部完成
|
||
- 目标:
|
||
- 失败结算:仿钉钉退群通知弹窗(KPI归零触发)
|
||
- 胜利结算:仿绩效评级界面(6波全部通过)
|
||
- 顶部 HUD 完善:KPI 进度条 + HC 数值实时更新
|
||
- BOSS 出现特效:全屏红色闪光 + 警告文字
|
||
- 怪物头顶语录飘字:100条黑话随机显示
|
||
- 涉及范围:
|
||
- `game/ui/VictoryModal.ts`
|
||
- `game/ui/DefeatModal.ts`
|
||
- `game/ui/HUD.ts`
|
||
- `game/data/quotes.ts`(100条语录)
|
||
|
||
---
|
||
|
||
## Phase 3(收尾批):体验优化
|
||
|
||
- [ ] **Task 3: 视觉polish + 适配优化**
|
||
- 批次:收尾批
|
||
- 前置依赖:Phase 2 完成
|
||
- 目标:
|
||
- Canvas 缩放适配(不同浏览器窗口大小等比缩放)
|
||
- CRT 扫描线效果(CSS叠加层)
|
||
- 霓虹发光按钮动效
|
||
- 音效模拟(Web Audio API,可跳过)
|
||
- 主页视觉完善(游戏截图预览、特性介绍)
|
||
|
||
---
|
||
|
||
## 技术关键点
|
||
|
||
### Phaser.js 在 Next.js 中的集成
|
||
```typescript
|
||
// app/game/page.tsx
|
||
'use client'
|
||
import { useEffect, useRef } from 'react'
|
||
|
||
export default function GamePage() {
|
||
const gameRef = useRef<Phaser.Game | null>(null)
|
||
|
||
useEffect(() => {
|
||
// 动态导入 Phaser(避免 SSR 报错)
|
||
import('phaser').then((Phaser) => {
|
||
import('@/game/config').then(({ gameConfig }) => {
|
||
gameRef.current = new Phaser.Game(gameConfig)
|
||
})
|
||
})
|
||
return () => {
|
||
gameRef.current?.destroy(true)
|
||
}
|
||
}, [])
|
||
|
||
return <div id="game-container" className="w-full h-screen" />
|
||
}
|
||
```
|
||
|
||
### 对象池模式
|
||
```typescript
|
||
// game/enemies/EnemyPool.ts
|
||
class EnemyPool {
|
||
private pool: EnemyBase[] = []
|
||
// 从池中获取怪物,没有则创建
|
||
acquire(type: EnemyType): EnemyBase { ... }
|
||
// 怪物死亡后回收
|
||
release(enemy: EnemyBase) { ... }
|
||
}
|
||
```
|
||
|
||
### 游戏数值常量
|
||
```typescript
|
||
// game/constants.ts
|
||
export const MAP_COLS = 16
|
||
export const MAP_ROWS = 12
|
||
export const TILE_SIZE = 48
|
||
export const CANVAS_WIDTH = MAP_COLS * TILE_SIZE // 768 (内部逻辑宽度,Phaser处理)
|
||
export const CANVAS_HEIGHT = MAP_ROWS * TILE_SIZE // 576
|
||
|
||
// S型路径坐标(格子坐标,非像素)
|
||
export const PATH_WAYPOINTS = [
|
||
{ x: 0, y: 2 }, // 入口(面试间)
|
||
{ x: 7, y: 2 }, // 第一个转折
|
||
{ x: 7, y: 9 }, // 第二个转折
|
||
{ x: 15, y: 9 }, // 出口(财务室)
|
||
]
|
||
|
||
export const INITIAL_HC = 200
|
||
export const INITIAL_KPI = 100
|
||
```
|
||
|
||
---
|
||
|
||
## 相关上下文
|
||
|
||
- PRD 文档:`.docs/prd-tower-defense-game.md`
|
||
- 设计系统:`design-system/大厂保卫战/MASTER.md`
|
||
- 开发规范:`@rules/dev-best-practices.md`
|
||
- 原子提交规范:`@rules/atomic-commit.md`
|
||
|
||
完成开发后,按 `@rules/atomic-commit.md` 规范,将变更按逻辑模块分组提交(禁止 `git add .`),确保所有文件均已 commit 后再结束任务。
|