/// <summary> /// Concat two MoveSets to form one MoveSet. /// </summary> /// <param name="moves1"></param> /// <param name="moves2"></param> internal MoveSet(MoveSet moves1, MoveSet moves2) { validMoves = moves1.validMoves.Concat(moves2.validMoves).ToArray(); threateningMoves = moves1.threateningMoves.Concat(moves2.threateningMoves).ToArray(); blockedMoves = moves1.blockedMoves.Concat(moves2.blockedMoves).ToArray(); }
private void ResetSelected() { moves = null; }
protected override void FirstSquareSelected(ChessBoard board, SquareCoordinates coord, MoveSet moves) { if (board.ShowLegalMoves) foreach (Move legalMove in moves.LegalMoves) board.HighlightSquare(legalMove.Coordinates, Color.Green); if (board.ShowCheckedMoves) foreach (SquareCoordinates checkedMoves in moves.CheckableMoves) board.HighlightSquare(checkedMoves, Color.Indigo); if (board.ShowBlockedMoves) foreach (SquareCoordinates checkedMoves in moves.BlockedSquareMoves) board.HighlightSquare(checkedMoves, Color.Red); if (remoteOpponent != null) remoteOpponent.SendMessage(ChessPacketWriter.WriteSelectSquare(coord)); }
protected abstract void Unselected(ChessBoard board, SquareCoordinates coord, MoveSet moves);
private Move GetMove(MoveSet moves, SquareCoordinates coord) { foreach (Move legalMove in moves.LegalMoves) if (legalMove.Coordinates == coord) return legalMove; return null; }
protected abstract void MadeMove(ChessBoard board, ChessPiece movedPiece, SquareCoordinates from, SquareCoordinates to, MoveSet moves);
protected abstract void PerformedCastle(ChessBoard board, bool kingSide, MoveSet moves);
protected override void Unselected(ChessBoard board, SquareCoordinates coord, MoveSet moves) { }
internal void Select(ChessBoard board, SquareCoordinates coord) { ChessPiece selectedPiece = board.GetPiece(coord); if (moves == null) { if (selectedPiece != null && selectedPiece.White == white) { firstSelection = coord; moves = GameLogic.MoveSet(board, coord, this); board.HighlightSquare(coord, Color.Yellow); FirstSquareSelected(board, coord, moves); } } else { if (coord == firstSelection) { MoveSet prevMoves = moves; ResetSelected(); board.UnhighlightSquare(coord); Unselected(board, coord, prevMoves); } else { Move m = GetMove(moves, coord); if (m != null) { ChessPiece movedPiece, takenPiece = null; MoveSet prevMoves = moves; ResetSelected(); board.UnhighlightSquare(firstSelection); if (m.Overtaken) takenPiece = board.ClearSquare(m.TakenPiece); movedPiece = board.ClearSquare(firstSelection); movedPiece.LastSquare = firstSelection; movedPiece.LastMove = board.CurrentMove; board.DrawPiece(coord, movedPiece); material.MovePiece(movedPiece.Type, firstSelection, coord); MadeMove(board, movedPiece, firstSelection, coord, prevMoves); board.UpdateLastMove(firstSelection, m, movedPiece, takenPiece); board.NextTurn(); } else if (moves.CheckableMoves.Contains(coord) && !board.ShowCheckedMoves) { MessageBox.Show(board, "You may not place the selected piece there\nsince it will either place your king in check\nor will leave your king in check.", "Illegal Move", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } }
protected override void PerformedCastle(ChessBoard board, bool kingSide, MoveSet moves) { }
protected override void MadeMove(ChessBoard board, ChessPiece movedPiece, SquareCoordinates from, SquareCoordinates to, MoveSet moves) { }
protected override void Unselected(ChessBoard board, SquareCoordinates coord, MoveSet moves) { foreach (Move legalMove in moves.LegalMoves) board.UnhighlightSquare(legalMove.Coordinates); foreach (SquareCoordinates checkedMoves in moves.CheckableMoves) board.UnhighlightSquare(checkedMoves); foreach (SquareCoordinates checkedMoves in moves.BlockedSquareMoves) board.UnhighlightSquare(checkedMoves); if (remoteOpponent != null) remoteOpponent.SendMessage(ChessPacketWriter.WriteSelectSquare(coord)); }
protected override void PerformedCastle(ChessBoard board, bool kingSide, MoveSet moves) { if (moves != null) { foreach (Move legalMove in moves.LegalMoves) board.UnhighlightSquare(legalMove.Coordinates); foreach (SquareCoordinates checkedMoves in moves.CheckableMoves) board.UnhighlightSquare(checkedMoves); foreach (SquareCoordinates checkedMoves in moves.BlockedSquareMoves) board.UnhighlightSquare(checkedMoves); } if (remoteOpponent != null) remoteOpponent.SendMessage(ChessPacketWriter.WriteCastle(kingSide)); }
protected override void MadeMove(ChessBoard board, ChessPiece movedPiece, SquareCoordinates from, SquareCoordinates to, MoveSet moves) { foreach (Move legalMove in moves.LegalMoves) board.UnhighlightSquare(legalMove.Coordinates); foreach (SquareCoordinates checkedMoves in moves.CheckableMoves) board.UnhighlightSquare(checkedMoves); foreach (SquareCoordinates checkedMoves in moves.BlockedSquareMoves) board.UnhighlightSquare(checkedMoves); PieceType promoted = PieceType.UNDEFINED; if (movedPiece.IsA(PieceType.PAWN) && (White && to.Rank == 7 || !White && to.Rank == 0)) PromotePiece(board, to, promoted = new PromotionSelect().Prompt(board)); if (remoteOpponent != null) { remoteOpponent.SendMessage(ChessPacketWriter.WriteSelectSquare(to)); if (promoted != PieceType.UNDEFINED) remoteOpponent.SendMessage(ChessPacketWriter.WritePromotion(to, promoted)); } }