Files
heros/assets/script/game/map/RogueConfig.ts
panw 9dc1126dfe feat(怪物系统): 重构怪物生成逻辑并添加多种怪物类型
重构怪物生成系统,使用MonType枚举替代原有布尔标记
添加6种怪物类型配置和属性计算规则
修改关卡配置生成逻辑,支持精英/Boss波次
新增多种怪物配置并调整原有怪物属性
2025-10-29 16:41:08 +08:00

179 lines
5.6 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.

/**
* 肉鸽模式配置脚本 - 增强版
*
* 功能说明:
* - 提供基础的刷怪配置:刷什么怪,刷多少怪
* - 支持程序化关卡生成逻辑,每一关的怪物组合、数量和强度应随关卡进度递增而变化
* - 支持随机事件系统
*
* @author 游戏开发团队
* @version 2.0 增强版
* @date 2025-10-19
*/
import { getMonList, HeroInfo } from "../common/config/heroSet";
import { BuffConf } from "../common/config/SkillSet";
// 精英怪物配置表
export const EliteMons = [ 5201, 5202, 5203, 5213 ];
// Boss怪物配置表
export const BossMons = [ 5201, 5202, ];
export enum IMons{ ORC=1, HUMAN=2, ELF=3,}
export const Mons={
[IMons.ORC]:[5201,5202],
[IMons.HUMAN]:[5201,5202],
[IMons.ELF]:[5201,5202]
}
/**
* 怪物类型枚举
*/
export enum MonType { NORMAL = 0, ELITE = 1, BOSS = 2 }
export const EliteStage =[5,10,15,20,25]
export const BossStage=[30,40,50,60,70,80,90,100]
export enum EventType {
TREASURE = 1, // 额外奖励
TRAP =2, // 陷阱伤害
BUFF = 3, // 临时增益效果
DEBUFF = 4 // 临时减益效果
}
/**
* 关卡生怪物相关配置
*/
export const StageRule = {
MonsNum: 5, // 关卡中默认怪物数量
LimitMonNum: 10, // 30关以后是极限模式怪物数量
/** 额外怪物出现概率在固定5个怪物基础上有概率多刷1个 */
extraMonsterRate: 0.3, // 30%概率出现第6个怪物
/** 事件怪物出现概率5个怪物中有1个替换为事件怪 */
eventMonsterRate: 0.25, // 25%概率出现事件怪物
/** 特殊属性怪物出现概率5个怪物中有怪物携带特殊属性 */
specialAttributeRate: 0.4, // 40%概率出现特殊属性怪物
/** 特殊属性怪物数量范围 */
specialAttributeCount: { min: 1, max: 2 } // 出现时1-2个怪物会有特殊属性
};
interface IMonsConfig {
/** 怪物波次 */
uuid: number; // 怪物ID
/** 怪物数量 */
buff: BuffConf[]; //附加属性
/** 怪物等级 */
level: number; // 怪物等级
/** 是否为精英怪物 */
monType:MonType;
}
export const MonAttrSet={
[MonType.NORMAL]:{ HP_MAX:1.1, AP:1.05, MP:1.1, DEF:1.05, MDEF:1.05, MAP:1.05,},
[MonType.ELITE]: { HP_MAX:2, AP:1.1, MP:1.1, DEF:1.1, MDEF:1.1, MAP:1.1,},
[MonType.BOSS]: { HP_MAX:5, AP:2, MP:5, DEF:2, MDEF:2, MAP:2,},
}
export const MonBuffSet={
}
export const getMonAttr=(lv:number,uuid:number,MonType:MonType)=>{
let mon=HeroInfo[uuid]
let hp=mon.hp*lv*MonAttrSet[MonType].HP_MAX
let mp=mon.mp*lv*MonAttrSet[MonType].MP
let ap=mon.ap*lv*MonAttrSet[MonType].AP
let map=mon.map*lv*MonAttrSet[MonType].MAP
let def=mon.def*lv*MonAttrSet[MonType].DEF
let mdef=mon.mdef*lv*MonAttrSet[MonType].MDEF
return {hp:hp,mp:mp,ap:ap,map:map,def:def,mdef:mdef}
}
/**
* 根据波次生成怪物配置
* @param stage 当前波次
* @returns IMonsConfig数组
*/
export function getStageMonConfigs(stage: number): IMonsConfig[] {
const monsterConfigs: IMonsConfig[] = [];
// 确定基础怪物数量
let baseMonsterCount = StageRule.MonsNum;
// 判断是否为Boss波次
const isBossStage = BossStage.includes(stage);
// 判断是否为精英波次
const isEliteStage = EliteStage.includes(stage);
// 如果是Boss波次增加一个Boss怪物
if (isBossStage) {
// 从Boss怪物列表中随机选择一个
const bossUUID = BossMons[Math.floor(Math.random() * BossMons.length)] || 5201;
monsterConfigs.push({
uuid: bossUUID,
buff: [],
level: stage, // Boss等级等于波次
monType: MonType.BOSS
});
// Boss波次减少普通怪物数量
baseMonsterCount = Math.max(1, baseMonsterCount - 2);
}
// 如果是精英波次,增加精英怪物
if (isEliteStage) {
// 添加1-2个精英怪物
const eliteCount = isBossStage ? 1 : Math.floor(Math.random() * 2) + 1;
for (let i = 0; i < eliteCount; i++) {
const eliteUUID = EliteMons[Math.floor(Math.random() * EliteMons.length)] || 5201;
monsterConfigs.push({
uuid: eliteUUID,
buff: [],
level: stage, // 精英等级等于波次
monType: MonType.ELITE
});
}
// 精英波次减少普通怪物数量
baseMonsterCount = Math.max(1, baseMonsterCount - eliteCount);
}
// 添加普通怪物
const remainingCount = baseMonsterCount;
for (let i = 0; i < remainingCount; i++) {
// 从普通怪物列表中随机选择一个
const normalMonsters = getMonList();
const normalUUID = normalMonsters.length > 0
? normalMonsters[Math.floor(Math.random() * normalMonsters.length)]
: 5201;
monsterConfigs.push({
uuid: normalUUID,
buff: [],
level: stage, // 普通怪物等级等于波次
monType: MonType.NORMAL
});
}
// 判断是否生成额外怪物
if (Math.random() < StageRule.extraMonsterRate) {
const normalMonsters = getMonList();
const extraUUID = normalMonsters.length > 0
? normalMonsters[Math.floor(Math.random() * normalMonsters.length)]
: 5201;
monsterConfigs.push({
uuid: extraUUID,
buff: [],
level: stage,
monType: MonType.NORMAL
});
}
return monsterConfigs;
}