From 7224da5fcead222e3ff2838beac8fcf4d9502be4 Mon Sep 17 00:00:00 2001 From: Jesus Castro Date: Tue, 16 Dec 2025 19:16:18 +0800 Subject: [PATCH] Add a per distance detonation sequence for bombs --- Assets/Scripts/Services/BombService.cs | 56 +++++++++++--------- Assets/Scripts/Services/ObjectPoolService.cs | 1 - 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/Assets/Scripts/Services/BombService.cs b/Assets/Scripts/Services/BombService.cs index 16c1ebf..335b139 100644 --- a/Assets/Scripts/Services/BombService.cs +++ b/Assets/Scripts/Services/BombService.cs @@ -60,27 +60,31 @@ namespace Services processed.Add(bombPos); - int neighborDelayMs = Mathf.Max(0, Mathf.RoundToInt(bombDelaySeconds * 1000f)); - if (neighborDelayMs > 0) - await UniTask.Delay(neighborDelayMs); + int ringDelayMs = Mathf.RoundToInt(bombDelaySeconds * 1000f); - foreach (Vector2Int n in DiamondNeighbors(bombPos, radius)) + for (int dist = 1; dist <= radius; dist++) { - if (!inBounds(n)) - continue; + if (ringDelayMs > 0) + await UniTask.Delay(ringDelayMs); - Gem g = getGemAt(n); - if (g == null) - continue; - - if (g.Type == GemType.Bomb) + foreach (Vector2Int n in DiamondRing(bombPos, dist)) { - if (!processed.Contains(n)) - queue.Enqueue(n); - continue; - } + if (!inBounds(n)) + continue; - await destroyAtAsync(n); + Gem g = getGemAt(n); + if (g == null) + continue; + + if (g.Type == GemType.Bomb) + { + if (!processed.Contains(n)) + queue.Enqueue(n); + continue; + } + + await destroyAtAsync(n); + } } int selfDelayMs = Mathf.Max(0, Mathf.RoundToInt(bombSelfDelaySeconds * 1000f)); @@ -92,18 +96,20 @@ namespace Services await destroyAtAsync(bombPos); } } - - private static IEnumerable DiamondNeighbors(Vector2Int center, int radius) + + private static IEnumerable DiamondRing(Vector2Int center, int distance) { - for (int x = -radius; x <= radius; x++) + for (int distanceX = -distance; distanceX <= distance; distanceX++) { - int maxY = radius - Mathf.Abs(x); - for (int y = -maxY; y <= maxY; y++) + int distanceY = distance - Mathf.Abs(distanceX); + if (distanceY == 0) { - if (x == 0 && y == 0) - continue; - - yield return new Vector2Int(center.x + x, center.y + y); + yield return new Vector2Int(center.x + distanceX, center.y); + } + else + { + yield return new Vector2Int(center.x + distanceX, center.y + distanceY); + yield return new Vector2Int(center.x + distanceX, center.y - distanceY); } } } diff --git a/Assets/Scripts/Services/ObjectPoolService.cs b/Assets/Scripts/Services/ObjectPoolService.cs index b72dd51..74da55f 100644 --- a/Assets/Scripts/Services/ObjectPoolService.cs +++ b/Assets/Scripts/Services/ObjectPoolService.cs @@ -29,7 +29,6 @@ namespace Services { if (this.gemTypeToPools[type].Count > 0) { gemView = this.gemTypeToPools[type].Pop(); - gemView.transform.localPosition = vector2Position; return gemView; }