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)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
Reference in New Issue
Block a user