strcpy(EndSymbol, "Mat");
rate_change = 1;
break;
+ case END_BARE:
+ sprintf(tmp, "%s bared} %s", NameOfLoser, winSymbol);
+ strcpy(EndSymbol, "Bar");
+ rate_change = 1;
+ break;
case END_RESIGN:
sprintf(tmp, "%s resigns} %s", NameOfLoser, winSymbol);
strcpy(EndSymbol, "Res");
pprintf (p,"\n%s",avail_black);
avail_printed = 1;
}
- if (gl != -1) /* bughouse ? */ {
+ if (gl == -1) /* bughouse ? */ {
if (((player_globals.parray[game_globals.garray[gl].white].b_stats.rating <= pp->availmax) && (player_globals.parray[game_globals.garray[gl].white].b_stats.rating >= pp->availmin)) || (!pp->availmax)) {
pprintf (p,"\n%s",avail_bugwhite);
avail_printed = 1;
}
if ((len = strlen(command)) > 1) {
if (command[len - 2] == '=') {
+printf("promo '%s'\n", command);
switch (tolower(command[strlen(command) - 1])) {
case 'n':
pp->promote = KNIGHT;
case 'r':
pp->promote = ROOK;
break;
+ case 'a':
+ pp->promote = CARDINAL;
+ break;
+ case 'c':
+ pp->promote = MARSHALL;
+ break;
+ case 'm':
+ pp->promote = MAN;
+ break;
case 'q':
pp->promote = QUEEN;
break;
+ // courier promotion
+ case 'f':
+ pp->promote = FERZ2;
+ break;
+ // Superchess promotions
+ case 'e':
+ pp->promote = EMPRESS;
+ break;
+ case 's':
+ pp->promote = PRINCESS;
+ break;
+ case 'v':
+ pp->promote = CENTAUR;
+ break;
+ case 'w':
+ pp->promote = WOODY;
+ break;
+ case 'o':
+ pp->promote = SQUIRREL;
+ break;
+ case 'g':
+ pp->promote = MASTODON;
+ break;
default:
pprintf(p, "Don't understand that move.\n");
return;
}
}
}
+
switch (parse_move(command, &gg->game_state, &move, pp->promote)) {
case MOVE_ILLEGAL:
pprintf(p, "Illegal move.\n");
gg->moveList = (struct move_t *) realloc(gg->moveList, sizeof(struct move_t) * gg->moveListSize);
}
result = execute_move(&gg->game_state, &move, 1);
- if (result == MOVE_OK && gg->link >= 0 && move.pieceCaptured != NOPIECE) {
+ if (result == MOVE_OK && (gg->link >= 0 || gg->game_state.holdings) && move.pieceCaptured != NOPIECE) {
/* transfer captured piece to partner */
/* check if piece reverts to a pawn */
+ int victim = move.pieceCaptured, partner = gg->link;
+ // [HGM] zh: if not Bughouse, the game_state.holdings field decides what happens
+ if(gg->link < 0) {
+ partner = g; // pieces stay with current board
+ if(gg->game_state.holdings == -1) victim ^= WHITE|BLACK; // flip color
+ }
if (was_promoted(&game_globals.garray[g], move.toFile, move.toRank))
- update_holding(gg->link, colorval(move.pieceCaptured) | PAWN);
+ update_holding(partner, colorval(victim) | PAWN); // [HGM] todo: for Shogi we would have to demote differently!
else
- update_holding(gg->link, move.pieceCaptured);
+ update_holding(partner, victim);
}
now = tenth_secs();
move.atTime = now;
game_ended(g, CToggle(gg->game_state.onMove), END_NOMATERIAL);
}
}
+ if (result == MOVE_BARE) {
+ if (gg->status == GAME_EXAMINE) {
+ int p1;
+
+ for (p1 = 0; p1 < player_globals.p_num; p1++) {
+ if (player_globals.parray[p1].status != PLAYER_PROMPT)
+ continue;
+ if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) {
+ pprintf(p1, "%s bared.\n",
+ (gg->game_state.onMove == BLACK) ? "White" : "Black");
+ }
+ }
+ } else {
+ game_ended(g, gg->game_state.onMove, END_BARE);
+ }
+ }
}
int com_resign(int p, param_list param)
int piece;
int minor_pieces = 0;
- for (i = 0; i < 8; i++)
- for (j = 0; j < 8; j++) {
+ for (i = 0; i < gs->files; i++)
+ for (j = 0; j < gs->ranks; j++) {
piece = gs->board[i][j];
switch (piecetype(piece)) {
case BISHOP: