using asap.core; using cfg; using Script.RuntimeScript.GameLogic; using Script.RuntimeScript.model.Data; using System.Collections.Generic; using UniRx; namespace Script.RuntimeScript { public partial class GameBroadLogic { private CompositeDisposable _disposable = null; public void AddEvent() { if (_disposable == null) { _disposable = new CompositeDisposable(); GContext.OnEvent().Subscribe(OnClickGrid).AddTo(_disposable); GContext.OnEvent().Subscribe(OnGridPropEffectOver).AddTo(_disposable); } } public void ClearEvent() { _disposable?.Dispose(); _disposable = null; } #region 点击grid private void OnClickGrid(EventGridClick param) { GridData gridData = param.Data; DiggingGameManager diggingGameManager = GContext.container.Resolve(); if (gridData.ConfigData != null) { int level = diggingGameManager.GetCurLevel(); int clickCount = diggingGameManager.DataModel.GetClickCount(); bool boo = false; if (gridData.ConfigData.Config.DiggingType is Normal) { boo = CheckPropOpen(gridData); if (boo) diggingGameManager.SandDigPoint(GridType.Normal, level, clickCount); else diggingGameManager.SandDigPoint(GridType.None, level, clickCount); } else if (gridData.ConfigData.Config.DiggingType is Resource) { boo = CheckResoucePropOpen(gridData); if (boo) diggingGameManager.SandDigPoint(GridType.Resource, level, clickCount); else diggingGameManager.SandDigPoint(GridType.None, level, clickCount); } else { boo = CheckSpecialEventOpen(gridData); if (boo) diggingGameManager.SandDigPoint(GridType.Special, level, clickCount); else diggingGameManager.SandDigPoint(GridType.None, level, clickCount); } if (!param.PassiveClick) { if (boo) { diggingGameManager.ShowDigEffect(ClickDigType.Big, gridData.LocalPos); } else { diggingGameManager.ShowDigEffect(ClickDigType.Smail, gridData.LocalPos); } } param.IsBigDig = boo; } else { if (!param.PassiveClick) { diggingGameManager.ShowDigEffect(ClickDigType.Smail, gridData.LocalPos); } } diggingGameManager.DataModel.SaveAll(); } /// /// 检查道具开启 /// private bool CheckPropOpen(GridData gridData) { bool isCheckPass = false; for (int i = 0; i < _allGridProps.Count; i++) { if (!_allGridProps[i].Data.AlreadyOpen && _allGridProps[i].Data.IsCanOpen() && _allGridProps[i].Data.Config.DiggingType is Normal) { GContext.container.Resolve().DataModel.AddProp(_allGridProps[i].Data.PropId); PropData targetProp = UpdatePropState(_allGridProps[i].Data.PropId); isCheckPass = true; PropItem item = GetPropItemById(targetProp); if (item == null) { DiggingGameManager.LogError($"挖出的道具id:{_allGridProps[i].Data.PropId},上面的任务栏没有相应的道具槽位 ,检查去吧!"); } else { _allGridProps[i].Data.SetTargetPropItem(item); GContext.container.Resolve().GameState = SandDigGameState.PropEffect; AddToEffectList(_allGridProps[i]); } } } if (isCheckPass) { CheckClampPass(); return true; } return false; } /// /// 更新 新获得的道具状态 /// /// private PropData UpdatePropState(int propId) { PropData[] allData = GContext.container.Resolve().DataModel.GetAllPropData(); PropData propData; for (int i = 0; i < allData.Length; i++) { propData = allData[i]; if (propData.IsOk == false && propData.PropId == propId) { propData.IsOk = true; return propData; } } return null; } private bool CheckResoucePropOpen(GridData gridData) { for (int i = 0; i < _allGridProps.Count; i++) { if (!_allGridProps[i].Data.AlreadyOpen && _allGridProps[i].Data.IsCanOpen() && _allGridProps[i].Data.Config.DiggingType is Resource) { AddToEffectList(_allGridProps[i]); return true; } } return false; } private bool CheckSpecialEventOpen(GridData gridData) { for (int i = 0; i < _allSpecialGridProps.Count; i++) { if (!_allSpecialGridProps[i].Data.AlreadyOpen && _allSpecialGridProps[i].Data.IsCanOpen()) { _allSpecialGridProps[i].ShowSandpit(); AddToEffectList(_allSpecialGridProps[i]); } } return true; } private PropItem GetPropItemById(PropData propData) { for (int i = 0; i < _allProps.Count; i++) { if (_allProps[i].Data == propData) { return _allProps[i]; } } return null; } #endregion #region 开启道具,且道具动画播放完毕 private void OnGridPropEffectOver(GridPropEffectOver param) { int propId = param.propId; DiggingGameManager.LogWarning("道具动画播放完毕:propId::" + propId); //格子内道具 飞到目标后,自己消失 加载新的模型 //ShowProp(propId); 如何这个执行 需要检查 propData.IsOk = true 的逻辑 //if (param.isNormal) //{ this._broadState = BroadEffectState.OverCheck; //} //else //{ // this._broadState = BroadEffectState.Check; //} } #endregion #region 检查是否通关 private async void CheckClampPass() { bool allFinded = true; for (int i = 0; i < _allProps.Count; i++) { if (!_allProps[i].Data.IsOk) { allFinded = false; break; } } if (allFinded) { DiggingGameManager.LogError("恭喜你 通关了!"); GContext.container.Resolve().DataModel.PassClamp(); await System.Threading.Tasks.Task.Delay(SandDigEventConst.BigShovelEffectTime); //爆炸所有剩余棋子 List allRemainingGrids = new List(); for (int i = 0; i < _allGrids.Count; i++) { if (_allGrids[i].Data.IsBorder == false && _allGrids[i].Data.IsOpen == false) { allRemainingGrids.Add(_allGrids[i]); } } int MaxCount = 20; //间隔时间 int intervalTime = 100; int allRemainingCount = allRemainingGrids.Count; if (allRemainingCount > MaxCount) { int count = allRemainingCount / MaxCount; intervalTime /= (count + 1); } for (int i = 0; i < allRemainingCount; i++) { allRemainingGrids[i].PlayPassClampEffect(); await System.Threading.Tasks.Task.Delay(intervalTime); } } } #endregion } }