Complete.Org: Mailing Lists: Archives: freeciv-dev: August 2004:
[Freeciv-Dev] (PR#9882) Continent and Ocean numbers
Home

[Freeciv-Dev] (PR#9882) Continent and Ocean numbers

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: undisclosed-recipients: ;
Subject: [Freeciv-Dev] (PR#9882) Continent and Ocean numbers
From: "Mateusz Stefek" <mstefek@xxxxxxxxx>
Date: Tue, 31 Aug 2004 04:07:46 -0700
Reply-to: rt@xxxxxxxxxxx

<URL: http://rt.freeciv.org/Ticket/Display.html?id=9882 >

Ok this is the first version of the patch.
It also fixes a bug in ai_eval_thread_sea() similar to 9877.
--
mateusz
P.S. There are many places in AI code where AI assumes that a city is on
a land.
? core.8319
? server/civgame-1500.sav.gz
? server/civgame-2000.sav.gz
? server/civgame-2500.sav.gz
? server/civgame-3000.sav.gz
? server/civgame-3500.sav.gz
Index: ai/advdomestic.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/advdomestic.c,v
retrieving revision 1.117
diff -u -r1.117 advdomestic.c
--- ai/advdomestic.c    29 Aug 2004 19:43:37 -0000      1.117
+++ ai/advdomestic.c    31 Aug 2004 10:58:59 -0000
@@ -63,7 +63,7 @@
     return 40;
   }
 
-  continent = map_get_continent(pcity->x, pcity->y);
+  continent = map_get_continent_number(pcity->x, pcity->y);
   vulnerable = ai->threats.continent[continent]
                || city_got_building(pcity, B_PALACE)
                || (ai->threats.invasions
@@ -84,9 +84,20 @@
     return 40;
   }
 
-  /* trump coinage, and wall, and sam */
-  return ai->threats.ocean[map_get_continent(pcity->x, pcity->y)] 
+  if (is_ocean(map_get_terrain(pcity->x, pcity->y))) {
+    return ai->threats.ocean[map_get_ocean_number(pcity->x, pcity->y)] 
          ? TRADE_WEIGHTING + 3 : 1;
+  } else {
+    adjc_iterate(pcity->x, pcity->y, x2, y2) {
+      if (is_ocean(map_get_terrain(x2, y2))) {
+       Continent_id ocean_number = map_get_ocean_number(x2, y2);
+        if (ai->threats.ocean[ocean_number]) {
+         return TRADE_WEIGHTING + 3;
+       }
+      }
+    } adjc_iterate_end;
+  }
+  return 1;
 }
 
 /**************************************************************************
@@ -103,7 +114,7 @@
     return 50;
   }
 
-  continent = map_get_continent(pcity->x, pcity->y);
+  continent = map_get_continent_number(pcity->x, pcity->y);
   vulnerable = ai->threats.air
                && (ai->threats.continent[continent]
                    || is_water_adjacent_to_tile(pcity->x, pcity->y) 
@@ -134,7 +145,7 @@
   /* No non-allied player has nuclear capability yet. */
   if (ai->threats.nuclear == 0) { return 0; }
 
-  continent = map_get_continent(pcity->x, pcity->y);
+  continent = map_get_continent_number(pcity->x, pcity->y);
   if (ai->threats.continent[continent]
       || is_water_adjacent_to_tile(pcity->x, pcity->y)
       || city_got_building(pcity, B_PALACE)) {
@@ -154,7 +165,7 @@
 static int ai_eval_threat_missile(struct player *pplayer, struct city *pcity)
 {
   struct ai_data *ai = ai_data_get(pplayer);
-  Continent_id continent = map_get_continent(pcity->x, pcity->y);
+  Continent_id continent = map_get_continent_number(pcity->x, pcity->y);
   bool vulnerable = is_water_adjacent_to_tile(pcity->x, pcity->y)
                     || ai->threats.continent[continent]
                     || city_got_building(pcity, B_PALACE);
@@ -913,9 +924,7 @@
                                  struct ai_choice *choice)
 {
   struct player *pplayer = city_owner(pcity);
-  /* Continent where the city is --- we won't be aiding any wonder 
-   * construction on another continent */
-  Continent_id continent = map_get_continent(pcity->x, pcity->y);
+
   /* Total count of caravans available or already being built 
    * on this continent */
   int caravans = 0;
@@ -930,7 +939,7 @@
   /* Count existing caravans */
   unit_list_iterate(pplayer->units, punit) {
     if (unit_flag(punit, F_HELP_WONDER)
-        && map_get_continent(punit->x, punit->y) == continent)
+        && map_is_same_continent(punit->x, punit->y, pcity->x, pcity->y))
       caravans++;
   } unit_list_iterate_end;
 
@@ -940,7 +949,7 @@
         && unit_type_flag(acity->currently_building, F_HELP_WONDER)
         && (acity->shield_stock
            >= unit_build_shield_cost(acity->currently_building))
-        && map_get_continent(acity->x, acity->y) == continent) {
+        && map_is_same_continent(acity->x, acity->y, pcity->x, pcity->y)) {
       caravans++;
     }
   } city_list_iterate_end;
@@ -962,7 +971,7 @@
      * to finish the wonder. */
     if (!acity->is_building_unit
         && is_wonder(acity->currently_building)
-        && map_get_continent(acity->x, acity->y) == continent
+        && map_is_same_continent(acity->x, acity->y, pcity->x, pcity->y)
         && acity != pcity
         && (build_points_left(acity)
            > unit_build_shield_cost(unit_type) * caravans)) {
Index: ai/aicity.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aicity.c,v
retrieving revision 1.160
diff -u -r1.160 aicity.c
--- ai/aicity.c 13 Aug 2004 15:59:11 -0000      1.160
+++ ai/aicity.c 31 Aug 2004 10:59:19 -0000
@@ -191,7 +191,7 @@
                                      : get_unit_type(freight)->move_rate;
 
   if (!pcity->is_building_unit && is_wonder(pcity->currently_building)) {
-    wonder_continent = map_get_continent(pcity->x, pcity->y);
+    wonder_continent = map_get_continent_number(pcity->x, pcity->y);
   } else {
     wonder_continent = 0;
   }
@@ -200,7 +200,8 @@
   city_list_iterate(pplayer->cities, othercity) {
     distance = WARMAP_COST(othercity->x, othercity->y);
     if (wonder_continent != 0
-        && map_get_continent(othercity->x, othercity->y) == wonder_continent) {
+        && map_get_continent_number(othercity->x, othercity->y) == 
+          wonder_continent) {
       othercity->ai.distance_to_wonder_city = distance;
     }
 
Index: ai/aidata.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aidata.c,v
retrieving revision 1.36
diff -u -r1.36 aidata.c
--- ai/aidata.c 30 Aug 2004 21:20:33 -0000      1.36
+++ ai/aidata.c 31 Aug 2004 10:59:19 -0000
@@ -82,7 +82,7 @@
      * enough to warrant city walls. Concentrate instead on 
      * coastal fortresses and hunting down enemy transports. */
     city_list_iterate(aplayer->cities, acity) {
-      Continent_id continent = map_get_continent(acity->x, acity->y);
+      Continent_id continent = map_get_continent_number(acity->x, acity->y);
       ai->threats.continent[continent] = TRUE;
     } city_list_iterate_end;
 
@@ -98,13 +98,14 @@
          * seaborne units, we don't have to worry. Go on the offensive! */
         if (unit_type(punit)->attack_strength > 1) {
          if (is_ocean(map_get_terrain(punit->x, punit->y))) {
-           Continent_id continent = map_get_continent(punit->x, punit->y);
-           ai->threats.ocean[-continent] = TRUE;
+           Continent_id ocean_number = 
+             map_get_ocean_number(punit->x, punit->y);
+           ai->threats.ocean[ocean_number] = TRUE;
          } else {
            adjc_iterate(punit->x, punit->y, x2, y2) {
              if (is_ocean(map_get_terrain(x2, y2))) {
-               Continent_id continent = map_get_continent(x2, y2);
-               ai->threats.ocean[-continent] = TRUE;
+               Continent_id ocean_number = map_get_ocean_number(x2, y2);
+               ai->threats.ocean[ocean_number] = TRUE;
              }
            } adjc_iterate_end;
          }
@@ -151,19 +152,23 @@
   ai->explore.ocean = fc_calloc(ai->num_oceans + 1, sizeof(bool));
   whole_map_iterate(x, y) {
     struct tile *ptile = map_get_tile(x, y);
-    Continent_id continent = map_get_continent(x, y);
+    Continent_id continent;
 
     if (is_ocean(ptile->terrain)) {
+      Continent_id ocean_number = map_get_ocean_number(x, y);
       if (ai->explore.sea_done && ai_handicap(pplayer, H_TARGETS) 
           && !map_is_known(x, y, pplayer)) {
        /* We're not done there. */
         ai->explore.sea_done = FALSE;
-        ai->explore.ocean[-continent] = TRUE;
+        ai->explore.ocean[ocean_number] = TRUE;
       }
       /* skip rest, which is land only */
       continue;
     }
-    if (ai->explore.continent[ptile->continent]) {
+    
+    continent = map_get_continent_number(x, y);
+    
+    if (ai->explore.continent[continent]) {
       /* we don't need more explaining, we got the point */
       continue;
     }
@@ -187,7 +192,7 @@
   ai->stats.cities = fc_calloc(ai->num_continents + 1, sizeof(int));
   ai->stats.average_production = 0;
   city_list_iterate(pplayer->cities, pcity) {
-    ai->stats.cities[(int)map_get_continent(pcity->x, pcity->y)]++;
+    ai->stats.cities[(int)map_get_continent_number(pcity->x, pcity->y)]++;
     ai->stats.average_production += pcity->shield_surplus;
   } city_list_iterate_end;
   ai->stats.average_production /= MAX(1, city_list_size(&pplayer->cities));
@@ -196,7 +201,7 @@
     struct tile *ptile = map_get_tile(punit->x, punit->y);
 
     if (!is_ocean(ptile->terrain) && unit_flag(punit, F_SETTLERS)) {
-      ai->stats.workers[(int)map_get_continent(punit->x, punit->y)]++;
+      ai->stats.workers[(int)map_get_continent_number(punit->x, punit->y)]++;
     }
     if (unit_flag(punit, F_DIPLOMAT) && punit->ai.ai_role == AIUNIT_ATTACK) {
       /* Heading somewhere on a mission, reserve target. */
Index: ai/aitools.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aitools.c,v
retrieving revision 1.120
diff -u -r1.120 aitools.c
--- ai/aitools.c        27 Aug 2004 17:36:52 -0000      1.120
+++ ai/aitools.c        31 Aug 2004 10:59:34 -0000
@@ -577,7 +577,8 @@
 { 
   struct city *pc=NULL;
   int best_dist = -1;
-  Continent_id con = map_get_continent(x, y);
+  
+  int is_ocean = is_ocean(map_get_terrain(x, y));
 
   players_iterate(pplay) {
     /* If "enemy" is set, only consider cities whose owner we're at
@@ -592,8 +593,9 @@
       /* Find the closest city known to the player with a matching
        * continent. */
       if ((best_dist == -1 || city_dist < best_dist)
-         && (everywhere || con == 0
-             || con == map_get_continent(pcity->x, pcity->y))
+         && (everywhere ||
+             is_ocean ||
+             map_is_same_continent(pcity->x, pcity->y, x, y))
          && (!pplayer || map_is_known(pcity->x, pcity->y, pplayer))) {
        best_dist = city_dist;
         pc = pcity;
@@ -710,8 +712,7 @@
     if (pcity != acity
        && !acity->is_building_unit
        && is_wonder(acity->currently_building)
-       && (map_get_continent(acity->x, acity->y)
-           == map_get_continent(pcity->x, pcity->y))) {
+       && (map_is_same_continent(acity->x, acity->y, pcity->x, pcity->y))) {
       return TRUE;
     }
   } city_list_iterate_end;
Index: ai/aiunit.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aiunit.c,v
retrieving revision 1.330
diff -u -r1.330 aiunit.c
--- ai/aiunit.c 29 Aug 2004 20:14:41 -0000      1.330
+++ ai/aiunit.c 31 Aug 2004 10:59:40 -0000
@@ -319,7 +319,7 @@
   city_list_iterate(pplayer->cities, pcity) 
     if (!(pcity->is_building_unit) 
         && is_wonder(pcity->currently_building)
-        && map_get_continent(pcity->x, pcity->y) == cont) {
+        && map_get_continent_number(pcity->x, pcity->y) == cont) {
       return pcity;
   }
   city_list_iterate_end;
@@ -864,7 +864,7 @@
   CHECK_UNIT(punit);
   
   square_iterate(punit->x, punit->y, search_dist, xx, yy) {
-    if (map_get_continent(xx, yy) == map_get_continent(pc->x, pc->y)
+    if (map_is_same_continent(xx, yy, pc->x, pc->y)
         && real_map_distance(punit->x, punit->y, xx, yy) < dist) {
 
       dist = real_map_distance(punit->x, punit->y, xx, yy);
@@ -1309,7 +1309,7 @@
   /* Our total attack value with reinforcements */
   int attack;
   int move_time, move_rate;
-  Continent_id con = map_get_continent(punit->x, punit->y);
+
   struct unit *pdef;
   int maxd, needferry;
   /* Do we have access to sea? */
@@ -1584,7 +1584,7 @@
         /* Yes, we like this target */
         if (punit->id != 0 && is_ground_unit(punit) 
             && !unit_flag(punit, F_MARINES)
-            && map_get_continent(acity->x, acity->y) != con) {
+            && !map_is_same_continent(acity->x, acity->y, punit->x, punit->y)) 
{
           /* a non-virtual ground unit is trying to attack something on 
            * another continent.  Need a beachhead which is adjacent 
            * to the city and an available ocean tile */
@@ -1637,7 +1637,7 @@
       }
 
       if (is_ground_unit(punit) 
-          && (map_get_continent(aunit->x, aunit->y) != con 
+          && (!map_is_same_continent(aunit->x, aunit->y, punit->x, punit->y)
               || WARMAP_COST(aunit->x, aunit->y) >= maxd)) {
         /* Impossible or too far to walk */
         continue;
@@ -1871,7 +1871,8 @@
 
   if (punit->ai.ai_role == AIUNIT_NONE) {
     if ((pcity = wonder_on_continent(pplayer, 
-                                     map_get_continent(punit->x, punit->y))) 
+                                     map_get_continent_number(punit->x,
+                                                             punit->y))) 
         && unit_flag(punit, F_HELP_WONDER)
         && build_points_left(pcity) > (pcity->shield_surplus * 2)) {
       if (!same_pos(pcity->x, pcity->y, punit->x, punit->y)) {
@@ -1898,8 +1899,8 @@
            if (pcity
               && can_cities_trade(pcity, pdest)
               && can_establish_trade_route(pcity, pdest)
-               && map_get_continent(pcity->x, pcity->y) 
-                                == map_get_continent(pdest->x, pdest->y)) {
+               && map_is_same_continent(pcity->x, pcity->y, 
+                                       pdest->x, pdest->y)) {
              tradeval=trade_between_cities(pcity, pdest);
              if (tradeval != 0) {
                if (best < tradeval) {
@@ -2252,7 +2253,6 @@
 **************************************************************************/
 static void ai_manage_barbarian_leader(struct player *pplayer, struct unit 
*leader)
 {
-  Continent_id con = map_get_continent(leader->x, leader->y);
   int safest = 0, safest_x = leader->x, safest_y = leader->y;
   struct unit *closest_unit = NULL;
   int dist, mindist = 10000;
@@ -2272,7 +2272,7 @@
   unit_list_iterate(pplayer->units, aunit) {
     if (unit_has_role(aunit->type, L_BARBARIAN_LEADER)
        || !is_ground_unit(aunit)
-       || map_get_continent(aunit->x, aunit->y) != con)
+       || !map_is_same_continent(aunit->x, aunit->y, leader->x, leader->y))
       continue;
 
     if (WARMAP_COST(aunit->x, aunit->y) < mindist) {
@@ -2283,8 +2283,8 @@
 
   if (closest_unit
       && !same_pos(closest_unit->x, closest_unit->y, leader->x, leader->y)
-      && (map_get_continent(leader->x, leader->y)
-          == map_get_continent(closest_unit->x, closest_unit->y))) {
+      && (map_is_same_continent(leader->x, leader->y,
+                                closest_unit->x, closest_unit->y))) {
     (void) ai_unit_goto(leader, closest_unit->x, closest_unit->y);
     return; /* sticks better to own units with this -- jk */
   }
@@ -2297,7 +2297,7 @@
     unit_list_iterate(other_player->units, aunit) {
       if (is_military_unit(aunit)
          && is_ground_unit(aunit)
-         && map_get_continent(aunit->x, aunit->y) == con) {
+         && map_is_same_continent(aunit->x, aunit->y, leader->x, leader->y)) {
        /* questionable assumption: aunit needs as many moves to reach us as we
           need to reach it */
        dist = WARMAP_COST(aunit->x, aunit->y) - unit_move_rate(aunit);
Index: client/gui-gtk/cityrep.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk/cityrep.c,v
retrieving revision 1.85
diff -u -r1.85 cityrep.c
--- client/gui-gtk/cityrep.c    1 May 2004 03:34:57 -0000       1.85
+++ client/gui-gtk/cityrep.c    31 Aug 2004 10:59:42 -0000
@@ -795,8 +795,8 @@
       for(; current; current = g_list_next(current))
        {
          struct city* selectedcity = current->data;
-          if (map_get_continent(pcity->x, pcity->y)
-              == map_get_continent(selectedcity->x, selectedcity->y))
+          if (map_is_same_continent(pcity->x, pcity->y,
+                                   selectedcity->x, selectedcity->y))
            {
              gtk_clist_select_row(GTK_CLIST(city_list),i,0);
              break;
Index: client/gui-gtk-2.0/cityrep.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/cityrep.c,v
retrieving revision 1.58
diff -u -r1.58 cityrep.c
--- client/gui-gtk-2.0/cityrep.c        1 May 2004 17:28:47 -0000       1.58
+++ client/gui-gtk-2.0/cityrep.c        31 Aug 2004 10:59:44 -0000
@@ -959,8 +959,8 @@
     itree_get(&it, 0, &res, -1);
     pcity = res;
 
-    if (map_get_continent(pcity->x, pcity->y)
-           == map_get_continent(selectedcity->x, selectedcity->y)) {
+    if (map_is_same_continent(pcity->x, pcity->y, 
+                              selectedcity->x, selectedcity->y)) {
       itree_select(city_selection, &it);
     }
   }
Index: client/gui-win32/cityrep.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-win32/cityrep.c,v
retrieving revision 1.30
diff -u -r1.30 cityrep.c
--- client/gui-win32/cityrep.c  15 May 2004 21:30:34 -0000      1.30
+++ client/gui-win32/cityrep.c  31 Aug 2004 10:59:47 -0000
@@ -580,8 +580,8 @@
        {
          struct city *selectedcity;
          selectedcity=(struct city *)ListBox_GetItemData(hLst,cityids[j]);
-          if (map_get_continent(pcity->x, pcity->y)
-              == map_get_continent(selectedcity->x, selectedcity->y))
+          if (map_is_same_continent(pcity->x, pcity->y,
+                                   selectedcity->x, selectedcity->y))
            {    
              ListBox_SetSel(hLst,TRUE,i);
              break;
Index: common/city.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/city.c,v
retrieving revision 1.239
diff -u -r1.239 city.c
--- common/city.c       31 Aug 2004 04:40:50 -0000      1.239
+++ common/city.c       31 Aug 2004 10:59:51 -0000
@@ -1032,8 +1032,7 @@
     bonus = (pc1->tile_trade + pc2->tile_trade + 4) / 8;
 
     /* Double if on different continents. */
-    if (map_get_continent(pc1->x, pc1->y) !=
-       map_get_continent(pc2->x, pc2->y)) {
+    if (!map_is_same_continent(pc1->x, pc1->y, pc2->x, pc2->y)) {
       bonus *= 2;
     }
 
@@ -1212,8 +1211,7 @@
   case B_HOOVER:
   case B_BACH:
     if (improvement_variant(id)==1) {
-      return (map_get_continent(tmp->x, tmp->y) ==
-             map_get_continent(pcity->x, pcity->y));
+      return (map_is_same_continent(tmp->x, tmp->y, pcity->x, pcity->y));
     } else {
       return TRUE;
     }
@@ -2535,7 +2533,7 @@
   }
 
   improvements_update_redundant(pplayer, pcity, 
-                                map_get_continent(pcity->x, pcity->y),
+                                map_get_continent_number(pcity->x, pcity->y),
                                 improvement_types[impr].equiv_range);
 }
 
@@ -2554,7 +2552,7 @@
   mark_improvement(pcity, impr, I_NONE);
 
   improvements_update_redundant(pplayer, pcity,
-                                map_get_continent(pcity->x, pcity->y),
+                                map_get_continent_number(pcity->x, pcity->y),
                                 improvement_types[impr].equiv_range);
 }
 
Index: common/improvement.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/improvement.c,v
retrieving revision 1.43
diff -u -r1.43 improvement.c
--- common/improvement.c        13 Aug 2004 15:59:12 -0000      1.43
+++ common/improvement.c        31 Aug 2004 10:59:55 -0000
@@ -285,7 +285,7 @@
 
   if (pcity) {
     equiv_list[IR_CITY] = pcity->improvements;
-    cont = map_get_continent(pcity->x, pcity->y);
+    cont = map_get_continent_number(pcity->x, pcity->y);
     assert(cont > 0);
   }
 
@@ -492,7 +492,7 @@
 
     /* Fill the lists with existent improvements with Island equiv_range */
     city_list_iterate(pplayer->cities, pcity) {
-      Continent_id cont = map_get_continent(pcity->x, pcity->y);
+      Continent_id cont = map_get_continent_number(pcity->x, pcity->y);
       Impr_Status *improvs = 
                            &pplayer->island_improv[cont * game.num_impr_types];
 
@@ -606,7 +606,7 @@
   case IR_ISLAND:
     assert(cont > 0);
     city_list_iterate(pplayer->cities, pcity2) {
-      if (map_get_continent(pcity2->x, pcity2->y) == cont) {
+      if (map_get_continent_number(pcity2->x, pcity2->y) == cont) {
         CHECK_CITY_IMPR(pcity2);
       }
     } city_list_iterate_end;
Index: common/map.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/map.c,v
retrieving revision 1.190
diff -u -r1.190 map.c
--- common/map.c        31 Aug 2004 05:43:51 -0000      1.190
+++ common/map.c        31 Aug 2004 10:59:58 -0000
@@ -1253,20 +1253,44 @@
 /***************************************************************
 ...
 ***************************************************************/
-Continent_id map_get_continent(int x, int y)
+Continent_id map_get_continent_number(int x, int y)
 {
+  assert(!is_ocean(map_get_terrain(x, y)));
   return MAP_TILE(x, y)->continent;
 }
 
 /***************************************************************
 ...
 ***************************************************************/
+Continent_id map_get_ocean_number(int x, int y)
+{
+  assert(is_ocean(map_get_terrain(x, y)));
+  /* continent number is stored as negative value */
+  return -(MAP_TILE(x, y)->continent);
+}
+
+/***************************************************************
+...
+***************************************************************/
 void map_set_continent(int x, int y, Continent_id val)
 {
   MAP_TILE(x, y)->continent = val;
 }
 
 /***************************************************************
+  Check if given tiles are on different continents/oceans
+  If one tile is on a ocean and the other on a land return FALSE
+***************************************************************/
+bool map_is_same_continent(int x, int y, int x2, int y2) 
+{
+  if (is_ocean(map_get_terrain(x, y)) != 
+      is_ocean(map_get_terrain(x2, y2))) {
+    return FALSE;
+  }
+  return (MAP_TILE(x, y)->continent == MAP_TILE(x2, y2)->continent);
+}
+
+/***************************************************************
 ...
 ***************************************************************/
 Terrain_type_id map_get_terrain(int x, int y)
Index: common/map.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/map.h,v
retrieving revision 1.210
diff -u -r1.210 map.h
--- common/map.h        26 Aug 2004 18:37:52 -0000      1.210
+++ common/map.h        31 Aug 2004 11:00:00 -0000
@@ -223,7 +223,9 @@
 int get_direction_for_step(int start_x, int start_y, int end_x, int end_y);
 
 void map_set_continent(int x, int y, Continent_id val);
-Continent_id map_get_continent(int x, int y);
+Continent_id map_get_continent_number(int x, int y);
+Continent_id map_get_ocean_number(int x, int y);
+bool map_is_same_continent(int x, int y, int x2, int y2);
 
 void initialize_move_costs(void);
 void reset_move_costs(int x, int y);
Index: server/gamehand.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/gamehand.c,v
retrieving revision 1.138
diff -u -r1.138 gamehand.c
--- server/gamehand.c   29 Aug 2004 19:03:32 -0000      1.138
+++ server/gamehand.c   31 Aug 2004 11:00:07 -0000
@@ -208,7 +208,7 @@
        x = p.x + myrand(2 * game.dispersion + 1) - game.dispersion;
        y = p.y + myrand(2 * game.dispersion + 1) - game.dispersion;
       } while (!(normalize_map_pos(&x, &y)
-                && map_get_continent(p.x, p.y) == map_get_continent(x, y)
+                && map_is_same_continent(p.x, p.y, x, y)
                 && !is_ocean(map_get_terrain(x, y))
                 && !is_non_allied_unit_tile(map_get_tile(x, y),
                                             pplayer)));
Index: server/gotohand.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/gotohand.c,v
retrieving revision 1.181
diff -u -r1.181 gotohand.c
--- server/gotohand.c   9 Aug 2004 05:24:35 -0000       1.181
+++ server/gotohand.c   31 Aug 2004 11:00:10 -0000
@@ -1249,21 +1249,20 @@
        * and with a boat */
       if (ground_unit_transporter_capacity(x, y, pplayer) > 0) {
         adjc_iterate(x, y, tmp_x, tmp_y) {
-          if (map_get_continent(tmp_x, tmp_y) == 
-              map_get_continent(punit->x, punit->y))
+          if (map_is_same_continent(tmp_x, tmp_y, punit->x, punit->y))
             /* The target is adjacent to our continent! */
             return TRUE;
         } adjc_iterate_end;
       }
     } else {
       /* Going to a land tile: better be our continent */
-      if (map_get_continent(punit->x, punit->y) == map_get_continent(x, y)) {
+      if (map_is_same_continent(punit->x, punit->y, x, y)) {
         return TRUE;
       } else {
         /* Well, it's not our continent, but maybe we are on a boat
          * adjacent to the target continent? */
        adjc_iterate(punit->x, punit->y, tmp_x, tmp_y) {
-         if (map_get_continent(tmp_x, tmp_y) == map_get_continent(x, y)) {
+         if (map_is_same_continent(tmp_x, tmp_y, x, y)) {
            return TRUE;
           }
        } adjc_iterate_end;
Index: server/mapgen.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/mapgen.c,v
retrieving revision 1.149
diff -u -r1.149 mapgen.c
--- server/mapgen.c     28 Aug 2004 16:50:49 -0000      1.149
+++ server/mapgen.c     31 Aug 2004 11:00:17 -0000
@@ -1288,7 +1288,7 @@
         continue;
       }
       for (j = 0; j < seen_conts; j++) {
-       if (map_get_continent(x1, y1) == conts[j]) {
+       if (map_get_continent_number(x1, y1) == conts[j]) {
           /* Continent of (x1,y1) is already in the list */
          break;
         }
@@ -1296,7 +1296,7 @@
       if (j >= seen_conts) { 
        /* we have not seen this continent yet */
        assert(seen_conts < CITY_TILES);
-       conts[seen_conts] = map_get_continent(x1, y1);
+       conts[seen_conts] = map_get_continent_number(x1, y1);
        seen_conts++;
       }
     } map_city_radius_iterate_end;
@@ -1388,7 +1388,7 @@
     return FALSE;
   }
 
-  if (islands[(int)map_get_continent(x, y)].starters == 0) {
+  if (islands[(int)map_get_continent_number(x, y)].starters == 0) {
     return FALSE;
   }
 
@@ -1409,7 +1409,7 @@
     int x1 = map.start_positions[i].x;
     int y1 = map.start_positions[i].y;
 
-    if (map_get_continent(x, y) == map_get_continent(x1, y1)
+    if (map_is_same_continent(x, y, x1, y1)
        && real_map_distance(x, y, x1, y1) < data->dist) {
       return FALSE;
     }
@@ -1449,7 +1449,7 @@
                                   * sizeof(*map.start_positions));
   while (data.count < game.nplayers) {
     if (rand_map_pos_filtered(&x, &y, &data, is_valid_start_pos)) {
-      islands[(int)map_get_continent(x, y)].starters--;
+      islands[(int)map_get_continent_number(x, y)].starters--;
       map.start_positions[data.count].x = x;
       map.start_positions[data.count].y = y;
       map.start_positions[data.count].nation = NO_NATION_SELECTED;
@@ -1913,7 +1913,8 @@
   while (i > 0 && (failsafe--) > 0) {
     get_random_map_position_from_state(&x, &y, pstate);
 
-    if (map_get_continent(x, y) == pstate->isleindex &&
+    if (!is_ocean(map_get_terrain(x, y)) &&
+        map_get_continent_number(x, y) == pstate->isleindex &&
        not_placed(x, y)) {
 
       /* the first condition helps make terrain more contiguous,
@@ -1962,7 +1963,8 @@
 
   while (i > 0 && (failsafe--) > 0) {
     get_random_map_position_from_state(&x, &y, pstate);
-    if (map_get_continent(x, y) == pstate->isleindex &&
+    if (!is_ocean(map_get_terrain(x, y)) && 
+        map_get_continent_number(x, y) == pstate->isleindex &&
        not_placed(x, y)) {
 
       /* the first condition helps make terrain more contiguous,
Index: server/maphand.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/maphand.c,v
retrieving revision 1.146
diff -u -r1.146 maphand.c
--- server/maphand.c    31 Aug 2004 08:17:50 -0000      1.146
+++ server/maphand.c    31 Aug 2004 11:00:19 -0000
@@ -59,7 +59,7 @@
 **************************************************************************/
 static void assign_continent_flood(int x, int y, bool is_land, int nr)
 {
-  if (map_get_continent(x, y) != 0) {
+  if (map_get_tile(x, y)->continent != 0) {
     return;
   }
 
@@ -93,15 +93,15 @@
   }
   
   whole_map_iterate(x, y) {
-    Continent_id cont = map_get_continent(x, y);
     if (!is_ocean(map_get_terrain(x, y))) {
+      Continent_id cont = map_get_continent_number(x, y);
       adjc_iterate(x, y, x2, y2) {
-        Continent_id cont2 = map_get_continent(x2, y2);
        if (is_ocean(map_get_terrain(x2, y2))) {
-         if (lake_surrounders[-cont2] == 0) {
-           lake_surrounders[-cont2] = cont;
-         } else if (lake_surrounders[-cont2] != cont) {
-           lake_surrounders[-cont2] = -1;
+          Continent_id ocean = map_get_ocean_number(x2, y2);
+         if (lake_surrounders[ocean] == 0) {
+           lake_surrounders[ocean] = cont;
+         } else if (lake_surrounders[ocean] != cont) {
+           lake_surrounders[ocean] = -1;
          }
        }
       } adjc_iterate_end;
@@ -140,7 +140,7 @@
 
   /* Assign new numbers */
   whole_map_iterate(x, y) {
-    if (map_get_continent(x, y) != 0) {
+    if (map_get_tile(x, y)->continent != 0) {
       /* Already assigned. */
       continue;
     }
@@ -1480,23 +1480,23 @@
 *************************************************************************/
 static bool is_claimed_ocean(int x, int y, Continent_id *contp)
 {
-  Continent_id cont = map_get_continent(x, y);
+  Continent_id ocean = map_get_ocean_number(x, y);
   Continent_id cont2, other;
   int ocean_tiles;
   
-  if (get_ocean_size(-cont) <= MAXIMUM_CLAIMED_OCEAN_SIZE &&
-      lake_surrounders[-cont] > 0) {
-    *contp = lake_surrounders[-cont];
+  if (get_ocean_size(ocean) <= MAXIMUM_CLAIMED_OCEAN_SIZE &&
+      lake_surrounders[ocean] > 0) {
+    *contp = lake_surrounders[ocean];
     return TRUE;
   }
   
   other = 0;
   ocean_tiles = 0;
   adjc_iterate(x, y, x2, y2) {
-    cont2 = map_get_continent(x2, y2);
-    if (cont2 == cont) {
+    if (is_ocean(map_get_terrain(x2, y2))) {
       ocean_tiles++;
     } else {
+      cont2 = map_get_continent_number(x2, y2);
       if (other == 0) {
         other = cont2;
       } else if (other != cont2) {
@@ -1534,11 +1534,27 @@
     int distsq;                /* Squared distance to city */
     /* integer arithmetic equivalent of (borders+0.5)**2 */
     int cldistsq = game.borders * (game.borders + 1);
-    Continent_id cont = map_get_continent(x, y);
+    
+    if (!is_ocean(map_get_terrain(x, y))) {
+      cities_iterate(pcity) {
+        if (map_is_same_continent(pcity->x, pcity->y, x, y)) {
+          distsq = sq_map_distance(pcity->x, pcity->y, x, y);    
+          if (distsq < cldistsq ||
+               (distsq == cldistsq &&
+                (!closest || closest->turn_founded > pcity->turn_founded))) {
+            closest = pcity;
+            cldistsq = distsq;
+          } 
+       }
+      } cities_iterate_end;
+    } else {
+      /* (x,y) is ocean */
+      Continent_id cont;
 
-    if (!is_ocean(map_get_terrain(x, y)) || is_claimed_ocean(x, y, &cont)) {
+      is_claimed_ocean(x, y, &cont);
       cities_iterate(pcity) {
-       if (map_get_continent(pcity->x, pcity->y) == cont) {
+        if (!is_ocean(map_get_terrain(pcity->x, pcity->y)) &&
+           map_get_continent_number(pcity->x, pcity->y) == cont) {
           distsq = sq_map_distance(pcity->x, pcity->y, x, y);
           if (distsq < cldistsq ||
                (distsq == cldistsq &&
@@ -1546,11 +1562,10 @@
             closest = pcity;
             cldistsq = distsq;
           } 
-        }
+        }        
       } cities_iterate_end;
     }
   }
-
   return closest;
 }
 
Index: server/sanitycheck.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/sanitycheck.c,v
retrieving revision 1.50
diff -u -r1.50 sanitycheck.c
--- server/sanitycheck.c        29 Aug 2004 19:38:07 -0000      1.50
+++ server/sanitycheck.c        31 Aug 2004 11:00:20 -0000
@@ -102,20 +102,17 @@
   whole_map_iterate(x, y) {
     struct tile *ptile = map_get_tile(x, y);
     struct city *pcity = map_get_city(x, y);
-    int cont = map_get_continent(x, y);
 
     if (is_ocean(map_get_terrain(x, y))) {
-      assert(cont < 0);
       adjc_iterate(x, y, x1, y1) {
        if (is_ocean(map_get_terrain(x1, y1))) {
-         assert(map_get_continent(x1, y1) == cont);
+         assert(map_is_same_continent(x1, y1, x, y));
        }
       } adjc_iterate_end;
     } else {
-      assert(cont > 0);
       adjc_iterate(x, y, x1, y1) {
        if (!is_ocean(map_get_terrain(x1, y1))) {
-         assert(map_get_continent(x1, y1) == cont);
+         assert(map_is_same_continent(x1, y1, x, y));
        }
       } adjc_iterate_end;
     }
Index: server/settlers.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/settlers.c,v
retrieving revision 1.199
diff -u -r1.199 settlers.c
--- server/settlers.c   31 Aug 2004 04:40:51 -0000      1.199
+++ server/settlers.c   31 Aug 2004 11:00:24 -0000
@@ -921,7 +921,6 @@
   struct player *pplayer = unit_owner(punit);
   bool in_use;                 /* true if the target square is being used
                                   by one of our cities */
-  Continent_id ucont     = map_get_continent(punit->x, punit->y);
   int mv_rate         = unit_type(punit)->move_rate;
   int mv_turns;                        /* estimated turns to move to target 
square */
   int oldv;                    /* current value of consideration tile */
@@ -946,7 +945,7 @@
       if (get_worker_city(pcity, i, j) == C_TILE_UNAVAILABLE)
        continue;
       in_use = (get_worker_city(pcity, i, j) == C_TILE_WORKER);
-      if (map_get_continent(x, y) == ucont
+      if (map_is_same_continent(x, y, punit->x, punit->y)
          && WARMAP_COST(x, y) <= THRESHOLD * mv_rate
          && !BV_CHECK_MASK(TERRITORY(x, y), my_enemies)
          /* pretty good, hope it's enough! -- Syela */
Index: server/unittools.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/unittools.c,v
retrieving revision 1.300
diff -u -r1.300 unittools.c
--- server/unittools.c  26 Aug 2004 18:37:53 -0000      1.300
+++ server/unittools.c  31 Aug 2004 11:00:29 -0000
@@ -1080,7 +1080,7 @@
     value = get_virtual_defense_power(U_LAST, u_type, x1, y1, FALSE, 0);
     value *= 10;
 
-    if (ptile->continent != map_get_continent(pcity->x, pcity->y)) {
+    if (!map_is_same_continent(x1, y1, pcity->x, pcity->y)) {
       value /= 2;
     }
 

[Prev in Thread] Current Thread [Next in Thread]