refactor: 统一将游戏内的「波次」术语替换为「回合」
本次提交将全项目中所有与「波次」相关的术语、注释、配置描述、UI文本全部替换为「回合」,包括: 1. 技能卡牌、怪物刷新、经济系统的相关注释与变量名 2. 配置表中的波次相关常量与描述文本 3. UI预制体中的波次显示文本 4. 所有相关的文档注释与接口说明 统一术语后,游戏的关卡流程描述将更符合常规肉鸽游戏的表达习惯,避免与「波次」字面含义混淆,提升代码可读性与团队协作一致性。
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user