本文档说明如何安全扩展塔、敌人、关卡、波次、成就和设置。所有配置改动都应同步测试和相关设计文档。
| 文件 | 内容 |
|---|---|
src/config/towers.ts |
8 种塔的数值、目标、伤害、升级和 UI 说明 |
src/config/enemies.ts |
13 种敌人的生命、速度、抗性、奖励、飞行和技能 |
src/config/waves.ts |
早期关卡波次、地图字符转换、高级关卡生成器 |
src/config/levels.ts |
24 个战役关卡配置 |
src/config/achievements.ts |
100 个条件化成就 |
src/config/gameConfig.ts |
Canvas 尺寸、格子尺寸、颜色、运行时常量 |
共享类型定义在 src/types/index.ts。
新增塔需要修改:
src/types/index.ts:如需新的DamageType、ProjectileType或TargetFlag,先扩展类型。src/config/towers.ts:新增TowerConfig。src/entities/Tower.ts:如需新的命中特效或攻击逻辑,在实体中实现。src/renderer/CanvasRenderer.ts:新增可区分的塔视觉表现。src/ui/UIManager.ts:确认塔卡和说明面板能自动读取字段。src/core/Game.ts:如果要支持快捷键,需要新增按键映射。- 测试和文档:更新配置测试、玩法文档和 PRD/GDD。
TowerConfig 必填字段:
{
id: string;
name: string;
cost: number;
range: number;
damage: number;
fireRate: number;
projectileType: ProjectileType;
damageType: DamageType;
targetFlags: TargetFlag[];
color: string;
role: string;
description: string;
special: string;
usage: string;
upgrades: UpgradeConfig[];
}塔说明验收:
role是 2-4 个字的定位。description说明基础职责。special说明特殊机制。usage说明推荐摆放或克制场景。- 支援类塔可以
damage = 0、fireRate = 0、targetFlags = [],但 UI 仍必须解释用途。
新增敌人需要修改:
src/config/enemies.ts:新增EnemyConfig。src/entities/Enemy.ts:如有新能力,接入移动、受伤或死亡逻辑。src/renderer/CanvasRenderer.ts:新增敌人外观差异。src/config/waves.ts:把敌人放入合适波次。- 测试和文档:更新配置测试、敌人说明和平衡记录。
EnemyConfig 关键字段:
hp:基础生命。speed:格/秒。armor:削减物理伤害。magicResist:削减魔法类伤害。reward:击杀金币。flying:是否忽略地面寻路。ability:普通敌人特殊能力。bossSkill:Boss 技能。
平衡建议:
- 高速敌人不要同时拥有过高血量。
- 飞行敌人的出现需要提前给玩家防空准备窗口。
- 支援敌人和自爆敌人应在波次预览中容易识别。
- Boss 应测试 1x/2x/3x 速度下的稳定性。
WaveConfig 使用组配置:
{
wave: number;
groups: [
{ type: 'slime', count: 10, interval: 0.6, delay: 0 }
],
bonus: 50
}字段含义:
| 字段 | 说明 |
|---|---|
type |
必须存在于 ENEMY_CONFIGS |
count |
该组敌人数量 |
interval |
同组出怪间隔,单位秒 |
delay |
当前组开始前延迟,单位秒 |
bonus |
波次结束奖励 |
波次设计建议:
- 每关前 1-2 波用于提示该关核心压力。
- 引入新敌人时先少量出现,再组合出现。
- 飞行波前应确保玩家有足够金币购买至少一种防空塔。
- Boss 波不要同时塞入过多首次出现的机制。
新增关卡需要修改:
src/config/levels.ts:新增LevelConfig。src/config/waves.ts:新增或复用地图网格和波次生成函数。src/ui/MenuManager.ts:如果选关布局依赖数量或章节,需要确认显示。src/config/achievements.ts:关卡通关、三星和章节成就会根据LEVEL_CONFIGS自动派生,但仍需跑测试确认数量。- 文档:更新 README、PRD/GDD、玩法指南和平衡记录。
LevelConfig 要求:
width / height必须和grid尺寸一致。grid必须包含spawn和core。spawns / cores应和grid中的出生点、核心点一致。- 所有入口至少能到达一个核心。
- 可建造区域必须足够塑形,但不能轻易一两塔堵死。
地图字符和格子含义以 waves.ts 的转换函数为准。当前运行时支持的 CellType:
| 类型 | 是否可走 | 是否可建塔 | 寻路成本/效果 |
|---|---|---|---|
path |
是 | 否 | 成本 1 |
spawn |
是 | 否 | 成本 1 |
core |
是 | 否 | 成本 1 |
buildable |
是,除非有塔 | 是 | 成本 5 |
forest |
是,除非有塔 | 是 | 成本 3,地形减速 |
lava |
是 | 否 | 成本 7,地形伤害 |
water |
否 | 否 | 不可通行 |
obstacle |
否 | 否 | 不可通行 |
成就配置在 src/config/achievements.ts。当前成就包括核心成就、关卡通关、关卡三星、章节通关、章节三星、击杀里程碑、无尽波次、金币、路径长度、Boss 击杀和战役星数。
新增条件时需要:
- 扩展
AchievementCondition联合类型。 - 在
isAchievementUnlocked()中实现判定。 - 确认
AchievementContext能提供所需数据。 - 更新测试,确保成就可被完整存档上下文解锁。
- 更新玩法和发布文档。
不要新增无法通过当前存档或运行时数据判断的成就。
新增设置项需要修改:
src/systems/SettingsManager.tssrc/types/index.ts的SaveData.settingssrc/systems/SaveManager.ts的默认存档和迁移src/ui/MenuManager.ts的设置页 DOMsrc/core/Game.ts的applySettings()和事件监听- 测试、README、故障排查和发布清单
设置页验收:
- 控件不重叠。
- 标签和当前值对齐。
- 改动立即生效并保存。
- 重置后恢复默认值。
- 新 ID 唯一且命名稳定。
- 所有引用 ID 都存在。
- 文案字段完整、玩家可读。
- 数值不会让早期关卡破产或后期关卡失控。
-
npm run test -- --run通过。 - 涉及构建或 UI 时
npm run build通过。 -
docs/Balance-Notes.md记录了数值变化原因。 - README 和相关设计文档中的数量信息已同步。