import { _decorator, Component, find, Label, Node, Prefab, sp, Tween, tween, v3, Vec3 } from 'cc'; import { GBundle, UIID } from '../../game/ConfigRes'; import { BattleType } from '../../manager/ChapterDataManager'; const { ccclass, property } = _decorator; @ccclass('DiamondTreasure') export class DiamondTreasure extends Component { Sk: sp.Skeleton = null; isCanClick: boolean = true; boxNumLabel: Label = null; lableTip: Node = null; protected onLoad(): void { this.boxNumLabel = this.node.getChildByName('boxNum').getComponent(Label); this.Sk = this.node.getChildByName('宝箱').getComponent(sp.Skeleton); } protected onEnable(): void { this.node.on(Node.EventType.TOUCH_START, this.onClickTreasure, this); // 节点再次启用/复用时,确保可点击状态被恢复(避免上一次中途打断导致 isCanClick 卡死) this.isCanClick = true; } protected onDisable(): void { this.node.off(Node.EventType.TOUCH_START, this.onClickTreasure, this); } public playSpine(name: string, callback: Function = null, timeScale = 1, loop = true) { this.Sk = this.node.getChildByName('宝箱').getComponent(sp.Skeleton); this.Sk.setCompleteListener(() => { this.Sk.setCompleteListener(null); if (callback) callback(); }); this.Sk.timeScale = timeScale * 1 this.Sk.setAnimation(0, name, loop); } /** * 打开宝物动画 */ public openTreasure() { this.boxNumLabel = this.node.getChildByName('boxNum').getComponent(Label); this.Sk = this.node.getChildByName('宝箱').getComponent(sp.Skeleton); if (!this.isCanClick) { console.log('[SkillSelectTrace]', JSON.stringify({ step: 'click_ignored', reason: 'isCanClick_false' })); return } console.log("打开宝物动画"); gg.audio.playEffect({ name: "钻石宝箱打开音效" }); if (gg.game.playerWeaponIdArray.length > 0 || gg.game.playerSkillIdArray.length > 0 || gg.game.setPlayerSkillGroupIdArray || gg.game.setPlayerWeaponGroupIdArray) { // console.log("GM有武器或技能,不开启转盘"); this.node.active = false this.isCanClick = true return } this.isCanClick = false let curWaveNum = gg.game.CurentBattle.CurentWaveNum gg.sdk.reportDY("inLevel", `章节${gg.game.CurentBattle.getReportDYChapterId()}_${curWaveNum}-点击掉落宝箱`) let index = gg.game.CurentBattle.IsOpenSkillSelectTimes; if (index >= gg.game.CurentBattle.OpenSkillSelectCoinArr.length) { index = gg.game.CurentBattle.OpenSkillSelectCoinArr.length - 1; } let coinNum = gg.game.CurentBattle.OpenSkillSelectCoinArr[index] ?? 0; const shouldChargeCoin = gg.game.CurentBattle.BattleType != BattleType.OrangeWeaponMode_Dian; gg.ui.popSkillSelectFromTreasure({ onSkillSelectOpenSuccess: () => { this.onSkillSelectOpened(coinNum, shouldChargeCoin); }, onSkillSelectOpenFail: (reason, detail, context) => { this.onSkillSelectOpenFailed(reason, detail, context); }, }); } /** SkillSelect 确认打开后再扣银币并播放开箱动画 */ private onSkillSelectOpened(coinNum: number, shouldChargeCoin: boolean) { if (shouldChargeCoin && coinNum > 0) { gg.game.CurentBattle.subCoinNum(coinNum); } this.playSpine('play', () => { gg.game.CurentBattle.tetriSaveBoxNum-- this.refreshBoxNum() if (gg.game.CurentBattle.tetriSaveBoxNum == 0) { this.playSpine('idle') this.isCanClick = true this.node.active = false } else { this.playSpine('idle') this.isCanClick = true this.node.active = true } }, 1.5, false) } /** SkillSelect 打开失败:回滚可点击状态,不扣银币、不减宝箱计数 */ private onSkillSelectOpenFailed(reason: string, detail?: string, context?: Record) { const battle = gg.game?.CurentBattle; console.error('[SkillSelectFail]', JSON.stringify({ source: 'treasure', reason, detail: detail ?? '', wave: battle?.CurentWaveNum, chapter: battle?.ChapterId, openTimes: battle?.IsOpenSkillSelectTimes, saveBoxNum: battle?.tetriSaveBoxNum, panelType: context?.panelType ?? 'unknown', pickSkillIds: context?.pickSkillIds ?? [], pickWeaponIds: context?.pickWeaponIds ?? [], curWeaponIds: context?.curWeaponIds ?? [], curSkillIds: context?.curSkillIds ?? [], })); this.isCanClick = true; gg.ui.showToast('技能选择界面打开失败,请重试', false); } refreshBoxNum() { this.boxNumLabel = this.node.getChildByName('boxNum').getComponent(Label); if (gg.game.CurentBattle.tetriSaveBoxNum <= 1) { this.boxNumLabel.node.active = false } else { this.boxNumLabel.node.active = false this.boxNumLabel.string = 'x' + gg.game.CurentBattle.tetriSaveBoxNum.toString() } } onClickTreasure() { console.log('[SkillSelectTrace]', JSON.stringify({ step: 'click', wave: gg.game.CurentBattle?.CurentWaveNum, saveBoxNum: gg.game.CurentBattle?.tetriSaveBoxNum, openTimes: gg.game.CurentBattle?.IsOpenSkillSelectTimes, coin: gg.game.CurentBattle?.CurentCoinNum, })); let index = gg.game.CurentBattle.IsOpenSkillSelectTimes; if (index >= gg.game.CurentBattle.OpenSkillSelectCoinArr.length) { index = gg.game.CurentBattle.OpenSkillSelectCoinArr.length - 1; } let num = gg.game.CurentBattle.OpenSkillSelectCoinArr[index]; if(gg.game.CurentBattle.BattleType == BattleType.OrangeWeaponMode_Dian){ }else{ if (gg.game.CurentBattle.CurentCoinNum < num) { gg.ui.showToast('银币不足') return } } if (this.lableTip) this.lableTip.active = false; let paopao = this.node.getChildByName('paopao') if (paopao?.isValid && paopao.active) { Tween.stopAllByTarget(paopao); tween(paopao) .to(0.5, { scale:Vec3.ZERO }, { easing: 'quadInOut' }) .call(() => { paopao.active = false; }) .start(); } this.openTreasure() } }