|  | @@ -271,8 +271,13 @@ pub fn sort_moves(game: &mut Game, hash: &mut Cache, killers: &[Move], move_list
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -pub fn sort_moves_least_valuable_attacker(game: &mut Game, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  | -    const piece_values: [i32; 6] = [
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +///
 | 
	
		
			
				|  |  | +/// assigns a score to capture moves lower the more valuable the captured piece. Secondly
 | 
	
		
			
				|  |  | +/// also higher the more the attacking piece is worth.
 | 
	
		
			
				|  |  | +/// 
 | 
	
		
			
				|  |  | +fn lva_mvv_score(mov: &Move) -> i32 {
 | 
	
		
			
				|  |  | +    const PIECE_VALUES: [i32; 6] = [
 | 
	
		
			
				|  |  |          100, // Pawn
 | 
	
		
			
				|  |  |          220, // Knight
 | 
	
		
			
				|  |  |          320, // Bishop
 | 
	
	
		
			
				|  | @@ -281,22 +286,21 @@ pub fn sort_moves_least_valuable_attacker(game: &mut Game, move_list: &mut Vec<M
 | 
	
		
			
				|  |  |          100000 // King
 | 
	
		
			
				|  |  |      ];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    let lva_mvv_score= |mov: &Move| {
 | 
	
		
			
				|  |  | -        let v = match mov {
 | 
	
		
			
				|  |  | -            Move::Default { mov: _, piece_type, captured } => {
 | 
	
		
			
				|  |  | -                let attack = piece_values[*piece_type as usize];
 | 
	
		
			
				|  |  | -                let victim = captured.map(|ct| piece_values[ct as usize]).unwrap_or(0);
 | 
	
		
			
				|  |  | -                attack - victim * 5
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | -            Move::Promotion { mov: _, promote_to: _, captured } => {
 | 
	
		
			
				|  |  | -                let victim = captured.map(|ct| piece_values[ct as usize]).unwrap_or(0);
 | 
	
		
			
				|  |  | -                piece_values[PAWN as usize] - victim * 5
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | -            _ => 0
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        v
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +    match mov {
 | 
	
		
			
				|  |  | +        Move::Default { mov: _, piece_type, captured } => {
 | 
	
		
			
				|  |  | +            let attack = PIECE_VALUES[*piece_type as usize];
 | 
	
		
			
				|  |  | +            let victim = captured.map(|ct| PIECE_VALUES[ct as usize]).unwrap_or(0);
 | 
	
		
			
				|  |  | +            attack - victim * 5
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        Move::Promotion { mov: _, promote_to: _, captured } => {
 | 
	
		
			
				|  |  | +            let victim = captured.map(|ct| PIECE_VALUES[ct as usize]).unwrap_or(0);
 | 
	
		
			
				|  |  | +            PIECE_VALUES[PAWN as usize] - victim * 5
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _ => 0
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +pub fn sort_moves_least_valuable_attacker(game: &mut Game, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  |      move_list.sort_by_cached_key(lva_mvv_score)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -311,35 +315,6 @@ pub fn sort_moves_no_hash(game: &mut Game, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -pub fn sort_quiescence(game: &mut Game, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  | -    let value_piece = |pt| {
 | 
	
		
			
				|  |  | -        match pt {
 | 
	
		
			
				|  |  | -            PAWN => 1,
 | 
	
		
			
				|  |  | -            KNIGHT => 2,
 | 
	
		
			
				|  |  | -            BISHOP => 3,
 | 
	
		
			
				|  |  | -            ROOK => 4,
 | 
	
		
			
				|  |  | -            QUEEN => 5,
 | 
	
		
			
				|  |  | -            KING => 6,
 | 
	
		
			
				|  |  | -            _ => 0,
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    move_list.sort_by_cached_key(|mov| {
 | 
	
		
			
				|  |  | -        match *mov {
 | 
	
		
			
				|  |  | -            Move::Default{ mov: _, piece_type, captured: Some(c) } => {
 | 
	
		
			
				|  |  | -                value_piece(piece_type) - value_piece(c)
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | -            Move::Promotion{ mov: _, promote_to: _, captured: Some(c) } => {
 | 
	
		
			
				|  |  | -                value_piece(PAWN) - value_piece(c)
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | -            Move::EnPassant{ mov: _, beaten } => {
 | 
	
		
			
				|  |  | -                value_piece(PAWN) - value_piece(game.get_square(beaten).0)
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | -            _ => 0
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  fn generate_pawn_pushes(game: &Game, side: Side, move_list: &mut Vec<Move>) {
 | 
	
		
			
				|  |  |      let pawns = game.pawns(side);
 |