refactor(hero): 删除英雄属性增长与升级资源相关代码
- 移除 heroSet.ts 中职业属性增长配置和全局属性增长配置 - 删除计算英雄属性等级的相关函数及升级资源配置 - Hero.ts 中初始化英雄属性时,改用静态 HeroInfo 数据赋值 - map/HInfoComp.ts 中移除未使用的属性增长及升级资源相关导入 - 简化英雄属性管理,减少复杂成长逻辑,提高数据维护效率
This commit is contained in:
@@ -204,253 +204,3 @@ export const HeroInfo = {
|
||||
|
||||
};
|
||||
|
||||
// 职业属性增长配置
|
||||
export const JobGrowthConfig = {
|
||||
[HType.warrior]: {
|
||||
hp: { base: 1.0, growth: 8, maxLevel: 100, level5Bonus: 0.5 }, // 战士:生命值增长最高,5级额外50%
|
||||
ap: { base: 1.0, growth: 2, maxLevel: 100, level5Bonus: 0.3 }, // 战士:攻击力中等增长,5级额外30%
|
||||
def: { base: 1.0, growth: 1, maxLevel: 100, level5Bonus: 0.2, maxValue: 50 } // 战士:防御力较高增长,5级额外20%,最高50%
|
||||
},
|
||||
[HType.remote]: {
|
||||
hp: { base: 1.0, growth: 5, maxLevel: 100, level5Bonus: 0.3 }, // 远程:生命值增长较低,5级额外30%
|
||||
ap: { base: 1.0, growth: 3, maxLevel: 100, level5Bonus: 0.5 }, // 远程:攻击力增长最高,5级额外50%
|
||||
def: { base: 1.0, growth: 0.8, maxLevel: 100, level5Bonus: 0.15, maxValue: 50 } // 远程:防御力增长最低,5级额外15%,最高50%
|
||||
},
|
||||
[HType.mage]: {
|
||||
hp: { base: 1.0, growth: 6, maxLevel: 100, level5Bonus: 0.4 }, // 法师:生命值中等增长,5级额外40%
|
||||
ap: { base: 1.0, growth: 4, maxLevel: 100, level5Bonus: 0.6 }, // 法师:攻击力增长最高,5级额外60%
|
||||
def: { base: 1.0, growth: 0.5, maxLevel: 100, level5Bonus: 0.1, maxValue: 50 } // 法师:防御力增长最低,5级额外10%,最高50%
|
||||
}
|
||||
};
|
||||
|
||||
// 全局属性增长配置(可调整)
|
||||
export const GlobalGrowthConfig = {
|
||||
// 基础增长公式:base + (level - 1) * growthValue + level5Bonus
|
||||
// 5级时额外获得百分比提升
|
||||
hpMultiplier: 1.0, // 生命值全局倍数
|
||||
apMultiplier: 1.0, // 攻击力全局倍数
|
||||
defMultiplier: 1.0, // 防御力全局倍数
|
||||
|
||||
// 5级特殊提升配置
|
||||
level5Bonus: {
|
||||
enabled: true, // 是否启用5级特殊提升
|
||||
triggerLevels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95], // 触发特殊提升的等级
|
||||
bonusDecay: 0.9 // 每次特殊提升的衰减率
|
||||
},
|
||||
|
||||
// 防御力特殊规则
|
||||
defense: {
|
||||
maxDamageReduction: 50, // 最大免伤率50%
|
||||
warningThreshold: 45, // 警告阈值45%
|
||||
growthCurve: 0.8 // 防御力增长曲线(高等级时增长放缓)
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 计算指定等级的英雄属性
|
||||
* @param baseStats 基础属性 {hp, ap, def}
|
||||
* @param jobType 职业类型 HType
|
||||
* @param level 等级
|
||||
* @param customGrowth 自定义增长配置(可选)
|
||||
* @returns 计算后的属性 {hp, ap, def}
|
||||
*/
|
||||
export const calculateHeroStats = (
|
||||
baseStats: { hp: number, ap: number, def: number },
|
||||
jobType: HType,
|
||||
level: number,
|
||||
customGrowth?: Partial<typeof JobGrowthConfig[0]>
|
||||
) => {
|
||||
// 获取职业增长配置
|
||||
const jobConfig = customGrowth || JobGrowthConfig[jobType];
|
||||
if (!jobConfig) {
|
||||
console.warn(`未找到职业 ${jobType} 的增长配置,使用默认配置`);
|
||||
return baseStats;
|
||||
}
|
||||
|
||||
// 限制等级范围
|
||||
const clampedLevel = Math.max(1, Math.min(level, jobConfig.hp.maxLevel));
|
||||
|
||||
// 计算属性增长
|
||||
const calculateAttribute = (baseValue: number, growthConfig: any, isDefense: boolean = false) => {
|
||||
if (clampedLevel <= 1) return baseValue;
|
||||
|
||||
// 基础数值增长:每级增加固定数值
|
||||
let result = baseValue + (clampedLevel - 1) * growthConfig.growth;
|
||||
|
||||
// 检查是否触发特殊提升(5级、15级、25级等)
|
||||
if (GlobalGrowthConfig.level5Bonus.enabled) {
|
||||
const bonusLevels = GlobalGrowthConfig.level5Bonus.triggerLevels;
|
||||
const bonusIndex = bonusLevels.findIndex(l => clampedLevel >= l);
|
||||
|
||||
if (bonusIndex !== -1) {
|
||||
// 计算特殊提升的衰减
|
||||
const decayMultiplier = Math.pow(GlobalGrowthConfig.level5Bonus.bonusDecay, bonusIndex);
|
||||
const bonusMultiplier = growthConfig.level5Bonus * decayMultiplier;
|
||||
|
||||
// 应用特殊提升(基于当前数值的百分比)
|
||||
result = result * (1 + bonusMultiplier);
|
||||
|
||||
console.log(`[HeroSet] 等级${clampedLevel}触发特殊提升: ${(bonusMultiplier * 100).toFixed(1)}%`);
|
||||
}
|
||||
}
|
||||
|
||||
// 防御力特殊处理:确保免伤率不超过最大值
|
||||
if (isDefense) {
|
||||
const maxDef = growthConfig.maxValue || GlobalGrowthConfig.defense.maxDamageReduction;
|
||||
result = Math.min(result, maxDef);
|
||||
|
||||
// 高等级时应用增长曲线,让防御力增长更平缓
|
||||
if (clampedLevel > 50) {
|
||||
const curveMultiplier = Math.pow(GlobalGrowthConfig.defense.growthCurve, (clampedLevel - 50) / 10);
|
||||
result = baseValue + (result - baseValue) * curveMultiplier;
|
||||
result = Math.min(result, maxDef);
|
||||
}
|
||||
|
||||
// 警告日志
|
||||
if (result >= GlobalGrowthConfig.defense.warningThreshold) {
|
||||
console.warn(`[HeroSet] 警告:等级${clampedLevel}的防御力(${result.toFixed(1)})接近最大值(${maxDef})`);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
// 计算各项属性
|
||||
const hp = calculateAttribute(baseStats.hp, jobConfig.hp);
|
||||
const ap = calculateAttribute(baseStats.ap, jobConfig.ap);
|
||||
const def = calculateAttribute(baseStats.def, jobConfig.def, true); // 标记为防御力
|
||||
|
||||
return {
|
||||
hp: Math.floor(hp * GlobalGrowthConfig.hpMultiplier),
|
||||
ap: Math.floor(ap * GlobalGrowthConfig.apMultiplier),
|
||||
def: Math.floor(def * GlobalGrowthConfig.defMultiplier)
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取指定英雄在指定等级的属性
|
||||
* @param heroUuid 英雄UUID
|
||||
* @param level 等级
|
||||
* @param customGrowth 自定义增长配置(可选)
|
||||
* @returns 计算后的属性 {hp, ap, def} 或 null(如果英雄不存在)
|
||||
*/
|
||||
export const getHeroStatsByLevel = (
|
||||
heroUuid: number,
|
||||
level: number,
|
||||
customGrowth?: Partial<typeof JobGrowthConfig[0]>
|
||||
) => {
|
||||
const hero = HeroInfo[heroUuid];
|
||||
if (!hero) {
|
||||
console.warn(`未找到英雄 ${heroUuid}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const baseStats = {
|
||||
hp: hero.hp || 0,
|
||||
ap: hero.ap || 0,
|
||||
def: hero.def || 0
|
||||
};
|
||||
|
||||
return calculateHeroStats(baseStats, hero.type, level, customGrowth);
|
||||
};
|
||||
|
||||
/**
|
||||
* 批量获取英雄等级属性
|
||||
* @param heroUuids 英雄UUID数组
|
||||
* @param level 等级
|
||||
* @param customGrowth 自定义增长配置(可选)
|
||||
* @returns 英雄属性映射表
|
||||
*/
|
||||
export const getMultipleHeroStatsByLevel = (
|
||||
heroUuids: number[],
|
||||
level: number,
|
||||
customGrowth?: Partial<typeof JobGrowthConfig[0]>
|
||||
) => {
|
||||
const result: { [uuid: number]: { hp: number, ap: number, def: number } } = {};
|
||||
|
||||
heroUuids.forEach(uuid => {
|
||||
const stats = getHeroStatsByLevel(uuid, level, customGrowth);
|
||||
if (stats) {
|
||||
result[uuid] = stats;
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 升级资源配置
|
||||
export const UpgradeResourceConfig = {
|
||||
// 经验值配置
|
||||
experience: {
|
||||
base: 100, // 初始值:1级升2级所需经验
|
||||
growth: 50, // 增长值:每级增长倍数
|
||||
bonus: 100 // 增长值提升比例:5级倍数提升20%
|
||||
},
|
||||
|
||||
// 金币配置
|
||||
gold: {
|
||||
base: 50, // 初始值:1级升2级所需金币
|
||||
growth: 100, // 增长值:每级增长倍数
|
||||
bonus: 500 // 增长值提升比例:5级倍数提升15%
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取指定等级升级所需的经验值
|
||||
* @param level 当前等级
|
||||
* @returns 升级所需经验值
|
||||
*/
|
||||
export const getUpgradeExperience = (level: number): number => {
|
||||
if (level <= 0) return 0;
|
||||
let next_level=level+1
|
||||
const config = UpgradeResourceConfig.experience;
|
||||
let result = config.base + config.growth * (next_level - 1);
|
||||
|
||||
// 5级倍数提升
|
||||
if (next_level % 5 === 0) {
|
||||
result = result + config.bonus*next_level;
|
||||
}
|
||||
|
||||
return Math.floor(result);
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取指定等级升级所需的金币
|
||||
* @param level 当前等级
|
||||
* @returns 升级所需金币
|
||||
*/
|
||||
export const getUpgradeGold = (level: number): number => {
|
||||
if (level <= 0) return 0;
|
||||
let next_level=level+1
|
||||
const config = UpgradeResourceConfig.gold;
|
||||
let result = config.base + config.growth * (next_level - 1);
|
||||
|
||||
// 5级倍数提升
|
||||
if (next_level % 5 === 0) {
|
||||
result = result + config.bonus*next_level;
|
||||
}
|
||||
|
||||
return Math.floor(result);
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取指定等级升级所需的所有资源
|
||||
* @param level 当前等级
|
||||
* @returns 升级资源信息 {experience, gold}
|
||||
*/
|
||||
export const getUpgradeResources = (level: number) => {
|
||||
return {
|
||||
experience: getUpgradeExperience(level),
|
||||
gold: getUpgradeGold(level)
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user