refactor(hero): 删除英雄属性增长与升级资源相关代码

- 移除 heroSet.ts 中职业属性增长配置和全局属性增长配置
- 删除计算英雄属性等级的相关函数及升级资源配置
- Hero.ts 中初始化英雄属性时,改用静态 HeroInfo 数据赋值
- map/HInfoComp.ts 中移除未使用的属性增长及升级资源相关导入
- 简化英雄属性管理,减少复杂成长逻辑,提高数据维护效率
This commit is contained in:
2025-10-13 09:54:22 +08:00
parent a1a5c37ad0
commit c86fac4ce7
3 changed files with 6 additions and 259 deletions

View File

@@ -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)
};
};

View File

@@ -5,7 +5,7 @@ import { smc } from "../common/SingletonModuleComp";
import { HeroModelComp } from "./HeroModelComp"; import { HeroModelComp } from "./HeroModelComp";
import { HeroViewComp } from "./HeroViewComp"; import { HeroViewComp } from "./HeroViewComp";
import { BoxSet, FacSet } from "../common/config/BoxSet"; import { BoxSet, FacSet } from "../common/config/BoxSet";
import { getHeroStatsByLevel, HeroInfo, HeroPos, HType } from "../common/config/heroSet"; import { HeroInfo, HeroPos, HType } from "../common/config/heroSet";
import { BattleMoveComp } from "../common/ecs/position/BattleMoveComp"; import { BattleMoveComp } from "../common/ecs/position/BattleMoveComp";
import { GameEvent } from "../common/config/GameEvent"; import { GameEvent } from "../common/config/GameEvent";
import { BuffAttr, getBuffNum, SkillSet, SType } from "../common/config/SkillSet"; import { BuffAttr, getBuffNum, SkillSet, SType } from "../common/config/SkillSet";
@@ -65,12 +65,9 @@ export class Hero extends ecs.Entity {
hero_init(uuid:number=1001,node:Node) { hero_init(uuid:number=1001,node:Node) {
var hv = node.getComponent(HeroViewComp)!; var hv = node.getComponent(HeroViewComp)!;
let hero= HeroInfo[uuid] // 共用英雄数据 let hero= HeroInfo[uuid] // 共用英雄数据
let hero_lv=smc.heros[uuid].lv
let {hp,ap,def}=getHeroStatsByLevel(uuid,hero_lv)
hv.scale = 1; hv.scale = 1;
hv.is_master=true; hv.is_master=true;
hv.lv=1 hv.lv=HeroInfo[uuid].lv?HeroInfo[uuid].lv:1
hv.lv=hero_lv
hv.fac = FacSet.HERO; hv.fac = FacSet.HERO;
hv.type = hero.type; hv.type = hero.type;
hv.box_group = BoxSet.HERO; hv.box_group = BoxSet.HERO;
@@ -80,9 +77,9 @@ export class Hero extends ecs.Entity {
hv.Attrs[BuffAttr.SPEED]=hv.speed = hero.speed; hv.Attrs[BuffAttr.SPEED]=hv.speed = hero.speed;
hv.Attrs[BuffAttr.DIS]=hv.dis=hero.dis; hv.Attrs[BuffAttr.DIS]=hv.dis=hero.dis;
hv.Attrs[BuffAttr.ATK_CD]=hv.cd=hero.cd hv.Attrs[BuffAttr.ATK_CD]=hv.cd=hero.cd
hv.Attrs[BuffAttr.HP_MAX]=hv.hp=hv.hp_max=hp hv.Attrs[BuffAttr.HP_MAX]=hv.hp=hv.hp_max=HeroInfo[uuid].hp;
hv.Attrs[BuffAttr.AP]=hv.ap=ap; hv.Attrs[BuffAttr.AP]=hv.ap=HeroInfo[uuid].ap;
hv.Attrs[BuffAttr.DEF]=def hv.Attrs[BuffAttr.DEF]=HeroInfo[uuid].def;
hero.buff.forEach((buff:any)=>{ hero.buff.forEach((buff:any)=>{
hv.apply_buff(buff.type,buff.value) hv.apply_buff(buff.type,buff.value)
}) })

View File

@@ -1,7 +1,7 @@
import { _decorator, Animation, AnimationClip, Component, Label, Node, resources, Sprite, SpriteFrame } from 'cc'; import { _decorator, Animation, AnimationClip, Component, Label, Node, resources, Sprite, SpriteFrame } from 'cc';
import { oops } from 'db://oops-framework/core/Oops'; import { oops } from 'db://oops-framework/core/Oops';
import { UIID } from '../common/config/GameUIConfig'; import { UIID } from '../common/config/GameUIConfig';
import { getHeroList, getHeroStatsByLevel, getUpgradeResources, HeroInfo, HType, HTypeName, unlockHeroCost } from '../common/config/heroSet'; import { getHeroList, HeroInfo, HType, HTypeName } from '../common/config/heroSet';
import { smc } from '../common/SingletonModuleComp'; import { smc } from '../common/SingletonModuleComp';
import { GameEvent } from '../common/config/GameEvent'; import { GameEvent } from '../common/config/GameEvent';
import { NumberFormatter } from '../common/config/BoxSet'; import { NumberFormatter } from '../common/config/BoxSet';