static int exiting = 0; /* [HGM] moved to top */
static int setboardSpoiledMachineBlack = 0 /*, errorExitFlag = 0*/;
int startedFromPositionFile = FALSE; Board filePosition; /* [HGM] loadPos */
+int rightsBoard[BOARD_RANKS][BOARD_FILES]; /* [HGM] editrights */
char endingGame = 0; /* [HGM] crash: flag to prevent recursion of GameEnds() */
int whiteNPS, blackNPS; /* [HGM] nps: for easily making clocks aware of NPS */
VariantClass currentlyInitializedVariant; /* [HGM] variantswitch */
click-click move is possible */
if (toX == -2 || toY == -2) {
boards[0][fromY][fromX] = EmptySquare;
+ rightsBoard[fromY][fromX] = 0;
return AmbiguousMove;
} else if (toX >= 0 && toY >= 0) {
boards[0][toY][toX] = boards[0][fromY][fromX];
}
} else
boards[0][fromY][fromX] = EmptySquare;
+ rightsBoard[fromY][fromX] = rightsBoard[toY][toX] = 0;
return AmbiguousMove;
}
return ImpossibleMove;
SetGameInfo();
}
-
void
EditPositionEvent()
{
SetGameInfo();
if (currentMove > 0)
CopyBoard(boards[0], boards[currentMove]);
-
+ { int i, r, f; // [HGM] editrights: take note of existing rights
+ for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++) rightsBoard[r][f] = 0;
+ for(i=0; i<nrCastlingRights; i++) {
+ if(boards[0][CASTLING][i] != NoRights)
+ rightsBoard [castlingRank[i]] [boards[0][CASTLING][i]] = 1 + (i == 2 || i == 5);
+ }
+ }
+
blackPlaysFirst = !WhiteOnMove(currentMove);
ResetClocks();
currentMove = forwardMostMove = backwardMostMove = 0;
startedFromSetupPosition = TRUE;
InitChessProgram(&first, FALSE);
if(fakeRights) { // [HGM] suppress this if we just pasted a FEN.
+ int i, r, f, kf, err;
+ for(i=0; i<nrCastlingRights; i++) boards[0][CASTLING][i] = NoRights;
+ kf = NoRights; err = 0;
+ for(f=BOARD_RGHT-1; f>=0; f--)
+ if(rightsBoard[0][f] == 2) { if(kf != NoRights) err=10; boards[0][CASTLING][2] = kf = f; }
+ if(kf == NoRights) kf = 4;
+ for(f=BOARD_RGHT-1; f>=0; f--)
+ if(rightsBoard[0][f] == 1) { err++; boards[0][CASTLING][f<kf] = f; }
+ kf = NoRights; err = 0;
+ for(f=BOARD_RGHT-1; f>=0; f--)
+ if(rightsBoard[BOARD_HEIGHT-1][f] == 2) { if(kf != NoRights) err=10; boards[0][CASTLING][5] = kf = f; }
+ if(kf == NoRights) kf = 4;
+ for(f=BOARD_RGHT-1; f>=0; f--)
+ if(rightsBoard[BOARD_HEIGHT-1][f] == 1) { err++; boards[0][CASTLING][3+(f<kf)] = f; }
+ if(err + 2 > nrCastlingRights) DisplayError("unclear castling rights", 0);
+
boards[0][EP_STATUS] = EP_NONE;
+#if 0
boards[0][CASTLING][2] = boards[0][CASTLING][5] = BOARD_WIDTH>>1;
if(boards[0][0][BOARD_WIDTH>>1] == king) {
boards[0][CASTLING][1] = boards[0][0][BOARD_LEFT] == WhiteRook ? 0 : NoRights;
boards[0][CASTLING][4] = boards[0][BOARD_HEIGHT-1][BOARD_LEFT] == BlackRook ? 0 : NoRights;
boards[0][CASTLING][3] = boards[0][BOARD_HEIGHT-1][BOARD_RGHT-1] == BlackRook ? BOARD_RGHT-1 : NoRights;
} else boards[0][CASTLING][5] = NoRights;
+#endif
}
SendToProgram("force\n", &first);
if (blackPlaysFirst) {
{
char buf[MSG_SIZ];
ChessSquare piece = boards[0][y][x];
+ int rights = 0; // [HGM] editrights: most new pieces get no castling rights
if (gameMode != EditPosition && gameMode != IcsExamining) return;
}
} else {
boards[0][y][x] = p;
+ rightsBoard[y][x] = 0; // [HGM] editrights: clear all castling rights
}
}
}
SetBlackToPlayEvent();
break;
+ case NoRights:
+ rightsBoard[y][x] = 0;
+ break;
+
+ case GrantRights:
+ { ChessSquare p = boards[0][y][x];
+ rightsBoard[y][x] = 1;
+ if(p == WhiteKing || p == WhiteUnicorn || p == BlackKing || p == BlackUnicorn)
+ rightsBoard[y][x] = 2;
+ }
+ break;
+
case EmptySquare:
if (gameMode == IcsExamining) {
if (x < BOARD_LEFT || x >= BOARD_RGHT) break; // [HGM] holdings
selection = (ChessSquare)((int)selection - (int)WhiteQueen + (int)WhiteFerz);
goto defaultlabel;
+ case WhiteRook: // [HGM] editrights: corner Rooks get castling rights by default
+ if(y == 0 && (x == BOARD_LEFT || x == BOARD_RGHT-1)) rights = 1;
+ goto defaultlabel;
+
+ case BlackRook:
+ if(y == BOARD_HEIGHT-1 && (x == BOARD_LEFT || x == BOARD_RGHT-1)) rights = 1;
+ goto defaultlabel;
+
case WhiteKing:
case BlackKing:
if(gameInfo.variant == VariantXiangqi)
selection = (ChessSquare)((int)selection - (int)WhiteKing + (int)WhiteWazir);
if(gameInfo.variant == VariantKnightmate)
selection = (ChessSquare)((int)selection - (int)WhiteKing + (int)WhiteUnicorn);
+ case WhiteUnicorn:
+ case BlackUnicorn:
+ if(y == (selection <= WhiteKing ? 0 : BOARD_HEIGHT-1) && (x == BOARD_WIDTH>>1))
+ rights = 2; // [HGM] editrights: King on right-center file gets rights
default:
defaultlabel:
if (gameMode == IcsExamining) {
}
} else
boards[0][y][x] = selection;
+ rightsBoard[y][x] = rights; // [HGM] editrights: set default rights of created piece
DrawPosition(TRUE, boards[0]);
}
break;