Project

General

Profile

Feature #1617 » 0073-Do-not-reset-foodbox-when-city-grows-for-reasons-oth.patch

Marko Lindqvist, 07/21/2025 03:16 AM

View differences:

server/cityturn.c
calls to this function at once, and those actions are needed only once.
If s is not supplied, adds a specialist respecting the city preferences
**************************************************************************/
static bool city_increase_size(struct city *pcity, Specialist_type_id sid)
static bool city_increase_size(struct city *pcity, bool natural_growth,
Specialist_type_id sid)
{
int new_food;
int savings_pct = city_growth_granary_savings(pcity);
......
struct player *powner = city_owner(pcity);
const struct impr_type *pimprove = pcity->production.value.building;
const struct civ_map *nmap = &(wld.map);
int stock;
int granary;
if (!city_can_grow_to(pcity, city_size_get(pcity) + 1)) {
/* Need improvement */
......
return FALSE;
}
granary = city_granary_size(city_size_get(pcity));
if (pcity->food_stock <= granary) {
stock = 0;
} else {
stock = pcity->food_stock - granary;
}
if (natural_growth) {
/* Growth by filled foodbox */
int stock;
int granary;
granary = city_granary_size(city_size_get(pcity));
if (pcity->food_stock <= granary) {
stock = 0;
} else {
stock = pcity->food_stock - granary;
}
city_size_add(pcity, 1);
city_size_add(pcity, 1);
/* Do not empty food stock if city is growing by celebrating */
if (rapture_grow) {
new_food = city_granary_size(city_size_get(pcity));
/* Do not empty food stock if city is growing by celebrating */
if (rapture_grow) {
new_food = city_granary_size(city_size_get(pcity));
} else {
new_food = stock + city_granary_size(city_size_get(pcity)) * savings_pct / 100;
}
/* Never increase amount of food in the foodbox */
pcity->food_stock = MIN(pcity->food_stock, new_food);
} else {
new_food = stock + city_granary_size(city_size_get(pcity)) * savings_pct / 100;
/* Growth by means like add-to-city or population migration */
city_size_add(pcity, 1);
new_food = city_granary_size(city_size_get(pcity)) * savings_pct / 100;
/* Preserve old food stock, unless granary effect gives us more. */
pcity->food_stock = MAX(pcity->food_stock, new_food);
}
pcity->food_stock = MIN(pcity->food_stock, new_food);
if (sid >= 0) {
fc_assert_action(is_normal_specialist_id(sid), sid = DEFAULT_SPECIALIST);
......
city_tile_iterate_skip_free_worked(nmap, city_map_radius_sq_get(pcity), pcenter,
ptile, _index, _x, _y) {
if (tile_worked(ptile) != pcity /* Quick test */
&& city_can_work_tile(pcity, ptile)) {
&& city_can_work_tile(pcity, ptile)) {
have_square = TRUE;
}
} city_tile_iterate_skip_free_worked_end;
......
int id = pcity->id;
/* Increase city size until size reached, or increase fails */
while (size > current_size && city_increase_size(pcity, sid)) {
while (size > current_size && city_increase_size(pcity, FALSE, sid)) {
/* TODO: This is currently needed only because there's
* deprecated script signal "city_growth" emitted.
* Check the need after signal has been dropped completely. */
......
} else {
bool success;
success = city_increase_size(pcity, -1);
success = city_increase_size(pcity, TRUE, -1);
map_claim_border(pcity->tile, pcity->owner, -1);
if (success) {
......
/* Increase size of receiver city */
if (city_exist(to_id)) {
bool incr_success = city_increase_size(pcity_to, -1);
bool incr_success = city_increase_size(pcity_to, FALSE, -1);
if (city_exist(to_id)) {
city_refresh_after_city_size_increase(pcity_to, pplayer_citizen, TRUE);
server/unithand.c
int amount = unit_pop_value(punit);
const struct unit_type *act_utype;
Specialist_type_id spec_id = DEFAULT_SPECIALIST;
int new_food;
int savings_pct = city_growth_granary_savings(pcity);
/* Sanity check: The actor is still alive. */
fc_assert_ret_val(punit, FALSE);
......
fc_assert_ret_val(pcity, FALSE);
city_size_add(pcity, amount);
new_food = city_granary_size(city_size_get(pcity)) * savings_pct / 100;
/* Preserve old food stock, unless granary effect gives us more. */
pcity->food_stock = MAX(pcity->food_stock, new_food);
if (is_super_specialist(act_utype->spec_type)) {
Specialist_type_id sspec = specialist_index(act_utype->spec_type);
(3-3/3)