Skip to main content

⚔️ 战斗系统详解

本文档定义了 Project Vampirefall 的核心战斗规则,包括伤害计算流程、属性相互作用、异常状态及控制机制。
设计哲学: 本系统的核心目标是构建一个深度可扩展的数值框架,通过乘区理论状态机创造多样化的 Build 体验,同时通过韧性反馈系统保证动作游戏的爽快感。

1. 伤害类型与抗性 (Damage Types & Resistances)

1.1 核心伤害类型

为了保证战斗策略的深度,我们采用经典的“三系”分类。
  • 物理 (Physical): 基础伤害高,受护甲 (Armor) 减免。
  • 元素 (Elemental): 附带异常状态,受元素抗性 (Resistance) 减免。
    • 🔥 火焰 (Fire): 纯伤害 / DoT。
    • ❄️ 冰霜 (Cold): 控制 / 减速。
    • 雷电 (Lightning): 群体 / 易伤。
  • 混沌 (Chaos): 稀有伤害,无视能量护盾 (Energy Shield),受混沌抗性减免。

1.2 🧠 核心理论:乘区理论 (Bucket Theory)

引用自 PoE 与 Diablo 的数值基石,伤害计算遵循乘区理论以防止数值失控并提供策略深度。 最终伤害 = 基础伤害 × 增伤区(Inc) × 独立乘区(More) × 暴击区 × 抗性区
  1. 基础区 (Base): 技能面板 × 武器伤害。
  2. 增伤区 (Additive / Inc): (1 + 物理伤% + 全伤% + 近战伤%)。所有此类词条相加。
    • 设计意图: 随着数值堆叠,收益产生稀释效应
  3. 独立乘区 (Multiplicative / More): (1 + 额外伤A) × (1 + 额外伤B)
    • 设计意图: 极其珍贵,无稀释,是后期 Build 的核心追求。
  4. 抗性区 (Resistance): (1 - (目标抗性 - 穿透))
💡 业界案例 (Path of Exile): PoE 的成功在于通过大量的 “Inc” 词条让新手获得稳定成长,同时用稀有的 “More” 词条奖励深度玩家,创造了极高的 Build 上限。

1.3 核心公式

物理护甲 (Armor) - 线性有效生命值

// 护甲减伤公式 (DR)
// K 为常数 (推荐 3000),决定了减伤曲线的陡峭程度
float damageReduction = Armor / (Armor + K);
  • 原理: 虽然 DR 随护甲增加而递减,但 有效生命值 (EHP) 保持线性增长。每 K 点护甲,EHP 增加 100%。

元素抗性 (Resistance) - 硬上限

// 抗性计算
// 穿透 (Penetration) 直接做减法
float finalRes = Mathf.Min(TargetRes - AttackerPen, MaxResCap); // MaxResCap 通常为 75%
float multiplier = 1.0f - finalRes;

2. 异常状态 (Status Ailments)

2.1 状态体系

状态来源效果定位核心机制
点燃 (Ignite)🔥 火焰持续输出快照机制: 伤害基于触发时的单次击中伤害。不可叠加,只取最高。
冰缓/冻结 (Chill/Freeze)❄️ 冰霜控场/窗口阈值机制: 效果取决于伤害占目标 MaxHP 的比例。
感电 (Shock)⚡ 雷电易伤/爆发团队共享: 增加目标受到的所有伤害 (独立乘区)。
流血 (Bleed)⚔️ 物理移动惩罚动态判定: 目标移动时受到额外 200% 伤害。

2.2 🧠 核心算法:伪随机分布 (PRD)

为了避免“脸黑”导致的体验断层,所有概率触发的状态(如暴击、异常)必须使用 PRD 算法。
PRD 原理: 每次触发失败,下次触发概率提升;触发成功,概率重置。 参见: Tech/Algorithms/Roguelike_RNG_Systems.md
// 伪代码逻辑
class PRDCounter {
    float C; // 基础概率对应的增量常数
    int N = 1; // 失败计数器

    bool Check(float baseChance) {
        \text{if} (Random.value < C * N) {
            N = 1; return true;
        } else {
            N++; return false;
        }
    }
}

3. 硬直与韧性 (Stagger & Poise)

引入类似《黑暗之魂》的韧性系统,赋予战斗“重量感”和“节奏感”。

3.1 韧性机制

  1. 韧性条 (Poise Bar): 所有单位拥有的隐藏属性。
  2. 削韧 (Poise Damage): 攻击会扣除韧性。韧性伤害 = 伤害 × 冲击系数
  3. 硬直 (Stagger): 当韧性 <= 0 时,单位进入硬直状态,动作被打断,受击动画播放。
  4. 恢复: 若一段时间未受击,韧性开始快速恢复。

3.2 🧠 设计哲学:节奏控制

韧性系统不仅仅是防御属性,更是战斗节奏的控制器。
  • 玩家策略: 必须在 Boss 恢复韧性前保持攻势(贪刀的风险)。
  • Boss 设计: 高韧性防止被玩家无限连击控制,但破韧后提供巨大的输出窗口 (Reward)。

3.3 核心逻辑示例

// 韧性伤害处理核心逻辑
void TakePoiseDamage(float amount, bool hasForce) {
    \text{if} (isStaggered) return; // 硬直中不重复计算

    currentPoise -= amount;
    resetRecoveryTimer(); // 重置恢复计时器

    \text{if} (currentPoise <= 0) {
        TriggerStagger(); // 触发硬直
        \text{if} (hasForce) ApplyKnockback(); // 仅在破韧时触发击退
    }
}
💡 业界案例 (Dark Souls): 魂系列通过隐藏的韧性数值和分级的硬直动画(小/中/大),创造了精确的打击反馈。我们需要简化此系统,使其适应快节奏的塔防战斗。

4. 仇恨系统 (Aggro System)

由于混合了塔防元素,怪物的仇恨逻辑需要平衡“攻击玩家”和“攻击塔/基地”。

4.1 优先级堆栈

  1. 强制嘲讽 (Taunt): 能够强制覆盖所有逻辑(持续 3s)。
  2. 路径阻挡: 若去往基地的路被堵死,攻击阻挡物(破墙)。
  3. 动态权重: 基于伤害和距离的加权计算。

4.2 🧠 权重公式

AggroScore = (Damage_Dealt_Recent * Weight_Dmg) + (1 / Distance * Weight_Dist)
  • 近战怪: 距离权重极高(优先打脸上的)。
  • 远程怪: 距离权重较低,倾向于攻击高威胁目标(如输出塔)。
  • 滞后阈值 (Hysteresis): 只有新目标的仇恨值超过当前目标 110% 时才切换,防止目标频繁抖动。

5. 连击与评分 (Combo & Style)

5.1 连击设计

连击不仅是数字,更是资源获取效率的倍增器。
  • 时间窗口: 3 秒。随连击数增加,窗口可略微放宽。
  • 中断惩罚: 被硬直打击 (Stagger) 会直接清空连击。这鼓励玩家在进攻的同时保持走位。

5.2 阶段奖励

  • Phase 1 (10 Hit): 移速提升(优化走位)。
  • Phase 2 (50 Hit): 攻速/资源获取提升(加速循环)。
  • Phase 3 (100 Hit): 独立增伤 + 视觉特效(电弧/残影)。
💡 业界案例 (Devil May Cry): 鬼泣的 Style 系统鼓励花样进攻。在我们的设计中,连击主要作为**“高风险高回报”**的状态,奖励维持战斗流 (Flow) 的玩家。

6. 引用与参考 (References)

  • 数值体系: 详见 Design/Numerical_Manual.md (PRD 常数表、完整伤害公式)。
  • 代码实现:
    • 伤害计算: Code/Combat/DamageCalculator.cs (待实现)
    • 状态管理: Code/Combat/StatusSystem.cs (待实现)
    • 韧性逻辑: Code/Combat/PoiseSystem.cs (待实现)