using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using Wizard.Battle.View; using Wizard.Battle.View.Vfx; public abstract class PlayQueueViewBase { protected const float REARRANGE_TIME = 0.5f; protected const float ACCELERATE_REARRANGE_TIME = 0.2f; private const float queueUpdateSpeed = 10f; private const float aspectRatio_4_3 = 1.333f; private const float SMOOTHING_AMOUNT = 0.01f; private const float DECAY_MULTIPLIER = 5f; private Action _computeCorners; private List queuedCards = new List(); public Vector3 worldTopCornerPosition { get; private set; } public Vector3 worldBottomCornerPosition { get; private set; } protected abstract BattlePlayerBase BattlePlayerBase { get; } protected abstract float RotationAmount { get; } protected abstract Vector3 ScreenTopCornerPosition { get; } protected abstract Vector3 ScreenBottomCornerPosition { get; } public PlayQueueViewBase() { } public PlayQueueViewBase(BattleCamera battleCamera) { PlayQueueViewBase playQueueViewBase = this; Camera cutInCamera = battleCamera.m_CutInCamera.GetComponent(); _computeCorners = delegate { float aspect = cutInCamera.aspect; playQueueViewBase.worldTopCornerPosition = cutInCamera.ScreenToWorldPoint(playQueueViewBase.ScreenTopCornerPosition); playQueueViewBase.worldTopCornerPosition = playQueueViewBase.BattlePlayerBase.HandControl.Transform.InverseTransformPoint(playQueueViewBase.worldTopCornerPosition); playQueueViewBase.worldTopCornerPosition += playQueueViewBase.GetScreenTopCornerOffset(aspect); playQueueViewBase.worldTopCornerPosition = playQueueViewBase.BattlePlayerBase.HandControl.Transform.TransformPoint(playQueueViewBase.worldTopCornerPosition); playQueueViewBase.worldBottomCornerPosition = cutInCamera.ScreenToWorldPoint(playQueueViewBase.ScreenBottomCornerPosition); playQueueViewBase.worldBottomCornerPosition = playQueueViewBase.BattlePlayerBase.HandControl.Transform.InverseTransformPoint(playQueueViewBase.worldBottomCornerPosition); playQueueViewBase.worldBottomCornerPosition += playQueueViewBase.GetScreenBottomCornerOffset(aspect); playQueueViewBase.worldBottomCornerPosition = playQueueViewBase.BattlePlayerBase.HandControl.Transform.TransformPoint(playQueueViewBase.worldBottomCornerPosition); }; _computeCorners(); } public virtual void ForceClearPlayQueue() { queuedCards.Clear(); } public int QueueCount() { return queuedCards.Count; } public virtual void RemoveCardFromView(IBattleCardView cardViewToRemove, bool keepLayer = false) { cardViewToRemove.ResetPlayQueueFlags(); if (queuedCards.Count > 0 && queuedCards[0] == cardViewToRemove) { queuedCards.RemoveAt(0); } } public virtual void InsertCardFromView(IBattleCardView originalView, IBattleCardView insertView) { if (queuedCards.Count > 0 && queuedCards[0] == originalView && queuedCards.Any((IBattleCardView c) => c == originalView)) { queuedCards.Insert(queuedCards.IndexOf(originalView), insertView); } } public virtual void ReplaceCard(IBattleCardView cardViewToAdd, IBattleCardView cardViewToRemove) { cardViewToAdd._hasCardEnteredPlayQueue = true; cardViewToAdd._waitUntilCardIsInQueueCoroutine = BattleCoroutine.GetInstance().StartCoroutine(WaitUntilCardIsInQueue(cardViewToAdd)); cardViewToRemove.ResetPlayQueueFlags(); if (queuedCards.Count > 0 && queuedCards[0] == cardViewToRemove) { queuedCards.RemoveAt(0); queuedCards.Insert(0, cardViewToAdd); } } public virtual void ForceRemoveCardFromView(IBattleCardView cardViewToRemove) { cardViewToRemove.ResetPlayQueueFlags(); queuedCards.Remove(cardViewToRemove); iTween.Stop(cardViewToRemove.GameObject); } protected virtual bool IsCardPlayedInstantly(bool forceCardIntoPlayQueue) { return !forceCardIntoPlayQueue; } public bool IsCardInQueue(IBattleCardView battleCardView) { return queuedCards.Contains(battleCardView); } public void UpdatePlayQueuePositions(float deltaTime) { if (_computeCorners != null) { _computeCorners(); } Vector3 delta = worldBottomCornerPosition - worldTopCornerPosition; for (int i = 0; i < queuedCards.Count; i++) { float t = (float)i / (float)queuedCards.Count; if (queuedCards[i].GameObject.activeSelf) { Vector3 b = CalculatePositionInQueue(t, delta, worldTopCornerPosition); queuedCards[i].Transform.position = Vector3.Lerp(queuedCards[i].Transform.position, b, MotionUtils.CalculateFrameRateIndependantDampingConstant(0.01f, 5f)); } } } private Vector3 CalculatePositionInQueue(float t, Vector3 delta, Vector3 queueTopPosition) { return new Vector3(delta.x * MotionUtils.GetEase(t, MotionUtils.EaseType.easeOutQuad), delta.y * MotionUtils.GetEase(t, MotionUtils.EaseType.linear), delta.z * MotionUtils.GetEase(t, MotionUtils.EaseType.linear)) + queueTopPosition; } protected float CalculateAspectRatioMultiplier(float aspectRatio) { if (aspectRatio <= 1.333f) { aspectRatio = 1.333f; } return aspectRatio - 1f; } protected float CalculateInverseAspectRatioMultiplier(float aspectRatio) { if (aspectRatio <= 1.333f) { aspectRatio = 1.333f; } return 1f / (aspectRatio - 1f); } protected void AddCardToQueue(IBattleCardView playedCardView) { queuedCards.Add(playedCardView); if (!BattleManagerBase.GetIns().IsRecovery) { GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_HAND_MOVE_CENTER); iTween.Stop(playedCardView.GameObject); if (playedCardView.GameObject.activeSelf) { iTween.RotateAdd(playedCardView.GameObject, iTween.Hash("y", RotationAmount, "time", 0.5f, "islocal", true, "easetype", iTween.EaseType.easeOutExpo)); iTween.ScaleTo(playedCardView.GameObject, iTween.Hash("scale", Global.CARD_BATTLE_SCALE, "time", 0.5f, "islocal", true, "easetype", iTween.EaseType.easeOutExpo)); } } } protected VfxBase WaitUntilCardIsInQueueVfx(IBattleCardView playedCardView) { if (!BattleManagerBase.GetIns().IsRecovery) { playedCardView._hasCardEnteredPlayQueue = true; } return InstantVfx.Create(delegate { playedCardView._waitUntilCardIsInQueueCoroutine = BattleCoroutine.GetInstance().StartCoroutine(WaitUntilCardIsInQueue(playedCardView)); }); } private IEnumerator WaitUntilCardIsInQueue(IBattleCardView playedCardView) { yield return new WaitForSeconds(0.5f); playedCardView._isCardQueuedToBePlayed = true; } public abstract VfxBase AddCardToViewVfx(IBattleCardView playedCardView, bool forceCardIntoPlayQueue, bool isSelectTarget, bool isChoice, bool isChoiceBrave = false); public abstract VfxBase InstantAddCardToViewVfx(IBattleCardView playedCardView, bool forceCardIntoPlayQueue, bool isChoice); protected abstract Vector3 GetScreenTopCornerOffset(float aspectRatio); protected abstract Vector3 GetScreenBottomCornerOffset(float aspectRatio); protected void PlayPlayedCardEffect(IBattleCardView playedCardView) { GameMgr.GetIns().GetEffectMgr().Start(EffectMgr.EffectType.CMN_CARD_SET_1, playedCardView.GameObject.transform.position, playedCardView.GameObject.transform.rotation); } }