Author: cazfi
Date: Sun Mar 30 15:37:02 2014
New Revision: 24739

URL: http://svn.gna.org/viewcvs/freeciv?rev=24739&view=rev
Log:
Create cache listing extra types that can provide tile nativity to the unit 
class
at the ruleset loading time. Iterate over that list only when checking if tile
is native for a unit.

See patch #4609

Modified:
    branches/S2_5/client/packhand.c
    branches/S2_5/common/movement.c
    branches/S2_5/common/unittype.c
    branches/S2_5/common/unittype.h
    branches/S2_5/server/ruleset.c

Modified: branches/S2_5/client/packhand.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/client/packhand.c?rev=24739&r1=24738&r2=24739&view=diff
==============================================================================
--- branches/S2_5/client/packhand.c     (original)
+++ branches/S2_5/client/packhand.c     Sun Mar 30 15:37:02 2014
@@ -2834,6 +2834,10 @@
       }
     } road_type_iterate_end;
   } road_type_iterate_end;
+
+  unit_class_iterate(pclass) {
+    set_unit_class_caches(pclass);
+  } unit_class_iterate_end;
 
   /* We are not going to crop any more sprites from big sprites, free them. */
   finish_loading_sprites(tileset);

Modified: branches/S2_5/common/movement.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/common/movement.c?rev=24739&r1=24738&r2=24739&view=diff
==============================================================================
--- branches/S2_5/common/movement.c     (original)
+++ branches/S2_5/common/movement.c     Sun Mar 30 15:37:02 2014
@@ -285,21 +285,17 @@
     return TRUE;
   }
 
-  road_type_iterate(proad) {
-    if (BV_ISSET(roads, road_index(proad))
-        && road_has_flag(proad, RF_NATIVE_TILE)
-        && is_native_road_to_uclass(proad, punitclass)) {
+  road_type_list_iterate(punitclass->cache.native_tile_roads, proad) {
+    if (BV_ISSET(roads, road_index(proad))) {
       return TRUE;
     }
-  } road_type_iterate_end;
-
-  base_type_iterate(pbase) {
-    if (BV_ISSET(bases, base_index(pbase))
-        && base_has_flag(pbase, BF_NATIVE_TILE)
-        && is_native_base_to_uclass(pbase, punitclass)) {
+  } road_type_list_iterate_end;
+
+  base_type_list_iterate(punitclass->cache.native_tile_bases, pbase) {
+    if (BV_ISSET(bases, base_index(pbase))) {
       return TRUE;
     }
-  } base_type_iterate_end;
+  } base_type_list_iterate_end;
 
   return FALSE;
 }

Modified: branches/S2_5/common/unittype.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/common/unittype.c?rev=24739&r1=24738&r2=24739&view=diff
==============================================================================
--- branches/S2_5/common/unittype.c     (original)
+++ branches/S2_5/common/unittype.c     Sun Mar 30 15:37:02 2014
@@ -1056,6 +1056,8 @@
   for (i = 0; i < ARRAY_SIZE(unit_classes); i++) {
     unit_classes[i].item_number = i;
     unit_classes[i].cache.refuel_bases = NULL;
+    unit_classes[i].cache.native_tile_bases = NULL;
+    unit_classes[i].cache.native_tile_roads = NULL;
   }
 }
 
@@ -1070,6 +1072,14 @@
     if (unit_classes[i].cache.refuel_bases != NULL) {
       base_type_list_destroy(unit_classes[i].cache.refuel_bases);
       unit_classes[i].cache.refuel_bases = NULL;
+    }
+    if (unit_classes[i].cache.native_tile_bases != NULL) {
+      base_type_list_destroy(unit_classes[i].cache.native_tile_bases);
+      unit_classes[i].cache.native_tile_bases = NULL;
+    }
+    if (unit_classes[i].cache.native_tile_roads != NULL) {
+      road_type_list_destroy(unit_classes[i].cache.native_tile_roads);
+      unit_classes[i].cache.native_tile_roads = NULL;
     }
   }
 }
@@ -1217,3 +1227,29 @@
 {
   ptype->ais[ai_type_number(ai)] = data;
 }
+
+/****************************************************************************
+  Set caches for unit class.
+****************************************************************************/
+void set_unit_class_caches(struct unit_class *pclass)
+{
+  pclass->cache.refuel_bases = base_type_list_new();
+  pclass->cache.native_tile_bases = base_type_list_new();
+  pclass->cache.native_tile_roads = road_type_list_new();
+
+  base_type_iterate(pbase) {
+    if (is_native_base_to_uclass(pbase, pclass)) {
+      base_type_list_append(pclass->cache.refuel_bases, pbase);
+      if (base_has_flag(pbase, BF_NATIVE_TILE)) {
+        base_type_list_append(pclass->cache.native_tile_bases, pbase);
+      }
+    }
+  } base_type_iterate_end;
+
+  road_type_iterate(proad) {
+    if (is_native_road_to_uclass(proad, pclass)
+        && road_has_flag(proad, RF_NATIVE_TILE)) {
+      road_type_list_append(pclass->cache.native_tile_roads, proad);
+    }
+  } road_type_iterate_end;
+}

Modified: branches/S2_5/common/unittype.h
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/common/unittype.h?rev=24739&r1=24738&r2=24739&view=diff
==============================================================================
--- branches/S2_5/common/unittype.h     (original)
+++ branches/S2_5/common/unittype.h     Sun Mar 30 15:37:02 2014
@@ -106,8 +106,9 @@
   } adv;
 
   struct {
-    /* Set only on server side */
     struct base_type_list *refuel_bases;
+    struct base_type_list *native_tile_bases;
+    struct road_type_list *native_tile_roads;
   } cache;
 };
 
@@ -590,6 +591,8 @@
 void unit_classes_init(void);
 void unit_classes_free(void);
 
+void set_unit_class_caches(struct unit_class *pclass);
+
 struct unit_class *unit_class_array_first(void);
 const struct unit_class *unit_class_array_last(void);
 

Modified: branches/S2_5/server/ruleset.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/ruleset.c?rev=24739&r1=24738&r2=24739&view=diff
==============================================================================
--- branches/S2_5/server/ruleset.c      (original)
+++ branches/S2_5/server/ruleset.c      Sun Mar 30 15:37:02 2014
@@ -942,20 +942,6 @@
   }
 
   return unit_move_type_invalid();
-}
-
-/****************************************************************************
-  Set refuel bases cache for unit class.
-****************************************************************************/
-static void set_unit_class_refuel_bases(struct unit_class *pclass)
-{
-  pclass->cache.refuel_bases = base_type_list_new();
-
-  base_type_iterate(pbase) {
-    if (is_native_base_to_uclass(pbase, pclass)) {
-      base_type_list_append(pclass->cache.refuel_bases, pbase);
-    }
-  } base_type_iterate_end;
 }
 
 /****************************************************************************
@@ -1702,6 +1688,8 @@
         break;
       }
 
+      set_unit_class_caches(uc);
+
       if (!unit_move_type_is_valid(uc->move_type)) {
         /* Not explicitly given, determine automatically */
         bool land_moving = FALSE;
@@ -1794,9 +1782,6 @@
       if (!ok) {
         break;
       }
-
-      set_unit_class_refuel_bases(uc);
-
     } unit_class_iterate_end;
   }
 


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to