protected override void InitializePiecesCollection()
        {
            void InitializeSide(Int32 yPieceCoordinate, Int32 firstPieceId, EPieceColor sideColor, Boolean mirrorOverX)
            {
                Int32 xPieceCoordinate;

                for (xPieceCoordinate = 0; xPieceCoordinate < 8; xPieceCoordinate++)
                {
                    _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.Pawn, sideColor, new CTile(xPieceCoordinate, yPieceCoordinate)));
                }

                if (mirrorOverX)
                {
                    --yPieceCoordinate;
                }
                else
                {
                    ++yPieceCoordinate;
                }

                xPieceCoordinate = 0;

                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.Rook, sideColor, new CTile(xPieceCoordinate++, yPieceCoordinate)));
                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.Knight, sideColor, new CTile(xPieceCoordinate++, yPieceCoordinate)));
                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.Bishop, sideColor, new CTile(xPieceCoordinate++, yPieceCoordinate)));
                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.Queen, sideColor, new CTile(xPieceCoordinate++, yPieceCoordinate)));
                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.King, sideColor, new CTile(xPieceCoordinate++, yPieceCoordinate)));
                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.Bishop, sideColor, new CTile(xPieceCoordinate++, yPieceCoordinate)));
                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId++, EPieceType.Knight, sideColor, new CTile(xPieceCoordinate++, yPieceCoordinate)));
                _pieces.Add(firstPieceId, CPiece.Create(firstPieceId, EPieceType.Rook, sideColor, new CTile(xPieceCoordinate, yPieceCoordinate)));
            }

            InitializeSide(6, 1, EPieceColor.White, false);
            InitializeSide(1, 17, EPieceColor.Black, true);
        }
        public void HandleCollision(Int32 invaderId, Int32 capturedId, Boolean isCollisionStopsMoving)
        {
            if (!_pieces.ContainsKey(invaderId))
            {
                throw new InvalidOperationException($"Invader piece {invaderId} already captured");
            }
            if (!_pieces.ContainsKey(capturedId))
            {
                throw new InvalidOperationException($"Captured piece {capturedId} already captured");
            }
            CPiece invaderPiece  = _pieces[invaderId];
            CPiece capturedPiece = _pieces[capturedId];

            _attachedBoard.BoardCanvas.Children.Remove(capturedPiece);
            if (isCollisionStopsMoving)
            {
                invaderPiece.StopAnimation();
                invaderPiece.AnimatePiece(capturedPiece.Margin);
            }
            else if (capturedPiece.CurrentAnimation != null)
            {
                capturedPiece.StopAnimation();
                if (capturedPiece.AttachedTile != null)
                {
                    _attachedTiles.Remove(capturedPiece.AttachedTile);
                }
            }
            if (capturedPiece.AttachedTimeoutIndicator != null)
            {
                _attachedBoard.BoardCanvas.Children.Remove(capturedPiece.AttachedTimeoutIndicator);
            }
            _pieces.Remove(capturedId);
        }
        public void MovePiece(Int32 pieceId, CPoint newPosition)
        {
            CPiece piece = _pieces[pieceId];

            _boardStates.ResetToDefault(new CTile(piece.Margin));
            piece.IsActive = false;
            piece.AnimatePiece(new Thickness(newPosition.X, newPosition.Y, 0, 0));
        }
 private void RemoveAttachedTile(CPiece piece)
 {
     if (piece.AttachedTile != null)
     {
         _attachedTiles.Remove(piece.AttachedTile);
         piece.AttachedTile = null;
     }
 }
        private CPieceProjection PutNewProjectionOnBoard(CPiece piece)
        {
            CPieceProjection projection = new CPieceProjection(piece);

            _attachedBoard.BoardCanvas.Children.Add(projection);
            Panel.SetZIndex(projection, (Int32)EZIndex.PieceProjection);
            return(projection);
        }
 private EventHandler GetTimeoutIndicatorAnimationCompletedEventHandler(CPiece piece)
 {
     return((obj, args) =>
     {
         piece.IsActive = true;
         _attachedBoard.BoardCanvas.Children.Remove(piece.AttachedTimeoutIndicator);
         piece.AttachedTimeoutIndicator = null;
     });
 }
        private void MouseDownPieceEventHandler(Object pieceObject, MouseEventArgs args)
        {
            CPiece piece = (CPiece)pieceObject;

            if (piece.IsActive)
            {
                using CPieceProjection projection = PutNewProjectionOnBoard(piece);
                DragDrop.DoDragDrop(projection.Parent, projection, DragDropEffects.Move);
            }
        }
 private EventHandler GetMovementAnimationCompletedEventHandler(CBoardOccupancy states, CPiece piece)
 {
     return((obj, args) =>
     {
         states[new CTile(piece.Margin)] = piece.Color;
         RemoveAttachedTile(piece);
         Rectangle timeoutIndicator = PutNewTimeoutIndicatorOnBoard(piece.Margin);
         piece.AttachedTimeoutIndicator = timeoutIndicator;
         DoubleAnimation timeoutIndicatorAnimation = GetNewTimeoutIndicatorAnimation();
         timeoutIndicatorAnimation.Completed += GetTimeoutIndicatorAnimationCompletedEventHandler(piece);
         timeoutIndicator.BeginAnimation(Rectangle.HeightProperty, timeoutIndicatorAnimation);
     });
 }