(svn r10759) -Codechange: make the industry struct use the pool item class as super class.
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
#include "newgrf_industries.h"
|
||||
#include "newgrf_industrytiles.h"
|
||||
#include "newgrf_callbacks.h"
|
||||
#include "misc/autoptr.hpp"
|
||||
|
||||
void ShowIndustryViewWindow(int industry);
|
||||
void BuildOilRig(TileIndex tile);
|
||||
@@ -75,19 +76,7 @@ void ResetIndustryCreationProbility(IndustryType type)
|
||||
_industry_specs[type].appear_creation[_opt.landscape] = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called if a new block is added to the industry-pool
|
||||
*/
|
||||
static void IndustryPoolNewBlock(uint start_item)
|
||||
{
|
||||
Industry *i;
|
||||
|
||||
/* 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 + 1U < GetIndustryPoolSize()) ? GetIndustry(i->index + 1U) : NULL) i->index = start_item++;
|
||||
}
|
||||
|
||||
DEFINE_OLD_POOL(Industry, Industry, IndustryPoolNewBlock, NULL)
|
||||
DEFINE_OLD_POOL_GENERIC(Industry, Industry)
|
||||
|
||||
/**
|
||||
* Retrieve the type for this industry. Although it is accessed by a tile,
|
||||
@@ -102,7 +91,7 @@ IndustryType GetIndustryType(TileIndex tile)
|
||||
assert(IsTileType(tile, MP_INDUSTRY));
|
||||
|
||||
const Industry *ind = GetIndustryByTile(tile);
|
||||
return IsValidIndustry(ind) ? ind->type : (IndustryType)IT_INVALID;
|
||||
return ind->IsValid() ? ind->type : (IndustryType)IT_INVALID;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -139,35 +128,43 @@ const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx, bool full_check)
|
||||
return its;
|
||||
}
|
||||
|
||||
void DestroyIndustry(Industry *i)
|
||||
Industry::~Industry()
|
||||
{
|
||||
BEGIN_TILE_LOOP(tile_cur, i->width, i->height, i->xy);
|
||||
/* Industry can also be destroyed when not fully initialized.
|
||||
* This means that we do not have to clear tiles either. */
|
||||
if (this->width == 0) {
|
||||
this->xy = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
BEGIN_TILE_LOOP(tile_cur, this->width, this->height, this->xy);
|
||||
if (IsTileType(tile_cur, MP_INDUSTRY)) {
|
||||
if (GetIndustryIndex(tile_cur) == i->index) {
|
||||
if (GetIndustryIndex(tile_cur) == this->index) {
|
||||
DoClearSquare(tile_cur);
|
||||
}
|
||||
} else if (IsTileType(tile_cur, MP_STATION) && IsOilRig(tile_cur)) {
|
||||
DeleteOilRig(tile_cur);
|
||||
}
|
||||
END_TILE_LOOP(tile_cur, i->width, i->height, i->xy);
|
||||
END_TILE_LOOP(tile_cur, this->width, this->height, this->xy);
|
||||
|
||||
if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_FIELDS) {
|
||||
if (GetIndustrySpec(this->type)->behaviour & INDUSTRYBEH_PLANT_FIELDS) {
|
||||
/* Remove the farmland and convert it to regular tiles over time. */
|
||||
BEGIN_TILE_LOOP(tile_cur, 42, 42, i->xy - TileDiffXY(21, 21)) {
|
||||
BEGIN_TILE_LOOP(tile_cur, 42, 42, this->xy - TileDiffXY(21, 21)) {
|
||||
tile_cur = TILE_MASK(tile_cur);
|
||||
if (IsTileType(tile_cur, MP_CLEAR) && IsClearGround(tile_cur, CLEAR_FIELDS) &&
|
||||
GetIndustryIndexOfField(tile_cur) == i->index) {
|
||||
GetIndustryIndexOfField(tile_cur) == this->index) {
|
||||
SetIndustryIndexOfField(tile_cur, INVALID_INDUSTRY);
|
||||
}
|
||||
} END_TILE_LOOP(tile_cur, 42, 42, i->xy - TileDiff(21, 21))
|
||||
} END_TILE_LOOP(tile_cur, 42, 42, this->xy - TileDiff(21, 21))
|
||||
}
|
||||
|
||||
_industry_sort_dirty = true;
|
||||
DecIndustryTypeCount(i->type);
|
||||
DecIndustryTypeCount(this->type);
|
||||
|
||||
DeleteSubsidyWithIndustry(i->index);
|
||||
DeleteWindowById(WC_INDUSTRY_VIEW, i->index);
|
||||
DeleteSubsidyWithIndustry(this->index);
|
||||
DeleteWindowById(WC_INDUSTRY_VIEW, this->index);
|
||||
InvalidateWindow(WC_INDUSTRY_DIRECTORY, 0);
|
||||
this->xy = 0;
|
||||
}
|
||||
|
||||
static void IndustryDrawSugarMine(const TileInfo *ti)
|
||||
@@ -393,7 +390,7 @@ static CommandCost ClearTile_Industry(TileIndex tile, byte flags)
|
||||
return_cmd_error(STR_4800_IN_THE_WAY);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) DeleteIndustry(i);
|
||||
if (flags & DC_EXEC) delete i;
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
@@ -1397,27 +1394,6 @@ static bool CheckIfTooCloseToIndustry(TileIndex tile, int type)
|
||||
return true;
|
||||
}
|
||||
|
||||
static Industry *AllocateIndustry()
|
||||
{
|
||||
Industry *i;
|
||||
|
||||
/* 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(0); i != NULL; i = (i->index + 1U < GetIndustryPoolSize()) ? GetIndustry(i->index + 1U) : NULL) {
|
||||
IndustryID index = i->index;
|
||||
|
||||
if (IsValidIndustry(i)) continue;
|
||||
|
||||
memset(i, 0, sizeof(*i));
|
||||
i->index = index;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/* Check if we can add a block to the pool */
|
||||
return AddBlockToPool(&_Industry_pool) ? AllocateIndustry() : NULL;
|
||||
}
|
||||
|
||||
static void DoCreateNewIndustry(Industry *i, TileIndex tile, int type, const IndustryTileTable *it, const Town *t, Owner owner)
|
||||
{
|
||||
const IndustrySpec *indspec = GetIndustrySpec(type);
|
||||
@@ -1530,12 +1506,14 @@ static Industry *CreateNewIndustryHelper(TileIndex tile, IndustryType type, uint
|
||||
if (!CheckIfIndustryIsAllowed(tile, type, t)) return NULL;
|
||||
if (!CheckSuitableIndustryPos(tile)) return NULL;
|
||||
|
||||
Industry *i = AllocateIndustry();
|
||||
Industry *i = new Industry(tile);
|
||||
if (i == NULL) return NULL;
|
||||
AutoPtrT<Industry> i_auto_delete = i;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
if (!custom_shape_check) CheckIfCanLevelIndustryPlatform(tile, DC_EXEC, it, type);
|
||||
DoCreateNewIndustry(i, tile, type, it, t, OWNER_NONE);
|
||||
i_auto_delete.Detach();
|
||||
}
|
||||
|
||||
return i;
|
||||
@@ -1808,7 +1786,7 @@ static void UpdateIndustryStatistics(Industry *i)
|
||||
InvalidateWindow(WC_INDUSTRY_VIEW, i->index);
|
||||
|
||||
if (i->prod_level == 0) {
|
||||
DeleteIndustry(i);
|
||||
delete i;
|
||||
} else if (_patches.smooth_economy) {
|
||||
ExtChangeIndustryProduction(i);
|
||||
}
|
||||
@@ -2093,12 +2071,7 @@ static void Load_INDY()
|
||||
ResetIndustryCounts();
|
||||
|
||||
while ((index = SlIterateArray()) != -1) {
|
||||
Industry *i;
|
||||
|
||||
if (!AddBlockIfNeeded(&_Industry_pool, index))
|
||||
error("Industries: failed loading savegame: too many industries");
|
||||
|
||||
i = GetIndustry(index);
|
||||
Industry *i = new (index) Industry();
|
||||
SlObject(i, _industry_desc);
|
||||
IncIndustryTypeCount(i->type);
|
||||
}
|
||||
|
Reference in New Issue
Block a user