Ejemplo n.º 1
0
 public MoveException(string message, IMove move, Color activePlayer, IBoard board = null)
     : this(message + $"\r\n{activePlayer.ToString()}'s move: {move}", board)
 {
     Error = MoveError.NoneSet;
 }
Ejemplo n.º 2
0
 public MoveException(string message, IBoard board = null) : base(message)
 {
     Error = MoveError.NoneSet;
     Board = board;
 }
Ejemplo n.º 3
0
 public MoveException(string message, Exception innerException) : base(message, innerException)
 {
     Error = MoveError.NoneSet;
 }
Ejemplo n.º 4
0
 public MoveException()
 {
     Error = MoveError.NoneSet;
 }
Ejemplo n.º 5
0
 virtual protected void MoveErrorResponseHandler(MoveError moveError)
 {
 }
Ejemplo n.º 6
0
 private void OnFailedMove(MoveError error)
 {
     ResetToOldPosition();
     Debug.LogError(error);
 }
Ejemplo n.º 7
0
    private void OnPieceRelease()
    {
        BeforeRelease();

        if (multipleSelection)
        {
            collisionSlot = multipleSelectionList.Last().collisionSlot;
        }

        // if collision not happen
        if (collisionSlot == null)
        {
            // reset the position
            ResetToOldPosition();
        }
        else
        {
            // current player
            var currentPlayer = GameManager.instance.currentPlayer;
            // get moves left
            var movesLeft = DiceController.instance.GetMovesLeftList(currentPlayer.movesPlayed.Select(x => x.step));

            MoveActionTypes action     = MoveActionTypes.Move;
            MoveError       error      = MoveError.Unknown;
            int             stepPlayed = -1;

            // loop through dice values
            foreach (var step in movesLeft)
            {
                stepPlayed = step;
                error      = Rule.ValidateMove(this, collisionSlot, step, out action);

                // if the move valid, do not continue
                if (error == MoveError.NoError)
                {
                    break;
                }
            }

            // move to place if move was valid,
            if (error == MoveError.NoError)
            {
                OnSuccessfulMove(action, stepPlayed);
            }
            // else try combining dice values to get there
            else
            {
                ICollection <Move> movesPlayed;

                error = Rule.ValidateCombinedMove(this, collisionSlot, movesLeft, out movesPlayed);

                // if there are any combined move, move
                if (error == MoveError.NoError)
                {
                    foreach (var move in movesPlayed)
                    {
                        OnSuccessfulMove(move.to, move.action, move.step);
                    }
                }
                // roll back to the position you were before
                else
                {
                    OnFailedMove(error);
                }
            }
        }

        AfterRelease();
    }
Ejemplo n.º 8
0
    public static MoveError ValidateCombinedMove(Piece piece, Slot requestedSlot, IEnumerable <int> steps, out ICollection <Move> movesPlayed)
    {
        movesPlayed = new List <Move>();

        // combined move must at least be 2
        if (steps.Count() < 2)
        {
            return(MoveError.NotEnoughSteps);
        }

        var requiredStep = Slot.GetRequiredStepCount(piece.currentSlot, requestedSlot);
        var stepsWeight  = steps.Sum();
        var forwardSlots = piece.GetForwardSlots();
        var isMovesEqual = steps.First() == steps.Last();

        if (requiredStep < 1)
        {
            return(MoveError.WrongHomeDirection);
        }

        // are moveable steps enough?
        if (stepsWeight < requiredStep)
        {
            return(MoveError.NotEnoughSteps);
        }

        // create referance piece for test
        var pieceRef = Piece.CreateEmpty();

        if (pieceRef == null)
        {
            return(MoveError.Unknown);
        }

        pieceRef.pieceId     = -1;
        pieceRef.pieceType   = piece.pieceType;
        pieceRef.currentSlot = piece.currentSlot;

        // test each moveable step
        MoveError error = MoveError.Unknown;

        foreach (var step in steps)
        {
            var stepsPlayed = movesPlayed.Select(x => x.step);
            var nextSlot    = forwardSlots.Skip((stepsPlayed.Sum() + step) - 1).FirstOrDefault();

            if (nextSlot == null)
            {
                return(MoveError.Unknown);
            }

            MoveActionTypes action;
            error = ValidateMove(pieceRef, nextSlot, step, out action);

            if (error == MoveError.NoError)
            {
                // add move to played list
                // - add step
                // - add action that occurred when moving
                movesPlayed.Add(new Move
                {
                    from   = pieceRef.currentSlot,
                    to     = nextSlot,
                    step   = step,
                    action = action,
                });

                // move referance piece to next slot
                pieceRef.currentSlot = nextSlot;

                // if we achived destination, stop1
                if (nextSlot == requestedSlot)
                {
                    break;
                }
            }
            else
            {
                break;
            }

            if (Slot.GetBar(pieceRef.pieceType).pieces.Count - movesPlayed.Count > 0)
            {
                break;
            }
        }

        // if any error happened and moves are not equal
        if (error != MoveError.NoError && !isMovesEqual)
        {
            // reset variables
            pieceRef.currentSlot = piece.currentSlot;
            movesPlayed.Clear();

            // test each moveable step, but reversed
            foreach (var step in steps.Reverse())
            {
                var stepsPlayed = movesPlayed.Select(x => x.step);
                var nextSlot    = forwardSlots.Skip((stepsPlayed.Sum() + step) - 1).First();

                MoveActionTypes action;
                error = ValidateMove(pieceRef, nextSlot, step, out action);

                if (error == MoveError.NoError)
                {
                    // add move to played list
                    // - add step
                    // - add action that occurred when moving
                    movesPlayed.Add(new Move
                    {
                        from   = pieceRef.currentSlot,
                        to     = nextSlot,
                        step   = step,
                        action = action,
                    });

                    // move referance piece to next slot
                    pieceRef.currentSlot = nextSlot;

                    // if we achived destination, stop
                    if (nextSlot == requestedSlot)
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }

                if (Slot.GetBar(pieceRef.pieceType).pieces.Count - movesPlayed.Count > 0)
                {
                    break;
                }
            }
        }

        Object.Destroy(pieceRef.gameObject);

        if (movesPlayed.Count != 0 && movesPlayed.Last().to != requestedSlot)
        {
            return(MoveError.Unknown);
        }


        return(error);
    }