Subversion Repositories Games.Chess Giants

Rev

Rev 44 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 44 Rev 74
Line 8... Line 8...
8
#define IS_FREE(li,co) (IS_VALID ((li), (co)) && (move->slots[(li)][(co)].part == PART_NONE))
8
#define IS_FREE(li,co) (IS_VALID ((li), (co)) && (move->slots[(li)][(co)].part == PART_NONE))
9
#define CAN_PLAY(li,co) (IS_VALID ((li), (co)) && ((move->slots[(li)][(co)].part == PART_NONE) || (move->slots[(li)][(co)].color != boardslot->color)))
9
#define CAN_PLAY(li,co) (IS_VALID ((li), (co)) && ((move->slots[(li)][(co)].part == PART_NONE) || (move->slots[(li)][(co)].color != boardslot->color)))
10
 
10
 
11
 
11
 
12
// prototypes of local functions
12
// prototypes of local functions
-
 
13
static bool Move_IsWayClearBetween (boardmove_t *move, int source_line, int source_column, int target_line, int target_column);
13
static void AddPossibleMove (boardmove_t **possiblemoves, int *possiblemove_count, int color, int part, int source_line, int source_column, int target_line, int target_column, int promotion_type, bool has_captured, bool is_enpassant);
14
static void AddPossibleMove (boardmove_t **possiblemoves, int *possiblemove_count, int color, int part, int source_line, int source_column, int target_line, int target_column, int promotion_type, bool has_captured, bool is_enpassant);
14
 
15
 
15
 
16
 
16
void Move_SetSlot (boardmove_t *move, int line, int column, int color, int part_type)
17
void Move_SetSlot (boardmove_t *move, int line, int column, int color, int part_type)
17
{
18
{
Line 467... Line 468...
467
            for (index_line = line + 1; index_line < 8; index_line++)
468
            for (index_line = line + 1; index_line < 8; index_line++)
468
               if (!CAN_PLAY (index_line, column))
469
               if (!CAN_PLAY (index_line, column))
469
                  break; // if part can no longer move this way, stop searching
470
                  break; // if part can no longer move this way, stop searching
470
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
471
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
471
                  return (false); // this move is possible
472
                  return (false); // this move is possible
-
 
473
               else if (move->slots[index_line][column].part != PART_NONE)
-
 
474
                  break; // no further moves are possible in the same direction
472
 
475
 
473
            // see if rook can move downwards
476
            // see if rook can move downwards
474
            for (index_line = line - 1; index_line >= 0; index_line--)
477
            for (index_line = line - 1; index_line >= 0; index_line--)
475
               if (!CAN_PLAY (index_line, column))
478
               if (!CAN_PLAY (index_line, column))
476
                  break; // if part can no longer move this way, stop searching
479
                  break; // if part can no longer move this way, stop searching
477
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
480
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
478
                  return (false); // this move is possible
481
                  return (false); // this move is possible
-
 
482
               else if (move->slots[index_line][column].part != PART_NONE)
-
 
483
                  break; // no further moves are possible in the same direction
479
 
484
 
480
            // see if rook can move right
485
            // see if rook can move right
481
            for (index_column = column + 1; index_column < 8; index_column++)
486
            for (index_column = column + 1; index_column < 8; index_column++)
482
               if (!CAN_PLAY (line, index_column))
487
               if (!CAN_PLAY (line, index_column))
483
                  break; // if part can no longer move this way, stop searching
488
                  break; // if part can no longer move this way, stop searching
484
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
489
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
485
                  return (false); // this move is possible
490
                  return (false); // this move is possible
-
 
491
               else if (move->slots[line][index_column].part != PART_NONE)
-
 
492
                  break; // no further moves are possible in the same direction
486
 
493
 
487
            // see if rook can move left
494
            // see if rook can move left
488
            for (index_column = column - 1; index_column >= 0; index_column--)
495
            for (index_column = column - 1; index_column >= 0; index_column--)
489
               if (!CAN_PLAY (line, index_column))
496
               if (!CAN_PLAY (line, index_column))
490
                  break; // if part can no longer move this way, stop searching
497
                  break; // if part can no longer move this way, stop searching
491
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
498
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
492
                  return (false); // this move is possible
499
                  return (false); // this move is possible
-
 
500
               else if (move->slots[line][index_column].part != PART_NONE)
-
 
501
                  break; // no further moves are possible in the same direction
493
         }
502
         }
494
 
503
 
495
         //////////////////////////////////////////////////////////////////////////////////////////
504
         //////////////////////////////////////////////////////////////////////////////////////////
496
         ///////////////////////////////////////// KNIGHT /////////////////////////////////////////
505
         ///////////////////////////////////////// KNIGHT /////////////////////////////////////////
497
         //////////////////////////////////////////////////////////////////////////////////////////
506
         //////////////////////////////////////////////////////////////////////////////////////////
Line 527... Line 536...
527
            for (index_line = line + 1, index_column = column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
536
            for (index_line = line + 1, index_column = column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
528
               if (!CAN_PLAY (index_line, index_column))
537
               if (!CAN_PLAY (index_line, index_column))
529
                  break; // if part can no longer move this way, stop searching
538
                  break; // if part can no longer move this way, stop searching
530
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
539
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
531
                  return (false); // this move is possible
540
                  return (false); // this move is possible
-
 
541
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
542
                  break; // no further moves are possible in the same direction
532
 
543
 
533
            // see if bishop can move SE
544
            // see if bishop can move SE
534
            for (index_line = line - 1, index_column = column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
545
            for (index_line = line - 1, index_column = column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
535
               if (!CAN_PLAY (index_line, index_column))
546
               if (!CAN_PLAY (index_line, index_column))
536
                  break; // if part can no longer move this way, stop searching
547
                  break; // if part can no longer move this way, stop searching
537
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
548
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
538
                  return (false); // this move is possible
549
                  return (false); // this move is possible
-
 
550
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
551
                  break; // no further moves are possible in the same direction
539
 
552
 
540
            // see if bishop can move NW
553
            // see if bishop can move NW
541
            for (index_line = line + 1, index_column = column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
554
            for (index_line = line + 1, index_column = column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
542
               if (!CAN_PLAY (index_line, index_column))
555
               if (!CAN_PLAY (index_line, index_column))
543
                  break; // if part can no longer move this way, stop searching
556
                  break; // if part can no longer move this way, stop searching
544
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
557
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
545
                  return (false); // this move is possible
558
                  return (false); // this move is possible
-
 
559
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
560
                  break; // no further moves are possible in the same direction
546
 
561
 
547
            // see if bishop can move SW
562
            // see if bishop can move SW
548
            for (index_line = line - 1, index_column = column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
563
            for (index_line = line - 1, index_column = column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
549
               if (!CAN_PLAY (index_line, index_column))
564
               if (!CAN_PLAY (index_line, index_column))
550
                  break; // if part can no longer move this way, stop searching
565
                  break; // if part can no longer move this way, stop searching
551
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
566
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
552
                  return (false); // this move is possible
567
                  return (false); // this move is possible
-
 
568
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
569
                  break; // no further moves are possible in the same direction
553
         }
570
         }
554
 
571
 
555
         //////////////////////////////////////////////////////////////////////////////////////////
572
         //////////////////////////////////////////////////////////////////////////////////////////
556
         ///////////////////////////////////////// QUEEN //////////////////////////////////////////
573
         ///////////////////////////////////////// QUEEN //////////////////////////////////////////
557
         //////////////////////////////////////////////////////////////////////////////////////////
574
         //////////////////////////////////////////////////////////////////////////////////////////
Line 562... Line 579...
562
            for (index_line = line + 1; index_line < 8; index_line++)
579
            for (index_line = line + 1; index_line < 8; index_line++)
563
               if (!CAN_PLAY (index_line, column))
580
               if (!CAN_PLAY (index_line, column))
564
                  break; // if part can no longer move this way, stop searching
581
                  break; // if part can no longer move this way, stop searching
565
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
582
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
566
                  return (false); // this move is possible
583
                  return (false); // this move is possible
-
 
584
               else if (move->slots[index_line][column].part != PART_NONE)
-
 
585
                  break; // no further moves are possible in the same direction
567
 
586
 
568
            // see if queen can move downwards
587
            // see if queen can move downwards
569
            for (index_line = line - 1; index_line >= 0; index_line--)
588
            for (index_line = line - 1; index_line >= 0; index_line--)
570
               if (!CAN_PLAY (index_line, column))
589
               if (!CAN_PLAY (index_line, column))
571
                  break; // if part can no longer move this way, stop searching
590
                  break; // if part can no longer move this way, stop searching
572
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
591
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, column, color))
573
                  return (false); // this move is possible
592
                  return (false); // this move is possible
-
 
593
               else if (move->slots[index_line][column].part != PART_NONE)
-
 
594
                  break; // no further moves are possible in the same direction
574
 
595
 
575
            // see if queen can move right
596
            // see if queen can move right
576
            for (index_column = column + 1; index_column < 8; index_column++)
597
            for (index_column = column + 1; index_column < 8; index_column++)
577
               if (!CAN_PLAY (line, index_column))
598
               if (!CAN_PLAY (line, index_column))
578
                  break; // if part can no longer move this way, stop searching
599
                  break; // if part can no longer move this way, stop searching
579
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
600
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
580
                  return (false); // this move is possible
601
                  return (false); // this move is possible
-
 
602
               else if (move->slots[line][index_column].part != PART_NONE)
-
 
603
                  break; // no further moves are possible in the same direction
581
 
604
 
582
            // see if queen can move left
605
            // see if queen can move left
583
            for (index_column = column - 1; index_column >= 0; index_column--)
606
            for (index_column = column - 1; index_column >= 0; index_column--)
584
               if (!CAN_PLAY (line, index_column))
607
               if (!CAN_PLAY (line, index_column))
585
                  break; // if part can no longer move this way, stop searching
608
                  break; // if part can no longer move this way, stop searching
586
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
609
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, line, index_column, color))
587
                  return (false); // this move is possible
610
                  return (false); // this move is possible
-
 
611
               else if (move->slots[line][index_column].part != PART_NONE)
-
 
612
                  break; // no further moves are possible in the same direction
588
 
613
 
589
            // see if queen can move NE
614
            // see if queen can move NE
590
            for (index_line = line + 1, index_column = column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
615
            for (index_line = line + 1, index_column = column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
591
               if (!CAN_PLAY (index_line, index_column))
616
               if (!CAN_PLAY (index_line, index_column))
592
                  break; // if part can no longer move this way, stop searching
617
                  break; // if part can no longer move this way, stop searching
593
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
618
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
594
                  return (false); // this move is possible
619
                  return (false); // this move is possible
-
 
620
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
621
                  break; // no further moves are possible in the same direction
595
 
622
 
596
            // see if queen can move SE
623
            // see if queen can move SE
597
            for (index_line = line - 1, index_column = column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
624
            for (index_line = line - 1, index_column = column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
598
               if (!CAN_PLAY (index_line, index_column))
625
               if (!CAN_PLAY (index_line, index_column))
599
                  break; // if part can no longer move this way, stop searching
626
                  break; // if part can no longer move this way, stop searching
600
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
627
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
601
                  return (false); // this move is possible
628
                  return (false); // this move is possible
-
 
629
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
630
                  break; // no further moves are possible in the same direction
602
 
631
 
603
            // see if queen can move NW
632
            // see if queen can move NW
604
            for (index_line = line + 1, index_column = column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
633
            for (index_line = line + 1, index_column = column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
605
               if (!CAN_PLAY (index_line, index_column))
634
               if (!CAN_PLAY (index_line, index_column))
606
                  break; // if part can no longer move this way, stop searching
635
                  break; // if part can no longer move this way, stop searching
607
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
636
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
608
                  return (false); // this move is possible
637
                  return (false); // this move is possible
-
 
638
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
639
                  break; // no further moves are possible in the same direction
609
 
640
 
610
            // see if queen can move SW
641
            // see if queen can move SW
611
            for (index_line = line - 1, index_column = column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
642
            for (index_line = line - 1, index_column = column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
612
               if (!CAN_PLAY (index_line, index_column))
643
               if (!CAN_PLAY (index_line, index_column))
613
                  break; // if part can no longer move this way, stop searching
644
                  break; // if part can no longer move this way, stop searching
614
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
645
               else if (!Move_IsColorInCheckAfterTestMove (move, line, column, index_line, index_column, color))
615
                  return (false); // this move is possible
646
                  return (false); // this move is possible
-
 
647
               else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
648
                  break; // no further moves are possible in the same direction
616
         }
649
         }
617
 
650
 
618
         //////////////////////////////////////////////////////////////////////////////////////////
651
         //////////////////////////////////////////////////////////////////////////////////////////
619
         ////////////////////////////////////////// KING //////////////////////////////////////////
652
         ////////////////////////////////////////// KING //////////////////////////////////////////
620
         //////////////////////////////////////////////////////////////////////////////////////////
653
         //////////////////////////////////////////////////////////////////////////////////////////
Line 738... Line 771...
738
   else if (boardslot->part == PART_ROOK)
771
   else if (boardslot->part == PART_ROOK)
739
   {
772
   {
740
      // quick checks
773
      // quick checks
741
      if ((to_column != from_column) && (to_line != from_line))
774
      if ((to_column != from_column) && (to_line != from_line))
742
         return (false); // rooks can only move horizontally or vertically
775
         return (false); // rooks can only move horizontally or vertically
-
 
776
      else if (!Move_IsWayClearBetween (move, from_line, from_column, to_line, to_column))
-
 
777
         return (false); // way must be clear between source and target
743
 
778
 
744
      // do we want the rook to move upwards ?
779
      // do we want the rook to move upwards ?
745
      if (to_line > from_line)
780
      if (to_line > from_line)
746
      {
781
      {
747
         // see if rook can move upwards
782
         // see if rook can move upwards
748
         for (index_line = from_line + 1; index_line < 8; index_line++)
783
         for (index_line = from_line + 1; index_line < 8; index_line++)
749
            if (!CAN_PLAY (index_line, to_column))
784
            if (!CAN_PLAY (index_line, to_column))
750
               return (false); // if rook can no longer move this way, stop searching
785
               return (false); // if rook can no longer move this way, stop searching
751
            else if (index_line == to_line)
786
            else if (index_line == to_line)
752
            {
-
 
753
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
787
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
754
                  return (true); // this move is possible
-
 
755
 
-
 
756
               return (false); // else this rook can't move in the claimed way (its king would be in check)
-
 
757
            }
-
 
758
            else if (move->slots[index_line][to_column].part != PART_NONE)
-
 
759
               return (false); // rook can take a part there BUT it's not the location we want
-
 
760
      }
788
      }
761
 
789
 
762
      // else do we want the rook to move downwards ?
790
      // else do we want the rook to move downwards ?
763
      else if (to_line < from_line)
791
      else if (to_line < from_line)
764
      {
792
      {
765
         // see if rook can move downwards
793
         // see if rook can move downwards
766
         for (index_line = from_line - 1; index_line >= 0; index_line--)
794
         for (index_line = from_line - 1; index_line >= 0; index_line--)
767
            if (!CAN_PLAY (index_line, to_column))
795
            if (!CAN_PLAY (index_line, to_column))
768
               return (false); // if rook can no longer move this way, stop searching
796
               return (false); // if rook can no longer move this way, stop searching
769
            else if (index_line == to_line)
797
            else if (index_line == to_line)
770
            {
-
 
771
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
798
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
772
                  return (true); // this move is possible
-
 
773
 
-
 
774
               return (false); // else this rook can't move in the claimed way (its king would be in check)
-
 
775
            }
-
 
776
            else if (move->slots[index_line][to_column].part != PART_NONE)
-
 
777
               return (false); // rook can take a part there BUT it's not the location we want
-
 
778
      }
799
      }
779
 
800
 
780
      // else do we want the rook to move right ?
801
      // else do we want the rook to move right ?
781
      else if (to_column > from_column)
802
      else if (to_column > from_column)
782
      {
803
      {
783
         // see if rook can move right
804
         // see if rook can move right
784
         for (index_column = from_column + 1; index_column < 8; index_column++)
805
         for (index_column = from_column + 1; index_column < 8; index_column++)
785
            if (!CAN_PLAY (to_line, index_column))
806
            if (!CAN_PLAY (to_line, index_column))
786
               return (false); // if rook can no longer move this way, stop searching
807
               return (false); // if rook can no longer move this way, stop searching
787
            else if (index_column == to_column)
808
            else if (index_column == to_column)
788
            {
-
 
789
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
809
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
790
                  return (true); // this move is possible
-
 
791
 
-
 
792
               return (false); // else this rook can't move in the claimed way (its king would be in check)
-
 
793
            }
-
 
794
            else if (move->slots[to_line][index_column].part != PART_NONE)
-
 
795
               return (false); // rook can take a part there BUT it's not the location we want
-
 
796
      }
810
      }
797
 
811
 
798
      // else do we want the rook to move left ?
812
      // else do we want the rook to move left ?
799
      else if (to_column < from_column)
813
      else if (to_column < from_column)
800
      {
814
      {
801
         // see if rook can move left
815
         // see if rook can move left
802
         for (index_column = from_column - 1; index_column >= 0; index_column--)
816
         for (index_column = from_column - 1; index_column >= 0; index_column--)
803
            if (!CAN_PLAY (to_line, index_column))
817
            if (!CAN_PLAY (to_line, index_column))
804
               return (false); // if rook can no longer move this way, stop searching
818
               return (false); // if rook can no longer move this way, stop searching
805
            else if (index_column == to_column)
819
            else if (index_column == to_column)
806
            {
-
 
807
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
820
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
808
                  return (true); // this move is possible
-
 
809
 
-
 
810
               return (false); // else this rook can't move in the claimed way (its king would be in check)
-
 
811
            }
-
 
812
            else if (move->slots[to_line][index_column].part != PART_NONE)
-
 
813
               return (false); // rook can take a part there BUT it's not the location we want
-
 
814
      }
821
      }
815
 
822
 
816
      return (false); // this rook can't move in the claimed way
823
      return (false); // this rook can't move in the claimed way
817
   }
824
   }
818
 
825
 
Line 821... Line 828...
821
   //////////////////////////////////////////////////////////////////////////////////////////
828
   //////////////////////////////////////////////////////////////////////////////////////////
822
   // else is it a knight ?
829
   // else is it a knight ?
823
   else if (boardslot->part == PART_KNIGHT)
830
   else if (boardslot->part == PART_KNIGHT)
824
   {
831
   {
825
      // do we want to move that knight in one of the allowed directions ?
832
      // do we want to move that knight in one of the allowed directions ?
826
      if (((from_line + 2 == to_line) && (from_column - 1 == to_column)) // NNW
833
      if (   ((from_line + 2 == to_line) && (from_column - 1 == to_column)) // NNW
827
          || ((from_line + 2 == to_line) && (from_column + 1 == to_column)) // NNE
834
          || ((from_line + 2 == to_line) && (from_column + 1 == to_column)) // NNE
828
          || ((from_line + 1 == to_line) && (from_column + 2 == to_column)) // ENE
835
          || ((from_line + 1 == to_line) && (from_column + 2 == to_column)) // ENE
829
          || ((from_line - 1 == to_line) && (from_column + 2 == to_column)) // ESE
836
          || ((from_line - 1 == to_line) && (from_column + 2 == to_column)) // ESE
830
          || ((from_line - 2 == to_line) && (from_column - 1 == to_column)) // SSW
837
          || ((from_line - 2 == to_line) && (from_column - 1 == to_column)) // SSW
831
          || ((from_line - 2 == to_line) && (from_column + 1 == to_column)) // SSE
838
          || ((from_line - 2 == to_line) && (from_column + 1 == to_column)) // SSE
Line 850... Line 857...
850
   else if (boardslot->part == PART_BISHOP)
857
   else if (boardslot->part == PART_BISHOP)
851
   {
858
   {
852
      // quick checks
859
      // quick checks
853
      if (abs (to_column - from_column) != abs (to_line - from_line))
860
      if (abs (to_column - from_column) != abs (to_line - from_line))
854
         return (false); // bishops can only move diagonally
861
         return (false); // bishops can only move diagonally
-
 
862
      else if (!Move_IsWayClearBetween (move, from_line, from_column, to_line, to_column))
-
 
863
         return (false); // way must be clear between source and target
855
 
864
 
856
      // do we want to move the bishop NE ?
865
      // do we want to move the bishop NE ?
857
      if ((to_line > from_line) && (to_column > from_column))
866
      if ((to_line > from_line) && (to_column > from_column))
858
      {
867
      {
859
         // see if bishop can move NE
868
         // see if bishop can move NE
860
         for (index_line = from_line + 1, index_column = from_column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
869
         for (index_line = from_line + 1, index_column = from_column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
861
            if (!CAN_PLAY (index_line, index_column))
870
            if (!CAN_PLAY (index_line, index_column))
862
               return (false); // if bishop can no longer move this way, stop searching
871
               return (false); // if bishop can no longer move this way, stop searching
863
            else if ((index_line == to_line) && (index_column == to_column))
872
            else if ((index_line == to_line) && (index_column == to_column))
864
            {
-
 
865
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
873
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
866
                  return (true); // this move is possible
-
 
867
 
-
 
868
               return (false); // else this bishop can't move in the claimed way (his king would be in check)
-
 
869
            }
-
 
870
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
871
               return (false); // bishop can take a part there BUT it's not the location we want
-
 
872
      }
874
      }
873
 
875
 
874
      // else do we want to move the bishop SE ?
876
      // else do we want to move the bishop SE ?
875
      else if ((to_line < from_line) && (to_column > from_column))
877
      else if ((to_line < from_line) && (to_column > from_column))
876
      {
878
      {
877
         // see if bishop can move SE
879
         // see if bishop can move SE
878
         for (index_line = from_line - 1, index_column = from_column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
880
         for (index_line = from_line - 1, index_column = from_column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
879
            if (!CAN_PLAY (index_line, index_column))
881
            if (!CAN_PLAY (index_line, index_column))
880
               return (false); // if bishop can no longer move this way, stop searching
882
               return (false); // if bishop can no longer move this way, stop searching
881
            else if ((index_line == to_line) && (index_column == to_column))
883
            else if ((index_line == to_line) && (index_column == to_column))
882
            {
-
 
883
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
884
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
884
                  return (true); // this move is possible
-
 
885
 
-
 
886
               return (false); // else this bishop can't move in the claimed way (his king would be in check)
-
 
887
            }
-
 
888
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
889
               return (false); // bishop can take a part there BUT it's not the location we want
-
 
890
      }
885
      }
891
 
886
 
892
      // else do we want to move the bishop NW ?
887
      // else do we want to move the bishop NW ?
893
      else if ((to_line > from_line) && (to_column < from_column))
888
      else if ((to_line > from_line) && (to_column < from_column))
894
      {
889
      {
895
         // see if bishop can move NW
890
         // see if bishop can move NW
896
         for (index_line = from_line + 1, index_column = from_column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
891
         for (index_line = from_line + 1, index_column = from_column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
897
            if (!CAN_PLAY (index_line, index_column))
892
            if (!CAN_PLAY (index_line, index_column))
898
               return (false); // if bishop can no longer move this way, stop searching
893
               return (false); // if bishop can no longer move this way, stop searching
899
            else if ((index_line == to_line) && (index_column == to_column))
894
            else if ((index_line == to_line) && (index_column == to_column))
900
            {
-
 
901
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
895
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
902
                  return (true); // this move is possible
-
 
903
 
-
 
904
               return (false); // else this bishop can't move in the claimed way (his king would be in check)
-
 
905
            }
-
 
906
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
907
               return (false); // bishop can take a part there BUT it's not the location we want
-
 
908
      }
896
      }
909
 
897
 
910
      // else do we want to move the bishop SW ?
898
      // else do we want to move the bishop SW ?
911
      else if ((to_line < from_line) && (to_column < from_column))
899
      else if ((to_line < from_line) && (to_column < from_column))
912
      {
900
      {
913
         // see if bishop can move SW
901
         // see if bishop can move SW
914
         for (index_line = from_line - 1, index_column = from_column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
902
         for (index_line = from_line - 1, index_column = from_column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
915
            if (!CAN_PLAY (index_line, index_column))
903
            if (!CAN_PLAY (index_line, index_column))
916
               return (false); // if bishop can no longer move this way, stop searching
904
               return (false); // if bishop can no longer move this way, stop searching
917
            else if ((index_line == to_line) && (index_column == to_column))
905
            else if ((index_line == to_line) && (index_column == to_column))
918
            {
-
 
919
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
906
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
920
                  return (true); // this move is possible
-
 
921
 
-
 
922
               return (false); // else this bishop can't move in the claimed way (his king would be in check)
-
 
923
            }
-
 
924
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
925
               return (false); // bishop can take a part there BUT it's not the location we want
-
 
926
      }
907
      }
927
 
908
 
928
      return (false); // this bishop can't move in the claimed way
909
      return (false); // this bishop can't move in the claimed way
929
   }
910
   }
930
 
911
 
Line 936... Line 917...
936
   {
917
   {
937
      // quick checks
918
      // quick checks
938
      if ((to_column != from_column) && (to_line != from_line)
919
      if ((to_column != from_column) && (to_line != from_line)
939
          && (abs (to_column - from_column) != abs (to_line - from_line)))
920
          && (abs (to_column - from_column) != abs (to_line - from_line)))
940
         return (false); // queens can only move horizontally, vertically or diagonally
921
         return (false); // queens can only move horizontally, vertically or diagonally
-
 
922
      else if (!Move_IsWayClearBetween (move, from_line, from_column, to_line, to_column))
-
 
923
         return (false); // way must be clear between source and target
941
 
924
 
942
      // do we want to move that queen vertically ?
925
      // do we want to move that queen vertically ?
943
      if (from_column == to_column)
926
      if (from_column == to_column)
944
      {
927
      {
945
         // do we want to move her upwards ?
928
         // do we want to move her upwards ?
Line 948... Line 931...
948
            // see if queen can move upwards
931
            // see if queen can move upwards
949
            for (index_line = from_line + 1; index_line < 8; index_line++)
932
            for (index_line = from_line + 1; index_line < 8; index_line++)
950
               if (!CAN_PLAY (index_line, to_column))
933
               if (!CAN_PLAY (index_line, to_column))
951
                  return (false); // if queen can no longer move this way, stop searching
934
                  return (false); // if queen can no longer move this way, stop searching
952
               else if (index_line == to_line)
935
               else if (index_line == to_line)
953
               {
-
 
954
                  if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
936
                  return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
955
                     return (true); // this move is possible
-
 
956
 
-
 
957
                  return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
958
               }
-
 
959
               else if (move->slots[index_line][to_column].part != PART_NONE)
-
 
960
                  return (false); // queen can take a part there BUT it's not the location we want
-
 
961
         }
937
         }
962
 
938
 
963
         // else do we want to move her downwards ?
939
         // else do we want to move her downwards ?
964
         else if (to_line < from_line)
940
         else if (to_line < from_line)
965
         {
941
         {
966
            // see if queen can move downwards
942
            // see if queen can move downwards
967
            for (index_line = from_line - 1; index_line >= 0; index_line--)
943
            for (index_line = from_line - 1; index_line >= 0; index_line--)
968
               if (!CAN_PLAY (index_line, to_column))
944
               if (!CAN_PLAY (index_line, to_column))
969
                  return (false); // if queen can no longer move this way, stop searching
945
                  return (false); // if queen can no longer move this way, stop searching
970
               else if (index_line == to_line)
946
               else if (index_line == to_line)
971
               {
-
 
972
                  if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
947
                  return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
973
                     return (true); // this move is possible
-
 
974
 
-
 
975
                  return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
976
               }
-
 
977
               else if (move->slots[index_line][to_column].part != PART_NONE)
-
 
978
                  return (false); // queen can take a part there BUT it's not the location we want
-
 
979
         }
948
         }
980
 
949
 
981
         return (false); // this queen can't move in the claimed way
950
         return (false); // this queen can't move in the claimed way
982
      }
951
      }
983
 
952
 
Line 990... Line 959...
990
            // see if queen can move right
959
            // see if queen can move right
991
            for (index_column = from_column + 1; index_column < 8; index_column++)
960
            for (index_column = from_column + 1; index_column < 8; index_column++)
992
               if (!CAN_PLAY (to_line, index_column))
961
               if (!CAN_PLAY (to_line, index_column))
993
                  return (false); // if queen can no longer move this way, stop searching
962
                  return (false); // if queen can no longer move this way, stop searching
994
               else if (index_column == to_column)
963
               else if (index_column == to_column)
995
               {
-
 
996
                  if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
964
                  return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
997
                     return (true); // this move is possible
-
 
998
 
-
 
999
                  return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
1000
               }
-
 
1001
               else if (move->slots[to_line][index_column].part != PART_NONE)
-
 
1002
                  return (false); // queen can take a part there BUT it's not the location we want
-
 
1003
         }
965
         }
1004
 
966
 
1005
         // else do we want this queen to move left ?
967
         // else do we want this queen to move left ?
1006
         else if (to_column < from_column)
968
         else if (to_column < from_column)
1007
         {
969
         {
1008
            // see if queen can move left
970
            // see if queen can move left
1009
            for (index_column = from_column - 1; index_column >= 0; index_column--)
971
            for (index_column = from_column - 1; index_column >= 0; index_column--)
1010
               if (!CAN_PLAY (to_line, index_column))
972
               if (!CAN_PLAY (to_line, index_column))
1011
                  return (false); // if queen can no longer move this way, stop searching
973
                  return (false); // if queen can no longer move this way, stop searching
1012
               else if (index_column == to_column)
974
               else if (index_column == to_column)
1013
               {
-
 
1014
                  if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color))
975
                  return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, to_line, to_column, boardslot->color)); // if move is safe for king, then it's possible
1015
                     return (true); // this move is possible
-
 
1016
 
-
 
1017
                  return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
1018
               }
-
 
1019
               else if (move->slots[to_line][index_column].part != PART_NONE)
-
 
1020
                  return (false); // queen can take a part there BUT it's not the location we want
-
 
1021
         }
976
         }
1022
 
977
 
1023
         return (false); // this queen can't move in the claimed way
978
         return (false); // this queen can't move in the claimed way
1024
      }
979
      }
1025
 
980
 
Line 1029... Line 984...
1029
         // see if queen can move NE
984
         // see if queen can move NE
1030
         for (index_line = from_line + 1, index_column = from_column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
985
         for (index_line = from_line + 1, index_column = from_column + 1; (index_line < 8) && (index_column < 8); index_line++, index_column++)
1031
            if (!CAN_PLAY (index_line, index_column))
986
            if (!CAN_PLAY (index_line, index_column))
1032
               return (false); // if queen can no longer move this way, stop searching
987
               return (false); // if queen can no longer move this way, stop searching
1033
            else if ((index_line == to_line) && (index_column == to_column))
988
            else if ((index_line == to_line) && (index_column == to_column))
1034
            {
-
 
1035
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
989
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
1036
                  return (true); // this move is possible
-
 
1037
 
-
 
1038
               return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
1039
            }
-
 
1040
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
1041
               return (false); // queen can take a part there BUT it's not the location we want
-
 
1042
      }
990
      }
1043
 
991
 
1044
      // else do we want to move the queen SE ?
992
      // else do we want to move the queen SE ?
1045
      else if ((to_line < from_line) && (to_column > from_column))
993
      else if ((to_line < from_line) && (to_column > from_column))
1046
      {
994
      {
1047
         // see if queen can move SE
995
         // see if queen can move SE
1048
         for (index_line = from_line - 1, index_column = from_column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
996
         for (index_line = from_line - 1, index_column = from_column + 1; (index_line >= 0) && (index_column < 8); index_line--, index_column++)
1049
            if (!CAN_PLAY (index_line, index_column))
997
            if (!CAN_PLAY (index_line, index_column))
1050
               return (false); // if queen can no longer move this way, stop searching
998
               return (false); // if queen can no longer move this way, stop searching
1051
            else if ((index_line == to_line) && (index_column == to_column))
999
            else if ((index_line == to_line) && (index_column == to_column))
1052
            {
-
 
1053
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
1000
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
1054
                  return (true); // this move is possible
-
 
1055
 
-
 
1056
               return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
1057
            }
-
 
1058
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
1059
               return (false); // queen can take a part there BUT it's not the location we want
-
 
1060
      }
1001
      }
1061
 
1002
 
1062
      // else do we want to move the queen NW ?
1003
      // else do we want to move the queen NW ?
1063
      else if ((to_line > from_line) && (to_column < from_column))
1004
      else if ((to_line > from_line) && (to_column < from_column))
1064
      {
1005
      {
1065
         // see if queen can move NW
1006
         // see if queen can move NW
1066
         for (index_line = from_line + 1, index_column = from_column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
1007
         for (index_line = from_line + 1, index_column = from_column - 1; (index_line < 8) && (index_column >= 0); index_line++, index_column--)
1067
            if (!CAN_PLAY (index_line, index_column))
1008
            if (!CAN_PLAY (index_line, index_column))
1068
               return (false); // if queen can no longer move this way, stop searching
1009
               return (false); // if queen can no longer move this way, stop searching
1069
            else if ((index_line == to_line) && (index_column == to_column))
1010
            else if ((index_line == to_line) && (index_column == to_column))
1070
            {
-
 
1071
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
1011
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
1072
                  return (true); // this move is possible
-
 
1073
 
-
 
1074
               return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
1075
            }
-
 
1076
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
1077
               return (false); // queen can take a part there BUT it's not the location we want
-
 
1078
      }
1012
      }
1079
 
1013
 
1080
      // else do we want to move the queen SW ?
1014
      // else do we want to move the queen SW ?
1081
      else if ((to_line < from_line) && (to_column < from_column))
1015
      else if ((to_line < from_line) && (to_column < from_column))
1082
      {
1016
      {
1083
         // see if queen can move SW
1017
         // see if queen can move SW
1084
         for (index_line = from_line - 1, index_column = from_column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
1018
         for (index_line = from_line - 1, index_column = from_column - 1; (index_line >= 0) && (index_column >= 0); index_line--, index_column--)
1085
            if (!CAN_PLAY (index_line, index_column))
1019
            if (!CAN_PLAY (index_line, index_column))
1086
               return (false); // if queen can no longer move this way, stop searching
1020
               return (false); // if queen can no longer move this way, stop searching
1087
            else if ((index_line == to_line) && (index_column == to_column))
1021
            else if ((index_line == to_line) && (index_column == to_column))
1088
            {
-
 
1089
               if (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color))
1022
               return (!Move_IsColorInCheckAfterTestMove (move, from_line, from_column, index_line, index_column, boardslot->color)); // if move is safe for king, then it's possible
1090
                  return (true); // this move is possible
-
 
1091
 
-
 
1092
               return (false); // else this queen can't move in the claimed way (her king would be in check)
-
 
1093
            }
-
 
1094
            else if (move->slots[index_line][index_column].part != PART_NONE)
-
 
1095
               return (false); // queen can take a part there BUT it's not the location we want
-
 
1096
      }
1023
      }
1097
 
1024
 
1098
      return (false); // this queen can't move in the claimed way
1025
      return (false); // this queen can't move in the claimed way
1099
   }
1026
   }
1100
 
1027
 
Line 1982... Line 1909...
1982
   }
1909
   }
1983
 
1910
 
1984
   // finally, save the FEN string with which we initialized this board
1911
   // finally, save the FEN string with which we initialized this board
1985
   Move_DescribeInFEN (move);
1912
   Move_DescribeInFEN (move);
1986
   return (true); // finished, no error encountered
1913
   return (true); // finished, no error encountered
-
 
1914
}
-
 
1915
 
-
 
1916
 
-
 
1917
static bool Move_IsWayClearBetween (boardmove_t *move, int source_line, int source_column, int target_line, int target_column)
-
 
1918
{
-
 
1919
   // helper function that checks and returns whether the way is clear between source and target.
-
 
1920
 
-
 
1921
   int column_delta_step;
-
 
1922
   int line_delta_step;
-
 
1923
   int column_delta;
-
 
1924
   int line_delta;
-
 
1925
   int column;
-
 
1926
   int line;
-
 
1927
 
-
 
1928
   line_delta = target_line - source_line;
-
 
1929
   line_delta_step = (line_delta != 0 ? line_delta / abs (line_delta) : 0);
-
 
1930
   column_delta = target_column - source_column;
-
 
1931
   column_delta_step = (column_delta != 0 ? column_delta / abs (column_delta) : 0);
-
 
1932
 
-
 
1933
   // for each square that's between source and target...
-
 
1934
   for (line = source_line + line_delta_step, column = source_column + column_delta_step;
-
 
1935
        IS_VALID (line, column) && (line != target_line || column != target_column);
-
 
1936
        line += line_delta_step, column += column_delta_step)
-
 
1937
      if ((line == target_line) && (column == target_column))
-
 
1938
         break; // don't verify the target position's square
-
 
1939
      else if (move->slots[line][column].part != PART_NONE)
-
 
1940
         return (false); // there's something in the way...
-
 
1941
 
-
 
1942
   if (!IS_VALID (line, column))
-
 
1943
      return (false); // we've gotten off board...
-
 
1944
 
-
 
1945
   return (true); // the way looks clear between source and target
1987
}
1946
}
1988
 
1947
 
1989
 
1948
 
1990
static void AddPossibleMove (boardmove_t **possiblemoves, int *possiblemove_count, int color, int part, int source_line, int source_column, int target_line, int target_column, int promotion_type, bool has_captured, bool is_enpassant)
1949
static void AddPossibleMove (boardmove_t **possiblemoves, int *possiblemove_count, int color, int part, int source_line, int source_column, int target_line, int target_column, int promotion_type, bool has_captured, bool is_enpassant)
1991
{
1950
{