refactor(mission): 重构关卡结算与刷怪统计逻辑

1. 新增整局跨回合刷怪统计与重置能力,替换原小节统计
2. 修改奖励配置为整局5回合累计结算逻辑
3. 调整失败奖励判定为整局维度统计
4. 重构胜利/失败奖励计算逻辑,适配多回合关卡
This commit is contained in:
panFD
2026-09-13 10:28:55 +08:00
parent 328f6c83f3
commit da2caa6576
4 changed files with 79 additions and 59 deletions

View File

@@ -629,11 +629,8 @@ export class MissionComp extends CCComp {
settle_title: this._settleTitle,
// 关卡难度度量(= 大关号,驱动胜利奖励随进度增长)
mon_lv: getMonsterLv(this.currentStage),
// 失败奖励判定数据:本关坚持时间 + 击杀统计(kills=已刷出-存活)
defeat_stats: {
clear_time: this.clearTime,
...this.querySectionKillStats(),
},
// 失败奖励判定数据:整局坚持时间 + 整局击杀统计(kills=跨回合累计击杀,total=整局已刷出)
defeat_stats: this.queryMissionKillStats(),
});
} else {
// play 已为 false(fight_end 强制结束)→ 直接清理
@@ -838,6 +835,8 @@ export class MissionComp extends CCComp {
// 重置所有的战局得分数据,防止上一局的数据污染
smc.resetScores();
// 重置整局刷怪统计(跨回合累计的已刷出总数),回合间不重置
ecs.query(ecs.allOf(MissionMonCompComp)).forEach(e => e.get(MissionMonCompComp).resetMissionStats());
smc.vmdata.mission_data.coin = Math.max(0, Math.floor(FightSet.INIT_COIN));
// 银币为局外持久货币,每局不重置,仅通过日常积攒,无需初始化
@@ -1023,14 +1022,24 @@ export class MissionComp extends CCComp {
}
/**
* 查询本节击杀统计(转交结算弹窗做失败奖励判定)
* @returns { kills, total },查询不到 MissionMonComp 时返回 0/0
* 查询整局(整关 5 回合)击杀统计与坚持时间,供结算弹窗做失败奖励判定。
* Why: 一关一局后,失败奖励按整局累计口径计算,不再只看当前回合——
* clear_time 用整关战斗总时长 fight_time(跨回合累计,整关重置一次);
* kills 用 scores 跨回合累计的分类击杀数之和(melee/remote/elite/boss);
* total 用整局已刷出怪物总数(MissionMonComp 跨回合累计)。
*/
private querySectionKillStats(): { kills: number; total: number } {
private queryMissionKillStats(): { clear_time: number; kills: number; total: number } {
const s = smc.vmdata.scores;
const kills = (s.melee_kill_count || 0) + (s.remote_kill_count || 0)
+ (s.elite_kill_count || 0) + (s.boss_kill_count || 0);
const entities = ecs.query(ecs.allOf(MissionMonCompComp));
const comp = entities[0]?.get(MissionMonCompComp);
if (!comp) return { kills: 0, total: 0 };
return comp.getSectionKillStats();
const total = comp ? comp.getTotalSpawnedCount() : kills;
return {
clear_time: smc.vmdata.mission_data.fight_time,
kills,
total: Math.max(total, kills),
};
}
/**