feat(game): add elite monster kill statistics and related fields
1. add is_elite field to HeroAttrsComp for elite monster mark 2. set elite monster flag when spawning mission monsters 3. implement monster kill counting logic with priority: Boss > elite > normal monsters 4. add kill count statistics for different monster types for settlement calculation
This commit is contained in:
@@ -7,7 +7,7 @@ import { HeroAttrsComp } from "./HeroAttrsComp";
|
|||||||
import { HeroViewComp } from "./HeroViewComp";
|
import { HeroViewComp } from "./HeroViewComp";
|
||||||
import { DamageQueueComp, DamageEvent } from "./DamageQueueComp";
|
import { DamageQueueComp, DamageEvent } from "./DamageQueueComp";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
import { HeroInfo } from "../common/config/heroSet";
|
import { HeroInfo, MonType } from "../common/config/heroSet";
|
||||||
import { oops } from "db://oops-framework/core/Oops";
|
import { oops } from "db://oops-framework/core/Oops";
|
||||||
import { GameEvent } from "../common/config/GameEvent";
|
import { GameEvent } from "../common/config/GameEvent";
|
||||||
import { SkillTriggerType } from "../common/config/heroSet";
|
import { SkillTriggerType } from "../common/config/heroSet";
|
||||||
@@ -719,6 +719,8 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
if (TAttrsComp.fac === FacSet.MON) {
|
if (TAttrsComp.fac === FacSet.MON) {
|
||||||
// 怪物死亡处理
|
// 怪物死亡处理
|
||||||
this.scheduleDrop(entity);
|
this.scheduleDrop(entity);
|
||||||
|
// 分类击杀统计:互斥优先级 Boss > 精英 > 近战/远程(供整局结算失败奖励判定)
|
||||||
|
this.countMonsterKill(TAttrsComp);
|
||||||
// oops.message 全局事件总线:怪物死亡(连杀计数等表现层消费)
|
// oops.message 全局事件总线:怪物死亡(连杀计数等表现层消费)
|
||||||
oops.message.dispatchEvent(GameEvent.MonDead, {
|
oops.message.dispatchEvent(GameEvent.MonDead, {
|
||||||
isBoss: !!TAttrsComp.is_boss,
|
isBoss: !!TAttrsComp.is_boss,
|
||||||
@@ -761,6 +763,38 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
` ${TAttrsComp.hero_name} 死亡掉落金币 ${gold}(monType=${monType}, isBoss=${TAttrsComp.is_boss})`);
|
` ${TAttrsComp.hero_name} 死亡掉落金币 ${gold}(monType=${monType}, isBoss=${TAttrsComp.is_boss})`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物分类击杀统计(写入 smc.vmdata.scores,供整局结算的失败奖励判定)。
|
||||||
|
*
|
||||||
|
* 分类互斥,优先级 Boss > 精英 > 近战/远程:
|
||||||
|
* - Boss(is_boss) → boss_kill_count
|
||||||
|
* - 精英(is_elite) → elite_kill_count
|
||||||
|
* - 近战/重型/刺客 → melee_kill_count
|
||||||
|
* - 远程/辅助/召唤师(兜底) → remote_kill_count
|
||||||
|
*
|
||||||
|
* Why: 互斥计数保证 kills 之和不超过实际击杀数,与 MissionMonComp 的
|
||||||
|
* 整局已刷出总数(getTotalSpawnedCount)口径一致,避免击杀比例虚高。
|
||||||
|
*
|
||||||
|
* @param attrs 死亡怪物的属性组件
|
||||||
|
*/
|
||||||
|
private countMonsterKill(attrs: HeroAttrsComp): void {
|
||||||
|
const scores = smc.vmdata.scores;
|
||||||
|
if (attrs.is_boss) {
|
||||||
|
scores.boss_kill_count++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (attrs.is_elite) {
|
||||||
|
scores.elite_kill_count++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const monType = HeroInfo[attrs.hero_uuid]?.monType ?? MonType.Melee;
|
||||||
|
if (monType === MonType.Melee || monType === MonType.Heavy || monType === MonType.Assassin) {
|
||||||
|
scores.melee_kill_count++;
|
||||||
|
} else {
|
||||||
|
scores.remote_kill_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 延迟执行英雄死亡逻辑
|
* 延迟执行英雄死亡逻辑
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -125,6 +125,8 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
is_atking: boolean = false; // 是否正在攻击
|
is_atking: boolean = false; // 是否正在攻击
|
||||||
is_stop: boolean = false; // 是否正在停止
|
is_stop: boolean = false; // 是否正在停止
|
||||||
is_boss: boolean = false;
|
is_boss: boolean = false;
|
||||||
|
/** 是否精英怪(刷怪时由 MissionMonComp 写入,驱动精英击杀统计) */
|
||||||
|
is_elite: boolean = false;
|
||||||
is_big_boss: boolean = false;
|
is_big_boss: boolean = false;
|
||||||
is_master: boolean = false;
|
is_master: boolean = false;
|
||||||
is_friend: boolean = false;
|
is_friend: boolean = false;
|
||||||
|
|||||||
@@ -240,6 +240,8 @@ export class MissionMonCompComp extends CCComp {
|
|||||||
model.ap = monData.ap;
|
model.ap = monData.ap;
|
||||||
model.hp_max = monData.hp;
|
model.hp_max = monData.hp;
|
||||||
model.hp = model.hp_max;
|
model.hp = model.hp_max;
|
||||||
|
// 精英标记:对象池复用实体需显式重置(Boss 与精英互斥,Boss 走 is_boss)
|
||||||
|
model.is_elite = !monData.isBoss && !!monData.isElite;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sectionSpawnedCount++;
|
this.sectionSpawnedCount++;
|
||||||
|
|||||||
Reference in New Issue
Block a user