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