mirror of https://github.com/OpenTTD/OpenTTD
(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.
parent
5b5b1d1514
commit
d02a614ebe
19
industry.h
19
industry.h
|
@ -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
24
town.h
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue