@@ -98,21 +98,21 @@ impl MoveGen {
9898 let mut movelist = NoDrop :: new ( ArrayVec :: < [ SquareAndBitBoard ; 18 ] > :: new ( ) ) ;
9999
100100 if checkers == EMPTY {
101- PawnType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ;
102- KnightType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ;
103- BishopType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ;
104- RookType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ;
105- QueenType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ;
106- KingType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ;
101+ PawnType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, None ) ;
102+ KnightType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, None ) ;
103+ BishopType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, None ) ;
104+ RookType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, None ) ;
105+ QueenType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, None ) ;
106+ KingType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, None ) ;
107107 } else if checkers. popcnt ( ) == 1 {
108- PawnType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
109- KnightType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
110- BishopType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
111- RookType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
112- QueenType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
113- KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
108+ PawnType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
109+ KnightType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
110+ BishopType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
111+ RookType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
112+ QueenType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
113+ KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
114114 } else {
115- KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
115+ KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
116116 }
117117
118118 movelist
@@ -144,12 +144,12 @@ impl MoveGen {
144144 KingType :: legals :: < InCheckType > ,
145145 ]
146146 } else {
147- KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
147+ KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
148148 return movelist. len ( ) != 0 ;
149149 } ;
150150
151151 for f in legal_fns {
152- f ( & mut movelist, & board, mask) ;
152+ f ( & mut movelist, & board, mask, None ) ;
153153 if movelist. len ( ) != 0 {
154154 return true ;
155155 }
@@ -218,6 +218,66 @@ impl MoveGen {
218218 }
219219 }
220220
221+ pub fn legal_destinations_from ( board : & Board , square : Square ) -> BitBoard {
222+ let piece = board. piece_on ( square) ;
223+ if piece. is_none ( ) {
224+ return EMPTY ;
225+ }
226+
227+ let piece = piece. unwrap ( ) ;
228+ let checkers = * board. checkers ( ) ;
229+ let mask = !board. color_combined ( board. side_to_move ( ) ) ;
230+ let mut movelist = NoDrop :: new ( ArrayVec :: < [ SquareAndBitBoard ; 18 ] > :: new ( ) ) ;
231+
232+ if checkers == EMPTY {
233+ match piece {
234+ Piece :: Pawn => {
235+ PawnType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, Some ( square) )
236+ }
237+ Piece :: Knight => {
238+ KnightType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, Some ( square) )
239+ }
240+ Piece :: Bishop => {
241+ BishopType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, Some ( square) )
242+ }
243+ Piece :: Rook => {
244+ RookType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, Some ( square) )
245+ }
246+ Piece :: Queen => {
247+ QueenType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, Some ( square) )
248+ }
249+ Piece :: King => {
250+ KingType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask, Some ( square) )
251+ }
252+ }
253+ } else if checkers. popcnt ( ) == 1 {
254+ match piece {
255+ Piece :: Pawn => {
256+ PawnType :: legals :: < InCheckType > ( & mut movelist, & board, mask, Some ( square) )
257+ }
258+ Piece :: Knight => {
259+ KnightType :: legals :: < InCheckType > ( & mut movelist, & board, mask, Some ( square) )
260+ }
261+ Piece :: Bishop => {
262+ BishopType :: legals :: < InCheckType > ( & mut movelist, & board, mask, Some ( square) )
263+ }
264+ Piece :: Rook => {
265+ RookType :: legals :: < InCheckType > ( & mut movelist, & board, mask, Some ( square) )
266+ }
267+ Piece :: Queen => {
268+ QueenType :: legals :: < InCheckType > ( & mut movelist, & board, mask, Some ( square) )
269+ }
270+ Piece :: King => {
271+ KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask, Some ( square) )
272+ }
273+ }
274+ } else {
275+ KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask, Some ( square) ) ;
276+ }
277+
278+ movelist. iter ( ) . fold ( EMPTY , |acc, x| acc | x. bitboard )
279+ }
280+
221281 pub fn legal_unsanitized ( board : & Board , chess_move : ChessMove ) -> bool {
222282 let piece = board. piece_on ( chess_move. get_source ( ) ) ;
223283 if piece. is_none ( ) {
@@ -231,25 +291,85 @@ impl MoveGen {
231291
232292 if checkers == EMPTY {
233293 match piece {
234- Piece :: Pawn => PawnType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ,
235- Piece :: Knight => KnightType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ,
236- Piece :: Bishop => BishopType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ,
237- Piece :: Rook => RookType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ,
238- Piece :: Queen => QueenType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ,
239- Piece :: King => KingType :: legals :: < NotInCheckType > ( & mut movelist, & board, mask) ,
294+ Piece :: Pawn => PawnType :: legals :: < NotInCheckType > (
295+ & mut movelist,
296+ & board,
297+ mask,
298+ Some ( chess_move. get_source ( ) ) ,
299+ ) ,
300+ Piece :: Knight => KnightType :: legals :: < NotInCheckType > (
301+ & mut movelist,
302+ & board,
303+ mask,
304+ Some ( chess_move. get_source ( ) ) ,
305+ ) ,
306+ Piece :: Bishop => BishopType :: legals :: < NotInCheckType > (
307+ & mut movelist,
308+ & board,
309+ mask,
310+ Some ( chess_move. get_source ( ) ) ,
311+ ) ,
312+ Piece :: Rook => RookType :: legals :: < NotInCheckType > (
313+ & mut movelist,
314+ & board,
315+ mask,
316+ Some ( chess_move. get_source ( ) ) ,
317+ ) ,
318+ Piece :: Queen => QueenType :: legals :: < NotInCheckType > (
319+ & mut movelist,
320+ & board,
321+ mask,
322+ Some ( chess_move. get_source ( ) ) ,
323+ ) ,
324+ Piece :: King => KingType :: legals :: < NotInCheckType > (
325+ & mut movelist,
326+ & board,
327+ mask,
328+ Some ( chess_move. get_source ( ) ) ,
329+ ) ,
240330 }
241331 } else if checkers. popcnt ( ) == 1 {
242332 match piece {
243- Piece :: Pawn => PawnType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ,
244- Piece :: Knight => KnightType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ,
245- Piece :: Bishop => BishopType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ,
246- Piece :: Rook => RookType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ,
247- Piece :: Queen => QueenType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ,
248- Piece :: King => KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ,
333+ Piece :: Pawn => PawnType :: legals :: < InCheckType > (
334+ & mut movelist,
335+ & board,
336+ mask,
337+ Some ( chess_move. get_source ( ) ) ,
338+ ) ,
339+ Piece :: Knight => KnightType :: legals :: < InCheckType > (
340+ & mut movelist,
341+ & board,
342+ mask,
343+ Some ( chess_move. get_source ( ) ) ,
344+ ) ,
345+ Piece :: Bishop => BishopType :: legals :: < InCheckType > (
346+ & mut movelist,
347+ & board,
348+ mask,
349+ Some ( chess_move. get_source ( ) ) ,
350+ ) ,
351+ Piece :: Rook => RookType :: legals :: < InCheckType > (
352+ & mut movelist,
353+ & board,
354+ mask,
355+ Some ( chess_move. get_source ( ) ) ,
356+ ) ,
357+ Piece :: Queen => QueenType :: legals :: < InCheckType > (
358+ & mut movelist,
359+ & board,
360+ mask,
361+ Some ( chess_move. get_source ( ) ) ,
362+ ) ,
363+ Piece :: King => KingType :: legals :: < InCheckType > (
364+ & mut movelist,
365+ & board,
366+ mask,
367+ Some ( chess_move. get_source ( ) ) ,
368+ ) ,
249369 }
250370 } else {
251371 if matches ! ( piece, Piece :: King ) {
252- KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask) ;
372+ KingType :: legals :: < InCheckType > ( & mut movelist, & board, mask, None ) ;
253373 }
254374 } ;
255375
0 commit comments