public void FallGemsIntoEmptyPositions() { for (int x = 0; x < gridWidth; x++) { for (int y = 0; y < gridHeight; y++) { GemGridPosition gemGridPosition = grid.GetGridObject(x, y); if (!gemGridPosition.IsEmpty()) { // Grid Position has Gem for (int i = y - 1; i >= 0; i--) { GemGridPosition nextGemGridPosition = grid.GetGridObject(x, i); if (nextGemGridPosition.IsEmpty()) { gemGridPosition.GetGemGrid().SetGemXY(x, i); nextGemGridPosition.SetGemGrid(gemGridPosition.GetGemGrid()); gemGridPosition.ClearGemGrid(); gemGridPosition = nextGemGridPosition; } else { // Next Grid Position is not empty, stop looking break; } } } } } }
public bool TryFindMatchesAndDestroyThem() { List <List <GemGridPosition> > allLinkedGemGridPositionList = GetAllMatch3Links(); bool foundMatch = false; List <Vector2Int> explosionGridPositionList = new List <Vector2Int>(); foreach (List <GemGridPosition> linkedGemGridPositionList in allLinkedGemGridPositionList) { foreach (GemGridPosition gemGridPosition in linkedGemGridPositionList) { TryDestroyGemGridPosition(gemGridPosition); } if (linkedGemGridPositionList.Count >= 4) { // More than 4 linked score += 200; // Special Explosion Gem GemGridPosition explosionOriginGemGridPosition = linkedGemGridPositionList[0]; int explosionX = explosionOriginGemGridPosition.GetX(); int explosionY = explosionOriginGemGridPosition.GetY(); // Explode all 8 neighbours explosionGridPositionList.Add(new Vector2Int(explosionX - 1, explosionY - 1)); explosionGridPositionList.Add(new Vector2Int(explosionX + 0, explosionY - 1)); explosionGridPositionList.Add(new Vector2Int(explosionX + 1, explosionY - 1)); explosionGridPositionList.Add(new Vector2Int(explosionX - 1, explosionY + 0)); explosionGridPositionList.Add(new Vector2Int(explosionX + 1, explosionY + 0)); explosionGridPositionList.Add(new Vector2Int(explosionX - 1, explosionY + 1)); explosionGridPositionList.Add(new Vector2Int(explosionX + 0, explosionY + 1)); explosionGridPositionList.Add(new Vector2Int(explosionX + 1, explosionY + 1)); } foundMatch = true; } bool spawnExplosion = match4Explosions; if (spawnExplosion) { foreach (Vector2Int explosionGridPosition in explosionGridPositionList) { if (IsValidPosition(explosionGridPosition.x, explosionGridPosition.y)) { GemGridPosition gemGridPosition = grid.GetGridObject(explosionGridPosition.x, explosionGridPosition.y); TryDestroyGemGridPosition(gemGridPosition); } } } OnScoreChanged?.Invoke(this, EventArgs.Empty); return(foundMatch); }
private GemSO GetGemSO(int x, int y) { if (!IsValidPosition(x, y)) { return(null); } GemGridPosition gemGridPosition = grid.GetGridObject(x, y); if (gemGridPosition.GetGemGrid() == null) { return(null); } return(gemGridPosition.GetGemGrid().GetGem()); }
public int GetGlassAmount() { int glassAmount = 0; for (int x = 0; x < gridWidth; x++) { for (int y = 0; y < gridHeight; y++) { GemGridPosition gemGridPosition = grid.GetGridObject(x, y); if (gemGridPosition.HasGlass()) { glassAmount++; } } } return(glassAmount); }
private void TryDestroyGemGridPosition(GemGridPosition gemGridPosition) { if (gemGridPosition.HasGemGrid()) { score += 100; gemGridPosition.DestroyGem(); OnGemGridPositionDestroyed?.Invoke(gemGridPosition, EventArgs.Empty); gemGridPosition.ClearGemGrid(); } if (gemGridPosition.HasGlass()) { score += 100; gemGridPosition.DestroyGlass(); OnGlassDestroyed?.Invoke(this, EventArgs.Empty); } }
public void SwapGridPositions(int startX, int startY, int endX, int endY) { if (!IsValidPosition(startX, startY) || !IsValidPosition(endX, endY)) { return; // Invalid Position } if (startX == endX && startY == endY) { return; // Same Position } GemGridPosition startGemGridPosition = grid.GetGridObject(startX, startY); GemGridPosition endGemGridPosition = grid.GetGridObject(endX, endY); GemGrid startGemGrid = startGemGridPosition.GetGemGrid(); GemGrid endGemGrid = endGemGridPosition.GetGemGrid(); startGemGrid.SetGemXY(endX, endY); endGemGrid.SetGemXY(startX, startY); startGemGridPosition.SetGemGrid(endGemGrid); endGemGridPosition.SetGemGrid(startGemGrid); }
public void SpawnNewMissingGridPositions() { for (int x = 0; x < gridWidth; x++) { for (int y = 0; y < gridHeight; y++) { GemGridPosition gemGridPosition = grid.GetGridObject(x, y); if (gemGridPosition.IsEmpty()) { GemSO gem = levelSO.gemList[UnityEngine.Random.Range(0, levelSO.gemList.Count)]; GemGrid gemGrid = new GemGrid(gem, x, y); gemGridPosition.SetGemGrid(gemGrid); OnNewGemGridSpawned?.Invoke(gemGrid, new OnNewGemGridSpawnedEventArgs { gemGrid = gemGrid, gemGridPosition = gemGridPosition, }); } } } }
public bool HasGlass(int x, int y) { GemGridPosition gemGridPosition = grid.GetGridObject(x, y); return(gemGridPosition.HasGlass()); }
public GemGridPosition GetGemGridPosition(int x, int y) { GemGridPosition gemGridPosition = grid.GetGridObject(x, y); return(gemGridPosition); }