Files
pixelheros/assets/script/game/map/gdd/rogue-spawning.md
walkpan 3893ec33d7 docs: add roguelike刷怪系统全套GDD文档
新增了肉鸽刷怪系统的完整设计文档,包括系统概述、核心规则、详细设计、公式推导、边界情况、依赖关系等内容,同时添加了系统索引和评审记录文档,完善了项目的GDD体系。
2026-05-15 12:22:09 +08:00

552 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Rogue Spawning System (肉鸽刷怪系统)
> **Status**: Designed (pending review)
> **Author**: walkpan + agents
> **Last Updated**: 2026-05-15
> **Implements Pillar**: Roguelike replayability & strategic depth
## Overview
肉鸽刷怪系统是控制每局游戏怪物生成的核心引擎。它从固定 30 波硬编码配置演进为**蓝图模板 + 权重填充 + 自适应微调**的三层程序化生成架构。主线 30 波分为 10 个难度阶梯(每档 3 波),每档内遵循"恢复→攀升→高潮"的心流节奏。10 种怪物类型配合 8 种词缀修饰,使同一基础怪物产生多种变体。通关后玩家可选进入无限模式,以分层推进方式无限挑战。自适应难度引擎追踪玩家表现,在 ±15% 范围内微调强度,确保始终处于心流通道内。
## Player Fantasy
本系统是玩家**间接体验**的基础设施——玩家不直接操作刷怪系统,而是通过英雄阵容选择和升级策略来应对它创造的变化。英雄根据类型和站位自动攻击,玩家的核心操控权在于**战前构建**而非**战中目标选择**。
**核心幻想:每次开局都是全新的挑战**
- "我的阵容能应对任何组合"——每波的怪物构成和词缀变体都不同,玩家的阵容选择、站位配置和升级路线决定了能否通关
- "不确定性带来的是刺激而非焦虑"——自适应难度确保不会出现过难或过易的无聊区间
- "通关后的无限挑战才是真正的考验"——无限模式是高手的舞台,每次突破极限都有成就感
- 心流节奏让玩家在紧张和放松之间交替,避免疲劳
**锚定时刻**:波间准备阶段,看到下一波怪物预览的瞬间,快速判断威胁构成(有自爆怪吗?有辅助治疗吗?有刺客突后排吗?),据此调整英雄站位、技能升级优先级和装备选择。决策发生在**构建层面**而非战斗层面。
## Detailed Design
### Core Rules
**规则 1三层生成架构**
每一波的怪物配置由三层依次决定:
1. **蓝图模板层**从模板池中抽取一个蓝图确定该波的类型REST/NORMAL/MIXED/ELITE/BOSS和怪物槽位骨架
2. **权重填充层**:根据蓝图中的槽位定义,从怪物池中按权重随机抽取具体怪物,填充数量
3. **自适应微调层**:根据玩家历史表现,对难度预算进行 ±15% 浮动调整
**规则 210 阶梯 × 3 波结构**
主线 30 波分为 10 个阶梯Tier每个 Tier 3 波:
| Tier | 波次 | 主题 | 新引入元素 | Boss |
|------|------|------|-----------|------|
| 1 | W1-3 | 入门教程 | Melee | - |
| 2 | W4-6 | 远程登场 | Long, Heavy | W6 MiniBoss |
| 3 | W7-9 | 刺客登场 | Assassin突后排威胁 | - |
| 4 | W10-12 | 辅助登场 | Support + 近远程刺协同 | W12 MiniBoss |
| 5 | W13-15 | 中期 Boss | Bomber, Summoner + 词缀系统首次出现 | **W15 MajorBoss** |
| 6 | W16-18 | 分裂时代 | Splitter死亡触发型 | - |
| 7 | W19-21 | 精英时代 | 词缀大量出现(全种类) | W21 MiniBoss |
| 8 | W22-24 | 全兵种混合 | 所有类型协同 | - |
| 9 | W25-27 | 终极压力 | 极限数量 | W27 MiniBoss |
| 10 | W28-30 | 最终 Boss | 全词缀组合 | **W30 FinalBoss** |
**规则 3档内三拍节奏**
每个 Tier 内 3 波遵循固定节奏模式:
- **Wave 1恢复**:从 REST 类模板池抽取,低难度预算,少量弱怪
- **Wave 2攀升**:从 NORMAL/MIXED/ELITE 类模板池抽取,中等难度预算
- **Wave 3高潮**Boss 档位从 BOSS 类模板抽取;非 Boss 档位从 MIXED 类模板抽取
例外Tier 1 Wave 1 为教程波固定使用特殊教程模板1 个 Melee 怪)。
**规则 4难度预算制**
每波有一个难度预算值,每只怪物"花费"一定预算:
```
wave_budget = base_budget[tier] × template_modifier × adaptive_factor
```
怪物成本:
| 类型 | 预算成本 |
|------|---------|
| Melee | 30 |
| Heavy | 50 |
| Long | 40 |
| Support | 50 |
| Bomber | 35 |
| Summoner | 60 |
| Assassin | 45 |
| Splitter | 55 |
| Boss (Melee/Long) | 200 |
词缀额外成本:
| 词缀 | 额外成本 |
|------|---------|
| Elite | +20 |
| Berserk | +15 |
| Shield | +25 |
| Regen | +20 |
| Swift | +10 |
| Giant | +30 |
| Chain | +20 |
| Summoner | +25 |
**规则 5蓝图模板池**
模板按类型分类,每个模板定义:
- `id`:唯一标识
- `type`REST / NORMAL / MIXED / ELITE / BOSS
- `tier_min`:首次可出现的最低档位
- `slots`:怪物槽位列表(类型池、数量范围、权重)
- `allow_affix`:是否允许词缀修饰
- `mandatory_slots`必须填充的槽位BOSS 类型必须包含至少 1 个 Boss 类型槽位)
**Boss 槽位强制规则**BOSS 类型模板的 `mandatory_slots` 必须包含至少 1 个 Boss 类型怪物MeleeBoss 或 LongBoss。填充算法必须优先放置强制槽位确保 Boss 波次始终包含 Boss 怪物。
**规则 5a权重填充算法**
```
function fill_wave(template, budget, tier, adaptive_factor):
monsters = []
// Step 1: 放置强制槽位Boss 等)
for slot in template.mandatory_slots:
monster_type = weighted_random(slot.type_pool, slot.weights)
monster_cost = base_cost[monster_type] + max_affix_cost(tier, slot)
if monster_cost <= budget:
monsters.append(create_monster(monster_type, tier))
budget -= monster_cost
// Step 2: 填充可选槽位,从高权重到低权重
remaining_slots = shuffle_by_weight(template.slots - mandatory_slots)
for slot in remaining_slots:
monster_type = weighted_random(slot.type_pool, slot.weights)
monster_cost = base_cost[monster_type] + estimated_affix_cost(tier)
while budget >= monster_cost and count(monster_type) < slot.max_count:
monsters.append(create_monster(monster_type, tier))
budget -= monster_cost
// Step 3: 预算不足时保底
if len(monsters) == 0:
monsters.append(create_monster(Melee, tier)) // 忽略预算
// Step 4: 预算利用率检查
utilization = total_cost(monsters) / original_budget
if utilization < 0.5: // 利用了不到一半预算,尝试补充
fill_remaining(budget, monsters, tier)
return monsters
```
填充策略说明:
- 强制槽位优先放置,不参与预算竞争
- 可选槽位按权重随机,每个槽位尽量填满 max_count
- 预算利用率目标 ≥ 70%(不足时触发补充)
- 保底规则:即使预算耗尽也至少生成 1 个 Melee
**规则 5b示例模板**
每种类型至少定义 3 个模板以验证预算系统可行性:
**REST 类型tier_min=1**
| ID | 槽位配置 | 说明 |
|----|---------|------|
| REST_01 | 1-2 × Melee(权重10) | 纯近战休息波 |
| REST_02 | 1 × Melee(8) + 1 × Long(4) | 轻混合休息波 |
| REST_03 | 2 × 随机(权重均分) | 随机轻波 |
**NORMAL 类型tier_min=1**
| ID | 槽位配置 | 说明 |
|----|---------|------|
| NORM_01 | 3-4 × Melee(10) | 近战群 |
| NORM_02 | 2 × Melee(6) + 2 × Long(6) | 标准混合 |
| NORM_03 | 2 × Melee(4) + 1 × Long(6) + 1 × Heavy(4) | 重型混合 |
**MIXED 类型tier_min=3**
| ID | 槽位配置 | 说明 |
|----|---------|------|
| MIX_01 | 2 × Melee(4) + 2 × Long(4) + 1 × Assassin(4) | 刺客突袭 |
| MIX_02 | 1 × Heavy(6) + 2 × Long(6) + 1 × Support(3) | 远程压制 |
| MIX_03 | 2 × Melee(4) + 1 × Long(4) + 1 × Assassin(4) + 1 × Bomber(3) | 多线威胁 |
**ELITE 类型tier_min=5, allow_affix=true**
| ID | 槽位配置 | 说明 |
|----|---------|------|
| ELIT_01 | 2-3 × 随机(权重均分, 必带词缀) | 精英小队 |
| ELIT_02 | 1 × Heavy(必带词缀) + 1 × Support(必带词缀) | 重装精英 |
| ELIT_03 | 2 × Assassin(必带词缀) + 1 × Long(必带词缀) | 精锐突袭 |
**BOSS 类型tier_min=2, mandatory_slots 包含 Boss**
| ID | 槽位配置 | 说明 |
|----|---------|------|
| BOSS_01 | 1 × MeleeBoss(强制) + 2-3 × Melee | 近战 Boss + 小怪 |
| BOSS_02 | 1 × LongBoss(强制) + 1-2 × Support | 远程 Boss + 治疗 |
| BOSS_03 | 1 × MeleeBoss 或 LongBoss(强制) + 1 × Assassin + 1 × Bomber | Boss + 精锐护卫 |
**规则 6词缀系统**
词缀是附着在基础怪物上的属性修饰,提供变体丰富度:
| 词缀 | 效果 | 首次出现 Tier |
|------|------|-------------|
| Elite | +50% HP, +30% AP | T5 |
| Berserk | 攻速 ×1.5 | T5 |
| Shield | 开局带伤害吸收盾20% HP | T6 |
| Regen | 每秒回复 2% HP | T7 |
| Swift | 移速 ×2 | T7 |
| Giant | ×2 体型, +100% HP, +50% AP | T8 |
| Chain | 攻击附带 50% 溅射伤害 | T9 |
| Summoner | 每 8 秒召唤 1 个小怪Melee1 级属性) | T10 |
词缀触发概率:
```
affix_chance = min(base_affix_chance[tier] × role_multiplier, 1.0)
base_affix_chance:
T1-T4: 0%
T5: 10%, T6: 15%, T7: 25%, T8: 30%, T9: 40%, T10: 50%
role_multiplier:
普通怪: 1.0x
MiniBoss: 2.0x
MajorBoss/FinalBoss: 3.0x
```
> **注**:概率上限为 1.0100%)。例如 T10 FinalBoss 的原始概率为 50%×3.0=150%,经 clamp 后为 100%(必出词缀)。每个词缀槽位独立判定概率,不超过角色类型的叠加上限。
词缀叠加上限:
- 普通怪:最多 1 个
- MiniBoss最多 2 个
- MajorBoss/FinalBoss最多 3 个
互斥组:
- Giant × Swift体型矛盾
- Regen × Shield防止过肉
- Summoner词缀× Summoner类型防止双倍召唤叠加
词缀属性加成采用**加法叠加**
```
affix_hp_multiplier = 1.0 + Σ(各词缀 HP 加成百分比)
affix_ap_multiplier = 1.0 + Σ(各词缀 AP 加成百分比)
示例Elite(+50% HP, +30% AP) + Giant(+100% HP, +50% AP)
→ affix_hp_multiplier = 1.0 + 0.5 + 1.0 = 2.5
→ affix_ap_multiplier = 1.0 + 0.3 + 0.5 = 1.8
```
词缀乘数范围1.0(无词缀)到 2.5Elite+Giant HP 加满,加法叠加最大值)。
**规则 7怪物类型定义**
| 类型 | 基础 HP | 基础 AP | 行为特征 |
|------|---------|---------|---------|
| Melee | 120 | 12 | 标准近战攻击,中速移动 |
| Heavy | 350 | 30 | 极慢移动,高血量肉盾 |
| Long | 80 | 45 | 远程攻击,低血量 |
| Support | 80 | 20 | 治疗/增益其他怪,优先击杀目标 |
| Bomber | 60 | 80 | 低血量,死亡时对周围造成 AP×200% 的 AOE 伤害 |
| Summoner | 100 | 15 | 每 8 秒召唤 1 个小怪Melee 1 级属性) |
| Assassin | 90 | 55 | 快速突进到后排攻击英雄 |
| Splitter | 150 | 20 | 死亡时分裂为 2 个小体50% HP/AP |
| MeleeBoss | 1500 | 20 | Boss 级近战,带特殊技能 |
| LongBoss | 350 | 30 | Boss 级远程,带特殊技能 |
### States and Transitions
**波次生成状态机:**
```
INIT → SELECT_TEMPLATE → FILL_MONSTERS → APPLY_AFFIXES → APPLY_GROWTH → APPLY_ADAPTIVE → SPAWN_WAVE → EVALUATE_PERFORMANCE → (下一波)
```
| 状态 | 输入 | 输出 | 转换条件 |
|------|------|------|---------|
| INIT | 当前 wave_number, tier | tier, wave_position_in_tier | 自动 |
| SELECT_TEMPLATE | tier, wave_position, is_boss_wave | blueprint_template | 根据 REST/NORMAL/BOSS 规则选模板 |
| FILL_MONSTERS | template, difficulty_budget | monster_list (types + counts) | 权重随机,总成本 ≤ budget |
| APPLY_AFFIXES | monster_list, tier | affixed_monster_list | 按概率和规则添加词缀 |
| APPLY_GROWTH | affixed_monster_list, tier | scaled_monsters | 属性 × tier_multiplier |
| APPLY_ADAPTIVE | scaled_monsters, adaptive_factor | final_monsters | 属性 × adaptive_factor |
| SPAWN_WAVE | final_monsters | (游戏内生成) | 按顺序排列怪物 |
| EVALUATE_PERFORMANCE | 战斗结果 | updated adaptive_factor | 计算新自适应系数 |
### Interactions with Other Systems
| 系统 | 数据流方向 | 接口 |
|------|-----------|------|
| 英雄系统 | ← 接收 | 英雄存活率、队伍 DPS、通关时间 |
| 战斗系统 | → 发送 | 最终怪物列表(类型、属性、词缀、位置) |
| 怪物配置 | ← 接收 | 怪物基础属性、行为定义 |
| 成长/升级系统 | ← 接收 | 玩家当前英雄等级和装备强度(自适应难度参考) |
| UI 系统 | → 发送 | 当前波次、档位、怪物预览信息 |
| 分数系统 | → 发送 | 击杀统计、Boss 击杀数据 |
| 无限模式入口 | ← 接收 | 玩家选择是否进入无限模式 |
## Formulas
### F1: 阶梯属性倍率
```
tier_multiplier = tier_multiplier_table[tier]
```
| Variable | Symbol | Type | Range | Description |
|----------|--------|------|-------|-------------|
| tier | T | int | 1-10 (主线), 11+ (无限) | 当前难度阶梯 |
| tier_multiplier | TM | float | 1.0-5.5 | 属性倍率 |
**Tier Multiplier 表:**
| Tier | Multiplier | Tier | Multiplier |
|------|-----------|------|-----------|
| T1 | 1.0x | T6 | 2.8x |
| T2 | 1.3x | T7 | 3.3x |
| T3 | 1.6x | T8 | 3.9x |
| T4 | 1.9x | T9 | 4.6x |
| T5 | 2.3x | T10 | 5.5x |
**无限模式扩展:** T(n) = T(n-1) × 1.2T11=6.6x, T12=7.9x, ...
**Output Range:** 1.0x (T1) to 5.5x (T10 主线), 无限模式无限递增
**Example:** 基础 Melee 怪在 T5 的属性 = 120×2.3=276 HP, 12×2.3=27.6 AP
### F2: 难度预算
```
wave_budget = base_budget[tier] × template_modifier[type]
```
| Variable | Symbol | Type | Range | Description |
|----------|--------|------|-------|-------------|
| base_budget | BB | int | 100-1050 | 档位基础预算 |
| template_modifier | TMOD | float | 0.5-1.5 | 模板类型修正 |
**Base Budget 表:**
| Tier | Budget | Tier | Budget |
|------|--------|------|--------|
| T1 | 100 | T6 | 440 |
| T2 | 150 | T7 | 560 |
| T3 | 200 | T8 | 700 |
| T4 | 260 | T9 | 860 |
| T5 | 340 | T10 | 1050 |
**Template Modifier**
- REST: 0.5x
- NORMAL: 1.0x
- MIXED: 1.2x
- ELITE: 0.8x
- BOSS: 1.5x
**Output Range:** 50 (T1 REST) to 1575 (T10 BOSS)
**Example:** T5 NORMAL 波 → budget = 340 × 1.0 = 340 → 可生成约 8 个 Melee 或 4 个 Melee + 2 个 Long + 1 个 Support
### F3: 怪物最终属性
```
final_hp = base_hp × tier_multiplier × affix_hp_multiplier × adaptive_factor
final_ap = base_ap × tier_multiplier × affix_ap_multiplier × adaptive_factor
```
| Variable | Symbol | Type | Range | Description |
|----------|--------|------|-------|-------------|
| base_hp/base_ap | BH/BA | int | 60-1500 | 怪物基础属性 |
| affix_hp/ap_multiplier | AHM/AAM | float | 1.0-2.5 | 词缀属性倍率加法叠加Elite+Giant 最大 2.5 |
| adaptive_factor | AF | float | 0.85-1.15 | 自适应系数 |
**Output Range:** HP 51 (Bomber, T1, no affix, AF=0.85) to 19,031+ (MeleeBoss, T15 无限, Elite+Giant, AF=1.15)
**Example:** Melee 怪在 T7, 带 Elite 词缀, AF=1.0 → HP=120×3.3×1.5×1.0=594, AP=12×3.3×1.3×1.0=51.5
### F4: 自适应难度系数
> **设计说明**:自适应系数 (AF) 仅作用于怪物属性F3不作用于波次预算F2。这意味着自适应难度调整的是"每只怪物的强弱"而非"怪物的数量",实际效果接近 ±15%,而非双重叠加。
```
adaptive_factor = clamp(adaptive_factor + delta, 0.85, 1.15)
delta calculation per wave:
if heroes_alive_ratio >= 0.8 AND clear_time < target_time:
delta = +0.03 // 玩家太强,提高怪物属性
elif heroes_alive_ratio <= 0.3:
delta = -0.03 // 快团灭,降低怪物属性
else:
delta = 0 // 维持
```
| Variable | Symbol | Type | Range | Description |
|----------|--------|------|-------|-------------|
| heroes_alive_ratio | HAR | float | 0.0-1.0 | 存活英雄比例 |
| clear_time | CT | float | 3.0-60.0 | 通关时间(秒) |
| target_time | TT | float | 15.0 | 目标通关时间 |
| delta | D | float | -0.03 to +0.03 | 每波调整量 |
| adaptive_factor | AF | float | 0.85-1.15 | 最终自适应系数 |
**Output Range:** 0.85-1.15 (硬限制)
**Example:** 连续 3 波全英雄存活且 5 秒内通关 → AF = 1.0 + 0.03×3 = 1.09
## Edge Cases
- **If 难度预算不足以生成任何怪物**:保底生成 1 个 Melee 怪(忽略预算限制),确保每波至少有内容。
- **If 权重填充结果为空(所有怪物类型被 tier_min 过滤)**:回退到该 Tier 最低限制的类型池Melee 总是可用)。
- **If 两个互斥词缀同时被选中**按词缀优先级Shield > Regen > Giant > Swift保留优先级更高的丢弃另一个。
- **If 怪物最终 HP 或 AP 低于 1**clamp 到最小值 1。怪物不能是 0 血或 0 攻击。
- **If 自适应系数连续 5 波向同一方向调整(持续加难或降难)**:强制一次反向 +0.01 微调,防止极端漂移。
- **If 无限模式中 tier_multiplier 导致怪物 HP > 100,000**:启用对数压缩公式 `display_hp = log10(actual_hp) × scaling_factor`,避免 UI 数字溢出。实际伤害计算仍用真实值。
- **If Bomber 怪被 AOE 同时击杀多个**:爆炸伤害不叠加,每个爆炸独立计算但不会叠加超过总伤害的 300%。
- **If Splitter 分裂出的子体再次被击杀**:子体不再分裂(分裂深度限制为 1 级)。
- **If Summoner 召唤的小怪存活超过 30 秒**:小怪自动消散,防止场上怪物无限积累。
- **If 玩家在 Boss 波前有 0 个存活英雄(理论上不应发生)**:不生成该波怪物,触发游戏结束结算。
- **If 同一模板被连续抽取 3 次**:强制下一次从不同类型模板池中抽取,避免体验单调。
## Dependencies
| 依赖系统 | 方向 | 性质 | 数据接口 |
|----------|------|------|---------|
| **英雄系统** (heroSet.ts) | 上游(硬依赖) | 读取英雄属性、存活状态 | `heroes_alive_ratio`, `team_dps`, `clear_time` |
| **战斗系统** | 下游(硬依赖) | 发送怪物列表 | `final_monster_list[]` 含 type, hp, ap, affixes, position |
| **怪物配置** (HeroAttrs.ts 怪物部分) | 上游(硬依赖) | 读取怪物基础属性 | `base_hp`, `base_ap`, `speed`, `skills` |
| **成长/升级系统** | 上游(软依赖) | 了解玩家当前强度 | `hero_levels[]`, `equipment_power` |
| **UI 系统** | 下游(软依赖) | 发送波次信息 | `wave_number`, `tier`, `monster_preview[]` |
| **分数系统** | 下游(软依赖) | 发送击杀统计 | `boss_kills`, `elite_kills`, `total_kills` |
| **无限模式入口** | 上游(软依赖) | 接收玩家选择 | `enter_infinite: boolean` |
**硬依赖说明**:英雄系统、战斗系统、怪物配置缺失时刷怪系统无法运行。
**软依赖说明**:成长系统和 UI 系统缺失时刷怪系统可工作,但自适应难度和波次预览功能降级。
## Tuning Knobs
所有设计者可在不修改代码的情况下调整的配置值:
| 旋钮 | 当前值 | 安全范围 | 超出后果 |
|------|--------|---------|---------|
| `tier_multiplier_table[T1-T10]` | 1.0-5.5 | 0.5-10.0 | 过低→后期无挑战;过高→后期不可打 |
| `base_budget[T1-T10]` | 100-1050 | 50-2000 | 过低→怪物太少无聊;过高→怪物太多卡顿 |
| `template_modifier[REST]` | 0.5x | 0.3-0.8 | 过低→恢复波太弱无意义;过高→节奏混乱 |
| `template_modifier[BOSS]` | 1.5x | 1.0-2.5 | 过低→Boss 无感过高→Boss 波必团灭 |
| `adaptive_factor_min` | 0.85 | 0.7-0.95 | 过低→自适应降难太明显 |
| `adaptive_factor_max` | 1.15 | 1.05-1.3 | 过高→自适应加难太明显 |
| `adaptive_delta_per_wave` | 0.03 | 0.01-0.08 | 过低→反应迟钝;过高→体验不稳定 |
| `target_clear_time` | 15.0s | 5.0-30.0 | 影响自适应判断阈值 |
| `base_affix_chance[T5-T10]` | 10%-50% | 0%-80% | 过低→词缀系统无意义;过高→全是精英怪 |
| `bomber_explosion_multiplier` | 200% | 100%-400% | 爆炸伤害占 AP 的比例 |
| `splitter_child_hp_ratio` | 50% | 25%-75% | 分裂子体 HP 占母体比例 |
| `splitter_child_ap_ratio` | 50% | 25%-75% | 分裂子体 AP 占母体比例 |
| `summoner_spawn_interval` | 8s | 4-15s | 召唤间隔 |
| `summoner_max_minions` | 3 | 1-5 | 场上最多同时存在的小怪数 |
| `minion_lifetime` | 30s | 10-60s | 小怪存活上限 |
| `infinite_tier_growth_rate` | 1.2x | 1.1-1.5 | 无限模式每档递增率 |
| `monster_types_available[T1-T10]` | 见规则2 | - | 每档可用怪物类型集合 |
| `affix_mutual_exclusion` | Giant×Swift, Regen×Shield | - | 互斥词缀对 |
## Acceptance Criteria
### 核心波次生成
- **GIVEN** 游戏开始adaptive_factor=1.0**WHEN** 进入 W1**THEN** 生成 1 个 Melee 怪T1, 无词缀HP=120, AP=12。
- **GIVEN** 当前 Tier 2 W2攀升波**WHEN** 模板选取完成,**THEN** 模板类型为 NORMAL 或 MIXED且模板的怪物槽位池中包含 Long 类型cost=40。运行 100 次抽取Long 类型出现在槽位池中的比例为 100%。
- **GIVEN** W6Boss 波),**WHEN** 模板选取完成,**THEN** 模板类型为 BOSSmandatory_slots 包含 Boss 类型,至少生成 1 个 MeleeBoss + 0-3 个普通怪。
- **GIVEN** Tier 3 W1REST 波),**WHEN** 模板选取完成,**THEN** 模板类型为 RESTtemplate_modifier=0.5x。
- **GIVEN** Tier 4 W3非 Boss 高潮波),**WHEN** 模板选取完成,**THEN** 模板类型为 MIXEDtemplate_modifier=1.2x。
### 预算系统
- **GIVEN** Tier 5 NORMAL 波budget=340, AF 不影响预算),**WHEN** 填充怪物完成,**THEN** 所有怪物成本总和在 340 × 0.7 到 340 × 1.0 之间(即 238-340且至少生成 3 只怪物。
- **GIVEN** 预算不足以生成任何怪物,**WHEN** 填充阶段,**THEN** 保底生成 1 个 Melee 怪(忽略预算限制)。
### 词缀系统
- **GIVEN** Tier 5 正常波10+ 只怪),**WHEN** 运行 1000 次统计测试,**THEN** 词缀触发率落在 8%-12% 区间90% 置信度),且所有触发的词缀类型均为 Elite 或 Berserk。单次运行中无词缀怪物比例在 20%-50% 区间内。
- **GIVEN** Tier 10 FinalBossW30**WHEN** 词缀应用完成,**THEN** FinalBoss 拥有 2-3 个词缀且任意两个词缀的组合不属于互斥组Giant+Swift, Regen+Shield, Summoner类型+Summoner词缀。运行 100 次模拟0 次出现互斥词缀同时生效。
- **GIVEN** Tier 7 正常波,**WHEN** 词缀应用完成,**THEN** 每只普通怪最多拥有 1 个词缀。运行 1000 次模拟0 次出现普通怪拥有 >1 个词缀的情况。
- **GIVEN** Tier 7 W21 MiniBoss**WHEN** 词缀应用完成,**THEN** MiniBoss 拥有 0-2 个词缀0 次超过 2 个词缀。
- **GIVEN** 两个互斥词缀Giant + Swift同时被选中**WHEN** 词缀应用阶段,**THEN** 保留优先级更高的词缀Giant丢弃 Swift。
- **GIVEN** 两个互斥词缀Regen + Shield同时被选中**WHEN** 词缀应用阶段,**THEN** 保留优先级更高的词缀Shield丢弃 Regen。
### 自适应难度
- **GIVEN** adaptive_factor 初始值为 1.0,且连续 3 波全英雄存活heroes_alive_ratio ≥ 0.8)且通关时间 < 15s**WHEN** 自适应计算完成,**THEN** adaptive_factor = 1.0 + 0.03 × 3 = 1.09。
- **GIVEN** adaptive_factor 初始值为 1.0,且连续 2 波仅 1 英雄存活heroes_alive_ratio ≤ 0.3**WHEN** 自适应计算完成,**THEN** adaptive_factor = 1.0 - 0.03 × 2 = 0.94。
- **GIVEN** adaptive_factor 连续 5 波递减(每次 delta=-0.03),当前值为 0.85clamp 下限),**WHEN** 第 6 波计算 delta 仍为 -0.03**THEN** 实际施加的 delta 被覆盖为 +0.01反向微调adaptive_factor 变为 0.86。
### 怪物行为
- **GIVEN** Bomber 怪final_ap=X被击杀**WHEN** 死亡触发,**THEN** 以 Bomber 死亡位置为中心,对 AOE_RADIUS 范围内的所有英雄造成 X × 200% 的伤害。
- **GIVEN** 3 个 Bomber 怪final_ap=80在 AOE 范围内被同时击杀,**WHEN** 爆炸触发,**THEN** 单个英雄受到的总伤害 ≤ 80 × 200% × 300% = 480。
- **GIVEN** Splitter 怪HP=150, AP=20被击杀**WHEN** 死亡触发,**THEN** 生成 2 个小体,每个小体 HP=75, AP=10。
- **GIVEN** Splitter 小体被击杀,**WHEN** 死亡触发,**THEN** 不生成任何子体(分裂深度限制为 1 级)。
- **GIVEN** Summoner 怪存活且场上 0 个小怪,**WHEN** 经过 8 秒,**THEN** 召唤 1 个 Melee 小怪T1 属性)。
- **GIVEN** Summoner 怪存活且场上已有 3 个小怪,**WHEN** 经过 8 秒,**THEN** 不召唤新的小怪。
- **GIVEN** Summoner 召唤的小怪存活 30 秒,**WHEN** 计时器触发,**THEN** 小怪自动消散(从场上移除)。
### 属性计算
- **GIVEN** Tier 7 Melee 怪,带 Elite 词缀(+50% HP, +30% APAF=1.0**WHEN** 属性计算完成,**THEN** HP = 120 × 3.3 × 1.5 × 1.0 = 594AP = 12 × 3.3 × 1.3 × 1.0 = 51.48。
- **GIVEN** 任何怪物,**WHEN** 最终属性计算完成base × tier_multiplier × affix_multiplier × adaptive_factor**THEN** final_hp ≥ 1 且 final_ap ≥ 1。
### 无限模式与模板多样性
- **GIVEN** 主线 W30 通关,**WHEN** 玩家选择进入无限模式,**THEN** 从 T11 开始,每层 4 波REST→NORMAL→MIXED→BOSS属性倍率 = tier_multiplier_table[T10] × infinite_tier_growth_rate = 5.5 × 1.2 = 6.6x。
- **GIVEN** 无限模式 T12**WHEN** 属性倍率计算,**THEN** tier_multiplier = 6.6 × 1.2 = 7.92x。
- **GIVEN** 同一模板id 相同)被连续抽取 3 次,**WHEN** 第 4 波模板选取,**THEN** 选出的模板类型与连续 3 次的类型不同(如连续 3 次 NORMAL 则强制从 REST/MIXED/ELITE/BOSS 池中抽取)。
### 游戏结束条件
- **GIVEN** 当前波次为 Boss 波且 heroes_alive_count = 0**WHEN** 波次生成流程启动,**THEN** 不生成任何怪物,触发游戏结束结算流程。
## Visual/Audio Requirements
### 词缀视觉差异化
每种词缀需要对应的视觉标识,让玩家一眼识别威胁类型:
| 词缀 | 视觉效果 | 颜色/标识 |
|------|---------|----------|
| Elite | 怪物周围光圈 | 金色光环 |
| Berserk | 怪物身体发红,攻击动画加速 | 红色脉动 |
| Shield | 怪物面前半透明护盾 | 蓝色半透明盾 |
| Regen | 怪物脚下绿色光环,回复时绿色数字飘出 | 绿色粒子 |
| Swift | 怪物移动时带残影拖尾 | 白色拖尾 |
| Giant | 怪物体型 ×2 | - |
| Chain | 攻击时连电弧特效 | 紫色电弧 |
| Summoner | 召唤时脚下法阵特效 | 紫色法阵 |
### Boss 视觉需求
- Boss 生成时全屏闪白 + 震屏效果
- Boss 血条 UI 单独显示在屏幕顶部
- MajorBoss/FinalBoss 有独特的出场动画2 秒)
### 新怪物类型视觉
- **Bomber**:怪物身上带红色炸弹标识,死亡时爆炸粒子特效(橙色+火焰)
- **Summoner**:带法杖的怪物,召唤时法杖发光
- **Assassin**:瘦长体型,移动时带残影,突进时有速度线特效
- **Splitter**:体型略大于普通怪,死亡时分裂动画(绿色分裂粒子)
- **Heavy**:体型 ×1.5,移动缓慢,脚步有灰尘特效
### Audio 需求
- Boss 出场:低频鼓声 + 金属碰撞音效
- Bomber 爆炸:爆炸音效(带屏幕震动)
- 自爆怪预警音Bomber 血量低于 30% 时发出嘀嗒声
- 词缀怪物Elite 怪发出低沉吼叫Swift 怪有疾风声
## Open Questions
| # | 问题 | 负责人 | 目标解决日期 | 备注 |
|---|------|--------|-------------|------|
| 1 | 无限模式 Mega Boss 的特殊机制是什么? | 策划 | 待定 | 每 3 层出现的 Mega Boss 需要独特玩法,不能只是数值翻倍 |
| 2 | Summoner 召唤的小怪是否影响分数统计? | 策划 | 待定 | 如果计入击杀数可能刷分,需确认规则 |
| 3 | 自适应难度是否对玩家可见? | 策划+UI | 待定 | 部分 Roguelike 游戏会显示难度等级作为反馈 |
| 4 | 蓝图模板池具体需要多少个模板? | 策划 | 待定 | 目前每类定义了 3 个示例模板,正式版每类需要 5-8 个 |
| 5 | 新怪物类型Bomber/Summoner/Assassin/Splitter/Heavy的 UUID 编号段? | 开发 | 待定 | 需与 HeroAttrs.ts 中的编号体系对齐需独立怪物定义文档UUID、AI 行为树、资源规范) |
| 6 | 飞行怪移除后,现有 Fly/FlyBoss 的 UUID 是否回收? | 开发 | 待定 | 影响资源管理 |
| 7 | **英雄战力曲线验证** — 怪物缩放5.5×)需对照玩家 DPS 曲线校准 | 策划 | 待定 | 缺少英雄成长 GDD所有平衡数值未验证。需定义T1/T5/T10 预期团队 DPS、每波怪物预期存活时间 |
| 8 | **Bomber 爆炸 AOE 半径** — AC 引用了 AOE_RADIUS 但未在调参旋钮中定义 | 策划 | 待定 | 需添加到 Tuning Knobs 表 |
| 9 | **MajorBoss vs MiniBoss 机械区别** — 当前仅数值差异,是否有特殊技能/阶段转换? | 策划 | 待定 | W15 MajorBoss 需要与非 MajorBoss 的体验差异 |