import { v3 } from "cc" import { FacSet } from "./BoxSet" import { smc } from "../SingletonModuleComp" /** * 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)=>{ const filteredHeros = Object.values(HeroInfo).filter(item=>{ const facMatch = item.fac === FacSet.HERO; const qualityMatch = quality === 0 || item.quality === quality; return facMatch && qualityMatch; }); // 分离拥有和未拥有的英雄 const ownedHeros = filteredHeros.filter(item => smc.heros[item.uuid]); const unownedHeros = filteredHeros.filter(item => !smc.heros[item.uuid]); // 分别按品质排序(品质高的在前) ownedHeros.sort((a,b) => b.quality - a.quality); unownedHeros.sort((a,b) => b.quality - a.quality); // 合并列表:拥有的在前,未拥有的在后 return [...ownedHeros, ...unownedHeros].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(240,0,0)}, 1:{pos:v3(320,0,0)}, 2:{pos:v3(360,0,0)}, 3:{pos:v3(400,0,0)}, 4:{pos:v3(440,0,0)}, 5:{pos:v3(480,0,0)}, 6:{pos:v3(520,0,0)}, 7:{pos:v3(560,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:[6001,6001], 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:[6001,6001], 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:[6003,6003], 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:[6004], 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:[6005], 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:[6006], 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:[6007], 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], 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:[6001], 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:[6007], 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:[6001], 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:[6001], 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:[6001], 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:[6001], 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:[6001], 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:[6001], 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:[6007], 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:[6001], 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:[6001], 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:[6001], 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:[6005], 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; }; // 升级资源配置 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) }; };