Changeset - r12594:2e8b743b3b20
[Not reviewed]
master
0 1 0
frosch - 15 years ago 2009-08-02 19:49:22
frosch@openttd.org
(svn r17047) -Fix: Mark house tiles dirty when triggers were triggered.
1 file changed with 6 insertions and 1 deletions:
0 comments (0 inline, 0 general)
src/newgrf_house.cpp
Show inline comments
 
@@ -574,24 +574,25 @@ bool NewHouseTileLoop(TileIndex tile)
 
	}
 

	
 
	/* Check callback 21, which determines if a house should be destroyed. */
 
	if (HasBit(hs->callback_mask, CBM_HOUSE_DESTRUCTION)) {
 
		uint16 callback_res = GetHouseCallback(CBID_HOUSE_DESTRUCTION, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
 
		if (callback_res != CALLBACK_FAILED && GB(callback_res, 0, 8) > 0) {
 
			ClearTownHouse(Town::GetByTile(tile), tile);
 
			return false;
 
		}
 
	}
 

	
 
	SetHouseProcessingTime(tile, hs->processing_time);
 
	MarkTileDirtyByTile(tile);
 
	return true;
 
}
 

	
 
static void DoTriggerHouse(TileIndex tile, HouseTrigger trigger, byte base_random, bool first)
 
{
 
	ResolverObject object;
 

	
 
	/* We can't trigger a non-existent building... */
 
	assert(IsTileType(tile, MP_HOUSE));
 

	
 
	HouseID hid = GetHouseType(tile);
 
	HouseSpec *hs = HouseSpec::Get(hid);
 
@@ -609,25 +610,29 @@ static void DoTriggerHouse(TileIndex til
 
	byte new_random_bits = Random();
 
	byte random_bits = GetHouseRandomBits(tile);
 
	random_bits &= ~object.reseed;
 
	random_bits |= (first ? new_random_bits : base_random) & object.reseed;
 
	SetHouseRandomBits(tile, random_bits);
 

	
 
	switch (trigger) {
 
		case HOUSE_TRIGGER_TILE_LOOP:
 
			/* Random value already set. */
 
			break;
 

	
 
		case HOUSE_TRIGGER_TILE_LOOP_TOP:
 
			if (!first) break;
 
			if (!first) {
 
				/* The top tile is marked dirty by the usual TileLoop */
 
				MarkTileDirtyByTile(tile);
 
				break;
 
			}
 
			/* Random value of first tile already set. */
 
			if (hs->building_flags & BUILDING_2_TILES_Y)   DoTriggerHouse(TILE_ADDXY(tile, 0, 1), trigger, random_bits, false);
 
			if (hs->building_flags & BUILDING_2_TILES_X)   DoTriggerHouse(TILE_ADDXY(tile, 1, 0), trigger, random_bits, false);
 
			if (hs->building_flags & BUILDING_HAS_4_TILES) DoTriggerHouse(TILE_ADDXY(tile, 1, 1), trigger, random_bits, false);
 
			break;
 
	}
 
}
 

	
 
void TriggerHouse(TileIndex t, HouseTrigger trigger)
 
{
 
	DoTriggerHouse(t, trigger, 0, true);
 
}
0 comments (0 inline, 0 general)