using System; using System.Collections; using System.Collections.Generic; using System.Linq; using asap.core; using cfg; using Game; using Script.RuntimeScript.GameLogic; using UnityEngine; namespace Script.RuntimeScript.ExplosionEffect.Effect { public class BombExplosion : IExplosion { private SpecialEventItem _target; public void Play(SpecialEventItem item) { _target = item; GContext.container.Resolve().BaseMono.StartCoroutine(PlayCoroutine()); } private IEnumerator PlayCoroutine() { List> targetGridsLayer = GetBombGrids(_target); int allCount = targetGridsLayer.Where(x => x.Count > 0).Sum(x => x.Count); if (allCount > 0) { GContext.Publish(new EventUISound("audio_ui_sanddig_griddispear")); } for (int i = 0; i < targetGridsLayer.Count; i++) { List layer = targetGridsLayer[i]; for (int j = 0; j < layer.Count; j++) { layer[j].GridEffectType = GridEffectType.PassiveBomb; layer[j].PassiveClick(); } yield return new WaitForSeconds(0.5f); } DiggingGameManager diggingGameManager = GContext.container.Resolve(); var configInit = diggingGameManager.DataModel.digActivityConfig; yield return new WaitForSeconds(configInit.BombBlockAniTime); GContext.Publish(new GridPropEffectOver(_target.Data.PropId, false)); } private List> GetBombGrids(SpecialEventItem item) { if (item.Data.Config.DiggingType is BombClear) { Dictionary gridDic = new Dictionary(); List allGrids = GContext.container.Resolve().BroadLogic.GetAllGrids(); for (int i = 0; i < allGrids.Count; i++) { if (allGrids[i].Data.IsBorder || allGrids[i].Data.IsOpen) { continue; } Vector2Int gridVec = new Vector2Int(allGrids[i].Data.Row, allGrids[i].Data.Col); gridDic[gridVec] = allGrids[i]; } int layers = (item.Data.Config.DiggingType as BombClear).Param; Vector2Int cellPos = new Vector2Int(item.Data.ParentGird.Row, item.Data.ParentGird.Col); return GetCellsInLayers(cellPos, layers, gridDic); } return null; } private List> GetCellsInLayers(Vector2Int center, int layers, Dictionary gridDic) { List> cellsInLayers = new List>(); for (int layer = 1; layer <= layers; layer++) { List currentLayer = new List(); for (int x = -layer; x <= layer; x++) { for (int y = -layer; y <= layer; y++) { if (Math.Abs(x) == layer || Math.Abs(y) == layer) { Vector2Int cellPos = new Vector2Int(center.x + x, center.y + y); if (gridDic.ContainsKey(cellPos)) { currentLayer.Add(gridDic[cellPos]); } } } } cellsInLayers.Add(currentLayer); } return cellsInLayers; } } }