Rev 33 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 33 | Rev 108 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | #include "chess.h" | 1 | #include "chess.h" | 
| 2 | #include "data.h" | 2 | #include "data.h" | 
| 3 | /* last modified  | 3 | /* last modified 01/06/16 */ | 
| 4 | /* | 4 | /* | 
| 5 |  ******************************************************************************* | 5 |  ******************************************************************************* | 
| 6 |  *                                                                             * | 6 |  *                                                                             * | 
| 7 |  *   UnmakeMove() is responsible for updating the position database whenever a * | 7 |  *   UnmakeMove() is responsible for updating the position database whenever a * | 
| 8 |  *   move is retracted.  It is the exact inverse of MakeMove(). The hash       * | 8 |  *   move is retracted.  It is the exact inverse of MakeMove(). The hash       * | 
| 9 |  *   signature(s) are not updated, they are just restored to their status that * | 9 |  *   signature(s) are not updated, they are just restored to their status that * | 
| 10 |  *   was saved before the move was made, to save time.                         * | 10 |  *   was saved before the move was made, to save time.                         * | 
| 11 |  *                                                                             * | 11 |  *                                                                             * | 
| 12 |  ******************************************************************************* | 12 |  ******************************************************************************* | 
| 13 |  */ | 13 |  */ | 
| 14 | void UnmakeMove(TREE * RESTRICT tree, int ply, int | 14 | void UnmakeMove(TREE * RESTRICT tree, int ply, int side, int move) { | 
| 15 | uint64_t bit_move; | 15 | uint64_t bit_move; | 
| 16 | int piece, from, to, captured, promote, enemy = Flip(side); | 16 | int piece, from, to, captured, promote, enemy = Flip(side); | 
| 17 | 17 | ||
| 18 | /* | 18 | /* | 
| 19 |  ************************************************************ | 19 |  ************************************************************ | 
| 20 |  *                                                          * | 20 |  *                                                          * | 
| 21 |  *  First, restore the hash signatures to their state prior * | 21 |  *  First, restore the hash signatures to their state prior * | 
| 22 |  *  to this move being  | 22 |  *  to this move being made by simply copying the old       * | 
| 23 |  *   | 23 |  *  values.                                                 * | 
| 24 |  *                                                          * | 24 |  *                                                          * | 
| 25 |  ************************************************************ | 25 |  ************************************************************ | 
| 26 |  */ | 26 |  */ | 
| 27 | HashKey = tree->save_hash_key[ply]; | 27 | HashKey = tree->save_hash_key[ply]; | 
| 28 | PawnHashKey = tree->save_pawn_hash_key[ply]; | 28 | PawnHashKey = tree->save_pawn_hash_key[ply]; | 
| Line 46... | Line 46... | ||
| 46 | PcOnSq(from) = pieces[side][piece]; | 46 | PcOnSq(from) = pieces[side][piece]; | 
| 47 | /* | 47 | /* | 
| 48 |  ************************************************************ | 48 |  ************************************************************ | 
| 49 |  *                                                          * | 49 |  *                                                          * | 
| 50 |  *  Now do the piece-specific things by jumping to the      * | 50 |  *  Now do the piece-specific things by jumping to the      * | 
| 51 |  *  appropriate routine | 51 |  *  appropriate routine (this only has to deal with pawns   * | 
| - | 52 |  *  and king moves that are castling moves.                 * | |
| 52 |  *                                                          * | 53 |  *                                                          * | 
| 53 |  ************************************************************ | 54 |  ************************************************************ | 
| 54 |  */ | 55 |  */ | 
| 55 | switch (piece) { | 56 | switch (piece) { | 
| 56 | case pawn: | 57 | case pawn: | 
| Line 72... | Line 73... | ||
| 72 | Clear(to, Pieces(side, promote)); | 73 | Clear(to, Pieces(side, promote)); | 
| 73 | Material -= PieceValues(side, promote); | 74 | Material -= PieceValues(side, promote); | 
| 74 | Material += PieceValues(side, pawn); | 75 | Material += PieceValues(side, pawn); | 
| 75 | TotalPieces(side, occupied) -= p_vals[promote]; | 76 | TotalPieces(side, occupied) -= p_vals[promote]; | 
| 76 | TotalPieces(side, promote)--; | 77 | TotalPieces(side, promote)--; | 
| 77 | switch (promote) { | - | |
| 78 | case knight: | - | |
| 79 | case bishop: | - | |
| 80 | TotalMinors(side)--; | - | |
| 81 | break; | - | |
| 82 | case rook: | - | |
| 83 | TotalMajors(side)--; | - | |
| 84 | break; | - | |
| 85 | case queen: | - | |
| 86 | TotalMajors(side) -= 2; | - | |
| 87 | break; | - | |
| 88 |         } | - | |
| 89 |       } | 78 |       } | 
| 90 | break; | 79 | break; | 
| 91 | case knight: | 80 | case knight: | 
| 92 | case bishop: | 81 | case bishop: | 
| 93 | case rook: | 82 | case rook: | 
| Line 126... | Line 115... | ||
| 126 | Material += PieceValues(enemy, captured); | 115 | Material += PieceValues(enemy, captured); | 
| 127 | PcOnSq(to) = pieces[enemy][captured]; | 116 | PcOnSq(to) = pieces[enemy][captured]; | 
| 128 | TotalPieces(enemy, captured)++; | 117 | TotalPieces(enemy, captured)++; | 
| 129 | if (captured != pawn) | 118 | if (captured != pawn) | 
| 130 | TotalPieces(enemy, occupied) += p_vals[captured]; | 119 | TotalPieces(enemy, occupied) += p_vals[captured]; | 
| 131 | switch (captured) { | - | |
| 132 | case pawn: | - | |
| 133 | break; | - | |
| 134 | case knight: | - | |
| 135 | case bishop: | - | |
| 136 | TotalMinors(enemy)++; | - | |
| 137 | break; | - | |
| 138 | case rook: | - | |
| 139 | TotalMajors(enemy)++; | - | |
| 140 | break; | - | |
| 141 | case queen: | - | |
| 142 | TotalMajors(enemy) += 2; | - | |
| 143 | break; | - | |
| 144 | case king: | - | |
| 145 | break; | - | |
| 146 |     } | - | |
| 147 |   } | 120 |   } | 
| 148 | #if defined(DEBUG) | 121 | #if defined(DEBUG) | 
| 149 | ValidatePosition(tree, ply, move, "UnmakeMove(1)"); | 122 | ValidatePosition(tree, ply, move, "UnmakeMove(1)"); | 
| 150 | #endif | 123 | #endif | 
| 151 | return; | 124 | return; |