using System; using System.Collections; using System.Linq; using UnityEngine; using Wizard; public class PanelMgr : MonoBehaviour { public enum BattleAlertType { CannotPlay, InPlayIsFull, NotEnoughPp, NoInPlayTarget, NotPassCondition, GuardExisted, EvoButDrunk, CannotAttackNotHasGuard, CannotAttackClass, CannotAttackAmulet, CannotAttackTarget, AlreadyAttackedThisTurn, CannotAttackOnSameTurn, CannotAttackGeneric, EmoteLimit, ContainRandomElement, NoSelectedEvolutionTarget, NoSelectedEmotionIcon, SelectedEmotionIcon, SelectTargetCard, SelectTargetCardOver, SelectChoiceCard, SelectChoiceBraveCard, ElfInfomation, RoyalInfomation, WitchInfomation, DragonInfomationNotAwake, DragonInfomationAwake, VampireInfomationNotRevenge, VampireInfomationRevenge, NecromanceInfomation, BishopInfomation, DisconnectInfomation, DisconnectInfomationMulligan, None } private const float AUTOSTOP_SEC_MAX = 3f; private const float SIZE_NORMAL = 1f; private const float SIZE_SMALL = 0.5f; private const int DEPTH_NORMAL = 42; private const int DEPTH_CHOICE = 30; private const float SELECT_POSITION_Y = 0.52f; private const float SELECT_OVER_POSITION_Y = 0.77f; private const float SELECT_CHOICE_Y = 0.65f; private float _autoStopSec; private Coroutine _autoStopCoroutine; private BattleManagerBase _battleMgr; private BattleAlertType _currentAlertType = BattleAlertType.None; private string _currentText = ""; private bool _notHideAndNotCreate; private static readonly string INPLAY_TEXT = SkillFilterCreator.ContentKeyword.inplay.ToString(); private static readonly string HAND_OTHER_SELF_TEXT = SkillFilterCreator.ContentKeyword.hand_other_self.ToString(); private static readonly string CONST_TEXT = SkillFilterCreator.ContentKeyword.count.ToString(); private static readonly string TURN_DAMAGE_CONST_TEXT = SkillFilterCreator.ContentKeyword.turn_damage_count.ToString(); private static readonly string TURN_HEAL_CONST_TEXT = SkillFilterCreator.ContentKeyword.turn_heal_count.ToString(); private static readonly string TURN_SKILL_RETURN_CARD_CONST_TEXT = SkillFilterCreator.ContentKeyword.turn_skill_return_card_count.ToString(); private static readonly string TURN_ENHANCE_CARD_COUNT_TEXT = SkillFilterCreator.ContentKeyword.turn_enhance_card_count.ToString(); private void Awake() { _battleMgr = BattleManagerBase.GetIns(); } public void InfoAlertDialogueAction(BattleAlertType AlertType, int PanelWidth, bool anim, bool isClass, string text) { if ((_currentAlertType == BattleAlertType.EmoteLimit && (AlertType == BattleAlertType.NoSelectedEmotionIcon || AlertType == BattleAlertType.SelectedEmotionIcon)) || _notHideAndNotCreate) { return; } _currentAlertType = AlertType; switch (AlertType) { case BattleAlertType.CannotPlay: case BattleAlertType.InPlayIsFull: case BattleAlertType.NotEnoughPp: case BattleAlertType.NoInPlayTarget: case BattleAlertType.NotPassCondition: case BattleAlertType.EvoButDrunk: case BattleAlertType.AlreadyAttackedThisTurn: case BattleAlertType.CannotAttackOnSameTurn: case BattleAlertType.CannotAttackGeneric: case BattleAlertType.EmoteLimit: case BattleAlertType.ElfInfomation: case BattleAlertType.RoyalInfomation: case BattleAlertType.WitchInfomation: case BattleAlertType.DragonInfomationNotAwake: case BattleAlertType.DragonInfomationAwake: case BattleAlertType.VampireInfomationNotRevenge: case BattleAlertType.VampireInfomationRevenge: case BattleAlertType.NecromanceInfomation: case BattleAlertType.BishopInfomation: DialogueReposition(0f, 0f, GetAlertTypeToText(AlertType), 0, PanelWidth, anim); break; case BattleAlertType.ContainRandomElement: case BattleAlertType.NoSelectedEmotionIcon: DialogueReposition(0f, 0f, GetAlertTypeToText(AlertType), 0, PanelWidth, anim, isAutoStop: false, 0.5f); break; case BattleAlertType.NoSelectedEvolutionTarget: DialogueReposition(0f, 0.15f, GetAlertTypeToText(AlertType), 0, PanelWidth, anim, isAutoStop: false, 0.5f); break; case BattleAlertType.SelectedEmotionIcon: DialogueReposition(0f, 0f, text, 0, PanelWidth, anim: false, isAutoStop: false, 0.5f); break; case BattleAlertType.SelectTargetCard: DialogueReposition(0f, 0.52f, text, 0, PanelWidth, anim: false, isAutoStop: false, 0.5f); break; case BattleAlertType.SelectTargetCardOver: DialogueReposition(0f, 0.77f, text, 0, PanelWidth, anim: false, isAutoStop: false, 0.5f); break; case BattleAlertType.SelectChoiceCard: case BattleAlertType.SelectChoiceBraveCard: DialogueReposition(0f, 0.65f, text, 0, PanelWidth, anim: false, isAutoStop: false, 0.5f, 30); break; case BattleAlertType.GuardExisted: case BattleAlertType.CannotAttackNotHasGuard: case BattleAlertType.CannotAttackClass: case BattleAlertType.CannotAttackAmulet: case BattleAlertType.CannotAttackTarget: if (isClass) { DialogueReposition(-0.8f, 0.8f, GetAlertTypeToText(AlertType), 0, PanelWidth, anim); _battleMgr.AlertDialogueLabel.width = 400; } else { DialogueReposition(0.01f, 0.58f, GetAlertTypeToText(AlertType), 0, PanelWidth, anim); } break; case BattleAlertType.DisconnectInfomation: DialogueReposition(0f, 0f, GetAlertTypeToText(AlertType), 0, PanelWidth, anim, isAutoStop: false, 1f, 42, notHideAndCreate: true); break; case BattleAlertType.DisconnectInfomationMulligan: DialogueReposition(0f, 0f, GetAlertTypeToText(AlertType), 0, PanelWidth, anim, isAutoStop: false); break; } } public static string GetAlertTypeToText(BattleAlertType AlertType) { SystemText systemText = Data.SystemText; switch (AlertType) { case BattleAlertType.CannotPlay: return systemText.Get("Battle_0153"); case BattleAlertType.InPlayIsFull: return systemText.Get("Battle_0154"); case BattleAlertType.NotEnoughPp: return systemText.Get("Battle_0155"); case BattleAlertType.GuardExisted: return systemText.Get("Battle_0156"); case BattleAlertType.NoInPlayTarget: return systemText.Get("Battle_0157"); case BattleAlertType.NotPassCondition: return systemText.Get("Battle_0170"); case BattleAlertType.AlreadyAttackedThisTurn: return systemText.Get("Battle_0166"); case BattleAlertType.CannotAttackOnSameTurn: return systemText.Get("Battle_0167"); case BattleAlertType.CannotAttackGeneric: return systemText.Get("Battle_0168"); case BattleAlertType.CannotAttackNotHasGuard: case BattleAlertType.CannotAttackClass: return systemText.Get("Battle_0159"); case BattleAlertType.EvoButDrunk: return systemText.Get("Battle_0160"); case BattleAlertType.CannotAttackAmulet: return systemText.Get("Battle_0169"); case BattleAlertType.CannotAttackTarget: return systemText.Get("Battle_0162"); case BattleAlertType.EmoteLimit: return systemText.Get("Battle_0165"); case BattleAlertType.ElfInfomation: return systemText.Get("Battle_0452"); case BattleAlertType.RoyalInfomation: return systemText.Get("Battle_0453"); case BattleAlertType.WitchInfomation: return systemText.Get("Battle_0454"); case BattleAlertType.DragonInfomationNotAwake: return systemText.Get("Battle_0455"); case BattleAlertType.DragonInfomationAwake: return systemText.Get("Battle_0456"); case BattleAlertType.VampireInfomationNotRevenge: return systemText.Get("Battle_0457"); case BattleAlertType.VampireInfomationRevenge: return systemText.Get("Battle_0458"); case BattleAlertType.NecromanceInfomation: return systemText.Get("Battle_0459"); case BattleAlertType.BishopInfomation: return systemText.Get("Battle_0460"); case BattleAlertType.ContainRandomElement: return systemText.Get("Battle_0449"); case BattleAlertType.NoSelectedEvolutionTarget: return systemText.Get("Battle_0447"); case BattleAlertType.NoSelectedEmotionIcon: return systemText.Get("Battle_0448"); case BattleAlertType.DisconnectInfomation: case BattleAlertType.DisconnectInfomationMulligan: return systemText.Get("Battle_0492"); default: return "error not text"; } } private void DialogueReposition(float PanelX, float PanelY, string txt, int spacing, int PanelWidth, bool anim, bool isAutoStop = true, float size = 1f, int depth = 42, bool notHideAndCreate = false) { if (_currentText == txt) { return; } _currentText = txt; _notHideAndNotCreate = notHideAndCreate; NguiObjs component = _battleMgr.AlertDialogue.GetComponent(); UILabel uILabel = component.labels[0]; uILabel.text = txt; uILabel.spacingX = spacing; uILabel.width = PanelWidth; uILabel.fontSize = ((size == 1f) ? 32 : 42); component.gameObject.SetActive(value: true); component.transform.position = new Vector3(PanelX, PanelY, 0f); component.transform.localScale = new Vector3(size, size, 1f); UIPanel componentInChildren = component.transform.GetComponentInChildren(); if (componentInChildren != null) { componentInChildren.depth = depth; } if (anim) { component.transform.position = new Vector3(PanelX - 0.2f, PanelY, 0f); iTween.MoveTo(component.gameObject, iTween.Hash("x", PanelX, "y", PanelY, "time", 0.2f, "easetype", iTween.EaseType.easeOutExpo)); iTween component2 = component.sprites[0].GetComponent(); if (component2 != null) { UnityEngine.Object.DestroyImmediate(component2); } component.sprites[0].transform.localScale = new Vector3(1f, 2f, 1f); iTween.ScaleTo(component.sprites[0].gameObject, iTween.Hash("scale", Vector3.one, "time", 0.3f, "easetype", iTween.EaseType.easeOutBack)); } else { component.transform.position = new Vector3(PanelX, PanelY, 0f); component.sprites[0].transform.localScale = new Vector3(1f, 1f, 1f); } uILabel.MarkAsChanged(); if (isAutoStop) { AutoStopAlertDialogue(); } } public void AlertActionFalse() { if (!_notHideAndNotCreate) { iTween.Stop(_battleMgr.AlertDialogue, includechildren: true); _battleMgr.AlertDialogue.SetActive(value: false); _currentAlertType = BattleAlertType.None; _currentText = ""; } } public void OffNotHideAndNotCreate() { _notHideAndNotCreate = false; } public void Hide(BattleAlertType alertType) { if (_currentAlertType == alertType) { AlertActionFalse(); } } private void AutoStopAlertDialogue() { _autoStopSec = 0f; if (_autoStopCoroutine != null) { StopCoroutine(_autoStopCoroutine); _autoStopCoroutine = null; } _autoStopCoroutine = StartCoroutine(AutoStopAlertDialogueCoroutine()); } private IEnumerator AutoStopAlertDialogueCoroutine() { while (_battleMgr.AlertDialogue.activeSelf) { if (!BattleManagerBase.UseCustomMouse && GameMgr.GetIns().GetInputMgr().IsDown()) { AlertActionFalse(); break; } _autoStopSec += Time.deltaTime; if (_autoStopSec >= 3f) { AlertActionFalse(); break; } yield return null; } } public static BattleAlertType GetCannotAttackAlertType(BattleCardBase attackCard) { if (!attackCard.IsSelfTurn) { return BattleAlertType.None; } if (!attackCard.IsUnit) { return BattleAlertType.CannotAttackGeneric; } if (attackCard.AttackableCount <= 0) { return BattleAlertType.AlreadyAttackedThisTurn; } if (attackCard.IsSummonDrunkenness) { return BattleAlertType.CannotAttackOnSameTurn; } if (!attackCard.AreCanAttackConditionsFulfilled) { return BattleAlertType.None; } return BattleAlertType.CannotAttackGeneric; } public void ShowAlert(BattleAlertType AlertType, bool isClass, string text = null) { if ((!GameMgr.GetIns().IsWatchBattle || AlertType == BattleAlertType.SelectChoiceCard) && AlertType != BattleAlertType.None) { int panelWidth = 0; bool anim = true; switch (AlertType) { case BattleAlertType.EvoButDrunk: case BattleAlertType.CannotAttackClass: case BattleAlertType.DisconnectInfomation: case BattleAlertType.DisconnectInfomationMulligan: panelWidth = 800; break; case BattleAlertType.NotEnoughPp: case BattleAlertType.GuardExisted: case BattleAlertType.CannotAttackNotHasGuard: case BattleAlertType.CannotAttackAmulet: case BattleAlertType.CannotAttackTarget: case BattleAlertType.AlreadyAttackedThisTurn: case BattleAlertType.CannotAttackOnSameTurn: case BattleAlertType.CannotAttackGeneric: panelWidth = 600; break; case BattleAlertType.CannotPlay: case BattleAlertType.NoInPlayTarget: case BattleAlertType.NotPassCondition: case BattleAlertType.SelectedEmotionIcon: panelWidth = 800; break; case BattleAlertType.InPlayIsFull: panelWidth = 700; anim = false; break; case BattleAlertType.SelectTargetCard: case BattleAlertType.SelectTargetCardOver: case BattleAlertType.SelectChoiceCard: panelWidth = 900; anim = false; break; case BattleAlertType.SelectChoiceBraveCard: panelWidth = 960; anim = false; break; case BattleAlertType.EmoteLimit: case BattleAlertType.ContainRandomElement: case BattleAlertType.NoSelectedEvolutionTarget: case BattleAlertType.NoSelectedEmotionIcon: case BattleAlertType.ElfInfomation: case BattleAlertType.RoyalInfomation: case BattleAlertType.WitchInfomation: case BattleAlertType.DragonInfomationNotAwake: case BattleAlertType.DragonInfomationAwake: case BattleAlertType.VampireInfomationNotRevenge: case BattleAlertType.VampireInfomationRevenge: case BattleAlertType.NecromanceInfomation: case BattleAlertType.BishopInfomation: panelWidth = 1000; break; } InfoAlertDialogueAction(AlertType, panelWidth, anim, isClass, text); } } public bool ShowAlertTouchCard(ref BattleCardBase hitCard, ref BattleManagerBase battleMgr) { BattleAlertType battleAlertType = BattleAlertType.None; bool isClass = true; int pp = _battleMgr.BattlePlayer.Pp; Skill_pp_fixeduse mutationSkill = hitCard.GetAccelerateOrCrystallizeSkill(pp); bool flag = mutationSkill != null; if (hitCard.IsSpell || (flag && mutationSkill.OnWhenAccelerate != 0)) { bool flag2 = hitCard.SelfBattlePlayer.Class.SkillApplyInformation.HasCantPlaySpellFilter(); if (pp < hitCard.Cost && !flag) { battleAlertType = BattleAlertType.NotEnoughPp; isClass = false; } else if (hitCard.SelfBattlePlayer.Class.SkillApplyInformation.IsCantPlay(hitCard) || flag2) { battleAlertType = BattleAlertType.CannotPlay; isClass = false; } else { BattleCardBase battleCardBase = hitCard; Func isSelectCondition = (SkillVariableComareFilter f) => (f.Lhs.Contains(INPLAY_TEXT) || f.Lhs.Contains(HAND_OTHER_SELF_TEXT)) && f.Lhs.Contains(CONST_TEXT) && f.Compare == ">" && f.Rhs == "0"; Func isExceptCondition = (SkillVariableComareFilter f) => !f.Lhs.Contains(TURN_DAMAGE_CONST_TEXT) && !f.Lhs.Contains(TURN_HEAL_CONST_TEXT) && !f.Lhs.Contains(TURN_SKILL_RETURN_CARD_CONST_TEXT) && !f.Lhs.Contains(TURN_ENHANCE_CARD_COUNT_TEXT); if ((flag && mutationSkill._fixedUsePP == battleCardBase.CalcFixedUseCost(pp, skipCondition: true) && (mutationSkill.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter f) => (!isSelectCondition(f) || !isExceptCondition(f)) && !f.Filtering(mutationSkill.OptionValue)) || mutationSkill.ConditionFilterCollection.ConditionCheckerFilterList.Any((ISkillConditionChecker f) => f is SkillConditionWrath || f is SkillConditionEvolvableTurn))) || hitCard.Skills.Any((SkillBase s) => s is Skill_can_play_self)) { battleAlertType = BattleAlertType.NotPassCondition; isClass = false; } else if (!hitCard.Skills.CheckWhenPlaySelectTargetSkillCondition) { battleAlertType = BattleAlertType.NoInPlayTarget; isClass = false; } } } else if (flag && mutationSkill.OnWhenCrystallize != 0 && _battleMgr.BattlePlayer.ClassAndInPlayCardList.Count > 5) { battleAlertType = BattleAlertType.InPlayIsFull; } else if (flag && mutationSkill.OnWhenCrystallize != 0 && hitCard.SelfBattlePlayer.Class.SkillApplyInformation.IsCantPlay(hitCard)) { battleAlertType = BattleAlertType.CannotPlay; isClass = false; } else if (pp < hitCard.Cost) { battleAlertType = BattleAlertType.NotEnoughPp; isClass = false; } else if (_battleMgr.BattlePlayer.ClassAndInPlayCardList.Count > 5) { battleAlertType = BattleAlertType.InPlayIsFull; } else if (hitCard.SelfBattlePlayer.Class.SkillApplyInformation.IsCantPlay(hitCard)) { battleAlertType = BattleAlertType.CannotPlay; isClass = false; } ShowAlert(battleAlertType, isClass); return battleAlertType != BattleAlertType.None; } }