/** * @file HeroBoxComp.ts * @description 英雄卡池单个卡槽组件(UI 视图层 + 购买/召唤逻辑) * * 职责: * 1. 渲染单个英雄卡的显示信息(名称、等级、描述、图标、费用), * 展示方式与 SCardComp 一致(图集静态图标 + ★等级 + 描述词条)。 * 同时支持动态升级卡(SpecialUpgrade + target_hero_eid)按英雄卡样式渲染。 * 2. 处理购买点击 → UseHeroCard 上限校验(guard) → 扣费 → 派发 CallHero 召唤英雄。 * 特殊卡(升级/刷新)则派发 UseSpecialCard。 * 3. 使用成功后派发 CardUsed 事件,通知 MissionCardComp 刷新英雄卡池。 * * 与 SCardComp 的差异: * - 数据源为 HeroInfo(heroSet),而非 SkillCardList / SkillSet。 * - 购买前需通过 GameEvent.UseHeroCard 做英雄数量上限校验。 * - 英雄卡效果事件为 GameEvent.CallHero,而非 UseSkillCard。 */ import { mLogger } from "../common/Logger"; import { _decorator, Node, Sprite, Label, NodeEventType, Vec3, Tween, tween, UIOpacity, SpriteFrame, resources, AnimationClip } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { CardConfig, CardType } from "../common/config/CardSet"; import { HeroInfo } from "../common/config/heroSet"; import { oops } from "db://oops-framework/core/Oops"; import { GameEvent } from "../common/config/GameEvent"; import { smc } from "../common/SingletonModuleComp"; import { UIID } from "../common/config/GameUIConfig"; import { HeroAttrsComp } from "../hero/HeroAttrsComp"; import { FieldSkillType } from "../common/config/SkillSet"; import { FieldSkillHelper } from "../hero/FieldSkillHelper"; import { MissionEconomy } from "./MissionEconomy"; const { ccclass, property } = _decorator; /** * HeroBoxComp —— 英雄卡池单个英雄卡项 * * 由 MissionCardComp.cacheCardComps() 实例化。 * 以图标 + 名称 + 描述词条 + 购买按钮的形式呈现。 */ @ccclass('HeroBoxComp') @ecs.register('HeroBoxComp', false) export class HeroBoxComp extends CCComp { private debugMode: boolean = true; // ======================== 编辑器绑定节点 ======================== /** 英雄图标节点 */ @property({ type: Node }) private icon_node: Node = null; /** 背景节点 */ @property({ type: Node }) private bg_node: Node = null; /** 英雄名称 */ @property(Label) private name_label: Label = null; /** 等级标签 */ @property(Label) private level_label: Label = null; // ======================== 生命周期 ======================== onLoad() { } /** ECS 组件移除时销毁节点 */ reset() { if (this.node && this.node.isValid) { this.node.destroy(); } } }