<URL: http://bugs.freeciv.org/Ticket/Display.html?id=14969 >

The existing patch made the testing and network slightly more efficient --
using a bitvector instead of a list of pointers -- but that's too much
change for the current state of 2.1 release.  I'm not sure it is really
helpful in execution, as the list is only ever 0, 1, or 2 long.  Might save
one or two tests on each tile that actually has resources, but greatly
increases the loop iterations for map generation and game saving.  Might be
premature optimization.

Therefore, I extracted only the running portion.  Any problems?

S2_1 revision 13720.

Index: common/city.c
===================================================================
--- common/city.c       (revision 13719)
+++ common/city.c       (working copy)
@@ -608,7 +608,8 @@
   }
 
   prod = pterrain->output[otype];
-  if (ptile->resource) {
+  if (ptile->resource
+   && terrain_has_resource(ptile->terrain, ptile->resource)) {
     prod += ptile->resource->output[otype];
   }
 
Index: common/tile.c
===================================================================
--- common/tile.c       (revision 13719)
+++ common/tile.c       (working copy)
@@ -447,7 +447,8 @@
     sz_strlcat(s, special_name_translation(S_RIVER));
   }
 
-  if (ptile->resource) {
+  if (ptile->resource
+   && terrain_has_resource(ptile->terrain, ptile->resource)) {
     cat_snprintf(s, sizeof(s), " (%s)", 
resource_name_translation(ptile->resource));
   }
 
Index: common/terrain.c
===================================================================
--- common/terrain.c    (revision 13719)
+++ common/terrain.c    (working copy)
@@ -208,6 +208,23 @@
 }
 
 /****************************************************************************
+  Check for resource in terrain resources list.
+****************************************************************************/
+bool terrain_has_resource(const struct terrain *pterrain,
+                         const struct resource *presource)
+{
+  struct resource **r = pterrain->resources;
+
+  while (NULL != *r) {
+    if (*r == presource) {
+      return TRUE;
+    }
+    r++;
+  }
+  return FALSE;
+}
+
+/****************************************************************************
   Free memory which is associated with terrain types.
 ****************************************************************************/
 void terrains_free(void)
Index: common/terrain.h
===================================================================
--- common/terrain.h    (revision 13719)
+++ common/terrain.h    (working copy)
@@ -181,6 +181,10 @@
 enum terrain_flag_id find_terrain_flag_by_rule_name(const char *s);
 #define terrain_has_flag(terr, flag) BV_ISSET((terr)->flags, flag)
 struct terrain *pick_terrain_by_flag(enum terrain_flag_id flag);
+
+bool terrain_has_resource(const struct terrain *pterrain,
+                         const struct resource *presource);
+
 void terrains_free(void);
 
 /* General resource accessor functions. */
Index: client/gui-sdl/mapview.c
===================================================================
--- client/gui-sdl/mapview.c    (revision 13719)
+++ client/gui-sdl/mapview.c    (working copy)
@@ -495,7 +495,8 @@
     sz_strlcat(s, special_name_translation(S_RIVER));
   }
 
-  if (ptile->resource) {
+  if (ptile->resource
+   && terrain_has_resource(ptile->terrain, ptile->resource)) {
     cat_snprintf(s, sizeof(s), " (%s)",
                 resource_name_translation(ptile->resource));
   }
Index: client/tilespec.c
===================================================================
--- client/tilespec.c   (revision 13719)
+++ client/tilespec.c   (working copy)
@@ -4142,7 +4142,8 @@
   case LAYER_SPECIAL1:
     if (ptile && client_tile_get_known(ptile) != TILE_UNKNOWN) {
       if (draw_specials) {
-       if (ptile->resource) {
+       if (ptile->resource
+        && terrain_has_resource(ptile->terrain, ptile->resource)) {
          ADD_SPRITE_SIMPLE(t->sprites.resource[ptile->resource->index]);
        }
       }
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to