Files
heros/assets/script/game/common/config/heroSet.ts
2025-09-01 17:27:24 +08:00

448 lines
16 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { v3 } from "cc"
import { FacSet, QualitySet } from "./BoxSet"
import { smc } from "../SingletonModuleComp"
import { Items } from "./Items"
/**
* 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,
}
/**
* 解锁英雄所需物品
* 绿色:铜钥匙*100 item:1006 num:100
* 蓝色:银钥匙*200 item:1007 num:200
* 紫色:金钥匙*100 item:1008 num:100
* 橙色:金钥匙*100 item:1009 num:100
*/
export const unlockHeroCost={
[QualitySet.GREEN]:{i_uuid:Items[1006].uuid,num:1},
[QualitySet.BLUE]:{i_uuid:Items[1006].uuid,num:1},
[QualitySet.PURPLE]:{i_uuid:Items[1007].uuid,num:1},
[QualitySet.ORANGE]:{i_uuid:Items[1008].uuid,num:1},
}
//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 HeroInfo = {
//主将
5001:{uuid:5001,name:"火焰骑士",path:"hk1", fac:FacSet.HERO, quality:QualitySet.GREEN,lv:1,kind:1,
type:HType.warrior,hp:100,ap:15,dis:100,cd:1,speed:150,skills:[6001,6001,6301,6302,6303],
buff:[],info:""},
5002:{uuid:5002,name:"刺客",path:"hc1", fac:FacSet.HERO, quality:QualitySet.BLUE,lv:1,kind:1,
type:HType.warrior,hp:100,ap:15,dis:100,cd:1,speed:150,skills:[6001,6001,6301,6302,6303],
buff:[],info:""},
5005:{uuid:5005,name:"绿箭",path:"ha1", fac:FacSet.HERO, quality:QualitySet.BLUE,lv:1,kind:2,
type:HType.remote,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6003,6003,6301,6302,6303],
buff:[],info:""},
5007:{uuid:5007,name:"牧师",path:"hmh1", fac:FacSet.HERO, quality:QualitySet.PURPLE,lv:1,kind:2,
type:HType.mage,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6004,6004,6301,6302,6303],
buff:[],info:""},
5008:{uuid:5008,name:"火女",path:"hmf1", fac:FacSet.HERO, quality:QualitySet.BLUE,lv:1,kind:2,
type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6005,6005,6301,6302,6303],
buff:[],info:""},
// 5009:{uuid:5009,name:"风暴精灵",path:"hk1", fac:FacSet.HERO, quality:QualitySet.BLUE,lv:1,kind:2,
// type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6006,6006,6301,6302,6303],
// buff:[],info:""},
// 5010:{uuid:5010,name:"战争祭祀",path:"hk1", fac:FacSet.HERO, quality:QualitySet.ORANGE,lv:1,kind:2,
// type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6007,6007,6301,6302,6303],
// buff:[],info:""},
// 5011:{uuid:5011,name:"ha2",path:"ha2", fac:FacSet.HERO, quality:QualitySet.BLUE,lv:1,kind:2,
// type:HType.remote,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6003,6003,6301,6302,6303],
// buff:[],info:""},
//怪物
5201:{uuid:5201,name:"兽人战士",path:"mo1", fac:FacSet.MON, quality:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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:QualitySet.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<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)
};
};