import { v3 } from "cc" import { FacSet } from "./BoxSet" /** * kind :1:烈焰 2:寒冰 3:自然 4:暗影 5:神圣 **/ // export enum HeroKind { // /** // * 词条解释: // * 烈焰:攻击带击退效果 // * 寒冰:攻击带速度效果 // * 自然:攻击偷取生命 // * 暗影:攻击偷取攻击 // * 神圣:攻击带2倍伤害 // * */ // fire = 1, // water = 2, // nature = 3, // shadow = 4, // holy = 5, // } /** * 词条解释: * 0:战士 1:远程 2:法师 * * */ export enum HType { warrior = 0, remote = 1, mage = 2, } //fac:FacSet.HERO export const getHeroList = (quality:number=0)=>{ return Object.values(HeroInfo).filter(item=>{ const facMatch = item.fac === FacSet.HERO; const qualityMatch = quality === 0 || item.quality === quality; return facMatch && qualityMatch; }).map(item=>item.uuid) } //fac:FacSet.MON export const getMonList = (quality:number=0)=>{ return Object.values(HeroInfo).filter(item=>{ const facMatch = item.fac === FacSet.MON; const qualityMatch = quality === 0 || item.quality === quality; return facMatch && qualityMatch; }).map(item=>item.uuid) } export const HeroPos={ 0:{pos:v3(-290,0,0)}, 1:{pos:v3(0,0,0)}, 2:{pos:v3(-100,0,0)}, } export const MonSet = { 0:{pos:v3(160,0,0)}, 1:{pos:v3(220,0,0)}, 2:{pos:v3(280,0,0)}, 3:{pos:v3(340,0,0)}, 4:{pos:v3(400,0,0)}, 5:{pos:v3(460,0,0)}, } export const HQuality = { WHITE:1, GREEN:2, BLUE:3, PURPLE:4, ORANGE:5, } export const HeroInfo = { //主将 5001:{uuid:5001,name:"火焰骑士",path:"hk1", fac:FacSet.HERO, quality:HQuality.GREEN,lv:1,kind:1, type:HType.warrior,hp:100,ap:15,dis:100,cd:1,speed:150,skills:[6011,6020], buff:[],info:"剑类专精,穿刺伤害额外+10%"}, 5002:{uuid:5002,name:"hk1",path:"hk1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:1, type:HType.warrior,hp:100,ap:15,dis:100,cd:1,speed:150,skills:[6011,6004], buff:[],info:"斧类专精,风怒概率增加10%"}, // 5003:{uuid:5003,name:"碎颅.赫克托",path:"k4", quality:HQuality.BLUE,lv:1,kind:1, // type:HType.warrior,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6010,6021,6001], // buff:[],info:"锤类专精,暴击概率增加10%"}, // 5004:{uuid:5004,name:"裂伤.塔米拉",path:"k3", quality:HQuality.BLUE,lv:1,kind:1, // type:HType.warrior,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6010,6021,6001], // buff:[],info:"刀类专精,易伤效果额外持续1次"}, 5005:{uuid:5005,name:"ha1",path:"ha1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2, type:HType.remote,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6025,6031], buff:[],info:"说明"}, 5007:{uuid:5007,name:"mh1",path:"hmh1", fac:FacSet.HERO, quality:HQuality.PURPLE,lv:1,kind:2, type:HType.mage,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6002,6002], buff:[],info:"说明"}, 5008:{uuid:5008,name:"mf1",path:"hmf1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2, type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6022,6029], buff:[],info:"说明"}, 5009:{uuid:5009,name:"风暴精灵",path:"hk1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2, type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6002,6002], buff:[],info:"说明"}, 5010:{uuid:5010,name:"战争祭祀",path:"hk1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2, type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6024,6002], buff:[],info:"说明"}, 5011:{uuid:5011,name:"ha2",path:"ha2", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2, type:HType.remote,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6003,6003], buff:[],info:"说明"}, //怪物 5201:{uuid:5201,name:"兽人战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010], buff:[],info:"普通怪物-战士型"}, 5202:{uuid:5202,name:"兽人刺客",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.remote,hp:20,ap:5,dis:350,cd:1,speed:100,skills:[6008], buff:[],info:"普通怪物-战士型"}, 5203:{uuid:5203,name:"兽人护卫",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010], buff:[],info:"普通怪物-战士型"}, 5204:{uuid:5204,name:"石卫", path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.mage,hp:18,ap:5,dis:90,cd:2.5,speed:100,skills:[6010], buff:[],info:"法师怪物-高伤害脆弱"}, 5205:{uuid:5205,name:"土卫", path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.mage,hp:18,ap:5,dis:90,cd:2.5,speed:100,skills:[6010], buff:[],info:"法师怪物-高伤害脆弱"}, 5206:{uuid:5206,name:"树卫", path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.mage,hp:18,ap:5,dis:90,cd:2.5,speed:100,skills:[6010], buff:[],info:"法师怪物-高伤害脆弱"}, 5219:{uuid:5219,name:"牛头战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:2,kind:1, type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010], buff:[],info:"普通怪物-战士型"}, 5220:{uuid:5220,name:"牛头战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010], buff:[],info:"普通怪物-战士型"}, 5221:{uuid:5221,name:"牛头战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.remote,hp:20,ap:5,dis:350,cd:1.5,speed:100,skills:[6008], buff:[],info:"普通怪物-战士型"}, 5222:{uuid:5222,name:"独眼巨人",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010], buff:[],info:"普通怪物-战士型"}, 5223:{uuid:5223,name:"独眼巨人",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010], buff:[],info:"普通怪物-战士型"}, 5224:{uuid:5224,name:"独眼巨人",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1, type:HType.remote,hp:20,ap:5,dis:350,cd:1.5,speed:100,skills:[6010], buff:[],info:"普通怪物-战士型"}, 5225:{uuid:5225,name:"精英独眼",path:"mo1", fac:FacSet.MON, quality:HQuality.BLUE,lv:1,kind:1, type:HType.warrior,hp:45,ap:12,dis:300,cd:2,speed:100,skills:[6006], buff:[],info:"精英怪物-战士型"}, 5226:{uuid:5226,name:"精英牛头",path:"mo1", fac:FacSet.MON, quality:HQuality.BLUE,lv:1,kind:1, type:HType.warrior,hp:45,ap:12,dis:300,cd:2,speed:100,skills:[6007], buff:[],info:"精英怪物-战士型"}, 5227:{uuid:5227,name:"精英兽人",path:"mo1", fac:FacSet.MON, quality:HQuality.BLUE,lv:1,kind:1, type:HType.warrior,hp:45,ap:12,dis:300,cd:2,speed:100,skills:[6008], buff:[],info:"精英怪物-战士型"}, }; // 职业属性增长配置 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 ) => { // 获取职业增长配置 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 ) => { 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 ) => { 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; };