1
0
Fork 0

(svn r7452) -Fix: GetRandom(Industry|Town) must return a valid industry/town and should not need to loop over the pool for a second time.

release/0.5
rubidium 2006-12-09 14:18:08 +00:00
parent 5b5b1d1514
commit d02a614ebe
2 changed files with 26 additions and 17 deletions

View File

@ -90,6 +90,11 @@ static inline bool IsValidIndustry(const Industry *industry)
return industry->xy != 0; return industry->xy != 0;
} }
static inline bool IsValidIndustryID(IndustryID index)
{
return index < GetIndustryPoolSize() && IsValidIndustry(GetIndustry(index));
}
VARDEF int _total_industries; VARDEF int _total_industries;
static inline IndustryID GetMaxIndustryIndex(void) static inline IndustryID GetMaxIndustryIndex(void)
@ -108,23 +113,23 @@ static inline uint GetNumIndustries(void)
} }
/** /**
* Return a random valid town. * Return a random valid industry.
*/ */
static inline Industry *GetRandomIndustry(void) static inline Industry *GetRandomIndustry(void)
{ {
uint num = RandomRange(GetNumIndustries()); int num = RandomRange(GetNumIndustries());
uint index = 0; IndustryID index = INVALID_INDUSTRY;
if (GetNumIndustries() == 0) return NULL; if (GetNumIndustries() == 0) return NULL;
while (num > 0) { while (num >= 0) {
num--; num--;
index++; index++;
/* Make sure we have a valid industry */ /* Make sure we have a valid industry */
while (GetIndustry(index) == NULL) { while (!IsValidIndustryID(index)) {
index++; index++;
if (index > GetMaxIndustryIndex()) index = 0; assert(index <= GetMaxIndustryIndex());
} }
} }

24
town.h
View File

@ -6,6 +6,10 @@
#include "oldpool.h" #include "oldpool.h"
#include "player.h" #include "player.h"
enum {
INVALID_TOWN = 0xFFFF,
};
struct Town { struct Town {
TileIndex xy; TileIndex xy;
@ -162,6 +166,11 @@ static inline bool IsValidTown(const Town* town)
return town->xy != 0; return town->xy != 0;
} }
static inline bool IsValidTownID(TownID index)
{
return index < GetTownPoolSize() && IsValidTown(GetTown(index));
}
VARDEF uint _total_towns; VARDEF uint _total_towns;
static inline TownID GetMaxTownIndex(void) static inline TownID GetMaxTownIndex(void)
@ -184,28 +193,23 @@ static inline uint GetNumTowns(void)
*/ */
static inline Town *GetRandomTown(void) static inline Town *GetRandomTown(void)
{ {
uint num = RandomRange(GetNumTowns()); int num = RandomRange(GetNumTowns());
uint index = 0; TownID index = INVALID_TOWN;
while (num > 0) { while (num >= 0) {
num--; num--;
index++; index++;
/* Make sure we have a valid industry */ /* Make sure we have a valid industry */
while (GetTown(index) == NULL) { while (!IsValidTownID(index)) {
index++; index++;
if (index > GetMaxTownIndex()) index = 0; assert(index <= GetMaxTownIndex());
} }
} }
return GetTown(index); return GetTown(index);
} }
static inline bool IsValidTownID(uint index)
{
return index < GetTownPoolSize() && IsValidTown(GetTown(index));
}
void DestroyTown(Town *t); void DestroyTown(Town *t);
static inline void DeleteTown(Town *t) static inline void DeleteTown(Town *t)