Author: cazfi
Date: Thu Jan 15 06:24:26 2015
New Revision: 27692

URL: http://svn.gna.org/viewcvs/freeciv?rev=27692&view=rev
Log:
Replaced separate iterations for roads and bases with one iteration over all 
extras when
threaded AI settlers evaluate what to build.

See patch #5676

Modified:
    trunk/ai/threaded/taicity.c
    trunk/common/extras.c
    trunk/common/extras.h
    trunk/server/advisors/autosettlers.c
    trunk/server/advisors/autosettlers.h

Modified: trunk/ai/threaded/taicity.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/ai/threaded/taicity.c?rev=27692&r1=27691&r2=27692&view=diff
==============================================================================
--- trunk/ai/threaded/taicity.c (original)
+++ trunk/ai/threaded/taicity.c Thu Jan 15 06:24:26 2015
@@ -189,27 +189,44 @@
       }
     } as_transform_activity_iterate_end;
 
-    road_type_iterate(proad) {
-      bool possible = FALSE;
+    extra_type_iterate(tgt) {
+      enum unit_activity act = ACTIVITY_LAST;
 
       unit_list_iterate(units, punit) {
-        struct extra_type *tgt = road_extra_get(proad);
-
-        if (can_unit_do_activity_targeted_at(punit, ACTIVITY_GEN_ROAD, tgt, 
ptile)) {
-          possible = TRUE;
-          break;
-        }
+        as_extra_activity_iterate(try_act) {
+          if (is_extra_caused_by_action(tgt, try_act)
+              && can_unit_do_activity_targeted_at(punit, try_act, tgt, ptile)) 
{
+            act = try_act;
+            break;
+          }
+        } as_extra_activity_iterate_end;
       } unit_list_iterate_end;
 
-      if (possible) {
+      if (act != ACTIVITY_LAST) {
         int value;
         int extra;
-        struct extra_type *pextra;
-
-        pextra = road_extra_get(proad);
-        value = adv_city_worker_extra_get(pcity, cindex, pextra);
-
-        if (road_provides_move_bonus(proad)) {
+        bool consider = TRUE;
+        struct road_type *proad;
+
+        /* Do not request activities that already are under way. */
+        unit_list_iterate(ptile->units, punit) {
+          if (unit_owner(punit) == pplayer
+              && unit_has_type_flag(punit, UTYF_SETTLERS)
+              && punit->activity == act) {
+            consider = FALSE;
+            break;
+          }
+        } unit_list_iterate_end;
+
+        if (!consider) {
+          continue;
+        }
+
+        proad = extra_road_get(tgt);
+
+        value = adv_city_worker_extra_get(pcity, cindex, tgt);
+
+        if (proad != NULL && road_provides_move_bonus(proad)) {
           int old_move_cost;
           int mc_multiplier = 1;
           int mc_divisor = 1;
@@ -250,8 +267,8 @@
           if ((value - orig_value) * TWMP > worked.want) {
             worked.want  = TWMP * (value - orig_value);
             worked.ptile = ptile;
-            worked.act   = ACTIVITY_GEN_ROAD;
-            worked.tgt   = NULL;
+            worked.act   = act;
+            worked.tgt   = tgt;
           }
           if (value > old_worst_worked) {
             /* After improvement it would not be the worst */
@@ -264,56 +281,12 @@
             uw_max = value;
             unworked.want  = TWMP * (value - orig_value);
             unworked.ptile = ptile;
-            unworked.act   = ACTIVITY_GEN_ROAD;
-            unworked.tgt   = NULL;
+            unworked.act   = act;
+            unworked.tgt   = tgt;
           }
         }
       }
-    } road_type_iterate_end;
-
-    base_type_iterate(pbase) {
-      bool possible = FALSE;
-
-      unit_list_iterate(units, punit) {
-        struct extra_type *tgt = base_extra_get(pbase);
-
-        if (can_unit_do_activity_targeted_at(punit, ACTIVITY_BASE, tgt, 
ptile)) {
-          possible = TRUE;
-          break;
-        }
-      } unit_list_iterate_end;
-
-      if (possible) {
-        int value;
-        struct extra_type *pextra;
-
-        pextra = base_extra_get(pbase);
-        value = adv_city_worker_extra_get(pcity, cindex, pextra);
-
-        if (tile_worked(ptile) == pcity) {
-          if ((value - orig_value) * TWMP > worked.want) {
-            worked.want  = TWMP * (value - orig_value);
-            worked.ptile = ptile;
-            worked.act   = ACTIVITY_BASE;
-            worked.tgt   = NULL;
-          }
-          if (value > old_worst_worked) {
-            /* After improvement it would not be the worst */
-            potential_worst_worked = FALSE;
-          } else {
-            worst_worked = value;
-          }
-        } else {
-          if (value > orig_value && value > uw_max) {
-            uw_max = value;
-            unworked.want  = TWMP * (value - orig_value);
-            unworked.ptile = ptile;
-            unworked.act   = ACTIVITY_BASE;
-            unworked.tgt   = NULL;
-          }
-        }
-      }
-    } base_type_iterate_end;
+    } extra_type_iterate_end;
 
     if (potential_worst_worked) {
       /* Would still be worst worked even if we improved *it*. */

Modified: trunk/common/extras.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/extras.c?rev=27692&r1=27691&r2=27692&view=diff
==============================================================================
--- trunk/common/extras.c       (original)
+++ trunk/common/extras.c       Thu Jan 15 06:24:26 2015
@@ -709,6 +709,15 @@
 }
 
 /**************************************************************************
+  Is the extra caused by specific worker action?
+**************************************************************************/
+bool is_extra_caused_by_action(const struct extra_type *pextra,
+                               enum unit_activity act)
+{
+  return is_extra_caused_by(pextra, activity_to_extra_cause(act));
+}
+
+/**************************************************************************
   What extra cause activity is considered to be?
 **************************************************************************/
 enum extra_cause activity_to_extra_cause(enum unit_activity act)

Modified: trunk/common/extras.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/extras.h?rev=27692&r1=27691&r2=27692&view=diff
==============================================================================
--- trunk/common/extras.h       (original)
+++ trunk/common/extras.h       Thu Jan 15 06:24:26 2015
@@ -145,6 +145,8 @@
 
 bool is_extra_caused_by(const struct extra_type *pextra, enum extra_cause 
cause);
 bool is_extra_caused_by_worker_action(const struct extra_type *pextra);
+bool is_extra_caused_by_action(const struct extra_type *pextra,
+                               enum unit_activity act);
 
 void extra_to_removed_by_list(struct extra_type *pextra, enum extra_rmcause 
rmcause);
 struct extra_type_list *extra_type_list_by_rmcause(enum extra_rmcause rmcause);

Modified: trunk/server/advisors/autosettlers.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/advisors/autosettlers.c?rev=27692&r1=27691&r2=27692&view=diff
==============================================================================
--- trunk/server/advisors/autosettlers.c        (original)
+++ trunk/server/advisors/autosettlers.c        Thu Jan 15 06:24:26 2015
@@ -73,6 +73,7 @@
 };
 
 Activity_type_id as_activities_transform[ACTIVITY_LAST];
+Activity_type_id as_activities_extra[ACTIVITY_LAST];
 
 /**************************************************************************
   Initialize advisor systems.
@@ -91,6 +92,13 @@
   as_activities_transform[i++] = ACTIVITY_FALLOUT;
 
   as_activities_transform[i++] = ACTIVITY_LAST;
+
+  i = 0;
+  as_activities_extra[i++] = ACTIVITY_IRRIGATE;
+  as_activities_extra[i++] = ACTIVITY_MINE;
+  as_activities_extra[i++] = ACTIVITY_GEN_ROAD;
+  as_activities_extra[i++] = ACTIVITY_BASE;
+  as_activities_extra[i++] = ACTIVITY_LAST;
 }
 
 /**************************************************************************

Modified: trunk/server/advisors/autosettlers.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/advisors/autosettlers.h?rev=27692&r1=27691&r2=27692&view=diff
==============================================================================
--- trunk/server/advisors/autosettlers.h        (original)
+++ trunk/server/advisors/autosettlers.h        Thu Jan 15 06:24:26 2015
@@ -69,4 +69,14 @@
   activity_type_list_iterate_end                                            \
 }
 
+extern Activity_type_id as_activities_extra[ACTIVITY_LAST];
+
+#define as_extra_activity_iterate(_act_)                                    \
+{                                                                           \
+  activity_type_list_iterate(as_activities_extra, _act_)
+
+#define as_extra_activity_iterate_end                                       \
+  activity_type_list_iterate_end                                            \
+}
+
 #endif   /* FC__AUTOSETTLERS_H */


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

Reply via email to