/// <summary> /// Constructor /// </summary> /// <param name="from"></param> /// <param name="to"></param> /// <param name="flags"></param> public MGMove(byte from, byte to, MGChessMoveFlags flags) { Debug.Assert(from != to); Debug.Assert(from < 64); Debug.Assert(to < 64); FromSquareIndex = from; ToSquareIndex = to; Flags = flags; // Obviate requirement of definite assignment to all fields Unsafe.SkipInit <short>(out FromAndToCombined); }
/// <summary> /// Constructor (with piece specified). /// </summary> /// <param name="from"></param> /// <param name="to"></param> /// <param name="piece"></param> /// <param name="flags">optional flags other than piece</param> public MGMove(byte from, byte to, MGPositionConstants.MCChessPositionPieceEnum piece, MGChessMoveFlags flags) { Debug.Assert(from < 64); Debug.Assert(to < 64); Debug.Assert(from != to); Debug.Assert((flags & MGChessMoveFlags.Piece) == 0); // not expected to have already set FromSquareIndex = from; ToSquareIndex = to; Flags = flags; // Obviate requirement of definite assignment to all fields Unsafe.SkipInit <short>(out FromAndToCombined); Piece = piece; }
/// <summary> /// Copy constructor. /// </summary> /// <param name="from"></param> /// <param name="to"></param> /// <param name="flags"></param> public MGMove(MGMove otherMove, bool flip) { if (!flip) { FromSquareIndex = otherMove.FromSquareIndex; ToSquareIndex = otherMove.ToSquareIndex; Flags = otherMove.Flags; } else { FromSquareIndex = FlipSquare(otherMove.FromSquareIndex); ToSquareIndex = FlipSquare(otherMove.ToSquareIndex); Flags = otherMove.Flags ^ MGChessMoveFlags.BlackToMove; } // Obviate requirement of definite assignment to all fields Unsafe.SkipInit <short>(out FromAndToCombined); }