Author: cazfi Date: Sat Aug 6 09:45:31 2016 New Revision: 33464 URL: http://svn.gna.org/viewcvs/freeciv?rev=33464&view=rev Log: Fixed AI caravans from thinking that if mission of one type is possible, any mission is possible.
See bug #24662 Modified: trunk/common/aicore/caravan.c Modified: trunk/common/aicore/caravan.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/common/aicore/caravan.c?rev=33464&r1=33463&r2=33464&view=diff ============================================================================== --- trunk/common/aicore/caravan.c (original) +++ trunk/common/aicore/caravan.c Sat Aug 6 09:45:31 2016 @@ -470,6 +470,9 @@ double discount = parameter->discount; struct player *pplayer_src = city_owner(src); struct player *pplayer_dest = city_owner(dest); + bool consider_wonder; + bool consider_trade; + bool consider_windfall; /* if no foreign trade is allowed, just quit. */ if (!does_foreign_trade_param_allow(parameter, pplayer_src, pplayer_dest)) { @@ -485,42 +488,64 @@ * theoretically possible case. (More than one city is rare.) The * computations are therefore worth it. */ - if (!(is_action_enabled_unit_on_city_full(ACTION_HELP_WONDER, - caravan, dest, - src) - || is_action_enabled_unit_on_city_full(ACTION_TRADE_ROUTE, - caravan, dest, - src) - || is_action_enabled_unit_on_city_full(ACTION_MARKETPLACE, - caravan, dest, - src))) { + consider_wonder = is_action_enabled_unit_on_city_full(ACTION_HELP_WONDER, + caravan, dest, + src); + consider_trade = is_action_enabled_unit_on_city_full(ACTION_TRADE_ROUTE, + caravan, dest, + src); + consider_windfall = is_action_enabled_unit_on_city_full(ACTION_MARKETPLACE, + caravan, dest, + src); + if (!consider_wonder && !consider_trade && !consider_windfall) { /* No caravan action is possible against this target. */ caravan_result_init_zero(result); return FALSE; } + } else { + consider_wonder = parameter->consider_wonders; + consider_trade = parameter->consider_trade; + consider_windfall = parameter->consider_windfall; } trade = trade_benefit(pplayer_src, src, dest, parameter); windfall = windfall_benefit(caravan, src, dest, parameter); - wonder = wonder_benefit(caravan, arrival_time, dest, parameter); - /* we want to aid for wonder building */ - wonder *= 2; - - if (parameter->horizon == FC_INFINITY) { - trade = perpetuity(trade, discount); - } else { - trade = annuity(trade, parameter->horizon - arrival_time, discount); - } - trade = presentvalue(trade, arrival_time, discount); - windfall = presentvalue(windfall, arrival_time, discount); - wonder = presentvalue(wonder, arrival_time, discount); - - if (trade + windfall >= wonder) { + if (consider_wonder) { + wonder = wonder_benefit(caravan, arrival_time, dest, parameter); + /* we want to aid for wonder building */ + wonder *= 2; + + wonder = presentvalue(wonder, arrival_time, discount); + } else { + wonder = -1.0; + } + + if (consider_trade) { + if (parameter->horizon == FC_INFINITY) { + trade = perpetuity(trade, discount); + } else { + trade = annuity(trade, parameter->horizon - arrival_time, discount); + } + trade = presentvalue(trade, arrival_time, discount); + } else { + trade = 0.0; + } + + if (consider_windfall) { + windfall = presentvalue(windfall, arrival_time, discount); + } else { + windfall = 0.0; + } + + if (consider_trade && trade + windfall >= wonder) { result->value = trade + windfall; result->help_wonder = FALSE; - } else { + } else if (consider_wonder) { result->value = wonder; result->help_wonder = TRUE; + } else { + caravan_result_init_zero(result); + return FALSE; } if (parameter->callback) { _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits