X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=f0b2af7aefa9fc155bc483015839d90e8f650951;hb=ce28a7755e28a2d0d8d5887d8de1660dd7400340;hp=4df7d42b4d679049116513c54b7af41287ebc951;hpb=811dfee19c2a85cb60d9506ff3f9a82d00135608;p=xboard.git diff --git a/moves.c b/moves.c index 4df7d42..f0b2af7 100644 --- a/moves.c +++ b/moves.c @@ -635,8 +635,25 @@ void GenPseudoLegal(board, flags, callback, closure) } break; + Amazon: + /* First do Bishop,then continue like Chancellor */ + for (rs = -1; rs <= 1; rs += 2) + for (fs = -1; fs <= 1; fs += 2) + for (i = 1;; i++) { + rt = rf + (i * rs); + ft = ff + (i * fs); + if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; + if (SameColor(board[rf][ff], board[rt][ft])) break; + callback(board, flags, NormalMove, + rf, ff, rt, ft, closure); + if (board[rt][ft] != EmptySquare) break; + } + m++; + goto doRook; + // Use Lance as Berolina / Spartan Pawn. case WhiteLance: + if(gameInfo.variant == VariantSuper) goto Amazon; if (rf < BOARD_HEIGHT-1 && BlackPiece(board[rf + 1][ff])) callback(board, flags, rf >= BOARD_HEIGHT-1-promoRank ? WhitePromotion : NormalMove, @@ -652,6 +669,7 @@ void GenPseudoLegal(board, flags, callback, closure) break; case BlackLance: + if(gameInfo.variant == VariantSuper) goto Amazon; if (rf > 0 && WhitePiece(board[rf - 1][ff])) callback(board, flags, rf <= promoRank ? BlackPromotion : NormalMove, @@ -1025,6 +1043,8 @@ if(appData.debugMode) fprintf(debugFP, "LegalDrop: %d @ %d,%d)\n", piece, ft, rt if(board[r][ft] == piece) return IllegalMove; // or there already is a Pawn in file // should still test if we mate with this Pawn } + } else if(gameInfo.variant == VariantSChess) { // only back-rank drops + if (rt != (piece < BlackPawn ? 0 : BOARD_HEIGHT-1)) return IllegalMove; } else { if( (piece == WhitePawn || piece == BlackPawn) && (rt == 0 || rt == BOARD_HEIGHT -1 ) ) @@ -1201,13 +1221,13 @@ int MateTest(board, flags) if (cl.count > 0) { return inCheck ? MT_CHECK : MT_NONE; } else { - if(gameInfo.holdingsWidth && gameInfo.variant != VariantSuper || gameInfo.variant != VariantGreat) { // drop game + if(gameInfo.holdingsWidth && gameInfo.variant != VariantSuper && gameInfo.variant != VariantGreat) { // drop game int r, f, n, holdings = flags & F_WHITE_ON_MOVE ? BOARD_WIDTH-1 : 0; for(r=0; r