Author: sveinung
Date: Wed Dec  3 21:48:25 2014
New Revision: 27169

URL: http://svn.gna.org/viewcvs/freeciv?rev=27169&view=rev
Log:
AI: Don't try to establish a trade route with a unit that can't do it.

A unit may be unable to establish a trade route even if its unit type has the
TradeRoute flag since the action may be disabled. Don't try to establish a trade
route where it is illegal because of action enablers.

Reported by Marko Lindqvist <cazfi>

See bug #23005

Modified:
    trunk/ai/default/aiunit.c

Modified: trunk/ai/default/aiunit.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/ai/default/aiunit.c?rev=27169&r1=27168&r2=27169&view=diff
==============================================================================
--- trunk/ai/default/aiunit.c   (original)
+++ trunk/ai/default/aiunit.c   Wed Dec  3 21:48:25 2014
@@ -1932,7 +1932,8 @@
                TILE_XY(unit_tile(punit)),
                city_name(dest_city));
       handle_unit_help_build_wonder(pplayer, punit->id, dest_city->id);
-    } else {
+    } else if (is_action_enabled_unit_on_city(ACTION_TRADE_ROUTE,
+                                              punit, dest_city)) {
       log_base(LOG_CARAVAN, "%s %s[%d](%d,%d) creates trade route in %s",
                nation_rule_name(nation_of_unit(punit)),
                unit_rule_name(punit),
@@ -1941,6 +1942,13 @@
                city_name(dest_city));
       handle_unit_do_action(pplayer, punit->id, dest_city->id,
                             0, ACTION_TRADE_ROUTE);
+    } else {
+      log_base(LOG_NORMAL, "%s %s[%d](%d,%d) unable to trade with %s",
+               nation_rule_name(nation_of_unit(punit)),
+               unit_rule_name(punit),
+               punit->id,
+               TILE_XY(unit_tile(punit)),
+               city_name(dest_city));
     }
   }
 }
@@ -2112,7 +2120,8 @@
 
   CHECK_UNIT(punit);
 
-  if (!unit_has_type_flag(punit, UTYF_TRADE_ROUTE) &&
+  /* FIXME: Support the Enter Marketplace action. */
+  if (!unit_can_do_action(punit, ACTION_TRADE_ROUTE) &&
       !unit_has_type_flag(punit, UTYF_HELP_WONDER)) {
     /* we only want units that can establish trade or help build wonders */
     return;
@@ -2150,7 +2159,11 @@
                  && can_establish_trade_route(homecity, city_dest)))
         || (unit_data->task == AIUNIT_WONDER
             && city_dest->production.kind == VUT_IMPROVEMENT
-            && !is_wonder(city_dest->production.value.building))) {
+            && !is_wonder(city_dest->production.value.building))
+        || (unit_data->task == AIUNIT_TRADE
+            && real_map_distance(city_dest->tile, unit_tile(punit)) <= 1
+            && !is_action_enabled_unit_on_city(ACTION_TRADE_ROUTE,
+                                               punit, city_dest))) {
       /* destination invalid! */
       dai_unit_new_task(ait, punit, AIUNIT_NONE, NULL);
       log_base(LOG_CARAVAN2, "%s %s[%d](%d,%d) destination invalid!",
@@ -2497,7 +2510,7 @@
             ||unit_has_type_flag(punit, UTYF_CITIES)) {
     dai_manage_settler(ait, pplayer, punit);
     return;
-  } else if (unit_has_type_flag(punit, UTYF_TRADE_ROUTE)
+  } else if (unit_can_do_action(punit, ACTION_TRADE_ROUTE)
              || unit_has_type_flag(punit, UTYF_HELP_WONDER)) {
     TIMING_LOG(AIT_CARAVAN, TIMER_START);
     dai_manage_caravan(ait, pplayer, punit);


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

Reply via email to