Files
heros/assets/script/game/common/config/HeroAttrs.ts

435 lines
17 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 { HType } from "./heroSet";
/**
* Buff类型枚举
* VALUE: 数值型 - 直接加减数值
* RATIO: 百分比型 - 按百分比计算
*/
export enum BType {
VALUE = 0, //数值型
RATIO = 1 //百分比型
}
// ========== 属性枚举 ==========
/**
* 英雄属性枚举
* 定义所有可用的战斗属性类型
*/
export enum Attrs {
HP_MAX = 0, //生命值
MP_MAX = 1, //魔法值
SHIELD_MAX = 2, //护盾
AP = 3, //攻击力
MAP = 4, //魔法攻击力
DEF = 5, //防御
MDEF = 6, //魔法防御
CRITICAL = 7, //暴击率
CRITICAL_DMG = 8, //暴击伤害
DODGE = 9, //闪避
HIT = 10, //命中
WFUNY = 11, // 风怒
AS = 12, //攻击速度,直接减技能cd
REFLICT = 13, //反伤比率
LIFESTEAL = 14, //吸血比率
BACK = 15, //攻击带击退概率
DEBACK = 16, //被攻击击退概率
CON_RES = 17, //控制抗性
ICE_RES = 18, //冰冻抗性
FIRE_RES = 19, //火抗性
WIND_RES = 20, //风抗性
ICE_POWER = 21, //冰冻伤害效果提升
FIRE_POWER = 22, //火伤害效果提升
WIND_POWER = 23, //风伤害效果提升
BUFF_UP = 24, //buff效果提升
DBUFF_UP = 25, //debuff效果提升
DIS = 26, //攻击距离
SPEED = 27, //移动速度加成,默认都是百分比
SHIELD_UP = 28, //护盾效果提升
BURN = 29, //攻击带易伤
DEBURN = 30, //被攻击易伤
PUNCTURE = 31, // 穿刺次数
PUNCTURE_DMG = 32, //穿刺伤害加成
// 基础属性
STRENGTH = 33, //力量
INTELLIGENCE = 34, //智力
AGILITY = 35, //敏捷
SPIRIT = 36, //精神
LUCK = 37, //幸运
}
/**
* 初始化英雄属性对象
* 遍历 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;
}
/**
* 属性类型配置表
* 用于区分每个属性是数值型还是百分比型
* - VALUE: 数值型属性(如生命值、攻击力等绝对数值)
* - RATIO: 百分比型属性(如暴击率、闪避率等百分比数值)
*/
export const AttrsType: Record<Attrs, BType> = {
// ========== 数值型属性 ==========
[Attrs.HP_MAX]: BType.VALUE, // 最大生命值 - 数值型
[Attrs.MP_MAX]: BType.VALUE, // 最大魔法值 - 数值型
[Attrs.SHIELD_MAX]: BType.VALUE, // 最大护盾值 - 数值型
[Attrs.AP]: BType.VALUE, // 攻击力 - 数值型
[Attrs.MAP]: BType.VALUE, // 魔法攻击力 - 数值型
[Attrs.DEF]: BType.VALUE, // 防御 - 数值型
[Attrs.MDEF]: BType.VALUE, // 魔法防御 - 数值型
[Attrs.DIS]: BType.VALUE, // 攻击距离 - 数值型
[Attrs.BURN]: BType.VALUE, // 易伤 - 数值型
[Attrs.DEBURN]: BType.VALUE, // 被攻击易伤 - 数值型
[Attrs.PUNCTURE]: BType.VALUE, // 穿刺次数 - 数值型
[Attrs.STRENGTH]: BType.VALUE, // 力量 - 数值型
[Attrs.INTELLIGENCE]: BType.VALUE, // 智力 - 数值型
[Attrs.AGILITY]: BType.VALUE, // 敏捷 - 数值型
[Attrs.SPIRIT]: BType.VALUE, // 精神 - 数值型
[Attrs.LUCK]: BType.VALUE, // 幸运 - 数值型
// ========== 百分比型属性 ==========
[Attrs.CRITICAL]: BType.RATIO, // 暴击率 - 百分比型
[Attrs.CRITICAL_DMG]: BType.RATIO, // 暴击伤害 - 百分比型
[Attrs.DODGE]: BType.RATIO, // 闪避 - 百分比型
[Attrs.HIT]: BType.RATIO, // 命中 - 百分比型
[Attrs.WFUNY]: BType.RATIO, // 风怒 - 百分比型
[Attrs.AS]: BType.RATIO, // 攻击速度 - 百分比型
[Attrs.REFLICT]: BType.RATIO, // 反伤比率 - 百分比型
[Attrs.LIFESTEAL]: BType.RATIO, // 吸血比率 - 百分比型
[Attrs.BACK]: BType.RATIO, // 击退概率 - 百分比型
[Attrs.CON_RES]: BType.RATIO, // 控制抗性 - 百分比型
[Attrs.ICE_RES]: BType.RATIO, // 冰冻抗性 - 百分比型
[Attrs.FIRE_RES]: BType.RATIO, // 火抗性 - 百分比型
[Attrs.WIND_RES]: BType.RATIO, // 风抗性 - 百分比型
[Attrs.ICE_POWER]: BType.RATIO, // 冰冻伤害效果提升 - 百分比型
[Attrs.FIRE_POWER]: BType.RATIO, // 火伤害效果提升 - 百分比型
[Attrs.WIND_POWER]: BType.RATIO, // 风伤害效果提升 - 百分比型
[Attrs.DEBACK]: BType.RATIO, // 被击退概率 - 百分比型
[Attrs.BUFF_UP]: BType.RATIO, // buff效果提升 - 百分比型
[Attrs.DBUFF_UP]: BType.RATIO, // debuff效果提升 - 百分比型
[Attrs.SPEED]: BType.RATIO, // 移动速度加成 - 百分比型
[Attrs.SHIELD_UP]: BType.RATIO, // 护盾效果提升 - 百分比型
[Attrs.PUNCTURE_DMG]: BType.RATIO, // 穿刺伤害加成 - 百分比型
};
/**
* 判断属性是否为百分比型
* @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.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.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;
}