using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Cute; using UnityEngine; using Wizard; using Wizard.Battle.Player.Emotion; using Wizard.Battle.Touch; using Wizard.Battle.View; using Wizard.Battle.View.Vfx; public class TouchControl { public bool IsForceEnd; public bool IsDisconnect; protected BattleManagerBase _battleMgr; private BattleCamera _battleCamera; private BackGroundBase _backGround; protected VfxMgr _emotionVfxMgr; protected VfxMgr _predictionVfxMgr; protected Prediction _prediction; protected VfxMgr _classEffectVfxMgr; protected InputMgr _inputMgr; private IPlayerView _battlePlayerView; private IBattlePlayerView _battleEnemyView; public PlayerEmotion _playerEmotion; private Vector3 _moveWorld; private Vector3 _moveArrowWorld; public BattleCardBase _hitCard; private GameObject _arrowObject; private DetailPanelTouchProcessor _detailPanelTouchProcessor; private EvolutionTouchProcessor _evolutionTouchProcessor; private const string TapEffectArea1Tag = "TapEffectArea1"; private const string TapEffectArea2Tag = "TapEffectArea2"; private const string EpPanelTag = "EpPanel"; private const string PlayerChoiceBraveButtonTag = "PlayerChoiceBraveButton"; private const string EnemyChoiceBraveButtonTag = "EnemyChoiceBraveButton"; public const string BattleUITag = "BattleUI"; private const string ClassButtonTag = "ClassBtn"; private const string FieldGimic1Tag = "FieldGimic1"; private const string FieldGimic2Tag = "FieldGimic2"; private const string FieldGimic3Tag = "FieldGimic3"; private BattleCardBase _detailCardDisplay; private BattleCardBase _detailCardHover; private BattleCardBase _detailCardStart; private bool _isDetailCardChoiceBrave; private float _hoverTime; protected BattleCardBase _alertCard; private bool _isUsingEmote; private bool _isTapPlayerClass; private Vector2 _lastMousePos; private bool _evolutionClick; public static BattleCardBase KeepAlertCard; private const float HOVER_TIME = 0.2f; private const float HOVER_HAND_ANGLE_MAX = 70f; protected BattleCardBase _pressedCard; public bool IsProcessorStart { get; private set; } public bool IsProcessorUpdate { get; private set; } public bool IsProcessorEnd { get; private set; } public bool IsTouchCancel { get { if (!IsDisconnect && !IsForceEnd) { return _battleMgr.BattlePlayer.IsTimeOverTurnEndProcessing; } return true; } } public ITouchProcessor _touchProcessor { get; private set; } public bool HasTouchProcessor => _touchProcessor != null; protected BattlePlayer BattlePlayer => _battleMgr.BattlePlayer; protected BattleEnemy BattleEnemy => _battleMgr.BattleEnemy; public event Action OnEvolveFocus; public event Action OnEvolveUnfocus; public event Func OnAfterEvolveDragSelect; public event Func OnStartEvolveSkillTargetSelect; public TouchControl(BattleManagerBase battleMgr, BattleCamera battleCamera, BackGroundBase backGround) { _battleMgr = battleMgr; _battleCamera = battleCamera; _backGround = backGround; _emotionVfxMgr = new VfxMgr(); _predictionVfxMgr = new VfxMgr(); _prediction = _battleMgr.Prediction; _classEffectVfxMgr = new VfxMgr(); _inputMgr = GameMgr.GetIns().GetInputMgr(); _battlePlayerView = battleMgr.BattlePlayer.PlayerBattleView; _battleEnemyView = battleMgr.BattleEnemy.BattleEnemyView; } public void Dispose() { _prediction = null; if (_classEffectVfxMgr != null) { _classEffectVfxMgr.Dispose(); _classEffectVfxMgr = null; } if (_emotionVfxMgr != null) { _emotionVfxMgr.Dispose(); _emotionVfxMgr = null; } if (_predictionVfxMgr != null) { _predictionVfxMgr.Dispose(); _predictionVfxMgr = null; } if (_classEffectVfxMgr != null) { _classEffectVfxMgr.Dispose(); _classEffectVfxMgr = null; } KeepAlertCard = null; } public VfxBase Update(float dt) { if (UIManager.GetInstance().IsQuitDialog()) { return NullVfx.GetInstance(); } if (BattleManagerBase.GetIns().IsRecovery) { return NullVfx.GetInstance(); } if (!IsFeasibleAttack()) { if (_detailPanelTouchProcessor != null) { _detailPanelTouchProcessor.StopAttackTarget(); } if (_battlePlayerView != null) { StopDraggingArrow(); } } if (!IsFeasibleEvol() && _evolutionTouchProcessor != null) { _evolutionTouchProcessor.SetStopSelectFlag(); } VfxBase instance = NullVfx.GetInstance(); if (HasTouchProcessor) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); parallelVfxPlayer.Register(_touchProcessor.Update(dt, _battleCamera.Camera)); IsProcessorUpdate = true; if ((_touchProcessor.CheckIsEnd() || IsTouchCancel) && IsProcessorStart && IsProcessorUpdate) { VfxWith vfxWith = _touchProcessor.End(); IsProcessorEnd = true; _touchProcessor = vfxWith.Value; IsProcessorStart = false; IsProcessorUpdate = false; parallelVfxPlayer.Register(vfxWith.Vfx); if (HasTouchProcessor) { VfxBase vfx = _touchProcessor.Start(); IsProcessorStart = true; parallelVfxPlayer.Register(vfx); } } instance = parallelVfxPlayer; } else { instance = Wait(); } UpdateVfxMgrs(dt); _lastMousePos = Input.mousePosition; return instance; } private void UpdateVfxMgrs(float dt) { _emotionVfxMgr.Update(dt); _classEffectVfxMgr.Update(dt); _predictionVfxMgr.Update(dt); _prediction.Update(dt); } private VfxBase Wait() { if (_battleMgr.IsBattleEnd) { return NullVfx.GetInstance(); } bool flag = _battlePlayerView.HandControl.IsHandStateFocus() || BattleEnemy.BattleEnemyView.HandControl.IsHandStateFocus(); if (_inputMgr.IsNone() || _inputMgr.IsUp()) { _evolutionClick = false; _isTapPlayerClass = false; } if (_battlePlayerView == null || _battlePlayerView.HandView == null || _battlePlayerView.HandControl == null) { return NullVfx.GetInstance(); } if (_battlePlayerView.IsEvolutionStart && _battlePlayerView.IsMenuOpen) { _battlePlayerView.IsEvolutionStart = false; _battlePlayerView.ShowTurnEndButton(); } bool flag2 = _inputMgr.IsDown(); if (!BattleManagerBase.UseCustomMouse && !flag2 && !_isTapPlayerClass) { return NullVfx.GetInstance(); } if (BattleManagerBase.UseCustomMouse && !_battleMgr.HasFocus && !_isTapPlayerClass) { return NullVfx.GetInstance(); } Vector3 mousePosition = Input.mousePosition; Ray ray = _battleCamera.Camera.ScreenPointToRay(mousePosition); RaycastHit hitInfo = default(RaycastHit); RaycastHit[] hits = Physics.RaycastAll(ray.origin, ray.direction, float.PositiveInfinity); if (_isTapPlayerClass && !flag && IsFeasibleEmote()) { EmotionTouchProcessor touchProcessor = CreateEmotionTouchProcessor(_battleMgr, _inputMgr, _emotionVfxMgr); _isTapPlayerClass = false; if (BattleManagerBase.UseCustomMouse) { _isUsingEmote = true; } return RegisterTouchProcessor(touchProcessor); } _isTapPlayerClass = false; Ray ray2 = DetailMgr.GetCamera().ScreenPointToRay(mousePosition); RaycastHit[] array = null; if (!_battlePlayerView.IsTouchable()) { return NullVfx.GetInstance(); } UIManager instance = UIManager.GetInstance(); if (instance.isOpenDialog() || instance.isFading()) { return NullVfx.GetInstance(); } if (_battleCamera.Camera == null) { return NullVfx.GetInstance(); } _battlePlayerView.LockOnEffectOff(); if (!flag) { if (BattleManagerBase.UseCustomMouse && (_inputMgr.IsNone() || _inputMgr.IsDown())) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (TryZoomHand(hits, array)) { return NullVfx.GetInstance(); } } else if (!BattleManagerBase.UseCustomMouse && _inputMgr.IsDown()) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } flag = TryZoomHand(hits, array); } } else if (GameMgr.GetIns().IsAdmin && _inputMgr.IsDown()) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } flag |= TryZoomHand(hits, array); } if (BattleManagerBase.UseCustomMouse) { BattleCardBase hitCard = TouchCard(hits); if (_inputMgr.IsDown()) { _pressedCard = hitCard; } else if (_inputMgr.IsNone() || _inputMgr.IsUp()) { _pressedCard = null; } bool flag3 = hitCard != null && !hitCard.IsOnDraw && !hitCard.IsClass; if (flag3 && hitCard.IsInHand && hitCard.IsPlayer && UsePlayShortcut()) { if (BattlePlayer.IsSelfTurn && flag && !_battlePlayerView.IsSelecting && !hitCard.IsOnMove && hitCard.BattleCardView.GameObject.GetComponent() == null) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (!_battlePlayerView.IsDetailOn() || !array.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { _hitCard = hitCard; if (WillPlayCardFromHand(showAlert: true)) { _battlePlayerView.MoveCardCancel(_hitCard, _hitCard.BattleCardView.GameObject.transform.localPosition, _hitCard.BattleCardView.GameObject.transform.localRotation, IsPress: false); _battleMgr.BattleUIContainer.DisableMenu(); SetCardProcessor setCardProcessor = CreateSetCardProcessor(_hitCard); if (setCardProcessor == null) { return NullVfx.GetInstance(); } EmitHandUtility.SendSelectObject(_battleMgr, null); return RegisterTouchProcessor(setCardProcessor); } return NullVfx.GetInstance(); } return NullVfx.GetInstance(); } } else { if (flag3 && hitCard.IsInplay && hitCard.IsPlayer && UseEvolutionShortcut() && !_battlePlayerView.IsSelecting) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (!_battlePlayerView.IsDetailOn() || !array.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { if (_battleMgr.CanOpenEvolutionConfirmation(hitCard)) { HideAlert(); HideDetailPanel(); if (PlayerPrefsWrapper.GetBool(PlayerPrefsWrapper.CONFIRM_EVOLVE)) { _battleMgr.DetailMgr.DetailPanelControl._evolutionConfirmation.Show(BattlePlayer).onPushButton1 = delegate { _battleMgr.BattlePlayer.PlayerBattleView._isEvolutionSkillSelect = true; RegisterTouchProcessor(CreateEvolutionSimpleProcessor(hitCard)); }; return NullVfx.GetInstance(); } _battleMgr.BattlePlayer.PlayerBattleView._isEvolutionSkillSelect = true; EvolutionSimpleProcessor touchProcessor2 = CreateEvolutionSimpleProcessor(hitCard); return RegisterTouchProcessor(touchProcessor2); } return NullVfx.GetInstance(); } return NullVfx.GetInstance(); } if (hitCard != null && UseDetailShortcut() && hitCard.IsHoverActionCard() && _detailCardStart != hitCard && (!_battlePlayerView.IsDetailOn() || _battlePlayerView.DetailOpenCard != hitCard)) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (!_battlePlayerView.IsDetailOn() || !array.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { HideAlert(); StartOpenHandDetail(hitCard, !hitCard.IsInHand && Input.mousePosition.x < (float)Screen.width / 2f); } } else if (_inputMgr.IsNone()) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (!_battlePlayerView.IsDetailOn() || !array.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { checkHoverCard(hits, flag); } } } } if (_battlePlayerView.IsMenuOpen) { return NullVfx.GetInstance(); } ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); if (Physics.Raycast(ray.origin, ray.direction, out hitInfo, float.PositiveInfinity)) { if (flag2) { if (hitInfo.collider.CompareTag("CardHolder")) { return RegisterDeckTouchProcessor(_battlePlayerView); } if (hitInfo.collider.CompareTag("ECardHolder")) { return RegisterDeckTouchProcessor(_battleEnemyView); } } BattleCardBase battleCardBase = TouchCard(hits); if (_battlePlayerView.IsDetailOn() && flag2) { if (array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (array.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { return parallelVfxPlayer; } if (battleCardBase == null && !hitInfo.collider.CompareTag("ClassBtn") && !CheckChoiceBraveButton(hits, "PlayerChoiceBraveButton") && !CheckChoiceBraveButton(hits, "EnemyChoiceBraveButton")) { ResetDetail(); EmitHandUtility.SendSelectObject(_battleMgr, null); if (BattleManagerBase.UseCustomMouse && !array.Any((RaycastHit entry) => entry.collider.CompareTag("BattleUI"))) { _battleMgr.VfxMgr.RegisterImmediateVfx(_battlePlayerView.HandUnfocus()); GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_HAND_MOVE_RIGHT); } return parallelVfxPlayer; } } if (battleCardBase == null) { if (flag2 && !_battlePlayerView.IsDetailOn() && flag && !hitInfo.collider.CompareTag("BattleUI") && !hitInfo.collider.CompareTag("ClassBtn") && !CastRayWithBattleUI(mousePosition)) { _battleMgr.VfxMgr.RegisterImmediateVfx(_battlePlayerView.HandUnfocus()); _battleMgr.VfxMgr.RegisterImmediateVfx(_battleEnemyView.HandUnfocus()); GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_HAND_MOVE_RIGHT); } if (flag2) { _evolutionClick = CheckEpPanel(hitInfo.collider); } if (CheckEpPanel(hitInfo.collider) && BattlePlayer.BattleView.IsTouchable() && IsFeasibleEvol() && (BattlePlayer.IsEvolve || BattlePlayer.IsExceptionEvolve) && BattlePlayer.IsSelfTurn && ((!BattleManagerBase.UseCustomMouse && flag2) | (BattleManagerBase.UseCustomMouse && (_inputMgr.IsClick() || (_inputMgr.IsDownMoved() && _evolutionClick))))) { _battleMgr.VfxMgr.RegisterImmediateVfx(RegisterEvolutionTouchProcessor()); return NullVfx.GetInstance(); } if (flag2) { if (CheckChoiceBraveButton(hits, "PlayerChoiceBraveButton")) { BattleCardBase battleCardBase2 = BattleManagerBase.GetIns().BattlePlayer.Class; if (!GameMgr.GetIns().IsWatchBattle && BattlePlayer.CanChoiceBrave) { ResetDetail(); GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_HBP_BUTTON); _battlePlayerView.UpdateChoiceBraveActivatingEffect(isActivating: true); List choiceSkills = battleCardBase2.Skills.Where((SkillBase s) => s is Skill_choice && s.OnWhenChoiceBrave != 0).ToList(); parallelVfxPlayer.Register(RegisterTouchProcessor(new ChoiceBraveTouchProcessor(_battleMgr, battleCardBase2, choiceSkills))); _battleMgr.BattleUIContainer.DisableMenu(); } else { StartOpenHandDetail(battleCardBase2, right: false, isChoiceBraveButton: true); } } if (CheckChoiceBraveButton(hits, "EnemyChoiceBraveButton") && flag2) { BattleCardBase card = BattleManagerBase.GetIns().BattleEnemy.Class; StartOpenHandDetail(card, right: false, isChoiceBraveButton: true); } } } else { if (!battleCardBase.IsOnDraw) { _hitCard = battleCardBase; if (BattleManagerBase.UseCustomMouse) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (!_battlePlayerView.IsDetailOn() || !array.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { Func func = (BattleCardBase battleCardBase3) => _inputMgr.IsDownMoved() && _pressedCard != null && _pressedCard == battleCardBase3; if ((_inputMgr.IsClick() || func(_hitCard)) && flag && BattlePlayer.IsSelfTurn && _hitCard.IsInHand && _hitCard.IsPlayer && !_hitCard.IsClass && WillPlayCardFromHand(showAlert: true)) { SelectCardProcessor touchProcessor3 = new SelectCardProcessor(_battleMgr, _hitCard, _inputMgr, _pressedCard != null); parallelVfxPlayer.Register(RegisterTouchProcessor(touchProcessor3)); } } } else if ((_hitCard.IsPlayer || GameMgr.GetIns().IsWatchBattle) && _hitCard.IsInHand && (GameMgr.GetIns().IsAdmin || _hitCard.IsPlayer)) { SelectCardProcessor touchProcessor4 = new SelectCardProcessor(_battleMgr, _hitCard, _inputMgr, _pressedCard != null); parallelVfxPlayer.Register(RegisterTouchProcessor(touchProcessor4)); if (battleCardBase.BattleCardView.Transform.localScale.x >= 1f) { StartOpenHandDetail(_hitCard, right: false); } } if (_hitCard.IsInplay && !_hitCard.IsClass) { bool flag4 = true; if (BattleManagerBase.UseCustomMouse) { if (_battlePlayerView.IsDetailOn() && array == null) { array = Physics.RaycastAll(ray2.origin, ray2.direction, float.PositiveInfinity); } if (_battlePlayerView.IsDetailOn() && array.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { flag4 = false; } else { if (_hitCard.IsPlayer && !CanInPlayCardBeDragged(_hitCard, _battleMgr.BattlePlayer)) { _alertCard = _hitCard; } if (_inputMgr.IsDownMoved()) { flag4 = _pressedCard == _hitCard; } else if (!_inputMgr.IsClick()) { flag4 = false; } if (flag4 && (_detailCardDisplay == _hitCard || _detailCardStart == _hitCard)) { HideDetailPanel(); } } } if (flag4) { EvolutionSimpleProcessor evolutionProcessor = CreateEvolutionSimpleProcessor(_hitCard); _detailPanelTouchProcessor = new DetailPanelTouchProcessor(_battleMgr, _hitCard, _inputMgr, _prediction, evolutionProcessor); return RegisterTouchProcessor(_detailPanelTouchProcessor); } } } if (flag2 && battleCardBase.IsClass) { if (battleCardBase.IsPlayer && !_battlePlayerView.HandControl.IsHandStateFocus()) { _isTapPlayerClass = true; ClassBuffTouchProcessor touchProcessor5 = CreateClassBuffTouchProcessor(_battleMgr, battleCardBase, _inputMgr); return RegisterTouchProcessor(touchProcessor5); } if (!battleCardBase.IsPlayer && !BattleEnemy.BattleEnemyView.HandControl.IsHandStateFocus()) { ClassBuffTouchProcessor touchProcessor6 = CreateClassBuffTouchProcessor(_battleMgr, battleCardBase, _inputMgr); return RegisterTouchProcessor(touchProcessor6); } } else if (flag2) { WatchChoiceDetail(battleCardBase, parallelVfxPlayer); } } } if (flag2) { if (_battleCamera._backgroundCamera.fieldOfView != _battleCamera.Camera.fieldOfView) { ray = _battleCamera._backgroundCamera.ScreenPointToRay(mousePosition); Physics.Raycast(ray.origin, ray.direction, out hitInfo, float.PositiveInfinity); hits = Physics.RaycastAll(ray.origin, ray.direction, float.PositiveInfinity); } bool flag5 = true; if (BattleManagerBase.GetIns().IsPuzzleMgr) { _ = new RaycastHit[0]; Ray ray3 = UIManager.GetInstance().getCamera().ScreenPointToRay(mousePosition); flag5 = !Physics.RaycastAll(ray3.origin, ray3.direction, float.PositiveInfinity).Any((RaycastHit obj) => obj.collider.gameObject.name == "Btn"); } if (flag5) { CheckFieldGimic(hitInfo.collider); } PlayTapEffect(hits, mousePosition); } return parallelVfxPlayer; } protected virtual void WatchChoiceDetail(BattleCardBase hitCard, ParallelVfxPlayer parallelVfx) { } private bool TryZoomHand(RaycastHit[] hits, RaycastHit[] hitsPanel) { if (_battlePlayerView.IsDetailOn() && hitsPanel != null && hitsPanel.Any((RaycastHit entry) => entry.collider.CompareTag("DetailPanel"))) { return false; } BattleCardBase battleCardBase = TouchCard(hits); if (battleCardBase != null && battleCardBase.IsInHand) { if (!IsAbleZoomHandInSelecting(battleCardBase)) { return false; } if (battleCardBase.IsPlayer) { if (BattlePlayer.HandCardList.Count > 0) { _battleMgr.VfxMgr.RegisterImmediateVfx(_battlePlayerView.HandFocus()); _battleMgr.VfxMgr.RegisterImmediateVfx(_battleEnemyView.HandUnfocus()); GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_HAND_MOVE_CENTER); return true; } } else if (GameMgr.GetIns().IsAdminWatch && !battleCardBase.IsPlayer && BattleEnemy.HandCardList.Count > 0) { _battleMgr.VfxMgr.RegisterImmediateVfx(_battlePlayerView.HandUnfocus()); _battleMgr.VfxMgr.RegisterImmediateVfx(_battleEnemyView.HandFocus()); GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_HAND_MOVE_CENTER); return true; } } return false; } private bool IsAbleZoomHandInSelecting(BattleCardBase touchedCard) { IBattlePlayerView battlePlayerView = ((!touchedCard.IsPlayer) ? _battleEnemyView : _battlePlayerView); if (battlePlayerView.IsSelecting) { if (battlePlayerView.SelectSkillActCard == touchedCard) { return false; } if (battlePlayerView.GetSelectCardList().Contains(touchedCard)) { return false; } } return true; } public bool WillPlayCardFromHand(bool showAlert) { if (_hitCard == null) { return false; } bool flag = _battlePlayerView.DetailOpenCard != null; HideDetailPanel(); if (false || (_hitCard.Movable() && _hitCard.AreCanPlayConditionsFulfilled && IsFeasiblePlayCard())) { EmitHandUtility.SendSelectObject(_battleMgr, _hitCard); _battlePlayerView.MoveCardStart(_hitCard, isEffectAndSoundOn: true); _hitCard.BattleCardView.HideHandCardInfo(); Skill_transform accelerateOrCrystallizeTransformSkill = _hitCard.GetAccelerateOrCrystallizeTransformSkill(); if (accelerateOrCrystallizeTransformSkill != null) { BattleCardBase card = _battleMgr.CreateTransformCardRegisterVfx(accelerateOrCrystallizeTransformSkill.SkillPrm.ownerCard, accelerateOrCrystallizeTransformSkill.TransformId, accelerateOrCrystallizeTransformSkill.SkillPrm.ownerCard.IsPlayer); _prediction.Play(card); } else { _prediction.Play(_hitCard); } _inputMgr.WentOverDrag = false; return true; } if (showAlert) { if (_battlePlayerView.ShowAlertMessageTouchCard(ref _hitCard, ref _battleMgr)) { _alertCard = _hitCard; } if (flag) { EmitHandUtility.SendSelectObject(_battleMgr, null); } } return false; } public BattleCardBase TouchCard(RaycastHit[] hits) { BattleCardBase result = null; if (!GameMgr.GetIns().IsWatchBattle && (!_battlePlayerView.IsTouchable() || _battlePlayerView.IsSelecting)) { return result; } float num = float.PositiveInfinity; for (int i = 0; i < hits.Length; i++) { RaycastHit hit = hits[i]; BattleCardBase hitCardFromRayCastHit = GetHitCardFromRayCastHit(hit); if (hitCardFromRayCastHit != null && hit.distance < num) { result = hitCardFromRayCastHit; num = hit.distance; } } return result; } protected virtual BattleCardBase GetHitCardFromRayCastHit(RaycastHit hit) { GameObject gameObject = hit.collider.gameObject.transform.parent.gameObject; BattleCardBase battleCardBase = BattlePlayer.FindCardFromGameObject(gameObject); if (battleCardBase != null) { return battleCardBase; } BattleCardBase battleCardBase2 = BattleEnemy.FindCardFromGameObject(gameObject); if (battleCardBase2 != null) { return battleCardBase2; } return null; } private bool PlayTapEffect(RaycastHit[] hits, Vector3 currentMousePosition) { bool flag = false; bool flag2 = false; Vector3 pos = Vector3.zero; Vector3 pos2 = Vector3.zero; if (CastRayWithBattleUI(currentMousePosition)) { return false; } for (int i = 0; i < hits.Length; i++) { if (hits[i].collider.CompareTag("TapEffectArea1")) { flag = true; pos = hits[i].point; } else if (hits[i].collider.CompareTag("TapEffectArea2")) { flag2 = true; pos2 = hits[i].point; } else if (!hits[i].collider.CompareTag("BattleUI")) { return false; } } if (flag && flag2) { if (pos.z < pos2.z) { _backGround.StartFieldTapEffect(1, pos); } else { _backGround.StartFieldTapEffect(2, pos2); } } else if (flag) { _backGround.StartFieldTapEffect(1, pos); } else if (flag2) { _backGround.StartFieldTapEffect(2, pos2); } return flag || flag2; } public void CheckFieldGimic(Collider touch) { if (!(touch == null) && (touch.CompareTag("FieldGimic1") || touch.CompareTag("FieldGimic2") || touch.CompareTag("FieldGimic3"))) { _backGround.StartFieldGimic(touch.gameObject); } } public bool CheckEpPanel(Collider touch) { if (touch.CompareTag("EpPanel")) { return true; } return false; } public bool CheckChoiceBraveButton(RaycastHit[] hits, string tag) { foreach (RaycastHit raycastHit in hits) { if (raycastHit.collider.CompareTag(tag)) { return true; } } return false; } public void StopMovingHandCard(BattleCardBase card) { _pressedCard = null; _battlePlayerView.CancelCardDrag(card); ImmediateVfxMgr.GetInstance().Register(card.BattleCardView.ShowHandCardInfo(isRecovery: false, modifyParameterLabel: false)); _prediction.Clear(); } public void StartOpenHandDetail(BattleCardBase card, bool right, bool isChoiceBraveButton = false) { _detailCardStart = card; bool flag = Mathf.Approximately(card.BattleCardView.Transform.localPosition.x, 0f); BattleCoroutine.GetInstance().StartCoroutine(HandCardDetail(card, !flag && InputMgr.ShowDetailLeftAndRight && right, isChoiceBraveButton)); } private IEnumerator HandCardDetail(BattleCardBase card, bool showRight, bool isChoiceBraveButton) { bool wasCardInHandBeforeDetailOpen = card.IsInHand; bool wasDetailPanelHidden = false; if (_battlePlayerView.IsDetailOn()) { _battlePlayerView.HideDetailPanel(); wasDetailPanelHidden = true; } _battleMgr.DetailMgr.DetailPanelControl.SetScreenPosition(showRight); yield return new WaitForSeconds(0.1f); if (wasCardInHandBeforeDetailOpen && !card.IsInHand) { _detailCardStart = null; yield break; } if (!card.IsOnMove && _detailCardStart != null) { DetailPanelControl.ShowRequest showRequest = DetailPanelControl.ShowRequest.NORMAL; if (Data.CurrentFormat == Format.Avatar && card.IsClass && card.SelfBattlePlayer.AvatarBattleInfo != null) { showRequest = (isChoiceBraveButton ? DetailPanelControl.ShowRequest.CHOICE_BRAVE : DetailPanelControl.ShowRequest.CHOICE_BRAVE_AND_BUFF); } _battlePlayerView.ShowDetailPanel(_battleMgr, _battleMgr.OperateMgr, card, showRequest); EmitHandUtility.SendSelectObject(_battleMgr, card); } else if (wasDetailPanelHidden && !card.IsOnMove) { EmitHandUtility.SendSelectObject(_battleMgr, null); } _detailCardStart = null; } public virtual void ResetDetail() { if (_battlePlayerView.GetDetailCard() != null) { HideDetailPanel(); _hitCard = null; } } public VfxBase RegisterEvolutionTouchProcessor(bool isDetailPanelEvolution = false) { if (!_battleMgr.BattlePlayer.IsSelfTurn) { LocalLog.AccumulateLastTraceLog("RegisterEvolutionTouchProcessor NotSelfTurn"); return NullVfx.GetInstance(); } _battlePlayerView._isEvolutionSkillSelect = true; _evolutionTouchProcessor = CreateEvolutionTouchProcessor(_inputMgr, isDetailPanelEvolution); _evolutionTouchProcessor.OnFocusTarget += delegate(BattleCardBase targetCard) { if (targetCard != null && targetCard.CanEvolution(isSkill: false, isSelfBattlePlayer: true) && targetCard.IsInplay) { this.OnEvolveFocus.Call(); _battleMgr.VfxMgr.RegisterImmediateVfx(ParallelVfxPlayer.Create(InstantVfx.Create(delegate { _battlePlayerView.ShowDetailPanel(_battleMgr, _battleMgr.OperateMgr, targetCard, DetailPanelControl.ShowRequest.EVOLUTION_SELECT); }), new StartEvolutionTargetFocusVfx(targetCard.BattleCardView.GameObject), new EvolutionHideMessageVfx(_battleMgr, _battleMgr.BattleResourceMgr))); EmitHandUtility.SendSlideObject(_battleMgr, NetworkBattleSender.SLIDE_OBJECT_TYPE.Evolve, targetCard); } return NullVfx.GetInstance(); }; _evolutionTouchProcessor.OnUnfocusTarget += delegate(BattleCardBase targetCard) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); if (targetCard != null) { this.OnEvolveUnfocus.Call(); parallelVfxPlayer.Register(new StopEvolutionTargetFocasVfx(targetCard.BattleCardView.GameObject)); parallelVfxPlayer.Register(InstantVfx.Create(delegate { HideDetailPanel(); })); } _battleMgr.VfxMgr.RegisterImmediateVfx(ParallelVfxPlayer.Create(parallelVfxPlayer, _evolutionTouchProcessor.ShowEvolutionMessage())); return NullVfx.GetInstance(); }; _evolutionTouchProcessor.OnSelectTarget += delegate(BattleCardBase targetCard) { _battleMgr.VfxMgr.RegisterImmediateVfx(ParallelVfxPlayer.Create(InstantVfx.Create(delegate { if (IsFeasibleEvol()) { _battlePlayerView.DragArrowStop(_battleMgr); if (PlayerPrefsWrapper.GetBool(PlayerPrefsWrapper.CONFIRM_EVOLVE)) { _backGround.SetShaderGlobalColorBG.ChangeGlobalShaderColorFadeIn(); } } }), new StopEvolutionChoiceEffectVfx(_battlePlayerView.EpIcon), PlayerPrefsWrapper.GetBool(PlayerPrefsWrapper.CONFIRM_EVOLVE) ? _battleMgr.DetailMgr.DetailPanelControl.ShowEvolutionButton(targetCard) : NullVfx.GetInstance())); return NullVfx.GetInstance(); }; EvolutionTouchProcessor evolutionTouchProcessor = _evolutionTouchProcessor; evolutionTouchProcessor.OnAfterEvolveDragSelect = (Func)Delegate.Combine(evolutionTouchProcessor.OnAfterEvolveDragSelect, this.OnAfterEvolveDragSelect); _evolutionTouchProcessor.OnNotSelectTarget += delegate { _battlePlayerView.DragArrowStop(_battleMgr); _battleMgr.VfxMgr.RegisterImmediateVfx(new StopEvolutionChoiceEffectVfx(_battlePlayerView.EpIcon)); EmitHandUtility.SendSlideObject(_battleMgr, NetworkBattleSender.SLIDE_OBJECT_TYPE.Cancel); }; Exit(); return RegisterTouchProcessor(_evolutionTouchProcessor); } private VfxBase RegisterDeckTouchProcessor(IBattlePlayerView battlePlayerView) { return RegisterTouchProcessor(new DeckTouchProcessor(battlePlayerView, _inputMgr)); } public static bool IsPlayCard(BattlePlayerBase battlePlayer, BattleCardBase hitCard, bool isDebugLog = false) { int num = hitCard.Cost; if (hitCard.CheckConditionFixedUseCost(isPrePlay: true)) { num = hitCard.CalcFixedUseCost(hitCard.SelfBattlePlayer.Pp); } if (battlePlayer.Pp < num) { if (isDebugLog) { LocalLog.AccumulateTraceLog("IsPlayCard PPover Pp" + battlePlayer.Pp + "useCost" + num + "cardId" + hitCard.CardId + "idx" + hitCard.Index); } return false; } if (hitCard.IsSpell) { return true; } if (battlePlayer.ClassAndInPlayCardList.Count > 5) { if (isDebugLog) { LocalLog.AccumulateTraceLog("IsPlayCard OverField "); } return false; } if (hitCard.SelfBattlePlayer.Class.SkillApplyInformation.IsCantPlay(hitCard)) { if (isDebugLog) { LocalLog.AccumulateTraceLog("IsPlayCard CantPlay "); } return false; } return true; } public VfxBase ForceEndTouchProcessor() { IsForceEnd = true; VfxWith vfxWith = (HasTouchProcessor ? _touchProcessor.End() : new VfxWith(NullVfx.GetInstance(), null)); VfxBase result = vfxWith.Vfx; if (vfxWith.Value is ChoiceTouchProcessor || vfxWith.Value is SkillTargetSelectTouchProcessor) { _battlePlayerView.DisableSettingFlag(); } if (vfxWith.Value is ChoiceTouchProcessor) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); sequentialVfxPlayer.Register(vfxWith.Value.Start()); sequentialVfxPlayer.Register(vfxWith.Value.End().Vfx); result = sequentialVfxPlayer; } else if (!(_touchProcessor is FusionWaitProcessor) && _touchProcessor is SetCardProcessor) { result = vfxWith.Value.End().Vfx; } _touchProcessor = null; IsForceEnd = false; return result; } public void Exit() { _hitCard = null; } public VfxBase RegisterTouchProcessor(ITouchProcessor touchProcessor) { _touchProcessor = touchProcessor; VfxBase result = touchProcessor.Start(); IsProcessorStart = true; return result; } protected virtual bool IsFeasibleAttack() { return true; } protected virtual bool IsFeasiblePlayCard() { return true; } protected virtual bool IsFeasibleEmote() { return true; } protected virtual bool IsFeasibleEvol() { return true; } protected virtual SkillTargetSelectTouchProcessor CreateSkillTargetSelectTouchProcessor(BattleCardBase actingCard, InputMgr inputMgr, List skillList, List selectedCardList, bool isEvolve) { return SkillTargetSelectTouchProcessor.Create(_battleMgr, actingCard, skillList, _prediction, selectedCardList, isEvolve, isChoiceBrave: false); } protected Func, List, bool, SkillTargetSelectTouchProcessor> CreateSkillTargetSelectTouchProcessorFunc(InputMgr inputMgr) { return (BattleCardBase actingCard, List selectedCardList, List skillList, bool isEvolve) => CreateSkillTargetSelectTouchProcessor(actingCard, inputMgr, skillList, selectedCardList, isEvolve); } public SetCardProcessor CreateSetCardProcessor(BattleCardBase card) { if (!_battleMgr.BattlePlayer.IsSelfTurn) { LocalLog.AccumulateLastTraceLog("CreateSetCardProcessor NotSelfTurn"); return null; } List selectSkills = (from s in card.GetSelectTypeSkill() where s.OnWhenChoiceBrave == 0 select s).ToList(); Func, List, bool, SkillTargetSelectTouchProcessor> getSkillTargetSelectTouchProcessorFunc = CreateSkillTargetSelectTouchProcessorFunc(_inputMgr); return new SetCardProcessor(_battleMgr, card, selectSkills, _prediction, getSkillTargetSelectTouchProcessorFunc); } protected virtual EvolutionTouchProcessor CreateEvolutionTouchProcessor(InputMgr inputMgr, bool isDetailEvolution = false) { Func, List, bool, SkillTargetSelectTouchProcessor> getSkillTargetSelectTouchProcessorFunc = CreateSkillTargetSelectTouchProcessorFunc(_inputMgr); return new EvolutionTouchProcessor(_battleMgr, inputMgr, _battleMgr.BattleResourceMgr, isDetailEvolution, getSkillTargetSelectTouchProcessorFunc, _prediction); } public EvolutionSimpleProcessor CreateEvolutionSimpleProcessor(BattleCardBase card) { List selectSkills = card.GetSelectTypeSkill(isEvolve: true, isFusion: false, isRegister: false, isEvolutionSimpleProcessor: true).ToList(); Func, List, bool, SkillTargetSelectTouchProcessor> getSkillTargetSelectTouchProcessorFunc = CreateSkillTargetSelectTouchProcessorFunc(_inputMgr); return new EvolutionSimpleProcessor(_battleMgr, card, _inputMgr, selectSkills, getSkillTargetSelectTouchProcessorFunc, this.OnStartEvolveSkillTargetSelect); } protected virtual EmotionTouchProcessor CreateEmotionTouchProcessor(BattleManagerBase battleMgr, InputMgr inputMgr, VfxMgr emotionVfxMgr) { return new EmotionTouchProcessor(BattlePlayer.PlayerEmotion, battleMgr.BattleResourceMgr, battleMgr.TouchControl, inputMgr, emotionVfxMgr); } protected virtual ClassBuffTouchProcessor CreateClassBuffTouchProcessor(BattleManagerBase battleMgr, BattleCardBase touchClass, InputMgr inputMgr) { return new ClassBuffTouchProcessor(battleMgr, touchClass, inputMgr); } public static GameObject FindTouchPositionObject(IEnumerable gameObjects, Camera camera) { if (gameObjects == null) { return null; } Ray ray = camera.ScreenPointToRay(Input.mousePosition); RaycastHit[] array = Physics.RaycastAll(ray.origin, ray.direction, float.PositiveInfinity); foreach (GameObject gameObject in gameObjects) { for (int i = 0; i < array.Length; i++) { if (array[i].collider.gameObject == gameObject) { return gameObject; } } } return null; } public static bool CanInPlayCardBeDragged(BattleCardBase attackCard, BattlePlayerBase battlePlayer) { if (battlePlayer.IsSelfTurn && attackCard.IsPlayer && attackCard.IsUnit && attackCard.Attackable) { return attackCard.AreCanAttackConditionsFulfilled; } return false; } public static bool CastRayWithBattleUI(Vector3 mousePosition) { return CastRayWithTags(mousePosition, new List { "BattleUI" }); } public static bool CastRayWithTags(Vector3 mousePosition, IEnumerable tags) { Ray ray = UIManager.GetInstance().getCamera().ScreenPointToRay(mousePosition); return Physics.RaycastAll(ray.origin, ray.direction, float.PositiveInfinity).Any((RaycastHit hit) => tags.Any((string tag) => hit.collider.CompareTag(tag))); } private void HideDetailPanel() { _battlePlayerView.HideDetailPanel(); _detailCardDisplay = null; _detailCardStart = null; } protected virtual void HideAlert() { _battlePlayerView.HideAlertDialogue(); _alertCard = null; } protected virtual bool IsShowingAlert() { return _battlePlayerView.IsShowingAlert(); } private void checkHoverCard(RaycastHit[] hits, bool isZoomHand) { if (OptionSettingWindow.ShortcutDetailPanel != OptionSettingWindow.ShortcutDetail.Auto) { return; } BattleCardBase battleCardBase = TouchCard(hits); BattleCardBase battleCardBase2 = null; if (KeepAlertCard != null && KeepAlertCard == battleCardBase && IsShowingAlert()) { return; } KeepAlertCard = null; bool flag = false; bool flag2 = false; bool flag3 = false; if (battleCardBase != null) { flag = battleCardBase.IsClass; flag3 = battleCardBase.IsHoverActionCard(); } else if (CheckChoiceBraveButton(hits, "PlayerChoiceBraveButton") && (GameMgr.GetIns().IsWatchBattle || !BattlePlayer.CanChoiceBrave)) { flag2 = true; battleCardBase = BattleManagerBase.GetIns().BattlePlayer.Class; } else if (CheckChoiceBraveButton(hits, "EnemyChoiceBraveButton")) { flag2 = true; battleCardBase = BattleManagerBase.GetIns().BattleEnemy.Class; } else { _isUsingEmote = false; } if (flag || flag2 || flag3) { if (flag && battleCardBase.IsPlayer && _isUsingEmote) { return; } if (_detailCardDisplay == null) { battleCardBase2 = battleCardBase; _hoverTime = 0f; _detailCardHover = null; } else { bool flag4 = false; if (battleCardBase.IsInHand) { if (_detailCardDisplay.IsInHand) { Vector2 to = _inputMgr.GetPos() - _lastMousePos; if (to.sqrMagnitude > 1f && Mathf.Abs(Vector2.Angle(Vector2.up, to)) > 70f) { flag4 = true; } } else { flag4 = true; } } if (flag4) { battleCardBase2 = battleCardBase; } else if (_detailCardHover == battleCardBase) { _hoverTime += Time.deltaTime; if (_hoverTime > 0.2f) { battleCardBase2 = battleCardBase; } } else { _detailCardHover = battleCardBase; _hoverTime = 0f; } } } if (battleCardBase2 == null) { if (_detailCardDisplay == null && _battlePlayerView.IsDetailOn()) { HideDetailPanel(); } if (_alertCard != null && IsShowingAlert()) { HideAlert(); } return; } bool flag5 = IsShowingAlert() && battleCardBase2 == _alertCard; if ((battleCardBase2 != _battlePlayerView.GetDetailCard() || (battleCardBase2.IsClass && flag2 != _isDetailCardChoiceBrave)) && !flag5) { if (_alertCard != null || IsShowingAlert()) { HideAlert(); } if (!(_battlePlayerView.HandControl.IsHandStateFocus() && flag) || !battleCardBase2.IsPlayer) { _detailCardDisplay = battleCardBase2; _isDetailCardChoiceBrave = flag2; bool right = !battleCardBase2.IsClass && !battleCardBase2.IsInHand && Input.mousePosition.x < (float)Screen.width / 2f; StartOpenHandDetail(battleCardBase2, right, flag2); } } } private bool UsePlayShortcut() { return OptionSettingWindow.ShortcutPlay switch { OptionSettingWindow.Shortcut.RightClick => Input.GetMouseButtonDown(1), OptionSettingWindow.Shortcut.MiddleClick => Input.GetMouseButtonDown(2), _ => false, }; } private bool UseEvolutionShortcut() { return OptionSettingWindow.ShortcutEvolution switch { OptionSettingWindow.Shortcut.RightClick => Input.GetMouseButtonDown(1), OptionSettingWindow.Shortcut.MiddleClick => Input.GetMouseButtonDown(2), OptionSettingWindow.Shortcut.DoubleClick => _inputMgr.IsDoubleClick(), _ => false, }; } private bool UseDetailShortcut() { return OptionSettingWindow.ShortcutDetailPanel switch { OptionSettingWindow.ShortcutDetail.RightClick => Input.GetMouseButtonDown(1), OptionSettingWindow.ShortcutDetail.MiddleClick => Input.GetMouseButtonDown(2), OptionSettingWindow.ShortcutDetail.DoubleClick => _inputMgr.IsDoubleClick(), OptionSettingWindow.ShortcutDetail.LongPress => _inputMgr.IsLongPress(), _ => false, }; } public Prediction GetPrediction() { return _prediction; } public void SelectCancelActCard() { _battleMgr.OperateMgr.SelectCancel(_hitCard); } protected virtual void StopDraggingArrow() { _battlePlayerView.DragArrowStop(_battleMgr); } }