diff --git a/Types.scala b/Types.scala new file mode 100644 index 0000000..06338f1 --- /dev/null +++ b/Types.scala @@ -0,0 +1,65 @@ +package gambit + +object Color: + val White = 0 + val Black = 1 + inline def opposite(c: Int): Int = c ^ 1 + +object Piece: + val Empty = 0 + val Pawn = 1 + val Knight = 2 + val Bishop = 3 + val Rook = 4 + val Queen = 5 + val King = 6 + + inline def make(color: Int, pieceType: Int): Int = (color << 3) | pieceType + inline def typeOf(piece: Int): Int = piece & 7 + inline def colorOf(piece: Int): Int = piece >> 3 + + val WhitePawn = make(Color.White, Pawn) + val WhiteKnight = make(Color.White, Knight) + val WhiteBishop = make(Color.White, Bishop) + val WhiteRook = make(Color.White, Rook) + val WhiteQueen = make(Color.White, Queen) + val WhiteKing = make(Color.White, King) + val BlackPawn = make(Color.Black, Pawn) + val BlackKnight = make(Color.Black, Knight) + val BlackBishop = make(Color.Black, Bishop) + val BlackRook = make(Color.Black, Rook) + val BlackQueen = make(Color.Black, Queen) + val BlackKing = make(Color.Black, King) + +object Square: + inline def make(file: Int, rank: Int): Int = rank * 16 + file + inline def fileOf(sq: Int): Int = sq & 7 + inline def rankOf(sq: Int): Int = sq >> 4 + inline def onBoard(sq: Int): Boolean = (sq & 0x88) == 0 + + def name(sq: Int): String = + val file = ('a' + fileOf(sq)).toChar + val rank = ('1' + rankOf(sq)).toChar + s"$file$rank" + + def fromName(s: String): Int = make(s(0) - 'a', s(1) - '1') + +object Castling: + val WhiteKing = 1 + val WhiteQueen = 2 + val BlackKing = 4 + val BlackQueen = 8 + + val mask: Array[Int] = Array.fill(128)(15) + mask(Square.make(4, 0)) = 15 & ~(WhiteKing | WhiteQueen) + mask(Square.make(7, 0)) = 15 & ~WhiteKing + mask(Square.make(0, 0)) = 15 & ~WhiteQueen + mask(Square.make(4, 7)) = 15 & ~(BlackKing | BlackQueen) + mask(Square.make(7, 7)) = 15 & ~BlackKing + mask(Square.make(0, 7)) = 15 & ~BlackQueen + +object Directions: + val knight: Array[Int] = Array(33, 31, 18, 14, -14, -18, -31, -33) + val bishop: Array[Int] = Array(17, 15, -15, -17) + val rook: Array[Int] = Array(16, 1, -1, -16) + val king: Array[Int] = Array(17, 16, 15, 1, -1, -15, -16, -17)