(svn r19481) -Codechange: Turn _industry_counts into a static member of Industry.

This commit is contained in:
frosch 2010-03-20 14:30:16 +00:00
parent e27e5febb6
commit 116a5f56a4
7 changed files with 54 additions and 48 deletions

View File

@ -78,6 +78,48 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> {
static Industry *GetRandom();
static void PostDestructor(size_t index);
/**
* Increment the count of industries for this type.
* @param type IndustryType to increment
* @pre type < NUM_INDUSTRYTYPES
*/
static inline void IncIndustryTypeCount(IndustryType type)
{
assert(type < NUM_INDUSTRYTYPES);
counts[type]++;
}
/**
* Decrement the count of industries for this type.
* @param type IndustryType to decrement
* @pre type < NUM_INDUSTRYTYPES
*/
static inline void DecIndustryTypeCount(IndustryType type)
{
assert(type < NUM_INDUSTRYTYPES);
counts[type]--;
}
/**
* Get the count of industries for this type.
* @param type IndustryType to query
* @pre type < NUM_INDUSTRYTYPES
*/
static inline uint16 GetIndustryTypeCount(IndustryType type)
{
assert(type < NUM_INDUSTRYTYPES);
return counts[type];
}
/** Resets industry counts. */
static inline void ResetIndustryCounts()
{
memset(&counts, 0, sizeof(counts));
}
protected:
static uint16 counts[NUM_INDUSTRYTYPES]; ///< Number of industries per type ingame
};
void PlantRandomFarmField(const Industry *i);

View File

@ -56,7 +56,7 @@ void BuildOilRig(TileIndex tile);
static byte _industry_sound_ctr;
static TileIndex _industry_sound_tile;
uint16 _industry_counts[NUM_INDUSTRYTYPES]; ///< Number of industries per type ingame
uint16 Industry::counts[NUM_INDUSTRYTYPES];
IndustrySpec _industry_specs[NUM_INDUSTRYTYPES];
IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES];
@ -134,7 +134,8 @@ Industry::~Industry()
if (CleaningPool()) return;
/* Industry can also be destroyed when not fully initialized.
* This means that we do not have to clear tiles either. */
* This means that we do not have to clear tiles either.
* Also we must not decrement industry counts in that case. */
if (this->location.w == 0) return;
TILE_AREA_LOOP(tile_cur, this->location) {
@ -1584,7 +1585,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, int type, const Ind
i->location = TileArea(tile, 1, 1);
i->type = type;
IncIndustryTypeCount(type);
Industry::IncIndustryTypeCount(type);
i->produced_cargo[0] = indspec->produced_cargo[0];
i->produced_cargo[1] = indspec->produced_cargo[1];
@ -2059,7 +2060,7 @@ static bool CheckIndustryCloseDownProtection(IndustryType type)
/* oil wells (or the industries with that flag set) are always allowed to closedown */
if ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _settings_game.game_creation.landscape == LT_TEMPERATE) return false;
return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE) == 0 && GetIndustryTypeCount(type) <= 1;
return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE) == 0 && Industry::GetIndustryTypeCount(type) <= 1;
}
/**
@ -2469,7 +2470,7 @@ void InitializeIndustries()
{
_industry_pool.CleanPool();
ResetIndustryCounts();
Industry::ResetIndustryCounts();
_industry_sound_tile = 0;
}

View File

@ -204,42 +204,6 @@ static inline IndustryGfx GetTranslatedIndustryTileID(IndustryGfx gfx)
}
}
extern uint16 _industry_counts[NUM_INDUSTRYTYPES]; // Number of industries per type ingame
/** Increment the count of industries for this type
* @param type IndustryType to increment
* @pre type < INVALID_INDUSTRYTYPE */
static inline void IncIndustryTypeCount(IndustryType type)
{
assert(type < INVALID_INDUSTRYTYPE);
_industry_counts[type]++;
}
/** Decrement the count of industries for this type
* @param type IndustryType to decrement
* @pre type < INVALID_INDUSTRYTYPE */
static inline void DecIndustryTypeCount(IndustryType type)
{
assert(type < INVALID_INDUSTRYTYPE);
_industry_counts[type]--;
}
/** get the count of industries for this type
* @param type IndustryType to query
* @pre type < INVALID_INDUSTRYTYPE */
static inline uint8 GetIndustryTypeCount(IndustryType type)
{
assert(type < INVALID_INDUSTRYTYPE);
return min(_industry_counts[type], 0xFF); // callback expects only a byte, so cut it
}
/** Resets both the total_industries and the _industry_counts
* This way, we centralize all counts activities */
static inline void ResetIndustryCounts()
{
memset(&_industry_counts, 0, sizeof(_industry_counts));
}
static const uint8 IT_INVALID = 255;
#endif /* INDUSTRYTYPE_H */

View File

@ -135,7 +135,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout
/* If the filter is 0, it could be because none was specified as well as being really a 0.
* In either case, just do the regular var67 */
closest_dist = GetClosestIndustry(current->location.tile, ind_index, current);
count = GetIndustryTypeCount(ind_index);
count = min(Industry::GetIndustryTypeCount(ind_index), UINT8_MAX); // clamp to 8 bit
} else {
/* Count only those who match the same industry type and layout filter
* Unfortunately, we have to do it manually */
@ -465,7 +465,7 @@ CommandCost CheckIfCallBackAllowsCreation(TileIndex tile, IndustryType type, uin
Industry ind;
ind.index = INVALID_INDUSTRY;
ind.location.tile = tile;
ind.location.w = 0;
ind.location.w = 0; // important to mark the industry invalid
ind.type = type;
ind.selected_layout = layout;
ind.town = ClosestTownFromTile(tile, UINT_MAX);

View File

@ -107,12 +107,12 @@ static void Load_INDY()
{
int index;
ResetIndustryCounts();
Industry::ResetIndustryCounts();
while ((index = SlIterateArray()) != -1) {
Industry *i = new (index) Industry();
SlObject(i, _industry_desc);
IncIndustryTypeCount(i->type);
Industry::IncIndustryTypeCount(i->type);
}
}

View File

@ -841,7 +841,7 @@ static bool LoadOldIndustry(LoadgameState *ls, int num)
i->random_colour = RemapTTOColour(i->random_colour);
}
IncIndustryTypeCount(i->type);
Industry::IncIndustryTypeCount(i->type);
} else {
delete i;
}

View File

@ -1092,8 +1092,7 @@ public:
/* Industry name must be formatted, since it's not in tiny font in the specs.
* So, draw with a parameter and use the STR_SMALLMAP_INDUSTRY string, which is tiny font */
SetDParam(0, tbl->legend);
assert(tbl->type < NUM_INDUSTRYTYPES);
SetDParam(1, _industry_counts[tbl->type]);
SetDParam(1, Industry::GetIndustryTypeCount(tbl->type));
if (!tbl->show_on_map) {
/* Simply draw the string, not the black border of the legend colour.
* This will enforce the idea of the disabled item */