Changeset - r5299:1a5e005aa3e9
[Not reviewed]
master
0 2 0
rubidium - 17 years ago 2006-12-09 14:18:08
rubidium@openttd.org
(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.
2 files changed with 26 insertions and 17 deletions:
town.h
14
10
0 comments (0 inline, 0 general)
industry.h
Show inline comments
 
@@ -87,12 +87,17 @@ DECLARE_OLD_POOL(Industry, Industry, 3, 
 
 */
 
static inline bool IsValidIndustry(const Industry *industry)
 
{
 
	return industry->xy != 0;
 
}
 

	
 
static inline bool IsValidIndustryID(IndustryID index)
 
{
 
	return index < GetIndustryPoolSize() && IsValidIndustry(GetIndustry(index));
 
}
 

	
 
VARDEF int _total_industries;
 

	
 
static inline IndustryID GetMaxIndustryIndex(void)
 
{
 
	/* TODO - This isn't the real content of the function, but
 
	 *  with the new pool-system this will be replaced with one that
 
@@ -105,29 +110,29 @@ static inline IndustryID GetMaxIndustryI
 
static inline uint GetNumIndustries(void)
 
{
 
	return _total_industries;
 
}
 

	
 
/**
 
 * Return a random valid town.
 
 * Return a random valid industry.
 
 */
 
static inline Industry *GetRandomIndustry(void)
 
{
 
	uint num = RandomRange(GetNumIndustries());
 
	uint index = 0;
 
	int num = RandomRange(GetNumIndustries());
 
	IndustryID index = INVALID_INDUSTRY;
 

	
 
	if (GetNumIndustries() == 0) return NULL;
 

	
 
	while (num > 0) {
 
	while (num >= 0) {
 
		num--;
 

	
 
		index++;
 

	
 
		/* Make sure we have a valid industry */
 
		while (GetIndustry(index) == NULL) {
 
		while (!IsValidIndustryID(index)) {
 
			index++;
 
			if (index > GetMaxIndustryIndex()) index = 0;
 
			assert(index <= GetMaxIndustryIndex());
 
		}
 
	}
 

	
 
	return GetIndustry(index);
 
}
 

	
town.h
Show inline comments
 
@@ -3,12 +3,16 @@
 
#ifndef TOWN_H
 
#define TOWN_H
 

	
 
#include "oldpool.h"
 
#include "player.h"
 

	
 
enum {
 
	INVALID_TOWN = 0xFFFF,
 
};
 

	
 
struct Town {
 
	TileIndex xy;
 

	
 
	// Current population of people and amount of houses.
 
	uint16 num_houses;
 
	uint32 population;
 
@@ -159,12 +163,17 @@ DECLARE_OLD_POOL(Town, Town, 3, 8000)
 
 */
 
static inline bool IsValidTown(const Town* town)
 
{
 
	return town->xy != 0;
 
}
 

	
 
static inline bool IsValidTownID(TownID index)
 
{
 
	return index < GetTownPoolSize() && IsValidTown(GetTown(index));
 
}
 

	
 
VARDEF uint _total_towns;
 

	
 
static inline TownID GetMaxTownIndex(void)
 
{
 
	/* TODO - This isn't the real content of the function, but
 
	 *  with the new pool-system this will be replaced with one that
 
@@ -181,34 +190,29 @@ static inline uint GetNumTowns(void)
 

	
 
/**
 
 * Return a random valid town.
 
 */
 
static inline Town *GetRandomTown(void)
 
{
 
	uint num = RandomRange(GetNumTowns());
 
	uint index = 0;
 
	int num = RandomRange(GetNumTowns());
 
	TownID index = INVALID_TOWN;
 

	
 
	while (num > 0) {
 
	while (num >= 0) {
 
		num--;
 

	
 
		index++;
 
		/* Make sure we have a valid industry */
 
		while (GetTown(index) == NULL) {
 
		while (!IsValidTownID(index)) {
 
			index++;
 
			if (index > GetMaxTownIndex()) index = 0;
 
			assert(index <= GetMaxTownIndex());
 
		}
 
	}
 

	
 
	return GetTown(index);
 
}
 

	
 
static inline bool IsValidTownID(uint index)
 
{
 
	return index < GetTownPoolSize() && IsValidTown(GetTown(index));
 
}
 

	
 
void DestroyTown(Town *t);
 

	
 
static inline void DeleteTown(Town *t)
 
{
 
	DestroyTown(t);
 
	t->xy = 0;
0 comments (0 inline, 0 general)