using System; using System.Linq; using BingoBrain.Core; using UnityEngine; using BingoBrain.HotFix; using System.Collections.Generic; namespace BingoBrain { public class CallSystem : BaseSystem { private bool isDeBug = false; private System.Random random; public CallSystem(bool isAutoInit = true) { if (isAutoInit) { Init(); } } public override void Init() { base.Init(); validNumPool = new List(); invalidNumPool = new List(); AddListener(); } private void AddListener() { GameDispatcher.Instance.AddListener(BingoInfo.StartCallNum, StartCall); GameDispatcher.Instance.AddListener(BingoInfo.EndBingoGame, EndCallNumber); GameDispatcher.Instance.AddListener(BingoInfo.ShowGameOver, EndCallNumber); GameDispatcher.Instance.AddListener(BingoInfo.StartBingoGame, OnStartBingoGame); } private void OnStartBingoGame(object obj) { BingoCell.AddCallSum = 0; BingoCell.calledList.Clear(); BingoCell.MaxAddCallSum = GameHelper.GetCommonModel().MaxAddCallSum; callIntervalTime = GameHelper.GetCommonModel().NumCD[0]; updataTime = callIntervalTime; BingoCell.MaxCallSum = GameHelper.GetCommonModel().NumCD[1]; callSum = 0; } #region 叫号 #region updata private bool isStartCall; private float updataTime; public override void Update() { if (!isStartCall) { return; } if (BingoCell.IsPauseGame) { return; } if (UI.Instance.HasUIInLayer(UILayerType.Popup)) { return; } updataTime += Time.deltaTime * BingoCell.CallSpeed; if (updataTime >= callIntervalTime) { updataTime = 0; if (callSum >= BingoCell.MaxCallSum && !BingoCell.isPropRewarding && !BingoCell.isVictory) { GameDispatcher.Instance.Dispatch(BingoInfo.CallNumFinish); return; } if (BingoCell.isVictory) { return; } CallNumber(); } } #endregion private int callIntervalTime; private int callSum; private List validNumPool; private List invalidNumPool; private void SetNumPool() { invalidNumPool.Clear(); validNumPool.Clear(); foreach (var num in BingoCell.cardBoardList.SelectMany(item => item.data.cardNumList.Where(num => !validNumPool.Contains(num)))) { validNumPool.Add(num); } for (var i = 1; i <= 75; i++) { if (!validNumPool.Contains(i)) { invalidNumPool.Add(i); } } } private void StartCall(object o) { random = isDeBug ? new System.Random(123456789) : new System.Random((int)DateTimeBoardk.Instance.GetServerCurrTimestamp()); SetNumPool(); if (BingoCell.IsInGame) { isStartCall = true; } } private void CallNumber() { if (callSum >= BingoCell.MaxCallSum) { return; } callSum++; var num = GetCallNumber(); if (BingoCell.calledList.Contains(num)) { } BingoCell.calledList.Add(num); Audio.Instance.PlayDynamicEffect("Call." + num); GameDispatcher.Instance.Dispatch(BingoInfo.CallNum, num); } private void EndCallNumber(object o) { if (isStartCall) { validNumPool.Clear(); invalidNumPool.Clear(); isStartCall = false; } } public int GetDaubCountInBingoList(List bingoList, CardBoardEntity cardBoardEntity) { return (from index in bingoList let cardEntity = cardBoardEntity.cardList[index] where cardBoardEntity.data.selectList.Contains(index) || BingoCell.calledList.Contains(cardEntity.data.num) select index).Count(); } public int GetCallNumber() { if (BingoCell.isFirstGame) { if (BingoCell.FixedCallIndexList.Count != 0) { var index = BingoCell.FixedCallIndexList[0]; var num = BingoCell.cardBoardList[0].data.cardNumList[index]; BingoCell.FixedCallIndexList.RemoveAt(0); return num; } } var vo = GameHelper.GetConfig().GetData(PreferencesMgr.Instance.CardBoardIndex + 1); var daubCount = BingoCell.cardBoardList.Sum(cardBoard => cardBoard.data.selectList.Count); float chance = vo.probability; var isNeedAdvance = false; for (var i = 0; i < vo.daubNum.Length; i++) { if (daubCount >= vo.daubNum[i]) { chance = vo.bingoprob[i]; isNeedAdvance = true; } } var isSucceed = GlobalHarmony.IsChance(chance / 100f); if (isNeedAdvance) { if (isSucceed) { var maxMatchCount = 1; var bingoIndexAndCardBoardList = new List>(); foreach (var bingoKv in BingoCell.bingoDic) { foreach (var cardBoard in BingoCell.cardBoardList) { if (cardBoard.isFinish) { continue; } var count = GetDaubCountInBingoList(bingoKv.Value, cardBoard); if (count == 5) { continue; } if (count > maxMatchCount) { maxMatchCount = count; bingoIndexAndCardBoardList.Clear(); bingoIndexAndCardBoardList.Add(new Tuple(cardBoard, bingoKv.Key)); } else if (count == maxMatchCount) { bingoIndexAndCardBoardList.Add(new Tuple(cardBoard, bingoKv.Key)); } } } var finalCardNum = GlobalHarmony.GetRandomList(bingoIndexAndCardBoardList); if (finalCardNum != null) { foreach (var num in from index in BingoCell.bingoDic[finalCardNum.Item2] let num = finalCardNum.Item1.data.cardNumList[index] where !finalCardNum.Item1.data.selectList.Contains(index) && !BingoCell.calledList.Contains(num) select num) { return num; } } else { } } } var sum = 0; List list; if (isSucceed) { if (validNumPool.Count > 0) { list = validNumPool; } else { list = invalidNumPool; } } else { list = invalidNumPool.Count > 0 ? invalidNumPool : validNumPool; } if (list.Count > 0) { var index = random.Next(0, list.Count); sum = list[index]; list.RemoveAt(index); } if (sum == 0) { while (true) { sum = random.Next(0, 76); if (!BingoCell.calledList.Contains(sum)) { break; } if (BingoCell.calledList.Count >= 75) { break; } } } return sum; } #endregion } }