using System.Collections.Generic; using System.Linq; using DG.Tweening; using BingoBrain.Core; using BingoBrain.HotFix; using Spine.Unity; using UnityEngine; namespace BingoBrain { public class CardBoardEntity { public GameCell GoCell = new(); public CardBoardData data = new(); public List cardList = new(); public bool isFinish; public bool isBingoing; public SkeletonAnimation bingGoSke; private ParticleSystem[] idleSys = new ParticleSystem[3]; private ParticleSystem[] enterSys = new ParticleSystem[3]; private ParticleSystem exitSys; private Vector3 originPos = new(-3.38f, 2.96f); private float offset = 1.685f; private Transform finishMask; private List needShowBingoList = new(); private Gsss showBingoSequence = new(); private bool isDelayCheckBingo; public List bingoedList = new(); public void SetData() { InitGameObj(); InitCardList(); InitReward(); } void InitReward() { var coinCount = Random.Range(BingoCell.MinCoinCount, BingoCell.MaxCoinCount + 1); var cashCount = Random.Range(BingoCell.MinCashCount, BingoCell.MaxCashCount + 1); var list = GlobalHarmony.GetRandomList( cardList.FindAll(tmp => !tmp.data.isSelect && !tmp.data.isCoin && tmp.data.type == CardPropType.none), coinCount); if (list != null) { foreach (var card in list) { card.data.type = CardPropType.coin; } } list = GlobalHarmony.GetRandomList( cardList.FindAll(tmp => !tmp.data.isSelect && !tmp.data.isCoin && tmp.data.type == CardPropType.none), cashCount); if (list != null) { foreach (var card in list) { card.data.type = CardPropType.cash; } } foreach (var card in cardList) { card.SetReward(); } } private void InitGameObj() { if (GoCell.gameObject == null) { GoCell.InitByPath("Prefab.Game.Card", "CardBoard", () => { GoCell.transform.SetParent(BingoCell.root, false); GoCell.gameObject.SetActive(false); finishMask = GoCell.transform.Find("Finish"); DoSomething(); }); } else { DoSomething(); } } private void DoSomething() { if (!bingGoSke) { FX.Instance.GetFx(Fx_Type.spine_bingo, sk => { bingGoSke = sk; bingGoSke.transform.SetParent(GoCell.transform); bingGoSke.transform.localPosition = Vector3.zero; idleSys[0] = bingGoSke.transform.Find("fx_lizi_idle01").GetComponent(); idleSys[1] = bingGoSke.transform.Find("fx_lizi_idle02").GetComponent(); idleSys[2] = bingGoSke.transform.Find("fx_lizi_idle03").GetComponent(); enterSys[0] = bingGoSke.transform.Find("fx_lizi_enter01").GetComponent(); enterSys[1] = bingGoSke.transform.Find("fx_lizi_enter02").GetComponent(); enterSys[2] = bingGoSke.transform.Find("fx_lizi_enter03").GetComponent(); for (var i = 0; i < 3; i++) { idleSys[i].gameObject.SetActive(false); enterSys[i].gameObject.SetActive(false); } exitSys = bingGoSke.transform.Find("fx_lizi_exit").GetComponent(); bingGoSke.gameObject.SetActive(false); GoCell.gameObject.SetActive(true); finishMask.gameObject.SetActive(false); }); } else { bingGoSke.gameObject.SetActive(false); GoCell.gameObject.SetActive(true); finishMask.gameObject.SetActive(false); } } private void InitCardList() { var index = 0; var isFirst = cardList.Count == 0; foreach (var cardData in data.cardNumList) { CardEntity cardEntity; if (isFirst) { cardEntity = new CardEntity(); cardEntity.InitGameObj(() => { cardEntity.data.index = index; cardEntity.data.cardBoard = this; cardList.Add(cardEntity); SetByIndex(cardEntity.Game.transform, index); cardEntity.Game.transform.SetParent(GoCell.transform, false); index++; cardEntity.data.isSelect = false; cardEntity.data.isCoin = false; cardEntity.data.isDelaySelect = false; cardEntity.data.type = CardPropType.none; cardEntity.data.num = cardData; cardEntity.SetByData(); }); } else { cardEntity = cardList[index]; cardEntity.InitGameObj(() => { cardEntity.data.isSelect = false; cardEntity.data.isCoin = false; cardEntity.data.isDelaySelect = false; cardEntity.data.type = CardPropType.none; cardEntity.data.num = cardData; cardEntity.SetByData(); }); index++; } if (index == data.cardNumList.Count) { finishMask.SetAsLastSibling(); } } } private void SetByIndex(Transform gameObjTransform, int index) { if (gameObjTransform != null) { gameObjTransform.localPosition = originPos + new Vector3(index / BingoCell.bingoCount * offset, index % BingoCell.bingoCount * -offset); } else { Debug.Log("[ BingoBrain ] gameObjTransform is null"); } } public void OnReset() { needShowBingoList.Clear(); bingoedList.Clear(); data.selectList.Clear(); data.cardNumList.Clear(); isBingoing = false; isFinish = false; foreach (var card in cardList) { card.OnReset(); } for (var i = 0; i < 3; i++) { idleSys[i].gameObject.SetActive(false); enterSys[i].gameObject.SetActive(false); } exitSys.gameObject.SetActive(false); showBingoSequence?.Cancel(); } public void DelayCheckBingo() { if (BingoCell.isProcedure) { isDelayCheckBingo = true; } else { CheckBingo(); } } public void CheckBingo() { if (BingoCell.isProcedure) { return; } if (BingoCell.bingoCardboardIndex != -1 && BingoCell.bingoCardboardIndex != data.index) { return; } var bingoType = IsBingo(data.selectList); while (bingoType != -1) { BingoCell.bingoCardboardIndex = data.index; isBingoing = true; bingoedList.Add(bingoType); PreferencesMgr.Instance.BingoSum += 1; needShowBingoList.Add(bingoType); bingoType = IsBingo(data.selectList); } showBingoSequence = new Gsss(); if (needShowBingoList.Count != 0) { showBingoSequence.Add(obj => { var delay = 0.2f; foreach (var tmpType in needShowBingoList) { var count = BingoCell.bingoDic[tmpType].Count; for (var j = 0; j < count; j++) { var index = BingoCell.bingoDic[tmpType][j]; if (cardList[index].data.isCoin) { continue; } cardList[index].SetCoin(delay); } } DOVirtual.DelayedCall(delay, obj.InvokeComplete).SetAutoKill(); }); showBingoSequence.Add((obj) => { Audio.Instance.PlayDynamicEffect("Bingo"); int bingoingNumber = Mathf.Clamp(bingoedList.Count, 0, 3); NAAVsa.SetSkin(bingGoSke, "default"); this.bingGoSke.gameObject.SetActive(true); switch (bingoingNumber) { case 1: this.bingGoSke.state.SetAnimation(0, "single", false); break; case 2: this.bingGoSke.state.SetAnimation(0, "double", false); break; case 3: this.bingGoSke.state.SetAnimation(0, "multiple", false); break; } enterSys[bingoingNumber - 1].gameObject.SetActive(true); idleSys[bingoingNumber - 1].gameObject.SetActive(true); finishMask.gameObject.SetActive(true); if (bingoedList.Count >= 3 && !isDelayCheckBingo) { DOVirtual.DelayedCall(1.8f, () => { NAAVsa.SetSkin(bingGoSke, "default"); idleSys[bingoingNumber - 1].gameObject.SetActive(true); enterSys[bingoingNumber - 1].gameObject.SetActive(false); obj.InvokeComplete(); }).SetAutoKill(); } else { DOVirtual.DelayedCall(1.5f, () => { exitSys.gameObject.SetActive(true); idleSys[bingoingNumber - 1].gameObject.SetActive(false); enterSys[bingoingNumber - 1].gameObject.SetActive(false); DOVirtual.DelayedCall(0.8f, (TweenCallback)(() => { finishMask.gameObject.SetActive(false); this.bingGoSke.gameObject.SetActive(false); exitSys.gameObject.SetActive(false); obj.InvokeComplete(); })); }).SetAutoKill(); } }); if (needShowBingoList.Count > 1) { showBingoSequence.Add(true, obj => { UICtrlDispatcher.Instance.Dispatch(SkinInfo.ChestUI_Open); UICtrlDispatcher.Instance.AddOnceListener(SkinInfo.ChestUI_Close, _ => { obj.InvokeComplete(); }); }); } } if (showBingoSequence.Count != 0) { showBingoSequence.Add(obj => { if (BingoCell.KeyCardSum >= 3) { UICtrlDispatcher.Instance.AddOnceListener(SkinInfo.BingoCardUI_Close, o => { obj.InvokeComplete(); }); BingoCell.OpenActivityUI(); } else { obj.InvokeComplete(); } }); } else { if (BingoCell.KeyCardSum >= 3) { showBingoSequence.Add(obj => { if (BingoCell.KeyCardSum >= 3) { UICtrlDispatcher.Instance.AddOnceListener(SkinInfo.BingoCardUI_Close, o => { obj.InvokeComplete(); }); BingoCell.OpenActivityUI(); } else { obj.InvokeComplete(); } }); } } if (showBingoSequence.Count != 0) { BingoCell.isProcedure = true; GameDispatcher.Instance.Dispatch(BingoInfo.AddPause, 1); showBingoSequence.onFinish = OnFinish; showBingoSequence.Run(); } else { isBingoing = false; BingoCell.isProcedure = false; showBingoSequence.onFinish = null; CheckFinish(); } } private void OnFinish() { GameDispatcher.Instance.Dispatch(BingoInfo.AddPause, -1); needShowBingoList.Clear(); BingoCell.bingoCardboardIndex = -1; BingoCell.isProcedure = false; if (isDelayCheckBingo) { isDelayCheckBingo = false; CheckBingo(); GameDispatcher.Instance.Dispatch(BingoInfo.CheckBingo, data.index); } else { if (isBingoing) { isBingoing = false; CheckFinish(); GameDispatcher.Instance.Dispatch(BingoInfo.CheckBingo, data.index); } } } void CheckFinish() { if (bingoedList.Count >= 3) { isFinish = true; if (!bingGoSke.gameObject.activeInHierarchy) { bingGoSke.gameObject.SetActive(true); NAAVsa.SetSkin(bingGoSke, "default"); idleSys[2].gameObject.SetActive(true); finishMask.gameObject.SetActive(true); } if (!BingoCell.IsInGame) { return; } GameDispatcher.Instance.Dispatch(BingoInfo.FinishOneCardBoard, this); } } public int IsBingo(List selectList) { foreach (var kv in from kv in BingoCell.bingoDic where !bingoedList.Contains(kv.Key) let isAllMatch = kv.Value.All(selectList.Contains) where isAllMatch select kv) { return kv.Key; } return -1; } } }