using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using Cute; using UnityEngine; using Wizard; public class UIBase_CardManager : MonoBehaviour { public enum LOAD_KIND { } public enum ScrollType { } private enum AddCardResult { } public class CardObjData { public GameObject CardObj; public string Cost; public int CostNum; public int mainCardNum; public int subCardNum; public int ids; public string lifes; public string Atks; public string Names; public string Skills; public string Evo_Costs; public string Evo_lifes; public string Evo_Atks; public string Evo_Names; public string Evo_Skills; public bool EvolOk; public CardBasePrm.ClanType clan; public List tribe; public CardBasePrm.CharaType cardType; public bool isPremiere; public bool off; public int TotalCardNum => mainCardNum + subCardNum; } public class CardPrefabs { } public class LoadCondition { public Dictionary CurrentIds; public int MaxCards; public int MaxSameCard; public LoadCondition(Dictionary currentids, int maxCards, int maxSameCard) { CurrentIds = currentids; MaxCards = maxCards; MaxSameCard = maxSameCard; } public LoadCondition() { CurrentIds = new Dictionary(); MaxCards = 99999999; MaxSameCard = 9999999; } } public class ComparableCard : IComparable { private CardParameter prm; public ComparableCard(int id, CardMaster.CardMasterId cardMasterId) { prm = CardMaster.GetInstance(cardMasterId).GetCardParameterFromId(id); } public int CompareTo(ComparableCard other) { return prm.SortIndex.CompareTo(other.prm.SortIndex); } } public class FilterParameter { public enum LookBit { ALL, NORMAL, PREMIUM } public enum FavoriteBit { ALL, NORMAL, FAVORITE } public enum SpotBit { ALL, NORMAL, SPOT } public int Cost; public int Class; public int Foil; public int Type; public int Rarity; public int Favorite; public int Spot; public int Own; public int Craftable; public int Attack; public int Life; public string Word; public Format FormatState = Format.Max; public MyRotationInfo MyRotationInfoForFormatAvailable; public List KeyWordList; public List TypeFilter; public List CardSetIdList; public List DisableCardSetidList = new List(); public List CardSetIdList2 = new List(); public bool IsEnabledPrizeCard; public bool IsEnabledPhantomCard; public string CharacterVoice; public bool IsEnableResurgentCard = true; public ClassSet FixedClassSet; public FilterParameter(FilterParameter param) { Cost = param.Cost; Class = param.Class; Foil = param.Foil; Type = param.Type; Rarity = param.Rarity; Favorite = param.Favorite; Spot = param.Spot; Own = param.Own; Craftable = param.Craftable; Attack = param.Attack; Life = param.Life; Word = param.Word; FormatState = param.FormatState; KeyWordList = param.KeyWordList; TypeFilter = param.TypeFilter; CardSetIdList = param.CardSetIdList; DisableCardSetidList = param.DisableCardSetidList; CardSetIdList2 = param.CardSetIdList2; IsEnabledPrizeCard = param.IsEnabledPrizeCard; IsEnabledPhantomCard = param.IsEnabledPhantomCard; CharacterVoice = param.CharacterVoice; IsEnableResurgentCard = param.IsEnableResurgentCard; FixedClassSet = param.FixedClassSet; } public FilterParameter() { CardSetIdList = new List(); } public bool IsLookState(LookBit bit) { if (bit == LookBit.ALL) { if (Foil != 0) { if (IsLookState(LookBit.NORMAL)) { return IsLookState(LookBit.PREMIUM); } return false; } return true; } return ((uint)Foil & (uint)bit) != 0; } public bool IsFavoriteState(FavoriteBit bit) { if (bit == FavoriteBit.ALL) { if (Favorite != 0) { if (IsFavoriteState(FavoriteBit.NORMAL)) { return IsFavoriteState(FavoriteBit.FAVORITE); } return false; } return true; } return ((uint)Favorite & (uint)bit) != 0; } public bool IsSpotState(SpotBit bit) { if (bit == SpotBit.ALL) { if (Spot != 0) { if (IsSpotState(SpotBit.NORMAL)) { return IsSpotState(SpotBit.SPOT); } return false; } return true; } return ((uint)Spot & (uint)bit) != 0; } public static bool operator ==(FilterParameter lhs, FilterParameter rhs) { FieldInfo[] fields = typeof(FilterParameter).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo obj in fields) { object value = obj.GetValue(lhs); object value2 = obj.GetValue(rhs); if ((value == null) ^ (value2 == null)) { return false; } if (value != null && !value.Equals(value2)) { return false; } } return true; } public static bool operator !=(FilterParameter lhs, FilterParameter rhs) { return !(lhs == rhs); } public override bool Equals(object obj) { return base.Equals(obj); } public override int GetHashCode() { return base.GetHashCode(); } } private static readonly Color32 PREMIERE_GRADIENT_TOP_COLOR = new Color32(byte.MaxValue, 243, 176, byte.MaxValue); private static readonly Color32 PREMIERE_GRADIENT_BOTTOM_COLOR = new Color32(186, 150, 0, byte.MaxValue); private static readonly Color32 EFFECT_COLOR = new Color32(92, 56, 3, byte.MaxValue); private bool CreateEndFlag; [SerializeField] private UIFont _NormalCardFont; [SerializeField] private UIFont _PremiereCardFont; private long SleeveId = 3000011L; private CardKeyWordCommonCache _keyWordCommonCache; private CardKeyWordCache _keyWordCache; private CardKeyWordCache _cardNameKeyWordCache; private CardKeyWordCache _cardNameKeyWordHiraganaCache; public _3dCardFrameManager _3dCardFrameManager { get; private set; } = new _3dCardFrameManager(); public List AddAssetPath(List List, bool is2D, CardMaster.CardMasterId cardMasterId, bool isAddSleeve = true, long sleeveId = 3000011L) { List list = new List(); for (int i = 0; i < List.Count; i++) { CardParameter cardParameterFromId = CardMaster.GetInstance(cardMasterId).GetCardParameterFromId(List[i]); int resourceCardId = CardMaster.GetInstance(cardMasterId).GetCardParameterFromId(cardParameterFromId.NormalCardId).ResourceCardId; if (cardParameterFromId.CharType == CardBasePrm.CharaType.NORMAL) { string assetTypePath = Toolbox.ResourcesManager.GetAssetTypePath(resourceCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial); if (!list.Contains(assetTypePath)) { list.Add(assetTypePath); } continue; } string assetTypePath2 = Toolbox.ResourcesManager.GetAssetTypePath(resourceCardId.ToString(), ResourcesManager.AssetLoadPathType.SpellCardMaterial); if (CardMaster.IsMutationCardCheck(cardParameterFromId.BaseCardId)) { assetTypePath2 = Toolbox.ResourcesManager.GetAssetTypePath(resourceCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial); } if (!list.Contains(assetTypePath2)) { list.Add(assetTypePath2); } } if (isAddSleeve) { SleeveId = Toolbox.ResourcesManager.GetExistingSleeveId(sleeveId); string assetTypePath3 = Toolbox.ResourcesManager.GetAssetTypePath(SleeveId.ToString(), ResourcesManager.AssetLoadPathType.SleeveMaterial); if (!list.Contains(assetTypePath3)) { list.Add(assetTypePath3); list.Add(Toolbox.ResourcesManager.GetAssetTypePath(SleeveId.ToString(), ResourcesManager.AssetLoadPathType.SleeveTexture)); if (Data.Master.SleeveMgr.Get(SleeveId).IsPremiumSleeve) { list.Add(Toolbox.ResourcesManager.GetAssetTypePath(SleeveId.ToString(), ResourcesManager.AssetLoadPathType.SleeveTextureMask)); } } } return list; } public IList SelectCardIDInConditionMask(List idList, FilterParameter filterParam, IFormatBehavior formatBehaviour, MyRotationInfo myRotationInfo, bool alreadySorted = false, bool isCraftMode = false, bool isDisableAllTribe = false) { CardMaster cardMaster = CardMaster.GetInstance(formatBehaviour.CardMasterId); if (_keyWordCache == null) { _keyWordCache = new CardKeyWordCache(); } if (_cardNameKeyWordCache == null) { _cardNameKeyWordCache = new CardKeyWordCache(CardKeyWordCache.Option.OnlyCardNames); } if (_cardNameKeyWordHiraganaCache == null) { _cardNameKeyWordHiraganaCache = new CardKeyWordCache(CardKeyWordCache.Option.OnlyCardNamesHiranaga); } Func filters = null; if (formatBehaviour.IsConventionMode) { filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => formatBehaviour.GetPossessionCardNum(card.CardId, isIncludingSpotCard: true) > 0)); } else { if (filterParam.Own != 0) { filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { int possessionCardNum = formatBehaviour.GetPossessionCardNum(card.CardId, isIncludingSpotCard: true); return (param.Own & ((possessionCardNum > 0) ? 1 : 2)) != 0; }); } if (filterParam.Craftable != 0) { filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { int possessionCardNum = formatBehaviour.GetPossessionCardNum(card.CardId, isIncludingSpotCard: true); int num = ((card.UseRedEther > 0) ? 1 : 2); return possessionCardNum > 0 || (param.Craftable & num) != 0; }); } } if (filterParam.Class != 0) { filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => (param.Class & (1 << (int)card.Clan)) != 0)); } if (filterParam.Cost != 0) { filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => (param.Cost & (1 << Mathf.Min(card.Cost, 8))) != 0)); } filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.Attack != 0 && !CardBasePrm.IsFollowerCard(card.CharType)) { return false; } return param.Attack == 0 || (param.Attack & (1 << Mathf.Min(card.Atk, 8))) != 0; }); filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.Life != 0 && !CardBasePrm.IsFollowerCard(card.CharType)) { return false; } return param.Life == 0 || (param.Life & (1 << Mathf.Min(card.Life, 8))) != 0; }); if (filterParam.Foil != 0) { filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => (param.Foil & ((!card.IsFoil) ? 1 : 2)) != 0)); } filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.Type == 0) { return true; } int num = 0; switch (card.CharType) { case CardBasePrm.CharaType.NORMAL: case CardBasePrm.CharaType.EVOLUTION: num = 1; break; case CardBasePrm.CharaType.SPELL: num = 2; break; case CardBasePrm.CharaType.FIELD: case CardBasePrm.CharaType.CHANT_FIELD: num = 4; break; default: return false; } return (param.Type & num) != 0; }); if (filterParam.Rarity != 0) { filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => (param.Rarity & (1 << card.Rarity - 1)) != 0)); } if (filterParam.DisableCardSetidList.Count > 0) { filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => !param.DisableCardSetidList.Contains(card.CardSetId))); } if (filterParam.CardSetIdList2.Count > 0) { filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.FormatState == Format.MyRotation) { if (card.IsPrizeCard) { card = cardMaster.GetCardParameterFromId(card.BaseCardId); } if (myRotationInfo.IsNotUseCard(card.BaseCardId)) { return false; } if (myRotationInfo.IsRePrintCard(card.BaseCardId)) { foreach (string item in param.CardSetIdList2) { if (myRotationInfo.IsRePrintCardAvailablePack(card.BaseCardId, item)) { return true; } } } } return param.CardSetIdList2.Contains(card.CardSetId) ? true : false; }); } filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.CardSetIdList.Count == 0 && !param.IsEnabledPrizeCard && !param.IsEnabledPhantomCard) { return true; } string cardSetId = card.CardSetId; if (card.IsCollaboCard) { cardSetId = CardMaster.GetInstance(formatBehaviour.CardMasterId).GetCardParameterFromId(card.BaseCardId).CardSetId; } if (param.CardSetIdList.Contains(cardSetId)) { return true; } if (param.IsEnabledPrizeCard && card.IsPrizeCard) { return true; } return (param.IsEnabledPhantomCard && card.IsPhantomCard) ? true : false; }); if (!filterParam.IsEnableResurgentCard) { filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => !card.IsResurgentCard)); } filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.IsFavoriteState(FilterParameter.FavoriteBit.ALL)) { return true; } bool flag = false; // headless: no user favorites return (param.IsFavoriteState(FilterParameter.FavoriteBit.NORMAL) && !flag) || (param.IsFavoriteState(FilterParameter.FavoriteBit.FAVORITE) && flag); }); filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.IsSpotState(FilterParameter.SpotBit.ALL) || (param.IsSpotState(FilterParameter.SpotBit.NORMAL) && param.IsSpotState(FilterParameter.SpotBit.SPOT))) { return true; } bool flag = false; // headless: no user spot cards if (isCraftMode) { if (param.IsSpotState(FilterParameter.SpotBit.SPOT)) { return flag; } return true; } return param.IsSpotState(FilterParameter.SpotBit.SPOT) ? flag : false; // headless: no user card counts }); if (filterParam.MyRotationInfoForFormatAvailable != null) { filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (card.IsPrizeCard) { card = cardMaster.GetCardParameterFromId(card.BaseCardId); } ClassType classType = ClassUtil.GetClassType(card, param.FormatState, param.FixedClassSet); return card.IsAvailableFormat(param.FormatState, classType, myRotationInfo); }); } filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.FormatState == Format.Unlimited || param.FormatState == Format.Rotation || param.FormatState == Format.PreRotation || param.FormatState == Format.Sealed || param.FormatState == Format.Crossover) { ClassType classType = ClassUtil.GetClassType(card, param.FormatState, param.FixedClassSet); return card.IsAvailableFormat(param.FormatState, classType, myRotationInfo); } return true; }); if (filterParam.KeyWordList != null && filterParam.KeyWordList.Count > 0) { List filterKeywordList = filterParam.KeyWordList; foreach (KeyValuePair item2 in Data.Master.CardFilterKeywordReplaceDic) { if (filterKeywordList.Contains(item2.Value)) { List list = new List(filterKeywordList.Count + 1); list.AddRange(filterKeywordList); list.Add(item2.Key); filterKeywordList = list; } } filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { IList list2 = _keyWordCache.Get(card, _keyWordCommonCache); foreach (string item3 in filterKeywordList) { if (list2.Contains(item3)) { return true; } } return false; }); } if (filterParam.TypeFilter != null && filterParam.TypeFilter.Count > 0) { filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (isDisableAllTribe && card.IsTribeAll) { return false; } foreach (CardBasePrm.TribeType item4 in param.TypeFilter) { if (card.Tribe.Contains(item4)) { return true; } } return false; }); } filters = (Func)Delegate.Combine(filters, (Func)delegate(CardParameter card, FilterParameter param) { if (param.Word == null || param.Word.Length == 0) { return true; } List list2 = new List { CardBasePrm.GetCardTypeName(card.CharType) }; if (!card.Tribe.Contains(CardBasePrm.TribeType.ALL)) { if (card.IsTribeAll) { list2.AddRange(Data.Master.GetAllTribeNameList()); } else { list2.Add(card.TribeName); } } list2.Add(Regex.Replace(card.ConvertedSkillDescription, "(\\[[a-zA-Z0-9\\/\\-]*(rub\\<[^\\>]*\\>)*\\])", "")); list2.Add(Regex.Replace(card.ConvertedEvoSkillDescription, "(\\[[a-zA-Z0-9\\/\\-]*(rub\\<[^\\>]*\\>)*\\])", "")); list2.Add(Regex.Replace(card.CardName, "(\\[[a-zA-Z0-9\\/\\-]*(rub\\<[^\\>]*\\>)*\\])", "")); string[] array = param.Word.Replace('\u3000', ' ').Split(' '); if (list2.Any((string src) => array.All((string req) => src.IndexOf(req, StringComparison.OrdinalIgnoreCase) >= 0))) { return true; } list2.Clear(); CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo; return list2.Any((string src) => array.All((string req) => ci.IndexOf(src, req, CompareOptions.IgnoreKanaType) >= 0)); }); filters = (Func)Delegate.Combine(filters, (Func)((CardParameter card, FilterParameter param) => string.IsNullOrEmpty(param.CharacterVoice) || card.CardVoice.IndexOf(param.CharacterVoice, StringComparison.OrdinalIgnoreCase) >= 0)); Func callAllFilters = (CardParameter card, FilterParameter param) => filters.GetInvocationList().All((Delegate func) => ((Func)func)(card, param)); if (alreadySorted) { return (from id in idList let card = cardMaster.GetCardParameterFromId(id) where callAllFilters(card, filterParam) select id).ToList(); } return (from id in idList let card = CardMaster.GetInstance(formatBehaviour.CardMasterId).GetCardParameterFromId(id) where callAllFilters(card, filterParam) orderby new ComparableCard(card.CardId, formatBehaviour.CardMasterId) select id).ToList(); } public List SortIDList(IList idList, CardMaster.CardMasterId cardMasterId) { return (from id in idList let card = CardMaster.GetInstance(cardMasterId).GetCardParameterFromId(id) orderby new ComparableCard(card.CardId, cardMasterId) select id).ToList(); } public static CardObjData cardDataCopy(CardObjData data, CardObjData data2) { data.Cost = data2.Cost; data.CostNum = data2.CostNum; data.lifes = data2.lifes; data.ids = data2.ids; data.Atks = data2.Atks; data.Names = data2.Names; data.Skills = data2.Skills; data.Evo_Costs = data2.Evo_Costs; data.Evo_lifes = data2.Evo_lifes; data.Evo_Atks = data2.Evo_Atks; data.Evo_Names = data2.Evo_Names; data.Evo_Skills = data2.Evo_Skills; data.EvolOk = data2.EvolOk; data.cardType = data2.cardType; data.isPremiere = data2.isPremiere; return data; } public static Material Get2dCardMaterial(CardParameter param) { ResourcesManager.AssetLoadPathType type; switch (param.CharType) { case CardBasePrm.CharaType.NORMAL: type = ResourcesManager.AssetLoadPathType.UnitCardMaterial; break; case CardBasePrm.CharaType.FIELD: case CardBasePrm.CharaType.CHANT_FIELD: case CardBasePrm.CharaType.SPELL: type = (CardMaster.IsMutationCardCheck(param.BaseCardId) ? ResourcesManager.AssetLoadPathType.UnitCardMaterial : ResourcesManager.AssetLoadPathType.SpellCardMaterial); break; default: type = ResourcesManager.AssetLoadPathType.UnitCardMaterial; break; } return Toolbox.ResourcesManager.FindCardMaterial(param.ResourceCardId, type); } public void SetNumberLabelStyle(UILabel inLabel, bool inIsPremiere) { UIFont bitmapFont; Material material; if (inIsPremiere) { bitmapFont = _PremiereCardFont; material = _PremiereCardFont.material; } else { bitmapFont = _NormalCardFont; material = _NormalCardFont.material; } inLabel.bitmapFont = bitmapFont; inLabel.applyGradient = false; if (inLabel.material.name != material.name) { inLabel.material = material; } } public void SetNameLabelStyle(UILabel inLabel, bool inIsPremiere) { if (inIsPremiere) { inLabel.applyGradient = true; inLabel.gradientTop = PREMIERE_GRADIENT_TOP_COLOR; inLabel.gradientBottom = PREMIERE_GRADIENT_BOTTOM_COLOR; inLabel.effectStyle = UILabel.Effect.Outline8; inLabel.effectDistance = new Vector2(2f, 2f); inLabel.effectColor = EFFECT_COLOR; } else { inLabel.applyGradient = false; inLabel.effectStyle = UILabel.Effect.None; } } public void SetSleeveTexture(UITexture inTargetTexture, long inSleeveId) { SetSleeveTextureSub(inTargetTexture, inSleeveId, enablePremiumSleeve: true); } public void SetSleeveTextureWithoutPremium(UITexture inTargetTexture, long inSleeveId) { SetSleeveTextureSub(inTargetTexture, inSleeveId, enablePremiumSleeve: false); } private void SetSleeveTextureSub(UITexture inTargetTexture, long inSleeveId, bool enablePremiumSleeve) { inSleeveId = Toolbox.ResourcesManager.GetExistingSleeveId(inSleeveId); Sleeve sleeve = Data.Master.SleeveMgr.Get(inSleeveId); Texture texture = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(inSleeveId.ToString(), ResourcesManager.AssetLoadPathType.SleeveTexture, isfetch: true)) as Texture; if (sleeve.IsPremiumSleeve && enablePremiumSleeve) { inTargetTexture.mainTexture = null; inTargetTexture.material = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(inSleeveId.ToString(), ResourcesManager.AssetLoadPathType.SleeveMaterial, isfetch: true)); inTargetTexture.material.SetTexture("_MainTex", texture); Texture value = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(inSleeveId.ToString(), ResourcesManager.AssetLoadPathType.SleeveTextureMask, isfetch: true)); inTargetTexture.material.SetTexture("_MaskTex", value); } else { inTargetTexture.mainTexture = texture; inTargetTexture.material = null; } } public void AddPremireSleevePath(ref List loadPath, Sleeve sleeveData) { loadPath.Add(Toolbox.ResourcesManager.GetAssetTypePath(sleeveData.sleeve_id.ToString(), ResourcesManager.AssetLoadPathType.SleeveTextureMask)); loadPath.Add(Toolbox.ResourcesManager.GetAssetTypePath(sleeveData.sleeve_id.ToString(), ResourcesManager.AssetLoadPathType.SleeveMaterial)); } public void AddKeyWordCache(List cardPool, CardMaster.CardMasterId cardMasterId) { if (_keyWordCache == null) { _keyWordCache = new CardKeyWordCache(); } if (_cardNameKeyWordCache == null) { _cardNameKeyWordCache = new CardKeyWordCache(CardKeyWordCache.Option.OnlyCardNames); } if (_cardNameKeyWordHiraganaCache == null) { _cardNameKeyWordHiraganaCache = new CardKeyWordCache(CardKeyWordCache.Option.OnlyCardNamesHiranaga); } if (_keyWordCommonCache == null) { _keyWordCommonCache = new CardKeyWordCommonCache(); } CardMaster instance = CardMaster.GetInstance(cardMasterId); foreach (int item in cardPool) { _keyWordCommonCache.CacheKeyWord(instance.GetCardParameterFromId(item)); } } public IList GetKeyword(CardParameter param) { if (_keyWordCommonCache != null) { return _keyWordCommonCache.GetCloneList(param); } return BattleKeywordInfoListMgr.GetKeywords(param); } }