Feature #594 » 0035-Unhardcode-wld.map-from-can_city_build_unit_direct.patch
ai/default/daimilitary.c | ||
---|---|---|
if (dai_can_unit_type_follow_unit_type(punittype, orig_utype, ait)
|
||
&& is_native_near_tile(&(wld.map), utype_class(punittype), ptile)
|
||
&& (U_NOT_OBSOLETED == punittype->obsoleted_by
|
||
|| !can_city_build_unit_direct(pcity, punittype->obsoleted_by))
|
||
&& punittype->attack_strength > 0 /* or we'll get SIGFPE */) {
|
||
|| !can_city_build_unit_direct(nmap, pcity, punittype->obsoleted_by))
|
||
&& punittype->attack_strength > 0 /* Or we'll get SIGFPE */) {
|
||
/* Values to be computed */
|
||
adv_want desire;
|
||
adv_want want;
|
common/aicore/aisupport.c | ||
---|---|---|
struct player *pplayer = city_owner(pcity);
|
||
int worth = 0, i;
|
||
struct unit_type *u = NULL;
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (!game.scenario.prevent_new_cities) {
|
||
u = best_role_unit_for_player(city_owner(pcity),
|
||
... | ... | |
}
|
||
if (u != NULL) {
|
||
worth += utype_buy_gold_cost(pcity, u, 0); /* cost of settler */
|
||
worth += utype_buy_gold_cost(pcity, u, 0); /* Cost of settler */
|
||
}
|
||
for (i = 1; i < city_size_get(pcity); i++) {
|
||
worth += city_granary_size(i); /* cost of growing city */
|
||
worth += city_granary_size(i); /* Cost of growing city */
|
||
}
|
||
output_type_iterate(o) {
|
||
worth += pcity->prod[o] * 10;
|
||
... | ... | |
if (same_pos(unit_tile(punit), pcity->tile)) {
|
||
const struct unit_type *punittype = unit_type_get(punit)->obsoleted_by;
|
||
if (punittype && can_city_build_unit_direct(pcity, punittype)) {
|
||
/* obsolete, candidate for disbanding */
|
||
if (punittype && can_city_build_unit_direct(nmap, pcity, punittype)) {
|
||
/* Obsolete, candidate for disbanding */
|
||
worth += unit_shield_value(punit, unit_type_get(punit),
|
||
action_by_number(ACTION_DISBAND_UNIT_RECOVER));
|
||
} else {
|
||
worth += unit_build_shield_cost(pcity, punit); /* good stuff */
|
||
worth += unit_build_shield_cost(pcity, punit); /* Good stuff */
|
||
}
|
||
}
|
||
} unit_list_iterate_end;
|
||
city_built_iterate(pcity, pimprove) {
|
||
if (improvement_obsolete(pplayer, pimprove, pcity)) {
|
||
worth += impr_sell_gold(pimprove); /* obsolete, candidate for selling */
|
||
worth += impr_sell_gold(pimprove); /* Obsolete, candidate for selling */
|
||
} else if (!is_wonder(pimprove)) {
|
||
/* Buy cost, with nonzero shield amount */
|
||
worth += impr_build_shield_cost(pcity, pimprove) * 2;
|
||
... | ... | |
if (city_unhappy(pcity)) {
|
||
worth *= 0.75;
|
||
}
|
||
return worth;
|
||
}
|
common/city.c | ||
---|---|---|
Return whether given city can build given unit, ignoring whether unit
|
||
is obsolete.
|
||
**************************************************************************/
|
||
bool can_city_build_unit_direct(const struct city *pcity,
|
||
bool can_city_build_unit_direct(const struct civ_map *nmap,
|
||
const struct city *pcity,
|
||
const struct unit_type *punittype)
|
||
{
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (!can_player_build_unit_direct(city_owner(pcity), punittype)) {
|
||
return FALSE;
|
||
}
|
||
... | ... | |
obsolete.
|
||
**************************************************************************/
|
||
bool can_city_build_unit_now(const struct city *pcity,
|
||
const struct unit_type *punittype)
|
||
{
|
||
if (!can_city_build_unit_direct(pcity, punittype)) {
|
||
const struct unit_type *punittype)
|
||
{
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (!can_city_build_unit_direct(nmap, pcity, punittype)) {
|
||
return FALSE;
|
||
}
|
||
while ((punittype = punittype->obsoleted_by) != U_NOT_OBSOLETED) {
|
||
if (can_player_build_unit_direct(city_owner(pcity), punittype)) {
|
||
return FALSE;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
... | ... | |
bool can_city_build_direct(const struct city *pcity,
|
||
const struct universal *target)
|
||
{
|
||
const struct civ_map *nmap = &(wld.map);
|
||
switch (target->kind) {
|
||
case VUT_UTYPE:
|
||
return can_city_build_unit_direct(pcity, target->value.utype);
|
||
return can_city_build_unit_direct(nmap, pcity, target->value.utype);
|
||
case VUT_IMPROVEMENT:
|
||
return can_city_build_improvement_direct(pcity, target->value.building);
|
||
default:
|
||
... | ... | |
**************************************************************************/
|
||
void city_choose_build_default(struct city *pcity)
|
||
{
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (NULL == city_tile(pcity)) {
|
||
/* When a "dummy" city is created with no tile, then choosing a build
|
||
* target could fail. This currently might happen during map editing.
|
||
* target could fail. This currently might happen during map editing.
|
||
* FIXME: assumes the first unit is always "valid", so check for
|
||
* obsolete units elsewhere. */
|
||
pcity->production.kind = VUT_UTYPE;
|
||
... | ... | |
if (!found) {
|
||
unit_type_iterate(punittype) {
|
||
if (can_city_build_unit_direct(pcity, punittype)) {
|
||
if (can_city_build_unit_direct(nmap, pcity, punittype)) {
|
||
#ifndef FREECIV_NDEBUG
|
||
/* Later than this, 'found' is only needed in an fc_assert() */
|
||
found = TRUE;
|
common/city.h | ||
---|---|---|
bool city_rapture_grow(const struct city *pcity);
|
||
bool city_is_occupied(const struct city *pcity);
|
||
/* city related improvement and unit functions */
|
||
/* City related improvement and unit functions */
|
||
int city_improvement_upkeep(const struct city *pcity,
|
||
const struct impr_type *pimprove);
|
||
... | ... | |
bool can_city_build_improvement_now(const struct city *pcity,
|
||
const struct impr_type *pimprove);
|
||
bool can_city_build_unit_direct(const struct city *pcity,
|
||
bool can_city_build_unit_direct(const struct civ_map *nmap,
|
||
const struct city *pcity,
|
||
const struct unit_type *punittype);
|
||
bool can_city_build_unit_later(const struct city *pcity,
|
||
const struct unit_type *punittype);
|
||
... | ... | |
void city_choose_build_default(struct city *pcity);
|
||
/* textual representation of buildings */
|
||
/* Textual representation of buildings */
|
||
const char *city_improvement_name_translation(const struct city *pcity,
|
||
const struct impr_type *pimprove);
|
||
const char *city_production_name_translation(const struct city *pcity);
|
||
/* city map functions */
|
||
/* City map functions */
|
||
bool is_valid_city_coords(const int city_radius_sq, const int city_map_x,
|
||
const int city_map_y);
|
||
bool city_map_includes_tile(const struct city *const pcity,
|
server/cityturn.c | ||
---|---|---|
.player = pplayer,
|
||
.city = pcity,
|
||
.tile = city_tile(pcity)
|
||
/* FIXME: Setting .unittype is currently redundant
|
||
* but can_city_build_unit_direct() does it */
|
||
/* FIXME: Setting .unittype is currently redundant,
|
||
* but can_city_build_unit_direct() does it */
|
||
};
|
||
bool purge = FALSE;
|
||
bool known = FALSE;
|
||
... | ... | |
{
|
||
const struct unit_type *check = punittype;
|
||
const struct unit_type *best_upgrade = U_NOT_OBSOLETED;
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (!can_city_build_unit_direct(pcity, punittype)) {
|
||
if (!can_city_build_unit_direct(nmap, pcity, punittype)) {
|
||
return U_NOT_OBSOLETED;
|
||
}
|
||
while ((check = check->obsoleted_by) != U_NOT_OBSOLETED) {
|
||
if (can_city_build_unit_direct(pcity, check)) {
|
||
if (can_city_build_unit_direct(nmap, pcity, check)) {
|
||
best_upgrade = check;
|
||
}
|
||
}
|
||
... | ... | |
{
|
||
const struct unit_type *producing = pcity->production.value.utype;
|
||
const struct unit_type *upgrading = unit_upgrades_to(pcity, producing);
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (upgrading && can_city_build_unit_direct(pcity, upgrading)) {
|
||
if (upgrading && can_city_build_unit_direct(nmap, pcity, upgrading)) {
|
||
notify_player(city_owner(pcity), city_tile(pcity),
|
||
E_UNIT_UPGRADED, ftc_server,
|
||
_("Production of %s is upgraded to %s in %s."),
|
||
... | ... | |
struct worklist *pwl = &pcity->worklist;
|
||
int unit_shield_cost, num_units, i;
|
||
int saved_city_id = pcity->id;
|
||
const struct civ_map *nmap = &(wld.map);
|
||
fc_assert_ret_val(pcity->production.kind == VUT_UTYPE, FALSE);
|
||
... | ... | |
/* We must make a special case for barbarians here, because they are
|
||
so dumb. Really. They don't know the prerequisite techs for units
|
||
they build!! - Per */
|
||
if (!can_city_build_unit_direct(pcity, utype)
|
||
if (!can_city_build_unit_direct(nmap, pcity, utype)
|
||
&& !is_barbarian(pplayer)) {
|
||
notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server,
|
||
_("%s is building %s, which is no longer available."),
|
- « Previous
- 1
- 2
- Next »