feat(怪物系统): 实现基于威胁预算的动态刷怪机制

新增威胁预算系统,根据游戏时间和英雄血量动态生成怪物
- 添加 HeroAttrsComp 查询获取英雄血量比例
- 实现 calculateBudget 计算当前威胁点数
- 实现 generateMonstersFromBudget 根据预算生成怪物
- 添加每秒刷怪逻辑到 MissionMonComp
- 定义不同时间段的怪物生成权重配置
This commit is contained in:
walkpan
2026-01-01 23:49:23 +08:00
parent 95f216e6e7
commit ad4fd30314
3 changed files with 227 additions and 9 deletions

View File

@@ -6,9 +6,11 @@ import { MonStart } from "../common/config/heroSet";
import { smc } from "../common/SingletonModuleComp";
import { GameEvent } from "../common/config/GameEvent";
// 导入肉鸽配置
import { getStageMonConfigs, MonType } from "./RogueConfig";
import { getStageMonConfigs, MonType, generateMonstersFromBudget } from "./RogueConfig";
import { BuffConf } from "../common/config/SkillSet";
import { IndexSet } from "../common/config/GameSet";
import { IndexSet, FacSet } from "../common/config/GameSet";
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
import { Attrs } from "../common/config/HeroAttrs";
const { ccclass, property } = _decorator;
/** 视图层对象 */
@@ -34,6 +36,8 @@ export class MissionMonCompComp extends CCComp {
private globalSpawnOrder: number = 0;
/** 游戏进行时间(秒) */
private gameTime: number = 0;
/** 刷怪逻辑计时器(每秒执行一次) */
private spawnLogicTimer: number = 0;
onLoad(){
@@ -61,6 +65,31 @@ export class MissionMonCompComp extends CCComp {
// 累加游戏时间
this.gameTime += dt;
// ==========================================
// 新增:每秒执行一次刷怪逻辑 (Threat Budget)
// ==========================================
this.spawnLogicTimer += dt;
if (this.spawnLogicTimer >= 1.0) {
this.spawnLogicTimer = 0;
// 获取英雄血量比例
const hpRatio = this.getHeroHpRatio();
// 生成怪物
const newMonsters = generateMonstersFromBudget(this.gameTime, hpRatio);
// 添加到队列
newMonsters.forEach(mon => {
this.addToStageSpawnQueue(
mon.uuid,
mon.position !== undefined ? mon.position : 0,
mon.type,
mon.level,
mon.buffs || []
);
});
}
// 处理随机事件
@@ -102,15 +131,33 @@ export class MissionMonCompComp extends CCComp {
this.spawnTimer = 0;
this.eventProcessed = false;
const cStage = smc.data.mission;
// 使用新的肉鸽关卡配置
let level=smc.vmdata.mission_data.level
// const cStage = smc.data.mission;
// // 使用新的肉鸽关卡配置
// let level=smc.vmdata.mission_data.level
const monsConf = getStageMonConfigs(cStage);
// console.log(`[MissionMonComp]:第${cStage}关 - ${stageType}类型,怪物数量: ${monsConf.length}`);
const monsConfFiltered = monsConf.filter((mon: any, index) => index === 0);
this.generateMonsters(monsConfFiltered);
// const monsConf = getStageMonConfigs(cStage);
// // console.log(`[MissionMonComp]:第${cStage}关 - ${stageType}类型,怪物数量: ${monsConf.length}`);
// const monsConfFiltered = monsConf.filter((mon: any, index) => index === 0);
// this.generateMonsters(monsConfFiltered);
console.log("[MissionMonComp] Starting Threat Budget Wave System");
}
/**
* 获取英雄血量比例
*/
private getHeroHpRatio(): number {
// 查询带有 HeroAttrsComp 的实体
// 注意:这里假设只有一个英雄,且性能允许每秒查询一次
const entities = ecs.query(ecs.allOf(HeroAttrsComp));
for (const e of entities) {
const attrs = e.get(HeroAttrsComp);
if (attrs && attrs.fac === FacSet.HERO) {
const maxHp = attrs.Attrs[Attrs.HP_MAX] || 1;
return attrs.hp / maxHp;
}
}
return 1.0; // 默认满血
}