Change Bomb Implementation

- L and T shapes are no longer considered a match
- Bomb explodes WITH gems
- Bomb will  have a small sprite of the creating gem
This commit is contained in:
2025-12-17 00:44:23 +08:00
parent 9f9bf9a3f5
commit 85b9767201
3 changed files with 37 additions and 203 deletions

View File

@@ -21,21 +21,6 @@ namespace Services
return matchPositions.Distinct().ToList();
}
// This is the old implementation wherein any adjacent matches will detonate the bomb
private List<Vector2Int> DetonateThroughAdjacentMatches(IReadOnlyList<Vector2Int> matchPositions) {
HashSet<Vector2Int> candidates = new HashSet<Vector2Int>();
foreach (Vector2Int p in matchPositions)
{
candidates.Add(p + Vector2Int.left);
candidates.Add(p + Vector2Int.right);
candidates.Add(p + Vector2Int.up);
candidates.Add(p + Vector2Int.down);
}
return candidates.ToList();
}
public async UniTask DetonateChainAsync(
IReadOnlyList<Vector2Int> initialBombs,
Func<Vector2Int, bool> inBounds,
@@ -134,31 +119,16 @@ namespace Services
}
}
private static IEnumerable<Vector2Int> DiamondRing(Vector2Int center, int distance)
{
for (int distanceX = -distance; distanceX <= distance; distanceX++)
{
int distanceY = distance - Mathf.Abs(distanceX);
if (distanceY == 0)
{
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);
}
}
}
private static IEnumerable<Vector2Int> DiamondAreaInclusive(Vector2Int center, int radius)
{
yield return center;
for (int dist = 1; dist <= radius; dist++)
// Manhattan-distance filled diamond:
for (int distanceX = -radius; distanceX <= radius; distanceX++)
{
foreach (Vector2Int pivot in DiamondRing(center, dist))
yield return pivot;
int remaining = radius - Mathf.Abs(distanceX);
for (int distanceY = -remaining; distanceY <= remaining; distanceY++)
{
yield return new Vector2Int(center.x + distanceX, center.y + distanceY);
}
}
}
}