Rev 108 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 33 | pmbaty | 1 | #include "chess.h" | 
| 2 | #include "data.h" | ||
| 3 | /* last modified 05/08/14 */ | ||
| 4 | /* | ||
| 5 |  ******************************************************************************* | ||
| 6 |  *                                                                             * | ||
| 7 |  *   Edit() is used to edit (alter) the current board position.  It clears the * | ||
| 8 |  *   board and then allows the operator to enter a position using the syntax   * | ||
| 9 |  *   defined by the xboard/winboard "edit" command.                            * | ||
| 10 |  *                                                                             * | ||
| 11 |  *   White sets the color of pieces added to white.  This color will stay in   * | ||
| 12 |  *   effect until specifically changed.                                        * | ||
| 13 |  *                                                                             * | ||
| 14 |  *   Black sets the color of pieces added to black.  This color will stay in   * | ||
| 15 |  *   effect until specifically changed.                                        * | ||
| 16 |  *                                                                             * | ||
| 17 |  *   # clears the chessboard completely.                                       * | ||
| 18 |  *                                                                             * | ||
| 19 |  *   C changes (toggles) the color of pieces being placed on the board.        * | ||
| 20 |  *                                                                             * | ||
| 21 |  *   End (or . for ICS/Xboard) terminates Edit().                              * | ||
| 22 |  *                                                                             * | ||
| 23 |  *   Pieces are placed on the board by three character "commands" of the form  * | ||
| 24 |  *   [piece][square] where piece is a member of the normal set of pieces       * | ||
| 25 |  *   {P,N,B,R,Q,K} and [square] is algebraic square notation (a1-h8).  Ex: Ke8 * | ||
| 26 |  *   puts a king (of the current "color") on square e8.                        * | ||
| 27 |  *                                                                             * | ||
| 28 |  ******************************************************************************* | ||
| 29 |  */ | ||
| 30 | void Edit(void) { | ||
| 31 | int athome = 1, i, piece, readstat, square, tfile, trank, wtm = 1, error = | ||
| 32 | 0; | ||
| 33 | static const char pieces[] = | ||
| 34 | { 'x', 'X', 'P', 'p', 'N', 'n', 'B', 'b', 'R', 'r', | ||
| 35 | 'Q', 'q', 'K', 'k', '\0' | ||
| 36 | }; | ||
| 37 | TREE *const tree = block[0]; | ||
| 38 | |||
| 39 | /* | ||
| 40 |  ************************************************************ | ||
| 41 |  *                                                          * | ||
| 42 |  *  Process the commands to set the board[n] form of the    * | ||
| 43 |  *  chess position.                                         * | ||
| 44 |  *                                                          * | ||
| 45 |  ************************************************************ | ||
| 46 |  */ | ||
| 154 | pmbaty | 47 | while (FOREVER) { | 
| 33 | pmbaty | 48 | if ((input_stream == stdin) && !xboard) { | 
| 49 | if (wtm) | ||
| 50 | printf("edit(white): "); | ||
| 51 |       else | ||
| 52 | printf("edit(black): "); | ||
| 53 |     } | ||
| 54 | fflush(stdout); | ||
| 108 | pmbaty | 55 | readstat = Read(1, buffer); | 
| 33 | pmbaty | 56 | if (readstat < 0) | 
| 57 | return; | ||
| 108 | pmbaty | 58 | nargs = ReadParse(buffer, args, " \t;"); | 
| 33 | pmbaty | 59 | if (xboard) | 
| 108 | pmbaty | 60 | Print(32, "edit.command:%s\n", args[0]); | 
| 33 | pmbaty | 61 | if (!strcmp(args[0], "white")) | 
| 62 | wtm = 1; | ||
| 63 | else if (!strcmp(args[0], "black")) | ||
| 64 | wtm = 0; | ||
| 65 | if (!strcmp(args[0], "#")) | ||
| 66 | for (i = 0; i < 64; i++) | ||
| 67 | PcOnSq(i) = 0; | ||
| 68 | else if (!strcmp(args[0], "c")) | ||
| 69 | wtm = Flip(wtm); | ||
| 70 | else if (!strcmp(args[0], "end") || (!strcmp(args[0], "."))) | ||
| 71 | break; | ||
| 72 | else if (!strcmp(args[0], "d")) | ||
| 73 | DisplayChessBoard(stdout, tree->position); | ||
| 74 | else if (strlen(args[0]) == 3) { | ||
| 75 | if (strchr(pieces, args[0][0])) { | ||
| 76 | piece = (strchr(pieces, args[0][0]) - pieces) >> 1; | ||
| 77 | tfile = args[0][1] - 'a'; | ||
| 78 | trank = args[0][2] - '1'; | ||
| 79 | square = (trank << 3) + tfile; | ||
| 80 | if ((square < 0) || (square > 63)) | ||
| 81 | printf("unrecognized square %s\n", args[0]); | ||
| 82 | if (wtm) | ||
| 83 | PcOnSq(square) = piece; | ||
| 84 |         else | ||
| 85 | PcOnSq(square) = -piece; | ||
| 86 |       } | ||
| 87 | } else if (strlen(args[0]) == 2) { | ||
| 88 | piece = pawn; | ||
| 89 | tfile = args[0][0] - 'a'; | ||
| 90 | trank = args[0][1] - '1'; | ||
| 91 | square = (trank << 3) + tfile; | ||
| 92 | if ((square < 0) || (square > 63)) | ||
| 93 | printf("unrecognized square %s\n", args[0]); | ||
| 94 | if (wtm) | ||
| 95 | PcOnSq(square) = piece; | ||
| 96 |       else | ||
| 97 | PcOnSq(square) = -piece; | ||
| 98 | } else | ||
| 99 | printf("unrecognized piece %s\n", args[0]); | ||
| 100 |   } | ||
| 101 | /* | ||
| 102 |  ************************************************************ | ||
| 103 |  *                                                          * | ||
| 104 |  *  Now, if a king is on its original square, check the     * | ||
| 105 |  *  rooks to see if they are and set the castle status      * | ||
| 106 |  *  accordingly.  Note that this checks for pieces on the   * | ||
| 107 |  *  original rank, but not their original squares (ICS      * | ||
| 108 |  *  "wild" games) and doesn't set castling if true.         * | ||
| 109 |  *                                                          * | ||
| 110 |  *  The winboard/xboard "edit" command does not give us a   * | ||
| 111 |  *  way of setting castling status, so we have to guess.    * | ||
| 112 |  *                                                          * | ||
| 113 |  ************************************************************ | ||
| 114 |  */ | ||
| 115 | Castle(0, white) = 0; | ||
| 116 | Castle(0, black) = 0; | ||
| 117 | EnPassant(0) = 0; | ||
| 118 | for (i = 0; i < 16; i++) | ||
| 119 | if (PcOnSq(i) == 0 || PcOnSq(i + 48) == 0) | ||
| 120 | athome = 0; | ||
| 121 | if (!athome || (PcOnSq(A1) == rook && PcOnSq(B1) == knight && | ||
| 122 | PcOnSq(C1) == bishop && PcOnSq(D1) == queen && PcOnSq(E1) == king && | ||
| 123 | PcOnSq(F1) == bishop && PcOnSq(G1) == knight && PcOnSq(H1) == rook | ||
| 124 | && PcOnSq(A8) == -rook && PcOnSq(B8) == -knight && | ||
| 125 | PcOnSq(C8) == -bishop && PcOnSq(D8) == -queen && PcOnSq(E8) == -king | ||
| 126 | && PcOnSq(F8) == -bishop && PcOnSq(G8) == -knight && | ||
| 127 | PcOnSq(H8) == -rook)) { | ||
| 128 | if (PcOnSq(E1) == king) { | ||
| 129 | if (PcOnSq(A1) == rook) | ||
| 130 | Castle(0, white) = Castle(0, white) | 2; | ||
| 131 | if (PcOnSq(H1) == rook) | ||
| 132 | Castle(0, white) = Castle(0, white) | 1; | ||
| 133 |     } | ||
| 134 | if (PcOnSq(E8) == -king) { | ||
| 135 | if (PcOnSq(A8) == -rook) | ||
| 136 | Castle(0, black) = Castle(0, black) | 2; | ||
| 137 | if (PcOnSq(H8) == -rook) | ||
| 138 | Castle(0, black) = Castle(0, black) | 1; | ||
| 139 |     } | ||
| 140 |   } | ||
| 141 | /* | ||
| 142 |  ************************************************************ | ||
| 143 |  *                                                          * | ||
| 144 |  *  Basic board is now set.  Now it's time to set the bit   * | ||
| 145 |  *  board representation correctly.                         * | ||
| 146 |  *                                                          * | ||
| 147 |  ************************************************************ | ||
| 148 |  */ | ||
| 149 | SetChessBitBoards(tree); | ||
| 150 | error += InvalidPosition(tree); | ||
| 151 | if (!error) { | ||
| 152 | if (log_file) | ||
| 153 | DisplayChessBoard(log_file, tree->position); | ||
| 154 | wtm = 1; | ||
| 155 | move_number = 1; | ||
| 108 | pmbaty | 156 | rep_index = 0; | 
| 33 | pmbaty | 157 | tree->rep_list[0] = HashKey; | 
| 158 | Reversible(0) = 0; | ||
| 159 | moves_out_of_book = 0; | ||
| 160 | } else { | ||
| 161 | InitializeChessBoard(tree); | ||
| 162 | Print(4095, "Illegal position, using normal initial chess position\n"); | ||
| 163 |   } | ||
| 164 | } |