diff --git a/assets/script/game/common/SingletonModuleComp.ts b/assets/script/game/common/SingletonModuleComp.ts index 63889c38..b6be8870 100644 --- a/assets/script/game/common/SingletonModuleComp.ts +++ b/assets/script/game/common/SingletonModuleComp.ts @@ -8,7 +8,7 @@ import { GameEvent } from "./config/GameEvent"; import { GameScoreStats } from "./config/HeroAttrs"; import { mLogger } from "./Logger"; import { gameDataSync } from "./GameDataSync"; -import { FightSet, HERO_UPGRADE_NEED_FRAGMENTS } from "./config/GameSet"; +import { HERO_UPGRADE_NEED_FRAGMENTS } from "./config/GameSet"; /** * 用远程数据覆盖本地数据(统一方法) @@ -121,8 +121,6 @@ export class SingletonModuleComp extends ecs.Comp { pending_mon_num: 0,//待刷出怪物数量(MissionMonComp 每帧写入,供回合结束检测与 HUD 进度) wave_early_skip: 0,//本回合清场加速累计节省的秒数(MissionComp 用于还原 DDA 判定口径) hero_num: 0,//英雄数量 - hero_max_num: FightSet.HERO_MAX_NUM,//英雄可召唤上限 - hero_extend_max_num: FightSet.HERO_MAX_NUM + 1,//英雄可拓展上限 wave_time_num: 0,//回合时间 in_fight: false, fight_time: 0,//战斗时间 diff --git a/assets/script/game/common/config/GameSet.ts b/assets/script/game/common/config/GameSet.ts index cd0a2411..d8ceed70 100644 --- a/assets/script/game/common/config/GameSet.ts +++ b/assets/script/game/common/config/GameSet.ts @@ -38,7 +38,8 @@ export enum FightSet { CRIT_DAMAGE = 50,//暴击伤害 MORE_RC = 10,//更多次数 广告获取的次数 HEARTPOS = -320,//基地位置 - HERO_MAX_NUM = 10,//英雄最大数量 + /** 场上英雄编制数:由开局 3 次三选一固定,玩家无法扩充 */ + HERO_FIELD_NUM = 3, /** 英雄可升级到的最高等级(通过升级卡提升) */ HERO_MAX_LV = 6, /** 英雄技能等级上限(无限升级下技能 5 级封顶,超出等级只长属性) */ diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 227cd58e..8a662c20 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -866,7 +866,7 @@ export const HeroList: number[] = [ /** * 推荐阵容条目。 - * Why: 场上最多 3 个英雄(FightSet.HERO_MAX_NUM),围绕"发动机 → 增益 → 主C"铁三角结构 + * Why: 场上固定 3 个英雄(FightSet.HERO_FIELD_NUM),围绕"发动机 → 增益 → 主C"铁三角结构 * 预置官方配合组合,供抽卡引导、阵容推荐 UI 与 AI 自动布阵消费。 */ export interface HeroComboInfo { @@ -1048,7 +1048,7 @@ function getAttackCd(hero: heroInfo): number { /** 计算目标群体范围系数 */ function calcScopeMul(group: TGroup): number { - return (group === TGroup.Ally || group === TGroup.Team) ? FightSet.HERO_MAX_NUM : 1; + return (group === TGroup.Ally || group === TGroup.Team) ? FightSet.HERO_FIELD_NUM : 1; } /** 计算目标时间窗内的普攻次数 */ @@ -1306,7 +1306,7 @@ function calcFieldPowerDetailed(entries: FieldEntry[] | undefined, hero: heroInf const weights = HERO_POWER_WEIGHTS; const { hp: hpEff, ap: apEff } = getEffectiveStats(hero, targetLv); const cd = getAttackCd(hero); - const scopeMul = FightSet.HERO_MAX_NUM; + const scopeMul = FightSet.HERO_FIELD_NUM; let total = 0; const items: FieldSkillEval[] = []; diff --git a/assets/script/game/map/MissionCardComp.ts b/assets/script/game/map/MissionCardComp.ts index 810ec04e..b2dccf67 100644 --- a/assets/script/game/map/MissionCardComp.ts +++ b/assets/script/game/map/MissionCardComp.ts @@ -7,7 +7,8 @@ * 抽卡规则:从基础英雄卡池按权重抽取,同一次抽卡内英雄不重复; * 过滤已上场英雄(卡池不足时自动回退,保证能抽满)。 * 2. **金币费用管理** —— 抽卡费用(refreshCost)的扣除。 - * 3. **英雄数量上限校验** —— 在 UseHeroCard 事件的 guard 阶段判断是否允许再召唤英雄。 + * 3. **英雄数量由机制固定** —— 开局 3 次免费三选一召唤满 3 个英雄,玩家无法扩充, + * UseHeroCard 事件的 guard 入口保留但不再做满员拦截。 * 4. **场上英雄信息面板(HInfoComp 列表)同步** —— * 英雄上场时实例化面板,死亡时移除,定时刷新属性显示。 * 5. **特殊卡执行** —— 处理英雄升级卡(SpecialUpgrade,按 UUID 精确升级)和 @@ -35,7 +36,7 @@ * - HInfoComp —— 英雄信息面板 * - CardSet 模块 —— 卡池配置、抽卡规则、特殊卡数据 * - HeroAttrsComp —— 英雄属性(升级) - * - smc.vmdata.mission_data —— 局内数据(coin / hero_num / hero_max_num) + * - smc.vmdata.mission_data —— 局内数据(coin / hero_num) */ import { mLogger } from "../common/Logger"; import { _decorator, instantiate, Label, Node, NodeEventType, Prefab, Tween, tween, Vec3, UITransform, Widget } from "cc"; @@ -324,8 +325,6 @@ export class MissionCardComp extends CCComp { if (missionData) { missionData.coin = Math.max(0, Math.floor(missionData.coin ?? 0)); missionData.hero_num = 0; - missionData.hero_max_num = FightSet.HERO_MAX_NUM; - missionData.hero_extend_max_num = FightSet.HERO_MAX_NUM + 1; } // 确保卡牌组件列表已被正确缓存 @@ -812,24 +811,13 @@ export class MissionCardComp extends CCComp { /** * 使用英雄卡的 guard 校验(由 CHeroComp 通过 UseHeroCard 事件调用): - * - 当前英雄数 < 上限 → 允许使用。 - * - 已满 → 阻止使用(cancel=true),弹 toast。 - * - * 注意:英雄不再支持合成腾位,满员时一律阻止。 + * 英雄数量由开局 3 次三选一固定,玩家无法主动扩充,此 guard 不再做满员拦截, + * 仅保留事件入口兼容 CHeroComp 的调用契约。 */ private onUseHeroCard(event: string, args: any) { const payload = args ?? event; if (!payload) return; - - const current = this.getAliveHeroCount(); - this.syncMissionHeroData(current); - const heroMax = this.getMissionHeroMaxNum(); - if (current >= heroMax) { - payload.cancel = true; - payload.reason = "hero_limit"; - this.showSmallTip("hero_full", "英雄队伍已满"); - this.playHeroNumDeniedAnim(); - } + this.syncMissionHeroData(); } /** @@ -2088,28 +2076,8 @@ export class MissionCardComp extends CCComp { if (num && num.isValid) this.playHeroNumNodePop(num, peak); } - public setHeroMaxCount(max: number) { - const missionData = this.getMissionData(); - if (!missionData) return; - const min = FightSet.HERO_MAX_NUM; - const limit = Math.max(min, missionData.hero_extend_max_num ?? (FightSet.HERO_MAX_NUM + 1)); - const next = Math.max(min, Math.min(limit, Math.floor(max || min))); - if (next === missionData.hero_max_num) return; - missionData.hero_max_num = next; - this.updateHeroNumUI(true, false); - } - - public tryExpandHeroMax(add: number = 1): boolean { - const missionData = this.getMissionData(); - if (!missionData) return false; - const before = this.getMissionHeroMaxNum(); - const next = before + Math.max(0, Math.floor(add)); - this.setHeroMaxCount(next); - return this.getMissionHeroMaxNum() > before; - } - public canUseHeroCard(): boolean { - return this.getAliveHeroCount() < this.getMissionHeroMaxNum(); + return true; } private getAliveHeroCount(): number { @@ -2300,10 +2268,6 @@ export class MissionCardComp extends CCComp { return Math.max(0, Math.floor(missionData?.hero_num ?? 0)); } - private getMissionHeroMaxNum(): number { - return FightSet.HERO_MAX_NUM - } - private syncMissionHeroData(count?: number) { const missionData = this.getMissionData(); if (!missionData) return;