|  | @@ -4,6 +4,8 @@ use bitboard::*;
 | 
											
												
													
														|  |  use game::Game;
 |  |  use game::Game;
 | 
											
												
													
														|  |  use hash::{Cache, EntryType};
 |  |  use hash::{Cache, EntryType};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +use crate::hash::CacheEntry;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  pub type Side = bool;
 |  |  pub type Side = bool;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  pub const WHITE: Side = false;
 |  |  pub const WHITE: Side = false;
 | 
											
										
											
												
													
														|  | @@ -202,7 +204,7 @@ pub fn generate_legal_moves(game: &mut Game, side: Side) -> Vec<Move> {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -pub fn generate_legal_sorted_moves(game: &mut Game, hash: &mut Cache, killers: &[Move], side: Side) -> Vec<Move> {
 |  | 
 | 
											
												
													
														|  | 
 |  | +pub fn generate_legal_sorted_moves(game: &mut Game, hash: &mut Cache, killers: &[Move], ce: Option<CacheEntry>, side: Side) -> Vec<Move> {
 | 
											
												
													
														|  |      let moves = generate_moves(game, side);
 |  |      let moves = generate_moves(game, side);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      let illegal_value = crate::evaluate::MAX_VALUE;
 |  |      let illegal_value = crate::evaluate::MAX_VALUE;
 | 
											
										
											
												
													
														|  | @@ -216,27 +218,14 @@ pub fn generate_legal_sorted_moves(game: &mut Game, hash: &mut Cache, killers: &
 | 
											
												
													
														|  |              return illegal_value;
 |  |              return illegal_value;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if let Some(e) = hash.lookup(game) {
 |  | 
 | 
											
												
													
														|  | -            game.undo_move(undo);
 |  | 
 | 
											
												
													
														|  | -            if let EntryType::Value = e.entry_type {
 |  | 
 | 
											
												
													
														|  | -                return e.value;
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            else if let EntryType::LowerBound = e.entry_type {
 |  | 
 | 
											
												
													
														|  | -                return e.value - 1000;
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            else if let EntryType::UpperBound = e.entry_type {
 |  | 
 | 
											
												
													
														|  | -                return e.value + 1000;
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            else {
 |  | 
 | 
											
												
													
														|  | -                return crate::evaluate::evaluate(game) - if killers.contains(mov) { 200 } else { 0 };
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        else {
 |  | 
 | 
											
												
													
														|  | -            let eval = crate::evaluate::evaluate(game) - if killers.contains(mov) { 200 } else { 0 };
 |  | 
 | 
											
												
													
														|  | -            game.undo_move(undo);
 |  | 
 | 
											
												
													
														|  | -            return eval;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        let pv_bonus = if let Some(c) = &ce { if &c.mov == mov { 1000 } else { 0 } } else { 0 };
 | 
											
												
													
														|  | 
 |  | +        let killer_bonus = if killers.contains(mov) { 200 } else { 0 };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        let eval = crate::evaluate::evaluate(game) - killer_bonus - pv_bonus;
 | 
											
												
													
														|  | 
 |  | +        game.undo_move(undo);
 | 
											
												
													
														|  | 
 |  | +        return eval;
 | 
											
												
													
														|  |      };
 |  |      };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      let mut amovs: Vec<_> = moves.iter().map(|m| (*m, mov_val_and_legality(m))).collect();
 |  |      let mut amovs: Vec<_> = moves.iter().map(|m| (*m, mov_val_and_legality(m))).collect();
 | 
											
												
													
														|  |      amovs.sort_unstable_by_key(|x| x.1);
 |  |      amovs.sort_unstable_by_key(|x| x.1);
 | 
											
												
													
														|  |  
 |  |  
 |