|  | @@ -34,7 +34,7 @@ pub enum Move {
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * \brief Iterator to serialize bitboard bit for bit
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  | - * Extracts each bit out of the bitboard and returns each one as a separate bitboard.
 | 
	
		
			
				|  |  | + * Extracts every bit out of the bitboard and returns each one as a separate bitboard.
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  pub struct BitboardIterator { pub board: Bitboard }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -58,7 +58,7 @@ pub fn generate_moves(game: &Game, side: Side) -> Vec<Move> {
 | 
	
		
			
				|  |  |      let mut moves: Vec<Move> = Vec::new();
 | 
	
		
			
				|  |  |      generate_pawn_pushes(game, side, &mut moves);
 | 
	
		
			
				|  |  |      generate_pawn_captures(game, side, &mut moves);
 | 
	
		
			
				|  |  | -    generate_bishop_moves(game, side, &mut moves);
 | 
	
		
			
				|  |  | +    generate_queen_moves(game, side, &mut moves);
 | 
	
		
			
				|  |  |      return moves;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -112,7 +112,7 @@ fn generate_pawn_captures(game: &Game, side: Side, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          for cap in [left_cap, right_cap].iter() {
 | 
	
		
			
				|  |  |              if cap & others != 0 {
 | 
	
		
			
				|  |  | -                let simple_move = SimpleMove { from: pawn.trailing_zeros() as u8, to: cap.trailing_zeros() as u8 };
 | 
	
		
			
				|  |  | +                let simple_move = SimpleMove { from: square(pawn), to: square(*cap) };
 | 
	
		
			
				|  |  |                  if cap & promotion_mask != 0 {
 | 
	
		
			
				|  |  |                      move_list.push(Move::Promotion { mov: simple_move, promote_to: QUEEN });
 | 
	
		
			
				|  |  |                      move_list.push(Move::Promotion { mov: simple_move, promote_to: ROOK });
 | 
	
	
		
			
				|  | @@ -127,6 +127,45 @@ fn generate_pawn_captures(game: &Game, side: Side, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +fn generate_queen_moves(game: &Game, side: Side, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  | +    let friends = game.get_all_side(side);
 | 
	
		
			
				|  |  | +    let others = game.get_all_side(!side);
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    let queens = BitboardIterator { board: game.queens(side) };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for queen in queens {
 | 
	
		
			
				|  |  | +        let destinations = generate_queen_destinations(friends, others, queen);
 | 
	
		
			
				|  |  | +        let dest_iter = BitboardIterator { board: destinations };
 | 
	
		
			
				|  |  | +        for dest in dest_iter {
 | 
	
		
			
				|  |  | +            let smove = SimpleMove{ from: square(queen), to: square(dest) };
 | 
	
		
			
				|  |  | +            move_list.push(Move::Default { mov: smove, piece_type: QUEEN });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +fn generate_queen_destinations(friends: Bitboard, others: Bitboard,
 | 
	
		
			
				|  |  | +                               queen: Bitboard) -> Bitboard {
 | 
	
		
			
				|  |  | +    let occupied = friends | others;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let directions = [north_one, south_one, east_one, west_one,
 | 
	
		
			
				|  |  | +                      northeast_one, southeast_one, northwest_one, southwest_one];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let mut result = 0;
 | 
	
		
			
				|  |  | +    for direction in directions.into_iter() {
 | 
	
		
			
				|  |  | +        let mut q = queen;
 | 
	
		
			
				|  |  | +        loop {
 | 
	
		
			
				|  |  | +            q = direction(q);
 | 
	
		
			
				|  |  | +            result |= q;
 | 
	
		
			
				|  |  | +            if q & (occupied) != 0 || q == 0 {
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return result & !friends;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #[cfg(test)]
 | 
	
		
			
				|  |  |  mod tests {
 | 
	
		
			
				|  |  |      use search::Game;
 |