top 血条样式调整 - 在HeroAttrsComp中添加pow属性表示当前怒气值 - 在HeroAttrs枚举中添加POW_MAX和POW_REGEN属性 - 修改HeroViewComp根据英雄类型显示不同资源条 - 调整boss血条位置偏移量 - 注释掉物理系统调试绘制代码
550 lines
22 KiB
TypeScript
550 lines
22 KiB
TypeScript
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 const getNeAttrs = () => {
|
||
let reAttrs = {};
|
||
Object.keys(NeAttrs).forEach(key => {
|
||
if (!isNaN(Number(key))) {
|
||
reAttrs[Number(key)] = {
|
||
value: 0,
|
||
time: 0,
|
||
};
|
||
}
|
||
});
|
||
return reAttrs;
|
||
}
|
||
// ========== 属性枚举 ==========
|
||
/**
|
||
* 英雄属性枚举
|
||
* 定义所有可用的战斗属性类型
|
||
* 按逻辑分组排序:基础生存 → 攻击属性 → 防御属性 → 特殊效果 → 基础属性
|
||
*/
|
||
export enum Attrs {
|
||
// ========== 基础生存属性 (0-9) ==========
|
||
HP_MAX = 0, // 最大生命值
|
||
MP_MAX = 1, // 最大魔法值
|
||
SHIELD_MAX = 2, // 最大护盾值
|
||
HP_REGEN = 3, // 生命回复
|
||
MP_REGEN = 4, // 魔法回复
|
||
HEAL_EFFECT = 5, // 治疗效果
|
||
POW_MAX = 6, // 最大怒气值
|
||
POW_REGEN = 7, // 怒气值回复
|
||
|
||
// ========== 攻击属性 (10-19) ==========
|
||
AP = 10, // 攻击力
|
||
MAP = 11, // 魔法攻击力
|
||
DIS = 12, // 攻击距离
|
||
AS = 13, // 攻击速度(减少技能CD)
|
||
SKILL_DURATION = 14, // 技能持续时间
|
||
AREA_OF_EFFECT = 15, // 作用范围
|
||
PIERCE = 16, // 穿透次数
|
||
|
||
// ========== 防御属性 (20-29) ==========
|
||
DEF = 20, // 物理防御
|
||
MDEF = 21, // 魔法防御
|
||
DODGE = 22, // 闪避率
|
||
BLOCK = 23, // 格挡率
|
||
DAMAGE_REDUCTION = 24, // 伤害减免
|
||
THORNS = 25, // 反伤
|
||
CRITICAL_RESIST = 26, // 暴击抗性
|
||
CON_RES = 27, // 控制抗性
|
||
MAGIC_RES = 28, // 魔法抗性
|
||
|
||
// ========== 暴击与命中属性 (30-39) ==========
|
||
CRITICAL = 30, // 暴击率
|
||
CRITICAL_DMG = 31, // 暴击伤害
|
||
HIT = 32, // 命中率
|
||
|
||
// ========== 元素属性 (40-49) ==========
|
||
ICE_RES = 40, // 冰冻抗性
|
||
FIRE_RES = 41, // 火焰抗性
|
||
WIND_RES = 42, // 自然抗性
|
||
ICE_POWER = 43, // 冰冻伤害加成
|
||
FIRE_POWER = 44, // 火焰伤害加成
|
||
WIND_POWER = 45, // 自然伤害加成
|
||
|
||
|
||
// ========== 特殊效果属性 (50-59) ==========
|
||
LIFESTEAL = 50, // 吸血比率
|
||
MANASTEAL = 51, // 吸蓝比率
|
||
FREEZE_CHANCE = 52, // 冰冻概率
|
||
BURN_CHANCE = 53, // 燃烧概率
|
||
STUN_CHANCE = 54, // 眩晕概率
|
||
KNOCKBACK = 55, // 击退概率
|
||
SLOW_CHANCE = 56, // 减速概率
|
||
POISON_CHANCE = 57, // 中毒概率
|
||
CHAIN_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, // 穿刺伤害
|
||
BACK = 73, // 被击退概率(兼容旧代码)
|
||
MOVE_SPEED = 74, // 移动速度
|
||
BURN = 75, // 易伤效果
|
||
WFUNY = 77, // 风怒
|
||
|
||
// ========== 生存与恢复相关 (80-89) ==========
|
||
|
||
// ========== 负面状态相关 (90-99) ==========
|
||
|
||
// ========== 基础属性(影响其他属性)(100-104) ==========
|
||
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;
|
||
}
|
||
|
||
/**
|
||
* 属性类型配置表
|
||
* 用于区分每个属性是数值型还是百分比型
|
||
* - 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.POW_MAX]: BType.VALUE, // 最大怒气值 - 数值型
|
||
[Attrs.POW_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.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.DAMAGE_REDUCTION]: 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.MAGIC_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.LIFESTEAL]: BType.RATIO, // 吸血比率 - 百分比型
|
||
[Attrs.MANASTEAL]: BType.RATIO, // 吸蓝 - 百分比型
|
||
[Attrs.FREEZE_CHANCE]: BType.RATIO, // 冰冻概率 - 百分比型
|
||
[Attrs.BURN_CHANCE]: BType.RATIO, // 燃烧概率 - 百分比型
|
||
[Attrs.STUN_CHANCE]: BType.RATIO, // 眩晕概率 - 百分比型
|
||
[Attrs.KNOCKBACK]: BType.RATIO, // 击退 - 百分比型
|
||
[Attrs.SLOW_CHANCE]: BType.RATIO, // 减速概率 - 百分比型
|
||
[Attrs.POISON_CHANCE]: BType.RATIO, // 中毒概率 - 百分比型
|
||
[Attrs.CHAIN_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.BACK]: BType.RATIO, // 被击退概率(兼容)- 百分比型
|
||
[Attrs.MOVE_SPEED]: BType.VALUE, // 移动速度 - 数值型
|
||
[Attrs.BURN]: BType.RATIO, // 易伤效果 - 百分比型
|
||
[Attrs.WFUNY]: 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;
|
||
}
|