Bug #872 » 0034-Check-get_discounted_reward-return-value.patch
| common/aicore/caravan.c | ||
|---|---|---|
|
#include "caravan.h"
|
||
|
static void caravan_result_init(struct caravan_result *result,
|
||
|
const struct city *src,
|
||
|
const struct city *dest,
|
||
|
int arrival_time)
|
||
|
fc__attribute((nonnull(2)));
|
||
|
/************************************************************************//**
|
||
|
Create a valid parameter with default values.
|
||
|
****************************************************************************/
|
||
| ... | ... | |
|
/************************************************************************//**
|
||
|
Initialize the result to go from src to dest with the given amount
|
||
|
of time. This is useful for calling get_discounted_reward and the such.
|
||
|
of time. This is useful for calling get_discounted_reward() and the such.
|
||
|
****************************************************************************/
|
||
|
static void caravan_result_init(struct caravan_result *result,
|
||
|
const struct city *src,
|
||
| ... | ... | |
|
} else if (a->value < b->value) {
|
||
|
return -1;
|
||
|
} else {
|
||
|
/* faster time is better, so reverse-sort on time. */
|
||
|
/* Faster time is better, so reverse-sort on time. */
|
||
|
return b->arrival_time - a->arrival_time ;
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
pcity = tile_city(pos.tile);
|
||
|
if (pcity && callback(nmap, callback_data, pcity, turns_before + pos.turn,
|
||
|
pos.moves_left)) {
|
||
|
if (pcity != NULL
|
||
|
&& callback(nmap, callback_data, pcity, turns_before + pos.turn,
|
||
|
pos.moves_left)) {
|
||
|
break;
|
||
|
}
|
||
|
} pf_map_positions_iterate_end;
|
||
| ... | ... | |
|
struct goods_type *pgood;
|
||
|
const struct civ_map *nmap = &(wld.map);
|
||
|
/* if no foreign trade is allowed, just quit. */
|
||
|
/* If no foreign trade is allowed, just quit. */
|
||
|
if (!does_foreign_trade_param_allow(parameter, pplayer_src, pplayer_dest)) {
|
||
|
caravan_result_init_zero(result);
|
||
|
return FALSE;
|
||
| ... | ... | |
|
if ((consider_trade
|
||
|
|| (consider_windfall
|
||
|
&& (!parameter->consider_trade /* can only enter marketplaces */
|
||
|
&& (!parameter->consider_trade /* Can only enter marketplaces */
|
||
|
/* (FIXME: test any extra restrictions for trade routes) */
|
||
|
/* or the result is so big that we are still in plus */
|
||
|
/* (consider having produced IF_GOLD instead) */
|
||
| ... | ... | |
|
if (does_foreign_trade_param_allow(param, src_owner, dest_owner)) {
|
||
|
city_list_iterate(dest_owner->cities, dest) {
|
||
|
caravan_result_init(¤t, pcity, dest, 0);
|
||
|
get_discounted_reward(caravan, param, ¤t);
|
||
|
if (caravan_result_compare(¤t, best) > 0) {
|
||
|
if (get_discounted_reward(caravan, param, ¤t)
|
||
|
&& caravan_result_compare(¤t, best) > 0) {
|
||
|
*best = current;
|
||
|
}
|
||
|
} city_list_iterate_end;
|
||
| ... | ... | |
|
caravan_result_init(¤t, data->best->src, dest, arrival_time);
|
||
|
get_discounted_reward(data->caravan, data->param, ¤t);
|
||
|
if (caravan_result_compare(¤t, data->best) > 0) {
|
||
|
if (get_discounted_reward(data->caravan, data->param, ¤t)
|
||
|
&& caravan_result_compare(¤t, data->best) > 0) {
|
||
|
*data->best = current;
|
||
|
}
|
||
|
return FALSE; /* don't stop. */
|
||
|
return FALSE; /* Don't stop. */
|
||
|
}
|
||
|
/************************************************************************//**
|
||