diff -N -r -u -X .ignore gnugo-copy/engine/aftermath.c gnugo/engine/aftermath.c
|
old
|
new
|
|
| 2 | 2 | * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see * |
| 3 | 3 | * http://www.gnu.org/software/gnugo/ for more information. * |
| 4 | 4 | * * |
| 5 | | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006 * |
| | 5 | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * |
| 6 | 6 | * by the Free Software Foundation. * |
| 7 | 7 | * * |
| 8 | 8 | * This program is free software; you can redistribute it and/or * |
| … |
… |
|
| 501 | 501 | safety = INVINCIBLE; |
| 502 | 502 | |
| 503 | 503 | if (k < 4) { |
| 504 | | int apos = worm[pos2].origin; |
| | 504 | int apos = find_origin(pos2); |
| 505 | 505 | int count_lib = countlib(apos); |
| 506 | 506 | |
| 507 | 507 | if (!mx[apos]) { |
diff -N -r -u -X .ignore gnugo-copy/engine/combination.c gnugo/engine/combination.c
|
old
|
new
|
|
| 572 | 572 | */ |
| 573 | 573 | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 574 | 574 | if (board[pos] == other |
| 575 | | && worm[pos].origin == pos |
| 576 | | && worm[pos].liberties == 2 |
| | 575 | && find_origin(pos) == pos |
| | 576 | && countlib(pos) == 2 |
| 577 | 577 | && aa_status[pos] == ALIVE) { |
| 578 | 578 | int libs[2]; |
| 579 | 579 | findlib(pos, 2, libs); |
| … |
… |
|
| 587 | 587 | if (!owl_substantial(pos)) { |
| 588 | 588 | int pos2; |
| 589 | 589 | for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) |
| 590 | | if (ON_BOARD(pos2) && is_worm_origin(pos2, pos)) |
| | 590 | if (IS_STONE(board[pos2]) && is_worm_origin(pos2, pos)) |
| 591 | 591 | aa_status[pos2] = INSUBSTANTIAL; |
| 592 | 592 | } |
| 593 | 593 | } |
diff -N -r -u -X .ignore gnugo-copy/engine/dragon.c gnugo/engine/dragon.c
|
old
|
new
|
|
| 2 | 2 | * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see * |
| 3 | 3 | * http://www.gnu.org/software/gnugo/ for more information. * |
| 4 | 4 | * * |
| 5 | | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006 * |
| | 5 | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * |
| 6 | 6 | * by the Free Software Foundation. * |
| 7 | 7 | * * |
| 8 | 8 | * This program is free software; you can redistribute it and/or * |
| … |
… |
|
| 442 | 442 | if (ON_BOARD(str)) { |
| 443 | 443 | int food; |
| 444 | 444 | |
| 445 | | if (worm[str].origin != str |
| 446 | | || board[str] == EMPTY |
| | 445 | if (board[str] == EMPTY |
| | 446 | || find_origin(str) != str |
| 447 | 447 | || worm[str].lunch == NO_MOVE) |
| 448 | 448 | continue; |
| 449 | 449 | |
| … |
… |
|
| 571 | 571 | */ |
| 572 | 572 | |
| 573 | 573 | for (str = BOARDMIN; str < BOARDMAX; str++) |
| 574 | | if (ON_BOARD(str)) { |
| | 574 | if (IS_STONE(board[str])) { |
| 575 | 575 | if (is_worm_origin(str, str) |
| 576 | 576 | && worm[str].attack_codes[0] != 0 |
| 577 | 577 | && worm[str].defense_codes[0] != 0 |
diff -N -r -u -X .ignore gnugo-copy/engine/liberty.h gnugo/engine/liberty.h
|
old
|
new
|
|
| 797 | 797 | |
| 798 | 798 | #define MAX_TACTICAL_POINTS 10 |
| 799 | 799 | |
| | 800 | /* all this data is valid only, when stackp==0 */ |
| 800 | 801 | struct worm_data { |
| 801 | 802 | int color; /* its color */ |
| 802 | 803 | int size; /* its cardinality */ |
diff -N -r -u -X .ignore gnugo-copy/engine/move_reasons.c gnugo/engine/move_reasons.c
|
old
|
new
|
|
| 2 | 2 | * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see * |
| 3 | 3 | * http://www.gnu.org/software/gnugo/ for more information. * |
| 4 | 4 | * * |
| 5 | | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006 * |
| | 5 | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * |
| 6 | 6 | * by the Free Software Foundation. * |
| 7 | 7 | * * |
| 8 | 8 | * This program is free software; you can redistribute it and/or * |
| … |
… |
|
| 463 | 463 | int |
| 464 | 464 | attack_move_reason_known(int pos, int what) |
| 465 | 465 | { |
| 466 | | ASSERT1(IS_STONE(board[what]), what); |
| 467 | | what = worm[what].origin; |
| | 466 | if (what > 0) { |
| | 467 | ASSERT_ON_BOARD1(what); |
| | 468 | ASSERT1(IS_STONE(board[what]), what); |
| | 469 | ASSERT1(board[what] == worm[what].color, what); |
| | 470 | what = worm[what].origin; |
| | 471 | } |
| | 472 | |
| 468 | 473 | if (move_reason_known(pos, ATTACK_MOVE, what)) |
| 469 | 474 | return WIN; |
| 470 | 475 | if (move_reason_known(pos, ATTACK_MOVE_GOOD_KO, what)) |
| … |
… |
|
| 481 | 486 | int |
| 482 | 487 | defense_move_reason_known(int pos, int what) |
| 483 | 488 | { |
| 484 | | ASSERT1(IS_STONE(board[what]), what); |
| 485 | | what = worm[what].origin; |
| | 489 | if (what > 0) { |
| | 490 | ASSERT_ON_BOARD1(what); |
| | 491 | ASSERT1(IS_STONE(board[what]), what); |
| | 492 | ASSERT1(board[what] == worm[what].color, what); |
| | 493 | what = worm[what].origin; |
| | 494 | } |
| | 495 | |
| 486 | 496 | if (move_reason_known(pos, DEFEND_MOVE, what)) |
| 487 | 497 | return WIN; |
| 488 | 498 | if (move_reason_known(pos, DEFEND_MOVE_GOOD_KO, what)) |
| … |
… |
|
| 510 | 520 | int |
| 511 | 521 | owl_attack_move_reason_known(int pos, int what) |
| 512 | 522 | { |
| | 523 | if (what > 0) { |
| | 524 | ASSERT_ON_BOARD1(what); |
| | 525 | ASSERT1(IS_STONE(board[what]), what); |
| | 526 | ASSERT1(board[what] == dragon[what].color, what); |
| | 527 | what = dragon[what].origin; |
| | 528 | } |
| | 529 | |
| 513 | 530 | if (move_reason_known(pos, OWL_ATTACK_MOVE, what)) |
| 514 | 531 | return WIN; |
| 515 | 532 | if (move_reason_known(pos, OWL_ATTACK_MOVE_GOOD_KO, what)) |
| … |
… |
|
| 526 | 543 | int |
| 527 | 544 | owl_defense_move_reason_known(int pos, int what) |
| 528 | 545 | { |
| | 546 | if (what > 0) { |
| | 547 | ASSERT_ON_BOARD1(what); |
| | 548 | ASSERT1(IS_STONE(board[what]), what); |
| | 549 | ASSERT1(board[what] == dragon[what].color, what); |
| | 550 | what = dragon[what].origin; |
| | 551 | } |
| | 552 | |
| 529 | 553 | if (move_reason_known(pos, OWL_DEFEND_MOVE, what)) |
| 530 | 554 | return WIN; |
| 531 | 555 | if (move_reason_known(pos, OWL_DEFEND_MOVE_GOOD_KO, what)) |
| … |
… |
|
| 553 | 577 | static int |
| 554 | 578 | owl_move_vs_worm_known(int pos, int what) |
| 555 | 579 | { |
| 556 | | return owl_move_reason_known(pos, dragon[what].origin); |
| | 580 | return owl_move_reason_known(pos, what); |
| 557 | 581 | } |
| 558 | 582 | |
| 559 | 583 | int |
| 560 | 584 | semeai_move_reason_known(int pos, int what) |
| 561 | 585 | { |
| 562 | | return move_reason_known(pos, SEMEAI_MOVE, what); |
| | 586 | ASSERT_ON_BOARD1(what); |
| | 587 | ASSERT1(IS_STONE(board[what]), what); |
| | 588 | ASSERT1(board[what] == dragon[what].color, what); |
| | 589 | return move_reason_known(pos, SEMEAI_MOVE, dragon[what].origin); |
| 563 | 590 | } |
| 564 | 591 | |
| 565 | 592 | /* Check whether a worm is inessential */ |
| … |
… |
|
| 637 | 664 | add_attack_move(int pos, int ww, int code) |
| 638 | 665 | { |
| 639 | 666 | ASSERT_ON_BOARD1(ww); |
| | 667 | ASSERT1(IS_STONE(board[ww]), ww); |
| | 668 | ASSERT1(board[ww] == worm[ww].color, ww); |
| 640 | 669 | ww = worm[ww].origin; |
| 641 | 670 | |
| 642 | 671 | if (code == WIN) |
| … |
… |
|
| 655 | 684 | add_defense_move(int pos, int ww, int code) |
| 656 | 685 | { |
| 657 | 686 | ASSERT_ON_BOARD1(ww); |
| | 687 | ASSERT1(IS_STONE(board[ww]), ww); |
| | 688 | ASSERT1(board[ww] == worm[ww].color, ww); |
| 658 | 689 | ww = worm[ww].origin; |
| 659 | 690 | |
| 660 | 691 | if (code == WIN) |
| … |
… |
|
| 673 | 704 | add_attack_threat_move(int pos, int ww, int code) |
| 674 | 705 | { |
| 675 | 706 | UNUSED(code); |
| 676 | | |
| | 707 | |
| 677 | 708 | ASSERT_ON_BOARD1(ww); |
| | 709 | ASSERT1(IS_STONE(board[ww]), ww); |
| | 710 | ASSERT1(board[ww] == worm[ww].color, ww); |
| | 711 | |
| 678 | 712 | add_move_reason(pos, ATTACK_THREAT, worm[ww].origin); |
| 679 | 713 | } |
| 680 | 714 | |
| … |
… |
|
| 684 | 718 | remove_attack_threat_move(int pos, int ww) |
| 685 | 719 | { |
| 686 | 720 | ASSERT_ON_BOARD1(ww); |
| | 721 | ASSERT1(IS_STONE(board[ww]), ww); |
| | 722 | ASSERT1(board[ww] == worm[ww].color, ww); |
| | 723 | |
| 687 | 724 | remove_move_reason(pos, ATTACK_THREAT, worm[ww].origin); |
| 688 | 725 | } |
| 689 | 726 | |
| … |
… |
|
| 697 | 734 | UNUSED(code); |
| 698 | 735 | |
| 699 | 736 | ASSERT_ON_BOARD1(ww); |
| | 737 | ASSERT1(IS_STONE(board[ww]), ww); |
| | 738 | ASSERT1(board[ww] == worm[ww].color, ww); |
| | 739 | |
| 700 | 740 | add_move_reason(pos, DEFEND_THREAT, worm[ww].origin); |
| 701 | 741 | } |
| 702 | 742 | |
| … |
… |
|
| 787 | 827 | |
| 788 | 828 | /* |
| 789 | 829 | * Add to the reasons for the move at (pos) that it connects the |
| 790 | | * dragons at (dr1) and (dr2). Require that the dragons are |
| 791 | | * distinct. |
| | 830 | * worms at (w1) and (w2). |
| 792 | 831 | */ |
| 793 | 832 | void |
| 794 | 833 | add_connection_move(int pos, int w1, int w2) |
| … |
… |
|
| 796 | 835 | int connection; |
| 797 | 836 | |
| 798 | 837 | ASSERT_ON_BOARD1(w1); |
| | 838 | ASSERT1(IS_STONE(board[w1]), w1); |
| | 839 | ASSERT1(board[w1] == worm[w1].color, w1); |
| 799 | 840 | ASSERT_ON_BOARD1(w2); |
| | 841 | ASSERT1(IS_STONE(board[w2]), w2); |
| | 842 | ASSERT1(board[w2] == worm[w2].color, w2); |
| 800 | 843 | ASSERT1(worm[w1].color == worm[w2].color, w1); |
| 801 | 844 | if (worm[w1].origin == worm[w2].origin) |
| 802 | 845 | return; |
| … |
… |
|
| 807 | 850 | |
| 808 | 851 | /* |
| 809 | 852 | * Add to the reasons for the move at (pos) that it cuts the |
| 810 | | * dragons at (dr1) and (dr2). Require that the dragons are |
| 811 | | * distinct. |
| | 853 | * worms at (w1) and (w2). |
| 812 | 854 | */ |
| 813 | 855 | void |
| 814 | 856 | add_cut_move(int pos, int w1, int w2) |
| … |
… |
|
| 816 | 858 | int connection; |
| 817 | 859 | |
| 818 | 860 | ASSERT_ON_BOARD1(w1); |
| | 861 | ASSERT1(IS_STONE(board[w1]), w1); |
| | 862 | ASSERT1(board[w1] == worm[w1].color, w1); |
| 819 | 863 | ASSERT_ON_BOARD1(w2); |
| | 864 | ASSERT1(IS_STONE(board[w2]), w2); |
| | 865 | ASSERT1(board[w2] == worm[w2].color, w2); |
| 820 | 866 | ASSERT1(worm[w1].color == worm[w2].color, w1); |
| 821 | 867 | if (worm[w1].origin == worm[w2].origin) |
| 822 | 868 | return; |
| | 869 | |
| 823 | 870 | connection = find_connection(worm[w1].origin, worm[w2].origin); |
| 824 | 871 | |
| 825 | 872 | /* |
| … |
… |
|
| 857 | 904 | add_semeai_move(int pos, int dr) |
| 858 | 905 | { |
| 859 | 906 | ASSERT_ON_BOARD1(dr); |
| | 907 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 908 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 860 | 909 | add_move_reason(pos, SEMEAI_MOVE, dragon[dr].origin); |
| 861 | 910 | } |
| 862 | 911 | |
| … |
… |
|
| 867 | 916 | static void |
| 868 | 917 | add_potential_semeai_move(int pos, int type, int dr1, int dr2) |
| 869 | 918 | { |
| 870 | | ASSERT1(ON_BOARD(dr1), pos); |
| 871 | | ASSERT1(ON_BOARD(dr2), pos); |
| | 919 | ASSERT_ON_BOARD1(dr1); |
| | 920 | ASSERT1(IS_STONE(board[dr1]), dr1); |
| | 921 | ASSERT1(board[dr1] == dragon[dr1].color, dr1); |
| | 922 | ASSERT_ON_BOARD1(dr2); |
| | 923 | ASSERT1(IS_STONE(board[dr2]), dr2); |
| | 924 | ASSERT1(board[dr2] == dragon[dr2].color, dr2); |
| | 925 | |
| 872 | 926 | if (next_semeai >= MAX_POTENTIAL_SEMEAI) |
| 873 | 927 | DEBUG(DEBUG_MOVE_REASONS, |
| 874 | 928 | "Potential semeai move at %1m dropped as list was full\n", pos); |
| 875 | 929 | else { |
| 876 | | semeai_target1[next_semeai] = dr1; |
| 877 | | semeai_target2[next_semeai] = dr2; |
| | 930 | semeai_target1[next_semeai] = dragon[dr1].origin; |
| | 931 | semeai_target2[next_semeai] = dragon[dr2].origin; |
| 878 | 932 | add_move_reason(pos, type, next_semeai); |
| 879 | 933 | next_semeai++; |
| 880 | 934 | } |
| … |
… |
|
| 887 | 941 | void |
| 888 | 942 | add_potential_semeai_attack(int pos, int dr1, int dr2) |
| 889 | 943 | { |
| | 944 | ASSERT_ON_BOARD1(dr1); |
| | 945 | ASSERT1(IS_STONE(board[dr1]), dr1); |
| | 946 | ASSERT1(board[dr1] == dragon[dr1].color, dr1); |
| | 947 | ASSERT_ON_BOARD1(dr2); |
| | 948 | ASSERT1(IS_STONE(board[dr2]), dr2); |
| | 949 | ASSERT1(board[dr2] == dragon[dr2].color, dr2); |
| 890 | 950 | add_potential_semeai_move(pos, POTENTIAL_SEMEAI_ATTACK, dr1, dr2); |
| 891 | 951 | } |
| 892 | 952 | |
| … |
… |
|
| 897 | 957 | void |
| 898 | 958 | add_potential_semeai_defense(int pos, int dr1, int dr2) |
| 899 | 959 | { |
| | 960 | ASSERT_ON_BOARD1(dr1); |
| | 961 | ASSERT1(IS_STONE(board[dr1]), dr1); |
| | 962 | ASSERT1(board[dr1] == dragon[dr1].color, dr1); |
| | 963 | ASSERT_ON_BOARD1(dr2); |
| | 964 | ASSERT1(IS_STONE(board[dr2]), dr2); |
| | 965 | ASSERT1(board[dr2] == dragon[dr2].color, dr2); |
| 900 | 966 | add_potential_semeai_move(pos, POTENTIAL_SEMEAI_DEFENSE, dr1, dr2); |
| 901 | 967 | } |
| 902 | 968 | |
| … |
… |
|
| 911 | 977 | add_semeai_threat(int pos, int dr) |
| 912 | 978 | { |
| 913 | 979 | ASSERT_ON_BOARD1(dr); |
| | 980 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 981 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 914 | 982 | add_move_reason(pos, SEMEAI_THREAT, dragon[dr].origin); |
| 915 | 983 | } |
| 916 | 984 | |
| … |
… |
|
| 949 | 1017 | switch (reason1) { |
| 950 | 1018 | case ATTACK_STRING: |
| 951 | 1019 | { |
| | 1020 | ASSERT1(IS_STONE(board[target1]), target1); |
| | 1021 | ASSERT1(board[target1] == worm[target1].color, target1); |
| 952 | 1022 | what1 = worm[target1].origin; |
| 953 | 1023 | |
| 954 | 1024 | /* If this string is already attacked, and with no defense, then |
| … |
… |
|
| 966 | 1036 | switch (reason2) { |
| 967 | 1037 | case ATTACK_STRING: |
| 968 | 1038 | { |
| | 1039 | ASSERT1(IS_STONE(board[target2]), target2); |
| | 1040 | ASSERT1(board[target2] == worm[target2].color, target2); |
| 969 | 1041 | what2 = worm[target2].origin; |
| 970 | 1042 | |
| 971 | 1043 | /* If this string is already attacked, and with no defense, then |
| … |
… |
|
| 1019 | 1091 | |
| 1020 | 1092 | switch (reason1) { |
| 1021 | 1093 | case DEFEND_STRING: |
| | 1094 | ASSERT1(IS_STONE(board[target1]), target1); |
| | 1095 | ASSERT1(board[target1] == worm[target1].color, target1); |
| 1022 | 1096 | what1 = worm[target1].origin; |
| 1023 | 1097 | break; |
| 1024 | 1098 | |
| … |
… |
|
| 1028 | 1102 | |
| 1029 | 1103 | switch (reason2) { |
| 1030 | 1104 | case DEFEND_STRING: |
| | 1105 | ASSERT1(IS_STONE(board[target2]), target2); |
| | 1106 | ASSERT1(board[target2] == worm[target2].color, target2); |
| 1031 | 1107 | what2 = worm[target2].origin; |
| 1032 | 1108 | break; |
| 1033 | 1109 | |
| … |
… |
|
| 1043 | 1119 | void |
| 1044 | 1120 | add_loss_move(int pos, int target1, int target2) |
| 1045 | 1121 | { |
| 1046 | | int what1 = dragon[target1].origin; |
| 1047 | | int what2 = worm[target2].origin; |
| 1048 | | int index = find_pair_data(what1, what2); |
| 1049 | | ASSERT1(target2 != NO_MOVE, pos); |
| | 1122 | int index; |
| | 1123 | |
| | 1124 | ASSERT_ON_BOARD1(target1); |
| | 1125 | ASSERT1(IS_STONE(board[target1]), target1); |
| | 1126 | ASSERT1(board[target1] == dragon[target1].color, target1); |
| | 1127 | ASSERT_ON_BOARD1(target2); |
| | 1128 | ASSERT1(IS_STONE(board[target2]), target2); |
| | 1129 | ASSERT1(board[target2] == worm[target2].color, target2); |
| | 1130 | |
| | 1131 | index = find_pair_data(dragon[target1].origin, |
| | 1132 | worm[target2].origin); |
| 1050 | 1133 | add_move_reason(pos, OWL_DEFEND_MOVE_LOSS, index); |
| 1051 | 1134 | } |
| 1052 | 1135 | |
| … |
… |
|
| 1121 | 1204 | void |
| 1122 | 1205 | add_strategical_attack_move(int pos, int dr) |
| 1123 | 1206 | { |
| 1124 | | dr = dragon[dr].origin; |
| 1125 | 1207 | ASSERT_ON_BOARD1(dr); |
| 1126 | | add_move_reason(pos, STRATEGIC_ATTACK_MOVE, dr); |
| | 1208 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1209 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| | 1210 | add_move_reason(pos, STRATEGIC_ATTACK_MOVE, dragon[dr].origin); |
| 1127 | 1211 | } |
| 1128 | 1212 | |
| 1129 | 1213 | /* |
| … |
… |
|
| 1133 | 1217 | void |
| 1134 | 1218 | add_strategical_defense_move(int pos, int dr) |
| 1135 | 1219 | { |
| 1136 | | dr = dragon[dr].origin; |
| 1137 | 1220 | ASSERT_ON_BOARD1(dr); |
| 1138 | | add_move_reason(pos, STRATEGIC_DEFEND_MOVE, dr); |
| | 1221 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1222 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| | 1223 | add_move_reason(pos, STRATEGIC_DEFEND_MOVE, dragon[dr].origin); |
| 1139 | 1224 | } |
| 1140 | 1225 | |
| 1141 | 1226 | /* |
| … |
… |
|
| 1145 | 1230 | void |
| 1146 | 1231 | add_owl_attack_move(int pos, int dr, int kworm, int code) |
| 1147 | 1232 | { |
| | 1233 | ASSERT_ON_BOARD1(dr); |
| | 1234 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1235 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 1148 | 1236 | dr = dragon[dr].origin; |
| 1149 | 1237 | |
| 1150 | | ASSERT_ON_BOARD1(dr); |
| 1151 | 1238 | if (code == WIN) |
| 1152 | 1239 | add_move_reason(pos, OWL_ATTACK_MOVE, dr); |
| 1153 | 1240 | else if (code == KO_A) |
| … |
… |
|
| 1156 | 1243 | add_move_reason(pos, OWL_ATTACK_MOVE_BAD_KO, dr); |
| 1157 | 1244 | else if (code == GAIN) { |
| 1158 | 1245 | ASSERT_ON_BOARD1(kworm); |
| | 1246 | ASSERT1(IS_STONE(board[kworm]), kworm); |
| | 1247 | ASSERT1(board[kworm] == worm[kworm].color, kworm); |
| 1159 | 1248 | add_move_reason(pos, OWL_ATTACK_MOVE_GAIN, find_pair_data(dr, kworm)); |
| 1160 | 1249 | } |
| 1161 | 1250 | } |
| … |
… |
|
| 1167 | 1256 | void |
| 1168 | 1257 | add_owl_defense_move(int pos, int dr, int code) |
| 1169 | 1258 | { |
| | 1259 | ASSERT_ON_BOARD1(dr); |
| | 1260 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1261 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 1170 | 1262 | dr = dragon[dr].origin; |
| 1171 | 1263 | |
| 1172 | | ASSERT_ON_BOARD1(dr); |
| 1173 | 1264 | if (code == WIN) |
| 1174 | 1265 | add_move_reason(pos, OWL_DEFEND_MOVE, dr); |
| 1175 | 1266 | else if (code == KO_A) |
| … |
… |
|
| 1188 | 1279 | add_owl_attack_threat_move(int pos, int dr, int code) |
| 1189 | 1280 | { |
| 1190 | 1281 | UNUSED(code); |
| 1191 | | dr = dragon[dr].origin; |
| 1192 | | |
| 1193 | 1282 | ASSERT_ON_BOARD1(dr); |
| | 1283 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1284 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 1194 | 1285 | add_move_reason(pos, OWL_ATTACK_THREAT, dragon[dr].origin); |
| 1195 | 1286 | add_worthwhile_threat_move(pos); |
| 1196 | 1287 | } |
| … |
… |
|
| 1202 | 1293 | void |
| 1203 | 1294 | add_owl_uncertain_defense_move(int pos, int dr) |
| 1204 | 1295 | { |
| 1205 | | dr = dragon[dr].origin; |
| 1206 | 1296 | ASSERT_ON_BOARD1(dr); |
| | 1297 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1298 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 1207 | 1299 | add_move_reason(pos, UNCERTAIN_OWL_DEFENSE, dragon[dr].origin); |
| 1208 | 1300 | } |
| 1209 | 1301 | |
| … |
… |
|
| 1214 | 1306 | void |
| 1215 | 1307 | add_owl_uncertain_attack_move(int pos, int dr) |
| 1216 | 1308 | { |
| 1217 | | dr = dragon[dr].origin; |
| 1218 | 1309 | ASSERT_ON_BOARD1(dr); |
| | 1310 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1311 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 1219 | 1312 | add_move_reason(pos, UNCERTAIN_OWL_ATTACK, dragon[dr].origin); |
| 1220 | 1313 | } |
| 1221 | 1314 | |
| … |
… |
|
| 1229 | 1322 | add_owl_defense_threat_move(int pos, int dr, int code) |
| 1230 | 1323 | { |
| 1231 | 1324 | UNUSED(code); |
| 1232 | | dr = dragon[dr].origin; |
| 1233 | | |
| 1234 | 1325 | ASSERT_ON_BOARD1(dr); |
| | 1326 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1327 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 1235 | 1328 | add_move_reason(pos, OWL_DEFEND_THREAT, dragon[dr].origin); |
| 1236 | 1329 | add_worthwhile_threat_move(pos); |
| 1237 | 1330 | } |
| … |
… |
|
| 1269 | 1362 | add_owl_prevent_threat_move(int pos, int dr) |
| 1270 | 1363 | { |
| 1271 | 1364 | ASSERT_ON_BOARD1(dr); |
| | 1365 | ASSERT1(IS_STONE(board[dr]), dr); |
| | 1366 | ASSERT1(board[dr] == dragon[dr].color, dr); |
| 1272 | 1367 | add_move_reason(pos, OWL_PREVENT_THREAT, dragon[dr].origin); |
| 1273 | 1368 | } |
| 1274 | 1369 | |
| … |
… |
|
| 1418 | 1513 | * move is unsafe. |
| 1419 | 1514 | */ |
| 1420 | 1515 | if (move_reasons[r].type == DEFEND_MOVE) |
| 1421 | | mark_string(worm[what].origin, saved, 1); |
| | 1516 | mark_string(what, saved, 1); |
| 1422 | 1517 | else if (move_reasons[r].type == OWL_DEFEND_MOVE_LOSS) { |
| 1423 | 1518 | int origin = dragon[what].origin; |
| 1424 | 1519 | int kworm = worm[what].origin; |
| … |
… |
|
| 1426 | 1521 | for (ii = BOARDMIN; ii < BOARDMAX; ii++) |
| 1427 | 1522 | if (IS_STONE(board[ii]) && dragon[ii].origin == origin |
| 1428 | 1523 | && worm[ii].origin != kworm) |
| 1429 | | mark_string(worm[ii].origin, saved, 1); |
| | 1524 | mark_string(ii, saved, 1); |
| 1430 | 1525 | } |
| 1431 | 1526 | } |
| 1432 | 1527 | } |
| … |
… |
|
| 1990 | 2085 | int k; |
| 1991 | 2086 | ASSERT_ON_BOARD1(move); |
| 1992 | 2087 | ASSERT_ON_BOARD1(target); |
| 1993 | | ASSERT1(IS_STONE(worm[target].color), move); |
| | 2088 | ASSERT1(IS_STONE(board[target]), target); |
| | 2089 | ASSERT1(board[target] == worm[target].color, target); |
| 1994 | 2090 | |
| 1995 | 2091 | target = worm[target].origin; |
| 1996 | 2092 | for (k = 0; k < MAX_ATTACK_THREATS; k++) { |
| … |
… |
|
| 2011 | 2107 | int k; |
| 2012 | 2108 | ASSERT_ON_BOARD1(move); |
| 2013 | 2109 | ASSERT_ON_BOARD1(target); |
| 2014 | | ASSERT1(IS_STONE(worm[target].color), move); |
| | 2110 | ASSERT1(IS_STONE(board[target]), target); |
| | 2111 | ASSERT1(board[target] == worm[target].color, target); |
| 2015 | 2112 | |
| 2016 | 2113 | target = worm[target].origin; |
| 2017 | 2114 | for (k = 0; k < MAX_ATTACK_THREATS; k++) { |
diff -N -r -u -X .ignore gnugo-copy/engine/owl.c gnugo/engine/owl.c
|
old
|
new
|
|
| 454 | 454 | if (verbose > 0) |
| 455 | 455 | verbose--; |
| 456 | 456 | for (str = BOARDMIN; str < BOARDMAX; str++) |
| 457 | | if (ON_BOARD(str) && ms[str] && worm[str].origin == str) { |
| | 457 | if (ON_BOARD(str) && ms[str] && find_origin(str) == str) { |
| 458 | 458 | int adj; |
| 459 | 459 | int adjs[MAXCHAIN]; |
| 460 | 460 | int k; |
| … |
… |
|
| 1947 | 1947 | if (board[worm_goal] == EMPTY |
| 1948 | 1948 | || countlib(worm_goal) > 1) |
| 1949 | 1949 | continue; |
| 1950 | | if (worm[worm_goal].size > size) { |
| | 1950 | if (countstones(worm_goal) > size) { |
| 1951 | 1951 | saveworm = k; |
| 1952 | | size = worm[worm_goal].size; |
| | 1952 | size = countstones(worm_goal); |
| 1953 | 1953 | } |
| 1954 | 1954 | } |
| 1955 | 1955 | if (saveworm != MAX_GOAL_WORMS && size >= 3) { |
| 1956 | 1956 | acode = GAIN; |
| 1957 | | findlib(worm[owl_goal_worm[saveworm]].origin, 1, &mpos); |
| | 1957 | findlib(find_origin(owl_goal_worm[saveworm]), 1, &mpos); |
| 1958 | 1958 | /* ASSERT1( ... */ |
| 1959 | 1959 | } |
| 1960 | 1960 | } |
| … |
… |
|
| 4636 | 4636 | |
| 4637 | 4637 | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 4638 | 4638 | if (ON_BOARD(pos)) { |
| 4639 | | if (is_same_worm(pos, apos) || is_same_worm(pos, bpos)) |
| | 4639 | if (IS_STONE(board[pos]) |
| | 4640 | && (is_same_worm(pos, apos) || is_same_worm(pos, bpos))) |
| 4640 | 4641 | owl->goal[pos] = 1; |
| 4641 | 4642 | else |
| 4642 | 4643 | owl->goal[pos] = 0; |
| … |
… |
|
| 6916 | 6917 | continue; |
| 6917 | 6918 | |
| 6918 | 6919 | for (ii = BOARDMIN; ii < BOARDMAX && w < MAX_GOAL_WORMS; ii++) |
| 6919 | | if (ON_BOARD(ii) && board[ii] && worm[ii].origin == ii |
| 6920 | | && worm[ii].size >= 3 && dragon[ii].id == d) |
| | 6920 | if (IS_STONE(board[ii]) && find_origin(ii) == ii |
| | 6921 | && countstones(ii) >= 3 && dragon[ii].id == d) |
| 6921 | 6922 | goal_worm[w++] = ii; |
| 6922 | 6923 | } |
| 6923 | 6924 | } |
diff -N -r -u -X .ignore gnugo-copy/engine/utils.c gnugo/engine/utils.c
|
old
|
new
|
|
| 2 | 2 | * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see * |
| 3 | 3 | * http://www.gnu.org/software/gnugo/ for more information. * |
| 4 | 4 | * * |
| 5 | | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006 * |
| | 5 | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * |
| 6 | 6 | * by the Free Software Foundation. * |
| 7 | 7 | * * |
| 8 | 8 | * This program is free software; you can redistribute it and/or * |
| … |
… |
|
| 1075 | 1075 | */ |
| 1076 | 1076 | if (board[bpos] != color) |
| 1077 | 1077 | continue; |
| 1078 | | if (liberties <= worm[bpos].liberties |
| | 1078 | if (liberties <= countlib(bpos) |
| 1079 | 1079 | && liberties <= 4) |
| 1080 | 1080 | trouble = 1; |
| 1081 | 1081 | else |
| … |
… |
|
| 1139 | 1139 | *return_value += 2.0 * worm[kworm].effective_size; |
| 1140 | 1140 | if (safe_stones) |
| 1141 | 1141 | for (ii = BOARDMIN; ii < BOARDMAX; ii++) |
| 1142 | | if (ON_BOARD(ii) && worm[ii].origin == worm[kworm].origin) |
| | 1142 | if (IS_STONE(board[ii]) && is_same_worm(ii, kworm)) |
| 1143 | 1143 | safe_stones[ii] = 0; |
| 1144 | 1144 | } |
| 1145 | 1145 | } |
| … |
… |
|
| 1148 | 1148 | *return_value += 2.0 * worm[kworm].effective_size; |
| 1149 | 1149 | if (safe_stones) |
| 1150 | 1150 | for (ii = BOARDMIN; ii < BOARDMAX; ii++) |
| 1151 | | if (ON_BOARD(ii) && worm[ii].origin == worm[kworm].origin) |
| | 1151 | if (IS_STONE(board[ii]) && is_same_worm(ii, kworm)) |
| 1152 | 1152 | safe_stones[ii] = 0; |
| 1153 | 1153 | } |
| 1154 | 1154 | } |
| … |
… |
|
| 1182 | 1182 | |
| 1183 | 1183 | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 1184 | 1184 | if (!IS_STONE(board[pos]) |
| 1185 | | || worm[pos].origin != pos |
| | 1185 | || find_origin(pos) != pos |
| 1186 | 1186 | || pos == move) |
| 1187 | 1187 | continue; |
| 1188 | 1188 | |
| … |
… |
|
| 1217 | 1217 | *return_value += worm[pos].effective_size; |
| 1218 | 1218 | if (safe_stones) /* Can't use mark_string. */ |
| 1219 | 1219 | for (ii = BOARDMIN; ii < BOARDMAX; ii++) |
| 1220 | | if (worm[ii].origin == worm[pos].origin) |
| | 1220 | if (IS_STONE(board[ii]) && is_same_worm(ii, pos)) |
| 1221 | 1221 | safe_stones[ii] = 0; |
| 1222 | 1222 | } |
| 1223 | 1223 | else if (board[pos] == other |
| 1224 | | && worm[pos].origin == pos |
| | 1224 | && find_origin(pos) == pos |
| 1225 | 1225 | && worm[pos].attack_codes[0] != 0 |
| 1226 | 1226 | && worm[pos].defense_codes[0] == 0 |
| 1227 | 1227 | && find_defense(pos, NULL)) { |
diff -N -r -u -X .ignore gnugo-copy/engine/value_moves.c gnugo/engine/value_moves.c