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
 
@@ -562,72 +562,77 @@ bool NewHouseTileLoop(TileIndex tile)
 
		 * tile loop reaches them. This should only be enabled for the northern
 
		 * tile, or strange things will happen (here, and in TTDPatch). */
 
		if (hs->extra_flags & SYNCHRONISED_CALLBACK_1B) {
 
			uint16 random = GB(Random(), 0, 16);
 

	
 
			if (hs->building_flags & BUILDING_HAS_1_TILE)  AnimationControl(tile, random);
 
			if (hs->building_flags & BUILDING_2_TILES_Y)   AnimationControl(TILE_ADDXY(tile, 0, 1), random);
 
			if (hs->building_flags & BUILDING_2_TILES_X)   AnimationControl(TILE_ADDXY(tile, 1, 0), random);
 
			if (hs->building_flags & BUILDING_HAS_4_TILES) AnimationControl(TILE_ADDXY(tile, 1, 1), random);
 
		} else {
 
			AnimationControl(tile, 0);
 
		}
 
	}
 

	
 
	/* 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);
 

	
 
	if (hs->spritegroup == NULL) return;
 

	
 
	NewHouseResolver(&object, hid, tile, Town::GetByTile(tile));
 

	
 
	object.callback = CBID_RANDOM_TRIGGER;
 
	object.trigger = trigger;
 

	
 
	const SpriteGroup *group = SpriteGroup::Resolve(hs->spritegroup, &object);
 
	if (group == NULL) return;
 

	
 
	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)