aboutsummaryrefslogtreecommitdiffstats
path: root/FICS/movecheck.c
diff options
context:
space:
mode:
authorMarkus Uhlin <markus@nifty-networks.net>2023-12-24 14:38:40 +0100
committerMarkus Uhlin <markus@nifty-networks.net>2023-12-24 14:38:40 +0100
commitd7b993626c01c95a518c2484fe2a7cb4d080a269 (patch)
tree4ba318cf834077a4921bb85be83d4d0e914ab657 /FICS/movecheck.c
parentd400570fc5276f546838a93a289e020ca9775224 (diff)
Reformatted execute_move()
Diffstat (limited to 'FICS/movecheck.c')
-rw-r--r--FICS/movecheck.c329
1 files changed, 183 insertions, 146 deletions
diff --git a/FICS/movecheck.c b/FICS/movecheck.c
index 85f599f..8b2f773 100644
--- a/FICS/movecheck.c
+++ b/FICS/movecheck.c
@@ -932,159 +932,196 @@ PUBLIC int parse_move(char *mstr, game_state_t * gs, move_t * mt, int promote)
return move_calculate(gs, mt, promote);
}
-/* Returns MOVE_OK, MOVE_NOMATERIAL, MOVE_CHECKMATE, or MOVE_STALEMATE */
-/* check_game_status prevents recursion */
-PUBLIC int execute_move(game_state_t * gs, move_t * mt, int check_game_status)
+/*
+ * Returns 'MOVE_OK', 'MOVE_NOMATERIAL', 'MOVE_CHECKMATE', or
+ * 'MOVE_STALEMATE'.
+ *
+ * ('check_game_status' prevents recursion.)
+ */
+PUBLIC int
+execute_move(game_state_t *gs, move_t *mt, int check_game_status)
{
- int movedPiece;
- int tookPiece;
- int i, j, foobar;
-
- if (mt->fromFile == ALG_DROP) {
- movedPiece = mt->fromRank;
- tookPiece = NOPIECE;
- gs->holding[gs->onMove==WHITE ? 0 : 1][movedPiece-1]--;
- gs->board[mt->toFile][mt->toRank] = movedPiece | gs->onMove;
- if (gs->gameNum >= 0)
- gs->lastIrreversable = garray[gs->gameNum].numHalfMoves;
- } else {
- movedPiece = gs->board[mt->fromFile][mt->fromRank];
- tookPiece = gs->board[mt->toFile][mt->toRank];
- if (mt->piecePromotionTo == NOPIECE) {
- gs->board[mt->toFile][mt->toRank] = gs->board[mt->fromFile][mt->fromRank];
- } else {
- gs->board[mt->toFile][mt->toRank] = mt->piecePromotionTo | gs->onMove;
- }
- gs->board[mt->fromFile][mt->fromRank] = NOPIECE;
- /* Check if irreversable */
- if ((piecetype(movedPiece) == PAWN) || (tookPiece != NOPIECE)) {
- if (gs->gameNum >= 0)
- gs->lastIrreversable = garray[gs->gameNum].numHalfMoves;
- }
- /* Check if this move is en-passant */
- if ((piecetype(movedPiece) == PAWN) && (mt->fromFile != mt->toFile) &&
- (tookPiece == NOPIECE)) {
- if (gs->onMove == WHITE) {
- mt->pieceCaptured = B_PAWN;
- } else {
- mt->pieceCaptured = W_PAWN;
- }
- if (mt->fromFile > mt->toFile) {
- mt->enPassant = -1;
- } else {
- mt->enPassant = 1;
- }
- gs->board[mt->toFile][mt->fromRank] = NOPIECE;
- }
- /* Check en-passant flags for next moves */
- for (i = 0; i < 8; i++) {
- gs->ep_possible[0][i] = 0;
- gs->ep_possible[1][i] = 0;
- }
-/* Added by Sparky 3/16/95
+ int i, j, foobar;
+ int movedPiece;
+ int tookPiece;
- From soso@Viktoria.drp.fmph.uniba.sk Thu Mar 16 13:08:51 1995
- Subject: Re: To DAV: enpassant prob. again
- To: chess@caissa.onenet.net (ICS)
- Date: Thu, 16 Mar 1995 20:06:20 +0100 (MET)
+ if (mt->fromFile == ALG_DROP) {
+ movedPiece = mt->fromRank;
+ tookPiece = NOPIECE;
- Yeah !
- There was bug in other part of code:
+ gs->holding[gs->onMove == WHITE ? 0 : 1][movedPiece-1]--;
+ gs->board[mt->toFile][mt->toRank] = (movedPiece | gs->onMove);
- movecheck.c , line about 800:
+ if (gs->gameNum >= 0)
+ gs->lastIrreversable = garray[gs->gameNum].numHalfMoves;
+ } else {
+ movedPiece = gs->board[mt->fromFile][mt->fromRank];
+ tookPiece = gs->board[mt->toFile][mt->toRank];
- if (gs->onMove == WHITE) {
- if ((mt->toFile+1 < 7 ) .... should be : (mt->toFile < 7 ) }
-*/
+ if (mt->piecePromotionTo == NOPIECE) {
+ gs->board[mt->toFile][mt->toRank] =
+ gs->board[mt->fromFile][mt->fromRank];
+ } else {
+ gs->board[mt->toFile][mt->toRank] =
+ (mt->piecePromotionTo | gs->onMove);
+ }
- if ((piecetype(movedPiece) == PAWN) &&
- ((mt->fromRank == mt->toRank + 2) || (mt->fromRank + 2 == mt->toRank))) {
- /* Should turn on enpassent flag if possible */
- if (gs->onMove == WHITE) {
- if ((mt->toFile < 7) && gs->board[mt->toFile + 1][3] == B_PAWN) {
- gs->ep_possible[1][mt->toFile + 1] = -1;
- }
- if ((mt->toFile - 1 >= 0) && gs->board[mt->toFile - 1][3] == B_PAWN) {
- gs->ep_possible[1][mt->toFile - 1] = 1;
- }
- } else {
- if ((mt->toFile < 7) && gs->board[mt->toFile + 1][4] == W_PAWN) {
- gs->ep_possible[0][mt->toFile + 1] = -1;
- }
- if ((mt->toFile - 1 >= 0) && gs->board[mt->toFile - 1][4] == W_PAWN) {
- gs->ep_possible[0][mt->toFile - 1] = 1;
- }
- }
- }
- if ((piecetype(movedPiece) == ROOK) && (mt->fromFile == 0)) {
- if ((mt->fromRank == 0) && (gs->onMove == WHITE))
- gs->wqrmoved = 1;
- if ((mt->fromRank == 7) && (gs->onMove == BLACK))
- gs->bqrmoved = 1;
- }
- if ((piecetype(movedPiece) == ROOK) && (mt->fromFile == 7)) {
- if ((mt->fromRank == 0) && (gs->onMove == WHITE))
- gs->wkrmoved = 1;
- if ((mt->fromRank == 7) && (gs->onMove == BLACK))
- gs->bkrmoved = 1;
- }
- if (piecetype(movedPiece) == KING) {
- if (gs->onMove == WHITE)
- gs->wkmoved = 1;
- else
- gs->bkmoved = 1;
- }
- if ((piecetype(movedPiece) == KING) &&
- ((mt->fromFile == 4) && ((mt->toFile == 6)))) { /* Check for KS castling */
- gs->board[5][mt->toRank] = gs->board[7][mt->toRank];
- gs->board[7][mt->toRank] = NOPIECE;
- }
- if ((piecetype(movedPiece) == KING) &&
- ((mt->fromFile == 4) && ((mt->toFile == 2)))) { /* Check for QS castling */
- gs->board[3][mt->toRank] = gs->board[0][mt->toRank];
- gs->board[0][mt->toRank] = NOPIECE;
- }
- }
- if (gs->onMove == BLACK)
- gs->moveNum++;
+ gs->board[mt->fromFile][mt->fromRank] = NOPIECE;
- if (check_game_status) {
- /* Does this move result in check? */
- if (in_check(gs)) {
- /* Check for checkmate */
- gs->onMove = CToggle(gs->onMove);
- if (!has_legal_move(gs))
- return MOVE_CHECKMATE;
- } else {
- /* Check for stalemate */
- gs->onMove = CToggle(gs->onMove);
- if (!has_legal_move(gs))
- return MOVE_STALEMATE;
-/* loon: check for insufficient mating material, first try */
- foobar = 0;
- for (i=0; i<8; i++) {
- for (j=0; j<8; j++) {
- switch(piecetype(gs->board[i][j])) {
- case KNIGHT:
- case BISHOP:
- foobar++;
- break;
- case KING:
- case NOPIECE:
- break;
- default:
- foobar = 2;
- break;
- }
- }
- }
- if (foobar < 2)
- return MOVE_NOMATERIAL;
- }
- } else {
- gs->onMove = CToggle(gs->onMove);
- }
- return MOVE_OK;
+ /*
+ * Check if irreversable
+ */
+ if (piecetype(movedPiece) == PAWN || tookPiece != NOPIECE) {
+ if (gs->gameNum >= 0) {
+ gs->lastIrreversable =
+ garray[gs->gameNum].numHalfMoves;
+ }
+ }
+
+ /*
+ * Check if this move is en-passant
+ */
+ if (piecetype(movedPiece) == PAWN &&
+ mt->fromFile != mt->toFile &&
+ tookPiece == NOPIECE) {
+ if (gs->onMove == WHITE)
+ mt->pieceCaptured = B_PAWN;
+ else
+ mt->pieceCaptured = W_PAWN;
+
+ if (mt->fromFile > mt->toFile)
+ mt->enPassant = -1;
+ else
+ mt->enPassant = 1;
+ gs->board[mt->toFile][mt->fromRank] = NOPIECE;
+ }
+
+ /*
+ * Check en-passant flags for next moves
+ */
+ for (i = 0; i < 8; i++) {
+ gs->ep_possible[0][i] = 0;
+ gs->ep_possible[1][i] = 0;
+ }
+
+ if (piecetype(movedPiece) == PAWN &&
+ (mt->fromRank == (mt->toRank + 2) ||
+ (mt->fromRank + 2) == mt->toRank)) {
+ /*
+ * Should turn on enpassent flag if possible.
+ */
+
+ if (gs->onMove == WHITE) {
+ if (mt->toFile < 7 &&
+ gs->board[mt->toFile + 1][3] == B_PAWN)
+ gs->ep_possible[1][mt->toFile + 1] = -1;
+ if ((mt->toFile - 1) >= 0 &&
+ gs->board[mt->toFile - 1][3] == B_PAWN)
+ gs->ep_possible[1][mt->toFile - 1] = 1;
+ } else {
+ if (mt->toFile < 7 &&
+ gs->board[mt->toFile + 1][4] == W_PAWN)
+ gs->ep_possible[0][mt->toFile + 1] = -1;
+ if ((mt->toFile - 1) >= 0 &&
+ gs->board[mt->toFile - 1][4] == W_PAWN)
+ gs->ep_possible[0][mt->toFile - 1] = 1;
+ }
+ }
+
+ if (piecetype(movedPiece) == ROOK && mt->fromFile == 0) {
+ if (mt->fromRank == 0 && gs->onMove == WHITE)
+ gs->wqrmoved = 1;
+ if (mt->fromRank == 7 && gs->onMove == BLACK)
+ gs->bqrmoved = 1;
+ }
+
+ if (piecetype(movedPiece) == ROOK && mt->fromFile == 7) {
+ if (mt->fromRank == 0 && gs->onMove == WHITE)
+ gs->wkrmoved = 1;
+ if (mt->fromRank == 7 && gs->onMove == BLACK)
+ gs->bkrmoved = 1;
+ }
+
+ if (piecetype(movedPiece) == KING) {
+ if (gs->onMove == WHITE)
+ gs->wkmoved = 1;
+ else
+ gs->bkmoved = 1;
+ }
+
+ if (piecetype(movedPiece) == KING &&
+ (mt->fromFile == 4 && mt->toFile == 6)) { // Check for KS
+ // castling
+ gs->board[5][mt->toRank] = gs->board[7][mt->toRank];
+ gs->board[7][mt->toRank] = NOPIECE;
+ }
+
+ if (piecetype(movedPiece) == KING &&
+ (mt->fromFile == 4 && mt->toFile == 2)) { // Check for QS
+ // castling
+ gs->board[3][mt->toRank] = gs->board[0][mt->toRank];
+ gs->board[0][mt->toRank] = NOPIECE;
+ }
+ }
+
+ if (gs->onMove == BLACK)
+ gs->moveNum++;
+
+ if (check_game_status) {
+ /*
+ * Does this move result in check?
+ */
+
+ if (in_check(gs)) {
+ /*
+ * Check for checkmate
+ */
+
+ gs->onMove = CToggle(gs->onMove);
+
+ if (!has_legal_move(gs))
+ return MOVE_CHECKMATE;
+ } else {
+ /*
+ * Check for stalemate
+ */
+
+ gs->onMove = CToggle(gs->onMove);
+
+ if (!has_legal_move(gs))
+ return MOVE_STALEMATE;
+
+ /*
+ * loon: check for insufficient mating material
+ */
+
+ foobar = 0;
+
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 8; j++) {
+ switch (piecetype(gs->board[i][j])) {
+ case KNIGHT:
+ case BISHOP:
+ foobar++;
+ break;
+ case KING:
+ case NOPIECE:
+ break;
+ default:
+ foobar = 2;
+ break;
+ }
+ }
+ }
+
+ if (foobar < 2)
+ return MOVE_NOMATERIAL;
+ }
+ } else {
+ gs->onMove = CToggle(gs->onMove);
+ }
+
+ return MOVE_OK;
}
PUBLIC int backup_move(int g, int mode)