public MoveException(string message, IMove move, Color activePlayer, IBoard board = null) : this(message + $"\r\n{activePlayer.ToString()}'s move: {move}", board) { Error = MoveError.NoneSet; }
public MoveException(string message, IBoard board = null) : base(message) { Error = MoveError.NoneSet; Board = board; }
public MoveException(string message, Exception innerException) : base(message, innerException) { Error = MoveError.NoneSet; }
public MoveException() { Error = MoveError.NoneSet; }
virtual protected void MoveErrorResponseHandler(MoveError moveError) { }
private void OnFailedMove(MoveError error) { ResetToOldPosition(); Debug.LogError(error); }
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(); }
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); }