Author: cazfi
Date: Sat Mar 15 16:14:20 2014
New Revision: 24677

URL: http://svn.gna.org/viewcvs/freeciv?rev=24677&view=rev
Log:
Create cache listing extra types that can act as refuel point for the unit class
at the ruleset loading time. Iterate over that list only when checking if tile
has refuel base for the unit.

See patch #4563

Modified:
    trunk/common/game.c
    trunk/common/unittype.c
    trunk/common/unittype.h
    trunk/server/ruleset.c
    trunk/server/unittools.c

Modified: trunk/common/game.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/game.c?rev=24677&r1=24676&r2=24677&view=diff
==============================================================================
--- trunk/common/game.c (original)
+++ trunk/common/game.c Sat Mar 15 16:14:20 2014
@@ -530,6 +530,7 @@
   game.government_during_revolution = NULL;
 
   specialists_free();
+  unit_classes_free();
   techs_free();
   governments_free();
   nations_free();

Modified: trunk/common/unittype.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/unittype.c?rev=24677&r1=24676&r2=24677&view=diff
==============================================================================
--- trunk/common/unittype.c     (original)
+++ trunk/common/unittype.c     Sat Mar 15 16:14:20 2014
@@ -1056,6 +1056,22 @@
    * num_unit_classes isn't known yet. */
   for (i = 0; i < ARRAY_SIZE(unit_classes); i++) {
     unit_classes[i].item_number = i;
+    unit_classes[i].cache.refuel_bases = NULL;
+  }
+}
+
+/****************************************************************************
+  Free resources allocated for unit classes.
+****************************************************************************/
+void unit_classes_free(void)
+{
+  int i;
+
+  for (i = 0; i < ARRAY_SIZE(unit_classes); i++) {
+    if (unit_classes[i].cache.refuel_bases != NULL) {
+      extra_type_list_destroy(unit_classes[i].cache.refuel_bases);
+      unit_classes[i].cache.refuel_bases = NULL;
+    }
   }
 }
 

Modified: trunk/common/unittype.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/unittype.h?rev=24677&r1=24676&r2=24677&view=diff
==============================================================================
--- trunk/common/unittype.h     (original)
+++ trunk/common/unittype.h     Sat Mar 15 16:14:20 2014
@@ -88,6 +88,8 @@
 
 enum move_level { MOVE_NONE, MOVE_PARTIAL, MOVE_FULL };
 
+struct extra_type_list;
+
 struct unit_class {
   Unit_Class_id item_number;
   struct name_translation name;
@@ -102,6 +104,11 @@
     enum move_level land_move;
     enum move_level sea_move;
   } adv;
+
+  struct {
+    /* Set only on server side */
+    struct extra_type_list *refuel_bases;
+  } cache;
 };
 
 /* Unit "special effects" flags:
@@ -582,6 +589,7 @@
 
 /* Initialization and iteration */
 void unit_classes_init(void);
+void unit_classes_free(void);
 
 struct unit_class *unit_class_array_first(void);
 const struct unit_class *unit_class_array_last(void);

Modified: trunk/server/ruleset.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/ruleset.c?rev=24677&r1=24676&r2=24677&view=diff
==============================================================================
--- trunk/server/ruleset.c      (original)
+++ trunk/server/ruleset.c      Sat Mar 15 16:14:20 2014
@@ -890,6 +890,21 @@
   }
 
   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 = extra_type_list_new();
+
+  extra_type_iterate(pextra) {
+    if (is_native_extra_to_uclass(pextra, pclass)
+        && extra_has_flag(pextra, EF_REFUEL)) {
+      extra_type_list_append(pclass->cache.refuel_bases, pextra);
+    }
+  } extra_type_iterate_end;
 }
 
 /****************************************************************************
@@ -1746,6 +1761,9 @@
       if (!ok) {
         break;
       }
+
+      set_unit_class_refuel_bases(uc);
+
     } unit_class_iterate_end;
   }
 

Modified: trunk/server/unittools.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/unittools.c?rev=24677&r1=24676&r2=24677&view=diff
==============================================================================
--- trunk/server/unittools.c    (original)
+++ trunk/server/unittools.c    Sat Mar 15 16:14:20 2014
@@ -1285,17 +1285,19 @@
   struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
 
   if (!is_non_allied_unit_tile(ptile, pplayer)) {
+    struct unit_class *pclass = utype_class(type);
+
     if (is_allied_city_tile(ptile, pplayer)) {
       return TRUE;
     }
 
-    extra_type_iterate(pextra) {
-      if (BV_ISSET(plrtile->extras, extra_index(pextra))
-          && extra_has_flag(pextra, EF_REFUEL)
-          && is_native_extra_to_utype(pextra, type)) {
-        return TRUE;
-      }
-    } extra_type_iterate_end;
+    if (pclass->cache.refuel_bases != NULL) {
+      extra_type_list_iterate(pclass->cache.refuel_bases, pextra) {
+        if (BV_ISSET(plrtile->extras, extra_index(pextra))) {
+          return TRUE;
+        }
+      } extra_type_list_iterate_end;
+    }
   }
 
   cap = unit_class_transporter_capacity(ptile, pplayer, utype_class(type));


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

Reply via email to