Files
heros/assets/script/game/map/RogueConfig.ts
2025-08-17 21:12:35 +08:00

399 lines
13 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.

/**
* 肉鸽模式配置脚本 - 简化版
*
* 功能说明:
* - 提供基于怪物类型的属性加成配置
* - 使用BuffAttr枚举定义属性增强
* - 供游戏系统调用获取怪物增强数据
*
* @author 游戏开发团队
* @version 3.0 简化版
* @date 2025-07-12
*/
import { BuffAttr } from "../common/config/SkillSet";
import { getMonList, HQuality } from "../common/config/heroSet";
/**
* 怪物类型枚举
*/
export enum MonsterType {
NORMAL = "normal", // 普通怪物
ELITE = "elite", // 精英怪物
BOSS = "boss" // Boss怪物
}
/**
* 怪物类型增强属性个数配置
*/
export const MonsterEnhancementCountConfig = {
[MonsterType.NORMAL]: 0, // 普通怪物0个增强属性
[MonsterType.ELITE]: 1, // 精英怪物1个增强属性
[MonsterType.BOSS]: 2 // Boss怪物2个增强属性
};
/**
* 关卡类型枚举
*/
export enum StageType {
NORMAL = "normal", // 普通关卡1-4关
ELITE = "elite", // 精英关卡5关
BOSS = "boss" // Boss关卡10关
}
/**
* 关卡配置数据接口
*/
export interface StageConfig {
stageNumber: number;
stageType: StageType;
description: string;
monsters: Array<{
type: MonsterType;
count: number;
}>;
}
/**
* 关卡配置规则
*/
export const StageConfigRules = {
// 普通关卡1-4关
[StageType.NORMAL]: {
description: "普通关卡",
monsters: [
{ type: MonsterType.NORMAL, count: 5 } // 5个小怪
]
},
// 精英关卡5关
[StageType.ELITE]: {
description: "精英关卡",
monsters: [
{ type: MonsterType.ELITE, count: 2 }, // 2个精英
{ type: MonsterType.NORMAL, count: 3 } // 3个小怪
]
},
// Boss关卡10关
[StageType.BOSS]: {
description: "Boss关卡",
monsters: [
{ type: MonsterType.BOSS, count: 1 }, // 1个Boss
{ type: MonsterType.ELITE, count: 2 }, // 2个精英
{ type: MonsterType.NORMAL, count: 2 } // 2个小怪
]
}
};
/**
* 可用的增强属性池
* 按权重排序,数值越大优先级越高
*/
export const AvailableEnhancementPool = [
{ buffType: BuffAttr.HP, weight: 10, baseValue: 80, name: "生命值增强" },
{ buffType: BuffAttr.ATK, weight: 9, baseValue: 50, name: "攻击力增强" },
{ buffType: BuffAttr.CRITICAL, weight: 8, baseValue: 30, name: "暴击率增强" },
{ buffType: BuffAttr.DEF, weight: 7, baseValue: 40, name: "防御增强" },
{ buffType: BuffAttr.CRITICAL_DMG, weight: 6, baseValue: 60, name: "暴击伤害增强" },
{ buffType: BuffAttr.DODGE, weight: 5, baseValue: 25, name: "闪避增强" },
{ buffType: BuffAttr.ATK_CD, weight: 4, baseValue: 20, name: "攻击速度增强" },
{ buffType: BuffAttr.LIFESTEAL, weight: 3, baseValue: 15, name: "吸血" },
{ buffType: BuffAttr.DMG_RED, weight: 2, baseValue: 20, name: "免伤" },
{ buffType: BuffAttr.PUNCTURE, weight: 1, baseValue: 2, name: "穿刺" }
];
/**
* 基于怪物类型的基础配置
*/
export const MonsterTypeBaseConfig = {
[MonsterType.NORMAL]: {
name: "普通怪物",
description: "基础属性无增强"
},
[MonsterType.ELITE]: {
name: "精英怪物",
description: "单一属性增强"
},
[MonsterType.BOSS]: {
name: "Boss怪物",
description: "双重属性增强"
}
};
/**
* 怪物增强数据接口
*/
export interface MonsterEnhancementData {
name: string;
description: string;
buffs: { [key in BuffAttr]?: number };
buffList: Array<{ buffType: BuffAttr; value: number; name: string }>;
}
/**
* 根据权重随机选择增强属性
* @param count 需要选择的属性个数
* @param excludeTypes 排除的属性类型
* @returns 选中的增强属性数组
*/
export function selectRandomEnhancements(count: number, excludeTypes: BuffAttr[] = []): Array<{buffType: BuffAttr, weight: number, baseValue: number, name: string}> {
if (count <= 0) return [];
// 过滤掉排除的属性类型
const availablePool = AvailableEnhancementPool.filter(item => !excludeTypes.includes(item.buffType));
if (availablePool.length === 0) return [];
const selectedEnhancements = [];
const usedTypes = new Set<BuffAttr>();
for (let i = 0; i < count && i < availablePool.length; i++) {
// 计算权重总和
const totalWeight = availablePool
.filter(item => !usedTypes.has(item.buffType))
.reduce((sum, item) => sum + item.weight, 0);
if (totalWeight === 0) break;
// 随机选择
let randomValue = Math.random() * totalWeight;
for (const enhancement of availablePool) {
if (usedTypes.has(enhancement.buffType)) continue;
randomValue -= enhancement.weight;
if (randomValue <= 0) {
selectedEnhancements.push(enhancement);
usedTypes.add(enhancement.buffType);
break;
}
}
}
return selectedEnhancements;
}
/**
* 获取怪物类型的属性加成配置
* @param monsterType 怪物类型
* @param useRandom 是否使用随机生成默认true
* @returns 属性加成配置包含buffs字段
*/
export function getMonsterEnhancement(monsterType: MonsterType, useRandom: boolean = true): MonsterEnhancementData {
const baseConfig = MonsterTypeBaseConfig[monsterType];
const enhancementCount = MonsterEnhancementCountConfig[monsterType];
let selectedEnhancements: Array<{buffType: BuffAttr, weight: number, baseValue: number, name: string}> = [];
if (useRandom) {
// 随机生成增强属性
selectedEnhancements = selectRandomEnhancements(enhancementCount);
} else {
// 使用固定的最高权重属性
selectedEnhancements = AvailableEnhancementPool
.slice(0, enhancementCount)
.map(item => ({...item}));
}
// 构建buffs对象
const buffs: { [key in BuffAttr]?: number } = {};
const buffList: Array<{ buffType: BuffAttr; value: number; name: string }> = [];
selectedEnhancements.forEach(enhancement => {
buffs[enhancement.buffType] = enhancement.baseValue;
buffList.push({
buffType: enhancement.buffType,
value: enhancement.baseValue,
name: enhancement.name
});
});
return {
name: baseConfig.name,
description: `${baseConfig.description} (${enhancementCount}个属性)`,
buffs: buffs,
buffList: buffList
};
}
/**
* 根据关卡号和等级判断关卡类型
* @param stageNumber 关卡号从1开始
* @param level 等级1-5
* @returns 关卡类型
*/
export function getStageType(stageNumber: number, level: number = 1): StageType {
// 第10关的特殊规则
if (stageNumber % 10 === 0) {
if (level === 5) {
return StageType.BOSS; // 第10关第5级为Boss关
} else if (level === 4) {
return StageType.ELITE; // 第10关第4级为精英关
} else {
return StageType.NORMAL; // 第10关1-3级为普通关
}
}
// 1-9关的规则
else {
if (level === 5) {
return StageType.ELITE; // 1-9关第5级为精英关
} else {
return StageType.NORMAL; // 1-9关1-4级为普通关
}
}
}
/**
* 生成关卡配置
* @param stageNumber 关卡号从1开始
* @param level 等级1-5
* @returns MonsterType数组格式
*/
export function generateStageConfig(stageNumber: number, level: number = 1): MonsterType[] {
const stageType = getStageType(stageNumber, level);
const rule = StageConfigRules[stageType];
const monsterArray: MonsterType[] = [];
// 根据配置生成怪物类型数组
rule.monsters.forEach(monsterGroup => {
for (let i = 0; i < monsterGroup.count; i++) {
monsterArray.push(monsterGroup.type);
}
});
return monsterArray;
}
/**
* 根据怪物类型获取对应品质的怪物UUID数组
* @param monsterType 怪物类型
* @returns 怪物UUID数组
*/
export function getMonsterUUIDsByType(monsterType: MonsterType): number[] {
switch (monsterType) {
case MonsterType.NORMAL:
return getMonList(HQuality.GREEN); // 绿色品质为普通怪物
case MonsterType.ELITE:
return getMonList(HQuality.BLUE); // 蓝色品质为精英怪物
case MonsterType.BOSS:
// 紫色及以上品质为Boss怪物
const purpleMonsters = getMonList(HQuality.PURPLE);
const orangeMonsters = getMonList(HQuality.ORANGE);
return [...purpleMonsters, ...orangeMonsters];
default:
return [];
}
}
/**
* 获取当前关卡对应的所有怪物UUID数组
* @param stageNumber 关卡号
* @param level 等级1-5
* @returns 怪物UUID数组按关卡配置顺序排列
*/
export function getStageMonsterUUIDs(stageNumber: number, level: number = 1): number[] {
const monsterTypes = generateStageConfig(stageNumber, level);
const monsterUUIDs: number[] = [];
monsterTypes.forEach(monsterType => {
const availableUUIDs = getMonsterUUIDsByType(monsterType);
if (availableUUIDs.length > 0) {
// 随机选择一个该类型的怪物
const randomUUID = availableUUIDs[Math.floor(Math.random() * availableUUIDs.length)];
monsterUUIDs.push(randomUUID);
}
});
return monsterUUIDs;
}
/**
* 获取关卡怪物配置包含UUID和增强属性
* @param stageNumber 关卡号
* @param level 等级1-5
* @param useRandomBuff 是否使用随机buff
* @returns 完整的怪物配置数组
*/
export function getStageMonsterConfigs(stageNumber: number, level: number = 1, useRandomBuff: boolean = true) {
const monsterTypes = generateStageConfig(stageNumber, level);
const stageMultipliers = getStageAllMultipliers(stageNumber);
const monsterConfigs = [];
monsterTypes.forEach((monsterType, index) => {
const availableUUIDs = getMonsterUUIDsByType(monsterType);
if (availableUUIDs.length > 0) {
const randomUUID = availableUUIDs[Math.floor(Math.random() * availableUUIDs.length)];
const enhancement = getMonsterEnhancement(monsterType, useRandomBuff);
monsterConfigs.push({
id: `stage_${stageNumber}_level_${level}_${index}`,
uuid: randomUUID,
type: monsterType,
stageNumber: stageNumber,
level: level,
enhancement: enhancement,
stageMultipliers: stageMultipliers
});
}
});
return monsterConfigs;
}
/**
* 关卡基础属性倍数配置
*/
export const StageMultiplierConfig = {
// 每级提升的基础倍数
baseMultiplierPerLevel: 0.05, // 每级基础属性提升5%
// 每10级的大幅提升倍数
bigBoostMultiplier: 0.3, // 每10级额外提升30%
// 不同属性的提升权重
attributeWeights: {
hp: 1.2, // 生命值提升权重较高
attack: 1.0, // 攻击力标准权重
}
};
/**
* 计算关卡的基础属性倍数
* @param stageNumber 关卡号从1开始
* @param attributeType 属性类型hp, attack
* @returns 属性倍数
*/
export function calculateStageMultiplier(stageNumber: number, attributeType: 'hp' | 'attack'): number {
const config = StageMultiplierConfig;
// 基础倍数1.0第1关不变
let multiplier = 1.0;
// 每级小提升:(关卡-1) * 每级提升率 * 属性权重
const levelBoost = (stageNumber - 1) * config.baseMultiplierPerLevel * config.attributeWeights[attributeType];
// 每10级大提升向下取整(关卡/10) * 大幅提升率 * 属性权重
const bigBoostCount = Math.floor(stageNumber / 10);
const bigBoost = bigBoostCount * config.bigBoostMultiplier * config.attributeWeights[attributeType];
multiplier += levelBoost + bigBoost;
return multiplier;
}
/**
* 获取关卡所有属性的倍数
* @param stageNumber 关卡号
* @returns 所有属性倍数对象
*/
export function getStageAllMultipliers(stageNumber: number) {
return {
stageNumber: stageNumber,
hp: calculateStageMultiplier(stageNumber, 'hp'),
attack: calculateStageMultiplier(stageNumber, 'attack'),
description: `${stageNumber}关基础属性倍数`
};
}