Files
rthythm_archor_game/docs/Level1Design.md
T
2026-07-06 22:59:47 -07:00

276 lines
12 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.
# 第一关关卡设计(Level 1 Design
> 本文档承接《Anchor策划书1.0》(docs/AnchorV1.0.md,缩写 §)与《关卡设计指南》。
> §7 / §8 两节为指南原文;其余章节是落地到本项目的关卡与行为设计说明。
> 实现入口:`scenes/stage/level_director.gd`(出怪导演)、`scenes/enemies/minion_behavior.gd`(小怪状态机)、`scenes/stage/boss_room_gate.gd`Boss 房门)。
---
## 1. 关卡布局
沿用 `rthythm_archor_game_player` 参考工程的视觉基线:`Stage` 使用跟随相机,`Camera2D` 初始位置为 `(2047, 395)`,缩放为 `(1.25, 1.25)`;玩家、怪物、Boss 的地面锚点统一在 `y = 560`。关卡迁移只调整出怪方式、门线和战斗流程,不改变角色、Boss、怪物、背景、HUD 的相对大小与原有镜头比例。
| 位置 | x 坐标 | 说明 |
|---|---:|---|
| 竞技场左边界 | 1120 | 巡逻 / 后撤永不越界 |
| 左侧刷新点 | 1420 | 增援入场起点,使用 `LevelDirector.left_edge_x` |
| 玩家出生点 | 1180 | 2026-07-05 new2:改为地图偏左,开场向右推进约 1000px 遇敌 |
| 战斗区域中心 | 2047 | 增援入场目标的基准 |
| 阶段一近战怪预置点 | 2235 | 编辑器摆放,无刷新动画 |
| Boss 初始锚点 | 2520 | 保留参考工程站位;玩家未进 Boss 战前 `combat_enabled = false` |
| 右侧刷新点 | 2670 | 增援入场起点,使用 `LevelDirector.right_edge_x` |
| 竞技场右边界 | 2890 | 巡逻 / 后撤永不越界 |
| Boss 房门 / 触发线 | 2960 | 三态:封锁→开放→反锁;作为通关后进入 Boss 战的流程线 |
Boss 房门三态(`BossRoomGate`):
- **封锁(sealed,蓝灰色)**:开局即封,物理墙阻挡,直到 6 只小怪全灭。
- **开放(绿色)**`LevelDirector` 调用 `unseal()`,墙体关闭,可通行。
- **反锁(红色)**:玩家跨过门线后在身后锁死(§4.5,不可回头刷怪),并触发 Boss 战入场规则;不移动 player 项目原有相机,不改变 HUD / 角色 / Boss 的比例。
## 2. 小怪行为逻辑(MinionBehavior 状态机)
决策与攻击全部对齐节拍(`beat_ticked`),移动逐帧执行。攻击动作进行中不移动、不换目标。
### 2.1 近战怪(role = melee
```text
入场(Entry) → 巡逻(Patrol) ⇄ 追击(Chase) → [进入攻击距离后按拍攻击]
```
- **入场**:从画面边缘走到预定战斗区域(`entry_target_x`);途中玩家进入警戒范围则提前转入追击。
- **巡逻**:以锚点 ±110px 低速(0.45×)往返,面朝行走方向;阶段一预置怪以出生点为锚点。
- **警戒→追击**:玩家进入警戒范围(420px)后,**在下一个节拍点**切入追击(指南 §7.4);追击时全速逼近,停在 110px 处。
- **脱战**:玩家甩开警戒范围 1.25 倍距离 → 回到当前位置小范围巡逻。
- **攻击**:距离 ≤150px 时按拍出手;强势每 1 拍一次,弱势每 2 拍一次(§17.2)。
### 2.2 远程怪(role = ranged
```text
入场(Entry) → 站位固定(Hold) → [距离判断按拍射击];受压时 后撤(Retreat) → 新站位(Hold)
```
- **不巡逻**。入场只做一段移动:走到预设站位后固定(指南 §7.4)。
- **距离判断**:玩家在射程内(430px)按拍射击;离开警戒范围(540px)即停止行动。
- **后撤(调整站位)**:满足任一条件且 3 秒冷却就绪时,向远离玩家方向快速(1.7×)退开 190px:
- 玩家近身(≤150px)持续 1.1 秒;
- 1.5 秒内连续受击 2 次且玩家仍在近旁。
- 贴墙无退路时改为穿过玩家身位向另一侧跳开。
### 2.3 行为参数表
| 参数 | 近战 | 远程 |
|---|---:|---:|
| 警戒范围 | 360 | 540 |
| 攻击距离 | 120 | 450(≤ 镜头半宽 460,不许屏幕外开火) |
| 停步距离 | 120 | 340 |
| 攻击判定范围 | 前方 ≈140 | — |
| 巡逻半径 / 速度 | 110 / 0.45× | — |
| 后撤距离 / 速度 / 冷却 | — | 220 / 1.7× / 3s |
| 受击脱离 | — | 连续受击 4 次(2s 链窗)→ 闪烁无敌 0.4s + 跳跃脱离(3.2×) |
> 2026-07-05 new3 定案更新:近战小怪基础攻击 50(远程 25 的两倍);远程怪的
> 近身后撤触发距离 220pxBoss 见 §4 及 decisions.md 当日条目(无韧性系统,
> 普攻恒霸体、耗能技能才可压制)。
## 3. 强弱状态与打断规则(核心规则)
**只有处于强势状态的怪,才能打断玩家当前的状态。**
- 打断 = 玩家受击进入 Hitstun、当前动作被取消、被击退。三者同生同灭。
- 弱势状态怪的攻击**只结算伤害**:不打 Hitstun、不取消玩家动作、不产生击退。玩家可以顶着弱势怪的攻击继续连段——这正是“在怪物弱势相位输出”的教学奖励。
- 强弱在**动作开始时快照**(§17.4):出手瞬间是弱势,即使命中前相位切换,本次攻击依然没有打断权;反之亦然。
- Boss 不分强弱(§18.1),**恒定视为强势**,攻击永远可以打断玩家。
- 实现:`DamageEmitter.attacker_interrupts`(近战,configure_hit 时快照)与弹丸 `attacker_interrupts`(发射时快照,经 `projectile_requested` 上下文传递)→ `CombatResolver` 并入 `interrupts` 并把弱势击退清零 → `HealthComponent` / `CombatManager` 原有打断管线不变。
### 3.1 每跳伤害预算(玩家 HP 300)
弹丸伤害基数改为**发射者自己的基础攻击力**(玩家 100 / 小怪 25 / Boss 30),并结算发射者的强弱倍率——修复前弱势远程怪一发 45 反而比强势近战怪(18)疼。
| 敌人 × 相位 | 状态 | 单次伤害 | 攻击间隔 | 可打断玩家 |
|---|---|---:|---|---|
| 近战怪 × Past | 强势 | ≈1825×0.5×1.4 | 每 1 拍 | ✔ |
| 近战怪 × Future | 弱势 | ≈1025×0.55×0.7 | 每 2 拍 | ✘ |
| 远程怪 × Past | 弱势 | ≈825×0.45×0.7 | 每 2 拍 | ✘ |
| 远程怪 × Future | 强势 | ≈2325×0.65×1.4 | 每 1 拍 | ✔ |
| Boss × Past | — | 24~30+30×0.8+ | 决策每 2 拍 | ✔ |
| Boss × Future | — | ≈1830×0.6 | 决策每 1 拍 | ✔ |
承伤端沿用 §17.2/§17.3:强势承伤 25%,弱势承伤 250%(弱势怪 ≈1 个重技能+补刀击杀)。
## 4. Boss 行为逻辑
行为树(`boss_behavior_tree.gd`)按当前相位限定招式池并调整节奏(§18.1):
- **Past(慢而重)**:只用近战——三段地面连击轮转、远距冲刺逼近、中距突刺;决策每 2 拍一次。
- **Future(快而轻)**:只用远程——两种弹幕轮转、贴脸时 2 向弹幕逼退;决策每 1 拍一次。
- 特殊攻击(突刺 / 2 向弹幕)前 2 拍生成条件型 TimeAnchorEvent(§18.2):玩家失锚则相位翻转、Boss 状态改变。
- 被连续命中 4 次触发后撤位移(读条逃脱),防止无限压制;HP / 承伤不随相位变化。
- 玩家未进 Boss 房时 `combat_enabled = false`:不出手、不产生时间锚点。
## 5. 挑战性与可通关性
- **教学曲线**:阶段一单怪教基础节奏与相位强弱 → 阶段二单远程怪教射程与站位 → 阶段三混编教目标优先级(“打当前弱势的那只”)。
- **压力上限受控**:增援分 4 波、左右交替、每 2 秒 1 只(约 8 秒刷完),不会瞬间包围;同一时刻最多 1~2 只强势怪能打断玩家,其余只能磨血。
- **拖延惩罚**:拖战会让场上怪数上升(指南 §7.5),但总量封顶 6 只。
- **保底通关**:全弱势输出窗口每次相位切换必然出现;弱势怪不打断意味着玩家连段不会被杂兵摸一下就断,Miss 惩罚主要来自强势怪与自己的节奏失误。
- **数值下限**:最坏情况(Past 相位 2 近战强势贴脸)≈36 伤/拍,玩家仍有 ≥8 拍反应窗口;Future 相位 2 远程强势 ≈46 伤/拍但可走位躲弹、近身逼后撤。
---
## 7. 第一关小怪出怪流程
第一关共出现 6 只小怪,分为 3 个出怪阶段。
---
### 7.1 阶段一:初始近战怪
出怪内容:
- 近战怪 × 1
生成规则:
- 玩家进入第一关时,第一只近战怪已经存在于预定位置
- 该怪物不需要刷新动画
- 玩家靠近后,按照近战怪行为逻辑进入巡逻、警戒、追击或攻击状态
教学目标:
- 让玩家熟悉基础攻击节奏
- 让玩家理解近战怪的巡逻、追击和攻击逻辑
- 让玩家第一次观察相位切换对近战怪强弱状态的影响
教学重点:
- 过去相位下,近战怪是强势状态
- 未来相位下,近战怪是弱势状态
- 玩家应尝试在怪物弱势相位进行输出
---
### 7.2 阶段二:近距离刷新远程怪
触发条件:
- 玩家击败第一只近战怪
出怪内容:
- 远程怪 × 1
生成规则:
- 第一只远程怪在玩家附近不远处刷新
- 刷新位置应在玩家可感知范围内
- 不应直接贴脸刷新
- 刷新后远程怪进入静止或距离判断状态
教学目标:
- 让玩家熟悉远程怪的攻击范围
- 让玩家理解远程怪不巡逻,但会调整站位
- 让玩家观察远程怪在不同相位下的强弱变化
教学重点:
- 过去相位下,远程怪是弱势状态
- 未来相位下,远程怪是强势状态
- 玩家需要利用相位切换寻找输出窗口
---
### 7.3 阶段三:左右两侧增援刷新
触发条件:
- 玩家击败第二只怪物,也就是第一只远程怪
出怪内容:
- 近战怪 × 2
- 远程怪 × 2
生成规则:
- 四只怪物从玩家左右两侧刷新
- 刷新点位于摄像机范围外,或玩家不容易直接看到的位置
- 怪物刷新后,从画面边缘进入摄像机范围
- 刷新不是一次性全部出现,而是按间隔依次出现
- 推荐每 2 秒刷新 1 只
- 约 8 到 10 秒内完成全部 4 只怪物的刷新
推荐刷新顺序:
| 顺序 | 时间 | 怪物 | 方向 |
|---|---:|---|---|
| 1 | 0 秒 | 近战怪 | 左侧 |
| 2 | 2 秒 | 远程怪 | 右侧 |
| 3 | 4 秒 | 近战怪 | 右侧 |
| 4 | 6 秒 | 远程怪 | 左侧 |
> 具体方向可以根据关卡地形调整,但需要保证玩家不会被瞬间包围。
---
### 7.4 增援怪物入场逻辑
#### 近战怪入场
- 近战怪从左右边缘进入摄像机范围
- 进入后先移动到预定战斗区域
- 如果玩家进入警戒范围,立刻在下一个节拍点进入追击状态
- 如果玩家未进入警戒范围,则进入小范围巡逻状态
#### 远程怪入场
远程怪不巡逻,但需要有入场移动。
- 远程怪从画面边缘进入
- 移动到预设站位
- 到达站位后固定下来
- 固定后开始判断玩家是否进入攻击范围
- 如果玩家离开警戒范围,远程怪停止行动
- 如果玩家近身过久或连续受击,远程怪尝试后撤或跳开
---
### 7.5 阶段三教学目标
阶段三的目标是让玩家同时处理多种敌人压力。
教学目标:
- 让玩家同时面对近战压力和远程威胁
- 让玩家理解不同怪物在同一相位下强弱不同
- 训练玩家根据当前相位决定优先攻击目标
- 让玩家体验拖延战斗会导致敌人逐步增多
教学重点:
- 过去相位:近战怪强,远程怪弱
- 未来相位:近战怪弱,远程怪强
- 玩家需要根据当前相位选择更容易击杀的目标
- 优先击杀弱势相位敌人,可以降低战斗压力
---
## 8. 第一关通关条件
第一关普通战斗区域的通关条件为:
- 击败全部 6 只小怪
具体要求:
- 击败初始近战怪
- 击败刷新出的第一只远程怪
- 击败左右两侧增援刷新的 4 只怪物
全部小怪被击败后:
- 开放前往 Boss 房的路径
- 玩家可以进入 Boss 房
- 进入 Boss 房后触发 Boss 战