From d10168f21183d1097b88ebe86ed5b5a9b1b3ef5e Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 8 Aug 2011 21:26:58 +0000 Subject: (svn r22731) -Fix: [NewGRF] The construction stage sprites were incorrectly selected in cases other than 1 or 4 sprites per set. --- src/newgrf_house.cpp | 2 +- src/newgrf_industrytiles.cpp | 2 +- src/newgrf_spritegroup.h | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 04a0d8617..29ddb9b50 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -476,7 +476,7 @@ void DrawNewHouseTile(TileInfo *ti, HouseID house_id) /* 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); } } diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp index ae5dca45c..2aa636712 100644 --- a/src/newgrf_industrytiles.cpp +++ b/src/newgrf_industrytiles.cpp @@ -263,7 +263,7 @@ bool DrawNewIndustryTile(TileInfo *ti, Industry *i, IndustryGfx gfx, const Indus /* 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; } diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index 811547832..94ec430d4 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -292,6 +292,25 @@ struct TileLayoutSpriteGroup : SpriteGroup { 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 { -- cgit v1.2.3-54-g00ecf