272 lines
9.9 KiB
Markdown
272 lines
9.9 KiB
Markdown
# 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 获得灵力 |
|