CPG/src/Chess/moves.nim

41 lines
1.3 KiB
Nim

## Handling of moves
import pieces
type
MoveFlag* = enum
## An enumeration of move flags
Default = 0'u16, # No flag
EnPassant = 1, # Move is a capture with en passant
Capture = 2, # Move is a capture
DoublePush = 4, # Move is a double pawn push
# Castling metadata
CastleLong = 8,
CastleShort = 16,
# Pawn promotion metadata
PromoteToQueen = 32,
PromoteToRook = 64,
PromoteToBishop = 128,
PromoteToKnight = 256
Move* = object
## A chess move
startSquare*: Square
targetSquare*: Square
flags*: uint16
func createMove*(startSquare, targetSquare: string, flags: seq[MoveFlag] = @[]): Move =
result = Move(startSquare: startSquare.algebraicToSquare(),
targetSquare: targetSquare.algebraicToSquare(), flags: Default.uint16)
for flag in flags:
result.flags = result.flags or flag.uint16
func createMove*(startSquare, targetSquare: Square, flags: seq[MoveFlag] = @[]): Move =
result = Move(startSquare: startSquare, targetSquare: targetSquare, flags: Default.uint16)
for flag in flags:
result.flags = result.flags or flag.uint16
func nullMove*: Move {.inline.} = createMove(nullSquare(), nullSquare())