(svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones

-Codechange: use IsValidXXX where ever possible
  Note: both changes to prepare for new pool system, which needs those changes.
  For every pool there are 2 ugly lines, which will be removed when done
  implementing new pool system.
  Based on FS#13 by blathijs, partly implemented.
replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
truelight 18 years ago
parent 4c2abf1de5
commit 0461d89612

@ -90,7 +90,7 @@ static void AiStateVehLoop(Player *p)
index = (p->ai.cur_veh == NULL) ? 0 : p->ai.cur_veh->index + 1; index = (p->ai.cur_veh == NULL) ? 0 : p->ai.cur_veh->index + 1;
FOR_ALL_VEHICLES_FROM(v, index) { FOR_ALL_VEHICLES_FROM(v, index) {
if (v->type == 0 || v->owner != _current_player) continue; if (v->owner != _current_player) continue;
if ((v->type == VEH_Train && v->subtype == 0) || if ((v->type == VEH_Train && v->subtype == 0) ||
v->type == VEH_Road || v->type == VEH_Road ||
@ -411,7 +411,7 @@ static void AiStateCheckReplaceVehicle(Player *p)
{ {
const Vehicle* v = p->ai.cur_veh; const Vehicle* v = p->ai.cur_veh;
if (v->type == 0 || if (!IsValidVehicle(v) ||
v->owner != _current_player || v->owner != _current_player ||
v->type > VEH_Ship || v->type > VEH_Ship ||
_veh_check_replace_proc[v->type - VEH_Train](p, v) == INVALID_ENGINE) { _veh_check_replace_proc[v->type - VEH_Train](p, v) == INVALID_ENGINE) {
@ -428,7 +428,7 @@ static void AiStateDoReplaceVehicle(Player *p)
p->ai.state = AIS_VEH_LOOP; p->ai.state = AIS_VEH_LOOP;
// vehicle is not owned by the player anymore, something went very wrong. // vehicle is not owned by the player anymore, something went very wrong.
if (v->type == 0 || v->owner != _current_player) return; if (!IsValidVehicle(v) || v->owner != _current_player) return;
_veh_do_replace_proc[v->type - VEH_Train](p); _veh_do_replace_proc[v->type - VEH_Train](p);
} }
@ -442,13 +442,13 @@ typedef struct FoundRoute {
static Town *AiFindRandomTown(void) static Town *AiFindRandomTown(void)
{ {
Town *t = GetTown(RandomRange(_total_towns)); Town *t = GetTown(RandomRange(_total_towns));
return (t->xy != 0) ? t : NULL; return IsValidTown(t) ? t : NULL;
} }
static Industry *AiFindRandomIndustry(void) static Industry *AiFindRandomIndustry(void)
{ {
Industry *i = GetIndustry(RandomRange(_total_industries)); Industry *i = GetIndustry(RandomRange(_total_industries));
return (i->xy != 0) ? i : NULL; return IsValidIndustry(i) ? i : NULL;
} }
static void AiFindSubsidyIndustryRoute(FoundRoute *fr) static void AiFindSubsidyIndustryRoute(FoundRoute *fr)
@ -608,7 +608,7 @@ static bool AiCheckIfRouteIsGood(Player *p, FoundRoute *fr, byte bitmask)
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
int cur; int cur;
if (st->xy == 0 || st->owner != _current_player) continue; if (st->owner != _current_player) continue;
cur = DistanceMax(from_tile, st->xy); cur = DistanceMax(from_tile, st->xy);
if (cur < dist) dist = cur; if (cur < dist) dist = cur;
cur = DistanceMax(to_tile, st->xy); cur = DistanceMax(to_tile, st->xy);
@ -3243,9 +3243,6 @@ static void AiStateAirportStuff(Player *p)
aib = &p->ai.src + i; aib = &p->ai.src + i;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
// Dismiss ghost stations.
if (st->xy == 0) continue;
// Is this an airport? // Is this an airport?
if (!(st->facilities & FACIL_AIRPORT)) continue; if (!(st->facilities & FACIL_AIRPORT)) continue;
@ -3578,7 +3575,7 @@ static void AiStateRemoveStation(Player *p)
// Go through all stations and delete those that aren't in use // Go through all stations and delete those that aren't in use
used = in_use; used = in_use;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && st->owner == _current_player && !*used && if (st->owner == _current_player && !*used &&
( (st->bus_stops != NULL && (tile = st->bus_stops->xy) != 0) || ( (st->bus_stops != NULL && (tile = st->bus_stops->xy) != 0) ||
(st->truck_stops != NULL && (tile = st->truck_stops->xy)) != 0 || (st->truck_stops != NULL && (tile = st->truck_stops->xy)) != 0 ||
(tile = st->train_tile) != 0 || (tile = st->train_tile) != 0 ||

@ -231,8 +231,6 @@ static bool AiNew_Check_City_or_Industry(Player *p, int ic, byte type)
// and sometimes it takes up to 4 months before the stats are corectly. // and sometimes it takes up to 4 months before the stats are corectly.
// This way we don't get 12 busstations in one city of 100 population ;) // This way we don't get 12 busstations in one city of 100 population ;)
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
// Is it an active station
if (st->xy == 0) continue;
// Do we own it? // Do we own it?
if (st->owner == _current_player) { if (st->owner == _current_player) {
// Are we talking busses? // Are we talking busses?
@ -291,9 +289,6 @@ static bool AiNew_Check_City_or_Industry(Player *p, int ic, byte type)
// else we don't do it. This is done, because stat updates can be slow // else we don't do it. This is done, because stat updates can be slow
// and sometimes it takes up to 4 months before the stats are corectly. // and sometimes it takes up to 4 months before the stats are corectly.
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
// Is it an active station
if (st->xy == 0) continue;
// Do we own it? // Do we own it?
if (st->owner == _current_player) { if (st->owner == _current_player) {
// Are we talking trucks? // Are we talking trucks?
@ -620,21 +615,19 @@ static void AiNew_State_FindStation(Player *p)
} }
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0) { if (st->owner == _current_player) {
if (st->owner == _current_player) { if (p->ainew.tbt == AI_BUS && (FACIL_BUS_STOP & st->facilities) == FACIL_BUS_STOP) {
if (p->ainew.tbt == AI_BUS && (FACIL_BUS_STOP & st->facilities) == FACIL_BUS_STOP) { if (st->town == town) {
if (st->town == town) { // Check how much cargo there is left in the station
// Check how much cargo there is left in the station if ((st->goods[p->ainew.cargo].waiting_acceptance & 0xFFF) > RoadVehInfo(i)->capacity * AI_STATION_REUSE_MULTIPLER) {
if ((st->goods[p->ainew.cargo].waiting_acceptance & 0xFFF) > RoadVehInfo(i)->capacity * AI_STATION_REUSE_MULTIPLER) { if (AiNew_CheckVehicleStation(p, st)) {
if (AiNew_CheckVehicleStation(p, st)) { // We did found a station that was good enough!
// We did found a station that was good enough! new_tile = st->xy;
new_tile = st->xy; direction = GetRoadStopDir(st->xy);
direction = GetRoadStopDir(st->xy); break;
break;
}
} }
count++;
} }
count++;
} }
} }
} }
@ -1302,7 +1295,6 @@ static void AiNew_State_CheckAllVehicles(Player *p)
Vehicle *v; Vehicle *v;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == 0) continue;
if (v->owner != p->index) continue; if (v->owner != p->index) continue;
// Currently, we only know how to handle road-vehicles // Currently, we only know how to handle road-vehicles
if (v->type != VEH_Road) continue; if (v->type != VEH_Road) continue;

@ -652,7 +652,7 @@ static void CheckIfAircraftNeedsService(Vehicle *v)
st = GetStation(v->current_order.station); st = GetStation(v->current_order.station);
// only goto depot if the target airport has terminals (eg. it is airport) // only goto depot if the target airport has terminals (eg. it is airport)
if (st->xy != 0 && st->airport_tile != 0 && GetAirport(st->airport_type)->terminals != NULL) { if (IsValidStation(st) && st->airport_tile != 0 && GetAirport(st->airport_type)->terminals != NULL) {
// printf("targetairport = %d, st->index = %d\n", v->u.air.targetairport, st->index); // printf("targetairport = %d, st->index = %d\n", v->u.air.targetairport, st->index);
// v->u.air.targetairport = st->index; // v->u.air.targetairport = st->index;
v->current_order.type = OT_GOTO_DEPOT; v->current_order.type = OT_GOTO_DEPOT;

@ -141,15 +141,13 @@ DEF_CONSOLE_CMD(ConStopAllVehicles)
} }
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (IsValidVehicle(v)) { /* Code ripped from CmdStartStopTrain. Can't call it, because of
/* Code ripped from CmdStartStopTrain. Can't call it, because of * ownership problems, so we'll duplicate some code, for now */
* ownership problems, so we'll duplicate some code, for now */ if (v->type == VEH_Train)
if (v->type == VEH_Train) v->u.rail.days_since_order_progr = 0;
v->u.rail.days_since_order_progr = 0; v->vehstatus |= VS_STOPPED;
v->vehstatus |= VS_STOPPED; InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
}
} }
return true; return true;
} }

@ -202,7 +202,7 @@ static void RunVehicleDayProc(uint daytick)
for (i = daytick; i < total; i += DAY_TICKS) { for (i = daytick; i < total; i += DAY_TICKS) {
Vehicle *v = GetVehicle(i); Vehicle *v = GetVehicle(i);
if (v->type != 0) _on_new_vehicle_day_proc[v->type - 0x10](v); if (IsValidVehicle(v)) _on_new_vehicle_day_proc[v->type - 0x10](v);
} }
} }

@ -21,10 +21,11 @@ enum {
*/ */
static void DepotPoolNewBlock(uint start_item) static void DepotPoolNewBlock(uint start_item)
{ {
Depot *depot; Depot *d;
FOR_ALL_DEPOTS_FROM(depot, start_item) /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
depot->index = start_item++; * TODO - This is just a temporary stage, this will be removed. */
for (d = GetDepot(start_item); d != NULL; d = (d->index + 1 < GetDepotPoolSize()) ? GetDepot(d->index + 1) : NULL) d->index = start_item++;
} }
/* Initialize the town-pool */ /* Initialize the town-pool */
@ -52,16 +53,18 @@ Depot *GetDepotByTile(TileIndex tile)
*/ */
Depot *AllocateDepot(void) Depot *AllocateDepot(void)
{ {
Depot *depot; Depot *d;
FOR_ALL_DEPOTS(depot) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
if (!IsValidDepot(depot)) { * TODO - This is just a temporary stage, this will be removed. */
uint index = depot->index; for (d = GetDepot(0); d != NULL; d = (d->index + 1 < GetDepotPoolSize()) ? GetDepot(d->index + 1) : NULL) {
if (!IsValidDepot(d)) {
uint index = d->index;
memset(depot, 0, sizeof(Depot)); memset(d, 0, sizeof(Depot));
depot->index = index; d->index = index;
return depot; return d;
} }
} }
@ -116,10 +119,8 @@ static void Save_DEPT(void)
Depot *depot; Depot *depot;
FOR_ALL_DEPOTS(depot) { FOR_ALL_DEPOTS(depot) {
if (IsValidDepot(depot)) { SlSetArrayIndex(depot->index);
SlSetArrayIndex(depot->index); SlObject(depot, _depot_desc);
SlObject(depot, _depot_desc);
}
} }
} }

@ -40,7 +40,15 @@ static inline bool IsDepotIndex(uint index)
return index < GetDepotPoolSize(); return index < GetDepotPoolSize();
} }
#define FOR_ALL_DEPOTS_FROM(d, start) for (d = GetDepot(start); d != NULL; d = (d->index + 1 < GetDepotPoolSize()) ? GetDepot(d->index + 1) : NULL) /**
* Check if a depot really exists.
*/
static inline bool IsValidDepot(const Depot* depot)
{
return depot->xy != 0;
}
#define FOR_ALL_DEPOTS_FROM(d, start) for (d = GetDepot(start); d != NULL; d = (d->index + 1 < GetDepotPoolSize()) ? GetDepot(d->index + 1) : NULL) if (IsValidDepot(d))
#define FOR_ALL_DEPOTS(d) FOR_ALL_DEPOTS_FROM(d, 0) #define FOR_ALL_DEPOTS(d) FOR_ALL_DEPOTS_FROM(d, 0)
#define MIN_SERVINT_PERCENT 5 #define MIN_SERVINT_PERCENT 5
@ -58,15 +66,6 @@ static inline Date GetServiceIntervalClamped(uint index)
return (_patches.servint_ispercent) ? clamp(index, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(index, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS); return (_patches.servint_ispercent) ? clamp(index, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(index, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS);
} }
/**
* Check if a depot really exists.
*/
static inline bool IsValidDepot(const Depot* depot)
{
return depot->xy != 0; /* XXX: Replace by INVALID_TILE someday */
}
/** /**
* Check if a tile is a depot of the given type. * Check if a tile is a depot of the given type.
*/ */

@ -724,7 +724,7 @@ static void Disaster0_Init(void)
x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2; x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && st->airport_tile != 0 && if (st->airport_tile != 0 &&
st->airport_type <= 1 && st->airport_type <= 1 &&
IS_HUMAN_PLAYER(st->owner)) { IS_HUMAN_PLAYER(st->owner)) {
x = (TileX(st->xy) + 2) * TILE_SIZE; x = (TileX(st->xy) + 2) * TILE_SIZE;
@ -774,8 +774,7 @@ static void Disaster2_Init(void)
found = NULL; found = NULL;
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy != 0 && if (i->type == IT_OIL_REFINERY &&
i->type == IT_OIL_REFINERY &&
(found == NULL || CHANCE16(1, 2))) { (found == NULL || CHANCE16(1, 2))) {
found = i; found = i;
} }
@ -808,8 +807,7 @@ static void Disaster3_Init(void)
found = NULL; found = NULL;
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy != 0 && if (i->type == IT_FACTORY &&
i->type == IT_FACTORY &&
(found==NULL || CHANCE16(1,2))) { (found==NULL || CHANCE16(1,2))) {
found = i; found = i;
} }
@ -919,7 +917,7 @@ static void Disaster7_Init(void)
const Industry* i; const Industry* i;
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy != 0 && i->type == IT_COAL_MINE && --index < 0) { if (i->type == IT_COAL_MINE && --index < 0) {
SetDParam(0, i->town->index); SetDParam(0, i->town->index);
AddNewsItem(STR_B005_COAL_MINE_SUBSIDENCE_LEAVES, AddNewsItem(STR_B005_COAL_MINE_SUBSIDENCE_LEAVES,
NEWS_FLAGS(NM_THIN,NF_VIEWPORT|NF_TILE,NT_ACCIDENT,0), i->xy + TileDiffXY(1, 1), 0); NEWS_FLAGS(NM_THIN,NF_VIEWPORT|NF_TILE,NT_ACCIDENT,0), i->xy + TileDiffXY(1, 1), 0);

@ -57,7 +57,7 @@ int64 CalculateCompanyValue(const Player* p)
uint num = 0; uint num = 0;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && st->owner == owner) { if (st->owner == owner) {
uint facil = st->facilities; uint facil = st->facilities;
do num += (facil&1); while (facil >>= 1); do num += (facil&1); while (facil >>= 1);
} }
@ -70,8 +70,8 @@ int64 CalculateCompanyValue(const Player* p)
Vehicle *v; Vehicle *v;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->owner != owner) if (v->owner != owner) continue;
continue;
if (v->type == VEH_Train || if (v->type == VEH_Train ||
v->type == VEH_Road || v->type == VEH_Road ||
(v->type == VEH_Aircraft && v->subtype<=2) || (v->type == VEH_Aircraft && v->subtype<=2) ||
@ -133,7 +133,7 @@ int UpdateCompanyRatingAndValue(Player *p, bool update)
const Station* st; const Station* st;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && st->owner == owner) { if (st->owner == owner) {
int facil = st->facilities; int facil = st->facilities;
do num += facil&1; while (facil>>=1); do num += facil&1; while (facil>>=1);
} }
@ -266,7 +266,7 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
Town *t; Town *t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
/* If a player takes over, give the ratings to that player. */ /* If a player takes over, give the ratings to that player. */
if (IsValidTown(t) && HASBIT(t->have_ratings, old_player)) { if (HASBIT(t->have_ratings, old_player)) {
if (HASBIT(t->have_ratings, new_player)) { if (HASBIT(t->have_ratings, new_player)) {
// use max of the two ratings. // use max of the two ratings.
t->ratings[new_player] = max(t->ratings[new_player], t->ratings[old_player]); t->ratings[new_player] = max(t->ratings[new_player], t->ratings[old_player]);
@ -276,11 +276,8 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
} }
} }
/* Reset ratings for the town */ t->ratings[old_player] = 500;
if (IsValidTown(t)) { CLRBIT(t->have_ratings, old_player);
t->ratings[old_player] = 500;
CLRBIT(t->have_ratings, old_player);
}
} }
} }
@ -573,11 +570,9 @@ static void PlayersGenStatistics(void)
Player *p; Player *p;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0) { _current_player = st->owner;
_current_player = st->owner; SET_EXPENSES_TYPE(EXPENSES_PROPERTY);
SET_EXPENSES_TYPE(EXPENSES_PROPERTY); SubtractMoneyFromPlayer(_price.station_value >> 1);
SubtractMoneyFromPlayer(_price.station_value >> 1);
}
} }
if (!HASBIT(1<<0|1<<3|1<<6|1<<9, _cur_month)) if (!HASBIT(1<<0|1<<3|1<<6|1<<9, _cur_month))
@ -888,11 +883,11 @@ static void FindSubsidyPassengerRoute(FoundRoute *fr)
fr->distance = (uint)-1; fr->distance = (uint)-1;
fr->from = from = GetTown(RandomRange(_total_towns)); fr->from = from = GetTown(RandomRange(_total_towns));
if (from->xy == 0 || from->population < 400) if (!IsValidTown(from) || from->population < 400)
return; return;
fr->to = to = GetTown(RandomRange(_total_towns)); fr->to = to = GetTown(RandomRange(_total_towns));
if (from==to || to->xy == 0 || to->population < 400 || to->pct_pass_transported > 42) if (from == to || !IsValidTown(to) || to->population < 400 || to->pct_pass_transported > 42)
return; return;
fr->distance = DistanceManhattan(from->xy, to->xy); fr->distance = DistanceManhattan(from->xy, to->xy);
@ -907,8 +902,7 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
fr->distance = (uint)-1; fr->distance = (uint)-1;
fr->from = i = GetIndustry(RandomRange(_total_industries)); fr->from = i = GetIndustry(RandomRange(_total_industries));
if (i->xy == 0) if (!IsValidIndustry(i)) return;
return;
// Randomize cargo type // Randomize cargo type
if (Random()&1 && i->produced_cargo[1] != CT_INVALID) { if (Random()&1 && i->produced_cargo[1] != CT_INVALID) {
@ -934,8 +928,8 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
Town *t = GetTown(RandomRange(_total_towns)); Town *t = GetTown(RandomRange(_total_towns));
// Only want big towns // Only want big towns
if (t->xy == 0 || t->population < 900) if (!IsValidTown(t) || t->population < 900) return;
return;
fr->distance = DistanceManhattan(i->xy, t->xy); fr->distance = DistanceManhattan(i->xy, t->xy);
fr->to = t; fr->to = t;
} else { } else {
@ -943,7 +937,7 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
Industry *i2 = GetIndustry(RandomRange(_total_industries)); Industry *i2 = GetIndustry(RandomRange(_total_industries));
// The industry must accept the cargo // The industry must accept the cargo
if (i == i2 || i2->xy == 0 || if (i == i2 || !IsValidIndustry(i2) ||
(cargo != i2->accepts_cargo[0] && (cargo != i2->accepts_cargo[0] &&
cargo != i2->accepts_cargo[1] && cargo != i2->accepts_cargo[1] &&
cargo != i2->accepts_cargo[2])) cargo != i2->accepts_cargo[2]))
@ -1113,8 +1107,7 @@ static void DeliverGoodsToIndustry(TileIndex xy, CargoID cargo_type, int num_pie
FOR_ALL_INDUSTRIES(ind) { FOR_ALL_INDUSTRIES(ind) {
uint t; uint t;
if (ind->xy != 0 && ( if (( cargo_type == ind->accepts_cargo[0] ||
cargo_type == ind->accepts_cargo[0] ||
cargo_type == ind->accepts_cargo[1] || cargo_type == ind->accepts_cargo[1] ||
cargo_type == ind->accepts_cargo[2] cargo_type == ind->accepts_cargo[2]
) && ) &&

@ -458,7 +458,7 @@ static inline uint16 GetEngineRenewPoolSize(void)
return _engine_renew_pool.total_items; return _engine_renew_pool.total_items;
} }
#define FOR_ALL_ENGINE_RENEWS_FROM(er, start) for (er = GetEngineRenew(start); er != NULL; er = (er->index + 1 < GetEngineRenewPoolSize()) ? GetEngineRenew(er->index + 1) : NULL) #define FOR_ALL_ENGINE_RENEWS_FROM(er, start) for (er = GetEngineRenew(start); er != NULL; er = (er->index + 1 < GetEngineRenewPoolSize()) ? GetEngineRenew(er->index + 1) : NULL) if (er->from != INVALID_ENGINE)
#define FOR_ALL_ENGINE_RENEWS(er) FOR_ALL_ENGINE_RENEWS_FROM(er, 0) #define FOR_ALL_ENGINE_RENEWS(er) FOR_ALL_ENGINE_RENEWS_FROM(er, 0)
static void EngineRenewPoolNewBlock(uint start_item) static void EngineRenewPoolNewBlock(uint start_item)

@ -1132,10 +1132,8 @@ static void GlobalSortSignList(void)
error("Could not allocate memory for the sign-sorting-list"); error("Could not allocate memory for the sign-sorting-list");
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
if (ss->str != STR_NULL) { _sign_sort[n++] = ss->index;
_sign_sort[n++] = ss->index; _num_sign_sort++;
_num_sign_sort++;
}
} }
qsort(_sign_sort, n, sizeof(_sign_sort[0]), SignNameSorter); qsort(_sign_sort, n, sizeof(_sign_sort[0]), SignNameSorter);

@ -74,9 +74,9 @@ extern MemoryPool _industry_pool;
/** /**
* Check if an Industry really exists. * Check if an Industry really exists.
*/ */
static inline bool IsValidIndustry(Industry* industry) static inline bool IsValidIndustry(const Industry *industry)
{ {
return industry->xy != 0; /* XXX: Replace by INVALID_TILE someday */ return industry->xy != 0;
} }
/** /**
@ -95,7 +95,7 @@ static inline uint16 GetIndustryPoolSize(void)
return _industry_pool.total_items; return _industry_pool.total_items;
} }
#define FOR_ALL_INDUSTRIES_FROM(i, start) for (i = GetIndustry(start); i != NULL; i = (i->index + 1 < GetIndustryPoolSize()) ? GetIndustry(i->index + 1) : NULL) #define FOR_ALL_INDUSTRIES_FROM(i, start) for (i = GetIndustry(start); i != NULL; i = (i->index + 1 < GetIndustryPoolSize()) ? GetIndustry(i->index + 1) : NULL) if (IsValidIndustry(i))
#define FOR_ALL_INDUSTRIES(i) FOR_ALL_INDUSTRIES_FROM(i, 0) #define FOR_ALL_INDUSTRIES(i) FOR_ALL_INDUSTRIES_FROM(i, 0)
VARDEF int _total_industries; // For the AI: the amount of industries active VARDEF int _total_industries; // For the AI: the amount of industries active

@ -38,7 +38,9 @@ static void IndustryPoolNewBlock(uint start_item)
{ {
Industry *i; Industry *i;
FOR_ALL_INDUSTRIES_FROM(i, start_item) i->index = start_item++; /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (i = GetIndustry(start_item); i != NULL; i = (i->index + 1 < GetIndustryPoolSize()) ? GetIndustry(i->index + 1) : NULL) i->index = start_item++;
} }
/* Initialize the industry-pool */ /* Initialize the industry-pool */
@ -1018,7 +1020,7 @@ void OnTick_Industry(void)
if (_game_mode == GM_EDITOR) return; if (_game_mode == GM_EDITOR) return;
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy != 0) ProduceIndustryGoods(i); ProduceIndustryGoods(i);
} }
} }
@ -1141,8 +1143,7 @@ static const Town *CheckMultipleIndustryInTown(TileIndex tile, int type)
if (_patches.multiple_industry_per_town) return t; if (_patches.multiple_industry_per_town) return t;
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy != 0 && if (i->type == (byte)type &&
i->type == (byte)type &&
i->town == t) { i->town == t) {
_error_message = STR_0287_ONLY_ONE_ALLOWED_PER_TOWN; _error_message = STR_0287_ONLY_ONE_ALLOWED_PER_TOWN;
return NULL; return NULL;
@ -1375,8 +1376,7 @@ static bool CheckIfTooCloseToIndustry(TileIndex tile, int type)
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
// check if an industry that accepts the same goods is nearby // check if an industry that accepts the same goods is nearby
if (i->xy != 0 && if (DistanceMax(tile, i->xy) <= 14 &&
DistanceMax(tile, i->xy) <= 14 &&
indspec->accepts_cargo[0] != CT_INVALID && indspec->accepts_cargo[0] != CT_INVALID &&
indspec->accepts_cargo[0] == i->accepts_cargo[0] && ( indspec->accepts_cargo[0] == i->accepts_cargo[0] && (
_game_mode != GM_EDITOR || _game_mode != GM_EDITOR ||
@ -1388,8 +1388,7 @@ static bool CheckIfTooCloseToIndustry(TileIndex tile, int type)
} }
// check "not close to" field. // check "not close to" field.
if (i->xy != 0 && if ((i->type == indspec->conflicting[0] || i->type == indspec->conflicting[1] || i->type == indspec->conflicting[2]) &&
(i->type == indspec->conflicting[0] || i->type == indspec->conflicting[1] || i->type == indspec->conflicting[2]) &&
DistanceMax(tile, i->xy) <= 14) { DistanceMax(tile, i->xy) <= 14) {
_error_message = STR_INDUSTRY_TOO_CLOSE; _error_message = STR_INDUSTRY_TOO_CLOSE;
return false; return false;
@ -1402,17 +1401,19 @@ static Industry *AllocateIndustry(void)
{ {
Industry *i; Industry *i;
FOR_ALL_INDUSTRIES(i) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
if (i->xy == 0) { * TODO - This is just a temporary stage, this will be removed. */
IndustryID index = i->index; for (i = GetIndustry(0); i != NULL; i = (i->index + 1 < GetIndustryPoolSize()) ? GetIndustry(i->index + 1) : NULL) {
IndustryID index = i->index;
if (i->index > _total_industries) _total_industries = i->index; if (IsValidIndustry(i)) continue;
memset(i, 0, sizeof(*i)); if (i->index > _total_industries) _total_industries = i->index;
i->index = index;
return i; memset(i, 0, sizeof(*i));
} i->index = index;
return i;
} }
/* Check if we can add a block to the pool */ /* Check if we can add a block to the pool */
@ -1871,7 +1872,7 @@ void IndustryMonthlyLoop(void)
_current_player = OWNER_NONE; _current_player = OWNER_NONE;
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy != 0) UpdateIndustryStatistics(i); UpdateIndustryStatistics(i);
} }
/* 3% chance that we start a new industry */ /* 3% chance that we start a new industry */
@ -1879,7 +1880,7 @@ void IndustryMonthlyLoop(void)
MaybeNewIndustry(Random()); MaybeNewIndustry(Random());
} else if (!_patches.smooth_economy && _total_industries > 0) { } else if (!_patches.smooth_economy && _total_industries > 0) {
i = GetIndustry(RandomRange(_total_industries)); i = GetIndustry(RandomRange(_total_industries));
if (i->xy != 0) ChangeIndustryProduction(i); if (IsValidIndustry(i)) ChangeIndustryProduction(i);
} }
_current_player = old_player; _current_player = old_player;
@ -1953,10 +1954,8 @@ static void Save_INDY(void)
// Write the vehicles // Write the vehicles
FOR_ALL_INDUSTRIES(ind) { FOR_ALL_INDUSTRIES(ind) {
if (ind->xy != 0) { SlSetArrayIndex(ind->index);
SlSetArrayIndex(ind->index); SlObject(ind, _industry_desc);
SlObject(ind, _industry_desc);
}
} }
} }

@ -561,9 +561,8 @@ static void MakeSortedIndustryList(void)
if (_industry_sort == NULL) if (_industry_sort == NULL)
error("Could not allocate memory for the industry-sorting-list"); error("Could not allocate memory for the industry-sorting-list");
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) _industry_sort[n++] = i;
if (i->xy != 0) _industry_sort[n++] = i;
}
_num_industry_sort = n; _num_industry_sort = n;
_last_industry = NULL; // used for "cache" _last_industry = NULL; // used for "cache"

@ -1569,9 +1569,8 @@ static bool AnyTownExists(void)
{ {
const Town *t; const Town *t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) return true;
if (t->xy != 0) return true;
}
return false; return false;
} }

@ -1514,12 +1514,6 @@ static const char *ChatTabCompletionNextItem(uint *item)
FOR_ALL_TOWNS_FROM(t, *item - MAX_CLIENT_INFO) { FOR_ALL_TOWNS_FROM(t, *item - MAX_CLIENT_INFO) {
int32 temp[1]; int32 temp[1];
/* Skip empty towns */
if (t->xy == 0) {
(*item)++;
continue;
}
/* Get the town-name via the string-system */ /* Get the town-name via the string-system */
temp[0] = t->townnameparts; temp[0] = t->townnameparts;
GetStringWithArgs(chat_tab_temp_buffer, t->townnametype, temp); GetStringWithArgs(chat_tab_temp_buffer, t->townnametype, temp);

@ -792,7 +792,7 @@ NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir,
FOR_ALL_DEPOTS(depot) { FOR_ALL_DEPOTS(depot) {
/* Check if this is really a valid depot, it is of the needed type and /* Check if this is really a valid depot, it is of the needed type and
* owner */ * owner */
if (IsValidDepot(depot) && IsTileDepotType(depot->xy, type) && IsTileOwner(depot->xy, owner)) if (IsTileDepotType(depot->xy, type) && IsTileOwner(depot->xy, owner))
/* If so, let's add it to the queue, sorted by distance */ /* If so, let's add it to the queue, sorted by distance */
depots.push(&depots, depot, DistanceManhattan(tile, depot->xy)); depots.push(&depots, depot, DistanceManhattan(tile, depot->xy));
} }

@ -294,8 +294,6 @@ static void FixOldTowns(void)
/* Convert town-names if needed */ /* Convert town-names if needed */
FOR_ALL_TOWNS(town) { FOR_ALL_TOWNS(town) {
if (town->xy == 0) continue;
if (IS_INT_INSIDE(town->townnametype, 0x20C1, 0x20C3)) { if (IS_INT_INSIDE(town->townnametype, 0x20C1, 0x20C3)) {
town->townnametype = SPECSTR_TOWNNAME_ENGLISH + _opt.town_name; town->townnametype = SPECSTR_TOWNNAME_ENGLISH + _opt.town_name;
town->townnameparts = GetOldTownName(town->townnameparts, _opt.town_name); town->townnameparts = GetOldTownName(town->townnameparts, _opt.town_name);
@ -346,11 +344,7 @@ static void FixOldVehicles(void)
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
Vehicle *u; Vehicle *u;
if (v->type == 0) continue;
FOR_ALL_VEHICLES_FROM(u, v->index + 1) { FOR_ALL_VEHICLES_FROM(u, v->index + 1) {
if (u->type == 0) continue;
/* If a vehicle has the same orders, add the link to eachother /* If a vehicle has the same orders, add the link to eachother
* in both vehicles */ * in both vehicles */
if (v->orders == u->orders) { if (v->orders == u->orders) {
@ -532,7 +526,7 @@ static bool LoadOldDepot(LoadgameState *ls, int num)
if (!LoadChunk(ls, GetDepot(num), depot_chunk)) return false; if (!LoadChunk(ls, GetDepot(num), depot_chunk)) return false;
if (GetDepot(num)->xy != 0) { if (IsValidDepot(GetDepot(num))) {
GetDepot(num)->town_index = REMAP_TOWN_IDX(_old_town_index); GetDepot(num)->town_index = REMAP_TOWN_IDX(_old_town_index);
} }
@ -650,7 +644,7 @@ static bool LoadOldStation(LoadgameState *ls, int num)
if (!LoadChunk(ls, st, station_chunk)) if (!LoadChunk(ls, st, station_chunk))
return false; return false;
if (st->xy != 0) { if (IsValidStation(st)) {
if (st->train_tile) { if (st->train_tile) {
/* Calculate the trainst_w and trainst_h */ /* Calculate the trainst_w and trainst_h */
uint w = GB(_old_platforms, 3, 3); uint w = GB(_old_platforms, 3, 3);
@ -721,7 +715,7 @@ static bool LoadOldIndustry(LoadgameState *ls, int num)
i = GetIndustry(num); i = GetIndustry(num);
if (!LoadChunk(ls, i, industry_chunk)) return false; if (!LoadChunk(ls, i, industry_chunk)) return false;
if (i->xy != 0) { if (IsValidIndustry(i)) {
i->town = GetTown(REMAP_TOWN_IDX(_old_town_index)); i->town = GetTown(REMAP_TOWN_IDX(_old_town_index));
} }

@ -1051,7 +1051,7 @@ static void UpdateExclusiveRights(void)
Town *t; Town *t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) t->exclusivity = (byte)-1; t->exclusivity = (byte)-1;
} }
/* FIXME old exclusive rights status is not being imported (stored in s->blocked_months_obsolete) /* FIXME old exclusive rights status is not being imported (stored in s->blocked_months_obsolete)
@ -1356,7 +1356,7 @@ bool AfterLoadGame(void)
Waypoint *wp; Waypoint *wp;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy != 0 && wp->deleted == 0) { if (wp->deleted == 0) {
const StationSpec *statspec = NULL; const StationSpec *statspec = NULL;
if (HASBIT(_m[wp->xy].m3, 4)) if (HASBIT(_m[wp->xy].m3, 4))
@ -1482,7 +1482,6 @@ bool AfterLoadGame(void)
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
uint j; uint j;
if (i->xy == 0) continue;
if (i->type == IT_FARM || i->type == IT_FARM_2) { if (i->type == IT_FARM || i->type == IT_FARM_2) {
for (j = 0; j != 50; j++) PlantRandomFarmField(i); for (j = 0; j != 50; j++) PlantRandomFarmField(i);
} }

@ -117,7 +117,15 @@ static inline uint16 GetOrderPoolSize(void)
return _order_pool.total_items; return _order_pool.total_items;
} }
#define FOR_ALL_ORDERS_FROM(order, start) for (order = GetOrder(start); order != NULL; order = (order->index + 1 < GetOrderPoolSize()) ? GetOrder(order->index + 1) : NULL) /**
* Check if a Order really exists.
*/
static inline bool IsValidOrder(const Order *o)
{
return o->type != OT_NOTHING;
}
#define FOR_ALL_ORDERS_FROM(order, start) for (order = GetOrder(start); order != NULL; order = (order->index + 1 < GetOrderPoolSize()) ? GetOrder(order->index + 1) : NULL) if (IsValidOrder(order))
#define FOR_ALL_ORDERS(order) FOR_ALL_ORDERS_FROM(order, 0) #define FOR_ALL_ORDERS(order) FOR_ALL_ORDERS_FROM(order, 0)

@ -29,7 +29,9 @@ static void OrderPoolNewBlock(uint start_item)
{ {
Order *order; Order *order;
FOR_ALL_ORDERS_FROM(order, start_item) order->index = start_item++; /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (order = GetOrder(start_item); order != NULL; order = (order->index + 1 < GetOrderPoolSize()) ? GetOrder(order->index + 1) : NULL) order->index = start_item++;
} }
/* Initialize the order-pool */ /* Initialize the order-pool */
@ -112,8 +114,10 @@ static Order *AllocateOrder(void)
{ {
Order *order; Order *order;
FOR_ALL_ORDERS(order) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
if (order->type == OT_NOTHING) { * TODO - This is just a temporary stage, this will be removed. */
for (order = GetOrder(0); order != NULL; order = (order->index + 1 < GetOrderPoolSize()) ? GetOrder(order->index + 1) : NULL) {
if (!IsValidOrder(order)) {
uint index = order->index; uint index = order->index;
memset(order, 0, sizeof(*order)); memset(order, 0, sizeof(*order));
@ -177,7 +181,7 @@ int32 CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsVehicleIndex(veh)) return CMD_ERROR; if (!IsVehicleIndex(veh)) return CMD_ERROR;
v = GetVehicle(veh); v = GetVehicle(veh);
if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR;
/* Check if the inserted order is to the correct destination (owner, type), /* Check if the inserted order is to the correct destination (owner, type),
* and has the correct flags if any */ * and has the correct flags if any */
@ -440,7 +444,7 @@ int32 CmdDeleteOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsVehicleIndex(veh_id)) return CMD_ERROR; if (!IsVehicleIndex(veh_id)) return CMD_ERROR;
v = GetVehicle(veh_id); v = GetVehicle(veh_id);
if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR;
/* If we did not select an order, we maybe want to de-clone the orders */ /* If we did not select an order, we maybe want to de-clone the orders */
if (sel_ord >= v->num_orders) if (sel_ord >= v->num_orders)
@ -512,7 +516,7 @@ int32 CmdSkipOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsVehicleIndex(veh_id)) return CMD_ERROR; if (!IsVehicleIndex(veh_id)) return CMD_ERROR;
v = GetVehicle(veh_id); v = GetVehicle(veh_id);
if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
/* Goto next order */ /* Goto next order */
@ -561,7 +565,7 @@ int32 CmdModifyOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (p2 != OFB_FULL_LOAD && p2 != OFB_UNLOAD && p2 != OFB_NON_STOP && p2 != OFB_TRANSFER) return CMD_ERROR; if (p2 != OFB_FULL_LOAD && p2 != OFB_UNLOAD && p2 != OFB_NON_STOP && p2 != OFB_TRANSFER) return CMD_ERROR;
v = GetVehicle(veh); v = GetVehicle(veh);
if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR;
/* Is it a valid order? */ /* Is it a valid order? */
if (sel_ord >= v->num_orders) return CMD_ERROR; if (sel_ord >= v->num_orders) return CMD_ERROR;
@ -628,7 +632,7 @@ int32 CmdCloneOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
dst = GetVehicle(veh_dst); dst = GetVehicle(veh_dst);
if (dst->type == 0 || !CheckOwnership(dst->owner)) return CMD_ERROR; if (IsValidVehicle(dst) || !CheckOwnership(dst->owner)) return CMD_ERROR;
switch (p2) { switch (p2) {
case CO_SHARE: { case CO_SHARE: {
@ -639,7 +643,7 @@ int32 CmdCloneOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
src = GetVehicle(veh_src); src = GetVehicle(veh_src);
/* Sanity checks */ /* Sanity checks */
if (src->type == 0 || !CheckOwnership(src->owner) || dst->type != src->type || dst == src) if (IsValidVehicle(src) || !CheckOwnership(src->owner) || dst->type != src->type || dst == src)
return CMD_ERROR; return CMD_ERROR;
/* Trucks can't share orders with busses (and visa versa) */ /* Trucks can't share orders with busses (and visa versa) */
@ -686,7 +690,7 @@ int32 CmdCloneOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
src = GetVehicle(veh_src); src = GetVehicle(veh_src);
/* Sanity checks */ /* Sanity checks */
if (src->type == 0 || !CheckOwnership(src->owner) || dst->type != src->type || dst == src) if (IsValidVehicle(src) || !CheckOwnership(src->owner) || dst->type != src->type || dst == src)
return CMD_ERROR; return CMD_ERROR;
/* Trucks can't copy all the orders from busses (and visa versa) */ /* Trucks can't copy all the orders from busses (and visa versa) */
@ -844,7 +848,7 @@ int32 CmdRestoreOrderIndex(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v = GetVehicle(p1); v = GetVehicle(p1);
/* Check the vehicle type and ownership, and if the service interval and order are in range */ /* Check the vehicle type and ownership, and if the service interval and order are in range */
if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; if (IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR;
if (serv_int != GetServiceIntervalClamped(serv_int) || cur_ord >= v->num_orders) return CMD_ERROR; if (serv_int != GetServiceIntervalClamped(serv_int) || cur_ord >= v->num_orders) return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
@ -963,8 +967,7 @@ void DeleteDestinationFromVehicleOrder(Order dest)
/* Go through all vehicles */ /* Go through all vehicles */
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == 0 || v->orders == NULL) if (v->orders == NULL) continue;
continue;
/* Forget about this station if this station is removed */ /* Forget about this station if this station is removed */
if (v->last_station_visited == dest.station && dest.type == OT_GOTO_STATION) if (v->last_station_visited == dest.station && dest.type == OT_GOTO_STATION)
@ -1130,10 +1133,8 @@ static void Save_ORDR(void)
Order *order; Order *order;
FOR_ALL_ORDERS(order) { FOR_ALL_ORDERS(order) {
if (order->type != OT_NOTHING) { SlSetArrayIndex(order->index);
SlSetArrayIndex(order->index); SlObject(order, _order_desc);
SlObject(order, _order_desc);
}
} }
} }

@ -1074,9 +1074,8 @@ static int32 PopulationInLabelActive(int32 p1)
{ {
Town* t; Town* t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) UpdateTownVirtCoord(t);
if (t->xy != 0) UpdateTownVirtCoord(t);
}
return 0; return 0;
} }

@ -86,7 +86,7 @@ static const Depot* FindClosestShipDepot(const Vehicle* v)
} else { } else {
FOR_ALL_DEPOTS(depot) { FOR_ALL_DEPOTS(depot) {
tile = depot->xy; tile = depot->xy;
if (IsValidDepot(depot) && IsTileDepotType(tile, TRANSPORT_WATER) && IsTileOwner(tile, v->owner)) { if (IsTileDepotType(tile, TRANSPORT_WATER) && IsTileOwner(tile, v->owner)) {
dist = DistanceManhattan(tile, tile2); dist = DistanceManhattan(tile, tile2);
if (dist < best_dist) { if (dist < best_dist) {
best_dist = dist; best_dist = dist;

@ -25,8 +25,9 @@ static void SignPoolNewBlock(uint start_item)
{ {
SignStruct *ss; SignStruct *ss;
FOR_ALL_SIGNS_FROM(ss, start_item) /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
ss->index = start_item++; * TODO - This is just a temporary stage, this will be removed. */
for (ss = GetSign(start_item); ss != NULL; ss = (ss->index + 1 < GetSignPoolSize()) ? GetSign(ss->index + 1) : NULL) ss->index = start_item++;
} }
/* Initialize the sign-pool */ /* Initialize the sign-pool */
@ -53,9 +54,7 @@ void UpdateAllSignVirtCoords(void)
{ {
SignStruct *ss; SignStruct *ss;
FOR_ALL_SIGNS(ss) FOR_ALL_SIGNS(ss) UpdateSignVirtCoords(ss);
if (ss->str != 0)
UpdateSignVirtCoords(ss);
} }
@ -83,8 +82,11 @@ static void MarkSignDirty(SignStruct *ss)
static SignStruct *AllocateSign(void) static SignStruct *AllocateSign(void)
{ {
SignStruct *ss; SignStruct *ss;
FOR_ALL_SIGNS(ss) {
if (ss->str == 0) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (ss = GetSign(0); ss != NULL; ss = (ss->index + 1 < GetSignPoolSize()) ? GetSign(ss->index + 1) : NULL) {
if (!IsValidSign(ss)) {
uint index = ss->index; uint index = ss->index;
memset(ss, 0, sizeof(SignStruct)); memset(ss, 0, sizeof(SignStruct));
@ -246,11 +248,8 @@ static void Save_SIGN(void)
SignStruct *ss; SignStruct *ss;
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
/* Don't save empty signs */ SlSetArrayIndex(ss->index);
if (ss->str != 0) { SlObject(ss, _sign_desc);
SlSetArrayIndex(ss->index);
SlObject(ss, _sign_desc);
}
} }
} }

@ -19,14 +19,6 @@ typedef struct SignStruct {
extern MemoryPool _sign_pool; extern MemoryPool _sign_pool;
/**
* Check if a Sign really exists.
*/
static inline bool IsValidSign(const SignStruct* ss)
{
return ss->str != 0;
}
/** /**
* Get the pointer to the sign with index 'index' * Get the pointer to the sign with index 'index'
*/ */
@ -48,7 +40,15 @@ static inline bool IsSignIndex(uint index)
return index < GetSignPoolSize(); return index < GetSignPoolSize();
} }
#define FOR_ALL_SIGNS_FROM(ss, start) for (ss = GetSign(start); ss != NULL; ss = (ss->index + 1 < GetSignPoolSize()) ? GetSign(ss->index + 1) : NULL) /**
* Check if a Sign really exists.
*/
static inline bool IsValidSign(const SignStruct* ss)
{
return ss->str != STR_NULL;
}
#define FOR_ALL_SIGNS_FROM(ss, start) for (ss = GetSign(start); ss != NULL; ss = (ss->index + 1 < GetSignPoolSize()) ? GetSign(ss->index + 1) : NULL) if (IsValidSign(ss))
#define FOR_ALL_SIGNS(ss) FOR_ALL_SIGNS_FROM(ss, 0) #define FOR_ALL_SIGNS(ss) FOR_ALL_SIGNS_FROM(ss, 0)
VARDEF bool _sign_sort_dirty; VARDEF bool _sign_sort_dirty;

@ -696,7 +696,7 @@ skip_column:
byte color; byte color;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type != 0 && v->type != VEH_Special && if (v->type != VEH_Special &&
(v->vehstatus & (VS_HIDDEN | VS_UNCLICKABLE)) == 0) { (v->vehstatus & (VS_HIDDEN | VS_UNCLICKABLE)) == 0) {
// Remap into flat coordinates. // Remap into flat coordinates.
Point pt = RemapCoords( Point pt = RemapCoords(
@ -742,24 +742,22 @@ skip_column:
const Town *t; const Town *t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) { // Remap the town coordinate
// Remap the town coordinate Point pt = RemapCoords(
Point pt = RemapCoords( (int)(TileX(t->xy) * TILE_SIZE - WP(w, smallmap_d).scroll_x) / TILE_SIZE,
(int)(TileX(t->xy) * TILE_SIZE - WP(w, smallmap_d).scroll_x) / TILE_SIZE, (int)(TileY(t->xy) * TILE_SIZE - WP(w, smallmap_d).scroll_y) / TILE_SIZE,
(int)(TileY(t->xy) * TILE_SIZE - WP(w, smallmap_d).scroll_y) / TILE_SIZE, 0);
0); x = pt.x - WP(w,smallmap_d).subscroll + 3 - (t->sign.width_2 >> 1);
x = pt.x - WP(w,smallmap_d).subscroll + 3 - (t->sign.width_2 >> 1); y = pt.y;
y = pt.y;
// Check if the town sign is within bounds
// Check if the town sign is within bounds if (x + t->sign.width_2 > dpi->left &&
if (x + t->sign.width_2 > dpi->left && x < dpi->left + dpi->width &&
x < dpi->left + dpi->width && y + 6 > dpi->top &&
y + 6 > dpi->top && y < dpi->top + dpi->height) {
y < dpi->top + dpi->height) { // And draw it.
// And draw it. SetDParam(0, t->index);
SetDParam(0, t->index); DrawString(x, y, STR_2056, 12);
DrawString(x, y, STR_2056, 12);
}
} }
} }
} }

@ -166,7 +166,15 @@ static inline bool IsStationIndex(StationID index)
return index < GetStationPoolSize(); return index < GetStationPoolSize();
} }
#define FOR_ALL_STATIONS_FROM(st, start) for (st = GetStation(start); st != NULL; st = (st->index + 1 < GetStationPoolSize()) ? GetStation(st->index + 1) : NULL) /**
* Check if a station really exists.
*/
static inline bool IsValidStation(const Station *st)
{
return st->xy != 0;
}
#define FOR_ALL_STATIONS_FROM(st, start) for (st = GetStation(start); st != NULL; st = (st->index + 1 < GetStationPoolSize()) ? GetStation(st->index + 1) : NULL) if (IsValidStation(st))
#define FOR_ALL_STATIONS(st) FOR_ALL_STATIONS_FROM(st, 0) #define FOR_ALL_STATIONS(st) FOR_ALL_STATIONS_FROM(st, 0)
@ -190,7 +198,15 @@ static inline uint16 GetRoadStopPoolSize(void)
return _roadstop_pool.total_items; return _roadstop_pool.total_items;
} }
#define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1 < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1) : NULL) /**
* Check if a RaodStop really exists.
*/
static inline bool IsValidRoadStop(const RoadStop *rs)
{
return rs->used;
}
#define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1 < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1) : NULL) if (IsValidRoadStop(rs))
#define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0) #define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0)
/* End of stuff for ROADSTOPS */ /* End of stuff for ROADSTOPS */
@ -212,14 +228,6 @@ uint GetNumRoadStops(const Station* st, RoadStopType type);
RoadStop * AllocateRoadStop( void ); RoadStop * AllocateRoadStop( void );
void ClearSlot(Vehicle *v); void ClearSlot(Vehicle *v);
/**
* Check if a station really exists.
*/
static inline bool IsValidStation(const Station *st)
{
return st->xy != 0; /* XXX: Replace by INVALID_TILE someday */
}
static inline bool IsBuoy(const Station* st) static inline bool IsBuoy(const Station* st)
{ {
return (st->had_vehicle_of_type & HVOT_BUOY) != 0; /* XXX: We should really ditch this ugly coding and switch to something sane... */ return (st->had_vehicle_of_type & HVOT_BUOY) != 0; /* XXX: We should really ditch this ugly coding and switch to something sane... */

@ -51,7 +51,9 @@ static void StationPoolNewBlock(uint start_item)
{ {
Station *st; Station *st;
FOR_ALL_STATIONS_FROM(st, start_item) st->index = start_item++; /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* This is just a temporary stage, this will be removed. */
for (st = GetStation(start_item); st != NULL; st = (st->index + 1 < GetStationPoolSize()) ? GetStation(st->index + 1) : NULL) st->index = start_item++;
} }
static void StationPoolCleanBlock(uint start_item, uint end_item) static void StationPoolCleanBlock(uint start_item, uint end_item)
@ -72,7 +74,9 @@ static void RoadStopPoolNewBlock(uint start_item)
{ {
RoadStop *rs; RoadStop *rs;
FOR_ALL_ROADSTOPS_FROM(rs, start_item) rs->index = start_item++; /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (rs = GetRoadStop(start_item); rs != NULL; rs = (rs->index + 1 < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1) : NULL) rs->index = start_item++;
} }
/* Initialize the station-pool and roadstop-pool */ /* Initialize the station-pool and roadstop-pool */
@ -145,8 +149,10 @@ RoadStop *AllocateRoadStop(void)
{ {
RoadStop *rs; RoadStop *rs;
FOR_ALL_ROADSTOPS(rs) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
if (!rs->used) { * TODO - This is just a temporary stage, this will be removed. */
for (rs = GetRoadStop(0); rs != NULL; rs = (rs->index + 1 < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1) : NULL) {
if (!IsValidRoadStop(rs)) {
uint index = rs->index; uint index = rs->index;
memset(rs, 0, sizeof(*rs)); memset(rs, 0, sizeof(*rs));
@ -252,8 +258,10 @@ static Station *AllocateStation(void)
{ {
Station *st = NULL; Station *st = NULL;
FOR_ALL_STATIONS(st) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
if (st->xy == 0) { * TODO - This is just a temporary stage, this will be removed. */
for (st = GetStation(0); st != NULL; st = (st->index + 1 < GetStationPoolSize()) ? GetStation(st->index + 1) : NULL) {
if (!IsValidStation(st)) {
StationID index = st->index; StationID index = st->index;
memset(st, 0, sizeof(Station)); memset(st, 0, sizeof(Station));
@ -337,7 +345,7 @@ static bool GenerateStationName(Station *st, TileIndex tile, int flag)
Station *s; Station *s;
FOR_ALL_STATIONS(s) { FOR_ALL_STATIONS(s) {
if (s != st && s->xy != 0 && s->town==t) { if (s != st && s->town==t) {
uint str = M(s->string_id); uint str = M(s->string_id);
if (str <= 0x20) { if (str <= 0x20) {
if (str == M(STR_SV_STNAME_FOREST)) if (str == M(STR_SV_STNAME_FOREST))
@ -438,7 +446,7 @@ static Station* GetClosestStationFromTile(TileIndex tile, uint threshold, Player
Station* st; Station* st;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && (owner == OWNER_SPECTATOR || st->owner == owner)) { if ((owner == OWNER_SPECTATOR || st->owner == owner)) {
uint cur_dist = DistanceManhattan(tile, st->xy); uint cur_dist = DistanceManhattan(tile, st->xy);
if (cur_dist < threshold) { if (cur_dist < threshold) {
@ -501,7 +509,7 @@ void UpdateAllStationVirtCoord(void)
Station* st; Station* st;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0) UpdateStationVirtCoord(st); UpdateStationVirtCoord(st);
} }
} }
@ -1664,7 +1672,7 @@ int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{ {
uint num = 0; uint num = 0;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && st->town == t && st->facilities&FACIL_AIRPORT && st->airport_type != AT_OILRIG) if (st->town == t && st->facilities&FACIL_AIRPORT && st->airport_type != AT_OILRIG)
num++; num++;
} }
if (num >= 2) { if (num >= 2) {
@ -2435,7 +2443,7 @@ void DeleteAllPlayerStations(void)
Station *st; Station *st;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && st->owner < MAX_PLAYERS) DeleteStation(st); if (st->owner < MAX_PLAYERS) DeleteStation(st);
} }
} }
@ -2569,10 +2577,10 @@ void OnTick_Station(void)
if (++_station_tick_ctr == GetStationPoolSize()) _station_tick_ctr = 0; if (++_station_tick_ctr == GetStationPoolSize()) _station_tick_ctr = 0;
st = GetStation(i); st = GetStation(i);
if (st->xy != 0) StationHandleBigTick(st); if (IsValidStation(st)) StationHandleBigTick(st);
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0) StationHandleSmallTick(st); StationHandleSmallTick(st);
} }
} }
@ -2586,7 +2594,7 @@ void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint
Station *st; Station *st;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && st->owner == owner && if (st->owner == owner &&
DistanceManhattan(tile, st->xy) <= radius) { DistanceManhattan(tile, st->xy) <= radius) {
uint i; uint i;
@ -3068,10 +3076,8 @@ static void Save_STNS(void)
Station *st; Station *st;
// Write the stations // Write the stations
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0) { SlSetArrayIndex(st->index);
SlSetArrayIndex(st->index); SlAutolength((AutolengthProc*)SaveLoad_STNS, st);
SlAutolength((AutolengthProc*)SaveLoad_STNS, st);
}
} }
} }
@ -3126,10 +3132,8 @@ static void Save_ROADSTOP(void)
RoadStop *rs; RoadStop *rs;
FOR_ALL_ROADSTOPS(rs) { FOR_ALL_ROADSTOPS(rs) {
if (rs->used) { SlSetArrayIndex(rs->index);
SlSetArrayIndex(rs->index); SlObject(rs, _roadstop_desc);
SlObject(rs, _roadstop_desc);
}
} }
} }

@ -187,7 +187,7 @@ static void BuildStationsList(plstations_d* sl, PlayerID owner, byte facilities,
DEBUG(misc, 1) ("Building station list for player %d...", owner); DEBUG(misc, 1) ("Building station list for player %d...", owner);
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && st->owner == owner) { if (st->owner == owner) {
if (facilities & st->facilities) { //only stations with selected facilities if (facilities & st->facilities) { //only stations with selected facilities
int num_waiting_cargo = 0; int num_waiting_cargo = 0;
for (j = 0; j < NUM_CARGO; j++) { for (j = 0; j < NUM_CARGO; j++) {

@ -673,7 +673,7 @@ static char *FormatString(char *buff, const char *str, const int32 *argv, uint c
int32 args[2]; int32 args[2];
// industry not valid anymore? // industry not valid anymore?
if (i->xy == 0) break; if (!IsValidIndustry(i)) break;
// First print the town name and the industry type name // First print the town name and the industry type name
// The string STR_INDUSTRY_PATTERN controls the formatting // The string STR_INDUSTRY_PATTERN controls the formatting
@ -829,7 +829,7 @@ static char *FormatString(char *buff, const char *str, const int32 *argv, uint c
const Station* st = GetStation(GetInt32(&argv)); const Station* st = GetStation(GetInt32(&argv));
int32 temp[2]; int32 temp[2];
if (st->xy == 0) { // station doesn't exist anymore if (!IsValidStation(st)) { // station doesn't exist anymore
buff = GetStringWithArgs(buff, STR_UNKNOWN_DESTINATION, NULL); buff = GetStringWithArgs(buff, STR_UNKNOWN_DESTINATION, NULL);
break; break;
} }
@ -842,7 +842,7 @@ static char *FormatString(char *buff, const char *str, const int32 *argv, uint c
const Town* t = GetTown(GetInt32(&argv)); const Town* t = GetTown(GetInt32(&argv));
int32 temp[1]; int32 temp[1];
assert(t->xy != 0); assert(IsValidTown(t));
temp[0] = t->townnameparts; temp[0] = t->townnameparts;
buff = GetStringWithArgs(buff, t->townnametype, temp); buff = GetStringWithArgs(buff, t->townnametype, temp);

@ -160,7 +160,7 @@ extern MemoryPool _town_pool;
*/ */
static inline bool IsValidTown(const Town* town) static inline bool IsValidTown(const Town* town)
{ {
return town->xy != 0; /* XXX: Replace by INVALID_TILE someday */ return town->xy != 0;
} }
/** /**
@ -184,7 +184,7 @@ static inline bool IsTownIndex(uint index)
return index < GetTownPoolSize(); return index < GetTownPoolSize();
} }
#define FOR_ALL_TOWNS_FROM(t, start) for (t = GetTown(start); t != NULL; t = (t->index + 1 < GetTownPoolSize()) ? GetTown(t->index + 1) : NULL) #define FOR_ALL_TOWNS_FROM(t, start) for (t = GetTown(start); t != NULL; t = (t->index + 1 < GetTownPoolSize()) ? GetTown(t->index + 1) : NULL) if (IsValidTown(t))
#define FOR_ALL_TOWNS(t) FOR_ALL_TOWNS_FROM(t, 0) #define FOR_ALL_TOWNS(t) FOR_ALL_TOWNS_FROM(t, 0)
VARDEF uint _total_towns; // For the AI: the amount of towns active VARDEF uint _total_towns; // For the AI: the amount of towns active

@ -43,8 +43,9 @@ static void TownPoolNewBlock(uint start_item)
{ {
Town *t; Town *t;
FOR_ALL_TOWNS_FROM(t, start_item) /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
t->index = start_item++; * TODO - This is just a temporary stage, this will be removed. */
for (t = GetTown(start_item); t != NULL; t = (t->index + 1 < GetTownPoolSize()) ? GetTown(t->index + 1) : NULL) t->index = start_item++;
} }
/* Initialize the town-pool */ /* Initialize the town-pool */
@ -168,7 +169,7 @@ static bool IsCloseToTown(TileIndex tile, uint dist)
const Town* t; const Town* t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0 && DistanceManhattan(tile, t->xy) < dist) return true; if (DistanceManhattan(tile, t->xy) < dist) return true;
} }
return false; return false;
} }
@ -415,7 +416,7 @@ void OnTick_Town(void)
t = GetTown(i); t = GetTown(i);
if (t->xy != 0) TownTickHandler(t); if (IsValidTown(t)) TownTickHandler(t);
} }
} }
@ -857,15 +858,13 @@ restart:
if (strlen(buf1) >= 31 || GetStringWidth(buf1) > 130) continue; if (strlen(buf1) >= 31 || GetStringWidth(buf1) > 130) continue;
FOR_ALL_TOWNS(t2) { FOR_ALL_TOWNS(t2) {
if (t2->xy != 0) { // We can't just compare the numbers since
// We can't just compare the numbers since // several numbers may map to a single name.
// several numbers may map to a single name. SetDParam(0, t2->index);
SetDParam(0, t2->index); GetString(buf2, STR_TOWN);
GetString(buf2, STR_TOWN); if (strcmp(buf1, buf2) == 0) {
if (strcmp(buf1, buf2) == 0) { if (tries-- < 0) return false;
if (tries-- < 0) return false; goto restart;
goto restart;
}
} }
} }
*townnameparts = r; *townnameparts = r;
@ -949,8 +948,11 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, uint siz
static Town *AllocateTown(void) static Town *AllocateTown(void)
{ {
Town *t; Town *t;
FOR_ALL_TOWNS(t) {
if (t->xy == 0) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (t = GetTown(0); t != NULL; t = (t->index + 1 < GetTownPoolSize()) ? GetTown(t->index + 1) : NULL) {
if (!IsValidTown(t)) {
TownID index = t->index; TownID index = t->index;
if (t->index > _total_towns) if (t->index > _total_towns)
@ -1066,7 +1068,7 @@ bool GenerateTowns(void)
if (num == 0 && CreateRandomTown(10000, 0) == NULL) { if (num == 0 && CreateRandomTown(10000, 0) == NULL) {
const Town* t; const Town* t;
FOR_ALL_TOWNS(t) if (IsValidTown(t)) return true; FOR_ALL_TOWNS(t) return true;
//XXX can we handle that more gracefully? //XXX can we handle that more gracefully?
if (num == 0 && _game_mode != GM_EDITOR) { if (num == 0 && _game_mode != GM_EDITOR) {
@ -1380,8 +1382,7 @@ void DeleteTown(Town *t)
// Delete all industries belonging to the town // Delete all industries belonging to the town
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy && i->town == t) if (i->town == t) DeleteIndustry(i);
DeleteIndustry(i);
} }
// Go through all tiles and delete those belonging to the town // Go through all tiles and delete those belonging to the town
@ -1736,12 +1737,10 @@ Town* CalcClosestTownFromTile(TileIndex tile, uint threshold)
Town *best_town = NULL; Town *best_town = NULL;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) { dist = DistanceManhattan(tile, t->xy);
dist = DistanceManhattan(tile, t->xy); if (dist < best) {
if (dist < best) { best = dist;
best = dist; best_town = t;
best_town = t;
}
} }
} }
@ -1826,7 +1825,7 @@ void TownsMonthlyLoop(void)
{ {
Town *t; Town *t;
FOR_ALL_TOWNS(t) if (t->xy != 0) { FOR_ALL_TOWNS(t) {
if (t->road_build_months != 0) t->road_build_months--; if (t->road_build_months != 0) t->road_build_months--;
if (t->exclusive_counter != 0) if (t->exclusive_counter != 0)
@ -1942,10 +1941,8 @@ static void Save_TOWN(void)
Town *t; Town *t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) { SlSetArrayIndex(t->index);
SlSetArrayIndex(t->index); SlObject(t, _town_desc);
SlObject(t, _town_desc);
}
} }
} }
@ -1978,10 +1975,8 @@ void AfterLoadTown(void)
{ {
Town *t; Town *t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) { UpdateTownRadius(t);
UpdateTownRadius(t); UpdateTownVirtCoord(t);
UpdateTownVirtCoord(t);
}
} }
_town_sort_dirty = true; _town_sort_dirty = true;
} }

@ -414,9 +414,7 @@ static void MakeSortedTownList(void)
if (_town_sort == NULL) if (_town_sort == NULL)
error("Could not allocate memory for the town-sorting-list"); error("Could not allocate memory for the town-sorting-list");
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) _town_sort[n++] = t;
if (t->xy != 0) _town_sort[n++] = t;
}
_num_town_sort = n; _num_town_sort = n;

@ -83,7 +83,9 @@ static void VehiclePoolNewBlock(uint start_item)
{ {
Vehicle *v; Vehicle *v;
FOR_ALL_VEHICLES_FROM(v, start_item) v->index = start_item++; /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (v = GetVehicle(start_item); v != NULL; v = (v->index + 1 < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) v->index = start_item++;
} }
/* Initialize the vehicle-pool */ /* Initialize the vehicle-pool */
@ -225,23 +227,21 @@ void AfterLoadVehicles(void)
} }
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type != 0) { switch (v->type) {
switch (v->type) { case VEH_Train: v->cur_image = GetTrainImage(v, v->direction); break;
case VEH_Train: v->cur_image = GetTrainImage(v, v->direction); break; case VEH_Road: v->cur_image = GetRoadVehImage(v, v->direction); break;
case VEH_Road: v->cur_image = GetRoadVehImage(v, v->direction); break; case VEH_Ship: v->cur_image = GetShipImage(v, v->direction); break;
case VEH_Ship: v->cur_image = GetShipImage(v, v->direction); break; case VEH_Aircraft:
case VEH_Aircraft: if (v->subtype == 0 || v->subtype == 2) {
if (v->subtype == 0 || v->subtype == 2) { v->cur_image = GetAircraftImage(v, v->direction);
v->cur_image = GetAircraftImage(v, v->direction); if (v->next != NULL) v->next->cur_image = v->cur_image;
if (v->next != NULL) v->next->cur_image = v->cur_image; }
} break;
break; default: break;
default: break;
}
v->left_coord = INVALID_COORD;
VehiclePositionChanged(v);
} }
v->left_coord = INVALID_COORD;
VehiclePositionChanged(v);
} }
} }
@ -284,13 +284,14 @@ Vehicle *ForceAllocateSpecialVehicle(void)
Vehicle *v; Vehicle *v;
FOR_ALL_VEHICLES(v) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (v = GetVehicle(0); v != NULL; v = (v->index + 1 < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) {
/* No more room for the special vehicles, return NULL */ /* No more room for the special vehicles, return NULL */
if (v->index >= (1 << _vehicle_pool.block_size_bits) * BLOCKS_FOR_SPECIAL_VEHICLES) if (v->index >= (1 << _vehicle_pool.block_size_bits) * BLOCKS_FOR_SPECIAL_VEHICLES)
return NULL; return NULL;
if (v->type == 0) if (!IsValidVehicle(v)) return InitializeVehicle(v);
return InitializeVehicle(v);
} }
return NULL; return NULL;
@ -311,11 +312,12 @@ static Vehicle *AllocateSingleVehicle(VehicleID *skip_vehicles)
Vehicle *v; Vehicle *v;
const int offset = (1 << VEHICLES_POOL_BLOCK_SIZE_BITS) * BLOCKS_FOR_SPECIAL_VEHICLES; const int offset = (1 << VEHICLES_POOL_BLOCK_SIZE_BITS) * BLOCKS_FOR_SPECIAL_VEHICLES;
/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
if (*skip_vehicles < (_vehicle_pool.total_items - offset)) { // make sure the offset in the array is not larger than the array itself if (*skip_vehicles < (_vehicle_pool.total_items - offset)) { // make sure the offset in the array is not larger than the array itself
FOR_ALL_VEHICLES_FROM(v, offset + *skip_vehicles) { for (v = GetVehicle(offset + *skip_vehicles); v != NULL; v = (v->index + 1 < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) {
(*skip_vehicles)++; (*skip_vehicles)++;
if (v->type == 0) if (!IsValidVehicle(v)) return InitializeVehicle(v);
return InitializeVehicle(v);
} }
} }
@ -620,9 +622,7 @@ void CallVehicleTicks(void)
_first_veh_in_depot_list = NULL; // now we are sure it's initialized at the start of each tick _first_veh_in_depot_list = NULL; // now we are sure it's initialized at the start of each tick
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type != 0) { _vehicle_tick_procs[v->type - 0x10](v);
_vehicle_tick_procs[v->type - 0x10](v);
}
} }
// now we handle all the vehicles that entered a depot this tick // now we handle all the vehicles that entered a depot this tick
@ -1395,7 +1395,7 @@ Vehicle *CheckClickOnVehicle(const ViewPort *vp, int x, int y)
y = (y << vp->zoom) + vp->virtual_top; y = (y << vp->zoom) + vp->virtual_top;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type != 0 && (v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0 && if ((v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0 &&
x >= v->left_coord && x <= v->right_coord && x >= v->left_coord && x <= v->right_coord &&
y >= v->top_coord && y <= v->bottom_coord) { y >= v->top_coord && y <= v->bottom_coord) {
@ -1944,7 +1944,7 @@ int32 CmdChangeServiceInt(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v = GetVehicle(p1); v = GetVehicle(p1);
if (v->type == 0 || !CheckOwnership(v->owner)) return CMD_ERROR; if (!IsValidVehicle(v) || !CheckOwnership(v->owner)) return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
v->service_interval = serv_int; v->service_interval = serv_int;
@ -2396,10 +2396,8 @@ static void Save_VEHS(void)
Vehicle *v; Vehicle *v;
// Write the vehicles // Write the vehicles
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type != 0) { SlSetArrayIndex(v->index);
SlSetArrayIndex(v->index); SlObject(v, _veh_descs[v->type - 0x10]);
SlObject(v, _veh_descs[v->type - 0x10]);
}
} }
} }
@ -2435,13 +2433,7 @@ static void Load_VEHS(void)
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
Vehicle *u; Vehicle *u;
if (v->type == 0)
continue;
FOR_ALL_VEHICLES_FROM(u, v->index + 1) { FOR_ALL_VEHICLES_FROM(u, v->index + 1) {
if (u->type == 0)
continue;
/* If a vehicle has the same orders, add the link to eachother /* If a vehicle has the same orders, add the link to eachother
in both vehicles */ in both vehicles */
if (v->orders == u->orders) { if (v->orders == u->orders) {

@ -359,9 +359,6 @@ static inline uint16 GetVehiclePoolSize(void)
return _vehicle_pool.total_items; return _vehicle_pool.total_items;
} }
#define FOR_ALL_VEHICLES_FROM(v, start) for (v = GetVehicle(start); v != NULL; v = (v->index + 1 < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL)
#define FOR_ALL_VEHICLES(v) FOR_ALL_VEHICLES_FROM(v, 0)
/** /**
* Check if a Vehicle really exists. * Check if a Vehicle really exists.
*/ */
@ -370,6 +367,9 @@ static inline bool IsValidVehicle(const Vehicle *v)
return v->type != 0; return v->type != 0;
} }
#define FOR_ALL_VEHICLES_FROM(v, start) for (v = GetVehicle(start); v != NULL; v = (v->index + 1 < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) if (IsValidVehicle(v))
#define FOR_ALL_VEHICLES(v) FOR_ALL_VEHICLES_FROM(v, 0)
/** /**
* Check if an index is a vehicle-index (so between 0 and max-vehicles) * Check if an index is a vehicle-index (so between 0 and max-vehicles)
* *

@ -770,8 +770,7 @@ static void ViewportAddTownNames(DrawPixelInfo *dpi)
if (dpi->zoom < 1) { if (dpi->zoom < 1) {
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (bottom > t->sign.top &&
bottom > t->sign.top &&
top < t->sign.top + 12 && top < t->sign.top + 12 &&
right > t->sign.left && right > t->sign.left &&
left < t->sign.left + t->sign.width_1) { left < t->sign.left + t->sign.width_1) {
@ -786,8 +785,7 @@ static void ViewportAddTownNames(DrawPixelInfo *dpi)
bottom += 2; bottom += 2;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (bottom > t->sign.top &&
bottom > t->sign.top &&
top < t->sign.top + 24 && top < t->sign.top + 24 &&
right > t->sign.left && right > t->sign.left &&
left < t->sign.left + t->sign.width_1*2) { left < t->sign.left + t->sign.width_1*2) {
@ -803,8 +801,7 @@ static void ViewportAddTownNames(DrawPixelInfo *dpi)
assert(dpi->zoom == 2); assert(dpi->zoom == 2);
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (bottom > t->sign.top &&
bottom > t->sign.top &&
top < t->sign.top + 24 && top < t->sign.top + 24 &&
right > t->sign.left && right > t->sign.left &&
left < t->sign.left + t->sign.width_2*4) { left < t->sign.left + t->sign.width_2*4) {
@ -832,8 +829,7 @@ static void ViewportAddStationNames(DrawPixelInfo *dpi)
if (dpi->zoom < 1) { if (dpi->zoom < 1) {
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (bottom > st->sign.top &&
bottom > st->sign.top &&
top < st->sign.top + 12 && top < st->sign.top + 12 &&
right > st->sign.left && right > st->sign.left &&
left < st->sign.left + st->sign.width_1) { left < st->sign.left + st->sign.width_1) {
@ -850,8 +846,7 @@ static void ViewportAddStationNames(DrawPixelInfo *dpi)
bottom += 2; bottom += 2;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (bottom > st->sign.top &&
bottom > st->sign.top &&
top < st->sign.top + 24 && top < st->sign.top + 24 &&
right > st->sign.left && right > st->sign.left &&
left < st->sign.left + st->sign.width_1*2) { left < st->sign.left + st->sign.width_1*2) {
@ -871,8 +866,7 @@ static void ViewportAddStationNames(DrawPixelInfo *dpi)
bottom += 5; bottom += 5;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (bottom > st->sign.top &&
bottom > st->sign.top &&
top < st->sign.top + 24 && top < st->sign.top + 24 &&
right > st->sign.left && right > st->sign.left &&
left < st->sign.left + st->sign.width_2*4) { left < st->sign.left + st->sign.width_2*4) {
@ -903,8 +897,7 @@ static void ViewportAddSigns(DrawPixelInfo *dpi)
if (dpi->zoom < 1) { if (dpi->zoom < 1) {
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
if (ss->str && if (bottom > ss->sign.top &&
bottom > ss->sign.top &&
top < ss->sign.top + 12 && top < ss->sign.top + 12 &&
right > ss->sign.left && right > ss->sign.left &&
left < ss->sign.left + ss->sign.width_1) { left < ss->sign.left + ss->sign.width_1) {
@ -920,8 +913,7 @@ static void ViewportAddSigns(DrawPixelInfo *dpi)
right += 2; right += 2;
bottom += 2; bottom += 2;
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
if (ss->str && if (bottom > ss->sign.top &&
bottom > ss->sign.top &&
top < ss->sign.top + 24 && top < ss->sign.top + 24 &&
right > ss->sign.left && right > ss->sign.left &&
left < ss->sign.left + ss->sign.width_1*2) { left < ss->sign.left + ss->sign.width_1*2) {
@ -938,8 +930,7 @@ static void ViewportAddSigns(DrawPixelInfo *dpi)
bottom += 5; bottom += 5;
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
if (ss->str && if (bottom > ss->sign.top &&
bottom > ss->sign.top &&
top < ss->sign.top + 24 && top < ss->sign.top + 24 &&
right > ss->sign.left && right > ss->sign.left &&
left < ss->sign.left + ss->sign.width_2*4) { left < ss->sign.left + ss->sign.width_2*4) {
@ -971,8 +962,7 @@ static void ViewportAddWaypoints(DrawPixelInfo *dpi)
if (dpi->zoom < 1) { if (dpi->zoom < 1) {
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy && if (bottom > wp->sign.top &&
bottom > wp->sign.top &&
top < wp->sign.top + 12 && top < wp->sign.top + 12 &&
right > wp->sign.left && right > wp->sign.left &&
left < wp->sign.left + wp->sign.width_1) { left < wp->sign.left + wp->sign.width_1) {
@ -988,8 +978,7 @@ static void ViewportAddWaypoints(DrawPixelInfo *dpi)
right += 2; right += 2;
bottom += 2; bottom += 2;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy && if (bottom > wp->sign.top &&
bottom > wp->sign.top &&
top < wp->sign.top + 24 && top < wp->sign.top + 24 &&
right > wp->sign.left && right > wp->sign.left &&
left < wp->sign.left + wp->sign.width_1*2) { left < wp->sign.left + wp->sign.width_1*2) {
@ -1006,8 +995,7 @@ static void ViewportAddWaypoints(DrawPixelInfo *dpi)
bottom += 5; bottom += 5;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy && if (bottom > wp->sign.top &&
bottom > wp->sign.top &&
top < wp->sign.top + 24 && top < wp->sign.top + 24 &&
right > wp->sign.left && right > wp->sign.left &&
left < wp->sign.left + wp->sign.width_2*4) { left < wp->sign.left + wp->sign.width_2*4) {
@ -1488,8 +1476,7 @@ static bool CheckClickOnTown(const ViewPort *vp, int x, int y)
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (y >= t->sign.top &&
y >= t->sign.top &&
y < t->sign.top + 12 && y < t->sign.top + 12 &&
x >= t->sign.left && x >= t->sign.left &&
x < t->sign.left + t->sign.width_1) { x < t->sign.left + t->sign.width_1) {
@ -1501,8 +1488,7 @@ static bool CheckClickOnTown(const ViewPort *vp, int x, int y)
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (y >= t->sign.top &&
y >= t->sign.top &&
y < t->sign.top + 24 && y < t->sign.top + 24 &&
x >= t->sign.left && x >= t->sign.left &&
x < t->sign.left + t->sign.width_1 * 2) { x < t->sign.left + t->sign.width_1 * 2) {
@ -1514,8 +1500,7 @@ static bool CheckClickOnTown(const ViewPort *vp, int x, int y)
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (y >= t->sign.top &&
y >= t->sign.top &&
y < t->sign.top + 24 && y < t->sign.top + 24 &&
x >= t->sign.left && x >= t->sign.left &&
x < t->sign.left + t->sign.width_2 * 4) { x < t->sign.left + t->sign.width_2 * 4) {
@ -1539,8 +1524,7 @@ static bool CheckClickOnStation(const ViewPort *vp, int x, int y)
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (y >= st->sign.top &&
y >= st->sign.top &&
y < st->sign.top + 12 && y < st->sign.top + 12 &&
x >= st->sign.left && x >= st->sign.left &&
x < st->sign.left + st->sign.width_1) { x < st->sign.left + st->sign.width_1) {
@ -1552,8 +1536,7 @@ static bool CheckClickOnStation(const ViewPort *vp, int x, int y)
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (y >= st->sign.top &&
y >= st->sign.top &&
y < st->sign.top + 24 && y < st->sign.top + 24 &&
x >= st->sign.left && x >= st->sign.left &&
x < st->sign.left + st->sign.width_1 * 2) { x < st->sign.left + st->sign.width_1 * 2) {
@ -1565,8 +1548,7 @@ static bool CheckClickOnStation(const ViewPort *vp, int x, int y)
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (y >= st->sign.top &&
y >= st->sign.top &&
y < st->sign.top + 24 && y < st->sign.top + 24 &&
x >= st->sign.left && x >= st->sign.left &&
x < st->sign.left + st->sign.width_2 * 4) { x < st->sign.left + st->sign.width_2 * 4) {
@ -1590,8 +1572,7 @@ static bool CheckClickOnSign(const ViewPort *vp, int x, int y)
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
if (ss->str && if (y >= ss->sign.top &&
y >= ss->sign.top &&
y < ss->sign.top + 12 && y < ss->sign.top + 12 &&
x >= ss->sign.left && x >= ss->sign.left &&
x < ss->sign.left + ss->sign.width_1) { x < ss->sign.left + ss->sign.width_1) {
@ -1603,8 +1584,7 @@ static bool CheckClickOnSign(const ViewPort *vp, int x, int y)
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
if (ss->str && if (y >= ss->sign.top &&
y >= ss->sign.top &&
y < ss->sign.top + 24 && y < ss->sign.top + 24 &&
x >= ss->sign.left && x >= ss->sign.left &&
x < ss->sign.left + ss->sign.width_1 * 2) { x < ss->sign.left + ss->sign.width_1 * 2) {
@ -1616,8 +1596,7 @@ static bool CheckClickOnSign(const ViewPort *vp, int x, int y)
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
FOR_ALL_SIGNS(ss) { FOR_ALL_SIGNS(ss) {
if (ss->str && if (y >= ss->sign.top &&
y >= ss->sign.top &&
y < ss->sign.top + 24 && y < ss->sign.top + 24 &&
x >= ss->sign.left && x >= ss->sign.left &&
x < ss->sign.left + ss->sign.width_2 * 4) { x < ss->sign.left + ss->sign.width_2 * 4) {
@ -1641,8 +1620,7 @@ static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy && if (y >= wp->sign.top &&
y >= wp->sign.top &&
y < wp->sign.top + 12 && y < wp->sign.top + 12 &&
x >= wp->sign.left && x >= wp->sign.left &&
x < wp->sign.left + wp->sign.width_1) { x < wp->sign.left + wp->sign.width_1) {
@ -1654,8 +1632,7 @@ static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy && if (y >= wp->sign.top &&
y >= wp->sign.top &&
y < wp->sign.top + 24 && y < wp->sign.top + 24 &&
x >= wp->sign.left && x >= wp->sign.left &&
x < wp->sign.left + wp->sign.width_1 * 2) { x < wp->sign.left + wp->sign.width_1 * 2) {
@ -1667,8 +1644,7 @@ static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy && if (y >= wp->sign.top &&
y >= wp->sign.top &&
y < wp->sign.top + 24 && y < wp->sign.top + 24 &&
x >= wp->sign.left && x >= wp->sign.left &&
x < wp->sign.left + wp->sign.width_2 * 4) { x < wp->sign.left + wp->sign.width_2 * 4) {

@ -35,7 +35,9 @@ static void WaypointPoolNewBlock(uint start_item)
{ {
Waypoint *wp; Waypoint *wp;
FOR_ALL_WAYPOINTS_FROM(wp, start_item) wp->index = start_item++; /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
* TODO - This is just a temporary stage, this will be removed. */
for (wp = GetWaypoint(start_item); wp != NULL; wp = (wp->index + 1 < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1) : NULL) wp->index = start_item++;
} }
/* Initialize the town-pool */ /* Initialize the town-pool */
@ -46,8 +48,10 @@ static Waypoint* AllocateWaypoint(void)
{ {
Waypoint *wp; Waypoint *wp;
FOR_ALL_WAYPOINTS(wp) { /* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
if (wp->xy == 0) { * TODO - This is just a temporary stage, this will be removed. */
for (wp = GetWaypoint(0); wp != NULL; wp = (wp->index + 1 < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1) : NULL) {
if (!IsValidWaypoint(wp)) {
uint index = wp->index; uint index = wp->index;
memset(wp, 0, sizeof(*wp)); memset(wp, 0, sizeof(*wp));
@ -87,7 +91,7 @@ void UpdateAllWaypointSigns(void)
Waypoint *wp; Waypoint *wp;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy != 0) UpdateWaypointSign(wp); UpdateWaypointSign(wp);
} }
} }
@ -124,7 +128,7 @@ static Waypoint *FindDeletedWaypointCloseTo(TileIndex tile)
uint thres = 8; uint thres = 8;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->deleted && wp->xy != 0) { if (wp->deleted) {
uint cur_dist = DistanceManhattan(tile, wp->xy); uint cur_dist = DistanceManhattan(tile, wp->xy);
if (cur_dist < thres) { if (cur_dist < thres) {
@ -383,8 +387,6 @@ void FixOldWaypoints(void)
/* Convert the old 'town_or_string', to 'string' / 'town' / 'town_cn' */ /* Convert the old 'town_or_string', to 'string' / 'town' / 'town_cn' */
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy == 0) continue;
wp->town_index = ClosestTownFromTile(wp->xy, (uint)-1)->index; wp->town_index = ClosestTownFromTile(wp->xy, (uint)-1)->index;
wp->town_cn = 0; wp->town_cn = 0;
if (wp->string & 0xC000) { if (wp->string & 0xC000) {
@ -421,10 +423,8 @@ static void Save_WAYP(void)
Waypoint *wp; Waypoint *wp;
FOR_ALL_WAYPOINTS(wp) { FOR_ALL_WAYPOINTS(wp) {
if (wp->xy != 0) { SlSetArrayIndex(wp->index);
SlSetArrayIndex(wp->index); SlObject(wp, _waypoint_desc);
SlObject(wp, _waypoint_desc);
}
} }
} }

@ -47,7 +47,15 @@ static inline bool IsWaypointIndex(uint index)
return index < GetWaypointPoolSize(); return index < GetWaypointPoolSize();
} }
#define FOR_ALL_WAYPOINTS_FROM(wp, start) for (wp = GetWaypoint(start); wp != NULL; wp = (wp->index + 1 < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1) : NULL) /**
* Check if a Waypoint really exists.
*/
static inline bool IsValidWaypoint(const Waypoint *wp)
{
return wp->xy != 0;
}
#define FOR_ALL_WAYPOINTS_FROM(wp, start) for (wp = GetWaypoint(start); wp != NULL; wp = (wp->index + 1 < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1) : NULL) if (IsValidWaypoint(wp))
#define FOR_ALL_WAYPOINTS(wp) FOR_ALL_WAYPOINTS_FROM(wp, 0) #define FOR_ALL_WAYPOINTS(wp) FOR_ALL_WAYPOINTS_FROM(wp, 0)

Loading…
Cancel
Save