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,
                    });
                }
            }
        }
    }
예제 #8
0
    public bool HasGlass(int x, int y)
    {
        GemGridPosition gemGridPosition = grid.GetGridObject(x, y);

        return(gemGridPosition.HasGlass());
    }
예제 #9
0
    public GemGridPosition GetGemGridPosition(int x, int y)
    {
        GemGridPosition gemGridPosition = grid.GetGridObject(x, y);

        return(gemGridPosition);
    }