summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/go/goplayutils.c2
-rw-r--r--noncore/games/go/killable.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/noncore/games/go/goplayutils.c b/noncore/games/go/goplayutils.c
index 9e2ce4c..91c6db2 100644
--- a/noncore/games/go/goplayutils.c
+++ b/noncore/games/go/goplayutils.c
@@ -727,385 +727,385 @@ short x, y, z;
727 { 727 {
728 nlcGroup.indx = nlcGroup.indx + 1; 728 nlcGroup.indx = nlcGroup.indx + 1;
729 nlcGroup.v[nlcGroup.indx] = gMap[groupIDs[x][y - 1]]; 729 nlcGroup.v[nlcGroup.indx] = gMap[groupIDs[x][y - 1]];
730 } 730 }
731 if ((y < maxPoint) && (bord[x][y + 1] == him)) 731 if ((y < maxPoint) && (bord[x][y + 1] == him))
732 { 732 {
733 nlcGroup.indx = nlcGroup.indx + 1; 733 nlcGroup.indx = nlcGroup.indx + 1;
734 nlcGroup.v[nlcGroup.indx] = gMap[groupIDs[x][y + 1]]; 734 nlcGroup.v[nlcGroup.indx] = gMap[groupIDs[x][y + 1]];
735 } 735 }
736 /* fix liberty count for affected groups */ 736 /* fix liberty count for affected groups */
737 grpMark = grpMark + 1; 737 grpMark = grpMark + 1;
738 for (i = 1; i <= nlcGroup.indx; i++) 738 for (i = 1; i <= nlcGroup.indx; i++)
739 if (gList[nlcGroup.v[i]].groupMark != grpMark) 739 if (gList[nlcGroup.v[i]].groupMark != grpMark)
740 { 740 {
741 if (gList[nlcGroup.v[i]].atLevel != tryLevel) 741 if (gList[nlcGroup.v[i]].atLevel != tryLevel)
742 { 742 {
743 playMark = playMark + 1; 743 playMark = playMark + 1;
744 playStack[playMark].kind = chLib; 744 playStack[playMark].kind = chLib;
745 playStack[playMark].gID = nlcGroup.v[i]; 745 playStack[playMark].gID = nlcGroup.v[i];
746 playStack[playMark].uval.chLib.oldLevel = 746 playStack[playMark].uval.chLib.oldLevel =
747 gList[nlcGroup.v[i]].atLevel; 747 gList[nlcGroup.v[i]].atLevel;
748 playStack[playMark].uval.chLib.oldLC = 748 playStack[playMark].uval.chLib.oldLC =
749 gList[nlcGroup.v[i]].libC; 749 gList[nlcGroup.v[i]].libC;
750 } 750 }
751 gList[nlcGroup.v[i]].groupMark = grpMark; 751 gList[nlcGroup.v[i]].groupMark = grpMark;
752 gList[nlcGroup.v[i]].atLevel = tryLevel; 752 gList[nlcGroup.v[i]].atLevel = tryLevel;
753 spanGroup(gList[nlcGroup.v[i]].lx, gList[nlcGroup.v[i]].ly, &pPlist); 753 spanGroup(gList[nlcGroup.v[i]].lx, gList[nlcGroup.v[i]].ly, &pPlist);
754 gList[nlcGroup.v[i]].libC = pPlist.indx; 754 gList[nlcGroup.v[i]].libC = pPlist.indx;
755 } 755 }
756} /* plei */ 756} /* plei */
757 757
758saveState() 758saveState()
759{ /* saveState */ 759{ /* saveState */
760 playMark = 0; 760 playMark = 0;
761 tryLevel = 0; 761 tryLevel = 0;
762 newGID = maxGroupID; 762 newGID = maxGroupID;
763} /* saveState */ 763} /* saveState */
764 764
765/* 765/*
766 undoes a move sequence back to uMark 766 undoes a move sequence back to uMark
767*/ 767*/
768undoTo(uMark) 768undoTo(uMark)
769short uMark; 769short uMark;
770{ /* undoTo */ 770{ /* undoTo */
771 short i, xl, yl; 771 short i, xl, yl;
772#ifdef DEBUG 772#ifdef DEBUG
773 printf( "undoTo\n" ); 773 printf( "undoTo\n" );
774#endif 774#endif
775 for (i = playMark; i >= uMark + 1; i--) 775 for (i = playMark; i >= uMark + 1; i--)
776 if (playStack[i].kind == rem) 776 if (playStack[i].kind == rem)
777 { 777 {
778 xl = playStack[i].uval.rem.xl; 778 xl = playStack[i].uval.rem.xl;
779 yl = playStack[i].uval.rem.yl; 779 yl = playStack[i].uval.rem.yl;
780 bord[xl][yl] = playStack[i].uval.rem.who; 780 bord[xl][yl] = playStack[i].uval.rem.who;
781 groupIDs[xl][yl] = playStack[i].gID; 781 groupIDs[xl][yl] = playStack[i].gID;
782 if (showTrees) 782 if (showTrees)
783 sstone(playStack[i].uval.rem.who, xl, yl, 783 sstone(playStack[i].uval.rem.who, xl, yl,
784 playStack[i].uval.rem.sNumber); 784 playStack[i].uval.rem.sNumber);
785 } 785 }
786 else if (playStack[i].kind == add) 786 else if (playStack[i].kind == add)
787 { 787 {
788 xl = playStack[i].uval.add.xl; 788 xl = playStack[i].uval.add.xl;
789 yl = playStack[i].uval.add.yl; 789 yl = playStack[i].uval.add.yl;
790 bord[xl][yl] = 0; 790 bord[xl][yl] = 0;
791 groupIDs[xl][yl] = 0; 791 groupIDs[xl][yl] = 0;
792 tryLevel = tryLevel - 1; 792 tryLevel = tryLevel - 1;
793 newGID = playStack[i].uval.add.nextGID; 793 newGID = playStack[i].uval.add.nextGID;
794 if (showTrees) 794 if (showTrees)
795 rstone(xl, yl); 795 rstone(xl, yl);
796 } 796 }
797 else if (playStack[i].kind == reMap) 797 else if (playStack[i].kind == reMap)
798 gMap[playStack[i].gID] = playStack[i].uval.reMap.oldGID; 798 gMap[playStack[i].gID] = playStack[i].uval.reMap.oldGID;
799 else /* change libs of group - gID is pre-mapped */ 799 else /* change libs of group - gID is pre-mapped */
800 { 800 {
801 gList[playStack[i].gID].libC = playStack[i].uval.chLib.oldLC; 801 gList[playStack[i].gID].libC = playStack[i].uval.chLib.oldLC;
802 gList[playStack[i].gID].atLevel = playStack[i].uval.chLib.oldLevel; 802 gList[playStack[i].gID].atLevel = playStack[i].uval.chLib.oldLevel;
803 } 803 }
804 playMark = uMark; 804 playMark = uMark;
805} /* undoTo */ 805} /* undoTo */
806 806
807/* 807/*
808 restores the state of the world after trying a move sequence 808 restores the state of the world after trying a move sequence
809*/ 809*/
810restoreState() 810restoreState()
811{ /* restoreState */ 811{ /* restoreState */
812#ifdef DEBUG 812#ifdef DEBUG
813 printf( "restoreState\n" ); 813 printf( "restoreState\n" );
814#endif 814#endif
815 if (playMark > 0) 815 if (playMark > 0)
816 { 816 {
817 undoTo(0); 817 undoTo(0);
818 playMark = 0; 818 playMark = 0;
819 tryLevel = 0; 819 tryLevel = 0;
820 } 820 }
821} /* restoreState */ 821} /* restoreState */
822 822
823/* exception bpt; */ 823/* exception bpt; */
824 824
825 825
826/* 826/*
827 returns true if (the group (at gx, gy) is saveable. 827 returns true if (the group (at gx, gy) is saveable.
828 if so, returns the point to play at in savex, savey 828 if so, returns the point to play at in savex, savey
829*/ 829*/
830short saveable(gx, gy, savex, savey) 830short saveable(gx, gy, savex, savey)
831short gx, gy, *savex, *savey; 831short gx, gy, *savex, *savey;
832{ /* saveable */ 832{ /* saveable */
833 short me, him, gx1, gx2, i, j, smark, mark2, tl, result; 833 short me, him, gx1, gx2, i, j, smark, mark2, tl, result;
834 char sChar; 834 char sChar;
835 sPointList dList; 835 sPointList dList;
836 point tp; 836 point tp;
837 short libList[maxSPoint+1]; 837 short libList[maxSPoint+1];
838#ifdef DEBUG 838#ifdef DEBUG
839 printf( "saveable\n" ); 839 printf( "saveable\n" );
840#endif 840#endif
841 dbStop = TRUE; 841 dbStop = TRUE;
842 me = bord[gx][gy]; 842 me = bord[gx][gy];
843 him = -me; 843 him = -me;
844 if (me == 1) 844 if (me == 1)
845 sChar = '|'; 845 sChar = '|';
846 else 846 else
847 sChar = '>'; 847 sChar = '>';
848/* write(sChar); */ 848/* write(sChar); */
849 spanGroup(gx, gy, &plist3); /* find my liberties */ 849 spanGroup(gx, gy, &plist3); /* find my liberties */
850 if (adjInAtari) /* one of my options is to kill */ 850 if (adjInAtari) /* one of my options is to kill */
851 { 851 {
852 listAdjacents(gx, gy, &aList); 852 listAdjacents(gx, gy, &aList);
853 for (i = 1; i <= aList.indx; i++) 853 for (i = 1; i <= aList.indx; i++)
854 if (gList[aList.v[i]].libC == 1) 854 if (gList[aList.v[i]].libC == 1)
855 { 855 {
856 spanGroup(gList[aList.v[i]].lx, gList[aList.v[i]].ly, 856 spanGroup(gList[aList.v[i]].lx, gList[aList.v[i]].ly,
857 &pList1); /* find it's liberty */ 857 &pList1); /* find it's liberty */
858 plist3.indx = plist3.indx + 1; 858 plist3.indx = plist3.indx + 1;
859 plist3.p[plist3.indx].px = pList1.p[1].px; 859 plist3.p[plist3.indx].px = pList1.p[1].px;
860 plist3.p[plist3.indx].py = pList1.p[1].py; 860 plist3.p[plist3.indx].py = pList1.p[1].py;
861 } 861 }
862 } 862 }
863 for (i = 1; i <= maxSPoint; i++) 863 for (i = 1; i <= maxSPoint; i++)
864 libList[i] = -1; 864 libList[i] = -1;
865 if ((utilPlayLevel > 4) && 865 if ((utilPlayLevel > 4) &&
866 (gList[gMap[groupIDs[gx][gy]]].libC > 1)) /* account for diags */ 866 (gList[gMap[groupIDs[gx][gy]]].libC > 1)) /* account for diags */
867 { 867 {
868 listDiags(gx, gy, &dList); 868 listDiags(gx, gy, &dList);
869 j = 0; 869 j = 0;
870 i = plist3.indx; 870 i = plist3.indx;
871 while ((j < dList.indx) && 871 while ((j < dList.indx) &&
872 (i < maxSPoint)) 872 (i < maxSPoint))
873 { 873 {
874 j = j + 1; 874 j = j + 1;
875 i = i + 1; 875 i = i + 1;
876 libList[i] = 100; 876 libList[i] = 100;
877 plist3.p[i].px = dList.p[j].px; 877 plist3.p[i].px = dList.p[j].px;
878 plist3.p[i].py = dList.p[j].py; 878 plist3.p[i].py = dList.p[j].py;
879 } 879 }
880 plist3.indx = i; 880 plist3.indx = i;
881 } 881 }
882 if (plist3.indx > 1) /* sort by decreasing lib count */ 882 if (plist3.indx > 1) /* sort by decreasing lib count */
883 { 883 {
884 for (i = 1; i <= plist3.indx; i++) 884 for (i = 1; i <= plist3.indx; i++)
885 if (libList[i] != 100) 885 if (libList[i] != 100)
886 { 886 {
887 mark2 = playMark; 887 mark2 = playMark;
888 tryPlay(plist3.p[i].px, plist3.p[i].py, me); 888 tryPlay(plist3.p[i].px, plist3.p[i].py, me);
889 libList[i] = gList[gMap[groupIDs[gx][gy]]].libC; 889 libList[i] = gList[gMap[groupIDs[gx][gy]]].libC;
890 if (libList[i] > treeLibLim) /* i'm safe */ 890 if (libList[i] > treeLibLim) /* i'm safe */
891 { 891 {
892 *savex = plist3.p[i].px; 892 *savex = plist3.p[i].px;
893 *savey = plist3.p[i].py; 893 *savey = plist3.p[i].py;
894 result = TRUE; 894 result = TRUE;
895 goto one; 895 goto one;
896 } 896 }
897 undoTo(mark2); 897 undoTo(mark2);
898 } 898 }
899 for (i = 1; i <= plist3.indx - 1; i++) 899 for (i = 1; i <= plist3.indx - 1; i++)
900 for (j = i + 1; j <= plist3.indx; j++) 900 for (j = i + 1; j <= plist3.indx; j++)
901 if (libList[i] < libList[j]) 901 if (libList[i] < libList[j])
902 { 902 {
903 tl = libList[i]; 903 tl = libList[i];
904 libList[i] = libList[j]; 904 libList[i] = libList[j];
905 libList[j] = tl; 905 libList[j] = tl;
906 tp = plist3.p[i]; 906 tp = plist3.p[i];
907 plist3.p[i] = plist3.p[j]; 907 plist3.p[i] = plist3.p[j];
908 plist3.p[j] = tp; 908 plist3.p[j] = tp;
909 } 909 }
910 } 910 }
911 for (i = 1; i <= plist3.indx; i++) 911 for (i = 1; i <= plist3.indx; i++)
912 { 912 {
913 *savex = plist3.p[i].px; 913 *savex = plist3.p[i].px;
914 *savey = plist3.p[i].py; 914 *savey = plist3.p[i].py;
915 if (legal[*savex][*savey]) 915 if (legal[*savex][*savey])
916 { 916 {
917 smark = playMark; 917 smark = playMark;
918 tryPlay(*savex, *savey, me); 918 tryPlay(*savex, *savey, me);
919 pause(); 919//pause();
920 if (gList[gMap[groupIDs[*savex][*savey]]].libC > 1) 920 if (gList[gMap[groupIDs[*savex][*savey]]].libC > 1)
921 if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim) 921 if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim)
922 { 922 {
923 restoreState(); 923 restoreState();
924/* sClearChar(sChar, rXor); */ 924/* sClearChar(sChar, rXor); */
925 return TRUE; 925 return TRUE;
926 } 926 }
927 else if (gList[gMap[groupIDs[gx][gy]]].libC > 1) 927 else if (gList[gMap[groupIDs[gx][gy]]].libC > 1)
928 if (! killable(gx, gy, &gx1, &gx2)) 928 if (! killable(gx, gy, &gx1, &gx2))
929 { 929 {
930 restoreState(); 930 restoreState();
931/* sClearChar(sChar, rXor); */ 931/* sClearChar(sChar, rXor); */
932 return TRUE; 932 return TRUE;
933 } 933 }
934 undoTo(smark); 934 undoTo(smark);
935 } 935 }
936 } 936 }
937 result = FALSE; 937 result = FALSE;
938one: 938one:
939 restoreState(); 939 restoreState();
940/* sClearChar(sChar, rXor); */ 940/* sClearChar(sChar, rXor); */
941 return result; 941 return result;
942} /* saveable */ 942} /* saveable */
943 943
944/* 944/*
945 marks unsavable groups as dead 945 marks unsavable groups as dead
946*/ 946*/
947markDead() 947markDead()
948{ /* markDead */ 948{ /* markDead */
949 short i, j, gx, gy, result; 949 short i, j, gx, gy, result;
950#ifdef DEBUG 950#ifdef DEBUG
951 printf( "markDead\n" ); 951 printf( "markDead\n" );
952#endif 952#endif
953 for (i = 1; i <= maxGroupID; i++) 953 for (i = 1; i <= maxGroupID; i++)
954 if (killable(gList[i].lx, gList[i].ly, &gx, &gy)) 954 if (killable(gList[i].lx, gList[i].ly, &gx, &gy))
955 result = ! saveable(gList[i].lx, gList[i].ly, &gx, &gy); 955 result = ! saveable(gList[i].lx, gList[i].ly, &gx, &gy);
956 else 956 else
957 result = FALSE; 957 result = FALSE;
958 for (i = 0; i <= maxPoint; i++) 958 for (i = 0; i <= maxPoint; i++)
959 for (j = 0; j <= maxPoint; j++) 959 for (j = 0; j <= maxPoint; j++)
960 if (bord[i][j] == 0) 960 if (bord[i][j] == 0)
961 ndbord[i][j] = 0; 961 ndbord[i][j] = 0;
962 else if (gList[groupIDs[i][j]].isDead) 962 else if (gList[groupIDs[i][j]].isDead)
963 ndbord[i][j] = 0; 963 ndbord[i][j] = 0;
964 else 964 else
965 ndbord[i][j] = bord[i][j]; 965 ndbord[i][j] = bord[i][j];
966} /* markDead */ 966} /* markDead */
967 967
968/* 968/*
969 marks groups with two eyes as live 969 marks groups with two eyes as live
970*/ 970*/
971MLspan(x, y, saw1, sawm1, size, sMark) 971MLspan(x, y, saw1, sawm1, size, sMark)
972short x, y, *saw1, *sawm1, *size, sMark; 972short x, y, *saw1, *sawm1, *size, sMark;
973 { /* span */ 973 { /* span */
974 if (ndbord[x][y] == 1) 974 if (ndbord[x][y] == 1)
975 *saw1 = TRUE; 975 *saw1 = TRUE;
976 else if (ndbord[x][y] == -1) 976 else if (ndbord[x][y] == -1)
977 *sawm1 = TRUE; 977 *sawm1 = TRUE;
978 else if (sGroups[x][y] == 0) 978 else if (sGroups[x][y] == 0)
979 { 979 {
980 sGroups[x][y] = sMark; 980 sGroups[x][y] = sMark;
981 *size = *size + 1; 981 *size = *size + 1;
982 if (x > 0) 982 if (x > 0)
983 MLspan(x - 1, y, saw1, sawm1, size, sMark); 983 MLspan(x - 1, y, saw1, sawm1, size, sMark);
984 if (x < maxPoint) 984 if (x < maxPoint)
985 MLspan(x + 1, y, saw1, sawm1, size, sMark); 985 MLspan(x + 1, y, saw1, sawm1, size, sMark);
986 if (y > 0) 986 if (y > 0)
987 MLspan(x, y - 1, saw1, sawm1, size, sMark); 987 MLspan(x, y - 1, saw1, sawm1, size, sMark);
988 if (y < maxPoint) 988 if (y < maxPoint)
989 MLspan(x, y + 1, saw1, sawm1, size, sMark); 989 MLspan(x, y + 1, saw1, sawm1, size, sMark);
990 } 990 }
991 } /* span */ 991 } /* span */
992 992
993short CLspan(x, y, numEyes, who) 993short CLspan(x, y, numEyes, who)
994short x, y, *numEyes, who; 994short x, y, *numEyes, who;
995 { /* span */ 995 { /* span */
996 markBoard[x][y] = marker; 996 markBoard[x][y] = marker;
997 if (ndbord[x][y] == 0) 997 if (ndbord[x][y] == 0)
998 { 998 {
999 if ((sList[sGroups[x][y]].sm != marker) && 999 if ((sList[sGroups[x][y]].sm != marker) &&
1000 (sList[sGroups[x][y]].w == who)) 1000 (sList[sGroups[x][y]].w == who))
1001 { 1001 {
1002 sList[sGroups[x][y]].sm = marker; 1002 sList[sGroups[x][y]].sm = marker;
1003 if (sList[sGroups[x][y]].s > 6) 1003 if (sList[sGroups[x][y]].s > 6)
1004 return TRUE; 1004 return TRUE;
1005 *numEyes = *numEyes + 1; 1005 *numEyes = *numEyes + 1;
1006 if (*numEyes > 1) 1006 if (*numEyes > 1)
1007 return TRUE; 1007 return TRUE;
1008 } 1008 }
1009 } 1009 }
1010 else if (bord[x][y] == who) 1010 else if (bord[x][y] == who)
1011 { 1011 {
1012 if ((x > 0) && 1012 if ((x > 0) &&
1013 (markBoard[x - 1][y] != marker)) 1013 (markBoard[x - 1][y] != marker))
1014 if (CLspan(x - 1, y, numEyes, who)) return TRUE; 1014 if (CLspan(x - 1, y, numEyes, who)) return TRUE;
1015 if ((x < maxPoint) && 1015 if ((x < maxPoint) &&
1016 (markBoard[x + 1][y] != marker)) 1016 (markBoard[x + 1][y] != marker))
1017 if (CLspan(x + 1, y, numEyes, who)) return TRUE; 1017 if (CLspan(x + 1, y, numEyes, who)) return TRUE;
1018 if ((y > 0) && 1018 if ((y > 0) &&
1019 (markBoard[x][y - 1] != marker)) 1019 (markBoard[x][y - 1] != marker))
1020 if (CLspan(x, y - 1, numEyes, who)) return TRUE; 1020 if (CLspan(x, y - 1, numEyes, who)) return TRUE;
1021 if ((y < maxPoint) && 1021 if ((y < maxPoint) &&
1022 (markBoard[x][y + 1] != marker)) 1022 (markBoard[x][y + 1] != marker))
1023 if (CLspan(x, y + 1, numEyes, who)) return TRUE; 1023 if (CLspan(x, y + 1, numEyes, who)) return TRUE;
1024 } 1024 }
1025 return FALSE; 1025 return FALSE;
1026 } /* span */ 1026 } /* span */
1027 1027
1028short checkLive(x, y) 1028short checkLive(x, y)
1029short x, y; 1029short x, y;
1030 { /* checkLive */ 1030 { /* checkLive */
1031 short numEyes, who; 1031 short numEyes, who;
1032#ifdef DEBUG 1032#ifdef DEBUG
1033 printf( "checkLive\n" ); 1033 printf( "checkLive\n" );
1034#endif 1034#endif
1035 numEyes = 0; 1035 numEyes = 0;
1036 who = bord[x][y]; 1036 who = bord[x][y];
1037 marker = marker + 1; 1037 marker = marker + 1;
1038 return CLspan(x, y, &numEyes, who); 1038 return CLspan(x, y, &numEyes, who);
1039 } /* checkLive */ 1039 } /* checkLive */
1040 1040
1041markLive() 1041markLive()
1042{ /* markLive */ 1042{ /* markLive */
1043 short i, j, size, sMark = 0; 1043 short i, j, size, sMark = 0;
1044 short saw1, sawm1; 1044 short saw1, sawm1;
1045#ifdef DEBUG 1045#ifdef DEBUG
1046 printf( "markLive\n" ); 1046 printf( "markLive\n" );
1047#endif 1047#endif
1048 initArray(sGroups); 1048 initArray(sGroups);
1049 for (i = 0; i <= maxPoint; i++) 1049 for (i = 0; i <= maxPoint; i++)
1050 for (j = 0; j <= maxPoint; j++) 1050 for (j = 0; j <= maxPoint; j++)
1051 if ((sGroups[i][j] == 0) && 1051 if ((sGroups[i][j] == 0) &&
1052 (ndbord[i][j] == 0)) 1052 (ndbord[i][j] == 0))
1053 { 1053 {
1054 size = 0; 1054 size = 0;
1055 sMark = sMark + 1; 1055 sMark = sMark + 1;
1056 sawm1 = FALSE; 1056 sawm1 = FALSE;
1057 saw1 = FALSE; 1057 saw1 = FALSE;
1058 MLspan(i, j, &saw1, &sawm1, &size, sMark); 1058 MLspan(i, j, &saw1, &sawm1, &size, sMark);
1059 sList[sMark].s = size; 1059 sList[sMark].s = size;
1060 sList[sMark].sm = 0; 1060 sList[sMark].sm = 0;
1061 if (sawm1) 1061 if (sawm1)
1062 if (saw1) 1062 if (saw1)
1063 sList[sMark].w = 0; 1063 sList[sMark].w = 0;
1064 else 1064 else
1065 sList[sMark].w = -1; 1065 sList[sMark].w = -1;
1066 else if (saw1) 1066 else if (saw1)
1067 sList[sMark].w = 1; 1067 sList[sMark].w = 1;
1068 else 1068 else
1069 sList[sMark].w = 0; 1069 sList[sMark].w = 0;
1070 } 1070 }
1071 for (i = 1; i <= maxGroupID; i++) 1071 for (i = 1; i <= maxGroupID; i++)
1072 if (! gList[i].isDead) 1072 if (! gList[i].isDead)
1073 gList[i].isLive = checkLive(gList[i].lx, gList[i].ly); 1073 gList[i].isLive = checkLive(gList[i].lx, gList[i].ly);
1074} /* markLive */ 1074} /* markLive */
1075 1075
1076/* 1076/*
1077 generates the connection map and the protected point map. 1077 generates the connection map and the protected point map.
1078*/ 1078*/
1079genConnects() 1079genConnects()
1080{ /* genConnects */ 1080{ /* genConnects */
1081 short x, y, numStones; 1081 short x, y, numStones;
1082#ifdef DEBUG 1082#ifdef DEBUG
1083 printf( "genConnects\n" ); 1083 printf( "genConnects\n" );
1084#endif 1084#endif
1085 for (x = 0; x <= maxPoint; x++) 1085 for (x = 0; x <= maxPoint; x++)
1086 for (y = 0; y <= maxPoint; y++) 1086 for (y = 0; y <= maxPoint; y++)
1087 { 1087 {
1088 connectMap[x][y] = 0; 1088 connectMap[x][y] = 0;
1089 protPoints[x][y] = 0; 1089 protPoints[x][y] = 0;
1090 } 1090 }
1091 for (x = 0; x <= maxPoint; x++) 1091 for (x = 0; x <= maxPoint; x++)
1092 for (y = 0; y <= maxPoint; y++) 1092 for (y = 0; y <= maxPoint; y++)
1093 if (bord[x][y] == 1) /* map connections to this stone */ 1093 if (bord[x][y] == 1) /* map connections to this stone */
1094 { 1094 {
1095 if (x > 0) /* direct connection */ 1095 if (x > 0) /* direct connection */
1096 connectMap[x - 1][y] += 1; 1096 connectMap[x - 1][y] += 1;
1097 if (x < maxPoint) 1097 if (x < maxPoint)
1098 connectMap[x + 1][y] += 1; 1098 connectMap[x + 1][y] += 1;
1099 if (y > 0) 1099 if (y > 0)
1100 connectMap[x][y - 1] += 1; 1100 connectMap[x][y - 1] += 1;
1101 if (y < maxPoint) 1101 if (y < maxPoint)
1102 connectMap[x][y + 1] += 1; 1102 connectMap[x][y + 1] += 1;
1103 if ((x > 0) && (y > 0) && /* diagonal connection */ 1103 if ((x > 0) && (y > 0) && /* diagonal connection */
1104 (bord[x - 1][y] == 0) && (bord[x][y - 1] == 0)) 1104 (bord[x - 1][y] == 0) && (bord[x][y - 1] == 0))
1105 connectMap[x - 1][y - 1] += 1; 1105 connectMap[x - 1][y - 1] += 1;
1106 if ((x < maxPoint) && (y > 0) && 1106 if ((x < maxPoint) && (y > 0) &&
1107 (bord[x + 1][y] == 0) && (bord[x][y - 1] == 0)) 1107 (bord[x + 1][y] == 0) && (bord[x][y - 1] == 0))
1108 connectMap[x + 1][y - 1] += 1; 1108 connectMap[x + 1][y - 1] += 1;
1109 if ((x < maxPoint) && (y < maxPoint) && 1109 if ((x < maxPoint) && (y < maxPoint) &&
1110 (bord[x + 1][y] == 0) && (bord[x][y + 1] == 0)) 1110 (bord[x + 1][y] == 0) && (bord[x][y + 1] == 0))
1111 connectMap[x + 1][y + 1] += 1; 1111 connectMap[x + 1][y + 1] += 1;
diff --git a/noncore/games/go/killable.c b/noncore/games/go/killable.c
index 3ed2d2e..23a133d 100644
--- a/noncore/games/go/killable.c
+++ b/noncore/games/go/killable.c
@@ -1,347 +1,347 @@
1/* By Stoney Ballard */ 1/* By Stoney Ballard */
2/* Ported from Pascal to C by Todd R. Johnson */ 2/* Ported from Pascal to C by Todd R. Johnson */
3 3
4#include "go.h" 4#include "go.h"
5#include "goplayutils.h" 5#include "goplayutils.h"
6#include "amigo.h" 6#include "amigo.h"
7 7
8extern intBoard bord, groupIDs; 8extern intBoard bord, groupIDs;
9extern boolBoard legal; 9extern boolBoard legal;
10extern groupRec gList[maxGroup]; 10extern groupRec gList[maxGroup];
11extern short gMap[maxGroup], adjInAtari, adj2Libs, playMark, treeLibLim, 11extern short gMap[maxGroup], adjInAtari, adj2Libs, playMark, treeLibLim,
12 utilPlayLevel, killFlag, depthLimit, dbStop, showTrees; 12 utilPlayLevel, killFlag, depthLimit, dbStop, showTrees;
13extern pointList plist2; 13extern pointList plist2;
14 14
15/* 15/*
16 returns true if the group (at x, y) is killable. 16 returns true if the group (at x, y) is killable.
17 if so, returns the point to play at in killx, killy. 17 if so, returns the point to play at in killx, killy.
18*/ 18*/
19 19
20 short me, him, depth, i, j, tryCount, tl, topMark, tkMark, mark2; 20 short me, him, depth, i, j, tryCount, tl, topMark, tkMark, mark2;
21 char sChar; 21 char sChar;
22 sPointList lList, dList; 22 sPointList lList, dList;
23 point tp; 23 point tp;
24 short libList[maxSPoint+1]; 24 short libList[maxSPoint+1];
25 short esc; 25 short esc;
26 26
27short mtNbrs(x, y) 27short mtNbrs(x, y)
28short x, y; 28short x, y;
29 { /* mtNbrs */ 29 { /* mtNbrs */
30 short n = 0; 30 short n = 0;
31 if ((x > 0) && (bord[x - 1][y] == 0)) 31 if ((x > 0) && (bord[x - 1][y] == 0))
32 n = n + 1; 32 n = n + 1;
33 if ((x < maxPoint) && (bord[x + 1][y] == 0)) 33 if ((x < maxPoint) && (bord[x + 1][y] == 0))
34 n = n + 1; 34 n = n + 1;
35 if ((y > 0) && (bord[x][y - 1] == 0)) 35 if ((y > 0) && (bord[x][y - 1] == 0))
36 n = n + 1; 36 n = n + 1;
37 if ((y < maxPoint) && (bord[x][y + 1] == 0)) 37 if ((y < maxPoint) && (bord[x][y + 1] == 0))
38 n = n + 1; 38 n = n + 1;
39 return n; 39 return n;
40 } /* mtNbrs */ 40 } /* mtNbrs */
41 41
42short killTree(tx, ty, gx, gy, escape, tkMark) 42short killTree(tx, ty, gx, gy, escape, tkMark)
43short tx, ty, gx, gy, *escape, tkMark; 43short tx, ty, gx, gy, *escape, tkMark;
44 { /* killTree */ 44 { /* killTree */
45 short curMark, mark2, mark3, i, j, k, tl, dStart, result; 45 short curMark, mark2, mark3, i, j, k, tl, dStart, result;
46 sPointList lList1, lList2; 46 sPointList lList1, lList2;
47 short libList[maxSPoint+1]; 47 short libList[maxSPoint+1];
48 point tp; 48 point tp;
49 short esc = FALSE; 49 short esc = FALSE;
50 tryCount = tryCount + 1; 50 tryCount = tryCount + 1;
51 if (tryCount > tryLimit) 51 if (tryCount > tryLimit)
52 { 52 {
53 undoTo(tkMark); 53 undoTo(tkMark);
54/* for (i = 1; i <= depth - 1; i++) 54/* for (i = 1; i <= depth - 1; i++)
55 { 55 {
56 sClearChar(sChar, rXor); 56 sClearChar(sChar, rXor);
57 } */ 57 } */
58 depth = 1; 58 depth = 1;
59 return FALSE; 59 return FALSE;
60 } 60 }
61/* write(sChar); */ 61/* write(sChar); */
62 depth = depth + 1; 62 depth = depth + 1;
63 curMark = playMark; 63 curMark = playMark;
64 tryPlay(tx, ty, me); /* try my move */ 64 tryPlay(tx, ty, me); /* try my move */
65 pause(); 65// pause();
66 if (gList[gMap[groupIDs[tx][ty]]].libC == 0) /* I'm dead */ 66 if (gList[gMap[groupIDs[tx][ty]]].libC == 0) /* I'm dead */
67 { 67 {
68 result = FALSE; 68 result = FALSE;
69 goto one; 69 goto one;
70 } 70 }
71 else if (killFlag) /* I killed something of his */ 71 else if (killFlag) /* I killed something of his */
72 { 72 {
73 result = TRUE; 73 result = TRUE;
74 goto one; 74 goto one;
75 } 75 }
76 else if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim) /* safe */ 76 else if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim) /* safe */
77 { 77 {
78 result = FALSE; 78 result = FALSE;
79 goto one; 79 goto one;
80 } 80 }
81 else 81 else
82 { 82 {
83 sSpanGroup(gx, gy, &lList1); /* find his liberties */ 83 sSpanGroup(gx, gy, &lList1); /* find his liberties */
84 if (gList[gMap[groupIDs[tx][ty]]].libC == 1) /* he can kill me */ 84 if (gList[gMap[groupIDs[tx][ty]]].libC == 1) /* he can kill me */
85 { 85 {
86 if (lList1.indx < maxSPoint) /* add that option to his list */ 86 if (lList1.indx < maxSPoint) /* add that option to his list */
87 { 87 {
88 lList1.indx = lList1.indx + 1; 88 lList1.indx = lList1.indx + 1;
89 spanGroup(tx, ty, &plist2); /* find my liberty */ 89 spanGroup(tx, ty, &plist2); /* find my liberty */
90 lList1.p[lList1.indx].px = plist2.p[1].px; 90 lList1.p[lList1.indx].px = plist2.p[1].px;
91 lList1.p[lList1.indx].py = plist2.p[1].py; 91 lList1.p[lList1.indx].py = plist2.p[1].py;
92 } 92 }
93 else 93 else
94 { 94 {
95 result = FALSE; 95 result = FALSE;
96 goto one; 96 goto one;
97 } 97 }
98 } 98 }
99 for (i = 1; i <= maxSPoint; i++) /* init liblist so diags can be marked */ 99 for (i = 1; i <= maxSPoint; i++) /* init liblist so diags can be marked */
100 libList[i] = -1; 100 libList[i] = -1;
101 if ((utilPlayLevel > 4) && 101 if ((utilPlayLevel > 4) &&
102 (lList1.indx > 1) && 102 (lList1.indx > 1) &&
103 (gList[gMap[groupIDs[gx][gy]]].libC > 1)) /* try diags */ 103 (gList[gMap[groupIDs[gx][gy]]].libC > 1)) /* try diags */
104 { 104 {
105 listDiags(gx, gy, &dList); 105 listDiags(gx, gy, &dList);
106 j = 0; 106 j = 0;
107 i = lList1.indx; 107 i = lList1.indx;
108 while ((j < dList.indx) && 108 while ((j < dList.indx) &&
109 (i < maxSPoint)) 109 (i < maxSPoint))
110 { 110 {
111 j = j + 1; 111 j = j + 1;
112 i = i + 1; 112 i = i + 1;
113 libList[i] = 0; /* mark this as a diag */ 113 libList[i] = 0; /* mark this as a diag */
114 lList1.p[i].px = dList.p[j].px; 114 lList1.p[i].px = dList.p[j].px;
115 lList1.p[i].py = dList.p[j].py; 115 lList1.p[i].py = dList.p[j].py;
116 } 116 }
117 lList1.indx = i; 117 lList1.indx = i;
118 } 118 }
119 if (lList1.indx > 1) /* sort by decreasing lib count */ 119 if (lList1.indx > 1) /* sort by decreasing lib count */
120 { 120 {
121 for (i = 1; i <= lList1.indx; i++) 121 for (i = 1; i <= lList1.indx; i++)
122 if (libList[i] != 0) /* diags are tried last */ 122 if (libList[i] != 0) /* diags are tried last */
123 { 123 {
124 mark2 = playMark; 124 mark2 = playMark;
125 tryPlay(lList1.p[i].px, lList1.p[i].py, him); 125 tryPlay(lList1.p[i].px, lList1.p[i].py, him);
126 libList[i] = gList[gMap[groupIDs[gx][gy]]].libC; 126 libList[i] = gList[gMap[groupIDs[gx][gy]]].libC;
127 if ((libList[i] > treeLibLim) || 127 if ((libList[i] > treeLibLim) ||
128 ((libList[i] > (depthLimit - depth)) && 128 ((libList[i] > (depthLimit - depth)) &&
129 (libList[i] > 2))) 129 (libList[i] > 2)))
130 { 130 {
131 *escape = TRUE; 131 *escape = TRUE;
132 result = FALSE; 132 result = FALSE;
133 goto one; 133 goto one;
134 } 134 }
135 undoTo(mark2); 135 undoTo(mark2);
136 } 136 }
137 for (i = 1; i <= lList1.indx - 1; i++) 137 for (i = 1; i <= lList1.indx - 1; i++)
138 for (j = i + 1; j <= lList1.indx; j++) 138 for (j = i + 1; j <= lList1.indx; j++)
139 if (libList[i] < libList[j]) 139 if (libList[i] < libList[j])
140 { 140 {
141 tl = libList[i]; 141 tl = libList[i];
142 libList[i] = libList[j]; 142 libList[i] = libList[j];
143 libList[j] = tl; 143 libList[j] = tl;
144 tp = lList1.p[i]; 144 tp = lList1.p[i];
145 lList1.p[i] = lList1.p[j]; 145 lList1.p[i] = lList1.p[j];
146 lList1.p[j] = tp; 146 lList1.p[j] = tp;
147 } 147 }
148 } 148 }
149 for (i = 1; i <= lList1.indx + 1; i++) /* try his responses */ 149 for (i = 1; i <= lList1.indx + 1; i++) /* try his responses */
150 { 150 {
151 mark2 = playMark; 151 mark2 = playMark;
152 if (i <= lList1.indx) /* try his move */ 152 if (i <= lList1.indx) /* try his move */
153 { 153 {
154 tryPlay(lList1.p[i].px, lList1.p[i].py, him); /* play his response */ 154 tryPlay(lList1.p[i].px, lList1.p[i].py, him); /* play his response */
155 pause(); 155// pause();
156 if (gList[gMap[groupIDs[lList1.p[i].px] 156 if (gList[gMap[groupIDs[lList1.p[i].px]
157 [lList1.p[i].py]]].libC < 2) 157 [lList1.p[i].py]]].libC < 2)
158 goto two; /* a bogus move */ 158 goto two; /* a bogus move */
159 } 159 }
160 else if (gList[gMap[groupIDs[gx][gy]]].libC <= 1) 160 else if (gList[gMap[groupIDs[gx][gy]]].libC <= 1)
161 { 161 {
162 result = TRUE; 162 result = TRUE;
163 goto one; 163 goto one;
164 } 164 }
165 if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim) 165 if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim)
166 { 166 {
167 *escape = TRUE; 167 *escape = TRUE;
168 result = FALSE; 168 result = FALSE;
169 goto one; 169 goto one;
170 } 170 }
171 if (gList[gMap[groupIDs[gx][gy]]].libC > 1) 171 if (gList[gMap[groupIDs[gx][gy]]].libC > 1)
172 { /* look at my responses */ 172 { /* look at my responses */
173 sSpanGroup(gx, gy, &lList2); /* list his liberties */ 173 sSpanGroup(gx, gy, &lList2); /* list his liberties */
174 dStart = lList2.indx + 1; 174 dStart = lList2.indx + 1;
175 if (adjInAtari) /* he wins */ 175 if (adjInAtari) /* he wins */
176 { 176 {
177 result = FALSE; 177 result = FALSE;
178 goto one; 178 goto one;
179 } 179 }
180 if ((lList2.indx > 2) && adj2Libs) /* he wins */ 180 if ((lList2.indx > 2) && adj2Libs) /* he wins */
181 { 181 {
182 result = FALSE; 182 result = FALSE;
183 goto one; 183 goto one;
184 } 184 }
185 for (k = 1; k <= maxSPoint; k++) 185 for (k = 1; k <= maxSPoint; k++)
186 libList[k] = -1; 186 libList[k] = -1;
187 if (utilPlayLevel > 4) /* account for diagonal moves */ 187 if (utilPlayLevel > 4) /* account for diagonal moves */
188 { 188 {
189 listDiags(gx, gy, &dList); 189 listDiags(gx, gy, &dList);
190 j = 0; 190 j = 0;
191 k = lList2.indx; 191 k = lList2.indx;
192 while ((j < dList.indx) && 192 while ((j < dList.indx) &&
193 (k < maxSPoint)) 193 (k < maxSPoint))
194 { 194 {
195 j = j + 1; 195 j = j + 1;
196 k = k + 1; 196 k = k + 1;
197 libList[k] = 100; 197 libList[k] = 100;
198 lList2.p[k].px = dList.p[j].px; 198 lList2.p[k].px = dList.p[j].px;
199 lList2.p[k].py = dList.p[j].py; 199 lList2.p[k].py = dList.p[j].py;
200 } 200 }
201 lList2.indx = k; 201 lList2.indx = k;
202 } 202 }
203 if (lList2.indx > 1) /* sort by increasing lib count */ 203 if (lList2.indx > 1) /* sort by increasing lib count */
204 { 204 {
205 for (k = 1; k <= lList2.indx; k++) 205 for (k = 1; k <= lList2.indx; k++)
206 if (libList[k] != 100) /* diags go last */ 206 if (libList[k] != 100) /* diags go last */
207 { 207 {
208 mark3 = playMark; 208 mark3 = playMark;
209 tryPlay(lList2.p[k].px, lList2.p[k].py, me); 209 tryPlay(lList2.p[k].px, lList2.p[k].py, me);
210 libList[k] = gList[gMap[groupIDs[gx][gy]]].libC; 210 libList[k] = gList[gMap[groupIDs[gx][gy]]].libC;
211 undoTo(mark3); 211 undoTo(mark3);
212 } 212 }
213 for (k = 1; k <= lList2.indx - 1; k++) 213 for (k = 1; k <= lList2.indx - 1; k++)
214 for (j = k + 1; j <= lList2.indx; j++) 214 for (j = k + 1; j <= lList2.indx; j++)
215 if (libList[k] > libList[j]) 215 if (libList[k] > libList[j])
216 { 216 {
217 tl = libList[k]; 217 tl = libList[k];
218 libList[k] = libList[j]; 218 libList[k] = libList[j];
219 libList[j] = tl; 219 libList[j] = tl;
220 tp = lList2.p[k]; 220 tp = lList2.p[k];
221 lList2.p[k] = lList2.p[j]; 221 lList2.p[k] = lList2.p[j];
222 lList2.p[j] = tp; 222 lList2.p[j] = tp;
223 } 223 }
224 else if ((libList[k] == libList[j]) && 224 else if ((libList[k] == libList[j]) &&
225 (libList[k] == 1)) 225 (libList[k] == 1))
226 if (mtNbrs(lList2.p[k].px, lList2.p[k].py) < 226 if (mtNbrs(lList2.p[k].px, lList2.p[k].py) <
227 mtNbrs(lList2.p[j].px, lList2.p[j].py)) 227 mtNbrs(lList2.p[j].px, lList2.p[j].py))
228 { 228 {
229 tl = libList[k]; 229 tl = libList[k];
230 libList[k] = libList[j]; 230 libList[k] = libList[j];
231 libList[j] = tl; 231 libList[j] = tl;
232 tp = lList2.p[k]; 232 tp = lList2.p[k];
233 lList2.p[k] = lList2.p[j]; 233 lList2.p[k] = lList2.p[j];
234 lList2.p[j] = tp; 234 lList2.p[j] = tp;
235 } 235 }
236 } 236 }
237 for (j = 1; j <= lList2.indx; j++) 237 for (j = 1; j <= lList2.indx; j++)
238 { 238 {
239 if (killTree(lList2.p[j].px, lList2.p[j].py, gx, 239 if (killTree(lList2.p[j].px, lList2.p[j].py, gx,
240 gy, &esc, tkMark)) 240 gy, &esc, tkMark))
241 goto two; /* this kills him */ 241 goto two; /* this kills him */
242 if (esc && (j >= dStart)) 242 if (esc && (j >= dStart))
243 { 243 {
244 result = FALSE; 244 result = FALSE;
245 goto one; /* don't bother with more diags if escapes */ 245 goto one; /* don't bother with more diags if escapes */
246 } 246 }
247 } 247 }
248 result = FALSE; /* none of my responses kills him */ 248 result = FALSE; /* none of my responses kills him */
249 goto one; 249 goto one;
250 } 250 }
251 two: 251 two:
252 undoTo(mark2); 252 undoTo(mark2);
253 } 253 }
254 result = TRUE; /* none of his responses saves him */ 254 result = TRUE; /* none of his responses saves him */
255 } 255 }
256 one: 256 one:
257 undoTo(curMark); 257 undoTo(curMark);
258/* sClearChar(sChar, rXor); */ 258/* sClearChar(sChar, rXor); */
259 depth = depth - 1; 259 depth = depth - 1;
260 return result; 260 return result;
261 } /* killTree */ 261 } /* killTree */
262 262
263short tKillTree(tx, ty, gx, gy) 263short tKillTree(tx, ty, gx, gy)
264short tx, ty, gx, gy; 264short tx, ty, gx, gy;
265 { /* tKillTree */ 265 { /* tKillTree */
266 short tkMark, escape; 266 short tkMark, escape;
267 tryCount = 0; 267 tryCount = 0;
268 tkMark = playMark; 268 tkMark = playMark;
269 return killTree(tx, ty, gx, gy, &escape, tkMark); 269 return killTree(tx, ty, gx, gy, &escape, tkMark);
270 } /* tKillTree */ 270 } /* tKillTree */
271 271
272short killable(gx, gy, killx, killy) 272short killable(gx, gy, killx, killy)
273short gx, gy, *killx, *killy; 273short gx, gy, *killx, *killy;
274{ /* killable */ 274{ /* killable */
275#ifdef DEBUG 275#ifdef DEBUG
276 printf( "killable\n" ); 276 printf( "killable\n" );
277 showTrees = TRUE; 277 showTrees = TRUE;
278#endif 278#endif
279 dbStop = TRUE; 279 dbStop = TRUE;
280 him = bord[gx][gy]; /* find out who I am */ 280 him = bord[gx][gy]; /* find out who I am */
281 me = -him; 281 me = -him;
282/* if (me == 1) 282/* if (me == 1)
283 sChar = '>'; 283 sChar = '>';
284 else 284 else
285 sChar = '|'; */ 285 sChar = '|'; */
286/* write(sChar); */ 286/* write(sChar); */
287 depth = 1; 287 depth = 1;
288 topMark = playMark; 288 topMark = playMark;
289 sSpanGroup(gx, gy, &lList); /* find his liberties */ 289 sSpanGroup(gx, gy, &lList); /* find his liberties */
290 if (lList.indx == 1) 290 if (lList.indx == 1)
291 { 291 {
292 *killx = lList.p[1].px; 292 *killx = lList.p[1].px;
293 *killy = lList.p[1].py; 293 *killy = lList.p[1].py;
294 return TRUE; 294 return TRUE;
295 } 295 }
296 else if (lList.indx > treeLibLim) 296 else if (lList.indx > treeLibLim)
297 return FALSE; 297 return FALSE;
298 else if (adjInAtari) 298 else if (adjInAtari)
299 return FALSE; 299 return FALSE;
300 else if ((lList.indx > 2) && adj2Libs) 300 else if ((lList.indx > 2) && adj2Libs)
301 return FALSE; 301 return FALSE;
302 else 302 else
303 { 303 {
304 for (i = 1; i <= maxSPoint; i++) 304 for (i = 1; i <= maxSPoint; i++)
305 libList[i] = -1; 305 libList[i] = -1;
306 if (utilPlayLevel > 4) /* account for diagonal moves */ 306 if (utilPlayLevel > 4) /* account for diagonal moves */
307 { 307 {
308 listDiags(gx, gy, &dList); 308 listDiags(gx, gy, &dList);
309 j = 0; 309 j = 0;
310 i = lList.indx; 310 i = lList.indx;
311 while ((j < dList.indx) && 311 while ((j < dList.indx) &&
312 (i < maxSPoint)) 312 (i < maxSPoint))
313 { 313 {
314 j = j + 1; 314 j = j + 1;
315 i = i + 1; 315 i = i + 1;
316 libList[i] = 100; 316 libList[i] = 100;
317 lList.p[i].px = dList.p[j].px; 317 lList.p[i].px = dList.p[j].px;
318 lList.p[i].py = dList.p[j].py; 318 lList.p[i].py = dList.p[j].py;
319 } 319 }
320 lList.indx = i; 320 lList.indx = i;
321 } 321 }
322 if (lList.indx > 1) /* sort by increasing lib count */ 322 if (lList.indx > 1) /* sort by increasing lib count */
323 { 323 {
324 for (i = 1; i <= lList.indx; i++) 324 for (i = 1; i <= lList.indx; i++)
325 if (libList[i] != 100) /* diags go last */ 325 if (libList[i] != 100) /* diags go last */
326 { 326 {
327 mark2 = playMark; 327 mark2 = playMark;
328 tryPlay(lList.p[i].px, lList.p[i].py, me); 328 tryPlay(lList.p[i].px, lList.p[i].py, me);
329 libList[i] = gList[gMap[groupIDs[gx][gy]]].libC; 329 libList[i] = gList[gMap[groupIDs[gx][gy]]].libC;
330 undoTo(mark2); 330 undoTo(mark2);
331 } 331 }
332 for (i = 1; i <= lList.indx - 1; i++) 332 for (i = 1; i <= lList.indx - 1; i++)
333 for (j = i + 1; j <= lList.indx; j++) 333 for (j = i + 1; j <= lList.indx; j++)
334 if (libList[i] > libList[j]) 334 if (libList[i] > libList[j])
335 { 335 {
336 tl = libList[i]; 336 tl = libList[i];
337 libList[i] = libList[j]; 337 libList[i] = libList[j];
338 libList[j] = tl; 338 libList[j] = tl;
339 tp = lList.p[i]; 339 tp = lList.p[i];
340 lList.p[i] = lList.p[j]; 340 lList.p[i] = lList.p[j];
341 lList.p[j] = tp; 341 lList.p[j] = tp;
342 } 342 }
343 else if ((libList[i] == libList[j]) && 343 else if ((libList[i] == libList[j]) &&
344 (libList[i] == 1)) 344 (libList[i] == 1))
345 if (mtNbrs(lList.p[i].px, lList.p[i].py) < 345 if (mtNbrs(lList.p[i].px, lList.p[i].py) <
346 mtNbrs(lList.p[j].px, lList.p[j].py)) 346 mtNbrs(lList.p[j].px, lList.p[j].py))
347 { 347 {