Project

General

Profile

Feature #181 » 0021-Unhardcode-wld.map-from-citymindist_prevents_city_on.patch

S3_1 - Marko Lindqvist, 01/14/2024 05:32 PM

View differences:

common/actions.c
return TRI_NO;
}
if (citymindist_prevents_city_on_tile(target->tile)) {
if (citymindist_prevents_city_on_tile(nmap, target->tile)) {
if (omniscient) {
/* No need to check again. */
return TRI_NO;
common/city.c
Returns TRUE iff it is illegal to found a city on the specified tile
because of citymindist.
**************************************************************************/
bool citymindist_prevents_city_on_tile(const struct tile *ptile)
bool citymindist_prevents_city_on_tile(const struct civ_map *nmap,
const struct tile *ptile)
{
/* citymindist minimum is 1, meaning adjacent is okay */
int citymindist = game.info.citymindist;
square_iterate(&(wld.map), ptile, citymindist - 1, ptile1) {
square_iterate(nmap, ptile, citymindist - 1, ptile1) {
if (tile_city(ptile1)) {
return TRUE;
}
......
{
struct civ_map *nmap = &(wld.map);
if (!city_can_be_built_tile_only(ptile)) {
if (!city_can_be_built_tile_only(nmap, ptile)) {
return FALSE;
}
......
It may still be illegal for any unit to build a city at the specified
tile.
**************************************************************************/
bool city_can_be_built_tile_only(const struct tile *ptile)
bool city_can_be_built_tile_only(const struct civ_map *nmap,
const struct tile *ptile)
{
if (terrain_has_flag(tile_terrain(ptile), TER_NO_CITIES)) {
/* No cities on this terrain. */
return FALSE;
}
if (citymindist_prevents_city_on_tile(ptile)) {
if (citymindist_prevents_city_on_tile(nmap, ptile)) {
return FALSE;
}
common/city.h
const struct tile *ptile);
bool city_can_work_tile(const struct city *pcity, const struct tile *ptile);
bool citymindist_prevents_city_on_tile(const struct tile *ptile);
bool citymindist_prevents_city_on_tile(const struct civ_map *nmap,
const struct tile *ptile);
bool city_can_be_built_here(const struct tile *ptile,
const struct unit *punit,
bool hut_test);
bool city_can_be_built_tile_only(const struct tile *ptile);
bool city_can_be_built_tile_only(const struct civ_map *nmap,
const struct tile *ptile);
/* List functions */
struct city *city_list_find_number(struct city_list *This, int id);
server/unithand.c
explnat->kind = ANEK_CITY_NO_CAPACITY;
explnat->capacity_city = game_city_by_number(target_city->id);
} else if (action_has_result_safe(paction, ACTRES_FOUND_CITY)
&& citymindist_prevents_city_on_tile(target_tile)) {
&& citymindist_prevents_city_on_tile(nmap, target_tile)) {
explnat->kind = ANEK_CITY_TOO_CLOSE_TGT;
} else if ((action_has_result_safe(paction, ACTRES_PARADROP_CONQUER)
|| action_has_result_safe(paction, ACTRES_PARADROP))
......
struct ane_expl *explnat = expl_act_not_enabl(punit, ACTION_ANY,
target_tile,
target_city, target_unit);
const struct civ_map *nmap = &(wld.map);
switch (explnat->kind) {
case ANEK_ACTOR_UNIT:
......
if (!utype_can_do_act_when_ustate(unit_type_get(punit),
ACTION_ANY, USP_LIVABLE_TILE,
FALSE)
&& !can_unit_exist_at_tile(&(wld.map), punit, unit_tile(punit))) {
&& !can_unit_exist_at_tile(nmap, punit, unit_tile(punit))) {
unit_type_iterate(utype) {
if (utype_can_do_act_when_ustate(utype, ACTION_ANY,
USP_LIVABLE_TILE, FALSE)) {
(2-2/2)