int castleRights, rule50;
Square epSquare;
Value mgValue, egValue;
+ Value npMaterial[2];
PieceType capture;
Bitboard checkersBB;
friend class EndgameFunctions;
public:
+ enum GamePhase {
+ MidGame,
+ EndGame
+ };
+
// Constructors
Position() {};
Position(const Position& pos);
void print(Move m = MOVE_NONE) const;
// Copying
- void copy(const Position &pos);
- void flipped_copy(const Position &pos);
+ void copy(const Position& pos);
+ void flipped_copy(const Position& pos);
// The piece on a given square
Piece piece_on(Square s) const;
// Information about pawns
bool pawn_is_passed(Color c, Square s) const;
- bool pawn_is_isolated(Color c, Square s) const;
- bool pawn_is_doubled(Color c, Square s) const;
+ static bool pawn_is_passed(Bitboard theirPawns, Color c, Square s);
+ static bool pawn_is_isolated(Bitboard ourPawns, Square s);
+ static bool pawn_is_doubled(Bitboard ourPawns, Color c, Square s);
// Open and half-open files
- bool file_is_open(File f) const;
- bool file_is_half_open(Color c, File f) const;
+ static bool file_is_open(Bitboard pawns, File f);
+ static bool file_is_half_open(Bitboard pawns, File f);
// Weak squares
bool square_is_weak(Square s, Color c) const;
// Doing and undoing moves
- void setStartState(const StateInfo& st);
+ void saveState();
void do_move(Move m, StateInfo& st);
void do_move(Move m, StateInfo& st, Bitboard dcCandidates);
void undo_move(Move m);
int see(Square from, Square to) const;
int see(Move m) const;
int see(Square to) const;
+ int see_sign(Move m) const;
// Accessing hash keys
Key get_key() const;
Value eg_value() const;
Value non_pawn_material(Color c) const;
Phase game_phase() const;
- Value mg_pst_delta(Move m) const;
+ template<GamePhase> Value pst_delta(Piece piece, Square from, Square to) const;
// Game termination checks
bool is_mate() const;
Key compute_material_key() const;
// Computing incremental evaluation scores and material counts
- enum GamePhase {
- MidGame,
- EndGame
- };
template<GamePhase> Value pst(Color c, PieceType pt, Square s) const;
template<GamePhase> Value compute_value() const;
Value compute_non_pawn_material(Color c) const;
Color sideToMove;
int gamePly;
Key history[MaxGameLength];
- Value npMaterial[2];
File initialKFile, initialKRFile, initialQRFile;
StateInfo startState;
StateInfo* st;
return bishops_and_queens() & pieces_of_color(c);
}
-inline Bitboard Position::sliders_of_color(Color c) const {
- return sliders() & pieces_of_color(c);
-}
-
inline int Position::piece_count(Color c, PieceType pt) const {
return pieceCount[c][pt];
}
return StepAttackBB[piece_of_color_and_type(c, PAWN)][s];
}
-template<>
-inline Bitboard Position::piece_attacks<PAWN>(Square s) const {
- return StepAttackBB[piece_of_color_and_type(opposite_color(sideToMove), PAWN)][s];
+template<PieceType Piece> // Knight and King
+inline Bitboard Position::piece_attacks(Square s) const {
+ return StepAttackBB[Piece][s];
}
template<>
-inline Bitboard Position::piece_attacks<KNIGHT>(Square s) const {
- return StepAttackBB[KNIGHT][s];
+inline Bitboard Position::piece_attacks<PAWN>(Square s) const {
+ return StepAttackBB[piece_of_color_and_type(opposite_color(sideToMove), PAWN)][s];
}
template<>
return piece_attacks<ROOK>(s) | piece_attacks<BISHOP>(s);
}
-template<>
-inline Bitboard Position::piece_attacks<KING>(Square s) const {
- return StepAttackBB[KING][s];
-}
-
inline Bitboard Position::checkers() const {
return st->checkersBB;
}
return !(pawns(opposite_color(c)) & passed_pawn_mask(c, s));
}
-inline bool Position::pawn_is_isolated(Color c, Square s) const {
- return !(pawns(c) & neighboring_files_bb(s));
+inline bool Position::pawn_is_passed(Bitboard theirPawns, Color c, Square s) {
+ return !(theirPawns & passed_pawn_mask(c, s));
+}
+
+inline bool Position::pawn_is_isolated(Bitboard ourPawns, Square s) {
+ return !(ourPawns & neighboring_files_bb(s));
}
-inline bool Position::pawn_is_doubled(Color c, Square s) const {
- return pawns(c) & squares_behind(c, s);
+inline bool Position::pawn_is_doubled(Bitboard ourPawns, Color c, Square s) {
+ return ourPawns & squares_behind(c, s);
}
-inline bool Position::file_is_open(File f) const {
- return !(pawns() & file_bb(f));
+inline bool Position::file_is_open(Bitboard pawns, File f) {
+ return !(pawns & file_bb(f));
}
-inline bool Position::file_is_half_open(Color c, File f) const {
- return !(pawns(c) & file_bb(f));
+inline bool Position::file_is_half_open(Bitboard pawns, File f) {
+ return !(pawns & file_bb(f));
}
inline bool Position::square_is_weak(Square s, Color c) const {
return st->materialKey;
}
-template<Position::GamePhase Phase>
+template<Position::GamePhase Ph>
inline Value Position::pst(Color c, PieceType pt, Square s) const {
- return (Phase == MidGame ? MgPieceSquareTable[piece_of_color_and_type(c, pt)][s]
- : EgPieceSquareTable[piece_of_color_and_type(c, pt)][s]);
+ return (Ph == MidGame ? MgPieceSquareTable[piece_of_color_and_type(c, pt)][s]
+ : EgPieceSquareTable[piece_of_color_and_type(c, pt)][s]);
}
-inline Value Position::mg_pst_delta(Move m) const {
- return MgPieceSquareTable[piece_on(move_from(m))][move_to(m)]
- -MgPieceSquareTable[piece_on(move_from(m))][move_from(m)];
+template<Position::GamePhase Ph>
+inline Value Position::pst_delta(Piece piece, Square from, Square to) const {
+ return (Ph == MidGame ? MgPieceSquareTable[piece][to] - MgPieceSquareTable[piece][from]
+ : EgPieceSquareTable[piece][to] - EgPieceSquareTable[piece][from]);
}
inline Value Position::mg_value() const {
}
inline Value Position::non_pawn_material(Color c) const {
- return npMaterial[c];
+ return st->npMaterial[c];
}
inline Phase Position::game_phase() const {
// Values modified by Joona Kiiski
- static const Value MidgameLimit = Value(15713);
- static const Value EndgameLimit = Value(4428);
+ static const Value MidgameLimit = Value(15581);
+ static const Value EndgameLimit = Value(3998);
Value npm = non_pawn_material(WHITE) + non_pawn_material(BLACK);