コード例 #1
0
    private void AddNewPieces()
    {
        for (var i = 0; i < _config.GetGridWidth(); i++)
        {
            var missingPieces = 0;
            for (var j = 0; j < _config.GetGridHeight(); j++)
            {
                if (_grid[i][j] == null)
                {
                    PieceDO piece = _currentPool[_currentPool.Count - 1];
                    ChangePiece(piece, i, j);
                    _gameView.RecreatePiece(piece, ++missingPieces);
                    _grid[i][j] = piece;

                    _currentPool.Remove(piece);
                }
            }
        }

        if (_addDiamondPiece)
        {
            int col = Random.Range(0, _config.GetGridWidth());
            int row = Random.Range(0, _config.GetGridWidth());

            PieceType type = GetRandomType(_diamondValues);
            ChangePiece(_grid[col][row], col, row, type);

            _addDiamondPiece = false;
        }

        _gameView.IsDropping = true;
    }
コード例 #2
0
    private void OnRemoveBonus(BonusType type, Action finishCallBack)
    {
        foreach (List <PieceDO> list in _grid)
        {
            PieceDO piece = list.Find(p => p.View.HasBonus && p.View.BonusType == type);
            if (piece != null)
            {
                List <PieceDO> match = LookForMatchesToList(piece.View.Cell, piece.Type);
                piece.View.RemoveBonus(() =>
                {
                    if (finishCallBack != null)
                    {
                        finishCallBack();
                    }

                    foreach (PieceDO pieceDo in match)
                    {
                        pieceDo.Checked            = false;
                        pieceDo.Locked             = false;
                        pieceDo.View.Cell.IsMarked = false;
                        pieceDo.View.ActivateBonusBorder(false);
                    }
                });

                break;
            }
        }
    }
コード例 #3
0
    private void ActivateColorBonus(PieceDO pieceDo)
    {
        int rndI = Random.Range(2, _config.GetGridWidth() - 2);
        int rndJ = Random.Range(2, _config.GetGridHeight() - 2);

        _grid[rndI][rndJ].View.Cell.ChangeType(pieceDo.Type, GetTypeSprite(pieceDo.Type), true, 3);
    }
コード例 #4
0
    public void Initialize(PieceDO renderData)
    {
        GetData = renderData;
        _spriteIcon.spriteName = GetData.Sprite;

        GetData.View = this;
    }
コード例 #5
0
 private void ChangePieceType(PieceDO piece, PieceType type)
 {
     piece.Type   = type;
     piece.Sprite = GetTypeSprite(piece.Type);
     if (piece.View != null)
     {
         piece.View.Change();
     }
 }
コード例 #6
0
    private PieceDO ChangePiece(PieceDO piece, int col, int row, PieceType type = 0)
    {
        piece.Col    = col;
        piece.Row    = row;
        piece.Type   = type == 0 ? GetRandomType(_values) : type;
        piece.Sprite = GetTypeSprite(piece.Type);
        piece.View.Change();

        return(piece);
    }
コード例 #7
0
    private PieceDO CreatePiece(int col, int row, PieceType type = 0)
    {
        var piece = new PieceDO();

        piece.Col    = col;
        piece.Row    = row;
        piece.Type   = type == 0 ? GetRandomType(_values) : type;
        piece.Sprite = GetTypeSprite(piece.Type);

        return(piece);
    }
コード例 #8
0
    private void ActivateSuperCubeBonus()
    {
        List <List <int> > colorPieces = new List <List <int> >();

        colorPieces.Add(new List <int>());
        colorPieces.Add(new List <int>());
        colorPieces.Add(new List <int>());
        colorPieces.Add(new List <int>());
        colorPieces.Add(new List <int>());

        PieceDO piece = null;

        for (int i = 0; i < _config.GetGridWidth(); i++)
        {
            for (int j = 0; j < _config.GetGridHeight(); j++)
            {
                piece = _grid[i][j];
                if (piece.Type == PieceType.FRIEND_DIAMOND || piece.Type == PieceType.MAGIC_DIAMOND)
                {
                    continue;
                }
                colorPieces[(int)piece.Type - 1].Add((int)piece.Type);
            }
        }

        colorPieces.Sort((p1, p2) => p1.Count.CompareTo(p2.Count));

        for (int i = 0; i < _config.GetGridWidth(); i++)
        {
            for (int j = 0; j < _config.GetGridHeight(); j++)
            {
                piece = _grid[i][j];
                if (piece.Type == PieceType.FRIEND_DIAMOND || piece.Type == PieceType.MAGIC_DIAMOND)
                {
                    continue;
                }

                while (colorPieces[0].Count == 0)
                {
                    colorPieces.RemoveAt(0);
                }

                int len = colorPieces[0].Count;

                piece.Type   = (PieceType)colorPieces[0][len - 1];
                piece.Sprite = GetTypeSprite(piece.Type);
                piece.View.Change();
                colorPieces[0].RemoveAt(len - 1);
            }
        }
        CheckForMatches();
    }
コード例 #9
0
 private void ResetGridState()
 {
     for (var i = 0; i < _config.GetGridWidth(); i++)
     {
         for (var j = 0; j < _config.GetGridHeight(); j++)
         {
             PieceDO piece = _grid[i][j];
             piece.Checked            = false;
             piece.Locked             = false;
             piece.View.Cell.IsMarked = false;
         }
     }
 }
コード例 #10
0
 private void ActivateBlackHoleBonus(PieceType type)
 {
     for (int i = 0; i < _config.GetGridWidth(); i++)
     {
         for (int j = 0; j < _config.GetGridHeight(); j++)
         {
             PieceDO piece = _grid[i][j];
             if (piece.Type == type && _currentPool.IndexOf(piece) == -1)
             {
                 _currentPool.Add(piece);
             }
         }
     }
 }
コード例 #11
0
    private void AddMatches()
    {
        for (var j = 0; j < _config.GetGridHeight(); j++)
        {
            for (var i = 0; i < _config.GetGridWidth(); i++)
            {
                PieceDO piece = _grid[i][j];
                if (piece.Locked)
                {
                    continue;
                }

                if (piece.Col > 0 && _grid[piece.Col - 1][piece.Row].Locked)
                {
                    continue;
                }
                if (piece.Col + 1 < _config.GetGridWidth() && _grid[piece.Col + 1][piece.Row].Locked)
                {
                    continue;
                }
                if (piece.Row > 0 && _grid[piece.Col][piece.Row - 1].Locked)
                {
                    continue;
                }
                if (piece.Row + 1 < _config.GetGridHeight() && _grid[piece.Col][piece.Row + 1].Locked)
                {
                    continue;
                }

                if (piece.Col > 0)
                {
                    ChangePieceType(_grid[piece.Col - 1][piece.Row], piece.Type);
                }
                if (piece.Col + 1 < _config.GetGridWidth())
                {
                    ChangePieceType(_grid[piece.Col + 1][piece.Row], piece.Type);
                }
                if (piece.Row > 0)
                {
                    ChangePieceType(_grid[piece.Col][piece.Row - 1], piece.Type);
                }
                if (piece.Row + 1 < _config.GetGridHeight())
                {
                    ChangePieceType(_grid[piece.Col][piece.Row + 1], piece.Type);
                }
                return;
            }
        }
    }
コード例 #12
0
    public void InitializeViewData(GameRenderData data)
    {
        _resultsContainer.gameObject.SetActive(false);
        _resultsContainer.InitializeViewData(data.OnGetToMenu);

        _gridSize  = data.GridSize;
        _piecePool = data.GridList;

        for (int i = 0; i < _gridSize.x; i++)
        {
            List <CellView> cells = new List <CellView>();
            for (int j = 0; j < _gridSize.y; j++)
            {
                GameObject pieceGO = _gridPieces.gameObject.AddChild(_piecePrefab);
                pieceGO.transform.localScale = Vector3.one;
                PieceView piece   = pieceGO.GetComponent <PieceView>();
                PieceDO   pieceDo = data.GridList[i][j];

                if (piece != null)
                {
                    piece.Initialize(pieceDo);
                    piece.transform.localPosition = new Vector3(PIECE_WIDTH * i - _offsetX, PIECE_HEIGHT * j - _offsetY);
                }

                GameObject cellGO = _gridCells.gameObject.AddChild(_cellPrefab);
                cellGO.transform.localScale    = Vector3.one;
                cellGO.transform.localPosition = piece.transform.localPosition;
                cellGO.name = String.Format("cell {0}/{1}", i, j);
                CellView cell = cellGO.GetComponent <CellView>();
                cell.Piece = piece;
                cell.Initialize(data.SelectCell);
                cells.Add(cell);
            }
            _cells.Add(cells);
        }
        SetNeighbors();

        _piecePrefab.SetActive(false);
        _cellPrefab.SetActive(false);

        _currentScore = 0;
        _scoreCounter = new NguiLabelCounterInt(_scoreLabel);
        _scoreCounter.SetInitialCounterValue(_currentScore);

        _currentDiamondScore      = 0;
        _diamondProgressBar.value = 0;
        _addDiamondPiece          = data.AddDiamondPiece;
    }
コード例 #13
0
    private void AffectAbove(PieceDO piece)
    {
        var row = piece.Row + 1;

        while (row < _config.GetGridHeight())
        {
            if (_grid[piece.Col][row] != null)
            {
                _grid[piece.Col][row].Row--;
                _grid[piece.Col][row - 1] = _grid[piece.Col][row];
                _gameView.Cells[piece.Col][row - 1].Piece = _grid[piece.Col][row - 1].View;
                _grid[piece.Col][row] = null;
            }
            row++;
        }
    }
コード例 #14
0
    private void ActivateBombBonus(PieceDO pieceDo)
    {
        //reset states
        ResetGridState();

        List <PieceDO> bonusPool = LookForMatchesToList(pieceDo.View.Cell, pieceDo.Type);

        foreach (PieceDO piece in bonusPool)
        {
            foreach (CellView cell in piece.View.Cell.Neighbors)
            {
                if (_currentPool.IndexOf(cell.Piece.GetData) == -1 && cell.Piece.GetData.Type != PieceType.FRIEND_DIAMOND && cell.Piece.GetData.Type != PieceType.MAGIC_DIAMOND)
                {
                    _currentPool.Add(cell.Piece.GetData);
                }
            }
        }
    }
コード例 #15
0
    private void CheckForMatches()
    {
        _matches.Clear();
        ResetGridState();

        //1. Находим общее количество совпадений
        for (var j = 0; j < _config.GetGridHeight(); j++)
        {
            for (var i = 0; i < _config.GetGridWidth(); i++)
            {
                PieceDO piece = _grid[i][j];
                if (piece.Checked)
                {
                    continue;
                }

                _currentPool.Clear();
                LookForMatches(piece.View.Cell, piece.Type);

                if (_currentPool.Count > 2)
                {
                    _matches.Add(_currentPool.ToArray());
                }
                CheckBonusLive();
            }
        }
        ResetGridState();

        //2. Если совпадений < 2
        if (_matches.Count < 2)
        {
            //3. Помечаем те ячейки, которые нельзя проверять (по вертикали, горизонтали и диагонали)
            LockPieces(_matches);
            //4. Начинаем снизу и ищем первую попавшуюся непомеченную ячейку, у которой соседи тоже непомеченные
            //5. Изменяем тип соседних ячеек на такой же тип
            AddMatches();
        }
    }
コード例 #16
0
    private void CheckBonusLive()
    {
        PieceDO pieceDo = _currentPool.Find(p => p.View.HasBonus);

        if (pieceDo != null)
        {
            if (_currentPool.Count > 2)
            {
                _currentPool.ForEach(p => p.View.ActivateBonusBorder(true));
            }
            else
            {
                pieceDo.View.RemoveBonus(() => {
                    _bonusController.StartBonus(pieceDo.View.BonusType, true);
                    _currentPool.ForEach(p => p.View.ActivateBonusBorder(false));
                });
            }
        }
        else
        {
            _currentPool.ForEach(p => p.View.ActivateBonusBorder(false));
        }
    }
コード例 #17
0
    private bool OnSetBonus(BonusType type)
    {
        CheckForMatches();

        int rndMatch = -1;

        while (rndMatch == -1)
        {
            if (_matches.Count == 0)
            {
                return(false);
            }

            rndMatch = Random.Range(0, _matches.Count);
            foreach (PieceDO pieceDo  in _matches[rndMatch])
            {
                if (pieceDo.View.HasBonus)
                {
                    _matches.RemoveAt(rndMatch);
                    rndMatch = -1;
                    break;
                }
            }
        }

        int rndPiece = Random.Range(0, _matches[rndMatch].Length);

        foreach (PieceDO pieceDo in _matches[rndMatch])
        {
            pieceDo.View.ActivateBonusBorder(true);
        }
        PieceDO piece = _matches[rndMatch][rndPiece];

        piece.View.SetBonus(type);

        return(true);
    }
コード例 #18
0
 public void RecreatePiece(PieceDO piece, int missingPieces)
 {
     piece.View.transform.localPosition = new Vector3(PIECE_WIDTH * piece.Col - _offsetX, PIECE_HEIGHT * missingPieces + _offsetY);
     piece.View.gameObject.SetActive(true);
     _cells[piece.Col][piece.Row].Piece = piece.View;
 }