feat(battle-engine): M1 auto-copy closure (782 battle-logic files)
Compile-driven bulk-copy loop (tools/engine-port/m1_copy_loop.py) pulled the precise reference closure of the battle-core roots, stopping at the classify god-object/View-VFX-UI boundary. 782 files; no re-explosion (M0 had estimated ~order 1000). Residual frontier = 52 shim-classified + 80 external (Unity/BCL) types to author next.
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cute;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Wizard.DeckCardEdit;
|
||||
|
||||
public class CachingCardBundle : CardBundle
|
||||
{
|
||||
public const int CACHE_NUM_MAX = 32;
|
||||
|
||||
private List<UIBase_CardManager.CardObjData> _cachedList;
|
||||
|
||||
public CachingCardBundle(CardCreator cardCreator, Transform parent, UITexture sleeveOriginal, float scale, IFormatBehavior formatBehavior, bool isDisplaySpotCardNum)
|
||||
: base(cardCreator, parent, sleeveOriginal, scale, formatBehavior, isDisplaySpotCardNum)
|
||||
{
|
||||
_cachedList = new List<UIBase_CardManager.CardObjData>(32);
|
||||
}
|
||||
|
||||
private UIBase_CardManager.CardObjData GetCachedCardFromId(int id)
|
||||
{
|
||||
return _cachedList.Find((UIBase_CardManager.CardObjData card) => card.ids == id);
|
||||
}
|
||||
|
||||
private void AddCache(UIBase_CardManager.CardObjData item)
|
||||
{
|
||||
_cachedList.Remove(item);
|
||||
_cachedList.Insert(0, item);
|
||||
}
|
||||
|
||||
private void RemoveCache(UIBase_CardManager.CardObjData item)
|
||||
{
|
||||
CardParameter cardParameterFromId = CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(item.ids);
|
||||
Toolbox.ResourcesManager.RemoveAsset(Toolbox.ResourcesManager.GetAssetTypePath(cardParameterFromId.ResourceCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial));
|
||||
if (cardParameterFromId.IsFoil)
|
||||
{
|
||||
int resourceCardId = CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(cardParameterFromId.NormalCardId).ResourceCardId;
|
||||
Toolbox.ResourcesManager.RemoveAsset(Toolbox.ResourcesManager.GetAssetTypePath(resourceCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial));
|
||||
}
|
||||
UnityEngine.Object.Destroy(item.CardObj);
|
||||
_cachedList.Remove(item);
|
||||
}
|
||||
|
||||
public override bool CreateCards(List<int> idList, bool isDestroyImmediate, bool isRotate, Action onCreateSleeves = null, Action onFinish = null, Action onFirstAnimationFinish = null, float cardRotateDelayTimeMax = float.MaxValue, bool isSkipSameDeckCheck = false)
|
||||
{
|
||||
int count = idList.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
UIBase_CardManager.CardObjData cachedCardFromId = GetCachedCardFromId(idList[i]);
|
||||
if (cachedCardFromId != null)
|
||||
{
|
||||
AddCache(cachedCardFromId);
|
||||
}
|
||||
}
|
||||
return base.CreateCards(idList, isDestroyImmediate, isRotate, onCreateSleeves, onFinish, onFirstAnimationFinish, cardRotateDelayTimeMax, isSkipSameDeckCheck);
|
||||
}
|
||||
|
||||
protected override CardObject CreateSleeve(int id, int mainNum, int subNum, bool isNonPossessionCard = false)
|
||||
{
|
||||
UIBase_CardManager.CardObjData cachedCardFromId = GetCachedCardFromId(id);
|
||||
if (cachedCardFromId != null)
|
||||
{
|
||||
CardObject cardObject = new CardObject(cachedCardFromId, _parent, _cardScale, base.FormatBehavior, _isDisplaySpotCardNum, _isHideZeroSpotCardNum);
|
||||
cardObject.CardObj.SetActive(value: true);
|
||||
cardObject.CardId = id;
|
||||
cardObject.MainCardNum = mainNum;
|
||||
cardObject.SubCardNum = subNum;
|
||||
OnCreateSleeveCall(cardObject);
|
||||
OnCreateCardCall(cardObject);
|
||||
return cardObject;
|
||||
}
|
||||
return base.CreateSleeve(id, mainNum, subNum);
|
||||
}
|
||||
|
||||
public override void Load(List<int> order, bool isPreferentially, Action<List<UIBase_CardManager.CardObjData>> onFinish)
|
||||
{
|
||||
int orderLen = order.Count;
|
||||
Func<List<int>> order2 = () => order.Where((int id) => GetCachedCardFromId(id) == null).ToList();
|
||||
_cardCreator.Request(order2, isPreferentially, delegate(List<UIBase_CardManager.CardObjData> returnList)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < orderLen; i++)
|
||||
{
|
||||
UIBase_CardManager.CardObjData cardObjData = returnList.Find((UIBase_CardManager.CardObjData entry) => entry.ids == order[i]);
|
||||
UIBase_CardManager.CardObjData cachedCardFromId = GetCachedCardFromId(order[i]);
|
||||
if (cachedCardFromId != null)
|
||||
{
|
||||
if (cardObjData != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(cardObjData.CardObj);
|
||||
returnList.Remove(cardObjData);
|
||||
}
|
||||
cachedCardFromId.CardObj.SetActive(value: true);
|
||||
cachedCardFromId.CardObj.GetComponent<UIWidget>().alpha = 1f;
|
||||
returnList.Insert(i, cachedCardFromId);
|
||||
}
|
||||
AddCache(returnList[i]);
|
||||
}
|
||||
DestroyOverStock();
|
||||
onFinish.Call(returnList);
|
||||
}, base.FormatBehavior.CardMasterId);
|
||||
}
|
||||
|
||||
private void DestroyOverStock()
|
||||
{
|
||||
int num = _cachedList.Count();
|
||||
if (num <= 32)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int num2 = num - 32;
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
if (_cachedList.Count() <= 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (num2 <= 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
RemoveCache(_cachedList[_cachedList.Count() - 1]);
|
||||
num2--;
|
||||
}
|
||||
}
|
||||
|
||||
public override void DestroyAll()
|
||||
{
|
||||
_cardList.ForEach(delegate(CardObject card)
|
||||
{
|
||||
card.Destroy(isRemoveAsset: false);
|
||||
});
|
||||
_cardList.Clear();
|
||||
while (_cachedList.Count > 0)
|
||||
{
|
||||
RemoveCache(_cachedList[0]);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void DestroyEach(CardObject card)
|
||||
{
|
||||
card.DestroySleeve();
|
||||
card.DestroyUseInfo();
|
||||
card.DestroyCursorEffect();
|
||||
card.DestroyTween();
|
||||
card.ActiveCullObjs(isActive: true);
|
||||
card.CardObj.SetActive(value: false);
|
||||
}
|
||||
}
|
||||
620
SVSim.BattleEngine/Engine/Wizard.DeckCardEdit/CardBundle.cs
Normal file
620
SVSim.BattleEngine/Engine/Wizard.DeckCardEdit/CardBundle.cs
Normal file
@@ -0,0 +1,620 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cute;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Wizard.DeckCardEdit;
|
||||
|
||||
public class CardBundle
|
||||
{
|
||||
private const float ROTATE_INTERVAL = 0.05f;
|
||||
|
||||
protected const float ALPHA_DURATION = 0.3f;
|
||||
|
||||
protected CardCreator _cardCreator;
|
||||
|
||||
protected Transform _parent;
|
||||
|
||||
protected UITexture _sleeveOriginal;
|
||||
|
||||
private List<int> _lastIdList;
|
||||
|
||||
protected List<CardObject> _cardList;
|
||||
|
||||
protected float _cardScale = 0.6f;
|
||||
|
||||
protected bool _isDisplaySpotCardNum;
|
||||
|
||||
protected bool _isHideZeroSpotCardNum;
|
||||
|
||||
protected bool _canUseNonPossessionCard;
|
||||
|
||||
public List<CardObject> CardList => _cardList;
|
||||
|
||||
public List<int> IdList
|
||||
{
|
||||
get
|
||||
{
|
||||
List<int> ret = new List<int>(CountSum);
|
||||
_cardList.ForEach(delegate(CardObject entry)
|
||||
{
|
||||
for (int i = 0; i < entry.TotalCardNum; i++)
|
||||
{
|
||||
ret.Add(entry.CardId);
|
||||
}
|
||||
});
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<int, int> DictCardIdNum
|
||||
{
|
||||
get
|
||||
{
|
||||
Dictionary<int, int> dictionary = new Dictionary<int, int>(_cardList.Count);
|
||||
foreach (CardObject card in _cardList)
|
||||
{
|
||||
dictionary.Add(card.CardId, card.TotalCardNum);
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
}
|
||||
|
||||
public List<GameObject> ObjectList => _cardList.ConvertAll((CardObject card) => card.CardObj);
|
||||
|
||||
public int CountSum => _cardList.Sum((CardObject card) => card.TotalCardNum);
|
||||
|
||||
public virtual int CountKind => _cardList.Count;
|
||||
|
||||
protected IFormatBehavior FormatBehavior { get; private set; }
|
||||
|
||||
public virtual event Action<CardObject> OnCreateCard;
|
||||
|
||||
public virtual event Action<CardObject> OnCreateSleeve;
|
||||
|
||||
protected void OnCreateCardCall(CardObject card)
|
||||
{
|
||||
this.OnCreateCard.Call(card);
|
||||
}
|
||||
|
||||
protected void OnCreateSleeveCall(CardObject sleeve)
|
||||
{
|
||||
this.OnCreateSleeve.Call(sleeve);
|
||||
}
|
||||
|
||||
public void CountEachType(out int charNum, out int spellNum, out int fieldNum)
|
||||
{
|
||||
CardMaster master = CardMaster.GetInstance(FormatBehavior.CardMasterId);
|
||||
int tempCharNum = 0;
|
||||
int tempSpellNum = 0;
|
||||
int tempFieldNum = 0;
|
||||
_cardList.ForEach(delegate(CardObject entry)
|
||||
{
|
||||
switch (master.GetCardParameterFromId(entry.CardId).CharType)
|
||||
{
|
||||
case CardBasePrm.CharaType.NORMAL:
|
||||
tempCharNum += entry.TotalCardNum;
|
||||
break;
|
||||
case CardBasePrm.CharaType.SPELL:
|
||||
tempSpellNum += entry.TotalCardNum;
|
||||
break;
|
||||
case CardBasePrm.CharaType.FIELD:
|
||||
case CardBasePrm.CharaType.CHANT_FIELD:
|
||||
tempFieldNum += entry.TotalCardNum;
|
||||
break;
|
||||
}
|
||||
});
|
||||
charNum = tempCharNum;
|
||||
spellNum = tempSpellNum;
|
||||
fieldNum = tempFieldNum;
|
||||
}
|
||||
|
||||
public void UpdateCardCreator()
|
||||
{
|
||||
if (_cardCreator != null)
|
||||
{
|
||||
_cardCreator.Tick();
|
||||
}
|
||||
}
|
||||
|
||||
public CardBundle(CardCreator cardCreator, Transform parent, UITexture sleeveOriginal, float scale, IFormatBehavior formatBehavior, bool isDisplaySpotCardNum = false, bool isHideZeroSpotCardNum = false, bool canUseNonPossessionCard = false)
|
||||
{
|
||||
FormatBehavior = formatBehavior;
|
||||
_cardScale = scale;
|
||||
_parent = parent;
|
||||
_sleeveOriginal = sleeveOriginal;
|
||||
_cardList = new List<CardObject>();
|
||||
_cardCreator = cardCreator;
|
||||
_isDisplaySpotCardNum = isDisplaySpotCardNum;
|
||||
_isHideZeroSpotCardNum = isHideZeroSpotCardNum;
|
||||
_canUseNonPossessionCard = canUseNonPossessionCard;
|
||||
}
|
||||
|
||||
public CardObject FindWithCardId(int id)
|
||||
{
|
||||
return _cardList.Find((CardObject find) => find.CardId == id);
|
||||
}
|
||||
|
||||
public virtual CardObject FindWithIndex(int idx)
|
||||
{
|
||||
if (idx < 0 || idx >= _cardList.Count)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return _cardList[idx];
|
||||
}
|
||||
|
||||
public CardObject FindWithObject(GameObject obj)
|
||||
{
|
||||
return _cardList.Find((CardObject find) => find.CardObj == obj);
|
||||
}
|
||||
|
||||
public virtual int IndexOf(CardObject card)
|
||||
{
|
||||
return _cardList.IndexOf(card);
|
||||
}
|
||||
|
||||
public virtual bool CreateCards(List<int> idList, bool isDestroyImmediate, bool isRotate, Action onCreateSleeves = null, Action onFinish = null, Action onFirstAnimationFinish = null, float cardRotateDelayTimeMax = float.MaxValue, bool isSkipSameDeckCheck = false)
|
||||
{
|
||||
if (idList == null || (!isSkipSameDeckCheck && IsSameIdList(idList, _lastIdList)))
|
||||
{
|
||||
onCreateSleeves.Call();
|
||||
onFinish.Call();
|
||||
onFirstAnimationFinish.Call();
|
||||
return false;
|
||||
}
|
||||
bool flag = false;
|
||||
List<int> orderCardIdList = idList.Distinct().ToList();
|
||||
List<CardObject> destroyList = new List<CardObject>();
|
||||
if (_canUseNonPossessionCard)
|
||||
{
|
||||
flag |= CollectOrderCardId(idList, ref orderCardIdList, ref destroyList);
|
||||
if (!flag)
|
||||
{
|
||||
onCreateSleeves.Call();
|
||||
onFinish.Call();
|
||||
onFirstAnimationFinish.Call();
|
||||
return false;
|
||||
}
|
||||
_lastIdList = idList;
|
||||
List<int> loadCardIdList = new List<int>(orderCardIdList.Count);
|
||||
_cardList = CreateOrderCardList(idList, orderCardIdList, ref loadCardIdList);
|
||||
orderCardIdList = loadCardIdList;
|
||||
if (!isDestroyImmediate)
|
||||
{
|
||||
_cardList.AddRange(destroyList);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CardObject[] array = new CardObject[orderCardIdList.Count()];
|
||||
int count = _cardList.Count;
|
||||
flag = count != orderCardIdList.Count;
|
||||
int i;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
int num = orderCardIdList.FindIndex((int card) => card == _cardList[i].CardId);
|
||||
if (num >= 0)
|
||||
{
|
||||
array[num] = _cardList[i];
|
||||
flag = flag || num != i;
|
||||
}
|
||||
else
|
||||
{
|
||||
destroyList.Add(_cardList[i]);
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
if (!flag)
|
||||
{
|
||||
onCreateSleeves.Call();
|
||||
onFinish.Call();
|
||||
onFirstAnimationFinish.Call();
|
||||
return false;
|
||||
}
|
||||
_lastIdList = idList;
|
||||
_cardList = new List<CardObject>(array);
|
||||
count = _cardList.Count;
|
||||
flag = false;
|
||||
int[] array2 = orderCardIdList.ToArray();
|
||||
for (int num2 = 0; num2 < array2.Length; num2++)
|
||||
{
|
||||
if (num2 < count && _cardList[num2] != null)
|
||||
{
|
||||
orderCardIdList.Remove(array2[num2]);
|
||||
continue;
|
||||
}
|
||||
CountUseCardNum(idList, array2[num2], out var usePossessionCardNum, out var useSpotCardNum, out var _);
|
||||
_cardList[num2] = CreateSleeve(array2[num2], usePossessionCardNum, useSpotCardNum);
|
||||
flag = true;
|
||||
}
|
||||
if (!isDestroyImmediate)
|
||||
{
|
||||
_cardList.AddRange(destroyList);
|
||||
}
|
||||
_cardList = _cardList.Distinct().ToList();
|
||||
}
|
||||
List<TweenAlpha> tweenList = new List<TweenAlpha>();
|
||||
for (int num3 = 0; num3 < destroyList.Count; num3++)
|
||||
{
|
||||
CardObject cardObject = destroyList[num3];
|
||||
UITexture cardTexture = cardObject.CardObj.GetComponent<CardListTemplate>()._cardTexture;
|
||||
if ((bool)cardTexture && (bool)cardTexture.material && (bool)cardTexture.material.mainTexture)
|
||||
{
|
||||
Texture mainTexture = cardTexture.material.mainTexture;
|
||||
if (!cardObject.IsNonPossessionCard)
|
||||
{
|
||||
cardTexture.material = null;
|
||||
cardTexture.mainTexture = mainTexture;
|
||||
}
|
||||
cardTexture.depth--;
|
||||
tweenList.Add(TweenAlpha.Begin(cardObject.CardObj, 0.3f, 0f));
|
||||
}
|
||||
}
|
||||
onCreateSleeves.Call();
|
||||
Load(orderCardIdList, isPreferentially: true, delegate(List<UIBase_CardManager.CardObjData> cardObjDataList)
|
||||
{
|
||||
tweenList.ForEach(delegate(TweenAlpha tween)
|
||||
{
|
||||
UnityEngine.Object.Destroy(tween);
|
||||
});
|
||||
if (_lastIdList == idList)
|
||||
{
|
||||
_cardList.RemoveAll((CardObject card) => destroyList.Contains(card));
|
||||
destroyList.ForEach(DestroyEach);
|
||||
Func<int, CardObject> func = null;
|
||||
func = ((!_canUseNonPossessionCard) ? ((Func<int, CardObject>)((int cardId) => _cardList.Find((CardObject c) => c.CardId == cardId))) : ((Func<int, CardObject>)((int cardId) => _cardList.Find((CardObject c) => c.CardId == cardId && !c.IsAttachedCardObjData))));
|
||||
float num4 = 0f;
|
||||
int count2 = cardObjDataList.Count;
|
||||
for (int num5 = 0; num5 < count2; num5++)
|
||||
{
|
||||
cardObjDataList[num5].ids = orderCardIdList[num5];
|
||||
CardObject cardObject2 = func(orderCardIdList[num5]);
|
||||
if (cardObject2 != null)
|
||||
{
|
||||
if (cardObject2.IsVisibleSleeve)
|
||||
{
|
||||
int mainCardNum = cardObject2.MainCardNum;
|
||||
int subCardNum = cardObject2.SubCardNum;
|
||||
bool activeInHierarchy = cardObject2.CardObj.activeInHierarchy;
|
||||
cardObject2.CompleteSleeveTweenAlpha();
|
||||
cardObject2.AttachCardObjData(cardObjDataList[num5]);
|
||||
cardObject2.MainCardNum = mainCardNum;
|
||||
cardObject2.SubCardNum = subCardNum;
|
||||
if (isRotate && activeInHierarchy)
|
||||
{
|
||||
MonoBehaviour component = cardObjDataList[num5].CardObj.GetComponent<MonoBehaviour>();
|
||||
cardObject2.ActiveCullObjs(isActive: false);
|
||||
component.StartCoroutine(RotateAndTakeoffSleeve(cardObject2, num4));
|
||||
num4 = Mathf.Min(num4 + 0.05f, cardRotateDelayTimeMax);
|
||||
}
|
||||
else
|
||||
{
|
||||
cardObject2.TakeOffSleeve();
|
||||
cardObject2.CardObj.SetActive(activeInHierarchy);
|
||||
this.OnCreateCard.Call(cardObject2);
|
||||
}
|
||||
}
|
||||
if (cardObject2.IsNonPossessionCard)
|
||||
{
|
||||
cardObject2.AttachGrayShader();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (num4 > 0f)
|
||||
{
|
||||
GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_CARDLIST_REVERSE);
|
||||
}
|
||||
if (isRotate)
|
||||
{
|
||||
UIManager.GetInstance().StartCoroutine(DelayEventCall(num4, onFirstAnimationFinish));
|
||||
}
|
||||
else
|
||||
{
|
||||
onFirstAnimationFinish.Call();
|
||||
}
|
||||
onFinish.Call();
|
||||
}
|
||||
});
|
||||
return flag;
|
||||
}
|
||||
|
||||
private bool IsSameIdList(List<int> a, List<int> b)
|
||||
{
|
||||
if (a == null)
|
||||
{
|
||||
return b != null;
|
||||
}
|
||||
if (b != null)
|
||||
{
|
||||
return a.SequenceEqual(b);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private IEnumerator DelayEventCall(float delay, Action finishEvent)
|
||||
{
|
||||
yield return new WaitForSeconds(delay);
|
||||
finishEvent.Call();
|
||||
}
|
||||
|
||||
private bool CollectOrderCardId(List<int> idList, ref List<int> orderCardIdList, ref List<CardObject> destroyList)
|
||||
{
|
||||
bool flag = false;
|
||||
for (int num = orderCardIdList.Count - 1; num >= 0; num--)
|
||||
{
|
||||
int cardId = orderCardIdList[num];
|
||||
List<CardObject> list = _cardList.FindAll((CardObject c) => c.CardId == cardId);
|
||||
CardObject cardObject = list.Find((CardObject c) => !c.IsNonPossessionCard);
|
||||
CardObject cardObject2 = list.Find((CardObject c) => c.IsNonPossessionCard);
|
||||
int possessionCardNum = FormatBehavior.GetPossessionCardNum(cardId, _isDisplaySpotCardNum);
|
||||
if (possessionCardNum > 0)
|
||||
{
|
||||
if (possessionCardNum < idList.Count((int id) => id == cardId))
|
||||
{
|
||||
flag = flag || cardObject == null || cardObject2 == null;
|
||||
orderCardIdList.Insert(num, cardId);
|
||||
}
|
||||
else
|
||||
{
|
||||
flag = flag || cardObject == null || cardObject2 != null;
|
||||
if (cardObject2 != null)
|
||||
{
|
||||
destroyList.Add(cardObject2);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
flag = flag || cardObject != null || cardObject2 == null;
|
||||
if (cardObject != null)
|
||||
{
|
||||
destroyList.Add(cardObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
flag |= orderCardIdList.Count != _cardList.Count;
|
||||
foreach (CardObject card in _cardList)
|
||||
{
|
||||
if (!destroyList.Contains(card) && !orderCardIdList.Contains(card.CardId))
|
||||
{
|
||||
destroyList.Add(card);
|
||||
}
|
||||
}
|
||||
return flag | (destroyList.Count > 0);
|
||||
}
|
||||
|
||||
private List<CardObject> CreateOrderCardList(List<int> idList, List<int> orderCardIdList, ref List<int> loadCardIdList)
|
||||
{
|
||||
List<CardObject> list = new List<CardObject>(orderCardIdList.Count);
|
||||
int num = -1;
|
||||
for (int i = 0; i < orderCardIdList.Count; i++)
|
||||
{
|
||||
int cardId = orderCardIdList[i];
|
||||
bool isNonPossessionCard = FormatBehavior.GetPossessionCardNum(cardId, isIncludingSpotCard: true) == 0 || cardId == num;
|
||||
CountMainAndSubNum(idList, cardId, isNonPossessionCard, out var mainNum, out var subNum);
|
||||
CardObject cardObject = _cardList.Find((CardObject c) => c.CardId == cardId && c.IsNonPossessionCard == isNonPossessionCard);
|
||||
if (cardObject != null)
|
||||
{
|
||||
list.Add(cardObject);
|
||||
cardObject.MainCardNum = mainNum;
|
||||
cardObject.SubCardNum = subNum;
|
||||
}
|
||||
else
|
||||
{
|
||||
list.Add(CreateSleeve(cardId, mainNum, subNum, isNonPossessionCard));
|
||||
loadCardIdList.Add(cardId);
|
||||
}
|
||||
num = cardId;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public virtual CardObject Insert(CardObject card, bool dontCreate)
|
||||
{
|
||||
if (card == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
_lastIdList = null;
|
||||
CardObject cardObject = null;
|
||||
bool isNonPossessionCard = false;
|
||||
if (_canUseNonPossessionCard)
|
||||
{
|
||||
int num = IdList.Count((int id) => id == card.CardId);
|
||||
isNonPossessionCard = num >= FormatBehavior.GetPossessionCardNum(card.CardId, isIncludingSpotCard: true);
|
||||
cardObject = _cardList.Find((CardObject c) => c.CardId == card.CardId && c.IsNonPossessionCard == isNonPossessionCard);
|
||||
}
|
||||
else
|
||||
{
|
||||
cardObject = _cardList.Find((CardObject find) => find.CardId == card.CardId);
|
||||
}
|
||||
int possessionCardNum = FormatBehavior.GetPossessionCardNum(card.CardId, isIncludingSpotCard: false);
|
||||
if (cardObject != null)
|
||||
{
|
||||
if (cardObject.MainCardNum < possessionCardNum || isNonPossessionCard)
|
||||
{
|
||||
cardObject.MainCardNum++;
|
||||
}
|
||||
else
|
||||
{
|
||||
cardObject.SubCardNum++;
|
||||
}
|
||||
return cardObject;
|
||||
}
|
||||
if (!dontCreate)
|
||||
{
|
||||
CardParameter cardParameterFromId = CardMaster.GetInstance(FormatBehavior.CardMasterId).GetCardParameterFromId(card.CardId);
|
||||
Toolbox.ResourcesManager.StartCoroutine(Toolbox.ResourcesManager.LoadAssetAsync(Toolbox.ResourcesManager.GetAssetTypePath(cardParameterFromId.ResourceCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial), null));
|
||||
if (cardParameterFromId.IsFoil)
|
||||
{
|
||||
int resourceCardId = CardMaster.GetInstance(FormatBehavior.CardMasterId).GetCardParameterFromId(cardParameterFromId.NormalCardId).ResourceCardId;
|
||||
Toolbox.ResourcesManager.StartCoroutine(Toolbox.ResourcesManager.LoadAssetAsync(Toolbox.ResourcesManager.GetAssetTypePath(resourceCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial), null));
|
||||
}
|
||||
Vector3 position = card.CardObj.transform.position;
|
||||
CardObject cardObject2 = card.Clone();
|
||||
card.ActiveCardInfo(isActive: false);
|
||||
cardObject2.CardObj = UnityEngine.Object.Instantiate(card.CardObj);
|
||||
card.ActiveCardInfo(isActive: true);
|
||||
cardObject2.CardObj.transform.position = position;
|
||||
cardObject2.SetScale(_cardScale);
|
||||
CardListTemplate component = cardObject2.CardObj.GetComponent<CardListTemplate>();
|
||||
if (component != null)
|
||||
{
|
||||
component.RotationOnlyIconVisible = cardParameterFromId.IsResurgentCard;
|
||||
}
|
||||
cardObject2.IsDisplaySpotCardNum = _isDisplaySpotCardNum;
|
||||
cardObject2.IsHideZeroSpotCardNum = _isHideZeroSpotCardNum;
|
||||
cardObject2.IsNonPossessionCard = isNonPossessionCard;
|
||||
if (possessionCardNum > 0 || isNonPossessionCard)
|
||||
{
|
||||
cardObject2.MainCardNum = 1;
|
||||
cardObject2.SubCardNum = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cardObject2.MainCardNum = 0;
|
||||
cardObject2.SubCardNum = 1;
|
||||
}
|
||||
if (isNonPossessionCard)
|
||||
{
|
||||
cardObject2.AttachGrayShader();
|
||||
}
|
||||
_cardList.Add(cardObject2);
|
||||
_cardList = (from c in _cardList
|
||||
orderby new UIBase_CardManager.ComparableCard(c.CardId, FormatBehavior.CardMasterId), c.IsNonPossessionCard
|
||||
select c).ToList();
|
||||
cardObject2.CardObj.GetComponent<CharIdx>().SetCardId(cardObject2.CardId);
|
||||
this.OnCreateCard.Call(cardObject2);
|
||||
return cardObject2;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public virtual CardObject Remove(CardObject card, bool isDestroyObject)
|
||||
{
|
||||
if (card == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
_lastIdList = null;
|
||||
CardObject cardObject = _cardList.Find((CardObject find) => find == card);
|
||||
if (cardObject == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
if (cardObject.SubCardNum > 0 && cardObject.MainCardNum <= FormatBehavior.GetPossessionCardNum(card.CardId, isIncludingSpotCard: false) && !cardObject.IsNonPossessionCard)
|
||||
{
|
||||
cardObject.SubCardNum--;
|
||||
}
|
||||
else
|
||||
{
|
||||
cardObject.MainCardNum--;
|
||||
}
|
||||
if (cardObject.TotalCardNum == 0)
|
||||
{
|
||||
if (isDestroyObject)
|
||||
{
|
||||
_cardList.Remove(card);
|
||||
DestroyEach(card);
|
||||
return null;
|
||||
}
|
||||
return cardObject;
|
||||
}
|
||||
return cardObject;
|
||||
}
|
||||
|
||||
public void EnableAlpha(bool isEnable)
|
||||
{
|
||||
_cardList.ForEach(delegate(CardObject card)
|
||||
{
|
||||
card.EnableAlpha(isEnable);
|
||||
});
|
||||
}
|
||||
|
||||
public virtual void DestroyAll()
|
||||
{
|
||||
_cardList.ForEach(delegate(CardObject card)
|
||||
{
|
||||
card.Destroy();
|
||||
});
|
||||
_cardList.Clear();
|
||||
_lastIdList = null;
|
||||
}
|
||||
|
||||
protected virtual void DestroyEach(CardObject card)
|
||||
{
|
||||
card.Destroy();
|
||||
}
|
||||
|
||||
protected virtual CardObject CreateSleeve(int id, int mainNum, int subNum, bool isNonPossessionCard = false)
|
||||
{
|
||||
CardObject cardObject = new CardObject(_parent, _cardScale, FormatBehavior, _isDisplaySpotCardNum, _isHideZeroSpotCardNum, isNonPossessionCard);
|
||||
cardObject.ShowSleeve(_sleeveOriginal);
|
||||
cardObject.CardId = id;
|
||||
cardObject.MainCardNum = mainNum;
|
||||
cardObject.SubCardNum = subNum;
|
||||
this.OnCreateSleeve.Call(cardObject);
|
||||
return cardObject;
|
||||
}
|
||||
|
||||
public virtual void Load(List<int> order, bool isPreferentially, Action<List<UIBase_CardManager.CardObjData>> onFinish)
|
||||
{
|
||||
Func<List<int>> order2 = () => order;
|
||||
_cardCreator.Request(order2, isPreferentially, onFinish, FormatBehavior.CardMasterId);
|
||||
}
|
||||
|
||||
private IEnumerator RotateAndTakeoffSleeve(CardObject card, float delay)
|
||||
{
|
||||
card.NotifyRotateAnimation();
|
||||
yield return new WaitForSeconds(delay);
|
||||
card.RotateAnim(delegate
|
||||
{
|
||||
card.TakeOffSleeve();
|
||||
this.OnCreateCard.Call(card);
|
||||
});
|
||||
}
|
||||
|
||||
public bool IsEndRotateAnimation()
|
||||
{
|
||||
return _cardList.All((CardObject cardObj) => !cardObj.IsWaitingRotateAnimation);
|
||||
}
|
||||
|
||||
public void CountUseCardNum(List<int> cardIdList, int cardId, out int usePossessionCardNum, out int useSpotCardNum, out int useNonPossessionCardNum)
|
||||
{
|
||||
int possessionCardNum = FormatBehavior.GetPossessionCardNum(cardId, isIncludingSpotCard: false);
|
||||
int val = FormatBehavior.GetPossessionCardNum(cardId, isIncludingSpotCard: true) - possessionCardNum;
|
||||
int num = cardIdList.Count((int id) => id == cardId);
|
||||
usePossessionCardNum = Math.Min(possessionCardNum, num);
|
||||
useSpotCardNum = Math.Max(0, Math.Min(num - usePossessionCardNum, val));
|
||||
useNonPossessionCardNum = num - usePossessionCardNum - useSpotCardNum;
|
||||
}
|
||||
|
||||
public void CountMainAndSubNum(List<int> cardIdList, int cardId, bool isNonPossessionCard, out int mainNum, out int subNum)
|
||||
{
|
||||
CountUseCardNum(cardIdList, cardId, out var usePossessionCardNum, out var useSpotCardNum, out var useNonPossessionCardNum);
|
||||
if (isNonPossessionCard)
|
||||
{
|
||||
mainNum = useNonPossessionCardNum;
|
||||
subNum = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mainNum = usePossessionCardNum;
|
||||
subNum = useSpotCardNum;
|
||||
}
|
||||
}
|
||||
|
||||
public void CountMainAndSubNum(int cardId, bool isNonPossessionCard, out int mainNum, out int subNum)
|
||||
{
|
||||
CountMainAndSubNum(IdList, cardId, isNonPossessionCard, out mainNum, out subNum);
|
||||
}
|
||||
|
||||
public int CountClassCard(CardBasePrm.ClanType classId)
|
||||
{
|
||||
CardMaster cardMaster = CardMaster.GetInstance(FormatBehavior.CardMasterId);
|
||||
return _cardList.Where((CardObject card) => cardMaster.GetCardParameterFromId(card.CardId).Clan == classId).Sum((CardObject card) => card.TotalCardNum);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,443 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cute;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Wizard.DeckCardEdit;
|
||||
|
||||
public class CardBundleController : CardBundleControllerBase
|
||||
{
|
||||
private DeckData _copySourceDeck;
|
||||
|
||||
private int _rawSkinId;
|
||||
|
||||
private bool _isRandomLeaderSkin;
|
||||
|
||||
private List<int> _leaderSkinIdList;
|
||||
|
||||
private long _sleeveId;
|
||||
|
||||
private ConventionDeckList _conventionDeckList;
|
||||
|
||||
private DeckGroupListData _deckListGroupData;
|
||||
|
||||
private Format _format;
|
||||
|
||||
private int DECK_CARD_NUM_MAX => base.FormatBehavior.DeckCardNumMax;
|
||||
|
||||
private int DECK_CARD_NUM_EDIT_MAX => base.FormatBehavior.DeckSavableCardNumMax;
|
||||
|
||||
public string DeckName { get; set; }
|
||||
|
||||
public int DeckId { get; set; }
|
||||
|
||||
public ClassSet ClassSet { get; set; }
|
||||
|
||||
public bool IsNewDeck { get; set; }
|
||||
|
||||
public event Action OnCreateDeckSleeve;
|
||||
|
||||
public event Action OnCreateDeckCard;
|
||||
|
||||
public event Action OnCreateAutoDeck;
|
||||
|
||||
public event Action<int> OnInsertDeckCard;
|
||||
|
||||
public event Action<int> OnRemoveDeckCard;
|
||||
|
||||
public CardBundleController(Transform parentDeck, Transform parentPage, UITexture sleeveOriginal, GameObject cardInfoOriginal, IFormatBehavior formatBehavior, bool isIncludingSpotCard, bool isSelectableSpotCard, bool isHideZeroSpotCardNum, bool canUseNonPossessionCard)
|
||||
: base(parentDeck, parentPage, sleeveOriginal, cardInfoOriginal, formatBehavior, isIncludingSpotCard, isSelectableSpotCard, isHideZeroSpotCardNum, canUseNonPossessionCard)
|
||||
{
|
||||
}
|
||||
|
||||
public void Setup(string name, DeckData deck, ClassSet classSet, int rawSkinId, bool isRandomLeaderSkin, List<int> leaderSkinIdList, long sleeveId, DeckData copySrc, Format format, ConventionDeckList conventionDeckList, DeckGroupListData deckGroupListData)
|
||||
{
|
||||
base.IsReady = false;
|
||||
DeckName = name;
|
||||
DeckId = deck.GetDeckID();
|
||||
_format = format;
|
||||
ClassSet = classSet;
|
||||
_rawSkinId = rawSkinId;
|
||||
_isRandomLeaderSkin = isRandomLeaderSkin;
|
||||
_leaderSkinIdList = leaderSkinIdList;
|
||||
_sleeveId = sleeveId;
|
||||
_conventionDeckList = conventionDeckList;
|
||||
_deckListGroupData = deckGroupListData;
|
||||
_copySourceDeck = copySrc;
|
||||
base.CurrentPage = 0;
|
||||
base.MaxPage = 0;
|
||||
base.IsCraftMode = false;
|
||||
_filter.Craftable = 1;
|
||||
if (_format == Format.Unlimited)
|
||||
{
|
||||
_filter.IsEnableResurgentCard = false;
|
||||
}
|
||||
IsNewDeck = deck.IsNoCard();
|
||||
List<int> order = GetFilteringIDList(base.FormatBehavior).Take(32).ToList();
|
||||
base.PagingList.Load(order, isPreferentially: false, delegate(List<UIBase_CardManager.CardObjData> created)
|
||||
{
|
||||
created.ForEach(delegate(UIBase_CardManager.CardObjData entry)
|
||||
{
|
||||
entry.CardObj.SetActive(value: false);
|
||||
});
|
||||
List<int> idList = null;
|
||||
if (_copySourceDeck != null)
|
||||
{
|
||||
idList = _copySourceDeck.GetCardIdList();
|
||||
}
|
||||
else if (!IsNewDeck)
|
||||
{
|
||||
idList = deck.GetCardIdList();
|
||||
}
|
||||
Action onSetupDeckCard = delegate
|
||||
{
|
||||
LoadPagingCard(0, isDestroyImmediate: true);
|
||||
};
|
||||
Action onSetupPagingCard = null;
|
||||
onSetupPagingCard = delegate
|
||||
{
|
||||
OnCreateDeckCard -= onSetupDeckCard;
|
||||
base.OnCreatePagingCard -= onSetupPagingCard;
|
||||
base.SelectionAreaList.ApplyFilter(new UIBase_CardManager.FilterParameter());
|
||||
base.IsReady = true;
|
||||
};
|
||||
OnCreateDeckCard += onSetupDeckCard;
|
||||
base.OnCreatePagingCard += onSetupPagingCard;
|
||||
LoadDeckCard(idList);
|
||||
});
|
||||
}
|
||||
|
||||
public bool LoadDeckCard(List<int> idList, Action onFirstAnimationFinish = null, float cardRotateDelayTimeMax = float.MaxValue, bool isSkipSameDeckCheck = false)
|
||||
{
|
||||
if (idList == null)
|
||||
{
|
||||
this.OnCreateDeckSleeve.Call();
|
||||
this.OnCreateDeckCard.Call();
|
||||
OnCreateDeckCard -= this.OnCreateAutoDeck;
|
||||
return false;
|
||||
}
|
||||
idList = UIManager.GetInstance().getUIBase_CardManager().SortIDList(idList, base.FormatBehavior.CardMasterId);
|
||||
return base.SelectionAreaList.CreateCards(idList, isDestroyImmediate: true, base.IsReady, this.OnCreateDeckSleeve, delegate
|
||||
{
|
||||
UpdateDeckCardNumFromList(idList);
|
||||
DisplayAttentionMessageOnRestrictedCard(idList);
|
||||
UpdatePagingCardInfoAll();
|
||||
this.OnCreateDeckCard.Call();
|
||||
OnCreateDeckCard -= this.OnCreateAutoDeck;
|
||||
}, onFirstAnimationFinish, cardRotateDelayTimeMax, isSkipSameDeckCheck);
|
||||
}
|
||||
|
||||
public override int InsertToSelectionArea(CardObject card)
|
||||
{
|
||||
if (card == null)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (base.SelectionAreaList.CountSum + 1 > DECK_CARD_NUM_EDIT_MAX)
|
||||
{
|
||||
SystemText systemText = Data.SystemText;
|
||||
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
||||
dialogBase.SetTitleLabel(systemText.Get("Dia_DeckEdit_008_Title"));
|
||||
dialogBase.SetText(systemText.Get("Card_0048", DECK_CARD_NUM_EDIT_MAX.ToString()));
|
||||
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.OkBtn);
|
||||
return -1;
|
||||
}
|
||||
CardObject cardObject = base.SelectionAreaList.FindWithCardId(card.CardId);
|
||||
CardParameter cardParameterFromId = CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(card.CardId);
|
||||
int num = cardParameterFromId.GetSameKindNumMaxInFormat(classType: ClassUtil.GetClassType(cardParameterFromId, _format, ClassSet), inFormat: _format, behavior: base.FormatBehavior, myRotationInfo: base.MyRotationInfo);
|
||||
if (base.MyRotationFilterType == FilterController.MyRotationFilterType.CARD_POOL_ALL_PACK)
|
||||
{
|
||||
num = 3;
|
||||
}
|
||||
if (cardObject != null && cardObject.TotalCardNum + 1 > num)
|
||||
{
|
||||
SystemText systemText2 = Data.SystemText;
|
||||
DialogBase dialogBase2 = UIManager.GetInstance().CreateDialogClose();
|
||||
dialogBase2.SetTitleLabel(systemText2.Get("Dia_DeckEdit_009_Title"));
|
||||
dialogBase2.SetText(systemText2.Get("Card_0049", num.ToString()));
|
||||
dialogBase2.SetButtonLayout(DialogBase.ButtonLayout.OkBtn);
|
||||
return -1;
|
||||
}
|
||||
int result = base.InsertToSelectionArea(card);
|
||||
this.OnInsertDeckCard.Call(card.CardId);
|
||||
return result;
|
||||
}
|
||||
|
||||
public override int RemoveFromSelectionArea(CardObject card)
|
||||
{
|
||||
int result = base.RemoveFromSelectionArea(card);
|
||||
this.OnRemoveDeckCard(card.CardId);
|
||||
DisplayAttentionMessageOnRestrictedCard(base.SelectionAreaList.IdList);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void SetSelectionArea(List<int> cardIdList, Action onFirstAnimationFinish = null, float cardRotateDelayTimeMax = float.MaxValue)
|
||||
{
|
||||
LoadDeckCard(cardIdList, onFirstAnimationFinish, cardRotateDelayTimeMax);
|
||||
}
|
||||
|
||||
public void ClearSelectionArea()
|
||||
{
|
||||
if (base.SelectionAreaList.CountSum == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
foreach (CardObject card in base.SelectionAreaList.CardList)
|
||||
{
|
||||
for (int i = 0; i < card.TotalCardNum; i++)
|
||||
{
|
||||
base.PagingList.Insert(card, dontCreate: true);
|
||||
}
|
||||
}
|
||||
base.SelectionAreaList.DestroyAll();
|
||||
UpdatePagingCardInfoAll();
|
||||
}
|
||||
|
||||
public void ChangeCraftMode(bool isCraft)
|
||||
{
|
||||
base.IsCraftMode = isCraft;
|
||||
FetchPagingCard();
|
||||
}
|
||||
|
||||
public void CreateAutoDeck(bool forceClear, int tournamentId, MyRotationInfo myRotationInfo)
|
||||
{
|
||||
List<int> list = FindAllAvailableCardInFormat(base.SelectionAreaList.IdList, _format, myRotationInfo);
|
||||
if (list.Count >= DECK_CARD_NUM_MAX || forceClear)
|
||||
{
|
||||
list.Clear();
|
||||
}
|
||||
GetAutoCreateDeckCards(list, tournamentId, myRotationInfo, delegate(List<int> autoCreatedDeckCards)
|
||||
{
|
||||
List<int> idList = UIManager.GetInstance().getUIBase_CardManager().SortIDList(autoCreatedDeckCards, base.FormatBehavior.CardMasterId);
|
||||
UIManager.GetInstance().OpenNotTouch();
|
||||
OnCreateDeckCard += this.OnCreateAutoDeck;
|
||||
if (!LoadDeckCard(idList, OnCreateAutoAnimationFinish))
|
||||
{
|
||||
OnCreateDeckCard -= this.OnCreateAutoDeck;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void GetAutoCreateDeckCards(List<int> deck, int tournamentId, MyRotationInfo myRotationInfo, Action<List<int>> onFinish)
|
||||
{
|
||||
DeckAutoCreateTask task = new DeckAutoCreateTask();
|
||||
if (FormatBehaviorManager.GetDefaultBehaviour(_format).UseSubClass)
|
||||
{
|
||||
task.SetParameter(_format, (int)ClassSet.MainClass, (int)ClassSet.SubClass, tournamentId, deck.ToArray());
|
||||
}
|
||||
else
|
||||
{
|
||||
task.SetParameter(_format, (int)ClassSet.MainClass, tournamentId, deck.ToArray(), myRotationInfo);
|
||||
}
|
||||
UIManager.GetInstance().StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
|
||||
{
|
||||
deck = task._autoDeckCreateCardList.ToList();
|
||||
onFinish.Call(deck);
|
||||
}));
|
||||
}
|
||||
|
||||
private void OnCreateAutoAnimationFinish()
|
||||
{
|
||||
UIManager.GetInstance().offNotTouch();
|
||||
}
|
||||
|
||||
public void CreateDeckAddCard(List<int> addIdList)
|
||||
{
|
||||
List<int> idList = base.SelectionAreaList.IdList;
|
||||
if (idList.Count + addIdList.Count <= DECK_CARD_NUM_EDIT_MAX)
|
||||
{
|
||||
idList.AddRange(addIdList);
|
||||
List<int> idList2 = UIManager.GetInstance().getUIBase_CardManager().SortIDList(idList, base.FormatBehavior.CardMasterId);
|
||||
LoadDeckCard(idList2, null, float.MaxValue, isSkipSameDeckCheck: true);
|
||||
}
|
||||
}
|
||||
|
||||
public void CreateDeckRemoveCard(int removeId)
|
||||
{
|
||||
List<int> idList = base.SelectionAreaList.IdList;
|
||||
if (idList.Count >= 0)
|
||||
{
|
||||
if (idList.Contains(removeId))
|
||||
{
|
||||
idList.Remove(removeId);
|
||||
}
|
||||
List<int> idList2 = UIManager.GetInstance().getUIBase_CardManager().SortIDList(idList, base.FormatBehavior.CardMasterId);
|
||||
LoadDeckCard(idList2, null, float.MaxValue, isSkipSameDeckCheck: true);
|
||||
}
|
||||
}
|
||||
|
||||
public void ReloadDeckCard(List<int> cardIdList)
|
||||
{
|
||||
List<int> idList = UIManager.GetInstance().getUIBase_CardManager().SortIDList(cardIdList, base.FormatBehavior.CardMasterId);
|
||||
LoadDeckCard(idList, null, float.MaxValue, isSkipSameDeckCheck: true);
|
||||
}
|
||||
|
||||
protected override void AccordCardInfoInSelectionArea()
|
||||
{
|
||||
LoadDeckCard(base.SelectionAreaList.IdList, null, float.MaxValue, isSkipSameDeckCheck: true);
|
||||
}
|
||||
|
||||
public void SaveDeck(Action onFinish, Action<bool> saveCompleteDialogAction, bool needsClearSkin)
|
||||
{
|
||||
DeckSave.Option option = new DeckSave.Option
|
||||
{
|
||||
CardIds = base.SelectionAreaList.IdList.ToArray(),
|
||||
DeckId = DeckId,
|
||||
DeckName = DeckName,
|
||||
ClassType = (int)ClassSet.MainClass,
|
||||
RawSkinId = _rawSkinId,
|
||||
IsRandomLeaderSkin = _isRandomLeaderSkin,
|
||||
LeaderSkinIdList = _leaderSkinIdList,
|
||||
SleeveId = _sleeveId,
|
||||
IsNew = IsNewDeck,
|
||||
Format = _format,
|
||||
ConventionDeckList = _conventionDeckList,
|
||||
MyRotationId = ((base.MyRotationInfo != null) ? base.MyRotationInfo.Id : null),
|
||||
OnFinish = onFinish,
|
||||
OnSaveCompleteDialog = saveCompleteDialogAction
|
||||
};
|
||||
if (base.FormatBehavior.UseSubClass)
|
||||
{
|
||||
option.SubClassType = (int)ClassSet.SubClass;
|
||||
}
|
||||
if (needsClearSkin)
|
||||
{
|
||||
option.RawSkinId = 0;
|
||||
option.IsRandomLeaderSkin = false;
|
||||
option.LeaderSkinIdList = new List<int> { 0 };
|
||||
}
|
||||
new DeckSave().Start(option);
|
||||
}
|
||||
|
||||
public List<int> FindAllAvailableCardInFormat(List<int> inSouceCardList, Format inFormat, MyRotationInfo myRotationInfo)
|
||||
{
|
||||
List<int> list = new List<int>();
|
||||
for (int i = 0; i < inSouceCardList.Count; i++)
|
||||
{
|
||||
int num = inSouceCardList[i];
|
||||
CardParameter param = CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(num);
|
||||
ClassType classType = ClassUtil.GetClassType(param, inFormat, ClassSet);
|
||||
if (param.IsAvailableFormat(inFormat, classType, myRotationInfo) && list.Count((int data) => CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(data).BaseCardId == param.BaseCardId) < param.GetSameKindNumMaxInFormat(inFormat, base.FormatBehavior, classType, myRotationInfo))
|
||||
{
|
||||
list.Add(num);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
protected override void UpdateCardInfo(CardObject card)
|
||||
{
|
||||
int haveNum = GetHaveNum(card.CardId);
|
||||
int usedNum = CountCardNumInSelectionArea(card.CardId, isStrictSameCard: true);
|
||||
int usedNumWithFoil = CountCardNumInSelectionArea(card.CardId, isStrictSameCard: false);
|
||||
int haveNumWithFoil = GetHaveNumTotalSameKindWithLimit(card.CardId);
|
||||
bool isMaintenance = GameMgr.GetIns().GetDataMgr().IsMaintenanceCard(card.CardId);
|
||||
if (base.FormatBehavior.IsConventionMode)
|
||||
{
|
||||
haveNum = 3;
|
||||
haveNumWithFoil = 3;
|
||||
}
|
||||
CardParameter cardParameterFromId = CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(card.CardId);
|
||||
ClassType classType = ClassUtil.GetClassType(cardParameterFromId, _format, ClassSet);
|
||||
int sameKindNumMax = cardParameterFromId.GetSameKindNumMaxInFormat(_format, base.FormatBehavior, classType, base.MyRotationInfo);
|
||||
if (base.MyRotationInfo != null && base.MyRotationFilterType == FilterController.MyRotationFilterType.CARD_POOL_ALL_PACK)
|
||||
{
|
||||
sameKindNumMax = base.MyRotationInfo.GetSameCardCount(cardParameterFromId.BaseCardId);
|
||||
}
|
||||
card.UpdateCardInfo(_cardInfoOriginal, haveNum, haveNumWithFoil, usedNum, usedNumWithFoil, sameKindNumMax, isMaintenance);
|
||||
}
|
||||
|
||||
private int GetHaveNumTotalSameKindWithLimit(int ids)
|
||||
{
|
||||
int baseCardId = CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(ids).BaseCardId;
|
||||
int deckSameKindCardNumMax = base.FormatBehavior.DeckSameKindCardNumMax;
|
||||
return Mathf.Min(base.FormatBehavior.GetPossessionBaseCardNum(baseCardId, isIncludingSpotCard: true), deckSameKindCardNumMax);
|
||||
}
|
||||
|
||||
private void UpdateDeckCardNumFromList(List<int> idList)
|
||||
{
|
||||
for (int i = 0; i < base.SelectionAreaList.CountKindNoFilter; i++)
|
||||
{
|
||||
CardObject cardObject = base.SelectionAreaList.FindWithIndexNoFilter(i);
|
||||
base.SelectionAreaList.CountMainAndSubNum(idList, cardObject.CardId, cardObject.IsNonPossessionCard, out var mainNum, out var subNum);
|
||||
cardObject.MainCardNum = mainNum;
|
||||
cardObject.SubCardNum = subNum;
|
||||
}
|
||||
}
|
||||
|
||||
private void DisplayAttentionMessageOnRestrictedCard(List<int> idList)
|
||||
{
|
||||
CardMaster cardMaster = CardMaster.GetInstance(base.FormatBehavior.CardMasterId);
|
||||
List<int> source = idList.Select((int id) => cardMaster.GetCardParameterFromId(id).BaseCardId).ToList();
|
||||
for (int num = 0; num < base.SelectionAreaList.CountKindNoFilter; num++)
|
||||
{
|
||||
CardObject cardObject = base.SelectionAreaList.FindWithIndexNoFilter(num);
|
||||
if (!cardObject.IsAttachedCardObjData)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
CardParameter cardParam = cardMaster.GetCardParameterFromId(cardObject.CardId);
|
||||
ClassType classType = ClassUtil.GetClassType(cardParam, _format, ClassSet);
|
||||
if (!cardParam.IsAvailableFormat(_format, classType, base.MyRotationInfo))
|
||||
{
|
||||
cardObject.SetCardToBanCard(_cardInfoOriginal);
|
||||
}
|
||||
else if (GameMgr.GetIns().GetDataMgr().IsMaintenanceCard(cardObject.CardId))
|
||||
{
|
||||
cardObject.SetCardToMaintenance(_cardInfoOriginal);
|
||||
cardObject.AttachColorShader();
|
||||
}
|
||||
else if (base.FormatBehavior.ExistsRestrictedCard)
|
||||
{
|
||||
int sameKindNumMaxInFormat = cardParam.GetSameKindNumMaxInFormat(_format, base.FormatBehavior, classType, base.MyRotationInfo);
|
||||
if (sameKindNumMaxInFormat > 0)
|
||||
{
|
||||
int num2 = source.Count((int baseCardId) => baseCardId == cardParam.BaseCardId);
|
||||
cardObject.UpdateSameKindNumMaxCard(num2 > sameKindNumMaxInFormat, _cardInfoOriginal);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cardObject.DestroyUseInfo();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override int GetSelectableCardNum(int cardId)
|
||||
{
|
||||
if (CanUseNonPossessionCard)
|
||||
{
|
||||
CardParameter cardParameterFromId = CardMaster.GetInstance(base.FormatBehavior.CardMasterId).GetCardParameterFromId(cardId);
|
||||
return cardParameterFromId.GetSameKindNumMaxInFormat(classType: ClassUtil.GetClassType(cardParameterFromId, _format, ClassSet), inFormat: _format, behavior: base.FormatBehavior, myRotationInfo: base.MyRotationInfo);
|
||||
}
|
||||
return base.GetSelectableCardNum(cardId);
|
||||
}
|
||||
|
||||
public void UpdateCardDisplay()
|
||||
{
|
||||
DisplayAttentionMessageOnRestrictedCard(base.SelectionAreaList.IdList);
|
||||
UpdatePagingCardInfoAll();
|
||||
}
|
||||
|
||||
protected override void OnCreateSelectionEachCard(CardObject card)
|
||||
{
|
||||
base.OnCreateSelectionEachCard(card);
|
||||
if (base.FormatBehavior.ExistsRestrictedCard)
|
||||
{
|
||||
CardMaster cardMaster = CardMaster.GetInstance(base.FormatBehavior.CardMasterId);
|
||||
CardParameter cardParameterFromId = cardMaster.GetCardParameterFromId(card.CardId);
|
||||
int baseCardId = cardParameterFromId.BaseCardId;
|
||||
ClassType classType = ClassUtil.GetClassType(cardParameterFromId, _format, ClassSet);
|
||||
int sameKindNumMaxInFormat = cardParameterFromId.GetSameKindNumMaxInFormat(_format, base.FormatBehavior, classType, base.MyRotationInfo);
|
||||
if (base.SelectionAreaList.CardList.Where((CardObject cardObj) => cardMaster.GetCardParameterFromId(cardObj.CardId).BaseCardId == baseCardId).Sum((CardObject cardObj) => cardObj.TotalCardNum) > sameKindNumMaxInFormat)
|
||||
{
|
||||
card.AttachRedShader();
|
||||
}
|
||||
if (!cardParameterFromId.IsAvailableFormat(_format, classType, base.MyRotationInfo))
|
||||
{
|
||||
card.SetCardToBanCard(_cardInfoOriginal);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,501 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cute;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Wizard.DeckCardEdit;
|
||||
|
||||
public class CardBundleControllerBase
|
||||
{
|
||||
protected UIBase_CardManager.FilterParameter _filter;
|
||||
|
||||
private bool _isCraftMode;
|
||||
|
||||
private readonly Transform _parentSelectionObj;
|
||||
|
||||
private readonly Transform _parentPagingObj;
|
||||
|
||||
private readonly UITexture _sleeveOriginal;
|
||||
|
||||
protected GameObject _cardInfoOriginal;
|
||||
|
||||
private List<int> _filteredAllCardIdListCache;
|
||||
|
||||
protected UIBase_CardManager.FilterParameter _lastExecutedFilterParam;
|
||||
|
||||
private readonly CardCreator _cardCreator;
|
||||
|
||||
private readonly List<int> _listNewCardDisplayedIds = new List<int>();
|
||||
|
||||
private readonly bool _isSelectableSpotCard;
|
||||
|
||||
public readonly bool CanUseNonPossessionCard;
|
||||
|
||||
private int CARD_PER_PAGE => 8;
|
||||
|
||||
private float CARD_WIDTH => 120f;
|
||||
|
||||
private float SELECTION_AREA_CARD_SCALE => 0.5f;
|
||||
|
||||
private float PAGE_CARD_SCALE => 0.6f;
|
||||
|
||||
public bool IsReady { get; protected set; }
|
||||
|
||||
public int CurrentPage { get; set; }
|
||||
|
||||
public int MaxPage { get; set; }
|
||||
|
||||
public FilteringCardBundle SelectionAreaList { get; private set; }
|
||||
|
||||
public CachingCardBundle PagingList { get; private set; }
|
||||
|
||||
public UIBase_CardManager.FilterParameter FilterParameter
|
||||
{
|
||||
get
|
||||
{
|
||||
return _filter;
|
||||
}
|
||||
set
|
||||
{
|
||||
_filter = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsCraftMode
|
||||
{
|
||||
get
|
||||
{
|
||||
return _isCraftMode;
|
||||
}
|
||||
protected set
|
||||
{
|
||||
_isCraftMode = value;
|
||||
_filter.Own = ((!value) ? 1 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
protected IFormatBehavior FormatBehavior { get; private set; }
|
||||
|
||||
public MyRotationInfo MyRotationInfo { get; private set; }
|
||||
|
||||
public FilterController.MyRotationFilterType MyRotationFilterType { get; private set; }
|
||||
|
||||
public event Action OnCreatePagingSleeve;
|
||||
|
||||
public event Action OnCreatePagingCard;
|
||||
|
||||
public event Action<GameObject> OnClickSelectionAreaCard;
|
||||
|
||||
public event Action<GameObject> OnClickPagingCard;
|
||||
|
||||
public event Action<GameObject, Vector2> OnDragPagingCard;
|
||||
|
||||
public event Action<GameObject> OnDragOverPagingCard;
|
||||
|
||||
public event Action<GameObject, float> OnScrollPagingCard;
|
||||
|
||||
public CardBundleControllerBase(Transform parentSelection, Transform parentPage, UITexture sleeveOriginal, GameObject cardInfoOriginal, IFormatBehavior formatBehavior, bool isIncludingSpotCard, bool isSelectableSpotCard, bool isHideZeroSpotCardNum, bool canUseNonPossessionCard)
|
||||
{
|
||||
IsReady = false;
|
||||
_parentSelectionObj = parentSelection;
|
||||
_parentPagingObj = parentPage;
|
||||
_sleeveOriginal = sleeveOriginal;
|
||||
_cardInfoOriginal = cardInfoOriginal;
|
||||
_cardCreator = new CardCreator();
|
||||
FormatBehavior = formatBehavior;
|
||||
SelectionAreaList = new FilteringCardBundle(_cardCreator, _parentSelectionObj, _sleeveOriginal, SELECTION_AREA_CARD_SCALE, formatBehavior, isIncludingSpotCard, isHideZeroSpotCardNum, canUseNonPossessionCard);
|
||||
SelectionAreaList.OnCreateCard += OnCreateSelectionEachCard;
|
||||
PagingList = new CachingCardBundle(_cardCreator, _parentPagingObj, _sleeveOriginal, PAGE_CARD_SCALE, formatBehavior, isIncludingSpotCard);
|
||||
PagingList.OnCreateCard += OnCreatePagingEachCard;
|
||||
PagingList.OnCreateSleeve += OnCreatePagingEachSleeve;
|
||||
_isSelectableSpotCard = isSelectableSpotCard;
|
||||
CanUseNonPossessionCard = canUseNonPossessionCard;
|
||||
}
|
||||
|
||||
public void Tick()
|
||||
{
|
||||
_cardCreator.Tick();
|
||||
}
|
||||
|
||||
public void Destroy()
|
||||
{
|
||||
_cardCreator.Clear();
|
||||
SelectionAreaList.DestroyAll();
|
||||
PagingList.DestroyAll();
|
||||
}
|
||||
|
||||
public void DisableNewFlagDisplayedCards()
|
||||
{
|
||||
for (int i = 0; i < _listNewCardDisplayedIds.Count(); i++)
|
||||
{
|
||||
GameMgr.GetIns().GetDataMgr().SetIsNewCard(_listNewCardDisplayedIds[i], isNew: false);
|
||||
}
|
||||
}
|
||||
|
||||
public bool LoadPagingCard(int page, bool isDestroyImmediate)
|
||||
{
|
||||
List<int> filteringIDList = GetFilteringIDList(FormatBehavior);
|
||||
MaxPage = (filteringIDList.Count - 1) / CARD_PER_PAGE;
|
||||
if (page < 0 || page > MaxPage)
|
||||
{
|
||||
this.OnCreatePagingSleeve.Call();
|
||||
this.OnCreatePagingCard.Call();
|
||||
return false;
|
||||
}
|
||||
CurrentPage = page;
|
||||
List<int> idList = filteringIDList.Skip(page * CARD_PER_PAGE).Take(CARD_PER_PAGE).ToList();
|
||||
return PagingList.CreateCards(idList, isDestroyImmediate, IsReady, this.OnCreatePagingSleeve, delegate
|
||||
{
|
||||
this.OnCreatePagingCard.Call();
|
||||
});
|
||||
}
|
||||
|
||||
public bool FetchPagingCard()
|
||||
{
|
||||
return LoadPagingCard(FindCurrentPage(), isDestroyImmediate: false);
|
||||
}
|
||||
|
||||
public int FindCurrentPage()
|
||||
{
|
||||
if (PagingList == null || PagingList.CountKind == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
List<int> filteringIDList = GetFilteringIDList(FormatBehavior);
|
||||
int count = filteringIDList.Count;
|
||||
MaxPage = (filteringIDList.Count - 1) / CARD_PER_PAGE;
|
||||
int num = 0;
|
||||
bool flag = false;
|
||||
bool flag2 = false;
|
||||
List<int> list = new List<int>();
|
||||
num = 0;
|
||||
while (true)
|
||||
{
|
||||
list.Clear();
|
||||
for (int i = 0; i < CARD_PER_PAGE; i++)
|
||||
{
|
||||
int num2 = num * CARD_PER_PAGE + i;
|
||||
if (num2 >= count)
|
||||
{
|
||||
flag2 = true;
|
||||
break;
|
||||
}
|
||||
list.Add(filteringIDList[num2]);
|
||||
for (int j = 0; j < PagingList.CountKind; j++)
|
||||
{
|
||||
flag = flag || PagingList.FindWithIndex(j).CardId == filteringIDList[num2];
|
||||
}
|
||||
}
|
||||
if (flag || flag2)
|
||||
{
|
||||
break;
|
||||
}
|
||||
num++;
|
||||
}
|
||||
if (flag)
|
||||
{
|
||||
return num;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected virtual void OnCreateSelectionEachCard(CardObject card)
|
||||
{
|
||||
UIEventListener.Get(card.CardObj).onClick = this.OnClickSelectionAreaCard.Invoke;
|
||||
card.CardObj.AddComponent<UIDragScrollView>();
|
||||
card.ResetMaterial();
|
||||
if (GameMgr.GetIns().GetDataMgr().IsNewCard(card.CardId) && !_listNewCardDisplayedIds.Contains(card.CardId))
|
||||
{
|
||||
_listNewCardDisplayedIds.Add(card.CardId);
|
||||
}
|
||||
if (card.IsNonPossessionCard)
|
||||
{
|
||||
card.AttachGrayShader();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCreatePagingEachCard(CardObject card)
|
||||
{
|
||||
UIEventListener.Get(card.CardObj).onClick = this.OnClickPagingCard.Invoke;
|
||||
UIEventListener.Get(card.CardObj).onDrag = this.OnDragPagingCard.Invoke;
|
||||
UIEventListener.Get(card.CardObj).onDragOver = this.OnDragOverPagingCard.Invoke;
|
||||
UIEventListener.Get(card.CardObj).onScroll = this.OnScrollPagingCard.Invoke;
|
||||
card.ResetMaterial();
|
||||
UpdateCardInfo(card);
|
||||
if (GameMgr.GetIns().GetDataMgr().IsNewCard(card.CardId) && !_listNewCardDisplayedIds.Contains(card.CardId))
|
||||
{
|
||||
_listNewCardDisplayedIds.Add(card.CardId);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCreatePagingEachSleeve(CardObject sleeve)
|
||||
{
|
||||
sleeve.CardObj.transform.localPosition = Vector3.right * ((float)PagingList.IndexOf(sleeve) * CARD_WIDTH);
|
||||
}
|
||||
|
||||
public virtual int InsertToSelectionArea(CardObject card)
|
||||
{
|
||||
bool isVisibleCursorEffect = card.IsVisibleCursorEffect;
|
||||
card.ActiveCursorEffect(isActive: false);
|
||||
CardObject cardObject = SelectionAreaList.Insert(card, dontCreate: false);
|
||||
cardObject.AttachParent(_parentSelectionObj);
|
||||
PagingList.Remove(card, isDestroyObject: false);
|
||||
UpdatePagingCardInfoAll();
|
||||
card.ActiveCursorEffect(isVisibleCursorEffect);
|
||||
return SelectionAreaList.IndexOf(cardObject);
|
||||
}
|
||||
|
||||
public virtual int RemoveFromSelectionArea(CardObject card)
|
||||
{
|
||||
if (card == null)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
bool isVisibleCursorEffect = card.IsVisibleCursorEffect;
|
||||
card.ActiveCursorEffect(isActive: false);
|
||||
SelectionAreaList.Remove(card, isDestroyObject: true);
|
||||
CardObject card2 = PagingList.Insert(card, dontCreate: true);
|
||||
UpdatePagingCardInfoAll();
|
||||
card.ActiveCursorEffect(isVisibleCursorEffect);
|
||||
return PagingList.IndexOf(card2);
|
||||
}
|
||||
|
||||
public void InvalidateFilteredIdListCache()
|
||||
{
|
||||
_filteredAllCardIdListCache = null;
|
||||
}
|
||||
|
||||
protected virtual List<int> GetFilteringIDList(IFormatBehavior formatBehavior)
|
||||
{
|
||||
if (_filteredAllCardIdListCache != null && _filter == _lastExecutedFilterParam)
|
||||
{
|
||||
return _filteredAllCardIdListCache;
|
||||
}
|
||||
if (MyRotationInfo != null)
|
||||
{
|
||||
FilterController.SetMyRotationFilterParam(_filter, MyRotationFilterType, MyRotationInfo);
|
||||
}
|
||||
_filteredAllCardIdListCache = UIManager.GetInstance().getUIBase_CardManager().SelectCardIDInConditionMask(formatBehavior.SortedDeckUsableCardList, _filter, formatBehavior, MyRotationInfo, alreadySorted: true, IsCraftMode)
|
||||
.ToList();
|
||||
_lastExecutedFilterParam = new UIBase_CardManager.FilterParameter(_filter);
|
||||
return _filteredAllCardIdListCache;
|
||||
}
|
||||
|
||||
public void EnableAlpha(bool isEnable)
|
||||
{
|
||||
SelectionAreaList.EnableAlpha(isEnable);
|
||||
PagingList.EnableAlpha(isEnable);
|
||||
}
|
||||
|
||||
public int GetHaveNum(int cardId)
|
||||
{
|
||||
return FormatBehavior.GetPossessionCardNum(cardId, isIncludingSpotCard: true);
|
||||
}
|
||||
|
||||
public int CountCardNumInSelectionArea(int cardId, bool isStrictSameCard)
|
||||
{
|
||||
if (SelectionAreaList == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (isStrictSameCard)
|
||||
{
|
||||
return SelectionAreaList.CardList.Where((CardObject c) => c.CardId == cardId).Sum((CardObject c) => c.TotalCardNum);
|
||||
}
|
||||
CardMaster cardMaster = CardMaster.GetInstance(FormatBehavior.CardMasterId);
|
||||
int baseCardId = cardMaster.GetCardParameterFromId(cardId).BaseCardId;
|
||||
return SelectionAreaList.CardList.Where((CardObject c) => cardMaster.GetCardParameterFromId(c.CardId).BaseCardId == baseCardId).Sum((CardObject c) => c.TotalCardNum);
|
||||
}
|
||||
|
||||
protected virtual void UpdateCardInfo(CardObject card)
|
||||
{
|
||||
}
|
||||
|
||||
protected void UpdatePagingCardInfoAll()
|
||||
{
|
||||
for (int i = 0; i < PagingList.CountKind; i++)
|
||||
{
|
||||
UpdateCardInfo(PagingList.FindWithIndex(i));
|
||||
}
|
||||
}
|
||||
|
||||
public void OnCreateCard(int cardId)
|
||||
{
|
||||
if (PagingList.FindWithCardId(cardId) == null)
|
||||
{
|
||||
InvalidateFilteredIdListCache();
|
||||
FetchPagingCard();
|
||||
}
|
||||
}
|
||||
|
||||
public void AccordCardInfo()
|
||||
{
|
||||
AccordCardInfoInSelectionArea();
|
||||
AccordCardInfoInPagingList();
|
||||
}
|
||||
|
||||
protected virtual void AccordCardInfoInSelectionArea()
|
||||
{
|
||||
if (CanUseNonPossessionCard)
|
||||
{
|
||||
AccordSelectionAreaCardInfoWithNonPossessionCard();
|
||||
return;
|
||||
}
|
||||
for (int num = SelectionAreaList.CountKindNoFilter - 1; num >= 0; num--)
|
||||
{
|
||||
CardObject cardObject = SelectionAreaList.FindWithIndexNoFilter(num);
|
||||
int selectableCardNum = GetSelectableCardNum(cardObject.CardId);
|
||||
int num2 = CountCardNumInSelectionArea(cardObject.CardId, isStrictSameCard: true);
|
||||
if (selectableCardNum < num2)
|
||||
{
|
||||
int i = 0;
|
||||
for (int num3 = num2 - selectableCardNum; i < num3; i++)
|
||||
{
|
||||
RemoveFromSelectionArea(cardObject);
|
||||
}
|
||||
}
|
||||
if (selectableCardNum != 0)
|
||||
{
|
||||
UpdateMainAndSubNumInSelectionArea(cardObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void AccordSelectionAreaCardInfoWithNonPossessionCard()
|
||||
{
|
||||
for (int num = SelectionAreaList.CountKindNoFilter - 1; num >= 0; num--)
|
||||
{
|
||||
CardObject selectionAreaCard = SelectionAreaList.FindWithIndexNoFilter(num);
|
||||
int num2 = CountCardNumInSelectionArea(selectionAreaCard.CardId, isStrictSameCard: true);
|
||||
if (num2 <= 0)
|
||||
{
|
||||
RemoveFromSelectionAreaWithCount(selectionAreaCard, selectionAreaCard.TotalCardNum);
|
||||
}
|
||||
else
|
||||
{
|
||||
int possessionCardNum = FormatBehavior.GetPossessionCardNum(selectionAreaCard.CardId, _isSelectableSpotCard);
|
||||
bool flag = false;
|
||||
bool flag2 = false;
|
||||
bool flag3 = DeckCardEditUI.IsSelectableNonPossessionCard(CardMaster.GetInstance(FormatBehavior.CardMasterId).GetCardParameterFromId(selectionAreaCard.CardId));
|
||||
if (selectionAreaCard.IsNonPossessionCard)
|
||||
{
|
||||
if (flag3)
|
||||
{
|
||||
CardObject cardObject = SelectionAreaList.CardList.Find((CardObject c) => c.CardId == selectionAreaCard.CardId && !c.IsNonPossessionCard);
|
||||
if (num2 <= possessionCardNum)
|
||||
{
|
||||
if (cardObject != null)
|
||||
{
|
||||
flag = true;
|
||||
cardObject.MainCardNum += selectionAreaCard.TotalCardNum;
|
||||
}
|
||||
else
|
||||
{
|
||||
selectionAreaCard.IsNonPossessionCard = false;
|
||||
selectionAreaCard.AttachColorShader();
|
||||
}
|
||||
}
|
||||
else if (possessionCardNum > 0 && cardObject == null)
|
||||
{
|
||||
selectionAreaCard.IsNonPossessionCard = false;
|
||||
selectionAreaCard.AttachColorShader();
|
||||
flag2 = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
else if (flag3)
|
||||
{
|
||||
bool flag4 = SelectionAreaList.CardList.Any((CardObject c) => c.CardId == selectionAreaCard.CardId && c.IsNonPossessionCard);
|
||||
if (possessionCardNum == 0)
|
||||
{
|
||||
if (flag4)
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
selectionAreaCard.IsNonPossessionCard = true;
|
||||
selectionAreaCard.AttachGrayShader();
|
||||
}
|
||||
}
|
||||
else if (num2 > possessionCardNum && !flag4)
|
||||
{
|
||||
flag2 = true;
|
||||
}
|
||||
}
|
||||
else if (num2 > possessionCardNum)
|
||||
{
|
||||
RemoveFromSelectionAreaWithCount(selectionAreaCard, num2 - possessionCardNum);
|
||||
}
|
||||
if (flag)
|
||||
{
|
||||
RemoveFromSelectionAreaWithCount(selectionAreaCard, selectionAreaCard.TotalCardNum);
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateMainAndSubNumInSelectionArea(selectionAreaCard);
|
||||
if (flag2)
|
||||
{
|
||||
CardObject cardObject2 = SelectionAreaList.Insert(selectionAreaCard, dontCreate: false);
|
||||
cardObject2.AttachParent(_parentSelectionObj);
|
||||
SelectionAreaList.CountMainAndSubNum(selectionAreaCard.CardId, !selectionAreaCard.IsNonPossessionCard, out var mainNum, out var subNum);
|
||||
cardObject2.MainCardNum = mainNum;
|
||||
cardObject2.SubCardNum = subNum;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveFromSelectionAreaWithCount(CardObject card, int count)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
RemoveFromSelectionArea(card);
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void AccordCardInfoInPagingList()
|
||||
{
|
||||
bool flag = false;
|
||||
for (int i = 0; i < PagingList.CountKind; i++)
|
||||
{
|
||||
CardObject cardObject = PagingList.FindWithIndex(i);
|
||||
int selectableCardNum = GetSelectableCardNum(cardObject.CardId);
|
||||
flag = flag || selectableCardNum == 0;
|
||||
if (FormatBehavior.GetPossessionCardNum(cardObject.CardId, isIncludingSpotCard: false) == 0)
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
UpdatePagingCardInfoAll();
|
||||
if (flag)
|
||||
{
|
||||
InvalidateFilteredIdListCache();
|
||||
FetchPagingCard();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual int GetSelectableCardNum(int cardId)
|
||||
{
|
||||
return FormatBehavior.GetPossessionCardNum(cardId, _isSelectableSpotCard);
|
||||
}
|
||||
|
||||
private void UpdateMainAndSubNumInSelectionArea(CardObject card)
|
||||
{
|
||||
SelectionAreaList.CountMainAndSubNum(card.CardId, card.IsNonPossessionCard, out var mainNum, out var subNum);
|
||||
card.MainCardNum = mainNum;
|
||||
card.SubCardNum = subNum;
|
||||
}
|
||||
|
||||
public void UpdateMyRotationInfo(MyRotationInfo info, FilterController.MyRotationFilterType filter)
|
||||
{
|
||||
MyRotationInfo = info;
|
||||
MyRotationFilterType = filter;
|
||||
}
|
||||
}
|
||||
89
SVSim.BattleEngine/Engine/Wizard.DeckCardEdit/CardCreator.cs
Normal file
89
SVSim.BattleEngine/Engine/Wizard.DeckCardEdit/CardCreator.cs
Normal file
@@ -0,0 +1,89 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Cute;
|
||||
|
||||
namespace Wizard.DeckCardEdit;
|
||||
|
||||
public class CardCreator
|
||||
{
|
||||
private class Task
|
||||
{
|
||||
public List<int> Order;
|
||||
|
||||
public Action<List<UIBase_CardManager.CardObjData>> OnFinish;
|
||||
|
||||
public Task(List<int> order, Action<List<UIBase_CardManager.CardObjData>> onFinish)
|
||||
{
|
||||
Order = order;
|
||||
OnFinish = onFinish;
|
||||
}
|
||||
}
|
||||
|
||||
private const int QUEUE_CAPACITY = 8;
|
||||
|
||||
private bool _isBusy;
|
||||
|
||||
private List<Task> _taskQueue;
|
||||
|
||||
private CardMaster.CardMasterId _cardMasterId;
|
||||
|
||||
public event Action OnFinishedLatest;
|
||||
|
||||
public CardCreator()
|
||||
{
|
||||
_taskQueue = new List<Task>(8);
|
||||
}
|
||||
|
||||
public void Request(Func<List<int>> order, bool isPreferentially, Action<List<UIBase_CardManager.CardObjData>> onFinish, CardMaster.CardMasterId cardMasterId)
|
||||
{
|
||||
_cardMasterId = cardMasterId;
|
||||
if (isPreferentially)
|
||||
{
|
||||
_taskQueue.Insert(0, new Task(order(), onFinish));
|
||||
}
|
||||
else
|
||||
{
|
||||
_taskQueue.Add(new Task(order(), onFinish));
|
||||
}
|
||||
}
|
||||
|
||||
public void Tick()
|
||||
{
|
||||
if (!_isBusy)
|
||||
{
|
||||
StartCreate(Dequeue());
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
_taskQueue.Clear();
|
||||
}
|
||||
|
||||
private void StartCreate(Task task)
|
||||
{
|
||||
if (task != null)
|
||||
{
|
||||
_isBusy = true;
|
||||
Toolbox.ResourcesManager.CardListAssetPathList.Clear();
|
||||
UIManager.GetInstance().CardLoadSelect(null, task.Order, 0, is2D: true, delegate
|
||||
{
|
||||
task.OnFinish.Call(UIManager.GetInstance().getCardList2DObjs());
|
||||
UIManager.GetInstance().getCardList2DObjs().Clear();
|
||||
_isBusy = false;
|
||||
this.OnFinishedLatest.Call();
|
||||
}, isDefaultSleeve: false, _cardMasterId);
|
||||
}
|
||||
}
|
||||
|
||||
private Task Dequeue()
|
||||
{
|
||||
Task result = null;
|
||||
if (_taskQueue.Count > 0)
|
||||
{
|
||||
result = _taskQueue[0];
|
||||
_taskQueue.RemoveAt(0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
736
SVSim.BattleEngine/Engine/Wizard.DeckCardEdit/CardObject.cs
Normal file
736
SVSim.BattleEngine/Engine/Wizard.DeckCardEdit/CardObject.cs
Normal file
@@ -0,0 +1,736 @@
|
||||
using System;
|
||||
using Cute;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Wizard.DeckCardEdit;
|
||||
|
||||
public class CardObject
|
||||
{
|
||||
public class UseInfo
|
||||
{
|
||||
public GameObject Parent;
|
||||
|
||||
public UIWidget CardInfoObj;
|
||||
|
||||
public UILabel CardInfoText;
|
||||
|
||||
public CardListTemplate CardTemplateObj;
|
||||
|
||||
public GameObject BlackOut;
|
||||
|
||||
private const float ALPHA_TIME = 0.3f;
|
||||
|
||||
public UseInfo(GameObject parent, CardMaster.CardMasterId cardMasterId)
|
||||
{
|
||||
Parent = parent;
|
||||
CardInfoObj = parent.transform.Find("Info").GetComponent<UIWidget>();
|
||||
CardInfoText = CardInfoObj.transform.Find("Text").GetComponent<UILabel>();
|
||||
BlackOut = parent.transform.Find("BlackoutPanel").gameObject;
|
||||
CardTemplateObj = parent.transform.parent.gameObject.GetComponent<CardListTemplate>();
|
||||
CardInfoObj.alpha = 0f;
|
||||
BlackOut.gameObject.SetActive(value: false);
|
||||
CardTemplateObj.AttachShaders(cardMasterId);
|
||||
}
|
||||
|
||||
public void SetInfo(int haveNum, int haveNumWithFoil, int usedNum, int usedNumWithFoil, bool isMaintenance, int sameKindNumMax, CardMaster.CardMasterId cardMasterId)
|
||||
{
|
||||
if ((bool)CardInfoObj)
|
||||
{
|
||||
SystemText systemText = Data.SystemText;
|
||||
if (isMaintenance)
|
||||
{
|
||||
SetMaintenance();
|
||||
}
|
||||
else if (usedNumWithFoil <= 0)
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 0f);
|
||||
}
|
||||
else if (usedNumWithFoil < sameKindNumMax)
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 1f);
|
||||
CardInfoText.text = systemText.Get("Card_0071", usedNumWithFoil.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 1f);
|
||||
CardInfoText.text = systemText.Get("Card_0072", sameKindNumMax.ToString());
|
||||
}
|
||||
if (haveNum <= 0)
|
||||
{
|
||||
CardTemplateObj.AttachGrayShader();
|
||||
}
|
||||
else
|
||||
{
|
||||
CardTemplateObj.AttachShaders(cardMasterId);
|
||||
}
|
||||
BlackOut.gameObject.SetActive(haveNum > 0 && (usedNumWithFoil >= Mathf.Min(sameKindNumMax, haveNumWithFoil) || usedNum >= haveNum || isMaintenance));
|
||||
}
|
||||
}
|
||||
|
||||
public void SetInfoDestruct(int haveNum, int destructNum, bool isMaintenance, bool isOnlySpotCard, CardMaster.CardMasterId cardMasterId)
|
||||
{
|
||||
if ((bool)CardInfoObj)
|
||||
{
|
||||
SystemText systemText = Data.SystemText;
|
||||
if (isMaintenance)
|
||||
{
|
||||
SetMaintenance();
|
||||
}
|
||||
else if (destructNum <= 0)
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 0f);
|
||||
}
|
||||
else if (destructNum < haveNum)
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 1f);
|
||||
CardInfoText.text = systemText.Get("Card_0169", destructNum.ToString());
|
||||
}
|
||||
else if (!isOnlySpotCard)
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 1f);
|
||||
CardInfoText.text = systemText.Get("Card_0170", destructNum.ToString());
|
||||
}
|
||||
if (haveNum <= 0 && !isOnlySpotCard)
|
||||
{
|
||||
CardTemplateObj.AttachGrayShader();
|
||||
}
|
||||
else
|
||||
{
|
||||
CardTemplateObj.AttachShaders(cardMasterId);
|
||||
}
|
||||
BlackOut.gameObject.SetActive((haveNum > 0 && (destructNum >= haveNum || isMaintenance)) || isOnlySpotCard);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetMaintenance()
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 1f);
|
||||
CardInfoText.text = Data.SystemText.Get("System_0022");
|
||||
}
|
||||
|
||||
public void SetBanCard()
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 1f);
|
||||
CardTemplateObj.AttachRedMaterial();
|
||||
CardInfoText.text = Data.SystemText.Get("Card_0189");
|
||||
}
|
||||
|
||||
public void UpdateSameKindNumMaxCard(bool isOverNum, CardMaster.CardMasterId cardMasterId, bool isNonPossessionCard)
|
||||
{
|
||||
if (isOverNum)
|
||||
{
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 1f);
|
||||
CardTemplateObj.AttachRedMaterial();
|
||||
CardInfoText.text = Data.SystemText.Get("Card_0190");
|
||||
return;
|
||||
}
|
||||
TweenAlpha.Begin(CardInfoObj.gameObject, 0.3f, 0f);
|
||||
if (isNonPossessionCard)
|
||||
{
|
||||
CardTemplateObj.AttachGrayShader();
|
||||
}
|
||||
else
|
||||
{
|
||||
CardTemplateObj.AttachShaders(cardMasterId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private const float FADE_DURATION = 0.18f;
|
||||
|
||||
private const float ROTATE_DURATION = 0.125f;
|
||||
|
||||
private const float SCALE_DURATION = 0.1f;
|
||||
|
||||
private const float SELECT_SCALE = 1.2f;
|
||||
|
||||
private const float EFFECT_SCALE = 500f;
|
||||
|
||||
private const float EFFECT_Z = -1f;
|
||||
|
||||
public const string EFFECT_CHAR_PATH = "cmn_frame_card_1";
|
||||
|
||||
public const string EFFECT_SPELL_PATH = "cmn_frame_card_3";
|
||||
|
||||
public const string EFFECT_FIELD_PATH = "cmn_frame_card_2";
|
||||
|
||||
private static readonly Vector3 SLEEVE_POSITION = new Vector3(0f, -0.5f, 0f);
|
||||
|
||||
private static readonly Vector3 SLEEVE_SCALE = new Vector3(1.025f, 1.025f, 1f);
|
||||
|
||||
private Transform _parent;
|
||||
|
||||
private GameObject _sleeveParent;
|
||||
|
||||
private UITexture _sleeve;
|
||||
|
||||
private UseInfo _info;
|
||||
|
||||
private GameObject _cursorEffect;
|
||||
|
||||
private float _cardScale;
|
||||
|
||||
private readonly IFormatBehavior _formatBehavior;
|
||||
|
||||
private UIBase_CardManager.CardObjData BaseCard { get; set; }
|
||||
|
||||
public bool IsAttachedCardObjData => BaseCard.Cost != null;
|
||||
|
||||
public GameObject CardObj
|
||||
{
|
||||
get
|
||||
{
|
||||
return BaseCard.CardObj;
|
||||
}
|
||||
set
|
||||
{
|
||||
BaseCard.CardObj = value;
|
||||
AttachParent(_parent);
|
||||
}
|
||||
}
|
||||
|
||||
public int MainCardNum
|
||||
{
|
||||
get
|
||||
{
|
||||
return BaseCard.mainCardNum;
|
||||
}
|
||||
set
|
||||
{
|
||||
BaseCard.mainCardNum = value;
|
||||
UpdateCardNumLabel();
|
||||
}
|
||||
}
|
||||
|
||||
public int SubCardNum
|
||||
{
|
||||
get
|
||||
{
|
||||
return BaseCard.subCardNum;
|
||||
}
|
||||
set
|
||||
{
|
||||
BaseCard.subCardNum = value;
|
||||
UpdateCardNumLabel();
|
||||
}
|
||||
}
|
||||
|
||||
public int TotalCardNum => BaseCard.TotalCardNum;
|
||||
|
||||
public int CardId
|
||||
{
|
||||
get
|
||||
{
|
||||
return BaseCard.ids;
|
||||
}
|
||||
set
|
||||
{
|
||||
BaseCard.ids = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsVisibleSleeve { get; private set; }
|
||||
|
||||
public bool IsWaitingRotateAnimation { get; private set; }
|
||||
|
||||
public bool IsVisibleCursorEffect
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_cursorEffect != null)
|
||||
{
|
||||
return _cursorEffect.activeSelf;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsDisplaySpotCardNum { get; set; }
|
||||
|
||||
public bool IsHideZeroSpotCardNum { get; set; }
|
||||
|
||||
public bool IsNonPossessionCard { get; set; }
|
||||
|
||||
public CardObject(UIBase_CardManager.CardObjData card, Transform parent, float scale, IFormatBehavior formatBehavior, bool isDisplaySpotCardNum = false, bool isHideZeroSpotCardNum = false, bool isNonPossessionCard = false)
|
||||
{
|
||||
_formatBehavior = formatBehavior;
|
||||
_cardScale = scale;
|
||||
IsDisplaySpotCardNum = isDisplaySpotCardNum && !isNonPossessionCard;
|
||||
IsHideZeroSpotCardNum = isHideZeroSpotCardNum;
|
||||
IsNonPossessionCard = isNonPossessionCard;
|
||||
AttachParent(parent);
|
||||
AttachCardObjData(card);
|
||||
}
|
||||
|
||||
public CardObject(Transform parent, float scale, IFormatBehavior formatBehavior, bool isDisplaySpotCardNum = false, bool isHideZeroSpotCardNum = false, bool isNonPossessionCard = false)
|
||||
{
|
||||
_formatBehavior = formatBehavior;
|
||||
_cardScale = scale;
|
||||
IsDisplaySpotCardNum = isDisplaySpotCardNum && !isNonPossessionCard;
|
||||
IsHideZeroSpotCardNum = isHideZeroSpotCardNum;
|
||||
IsNonPossessionCard = isNonPossessionCard;
|
||||
AttachParent(parent);
|
||||
AttachCardObjData(new UIBase_CardManager.CardObjData());
|
||||
}
|
||||
|
||||
public void UpdateCardNumLabel()
|
||||
{
|
||||
if (BaseCard.CardObj != null)
|
||||
{
|
||||
CardListTemplate component = BaseCard.CardObj.GetComponent<CardListTemplate>();
|
||||
if ((bool)component)
|
||||
{
|
||||
component.IsIncludingSpotCard = IsIncludingSpotCard();
|
||||
component.SetNum(BaseCard.mainCardNum, BaseCard.subCardNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsIncludingSpotCard()
|
||||
{
|
||||
if (IsDisplaySpotCardNum && GameMgr.GetIns().GetDataMgr().SpotCardData.ExistsSpotCard(BaseCard.ids))
|
||||
{
|
||||
if (IsHideZeroSpotCardNum)
|
||||
{
|
||||
return BaseCard.subCardNum > 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void AttachParent(Transform parent)
|
||||
{
|
||||
_parent = parent;
|
||||
if (BaseCard != null)
|
||||
{
|
||||
AttachCardObjData(BaseCard);
|
||||
}
|
||||
}
|
||||
|
||||
public void AttachCardObjData(UIBase_CardManager.CardObjData card)
|
||||
{
|
||||
BaseCard = card;
|
||||
if (BaseCard.CardObj != null)
|
||||
{
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
if (_sleeve != null)
|
||||
{
|
||||
width = _sleeve.width;
|
||||
height = _sleeve.height;
|
||||
}
|
||||
bool activeSelf = BaseCard.CardObj.activeSelf;
|
||||
BaseCard.CardObj.transform.parent = _parent;
|
||||
BaseCard.CardObj.SetActive(!activeSelf);
|
||||
BaseCard.CardObj.SetActive(activeSelf);
|
||||
BaseCard.CardObj.transform.localScale = Vector3.one * _cardScale;
|
||||
if (_sleeveParent != null)
|
||||
{
|
||||
_sleeveParent.transform.parent = BaseCard.CardObj.transform;
|
||||
_sleeveParent.transform.localPosition = Vector3.zero;
|
||||
_sleeveParent.transform.localScale = Vector3.one;
|
||||
}
|
||||
if (_sleeve != null)
|
||||
{
|
||||
_sleeve.MakePixelPerfect();
|
||||
_sleeve.width = width;
|
||||
_sleeve.height = height;
|
||||
_sleeve.transform.localPosition = SLEEVE_POSITION;
|
||||
_sleeve.transform.localScale = SLEEVE_SCALE;
|
||||
}
|
||||
CardListTemplate component = BaseCard.CardObj.GetComponent<CardListTemplate>();
|
||||
component.SetId(card.ids);
|
||||
component.IsIncludingSpotCard = IsIncludingSpotCard();
|
||||
component.ChangeShowNumType(isNormal: false);
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowSleeve(UITexture original)
|
||||
{
|
||||
if (_sleeve == null)
|
||||
{
|
||||
_sleeveParent = (BaseCard.CardObj = new GameObject());
|
||||
_sleeveParent.name = "SleeveParent";
|
||||
Transform transform = _sleeveParent.transform;
|
||||
transform.parent = _parent;
|
||||
transform.localScale = Vector3.one;
|
||||
transform.localRotation = Quaternion.identity;
|
||||
_sleeve = UnityEngine.Object.Instantiate(original);
|
||||
_sleeve.name = "Sleeve";
|
||||
Transform transform2 = _sleeve.transform;
|
||||
transform2.parent = _sleeveParent.transform;
|
||||
transform2.localPosition = SLEEVE_POSITION;
|
||||
transform2.localScale = SLEEVE_SCALE * _cardScale;
|
||||
transform2.localRotation = Quaternion.identity;
|
||||
}
|
||||
_sleeve.gameObject.SetActive(value: true);
|
||||
_sleeve.alpha = 0f;
|
||||
BaseCard.CardObj.transform.parent = _parent;
|
||||
TweenAlpha.Begin(BaseCard.CardObj, 0.18f, 1f);
|
||||
IsVisibleSleeve = true;
|
||||
}
|
||||
|
||||
public void TakeOffSleeve()
|
||||
{
|
||||
if (_sleeve != null)
|
||||
{
|
||||
_sleeve.gameObject.SetActive(value: false);
|
||||
}
|
||||
ActiveCullObjs(isActive: true);
|
||||
IsVisibleSleeve = false;
|
||||
}
|
||||
|
||||
public void CompleteSleeveTweenAlpha()
|
||||
{
|
||||
if (!(_sleeve == null))
|
||||
{
|
||||
TweenAlpha component = _sleeve.transform.parent.GetComponent<TweenAlpha>();
|
||||
if (!(component == null) && component.enabled)
|
||||
{
|
||||
component.value = component.to;
|
||||
component.enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ActiveCullObjs(bool isActive)
|
||||
{
|
||||
if ((bool)BaseCard.CardObj)
|
||||
{
|
||||
CardListTemplate component = BaseCard.CardObj.GetComponent<CardListTemplate>();
|
||||
if ((bool)component)
|
||||
{
|
||||
component.SetFace(isActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RotateAnim(Action<CardObject> on90Degree = null, Action<CardObject> onFinish = null)
|
||||
{
|
||||
if (!BaseCard.CardObj)
|
||||
{
|
||||
return;
|
||||
}
|
||||
IsWaitingRotateAnimation = true;
|
||||
TweenRotation tween = TweenRotation.Begin(BaseCard.CardObj, 0.125f, Quaternion.AngleAxis(90f, Vector3.up));
|
||||
EventDelegate ev = null;
|
||||
ev = new EventDelegate(delegate
|
||||
{
|
||||
tween.RemoveOnFinished(ev);
|
||||
on90Degree.Call(this);
|
||||
if ((bool)BaseCard.CardObj)
|
||||
{
|
||||
tween = TweenRotation.Begin(BaseCard.CardObj, 0.125f, Quaternion.AngleAxis(0f, Vector3.up));
|
||||
ev = new EventDelegate(delegate
|
||||
{
|
||||
tween.RemoveOnFinished(ev);
|
||||
onFinish.Call(this);
|
||||
IsWaitingRotateAnimation = false;
|
||||
});
|
||||
tween.AddOnFinished(ev);
|
||||
}
|
||||
});
|
||||
tween.AddOnFinished(ev);
|
||||
}
|
||||
|
||||
public void NotifyRotateAnimation()
|
||||
{
|
||||
IsWaitingRotateAnimation = true;
|
||||
}
|
||||
|
||||
private GameObject CreateCardInfo(GameObject original)
|
||||
{
|
||||
GameObject gameObject = UnityEngine.Object.Instantiate(original);
|
||||
gameObject.name = "CardInfo";
|
||||
gameObject.gameObject.SetActive(value: true);
|
||||
Vector3 localPosition = gameObject.transform.localPosition;
|
||||
gameObject.transform.parent = BaseCard.CardObj.transform;
|
||||
gameObject.transform.localPosition = localPosition;
|
||||
gameObject.transform.localRotation = Quaternion.identity;
|
||||
gameObject.transform.localScale = Vector3.one;
|
||||
return gameObject;
|
||||
}
|
||||
|
||||
private void PrepareCardInfo(GameObject originalCardInfo)
|
||||
{
|
||||
if (_info == null && !(originalCardInfo == null))
|
||||
{
|
||||
GameObject parent = CreateCardInfo(originalCardInfo);
|
||||
_info = new UseInfo(parent, _formatBehavior.CardMasterId);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateCardInfo(GameObject original, int haveNum, int haveNumWithFoil, int usedNum, int usedNumWithFoil, int sameKindNumMax, bool isMaintenance)
|
||||
{
|
||||
DataMgr dataMgr = GameMgr.GetIns().GetDataMgr();
|
||||
MainCardNum = Mathf.Max(_formatBehavior.GetPossessionCardNum(BaseCard.ids, isIncludingSpotCard: false) - usedNum, 0);
|
||||
SubCardNum = Mathf.Max(Mathf.Min(haveNum - usedNum, dataMgr.SpotCardData.GetSpotCardNum(BaseCard.ids)), 0);
|
||||
PrepareCardInfo(original);
|
||||
_info.SetInfo(haveNum, haveNumWithFoil, usedNum, usedNumWithFoil, isMaintenance, sameKindNumMax, _formatBehavior.CardMasterId);
|
||||
VisibleCardNumLabel(haveNum > 0);
|
||||
}
|
||||
|
||||
public void UpdateCardInfoDestruct(GameObject original, int haveNum, int destructNum, bool isMaintenance, bool isOnlySpotCard)
|
||||
{
|
||||
MainCardNum = haveNum - destructNum;
|
||||
SubCardNum = GameMgr.GetIns().GetDataMgr().SpotCardData.GetSpotCardNum(BaseCard.ids);
|
||||
PrepareCardInfo(original);
|
||||
_info.SetInfoDestruct(haveNum, destructNum, isMaintenance, isOnlySpotCard, _formatBehavior.CardMasterId);
|
||||
VisibleCardNumLabel(haveNum > 0 || isOnlySpotCard);
|
||||
}
|
||||
|
||||
public void SetCardToMaintenance(GameObject original)
|
||||
{
|
||||
PrepareCardInfo(original);
|
||||
_info.SetMaintenance();
|
||||
}
|
||||
|
||||
public void SetCardToBanCard(GameObject original = null)
|
||||
{
|
||||
PrepareCardInfo(original);
|
||||
_info.SetBanCard();
|
||||
}
|
||||
|
||||
public void UpdateSameKindNumMaxCard(bool isOverNum, GameObject original = null)
|
||||
{
|
||||
PrepareCardInfo(original);
|
||||
_info.UpdateSameKindNumMaxCard(isOverNum, _formatBehavior.CardMasterId, IsNonPossessionCard);
|
||||
}
|
||||
|
||||
public void ActiveCardInfo(bool isActive)
|
||||
{
|
||||
if (_info != null)
|
||||
{
|
||||
_info.Parent.SetActive(isActive);
|
||||
}
|
||||
}
|
||||
|
||||
public void EnableAlpha(bool isEnable)
|
||||
{
|
||||
if (BaseCard != null && !(BaseCard.CardObj == null))
|
||||
{
|
||||
if (isEnable)
|
||||
{
|
||||
UITexture cardTexture = BaseCard.CardObj.GetComponent<CardListTemplate>()._cardTexture;
|
||||
Texture mainTexture = cardTexture.material.mainTexture;
|
||||
cardTexture.mainTexture = mainTexture;
|
||||
cardTexture.material = null;
|
||||
cardTexture.depth = -1;
|
||||
cardTexture.Invalidate(includeChildren: false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ResetMaterial();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetMaterial()
|
||||
{
|
||||
if (BaseCard != null && !(BaseCard.CardObj == null))
|
||||
{
|
||||
CardListTemplate component = BaseCard.CardObj.GetComponent<CardListTemplate>();
|
||||
if (!(component == null))
|
||||
{
|
||||
CardParameter cardParameterFromId = CardMaster.GetInstance(_formatBehavior.CardMasterId).GetCardParameterFromId(CardId);
|
||||
CardParameter cardParameterFromId2 = CardMaster.GetInstance(_formatBehavior.CardMasterId).GetCardParameterFromId(BaseCard.ids);
|
||||
ResourcesManager.AssetLoadPathType type = ((cardParameterFromId.CharType == CardBasePrm.CharaType.NORMAL) ? ResourcesManager.AssetLoadPathType.UnitCardMaterial : ResourcesManager.AssetLoadPathType.SpellCardMaterial);
|
||||
Material material = Toolbox.ResourcesManager.FindCardMaterial(cardParameterFromId2.ResourceCardId, type);
|
||||
component._cardTexture.mainTexture = null;
|
||||
component._cardTexture.material = material;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void VisibleCardNumLabel(bool isVisible)
|
||||
{
|
||||
CardListTemplate component = CardObj.GetComponent<CardListTemplate>();
|
||||
if ((bool)component)
|
||||
{
|
||||
if (isVisible)
|
||||
{
|
||||
component.ShowNum();
|
||||
}
|
||||
else
|
||||
{
|
||||
component.HideNum();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void CreateCursorEffect()
|
||||
{
|
||||
if (BaseCard != null && BaseCard.CardObj != null)
|
||||
{
|
||||
string path = "cmn_frame_card_1";
|
||||
switch (BaseCard.cardType)
|
||||
{
|
||||
case CardBasePrm.CharaType.SPELL:
|
||||
path = "cmn_frame_card_3";
|
||||
break;
|
||||
case CardBasePrm.CharaType.FIELD:
|
||||
case CardBasePrm.CharaType.CHANT_FIELD:
|
||||
path = "cmn_frame_card_2";
|
||||
break;
|
||||
}
|
||||
_cursorEffect = UnityEngine.Object.Instantiate(Toolbox.ResourcesManager.LoadObject<GameObject>(Toolbox.ResourcesManager.GetAssetTypePath(path, ResourcesManager.AssetLoadPathType.Effect2D, isfetch: true)));
|
||||
MotionUtils.ChangeParticleSystemColor(_cursorEffect, Color.cyan);
|
||||
_cursorEffect.transform.parent = BaseCard.CardObj.transform;
|
||||
_cursorEffect.transform.localPosition = Vector3.forward * -1f;
|
||||
_cursorEffect.transform.localRotation = Quaternion.identity;
|
||||
_cursorEffect.transform.localScale = Vector3.one * 500f;
|
||||
_cursorEffect.layer = BaseCard.CardObj.layer;
|
||||
Transform[] componentsInChildren = _cursorEffect.GetComponentsInChildren<Transform>();
|
||||
for (int i = 0; i < componentsInChildren.Length; i++)
|
||||
{
|
||||
componentsInChildren[i].gameObject.layer = BaseCard.CardObj.layer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ChangeSelectingState(bool isSelect)
|
||||
{
|
||||
if (BaseCard != null && BaseCard.CardObj != null)
|
||||
{
|
||||
if (_cursorEffect == null)
|
||||
{
|
||||
CreateCursorEffect();
|
||||
}
|
||||
ActiveCursorEffect(isSelect);
|
||||
Vector3 scale = Vector3.one * (isSelect ? (_cardScale * 1.2f) : _cardScale);
|
||||
TweenScale.Begin(BaseCard.CardObj, 0.1f, scale);
|
||||
}
|
||||
}
|
||||
|
||||
public void ActiveCursorEffect(bool isActive)
|
||||
{
|
||||
if (_cursorEffect != null)
|
||||
{
|
||||
_cursorEffect.SetActive(isActive);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetScale(float scale)
|
||||
{
|
||||
_cardScale = scale;
|
||||
if (CardObj != null)
|
||||
{
|
||||
TweenScale component = CardObj.GetComponent<TweenScale>();
|
||||
if (component != null)
|
||||
{
|
||||
component.enabled = false;
|
||||
}
|
||||
CardObj.transform.localScale = Vector3.one * _cardScale;
|
||||
}
|
||||
}
|
||||
|
||||
public CardObject Clone(Transform parent = null)
|
||||
{
|
||||
if (parent == null)
|
||||
{
|
||||
parent = _parent;
|
||||
}
|
||||
UIBase_CardManager.CardObjData cardObjData = new UIBase_CardManager.CardObjData();
|
||||
UIBase_CardManager.cardDataCopy(cardObjData, BaseCard);
|
||||
return new CardObject(cardObjData, parent, _cardScale, _formatBehavior, IsDisplaySpotCardNum, IsHideZeroSpotCardNum, IsNonPossessionCard);
|
||||
}
|
||||
|
||||
public void Destroy(bool isRemoveAsset = true)
|
||||
{
|
||||
UnityEngine.Object.Destroy(CardObj);
|
||||
if (_info != null && (bool)_info.Parent)
|
||||
{
|
||||
UnityEngine.Object.Destroy(_info.Parent);
|
||||
}
|
||||
if (isRemoveAsset)
|
||||
{
|
||||
CardParameter cardParameterFromId = CardMaster.GetInstance(_formatBehavior.CardMasterId).GetCardParameterFromId(CardId);
|
||||
Toolbox.ResourcesManager.RemoveAsset(Toolbox.ResourcesManager.GetAssetTypePath(cardParameterFromId.ResourceCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial));
|
||||
if (cardParameterFromId.IsFoil)
|
||||
{
|
||||
int normalCardId = cardParameterFromId.NormalCardId;
|
||||
Toolbox.ResourcesManager.RemoveAsset(Toolbox.ResourcesManager.GetAssetTypePath(normalCardId.ToString(), ResourcesManager.AssetLoadPathType.UnitCardMaterial));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DestroySleeve()
|
||||
{
|
||||
if (_sleeveParent != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(_sleeveParent);
|
||||
}
|
||||
}
|
||||
|
||||
public void DestroyUseInfo()
|
||||
{
|
||||
if (_info != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(_info.Parent);
|
||||
_info = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void DestroyCursorEffect()
|
||||
{
|
||||
if (_cursorEffect != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(_cursorEffect);
|
||||
}
|
||||
}
|
||||
|
||||
public void DestroyTween()
|
||||
{
|
||||
if (BaseCard != null && BaseCard.CardObj != null)
|
||||
{
|
||||
TweenAlpha component = BaseCard.CardObj.GetComponent<TweenAlpha>();
|
||||
if (component != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(component);
|
||||
}
|
||||
TweenRotation component2 = BaseCard.CardObj.GetComponent<TweenRotation>();
|
||||
if (component2 != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(component2);
|
||||
}
|
||||
BaseCard.CardObj.transform.localRotation = Quaternion.identity;
|
||||
}
|
||||
}
|
||||
|
||||
public void AttachColorShader()
|
||||
{
|
||||
CardListTemplate component = CardObj.GetComponent<CardListTemplate>();
|
||||
if (!(component == null))
|
||||
{
|
||||
component.AttachShaders(_formatBehavior.CardMasterId);
|
||||
}
|
||||
}
|
||||
|
||||
public void AttachGrayShader()
|
||||
{
|
||||
CardListTemplate component = CardObj.GetComponent<CardListTemplate>();
|
||||
if (!(component == null))
|
||||
{
|
||||
component.AttachGrayShader();
|
||||
}
|
||||
}
|
||||
|
||||
public void AttachNormalShaderRotationOnlyIcon()
|
||||
{
|
||||
CardListTemplate component = CardObj.GetComponent<CardListTemplate>();
|
||||
if (!(component == null))
|
||||
{
|
||||
component.AttachNormalShaderRotationOnlyIcon();
|
||||
}
|
||||
}
|
||||
|
||||
public void AttachRedShader()
|
||||
{
|
||||
CardListTemplate component = CardObj.GetComponent<CardListTemplate>();
|
||||
if (!(component == null))
|
||||
{
|
||||
component.AttachRedMaterial();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cute;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Wizard.DeckCardEdit;
|
||||
|
||||
public class FilteringCardBundle : CardBundle
|
||||
{
|
||||
private UIBase_CardManager.FilterParameter _filter;
|
||||
|
||||
private List<CardObject> _filteringList;
|
||||
|
||||
public override int CountKind => _filteringList.Count;
|
||||
|
||||
public int CountKindNoFilter => base.CountKind;
|
||||
|
||||
public FilteringCardBundle(CardCreator cardCreator, Transform parent, UITexture sleeveOriginal, float scale, IFormatBehavior formatBehavior, bool isDisplaySpotCardNum, bool isHideZeroSpotCardNum, bool canUseNonPossessionCard)
|
||||
: base(cardCreator, parent, sleeveOriginal, scale, formatBehavior, isDisplaySpotCardNum, isHideZeroSpotCardNum, canUseNonPossessionCard)
|
||||
{
|
||||
_filter = new UIBase_CardManager.FilterParameter();
|
||||
_filteringList = new List<CardObject>();
|
||||
}
|
||||
|
||||
public void ApplyFilter(UIBase_CardManager.FilterParameter filter)
|
||||
{
|
||||
_filter = filter;
|
||||
List<int> idList = UIManager.GetInstance().getUIBase_CardManager().SelectCardIDInConditionMask(base.IdList.Distinct().ToList(), filter, base.FormatBehavior, null)
|
||||
.ToList();
|
||||
_cardList.ForEach(delegate(CardObject card)
|
||||
{
|
||||
card.CardObj.SetActive(value: false);
|
||||
});
|
||||
_filteringList = new List<CardObject>();
|
||||
_cardList.ForEach(delegate(CardObject card)
|
||||
{
|
||||
if (idList.Contains(card.CardId))
|
||||
{
|
||||
_filteringList.Add(card);
|
||||
card.CardObj.SetActive(value: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
card.CardObj.transform.localPosition = Vector3.zero;
|
||||
card.CardObj.SetActive(value: false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public override CardObject FindWithIndex(int idx)
|
||||
{
|
||||
if (idx < 0 || idx >= _filteringList.Count)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return _filteringList[idx];
|
||||
}
|
||||
|
||||
public CardObject FindWithIndexNoFilter(int idx)
|
||||
{
|
||||
return base.FindWithIndex(idx);
|
||||
}
|
||||
|
||||
public override int IndexOf(CardObject card)
|
||||
{
|
||||
return _filteringList.IndexOf(card);
|
||||
}
|
||||
|
||||
public override bool CreateCards(List<int> idList, bool isDestroyImmediate, bool isRotate, Action onCreateSleeves = null, Action onFinish = null, Action onFirstAnimationFinish = null, float cardRotateDelayTimeMax = float.MaxValue, bool isSkipSameDeckCheck = false)
|
||||
{
|
||||
return base.CreateCards(idList, isDestroyImmediate, isRotate, delegate
|
||||
{
|
||||
ApplyFilter(_filter);
|
||||
onCreateSleeves.Call();
|
||||
}, onFinish, onFirstAnimationFinish, cardRotateDelayTimeMax, isSkipSameDeckCheck);
|
||||
}
|
||||
|
||||
public override CardObject Insert(CardObject card, bool dontCreate)
|
||||
{
|
||||
CardObject result = base.Insert(card, dontCreate);
|
||||
ApplyFilter(_filter);
|
||||
return result;
|
||||
}
|
||||
|
||||
public override CardObject Remove(CardObject card, bool isDestroyObject)
|
||||
{
|
||||
CardObject result = base.Remove(card, isDestroyObject);
|
||||
ApplyFilter(_filter);
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void DestroyAll()
|
||||
{
|
||||
base.DestroyAll();
|
||||
_filteringList.Clear();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user