feat(怪物系统): 实现基于威胁预算的动态刷怪机制
新增威胁预算系统,根据游戏时间和英雄血量动态生成怪物 - 添加 HeroAttrsComp 查询获取英雄血量比例 - 实现 calculateBudget 计算当前威胁点数 - 实现 generateMonstersFromBudget 根据预算生成怪物 - 添加每秒刷怪逻辑到 MissionMonComp - 定义不同时间段的怪物生成权重配置
This commit is contained in:
@@ -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; // 默认满血
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user