summaryrefslogtreecommitdiff
path: root/src/newgrf_industrytiles.cpp
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2010-05-01 13:01:21 +0000
committerfrosch <frosch@openttd.org>2010-05-01 13:01:21 +0000
commit77953032274c3bb49c8b22ff7a2767412586c5a7 (patch)
tree254b97e9037aec36599ddaa0e32e6ff0e388b5a9 /src/newgrf_industrytiles.cpp
parent36850ba3e86fd9633ae0104caa0cb8b8aeecfc37 (diff)
downloadopenttd-77953032274c3bb49c8b22ff7a2767412586c5a7.tar.xz
(svn r19743) -Fix: NewGrfs could access map bits of not yet constructed industries and houses during construction callbacks.
Diffstat (limited to 'src/newgrf_industrytiles.cpp')
-rw-r--r--src/newgrf_industrytiles.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp
index 4ffdd2600..232343924 100644
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -118,26 +118,35 @@ static const SpriteGroup *IndustryTileResolveReal(const ResolverObject *object,
static uint32 IndustryTileGetRandomBits(const ResolverObject *object)
{
const TileIndex tile = object->u.industry.tile;
- if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
- return (object->scope == VSG_SCOPE_SELF) ? GetIndustryRandomBits(tile) : Industry::GetByTile(tile)->random;
+ const Industry *ind = object->u.industry.ind;
+ assert(ind != NULL && IsValidTile(tile));
+ assert(ind->index == INVALID_INDUSTRY || IsTileType(tile, MP_INDUSTRY));
+
+ return (object->scope == VSG_SCOPE_SELF) ?
+ (ind->index != INVALID_INDUSTRY ? GetIndustryRandomBits(tile) : 0) :
+ ind->random;
}
static uint32 IndustryTileGetTriggers(const ResolverObject *object)
{
const TileIndex tile = object->u.industry.tile;
- if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
- return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : Industry::GetByTile(tile)->random_triggers;
+ const Industry *ind = object->u.industry.ind;
+ assert(ind != NULL && IsValidTile(tile));
+ assert(ind->index == INVALID_INDUSTRY || IsTileType(tile, MP_INDUSTRY));
+ if (ind->index == INVALID_INDUSTRY) return 0;
+ return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : ind->random_triggers;
}
static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
{
const TileIndex tile = object->u.industry.tile;
- if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return;
+ Industry *ind = object->u.industry.ind;
+ assert(ind != NULL && ind->index != INVALID_INDUSTRY && IsValidTile(tile) && IsTileType(tile, MP_INDUSTRY));
if (object->scope == VSG_SCOPE_SELF) {
SetIndustryTriggers(tile, triggers);
} else {
- Industry::GetByTile(tile)->random_triggers = triggers;
+ ind->random_triggers = triggers;
}
}
@@ -194,6 +203,9 @@ uint16 GetIndustryTileCallback(CallbackID callback, uint32 param1, uint32 param2
ResolverObject object;
const SpriteGroup *group;
+ assert(industry != NULL && IsValidTile(tile));
+ assert(industry->index == INVALID_INDUSTRY || IsTileType(tile, MP_INDUSTRY));
+
NewIndustryTileResolver(&object, gfx_id, tile, industry);
object.callback = callback;
object.callback_param1 = param1;
@@ -396,6 +408,8 @@ static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, I
{
ResolverObject object;
+ assert(IsValidTile(tile) && IsTileType(tile, MP_INDUSTRY));
+
IndustryGfx gfx = GetIndustryGfx(tile);
const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);