Feature #948 ยป 0036-Support-unit-requirements-for-Martial_Law_Each.patch
| common/city.c | ||
|---|---|---|
|
**************************************************************************/
|
||
|
static inline void city_support(struct city *pcity)
|
||
|
{
|
||
|
int free_unhappy, martial_law_each;
|
||
|
int free_unhappy;
|
||
|
int max_mart_units;
|
||
|
/* Clear all usage values. */
|
||
|
memset(pcity->usage, 0, O_LAST * sizeof(*pcity->usage));
|
||
| ... | ... | |
|
/* Food consumption by citizens. */
|
||
|
pcity->usage[O_FOOD] += game.info.food_cost * city_size_get(pcity);
|
||
|
/* Military units in this city (need _not_ be home city) can make
|
||
|
* unhappy citizens content */
|
||
|
martial_law_each = get_city_bonus(pcity, EFT_MARTIAL_LAW_EACH);
|
||
|
if (martial_law_each > 0) {
|
||
|
int count = 0;
|
||
|
int martial_law_max = get_city_bonus(pcity, EFT_MARTIAL_LAW_MAX);
|
||
|
max_mart_units = get_city_bonus(pcity, EFT_MARTIAL_LAW_MAX);
|
||
|
if (max_mart_units > 0) {
|
||
|
int best_units[max_mart_units];
|
||
|
int sel_count = 0;
|
||
|
int i;
|
||
|
unit_list_iterate(pcity->tile->units, punit) {
|
||
|
if ((count < martial_law_max || martial_law_max == 0)
|
||
|
&& is_martial_law_unit(punit)
|
||
|
if (is_martial_law_unit(punit)
|
||
|
&& unit_owner(punit) == city_owner(pcity)) {
|
||
|
count++;
|
||
|
int current = get_target_bonus_effects(NULL,
|
||
|
&(const struct req_context) {
|
||
|
.player = city_owner(pcity),
|
||
|
.city = pcity,
|
||
|
.tile = city_tile(pcity),
|
||
|
.unit = punit,
|
||
|
.unittype = unit_type_get(punit)
|
||
|
},
|
||
|
NULL, EFT_MARTIAL_LAW_EACH);
|
||
|
if (current > 0) {
|
||
|
if (sel_count < max_mart_units) {
|
||
|
best_units[sel_count++] = current;
|
||
|
} else if (current > best_units[max_mart_units - 1]) {
|
||
|
for (i = max_mart_units - 1; i >= 0 && current > best_units[i]; i++) {
|
||
|
if (i + 1 < max_mart_units) {
|
||
|
best_units[i + 1] = best_units[i];
|
||
|
}
|
||
|
}
|
||
|
best_units[i + 1] = current;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
pcity->martial_law = CLIP(0, count * martial_law_each, MAX_CITY_SIZE);
|
||
|
pcity->martial_law = 0;
|
||
|
for (i = 0; i < sel_count; i++) {
|
||
|
pcity->martial_law += best_units[i];
|
||
|
}
|
||
|
pcity->martial_law = MIN(pcity->martial_law, MAX_CITY_SIZE);
|
||
|
}
|
||
|
free_unhappy = get_city_bonus(pcity, EFT_MAKE_CONTENT_MIL);
|
||