重构怪物生成系统,使用MonType枚举替代原有布尔标记 添加6种怪物类型配置和属性计算规则 修改关卡配置生成逻辑,支持精英/Boss波次 新增多种怪物配置并调整原有怪物属性
179 lines
5.6 KiB
TypeScript
179 lines
5.6 KiB
TypeScript
/**
|
||
* 肉鸽模式配置脚本 - 增强版
|
||
*
|
||
* 功能说明:
|
||
* - 提供基础的刷怪配置:刷什么怪,刷多少怪
|
||
* - 支持程序化关卡生成逻辑,每一关的怪物组合、数量和强度应随关卡进度递增而变化
|
||
* - 支持随机事件系统
|
||
*
|
||
* @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;
|
||
}
|
||
|
||
|
||
|
||
|