diff -r 6008840b859e -r 6a26114297a1 src/chess/pawn.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/chess/pawn.c Mon Mar 31 11:16:32 2014 +0200 @@ -0,0 +1,97 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2014 Mike Becker. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "pawn.h" +#include "rules.h" + +_Bool pawn_chkrules(Board board, Move *move) { + int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1); + + if (move->torow == (d < 0 ? 7 : 0)) { + if (move->promotion) { + uint8_t promopiece = move->promotion & PIECE_MASK; + if (!promopiece || promopiece == PAWN || promopiece == KING) { + return 0; + } + } else { + return 0; + } + } else { + if (move->promotion) { + return 0; + } + } + + if (move->capture) { + if (move->fromrow == move->torow + d && ( + move->fromfile == move->tofile + 1 || + move->fromfile == move->tofile - 1)) { + + return mdst(board,move) + || (board[move->fromrow][move->tofile] & ENPASSANT_THREAT); + } else { + return 0; + } + } else { + if (move->fromfile == move->tofile) { + return (move->fromrow == move->torow + d) || + (move->fromrow == (d < 0 ? 1 : 6) && /* advanced first move */ + move->fromrow == move->torow + d*2); + } else { + return 0; + } + } +} + +_Bool pawn_isblocked(Board board, Move *move) { + return mdst(board,move) && !move->capture; +} + +int pawn_getlocation(Board board, Move *move) { + int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1); + + if (move->fromfile == POS_UNSPECIFIED) { + move->fromfile = move->tofile; + } + move->fromrow = move->torow + d; + if (move->fromrow > 6) { + return INVALID_POSITION; + } else { + /* advanced first move */ + if (move->fromrow == (d < 0 ? 2 : 5) && + msrc(board,move) != move->piece) { + + move->fromrow += d; + if (move->fromrow > 6) { + return INVALID_POSITION; + } + } + } + return VALID_MOVE_SYNTAX; +}