changeset 17926:0c076c82bdfe draft

(svn r22731) -Fix: [NewGRF] The construction stage sprites were incorrectly selected in cases other than 1 or 4 sprites per set.
author frosch <frosch@openttd.org>
date Mon, 08 Aug 2011 21:26:58 +0000
parents 44f1c19893cb
children 4fbd0607b81f
files src/newgrf_house.cpp src/newgrf_industrytiles.cpp src/newgrf_spritegroup.h
diffstat 3 files changed, 21 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf_house.cpp
+++ b/src/newgrf_house.cpp
@@ -476,7 +476,7 @@
 		/* Limit the building stage to the number of stages supplied. */
 		const TileLayoutSpriteGroup *tlgroup = (const TileLayoutSpriteGroup *)group;
 		byte stage = GetHouseBuildingStage(ti->tile);
-		stage = Clamp(stage - 4 + tlgroup->num_building_stages, 0, tlgroup->num_building_stages - 1);
+		stage = tlgroup->GetConstructionStageOffset(stage);
 		DrawTileLayout(ti, tlgroup, stage, house_id);
 	}
 }
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -263,7 +263,7 @@
 		/* Limit the building stage to the number of stages supplied. */
 		const TileLayoutSpriteGroup *tlgroup = (const TileLayoutSpriteGroup *)group;
 		byte stage = GetIndustryConstructionStage(ti->tile);
-		stage = Clamp(stage - 4 + tlgroup->num_building_stages, 0, tlgroup->num_building_stages - 1);
+		stage = tlgroup->GetConstructionStageOffset(stage);
 		IndustryDrawTileLayout(ti, tlgroup, i->random_colour, stage, gfx);
 		return true;
 	}
--- a/src/newgrf_spritegroup.h
+++ b/src/newgrf_spritegroup.h
@@ -292,6 +292,25 @@
 	NewGRFSpriteLayout dts;
 
 	const DrawTileSprites *ProcessRegisters(uint8 *stage) const;
+
+	/**
+	 * Determines which sprite to use from a spriteset for a specific construction stage.
+	 * @param construction_stage Construction stage 0 - 3.
+	 * @return Sprite to use
+	 */
+	uint GetConstructionStageOffset(uint construction_stage) const
+	{
+		uint num_sprites = this->num_building_stages;
+		assert(num_sprites > 0);
+		if (num_sprites > 4) num_sprites = 4;
+		switch (construction_stage) {
+			case 0: return 0;
+			case 1: return num_sprites > 2 ? 1 : 0;
+			case 2: return num_sprites > 2 ? num_sprites - 2 : 0;
+			case 3: return num_sprites - 1;
+			default: NOT_REACHED();
+		}
+	}
 };
 
 struct IndustryProductionSpriteGroup : SpriteGroup {