refactor: 统一将游戏内的「波次」术语替换为「回合」

本次提交将全项目中所有与「波次」相关的术语、注释、配置描述、UI文本全部替换为「回合」,包括:
1.  技能卡牌、怪物刷新、经济系统的相关注释与变量名
2.  配置表中的波次相关常量与描述文本
3.  UI预制体中的波次显示文本
4.  所有相关的文档注释与接口说明

统一术语后,游戏的关卡流程描述将更符合常规肉鸽游戏的表达习惯,避免与「波次」字面含义混淆,提升代码可读性与团队协作一致性。
This commit is contained in:
panFD
2026-08-09 14:51:48 +08:00
parent 2907c214f1
commit c59ba45b5b
14 changed files with 622 additions and 618 deletions

View File

@@ -6,7 +6,7 @@
* 1. 管理单局游戏的 **完整生命周期**:初始化 → 准备阶段 → 战斗阶段 → 结算。
* 2. 在战斗阶段每帧更新战斗计时器、同步怪物数量、检测英雄全灭。
* 3. 管理怪物数量阈值(暂停 / 恢复刷怪的上下限)。
* 4. 处理新一事件NewWave进入准备阶段并发放金币奖励。
* 4. 处理新一回合事件NewWave进入准备阶段并发放金币奖励。
* 5. 提供战斗结束后的结算弹窗入口VictoryComp
* 6. (可选)内建性能监控面板,显示内存、帧率、实体数量等开发信息。
*
@@ -22,7 +22,7 @@
*
* 依赖:
* - smc.mission —— 全局任务运行状态play / pause / in_fight / stop_spawn_mon 等)
* - smc.vmdata.mission_data —— 局内数据(金币 / 数 / 怪物数量等)
* - smc.vmdata.mission_data —— 局内数据(金币 / 回合数 / 怪物数量等)
* - FightSet —— 战斗常量配置
* - CardInitCoins —— 初始金币数
* - UIID.Victory —— 结算弹窗
@@ -92,7 +92,7 @@ export class MissionComp extends CCComp {
/** 开始战斗按钮 */
@property(Node)
start_btn: Node = null!
/** 时间/数显示节点 */
/** 时间/回合数显示节点 */
@property(Node)
time_node: Node = null!
@property(Node)
@@ -112,7 +112,7 @@ export class MissionComp extends CCComp {
// ======================== 运行时状态 ========================
/** 本战斗已耗时(秒),正向计时,用于自适应难度评估 */
/** 本回合战斗已耗时(秒),正向计时,用于自适应难度评估 */
clearTime: number = 0
/** 剩余复活次数 */
revive_times: number = 1;
@@ -126,9 +126,9 @@ export class MissionComp extends CCComp {
}
/**秒计时 */
PhaseTime: Timer = new Timer(1)
/** 波次间倒计时(秒) */
/** 回合间倒计时(秒) */
private waveCountdown: number = 0;
/** 波次间倒计时总时长(秒) */
/** 回合间倒计时总时长(秒) */
private readonly WAVE_COUNTDOWN_DURATION: number = 5;
/** 上一次显示的时间字符串(避免重复设置) */
private lastTimeStr: string = "";
@@ -156,13 +156,13 @@ export class MissionComp extends CCComp {
private heapTrendBaseMB: number = -1;
/** 怪物数量同步计时器(降低同步频率) */
private monsterCountSyncTimer: number = 0;
/** 当前数 */
/** 当前回合数 */
private currentWave: number = 0;
/** 是否为Boss波次 */
/** 是否为Boss回合 */
private isBossWave: boolean = false;
/** 当前任务阶段 */
public currentPhase: MissionPhase = MissionPhase.None;
/** 是否处于波次间倒计时状态 */
/** 是否处于回合间倒计时状态 */
private isWaveCountdown: boolean = false;
// ======================== ECS 查询匹配器(预缓存) ========================
@@ -186,7 +186,7 @@ export class MissionComp extends CCComp {
this.on(GameEvent.NewWave, this.onNewWave, this)
this.on(GameEvent.DO_AD_BACK, this.do_ad, this)
this.start_btn?.on(NodeEventType.TOUCH_END, this.onStartFightBtnClick, this)
// 第一准备阶段,首个英雄召唤后自动开始战斗(无需玩家点击开始按钮)
// 第一回合准备阶段,首个英雄召唤后自动开始战斗(无需玩家点击开始按钮)
oops.message.on(GameEvent.MasterCalled, this.onHeroSummoned, this);
this.removeMemoryPanel()
}
@@ -223,7 +223,7 @@ export class MissionComp extends CCComp {
// 如果是暂停状态,且不在 BattleEnd 阶段(全灭时需要播放完 fend 技能动画并自动流转),才真正停止 update 逻辑
if (smc.mission.pause && this.currentPhase !== MissionPhase.BattleEnd) return
// 波次间倒计时PrepareStart 复用为倒计时阶段5 秒后自动进入下一
// 回合间倒计时PrepareStart 复用为倒计时阶段5 秒后自动进入下一回合
if (this.currentPhase === MissionPhase.PrepareStart) {
this.waveCountdown -= dt;
this.updateCountdownUI();
@@ -253,7 +253,7 @@ export class MissionComp extends CCComp {
// ======================== 时间显示 ========================
/** 更新时间/数显示(仅在秒数变化时更新以减少 Label 操作) */
/** 更新时间/回合数显示(仅在秒数变化时更新以减少 Label 操作) */
update_time() {
const remainSecond = Math.floor(smc.vmdata.mission_data.fight_time);
if (remainSecond === this.lastTimeSecond) return;
@@ -273,9 +273,9 @@ export class MissionComp extends CCComp {
}
}
// ======================== 波次倒计时 ========================
// ======================== 回合倒计时 ========================
/** 进入波次间倒计时:重置倒计时并显示提示 */
/** 进入回合间倒计时:重置倒计时并显示提示 */
private startWaveCountdown() {
this.waveCountdown = this.WAVE_COUNTDOWN_DURATION;
this.isWaveCountdown = true;
@@ -294,13 +294,13 @@ export class MissionComp extends CCComp {
if (phaseNode) {
const label = phaseNode.getComponent(Label);
if (label) {
label.string = `下一 ${remain}s`;
label.string = `下一回合 ${remain}s`;
}
}
}
}
/** 结束波次间倒计时 */
/** 结束回合间倒计时 */
private stopWaveCountdown() {
this.isWaveCountdown = false;
this.lastTimeSecond = -1;
@@ -446,7 +446,7 @@ export class MissionComp extends CCComp {
const label = phaseNode.getComponent(Label);
if (label) {
const wave = Math.max(1, this.currentWave || (smc.vmdata && smc.vmdata.mission_data ? smc.vmdata.mission_data.level : 1) || 1);
label.string = `${wave} `;
label.string = `${wave} 回合`;
}
// 阶段切换动感表现:只在进入战斗阶段跳动一下,让流程充满心流体验
@@ -471,12 +471,12 @@ export class MissionComp extends CCComp {
smc.mission.in_fight = false;
smc.vmdata.mission_data.in_fight = false;
smc.mission.stop_spawn_mon = true;
// 波次间倒计时隐藏开始按钮nobg 激活表示不可点击状态)
// 回合间倒计时隐藏开始按钮nobg 激活表示不可点击状态)
if (this.start_btn && this.start_btn.isValid) {
const nobg = this.start_btn.getChildByName("nobg");
if (nobg) nobg.active = true;
}
// 启动 5 秒倒计时,由 update 驱动自动进入下一
// 启动 5 秒倒计时,由 update 驱动自动进入下一回合
this.startWaveCountdown();
oops.message.dispatchEvent("PhasePrepareStart");
break;
@@ -536,7 +536,7 @@ export class MissionComp extends CCComp {
}
});
// 【动态难度调节】根据本战况自动放水 / 加压
// 【动态难度调节】根据本回合战况自动放水 / 加压
DynamicTuner.adjust(this.clearTime, heroDeathCount);
mLogger.log(this.debugMode, 'MissionComp', `[DynamicTuner] wave=${this.currentWave} clearTime=${this.clearTime.toFixed(1)}s deaths=${heroDeathCount} factor=${DynamicTuner.factor.toFixed(2)}`);
// 【评分系统 - 战绩分】记录全员存活的胜利回合数(额外加分)
@@ -556,7 +556,7 @@ export class MissionComp extends CCComp {
// 战斗结束阶段给予所有英雄恢复70%血量的技能效果
this.healAllHeroes();
// 【新增】派发每战斗结束事件,供卡牌技能监听(区别于整局结束的 MissionEnd
// 【新增】派发每回合战斗结束事件,供卡牌技能监听(区别于整局结束的 MissionEnd
oops.message.dispatchEvent(GameEvent.FightEnd);
break;
@@ -586,7 +586,7 @@ export class MissionComp extends CCComp {
private autoNextPhase() {
switch (this.currentPhase) {
case MissionPhase.PrepareStart:
// 波次间倒计时结束,停止倒计时状态,直接进入 PrepareEnd不再等待玩家点击
// 回合间倒计时结束,停止倒计时状态,直接进入 PrepareEnd不再等待玩家点击
this.stopWaveCountdown();
this.changePhase(MissionPhase.PrepareEnd);
break;
@@ -599,7 +599,7 @@ export class MissionComp extends CCComp {
case MissionPhase.BattleEnd:
// BattleEnd 计时结束后,如果是因为全灭或手动调用的 fight_end进入 Settle
// 需要注意的是open_Victory / fight_end 现在只需切换到 BattleEnd 即可Settle 由这里自动接管
// 如果游戏正在运行(波次更迭),则自动进入 PrepareStart 阶段
// 如果游戏正在运行(回合更迭),则自动进入 PrepareStart 阶段
if (smc.mission.play && !smc.mission.pause) {
this.changePhase(MissionPhase.PrepareStart);
} else {
@@ -712,9 +712,9 @@ export class MissionComp extends CCComp {
/**
* 英雄召唤事件回调:
* 第一准备阶段Prepare只有第 1 才会进入,
* 第一回合准备阶段Prepare只有第 1 回合才会进入,
* 此时首个英雄一旦召唤即自动开战,无需玩家点击开始按钮。
* 后续波次走 PrepareStart 倒计时自动流转,不会进入 Prepare。
* 后续回合走 PrepareStart 倒计时自动流转,不会进入 Prepare。
*/
private onHeroSummoned() {
if (this.currentPhase !== MissionPhase.Prepare) return;
@@ -732,7 +732,7 @@ export class MissionComp extends CCComp {
* @param is_hero_dead 是否因英雄全灭触发
*/
open_Victory(e: any, is_hero_dead: boolean = false) {
// 战斗失败或胜利,标记暂停状态以切断波次流转逻辑
// 战斗失败或胜利,标记暂停状态以切断回合流转逻辑
smc.mission.pause = true;
// 直接切入 BattleEnd触发 fend 表现
// 倒计时逻辑已在 update 中由 PhaseTime 接管2s 后将触发 autoNextPhase 弹窗结算
@@ -767,7 +767,7 @@ export class MissionComp extends CCComp {
/**
* 初始化全部局内数据:
* - 全局运行标志
* - 战斗时间 / 怪物数量 / 金币 /
* - 战斗时间 / 怪物数量 / 金币 / 回合
* - 奖励列表 / 复活次数
* - 性能监控基准值
*/
@@ -816,15 +816,15 @@ export class MissionComp extends CCComp {
smc.vmdata.scores.gold_earned += smc.vmdata.mission_data.coin;
}
// ======================== 波次管理 ========================
// ======================== 回合管理 ========================
/**
* 新一事件回调:
* 新一回合事件回调:
* 1. 进入准备阶段。
* 2. 更新当前数。
* 2. 更新当前回合数。
* 3. 刷新时间显示。
*
* 注意:金币不再按波次固定发放,改为怪物死亡时掉落(见 HeroAtkSystem
* 注意:金币不再按回合固定发放,改为怪物死亡时掉落(见 HeroAtkSystem
*
* @param event 事件名
* @param data { wave: number }
@@ -836,20 +836,20 @@ export class MissionComp extends CCComp {
this.isBossWave = !!data?.bossWave;
if (wave > 1) {
// 在新一到来时,先进入 BattleEnd触发上一的战斗结束技能 (fend)2秒后自动进入下一的准备阶段
// 在新一回合到来时,先进入 BattleEnd触发上一回合的战斗结束技能 (fend)2秒后自动进入下一回合的准备阶段
this.changePhase(MissionPhase.BattleEnd);
} else {
// 第1不需要结束上一延迟一点播放提示避免被开始游戏的loading遮挡
// 第1回合不需要结束上一回合延迟一点播放提示避免被开始游戏的loading遮挡
this.scheduleOnce(() => {
if (this.currentPhase === MissionPhase.Prepare) {
this.playTooltipAnim(`${wave} `);
this.playTooltipAnim(`${wave} 回合`);
}
}, 0.5);
}
this.currentWave = wave;
smc.vmdata.mission_data.level = wave;
// 金币改为怪物死亡掉落(见 HeroAtkSystem不再每固定发放
// 金币改为怪物死亡掉落(见 HeroAtkSystem不再每回合固定发放
this.lastTimeSecond = -1;
this.clearTime = 0;
this.update_time();
@@ -894,11 +894,11 @@ export class MissionComp extends CCComp {
});
this.handleHeroWipe(heroCount);
// 怪物全灭检测:如果战斗阶段场上没有任何活着的怪物,且待刷新的怪物队列也为空,直接结束战斗进入下一的准备阶段
// 怪物全灭检测:如果战斗阶段场上没有任何活着的怪物,且待刷新的怪物队列也为空,直接结束战斗进入下一回合的准备阶段
const pendingCount = smc.vmdata.mission_data.pending_mon_num || 0;
if (monsterCount === 0 && pendingCount === 0 && smc.mission.play && !smc.mission.pause && this.currentPhase === MissionPhase.Battle) {
if (this.currentWave >= MAX_WAVE) {
// 20 通关
// 20 回合通关
this.open_Victory(null, false);
} else {
oops.message.dispatchEvent("TimeUpAdvanceWave");