Ticket #162: worm_data.diff

File worm_data.diff, 27.3 kB (added by draqo, 20 months ago)
  • engine/aftermath.c

    diff -N -r -u -X .ignore gnugo-copy/engine/aftermath.c gnugo/engine/aftermath.c
    old new  
    22 * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       * 
    33 * http://www.gnu.org/software/gnugo/ for more information.          * 
    44 *                                                                   * 
    5  * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006      * 
     5 * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * 
    66 * by the Free Software Foundation.                                  * 
    77 *                                                                   * 
    88 * This program is free software; you can redistribute it and/or     * 
     
    501501          safety = INVINCIBLE; 
    502502         
    503503        if (k < 4) { 
    504           int apos = worm[pos2].origin; 
     504          int apos = find_origin(pos2); 
    505505          int count_lib = countlib(apos); 
    506506           
    507507          if (!mx[apos]) { 
  • engine/combination.c

    diff -N -r -u -X .ignore gnugo-copy/engine/combination.c gnugo/engine/combination.c
    old new  
    572572   */ 
    573573  for (pos = BOARDMIN; pos < BOARDMAX; pos++) { 
    574574    if (board[pos] == other 
    575         && worm[pos].origin == pos 
    576         && worm[pos].liberties == 2 
     575        && find_origin(pos) == pos 
     576        && countlib(pos) == 2 
    577577        && aa_status[pos] == ALIVE) { 
    578578      int libs[2]; 
    579579      findlib(pos, 2, libs); 
     
    587587      if (!owl_substantial(pos)) { 
    588588        int pos2; 
    589589        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)) 
    591591            aa_status[pos2] = INSUBSTANTIAL; 
    592592      } 
    593593    } 
  • engine/dragon.c

    diff -N -r -u -X .ignore gnugo-copy/engine/dragon.c gnugo/engine/dragon.c
    old new  
    22 * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       * 
    33 * http://www.gnu.org/software/gnugo/ for more information.          * 
    44 *                                                                   * 
    5  * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006      * 
     5 * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * 
    66 * by the Free Software Foundation.                                  * 
    77 *                                                                   * 
    88 * This program is free software; you can redistribute it and/or     * 
     
    442442    if (ON_BOARD(str)) { 
    443443      int food; 
    444444 
    445       if (worm[str].origin != str 
    446           || board[str] == EMPTY 
     445      if (board[str] == EMPTY 
     446          || find_origin(str) != str 
    447447          || worm[str].lunch == NO_MOVE) 
    448448        continue; 
    449449 
     
    571571   */ 
    572572 
    573573  for (str = BOARDMIN; str < BOARDMAX; str++) 
    574     if (ON_BOARD(str)) { 
     574    if (IS_STONE(board[str])) { 
    575575      if (is_worm_origin(str, str) 
    576576          && worm[str].attack_codes[0] != 0 
    577577          && worm[str].defense_codes[0] != 0 
  • engine/liberty.h

    diff -N -r -u -X .ignore gnugo-copy/engine/liberty.h gnugo/engine/liberty.h
    old new  
    797797 
    798798#define MAX_TACTICAL_POINTS 10 
    799799 
     800/* all this data is valid only, when stackp==0 */ 
    800801struct worm_data { 
    801802  int color;         /* its color */ 
    802803  int size;          /* its cardinality */ 
  • engine/move_reasons.c

    diff -N -r -u -X .ignore gnugo-copy/engine/move_reasons.c gnugo/engine/move_reasons.c
    old new  
    22 * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       * 
    33 * http://www.gnu.org/software/gnugo/ for more information.          * 
    44 *                                                                   * 
    5  * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006      * 
     5 * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * 
    66 * by the Free Software Foundation.                                  * 
    77 *                                                                   * 
    88 * This program is free software; you can redistribute it and/or     * 
     
    463463int 
    464464attack_move_reason_known(int pos, int what) 
    465465{ 
    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 
    468473  if (move_reason_known(pos, ATTACK_MOVE, what)) 
    469474    return WIN; 
    470475  if (move_reason_known(pos, ATTACK_MOVE_GOOD_KO, what)) 
     
    481486int 
    482487defense_move_reason_known(int pos, int what) 
    483488{ 
    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 
    486496  if (move_reason_known(pos, DEFEND_MOVE, what)) 
    487497    return WIN; 
    488498  if (move_reason_known(pos, DEFEND_MOVE_GOOD_KO, what)) 
     
    510520int 
    511521owl_attack_move_reason_known(int pos, int what) 
    512522{ 
     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 
    513530  if (move_reason_known(pos, OWL_ATTACK_MOVE, what)) 
    514531    return WIN; 
    515532  if (move_reason_known(pos, OWL_ATTACK_MOVE_GOOD_KO, what)) 
     
    526543int 
    527544owl_defense_move_reason_known(int pos, int what) 
    528545{ 
     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 
    529553  if (move_reason_known(pos, OWL_DEFEND_MOVE, what)) 
    530554    return WIN; 
    531555  if (move_reason_known(pos, OWL_DEFEND_MOVE_GOOD_KO, what)) 
     
    553577static int 
    554578owl_move_vs_worm_known(int pos, int what) 
    555579{ 
    556   return owl_move_reason_known(pos, dragon[what].origin); 
     580  return owl_move_reason_known(pos, what); 
    557581} 
    558582 
    559583int 
    560584semeai_move_reason_known(int pos, int what) 
    561585{ 
    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); 
    563590} 
    564591 
    565592/* Check whether a worm is inessential */ 
     
    637664add_attack_move(int pos, int ww, int code) 
    638665{ 
    639666  ASSERT_ON_BOARD1(ww); 
     667  ASSERT1(IS_STONE(board[ww]), ww); 
     668  ASSERT1(board[ww] == worm[ww].color, ww); 
    640669  ww = worm[ww].origin; 
    641670 
    642671  if (code == WIN) 
     
    655684add_defense_move(int pos, int ww, int code) 
    656685{ 
    657686  ASSERT_ON_BOARD1(ww); 
     687  ASSERT1(IS_STONE(board[ww]), ww); 
     688  ASSERT1(board[ww] == worm[ww].color, ww); 
    658689  ww = worm[ww].origin; 
    659690 
    660691  if (code == WIN) 
     
    673704add_attack_threat_move(int pos, int ww, int code) 
    674705{ 
    675706  UNUSED(code); 
    676    
     707 
    677708  ASSERT_ON_BOARD1(ww); 
     709  ASSERT1(IS_STONE(board[ww]), ww); 
     710  ASSERT1(board[ww] == worm[ww].color, ww); 
     711   
    678712  add_move_reason(pos, ATTACK_THREAT, worm[ww].origin); 
    679713} 
    680714 
     
    684718remove_attack_threat_move(int pos, int ww) 
    685719{ 
    686720  ASSERT_ON_BOARD1(ww); 
     721  ASSERT1(IS_STONE(board[ww]), ww); 
     722  ASSERT1(board[ww] == worm[ww].color, ww); 
     723 
    687724  remove_move_reason(pos, ATTACK_THREAT, worm[ww].origin); 
    688725} 
    689726 
     
    697734  UNUSED(code); 
    698735 
    699736  ASSERT_ON_BOARD1(ww); 
     737  ASSERT1(IS_STONE(board[ww]), ww); 
     738  ASSERT1(board[ww] == worm[ww].color, ww); 
     739 
    700740  add_move_reason(pos, DEFEND_THREAT, worm[ww].origin); 
    701741} 
    702742 
     
    787827 
    788828/* 
    789829 * 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). 
    792831 */ 
    793832void 
    794833add_connection_move(int pos, int w1, int w2) 
     
    796835  int connection; 
    797836 
    798837  ASSERT_ON_BOARD1(w1); 
     838  ASSERT1(IS_STONE(board[w1]), w1); 
     839  ASSERT1(board[w1] == worm[w1].color, w1); 
    799840  ASSERT_ON_BOARD1(w2); 
     841  ASSERT1(IS_STONE(board[w2]), w2); 
     842  ASSERT1(board[w2] == worm[w2].color, w2); 
    800843  ASSERT1(worm[w1].color == worm[w2].color, w1); 
    801844  if (worm[w1].origin == worm[w2].origin) 
    802845    return; 
     
    807850 
    808851/* 
    809852 * 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). 
    812854 */ 
    813855void 
    814856add_cut_move(int pos, int w1, int w2) 
     
    816858  int connection; 
    817859 
    818860  ASSERT_ON_BOARD1(w1); 
     861  ASSERT1(IS_STONE(board[w1]), w1); 
     862  ASSERT1(board[w1] == worm[w1].color, w1); 
    819863  ASSERT_ON_BOARD1(w2); 
     864  ASSERT1(IS_STONE(board[w2]), w2); 
     865  ASSERT1(board[w2] == worm[w2].color, w2); 
    820866  ASSERT1(worm[w1].color == worm[w2].color, w1); 
    821867  if (worm[w1].origin == worm[w2].origin) 
    822868    return; 
     869   
    823870  connection = find_connection(worm[w1].origin, worm[w2].origin); 
    824871   
    825872  /* 
     
    857904add_semeai_move(int pos, int dr) 
    858905{ 
    859906  ASSERT_ON_BOARD1(dr); 
     907  ASSERT1(IS_STONE(board[dr]), dr); 
     908  ASSERT1(board[dr] == dragon[dr].color, dr); 
    860909  add_move_reason(pos, SEMEAI_MOVE, dragon[dr].origin); 
    861910} 
    862911 
     
    867916static void 
    868917add_potential_semeai_move(int pos, int type, int dr1, int dr2) 
    869918{ 
    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 
    872926  if (next_semeai >= MAX_POTENTIAL_SEMEAI) 
    873927    DEBUG(DEBUG_MOVE_REASONS, 
    874928          "Potential semeai move at %1m dropped as list was full\n", pos); 
    875929  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; 
    878932    add_move_reason(pos, type, next_semeai); 
    879933    next_semeai++; 
    880934  } 
     
    887941void 
    888942add_potential_semeai_attack(int pos, int dr1, int dr2) 
    889943{ 
     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); 
    890950  add_potential_semeai_move(pos, POTENTIAL_SEMEAI_ATTACK, dr1, dr2); 
    891951} 
    892952 
     
    897957void 
    898958add_potential_semeai_defense(int pos, int dr1, int dr2) 
    899959{ 
     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); 
    900966  add_potential_semeai_move(pos, POTENTIAL_SEMEAI_DEFENSE, dr1, dr2); 
    901967} 
    902968 
     
    911977add_semeai_threat(int pos, int dr) 
    912978{ 
    913979  ASSERT_ON_BOARD1(dr); 
     980  ASSERT1(IS_STONE(board[dr]), dr); 
     981  ASSERT1(board[dr] == dragon[dr].color, dr); 
    914982  add_move_reason(pos, SEMEAI_THREAT, dragon[dr].origin); 
    915983} 
    916984 
     
    9491017  switch (reason1) { 
    9501018  case ATTACK_STRING: 
    9511019    { 
     1020      ASSERT1(IS_STONE(board[target1]), target1); 
     1021      ASSERT1(board[target1] == worm[target1].color, target1); 
    9521022      what1 = worm[target1].origin; 
    9531023 
    9541024      /* If this string is already attacked, and with no defense, then 
     
    9661036  switch (reason2) { 
    9671037  case ATTACK_STRING: 
    9681038    { 
     1039      ASSERT1(IS_STONE(board[target2]), target2); 
     1040      ASSERT1(board[target2] == worm[target2].color, target2); 
    9691041      what2 = worm[target2].origin; 
    9701042 
    9711043      /* If this string is already attacked, and with no defense, then 
     
    10191091 
    10201092  switch (reason1) { 
    10211093  case DEFEND_STRING: 
     1094    ASSERT1(IS_STONE(board[target1]), target1); 
     1095    ASSERT1(board[target1] == worm[target1].color, target1); 
    10221096    what1 = worm[target1].origin; 
    10231097    break; 
    10241098 
     
    10281102 
    10291103  switch (reason2) { 
    10301104  case DEFEND_STRING: 
     1105    ASSERT1(IS_STONE(board[target2]), target2); 
     1106    ASSERT1(board[target2] == worm[target2].color, target2); 
    10311107    what2 = worm[target2].origin; 
    10321108    break; 
    10331109 
     
    10431119void 
    10441120add_loss_move(int pos, int target1, int target2) 
    10451121{ 
    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); 
    10501133  add_move_reason(pos, OWL_DEFEND_MOVE_LOSS, index); 
    10511134} 
    10521135 
     
    11211204void 
    11221205add_strategical_attack_move(int pos, int dr) 
    11231206{ 
    1124   dr = dragon[dr].origin; 
    11251207  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); 
    11271211} 
    11281212 
    11291213/* 
     
    11331217void 
    11341218add_strategical_defense_move(int pos, int dr) 
    11351219{ 
    1136   dr = dragon[dr].origin; 
    11371220  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); 
    11391224} 
    11401225 
    11411226/* 
     
    11451230void 
    11461231add_owl_attack_move(int pos, int dr, int kworm, int code) 
    11471232{ 
     1233  ASSERT_ON_BOARD1(dr); 
     1234  ASSERT1(IS_STONE(board[dr]), dr); 
     1235  ASSERT1(board[dr] == dragon[dr].color, dr); 
    11481236  dr = dragon[dr].origin; 
    11491237 
    1150   ASSERT_ON_BOARD1(dr); 
    11511238  if (code == WIN) 
    11521239    add_move_reason(pos, OWL_ATTACK_MOVE, dr); 
    11531240  else if (code == KO_A) 
     
    11561243    add_move_reason(pos, OWL_ATTACK_MOVE_BAD_KO, dr); 
    11571244  else if (code == GAIN) { 
    11581245    ASSERT_ON_BOARD1(kworm); 
     1246    ASSERT1(IS_STONE(board[kworm]), kworm); 
     1247    ASSERT1(board[kworm] == worm[kworm].color, kworm); 
    11591248    add_move_reason(pos, OWL_ATTACK_MOVE_GAIN, find_pair_data(dr, kworm)); 
    11601249  } 
    11611250} 
     
    11671256void 
    11681257add_owl_defense_move(int pos, int dr, int code) 
    11691258{ 
     1259  ASSERT_ON_BOARD1(dr); 
     1260  ASSERT1(IS_STONE(board[dr]), dr); 
     1261  ASSERT1(board[dr] == dragon[dr].color, dr); 
    11701262  dr = dragon[dr].origin; 
    11711263 
    1172   ASSERT_ON_BOARD1(dr); 
    11731264  if (code == WIN) 
    11741265    add_move_reason(pos, OWL_DEFEND_MOVE, dr); 
    11751266  else if (code == KO_A) 
     
    11881279add_owl_attack_threat_move(int pos, int dr, int code) 
    11891280{ 
    11901281  UNUSED(code); 
    1191   dr = dragon[dr].origin; 
    1192    
    11931282  ASSERT_ON_BOARD1(dr); 
     1283  ASSERT1(IS_STONE(board[dr]), dr); 
     1284  ASSERT1(board[dr] == dragon[dr].color, dr); 
    11941285  add_move_reason(pos, OWL_ATTACK_THREAT, dragon[dr].origin); 
    11951286  add_worthwhile_threat_move(pos); 
    11961287} 
     
    12021293void 
    12031294add_owl_uncertain_defense_move(int pos, int dr) 
    12041295{ 
    1205   dr = dragon[dr].origin; 
    12061296  ASSERT_ON_BOARD1(dr); 
     1297  ASSERT1(IS_STONE(board[dr]), dr); 
     1298  ASSERT1(board[dr] == dragon[dr].color, dr); 
    12071299  add_move_reason(pos, UNCERTAIN_OWL_DEFENSE, dragon[dr].origin); 
    12081300} 
    12091301 
     
    12141306void 
    12151307add_owl_uncertain_attack_move(int pos, int dr) 
    12161308{ 
    1217   dr = dragon[dr].origin; 
    12181309  ASSERT_ON_BOARD1(dr); 
     1310  ASSERT1(IS_STONE(board[dr]), dr); 
     1311  ASSERT1(board[dr] == dragon[dr].color, dr); 
    12191312  add_move_reason(pos, UNCERTAIN_OWL_ATTACK, dragon[dr].origin); 
    12201313} 
    12211314 
     
    12291322add_owl_defense_threat_move(int pos, int dr, int code) 
    12301323{ 
    12311324  UNUSED(code); 
    1232   dr = dragon[dr].origin; 
    1233  
    12341325  ASSERT_ON_BOARD1(dr); 
     1326  ASSERT1(IS_STONE(board[dr]), dr); 
     1327  ASSERT1(board[dr] == dragon[dr].color, dr); 
    12351328  add_move_reason(pos, OWL_DEFEND_THREAT, dragon[dr].origin); 
    12361329  add_worthwhile_threat_move(pos); 
    12371330} 
     
    12691362add_owl_prevent_threat_move(int pos, int dr) 
    12701363{ 
    12711364  ASSERT_ON_BOARD1(dr); 
     1365  ASSERT1(IS_STONE(board[dr]), dr); 
     1366  ASSERT1(board[dr] == dragon[dr].color, dr); 
    12721367  add_move_reason(pos, OWL_PREVENT_THREAT, dragon[dr].origin); 
    12731368} 
    12741369 
     
    14181513     * move is unsafe. 
    14191514     */ 
    14201515    if (move_reasons[r].type == DEFEND_MOVE) 
    1421       mark_string(worm[what].origin, saved, 1); 
     1516      mark_string(what, saved, 1); 
    14221517    else if (move_reasons[r].type == OWL_DEFEND_MOVE_LOSS) { 
    14231518      int origin = dragon[what].origin; 
    14241519      int kworm = worm[what].origin; 
     
    14261521      for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    14271522        if (IS_STONE(board[ii]) && dragon[ii].origin == origin 
    14281523            && worm[ii].origin != kworm) 
    1429           mark_string(worm[ii].origin, saved, 1); 
     1524          mark_string(ii, saved, 1); 
    14301525    } 
    14311526  }     
    14321527} 
     
    19902085  int k; 
    19912086  ASSERT_ON_BOARD1(move); 
    19922087  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); 
    19942090 
    19952091  target = worm[target].origin; 
    19962092  for (k = 0; k < MAX_ATTACK_THREATS; k++) { 
     
    20112107  int k; 
    20122108  ASSERT_ON_BOARD1(move); 
    20132109  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); 
    20152112 
    20162113  target = worm[target].origin; 
    20172114  for (k = 0; k < MAX_ATTACK_THREATS; k++) { 
  • engine/owl.c

    diff -N -r -u -X .ignore gnugo-copy/engine/owl.c gnugo/engine/owl.c
    old new  
    454454  if (verbose > 0) 
    455455    verbose--; 
    456456  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) { 
    458458      int adj; 
    459459      int adjs[MAXCHAIN]; 
    460460      int k; 
     
    19471947        if (board[worm_goal] == EMPTY 
    19481948            || countlib(worm_goal) > 1) 
    19491949          continue; 
    1950         if (worm[worm_goal].size > size) { 
     1950        if (countstones(worm_goal) > size) { 
    19511951          saveworm = k; 
    1952           size = worm[worm_goal].size; 
     1952          size = countstones(worm_goal); 
    19531953        } 
    19541954      } 
    19551955      if (saveworm != MAX_GOAL_WORMS && size >= 3) { 
    19561956        acode = GAIN; 
    1957         findlib(worm[owl_goal_worm[saveworm]].origin, 1, &mpos); 
     1957        findlib(find_origin(owl_goal_worm[saveworm]), 1, &mpos); 
    19581958        /* ASSERT1( ... */ 
    19591959      } 
    19601960    } 
     
    46364636 
    46374637  for (pos = BOARDMIN; pos < BOARDMAX; pos++) 
    46384638    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))) 
    46404641        owl->goal[pos] = 1; 
    46414642      else 
    46424643        owl->goal[pos] = 0; 
     
    69166917        continue; 
    69176918 
    69186919      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) 
    69216922          goal_worm[w++] = ii; 
    69226923    } 
    69236924  } 
  • engine/utils.c

    diff -N -r -u -X .ignore gnugo-copy/engine/utils.c gnugo/engine/utils.c
    old new  
    22 * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       * 
    33 * http://www.gnu.org/software/gnugo/ for more information.          * 
    44 *                                                                   * 
    5  * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006      * 
     5 * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 * 
    66 * by the Free Software Foundation.                                  * 
    77 *                                                                   * 
    88 * This program is free software; you can redistribute it and/or     * 
     
    10751075     */ 
    10761076    if (board[bpos] != color) 
    10771077      continue; 
    1078     if (liberties <= worm[bpos].liberties 
     1078    if (liberties <= countlib(bpos) 
    10791079        && liberties <= 4) 
    10801080      trouble = 1; 
    10811081    else 
     
    11391139              *return_value += 2.0 * worm[kworm].effective_size; 
    11401140              if (safe_stones) 
    11411141                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)) 
    11431143                    safe_stones[ii] = 0; 
    11441144            } 
    11451145          } 
     
    11481148          *return_value += 2.0 * worm[kworm].effective_size; 
    11491149          if (safe_stones) 
    11501150            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)) 
    11521152                safe_stones[ii] = 0; 
    11531153        } 
    11541154      } 
     
    11821182   
    11831183  for (pos = BOARDMIN; pos < BOARDMAX; pos++) { 
    11841184    if (!IS_STONE(board[pos]) 
    1185         || worm[pos].origin != pos 
     1185        || find_origin(pos) != pos 
    11861186        || pos == move) 
    11871187      continue; 
    11881188     
     
    12171217      *return_value += worm[pos].effective_size; 
    12181218      if (safe_stones) /* Can't use mark_string. */ 
    12191219        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)) 
    12211221            safe_stones[ii] = 0; 
    12221222    } 
    12231223    else if (board[pos] == other 
    1224              && worm[pos].origin == pos 
     1224             && find_origin(pos) == pos 
    12251225             && worm[pos].attack_codes[0] != 0 
    12261226             && worm[pos].defense_codes[0] == 0 
    12271227             && find_defense(pos, NULL)) { 
  • engine/value_moves.c

    diff -N -r -u -X .ignore gnugo-copy/engine/value_moves.c gnugo/engine/value_moves.c