435 lines
16 KiB
TypeScript
435 lines
16 KiB
TypeScript
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(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<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)
|
||
};
|
||
};
|
||
|
||
|
||
|
||
|
||
|