Files
zeling_v2/Docs/DesignSpec/04_CombatSystem.md
2026-05-08 11:04:00 +08:00

272 lines
9.9 KiB
Markdown
Raw Permalink 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.
# 04 · 战斗系统规范
> **所属文档集** [← 返回索引](./README.md)
> **摘要**:伤害数据模型、命中/受击管线、弹反系统、状态效果与连击规范。
> **关联**[03_PlayerSystem](./03_PlayerSystem.md) · [07_EnemySystem](./07_EnemySystem.md)
---
## 目录
1. [战斗设计原则](#1-战斗设计原则)
2. [DamagePacket — 伤害数据模型](#2-damagepacket--伤害数据模型)
3. [命中/受击管线](#3-命中受击管线)
4. [弹反系统](#4-弹反系统)
5. [霸体与打断系统](#5-霸体与打断系统)
6. [状态效果系统](#6-状态效果系统)
7. [战斗配置参数](#7-战斗配置参数)
---
## 1. 战斗设计原则
| 原则 | 说明 |
|------|------|
| **数据驱动** | 伤害、击退、硬直全部封装在 DamagePacket 中传递,不通过直接引用 |
| **物理解耦** | 攻击方和受击方通过碰撞区域交互,不互相持有引用 |
| **事件广播** | 命中确认后广播事件,让灵力积累、反馈系统等独立响应 |
| **可弹反标记** | 每次攻击明确标记是否可被弹反,由 DamagePacket.flags 决定 |
---
## 2. DamagePacket — 伤害数据模型
DamagePacket 是一次攻击行为的完整数据描述,**只读值类型**,在管线中传递不可修改:
```
DataModel DamagePacket {
rawDamage : Integer // 基础伤害(未经减免)
finalDamage : Integer // 实际伤害(由受击方计算后填写)
damageType : DamageType // 伤害类型
flags : Flags<DamageFlags> // 属性标记
──────────────────────────────────────
knockbackDir : Vector2 // 击退方向(单位向量)
knockbackForce : Number // 击退力度
stunDuration : Duration // 受击硬直时长(秒)
breakLevel : BreakLevel // 打断等级(影响霸体穿透)
──────────────────────────────────────
sourceId : ID // 攻击来源标识(用于特殊规则)
sourcePosition : Vector2 // 攻击来源位置
sourceLayer : AttackerType // 来源类型(玩家/敌人/环境)
hitFxType : HitFxType // 命中特效类型
}
```
### DamageType 枚举
| 值 | 说明 |
|----|------|
| `Normal` | 普通物理伤害 |
| `Fire` | 火焰伤害(可点燃)|
| `Poison` | 毒素伤害(可中毒)|
| `Void` | 虚空伤害(忽略所有减免,用于特定 Boss|
| `True` | 真实伤害(固定量,忽略防御)|
| `Environmental` | 环境伤害(棘刺/熔岩)|
### DamageFlags 标记
| 标记 | 说明 |
|------|------|
| `CanBeParried` | 可被弹反(移动弹射物/近身攻击)|
| `Unblockable` | 不可被格挡或弹反(特殊攻击)|
| `IgnoreIFrame` | 忽略受击无敌帧(毒素持续伤害)|
| `PerfectParryOnly` | 只能被完美弹反(高难度攻击)|
| `AoE` | 范围伤害(爆炸/冲击波)|
| `DotTick` | 持续伤害跳数(由状态效果发出)|
---
## 3. 命中/受击管线
### 3.1 管线流程
```
攻击方激活 HitArea攻击判定区域
├─ 与 HurtArea受击判定区域发生碰撞检测
│ └─ 确认碰撞:攻击方的 AttackerLayer 与受击方的 HurtableLayer 匹配
├─ 受击方 HurtArea 接收 DamagePacket
│ └─ 检查:是否处于无敌帧?
│ ├─ 是(且非 IgnoreIFrame→ 丢弃,不处理
│ └─ 否 → 继续
├─ 受击方计算 finalDamage
│ └─ rawDamage × 攻击倍率 × 防御减免
├─ 受击方本地响应
│ ├─ 扣减 HP
│ ├─ 应用击退
│ ├─ 进入硬直状态
│ └─ 启动无敌帧计时
└─ 广播 OnHitConfirmed 事件(全局)
├─ 玩家系统:攻击命中敌人 → 增加灵力
├─ 反馈系统:播放命中特效、震屏、音效
└─ 进程系统:记录伤害统计
```
### 3.2 攻击判定区域HitArea规范
| 属性 | 说明 |
|------|------|
| 形状 | 矩形主要或圆形AoE 攻击)|
| 激活时机 | 由动画事件驱动(某一帧开启,某一帧关闭)|
| 打击次数 | 默认一次攻击只打击一个目标一次 |
| 层级过滤 | 只与己方对立层级的 HurtArea 发生碰撞 |
### 3.3 受击判定区域HurtArea规范
| 属性 | 说明 |
|------|------|
| 形状 | 矩形(贴近实体碰撞箱)|
| 常态 | 始终激活(死亡后关闭)|
| 无敌帧 | 无敌期间 HurtArea 不响应伤害(仍检测碰撞)|
---
## 4. 弹反系统
### 4.1 设计目标
弹反是游戏的**核心差异化机制**
- 高风险(窗口极短)→ 高回报(大量灵力 + 反击机会)
- 成功弹反会产生"子弹时间"效果,强调成功感
- 所有标记 `CanBeParried` 的攻击都可以弹反
### 4.2 弹反流程
```
玩家按弹反键 → 进入 ParryState
ParryState 开始:
├─ 弹反激活期parryActiveWindow开始
│ └─ 激活期内接收到带 CanBeParried 标记的 DamagePacket
│ → 弹反成功
│ ├─ 丢弃该 DamagePacket伤害不生效
│ ├─ 触发子弹时间(游戏速度降至 slowMotionScale持续 hitStopDuration
│ ├─ 播放弹反成功动画/特效/音效
│ ├─ 发出 OnParrySuccess 事件
│ ├─ 为玩家增加 +33 灵力
│ └─ 开启反击窗口counterWindow
~~parryActiveWindow 超时~~ → 弹反失败,回到正常状态
反击窗口内:
──攻击输入──► ParryCounter 攻击×3 伤害,不可弹反)
~~反击窗口超时~~ → IdleState/RunState
```
### 4.3 弹反参数
| 参数 | 推荐值 | 说明 |
|------|--------|------|
| `parryActiveWindow` | 0.15s | 弹反激活期(可弹反的时间窗口)|
| `parryStartupDelay` | 0.05s | 按键到激活期的前摇 |
| `hitStopDuration` | 0.1s | 子弹时间持续 |
| `slowMotionScale` | 0.15 | 子弹时间游戏速度倍率0=完全静止)|
| `counterWindowDuration` | 0.6s | 弹反成功后的反击窗口 |
| `parryCounterMultiplier` | 3.0 | 弹反反击伤害倍率 |
| `soulPowerOnParry` | 33 | 弹反成功获得灵力 |
> **设计决策**:弹反前摇 0.05s
> **原因**:消除"垃圾反弹"(无脑按弹反躲伤害),要求玩家预判攻击时机
### 4.4 弹反优先级规则
| 情况 | 处理 |
|------|------|
| 多个攻击同时到达 | 优先弹反第一个判定的攻击,其余正常受击 |
| 弹反期间受到 `Unblockable` 攻击 | 正常受伤,弹反状态中断 |
| 弹反期间受到 `PerfectParryOnly` | 需在激活期的前 1/3 时间内(完美窗口)|
---
## 5. 霸体与打断系统
### 5.1 概念
**霸体Poise**:实体在受到攻击时抵抗动作打断的能力。
**打断等级BreakLevel**:一次攻击能打断多高等级霸体的能力。
### 5.2 等级体系
| 打断等级 | 含义 | 典型来源 |
|---------|------|---------|
| `0 - None` | 无打断力 | 环境持续伤害 |
| `1 - Light` | 打断低级霸体 | 玩家普通攻击 |
| `2 - Medium` | 打断中级霸体 | 玩家重击Attack3|
| `3 - Heavy` | 打断高级霸体 | 弹反反击、魂技能 |
| `4 - Force` | 无条件打断(无视霸体)| 特定 Boss 技能 |
### 5.3 霸体等级
| 霸体等级 | 含义 | 适用实体 |
|---------|------|---------|
| `0 - Fragile` | 任意攻击均可打断 | 普通小怪 |
| `1 - Standard` | 普通攻击可打断 | 常规敌人 |
| `2 - Armored` | 需重击才能打断 | 精英怪 |
| `3 - Boss` | 仅弹反反击/强力技能可打断 | Boss |
### 5.4 判定规则
```
attackBreakLevel >= targetPoiseLevel → 动作打断(进入受击状态)
attackBreakLevel < targetPoiseLevel → 伤害照常,但不打断动作
ForceBreak 标记 → 无条件打断,忽略霸体等级
```
---
## 6. 状态效果系统
### 6.1 状态效果模型
```
DataModel StatusEffect {
effectId : ID
effectType : StatusEffectType
duration : Duration // 持续时间0 = 永久直到治疗)
tickInterval : Duration // DoT 跳数间隔(仅伤害类)
damagePerTick : Integer // 每跳伤害(仅伤害类)
stackBehavior : StackBehavior // 叠加规则
sourceId : ID // 施加方标识
}
```
### 6.2 效果类型
| 类型 | 效果 | 可叠加 | 治疗方式 |
|------|------|--------|---------|
| `Poison` | 每 0.5s 扣 1 HP持续 6s | 延长时间(不叠加层数)| 解毒药 / 离开毒素区 |
| `Burn` | 每 0.3s 扣 2 HP持续 3s | 刷新时间 | 水体 / 时间 |
| `Stun` | 完全硬直,无法行动 | 刷新时间 | 时间 |
| `Slow` | 移动速度 ×0.5 | 不叠加(取最强)| 时间 |
| `Frozen` | 完全冻结,无敌但也无法行动 | 不叠加 | 火焰攻击 |
### 6.3 叠加规则StackBehavior
| 规则 | 说明 |
|------|------|
| `RefreshDuration` | 已有效果时重置持续时间 |
| `ExtendDuration` | 已有效果时延长持续时间 |
| `AddStack` | 叠加层数,每层独立计时 |
| `IgnoreIfActive` | 已激活时忽略新施加 |
---
## 7. 战斗配置参数
| 参数 | 推荐值 | 说明 |
|------|--------|------|
| `baseAttackDamage` | 10 | 玩家基础攻击伤害 |
| `attack1Multiplier` | 1.0 | 第一击倍率 |
| `attack2Multiplier` | 1.0 | 第二击倍率 |
| `attack3Multiplier` | 2.0 | 第三击(重击)倍率 |
| `parryCounterMultiplier` | 3.0 | 弹反反击倍率 |
| `knockbackForceNormal` | 5.0 | 普通击退力度 |
| `knockbackForceHeavy` | 10.0 | 重击击退力度 |
| `defaultStunDuration` | 0.3s | 默认受击硬直时长 |
| `soulPowerPerHit` | 10 | 命中普通敌人获得灵力 |
| `soulPowerPerBossHit` | 5 | 命中 Boss 获得灵力 |