Files
heros/assets/script/game/common/config/HeroAttrs.ts
panw dcf739d093 refactor(战斗系统): 重构伤害计算逻辑并统一属性命名
- 将DAMAGE_REDUCTION统一重命名为DMG_RED以提高一致性
- 优化暴击判定逻辑,加入暴击抗性计算
- 重构伤害计算公式,整合易伤和免伤效果
- 移除冗余的calculateDamage方法
- 为枚举值添加注释说明
2025-11-27 10:19:54 +08:00

552 lines
22 KiB
TypeScript
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.

import * as exp from "constants";
import { HType } from "./heroSet";
/**
* Buff类型枚举
* VALUE: 数值型 - 直接加减数值
* RATIO: 百分比型 - 按百分比计算
*/
export enum BType {
VALUE = 0, //数值型
RATIO = 1 //百分比型
}
export enum NeAttrs {
IN_FROST = 0, // 冰冻状态
IN_STUN = 1, // 眩晕状态
IN_BURN = 2, // 灼烧状态
IN_POISON = 3, // 中毒状态
}
// ========== 属性枚举 ==========
/**
* 英雄属性枚举
* 定义所有可用的战斗属性类型
* 按逻辑分组排序:基础生存 → 攻击属性 → 防御属性 → 特殊效果 → 基础属性
*/
export enum Attrs {
// ========== 基础生存属性 (0-9) ==========
HP_MAX = 0, // 最大生命值
MP_MAX = 1, // 最大魔法值
SHIELD_MAX = 2, // 最大护盾值
HP_REGEN = 3, // 生命回复
MP_REGEN = 4, // 魔法回复
HEAL_EFFECT = 5, // 治疗效果
// ========== 攻击属性 (10-19) ==========
AP = 10, // 攻击力
MAP = 11, // 魔法攻击力
DIS = 12, // 攻击距离
AS = 13, // 攻击速度减少技能skills[0]CD
SS = 14, // 技能速度 (减少skills[0] 以外的cd)
SKILL_DURATION = 15, // 技能持续时间
AREA_OF_EFFECT = 16, // 作用范围
PIERCE = 17, // 穿透次数
// ========== 防御属性 (20-29) ==========
DEF = 20, // 物理防御
MDEF = 21, // 魔法防御
DODGE = 22, // 闪避率
BLOCK = 23, // 格挡率
DMG_RED = 24, // 伤害减免
THORNS = 25, // 反伤
CRITICAL_RESIST = 26, // 暴击抗性
CON_RES = 27, // 控制抗性
// ========== 暴击与命中属性 (30-39) ==========
CRITICAL = 30, // 暴击率
CRITICAL_DMG = 31, // 暴击伤害
HIT = 32, // 命中率
// ========== 元素属性 (40-49) ==========
ICE_RES = 40, // 冰冻抗性
FIRE_RES = 41, // 火焰抗性
WIND_RES = 42, // 自然抗性
PHYS_RES = 43, // 物理抗性
MAGIC_RES = 44, // 魔法抗性
ICE_POWER = 45, // 冰冻伤害加成
FIRE_POWER = 46, // 火焰伤害加成
WIND_POWER = 47, // 自然伤害加成
PHYS_POWER = 48, // 物理伤害加成
MAGIC_POWER= 49,
// ========== 特殊效果属性 (50-59) ==========
LIFESTEAL = 50, // 吸血比率
MANASTEAL = 51, // 吸蓝比率
FREEZE_CHANCE = 52, // 冰冻概率
BURN_CHANCE = 53, // 燃烧概率
STUN_CHANCE = 54, // 眩晕概率
BACK_CHANCE = 55, // 击退概率
SLOW_CHANCE = 56, // 减速概率
POISON_CHANCE = 57, // 中毒概率
SILENCE_CHANCE = 58, // 沉默概率
EXPLOSION_CHANCE = 59, // 爆炸概率
// ========== 增益效果属性 (60-69) ==========
BUFF_UP = 60, // Buff效果提升
DBUFF_UP = 61, // Debuff效果提升
SHIELD_UP = 62, // 护盾效果提升
SPEED = 63, // 移动速度加成
EXP_GAIN = 64, // 经验获取
GOLD_GAIN = 65, // 金币获取
DROP_CHANCE = 66, // 掉落率
REVIVE_COUNT = 67, // 复活次数
REVIVE_TIME = 68, // 复活时间
INVINCIBLE_TIME = 69, // 无敌时间
// ========== 武器进化相关 (70-79) ==========
PUNCTURE = 70, // 穿刺次数
PUNCTURE_DMG = 71, // 穿刺伤害
MOVE_SPEED = 74, // 移动速度
BURN = 75, // 易伤效果
WFUNY = 77, // 风怒
// ========== 负面状态相关 (80-89) ==========
DMG_INVUL = 80, //易伤
// ========== 基础属性(影响其他属性) (90-99)==========
STRENGTH = 90, // 力量(影响物理相关)
INTELLIGENCE = 91, // 智力(影响魔法相关)
AGILITY = 92, // 敏捷(影响速度和闪避)
SPIRIT = 93, // 精神(影响抗性和特殊效果)
LUCK = 94, // 幸运(影响暴击和特殊概率)
}
/**
* 初始化英雄属性对象
* 遍历 Attrs 枚举的所有数字值,返回一个属性初始值为 0 的对象
* @returns 属性映射对象 { 属性ID: 0 }
*/
export const getAttrs = () => {
// 遍历枚举的数字值(枚举会生成双向映射)
let reAttrs = {};
Object.keys(Attrs).forEach(key => {
if (!isNaN(Number(key))) {
reAttrs[Number(key)] = 0;
}
});
return reAttrs;
}
export const getNeAttrs = () => {
let reAttrs = {};
Object.keys(NeAttrs).forEach(key => {
if (!isNaN(Number(key))) {
reAttrs[Number(key)] = {
value: 0,
time: 0,
};
}
});
return reAttrs;
}
/**
* 属性类型配置表
* 用于区分每个属性是数值型还是百分比型
* - VALUE: 数值型属性(如生命值、攻击力等绝对数值)
* - RATIO: 百分比型属性(如暴击率、闪避率等百分比数值)
* 按新的Attrs枚举顺序重新组织
*/
export const AttrsType: Record<Attrs, BType> = {
// ========== 基础生存属性(数值型) ==========
[Attrs.HP_MAX]: BType.VALUE, // 最大生命值 - 数值型
[Attrs.MP_MAX]: BType.VALUE, // 最大魔法值 - 数值型
[Attrs.SHIELD_MAX]: BType.VALUE, // 最大护盾值 - 数值型
[Attrs.HP_REGEN]: BType.VALUE, // 生命回复 - 数值型
[Attrs.MP_REGEN]: BType.VALUE, // 魔法回复 - 数值型
[Attrs.HEAL_EFFECT]: BType.RATIO, // 治疗效果 - 百分比型
// ========== 攻击属性(数值型) ==========
[Attrs.AP]: BType.VALUE, // 攻击力 - 数值型
[Attrs.MAP]: BType.VALUE, // 魔法攻击力 - 数值型
[Attrs.DIS]: BType.VALUE, // 攻击距离 - 数值型
[Attrs.AS]: BType.RATIO, // 攻击速度 - 百分比型
[Attrs.SS]: BType.RATIO, // 技能速度 - 百分比型
[Attrs.SKILL_DURATION]: BType.RATIO, // 技能持续时间 - 百分比型
[Attrs.AREA_OF_EFFECT]: BType.VALUE, // 作用范围 - 数值型
[Attrs.PIERCE]: BType.VALUE, // 穿透次数 - 数值型
// ========== 防御属性(混合类型) ==========
[Attrs.DEF]: BType.VALUE, // 物理防御 - 数值型
[Attrs.MDEF]: BType.VALUE, // 魔法防御 - 数值型
[Attrs.DODGE]: BType.RATIO, // 闪避率 - 百分比型
[Attrs.BLOCK]: BType.RATIO, // 格挡率 - 百分比型
[Attrs.DMG_RED]: BType.RATIO, // 伤害减免 - 百分比型
[Attrs.THORNS]: BType.RATIO, // 反伤 - 百分比型
// ========== 暴击与命中属性(百分比型) ==========
[Attrs.CRITICAL]: BType.RATIO, // 暴击率 - 百分比型
[Attrs.CRITICAL_DMG]: BType.RATIO, // 暴击伤害 - 百分比型
[Attrs.HIT]: BType.RATIO, // 命中率 - 百分比型
[Attrs.CRITICAL_RESIST]: BType.RATIO, // 暴击抗性 - 百分比型
[Attrs.CON_RES]: BType.RATIO, // 控制抗性 - 百分比型
// ========== 元素属性(百分比型) ==========
[Attrs.ICE_RES]: BType.RATIO, // 冰冻抗性 - 百分比型
[Attrs.FIRE_RES]: BType.RATIO, // 火焰抗性 - 百分比型
[Attrs.WIND_RES]: BType.RATIO, // 风抗性 - 百分比型
[Attrs.PHYS_RES]: BType.RATIO, // 物理抗性 - 百分比型
[Attrs.MAGIC_RES]:BType.RATIO,
[Attrs.ICE_POWER]: BType.RATIO, // 冰冻伤害加成 - 百分比型
[Attrs.FIRE_POWER]: BType.RATIO, // 火焰伤害加成 - 百分比型
[Attrs.WIND_POWER]: BType.RATIO, // 风伤害加成 - 百分比型
[Attrs.PHYS_POWER]: BType.RATIO, // 物理伤害加成 - 百分比型
[Attrs.MAGIC_POWER]: BType.RATIO, // 物理伤害加成 - 百分比型
// ========== 特殊效果属性(百分比型) ==========
[Attrs.LIFESTEAL]: BType.RATIO, // 吸血比率 - 百分比型
[Attrs.MANASTEAL]: BType.RATIO, // 吸蓝 - 百分比型
[Attrs.FREEZE_CHANCE]: BType.RATIO, // 冰冻概率 - 百分比型
[Attrs.BURN_CHANCE]: BType.RATIO, // 燃烧概率 - 百分比型
[Attrs.STUN_CHANCE]: BType.RATIO, // 眩晕概率 - 百分比型
[Attrs.BACK_CHANCE]: BType.RATIO, // 击退概率 - 百分比型
[Attrs.SLOW_CHANCE]: BType.RATIO, // 减速概率 - 百分比型
[Attrs.POISON_CHANCE]: BType.RATIO, // 中毒概率 - 百分比型
[Attrs.SILENCE_CHANCE]: BType.RATIO, // 沉默概率 - 百分比型
[Attrs.EXPLOSION_CHANCE]: BType.RATIO, // 爆炸概率 - 百分比型
// ========== 增益效果属性(百分比型) ==========
[Attrs.BUFF_UP]: BType.RATIO, // Buff效果提升 - 百分比型
[Attrs.DBUFF_UP]: BType.RATIO, // Debuff效果提升 - 百分比型
[Attrs.SHIELD_UP]: BType.RATIO, // 护盾效果提升 - 百分比型
[Attrs.SPEED]: BType.RATIO, // 移动速度加成 - 百分比型
[Attrs.EXP_GAIN]: BType.RATIO, // 经验获取 - 百分比型
[Attrs.GOLD_GAIN]: BType.RATIO, // 金币获取 - 百分比型
[Attrs.DROP_CHANCE]: BType.RATIO, // 掉落率 - 百分比型
[Attrs.REVIVE_COUNT]: BType.VALUE, // 复活次数 - 数值型
[Attrs.REVIVE_TIME]: BType.RATIO, // 复活时间 - 百分比型
[Attrs.INVINCIBLE_TIME]: BType.RATIO, // 无敌时间 - 百分比型
// ========== 武器进化相关(混合类型) ==========
[Attrs.PUNCTURE]: BType.VALUE, // 穿刺次数 - 数值型
[Attrs.PUNCTURE_DMG]: BType.RATIO, // 穿刺伤害 - 百分比型
[Attrs.MOVE_SPEED]: BType.VALUE, // 移动速度 - 数值型
[Attrs.BURN]: BType.RATIO, // 易伤效果 - 百分比型
[Attrs.WFUNY]: BType.RATIO, // 未知特殊属性 - 百分比型
// ========== 负面状态相关(混合类型) ==========
[Attrs.DMG_INVUL]: BType.RATIO, //易伤
// ========== 基础属性(数值型) ==========
[Attrs.STRENGTH]: BType.VALUE, // 力量 - 数值型
[Attrs.INTELLIGENCE]: BType.VALUE, // 智力 - 数值型
[Attrs.AGILITY]: BType.VALUE, // 敏捷 - 数值型
[Attrs.SPIRIT]: BType.VALUE, // 精神 - 数值型
[Attrs.LUCK]: BType.VALUE, // 幸运 - 数值型
};
/**
* 判断属性是否为百分比型
* @param attrType 属性类型
* @returns true: 百分比型, false: 数值型
*/
export const isRatioAttr = (attrType: Attrs): boolean => {
return AttrsType[attrType] === BType.RATIO;
};
/**
* 职业属性增长系数配置
* 定义不同职业类型下,基础属性对战斗属性的差异化转化比例
*/
/**
* 基础属性增长映射接口
*/
export interface BaseAttrGrowthRate {
[targetAttr: number]: number; // 目标属性 -> 增长系数
}
/**
* 职业属性增长配置接口
*/
export interface HeroTypeAttrGrowth {
[baseAttr: number]: BaseAttrGrowthRate; // 基础属性 -> 目标属性增长配置
}
/**
* 职业属性增长配置表
* 体现不同职业的成长特色
*/
export const HeroTypeGrowthConfig: Record<HType, HeroTypeAttrGrowth> = {
// ========== 战士 (Warrior) ==========
// 特点:高生命、高物理攻击、高物理防御
[HType.warrior]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 3, // 力量 -> 生命值 (战士系数更高)
[Attrs.AP]: 1.5, // 力量 -> 攻击力 (战士系数更高)
[Attrs.DEF]: 0.8, // 力量 -> 物理防御
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 0.5, // 智力 -> 魔法值 (战士系数较低)
[Attrs.MAP]: 0.3, // 智力 -> 魔法攻击 (战士不擅长)
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 0.3, // 敏捷 -> 暴击率
[Attrs.DODGE]: 0.2, // 敏捷 -> 闪避 (战士较低)
[Attrs.AS]: 0.2, // 敏捷 -> 攻击速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 0.5, // 精神 -> 魔法值
[Attrs.LIFESTEAL]: 0.4, // 精神 -> 吸血 (战士较高)
[Attrs.MDEF]: 0.3, // 精神 -> 魔法防御
[Attrs.HP_REGEN]: 0.2, // 精神 -> 生命回复
[Attrs.MP_REGEN]: 0.3, // 精神 -> 魔法回复
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 0.8, // 幸运 -> 暴击率
[Attrs.CRITICAL_DMG]: 0.4, // 幸运 -> 暴击伤害
},
},
// ========== 远程 (Remote) ==========
// 特点:高敏捷、高攻速、高暴击
[HType.remote]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 1.5, // 力量 -> 生命值 (远程较低)
[Attrs.AP]: 1.2, // 力量 -> 攻击力
[Attrs.DEF]: 0.4, // 力量 -> 物理防御 (远程较低)
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 0.8, // 智力 -> 魔法值
[Attrs.MAP]: 0.5, // 智力 -> 魔法攻击
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 0.8, // 敏捷 -> 暴击率 (远程很高)
[Attrs.DODGE]: 0.6, // 敏捷 -> 闪避 (远程较高)
[Attrs.AS]: 0.5, // 敏捷 -> 攻击速度 (远程很高)
[Attrs.SPEED]: 0.3, // 敏捷 -> 移动速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 0.6, // 精神 -> 魔法值
[Attrs.HIT]: 0.5, // 精神 -> 命中 (远程需要精准)
[Attrs.MDEF]: 0.3, // 精神 -> 魔法防御
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 1.2, // 幸运 -> 暴击率 (远程最高)
[Attrs.CRITICAL_DMG]: 0.8, // 幸运 -> 暴击伤害 (远程很高)
[Attrs.HIT]: 0.4, // 幸运 -> 命中
},
},
// ========== 法师 (Mage) ==========
// 特点:高魔法攻击、高魔法值、高魔法防御
[HType.mage]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 1.2, // 力量 -> 生命值 (法师很低)
[Attrs.AP]: 0.3, // 力量 -> 攻击力 (法师不需要)
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 2, // 智力 -> 魔法值 (法师最高)
[Attrs.MAP]: 1.8, // 智力 -> 魔法攻击 (法师最高)
[Attrs.MDEF]: 0.8, // 智力 -> 魔法防御
[Attrs.AREA_OF_EFFECT]: 0.3, // 智力 -> 作用范围
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 0.4, // 敏捷 -> 暴击率
[Attrs.DODGE]: 0.3, // 敏捷 -> 闪避
[Attrs.AS]: 0.3, // 敏捷 -> 攻击速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 1.5, // 精神 -> 魔法值 (法师较高)
[Attrs.MDEF]: 0.8, // 精神 -> 魔法防御 (法师较高)
[Attrs.CON_RES]: 0.3, // 精神 -> 控制抗性
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 0.6, // 幸运 -> 暴击率
[Attrs.CRITICAL_DMG]: 0.5, // 幸运 -> 暴击伤害
},
},
// ========== 辅助 (Support) ==========
// 特点:高生命、高魔法值、高抗性、高辅助效果
[HType.support]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 2.5, // 力量 -> 生命值 (辅助较高)
[Attrs.AP]: 0.5, // 力量 -> 攻击力 (辅助较低)
[Attrs.DEF]: 0.6, // 力量 -> 物理防御
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 1.5, // 智力 -> 魔法值 (辅助需要)
[Attrs.MAP]: 0.8, // 智力 -> 魔法攻击
[Attrs.MDEF]: 0.6, // 智力 -> 魔法防御
},
[Attrs.AGILITY]: {
[Attrs.DODGE]: 0.4, // 敏捷 -> 闪避
[Attrs.AS]: 0.3, // 敏捷 -> 攻击速度
[Attrs.SPEED]: 0.4, // 敏捷 -> 移动速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 2, // 精神 -> 魔法值 (辅助很高)
[Attrs.LIFESTEAL]: 0.5, // 精神 -> 吸血
[Attrs.MDEF]: 0.8, // 精神 -> 魔法防御 (辅助较高)
[Attrs.CON_RES]: 0.5, // 精神 -> 控制抗性 (辅助较高)
[Attrs.BUFF_UP]: 0.6, // 精神 -> Buff效果提升 (辅助特色)
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 0.5, // 幸运 -> 暴击率
[Attrs.SHIELD_UP]: 0.8, // 幸运 -> 护盾效果提升 (辅助特色)
},
},
// ========== 刺客 (Assassin) ==========
// 特点:超高暴击、高敏捷、高爆发、低防御
[HType.assassin]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 1.8, // 力量 -> 生命值 (刺客较低)
[Attrs.AP]: 1.3, // 力量 -> 攻击力
[Attrs.DEF]: 0.3, // 力量 -> 物理防御 (刺客很低)
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 0.6, // 智力 -> 魔法值
[Attrs.MAP]: 0.4, // 智力 -> 魔法攻击
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 1, // 敏捷 -> 暴击率 (刺客超高)
[Attrs.DODGE]: 0.8, // 敏捷 -> 闪避 (刺客很高)
[Attrs.AS]: 0.6, // 敏捷 -> 攻击速度 (刺客很高)
[Attrs.SPEED]: 0.5, // 敏捷 -> 移动速度 (刺客很高)
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 0.5, // 精神 -> 魔法值
[Attrs.LIFESTEAL]: 0.6, // 精神 -> 吸血 (刺客较高)
[Attrs.MDEF]: 0.2, // 精神 -> 魔法防御 (刺客很低)
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 1.5, // 幸运 -> 暴击率 (刺客超高)
[Attrs.CRITICAL_DMG]: 1, // 幸运 -> 暴击伤害 (刺客超高)
[Attrs.HIT]: 0.3, // 幸运 -> 命中
},
},
};
/**
* 根据职业类型和基础属性,计算其他属性的增长值
* @param heroType 职业类型
* @param baseAttrType 基础属性类型STRENGTH, INTELLIGENCE, AGILITY, SPIRIT, LUCK
* @param baseAttrValue 基础属性点数
* @returns 其他属性的增长值映射表
*
* @example
* // 计算战士职业10点力量的属性增长
* const gains = calculateAttributeGains(HType.warrior, Attrs.STRENGTH, 10);
* // 返回:{ [Attrs.HP_MAX]: 30, [Attrs.AP]: 15, [Attrs.DEF]: 8 }
*/
export function calculateAttributeGains(
heroType: HType,
baseAttrType: Attrs,
baseAttrValue: number
): Partial<Record<Attrs, number>> {
const heroGrowthConfig = HeroTypeGrowthConfig[heroType];
if (!heroGrowthConfig) {
console.warn(`未找到职业类型 ${heroType} 的增长配置`);
return {};
}
const baseAttrGrowth = heroGrowthConfig[baseAttrType];
if (!baseAttrGrowth) {
console.warn(`职业 ${heroType} 不具有基础属性 ${baseAttrType} 的增长配置`);
return {};
}
const result: Partial<Record<Attrs, number>> = {};
for (const targetAttrStr in baseAttrGrowth) {
const targetAttr = Number(targetAttrStr) as Attrs;
const growthRate = baseAttrGrowth[targetAttr];
result[targetAttr] = baseAttrValue * growthRate;
}
return result;
}
/**
* 快捷方法:计算力量属性增长
* @param heroType 职业类型
* @param strengthPoints 力量点数
* @returns 其他属性的增长值
*/
export function addStrength(heroType: HType, strengthPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.STRENGTH, strengthPoints);
}
/**
* 快捷方法:计算智力属性增长
* @param heroType 职业类型
* @param intelligencePoints 智力点数
* @returns 其他属性的增长值
*/
export function addIntelligence(heroType: HType, intelligencePoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.INTELLIGENCE, intelligencePoints);
}
/**
* 快捷方法:计算敏捷属性增长
* @param heroType 职业类型
* @param agilityPoints 敏捷点数
* @returns 其他属性的增长值
*/
export function addAgility(heroType: HType, agilityPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.AGILITY, agilityPoints);
}
/**
* 快捷方法:计算精神属性增长
* @param heroType 职业类型
* @param spiritPoints 精神点数
* @returns 其他属性的增长值
*/
export function addSpirit(heroType: HType, spiritPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.SPIRIT, spiritPoints);
}
/**
* 快捷方法:计算幸运属性增长
* @param heroType 职业类型
* @param luckPoints 幸运点数
* @returns 其他属性的增长值
*/
export function addLuck(heroType: HType, luckPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.LUCK, luckPoints);
}
/**
* 计算多个基础属性的总增长
* @param heroType 职业类型
* @param baseAttrs 基础属性映射表 { 属性ID: 属性值 }
* @returns 总增长值
*
* @example
* // 计算战士职业的总属性增长
* const totalGains = calculateTotalAttributeGains(HType.warrior, {
* [Attrs.STRENGTH]: 10,
* [Attrs.AGILITY]: 5,
* [Attrs.SPIRIT]: 3
* });
*/
export function calculateTotalAttributeGains(
heroType: HType,
baseAttrs: Partial<Record<Attrs, number>>
): Partial<Record<Attrs, number>> {
const totalGains: Partial<Record<Attrs, number>> = {};
for (const baseAttrStr in baseAttrs) {
const baseAttr = Number(baseAttrStr) as Attrs;
const baseAttrValue = baseAttrs[baseAttr];
if (baseAttrValue === undefined || baseAttrValue <= 0) continue;
const gains = calculateAttributeGains(heroType, baseAttr, baseAttrValue);
for (const targetAttrStr in gains) {
const targetAttr = Number(targetAttrStr) as Attrs;
const gainValue = gains[targetAttr];
if (gainValue !== undefined) {
totalGains[targetAttr] = (totalGains[targetAttr] || 0) + gainValue;
}
}
}
return totalGains;
}