break;
case 'N': all = 0xFF; // oblique atom (degenerate 8-fold)
if(tx >= 0) goto king; // continuation legs specified in K/Q system!
+ if(*desc == 'h') { // chiral direction sets 'hr' and 'hl'
+ dirSet = (desc[1] == 'r' ? 0x55 : 0xAA); desc += 2;
+ } else
while(islower(*desc) && (i = dirType[*desc-'a']) != '0') {
int b = dirs2[*desc-'a']; // when alone, use narrow version
if(desc[1] == 'h') b = dirs1[*desc-'a'], desc += 2; // dirs1 is wide version
mode |= 1024; dy = 1;
}
if(!cont) {
- if(!(mode & 15)) mode = his + 4; // no mode spec, use default = mc
+ if(!(mode & 15)) mode |= his + 4; // no mode spec, use default = mc
} else {
strncpy(buf, cont, 80); cont = buf; // copy next leg(s), so we can modify
atom = buf; while(islower(*atom)) atom++; // skip to atom
atom[1] = atom[2] = '\0'; // make sure any old range is stripped off
if(expo == 1) atom[1] = '0'; // turn other leapers into riders
}
- if(!(mode & 0x30F)) mode = 4; // and default of this leg = m
+ if(!(mode & 0x30F)) mode |= 4; // and default of this leg = m
}
if(dy == 1) skip = jump - 1, jump = 1; // on W & F atoms 'j' = skip first square
do {
for(dir=0, bit=1; dir<8; dir++, bit += bit) { // loop over directions
- int i = expo, j = skip, hop = mode, vx, vy;
+ int i = expo, j = skip, hop = mode, vx, vy, loop = 0;
if(!(bit & dirSet)) continue; // does not move in this direction
if(dy != 1) j = 0; //
vx = dx*rot[dir][0] + dy*rot[dir][1]; // rotate step vector
do { // traverse ray
x += vx; y += vy; // step to next square
if(y < 0 || y >= BOARD_HEIGHT) break; // vertically off-board: always done
- if(x < BOARD_LEFT) { if(mode & 128) x += BOARD_RGHT - BOARD_LEFT; else break; }
- if(x >= BOARD_RGHT) { if(mode & 128) x -= BOARD_RGHT - BOARD_LEFT; else break; }
+ if(x < BOARD_LEFT) { if(mode & 128) x += BOARD_RGHT - BOARD_LEFT, loop++; else break; }
+ if(x >= BOARD_RGHT) { if(mode & 128) x -= BOARD_RGHT - BOARD_LEFT, loop++; else break; }
if(j) { j--; continue; } // skip irrespective of occupation
if(!jump && board[y - vy + vy/2][x - vx + vx/2] != EmptySquare) break; // blocked
if(jump > 1 && board[y - vy + vy/2][x - vx + vx/2] == EmptySquare) break; // no hop
- if(x == f && y == r) occup = 4; else // start square counts as empty
+ if(x == f && y == r && !loop) occup = 4; else // start square counts as empty (if not around cylinder!)
if(board[y][x] < BlackPawn) occup = 0x101; else
if(board[y][x] < EmptySquare) occup = 0x102; else
occup = 4;
cb(board, flags, mine == 1 ? WhiteKingSideCastle : BlackKingSideCastle, r, f, y, f + expo, cl);
break;
}
+ if(mode & 16 && (board[y][x] == WhiteKing || board[y][x] == BlackKing)) break; // tame piece, cannot capture royal
if(occup & mode) cb(board, flags, NormalMove, r, f, y, x, cl); // allowed, generate
if(occup != 4) break; // not valid transit square
} while(--i);
CheckTestClosure cl;
ChessSquare king = flags & F_WHITE_ON_MOVE ? WhiteKing : BlackKing;
ChessSquare captured = EmptySquare, ep=0, trampled=0;
+ int saveKill = killX;
/* Suppress warnings on uninitialized variables */
if(gameInfo.variant == VariantXiangqi)
board[rf][ft] = EmptySquare;
} else {
captured = board[rt][ft];
- if(killX >= 0) { trampled = board[killY][killX]; board[killY][killX] = EmptySquare; }
+ if(killX >= 0) { trampled = board[killY][killX]; board[killY][killX] = EmptySquare; killX = -1; }
}
if(rf == DROP_RANK) board[rt][ft] = ff; else { // [HGM] drop
board[rt][ft] = board[rf][ff];
board[rf][ft] = captured;
board[rt][ft] = EmptySquare;
} else {
- if(killX >= 0) board[killY][killX] = trampled;
+ if(saveKill >= 0) board[killY][killX] = trampled, killX = saveKill;
board[rt][ft] = captured;
}
board[EP_STATUS] = ep;