Files
BingoGrassland/Assets/BingoBrain/System/Game/CardBoardSystem.cs
T

247 lines
8.0 KiB
C#
Raw Normal View History

2026-04-20 13:49:36 +08:00
using System.Linq;
using DG.Tweening;
using BingoBrain.Core;
using UnityEngine;
using BingoBrain.HotFix;
using System.Collections.Generic;
namespace BingoBrain
{
public class CardBoardSystem : BaseSystem
{
public CardBoardSystem(bool isAutoInit = true)
{
if (isAutoInit)
{
Init();
}
}
public override void Init()
{
base.Init();
GameDispatcher.Instance.AddListener(BingoInfo.FinishOneCardBoard, OnFinishOneCardBoard);
GameDispatcher.Instance.AddListener(BingoInfo.StartBingoGame, OnStartBingoGame);
GameDispatcher.Instance.AddListener(BingoInfo.EndBingoGame, OnEndBingoGame);
GameDispatcher.Instance.AddListener(BingoInfo.AddPropRewardFinish, OnAddPropRewardFinish);
GameDispatcher.Instance.AddListener(BingoInfo.CallNum, OnCallNum);
GameDispatcher.Instance.AddListener(BingoInfo.CheckBingo, OnCheckBingo);
cardBoardPool = new Jcna<CardBoardEntity>(OnGet, OnRelease);
}
private void OnCheckBingo(object obj)
{
var index = (int)obj;
for (var i = 0; i < BingoCell.cardBoardList.Count; i++)
{
var cardBoard = BingoCell.cardBoardList[i];
if (cardBoard.data.index == index || cardBoard.isFinish)
{
continue;
}
cardBoard.CheckBingo();
}
}
private void OnAddPropRewardFinish(object obj)
{
}
private void OnCallNum(object obj)
{
var num = (int)obj;
foreach (var card in BingoCell.cardBoardList.SelectMany(cardBoard =>
cardBoard.cardList.Where(card => !card.data.isSelect && !card.data.isCoin)
.Where(card => card.data.num == num)))
{
card.TweenAlphaNum();
}
}
private void OnEndBingoGame(object obj)
{
ResetCardBoard();
}
private void OnStartBingoGame(object obj)
{
PreferencesMgr.Instance.GameSum++;
InitCardBoardData();
}
private void OnRelease(CardBoardEntity obj)
{
if (obj.GoCell.gameObject != null)
{
obj.GoCell.gameObject.SetActive(false);
}
}
private void OnGet(CardBoardEntity obj)
{
if (obj.GoCell.gameObject != null)
{
obj.GoCell.gameObject.SetActive(true);
}
}
#region
Jcna<CardBoardEntity> cardBoardPool;
#endregion
#region
void InitCardBoardData()
{
for (var i = 0; i < BingoCell.CardBoardCount; i++)
{
var entity = cardBoardPool.Get();
var cardBoardData = entity.data;
cardBoardData.index = i;
for (var j = 0; j < BingoCell.bingoCount; j++)
{
var startNum = 1 + 15 * j;
var endNum = 15 + 15 * j;
for (var k = 0; k < BingoCell.bingoCount; k++)
{
var num = Random.Range(startNum, endNum + 1);
while (cardBoardData.cardNumList.Contains(num))
{
if (BingoCell.bingoCount >= 15)
{
return;
}
num = Random.Range(startNum, endNum + 1);
}
cardBoardData.cardNumList.Add(num);
}
}
entity.data.selectList.Add(BingoCell.FixedNum);
entity.SetData();
BingoCell.cardBoardList.Add(entity);
}
var finalList = new List<CardEntity>();
foreach (var card in BingoCell.cardBoardList.Where(cardBoard => !cardBoard.isFinish)
.SelectMany(cardBoard => cardBoard.cardList.Where(GameHelper.IsCommonCard)))
{
if (card.data.isSelect)
{
Debug.Log(card.data.index);
}
finalList.Add(card);
}
finalList = GlobalHarmony.GetRandomList(finalList,
ConfigSystem.GetConfig<CommonModel>().Initialcardprop);
if (finalList.Count != 0)
{
foreach (var card in finalList)
{
card.data.type = CardPropType.fanpai;
card.SetReward();
}
}
switch (BingoCell.CardBoardCount)
{
case 1:
BingoCell.cardBoardList[0].GoCell.gameObject.SetActive(true);
BingoCell.cardBoardList[0].GoCell.transform.localScale = Vector3.one;
BingoCell.cardBoardList[0].GoCell.transform.localPosition = new Vector3(0, -1);
break;
case 2:
{
IsfvKit.DelayedAction(0.1f, () =>
{
for (var i = 0; i < 2; i++)
{
BingoCell.cardBoardList[i].GoCell.gameObject.SetActive(true);
BingoCell.cardBoardList[i].GoCell.transform.localScale = Vector3.one * 0.63f;
var symbol = i == 0 ? -1 : 1;
BingoCell.cardBoardList[i].GoCell.transform.localPosition = Vector3.zero;
BingoCell.cardBoardList[i].GoCell.transform
.DOLocalMove(new Vector3(0, symbol * 3.3f - 2f), 0.2f).SetEase(Ease.Linear);
BingoCell.cardBoardList[i].bingGoSke.transform.localScale = Vector3.one;
}
});
break;
}
case 4:
{
IsfvKit.DelayedAction(0.1f, () =>
{
for (var i = 0; i < 4; i++)
{
BingoCell.cardBoardList[i].GoCell.transform.localScale = Vector3.one * 0.58f;
var symbolX = i % 2 == 0 ? -1 : 1;
var symbolY = i / 2 == 0 ? -1 : 1;
BingoCell.cardBoardList[i].GoCell.transform.localPosition = Vector3.zero;
BingoCell.cardBoardList[i].GoCell.transform
.DOLocalMove(new Vector3(symbolX * 2.57f, symbolY * 3 - 1.5f), 0.2f)
.SetEase(Ease.Linear);
BingoCell.cardBoardList[i].bingGoSke.transform.localScale = Vector3.one;
}
});
break;
}
}
}
private void OnFinishOneCardBoard(object obj)
{
if (BingoCell.IsPauseGame)
{
return;
}
if (BingoCell.isVictory)
{
return;
}
var isFinish = BingoCell.cardBoardList.All(cardBoard => cardBoard.isFinish);
if (isFinish)
{
if (!BingoCell.IsInGame)
{
return;
}
BingoCell.isVictory = true;
DOVirtual.DelayedCall(1, delegate { GameDispatcher.Instance.Dispatch(BingoInfo.ShowGameOver); });
}
}
void ResetCardBoard()
{
foreach (var cardBoard in BingoCell.cardBoardList)
{
cardBoard.OnReset();
cardBoardPool.Release(cardBoard);
}
BingoCell.cardBoardList.Clear();
BingoCell.bingoCardboardIndex = -1;
BingoCell.isVictory = false;
BingoCell.PauseSum = 0;
}
#endregion
}
}