Пример #1
0
 public void PostMoveData(PieceMoveData moveData)
 {
     //if(moveData.GetHashCode() != hashCode);
     Debug.Log("Post MoveData.");
     moveDataQueue.Enqueue(moveData);
     onRecievedMoveData.OnNext(moveData);
 }
Пример #2
0
    public void TryMove(int _posX, int _posY, string _gameId)
    {
        PieceMoveData data = new PieceMoveData(_posX, _posY, ChessPieceData.ChessPieceId, _gameId, ChessPieceData.PlayerId);

        Network.SendDataToServer("TryMove", data);
        ChessPieceManagerRef.DeselectPiece(); //maybe
    }
        // 現在はColumnSelectorを継承しているが, ColumnSelectorの内部処理は分離してPureC#にした方がいいかも

        protected override void OnColumnSelected(IntegerVector2 start, IntegerVector2 via, IntegerVector2 last)
        {
            IGame game = GameController.Instance.Game;

            if (game == null)
            {
                return;
            }

            PieceName     pieceName     = game.Board.GetPiece(start).Name;
            PieceMoveData pieceMoveData = new PieceMoveData(string.Empty, start, pieceName, last);

            GameController.Instance.ServerDelegate.PostMoveData(pieceMoveData);
        }
Пример #4
0
    /// <summary>
    /// Getting input feed that input to logic
    /// </summary>
    private void OnPieceSwap(PieceMoveData pieceMoveData)
    {
        m_startCountDown = true;
        m_hintTimer      = 0;
        //check if origin and destination inside bound
        if (m_boardState.IsOutside(pieceMoveData.Origin) || m_boardState.IsOutside(pieceMoveData.Destination))
        {
            m_input.Begin();
            return;
        }

        m_hintEnabled = false;
        m_logic.Begin();
        m_logic.DoSwap(pieceMoveData);
    }
Пример #5
0
        public bool GetHint(out PieceMoveData moveData)
        {
            m_boardState.CopyState(m_boardStateTemp);
            //check horizontal swipe
            for (int x = 0; x < m_boardStateTemp.BoardSize.x - 1; x++)
            {
                for (int y = 0; y < m_boardStateTemp.BoardSize.y; y++)
                {
                    Vector2Int positionA = new Vector2Int(x, y);
                    Vector2Int positionB = new Vector2Int(x + 1, y);

                    if (GetHint(positionA, positionB, m_boardStateTemp))
                    {
                        moveData = new PieceMoveData(-1, positionA, positionB);
                        return(true);
                    }
                }
            }

            for (int y = 0; y < m_boardStateTemp.BoardSize.y - 1; y++)
            {
                for (int x = 0; x < m_boardStateTemp.BoardSize.x; x++)
                {
                    Vector2Int positionA = new Vector2Int(x, x);
                    Vector2Int positionB = new Vector2Int(x, y + 1);

                    if (GetHint(positionA, positionB, m_boardStateTemp))
                    {
                        moveData = new PieceMoveData(-1, positionA, positionB);
                        return(true);
                    }
                }
            }

            moveData = new PieceMoveData();
            return(false);
        }
Пример #6
0
 public void AddPieceMoveLogs(PieceMoveData moveData)
 {
     pieceMoveLogs.Add(moveData);
 }
Пример #7
0
 void TargetRequestRetransmission(NetworkConnection target, PieceMoveData data)
 {
     retransmissionCallback?.Invoke(data);
     retransmissionCallback = null;
 }
Пример #8
0
 void RpcPostMoveData(PieceMoveData moveData)
 {
     onRecievedMoveData.OnNext(moveData);
 }
Пример #9
0
 void CmdPostMoveData(PieceMoveData data)
 {
     RpcPostMoveData(data);
 }
Пример #10
0
 public void PostMoveData(PieceMoveData moveData)
 {
     CmdPostMoveData(moveData);
 }
 public void PostMoveData(PieceMoveData moveData)
 {
     pieceMoveDataBroadcaster.Broadcast(moveData);
 }
Пример #12
0
        private IEnumerator UpdateVisuals(Queue <BoardUpdateData> boardUpdateDatas)
        {
            int numMatches            = 0;
            int numVisualUpdateTarget = boardUpdateDatas.Count;
            int numVisualUpdate       = 0;

            while (boardUpdateDatas.Count > 0)
            {
                BoardUpdateData boardUpdateData = boardUpdateDatas.Dequeue();
                //do move pieces
                if (boardUpdateData.Moves.Count > 0)
                {
                    IPiece[] movedPieces = new IPiece[boardUpdateData.Moves.Count]; //Todo use buffering instead

                    for (int i = 0; i < boardUpdateData.Moves.Count; i++)
                    {
                        PieceMoveData moveData = boardUpdateData.Moves[i];
                        IPiece        movedPiece;
                        if (moveData.NewPieceID >= 0)
                        {
                            movedPiece = m_pieceFactory.CreatePiece(moveData.NewPieceID);
                            movedPiece.Init(moveData.Origin.x, moveData.Origin.y);
                        }
                        else
                        {
                            movedPiece = m_visualState[moveData.Origin.x, moveData.Origin.y];
                        }

                        movedPiece.Move(moveData.Destination);
                        movedPieces[i] = movedPiece;
                    }

                    //update pieces position
                    for (int i = 0; i < boardUpdateData.Moves.Count; i++)
                    {
                        PieceMoveData moveData = boardUpdateData.Moves[i];
                        m_visualState[moveData.Destination.x, moveData.Destination.y] = movedPieces[i];
                    }

                    yield return(new WaitForSeconds(Constants.PieceFallDuration));
                }

                //handle matches
                numMatches += boardUpdateData.Matches.Length;
                numVisualUpdate++;

                if (boardUpdateData.Matches.Length > 0)
                {
                    for (int i = 0; i < boardUpdateData.Matches.Length; i++)
                    {
                        MatchData matchData = boardUpdateData.Matches[i];

                        for (int j = 0; j < matchData.Matches.Length; j++)
                        {
                            Vector2Int matchPosition = matchData.Matches[j];
                            IPiece     movedPiece    = m_visualState[matchPosition.x, matchPosition.y];
                            movedPiece.StartDisappear();
                        }

                        OnVisualMatchEvent.Invoke(matchData);
                    }

                    OnVisualStackEndedEvent.Invoke(numMatches, numVisualUpdate, numVisualUpdateTarget);
                    yield return(new WaitForSeconds(Constants.PieceMatchDuration));
                }
                else
                {
                    OnVisualStackEndedEvent.Invoke(numMatches, numVisualUpdate, numVisualUpdateTarget);
                }
            }


            m_stateEndEvent.Invoke(this);
            OnBoardUpdateCompleted.Invoke();

            //visual candy if there's combo
            if (numMatches > 1)
            {
                float multiplier = 1f / m_boardState.BoardSize.magnitude;
                for (int x = 0; x < m_boardState.BoardSize.x; x++)
                {
                    for (int y = 0; y < m_boardState.BoardSize.y; y++)
                    {
                        m_visualState[x, y].Hint((x + y) * multiplier, .2f);
                    }
                }
            }
        }
Пример #13
0
        /// <summary>
        /// This will also check if swap possible
        /// </summary>
        public void DoSwap(PieceMoveData pieceMoveData)
        {
            m_boardState.CopyState(m_boardStateTemp);

            Queue <BoardUpdateData> boardUpdateData = new Queue <BoardUpdateData>();

            //swap
            m_boardStateTemp.State[pieceMoveData.Origin.x, pieceMoveData.Origin.y]           = m_boardState.State[pieceMoveData.Destination.x, pieceMoveData.Destination.y];
            m_boardStateTemp.State[pieceMoveData.Destination.x, pieceMoveData.Destination.y] = m_boardState.State[pieceMoveData.Origin.x, pieceMoveData.Origin.y];
            //
            GetAllMatches(m_boardStateTemp, m_currentStateMatchData);


            boardUpdateData.Enqueue(new BoardUpdateData(new List <PieceMoveData>()
            {
                pieceMoveData, pieceMoveData.Inverse
            }, CopyMatchData(m_currentStateMatchData)));                                                                                                             //move pieces towards move

            if (m_currentStateMatchData.Count > 0)
            {
                //grab lowest position that can be filled for each column
                int[] columnLowest = new int[m_boardStateTemp.BoardSize.x];

                for (int i = 0; i < m_boardStateTemp.BoardSize.x; i++)
                {
                    columnLowest[i] = m_boardStateTemp.BoardSize.y - 1;
                }

                while (m_currentStateMatchData.Count > 0)
                {
                    for (int i = 0; i < m_currentStateMatchData.Count; i++)
                    {
                        MatchData matchData = m_currentStateMatchData[i];
                        for (int j = 0; j < matchData.Matches.Length; j++)
                        {
                            Vector2Int matchPosition = matchData.Matches[j];
                            //mark empty space
                            m_boardStateTemp.State[matchPosition.x, matchPosition.y] = Blank;

                            //mark column that can be filled
                            columnLowest[matchPosition.x] = Mathf.Min(columnLowest[matchPosition.x], matchPosition.y);
                        }
                    }

                    //drop all pieces to bottom
                    List <PieceMoveData> currentPieceDropDatas = new List <PieceMoveData>();

                    for (int x = 0; x < m_boardStateTemp.BoardSize.x; x++)
                    {
                        int lowestColumn = columnLowest[x];

                        //only do piece adjusting on column that have a match
                        //move pieces downwards and register matches
                        for (int y = lowestColumn; y < m_boardStateTemp.BoardSize.y; y++)
                        {
                            int value = m_boardStateTemp.State[x, y];

                            if (value != Blank)
                            {
                                m_boardStateTemp.State[x, lowestColumn] = value;

                                currentPieceDropDatas.Add(new PieceMoveData(-1, new Vector2Int(x, y), new Vector2Int(x, lowestColumn)));

                                lowestColumn++;
                                columnLowest[x] = lowestColumn;
                            }
                        }

                        //drop new pieces to fill the blank spaces
                        for (int y = lowestColumn; y < m_boardStateTemp.BoardSize.y; y++)
                        {
                            int value = Random.Range(0, m_pieceFactory.Prefabs.Length);
                            m_boardStateTemp.State[x, y] = value;

                            currentPieceDropDatas.Add(new PieceMoveData(value, new Vector2Int(x, m_boardStateTemp.BoardSize.y + (y - lowestColumn)), new Vector2Int(x, y)));
                        }
                    }

                    GetAllMatches(m_boardStateTemp, m_currentStateMatchData);

                    boardUpdateData.Enqueue(new BoardUpdateData(currentPieceDropDatas, CopyMatchData(m_currentStateMatchData)));
                }
                //drop gems also handle matches if there's any

                m_boardStateTemp.CopyState(m_boardState);
            }
            else
            {
                //no matches
                boardUpdateData.Enqueue(new BoardUpdateData(new List <PieceMoveData>()
                {
                    pieceMoveData, pieceMoveData.Inverse
                }, new MatchData[0]));                                                                                                             //move piece back
            }

            OnSwapResult.Invoke(boardUpdateData);
        }