using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Cute; using UnityEngine; using Wizard.Battle.UI; using Wizard.Battle.View; using Wizard.Battle.View.Vfx; namespace Wizard.Battle.Mulligan; public abstract class MulliganMgrBase : IMulliganMgr { protected OpponentMulliganCtrl _opponentMulliganControl; private const float MULLIGAN_LIMIT_TIME = 5f; private Coroutine mulliganTimeoutCoroutine; public PlayerMulliganCtrl PlayerMlgCtrl { get; protected set; } public OpponentMulliganCtrl OpponentMlgCtrl => _opponentMulliganControl; public IList AbandonList => PlayerMlgCtrl.AbandonList; public Action OnSubmit { get; set; } public VfxBase StartDeal(List playerDealIdxList, List oppoDealIdxList, SkillProcessor skillProcessor) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); parallelVfxPlayer.Register(InstantVfx.Create(StopTimeout)); PlayerMlgCtrl.DealIdxList = playerDealIdxList; _opponentMulliganControl.DealIdxList = oppoDealIdxList; PlayerMlgCtrl.CreateMulliganDealList(playerDealIdxList); _opponentMulliganControl.CreateMulliganDealList(oppoDealIdxList); VfxBase instance = NullVfx.GetInstance(); VfxBase instance2 = NullVfx.GetInstance(); instance = PlayerMlgCtrl.StartMulliganVfx(skillProcessor); instance2 = _opponentMulliganControl.StartMulliganVfx(skillProcessor); parallelVfxPlayer.Register(instance); parallelVfxPlayer.Register(instance2); if (BattleManagerBase.GetIns().IsRecovery && Data.BattleRecoveryInfo.IsMulliganEnd) { return NullVfx.GetInstance(); } return parallelVfxPlayer; } protected virtual void StartTimeout() { StopTimeout(); mulliganTimeoutCoroutine = BattleCoroutine.GetInstance().StartCoroutine(MulliganNetworkTimeout()); } protected virtual void StopTimeout() { if (mulliganTimeoutCoroutine != null) { BattleCoroutine.GetInstance().StopCoroutine(mulliganTimeoutCoroutine); mulliganTimeoutCoroutine = null; } BattleManagerBase.GetIns().BattlePlayer.BattleView.HideAlertDialogue(); } private IEnumerator MulliganNetworkTimeout() { long matchedTimer = TimeUtil.GetAbsoluteTime().Ticks; do { yield return null; if (BattleManagerBase.GetIns().IsBattleEnd) { StopTimeout(); yield break; } } while (!((float)NetworkUtility.GetTimeSpanSecond(matchedTimer) >= 5f)); BattleManagerBase.GetIns().BattlePlayer.BattleView.ShowAlert(PanelMgr.BattleAlertType.DisconnectInfomationMulligan, isClass: false); } public virtual VfxBase Submit(BattleManagerBase m_BtlMgrIns) { OnSubmit.Call(); ImmediateVfxMgr.GetInstance().Register(PlayerMlgCtrl.MoveMulliganUIOutWhenSubmitMulligan()); return NullVfx.GetInstance(); } private void AddBattleLogMulliganResult(BattleManagerBase battleMgr) { BattleLogManager instance = BattleLogManager.GetInstance(); instance.AddLogMulliganChanged(battleMgr.BattlePlayer, PlayerMlgCtrl.GetChangedNum()); instance.AddLogMulliganChanged(battleMgr.BattleEnemy, OpponentMlgCtrl.GetChangedNum()); } public virtual VfxBase PlayerChangeCardVfx(BattleManagerBase btlMgrIns) { VfxBase result = PlayerMlgCtrl.SubmitMulliganVfx(PlayerMlgCtrl.AbandonList); List completeCards = btlMgrIns.BattlePlayer.HandCardList.Select((BattleCardBase c) => c.Index).ToList(); btlMgrIns.BattlePlayer.CallRecordingMulligan(PlayerMlgCtrl.AbandonList, completeCards); btlMgrIns.BattlePlayer.CallRecordingMulliganEnd(btlMgrIns.BattlePlayer.HandCardList); return result; } public abstract VfxBase EnemyChangeCardVfx(BattleManagerBase btlMgrIns); public virtual VfxBase CompleteMulligan(BattleManagerBase battleMgr) { if (!battleMgr.IsVirtualBattle && !GameMgr.GetIns().IsNewReplayBattle) { AddBattleLogMulliganResult(battleMgr); } return NullVfx.GetInstance(); } public virtual VfxBase InitMulligan(MulliganInfoControl mulliganInfo, IPlayerView view) { PlayerMlgCtrl = new PlayerMulliganCtrl(BattleManagerBase.GetIns().BattlePlayer, mulliganInfo, view); _opponentMulliganControl = new OpponentMulliganCtrl(BattleManagerBase.GetIns().BattleEnemy, mulliganInfo, isUseExchangeMark: false); return NullVfx.GetInstance(); } public virtual VfxBase MulliganStartDraw(bool firstAttack, SkillProcessor skillProcessor) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); VfxBase instance = NullVfx.GetInstance(); VfxBase instance2 = NullVfx.GetInstance(); if (firstAttack) { instance = PlayerMlgCtrl.StartMulliganVfx(skillProcessor); instance2 = _opponentMulliganControl.StartMulliganVfx(skillProcessor); } else { instance2 = _opponentMulliganControl.StartMulliganVfx(skillProcessor); instance = PlayerMlgCtrl.StartMulliganVfx(skillProcessor); } parallelVfxPlayer.Register(instance); parallelVfxPlayer.Register(instance2); return parallelVfxPlayer; } public virtual VfxBase RecoverMulligan(bool didPlayerSubmitMulligan, BattleManagerBase battleMgr) { return NullVfx.GetInstance(); } public MulliganInfoControl GetMulliganInfo() { return PlayerMlgCtrl.GetMulliganInfo(); } }