-////
-//// Constants and variables
-////
-
-const PieceType PieceTypeMin = PAWN;
-const PieceType PieceTypeMax = KING;
-
-extern const int SlidingArray[18];
-extern const SquareDelta Directions[16][16];
-extern const SquareDelta PawnPush[2];
-
-
-////
-//// Inline functions
-////
-
-inline Piece operator+ (Piece p, int i) { return Piece(int(p) + i); }
-inline void operator++ (Piece &p, int) { p = Piece(int(p) + 1); }
-inline Piece operator- (Piece p, int i) { return Piece(int(p) - i); }
-inline void operator-- (Piece &p, int) { p = Piece(int(p) - 1); }
-inline PieceType operator+ (PieceType p, int i) {return PieceType(int(p) + i);}
-inline void operator++ (PieceType &p, int) { p = PieceType(int(p) + 1); }
-inline PieceType operator- (PieceType p, int i) {return PieceType(int(p) - i);}
-inline void operator-- (PieceType &p, int) { p = PieceType(int(p) - 1); }
+ENABLE_OPERATORS_ON(PieceType)
+ENABLE_OPERATORS_ON(Piece)
+ENABLE_OPERATORS_ON(Color)
+
+/// Important: If the material values are changed, one must also
+/// adjust the piece square tables, and the method game_phase() in the
+/// Position class!
+///
+/// Values modified by Joona Kiiski
+
+const Value PawnValueMidgame = Value(0x0C6);
+const Value PawnValueEndgame = Value(0x102);
+const Value KnightValueMidgame = Value(0x331);
+const Value KnightValueEndgame = Value(0x34E);
+const Value BishopValueMidgame = Value(0x344);
+const Value BishopValueEndgame = Value(0x359);
+const Value RookValueMidgame = Value(0x4F6);
+const Value RookValueEndgame = Value(0x4FE);
+const Value QueenValueMidgame = Value(0x9D9);
+const Value QueenValueEndgame = Value(0x9FE);
+
+inline Piece make_piece(Color c, PieceType pt) {
+ return Piece((int(c) << 3) | int(pt));
+}