src/chess/rules.c

changeset 68
b34de5ce7d0e
parent 67
c76e46970a59
child 69
c8f2c280cff7
equal deleted inserted replaced
67:c76e46970a59 68:b34de5ce7d0e
574 } 574 }
575 575
576 static int getlocation(GameState *gamestate, Move *move) { 576 static int getlocation(GameState *gamestate, Move *move) {
577 577
578 uint8_t color = move->piece & COLOR_MASK; 578 uint8_t color = move->piece & COLOR_MASK;
579 uint8_t piece = move->piece & PIECE_MASK;
579 _Bool incheck = gamestate->lastmove?gamestate->lastmove->move.check:0; 580 _Bool incheck = gamestate->lastmove?gamestate->lastmove->move.check:0;
580 581
581 Move threats[16], *threat = NULL; 582 Move threats[16], *threat = NULL;
582 uint8_t threatcount; 583 uint8_t threatcount;
583 584
586 587
587 int reason = INVALID_POSITION; 588 int reason = INVALID_POSITION;
588 589
589 /* find threats for the specified position */ 590 /* find threats for the specified position */
590 for (uint8_t i = 0 ; i < threatcount ; i++) { 591 for (uint8_t i = 0 ; i < threatcount ; i++) {
591 if ((threats[i].piece & (PIECE_MASK | COLOR_MASK)) 592 if ((threats[i].piece & PIECE_MASK) == piece
592 == move->piece && 593 && (threats[i].piece & COLOR_MASK) == color &&
593 (move->fromrow == POS_UNSPECIFIED || 594 (move->fromrow == POS_UNSPECIFIED ||
594 move->fromrow == threats[i].fromrow) && 595 move->fromrow == threats[i].fromrow) &&
595 (move->fromfile == POS_UNSPECIFIED || 596 (move->fromfile == POS_UNSPECIFIED ||
596 move->fromfile == threats[i].fromfile)) { 597 move->fromfile == threats[i].fromfile)) {
597 598
598 if (threat) { 599 if (threat) {
599 return AMBIGUOUS_MOVE; 600 return AMBIGUOUS_MOVE;
600 } else { 601 } else {
601 /* found threat is no real threat */ 602 /* found threat is no real threat */
602 if (is_pinned(gamestate, &(threats[i]))) { 603 if (is_pinned(gamestate, &(threats[i]))) {
603 reason = incheck?KING_IN_CHECK:PIECE_PINNED; 604 reason = incheck?KING_IN_CHECK:
605 (piece==KING?KING_MOVES_INTO_CHECK:PIECE_PINNED);
604 } else { 606 } else {
605 threat = &(threats[i]); 607 threat = &(threats[i]);
606 } 608 }
607 } 609 }
608 } 610 }

mercurial