(svn r22635) -Fix: Correctly reseed random bits of industries and industry tiles.

This commit is contained in:
frosch
2011-07-04 20:37:20 +00:00
parent e2a5d69cb7
commit 0f8065fef4
5 changed files with 74 additions and 17 deletions

View File

@@ -369,7 +369,14 @@ bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigge
return ret;
}
static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, Industry *ind)
/**
* Trigger random triggers for an industry tile and reseed its random bits.
* @param tile Industry tile to trigger.
* @param trigger Trigger to trigger.
* @param ind Industry of the tile.
* @param [in,out] reseed_industry Collects bits to reseed for the industry.
*/
static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, Industry *ind, uint32 &reseed_industry)
{
ResolverObject object;
@@ -390,24 +397,55 @@ static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, I
byte new_random_bits = Random();
byte random_bits = GetIndustryRandomBits(tile);
random_bits &= ~object.reseed;
random_bits |= new_random_bits & object.reseed;
random_bits &= ~object.reseed[VSG_SCOPE_SELF];
random_bits |= new_random_bits & object.reseed[VSG_SCOPE_SELF];
SetIndustryRandomBits(tile, random_bits);
MarkTileDirtyByTile(tile);
reseed_industry |= object.reseed[VSG_SCOPE_PARENT];
}
/**
* Reseeds the random bits of an industry.
* @param ind Industry.
* @param reseed Bits to reseed.
*/
static void DoReseedIndustry(Industry *ind, uint32 reseed)
{
if (reseed == 0 || ind == NULL) return;
uint16 random_bits = Random();
ind->random &= reseed;
ind->random |= random_bits & reseed;
}
/**
* Trigger a random trigger for a single industry tile.
* @param tile Industry tile to trigger.
* @param trigger Trigger to trigger.
*/
void TriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger)
{
DoTriggerIndustryTile(tile, trigger, Industry::GetByTile(tile));
uint32 reseed_industry = 0;
Industry *ind = Industry::GetByTile(tile);
DoTriggerIndustryTile(tile, trigger, ind, reseed_industry);
DoReseedIndustry(ind, reseed_industry);
}
/**
* Trigger a random trigger for all industry tiles.
* @param ind Industry to trigger.
* @param trigger Trigger to trigger.
*/
void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
{
uint32 reseed_industry = 0;
TILE_AREA_LOOP(tile, ind->location) {
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == ind->index) {
DoTriggerIndustryTile(tile, trigger, ind);
DoTriggerIndustryTile(tile, trigger, ind, reseed_industry);
}
}
DoReseedIndustry(ind, reseed_industry);
}
/**